diff --git a/.gitignore b/.gitignore index ba1bef0..6f7db5e 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,7 @@ phases/**/step*-output.json # local document backups and initialization state .dryforge/ + +# direct MSVC and CMake local build state +/.build/ +/msvc/Fesa.Local.props diff --git a/AGENTS.md b/AGENTS.md index fe0be95..9a9ae45 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ # FESA Structural Solver FESA는 개인 연구를 위해 개발하는 유한요소 구조해석 솔버이며 외부 사용자 배포를 장기 -목표로 한다. C++17 이상·Windows MSVC·CMake/CTest를 사용하고 승인된 Abaqus 입력 +목표로 한다. C++17 이상·Windows MSVC·직접 MSBuild와 CMake/CTest를 사용하고 승인된 Abaqus 입력 subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존재와 기능 검증 완료는 다르다. ## 프로젝트 문서와 영역 @@ -39,8 +39,12 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존 │ └── hdf5/AGENTS.md → schema·readback·finalize ├── tests/ │ └── AGENTS.md → 계층별 검사·실패·비교 evidence -└── cmake/ - └── AGENTS.md → dependency·runtime 연결 +├── cmake/ +│ └── AGENTS.md → dependency·runtime 연결 +├── msvc/ +│ └── AGENTS.md → 직접 MSBuild·source 등록·runtime 연결 +└── scripts/ + └── AGENTS.md → 읽기 전용 결과 비교 도구 ``` ## 핵심 규칙 @@ -87,3 +91,11 @@ Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확 문서만 변경하면 정적 검토를 하고 build/test를 실행하지 않는다. 동작 변경은 관련 검사부터, 솔버 기능 완료 시에는 구성된 전체 MSVC x64 Debug build/CTest와 필수 reference 비교를 수행한다. + +직접 MSBuild가 주 개발 빌드이며 CMake/Ninja는 같은 제품·검사 source를 사용하는 보조 경로다. +실제 명령·환경·`.build/native/Debug` 및 `.build/cmake-debug` 출력은 solver-core를 따른다. +두 경로의 전체 검사 등록과 실제 실행 범위를 구분하고 별도 Python·reference 결과를 기록한다. +이번 병합은 2026-10-18 사용자 변경에 따라 정적해석·공통 계약 검사와 정식 정적5모델만 +실행해 다음 단계로 진행한다. HHT·동해석·고유치·과도 열해석 실행은 미검증으로 남기고 +해당 테스트는 보존한다. 일반 솔버 기능의 전체 검증 의무를 이 한정 병합으로 대체하지 않는다. +`reference/temp`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다. diff --git a/CLAUDE.md b/CLAUDE.md index fe0be95..9a9ae45 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,7 @@ # FESA Structural Solver FESA는 개인 연구를 위해 개발하는 유한요소 구조해석 솔버이며 외부 사용자 배포를 장기 -목표로 한다. C++17 이상·Windows MSVC·CMake/CTest를 사용하고 승인된 Abaqus 입력 +목표로 한다. C++17 이상·Windows MSVC·직접 MSBuild와 CMake/CTest를 사용하고 승인된 Abaqus 입력 subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존재와 기능 검증 완료는 다르다. ## 프로젝트 문서와 영역 @@ -39,8 +39,12 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존 │ └── hdf5/AGENTS.md → schema·readback·finalize ├── tests/ │ └── AGENTS.md → 계층별 검사·실패·비교 evidence -└── cmake/ - └── AGENTS.md → dependency·runtime 연결 +├── cmake/ +│ └── AGENTS.md → dependency·runtime 연결 +├── msvc/ +│ └── AGENTS.md → 직접 MSBuild·source 등록·runtime 연결 +└── scripts/ + └── AGENTS.md → 읽기 전용 결과 비교 도구 ``` ## 핵심 규칙 @@ -87,3 +91,11 @@ Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확 문서만 변경하면 정적 검토를 하고 build/test를 실행하지 않는다. 동작 변경은 관련 검사부터, 솔버 기능 완료 시에는 구성된 전체 MSVC x64 Debug build/CTest와 필수 reference 비교를 수행한다. + +직접 MSBuild가 주 개발 빌드이며 CMake/Ninja는 같은 제품·검사 source를 사용하는 보조 경로다. +실제 명령·환경·`.build/native/Debug` 및 `.build/cmake-debug` 출력은 solver-core를 따른다. +두 경로의 전체 검사 등록과 실제 실행 범위를 구분하고 별도 Python·reference 결과를 기록한다. +이번 병합은 2026-10-18 사용자 변경에 따라 정적해석·공통 계약 검사와 정식 정적5모델만 +실행해 다음 단계로 진행한다. HHT·동해석·고유치·과도 열해석 실행은 미검증으로 남기고 +해당 테스트는 보존한다. 일반 솔버 기능의 전체 검증 의무를 이 한정 병합으로 대체하지 않는다. +`reference/temp`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다. diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f23b0c..5cd78db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,14 @@ cmake_minimum_required(VERSION 3.25) - project(FESA VERSION 0.1.0 LANGUAGES CXX) - set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) - +set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") +# Pin the original backend ABI/link/thread choices rather than package defaults. +set(MKL_INTERFACE ilp64) +set(MKL_LINK dynamic) +set(MKL_THREADING intel_thread) include(cmake/FesaDependencies.cmake) - find_package(Doxygen QUIET) if(Doxygen_FOUND) add_custom_target(fesa_docs @@ -19,6 +20,5 @@ if(Doxygen_FOUND) endif() enable_testing() - add_subdirectory(src/fesa) add_subdirectory(tests) diff --git a/CMakePresets.json b/CMakePresets.json index 7074f53..38b16a4 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -3,11 +3,11 @@ "configurePresets": [ { "name": "windows-msvc-ninja-debug", - "displayName": "Windows MSVC x64 Debug (Ninja)", "generator": "Ninja", - "binaryDir": "${sourceDir}/build/windows-msvc-ninja-debug", + "binaryDir": "${sourceDir}/.build/cmake-debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "FESA_GTEST_SOURCE_DIR": "$env{FESA_GTEST_SOURCE_DIR}", "MKL_DIR": "$env{MKL_DIR}", "TBB_DIR": "$env{TBB_DIR}", @@ -16,11 +16,15 @@ }, { "name": "windows-msvc-ninja-release", - "displayName": "Windows MSVC x64 Release with symbols (Ninja)", - "inherits": "windows-msvc-ninja-debug", - "binaryDir": "${sourceDir}/build/windows-msvc-ninja-release", + "generator": "Ninja", + "binaryDir": "${sourceDir}/.build/cmake-release", "cacheVariables": { - "CMAKE_BUILD_TYPE": "Release" + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", + "FESA_GTEST_SOURCE_DIR": "$env{FESA_GTEST_SOURCE_DIR}", + "MKL_DIR": "$env{MKL_DIR}", + "TBB_DIR": "$env{TBB_DIR}", + "HDF5_DIR": "$env{HDF5_DIR}" } } ], @@ -37,7 +41,17 @@ "testPresets": [ { "name": "windows-msvc-ninja-debug", - "configurePreset": "windows-msvc-ninja-debug" + "configurePreset": "windows-msvc-ninja-debug", + "output": { + "outputOnFailure": true + } + }, + { + "name": "windows-msvc-ninja-release", + "configurePreset": "windows-msvc-ninja-release", + "output": { + "outputOnFailure": true + } } ] } diff --git a/FESA.sln b/FESA.sln new file mode 100644 index 0000000..64295f3 --- /dev/null +++ b/FESA.sln @@ -0,0 +1,48 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.0.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{BC8A1FFA-BEE3-4634-8014-F334798102B3}") = "fesa_solver", "msvc\fesa_solver.vcxproj", "{3AEC39D9-4641-5161-9107-265EB50CA882}" +EndProject +Project("{BC8A1FFA-BEE3-4634-8014-F334798102B3}") = "fesa_cli", "msvc\fesa_cli.vcxproj", "{6DE2CFFA-D9B3-5E14-BEBD-5DFAB2B5290B}" +EndProject +Project("{BC8A1FFA-BEE3-4634-8014-F334798102B3}") = "fesa_unit_tests", "msvc\fesa_unit_tests.vcxproj", "{42558F77-73F2-5CA7-8E3C-BB0E1646CD45}" +EndProject +Project("{BC8A1FFA-BEE3-4634-8014-F334798102B3}") = "fesa_integration_tests", "msvc\fesa_integration_tests.vcxproj", "{7770C26B-DBFE-505D-8788-8B7EFD9A5A70}" +EndProject +Project("{BC8A1FFA-BEE3-4634-8014-F334798102B3}") = "fesa_reference_tests", "msvc\fesa_reference_tests.vcxproj", "{330D2DFB-E57D-517D-A795-F1EA620B69F0}" +EndProject +Project("{BC8A1FFA-BEE3-4634-8014-F334798102B3}") = "gtest", "msvc\gtest.vcxproj", "{03194BA4-3F3B-5399-BCAF-FB4FA47300CE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3AEC39D9-4641-5161-9107-265EB50CA882}.Debug|x64.ActiveCfg = Debug|x64 + {3AEC39D9-4641-5161-9107-265EB50CA882}.Debug|x64.Build.0 = Debug|x64 + {3AEC39D9-4641-5161-9107-265EB50CA882}.Release|x64.ActiveCfg = Release|x64 + {3AEC39D9-4641-5161-9107-265EB50CA882}.Release|x64.Build.0 = Release|x64 + {6DE2CFFA-D9B3-5E14-BEBD-5DFAB2B5290B}.Debug|x64.ActiveCfg = Debug|x64 + {6DE2CFFA-D9B3-5E14-BEBD-5DFAB2B5290B}.Debug|x64.Build.0 = Debug|x64 + {6DE2CFFA-D9B3-5E14-BEBD-5DFAB2B5290B}.Release|x64.ActiveCfg = Release|x64 + {6DE2CFFA-D9B3-5E14-BEBD-5DFAB2B5290B}.Release|x64.Build.0 = Release|x64 + {42558F77-73F2-5CA7-8E3C-BB0E1646CD45}.Debug|x64.ActiveCfg = Debug|x64 + {42558F77-73F2-5CA7-8E3C-BB0E1646CD45}.Debug|x64.Build.0 = Debug|x64 + {42558F77-73F2-5CA7-8E3C-BB0E1646CD45}.Release|x64.ActiveCfg = Release|x64 + {42558F77-73F2-5CA7-8E3C-BB0E1646CD45}.Release|x64.Build.0 = Release|x64 + {7770C26B-DBFE-505D-8788-8B7EFD9A5A70}.Debug|x64.ActiveCfg = Debug|x64 + {7770C26B-DBFE-505D-8788-8B7EFD9A5A70}.Debug|x64.Build.0 = Debug|x64 + {7770C26B-DBFE-505D-8788-8B7EFD9A5A70}.Release|x64.ActiveCfg = Release|x64 + {7770C26B-DBFE-505D-8788-8B7EFD9A5A70}.Release|x64.Build.0 = Release|x64 + {330D2DFB-E57D-517D-A795-F1EA620B69F0}.Debug|x64.ActiveCfg = Debug|x64 + {330D2DFB-E57D-517D-A795-F1EA620B69F0}.Debug|x64.Build.0 = Debug|x64 + {330D2DFB-E57D-517D-A795-F1EA620B69F0}.Release|x64.ActiveCfg = Release|x64 + {330D2DFB-E57D-517D-A795-F1EA620B69F0}.Release|x64.Build.0 = Release|x64 + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}.Debug|x64.ActiveCfg = Debug|x64 + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}.Debug|x64.Build.0 = Debug|x64 + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}.Release|x64.ActiveCfg = Release|x64 + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}.Release|x64.Build.0 = Release|x64 + EndGlobalSection +EndGlobal diff --git a/cmake/AGENTS.md b/cmake/AGENTS.md index ddd3169..1033528 100644 --- a/cmake/AGENTS.md +++ b/cmake/AGENTS.md @@ -11,3 +11,7 @@ 우연한 dependency로 성공한 것을 독립 배포 검증으로 간주하지 않는다. - Target graph·preset을 바꾸면 configure·MSVC compiler·실제 CTest discovery와 runtime loading을 검증한다. Solution-only 성공으로 CMake 제품 검증을 대체하지 않는다. + +- 직접 MSVC 프로젝트와 source·검사 identity·CRT·ISA·link·DLL을 대조한다. + Preset tree는 `.build/cmake-debug`·`.build/cmake-release`이며 Native 출력과 섞지 않는다. + 선택적 fesa_docs target은 직접 MSBuild의 선행 단계가 아니다. diff --git a/docs/README.md b/docs/README.md index 378ff6f..dcbc5f5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,4 +12,4 @@ - [Hex8 구조해석](hex8-structural-analysis/README.md) - [Shell 열전달](shell-transient-heat-transfer/README.md) - [계산 성능](calculation-performance/README.md) -- [C++ 모듈화](cpp-object-oriented-modular-refactoring/README.md) +- [C++ 모듈화·Refactor 병합 현황과 이관 근거](cpp-object-oriented-modular-refactoring/README.md) diff --git a/docs/calculation-performance/README.md b/docs/calculation-performance/README.md index 48316a6..4474217 100644 --- a/docs/calculation-performance/README.md +++ b/docs/calculation-performance/README.md @@ -35,3 +35,13 @@ Hex8 기하 packet 수정본의 관련 Debug/Release82개씩, 독립 snapshot9,8 그 수정본의 단일 동적 개발 실행은 native0·117.7986225초로 완료됐으나100초 목표 초과다.101 U frame 비교는 blocking PASS, 최대 relative RMS 약2.155586e-6이었다. Outer wrapper는 종료 자식의 null StartTime 처리에서1로 끝났고 실제 FESA native0·후속 comparator0과 구분한다. 이전135.9302297초와의 차이는 서로 다른 source의 단일 개발 표본이며 반복 통계나 특정 함수 비용이 아니다. Shell 명시 영 seed 이후 SW60 수집은 partial이며 collector native4·target 종료 미관측, increment1까지 진행했다. 함수 sample의 Jet 산술·할당·작은 MKL 호출·OpenMP spin은 비용 후보지만 sample 부재를 cache hit 보장으로 바꾸거나 nested inclusive CPU를 합산해 wall time을 만들지 않는다. 전체 shell100초·최종 전체 Debug·원본5개 재실행·최종 물리 평가는 미완료다. 보류 후보의 PASS를 복원 source나 최신 통합본에 승계하지 않는다. + +## Refactor 채택 시 보존할 성능 한계 + +Refactor의 2026-10-16 `0b8de3a` 당시 기록은 ShellNL whole elapsed가 원본 대비 +Native+86.52%·CMake+120.91% 회귀했다고 보고한다. 이는 해당 source·환경의 과거 단일 기록이며 +변산·메모리·배경 부하와 원인은 미확정이다. 이후 객체 복사 제거 revision의 정적 검증을 +새 Release 성능 향상으로 승계하지 않는다. 원본 `.build` archive는 통합 작업 공간으로 +자동 전달되지 않았으며 이번 병합에서 해당 시간의 원시 근거를 새로 재현한 것은 아니다. +이번 작업은 제품 bytes를 채택하고 검증하는 범위다. 지속 SpMV cache나 새 산술 최적화를 +도입하지 않으며 성능 회귀 원인 해결·새 benchmark는 별도 작업으로 남긴다. diff --git a/docs/cpp-object-oriented-modular-refactoring/README.md b/docs/cpp-object-oriented-modular-refactoring/README.md index 391db7b..ba5b085 100644 --- a/docs/cpp-object-oriented-modular-refactoring/README.md +++ b/docs/cpp-object-oriented-modular-refactoring/README.md @@ -24,3 +24,201 @@ CLI는 입력 `.inp` 하나, lexical sibling HDF5·log, warning/오류 진단과 - 과거 실행 절차를 현재 실행 계획으로 복원하지 않는다. CTest와 별도 Python suite의 성공을 합치지 않는다. 이 문서 작업에서는 build/test를 실행하지 않았다. 당시 모듈화와 reference의 bounded 검증은 남기되 최신 전체 회귀·외부 배포 준비 완료를 선언하지 않는다. 현재 물리적 미해결 사항은 각 기능 README가 소유한다. + +## Refactor 코드 채택 후 구조 + +2026-10-18 통합은 FESADev `7438c827` 이력에 Refactor `11f09eeb`의 제품 `.h/.cpp` +274개와 직접 MSVC 빌드를 선별 도입한다. 옛 구현을 섞는 호환 계층이나 새 정식화는 추가하지 않는다. +[파일 manifest](merge-manifest.json)는 원본 Git blob과 working bytes, 보존·도입 방침을 구분하고, +[테스트 이관표](test-migration.tsv)는 양쪽 기존 identity·assertion·oracle와 최종 위치를 연결한다. + +- [AnalysisProcedure](../../include/fesa/analysis/analysis_procedure.h)와 + [factory](../../src/fesa/analysis/prepared_analysis.cpp)는 shell linear/nonlinear static, + eigen, HHT, thermal과 solid static/frequency/HHT를 선택한다. 실행 수명은 호출자 adapter보다 짧다. + [PreparedAnalysisOutcome](../../include/fesa/analysis/prepared_analysis_outcome.h)은 family별 + typed completed payload를 유지하고, [결과 dispatch](../../src/fesa/results/prepared_results_writer.cpp)는 + 검증된 payload를 해당 writer로 보낸다. 기존 schema·atomic finalize 의미는 유지한다. +- [Element capabilities](../../include/fesa/elements/element_capabilities.h)는 ShellTrialElement, + SolidTrialElement, ShellInertiaElement, ThermalElement, ShellReferenceElement를 분리한다. + Adapter는 immutable kernel을 빌리므로 kernel의 수명과 주소가 안정적이어야 한다. + Equation·accepted history는 요소에 두지 않는다. Local layout과 full response를 typed로 보존한다. +- [EquilibriumAlgorithm/EquilibriumStep](../../src/fesa/analysis/equilibrium_algorithm.h)는 + iteration 순서와 procedure-local typed pending candidate를 분리한다. Algorithm은 candidate를 + 소유하거나 type-erase하지 않는다. Static은1, mechanical HHT는0에서 시작하는 inclusive 순서를 유지하고, + procedure의 검증·commit 경계가 accepted state를 바꾼다. +- [ShellHhtIntegrator](../../src/fesa/analysis/hht_reduced_integrator.h)는 predictor·rate 계산· + physical-rate 복원을 분리한다. Chart/root/solver와 callback은 동기 borrowed view이며 + rate 출력 buffer는 호출자 소유로 입력·서로와 alias하지 않는다. `RunReducedHhtStep`은 + predictor→pending endpoint→commit 순서만 조정하고 accepted history를 소유하지 않는다. +- [PARDISO Session](../../src/fesa/solvers/linear/pardiso_session.h)은 private factor/solve/release + 수명을 공통화한다. 기존1×1 TLS 회피의 범위를 vendor 전체 해결로 확대하지 않는다. + [SparsePattern](../../include/fesa/math/sparse_pattern.h)은 CSR 값 구조이며 지속 backend cache가 아니다. + [SpMV](../../src/fesa/math/sparse_matrix.cpp)는 여전히 호출마다 변환 배열·값 복사·handle을 소유한다. + +수식·적분·reduction 순서·cache 수명에 영향이 있는 도입 차이는 manifest에 따로 분류했다. +출처 일치·compile·테스트 통과만으로 수치 동등성을 선언하지 않으며 독립 수치 검토와 +영향받은 analytical/invariant·물리·reference 검증을 별도로 수행한다. + +## 이번 병합의 현재 검증 상태 + +T2/T3 단계에서 직접 MSVC와 CMake/Ninja의 Debug solver/CLI 및 세 테스트 target build가 완료됐다. +제품274개는 Refactor working bytes와 일치한다. 양쪽 실제 discovery는 unit849, +integration72, reference43으로 총964개이며 canonical identity가 일치한다. +당시 선별 실행은 CMake176개, Native15개, 합성 reference comparator28개, +Python145개가 failure/error/skip 없이 통과했다. 이는 전체964개 실행·실제 모델 비교 완료가 아니다. +근거는 작업 공간의 `.build/merge-verification/t2-20261018-01/`와 +`t3-20261018-01/`에 있다. 원래 dev와 Refactor 저장소 및 기준자료는 보존했다. + +2026-10-18 사용자 지시로 `reference/temp`는 검증에 사용하지 않는다. 정식 경로에 없는 +`shellNL-meshfine`, `shellNL-meshfine_02`, `shellNL-meshfine-pressure` 자료는 복사·복원하지 않는다. +해당 실제 비교는 자료 미확보로 미완료이며 테스트를 skip 처리하거나 통과로 바꾸지 않는다. +전체 Debug 검증·독립 수치 검토·정식 자료 비교의 현재 진행은 아래 T5 중간 기록과 구분한다. +정리 전 필수 검증을 충족하지 못하면 테스트 삭제와 최종 병합 완료 판정을 진행하지 않는다. +T4 문서 갱신 자체로 build/test를 추가 실행하지 않았다. + +### T5 최초 중간 snapshot — 2026-10-18 03:00 UTC, 이후 범위 변경 전 이력 + +2026-10-18에 전체 Native Debug 솔루션, CMake Debug configure/build와 Ninja dependency +검사를 새로 실행해 모두 exit0을 확인했다. 제품102 compile unit의 dependency가 유효하고, +양쪽 세 테스트 executable의 실제 identity는 unit849·integration72·reference43, +CTest964개로 일치한다. Public header111개는 각각 독립 TU로 private/vendor include 경로 없이 +MSVC C++17 `/EHsc /W4 /WX /MDd /Zs` 검사를 통과했다. CLI·test의 네 runtime 디렉터리에서 +DLL7개의 SHA256이 같다. 제품274개와 정식 reference32개 bytes도 중간 기록 전에 재확인했다. +`reference/temp`의12개 경로는 byte 검증 대상에서 제외했고 입력·CSV·결과를 사용하지 않았다. + +Native unit 전체는 필터 없이 계속 실행 중이며 **전체 종료 코드와 XML은 아직 없다**. +중간 stdout에서 완료57개 identity를 관측했으며 다음 개별 검사는 새로 PASS 종료했다. + +- `ReducedManufacturedControllerKeepsExactInitialOrbit`: 396862ms. +- `C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence`: 7-grid, 7153515ms. +- `C08bInitialPhysicalSpectrumProbe`: 716ms. +- `PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid`: 539678ms. + +현재 `C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`의8-grid를 수행한다. +h=1/64·1/128·1/256·1/512·1/1024의 계산 요약이 생성됐으나 남은8192·16384·32768증분 +fine-grid와 최종 시간수렴·물리 gate는 미완료다. 모든 grid의 총 증분수는57840이다. +CPU/RSS 상승이나 부분 로그를 전체 통과 근거로 삼지 않는다. Native 나머지 executable, +전체 CTest와 Python suite는 같은 직렬 큐에서 대기하며 임의 timeout·skip·필터를 추가하지 않았다. + +Refactor 원본 밖 별도 source snapshot304개에서 Native Debug 기준 solver/CLI를 새로 +빌드해 exit0과 DLL7개 일치를 확인했다. 정적5모델을 포함한 정식 입력11개에 대해 기준·Native· +CMake 실행물을 같은 scratch 입력 경로와 bytes에서 직렬 실행하고 schema·identity·각 field를 +대조하는 후속 큐를 준비했다. **새 실제 모델 실행·비교는 아직 시작하지 않았다.** 보고서 JSON의 +case·policy·quantity와 실제 exit를 확인하며, parity의 빈 결과·자료 부재·dtype 차이·불일치는 +nonzero로 남긴다. Exact field assertion의 불일치를 새 물리 허용치 위반으로 승격하지 않고 +출처·dtype·identity·rounding 차이를 분류한 뒤 기존 승인 기준과 대조한다. 임시 도구의 합성 +증거 하한 검사9건은 솔버나 물리 검증 통과가 아니다. 빈 결과·자료 누락의 옛 false-green을 +각각 exit0으로 재현하고 수정 후 exit1·exit2가 되는 것을 확인했다. + +독립 수치 검토는 명백한 식 오류나 승인 기준 변경을 발견하지 못했으나 `CONCERNS`다. +inverse→factor solve·Jet·eigen whitening·paired 산술과 spatial RM 변환은 rounding graph에 +영향이 있어 비트 보존을 가정하지 않는다. 특히 `hdf5_primitives.cpp`, dynamic/nonlinear HDF5 +writer의 `J^T m=g` LU action은 T2 영향 routing 누락을 T5 manifest에 보충하고 finite-rotation +virtual-work·완전 inverse action·HDF5 reaction readback 검사 identity에 연결했다. +이 정적 검토를 실제 전체 실행·reference closure의 승인으로 해석하지 않는다. + +정식 `shellNL-meshfine`·`shellNL-meshfine-pressure`는 자료 미확보로 미실행이고, +`shellNL-meshfine_02`는 자료 부재와 현재 comparator 연결 부재를 함께 남긴다. +Thermal 새 필수 reference 부재와 기존 NT11 diagnostic/nonblocking 불일치도 유지한다. +필수 gate를 충족하지 않았으므로 테스트 삭제·T6 진입·최종 병합 완료 판정을 진행하지 않는다. + +중간 근거는 `.build/merge-verification/t5-20261018-01/before-prune/`에 있으며 +`running-checkpoint.json`과 `progress.jsonl`이 실행 큐·PID·현재 관측을 보존한다. +파일 manifest의 `t5_before_prune_verification`은 이 중간 snapshot을 기록하며 T1/T2/T3 원필드는 보존했다. + + +### T5 사용자 승인 정적 범위 — 검증 완료, 제한 유지 + +사용자는 장시간 HHT 동해석 검증을 중단하고 정적 해석 검증 후 다음 단계로 진행하도록 +범위를 변경했다. 위 최초 snapshot의 전체 큐·미완료 gate 설명은 당시 이력이다. 현재는 +HHT·solid dynamic·eigen/frequency·transient thermal 실제 수치 실행을 유예하고 해당 테스트를 +보존한다. 기존 전체 큐와 후속 watcher는 `user_cancelled_static_only`로 종료했으며, +부분 stdout·미생성 XML·취소 근거를 보존했다. 이를 수치 실패나 통과로 계산하지 않는다. + +현재964개 identity를 source body·경로·행·SHA256에 대응시켜 정적·공통631개(unit555, +integration35, reference41)를 선택하고333개를 유예했다. 과거 정적553개는 분류 근거로만 +읽었으며 그중11개를 유예하고 현재 추가 공통89개를 포함했다. 순수 SO3 미분·좌표변환, +mock 수명·dispatch, parser/mapping 및 합성 comparator 정책 검사는 포함하고 실제 비정적 +procedure를 호출하는 검사는 제외했다. 선택표는 `before-prune/static-only/selection.json`에 있다. + +새 직렬 실행은 Native·CMake의 선택631개, 명시적 목록 CTest631개 및 Python 합성·정책 +검사다. 고유 C++ 검사 수는631개이며 실행 경로별 수를 합쳐 고유 검사 수로 보고하지 않는다. +Native·CMake 각631개 및 CTest631개가 실제 exit0·skip0으로 확인됐다. Native/CMake의 +unit555·reference41은 처음 실행에서 통과했고 integration35는 아래 환경 대조 후 전부 통과했다. +CTest JUnit의 실제 이름을 canonical identity로 역매핑해 선택631개와 누락·중복0을 확인했다. +Python 합성·정책145개도 exit0·failure/error/skip0이며 실제 비정적 물리 검증으로 세지 않는다. +정식 정적5모델도 fresh Refactor 기준·통합 Native·통합 CMake에서 같은 scratch 입력 bytes/경로로 +총15번 실행했고 등록 비교15개·보고서 검증15개·schema/identity/field parity5개가 모두 exit0이다. +추가 정식 shellNL 자료의 부재와 `_02` comparator 연결 부재는 미완료로 유지하며, 확보된 +정적 범위의 gate가 충족되면 다음 단계로 진행할 수 있다는 사용자 지시를 따른다. + +임시 parity 도구의0길이 dataset만 있는 파일 false-green도 실제 exit0으로 재현했다. +필수 inventory와 파일 전체의 비어있지 않은 data 검사를 추가한 도구는 같은 경우 exit1, +의미있는 합성 동일값 exit0·불일치 exit1을 보였다. 개별0길이 dataset은 허용한다. +이는 임시 도구 검증이며 제품 물리·reference 통과를 대신하지 않는다. 현재 근거 경로는 +`.build/merge-verification/t5-20261018-01/before-prune/static-only/run-20261018-01/`이다. + + +정적 모델의 beam은 U/UR·RF/RM·section actions6가족212행, shell은 U blocking·UR warning-only +2가족294행을 기존 기준으로 비교했다. ShellNL은 translation blocking·rotation warning-only와 +내부 force/moment balance·accepted free residual을 통과했다. RF/RM3가족의 수치 비교는 +**false/review-only**로 보존하며 stress mapping은 여전히 미판정이다. Hex8 선형·비선형 정적은 +각 Step-1/increment10의 U(length)·RF(force)·S(force/length²)를 원본 CSV·source identity와 +기존5%/1% 기준으로 비교했다. 개별 quantity/frame/policy·원본/실행물/결과 hash 및 literal +argv/cwd/env는 manifest와 raw `final-static-summary.json`·각 closed execution record에 있다. + +초기 Native/CMake integration에서는 같은 application 검사1개가 각각 output-busy로 실패했다. +Native 실패 lock 경로261자, CMake260자였으며 동일 Native exe·동일 identity에서 TMP/TEMP만 +바꾼 대조가 긴 경로 exit1→짧은 task-owned 경로 exit0을 보였다. 짧은 고유 TMP에서 양쪽 +integration35개 전체를 다시 실행해 identity35·exit0·failure/error/skip0을 확인했다. 원래 +실패 XML/log와 최초 큐 aggregate exit1은 환경/경로 한계로 보존했다. 제품·테스트·허용치는 +바꾸지 않았다. 모델 input/result/lock 길이도 사전 확인했으며 최대193자다. + +독립 정적 수치 보충 검토는 `CONCERNS / required_static_missing=false`다. 선택631개의 +정적 수치 필수 coverage 누락은 발견하지 못했으며, 이를 RF/RM·stress mapping 또는 유예 +기능의 물리 승인으로 확대하지 않는다. 사용자 수정 범위의 정리 전 정적 gate는 충족했으므로 +다음 단계로 진행할 수 있다. 비정적333개·누락 정식 fine/_02/pressure 비교·열해석 새 reference +부재와 기존 NT11 diagnostic 제한은 미완료로 유지한다. 테스트 정리·최종 병합은 아직 수행하지 않았다. + +### T6 정적 범위 검사 정리 — 삭제 0개 + +[최종 정리 검토](test-cleanup-review.md)에 따라 검사·helper를 모두 보존했다. +실제 본문에서 public/private owner, 실패 뒤 출력·factor 보존, TLS·FP flags·비트 및 +독립 frozen oracle의 경계가 달라 동등 대체를 입증하지 못했다. 폐기 구조만 검사한다고 +확정할 근거도 없었다. 비정적333개와 자료 없는 fine/_02/pressure 관련 검사는 보존한다. +이관표2,876행의 원래12열은 그대로 두고 최종 판정·근거 연결3열만 추가했다. + +검사 source·helper·양쪽 등록 변경이0이므로 문서 전용 정적 검토만 수행했다. +T6 raw `.build/merge-verification/t6-20261018/`는 원셀 보존, 현재964개 body와 선택631개, +Native/CMake 등록·제품274개·T5 실행물/hash 보존을 확인한다. T5 당시 실행 결과를 +새 실행으로 보고하지 않으며 전체964개 PASS도 주장하지 않는다. 최종 정적 검증과 +병합 완료 판정은 T7에 남긴다. + + +### T7 최종 정적 검증과 근거 보존 — 통합 승인 전 + +이 절이 위의 최초 전체 실행 snapshot·T5/T6 진행 상태보다 최신이다. T6/T7에서 코드·검사· +helper·비교 도구·빌드 등록을 바꾸지 않았으므로 문서 전용 변경에 대한 지침에 따라 build/test와 +모델을 반복 실행하지 않았다. 대신 T5 검증 commit `4841f122`와 최종 코드 상태 `4846206e`의 +해당 입력 집합이 같음을 확인하고 실제 실행물·DLL·입력·결과의 hash를 대조했다. 이 확인을 +통과한 **T5 실제 실행 근거를 재사용**하며 T7의 새 실행으로 세지 않는다. + +새 정적 검토는 제품274개 Refactor bytes,964개 검사 body·631개 선택/333개 보존, 이관표 +원셀·정리 판정, 양쪽 등록과 실행물, 성공 XML8개와 정적5모델×3실행물의 closed record15개· +전체50단계 exit0을 확인했다. Formulation23개와 상대 링크397개, 루트 AGENTS/CLAUDE 동일성, +원래 두 저장소 pin과 정식 reference32개를 확인했다. 최초 보호 목록55개 중 temp12개를 +읽기·hash 대상에서 제외하고 나머지43개 원본·로그·설정·과거 계획을 대조했다. +삭제한 검사·helper는0개이며 전체964개 또는 유예333개를 통과로 보고하지 않는다. + +원시 근거는 작업 worktree 정리 뒤에도 유지하도록 원래 FESADev root의 +`.build/merge-verification/refactor-integration-final-20261018-01/`에 복사했다. +`archive-inventory.json`은 원래 절대 경로→보존 위치·SHA256·크기를 연결한다. Worker raw, +base의 문서/독립 수치 검토 raw, 실제 실행물9개·runtime DLL35개(5디렉터리×7개), 새로 빌드한 +Refactor 기준 source304개 등1,379개 파일의 복사 hash를 확인했다. 기존 실패·중단·옛 임시 도구 +기록도 포함하며 원본을 이동·삭제하거나 과거 argv/cwd를 다시 쓰지 않았다. 현재 근거는 +`worker-raw/t7-20261018/final-static-state.json`과 `archive-integrity.json`에서 찾을 수 있다. + +HHT 등 비정적 검증과 미확보 fine/_02/pressure 비교, ShellNL RF/RM false/review-only·응력 +mapping 미판정, 열해석 reference/NT11 제한은 그대로 남는다. 승인된 정적 범위의 최종 상태를 +확인했으며 독립 최종 검토와 사용자 통합 승인 후 원래 dev에 반영한다. 아직 원래 dev 병합· +원격 push를 수행하지 않았다. diff --git a/docs/cpp-object-oriented-modular-refactoring/merge-manifest.json b/docs/cpp-object-oriented-modular-refactoring/merge-manifest.json new file mode 100644 index 0000000..b5f444a --- /dev/null +++ b/docs/cpp-object-oriented-modular-refactoring/merge-manifest.json @@ -0,0 +1,34582 @@ +{ + "schema": "fesa-dev-refactor-merge-manifest-v1", + "task": "T1 inventory only", + "created_utc": "2026-10-17T16:59:01.870619+00:00", + "repositories": { + "fesa_dev": { + "path": "C:/git/FESADev", + "branch": "dev", + "head": "7438c82744e5fad2db26ee900172d7067485b5ba", + "status_porcelain_v1": [ + "?? reference/shell-thermal/shell-thermal_log.txt", + "?? reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_log.txt" + ] + }, + "refactor": { + "path": "C:/git/FESADEV_Refactor", + "branch": "master", + "head": "11f09eeb9460115758eada96deda1d0b08c4a442", + "status_porcelain_v1": [] + }, + "integration": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker", + "branch": "dryforge/refactor-t1", + "head": "7438c82744e5fad2db26ee900172d7067485b5ba", + "status_porcelain_v1": [ + "?? .build/merge-verification/t1-20261018/inventory.py" + ], + "initial_status_before_temporary_inventory": [], + "status_note": "status_porcelain_v1 captured after creating T1 temporary helper; initial pin command showed clean branch at approved base. Only manifest will be committed." + } + }, + "integration_contract": { + "history": "FESADev history preserved, selective file introduction; no unrelated history merge; approved repositories have no common commit", + "production_source": "Refactor tracked include/src .h/.cpp file set and working-tree bytes; Dev-only hex8_pair_arithmetic.h excluded only after consumer migration", + "primary_build": "FESA.sln + msvc direct MSBuild; retain CMake/Ninja auxiliary path", + "preserved_settings": [ + ".clang-format", + ".clang-tidy", + "Doxyfile", + "pytest.ini", + "optional fesa_docs CMake target" + ], + "reference_bytes": "do not normalize EOL/repair source bytes to pass frozen hash contracts", + "T1_writes": [ + "this manifest", + "ignored temporary .build/merge-verification/t1-20261018 helpers" + ], + "T1_forbidden": [ + "source/test/config edits", + "numerical execution", + "configure/build/test", + "reference deletion/copy/promotion", + "remote access", + "vendor install/download" + ], + "source_EOL_observation": "Refactor production274 files observed CRLF; Dev root has mixed checkout EOL representations. Adopt source working-tree bytes directly, never infer bytes from Git blob hash or clean status alone." + }, + "policy_definitions": { + "adopt-refactor-bytes": "도입: pinned Refactor tracked source file set/working-tree bytes", + "preserve-dev": "보존: Dev bytes/current ownership; source docs can inform later selective synthesis", + "integrate-content": "내용 통합: both valid assertions/oracles/contracts survive until reviewed equivalent replacement or obsolete-structure evidence; no T1 edits", + "import-refactor": "도입: tracked source/build/test/comparator only, no generated artifacts", + "exclude-source-import": "도입 제외: historical/source-only documents or duplicate reference manifest; preserve source in place, useful technical details synthesized into Dev feature README later", + "exclude-after-consumer-migration": "제외 예정: Dev-only production header after consumer migration, no T1 deletion", + "map-to-preserved-reference": "일대일 대응: source ShellNL4files equal Dev lowercase paths; no additional copy", + "preserve-excluded-temp-in-place": "보존/검사제외: reference/temp stays excluded, no promotion/move/correction" + }, + "inventory_summary": { + "fesa_dev_tracked": 587, + "refactor_tracked": 563, + "canonical_target_records": 728, + "by_policy": { + "preserve-dev": 180, + "integrate-content": 167, + "adopt-refactor-bytes": 274, + "map-to-preserved-reference": 4, + "preserve-excluded-temp-in-place": 12, + "exclude-after-consumer-migration": 1, + "import-refactor": 15, + "exclude-source-import": 75 + }, + "refactor_include_h": 111, + "refactor_src_h_cpp": 163, + "casefold_target_duplicates": 0 + }, + "tracked_files": [ + { + "target_path": ".clang-format", + "fesa_dev": { + "source_path": ".clang-format", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7f10b631041ea4b54599afca1b6edf33ec325427", + "mode": "100644", + "size_bytes": 52, + "sha256": "d19133de1f768e6e436262fb20fba635274588631f9108f768bdbc8fadae6a8d" + }, + "working_tree": { + "exists": true, + "size_bytes": 55, + "sha256": "2689abf044bc3778ea606c8e94888296ec30f7c37205558ed1d8060bf36a8c9a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 55, + "sha256": "2689abf044bc3778ea606c8e94888296ec30f7c37205558ed1d8060bf36a8c9a" + } + }, + { + "target_path": ".clang-tidy", + "fesa_dev": { + "source_path": ".clang-tidy", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5c20edd0216b46c82237584175cea1544c3ed9c0", + "mode": "100644", + "size_bytes": 1331, + "sha256": "4607a77e362f345a3bacff770c99d3ee5e0dde1c02c5f459824ea88a3cd73028" + }, + "working_tree": { + "exists": true, + "size_bytes": 1356, + "sha256": "92316704ded7c80b5d55bb1fb50639933cf01e72fce26e6adf9cfcb84941a90e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1356, + "sha256": "92316704ded7c80b5d55bb1fb50639933cf01e72fce26e6adf9cfcb84941a90e" + } + }, + { + "target_path": ".codex/skills/fem-theory-query/.gitignore", + "fesa_dev": { + "source_path": ".codex/skills/fem-theory-query/.gitignore", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "880f81b5b75a0c8033e548a7e1a62670e09ec84e", + "mode": "100644", + "size_bytes": 15, + "sha256": "a0b0ae55b0ad8eb762fc546c1c44b7804b282a44bef9797d15ae7a53a859b272" + }, + "working_tree": { + "exists": true, + "size_bytes": 15, + "sha256": "a0b0ae55b0ad8eb762fc546c1c44b7804b282a44bef9797d15ae7a53a859b272" + }, + "working_tree_equals_blob": true + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 16, + "sha256": "c17f949202ec3b183529282d5446ccdf8c79be08552a806d3cb3b8e22bed5ea0" + } + }, + { + "target_path": ".codex/skills/fem-theory-query/SKILL.md", + "fesa_dev": { + "source_path": ".codex/skills/fem-theory-query/SKILL.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9f2730d34ff722af56723cd934a86dc4d8faef9a", + "mode": "100644", + "size_bytes": 2662, + "sha256": "a15ff36d478823e2577b64c5bcc2e8c5b2be393eef6022750c67419b380dfacc" + }, + "working_tree": { + "exists": true, + "size_bytes": 2662, + "sha256": "a15ff36d478823e2577b64c5bcc2e8c5b2be393eef6022750c67419b380dfacc" + }, + "working_tree_equals_blob": true + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2707, + "sha256": "d30e22ec02ee0ceefab792b3da85556a84e5c01a7e2d8e37578067953eca0ef0" + } + }, + { + "target_path": ".codex/skills/fem-theory-query/agents/openai.yaml", + "fesa_dev": { + "source_path": ".codex/skills/fem-theory-query/agents/openai.yaml", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1b6f97aece21cbe0cb306e832c5cea195a00104a", + "mode": "100644", + "size_bytes": 227, + "sha256": "798e8cc82f818a76d5d31cbdbe56e9180609fbb92e101ce36f5a15c3a9ec4580" + }, + "working_tree": { + "exists": true, + "size_bytes": 227, + "sha256": "798e8cc82f818a76d5d31cbdbe56e9180609fbb92e101ce36f5a15c3a9ec4580" + }, + "working_tree_equals_blob": true + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 231, + "sha256": "a67c5aab389c4b89fcab4d60209cb5319a8a43b61d2ac4c986ce3120b632e0af" + } + }, + { + "target_path": ".codex/skills/fem-theory-query/vault-path.example.txt", + "fesa_dev": { + "source_path": ".codex/skills/fem-theory-query/vault-path.example.txt", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0ff2d8e5e88af05190b8a28325be929272c621fd", + "mode": "100644", + "size_bytes": 189, + "sha256": "0c62dd97d000760c886463d7a93f70187c313007f45591180763f0c37769b528" + }, + "working_tree": { + "exists": true, + "size_bytes": 189, + "sha256": "0c62dd97d000760c886463d7a93f70187c313007f45591180763f0c37769b528" + }, + "working_tree_equals_blob": true + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 192, + "sha256": "b9aafa19a0e5719bca63fb88becdfab81cfa6de50b2f0273686589f12f3d8e65" + } + }, + { + "target_path": ".gitignore", + "fesa_dev": { + "source_path": ".gitignore", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ba1bef0f369a52725b68248863d17c5b553c7404", + "mode": "100644", + "size_bytes": 361, + "sha256": "255ea57c7284abf4cf9a25d8cbd8b670b242a2f2413e1b4960c4448896d90695" + }, + "working_tree": { + "exists": true, + "size_bytes": 390, + "sha256": "9355d9942d00d29db5b283f8505e5d3c88d2f286406c1c1435f2d6b668ca1c24" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": ".gitignore", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "48ea575f3ab68593b9134cbf5da56b589208df9e", + "mode": "100644", + "size_bytes": 103, + "sha256": "a98668a2fa9f8f73338fad26f11bf5d770b69a3eac1d0f4a892b00d8d0dba3cf" + }, + "working_tree": { + "exists": true, + "size_bytes": 112, + "sha256": "ecb0e06f55de705524972060464d965401a6ce3ec33b659f8018dcd2fa2dc965" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 390, + "sha256": "9355d9942d00d29db5b283f8505e5d3c88d2f286406c1c1435f2d6b668ca1c24" + } + }, + { + "target_path": "AGENTS.md", + "fesa_dev": { + "source_path": "AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fe0be951eaf7895ecf71fb88a377e1d2a76005f0", + "mode": "100644", + "size_bytes": 5992, + "sha256": "7a3b88dae9c679182107a803b32ca24295f944de274cdc230c338eee1f38870a" + }, + "working_tree": { + "exists": true, + "size_bytes": 6081, + "sha256": "595510a5cfd9225fee8cea57064fccc254fc95f3ba24e829e077f1a4f90642a5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1fa34c7127c268c1ae4df0e3f4ca98a98251f28f", + "mode": "100644", + "size_bytes": 7375, + "sha256": "e481e465ab74b97516b9fdf60f9bd92c992c47897682cfa84b01bcf65eac260e" + }, + "working_tree": { + "exists": true, + "size_bytes": 7478, + "sha256": "c06a805c4861d9af676ce61f20935e15e2182aaa18d75187234a6de3bd88097b" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6081, + "sha256": "595510a5cfd9225fee8cea57064fccc254fc95f3ba24e829e077f1a4f90642a5" + } + }, + { + "target_path": "CLAUDE.md", + "fesa_dev": { + "source_path": "CLAUDE.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fe0be951eaf7895ecf71fb88a377e1d2a76005f0", + "mode": "100644", + "size_bytes": 5992, + "sha256": "7a3b88dae9c679182107a803b32ca24295f944de274cdc230c338eee1f38870a" + }, + "working_tree": { + "exists": true, + "size_bytes": 6081, + "sha256": "595510a5cfd9225fee8cea57064fccc254fc95f3ba24e829e077f1a4f90642a5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "CLAUDE.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1fa34c7127c268c1ae4df0e3f4ca98a98251f28f", + "mode": "100644", + "size_bytes": 7375, + "sha256": "e481e465ab74b97516b9fdf60f9bd92c992c47897682cfa84b01bcf65eac260e" + }, + "working_tree": { + "exists": true, + "size_bytes": 7478, + "sha256": "c06a805c4861d9af676ce61f20935e15e2182aaa18d75187234a6de3bd88097b" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6081, + "sha256": "595510a5cfd9225fee8cea57064fccc254fc95f3ba24e829e077f1a4f90642a5" + } + }, + { + "target_path": "CMakeLists.txt", + "fesa_dev": { + "source_path": "CMakeLists.txt", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3f23b0cf3b3823be5a986f4117cc224ee12065ec", + "mode": "100644", + "size_bytes": 560, + "sha256": "5b7c0f250eff2628c572f3b130ea5385a71280aaf4989c378d3bf21516e83dbb" + }, + "working_tree": { + "exists": true, + "size_bytes": 584, + "sha256": "a8b18d0ea8b7bdf867545a2b59c20d08ca65ae5e7063b54a98f3f5342837d38c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "CMakeLists.txt", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7f63fb0642a2775572ed6a1a505cb70bb49cb964", + "mode": "100644", + "size_bytes": 513, + "sha256": "a75588da9aaad7bdc372c3c0f2f0069763fa832991af01e3d22ea45910fbbd02" + }, + "working_tree": { + "exists": true, + "size_bytes": 527, + "sha256": "ead1cd94dd27c6f905247159f37c7280118533c48e3b95bb9c3eabf29f9ac5e9" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 584, + "sha256": "a8b18d0ea8b7bdf867545a2b59c20d08ca65ae5e7063b54a98f3f5342837d38c" + } + }, + { + "target_path": "CMakePresets.json", + "fesa_dev": { + "source_path": "CMakePresets.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7074f53d23ff1fff90d13849020eaebb2d5efd23", + "mode": "100644", + "size_bytes": 1180, + "sha256": "ed980e28efcd383b3d2ed2f2dc45c21b2eff735e690ebbedeb56670db2290d21" + }, + "working_tree": { + "exists": true, + "size_bytes": 1223, + "sha256": "fe61fab0577e883880cff9714d7cb64577fbbd180b3a22da7e7a4ee7591798bb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "CMakePresets.json", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "38b16a444a23448ca19c69322031269b4cce6968", + "mode": "100644", + "size_bytes": 1510, + "sha256": "1f3fae903cd5d47077a64fb9b393f884df12b95326da4a01a9d07aadf8d91da6" + }, + "working_tree": { + "exists": true, + "size_bytes": 1567, + "sha256": "985425418c8a2093913391136002b8869408eeb93aac391fd2991253ef9920f1" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1223, + "sha256": "fe61fab0577e883880cff9714d7cb64577fbbd180b3a22da7e7a4ee7591798bb" + } + }, + { + "target_path": "Doxyfile", + "fesa_dev": { + "source_path": "Doxyfile", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d4ba0e1c877bef968223b80bcb7e6af975f41857", + "mode": "100644", + "size_bytes": 344, + "sha256": "8b03cf9dd011e4e2e1ae3fd8e4921b1c55cdd8b24e86d031bff5e4717a15eef7" + }, + "working_tree": { + "exists": true, + "size_bytes": 360, + "sha256": "47067e23f1b18605fa3e2729475e3532faec4b960baebc58c55eba41d6e63891" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 360, + "sha256": "47067e23f1b18605fa3e2729475e3532faec4b960baebc58c55eba41d6e63891" + } + }, + { + "target_path": "FESA.sln", + "refactor": { + "source_path": "FESA.sln", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "64295f3a9d88091dd2413cd784003483478cc506", + "mode": "100644", + "size_bytes": 3075, + "sha256": "a6db2a1f564762cdcfa1c23a852d61b89921b236f567b056945a80d0213cc557" + }, + "working_tree": { + "exists": true, + "size_bytes": 3123, + "sha256": "f8890c641187abd2d3f7c7af17c74fa4d7746300c25e5d2fda5d1eba71fc2fa2" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "HANDOFF.md", + "fesa_dev": { + "source_path": "HANDOFF.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8a59fdfd92d79441ad3ae70ea59d8b61d725db53", + "mode": "100644", + "size_bytes": 31575, + "sha256": "2d5dcb61603d016fddd082a8fc25055b94301b5e3a74d0dec95b8a6e145d90ed" + }, + "working_tree": { + "exists": true, + "size_bytes": 31821, + "sha256": "93915caee611a7efac00f3e1486e5e951822d408ed881ed8801991cdc0b2696d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 31821, + "sha256": "93915caee611a7efac00f3e1486e5e951822d408ed881ed8801991cdc0b2696d" + } + }, + { + "target_path": "benchmarks/t12_large_rhs.cpp", + "refactor": { + "source_path": "benchmarks/t12_large_rhs.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c8e9b8acd3c385cb0fb6801a7c561e31e9b2977a", + "mode": "100644", + "size_bytes": 3225, + "sha256": "df66d0239de751705e986f9bba58bef6ae5039da20e9eaa779d3ade3a30a2e5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 3303, + "sha256": "89da8eba9ef4cc2e677ef580553cb3aee2c1a87cd99beb1530aa11466f95471b" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "benchmarks/t12_measurement.h", + "refactor": { + "source_path": "benchmarks/t12_measurement.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "565167f9cfa98c544c81fa0074fb519f71960465", + "mode": "100644", + "size_bytes": 2159, + "sha256": "6f1a1134dc5fa82abe16c8c216334c41b313d1cc8fb9dee3228c505fc5dae9ee" + }, + "working_tree": { + "exists": true, + "size_bytes": 2217, + "sha256": "7f6817ec70881053328c191201022e858abcb46ed40304952a25ffcc0bdce31a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "benchmarks/t12_micro.cpp", + "refactor": { + "source_path": "benchmarks/t12_micro.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0a930374bee929d6dd5b70df8e346cc7e0507326", + "mode": "100644", + "size_bytes": 6668, + "sha256": "d9f905da6f88472ba34da5c94c35f2846582c828c0a4e97c377efd7dd34c9aeb" + }, + "working_tree": { + "exists": true, + "size_bytes": 6841, + "sha256": "4bed6bffd8e0e76ab9597fd1eb2bad7637cd1bce7136f4142c8b73434db32fac" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "benchmarks/t12_phase.cpp", + "refactor": { + "source_path": "benchmarks/t12_phase.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a147a60b68cf13dc69a810cbb47d48fd6ec3be15", + "mode": "100644", + "size_bytes": 13954, + "sha256": "4de7dcafc1b531794443716f8e3d26c58e19d59f5238d9018ad29a44e8fbaa81" + }, + "working_tree": { + "exists": true, + "size_bytes": 14288, + "sha256": "400680f727bc104a5f7abaf58f3ca26ea77d4fefb30b5de1aaec79fa8465fdba" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "cmake/AGENTS.md", + "fesa_dev": { + "source_path": "cmake/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ddd3169df1e5a5715f5e0a2b5d24898e28550e7e", + "mode": "100644", + "size_bytes": 959, + "sha256": "ab24f78b405c05ab0a5af51766278d181a0b36bd39e6f0c90f7b67af807672f3" + }, + "working_tree": { + "exists": true, + "size_bytes": 972, + "sha256": "af4e9004560abb88c0bac344ab5eb1f390828de9eafbc86d4857d7113079e10d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "cmake/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2bf9e92739ef1403e415166d2484c23079d917d4", + "mode": "100644", + "size_bytes": 1308, + "sha256": "24b3136920772771d25d1512d7197001346af3dc0c4a716c66b2d049cc9bf9c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 1324, + "sha256": "18bfe61a3b210b4498276ecf0fd350b12ae17a251f1a65ff30f748198a066452" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 972, + "sha256": "af4e9004560abb88c0bac344ab5eb1f390828de9eafbc86d4857d7113079e10d" + } + }, + { + "target_path": "cmake/FesaDependencies.cmake", + "fesa_dev": { + "source_path": "cmake/FesaDependencies.cmake", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0e025e3b7c8e0ccafe191f4463e0d003cbc83a9e", + "mode": "100644", + "size_bytes": 2396, + "sha256": "73cf52867d879c291fcc81c607176e3cace142754b7068a862334d63f17babf6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2470, + "sha256": "9a803f69e60d0facf180ff3d02af4a7a7706e45566fd30735b226708faccc37d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "cmake/FesaDependencies.cmake", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0e025e3b7c8e0ccafe191f4463e0d003cbc83a9e", + "mode": "100644", + "size_bytes": 2396, + "sha256": "73cf52867d879c291fcc81c607176e3cace142754b7068a862334d63f17babf6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2470, + "sha256": "9a803f69e60d0facf180ff3d02af4a7a7706e45566fd30735b226708faccc37d" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2470, + "sha256": "9a803f69e60d0facf180ff3d02af4a7a7706e45566fd30735b226708faccc37d" + } + }, + { + "target_path": "docs/ADR.md", + "refactor": { + "source_path": "docs/ADR.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "564de45a3cb0118e99cb9d129bb67a620909ca38", + "mode": "100644", + "size_bytes": 29748, + "sha256": "be1bb9abbcb0449f2a4868a58eb2f272fe1f24f14b3396f5b63128f247f4f1b5" + }, + "working_tree": { + "exists": true, + "size_bytes": 30180, + "sha256": "29ca71b84553f861def4e29a0c5265c52e35c9df7286544c96081227114fcf72" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/ARCHITECTURE.md", + "refactor": { + "source_path": "docs/ARCHITECTURE.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "00c0338778b4b5520a505313239968a7c0a3f729", + "mode": "100644", + "size_bytes": 7911, + "sha256": "8fca94524b24c2b214a48c6cf7f0df0f587b5bdabc6e7e8d1c7f01b1695dc172" + }, + "working_tree": { + "exists": true, + "size_bytes": 8010, + "sha256": "07de803c3f424dddec2053113d80fa6f09b10187c305a60cf6c0f953a6bf5b1e" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/CODINGSTYLE.md", + "refactor": { + "source_path": "docs/CODINGSTYLE.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e3549fb01a2f0ab1e2dda483f16814043b3f554e", + "mode": "100644", + "size_bytes": 13123, + "sha256": "1b48ecdeff571e2a053818088e75d485df78a5552f13af9872c2894c33def44f" + }, + "working_tree": { + "exists": true, + "size_bytes": 13381, + "sha256": "ea61d54ec3c60a4c8c0a218a09632a7a18338d0d4f049933d0a152236a7cdea7" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/PRD.md", + "refactor": { + "source_path": "docs/PRD.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9c18f64086d59557365dbd58ea52610730a9883c", + "mode": "100644", + "size_bytes": 12422, + "sha256": "03af592150995a05efb4a5ef40f467985ae9a6193726c2ed6a84d81d4c9966ba" + }, + "working_tree": { + "exists": true, + "size_bytes": 12573, + "sha256": "08f251586443d932b353380aa8abd3ae3c7c95ca9d94b42a807cb24e90297c36" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/README.md", + "fesa_dev": { + "source_path": "docs/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "378ff6f7b5c4291bc08ee9aabc3d85aa8f91063d", + "mode": "100644", + "size_bytes": 1054, + "sha256": "46be6f60e0ba1f139658c5ef7673f7e5cc7222b1139c5a1fb428e990b5ff1742" + }, + "working_tree": { + "exists": true, + "size_bytes": 1069, + "sha256": "a9faa7423260c2b2f6b6e711482d7b13d0088a662d69807936c98db20c442c79" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1069, + "sha256": "a9faa7423260c2b2f6b6e711482d7b13d0088a662d69807936c98db20c442c79" + } + }, + { + "target_path": "docs/TOLERANCE.md", + "refactor": { + "source_path": "docs/TOLERANCE.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "139c9849f65cd9008ff248277daf1092756c208d", + "mode": "100644", + "size_bytes": 8091, + "sha256": "2a1ce81505879f71ca2595f01b8c3f06bfab2f436dc124349d782fe244aee8d8" + }, + "working_tree": { + "exists": true, + "size_bytes": 8290, + "sha256": "dc860a3baa7080f48c2b05932c0b48b328cb4b2d2b96a5dfaf60443603140df8" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/business-rules.md", + "refactor": { + "source_path": "docs/business-rules.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0cdfc3834afc473c4e716bcc8307eb8b62455649", + "mode": "100644", + "size_bytes": 3473, + "sha256": "73c9d5f3f6a4c06fba384124b5351b9fddc08dc72a02d411265278c89dcafb59" + }, + "working_tree": { + "exists": true, + "size_bytes": 3518, + "sha256": "31cbfea6afb44415e05225ae7b0e5d7a4d0e5ccf49c7bab6956d1a6bf892c931" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/calculation-performance/README.md", + "fesa_dev": { + "source_path": "docs/calculation-performance/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "48316a6e58e59203b27202c89ca7fca5fac59c54", + "mode": "100644", + "size_bytes": 6895, + "sha256": "96090d366f606a37241078fed049f9cec0a769db0b93a35c5f390b0fd44f0c6b" + }, + "working_tree": { + "exists": true, + "size_bytes": 6932, + "sha256": "e76eb775421726eea281b88ee1421254a08b01b9f507e43868b5e28059d9af43" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6932, + "sha256": "e76eb775421726eea281b88ee1421254a08b01b9f507e43868b5e28059d9af43" + } + }, + { + "target_path": "docs/contracts.md", + "refactor": { + "source_path": "docs/contracts.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ed5a19d937fd92ed4641a2795e71844b91a76982", + "mode": "100644", + "size_bytes": 5926, + "sha256": "0153f620fd1de33f349161b228f7c828b5fb162dbf4cf05b2089140ce1086093" + }, + "working_tree": { + "exists": true, + "size_bytes": 6013, + "sha256": "8450c5c69d41b903499f8b78041a30f85b6ca4fd21fc1c472f9e1072c8868f42" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/cpp-object-oriented-modular-refactoring/README.md", + "fesa_dev": { + "source_path": "docs/cpp-object-oriented-modular-refactoring/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "391db7b6a6c1b5a23f713556679fa9ed193ae25e", + "mode": "100644", + "size_bytes": 4362, + "sha256": "394efab90b196589422e7092bd8f47f3b6882c995ad1b1e12862d4bee1ce4726" + }, + "working_tree": { + "exists": true, + "size_bytes": 4388, + "sha256": "a678e0640d87d552019e5fb6c573691b041bc5452c242928ed84727867b9510f" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4388, + "sha256": "a678e0640d87d552019e5fb6c573691b041bc5452c242928ed84727867b9510f" + } + }, + { + "target_path": "docs/development-history.md", + "refactor": { + "source_path": "docs/development-history.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "27740b8f9bc1f8e9d8407aa13ac71d38a7f454b1", + "mode": "100644", + "size_bytes": 3033, + "sha256": "1410ffeec783b35f435cbacabbcffcfad93722fe108d57adbb5e688e0ff68c1f" + }, + "working_tree": { + "exists": true, + "size_bytes": 3071, + "sha256": "c8b35c8d490ac799be44cda3e4de49720619bff2601b252150ff1b6809157534" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/engineering-notes.md", + "refactor": { + "source_path": "docs/engineering-notes.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f7b13a15d6ad92287c7daf2654008c5d50dd687c", + "mode": "100644", + "size_bytes": 5900, + "sha256": "6883f6032eeeac0b0f090265a3beb6a78e027904d275ef8af514c2ac1a64b17c" + }, + "working_tree": { + "exists": true, + "size_bytes": 5982, + "sha256": "17c4d4d8b1aeefefd7ecbfbd7c466b20be99c4108266bf8208de7c301619f195" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/hex8-structural-analysis/README.md", + "fesa_dev": { + "source_path": "docs/hex8-structural-analysis/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "21c91061690ac352a9aece1279a6d99aa725b2c8", + "mode": "100644", + "size_bytes": 9583, + "sha256": "e5825c59260f584c0fab4c3ca6e76a49cca5cc4b77ab1b0f110aff60fbf46b68" + }, + "working_tree": { + "exists": true, + "size_bytes": 9705, + "sha256": "b0b0a78ff13b99b8d0e150ff08f6b8a599f0379f82937ba8afbc6e10600ab4df" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9705, + "sha256": "b0b0a78ff13b99b8d0e150ff08f6b8a599f0379f82937ba8afbc6e10600ab4df" + } + }, + { + "target_path": "docs/hex8-structural-analysis/formulation.md", + "fesa_dev": { + "source_path": "docs/hex8-structural-analysis/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f3748a61e0cfd2a10db1526de42520479d6407c6", + "mode": "100644", + "size_bytes": 18070, + "sha256": "ec7afff5b0094999bb4bfea6fc7d5a8133749741e52201934e6f00871ab7e2c3" + }, + "working_tree": { + "exists": true, + "size_bytes": 18360, + "sha256": "df2a63d30953e0a8cc1a74d546a08f97a3d0db2cbffa9b4c4f5b45df04acc7a1" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18360, + "sha256": "df2a63d30953e0a8cc1a74d546a08f97a3d0db2cbffa9b4c4f5b45df04acc7a1" + } + }, + { + "target_path": "docs/hex8-structural-analysis/io.md", + "refactor": { + "source_path": "docs/hex8-structural-analysis/io.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "02496a37e2dfbf4abad1e945bdb5b68521d1e0fa", + "mode": "100644", + "size_bytes": 12577, + "sha256": "53c641e660a8296db7110c139fcc0a23d750b5a40f71cc689c8e1f0abc63483b" + }, + "working_tree": { + "exists": true, + "size_bytes": 12734, + "sha256": "c6f85b1a9148ee87438a33bc38ec30d4b93b6ddfb7806621365bda5cb6fa426b" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/hex8-structural-analysis/precision-formulation.md", + "fesa_dev": { + "source_path": "docs/hex8-structural-analysis/precision-formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ac1ab9e26680d71f2348201c68b5be7807c97f04", + "mode": "100644", + "size_bytes": 22297, + "sha256": "3bec80c1b904ce99e70e4497f25559f8972ba78f07ffbbb19976f7e5efab466d" + }, + "working_tree": { + "exists": true, + "size_bytes": 22615, + "sha256": "8466afc26e51e0a9ba479302c8c18fbe208d93534ce925db4b9ae1ded0acb810" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 22615, + "sha256": "8466afc26e51e0a9ba479302c8c18fbe208d93534ce925db4b9ae1ded0acb810" + } + }, + { + "target_path": "docs/hex8-structural-analysis/reference-model.md", + "refactor": { + "source_path": "docs/hex8-structural-analysis/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "27ed3d07f358571a0d3b5f17b9319adc1d6afeb1", + "mode": "100644", + "size_bytes": 7740, + "sha256": "8e55b525dafbe477ddc655c3103798c983f09ecddd55af665d2792af20531833" + }, + "working_tree": { + "exists": true, + "size_bytes": 7837, + "sha256": "c5f7c453037dc5249649f694154e3c079ca5238524e3458f13bfc2ef22650fb3" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/hht-implicit-dynamics/README.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "16fd28e99fe4c4dee67a3e8a11c91cafe4ac3b22", + "mode": "100644", + "size_bytes": 10346, + "sha256": "7de4838a04388ac6127d592c618966ac66b9a8c66f69f6e91ac0e4d275477fab" + }, + "working_tree": { + "exists": true, + "size_bytes": 10474, + "sha256": "374db46e416c488e5c2ef586ac5b86ac48d24ac831189bad496fd3d62a348ddf" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10474, + "sha256": "374db46e416c488e5c2ef586ac5b86ac48d24ac831189bad496fd3d62a348ddf" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-acceleration-recovery.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-acceleration-recovery.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a1f6094ad7cdc4b6905c6b8acc4e2629ee92cdaa", + "mode": "100644", + "size_bytes": 16824, + "sha256": "692eb997353f0306efea067d6df0ac9ae9415a3783e589ecb329e0ea6b865b99" + }, + "working_tree": { + "exists": true, + "size_bytes": 16968, + "sha256": "ed3928d5eabf595cbf7bf1d332b9c735014ad75fd6f292ae65f7cd60ada99cd4" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 16968, + "sha256": "ed3928d5eabf595cbf7bf1d332b9c735014ad75fd6f292ae65f7cd60ada99cd4" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-c08b-newton-research-20261012.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-c08b-newton-research-20261012.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "76a7120272e443377a8e7b208d8675a2ffd4eebd", + "mode": "100644", + "size_bytes": 11333, + "sha256": "82f41d7354b5b51872072eaad2263976062b29feaac08e194892e62db5e5abc1" + }, + "working_tree": { + "exists": true, + "size_bytes": 11451, + "sha256": "d368ef7aed1d84a228dabec1769a8fef7766298674ab96821df43e8815422d45" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11451, + "sha256": "d368ef7aed1d84a228dabec1769a8fef7766298674ab96821df43e8815422d45" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-carried-a-noise.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-carried-a-noise.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a9c755d52562984c488ae9d7d8959298a811a37e", + "mode": "100644", + "size_bytes": 7940, + "sha256": "abb0cb82ab04f924672b60cd0a7a7b4d4566e3bfce1169ae90c6f9400212d296" + }, + "working_tree": { + "exists": true, + "size_bytes": 8028, + "sha256": "9d806f0dfbb28aba7201b1525d4e826c012ba866f9d39556b4866eac99773686" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8028, + "sha256": "9d806f0dfbb28aba7201b1525d4e826c012ba866f9d39556b4866eac99773686" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-dae-research-20261012.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-dae-research-20261012.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "54a138b4aa4a1e51187a9d5984db604a96f4d912", + "mode": "100644", + "size_bytes": 17753, + "sha256": "5af22e867e95ab72f871487fca80da88049537c5cebafdff49565963f375a7ac" + }, + "working_tree": { + "exists": true, + "size_bytes": 17953, + "sha256": "f751f360259f71ba4940ddb02d88fba0b9ef679fcd4c6245329cd27a2af322f4" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 17953, + "sha256": "f751f360259f71ba4940ddb02d88fba0b9ef679fcd4c6245329cd27a2af322f4" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-fixed-null-basis.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-fixed-null-basis.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d85070547670eea04f8f5e4b72bfd85fd03c5a57", + "mode": "100644", + "size_bytes": 29903, + "sha256": "5d3cdc0ffe5c9fc4f93e52ecbb6a4e5192c3fc3346df7d9ba7855d2bc06291bf" + }, + "working_tree": { + "exists": true, + "size_bytes": 30408, + "sha256": "6c0624ce0a87018cc2c8e2565ca13bec7b79c7d06f5cb7c2ddd7f9eb2ef421f6" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 30408, + "sha256": "6c0624ce0a87018cc2c8e2565ca13bec7b79c7d06f5cb7c2ddd7f9eb2ef421f6" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-graph-certificate-draft-20261012.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-graph-certificate-draft-20261012.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "09a6af8a31ed9a4ef60d7355471bed9ab42233ec", + "mode": "100644", + "size_bytes": 2462, + "sha256": "41920061ed3758ab71d7bad4c8ce31db68858a2c32075d8533d5e9467e88f20c" + }, + "working_tree": { + "exists": true, + "size_bytes": 2526, + "sha256": "3e5ac500c187c4440dc52a403add3222ed04bf0296f480fd19902aef9b382760" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2526, + "sha256": "3e5ac500c187c4440dc52a403add3222ed04bf0296f480fd19902aef9b382760" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-historical-docs-cleanup-20261004.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-historical-docs-cleanup-20261004.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0daecf262a88df212326798a8da83bc8681a5897", + "mode": "100644", + "size_bytes": 16835, + "sha256": "765e8e1b5ede0640b5ef216e373ba12562937a9d0ea89fb4f35fff02c641ace4" + }, + "working_tree": { + "exists": true, + "size_bytes": 17050, + "sha256": "966e654acf2cd465c7c5470f4180cf7d513299e363f8a074e485812a3160de89" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 17050, + "sha256": "966e654acf2cd465c7c5470f4180cf7d513299e363f8a074e485812a3160de89" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-inertia-historical-docs-cleanup-20261004.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-inertia-historical-docs-cleanup-20261004.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "14dbedabd63c72dc5fa448b55344361c48f13efa", + "mode": "100644", + "size_bytes": 15361, + "sha256": "ae7685001eb08210668624d49747930605e6bb89f08e166c4c979b5fb4c0a002" + }, + "working_tree": { + "exists": true, + "size_bytes": 15570, + "sha256": "051dc915fbe3b05319de83baa3d77443e2f2f8640a146f3cdaed32e5f1e63bd7" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 15570, + "sha256": "051dc915fbe3b05319de83baa3d77443e2f2f8640a146f3cdaed32e5f1e63bd7" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-inertia.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-inertia.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fc7c170799c6f1b7d459665fbd93522bd4eb7efe", + "mode": "100644", + "size_bytes": 16212, + "sha256": "4b06cdecae0938bc2b6f3c5e7c18dcf8f8c182f9e535801881bc0b802f18e5cd" + }, + "working_tree": { + "exists": true, + "size_bytes": 16443, + "sha256": "64fe15324298bc5dd75d2d3a7c3ff12dad8bf4160f5fca2b307e6f74af05976d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 16443, + "sha256": "64fe15324298bc5dd75d2d3a7c3ff12dad8bf4160f5fca2b307e6f74af05976d" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-momentum-research-20261012.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-momentum-research-20261012.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "20554a3c498c3e4650fe364a1e419d8c8dcfa13f", + "mode": "100644", + "size_bytes": 6154, + "sha256": "c63b88717c56c5445dee5eeb36072872552535ee0808cde3f9d6dfc5c48d3fe9" + }, + "working_tree": { + "exists": true, + "size_bytes": 6233, + "sha256": "6a4d26d6ff7289eaed166f2bab3ed37abb6bad2a5cbb2435d47968121985970b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6233, + "sha256": "6a4d26d6ff7289eaed166f2bab3ed37abb6bad2a5cbb2435d47968121985970b" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation-reduced-coordinate.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation-reduced-coordinate.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f8ce34059f9f7cf3f10ac52b7d94260db5e23954", + "mode": "100644", + "size_bytes": 21064, + "sha256": "7209fde941f720eb68fbfdfae7b53b33522a8400bad5cfa54f577f293c2817ec" + }, + "working_tree": { + "exists": true, + "size_bytes": 21334, + "sha256": "1400381648837fc2cd4b5207fa6f2378f12d52acefa44cddd0c5290372f2a5b2" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 21334, + "sha256": "1400381648837fc2cd4b5207fa6f2378f12d52acefa44cddd0c5290372f2a5b2" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/formulation.md", + "fesa_dev": { + "source_path": "docs/hht-implicit-dynamics/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "58036766ae38c6c5db2762aac342d4607f03aa82", + "mode": "100644", + "size_bytes": 17406, + "sha256": "0c36da6b9809e66b77d1ff341a4303957981b9923b98019969c0387cb7177371" + }, + "working_tree": { + "exists": true, + "size_bytes": 17623, + "sha256": "d994de4b6d73b585a5f2aa13f9d159839cf5d4d0d5233083f56e8bf5a9e1f521" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 17623, + "sha256": "d994de4b6d73b585a5f2aa13f9d159839cf5d4d0d5233083f56e8bf5a9e1f521" + } + }, + { + "target_path": "docs/hht-implicit-dynamics/reference-model.md", + "refactor": { + "source_path": "docs/hht-implicit-dynamics/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b9042ba80495686ba1f946a6b38df88e9ebafcdc", + "mode": "100644", + "size_bytes": 8295, + "sha256": "34896e8c15c84f0f365601cd49f30fd24e511bcf1ef6d7aeb52f037dc0aec102" + }, + "working_tree": { + "exists": true, + "size_bytes": 8369, + "sha256": "d3b4a0bd4be42d2c754ebce93326ca57a4fa804092600f6a3a85a5b64ac5fea7" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/linear-static-3d-euler-beam/README.md", + "fesa_dev": { + "source_path": "docs/linear-static-3d-euler-beam/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "adf277e2859f7cc27ed1c8803e7b7633596e6eb3", + "mode": "100644", + "size_bytes": 4676, + "sha256": "45a675372de84c9d245ec4b9c6acf30b5fdf8c4ef9e71b5c2de92d1997f94e9b" + }, + "working_tree": { + "exists": true, + "size_bytes": 4744, + "sha256": "8ac6aaf7231805659a93dd200e3f87669a21e75313edb043d0b8dc7d18fdcdfd" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4744, + "sha256": "8ac6aaf7231805659a93dd200e3f87669a21e75313edb043d0b8dc7d18fdcdfd" + } + }, + { + "target_path": "docs/linear-static-3d-euler-beam/formulation.md", + "fesa_dev": { + "source_path": "docs/linear-static-3d-euler-beam/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6e64706e07a33f1e48daaf50072a23b82b0a9d4f", + "mode": "100644", + "size_bytes": 46756, + "sha256": "4909f0386d5dd6d5401929ceba720c66ac5f526016b505e01f325949cb159dab" + }, + "working_tree": { + "exists": true, + "size_bytes": 48424, + "sha256": "5f299d501387bd19fb8484c58fab71cbb2867c5049a8eba6f064100c31cb5f26" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 48424, + "sha256": "5f299d501387bd19fb8484c58fab71cbb2867c5049a8eba6f064100c31cb5f26" + } + }, + { + "target_path": "docs/linear-static-3d-euler-beam/io.md", + "refactor": { + "source_path": "docs/linear-static-3d-euler-beam/io.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bdb7e27e336b719e0d5c502e132888d99fc2b76e", + "mode": "100644", + "size_bytes": 32145, + "sha256": "6f5c896f37d8e2de2381e2643be62f8934f74407d0bb50be619c8851b438a94e" + }, + "working_tree": { + "exists": true, + "size_bytes": 32619, + "sha256": "1be6a23fc2030f13a7501c535101ab5e1dd87137b602ff416b1f8fc0a6eea0a6" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/linear-static-3d-euler-beam/reference-model.md", + "refactor": { + "source_path": "docs/linear-static-3d-euler-beam/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "17ab58edaf9a73f7cd37ee845b3ec045a9424a8f", + "mode": "100644", + "size_bytes": 30858, + "sha256": "f598ba53a3e412c36eec8e57237436071d926ac3f1be7ccf81f035540de3332e" + }, + "working_tree": { + "exists": true, + "size_bytes": 31238, + "sha256": "6065a6bcf33c9de36de79566e81df162f3a211a2c010987a7c9b358cca871170" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/linear-static-mitc4-shell/README.md", + "fesa_dev": { + "source_path": "docs/linear-static-mitc4-shell/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3ffc9671cc2d16b00243d008ca4f7c8be2ce849c", + "mode": "100644", + "size_bytes": 4994, + "sha256": "ef65cfb5a93e0cd1f7b85533c9a17e906d6638902482c2ed61863644cb5b2094" + }, + "working_tree": { + "exists": true, + "size_bytes": 5064, + "sha256": "381134f552b6182322cc719ffdd6bea4f8ee94700f3f620cbf7471a4f2c7bfba" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5064, + "sha256": "381134f552b6182322cc719ffdd6bea4f8ee94700f3f620cbf7471a4f2c7bfba" + } + }, + { + "target_path": "docs/linear-static-mitc4-shell/formulation.md", + "fesa_dev": { + "source_path": "docs/linear-static-mitc4-shell/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a5bf629ed14a16b2820579af8138bd31742a0f0f", + "mode": "100644", + "size_bytes": 57979, + "sha256": "df2c7726c3ddd8db82f04984140ad909732296e4c806b1a04c68e9fba374696c" + }, + "working_tree": { + "exists": true, + "size_bytes": 59695, + "sha256": "5ed42f7ad55b73060ba4b900a9e2d6ed2d0e7781e735239890e1863208944d29" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 59695, + "sha256": "5ed42f7ad55b73060ba4b900a9e2d6ed2d0e7781e735239890e1863208944d29" + } + }, + { + "target_path": "docs/linear-static-mitc4-shell/io.md", + "refactor": { + "source_path": "docs/linear-static-mitc4-shell/io.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a77977b1a1a0c890704a29a2981bcdda2b832284", + "mode": "100644", + "size_bytes": 41543, + "sha256": "5ad23a0814f99f025b6e2406c0355a49e5cf65f77bae15fdeeb2777cc3b4dd56" + }, + "working_tree": { + "exists": true, + "size_bytes": 42215, + "sha256": "1325a4e7d3155944960e15978248181682a470f49d2ace4bf659273bb4d16f7a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/linear-static-mitc4-shell/reference-model.md", + "refactor": { + "source_path": "docs/linear-static-mitc4-shell/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2008929f857a44e9ffa80b4fd99394e35323c937", + "mode": "100644", + "size_bytes": 6512, + "sha256": "cb11f7fb9c70fb2b01ed5b19c66f0f949a1c73ab50f099d171241d9dbe117334" + }, + "working_tree": { + "exists": true, + "size_bytes": 6640, + "sha256": "8b94fe9a57040c175108a5984c13b994b8cc6b0abd4f9cbe8d8b04be76ba3c49" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/mitc4-shell-feast-eigen/README.md", + "fesa_dev": { + "source_path": "docs/mitc4-shell-feast-eigen/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "18efcbdc83ad92655e3162aea884a157c7ab736b", + "mode": "100644", + "size_bytes": 4737, + "sha256": "cb6b4ba9dce68b5b4394d5e40a7864b049d0293bf5c3b2190421cb59677f277e" + }, + "working_tree": { + "exists": true, + "size_bytes": 4799, + "sha256": "c38b8def0d14ab23545f06bc99bbf087c95ad66ea4c102a51a86358f1972dd9f" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4799, + "sha256": "c38b8def0d14ab23545f06bc99bbf087c95ad66ea4c102a51a86358f1972dd9f" + } + }, + { + "target_path": "docs/mitc4-shell-feast-eigen/formulation.md", + "fesa_dev": { + "source_path": "docs/mitc4-shell-feast-eigen/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "679d38f033e47cfad00fd51f27cf2fb5c1ab8446", + "mode": "100644", + "size_bytes": 76323, + "sha256": "b7340b6b6bda7f95378d3fc37bb45a66de8e261dc93252d13be9673b3f2e960b" + }, + "working_tree": { + "exists": true, + "size_bytes": 77496, + "sha256": "0134df1a5dab68606a03847beb4c9f2c241534ff4986e258b8d08a3af4785fd0" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 77496, + "sha256": "0134df1a5dab68606a03847beb4c9f2c241534ff4986e258b8d08a3af4785fd0" + } + }, + { + "target_path": "docs/mitc4-shell-feast-eigen/io.md", + "refactor": { + "source_path": "docs/mitc4-shell-feast-eigen/io.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0f5ddee09370021a29c5093291630db3a85ce5a5", + "mode": "100644", + "size_bytes": 62447, + "sha256": "0beff7da0b8a8a2594965a1611ebd480d51b1eee546498bef7973690e131cad2" + }, + "working_tree": { + "exists": true, + "size_bytes": 63190, + "sha256": "383641a8b757859a277eb40d5b43c99223295fec57b102a8a7a34dce040f5e7f" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/mitc4-shell-feast-eigen/reference-model.md", + "refactor": { + "source_path": "docs/mitc4-shell-feast-eigen/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "50e904a96fbaef3edca21f2b751959333884256e", + "mode": "100644", + "size_bytes": 8924, + "sha256": "f865af73b4ccb21821b66ab60b625380b25552cbe4db99ae44b616f8f611eec4" + }, + "working_tree": { + "exists": true, + "size_bytes": 9051, + "sha256": "17d5b834f92e8c5da634a0ed11ed084df5dc4e1364ad748db73340d11d95167e" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/mitc4-shell-feast-eigen2/README.md", + "fesa_dev": { + "source_path": "docs/mitc4-shell-feast-eigen2/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d56b8aa800c1e47255bffd065cee5914121fe5ec", + "mode": "100644", + "size_bytes": 5920, + "sha256": "275b7deb425de4e386f0d11879512a065743413798e6793d3388ed182ac1e66d" + }, + "working_tree": { + "exists": true, + "size_bytes": 5998, + "sha256": "77c54e58643bb4e37f15f96114c0957ce6ad306eeaaa908d46dae026a2bc1e1a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5998, + "sha256": "77c54e58643bb4e37f15f96114c0957ce6ad306eeaaa908d46dae026a2bc1e1a" + } + }, + { + "target_path": "docs/mitc4-shell-feast-eigen2/formulation-eigen.md", + "fesa_dev": { + "source_path": "docs/mitc4-shell-feast-eigen2/formulation-eigen.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "20dff587e6024fa9a6a118445c24178e53a09a45", + "mode": "100644", + "size_bytes": 13134, + "sha256": "2895f720140d9fea7589a1e638d2f6175a15767cae7d3118f41b46e201eb9e76" + }, + "working_tree": { + "exists": true, + "size_bytes": 13335, + "sha256": "e31943136c0a8289b195fb9d6d01dc340cbe4ac5c6dfa730df682524cc45f95d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13335, + "sha256": "e31943136c0a8289b195fb9d6d01dc340cbe4ac5c6dfa730df682524cc45f95d" + } + }, + { + "target_path": "docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md", + "fesa_dev": { + "source_path": "docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "127541dcf8f1145ce2b6433f0779a8572debd347", + "mode": "100644", + "size_bytes": 9421, + "sha256": "b942145fa1bb5531a04dc376a0b129906906f76a5c766fd69f4569a828f48d51" + }, + "working_tree": { + "exists": true, + "size_bytes": 9593, + "sha256": "677306fc7e369ce61e695b3868fd58fb68caa94fcdf98eb42eb2fae0b224a12e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9593, + "sha256": "677306fc7e369ce61e695b3868fd58fb68caa94fcdf98eb42eb2fae0b224a12e" + } + }, + { + "target_path": "docs/mitc4-shell-feast-eigen2/formulation.md", + "fesa_dev": { + "source_path": "docs/mitc4-shell-feast-eigen2/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f4dfab5a03446738205d0e5f8a84cff17c57aa4e", + "mode": "100644", + "size_bytes": 5435, + "sha256": "529a7d9883fa402b616e826e0ef26199142486314d12bcc04d9d4f98223ee476" + }, + "working_tree": { + "exists": true, + "size_bytes": 5500, + "sha256": "94887d049bf44973485df31fda63b340f017953036e546ab894f015813543fbe" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5500, + "sha256": "94887d049bf44973485df31fda63b340f017953036e546ab894f015813543fbe" + } + }, + { + "target_path": "docs/mitc4-shell-feast-eigen2/io.md", + "refactor": { + "source_path": "docs/mitc4-shell-feast-eigen2/io.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6431d5215817968f89e30115faacec28aedc1233", + "mode": "100644", + "size_bytes": 47013, + "sha256": "4c47300ca7c1221796d1a7ad9ec5331c006f3f6c85dfedd490de3a3545a9565d" + }, + "working_tree": { + "exists": true, + "size_bytes": 47598, + "sha256": "d5ff446f977aa63c93306db58d39d43be11bba390ed89b4281e08c98f7fdf382" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/mitc4-shell-feast-eigen2/reference-model.md", + "refactor": { + "source_path": "docs/mitc4-shell-feast-eigen2/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a3b451f856bff1ac4823ebf2850d891e70ba43f2", + "mode": "100644", + "size_bytes": 6425, + "sha256": "337a35a2496dc3f29fd8c135c397953da4a7a6b62b7a904029b5686938c75b39" + }, + "working_tree": { + "exists": true, + "size_bytes": 6513, + "sha256": "d4a6b105117c56252e06a04e31f87883b4e8b32a2fa768d0e81c1c2f750f8cf9" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/nonlinear-static-newton-raphson/README.md", + "fesa_dev": { + "source_path": "docs/nonlinear-static-newton-raphson/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4ee0a56d398be60c37a5b53c561124af974d8199", + "mode": "100644", + "size_bytes": 5230, + "sha256": "fdb28ac0142052f4a86dba9fc938d233a67442a66cc3f78030f2f7609b8ad795" + }, + "working_tree": { + "exists": true, + "size_bytes": 5302, + "sha256": "8d42136c6a2fbcf6acd590b60435cb03fa5d417326e0af3cecb30bdb5017c127" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5302, + "sha256": "8d42136c6a2fbcf6acd590b60435cb03fa5d417326e0af3cecb30bdb5017c127" + } + }, + { + "target_path": "docs/nonlinear-static-newton-raphson/formulation.md", + "fesa_dev": { + "source_path": "docs/nonlinear-static-newton-raphson/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7d376b38165a01ce9e91fe044c801e68811761c2", + "mode": "100644", + "size_bytes": 61597, + "sha256": "d5ef7c6c58909c4d1c4807e2812311e708f722f20feecb68fe76cf9b5d31dfc6" + }, + "working_tree": { + "exists": true, + "size_bytes": 63473, + "sha256": "017b294dd017169bc94a2a5cf6edeb72484104a5fc8fa88612b1d5dc94ad4980" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 63473, + "sha256": "017b294dd017169bc94a2a5cf6edeb72484104a5fc8fa88612b1d5dc94ad4980" + } + }, + { + "target_path": "docs/nonlinear-static-newton-raphson/io.md", + "refactor": { + "source_path": "docs/nonlinear-static-newton-raphson/io.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bb6930c5f7255be6be9069211e2db01a5afc058b", + "mode": "100644", + "size_bytes": 76785, + "sha256": "53afbb1df27fbd9ce6c2e23ee34480882241a859d3fc1993e82db61acc6637eb" + }, + "working_tree": { + "exists": true, + "size_bytes": 77705, + "sha256": "59584520d3e1be254bbbdd1cfbdfa03867e75777fb71b56762e55d137515a3aa" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/nonlinear-static-newton-raphson/reference-model.md", + "refactor": { + "source_path": "docs/nonlinear-static-newton-raphson/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "dd4cf4b88c2c02c6e8e625283d9f2b50ac31c235", + "mode": "100644", + "size_bytes": 25284, + "sha256": "d79aa3663d4639ce1827f4b3a5bdc130dc2f3153739d798a8769353986c750c5" + }, + "working_tree": { + "exists": true, + "size_bytes": 25630, + "sha256": "80dd945dd0c4dce4444f707cc1cbc370ce05dceca0c7857d28601159800cd083" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/operations.md", + "refactor": { + "source_path": "docs/operations.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "19ab815cb546d87703d9033a767d1ecf21c5d0fa", + "mode": "100644", + "size_bytes": 10215, + "sha256": "9da53b893ae2e2ee583dddaabf26dbbf48cf253fe5e21ce68e17ffc8ec3f658c" + }, + "working_tree": { + "exists": true, + "size_bytes": 10366, + "sha256": "965c6273c5b653a4f7647f90549a9fb0163be40621e9b8449cb2e9bdb82f922a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/security.md", + "refactor": { + "source_path": "docs/security.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8b948f1bac9f0a1490d3379c3e5164e0f029dc27", + "mode": "100644", + "size_bytes": 2554, + "sha256": "917e2e9cdeadf73ff63917bbae1b1a8265bbb52107c95380ee70785c796c1d8a" + }, + "working_tree": { + "exists": true, + "size_bytes": 2554, + "sha256": "917e2e9cdeadf73ff63917bbae1b1a8265bbb52107c95380ee70785c796c1d8a" + }, + "working_tree_equals_blob": true + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/shell-surface-pressure-load/README.md", + "fesa_dev": { + "source_path": "docs/shell-surface-pressure-load/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6f12a0d240d630a0029c86d4d2a8aef504b593bf", + "mode": "100644", + "size_bytes": 4709, + "sha256": "da7d8ccb429d173ef8385d072171ec15d590faa51ae2433d47545d2f665a8bae" + }, + "working_tree": { + "exists": true, + "size_bytes": 4786, + "sha256": "b6ac40448045392c4c884eeb761c6a1c72a1e81084616d5d23f4ba1f5b75408d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4786, + "sha256": "b6ac40448045392c4c884eeb761c6a1c72a1e81084616d5d23f4ba1f5b75408d" + } + }, + { + "target_path": "docs/shell-surface-pressure-load/formulation.md", + "fesa_dev": { + "source_path": "docs/shell-surface-pressure-load/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bfac1b886b8f86c3f8d7571a9812ae06030467b9", + "mode": "100644", + "size_bytes": 34987, + "sha256": "857462dd5e1d23956838847ce320c3fd35f57fe52ea6189f780ce39b129e1259" + }, + "working_tree": { + "exists": true, + "size_bytes": 35736, + "sha256": "6c9e9bb24512e1ab95b02e316b3ff450f1094dfdd02a9cb78ea10b2212bc71d4" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 35736, + "sha256": "6c9e9bb24512e1ab95b02e316b3ff450f1094dfdd02a9cb78ea10b2212bc71d4" + } + }, + { + "target_path": "docs/shell-surface-pressure-load/io.md", + "refactor": { + "source_path": "docs/shell-surface-pressure-load/io.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c551ecc7cafa0115a78940951c0b922821cb080e", + "mode": "100644", + "size_bytes": 48097, + "sha256": "51e3b2b118a366494c6ee766664e76aa47192a5704657211329c9df81efe1881" + }, + "working_tree": { + "exists": true, + "size_bytes": 48736, + "sha256": "8101f067f3bd3fe01f086cec98ce2741b1603ab8264e32df66cad5a40387044e" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/shell-surface-pressure-load/reference-model.md", + "refactor": { + "source_path": "docs/shell-surface-pressure-load/reference-model.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a8b27f0823ed9cb8b00d8e1233cd25f148ff5f66", + "mode": "100644", + "size_bytes": 10796, + "sha256": "4bbf50707861b67cb21662daca65baa4970038db1166e0fe21a6efe46ef6aeeb" + }, + "working_tree": { + "exists": true, + "size_bytes": 10981, + "sha256": "88d4012c601f1262c6196581af729830275a8794d54bf79f837d52bbb309427b" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/shell-transient-heat-transfer/README.md", + "fesa_dev": { + "source_path": "docs/shell-transient-heat-transfer/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e297cf1802cae70206a1892118cd5bdcc6914b55", + "mode": "100644", + "size_bytes": 10185, + "sha256": "dc0e7bba3f58f33a191879b9e244c07498126d57adb61f41266e5f9c1fbebb2c" + }, + "working_tree": { + "exists": true, + "size_bytes": 10318, + "sha256": "a72664571702f4fa5e782b552f163978f0844ec96b101c7b683c5b2b78a9e8f0" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10318, + "sha256": "a72664571702f4fa5e782b552f163978f0844ec96b101c7b683c5b2b78a9e8f0" + } + }, + { + "target_path": "docs/shell-transient-heat-transfer/formulation.md", + "fesa_dev": { + "source_path": "docs/shell-transient-heat-transfer/formulation.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2d5b39789ffbfaeb7f2691e0d4a34b036bfeba33", + "mode": "100644", + "size_bytes": 40593, + "sha256": "45ef830ad8c56edf70c324fc69e81d51b21fbf24334856fdea1719955fce98ce" + }, + "working_tree": { + "exists": true, + "size_bytes": 41236, + "sha256": "ab33b0e535687f30a2a6af9185376e634ebde3cab7475022aea1685be2c7c002" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 41236, + "sha256": "ab33b0e535687f30a2a6af9185376e634ebde3cab7475022aea1685be2c7c002" + } + }, + { + "target_path": "docs/shell-transient-heat-transfer/reference-comparison-conflict.md", + "refactor": { + "source_path": "docs/shell-transient-heat-transfer/reference-comparison-conflict.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c7bfcddee724cf4af11563c44e9c6ec91370fe54", + "mode": "100644", + "size_bytes": 7662, + "sha256": "c643224559bd0003b1b5ddbb4146bcbde79e430d921093394675522474466b7e" + }, + "working_tree": { + "exists": true, + "size_bytes": 7775, + "sha256": "8f9ba50e17681a70675f6afe2681d2fcd82dc5c3f58dc67b5fed8d8972227358" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/solver-core/README.md", + "fesa_dev": { + "source_path": "docs/solver-core/README.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "eccb3b6ed5aa7a6aa8d00339812426e6cd10f66b", + "mode": "100644", + "size_bytes": 10215, + "sha256": "ca9d5a7a7f84e42c14f09af40e14cd836c0e9160d081c12e99107a8e88c12af6" + }, + "working_tree": { + "exists": true, + "size_bytes": 10286, + "sha256": "d4da6270ddfe49cc8db6d534e833d81ea2d86235fe46af09bd6bb61fe0fa47bf" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10286, + "sha256": "d4da6270ddfe49cc8db6d534e833d81ea2d86235fe46af09bd6bb61fe0fa47bf" + } + }, + { + "target_path": "docs/standards.md", + "refactor": { + "source_path": "docs/standards.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9504578f150c363cc164bfe401f138a68b8a5f93", + "mode": "100644", + "size_bytes": 3803, + "sha256": "4c5619d0282e88630b1317acf2633df5f6e2fdaaa8a2bbe83ddceed47ed9e135" + }, + "working_tree": { + "exists": true, + "size_bytes": 3854, + "sha256": "da6c44870faeb4fa9f83a7d8108e722af9cd810c56b4a0caab6906fadd7e047a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/baseline-execution.md", + "refactor": { + "source_path": "docs/tracking/baseline-execution.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a1a361797a60380b5cb4f318a5316e667b966c99", + "mode": "100644", + "size_bytes": 20750, + "sha256": "d2e89830c5c6aece1c9e49c3786a519c291277c00c79ab6416f2205e2660dc2f" + }, + "working_tree": { + "exists": true, + "size_bytes": 21012, + "sha256": "db8fee9457877fe38677c57fa88eec802764e277ba62055028177b3b36f6d91e" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/baseline-inventory.tsv", + "refactor": { + "source_path": "docs/tracking/baseline-inventory.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "69211a1c4007c771e9a9cab89462aeeaccebe19d", + "mode": "100644", + "size_bytes": 22662, + "sha256": "d0266d3f98f25188e9afbd4986a4f80809a39bd2f85a086c1acdad993397f13f" + }, + "working_tree": { + "exists": true, + "size_bytes": 22897, + "sha256": "65de4ace5c1ca635afbc13b57ae5072bdee934c9b5e781a49b5a6280fce05240" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/baseline-investigation.md", + "refactor": { + "source_path": "docs/tracking/baseline-investigation.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3bf4b0868eab48ea4bbbaa95e91e83c256468290", + "mode": "100644", + "size_bytes": 12722, + "sha256": "12960eaacc647aa202765e3a5dbf2f8816f87c5fbb6bc66571e89e7ec970bf2d" + }, + "working_tree": { + "exists": true, + "size_bytes": 12863, + "sha256": "e9d8c77956ed57516ffe2ce06193b79c194a53aae0d2f03084c47769d1b5cda9" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/baseline-static-tests.json", + "refactor": { + "source_path": "docs/tracking/baseline-static-tests.json", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f5ea2fe91086989d78c9160f108acbb2d61795e8", + "mode": "100644", + "size_bytes": 65667, + "sha256": "92bb4a9886516c5f04757401d2c6559c9d320c9973c03576ee6a94af906c3060" + }, + "working_tree": { + "exists": true, + "size_bytes": 66545, + "sha256": "e7ed7b7c9866b87ebb190b24554a201739e3943bf9c0db62a134dc2e8ccd0346" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/build-bootstrap.md", + "refactor": { + "source_path": "docs/tracking/build-bootstrap.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7795fc37ee0fa34d9c160608dda19e4b50ce1fbf", + "mode": "100644", + "size_bytes": 5852, + "sha256": "c5e7e8a3647dfdd4a4e6b8f15ec70389b9f4cca0908d76456598fea80abfb8d0" + }, + "working_tree": { + "exists": true, + "size_bytes": 5940, + "sha256": "89566a94d1f52823092c8bb9d8d12cb9d269ece178e65ae2352389c4cd71cd96" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/build-import-manifest.json", + "refactor": { + "source_path": "docs/tracking/build-import-manifest.json", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "71e0bd09d60367184c2a8b789b78f4c11157c958", + "mode": "100644", + "size_bytes": 29222, + "sha256": "5b061aa01b4026d40db281c87d79e6bb37dcb887d96e2092035b3f8bd7b39a30" + }, + "working_tree": { + "exists": true, + "size_bytes": 29960, + "sha256": "edf834cd60f2e62fc0266aa2a8ffc5271725aaa7490d718d26d7899e222b0189" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/decisions/0001-preserve-behavior.md", + "refactor": { + "source_path": "docs/tracking/decisions/0001-preserve-behavior.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "89d72ff4197a545a4b6ebf01af3d279fa4ab714a", + "mode": "100644", + "size_bytes": 1235, + "sha256": "5afb590d7677c8623089bb7568bee82e9784cd75c1793fdbdcb876fd1e0e8380" + }, + "working_tree": { + "exists": true, + "size_bytes": 1235, + "sha256": "5afb590d7677c8623089bb7568bee82e9784cd75c1793fdbdcb876fd1e0e8380" + }, + "working_tree_equals_blob": true + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/decisions/0002-selected-source-baseline.md", + "refactor": { + "source_path": "docs/tracking/decisions/0002-selected-source-baseline.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "43f68d0935b85ea069ea21c71074b886dba85902", + "mode": "100644", + "size_bytes": 1305, + "sha256": "39d769bcfd2d706163af75e30020165f8691c7aa805a78f5f6df24e1b4ea9c45" + }, + "working_tree": { + "exists": true, + "size_bytes": 1305, + "sha256": "39d769bcfd2d706163af75e30020165f8691c7aa805a78f5f6df24e1b4ea9c45" + }, + "working_tree_equals_blob": true + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/decisions/index.md", + "refactor": { + "source_path": "docs/tracking/decisions/index.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a4f6b085530f27721755b9d33ce47efc7125a915", + "mode": "100644", + "size_bytes": 546, + "sha256": "e164d1c0f4dc3197b074f8564c15e811b6a68cb38ef43dd2e18dd18f4225a6f0" + }, + "working_tree": { + "exists": true, + "size_bytes": 546, + "sha256": "e164d1c0f4dc3197b074f8564c15e811b6a68cb38ef43dd2e18dd18f4225a6f0" + }, + "working_tree_equals_blob": true + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/final-architecture-fix-all-files.tsv", + "refactor": { + "source_path": "docs/tracking/final-architecture-fix-all-files.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "65fc754768a5687ffe2bd19ba7846fd45cc68508", + "mode": "100644", + "size_bytes": 140551, + "sha256": "262c500d1423acca43596cefe3f646e9cf0f293930aa65256c2b76981129142d" + }, + "working_tree": { + "exists": true, + "size_bytes": 140847, + "sha256": "497f22d01c3d072e9e51a74d8d9e5d9855ad4a13bd9ad240f58cfaebebd3cb0b" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/final-architecture-fix-architecture.md", + "refactor": { + "source_path": "docs/tracking/final-architecture-fix-architecture.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "93f3d51472a4b399c08562ce8006fbc5fa382be4", + "mode": "100644", + "size_bytes": 5293, + "sha256": "ad98854b70ab18170fcf7b38308273c7dc3e7edc2f62e78c6e860744bb0ebaf8" + }, + "working_tree": { + "exists": true, + "size_bytes": 5353, + "sha256": "24f87015d4f2436fbc4a1009ec56425b6b263780c36b5b038875b083fb8b2419" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/final-architecture-fix-performance.tsv", + "refactor": { + "source_path": "docs/tracking/final-architecture-fix-performance.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2cf2dd9c7a3f9f4e6510fd926b131cd8044ce597", + "mode": "100644", + "size_bytes": 2745, + "sha256": "30348a7f17c43ed2e74ee067faa7e9cc310b6a4f44012b73b19501029526c26b" + }, + "working_tree": { + "exists": true, + "size_bytes": 2756, + "sha256": "48cfea0702d923101ab9542617fbb67b075746137c215dc0332f7e546fccaa2f" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/final-architecture-fix-verification.md", + "refactor": { + "source_path": "docs/tracking/final-architecture-fix-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f42f30431970054b02e3a5f5e4324a7ebd17172e", + "mode": "100644", + "size_bytes": 13823, + "sha256": "653ef2abc8cbb64021ccfe16f6db301419a7930ba71fda350e862a77aa823e75" + }, + "working_tree": { + "exists": true, + "size_bytes": 13995, + "sha256": "31520636dd599533750ccefa45906f22e3efc98f4797fb5022d80b5e8438c420" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/final-architecture-fix-virtual-signatures.tsv", + "refactor": { + "source_path": "docs/tracking/final-architecture-fix-virtual-signatures.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "56c2a44f4df5f5e1f2eec93fa3c707bac2260d36", + "mode": "100644", + "size_bytes": 25138, + "sha256": "bb5ee1a5c29f72e5fcfb4c08453a80fb234263ab52ffa4e2aa8b092637cce6a0" + }, + "working_tree": { + "exists": true, + "size_bytes": 25224, + "sha256": "703394c66541b9b92f070e70b93dda2701d1bda284d59a784e9cd3f5e7376b1b" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/findings.md", + "refactor": { + "source_path": "docs/tracking/findings.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7655e42a4a19eeb572f89c866a2b9ac1e84b5b37", + "mode": "100644", + "size_bytes": 9044, + "sha256": "4549f000bfd256c90ec28db1957638d0a59e3f502a1bfe5b008f19e0e95bf7e1" + }, + "working_tree": { + "exists": true, + "size_bytes": 9145, + "sha256": "a6be4ca2f8758a88d192596062cddb495efcb15df6c472f49e22aa2218ddc9e5" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/object-copy-audit.md", + "refactor": { + "source_path": "docs/tracking/object-copy-audit.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "eaeb17ab0c815ac38a7c0669fb6c4a5d107661e2", + "mode": "100644", + "size_bytes": 33600, + "sha256": "c4a182ed8258c71e68d410ce9cc7a395e2b28c8aa4582c6d5fe1cf329976c33b" + }, + "working_tree": { + "exists": true, + "size_bytes": 33933, + "sha256": "4cbb6817965aef2a9c280b97fa74e8f3e47e316b89aca15265c0c0ab03c7e925" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/object-copy-candidates.tsv", + "refactor": { + "source_path": "docs/tracking/object-copy-candidates.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ad5996da98792ef9b44371b9ff57cf96d8c84665", + "mode": "100644", + "size_bytes": 24159, + "sha256": "9478a1eab1581a86d186e0534c275c8b177ad61879854d2f45f42a3ec0a6906e" + }, + "working_tree": { + "exists": true, + "size_bytes": 24220, + "sha256": "e9315ea7d3551e571d8480dfe6a5864481314c7dede900144ae7ed849a18f2a1" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/object-copy-files.tsv", + "refactor": { + "source_path": "docs/tracking/object-copy-files.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a1c4dac40843aeb6d16545566195be270181d7d5", + "mode": "100644", + "size_bytes": 237212, + "sha256": "974ee79d18287c2944ba4a14b608e7bbd91486e54a2cc50b9e94dad18933a026" + }, + "working_tree": { + "exists": true, + "size_bytes": 237507, + "sha256": "258818f4e2a1d947b7f234e050768f229116b1dab287e1dcfcaa7a34cdb5970a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/object-copy-verification.md", + "refactor": { + "source_path": "docs/tracking/object-copy-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "aec6bfeff7685ee1c0c4e1b315ae4312f7cb6ca6", + "mode": "100644", + "size_bytes": 11428, + "sha256": "8630668433ba1e2b51da608f44a019f10dfff7a55a6ee6c244de3fc86da2f356" + }, + "working_tree": { + "exists": true, + "size_bytes": 11569, + "sha256": "5f766195632bae713c73743d1a193b145b0a7a5186b437a10ccef92c5f66fda4" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/shellnl-vtune-hotspots.md", + "refactor": { + "source_path": "docs/tracking/shellnl-vtune-hotspots.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "335e77ca3d1eef9ecc449506a978c487bb3f8f19", + "mode": "100644", + "size_bytes": 22105, + "sha256": "b7f53e4a2e9b1675b82e4d0dcbbd0889e3469f02ed392fc8934114ac4731f597" + }, + "working_tree": { + "exists": true, + "size_bytes": 22431, + "sha256": "7de196869ed2d84d2587184348487a3814e811406a3f5325deac03ece9309121" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/status.md", + "refactor": { + "source_path": "docs/tracking/status.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "18bdd959b17857fe0835dcabc5faf287f3c1661c", + "mode": "100644", + "size_bytes": 9049, + "sha256": "dab7906aa44f929f32d5457f2a7872e211470018509d731cb276fc22ecdb1789" + }, + "working_tree": { + "exists": true, + "size_bytes": 9158, + "sha256": "69f258d85979c0beb135c886af39d29489cb32c7305c8aa39313bd77b81f688c" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t10-procedures-verification.md", + "refactor": { + "source_path": "docs/tracking/t10-procedures-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2705c88f84e46838702dbcd0e42a7d857718ef8f", + "mode": "100644", + "size_bytes": 14126, + "sha256": "8739a0e4addef1712076469e9e36e3f802eaa06fed776ea6ec995f305d1f3d1b" + }, + "working_tree": { + "exists": true, + "size_bytes": 14305, + "sha256": "b06ee43015f5fd1877d9fc5eb960f883f0d09de257ead15177c9ce201696a4f2" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t11-results-verification.md", + "refactor": { + "source_path": "docs/tracking/t11-results-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "75b0be507fd3b1a662c3435c08160af788b2347d", + "mode": "100644", + "size_bytes": 12389, + "sha256": "3fd00fb52c9ad7721bfb757a53c18fce07723033f19e2c51a9951e7657efc68b" + }, + "working_tree": { + "exists": true, + "size_bytes": 12460, + "sha256": "2b01a172bd0626592c0b064ac52f905d8cb7378c615ee1a1923c2ab21b1c89e6" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t12-performance-verification.md", + "refactor": { + "source_path": "docs/tracking/t12-performance-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8a7c48b0c36b99ef13bcc84e164d6bda592cea9a", + "mode": "100644", + "size_bytes": 30184, + "sha256": "b565b2463625dedbacfd13971fa23a0e9212beadcbb1b864c0e4cc42269070ea" + }, + "working_tree": { + "exists": true, + "size_bytes": 30398, + "sha256": "102192fd482148c8e319bea5b7f53c5daeff80a4a346bb22aab491720d8b22dc" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-all-files-inventory.tsv", + "refactor": { + "source_path": "docs/tracking/t13-all-files-inventory.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a6824a02c84ba7e02305a5166381a64774fe3ad6", + "mode": "100644", + "size_bytes": 104236, + "sha256": "3b4f46f87b639645933b5f333a4ce068bc8542677bcc6bab1d0e4b1c25bf5775" + }, + "working_tree": { + "exists": true, + "size_bytes": 104528, + "sha256": "bb5cd15b05264eff1c2e2bde3bf5ae76ff76103cc05a59fe2ad4a5220a9609e1" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-architecture.md", + "refactor": { + "source_path": "docs/tracking/t13-architecture.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4e019d26acf893fbd7a014b3ac5b0d0ddde9d213", + "mode": "100644", + "size_bytes": 18816, + "sha256": "cf1c61dc91b8e5cc8ed9e1d0c6f3a11ef307643e2c25ffba55f43b54a860da9c" + }, + "working_tree": { + "exists": true, + "size_bytes": 18979, + "sha256": "3a4af2993e7300c2a20f8a7fbf36418a762869e713d3841437f1998bf4c2e759" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-baseline-duplicates.tsv", + "refactor": { + "source_path": "docs/tracking/t13-baseline-duplicates.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c3d846a8185ac3029566e7fe557b142ee559a25f", + "mode": "100644", + "size_bytes": 47189, + "sha256": "d8c9cbfc8de60e3b6f4bbf8c14dfa6bed2bfc9f6d61b9d637507f4e7e975aef5" + }, + "working_tree": { + "exists": true, + "size_bytes": 47275, + "sha256": "70ceaf52276e3f30e4eea7c1d76d68760d270fd5d70343e6d57261f7451d5b2a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-current-duplicates.tsv", + "refactor": { + "source_path": "docs/tracking/t13-current-duplicates.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b47f4d8b32abf66b90d096979337fbeef3981f37", + "mode": "100644", + "size_bytes": 20589, + "sha256": "b8c9ab5b769e41ca9e9b9d360386e4ba0582418b551b81d9873ac4cabdee57de" + }, + "working_tree": { + "exists": true, + "size_bytes": 20624, + "sha256": "b83c39ae1c464fb58cc5a602d7b275ca3a28698e57f243c548be97f0c07bf387" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-final-verification.md", + "refactor": { + "source_path": "docs/tracking/t13-final-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8b5ded62345079e31c240e78606accc0c23306f5", + "mode": "100644", + "size_bytes": 17357, + "sha256": "1ccc08108691e32ac594920af92d4944cc9f5a6e6369f3e04df4ee89c0d42758" + }, + "working_tree": { + "exists": true, + "size_bytes": 17562, + "sha256": "0075da884c4afacc29f58d434c199881943c3634cebddc750a82efb88a9829a8" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-inverse-baseline-sites.tsv", + "refactor": { + "source_path": "docs/tracking/t13-inverse-baseline-sites.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d79288dbdd1971fbcfbdff56a54842f8ec342bf1", + "mode": "100644", + "size_bytes": 111676, + "sha256": "3fe73d289baf743e682acbd241ce3cd5540bdb5f6f85f7915d0c0543a83c871f" + }, + "working_tree": { + "exists": true, + "size_bytes": 111867, + "sha256": "0e4dffeb05fffdb39a90713e73f6e744ba384a715c80495ea8740fa7c14c6a4e" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-inverse-current-sites.tsv", + "refactor": { + "source_path": "docs/tracking/t13-inverse-current-sites.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e2ca98bc1e9a2eae88d0f88bc21079221f0ce1b7", + "mode": "100644", + "size_bytes": 35141, + "sha256": "ca9878c032ecc2d8881c28e98e3d83c617766b189ae449002eda813f088038d9" + }, + "working_tree": { + "exists": true, + "size_bytes": 35210, + "sha256": "2f8adcd951b6e1db2bfc1582132a7f63243bfcfb61f2447ada9ce9d6e0e141ea" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-performance-summary.tsv", + "refactor": { + "source_path": "docs/tracking/t13-performance-summary.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b73d3423a3031473e0e8ce8593c1da0118cc2c18", + "mode": "100644", + "size_bytes": 5190, + "sha256": "83fa1f6151a9d837f7057660206b43eefbef87691f2ed573ab94efb4b57a598c" + }, + "working_tree": { + "exists": true, + "size_bytes": 5241, + "sha256": "b2b41f45a206810a1d5cb638e2b7f9ddc5fe2b3a90cc9e7f1628e34bcb8ec27c" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-phase-allocation.tsv", + "refactor": { + "source_path": "docs/tracking/t13-phase-allocation.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "aa1f4798874244408c824861c7ca4f50aa1131ed", + "mode": "100644", + "size_bytes": 28566, + "sha256": "c9bd651f91302ca9e9d9f95be6c1da574e44ba791213aacb3426fd34541c22ab" + }, + "working_tree": { + "exists": true, + "size_bytes": 28955, + "sha256": "c21e3443277094fc8185c92921cf0cb95c6a9a173fdaef50894cf958b63ac3c1" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-phase-summary.tsv", + "refactor": { + "source_path": "docs/tracking/t13-phase-summary.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6e35ca85c3640f1b9c6000b473bc7c2bfdab0bb2", + "mode": "100644", + "size_bytes": 36348, + "sha256": "0beb74fe769dae9378525ef3703f4084fc34fec56bd29231670c8e24b580c8c3" + }, + "working_tree": { + "exists": true, + "size_bytes": 36737, + "sha256": "2c531a533da0624dd87547a4333f07c53b8fc98bb9f79a8ed1f75f0df82ce042" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-requirements.tsv", + "refactor": { + "source_path": "docs/tracking/t13-requirements.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fb6b7353af4a31ccedc2863c05487bccd746032c", + "mode": "100644", + "size_bytes": 4215, + "sha256": "09f6abadebb18e82ab0951457fdc2a9c36d168d79d6ed13f6f8d63a63c48fe80" + }, + "working_tree": { + "exists": true, + "size_bytes": 4231, + "sha256": "47d875c1c489e798a196aaebbb967f8ca37eea999fdcf997d8c99cde737db4cd" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t13-virtual-signatures.tsv", + "refactor": { + "source_path": "docs/tracking/t13-virtual-signatures.tsv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4cb9a50a8d5f7f420da1ef9d5fd85cab63a7209c", + "mode": "100644", + "size_bytes": 20053, + "sha256": "46794d381cd5b5c455ec37321d9ccfa6007e21ebe53bed554aa4bd065de7b7ca" + }, + "working_tree": { + "exists": true, + "size_bytes": 20139, + "sha256": "5e24508f71c7ea5c4a3153c1eca1db152492d1079e2c56fc7f1a0c6cfedadfb8" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t14-declarations.md", + "refactor": { + "source_path": "docs/tracking/t14-declarations.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "709bcb01f4df3c5a02817e2454277b0a471c7989", + "mode": "100644", + "size_bytes": 6865, + "sha256": "1e44b775ad17ca8e564f85a3913a41b999b69562ffb2a6b1018c03f70469626b" + }, + "working_tree": { + "exists": true, + "size_bytes": 6983, + "sha256": "375f9e9d16055f19e102d0ed6eb980274626e179c787625b50b6657e6c64c2d7" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t2-math-verification.md", + "refactor": { + "source_path": "docs/tracking/t2-math-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "df18f3f9eebb5e71b398397ec53ff96f63a67041", + "mode": "100644", + "size_bytes": 8229, + "sha256": "8cf3c3c089cff5c2d2fe28ee27da7137154a5828d41502c881921edeb5decf91" + }, + "working_tree": { + "exists": true, + "size_bytes": 8337, + "sha256": "b5df106dee3b854c49f5176955313f2fe8fb704c3b09bb7d8af9b762314be8af" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t3-dense-factors.md", + "refactor": { + "source_path": "docs/tracking/t3-dense-factors.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "454d52fa57ec6a5a7b66f9be1efbff06c664253f", + "mode": "100644", + "size_bytes": 6089, + "sha256": "3ec76c0f8759596deb5c675d3f21d7138dd45543f439d2193c72e018dcd305ea" + }, + "working_tree": { + "exists": true, + "size_bytes": 6175, + "sha256": "2cbc79e07cf5e24cfa7388ef4d45dfc879d431697f4603d82441db25a974bea6" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t3-t6-t8-integration.md", + "refactor": { + "source_path": "docs/tracking/t3-t6-t8-integration.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fbf99861ec14bc9ab23e5f23ff9e64fa462c9a49", + "mode": "100644", + "size_bytes": 3574, + "sha256": "9bb53f87fd909177f1a6e901963523fe35d1ee995bbbaa8e4fbe689c263d4558" + }, + "working_tree": { + "exists": true, + "size_bytes": 3624, + "sha256": "a126bf2aeeaebc9257de5b9a6db6f43a70a9eb3127fbeb512ae091c7f1d349f4" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t4-inverse-actions-verification.md", + "refactor": { + "source_path": "docs/tracking/t4-inverse-actions-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f9006fcbbc08dd000a1735a63a285c29c6be1378", + "mode": "100644", + "size_bytes": 10455, + "sha256": "f2657d9aca1be675ff9a5d55bc06063e41abd08117ff287a232306f8c3f5d368" + }, + "working_tree": { + "exists": true, + "size_bytes": 10602, + "sha256": "8790cf545de7ea1eadab4dea0032f209c55da6ad6cb478d7f21326098b3a5bcb" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t5-special-precision-verification.md", + "refactor": { + "source_path": "docs/tracking/t5-special-precision-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "68738c57278a26bd05ee4b620e6437e3e8584a86", + "mode": "100644", + "size_bytes": 15397, + "sha256": "628dc593c9152224875ffd480ebf57288229f6c693cf9ffa1ffa6d9c460f2c3c" + }, + "working_tree": { + "exists": true, + "size_bytes": 15592, + "sha256": "46013a5ee26d75bfbb87824e8625147c079165a60cfecf9e96ab9a2b0f440f76" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t6-model-input.md", + "refactor": { + "source_path": "docs/tracking/t6-model-input.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e5d7913a9dd991390f256d683fc79962d199e9f4", + "mode": "100644", + "size_bytes": 5901, + "sha256": "ed60b3669b671a65cf45cb42c78443b0b4b189718ace96e767e8f56bdd46d50b" + }, + "working_tree": { + "exists": true, + "size_bytes": 5982, + "sha256": "24df3eb1074cfb2e2f3c351e0f0efe919a818b07a0f6b50a2a27c1bb2412fdcf" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t7-elements-verification.md", + "refactor": { + "source_path": "docs/tracking/t7-elements-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "800d41cf4a2ebe37a607dc6b321b12608f537f60", + "mode": "100644", + "size_bytes": 15111, + "sha256": "54e52561b9fb5e2394ca2bc2415d342cccb3f20f2fd740f9d4d82d8b4006d5fa" + }, + "working_tree": { + "exists": true, + "size_bytes": 15281, + "sha256": "72fb21c746a0d8bd04337a3d6d54b7204851c82e0a4caed8488046adaa966c2a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t8-solvers-verification.md", + "refactor": { + "source_path": "docs/tracking/t8-solvers-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ccc4251a5835959c54ae1cd28768119ef5f67e1a", + "mode": "100644", + "size_bytes": 9077, + "sha256": "638b28be663fe07f8be3b2c36a39116fb25d73cb3dad7a0a0ce7009910d455d8" + }, + "working_tree": { + "exists": true, + "size_bytes": 9189, + "sha256": "cbac9f4d363ac14f203f0a70ae07ed82870d210a9f52a7519c9d3fec8b76e7ca" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "docs/tracking/t9-assembly-verification.md", + "refactor": { + "source_path": "docs/tracking/t9-assembly-verification.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bd4b623f1f78e6ee72fab89854f701714fa2d108", + "mode": "100644", + "size_bytes": 8966, + "sha256": "3ce63f3291cceb15cbd56ffb446090f9ef84fa0173f087b36eadedb7e4f4be8b" + }, + "working_tree": { + "exists": true, + "size_bytes": 9079, + "sha256": "0e19a2645c02c38dfe3e4c297ecece41da1bc2415a2071bc2d18b9571feab3ed" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "include/fesa/AGENTS.md", + "fesa_dev": { + "source_path": "include/fesa/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3eb3600871d709b216eb28ae703c4da1ebd89195", + "mode": "100644", + "size_bytes": 1172, + "sha256": "a9da30649a4eeff490171a4422157e6ce79ecf40df9da240122bab913d00aac3" + }, + "working_tree": { + "exists": true, + "size_bytes": 1187, + "sha256": "bbf7f1db431456003ecdb45279e4d4996f1cad9e15e422cf8c197bc1c46031d5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3eb3600871d709b216eb28ae703c4da1ebd89195", + "mode": "100644", + "size_bytes": 1172, + "sha256": "a9da30649a4eeff490171a4422157e6ce79ecf40df9da240122bab913d00aac3" + }, + "working_tree": { + "exists": true, + "size_bytes": 1187, + "sha256": "bbf7f1db431456003ecdb45279e4d4996f1cad9e15e422cf8c197bc1c46031d5" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1187, + "sha256": "bbf7f1db431456003ecdb45279e4d4996f1cad9e15e422cf8c197bc1c46031d5" + } + }, + { + "target_path": "include/fesa/analysis/analysis.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/analysis.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "29a95a41c3de8a19486ef5f23db87cb96a3d4d2c", + "mode": "100644", + "size_bytes": 851, + "sha256": "2c8148596f7be481e4bb400135818944e5ca961512a7842202cabfd27fcba58e" + }, + "working_tree": { + "exists": true, + "size_bytes": 882, + "sha256": "503e0165646fe2abe75b4ad38a8e96efd3c8b6b78202825676433141a903e92e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/analysis.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "29a95a41c3de8a19486ef5f23db87cb96a3d4d2c", + "mode": "100644", + "size_bytes": 851, + "sha256": "2c8148596f7be481e4bb400135818944e5ca961512a7842202cabfd27fcba58e" + }, + "working_tree": { + "exists": true, + "size_bytes": 882, + "sha256": "503e0165646fe2abe75b4ad38a8e96efd3c8b6b78202825676433141a903e92e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 882, + "sha256": "503e0165646fe2abe75b4ad38a8e96efd3c8b6b78202825676433141a903e92e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "503e0165646fe2abe75b4ad38a8e96efd3c8b6b78202825676433141a903e92e", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/analysis_model.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/analysis_model.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1068a3addf96a037d2994adf72c15989ea113e3b", + "mode": "100644", + "size_bytes": 3759, + "sha256": "b66637757da0a8a05443c17900cdf722f57b2f60ccca63c87142a35220f0beb0" + }, + "working_tree": { + "exists": true, + "size_bytes": 3851, + "sha256": "efe503b98fc6d534b32ecc53bd3323708908b32ba3d5432fec17ce413a601eda" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/analysis_model.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1068a3addf96a037d2994adf72c15989ea113e3b", + "mode": "100644", + "size_bytes": 3759, + "sha256": "b66637757da0a8a05443c17900cdf722f57b2f60ccca63c87142a35220f0beb0" + }, + "working_tree": { + "exists": true, + "size_bytes": 3851, + "sha256": "efe503b98fc6d534b32ecc53bd3323708908b32ba3d5432fec17ce413a601eda" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3851, + "sha256": "efe503b98fc6d534b32ecc53bd3323708908b32ba3d5432fec17ce413a601eda" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "efe503b98fc6d534b32ecc53bd3323708908b32ba3d5432fec17ce413a601eda", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/analysis_procedure.h", + "refactor": { + "source_path": "include/fesa/analysis/analysis_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f4571cccb25149e3a51f7c6fe6cf8b0444df47fe", + "mode": "100644", + "size_bytes": 728, + "sha256": "1cb89a0a538ed8660b181d9510c82092b2967bed40dd9ed53ee7aecb547a5482" + }, + "working_tree": { + "exists": true, + "size_bytes": 751, + "sha256": "b3e78f586752d5d43034c5a5202ec5fd862e3101837084162a572237dd26c148" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b3e78f586752d5d43034c5a5202ec5fd862e3101837084162a572237dd26c148", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/analysis_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/analysis_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d6d40311e2a95a732450e649b573b35d1216a54a", + "mode": "100644", + "size_bytes": 4382, + "sha256": "6d5db600419ee1e46c89d4500da06075deb594acc1e2b0ea1c5c651262cf4865" + }, + "working_tree": { + "exists": true, + "size_bytes": 4484, + "sha256": "0a7be4c8d0bd0f5f95f6bf938709a1fb6317b44016417510cc5a56ee96e2d32e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/analysis_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0222ae2775dcfcba2c91f1f786437f103e2e21f8", + "mode": "100644", + "size_bytes": 4367, + "sha256": "485bac09de77205be681325581c5b5316780b9ead363cf3f09d220f1749131b0" + }, + "working_tree": { + "exists": true, + "size_bytes": 4470, + "sha256": "d5b19bb4434d79fa3e648e0de3cd0e0bc4eec37be7cf9f8d839ff876dc2d1716" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4484, + "sha256": "0a7be4c8d0bd0f5f95f6bf938709a1fb6317b44016417510cc5a56ee96e2d32e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "d5b19bb4434d79fa3e648e0de3cd0e0bc4eec37be7cf9f8d839ff876dc2d1716", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/dynamic_analysis_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/dynamic_analysis_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "96bca405f334852f58e12ab676c67caad65e380d", + "mode": "100644", + "size_bytes": 4676, + "sha256": "63a97a0d29f79376070de2c9b3996af6cdc7fda63efdea84e90f3ec56e6d3ee0" + }, + "working_tree": { + "exists": true, + "size_bytes": 4782, + "sha256": "e44c641af99c892c725841f75fe3b42d23bb8a2151b892e913d8f7f15b3877db" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/dynamic_analysis_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "96bca405f334852f58e12ab676c67caad65e380d", + "mode": "100644", + "size_bytes": 4676, + "sha256": "63a97a0d29f79376070de2c9b3996af6cdc7fda63efdea84e90f3ec56e6d3ee0" + }, + "working_tree": { + "exists": true, + "size_bytes": 4799, + "sha256": "89065f2c9a029624edb22a407cc2b61c9cd2d735c7563d3c9b71eb2f1870ca00" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4799, + "sha256": "89065f2c9a029624edb22a407cc2b61c9cd2d735c7563d3c9b71eb2f1870ca00" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "89065f2c9a029624edb22a407cc2b61c9cd2d735c7563d3c9b71eb2f1870ca00", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/dynamic_execution_result.h", + "refactor": { + "source_path": "include/fesa/analysis/dynamic_execution_result.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "650a58821a8fea6761fd9a1437e3e58ea8ce8063", + "mode": "100644", + "size_bytes": 479, + "sha256": "7be25de70171bb08d3067afb32d65f922e9d258065d1397188d7054b7fe4b29a" + }, + "working_tree": { + "exists": true, + "size_bytes": 498, + "sha256": "ac52e12215ba15794855638e4e3702b504418d88ec390970cd3935e3c8baf9c2" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ac52e12215ba15794855638e4e3702b504418d88ec390970cd3935e3c8baf9c2", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/eigen_analysis_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/eigen_analysis_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "92291445e58d6c3465f69e4730f4f6b0cff5d7b9", + "mode": "100644", + "size_bytes": 2204, + "sha256": "03157e7eeeff48c8dd3921716083403e46a47294fe26995892ab8ae24f6699f4" + }, + "working_tree": { + "exists": true, + "size_bytes": 2282, + "sha256": "885d90420bedec17175e320e4f7c7f8fc1e230db71991d195a1782577a853645" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/eigen_analysis_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d5aecd04b2c3a5cb8377a619b41e9ddd7b425f24", + "mode": "100644", + "size_bytes": 2194, + "sha256": "1ece46192be252b0dc26cb0368bb390d36055fa601fb1c87d22370257748e65e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2272, + "sha256": "13ad5f4d9fc4a65c6c69f26a9b1f7041470a81c4b33d7fe082878d043f63ebe4" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2282, + "sha256": "885d90420bedec17175e320e4f7c7f8fc1e230db71991d195a1782577a853645" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "13ad5f4d9fc4a65c6c69f26a9b1f7041470a81c4b33d7fe082878d043f63ebe4", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/hht_dynamic_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/hht_dynamic_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c10404f37f661db905ef5990d99183dc3245169c", + "mode": "100644", + "size_bytes": 1014, + "sha256": "272c12f6414104d859e79c0879ea3e1944227c5531a8bc3c437e2a21cc310416" + }, + "working_tree": { + "exists": true, + "size_bytes": 1043, + "sha256": "81ac8359580ca0adfdf73fa588aa7c654dfdf6dc257934982841673ae3de9163" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/hht_dynamic_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "082f474ab3d837ab66f4d9f5d3ebeb9c22a8ea66", + "mode": "100644", + "size_bytes": 1098, + "sha256": "0cf5fd4d678c723ae3093013ab5a6355c0aa93c03d7460ab602b12dea32a5762" + }, + "working_tree": { + "exists": true, + "size_bytes": 1131, + "sha256": "ef2fef93b46aabd47c9511b8afd9e6f82779036b484e0090da60d925a0599dec" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1043, + "sha256": "81ac8359580ca0adfdf73fa588aa7c654dfdf6dc257934982841673ae3de9163" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ef2fef93b46aabd47c9511b8afd9e6f82779036b484e0090da60d925a0599dec", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/hht_time_integration.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/hht_time_integration.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "08920513e45feb1fd4f5370466873ec1b61f4338", + "mode": "100644", + "size_bytes": 1772, + "sha256": "bfacba899601839939299fe216efd312f9d076fe6155027af6a0d117eed2f6f0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1822, + "sha256": "ccd94ef6314854dce1de682dd7df0488638f1e98b1a1f0e6c8824a220b138809" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/hht_time_integration.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "08920513e45feb1fd4f5370466873ec1b61f4338", + "mode": "100644", + "size_bytes": 1772, + "sha256": "bfacba899601839939299fe216efd312f9d076fe6155027af6a0d117eed2f6f0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1822, + "sha256": "ccd94ef6314854dce1de682dd7df0488638f1e98b1a1f0e6c8824a220b138809" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1822, + "sha256": "ccd94ef6314854dce1de682dd7df0488638f1e98b1a1f0e6c8824a220b138809" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ccd94ef6314854dce1de682dd7df0488638f1e98b1a1f0e6c8824a220b138809", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/linear_frequency_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/linear_frequency_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a6039b658dbf71fa85588524aca1e21e3307164c", + "mode": "100644", + "size_bytes": 603, + "sha256": "524f54ed2fe5ad2d8078229c71940153f8d55bb39ab9984c686295f51ec12511" + }, + "working_tree": { + "exists": true, + "size_bytes": 623, + "sha256": "e291b9bbd6e863feeafea4c96ab5863e0b97549ebe11825ae2bd323db4360eeb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/linear_frequency_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "58cf1ad971a5a008090e3339d42ca8dbdc836958", + "mode": "100644", + "size_bytes": 964, + "sha256": "ccb6fd30d9985575975b05e924f234095489327b25230e9b0a817692b08b1a22" + }, + "working_tree": { + "exists": true, + "size_bytes": 994, + "sha256": "db7a1a2a1e10dd1a11de7ad0c613670f957f9609c02b83d00334eaa45ec2627a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 623, + "sha256": "e291b9bbd6e863feeafea4c96ab5863e0b97549ebe11825ae2bd323db4360eeb" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "db7a1a2a1e10dd1a11de7ad0c613670f957f9609c02b83d00334eaa45ec2627a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/linear_static_analysis.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/linear_static_analysis.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f0e7595b2dd648e0e4f1cfe649b66935a10697de", + "mode": "100644", + "size_bytes": 1104, + "sha256": "c8d3b4e19e1943c69d34e2e333cc889e7ecff4a6a58788e60f3e66ab0930388f" + }, + "working_tree": { + "exists": true, + "size_bytes": 1138, + "sha256": "5177f62a87e96e2591b4f5fe21cc3807be0606ce512a28b99a3d462bc195477a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/linear_static_analysis.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f0e7595b2dd648e0e4f1cfe649b66935a10697de", + "mode": "100644", + "size_bytes": 1104, + "sha256": "c8d3b4e19e1943c69d34e2e333cc889e7ecff4a6a58788e60f3e66ab0930388f" + }, + "working_tree": { + "exists": true, + "size_bytes": 1138, + "sha256": "5177f62a87e96e2591b4f5fe21cc3807be0606ce512a28b99a3d462bc195477a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1138, + "sha256": "5177f62a87e96e2591b4f5fe21cc3807be0606ce512a28b99a3d462bc195477a" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "5177f62a87e96e2591b4f5fe21cc3807be0606ce512a28b99a3d462bc195477a", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/linear_static_execution_result.h", + "refactor": { + "source_path": "include/fesa/analysis/linear_static_execution_result.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c94adef726840ceb0f09632f0d2a3c2f522e499c", + "mode": "100644", + "size_bytes": 490, + "sha256": "86678e3dccbcb243c28ff869a6672950994da5e83b1913d45dd233364dd46caf" + }, + "working_tree": { + "exists": true, + "size_bytes": 509, + "sha256": "206677b67093eff13d7425d9c87733d139d87e0b9092e0e3eecaced54292c905" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "206677b67093eff13d7425d9c87733d139d87e0b9092e0e3eecaced54292c905", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/linear_static_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/linear_static_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fe02c04b62012a42a41de70deb687e30a1839f53", + "mode": "100644", + "size_bytes": 1058, + "sha256": "05029b508b879885454c3e73410c5859150e4d239b6d8454bc6be0512054492f" + }, + "working_tree": { + "exists": true, + "size_bytes": 1089, + "sha256": "93ab210acb8fd880f5394b281311865e0c1f995d3ec36f739394858c8a62aacf" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/linear_static_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3347d8b050c395d2d0332ae1041563fc95e0804a", + "mode": "100644", + "size_bytes": 1116, + "sha256": "53eb833b9278d69e192128783a97ce25d26a72024a70944673af1a09278d734d" + }, + "working_tree": { + "exists": true, + "size_bytes": 1150, + "sha256": "cb6db8132fbcf96e737ca327511b60d63aa7b2bcd849a48fc43ac2831012985c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1089, + "sha256": "93ab210acb8fd880f5394b281311865e0c1f995d3ec36f739394858c8a62aacf" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "cb6db8132fbcf96e737ca327511b60d63aa7b2bcd849a48fc43ac2831012985c", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/newton_iteration_log.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/newton_iteration_log.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c59ab27cc6e73753c50126f23a9000d7b875c46c", + "mode": "100644", + "size_bytes": 4381, + "sha256": "a0835b75d1197d9e5abee2f03628bc11a03ad37d4980d10237358cf5f1fe5279" + }, + "working_tree": { + "exists": true, + "size_bytes": 4505, + "sha256": "e6a4224a8670218317b60836b4bdb9a6a22462309850b8b978e265e574e04174" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/newton_iteration_log.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c59ab27cc6e73753c50126f23a9000d7b875c46c", + "mode": "100644", + "size_bytes": 4381, + "sha256": "a0835b75d1197d9e5abee2f03628bc11a03ad37d4980d10237358cf5f1fe5279" + }, + "working_tree": { + "exists": true, + "size_bytes": 4505, + "sha256": "e6a4224a8670218317b60836b4bdb9a6a22462309850b8b978e265e574e04174" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4505, + "sha256": "e6a4224a8670218317b60836b4bdb9a6a22462309850b8b978e265e574e04174" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e6a4224a8670218317b60836b4bdb9a6a22462309850b8b978e265e574e04174", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/nonlinear_analysis_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/nonlinear_analysis_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7efee9762203da65ff21a111b0076d3f21edabc7", + "mode": "100644", + "size_bytes": 4290, + "sha256": "b26b8cc8afdd556450ecf318fcfb36521be0d906b51bf1b100dc3a6ff282ec91" + }, + "working_tree": { + "exists": true, + "size_bytes": 4408, + "sha256": "e1231e7db299ea2c24d0da8e6553d2990d7905cd28c3a03d4126116fa4ba8ae1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/nonlinear_analysis_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7efee9762203da65ff21a111b0076d3f21edabc7", + "mode": "100644", + "size_bytes": 4290, + "sha256": "b26b8cc8afdd556450ecf318fcfb36521be0d906b51bf1b100dc3a6ff282ec91" + }, + "working_tree": { + "exists": true, + "size_bytes": 4408, + "sha256": "e1231e7db299ea2c24d0da8e6553d2990d7905cd28c3a03d4126116fa4ba8ae1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4408, + "sha256": "e1231e7db299ea2c24d0da8e6553d2990d7905cd28c3a03d4126116fa4ba8ae1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e1231e7db299ea2c24d0da8e6553d2990d7905cd28c3a03d4126116fa4ba8ae1", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/nonlinear_static_control.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/nonlinear_static_control.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "82a0be13c11c5b293bc56d35a337019b148f5382", + "mode": "100644", + "size_bytes": 4821, + "sha256": "3facd10fb81b4757719c72e61d23c1711d88b2c7c4f33e3053e7184175edb924" + }, + "working_tree": { + "exists": true, + "size_bytes": 4952, + "sha256": "a7b6368fd2b87fedeb4cf39566848f8136433c7f25d9ec15fc0cdc2043647c15" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/nonlinear_static_control.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "82a0be13c11c5b293bc56d35a337019b148f5382", + "mode": "100644", + "size_bytes": 4821, + "sha256": "3facd10fb81b4757719c72e61d23c1711d88b2c7c4f33e3053e7184175edb924" + }, + "working_tree": { + "exists": true, + "size_bytes": 4952, + "sha256": "a7b6368fd2b87fedeb4cf39566848f8136433c7f25d9ec15fc0cdc2043647c15" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4952, + "sha256": "a7b6368fd2b87fedeb4cf39566848f8136433c7f25d9ec15fc0cdc2043647c15" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a7b6368fd2b87fedeb4cf39566848f8136433c7f25d9ec15fc0cdc2043647c15", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/nonlinear_static_execution_result.h", + "refactor": { + "source_path": "include/fesa/analysis/nonlinear_static_execution_result.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "82ff9465046f3632e5612ae734bcbb40e7eb1f4e", + "mode": "100644", + "size_bytes": 528, + "sha256": "840c0b6bcdd579d2fc18da89d95b6f4efad6cb2eba5ecbf382f5cf91f0ddf680" + }, + "working_tree": { + "exists": true, + "size_bytes": 548, + "sha256": "5c870e6a9941e7e790acf6476f6c407b7d6c82274e6d65e4d0e57828ea3211ca" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "5c870e6a9941e7e790acf6476f6c407b7d6c82274e6d65e4d0e57828ea3211ca", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/nonlinear_static_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/nonlinear_static_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ba12a38a2a1c0f01dee9bb70ced3def3745fa688", + "mode": "100644", + "size_bytes": 1153, + "sha256": "ca22edd840000086678caddf71bc91abe9b843aab1a885377a375d2ee1d95c08" + }, + "working_tree": { + "exists": true, + "size_bytes": 1186, + "sha256": "b3fff5fd88e6705fad315201b9b670728247864bac3083745f63d1379d1421a0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/nonlinear_static_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2380679e2a4990a797f3732feec0e61d42b70471", + "mode": "100644", + "size_bytes": 1214, + "sha256": "a1ff32be335bfad491d9480d48f4b0dd5e0b9eb01c227b12d33d6040d7f12a6c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1250, + "sha256": "5d1e6cd846e30427fc7a6491383c65ee61055b9e7ce51951f0dfa382a260b628" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1186, + "sha256": "b3fff5fd88e6705fad315201b9b670728247864bac3083745f63d1379d1421a0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "5d1e6cd846e30427fc7a6491383c65ee61055b9e7ce51951f0dfa382a260b628", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/prepared_analysis.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/prepared_analysis.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "becbd3d8f3a58db50fbd07c4b2411e7a48986dc0", + "mode": "100644", + "size_bytes": 4299, + "sha256": "39f5cb6084209a9b8295affba985d3fc614286a8b7fdaccba88756487c98e44c" + }, + "working_tree": { + "exists": true, + "size_bytes": 4405, + "sha256": "70d40cadc34ba320943dd353a1e676420380dd270a21de1f09abeb5a965c8de0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/prepared_analysis.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6398484ce35179f915320ea51d74417c495b0e49", + "mode": "100644", + "size_bytes": 3920, + "sha256": "a562174acf097ccddff79160a0161eeaffec55c9d49dc34217cafa674abbc628" + }, + "working_tree": { + "exists": true, + "size_bytes": 4013, + "sha256": "6d8af2f255737a17797d60227835116c403d539e267be085de2a55762545666c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4405, + "sha256": "70d40cadc34ba320943dd353a1e676420380dd270a21de1f09abeb5a965c8de0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6d8af2f255737a17797d60227835116c403d539e267be085de2a55762545666c", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/prepared_analysis_outcome.h", + "refactor": { + "source_path": "include/fesa/analysis/prepared_analysis_outcome.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1a9934b4fed2c2ed40a98a427e24762c6c63f87f", + "mode": "100644", + "size_bytes": 1040, + "sha256": "149c6ccab58278de358fd204a961ec97d70099782b58afd65ef508e5157d275b" + }, + "working_tree": { + "exists": true, + "size_bytes": 1066, + "sha256": "7c026cfa42c84c6e6e27d4f2ce5e6f2866c55518af1204d4e98e717baf195d39" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7c026cfa42c84c6e6e27d4f2ce5e6f2866c55518af1204d4e98e717baf195d39", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_dynamic_analysis_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/solid_dynamic_analysis_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d6cdfb963e7c99f0977020e59cbc3b4d2609c695", + "mode": "100644", + "size_bytes": 7896, + "sha256": "8d79583e9bab62eb0eaecee44213029587601e1006ffc663fdc8c6ca3d40188c" + }, + "working_tree": { + "exists": true, + "size_bytes": 7896, + "sha256": "8d79583e9bab62eb0eaecee44213029587601e1006ffc663fdc8c6ca3d40188c" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "include/fesa/analysis/solid_dynamic_analysis_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d6cdfb963e7c99f0977020e59cbc3b4d2609c695", + "mode": "100644", + "size_bytes": 7896, + "sha256": "8d79583e9bab62eb0eaecee44213029587601e1006ffc663fdc8c6ca3d40188c" + }, + "working_tree": { + "exists": true, + "size_bytes": 8099, + "sha256": "a12a5ce2357f47d97f4e97a2a8bd3491dd1608b95611478f30fe39b82cba1da0" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8099, + "sha256": "a12a5ce2357f47d97f4e97a2a8bd3491dd1608b95611478f30fe39b82cba1da0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a12a5ce2357f47d97f4e97a2a8bd3491dd1608b95611478f30fe39b82cba1da0", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_dynamic_execution_result.h", + "refactor": { + "source_path": "include/fesa/analysis/solid_dynamic_execution_result.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3d78e866346aae1c25ea10be7590365f02a18d97", + "mode": "100644", + "size_bytes": 478, + "sha256": "45355c3f0044fa8e5f80d8ff26cbbfed305fa9bfee7bb6fe87ab2eb813f485c6" + }, + "working_tree": { + "exists": true, + "size_bytes": 495, + "sha256": "80302bae63f20e93e62da8f3c388b5a95b96fa458cfd918f4c39cd0a7b8b7942" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "80302bae63f20e93e62da8f3c388b5a95b96fa458cfd918f4c39cd0a7b8b7942", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_frequency_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/solid_frequency_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d779ace7298e43bdebeed07bc41ee5a694d62650", + "mode": "100644", + "size_bytes": 630, + "sha256": "4708e16dc1e17fb16715e0c0c717e4ed60d522dbd27cf43528708cd92cd65089" + }, + "working_tree": { + "exists": true, + "size_bytes": 648, + "sha256": "8413c4500e8626dbb86e7fcab3fec420e11cd797b843b025237cfa4181632413" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/solid_frequency_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b284c2c3b7a084a7a8396240c73845bb5ae9512e", + "mode": "100644", + "size_bytes": 989, + "sha256": "a6ac461cb6f54bfaa1b8b8b0b6f1d7c9f94cc4da2fde9cb9697ad826badf7dc9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1017, + "sha256": "82a28fb1e35650e318a7bd1218a799cb01925f81ff30999c0bec6fc8c492db17" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 648, + "sha256": "8413c4500e8626dbb86e7fcab3fec420e11cd797b843b025237cfa4181632413" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "82a28fb1e35650e318a7bd1218a799cb01925f81ff30999c0bec6fc8c492db17", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_frequency_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/solid_frequency_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "51eb5a735aefacae252454a5326c546bc0ecaaae", + "mode": "100644", + "size_bytes": 1651, + "sha256": "1ce51546c1798f108503d268640b14a4586e59b1e5d89e74d38a12ca80808931" + }, + "working_tree": { + "exists": true, + "size_bytes": 1705, + "sha256": "7c0494f74f53fa40d39f04545e51d88da3090233a4225018e68bb0aebff03f83" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/solid_frequency_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d4f1655c33017860add4178253df9484d50f4ef2", + "mode": "100644", + "size_bytes": 1641, + "sha256": "a5a2a6656bcce71e3c466ccebca8b054c75795a7b7da758a7669f18f04c9c66f" + }, + "working_tree": { + "exists": true, + "size_bytes": 1695, + "sha256": "41675ea1ae2d96a21bb21725589ade95b41c18ee8260973e93c48b46b52de107" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1705, + "sha256": "7c0494f74f53fa40d39f04545e51d88da3090233a4225018e68bb0aebff03f83" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "41675ea1ae2d96a21bb21725589ade95b41c18ee8260973e93c48b46b52de107", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_hht_dynamic_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/solid_hht_dynamic_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b4a5e569d4d5fa56dbc769309a2984f866f74d16", + "mode": "100644", + "size_bytes": 1769, + "sha256": "ec81b53c67080c7fff4649e0daf81431b8f4421566c643ec3fe8ccabbe0cf5b8" + }, + "working_tree": { + "exists": true, + "size_bytes": 1769, + "sha256": "ec81b53c67080c7fff4649e0daf81431b8f4421566c643ec3fe8ccabbe0cf5b8" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "include/fesa/analysis/solid_hht_dynamic_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "564839aed59616207276a28f776e46296ed3214d", + "mode": "100644", + "size_bytes": 1596, + "sha256": "c7817f620b79db0b6cb7c9f34556f4bd2ca846ef9859f1a282bbd9ad03723905" + }, + "working_tree": { + "exists": true, + "size_bytes": 1634, + "sha256": "2111297eff23d265809b69f70025434a299b313b4e4a626425594682d58c274b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1813, + "sha256": "e82b58299ee5b7b3132da94c75c37a2a2deee5ee3c11b55c59fa3f14f9c768a7" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2111297eff23d265809b69f70025434a299b313b4e4a626425594682d58c274b", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_static_execution_result.h", + "refactor": { + "source_path": "include/fesa/analysis/solid_static_execution_result.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a86c3f7e56097376729b86625ee1206b391942d8", + "mode": "100644", + "size_bytes": 485, + "sha256": "43a116d40b66e8bf1a8ebecc8b79ad2ecc6e4f66ba2d6c9d68bc0f0465e39ca7" + }, + "working_tree": { + "exists": true, + "size_bytes": 504, + "sha256": "3f231a0277b3732fe12d4fabc5c01d8353e9f52133740fddf3ead87eb6bb362e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "3f231a0277b3732fe12d4fabc5c01d8353e9f52133740fddf3ead87eb6bb362e", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_static_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/solid_static_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d36b418546f60c03a31763fce45671bece1bfc30", + "mode": "100644", + "size_bytes": 1422, + "sha256": "3a4766585a25b97aaf6802f84b3e992a94b641d8deb65e06f8057c486b9432b5" + }, + "working_tree": { + "exists": true, + "size_bytes": 1461, + "sha256": "6decc731f6f8d966add949a8dcb43a28aca9d826c274834611388050e32d9605" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/solid_static_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9e67ed393b86a6a37f6fb51ced015d257cf35982", + "mode": "100644", + "size_bytes": 1257, + "sha256": "8dcc277ff309e001728c4e6db42c0821f1e293c29736b3409e57ac25781fe101" + }, + "working_tree": { + "exists": true, + "size_bytes": 1290, + "sha256": "c102671f171ceb64692c59a70f1b7f2d135515f59b4a0bb14d673e395395061a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1461, + "sha256": "6decc731f6f8d966add949a8dcb43a28aca9d826c274834611388050e32d9605" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c102671f171ceb64692c59a70f1b7f2d135515f59b4a0bb14d673e395395061a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/solid_static_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/solid_static_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d45eae2fd23866e69d964454b9bb01518eba7d1d", + "mode": "100644", + "size_bytes": 4573, + "sha256": "f9cb3c28b6387f54790264f0a9dcad6b62710daff8e3d4cb25be0488f1317abc" + }, + "working_tree": { + "exists": true, + "size_bytes": 4688, + "sha256": "92c9ef644ad63f45ffcfeea70988ec414c67e39d70b96e3753a1cac1091c65ef" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/solid_static_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d4870454d91e48b7b516ce8b7bc759adc8c536d5", + "mode": "100644", + "size_bytes": 4560, + "sha256": "354a8b133e88e413d440c218a9019ce81f4e3635a8396b350c82cf4d36e73e93" + }, + "working_tree": { + "exists": true, + "size_bytes": 4675, + "sha256": "8a68ad1738dd75f5cb5f07a112bee0506a050f3a96d45056c99aedb1f57a950a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4688, + "sha256": "92c9ef644ad63f45ffcfeea70988ec414c67e39d70b96e3753a1cac1091c65ef" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "8a68ad1738dd75f5cb5f07a112bee0506a050f3a96d45056c99aedb1f57a950a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/thermal_analysis_state.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/thermal_analysis_state.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1114de76afd4456bc12c613d59fb64a46ca985d9", + "mode": "100644", + "size_bytes": 4464, + "sha256": "68214060ed6948c6a95d9bc1f380ea7005289e3d7f68b0efd63ed3495e1a9393" + }, + "working_tree": { + "exists": true, + "size_bytes": 4559, + "sha256": "4f025f310bfe73ab0b73585d848dd8ef974faee34842c869a37bdff36b507e95" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/thermal_analysis_state.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "08f294826f87ffa98c70409ed83af1bbe384ae6c", + "mode": "100644", + "size_bytes": 4512, + "sha256": "9f9cee56c5fb62cd701286680a79d52371118ec5a74a47ecaf065c2375e80774" + }, + "working_tree": { + "exists": true, + "size_bytes": 4611, + "sha256": "1a8de48d0c6596d15112e24f03a93780b8a495985521e24f505047ce33204c18" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4559, + "sha256": "4f025f310bfe73ab0b73585d848dd8ef974faee34842c869a37bdff36b507e95" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1a8de48d0c6596d15112e24f03a93780b8a495985521e24f505047ce33204c18", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/thermal_execution_result.h", + "refactor": { + "source_path": "include/fesa/analysis/thermal_execution_result.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "190fa8d0343919464df607969b52d8be2044e76c", + "mode": "100644", + "size_bytes": 480, + "sha256": "fe6b0b03736c895efc6db57eaff13994327c646745875f76fddc23e2a63fcdf5" + }, + "working_tree": { + "exists": true, + "size_bytes": 499, + "sha256": "4bd16ce8968b188074be5814b3850653ade6adca1fe044c56ac45c117a530d01" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "4bd16ce8968b188074be5814b3850653ade6adca1fe044c56ac45c117a530d01", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/thermal_time_grid.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/thermal_time_grid.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d27a4541aa983456ee06614c5b82cb334895c12b", + "mode": "100644", + "size_bytes": 1630, + "sha256": "f9aa8d30f4871a7d70a2a76f3a7b96656577a01dbaebef151cdd7b1ffb91c06b" + }, + "working_tree": { + "exists": true, + "size_bytes": 1678, + "sha256": "9bbbadea46ca8a415a1c440ef923c06dea97829512b84d648fe8c98d0c06b3d6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/thermal_time_grid.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d27a4541aa983456ee06614c5b82cb334895c12b", + "mode": "100644", + "size_bytes": 1630, + "sha256": "f9aa8d30f4871a7d70a2a76f3a7b96656577a01dbaebef151cdd7b1ffb91c06b" + }, + "working_tree": { + "exists": true, + "size_bytes": 1678, + "sha256": "9bbbadea46ca8a415a1c440ef923c06dea97829512b84d648fe8c98d0c06b3d6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1678, + "sha256": "9bbbadea46ca8a415a1c440ef923c06dea97829512b84d648fe8c98d0c06b3d6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "9bbbadea46ca8a415a1c440ef923c06dea97829512b84d648fe8c98d0c06b3d6", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/analysis/transient_heat_procedure.h", + "fesa_dev": { + "source_path": "include/fesa/analysis/transient_heat_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "59f7a1d72cf4bffa93ab05eb8111511ba3e8ee3e", + "mode": "100644", + "size_bytes": 1274, + "sha256": "6e9ce9ebc05623fb4bbff0bc1204229516491534159400aa47dcfe34c012aba9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1313, + "sha256": "7e077f6748827880f4512b4c687d611572ec3afeefef55ace2a3a4be368bff2f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/analysis/transient_heat_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4c697d0df94652f1f26611987bb7b77a41637026", + "mode": "100644", + "size_bytes": 1089, + "sha256": "704cf4f8fe886774bda0f850c4e9533bfa70050ec3b0972bd12ac715d0565fe1" + }, + "working_tree": { + "exists": true, + "size_bytes": 1121, + "sha256": "63e337fcb167b10acbe242e8af7451b3fdcba0412dcc8337342aacac0ae898c4" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1313, + "sha256": "7e077f6748827880f4512b4c687d611572ec3afeefef55ace2a3a4be368bff2f" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "63e337fcb167b10acbe242e8af7451b3fdcba0412dcc8337342aacac0ae898c4", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/app/fesa_application.h", + "fesa_dev": { + "source_path": "include/fesa/app/fesa_application.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a4ea46747e02d34c00ea6fa8d74704ee1c4f802f", + "mode": "100644", + "size_bytes": 602, + "sha256": "43456673c7d5ef26a9473f1a0748e9f8a422c4f558e6ea08b271347cab2df3f5" + }, + "working_tree": { + "exists": true, + "size_bytes": 623, + "sha256": "604c631e180e16dc06ac8d69c1b42de740c372de47d36ff38c99216fa4524e8b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/app/fesa_application.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a4ea46747e02d34c00ea6fa8d74704ee1c4f802f", + "mode": "100644", + "size_bytes": 602, + "sha256": "43456673c7d5ef26a9473f1a0748e9f8a422c4f558e6ea08b271347cab2df3f5" + }, + "working_tree": { + "exists": true, + "size_bytes": 623, + "sha256": "604c631e180e16dc06ac8d69c1b42de740c372de47d36ff38c99216fa4524e8b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 623, + "sha256": "604c631e180e16dc06ac8d69c1b42de740c372de47d36ff38c99216fa4524e8b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "604c631e180e16dc06ac8d69c1b42de740c372de47d36ff38c99216fa4524e8b", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/app/output_paths.h", + "fesa_dev": { + "source_path": "include/fesa/app/output_paths.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a90d1bb54a93ffd520a2b4e1d8f8e80edbd72611", + "mode": "100644", + "size_bytes": 1911, + "sha256": "5aebcf69656efc59956205b322bce4081ab4e63fcb43c9dbeaf9aeb6a25b76ec" + }, + "working_tree": { + "exists": true, + "size_bytes": 1969, + "sha256": "076f928a4cf4f382d4752f9b3d9b2bef72e8c90a29c2fa1e5f1d4978a7a18cac" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/app/output_paths.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a90d1bb54a93ffd520a2b4e1d8f8e80edbd72611", + "mode": "100644", + "size_bytes": 1911, + "sha256": "5aebcf69656efc59956205b322bce4081ab4e63fcb43c9dbeaf9aeb6a25b76ec" + }, + "working_tree": { + "exists": true, + "size_bytes": 1969, + "sha256": "076f928a4cf4f382d4752f9b3d9b2bef72e8c90a29c2fa1e5f1d4978a7a18cac" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1969, + "sha256": "076f928a4cf4f382d4752f9b3d9b2bef72e8c90a29c2fa1e5f1d4978a7a18cac" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "076f928a4cf4f382d4752f9b3d9b2bef72e8c90a29c2fa1e5f1d4978a7a18cac", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/assembly/load_assembler.h", + "fesa_dev": { + "source_path": "include/fesa/assembly/load_assembler.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "de4802ff5e26dc571eaf07466aefbe868268696e", + "mode": "100644", + "size_bytes": 1896, + "sha256": "852a2ac0b17e03248ce295366b2661970fd3a720ea4f9e37395eec72ee1085db" + }, + "working_tree": { + "exists": true, + "size_bytes": 1938, + "sha256": "c04fd63116f816c0ca7f400ef94c026c11fee77dfed45827a9e9f17963fdbc66" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/assembly/load_assembler.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "53f4c485b6f3e49a94f61cb1420fca8dd750c2c0", + "mode": "100644", + "size_bytes": 1963, + "sha256": "f311d6918c0d829e57f35ae2686c6ec1008c069cbad8cf43b5ec6dc486ec7f96" + }, + "working_tree": { + "exists": true, + "size_bytes": 2006, + "sha256": "d5c7e2b6de916006f198aa765770232112e633091df4947b0f76f42a540a160b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1938, + "sha256": "c04fd63116f816c0ca7f400ef94c026c11fee77dfed45827a9e9f17963fdbc66" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "d5c7e2b6de916006f198aa765770232112e633091df4947b0f76f42a540a160b", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/assembly/parallel_for.h", + "fesa_dev": { + "source_path": "include/fesa/assembly/parallel_for.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "165bb1b6e4e739b772faa4bb3e07fbb40e6fdc23", + "mode": "100644", + "size_bytes": 1163, + "sha256": "aa11cd8cb1843c8184c929bd0de63e6967866183b1c21734dd1340390389c227" + }, + "working_tree": { + "exists": true, + "size_bytes": 1202, + "sha256": "e8e5cfe08a4b632e336f346a6543a65c367441a8d55da4261c63e8bdb24661ed" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/assembly/parallel_for.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "165bb1b6e4e739b772faa4bb3e07fbb40e6fdc23", + "mode": "100644", + "size_bytes": 1163, + "sha256": "aa11cd8cb1843c8184c929bd0de63e6967866183b1c21734dd1340390389c227" + }, + "working_tree": { + "exists": true, + "size_bytes": 1202, + "sha256": "e8e5cfe08a4b632e336f346a6543a65c367441a8d55da4261c63e8bdb24661ed" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1202, + "sha256": "e8e5cfe08a4b632e336f346a6543a65c367441a8d55da4261c63e8bdb24661ed" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e8e5cfe08a4b632e336f346a6543a65c367441a8d55da4261c63e8bdb24661ed", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/assembly/sparse_assembler.h", + "fesa_dev": { + "source_path": "include/fesa/assembly/sparse_assembler.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fe1103f6b740f4c0b8ddb48c3d1255507aec67ad", + "mode": "100644", + "size_bytes": 1697, + "sha256": "ed28f761a15a2c9d9614439c011c7f4164ab2828dfc4bc94b599bf12727bdf17" + }, + "working_tree": { + "exists": true, + "size_bytes": 1737, + "sha256": "7b4c7453126b94dd70206a8ac9b68f9477603765f412c1a0b51a5fba3f0dbbbc" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/assembly/sparse_assembler.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fe1103f6b740f4c0b8ddb48c3d1255507aec67ad", + "mode": "100644", + "size_bytes": 1697, + "sha256": "ed28f761a15a2c9d9614439c011c7f4164ab2828dfc4bc94b599bf12727bdf17" + }, + "working_tree": { + "exists": true, + "size_bytes": 1737, + "sha256": "7b4c7453126b94dd70206a8ac9b68f9477603765f412c1a0b51a5fba3f0dbbbc" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1737, + "sha256": "7b4c7453126b94dd70206a8ac9b68f9477603765f412c1a0b51a5fba3f0dbbbc" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7b4c7453126b94dd70206a8ac9b68f9477603765f412c1a0b51a5fba3f0dbbbc", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/assembly/surface_pressure_assembler.h", + "fesa_dev": { + "source_path": "include/fesa/assembly/surface_pressure_assembler.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7d86721bcc112c975d2a908f386dc1dfa4a5ed98", + "mode": "100644", + "size_bytes": 1764, + "sha256": "060b90ab5069190aa7d14c6a889804e1fc0d31135d08a3bc3e96deec86dffdf7" + }, + "working_tree": { + "exists": true, + "size_bytes": 1806, + "sha256": "55280250549b42896d95e03423c2035a607cbccc88eaa3220a3fb0135335d737" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/assembly/surface_pressure_assembler.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7d86721bcc112c975d2a908f386dc1dfa4a5ed98", + "mode": "100644", + "size_bytes": 1764, + "sha256": "060b90ab5069190aa7d14c6a889804e1fc0d31135d08a3bc3e96deec86dffdf7" + }, + "working_tree": { + "exists": true, + "size_bytes": 1806, + "sha256": "55280250549b42896d95e03423c2035a607cbccc88eaa3220a3fb0135335d737" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1806, + "sha256": "55280250549b42896d95e03423c2035a607cbccc88eaa3220a3fb0135335d737" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "55280250549b42896d95e03423c2035a607cbccc88eaa3220a3fb0135335d737", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/assembly/thermal_assembler.h", + "fesa_dev": { + "source_path": "include/fesa/assembly/thermal_assembler.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "20759871b60ecbf9cdda8d489ad185f8c11df5a2", + "mode": "100644", + "size_bytes": 3853, + "sha256": "e2bd69187a07507c388bb59a59ee7ffe8ccf1103ffb33f0c6b895960f20be507" + }, + "working_tree": { + "exists": true, + "size_bytes": 3940, + "sha256": "40770bbc1ae52052d9ca1a099a3f2636939ff50ec6c539436a1fe4f9bef08033" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/assembly/thermal_assembler.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "443f5e6673485c8f6d9ca69b57781981f3dd6009", + "mode": "100644", + "size_bytes": 4280, + "sha256": "4b77a0146fac138a6f860c18ddb85d4a807367c142ac3f35e99803d2838965ce" + }, + "working_tree": { + "exists": true, + "size_bytes": 4374, + "sha256": "2500005b6c0a8ddc84820d5e8b7ac27f160f6ce8d0772e27fec38787c7806766" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3940, + "sha256": "40770bbc1ae52052d9ca1a099a3f2636939ff50ec6c539436a1fe4f9bef08033" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2500005b6c0a8ddc84820d5e8b7ac27f160f6ce8d0772e27fec38787c7806766", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/build_info.h", + "fesa_dev": { + "source_path": "include/fesa/build_info.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9eb8a9732740cd5de894db2b68050ffa9e845505", + "mode": "100644", + "size_bytes": 266, + "sha256": "7bc4dfd8e0365ba31b454c6fc4d986db8477bd079f608f86880b690ccffb38de" + }, + "working_tree": { + "exists": true, + "size_bytes": 279, + "sha256": "828c23dbff20c3e8952bbf8e8f527140a2dec6854ef42fbe0902ba91dec8f17b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/build_info.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9eb8a9732740cd5de894db2b68050ffa9e845505", + "mode": "100644", + "size_bytes": 266, + "sha256": "7bc4dfd8e0365ba31b454c6fc4d986db8477bd079f608f86880b690ccffb38de" + }, + "working_tree": { + "exists": true, + "size_bytes": 279, + "sha256": "828c23dbff20c3e8952bbf8e8f527140a2dec6854ef42fbe0902ba91dec8f17b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 279, + "sha256": "828c23dbff20c3e8952bbf8e8f527140a2dec6854ef42fbe0902ba91dec8f17b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "828c23dbff20c3e8952bbf8e8f527140a2dec6854ef42fbe0902ba91dec8f17b", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/constraints/boundary_condition.h", + "fesa_dev": { + "source_path": "include/fesa/constraints/boundary_condition.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5605f2121a4b9af27711b75f06dcd195166e9cdc", + "mode": "100644", + "size_bytes": 2230, + "sha256": "476f9c1cdc09c6aa30a1380eec708600fbb78d6b91fdb593f63606319246faf9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2301, + "sha256": "75e1d103d73486a760520ac2cd0c774b66813a3e09bfeb13c79dad1feca80b29" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/constraints/boundary_condition.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5605f2121a4b9af27711b75f06dcd195166e9cdc", + "mode": "100644", + "size_bytes": 2230, + "sha256": "476f9c1cdc09c6aa30a1380eec708600fbb78d6b91fdb593f63606319246faf9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2301, + "sha256": "75e1d103d73486a760520ac2cd0c774b66813a3e09bfeb13c79dad1feca80b29" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2301, + "sha256": "75e1d103d73486a760520ac2cd0c774b66813a3e09bfeb13c79dad1feca80b29" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "75e1d103d73486a760520ac2cd0c774b66813a3e09bfeb13c79dad1feca80b29", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/constraints/essential_constraint_policy.h", + "fesa_dev": { + "source_path": "include/fesa/constraints/essential_constraint_policy.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a947f50c7ff866163bd302a7b7be68ab367e0ff8", + "mode": "100644", + "size_bytes": 1463, + "sha256": "98863b3e801ff088f897e17d1f74b6b384b1b60bb2d63eb28da87b097ebbe71e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1506, + "sha256": "2f1c41393ba515a02caf90671e8e7452d07b2abe8c5787fc7dca9a302b9acaf1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/constraints/essential_constraint_policy.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1659c8da3e2a513b541e5f432183e95a913aab33", + "mode": "100644", + "size_bytes": 2063, + "sha256": "a0ecd637eb174f6f64330d6ed0bb03dea040733a05208caa5462daf246d0e4c3" + }, + "working_tree": { + "exists": true, + "size_bytes": 2116, + "sha256": "c1852e182cc6ca402ffc86fe84d4e9cfe41e4283a88b1436ee29fb4836b293c1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1506, + "sha256": "2f1c41393ba515a02caf90671e8e7452d07b2abe8c5787fc7dca9a302b9acaf1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c1852e182cc6ca402ffc86fe84d4e9cfe41e4283a88b1436ee29fb4836b293c1", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/constraints/prescribed_displacement.h", + "fesa_dev": { + "source_path": "include/fesa/constraints/prescribed_displacement.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e8995ceeec327740fe5bcb356036fb9a3f648399", + "mode": "100644", + "size_bytes": 1708, + "sha256": "7a4026b45b4e6b77614200f7344827b9c7b75e9b0eb54ab8578484b921f6a0cf" + }, + "working_tree": { + "exists": true, + "size_bytes": 1756, + "sha256": "be561c0006ce9ba8ca550f8a9a1cb21551eb4a11cc03f103ea341cff4a7df75f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/constraints/prescribed_displacement.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "58a40066c1ceb4566f77343299364589b5019f68", + "mode": "100644", + "size_bytes": 1719, + "sha256": "7ac53786741065a46d04f0e512a4f7149d6ea1ff9ae0fd63d251e3e18cf9fb36" + }, + "working_tree": { + "exists": true, + "size_bytes": 1767, + "sha256": "c7ee15ecade3e32a1bd9d025b62dbf15030c3655f526ccc7ea728f486d51a713" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1756, + "sha256": "be561c0006ce9ba8ca550f8a9a1cb21551eb4a11cc03f103ea341cff4a7df75f" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c7ee15ecade3e32a1bd9d025b62dbf15030c3655f526ccc7ea728f486d51a713", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/core/ascii.h", + "fesa_dev": { + "source_path": "include/fesa/core/ascii.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3fcb7ea9f0df1eb6ea2d6a12072c817069dd92a9", + "mode": "100644", + "size_bytes": 881, + "sha256": "6c4d75ff264b9e095f8b1206259a06e04c909182e02875907f6e1bab059e6084" + }, + "working_tree": { + "exists": true, + "size_bytes": 909, + "sha256": "febc57c9795882ec62f866254ec0bede935a45e12d44fcac2598a1b65bda969d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/core/ascii.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2072c052130bb67a7f372cb02dfd4e26f8041487", + "mode": "100644", + "size_bytes": 1114, + "sha256": "e4f9f1c5d9924ff3611b84880505483b85cf74329ccc2eb19a6823e238de9dc3" + }, + "working_tree": { + "exists": true, + "size_bytes": 1148, + "sha256": "520c5f1622c36224d502ddcf43689c8abe4dd05bd65a64f33cedcbbe9a17797f" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 909, + "sha256": "febc57c9795882ec62f866254ec0bede935a45e12d44fcac2598a1b65bda969d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "520c5f1622c36224d502ddcf43689c8abe4dd05bd65a64f33cedcbbe9a17797f", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/core/diagnostic.h", + "fesa_dev": { + "source_path": "include/fesa/core/diagnostic.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cd685f4ee408a45092f24dcbd5b173f6d771ef34", + "mode": "100644", + "size_bytes": 832, + "sha256": "11d31eb3163d339dfbc44e2950dbd3159e1f9e28a052fe20fbfc737e716c80b7" + }, + "working_tree": { + "exists": true, + "size_bytes": 863, + "sha256": "e5f52e6d6c92dd1324bd6df0c7ea1e3af44b6691d13d2834024cbfbe9ee89c34" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/core/diagnostic.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cd685f4ee408a45092f24dcbd5b173f6d771ef34", + "mode": "100644", + "size_bytes": 832, + "sha256": "11d31eb3163d339dfbc44e2950dbd3159e1f9e28a052fe20fbfc737e716c80b7" + }, + "working_tree": { + "exists": true, + "size_bytes": 863, + "sha256": "e5f52e6d6c92dd1324bd6df0c7ea1e3af44b6691d13d2834024cbfbe9ee89c34" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 863, + "sha256": "e5f52e6d6c92dd1324bd6df0c7ea1e3af44b6691d13d2834024cbfbe9ee89c34" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e5f52e6d6c92dd1324bd6df0c7ea1e3af44b6691d13d2834024cbfbe9ee89c34", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/core/source_identity.h", + "fesa_dev": { + "source_path": "include/fesa/core/source_identity.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3890d79de68017de86370c4963bd48e01e51824d", + "mode": "100644", + "size_bytes": 698, + "sha256": "84f3eea9c6bb5d14132a098650110a501209dc5d112ae1081cbc11cb7dd5e7d8" + }, + "working_tree": { + "exists": true, + "size_bytes": 727, + "sha256": "a4e9d115d47cf19b6a1f6a0eba5f1f7e72c5baf5ca80878e6952594861c1cc00" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/core/source_identity.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "876e8a8317e158876f52e80c68a0066c79c0e2ae", + "mode": "100644", + "size_bytes": 1081, + "sha256": "d5b0397b26b98b15637b4d8f8d43cc6603212abb6ad798c6b08f091da784eb72" + }, + "working_tree": { + "exists": true, + "size_bytes": 1118, + "sha256": "88624b85c5b9b3025d36ca60aa6d2948805447d497d0400f113bbd6f5a6d9226" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 727, + "sha256": "a4e9d115d47cf19b6a1f6a0eba5f1f7e72c5baf5ca80878e6952594861c1cc00" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "88624b85c5b9b3025d36ca60aa6d2948805447d497d0400f113bbd6f5a6d9226", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/core/status.h", + "fesa_dev": { + "source_path": "include/fesa/core/status.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8476cc53c04c6c4109028caa0084ee7b846e1856", + "mode": "100644", + "size_bytes": 3626, + "sha256": "7a5daa4f431a5126db1efe6461c6c6b060809e70a25b3f2a9bd5d97ebdc3d5b0" + }, + "working_tree": { + "exists": true, + "size_bytes": 3740, + "sha256": "cbdc95b6f51ecc4a18956fa12b415280b6d660a2b50fe757425abcca8b95c8e1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/core/status.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b74e7d37ec3aa0bdc9ce1850d4f8e336d1f8352d", + "mode": "100644", + "size_bytes": 3630, + "sha256": "014c259f650d9529df292434453cbcc732af3a9a08de313d1bd8a07aef9e7c73" + }, + "working_tree": { + "exists": true, + "size_bytes": 3744, + "sha256": "87f804e4950639c3143b68945e9fb8f4796095f971e83d216cb1c9c054348d37" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3740, + "sha256": "cbdc95b6f51ecc4a18956fa12b415280b6d660a2b50fe757425abcca8b95c8e1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "87f804e4950639c3143b68945e9fb8f4796095f971e83d216cb1c9c054348d37", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/ds4_thermal.h", + "fesa_dev": { + "source_path": "include/fesa/elements/ds4_thermal.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "727a1c905cd4db0090d2d2b0279cd959a1e472ba", + "mode": "100644", + "size_bytes": 3188, + "sha256": "c0c8890f2acd84b37efd3429b2b7439355b4002b3e8c7d9fea32eda5f8f799b7" + }, + "working_tree": { + "exists": true, + "size_bytes": 3288, + "sha256": "37d9efdff7d44267a82493191ae229e264c1dd51850e7c0057f23ee9d6475e3e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/ds4_thermal.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "727a1c905cd4db0090d2d2b0279cd959a1e472ba", + "mode": "100644", + "size_bytes": 3188, + "sha256": "c0c8890f2acd84b37efd3429b2b7439355b4002b3e8c7d9fea32eda5f8f799b7" + }, + "working_tree": { + "exists": true, + "size_bytes": 3288, + "sha256": "37d9efdff7d44267a82493191ae229e264c1dd51850e7c0057f23ee9d6475e3e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3288, + "sha256": "37d9efdff7d44267a82493191ae229e264c1dd51850e7c0057f23ee9d6475e3e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "37d9efdff7d44267a82493191ae229e264c1dd51850e7c0057f23ee9d6475e3e", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/element.h", + "fesa_dev": { + "source_path": "include/fesa/elements/element.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c0a02d7a31ec6ee57c21c91057d948d23684be0d", + "mode": "100644", + "size_bytes": 2585, + "sha256": "f947cd102f39ebb04200db15154748055298f8764cb4b0e9577247fb332b2d68" + }, + "working_tree": { + "exists": true, + "size_bytes": 2672, + "sha256": "81867692e2cbf359d6345b90a162f0d68fc29a1838066efa1690bc51127a2a42" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/element.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5430172b0f5c43dfe4ac1307fd931deeeefbef36", + "mode": "100644", + "size_bytes": 1963, + "sha256": "75a0392980fe002de85b0ff4d5d20556daa383579a470a3ace8eb8e1a3f84f30" + }, + "working_tree": { + "exists": true, + "size_bytes": 2027, + "sha256": "3042b5d97d4dff58354d393d2ca54a0b3e37daf22d4955c40c1fd0cd89378c8a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2672, + "sha256": "81867692e2cbf359d6345b90a162f0d68fc29a1838066efa1690bc51127a2a42" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "3042b5d97d4dff58354d393d2ca54a0b3e37daf22d4955c40c1fd0cd89378c8a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/element_capabilities.h", + "refactor": { + "source_path": "include/fesa/elements/element_capabilities.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d6c610dfe278a618ee54ae5a3a97253d8a50cbdf", + "mode": "100644", + "size_bytes": 8516, + "sha256": "c03bff4301ca955cb58693edce5c3fb07f7d76aa8875c09fc28243f5c5a132b3" + }, + "working_tree": { + "exists": true, + "size_bytes": 8716, + "sha256": "a6dffad05713548237b571c728b8973bb6dfe6aca97e440262a259ff93963025" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a6dffad05713548237b571c728b8973bb6dfe6aca97e440262a259ff93963025", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/element_definition.h", + "fesa_dev": { + "source_path": "include/fesa/elements/element_definition.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5de8bb3c2dfad73d9aa983b02458c1f1c43e1991", + "mode": "100644", + "size_bytes": 1478, + "sha256": "ebbacf4751a88f1d1d1ed40fca4fff5b89531f842bbaf715429bbd6ad9e25824" + }, + "working_tree": { + "exists": true, + "size_bytes": 1525, + "sha256": "6b4a9f031837de253ffd3f3de95e179caaf56db85679b1e45d089e5c282e4be6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/element_definition.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5de8bb3c2dfad73d9aa983b02458c1f1c43e1991", + "mode": "100644", + "size_bytes": 1478, + "sha256": "ebbacf4751a88f1d1d1ed40fca4fff5b89531f842bbaf715429bbd6ad9e25824" + }, + "working_tree": { + "exists": true, + "size_bytes": 1525, + "sha256": "6b4a9f031837de253ffd3f3de95e179caaf56db85679b1e45d089e5c282e4be6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1525, + "sha256": "6b4a9f031837de253ffd3f3de95e179caaf56db85679b1e45d089e5c282e4be6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6b4a9f031837de253ffd3f3de95e179caaf56db85679b1e45d089e5c282e4be6", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/element_dof_layout.h", + "refactor": { + "source_path": "include/fesa/elements/element_dof_layout.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "15f8d9dc68fc32adb7581a094cb26112fdcb01bc", + "mode": "100644", + "size_bytes": 881, + "sha256": "88ed005765246e4f9eb34e9d11168bba639f8b610ddf1d711bc577f000f34afe" + }, + "working_tree": { + "exists": true, + "size_bytes": 919, + "sha256": "7d6182e3e3099d709736f8355fd9d0fa5b6e447bc3b1498b3ac6846e7c486cad" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7d6182e3e3099d709736f8355fd9d0fa5b6e447bc3b1498b3ac6846e7c486cad", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/element_factory.h", + "fesa_dev": { + "source_path": "include/fesa/elements/element_factory.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c33a3080a6f95509c30dbfd25072e849e196c9bb", + "mode": "100644", + "size_bytes": 1417, + "sha256": "b73a53ad5429a601fb8cf45c0e45d58285532a2353aa8722312890d38aabfd84" + }, + "working_tree": { + "exists": true, + "size_bytes": 1457, + "sha256": "8d072c8109490ef1dcea2c9a0fa108cf56124f41b4679a9bf72f72d2352b77e6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/element_factory.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "45867f34f4256f9aeddc9f549f0f739434032d08", + "mode": "100644", + "size_bytes": 1901, + "sha256": "b18ef8c1c7d402b759b2e8cbd1000c501a14599cc0b6c1aba23ec0ea5572c020" + }, + "working_tree": { + "exists": true, + "size_bytes": 1950, + "sha256": "19922d777601f6248ac0967f06e852128132300934bf22631e5995516a76c614" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1457, + "sha256": "8d072c8109490ef1dcea2c9a0fa108cf56124f41b4679a9bf72f72d2352b77e6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "19922d777601f6248ac0967f06e852128132300934bf22631e5995516a76c614", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/euler_beam_3d.h", + "fesa_dev": { + "source_path": "include/fesa/elements/euler_beam_3d.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cf917f671150d324b0dee073527aad60b6297f36", + "mode": "100644", + "size_bytes": 5661, + "sha256": "26c55c7015ffba299a18aff1c318d9ab29fc4b1e3bb7fab320e8f385241a7393" + }, + "working_tree": { + "exists": true, + "size_bytes": 5815, + "sha256": "d56bbf194142f61fa3485943b692f9773f25786bba45b7019e47717c935f0622" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/euler_beam_3d.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3d61ad15a93406ebcda7b469c38893d5a1fd66f1", + "mode": "100644", + "size_bytes": 4477, + "sha256": "25fad6622aaacde273ade855bcefc38dbe799a69ec37c1844a08db031b1495e1" + }, + "working_tree": { + "exists": true, + "size_bytes": 4598, + "sha256": "0e0c604dda5e4506f9e4f059f2067ad2ea02098f83f392df0f04540fc4267a97" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5815, + "sha256": "d56bbf194142f61fa3485943b692f9773f25786bba45b7019e47717c935f0622" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0e0c604dda5e4506f9e4f059f2067ad2ea02098f83f392df0f04540fc4267a97", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/euler_beam_3d_definition.h", + "refactor": { + "source_path": "include/fesa/elements/euler_beam_3d_definition.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b2391ecff414d888790eebfc8a30b93e76b7c2a1", + "mode": "100644", + "size_bytes": 1469, + "sha256": "2ccc7d076c603b4a374e1e14d384795c94a047b6f0ae6d16f163aa8d161065cf" + }, + "working_tree": { + "exists": true, + "size_bytes": 1517, + "sha256": "b01d20476b6121510c37904e80eea519f563fe700d287acf430ecff5cedd4c41" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b01d20476b6121510c37904e80eea519f563fe700d287acf430ecff5cedd4c41", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/finite_rotation.h", + "fesa_dev": { + "source_path": "include/fesa/elements/finite_rotation.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "29513b5086db8940442158f3a6bd5eb315869d01", + "mode": "100644", + "size_bytes": 2742, + "sha256": "9c2c5e52fbd04f3cb828bec4a8b4b4688d82023b93aa5ded57840dd6c4e21ae6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2805, + "sha256": "5f598c2e377a6b0f3c23b54ffa561b7e43acf5c0d761b60de51ac07f0c121cf9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/finite_rotation.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "19032c732f01a7fd66596280528be47686db0332", + "mode": "100644", + "size_bytes": 2957, + "sha256": "d9e2cff17581598f498f8d89f23c0e7a63863a5705c6c5a8d1708c56f1417799" + }, + "working_tree": { + "exists": true, + "size_bytes": 3022, + "sha256": "0cbaf90d353d7bcf62db1c81a7786c52e451eee00d36a45b1f81fc8aa81a2acb" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2805, + "sha256": "5f598c2e377a6b0f3c23b54ffa561b7e43acf5c0d761b60de51ac07f0c121cf9" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0cbaf90d353d7bcf62db1c81a7786c52e451eee00d36a45b1f81fc8aa81a2acb", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/hex8_definition.h", + "fesa_dev": { + "source_path": "include/fesa/elements/hex8_definition.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "80f27c536de91c820d280167a91c47113b40392a", + "mode": "100644", + "size_bytes": 2108, + "sha256": "f333dc5204d4788975a0da1b4f9de21acb8d0a34d5fe96960dd64e1c5f1a05e0" + }, + "working_tree": { + "exists": true, + "size_bytes": 2166, + "sha256": "daa3fb45c2ee5b1d0d703603a1a45325602d9d6ea5beb00b54413adad9c57f83" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/hex8_definition.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "80f27c536de91c820d280167a91c47113b40392a", + "mode": "100644", + "size_bytes": 2108, + "sha256": "f333dc5204d4788975a0da1b4f9de21acb8d0a34d5fe96960dd64e1c5f1a05e0" + }, + "working_tree": { + "exists": true, + "size_bytes": 2166, + "sha256": "daa3fb45c2ee5b1d0d703603a1a45325602d9d6ea5beb00b54413adad9c57f83" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2166, + "sha256": "daa3fb45c2ee5b1d0d703603a1a45325602d9d6ea5beb00b54413adad9c57f83" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "daa3fb45c2ee5b1d0d703603a1a45325602d9d6ea5beb00b54413adad9c57f83", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/hex8_element.h", + "fesa_dev": { + "source_path": "include/fesa/elements/hex8_element.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ebc6a7bcc787673303fa135a3485fa1da58f92f5", + "mode": "100644", + "size_bytes": 5191, + "sha256": "adb7b6fb0021340b1ffabb078bd33c2328106eb574e18616768e4ed4251c84a0" + }, + "working_tree": { + "exists": true, + "size_bytes": 5309, + "sha256": "ba517d7862b078f23d2596d86f1ba2087c5731408fa117adf992be98d1624dc3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/hex8_element.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ebc6a7bcc787673303fa135a3485fa1da58f92f5", + "mode": "100644", + "size_bytes": 5191, + "sha256": "adb7b6fb0021340b1ffabb078bd33c2328106eb574e18616768e4ed4251c84a0" + }, + "working_tree": { + "exists": true, + "size_bytes": 5309, + "sha256": "ba517d7862b078f23d2596d86f1ba2087c5731408fa117adf992be98d1624dc3" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5309, + "sha256": "ba517d7862b078f23d2596d86f1ba2087c5731408fa117adf992be98d1624dc3" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ba517d7862b078f23d2596d86f1ba2087c5731408fa117adf992be98d1624dc3", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/mitc4_shell.h", + "fesa_dev": { + "source_path": "include/fesa/elements/mitc4_shell.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ec16e5e32dbecde6a58156189585b0f6f0429dee", + "mode": "100644", + "size_bytes": 10007, + "sha256": "40531e12b0050ad9b828c96521d96d48ad30419a18e06451db0a3a86653b4dcc" + }, + "working_tree": { + "exists": true, + "size_bytes": 10268, + "sha256": "54ea1f953bbfe9a99be9d268efd386bfe8da6f7150bb2707a96dc076b2b0a539" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/mitc4_shell.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "36e954d131347202427a248d1f87e93668d155a9", + "mode": "100644", + "size_bytes": 8230, + "sha256": "a354f8cd81099f6410454b68d445929b9b1cfa7050b98b6df3ad439e49100eaa" + }, + "working_tree": { + "exists": true, + "size_bytes": 8445, + "sha256": "1cf73d6e2a1a75dcd8291071dc3cf52476294aa5b5b7cb5e9655725e8d621865" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10268, + "sha256": "54ea1f953bbfe9a99be9d268efd386bfe8da6f7150bb2707a96dc076b2b0a539" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1cf73d6e2a1a75dcd8291071dc3cf52476294aa5b5b7cb5e9655725e8d621865", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/mitc4_shell_definition.h", + "refactor": { + "source_path": "include/fesa/elements/mitc4_shell_definition.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f7a352fd42eae98c9d92c9f17b79499ebbc46885", + "mode": "100644", + "size_bytes": 2003, + "sha256": "7dfb61579a9faf25bf18d208365ee06f6cf14374db1090e9eeedc4af16fd2be9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2063, + "sha256": "0ce02c7ae496274ffcd613f89059baa55275c8f0254c7db7c1137716348c4ad5" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0ce02c7ae496274ffcd613f89059baa55275c8f0254c7db7c1137716348c4ad5", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/nonlinear_mitc4_inertia.h", + "fesa_dev": { + "source_path": "include/fesa/elements/nonlinear_mitc4_inertia.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "db7394053ff4a776e8434d66110fde8b0ee4013e", + "mode": "100644", + "size_bytes": 4271, + "sha256": "6b1f520eab7402a25e07b6d9558b0c25b29223708ecc89d04b11d23c0e6c367d" + }, + "working_tree": { + "exists": true, + "size_bytes": 4377, + "sha256": "77efbfe4236776f652010c739e39a8687a478e64e94091a0d86ec98b96f4c55d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/nonlinear_mitc4_inertia.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "db7394053ff4a776e8434d66110fde8b0ee4013e", + "mode": "100644", + "size_bytes": 4271, + "sha256": "6b1f520eab7402a25e07b6d9558b0c25b29223708ecc89d04b11d23c0e6c367d" + }, + "working_tree": { + "exists": true, + "size_bytes": 4377, + "sha256": "77efbfe4236776f652010c739e39a8687a478e64e94091a0d86ec98b96f4c55d" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4377, + "sha256": "77efbfe4236776f652010c739e39a8687a478e64e94091a0d86ec98b96f4c55d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "77efbfe4236776f652010c739e39a8687a478e64e94091a0d86ec98b96f4c55d", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/nonlinear_mitc4_shell.h", + "fesa_dev": { + "source_path": "include/fesa/elements/nonlinear_mitc4_shell.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4359400c6a75eba9c6ef7b5155eafc8bc21ee328", + "mode": "100644", + "size_bytes": 6981, + "sha256": "7e6e6b5cece2afbf69c20d3275fcb9007369f2bd46d9a790ad0cb2a7737488fb" + }, + "working_tree": { + "exists": true, + "size_bytes": 7145, + "sha256": "984ad13c87b021047ed9f2e7dfbd0ad5d783a8318f5c01557eb502ba1283c13e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/nonlinear_mitc4_shell.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4359400c6a75eba9c6ef7b5155eafc8bc21ee328", + "mode": "100644", + "size_bytes": 6981, + "sha256": "7e6e6b5cece2afbf69c20d3275fcb9007369f2bd46d9a790ad0cb2a7737488fb" + }, + "working_tree": { + "exists": true, + "size_bytes": 7145, + "sha256": "984ad13c87b021047ed9f2e7dfbd0ad5d783a8318f5c01557eb502ba1283c13e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7145, + "sha256": "984ad13c87b021047ed9f2e7dfbd0ad5d783a8318f5c01557eb502ba1283c13e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "984ad13c87b021047ed9f2e7dfbd0ad5d783a8318f5c01557eb502ba1283c13e", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/thermal_dof_component.h", + "refactor": { + "source_path": "include/fesa/elements/thermal_dof_component.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0d258981908d6e5e9779f771e38b9f2b58213b1c", + "mode": "100644", + "size_bytes": 454, + "sha256": "61fb739b2e8261aeea837394a12ce85e84e218268ddbc2ab1f6b7dc8557f6609" + }, + "working_tree": { + "exists": true, + "size_bytes": 474, + "sha256": "69a0517d9e8ffc1127aca278d8da38f87c17e30e8dcd3ca90dd9a2f84e7fd327" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "69a0517d9e8ffc1127aca278d8da38f87c17e30e8dcd3ca90dd9a2f84e7fd327", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/thermal_element_layout.h", + "fesa_dev": { + "source_path": "include/fesa/elements/thermal_element_layout.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d92b03e7b0af56a9774505aced42046e8554d9ff", + "mode": "100644", + "size_bytes": 639, + "sha256": "85d31706ad53b101da8ebb6abf975ab1bd04ba1502640b46dd26988299ded7fe" + }, + "working_tree": { + "exists": true, + "size_bytes": 661, + "sha256": "6b83aeb8fffb804bd684c550298bd5004c67ba4fca8f0700c79e7047e7fd7d2b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/thermal_element_layout.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4c3ce57582e96b4601037cd96128d6d83a8dc35c", + "mode": "100644", + "size_bytes": 691, + "sha256": "204489b540faaf07183dac3574883f6b2466f6e14491414a753d9a41ed8cdbcc" + }, + "working_tree": { + "exists": true, + "size_bytes": 714, + "sha256": "fee498c7d49ecaea798b7d3c60aa82c24cd04f427ca11d443f8cc600d45225b3" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 661, + "sha256": "6b83aeb8fffb804bd684c550298bd5004c67ba4fca8f0700c79e7047e7fd7d2b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "fee498c7d49ecaea798b7d3c60aa82c24cd04f427ca11d443f8cc600d45225b3", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/elements/thermal_shell.h", + "fesa_dev": { + "source_path": "include/fesa/elements/thermal_shell.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8bd11970d0e5dfff74d84a1a422f31c55f2ad1ba", + "mode": "100644", + "size_bytes": 3135, + "sha256": "c095ef147b5d17eaff89953ab02a20c6c9851cede7456498ba181dabdb121598" + }, + "working_tree": { + "exists": true, + "size_bytes": 3208, + "sha256": "89e0d4de26e7f3dcd6f2cc9b122714420274cf0d75d5515ef5c78deacb134bf6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/elements/thermal_shell.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8bd11970d0e5dfff74d84a1a422f31c55f2ad1ba", + "mode": "100644", + "size_bytes": 3135, + "sha256": "c095ef147b5d17eaff89953ab02a20c6c9851cede7456498ba181dabdb121598" + }, + "working_tree": { + "exists": true, + "size_bytes": 3208, + "sha256": "89e0d4de26e7f3dcd6f2cc9b122714420274cf0d75d5515ef5c78deacb134bf6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3208, + "sha256": "89e0d4de26e7f3dcd6f2cc9b122714420274cf0d75d5515ef5c78deacb134bf6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "89e0d4de26e7f3dcd6f2cc9b122714420274cf0d75d5515ef5c78deacb134bf6", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/fem/dof_manager.h", + "fesa_dev": { + "source_path": "include/fesa/fem/dof_manager.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "afb3703c1a0e2040251471044d9a1183518ec85c", + "mode": "100644", + "size_bytes": 5993, + "sha256": "548a1f6a9218aca0bfe2ad1dad152d58239bb017460f6f8c46ea9c4bc4bb07d0" + }, + "working_tree": { + "exists": true, + "size_bytes": 6124, + "sha256": "72760a6c0909f08e32482c6129937c9d3211ee0104efc570d8b20e2a35d397f7" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/fem/dof_manager.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bfc56f11088492784702597893368f9ea5449a0c", + "mode": "100644", + "size_bytes": 5858, + "sha256": "89f1c5487652df9e68fa86946772cdf7811d6a111e9e4cd968269f93727aeeea" + }, + "working_tree": { + "exists": true, + "size_bytes": 5984, + "sha256": "f7b374312434b931a3c9eeb5e48c0686a8c155e700a1ca17ff94cb066ac24159" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6124, + "sha256": "72760a6c0909f08e32482c6129937c9d3211ee0104efc570d8b20e2a35d397f7" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f7b374312434b931a3c9eeb5e48c0686a8c155e700a1ca17ff94cb066ac24159", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/abaqus/domain_mapper.h", + "fesa_dev": { + "source_path": "include/fesa/io/abaqus/domain_mapper.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9e6ec57f06a00cfcfa01c51064c44de7fb8ee348", + "mode": "100644", + "size_bytes": 800, + "sha256": "50d57121a256ba666aa370608b12c298fb9c7c1773f0144d1d2a85dac6eaaf42" + }, + "working_tree": { + "exists": true, + "size_bytes": 824, + "sha256": "566469c00568a30a37ab19de061e662e0f929a04d4684dda4aaa8a6e008ccf3c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/abaqus/domain_mapper.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9e6ec57f06a00cfcfa01c51064c44de7fb8ee348", + "mode": "100644", + "size_bytes": 800, + "sha256": "50d57121a256ba666aa370608b12c298fb9c7c1773f0144d1d2a85dac6eaaf42" + }, + "working_tree": { + "exists": true, + "size_bytes": 824, + "sha256": "566469c00568a30a37ab19de061e662e0f929a04d4684dda4aaa8a6e008ccf3c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 824, + "sha256": "566469c00568a30a37ab19de061e662e0f929a04d4684dda4aaa8a6e008ccf3c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "566469c00568a30a37ab19de061e662e0f929a04d4684dda4aaa8a6e008ccf3c", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/abaqus/input_reader.h", + "fesa_dev": { + "source_path": "include/fesa/io/abaqus/input_reader.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c5635a8d3319282661455129c35d8e9d97ec82b0", + "mode": "100644", + "size_bytes": 732, + "sha256": "959e5f237a4d3606547b6beb5bab15ad3578ff97b33434e4e05c18d5d1961749" + }, + "working_tree": { + "exists": true, + "size_bytes": 756, + "sha256": "bd4543cea36599ea92257c1e88cd4a77a9c9c5eb1192abcdcf6833dcac664bb5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/abaqus/input_reader.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c5635a8d3319282661455129c35d8e9d97ec82b0", + "mode": "100644", + "size_bytes": 732, + "sha256": "959e5f237a4d3606547b6beb5bab15ad3578ff97b33434e4e05c18d5d1961749" + }, + "working_tree": { + "exists": true, + "size_bytes": 756, + "sha256": "bd4543cea36599ea92257c1e88cd4a77a9c9c5eb1192abcdcf6833dcac664bb5" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 756, + "sha256": "bd4543cea36599ea92257c1e88cd4a77a9c9c5eb1192abcdcf6833dcac664bb5" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "bd4543cea36599ea92257c1e88cd4a77a9c9c5eb1192abcdcf6833dcac664bb5", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/abaqus/input_syntax.h", + "fesa_dev": { + "source_path": "include/fesa/io/abaqus/input_syntax.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "63db872d611baa5bb403839c1427f3816708856d", + "mode": "100644", + "size_bytes": 1211, + "sha256": "bffd205d16f845c0685d858dad31f77bda41c42814f970272444a5450bb23812" + }, + "working_tree": { + "exists": true, + "size_bytes": 1258, + "sha256": "3f0ca1ba9a387980eccb26dbd3a56218c615bd64308c4541f5a23676a3db0e01" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/abaqus/input_syntax.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "63db872d611baa5bb403839c1427f3816708856d", + "mode": "100644", + "size_bytes": 1211, + "sha256": "bffd205d16f845c0685d858dad31f77bda41c42814f970272444a5450bb23812" + }, + "working_tree": { + "exists": true, + "size_bytes": 1258, + "sha256": "3f0ca1ba9a387980eccb26dbd3a56218c615bd64308c4541f5a23676a3db0e01" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1258, + "sha256": "3f0ca1ba9a387980eccb26dbd3a56218c615bd64308c4541f5a23676a3db0e01" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "3f0ca1ba9a387980eccb26dbd3a56218c615bd64308c4541f5a23676a3db0e01", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/hdf5/dynamic_hdf5_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/io/hdf5/dynamic_hdf5_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "417cc20bed10bd4302c5b1b1f4965ab7b7c47bf2", + "mode": "100644", + "size_bytes": 792, + "sha256": "c471ca942773a0d348af5f3aea9ea2c1a08e092ddf7ee01bdb2f8834e01c0071" + }, + "working_tree": { + "exists": true, + "size_bytes": 811, + "sha256": "b563cc5101019fd08b217214fac93b633df290310f11a060f527e9139d98ed11" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/hdf5/dynamic_hdf5_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "417cc20bed10bd4302c5b1b1f4965ab7b7c47bf2", + "mode": "100644", + "size_bytes": 792, + "sha256": "c471ca942773a0d348af5f3aea9ea2c1a08e092ddf7ee01bdb2f8834e01c0071" + }, + "working_tree": { + "exists": true, + "size_bytes": 813, + "sha256": "94eefd90f976441d4b6ff5c636a9aceb83a5837a680af37e0061c0208f2aada0" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 813, + "sha256": "94eefd90f976441d4b6ff5c636a9aceb83a5837a680af37e0061c0208f2aada0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "94eefd90f976441d4b6ff5c636a9aceb83a5837a680af37e0061c0208f2aada0", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/hdf5/eigen_hdf5_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/io/hdf5/eigen_hdf5_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cc4d94ac0addc92c75c27e86a3b94930467a15d0", + "mode": "100644", + "size_bytes": 838, + "sha256": "0c239bdf7cc1d6d4fb879c06fe2dbe86f0a2126f08170c05fd36769ee579be61" + }, + "working_tree": { + "exists": true, + "size_bytes": 862, + "sha256": "43d0eab0f39eab6e1d5152d0c48083eef30bd1fc54a06ebf3889928decafbab5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/hdf5/eigen_hdf5_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cc4d94ac0addc92c75c27e86a3b94930467a15d0", + "mode": "100644", + "size_bytes": 838, + "sha256": "0c239bdf7cc1d6d4fb879c06fe2dbe86f0a2126f08170c05fd36769ee579be61" + }, + "working_tree": { + "exists": true, + "size_bytes": 862, + "sha256": "43d0eab0f39eab6e1d5152d0c48083eef30bd1fc54a06ebf3889928decafbab5" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 862, + "sha256": "43d0eab0f39eab6e1d5152d0c48083eef30bd1fc54a06ebf3889928decafbab5" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "43d0eab0f39eab6e1d5152d0c48083eef30bd1fc54a06ebf3889928decafbab5", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/hdf5/hdf5_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/io/hdf5/hdf5_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "dfed4f32d00583cbcf27d6fcdb53da83c30a306f", + "mode": "100644", + "size_bytes": 1143, + "sha256": "7a95ae8541507bd5b0ab23a1978c4a0b7b840ac9f98be01054b9398f234ba415" + }, + "working_tree": { + "exists": true, + "size_bytes": 1171, + "sha256": "0bdf904113abd95a2bac4580dbd716112651ec8ac77009316bae33e42bd2b24d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/hdf5/hdf5_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "dfed4f32d00583cbcf27d6fcdb53da83c30a306f", + "mode": "100644", + "size_bytes": 1143, + "sha256": "7a95ae8541507bd5b0ab23a1978c4a0b7b840ac9f98be01054b9398f234ba415" + }, + "working_tree": { + "exists": true, + "size_bytes": 1171, + "sha256": "0bdf904113abd95a2bac4580dbd716112651ec8ac77009316bae33e42bd2b24d" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1171, + "sha256": "0bdf904113abd95a2bac4580dbd716112651ec8ac77009316bae33e42bd2b24d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0bdf904113abd95a2bac4580dbd716112651ec8ac77009316bae33e42bd2b24d", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "691787a6f4be5c7df055cfa5397e0093deb0aeeb", + "mode": "100644", + "size_bytes": 931, + "sha256": "fecb29935ee294d99fedf06016019e43ba725606cf23e1d418a83e6bde768615" + }, + "working_tree": { + "exists": true, + "size_bytes": 953, + "sha256": "53029e79767849429117899efa855d70ab74901075cec317a7caf0175cc4a399" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "691787a6f4be5c7df055cfa5397e0093deb0aeeb", + "mode": "100644", + "size_bytes": 931, + "sha256": "fecb29935ee294d99fedf06016019e43ba725606cf23e1d418a83e6bde768615" + }, + "working_tree": { + "exists": true, + "size_bytes": 953, + "sha256": "53029e79767849429117899efa855d70ab74901075cec317a7caf0175cc4a399" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 953, + "sha256": "53029e79767849429117899efa855d70ab74901075cec317a7caf0175cc4a399" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "53029e79767849429117899efa855d70ab74901075cec317a7caf0175cc4a399", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/hdf5/solid_hdf5_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/io/hdf5/solid_hdf5_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "299cbc25c9f0968accbaa0787606ff94343bd10e", + "mode": "100644", + "size_bytes": 984, + "sha256": "36da3daaff85eac50e4bd9971ab507468e55946f9ef541a60a10314c17c8f014" + }, + "working_tree": { + "exists": true, + "size_bytes": 1005, + "sha256": "2081c4c40c0d8c9caf469c9848588b732b221c7c6d743c67ff59d2a714857006" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/hdf5/solid_hdf5_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "299cbc25c9f0968accbaa0787606ff94343bd10e", + "mode": "100644", + "size_bytes": 984, + "sha256": "36da3daaff85eac50e4bd9971ab507468e55946f9ef541a60a10314c17c8f014" + }, + "working_tree": { + "exists": true, + "size_bytes": 1005, + "sha256": "2081c4c40c0d8c9caf469c9848588b732b221c7c6d743c67ff59d2a714857006" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1005, + "sha256": "2081c4c40c0d8c9caf469c9848588b732b221c7c6d743c67ff59d2a714857006" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2081c4c40c0d8c9caf469c9848588b732b221c7c6d743c67ff59d2a714857006", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/io/hdf5/thermal_hdf5_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/io/hdf5/thermal_hdf5_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2bf3b8ddbf67879fc100984f7ec65b36d04ff1bd", + "mode": "100644", + "size_bytes": 761, + "sha256": "a25e4d3e6df7ff2abbbfe123f2142f05d8bab9f3ebd275733fb57a6acf57c077" + }, + "working_tree": { + "exists": true, + "size_bytes": 780, + "sha256": "9deaa76211f32fae7f0f38212770699dacdfc058da733bf597b18729fb92a5d1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/io/hdf5/thermal_hdf5_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2bf3b8ddbf67879fc100984f7ec65b36d04ff1bd", + "mode": "100644", + "size_bytes": 761, + "sha256": "a25e4d3e6df7ff2abbbfe123f2142f05d8bab9f3ebd275733fb57a6acf57c077" + }, + "working_tree": { + "exists": true, + "size_bytes": 780, + "sha256": "9deaa76211f32fae7f0f38212770699dacdfc058da733bf597b18729fb92a5d1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 780, + "sha256": "9deaa76211f32fae7f0f38212770699dacdfc058da733bf597b18729fb92a5d1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "9deaa76211f32fae7f0f38212770699dacdfc058da733bf597b18729fb92a5d1", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/loads/concentrated_nodal_load.h", + "fesa_dev": { + "source_path": "include/fesa/loads/concentrated_nodal_load.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ca5c5646b0bf231bac7ff78126d96648533212f7", + "mode": "100644", + "size_bytes": 2654, + "sha256": "e0cfff554d37f69da5c0041373e31151ffcb494572757a01a7ee4297f9fc4780" + }, + "working_tree": { + "exists": true, + "size_bytes": 2727, + "sha256": "e43057535d8604d797cd9365e4be0261d659a54c7210139ab593d9572ee63e24" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/loads/concentrated_nodal_load.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ca5c5646b0bf231bac7ff78126d96648533212f7", + "mode": "100644", + "size_bytes": 2654, + "sha256": "e0cfff554d37f69da5c0041373e31151ffcb494572757a01a7ee4297f9fc4780" + }, + "working_tree": { + "exists": true, + "size_bytes": 2727, + "sha256": "e43057535d8604d797cd9365e4be0261d659a54c7210139ab593d9572ee63e24" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2727, + "sha256": "e43057535d8604d797cd9365e4be0261d659a54c7210139ab593d9572ee63e24" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e43057535d8604d797cd9365e4be0261d659a54c7210139ab593d9572ee63e24", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/loads/load.h", + "fesa_dev": { + "source_path": "include/fesa/loads/load.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e212dff4c9c4517cc8aaf10a03253bd1b38d9bb8", + "mode": "100644", + "size_bytes": 1437, + "sha256": "3b6babaca4ea3b56e273ac4180767438d9057b8598cb3f0998b637837a293124" + }, + "working_tree": { + "exists": true, + "size_bytes": 1487, + "sha256": "09fee88d3161dfdcaa9e21d20d8da1ae1ad58e327435fdb4f71003a7bfa8503c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/loads/load.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e212dff4c9c4517cc8aaf10a03253bd1b38d9bb8", + "mode": "100644", + "size_bytes": 1437, + "sha256": "3b6babaca4ea3b56e273ac4180767438d9057b8598cb3f0998b637837a293124" + }, + "working_tree": { + "exists": true, + "size_bytes": 1487, + "sha256": "09fee88d3161dfdcaa9e21d20d8da1ae1ad58e327435fdb4f71003a7bfa8503c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1487, + "sha256": "09fee88d3161dfdcaa9e21d20d8da1ae1ad58e327435fdb4f71003a7bfa8503c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "09fee88d3161dfdcaa9e21d20d8da1ae1ad58e327435fdb4f71003a7bfa8503c", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/loads/shell_surface_pressure.h", + "fesa_dev": { + "source_path": "include/fesa/loads/shell_surface_pressure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "25f35ac7776d55ffa0da78bf88bc79a17f9818cd", + "mode": "100644", + "size_bytes": 1549, + "sha256": "28f5a942f52ccc20aec353b3affb174394623c9354da6053e97b3ed9f99f354c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1593, + "sha256": "18c18ac67e1b0f06507eeaf6736bcbe98e6da831b06f39a7d77ee207b8ce0f21" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/loads/shell_surface_pressure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "25f35ac7776d55ffa0da78bf88bc79a17f9818cd", + "mode": "100644", + "size_bytes": 1549, + "sha256": "28f5a942f52ccc20aec353b3affb174394623c9354da6053e97b3ed9f99f354c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1593, + "sha256": "18c18ac67e1b0f06507eeaf6736bcbe98e6da831b06f39a7d77ee207b8ce0f21" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1593, + "sha256": "18c18ac67e1b0f06507eeaf6736bcbe98e6da831b06f39a7d77ee207b8ce0f21" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "18c18ac67e1b0f06507eeaf6736bcbe98e6da831b06f39a7d77ee207b8ce0f21", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/materials/isotropic_linear_elastic_material.h", + "fesa_dev": { + "source_path": "include/fesa/materials/isotropic_linear_elastic_material.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9a4367b65196a7940a0732322e5f8efc27f54bd4", + "mode": "100644", + "size_bytes": 2988, + "sha256": "6b662f3ce5363c1eb6c7cb4eb80168303574f89c0b78878d3705e294b1c2a289" + }, + "working_tree": { + "exists": true, + "size_bytes": 3059, + "sha256": "91f5bf5e2519b4c70d8bb6e3d777a959add1fd1b9b50d2948eba0269cc5a2f62" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/materials/isotropic_linear_elastic_material.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9a4367b65196a7940a0732322e5f8efc27f54bd4", + "mode": "100644", + "size_bytes": 2988, + "sha256": "6b662f3ce5363c1eb6c7cb4eb80168303574f89c0b78878d3705e294b1c2a289" + }, + "working_tree": { + "exists": true, + "size_bytes": 3059, + "sha256": "91f5bf5e2519b4c70d8bb6e3d777a959add1fd1b9b50d2948eba0269cc5a2f62" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3059, + "sha256": "91f5bf5e2519b4c70d8bb6e3d777a959add1fd1b9b50d2948eba0269cc5a2f62" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "91f5bf5e2519b4c70d8bb6e3d777a959add1fd1b9b50d2948eba0269cc5a2f62", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/materials/isotropic_thermal_material.h", + "fesa_dev": { + "source_path": "include/fesa/materials/isotropic_thermal_material.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "561af16c210605eeeb9411424a115f6213adc5df", + "mode": "100644", + "size_bytes": 1689, + "sha256": "ed0e2b524e93950575e525940068126145f693186c1c78f0879486af39ac257d" + }, + "working_tree": { + "exists": true, + "size_bytes": 1737, + "sha256": "142ce86928036e9ca33e2677035ecdf4ab28190bec484a354703b2b3b606ca91" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/materials/isotropic_thermal_material.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "561af16c210605eeeb9411424a115f6213adc5df", + "mode": "100644", + "size_bytes": 1689, + "sha256": "ed0e2b524e93950575e525940068126145f693186c1c78f0879486af39ac257d" + }, + "working_tree": { + "exists": true, + "size_bytes": 1737, + "sha256": "142ce86928036e9ca33e2677035ecdf4ab28190bec484a354703b2b3b606ca91" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1737, + "sha256": "142ce86928036e9ca33e2677035ecdf4ab28190bec484a354703b2b3b606ca91" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "142ce86928036e9ca33e2677035ecdf4ab28190bec484a354703b2b3b606ca91", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/materials/material.h", + "fesa_dev": { + "source_path": "include/fesa/materials/material.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c93b46c21a4f2c1fdba7ba530d2fd4fd5c045691", + "mode": "100644", + "size_bytes": 836, + "sha256": "d974179fca88327d51d92047e19daa37deac1674951fe1ecd73e2c38e7c4ef45" + }, + "working_tree": { + "exists": true, + "size_bytes": 864, + "sha256": "82adaac6057450179526136e019df159c086a4728236d764e7455a8d88646ea4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/materials/material.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c93b46c21a4f2c1fdba7ba530d2fd4fd5c045691", + "mode": "100644", + "size_bytes": 836, + "sha256": "d974179fca88327d51d92047e19daa37deac1674951fe1ecd73e2c38e7c4ef45" + }, + "working_tree": { + "exists": true, + "size_bytes": 864, + "sha256": "82adaac6057450179526136e019df159c086a4728236d764e7455a8d88646ea4" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 864, + "sha256": "82adaac6057450179526136e019df159c086a4728236d764e7455a8d88646ea4" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "82adaac6057450179526136e019df159c086a4728236d764e7455a8d88646ea4", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/math/matrix.h", + "fesa_dev": { + "source_path": "include/fesa/math/matrix.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "af51673c0f5d2beb4224816a91cbeca9a918aae7", + "mode": "100644", + "size_bytes": 1897, + "sha256": "fd60a07e0c9e4bee22f234bcb7aad917bddfc7b7b94bca6ee362a39b01fe25a8" + }, + "working_tree": { + "exists": true, + "size_bytes": 1956, + "sha256": "6df69fe0ada766d3ed54bc85597549a6080919b6b4b2c8d19c148928a0c542eb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/math/matrix.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "da79076ddda5ec55e74be7cebe5f79a8b0ed1eb0", + "mode": "100644", + "size_bytes": 2795, + "sha256": "fd5dea2d7198e39fd11579bf89c0d88d3d44b17a25b87322da53ed9558eadda6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2874, + "sha256": "ae39f3c1ed16c3ed8b68efec897bb1c6a61d6492e22d85738648469f545fa916" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1956, + "sha256": "6df69fe0ada766d3ed54bc85597549a6080919b6b4b2c8d19c148928a0c542eb" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ae39f3c1ed16c3ed8b68efec897bb1c6a61d6492e22d85738648469f545fa916", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/math/sparse_matrix.h", + "fesa_dev": { + "source_path": "include/fesa/math/sparse_matrix.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1aabf2187317e496fb1e3e81624f7a438439e63a", + "mode": "100644", + "size_bytes": 2616, + "sha256": "958e9d905a9fd2501003ce9653ff3b80e3d0af0ec42061ab7b011ebb73e2be5e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2693, + "sha256": "e5070e0f2e6cef8d3600c2f53caca0104077351c75fb91ca821daf01e914a2e4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/math/sparse_matrix.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b3cbdd923a7bb2546a76dd950d73bd8bc7d23088", + "mode": "100644", + "size_bytes": 2631, + "sha256": "49e38c99f60b1bde93892a8ee35a34f692630ef7a1822848bcd948ebb6f076cb" + }, + "working_tree": { + "exists": true, + "size_bytes": 2707, + "sha256": "4629e887f953fa85568c7ff575907129811d431e7bd9584dbdcf631a41ec1afb" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2693, + "sha256": "e5070e0f2e6cef8d3600c2f53caca0104077351c75fb91ca821daf01e914a2e4" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "4629e887f953fa85568c7ff575907129811d431e7bd9584dbdcf631a41ec1afb", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/math/sparse_pattern.h", + "refactor": { + "source_path": "include/fesa/math/sparse_pattern.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b2e97743801f3b83dca2e6b02fe968e9ba56dd46", + "mode": "100644", + "size_bytes": 354, + "sha256": "60210c69e965d02e564a612b63cfc7bfc68aea7508fe859f46e472b78fb4528e" + }, + "working_tree": { + "exists": true, + "size_bytes": 372, + "sha256": "6b08b1bc23d79c47b9711d357b8d10335c9b9432c17cbe2efa8b12bcbf993054" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6b08b1bc23d79c47b9711d357b8d10335c9b9432c17cbe2efa8b12bcbf993054", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/math/vector.h", + "fesa_dev": { + "source_path": "include/fesa/math/vector.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "61715d4687f00a7f089741650a6b6e360cec4ada", + "mode": "100644", + "size_bytes": 1926, + "sha256": "1f4634e31205e16517c8e0ff5591066636509ddcf791457b79c1875cd063d96f" + }, + "working_tree": { + "exists": true, + "size_bytes": 1990, + "sha256": "8b42c3229093805c40f22e5f4ceeece03809b45dbe389079daf3b6d6a366bbde" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/math/vector.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "61715d4687f00a7f089741650a6b6e360cec4ada", + "mode": "100644", + "size_bytes": 1926, + "sha256": "1f4634e31205e16517c8e0ff5591066636509ddcf791457b79c1875cd063d96f" + }, + "working_tree": { + "exists": true, + "size_bytes": 1990, + "sha256": "8b42c3229093805c40f22e5f4ceeece03809b45dbe389079daf3b6d6a366bbde" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1990, + "sha256": "8b42c3229093805c40f22e5f4ceeece03809b45dbe389079daf3b6d6a366bbde" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "8b42c3229093805c40f22e5f4ceeece03809b45dbe389079daf3b6d6a366bbde", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/math/vector3.h", + "fesa_dev": { + "source_path": "include/fesa/math/vector3.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ae4e16e7be89fcaf897198e0dcea97950daf6185", + "mode": "100644", + "size_bytes": 4030, + "sha256": "240a277402273c6c9854987b5df7479f4fdef0797b773b69f8d12dd261281041" + }, + "working_tree": { + "exists": true, + "size_bytes": 4144, + "sha256": "6c7496bf7c196a5a447c6e632d0d585e4280639f6f97d9b6e4819940703d13cf" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/math/vector3.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ae4e16e7be89fcaf897198e0dcea97950daf6185", + "mode": "100644", + "size_bytes": 4030, + "sha256": "240a277402273c6c9854987b5df7479f4fdef0797b773b69f8d12dd261281041" + }, + "working_tree": { + "exists": true, + "size_bytes": 4144, + "sha256": "6c7496bf7c196a5a447c6e632d0d585e4280639f6f97d9b6e4819940703d13cf" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4144, + "sha256": "6c7496bf7c196a5a447c6e632d0d585e4280639f6f97d9b6e4819940703d13cf" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6c7496bf7c196a5a447c6e632d0d585e4280639f6f97d9b6e4819940703d13cf", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/model/domain.h", + "fesa_dev": { + "source_path": "include/fesa/model/domain.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "43f8a85b00433003cb61d448058143bbf665a5d7", + "mode": "100644", + "size_bytes": 12084, + "sha256": "ac533b318627af54ce0cdd5e1de68b0312455b14343e6e8ca451b2e177461366" + }, + "working_tree": { + "exists": true, + "size_bytes": 12382, + "sha256": "0b0ae444e1b86e71e4aa3e9459cd36b03181f9547eab600449a2e6d0a28781bb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/model/domain.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "54c8136cdde9f315dff38c3d03628da15bf6b89e", + "mode": "100644", + "size_bytes": 12178, + "sha256": "5754b99d760a5f811fdfb94324d0c85861e8722000410d02672c6d308e9b87b8" + }, + "working_tree": { + "exists": true, + "size_bytes": 12478, + "sha256": "34e58b0638248bc6b058ec11d81d27a8e9f597efb1bca4f313483c2912cc08c2" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12382, + "sha256": "0b0ae444e1b86e71e4aa3e9459cd36b03181f9547eab600449a2e6d0a28781bb" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "34e58b0638248bc6b058ec11d81d27a8e9f597efb1bca4f313483c2912cc08c2", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/model/model_types.h", + "fesa_dev": { + "source_path": "include/fesa/model/model_types.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "84e4bb95d9d336add80abb5bdd4951426024e85b", + "mode": "100644", + "size_bytes": 14962, + "sha256": "2ed333f8feb00bbac79c15256c05c6949367c1ec8bc73205fe250743edca20ef" + }, + "working_tree": { + "exists": true, + "size_bytes": 15398, + "sha256": "f667753748daf3f89b1a58b5c54198aa496c5ff2849f4050c720ca4daec99e92" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/model/model_types.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "88e8f7b7d5a3785faf3682683996fb76c8daa6b6", + "mode": "100644", + "size_bytes": 14672, + "sha256": "13f82568ad3c628a016c1fcc1a518c37b065dfeaf20dea6f2a756c3dcc2ec044" + }, + "working_tree": { + "exists": true, + "size_bytes": 15097, + "sha256": "b2179579e7cd16b590f97234b59c2ff93eedbd19d174665ee7baac3835d33404" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 15398, + "sha256": "f667753748daf3f89b1a58b5c54198aa496c5ff2849f4050c720ca4daec99e92" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b2179579e7cd16b590f97234b59c2ff93eedbd19d174665ee7baac3835d33404", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/model/shell_geometry.h", + "fesa_dev": { + "source_path": "include/fesa/model/shell_geometry.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7e26b568bce296a1fece33f7d0f6890d26ce44d3", + "mode": "100644", + "size_bytes": 1812, + "sha256": "cd802a57611195286824d99340346825f13f097e028fb12a12f0586c53b1193e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1865, + "sha256": "4efdf38a5a1da4ca3d4cc1ffa2a0454db58fec2445ded4ca41bb5d2373df3049" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/model/shell_geometry.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7e26b568bce296a1fece33f7d0f6890d26ce44d3", + "mode": "100644", + "size_bytes": 1812, + "sha256": "cd802a57611195286824d99340346825f13f097e028fb12a12f0586c53b1193e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1865, + "sha256": "4efdf38a5a1da4ca3d4cc1ffa2a0454db58fec2445ded4ca41bb5d2373df3049" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1865, + "sha256": "4efdf38a5a1da4ca3d4cc1ffa2a0454db58fec2445ded4ca41bb5d2373df3049" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "4efdf38a5a1da4ca3d4cc1ffa2a0454db58fec2445ded4ca41bb5d2373df3049", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/model/source_target_resolver.h", + "fesa_dev": { + "source_path": "include/fesa/model/source_target_resolver.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "197dbb187c132b3173b5f5e84c2e5479b5861927", + "mode": "100644", + "size_bytes": 2605, + "sha256": "5af45e23f6de3284003f87b53aae1ab156b53896c61acffd67320a58475d9313" + }, + "working_tree": { + "exists": true, + "size_bytes": 2686, + "sha256": "52e5faa473878a15e89bfcd4c201a4dd745b1b37c77ead4a356a17d647de0975" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/model/source_target_resolver.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "697e2e30f0e39c54138a642d54e23c567fa0ad26", + "mode": "100644", + "size_bytes": 3097, + "sha256": "8ae691399fb683074b7a7cc80afeb880c86ee62a97c3de7c3d6e98227af58a93" + }, + "working_tree": { + "exists": true, + "size_bytes": 3186, + "sha256": "f63f68354d3d8629d911598272e9b90b2201c8d5a7cb3abab2d53fc2ba97bc89" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2686, + "sha256": "52e5faa473878a15e89bfcd4c201a4dd745b1b37c77ead4a356a17d647de0975" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f63f68354d3d8629d911598272e9b90b2201c8d5a7cb3abab2d53fc2ba97bc89", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/properties/element_property.h", + "fesa_dev": { + "source_path": "include/fesa/properties/element_property.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0ad40ba5a0774d562be1307a5360bd756a28d68c", + "mode": "100644", + "size_bytes": 909, + "sha256": "3eeccf929a34af95994a2a0104d69ada7bdbb7a78692f09fda229273f3aef2da" + }, + "working_tree": { + "exists": true, + "size_bytes": 941, + "sha256": "cd7806d43a8cbad8329d63b3a4e693701256ccc8042e6862a9e0a11d885229f6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/properties/element_property.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0ad40ba5a0774d562be1307a5360bd756a28d68c", + "mode": "100644", + "size_bytes": 909, + "sha256": "3eeccf929a34af95994a2a0104d69ada7bdbb7a78692f09fda229273f3aef2da" + }, + "working_tree": { + "exists": true, + "size_bytes": 941, + "sha256": "cd7806d43a8cbad8329d63b3a4e693701256ccc8042e6862a9e0a11d885229f6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 941, + "sha256": "cd7806d43a8cbad8329d63b3a4e693701256ccc8042e6862a9e0a11d885229f6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "cd7806d43a8cbad8329d63b3a4e693701256ccc8042e6862a9e0a11d885229f6", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/properties/general_beam_section.h", + "fesa_dev": { + "source_path": "include/fesa/properties/general_beam_section.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7fdeeb416a2edb99b352d9cafd6e751ba426c779", + "mode": "100644", + "size_bytes": 3362, + "sha256": "36be8f1653d47650c49ac561e30fa59ca5d93e46742fbc7a9f4bac54c37ebd69" + }, + "working_tree": { + "exists": true, + "size_bytes": 3445, + "sha256": "773e8310785fd29707b724925580d8ea35f1200692ee398cbb779b933161643b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/properties/general_beam_section.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7fdeeb416a2edb99b352d9cafd6e751ba426c779", + "mode": "100644", + "size_bytes": 3362, + "sha256": "36be8f1653d47650c49ac561e30fa59ca5d93e46742fbc7a9f4bac54c37ebd69" + }, + "working_tree": { + "exists": true, + "size_bytes": 3445, + "sha256": "773e8310785fd29707b724925580d8ea35f1200692ee398cbb779b933161643b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3445, + "sha256": "773e8310785fd29707b724925580d8ea35f1200692ee398cbb779b933161643b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "773e8310785fd29707b724925580d8ea35f1200692ee398cbb779b933161643b", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/properties/shell_section.h", + "fesa_dev": { + "source_path": "include/fesa/properties/shell_section.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "890fd11f00966f86186dee0fdd57ccc809ab8c4b", + "mode": "100644", + "size_bytes": 2190, + "sha256": "5c21467d5145abd478885d2498a715c4df702fc75044c85c57d442467e0736e9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2247, + "sha256": "0c3af7fc5cda72282b0a6ad7977121d2cdac9482f41a3fda198eeef182a95f95" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/properties/shell_section.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "890fd11f00966f86186dee0fdd57ccc809ab8c4b", + "mode": "100644", + "size_bytes": 2190, + "sha256": "5c21467d5145abd478885d2498a715c4df702fc75044c85c57d442467e0736e9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2247, + "sha256": "0c3af7fc5cda72282b0a6ad7977121d2cdac9482f41a3fda198eeef182a95f95" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2247, + "sha256": "0c3af7fc5cda72282b0a6ad7977121d2cdac9482f41a3fda198eeef182a95f95" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0c3af7fc5cda72282b0a6ad7977121d2cdac9482f41a3fda198eeef182a95f95", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/properties/solid_section.h", + "fesa_dev": { + "source_path": "include/fesa/properties/solid_section.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fafe643189fdfbac9460fbcc66aeee86b185c116", + "mode": "100644", + "size_bytes": 1373, + "sha256": "b78aac384a33a80af965e78ed58ae80f986f67062a056f869e256cac24dc36b7" + }, + "working_tree": { + "exists": true, + "size_bytes": 1412, + "sha256": "259859794ca6ac022da7aee01ad816c8cc7e6dc0c13a4ceb0c9c5ceef86a8625" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/properties/solid_section.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fafe643189fdfbac9460fbcc66aeee86b185c116", + "mode": "100644", + "size_bytes": 1373, + "sha256": "b78aac384a33a80af965e78ed58ae80f986f67062a056f869e256cac24dc36b7" + }, + "working_tree": { + "exists": true, + "size_bytes": 1412, + "sha256": "259859794ca6ac022da7aee01ad816c8cc7e6dc0c13a4ceb0c9c5ceef86a8625" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1412, + "sha256": "259859794ca6ac022da7aee01ad816c8cc7e6dc0c13a4ceb0c9c5ceef86a8625" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "259859794ca6ac022da7aee01ad816c8cc7e6dc0c13a4ceb0c9c5ceef86a8625", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/dynamic_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/results/dynamic_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "07c603d0241023b148ebba34abd96ea0fa286ce3", + "mode": "100644", + "size_bytes": 817, + "sha256": "86313d7498a496257ecdbe130f61018468adb50cbbe128132f281abb95dfb3d7" + }, + "working_tree": { + "exists": true, + "size_bytes": 845, + "sha256": "663f1f9ecf26e67b24338cc4e8e9e5ddbc704bd09857c46c99734457462067ef" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/dynamic_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "07c603d0241023b148ebba34abd96ea0fa286ce3", + "mode": "100644", + "size_bytes": 817, + "sha256": "86313d7498a496257ecdbe130f61018468adb50cbbe128132f281abb95dfb3d7" + }, + "working_tree": { + "exists": true, + "size_bytes": 845, + "sha256": "663f1f9ecf26e67b24338cc4e8e9e5ddbc704bd09857c46c99734457462067ef" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 845, + "sha256": "663f1f9ecf26e67b24338cc4e8e9e5ddbc704bd09857c46c99734457462067ef" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "663f1f9ecf26e67b24338cc4e8e9e5ddbc704bd09857c46c99734457462067ef", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/eigen_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/results/eigen_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "64e8d4aa8e13860fb480f200084eb814c4dcfe3b", + "mode": "100644", + "size_bytes": 878, + "sha256": "2e248416d6bd68f0c2923878f5121c64c00da1b3e4819d0954f78efe46d41c60" + }, + "working_tree": { + "exists": true, + "size_bytes": 907, + "sha256": "c2273ba002eef83d851fb16d5bca47fe3c3c63d63c56634a579322aa4426e6ae" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/eigen_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "64e8d4aa8e13860fb480f200084eb814c4dcfe3b", + "mode": "100644", + "size_bytes": 878, + "sha256": "2e248416d6bd68f0c2923878f5121c64c00da1b3e4819d0954f78efe46d41c60" + }, + "working_tree": { + "exists": true, + "size_bytes": 907, + "sha256": "c2273ba002eef83d851fb16d5bca47fe3c3c63d63c56634a579322aa4426e6ae" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 907, + "sha256": "c2273ba002eef83d851fb16d5bca47fe3c3c63d63c56634a579322aa4426e6ae" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c2273ba002eef83d851fb16d5bca47fe3c3c63d63c56634a579322aa4426e6ae", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/nonlinear_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/results/nonlinear_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "841c16dd9b4f1f4da5558099e40a29523d7effcb", + "mode": "100644", + "size_bytes": 1213, + "sha256": "60b5297be0b93b3390d0c2c81026eaa819cef24f520815003cf7939eefbdb33c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1246, + "sha256": "af86ad310b6f90728fbcb61763f80d70f64f6b201401b84054796dfbbce69a25" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/nonlinear_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "841c16dd9b4f1f4da5558099e40a29523d7effcb", + "mode": "100644", + "size_bytes": 1213, + "sha256": "60b5297be0b93b3390d0c2c81026eaa819cef24f520815003cf7939eefbdb33c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1246, + "sha256": "af86ad310b6f90728fbcb61763f80d70f64f6b201401b84054796dfbbce69a25" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1246, + "sha256": "af86ad310b6f90728fbcb61763f80d70f64f6b201401b84054796dfbbce69a25" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "af86ad310b6f90728fbcb61763f80d70f64f6b201401b84054796dfbbce69a25", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/prepared_results_writer.h", + "refactor": { + "source_path": "include/fesa/results/prepared_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6f495683c706176945b098e78f4084f475f17b60", + "mode": "100644", + "size_bytes": 1534, + "sha256": "c2aa0e750a6f48afb68ba7a1e2b0a60bbec7f5c8fdcfd76170c2ed018fa2fa3d" + }, + "working_tree": { + "exists": true, + "size_bytes": 1573, + "sha256": "61d255d8aad845e2224a5ce1095b2162009b5a0a43742ebcab61e899a6c9e155" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "61d255d8aad845e2224a5ce1095b2162009b5a0a43742ebcab61e899a6c9e155", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/result_records.h", + "fesa_dev": { + "source_path": "include/fesa/results/result_records.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c1a58481088552a8f71d3bf5c8be61b55dc65e61", + "mode": "100644", + "size_bytes": 2435, + "sha256": "399bcb6ef7ac7790be490a16d4dbf48343296312aa972fb72bffcd2506f3ee46" + }, + "working_tree": { + "exists": true, + "size_bytes": 2521, + "sha256": "0556d284df3a9a276f58fcb9f470154c927b69261c860ae8f791086326521233" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/result_records.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c1a58481088552a8f71d3bf5c8be61b55dc65e61", + "mode": "100644", + "size_bytes": 2435, + "sha256": "399bcb6ef7ac7790be490a16d4dbf48343296312aa972fb72bffcd2506f3ee46" + }, + "working_tree": { + "exists": true, + "size_bytes": 2521, + "sha256": "0556d284df3a9a276f58fcb9f470154c927b69261c860ae8f791086326521233" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2521, + "sha256": "0556d284df3a9a276f58fcb9f470154c927b69261c860ae8f791086326521233" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0556d284df3a9a276f58fcb9f470154c927b69261c860ae8f791086326521233", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/result_recovery.h", + "fesa_dev": { + "source_path": "include/fesa/results/result_recovery.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d9ac6de7c295b2ae271da037448a7e8cc807a9af", + "mode": "100644", + "size_bytes": 2697, + "sha256": "8737a9664b8a6cc566b2edca3e4c796d8807381d23560860260a7869dd23b6ba" + }, + "working_tree": { + "exists": true, + "size_bytes": 2760, + "sha256": "812bc148586faa45671cfbca0d003b33294f29a36fbb885dd20f863634028f42" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/result_recovery.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d9ac6de7c295b2ae271da037448a7e8cc807a9af", + "mode": "100644", + "size_bytes": 2697, + "sha256": "8737a9664b8a6cc566b2edca3e4c796d8807381d23560860260a7869dd23b6ba" + }, + "working_tree": { + "exists": true, + "size_bytes": 2760, + "sha256": "812bc148586faa45671cfbca0d003b33294f29a36fbb885dd20f863634028f42" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2760, + "sha256": "812bc148586faa45671cfbca0d003b33294f29a36fbb885dd20f863634028f42" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "812bc148586faa45671cfbca0d003b33294f29a36fbb885dd20f863634028f42", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/results/results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d22755482f4196bf0e61b6b266f1aeb94219afa5", + "mode": "100644", + "size_bytes": 828, + "sha256": "9ae7c7c7d667a4562d9ab6ac50b34e4f3909a89dc6ecfa30071cb1a63acebe49" + }, + "working_tree": { + "exists": true, + "size_bytes": 856, + "sha256": "cded14565a889f90c1cbd79762f59034acb3b028bb312d6df105a215ebf183a9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d22755482f4196bf0e61b6b266f1aeb94219afa5", + "mode": "100644", + "size_bytes": 828, + "sha256": "9ae7c7c7d667a4562d9ab6ac50b34e4f3909a89dc6ecfa30071cb1a63acebe49" + }, + "working_tree": { + "exists": true, + "size_bytes": 856, + "sha256": "cded14565a889f90c1cbd79762f59034acb3b028bb312d6df105a215ebf183a9" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 856, + "sha256": "cded14565a889f90c1cbd79762f59034acb3b028bb312d6df105a215ebf183a9" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "cded14565a889f90c1cbd79762f59034acb3b028bb312d6df105a215ebf183a9", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/solid_result_records.h", + "fesa_dev": { + "source_path": "include/fesa/results/solid_result_records.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e5028acb82409796c7f81d21515b43c4215e5be7", + "mode": "100644", + "size_bytes": 925, + "sha256": "4860253936da8ef13ddbbabb65b37d0d8fcf934e95bd331bfef7f2be8feb17dd" + }, + "working_tree": { + "exists": true, + "size_bytes": 956, + "sha256": "a4f6a0825b2683da20e56006e6d032c7c94dfab4d8e6b9aae9269a459a702a4c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/solid_result_records.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e5028acb82409796c7f81d21515b43c4215e5be7", + "mode": "100644", + "size_bytes": 925, + "sha256": "4860253936da8ef13ddbbabb65b37d0d8fcf934e95bd331bfef7f2be8feb17dd" + }, + "working_tree": { + "exists": true, + "size_bytes": 956, + "sha256": "a4f6a0825b2683da20e56006e6d032c7c94dfab4d8e6b9aae9269a459a702a4c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 956, + "sha256": "a4f6a0825b2683da20e56006e6d032c7c94dfab4d8e6b9aae9269a459a702a4c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a4f6a0825b2683da20e56006e6d032c7c94dfab4d8e6b9aae9269a459a702a4c", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/solid_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/results/solid_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "45039fde894514107d48b48165c9606013cfeead", + "mode": "100644", + "size_bytes": 1429, + "sha256": "a996d407fb043d4e858e87d3c3f47cf5a20e9f0c85f68d4d923fb218dc84ebba" + }, + "working_tree": { + "exists": true, + "size_bytes": 1462, + "sha256": "8ecb20c3af801d4931fba64827eb98cedf0a0e5bde901dd83f218ae199d68a68" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/solid_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "45039fde894514107d48b48165c9606013cfeead", + "mode": "100644", + "size_bytes": 1429, + "sha256": "a996d407fb043d4e858e87d3c3f47cf5a20e9f0c85f68d4d923fb218dc84ebba" + }, + "working_tree": { + "exists": true, + "size_bytes": 1462, + "sha256": "8ecb20c3af801d4931fba64827eb98cedf0a0e5bde901dd83f218ae199d68a68" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1462, + "sha256": "8ecb20c3af801d4931fba64827eb98cedf0a0e5bde901dd83f218ae199d68a68" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "8ecb20c3af801d4931fba64827eb98cedf0a0e5bde901dd83f218ae199d68a68", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/thermal_result_records.h", + "fesa_dev": { + "source_path": "include/fesa/results/thermal_result_records.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "dcc5119a1a416b04ffba23b8d63b154ff2b49b23", + "mode": "100644", + "size_bytes": 1733, + "sha256": "92c20fa95608cddb7ddb0580bf8e66f08007056bedf8986d02187cc17dbd312e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1786, + "sha256": "40a952f61109804a048cc8df5fa6f23360757c7c20f631d3165a64d13b550af5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/thermal_result_records.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "dcc5119a1a416b04ffba23b8d63b154ff2b49b23", + "mode": "100644", + "size_bytes": 1733, + "sha256": "92c20fa95608cddb7ddb0580bf8e66f08007056bedf8986d02187cc17dbd312e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1786, + "sha256": "40a952f61109804a048cc8df5fa6f23360757c7c20f631d3165a64d13b550af5" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1786, + "sha256": "40a952f61109804a048cc8df5fa6f23360757c7c20f631d3165a64d13b550af5" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "40a952f61109804a048cc8df5fa6f23360757c7c20f631d3165a64d13b550af5", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/results/thermal_results_writer.h", + "fesa_dev": { + "source_path": "include/fesa/results/thermal_results_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0db642ae61d057b62174f6046dcf46ee9be79787", + "mode": "100644", + "size_bytes": 870, + "sha256": "1c28ea40c286a938dcaebb476ce95e892ee14fbfc8dda4872d19b441150d6ce3" + }, + "working_tree": { + "exists": true, + "size_bytes": 896, + "sha256": "fdb42f1bd4708873f5c05affd17249b5973d5bf09ebbebda75a9fcf5b631e753" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/results/thermal_results_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0db642ae61d057b62174f6046dcf46ee9be79787", + "mode": "100644", + "size_bytes": 870, + "sha256": "1c28ea40c286a938dcaebb476ce95e892ee14fbfc8dda4872d19b441150d6ce3" + }, + "working_tree": { + "exists": true, + "size_bytes": 896, + "sha256": "fdb42f1bd4708873f5c05affd17249b5973d5bf09ebbebda75a9fcf5b631e753" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 896, + "sha256": "fdb42f1bd4708873f5c05affd17249b5973d5bf09ebbebda75a9fcf5b631e753" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "fdb42f1bd4708873f5c05affd17249b5973d5bf09ebbebda75a9fcf5b631e753", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/solvers/eigen/eigen_solver.h", + "refactor": { + "source_path": "include/fesa/solvers/eigen/eigen_solver.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ecfb8e7f844d6b0f6c3edee5ed4dd950933babd0", + "mode": "100644", + "size_bytes": 3258, + "sha256": "c3896f6f0985751a3080c8372a6998268427f53107173ab092491fec890365bd" + }, + "working_tree": { + "exists": true, + "size_bytes": 3357, + "sha256": "2e4234769aafa9ea700bf1ff553aebdac4a135240d19f70063a4898cb0bfe32c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2e4234769aafa9ea700bf1ff553aebdac4a135240d19f70063a4898cb0bfe32c", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/solvers/eigen/mkl_feast_eigen_solver.h", + "fesa_dev": { + "source_path": "include/fesa/solvers/eigen/mkl_feast_eigen_solver.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3e13447c628ae7f926d57171f4740ceb0358fe06", + "mode": "100644", + "size_bytes": 3840, + "sha256": "79634deee2420c446d0ce092a9da8803f3bf9efd80bcba7b0791686388c40a1b" + }, + "working_tree": { + "exists": true, + "size_bytes": 3945, + "sha256": "af1550d9eea9e93c3944925bc4f8a5b450f850cb5678ba76c38d69a3dd93d220" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/solvers/eigen/mkl_feast_eigen_solver.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "029bc5f38b3832465fa3135da3f6a34d7f8c50d4", + "mode": "100644", + "size_bytes": 2564, + "sha256": "c51fd58469c51e5c9fd56a4e8bd786ac5c124269811e79739305353519ef2908" + }, + "working_tree": { + "exists": true, + "size_bytes": 2616, + "sha256": "072bdc1aa46fb64d231d9fe1a88fa98bebbe4060fb5010787858f881ce03df8a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3945, + "sha256": "af1550d9eea9e93c3944925bc4f8a5b450f850cb5678ba76c38d69a3dd93d220" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "072bdc1aa46fb64d231d9fe1a88fa98bebbe4060fb5010787858f881ce03df8a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/solvers/linear/linear_solver.h", + "fesa_dev": { + "source_path": "include/fesa/solvers/linear/linear_solver.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bd8210d17959c854becbaeb4330470ac53932423", + "mode": "100644", + "size_bytes": 962, + "sha256": "b7481184ca8f8c059e07653613695bf659a0a34a5f61a1175e6e3c8e21304602" + }, + "working_tree": { + "exists": true, + "size_bytes": 992, + "sha256": "76fb68372a0ea1a290a7ee776b77d67fd520e0d5efe5603c2dddb93014607090" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/solvers/linear/linear_solver.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bd8210d17959c854becbaeb4330470ac53932423", + "mode": "100644", + "size_bytes": 962, + "sha256": "b7481184ca8f8c059e07653613695bf659a0a34a5f61a1175e6e3c8e21304602" + }, + "working_tree": { + "exists": true, + "size_bytes": 992, + "sha256": "76fb68372a0ea1a290a7ee776b77d67fd520e0d5efe5603c2dddb93014607090" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 992, + "sha256": "76fb68372a0ea1a290a7ee776b77d67fd520e0d5efe5603c2dddb93014607090" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "76fb68372a0ea1a290a7ee776b77d67fd520e0d5efe5603c2dddb93014607090", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/solvers/linear/mkl_pardiso_solver.h", + "fesa_dev": { + "source_path": "include/fesa/solvers/linear/mkl_pardiso_solver.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f4cab79472b6627f5208d9f2696399b75d9a41f5", + "mode": "100644", + "size_bytes": 894, + "sha256": "02c503b2fc162e6d9e96ff26dadf4d1e08b07185b11f0a95942a97fe9aa1ae5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 926, + "sha256": "7cdf2f5402ee1b9f2c313e8fb35973c81c3b172bbac19f3ab4e7505fc4724ebc" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/solvers/linear/mkl_pardiso_solver.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f4cab79472b6627f5208d9f2696399b75d9a41f5", + "mode": "100644", + "size_bytes": 894, + "sha256": "02c503b2fc162e6d9e96ff26dadf4d1e08b07185b11f0a95942a97fe9aa1ae5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 926, + "sha256": "7cdf2f5402ee1b9f2c313e8fb35973c81c3b172bbac19f3ab4e7505fc4724ebc" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 926, + "sha256": "7cdf2f5402ee1b9f2c313e8fb35973c81c3b172bbac19f3ab4e7505fc4724ebc" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7cdf2f5402ee1b9f2c313e8fb35973c81c3b172bbac19f3ab4e7505fc4724ebc", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h", + "fesa_dev": { + "source_path": "include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "640f14ebb6a0f24b45fe2e7e71e820c116ab2f58", + "mode": "100644", + "size_bytes": 977, + "sha256": "5c87e0c89edec446efdb74b1857d45ac9502632d495d1f89a276cd175e7d3a50" + }, + "working_tree": { + "exists": true, + "size_bytes": 1009, + "sha256": "e97277540a4bb707e4006b8284806b51b6a55b7827ff8071a17ece337333f771" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "640f14ebb6a0f24b45fe2e7e71e820c116ab2f58", + "mode": "100644", + "size_bytes": 977, + "sha256": "5c87e0c89edec446efdb74b1857d45ac9502632d495d1f89a276cd175e7d3a50" + }, + "working_tree": { + "exists": true, + "size_bytes": 1009, + "sha256": "e97277540a4bb707e4006b8284806b51b6a55b7827ff8071a17ece337333f771" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1009, + "sha256": "e97277540a4bb707e4006b8284806b51b6a55b7827ff8071a17ece337333f771" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e97277540a4bb707e4006b8284806b51b6a55b7827ff8071a17ece337333f771", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "include/fesa/solvers/linear/tangent_solver.h", + "fesa_dev": { + "source_path": "include/fesa/solvers/linear/tangent_solver.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "eb3e2cdcbc83f16465bc02631e56ace2e04d2a6c", + "mode": "100644", + "size_bytes": 1012, + "sha256": "ad8bc183ebd0ae04633de3d874885262e25d0f25b7f7c37c5bc54345a72de584" + }, + "working_tree": { + "exists": true, + "size_bytes": 1043, + "sha256": "605ea56d58789f986eafc7e8025d663e58d132f553286754ab20b242625ff4c1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "include/fesa/solvers/linear/tangent_solver.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "eb3e2cdcbc83f16465bc02631e56ace2e04d2a6c", + "mode": "100644", + "size_bytes": 1012, + "sha256": "ad8bc183ebd0ae04633de3d874885262e25d0f25b7f7c37c5bc54345a72de584" + }, + "working_tree": { + "exists": true, + "size_bytes": 1043, + "sha256": "605ea56d58789f986eafc7e8025d663e58d132f553286754ab20b242625ff4c1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1043, + "sha256": "605ea56d58789f986eafc7e8025d663e58d132f553286754ab20b242625ff4c1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "605ea56d58789f986eafc7e8025d663e58d132f553286754ab20b242625ff4c1", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "msvc/AGENTS.md", + "refactor": { + "source_path": "msvc/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a7f49eb47c2aebdeda2efcf735d9061f4f185ee5", + "mode": "100644", + "size_bytes": 1531, + "sha256": "6371bd587f6d52d9a866ed5c7e34504927458895c069b26889c1beceb85cfc79" + }, + "working_tree": { + "exists": true, + "size_bytes": 1548, + "sha256": "fa4f6f924f5c34a199d67f8a028da559bdad912eb5dd6d96eaea54c82b1d2fc4" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/Fesa.Common.props", + "refactor": { + "source_path": "msvc/Fesa.Common.props", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d8e4e27c0c83d9339f4846c73d706d56f99b9b38", + "mode": "100644", + "size_bytes": 6775, + "sha256": "03c0bd713afded7618523f4c80aef798a68ff72fbc959174a1862cb10f28a901" + }, + "working_tree": { + "exists": true, + "size_bytes": 6850, + "sha256": "c032b178b00f1999b447cd6d0c9266ee902ee3f48fa0b5b5ddd7ed672ccc8c3c" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/Fesa.Runtime.targets", + "refactor": { + "source_path": "msvc/Fesa.Runtime.targets", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f4b18f16fc6c608bfc30fe5c0c7a2af521f8c39f", + "mode": "100644", + "size_bytes": 2078, + "sha256": "736edfe0c13e4c88bdbe9ed6697ea63212a37d7bf88087d37bd94e49d0c31cb3" + }, + "working_tree": { + "exists": true, + "size_bytes": 2101, + "sha256": "b1f060b9decb735bbdadda58e8e9ba2f51ada774712539b5430935ebdf7218be" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/fesa_cli.vcxproj", + "refactor": { + "source_path": "msvc/fesa_cli.vcxproj", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "09cca278bd5b4a45a2dda4dd58eab75006d2c756", + "mode": "100644", + "size_bytes": 1460, + "sha256": "4238a0c40b3b12fa33f51a97289d005cfd384c8d609f16f02038a1c0a07ce8d8" + }, + "working_tree": { + "exists": true, + "size_bytes": 1478, + "sha256": "fb670ebaa0ba1aa35f9f2bb0e160b66ad93a5a1888c12670d8b32ea73b4a1aff" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/fesa_integration_tests.vcxproj", + "refactor": { + "source_path": "msvc/fesa_integration_tests.vcxproj", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "94cbc555b3bff85ae756ada20101b6defb74a68f", + "mode": "100644", + "size_bytes": 2743, + "sha256": "b8c5feb397381567ed7948a5aa64dfe07326431ae29eff29512f9354b0b0bac8" + }, + "working_tree": { + "exists": true, + "size_bytes": 2773, + "sha256": "f8c4e7050c45f7e18c08980883b5d5f6d7520b23b362931c31cd70ece9e7af24" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/fesa_reference_tests.vcxproj", + "refactor": { + "source_path": "msvc/fesa_reference_tests.vcxproj", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d44fefbe1212b8c777f0edc3d2de42c823fb8fab", + "mode": "100644", + "size_bytes": 3200, + "sha256": "dc374e4be5491baa04e366b342913e3165e180c6bb9b6b2fe77c2c13698ed380" + }, + "working_tree": { + "exists": true, + "size_bytes": 3235, + "sha256": "c6191ac7e644928e83e3c801ca30fb8ad784326d015e2f4aecf31542c662789e" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/fesa_solver.vcxproj", + "refactor": { + "source_path": "msvc/fesa_solver.vcxproj", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "897f7f5408834f66ea112778a5732b69d9dcc45f", + "mode": "100644", + "size_bytes": 8807, + "sha256": "2e03e44e021d18292b7949402afe51c41253bc79ee5ea4d78d6a9f3a0466fd6a" + }, + "working_tree": { + "exists": true, + "size_bytes": 8925, + "sha256": "cb124643633ba1c2af853a9e466c506dee3a72d7e76fd8396263b7bc50fa1cb4" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/fesa_unit_tests.vcxproj", + "refactor": { + "source_path": "msvc/fesa_unit_tests.vcxproj", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d0826de73e351fb3d7e0c5e6dafdf30834b6f0a0", + "mode": "100644", + "size_bytes": 8584, + "sha256": "704531b55dc489a7d99d9b3e27c7a5d7ecc8f21d3006fc983986ae3c4b70438b" + }, + "working_tree": { + "exists": true, + "size_bytes": 8692, + "sha256": "f0e4824fbfd571a023e5e28576499a96ef3a8c07cf6946f856881d9d87f7b6a6" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "msvc/gtest.vcxproj", + "refactor": { + "source_path": "msvc/gtest.vcxproj", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "508e64cdfb02d02f3fb71a232477506c6ea44c93", + "mode": "100644", + "size_bytes": 1389, + "sha256": "db145cf0341c9215afba3de51eb58860fe1802539567914d1f3e7e69f943d6a2" + }, + "working_tree": { + "exists": true, + "size_bytes": 1408, + "sha256": "76d1b7febef6e7a2b689b14d7971c0e0a0e469e311b036b9ab06c90300238a1e" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/index.json", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d7a0e6a63b7648f27fe8869a65f2f4ff6fe03ee3", + "mode": "100644", + "size_bytes": 16662, + "sha256": "e72e425908888cec87d631dbbec055188218aaf4a185ef5a25f20e0549397da1" + }, + "working_tree": { + "exists": true, + "size_bytes": 16869, + "sha256": "4b248dac1307e6533f66a5d63762e5783224db434e6f6807cf1e4a21260c1ac5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 16869, + "sha256": "4b248dac1307e6533f66a5d63762e5783224db434e6f6807cf1e4a21260c1ac5" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step0.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step0.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a4462b1483cacb72034c91132a5d5657b154c812", + "mode": "100644", + "size_bytes": 2714, + "sha256": "79ab9fda45f9e771090e17b4c27ee77c9fe285e4d76eeeb85777606ad51a9d02" + }, + "working_tree": { + "exists": true, + "size_bytes": 2778, + "sha256": "2f76bce905fd5f0c59006f82293130808a5f9958dc7cb1d50a50c239d7b32310" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2778, + "sha256": "2f76bce905fd5f0c59006f82293130808a5f9958dc7cb1d50a50c239d7b32310" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step1.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step1.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5a5d57d8f7d9d27c564188852ff8a9b1de308d90", + "mode": "100644", + "size_bytes": 2889, + "sha256": "c73efc0172dde172be8d8f1f6216cefde8aec73a473e40aa8c6a04a0d1b7d3ae" + }, + "working_tree": { + "exists": true, + "size_bytes": 2945, + "sha256": "08fba3090d01f535e91948dc8f7dff8492d083f908a6dc0d03e534269994c66a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2945, + "sha256": "08fba3090d01f535e91948dc8f7dff8492d083f908a6dc0d03e534269994c66a" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step10.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step10.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9b086f527a4542fd2b5a4c40fea609969f154bac", + "mode": "100644", + "size_bytes": 2933, + "sha256": "8fd6f4f9d148a390a2ad3aeed4e886bceaf847d08c3daeb00b8936dc51ddcce1" + }, + "working_tree": { + "exists": true, + "size_bytes": 2999, + "sha256": "e3456b11ba6800d080dc1bf8f01e300f89cd723c883889a3049cfe6b4f8a190d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2999, + "sha256": "e3456b11ba6800d080dc1bf8f01e300f89cd723c883889a3049cfe6b4f8a190d" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step11.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step11.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6d5ded41a11a52a28b5a6b69f420e885f7038b43", + "mode": "100644", + "size_bytes": 4437, + "sha256": "018be3af4b6872232bf761b5162686c62819d6b5bc19114820776247a8e484f1" + }, + "working_tree": { + "exists": true, + "size_bytes": 4550, + "sha256": "16afdec91e4e6f8a7bf65cfb736f8d48aa1152483e1d8d7da813b35f20e8d428" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4550, + "sha256": "16afdec91e4e6f8a7bf65cfb736f8d48aa1152483e1d8d7da813b35f20e8d428" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step12.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step12.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ab5b0b690ec04d2c0d6a323e14dff4bc09dab298", + "mode": "100644", + "size_bytes": 3919, + "sha256": "d4651c73fa2f0bdd2e9b7249fdfb8f7924e1f262067165d59ae6d9d050c6faee" + }, + "working_tree": { + "exists": true, + "size_bytes": 4010, + "sha256": "5f6d11ab75b48fb5ed329120c93d0fdf431c2f9b6a965b12fab4c83e94e74fcd" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4010, + "sha256": "5f6d11ab75b48fb5ed329120c93d0fdf431c2f9b6a965b12fab4c83e94e74fcd" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step13.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step13.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f9c4ce1bc02badee200f57bd323bf4ea2a91b629", + "mode": "100644", + "size_bytes": 3747, + "sha256": "31e22e7e2683bfc205cfcc6f93de78508f85590aca9793483333aa3e44339a58" + }, + "working_tree": { + "exists": true, + "size_bytes": 3825, + "sha256": "73318431446e6b483a769802b9bd65f70d44335727aec27bc649346a1e962331" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3825, + "sha256": "73318431446e6b483a769802b9bd65f70d44335727aec27bc649346a1e962331" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step14.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step14.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "650958f5d4eb9fb1494067e47b393f7864c78ed8", + "mode": "100644", + "size_bytes": 4600, + "sha256": "e16ed7624b1d86ac3bd9b6e047f1db6860a6d9c79a1b3150554f39e5aa6c0f4d" + }, + "working_tree": { + "exists": true, + "size_bytes": 4716, + "sha256": "7f403f3ec3492c22404030b08810a30cf814c0cee6ab7ffff8557e1d2b5e6bc2" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4716, + "sha256": "7f403f3ec3492c22404030b08810a30cf814c0cee6ab7ffff8557e1d2b5e6bc2" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step15.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step15.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c7028cbeae0b5f44f540e4caaf9fa441ef2127f8", + "mode": "100644", + "size_bytes": 3204, + "sha256": "56c58750c1431e1925f730954663738d9f4966991ac86d9e1fc58d7aa951700a" + }, + "working_tree": { + "exists": true, + "size_bytes": 3274, + "sha256": "0bbab1c11bc7232376e521178d0008a6c65ea6407093d673b5226b78ae012b8d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3274, + "sha256": "0bbab1c11bc7232376e521178d0008a6c65ea6407093d673b5226b78ae012b8d" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step16.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step16.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6c4fa9c6c3c58b244f59d14994fb7115bd2ea627", + "mode": "100644", + "size_bytes": 2863, + "sha256": "d8f7a105a10bc16abc37e6fd00e7a79990365b78131453ba8fe123ffa7d3029a" + }, + "working_tree": { + "exists": true, + "size_bytes": 2926, + "sha256": "8cb8ddfe02cb0eb1f0732f940bb40f7fcde0bd8a4317e73d506355481a312aaf" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2926, + "sha256": "8cb8ddfe02cb0eb1f0732f940bb40f7fcde0bd8a4317e73d506355481a312aaf" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step17.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step17.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ffaeded88b7c41aad40724e0752db292ce1f7544", + "mode": "100644", + "size_bytes": 3111, + "sha256": "5c56a192ba15be92901e24c7ef378ae7b2295aa5032d5fe17b1beb2a4c0b6787" + }, + "working_tree": { + "exists": true, + "size_bytes": 3180, + "sha256": "9ba87b72b8ef6d0539b21f3cec648241d3d4204efd50d9887b2960e1cd5734f2" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3180, + "sha256": "9ba87b72b8ef6d0539b21f3cec648241d3d4204efd50d9887b2960e1cd5734f2" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step18.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step18.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0a995786101b40dd7d7843eb76d8594c3b1bc25b", + "mode": "100644", + "size_bytes": 3597, + "sha256": "dffdff73580f1b002f1bf6836c9075ef7acc97e531393435ab927139662f12b8" + }, + "working_tree": { + "exists": true, + "size_bytes": 3691, + "sha256": "237246ba5a98226beb939644b3377e71848264a396547a45dc33165de1aa2abd" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3691, + "sha256": "237246ba5a98226beb939644b3377e71848264a396547a45dc33165de1aa2abd" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step19.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step19.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1a4fb9f3eb5f83d44a140a976e7372c802398e30", + "mode": "100644", + "size_bytes": 4755, + "sha256": "6566f627a9a295ea5c57c1a6fbd6f4510af3c0108bc3d69a3e16124c9a7f934a" + }, + "working_tree": { + "exists": true, + "size_bytes": 4875, + "sha256": "ccb437653bec0d71b91b87031ca3145c5036f15b08abeb760afb5ea65bb453b3" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4875, + "sha256": "ccb437653bec0d71b91b87031ca3145c5036f15b08abeb760afb5ea65bb453b3" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step2.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step2.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "53ba84ee1237a30e5ebfcd5b0ef5f331fc4e1110", + "mode": "100644", + "size_bytes": 3046, + "sha256": "28c7f3360be9c1c1af33d12402e087aa80d7e94ec062c732840525dc150f9ff6" + }, + "working_tree": { + "exists": true, + "size_bytes": 3110, + "sha256": "c9fb7f730d86d457a1c1059c2346c4f55966d5e4f621b05a2fe2bf5d660f4940" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3110, + "sha256": "c9fb7f730d86d457a1c1059c2346c4f55966d5e4f621b05a2fe2bf5d660f4940" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step20.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step20.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "583c600a0068ca137ae7a82bc0c670ffc712c65f", + "mode": "100644", + "size_bytes": 4073, + "sha256": "486f9d9a85bfabc22e02f4409b3dd1747f8ea7935c2dcdaa8f4b755d01336638" + }, + "working_tree": { + "exists": true, + "size_bytes": 4169, + "sha256": "192c5d7da68ba73e2cb39193a4c211eaa4f1d776e5de98fd034ff085bd15b4f4" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4169, + "sha256": "192c5d7da68ba73e2cb39193a4c211eaa4f1d776e5de98fd034ff085bd15b4f4" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step21.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step21.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1fc0b5dbdb89d5b3d9154e417e7903328aa37663", + "mode": "100644", + "size_bytes": 3261, + "sha256": "bdc4cfc33febdee177bc6f8c6d1abe9497eb7df4723bc04e08ec1a3141b8474a" + }, + "working_tree": { + "exists": true, + "size_bytes": 3328, + "sha256": "4b001ac95eab8c8dbe8a1e426198dbea98a3d5e0e7fa095e19e86a7671b496fc" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3328, + "sha256": "4b001ac95eab8c8dbe8a1e426198dbea98a3d5e0e7fa095e19e86a7671b496fc" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step22.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step22.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "58ff2d4f01b6286677bbf40ad99ce69e72e7b383", + "mode": "100644", + "size_bytes": 3116, + "sha256": "621a00843d1a3fb6ce5a86d9861eff351da185fd2b63bc42f19d48221d753b0f" + }, + "working_tree": { + "exists": true, + "size_bytes": 3182, + "sha256": "60f65b7afa4e62b79aa5656df1ebe0a04dcb28adf847b480f1b5a5f69deece62" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3182, + "sha256": "60f65b7afa4e62b79aa5656df1ebe0a04dcb28adf847b480f1b5a5f69deece62" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step23.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step23.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "50711c12a0ef0f6437a4056cbf84afb372f44395", + "mode": "100644", + "size_bytes": 3195, + "sha256": "b9bb9803b9997e4687b11900fbd0d7f4912adae7bfbd0999cb881a5be00c50da" + }, + "working_tree": { + "exists": true, + "size_bytes": 3262, + "sha256": "54189820281e0068ef1cabb2aeaf74439372403a8390596c243021450be15724" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3262, + "sha256": "54189820281e0068ef1cabb2aeaf74439372403a8390596c243021450be15724" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step24.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step24.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a3330a7e68a2e5b87c51568a413d0112518f7008", + "mode": "100644", + "size_bytes": 5652, + "sha256": "f1d2bf0ccab3e61ed8631cacd776eb80fc4551628e74e756cd3e12c3d1c6067c" + }, + "working_tree": { + "exists": true, + "size_bytes": 5761, + "sha256": "48acba2ff554a568a78d5c3ec149ce2e477b72498736c0ad6d33ff30c72762a6" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5761, + "sha256": "48acba2ff554a568a78d5c3ec149ce2e477b72498736c0ad6d33ff30c72762a6" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step3.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step3.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "dacfaa888a9d9e4915ce54e2ffd2745cd818dbd5", + "mode": "100644", + "size_bytes": 3682, + "sha256": "44dfc668c528686857e430b028f206df05eeb6dab1cf120ab246c727537f0a85" + }, + "working_tree": { + "exists": true, + "size_bytes": 3755, + "sha256": "ebcec186406baf55dd672bc7b9ed8970e3733b17c44a8550b3d44b2bab52040a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3755, + "sha256": "ebcec186406baf55dd672bc7b9ed8970e3733b17c44a8550b3d44b2bab52040a" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step4.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step4.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "78f92218bab96dd1aed87a4223869fe9aa6db198", + "mode": "100644", + "size_bytes": 3276, + "sha256": "56fed3633f1f315fa21982d79e933739e7e673da9f4e8728f7e222664bd7b815" + }, + "working_tree": { + "exists": true, + "size_bytes": 3340, + "sha256": "77397c486178a3640db172ed3a1b2a9ba518c4d9b6dcf4c6e8c63354457bed1d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3340, + "sha256": "77397c486178a3640db172ed3a1b2a9ba518c4d9b6dcf4c6e8c63354457bed1d" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step5.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step5.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f2a715af47b029e0f75ce1349998194aadbab4c4", + "mode": "100644", + "size_bytes": 3895, + "sha256": "b3d74a24e89085b963606243a7c06cb08a0c6ddfd975cbb1c4088a49f9107c3c" + }, + "working_tree": { + "exists": true, + "size_bytes": 3972, + "sha256": "c9c214ef6a86f2ea4929f7a6da7e1462091bb5e6bfd922872d7851a3f1dfb8e1" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3972, + "sha256": "c9c214ef6a86f2ea4929f7a6da7e1462091bb5e6bfd922872d7851a3f1dfb8e1" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step6.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step6.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "63575171207b56e20aaa5b86c405494670724381", + "mode": "100644", + "size_bytes": 3506, + "sha256": "adb527744d101abb78c3a7078b7174f6a51ac5db15449233dd51f1cfaef6950e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3578, + "sha256": "187a998bcddf2c18c6f879bd92181a8b9a780d59b14c5ffebef089d946499fe4" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3578, + "sha256": "187a998bcddf2c18c6f879bd92181a8b9a780d59b14c5ffebef089d946499fe4" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step7.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step7.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "36db03f9304e6937635f4c496d506c0fc41acb9c", + "mode": "100644", + "size_bytes": 3210, + "sha256": "7e0ad7bc93fd0d5554a15819054b23c759f80d8c39cf00193430c72b150631fe" + }, + "working_tree": { + "exists": true, + "size_bytes": 3283, + "sha256": "8f672ea0ae3ec9efda825cb814ef76af6b8be383dbe9380514c67ac205c40ffe" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3283, + "sha256": "8f672ea0ae3ec9efda825cb814ef76af6b8be383dbe9380514c67ac205c40ffe" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step8.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step8.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5bdd627e9ee4ba6153d153b0dd9f635de9718647", + "mode": "100644", + "size_bytes": 3029, + "sha256": "d22e6f7b7000c907ee3ef13c808824e5039e7780fdf2b44ae38269b5adca3891" + }, + "working_tree": { + "exists": true, + "size_bytes": 3086, + "sha256": "f2a3667a8988a8599d81d47eb0fbc8656d049ae97f4c7675456513905b9cb676" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3086, + "sha256": "f2a3667a8988a8599d81d47eb0fbc8656d049ae97f4c7675456513905b9cb676" + } + }, + { + "target_path": "phases/cpp-object-oriented-modular-refactoring/step9.md", + "fesa_dev": { + "source_path": "phases/cpp-object-oriented-modular-refactoring/step9.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "271e2b25a4e8de9e8f9788609db75c212750e7be", + "mode": "100644", + "size_bytes": 2902, + "sha256": "9e83a00cec4af5967f863125111998ad8f710be9846ac3c9c680b83a7cdd6b25" + }, + "working_tree": { + "exists": true, + "size_bytes": 2960, + "sha256": "3e39dd3f303eb72cee6f27c0ca10601c7ad5a5c3e07bb14f9ff7118c073444bf" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2960, + "sha256": "3e39dd3f303eb72cee6f27c0ca10601c7ad5a5c3e07bb14f9ff7118c073444bf" + } + }, + { + "target_path": "phases/index.json", + "fesa_dev": { + "source_path": "phases/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "48759898f5e7a1bdfe51644c0d47b5b923371624", + "mode": "100644", + "size_bytes": 878, + "sha256": "b291eebdf5782763bcad37d7c22de91c813c44922c76b8cbdd0b019f71b3b612" + }, + "working_tree": { + "exists": true, + "size_bytes": 914, + "sha256": "e3019566b42d2f043e56d8f51818987bf9a0611d67b6f9e145000743d98b7865" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 914, + "sha256": "e3019566b42d2f043e56d8f51818987bf9a0611d67b6f9e145000743d98b7865" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/index.json", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8c2afa529729a3d3ff6ac0b69cee599fa9f931bc", + "mode": "100644", + "size_bytes": 13982, + "sha256": "589380fbf08f240cbc9b4b34ac0a3c7a5254532b260fbfbac10e158b2574ad5e" + }, + "working_tree": { + "exists": true, + "size_bytes": 14221, + "sha256": "35ca7386540e4ec5008fa100fd470ff6cd847cbf97dfd86d1cd8cab499df230f" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14221, + "sha256": "35ca7386540e4ec5008fa100fd470ff6cd847cbf97dfd86d1cd8cab499df230f" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step0.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step0.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "98a8a434f4b42fa69d8c609029946348b4635f00", + "mode": "100644", + "size_bytes": 5054, + "sha256": "7b7f358ae978804bf7600a29dcff813dcecccde534228b52d8edc9bc37a441c3" + }, + "working_tree": { + "exists": true, + "size_bytes": 5151, + "sha256": "026596dcd916c4658ee3120c44882ff683b70537510401761549df4a6f26d0e1" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5151, + "sha256": "026596dcd916c4658ee3120c44882ff683b70537510401761549df4a6f26d0e1" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step1.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step1.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "078d396a750afa7f24491aae3f434237a1ba7334", + "mode": "100644", + "size_bytes": 3371, + "sha256": "6cb80c98ee35773a859f130390439fc65af96de5fd7463017bf377a6dcd74c21" + }, + "working_tree": { + "exists": true, + "size_bytes": 3447, + "sha256": "d54c7e23267efe4a03324ab780aee360f07a426faafc6ea57a56916494c888d5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3447, + "sha256": "d54c7e23267efe4a03324ab780aee360f07a426faafc6ea57a56916494c888d5" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step10.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step10.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a965806b875043b08fd7385ede81aeee5df1107d", + "mode": "100644", + "size_bytes": 4030, + "sha256": "03aa1edfe165c652cd3304e4160df140ddc685fedb6f63c25f42b733108058a7" + }, + "working_tree": { + "exists": true, + "size_bytes": 4116, + "sha256": "48e9369214651f409e39e205bee20a08095bcb91e8d6ed22016835e81e17f308" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4116, + "sha256": "48e9369214651f409e39e205bee20a08095bcb91e8d6ed22016835e81e17f308" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step11.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step11.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8eafe4da88bb8e64887f17779e0ec99be6122c89", + "mode": "100644", + "size_bytes": 3657, + "sha256": "7e0ccf1baea8339457c83e1307aece2e5d316ff6508e8d83e5a5f6eb68e025f8" + }, + "working_tree": { + "exists": true, + "size_bytes": 3743, + "sha256": "5896b56caf59a249ecaec8e859534d539409276a3910500f2142801cde6db4e0" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3743, + "sha256": "5896b56caf59a249ecaec8e859534d539409276a3910500f2142801cde6db4e0" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step12.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step12.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0fcf4a795da2e92af0555acccdb2f5b13d8d4a1e", + "mode": "100644", + "size_bytes": 4994, + "sha256": "6a0f260c9424f12cac69b6b85b7bb889e5264ff17b729a2421721537fa65b547" + }, + "working_tree": { + "exists": true, + "size_bytes": 5095, + "sha256": "ad48ccfc11ebb4b61c87789b86928b7bf25aa1b622d2bc48adb38aa78ad7d69b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5095, + "sha256": "ad48ccfc11ebb4b61c87789b86928b7bf25aa1b622d2bc48adb38aa78ad7d69b" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step13.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step13.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "88ba591d4aca537e152f9085946fdb57b88ad373", + "mode": "100644", + "size_bytes": 3474, + "sha256": "9d5b036994cb0791ca0b2264661b6fc552c334795e15c1654ff1632435136baf" + }, + "working_tree": { + "exists": true, + "size_bytes": 3556, + "sha256": "c31a20d5ee25a9feff6b25cedd49f5ddfe169bcd94753f917a964773e7b9df7a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3556, + "sha256": "c31a20d5ee25a9feff6b25cedd49f5ddfe169bcd94753f917a964773e7b9df7a" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step14.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step14.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b68dc2dbe335b2c1b0434d6af33c9089a935c3f1", + "mode": "100644", + "size_bytes": 4136, + "sha256": "682c742060ec1c7cc793afdc1990ba728fabb3e424ea32e684e2d363c2b7ebb5" + }, + "working_tree": { + "exists": true, + "size_bytes": 4224, + "sha256": "8fb63f0a4bdc452f781b05661380bcee004913004d8e1e689304a0b262ca60a2" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4224, + "sha256": "8fb63f0a4bdc452f781b05661380bcee004913004d8e1e689304a0b262ca60a2" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step15.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step15.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6582cd083be2dbc9664956f07277b7e41f9358fe", + "mode": "100644", + "size_bytes": 4006, + "sha256": "42d6df785114c993e5846518c56eebf98130ebbcb7ff892211696ec8ff434ee1" + }, + "working_tree": { + "exists": true, + "size_bytes": 4093, + "sha256": "4cf7e250d795afd4f2290e9befa3f5a6df6c023f2ccdd928a89ea8f583051bc6" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4093, + "sha256": "4cf7e250d795afd4f2290e9befa3f5a6df6c023f2ccdd928a89ea8f583051bc6" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step16.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step16.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ceaa813aeb00a4703ee5fe68a9c05e185a265566", + "mode": "100644", + "size_bytes": 4886, + "sha256": "43135fdf4c23a621e35fbf569a95e0e4e54b49c925516571e4e827f723c126a7" + }, + "working_tree": { + "exists": true, + "size_bytes": 4984, + "sha256": "9c8bc2a0e39373537e457be32548445546cf24d8ebc444321bb90a929d5fb9a8" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4984, + "sha256": "9c8bc2a0e39373537e457be32548445546cf24d8ebc444321bb90a929d5fb9a8" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step17.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step17.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c5047ceea23334f5b31bf7be89cc3264372079d0", + "mode": "100644", + "size_bytes": 3230, + "sha256": "c3135c89ed68e0b3e3efa66096b55fa84f5b3b33ec9e5ea88a87b755b23e10bb" + }, + "working_tree": { + "exists": true, + "size_bytes": 3307, + "sha256": "1dd7c53f8a03c58548549ec357d0b9ffd2e24327d1c93d85ea912c9519f5c4fd" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3307, + "sha256": "1dd7c53f8a03c58548549ec357d0b9ffd2e24327d1c93d85ea912c9519f5c4fd" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step18.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step18.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "75a0f72f5c15b1bad4fa8f55139a4098a001f9b1", + "mode": "100644", + "size_bytes": 4044, + "sha256": "c457025371abd80fb89b5e347fc1800ba8d00f58fdc707c6f6abda82644a5d5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 4137, + "sha256": "13362226f4237af8c3cc035e010d8ec19a76775b65d1712d4eea9050fb238b88" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4137, + "sha256": "13362226f4237af8c3cc035e010d8ec19a76775b65d1712d4eea9050fb238b88" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step19.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step19.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e987384391ee887c5d8bb3c787435646f0cb14de", + "mode": "100644", + "size_bytes": 3566, + "sha256": "72174cd20e874c6435db9fda85bfd2c92fbf7decabbf54c1f756f1a2e8d88611" + }, + "working_tree": { + "exists": true, + "size_bytes": 3649, + "sha256": "0b7368c9a619f5fd635b7981be214dbc75ed76aec9b8dc80935e884768467e99" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3649, + "sha256": "0b7368c9a619f5fd635b7981be214dbc75ed76aec9b8dc80935e884768467e99" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step2.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step2.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f172369dfbd958bd593e697b87a3a834af56834c", + "mode": "100644", + "size_bytes": 3777, + "sha256": "fc99553af4fa8cc721008ffd09a75072fcd7a8b43123286633124cedbe75a0f5" + }, + "working_tree": { + "exists": true, + "size_bytes": 3856, + "sha256": "0b9bc554453b83908c769b46839c0e8605daa096f15cb1a721e0c101a449cd6e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3856, + "sha256": "0b9bc554453b83908c769b46839c0e8605daa096f15cb1a721e0c101a449cd6e" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step20.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step20.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "edc1246bfaa03a25adcc1ea2789741b0b20ee6ec", + "mode": "100644", + "size_bytes": 3884, + "sha256": "e091225cfba9822445de57f4f8655dd70311afcfdea3315def37117553f97ef1" + }, + "working_tree": { + "exists": true, + "size_bytes": 3975, + "sha256": "fe97ae4a61b98e669c36bc26535ccc02f28c74f6718df80e9d53089e3e0146d3" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3975, + "sha256": "fe97ae4a61b98e669c36bc26535ccc02f28c74f6718df80e9d53089e3e0146d3" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step21.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step21.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bcaca94a05f8834dbbf1482688cfd0089c9413bf", + "mode": "100644", + "size_bytes": 3545, + "sha256": "e2303e22175f69c19bb12f45e2cad4456886a484269c749fc666d046d156f4c2" + }, + "working_tree": { + "exists": true, + "size_bytes": 3623, + "sha256": "08ed756eb98dbaf3f55f2a729e3c6592e4f1a3facaf736da575c634418dc463a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3623, + "sha256": "08ed756eb98dbaf3f55f2a729e3c6592e4f1a3facaf736da575c634418dc463a" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step22.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step22.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5e39649c3a6980ed72fd02ed59559ffdd0059ac2", + "mode": "100644", + "size_bytes": 3979, + "sha256": "ea1c8cfc02c5f964fee4eb1e853f3e2884903b0bfc1dcdb6f1d9eb2d3923a67d" + }, + "working_tree": { + "exists": true, + "size_bytes": 4064, + "sha256": "1896c4c918b598edfd21bfae99910c11167e651481cced776fa3ec6565740cf4" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4064, + "sha256": "1896c4c918b598edfd21bfae99910c11167e651481cced776fa3ec6565740cf4" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step23.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step23.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cfbee8bc29041f618caf9cc871767446846dc85f", + "mode": "100644", + "size_bytes": 4765, + "sha256": "6dba8f9653c5cf1c9ee667e9c343a1d73ce06b07aa3e51cc296b6c96dde4ca60" + }, + "working_tree": { + "exists": true, + "size_bytes": 4873, + "sha256": "b1adae541e26108e622e77e9ad9e9e0934f808ed6a3cb31ecbadf48a66d47f09" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4873, + "sha256": "b1adae541e26108e622e77e9ad9e9e0934f808ed6a3cb31ecbadf48a66d47f09" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step24.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step24.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f86c80db80e7c92c970079542a0116988f732189", + "mode": "100644", + "size_bytes": 7497, + "sha256": "d3dcda9975135876979546379f4f5acef8eacaf2b823ec79f5d3876e4734a8a4" + }, + "working_tree": { + "exists": true, + "size_bytes": 7645, + "sha256": "e9937d1d638a91de2946bd180ef766da5824ca934a5b02b36acd1a216425a9a8" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7645, + "sha256": "e9937d1d638a91de2946bd180ef766da5824ca934a5b02b36acd1a216425a9a8" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step25.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step25.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "12b2bcc835409f92e0084afa4b8a0a470a7cb355", + "mode": "100644", + "size_bytes": 3421, + "sha256": "7dbc752a500ef3ba5365a7e9c227ca2ec9c2a15d911f4ff2e6523cc3b338c62a" + }, + "working_tree": { + "exists": true, + "size_bytes": 3491, + "sha256": "95fce556df651b32d745811a84d5456c528d330d027e84817f3db656b0a6891c" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3491, + "sha256": "95fce556df651b32d745811a84d5456c528d330d027e84817f3db656b0a6891c" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step26.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step26.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8f0e718bf33fa73098f846c3d6afcd36f2b46d19", + "mode": "100644", + "size_bytes": 4820, + "sha256": "2fd5ee61180b79f2cea8181845fb818b7be88d54b1a9b33d671a53b324745908" + }, + "working_tree": { + "exists": true, + "size_bytes": 4910, + "sha256": "2c63cf0f9f9e2d943bea3994c7368f762acd57e85cbe45aaf08e6464fdcec1fc" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4910, + "sha256": "2c63cf0f9f9e2d943bea3994c7368f762acd57e85cbe45aaf08e6464fdcec1fc" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step27.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step27.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2542534c36b987d8b1b4464347e04261470d0886", + "mode": "100644", + "size_bytes": 3819, + "sha256": "e5b2effa8bb2f54ff11fa5c43861f94317706acd3a576a9392a8067756f2d2b6" + }, + "working_tree": { + "exists": true, + "size_bytes": 3896, + "sha256": "9dad75d1302a007b71ba0eead0d22d594e14e6c2be99abdc297ea9aa84a58687" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3896, + "sha256": "9dad75d1302a007b71ba0eead0d22d594e14e6c2be99abdc297ea9aa84a58687" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step28.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step28.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b520270219c58f12dfe3605d612630c80b924825", + "mode": "100644", + "size_bytes": 4803, + "sha256": "a02316fcd144a809ac3fddf9b7b3f577745e7d334ffc420f325dce5540499303" + }, + "working_tree": { + "exists": true, + "size_bytes": 4899, + "sha256": "db90f272afb76a2050db7844db5e95004bef7b523d27a1e02c407c31d14d17d7" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4899, + "sha256": "db90f272afb76a2050db7844db5e95004bef7b523d27a1e02c407c31d14d17d7" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step3.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step3.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d5b89a518a601faee8563bc0a1d0a43f86aedb86", + "mode": "100644", + "size_bytes": 3279, + "sha256": "0b17cd569eb635f6d162ed9b7a51856091490dd86adcf9c8bb43fcf6aee1d28c" + }, + "working_tree": { + "exists": true, + "size_bytes": 3354, + "sha256": "db941265b4505217bfa6530d22c46ecc1646c9a6da239793990cdd2a37f00c55" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3354, + "sha256": "db941265b4505217bfa6530d22c46ecc1646c9a6da239793990cdd2a37f00c55" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step4.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step4.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "90b225bba502ea16d547749969e13d22745c9ca6", + "mode": "100644", + "size_bytes": 4600, + "sha256": "b3fe463a069687d30ef44b43181460f1ed4cfaa7f40fa10d15db74416b2561f6" + }, + "working_tree": { + "exists": true, + "size_bytes": 4692, + "sha256": "d823720299103f7be9f8c462e4ff524f4bf2fef1c133b5af50a8228031d505af" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4692, + "sha256": "d823720299103f7be9f8c462e4ff524f4bf2fef1c133b5af50a8228031d505af" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step5.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step5.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4523f8c1035e6c162b50f48a1484398d368c2774", + "mode": "100644", + "size_bytes": 4515, + "sha256": "cf3f6d57fc404e75ee12b2b4f3e161f883ca79d105b2b453736f4aab823ba089" + }, + "working_tree": { + "exists": true, + "size_bytes": 4601, + "sha256": "1b7a98493e69b16d9fdb9c88eae2fb54e125bf3920233102573e6d98c56f6adf" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4601, + "sha256": "1b7a98493e69b16d9fdb9c88eae2fb54e125bf3920233102573e6d98c56f6adf" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step6.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step6.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "eefea4d30faf513b3dfe9bff6e7cbe0db03788eb", + "mode": "100644", + "size_bytes": 3566, + "sha256": "9e67a8535671a8c6990687b276807dc45c5d05413ec97d9b8650212b3b999af2" + }, + "working_tree": { + "exists": true, + "size_bytes": 3628, + "sha256": "b4436c0856e8c6304eb879f35af8b725b375f86af073c1691ca6ff7f1dd844c5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3628, + "sha256": "b4436c0856e8c6304eb879f35af8b725b375f86af073c1691ca6ff7f1dd844c5" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step7.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step7.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ae54c684489646551aa482ea101bed407c18048b", + "mode": "100644", + "size_bytes": 4388, + "sha256": "b699052cfe0fd71335b1e09e3c4a7b9bf360aadb7a9a1808b7d19be4367c2331" + }, + "working_tree": { + "exists": true, + "size_bytes": 4474, + "sha256": "eb4db8cd4726d8ca68f199420449809a4286c643365e72466fcabdff7271f7d3" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4474, + "sha256": "eb4db8cd4726d8ca68f199420449809a4286c643365e72466fcabdff7271f7d3" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step8.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step8.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3a40f8b6d65235ff9f079aa46312559a7b739484", + "mode": "100644", + "size_bytes": 3800, + "sha256": "4497bdf711a5f646c3b4c887d59bdf505c83b9716b78b1069bc3af1f34bb0c35" + }, + "working_tree": { + "exists": true, + "size_bytes": 3894, + "sha256": "14dde52ab2c2ee1bf8be6e465cac3370156d5be8eda6fc599328a77fedc94799" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3894, + "sha256": "14dde52ab2c2ee1bf8be6e465cac3370156d5be8eda6fc599328a77fedc94799" + } + }, + { + "target_path": "phases/linear-static-3d-euler-beam/step9.md", + "fesa_dev": { + "source_path": "phases/linear-static-3d-euler-beam/step9.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "519d4713f3af92259a489801ebb8c4834bd62fa7", + "mode": "100644", + "size_bytes": 3724, + "sha256": "9d6812ec4c9c569fab8194a28e8723eba334b7ca27ec6a00105049d7b09575b9" + }, + "working_tree": { + "exists": true, + "size_bytes": 3819, + "sha256": "b091b7f59d9e930bd16bf50e385302af3f810c5c53457eb18b7240b4581a7f70" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3819, + "sha256": "b091b7f59d9e930bd16bf50e385302af3f810c5c53457eb18b7240b4581a7f70" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/index.json", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "400c99afee495d8f8471137179b135e401638ad1", + "mode": "100644", + "size_bytes": 7273, + "sha256": "e45488c0301cbbc2c0872a9da70096e9a836d1fc20b043a36626ef086991e159" + }, + "working_tree": { + "exists": true, + "size_bytes": 7392, + "sha256": "8c0a7369bc81fc7a12f9f3a49158a9534d4727b9a924c95b1ece7e915d16880d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7392, + "sha256": "8c0a7369bc81fc7a12f9f3a49158a9534d4727b9a924c95b1ece7e915d16880d" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step0.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step0.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "41816b0caf0120766e51949b232bdfd4dd7ef747", + "mode": "100644", + "size_bytes": 3702, + "sha256": "45c4ca2bb1230f80b4536bb65b9309a478bd97df909ed8c741b73c7c1b279286" + }, + "working_tree": { + "exists": true, + "size_bytes": 3779, + "sha256": "459b8abeb4763f295014f5228e3dd66479686ddb7ff149e537307feac61554d2" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3779, + "sha256": "459b8abeb4763f295014f5228e3dd66479686ddb7ff149e537307feac61554d2" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step1.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step1.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "925e120eca0b42aaa6f648b218db160a57d12dc8", + "mode": "100644", + "size_bytes": 3109, + "sha256": "7d531fe063156baab9717e3bc32a643002e1485ec3d65be5de6a7c2df8eddc01" + }, + "working_tree": { + "exists": true, + "size_bytes": 3168, + "sha256": "2e81682d2461a43ca5533ea65deeb23f0571fefb1cace0815628ce4192002eda" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3168, + "sha256": "2e81682d2461a43ca5533ea65deeb23f0571fefb1cace0815628ce4192002eda" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step10.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step10.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "44cbadf6cef1d1e5b95f9c0d63a23f698675a21a", + "mode": "100644", + "size_bytes": 2548, + "sha256": "b7b3620b0b431ad0a41acd3ae3ea35af609a6459c4bbb0e8350d8b93b13a9cb6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2598, + "sha256": "7ac0942c407a0ed5f397e528c0999fdedcc1cba5ea8a1c9177224d0fcae9c930" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2598, + "sha256": "7ac0942c407a0ed5f397e528c0999fdedcc1cba5ea8a1c9177224d0fcae9c930" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step11.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step11.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "619f1cef0ca54589c112881a4a24cf2a91856e98", + "mode": "100644", + "size_bytes": 2649, + "sha256": "ba10777f843d70c53e566415f313d1007d026297a334e1ff3dd4a3edbbfdc39b" + }, + "working_tree": { + "exists": true, + "size_bytes": 2702, + "sha256": "4d74659beda10a235ecf95fc7d6e6b439d1e26dd945a48efedbc13376a5a25aa" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2702, + "sha256": "4d74659beda10a235ecf95fc7d6e6b439d1e26dd945a48efedbc13376a5a25aa" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step12.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step12.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3b5d877b82a54288442e199a04d1411bc5a0c352", + "mode": "100644", + "size_bytes": 2734, + "sha256": "267a59e4de3859ac049fb9ee5e6e25ec684cca0877022592198704528284fb8c" + }, + "working_tree": { + "exists": true, + "size_bytes": 2787, + "sha256": "f3fc0746f1059005195af81e78b1837deb198b84baba387785eea58af025aff2" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2787, + "sha256": "f3fc0746f1059005195af81e78b1837deb198b84baba387785eea58af025aff2" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step13.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step13.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ef272dae87b78fb89243f1508888ad9b98648720", + "mode": "100644", + "size_bytes": 4064, + "sha256": "749dcfb33c561c0cacb91b4dfd37f2284437eccc621817d1ee70da17ab2993e9" + }, + "working_tree": { + "exists": true, + "size_bytes": 4135, + "sha256": "500419b0a5df5c69f5e02c9a066b433a0fa9c0ae171ef360e84b00dcb9293430" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4135, + "sha256": "500419b0a5df5c69f5e02c9a066b433a0fa9c0ae171ef360e84b00dcb9293430" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step2.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step2.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0f16f09f2e86ba494c595ed150866321dd2ff51c", + "mode": "100644", + "size_bytes": 2735, + "sha256": "c96743aba4592b022b3401d2879b690920df305f6361189c3b2684ac20608a6c" + }, + "working_tree": { + "exists": true, + "size_bytes": 2787, + "sha256": "52452b8d94883ee5b2670bc41b38df5023dcc96ef2d4a725fb10b698767e95f5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2787, + "sha256": "52452b8d94883ee5b2670bc41b38df5023dcc96ef2d4a725fb10b698767e95f5" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step3.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step3.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "970c70e5194d85e587766a53292c7eee165f3e58", + "mode": "100644", + "size_bytes": 2849, + "sha256": "42fd5fe4b73dac6967bdb1e92667de54ad3a2000d67b037c6f3abb1b3797e2e6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2904, + "sha256": "b90377b3b76bf36742d42547b72ecefd6faad2fe2e201bdb5c9fa5f281c2131d" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2904, + "sha256": "b90377b3b76bf36742d42547b72ecefd6faad2fe2e201bdb5c9fa5f281c2131d" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step4.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step4.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "64e03c84b5c1ca47951965134100c0033326a51d", + "mode": "100644", + "size_bytes": 2528, + "sha256": "095451e554cae9f6b412dbdfd8958cf787d518d25cc950ae5a8a1650682374fb" + }, + "working_tree": { + "exists": true, + "size_bytes": 2577, + "sha256": "18ee1f3bdd251208c046a8218d9b0223eff8f912e4014bd7fdd0f1d185cf6333" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2577, + "sha256": "18ee1f3bdd251208c046a8218d9b0223eff8f912e4014bd7fdd0f1d185cf6333" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step5.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step5.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "22775a5fd3103fc6e033c80aac9c9b7ad04b66f2", + "mode": "100644", + "size_bytes": 2451, + "sha256": "23878a5e695f24514a30b808e5dbdce7351e1f606d9863a182422a6660f42a96" + }, + "working_tree": { + "exists": true, + "size_bytes": 2499, + "sha256": "89735df88dc4c76d4c94a14cf60b0430ee54acb05d787a27067e99874257e62a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2499, + "sha256": "89735df88dc4c76d4c94a14cf60b0430ee54acb05d787a27067e99874257e62a" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step6.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step6.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "91ea6ab45948502c516a7103246c369bb1d1d7c1", + "mode": "100644", + "size_bytes": 2363, + "sha256": "64f425378f356a0fb78f0d6f2b2ba4672f241ffc7157ad3caba29f858a70f4a2" + }, + "working_tree": { + "exists": true, + "size_bytes": 2412, + "sha256": "f41be2c1729da4edf2095da13779c24bda541e79cd0269d558c581b1f594b087" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2412, + "sha256": "f41be2c1729da4edf2095da13779c24bda541e79cd0269d558c581b1f594b087" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step7.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step7.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3cd783cbc2eef165c233162e532e142a3d86a4ba", + "mode": "100644", + "size_bytes": 2475, + "sha256": "024d0012ef2f888c9a0ca87379662be05515b225600a5fa9890a6bf9f9b627c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 2526, + "sha256": "7a76ec83c39ab2209fadcecbf9bad842c876b323adabfd8d94fb7591a2e6e856" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2526, + "sha256": "7a76ec83c39ab2209fadcecbf9bad842c876b323adabfd8d94fb7591a2e6e856" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step8.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step8.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "30780d4cd41ac79c54785c5091369aea9fb6d5ab", + "mode": "100644", + "size_bytes": 2484, + "sha256": "d5f4b63ba02d007bdeb7d808834761124b33d29c766814a42aa033438caa78f6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2534, + "sha256": "e23ebcee01d2d76c801107e84d54de3db4ba2dbd1e6275e842e4b4446a63cc67" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2534, + "sha256": "e23ebcee01d2d76c801107e84d54de3db4ba2dbd1e6275e842e4b4446a63cc67" + } + }, + { + "target_path": "phases/linear-static-mitc4-shell/step9.md", + "fesa_dev": { + "source_path": "phases/linear-static-mitc4-shell/step9.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3d063dfc9137afb8726d5473e6781d574158d8e0", + "mode": "100644", + "size_bytes": 2484, + "sha256": "8ddc03797ea9d77bd14e5fb28b64ab5882564ace93c4ef0191484569833d790d" + }, + "working_tree": { + "exists": true, + "size_bytes": 2535, + "sha256": "19aae6b7dc708b734c945cbc16489ee0a75f5052f2b8e30147caab813563c71e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2535, + "sha256": "19aae6b7dc708b734c945cbc16489ee0a75f5052f2b8e30147caab813563c71e" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen-execution-prep/index.json", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen-execution-prep/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "363d8d192c73f435df4bb09cfe7f7955efdf3ea0", + "mode": "100644", + "size_bytes": 18840, + "sha256": "9ba64f7916e5610a84c6fca60e447710ba86bdc289a314afcf8fea2b59dd8821" + }, + "working_tree": { + "exists": true, + "size_bytes": 18914, + "sha256": "210bbe70e4d6d3ae74acaf2aeefeff56dc032c7a976347df3681089d551f4692" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18914, + "sha256": "210bbe70e4d6d3ae74acaf2aeefeff56dc032c7a976347df3681089d551f4692" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen-execution-prep/step0.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen-execution-prep/step0.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c1bf234c05959c4d4ee5443550f962d928e7fb51", + "mode": "100644", + "size_bytes": 14147, + "sha256": "78f95bc0fcfa08865a1c778b74203b3d758ad54e4cdeb2ff88212a4b728fb84b" + }, + "working_tree": { + "exists": true, + "size_bytes": 14308, + "sha256": "93d5d5d11a9934ae441fa477e64671611965726ca5d737538e528377a0168d7c" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14308, + "sha256": "93d5d5d11a9934ae441fa477e64671611965726ca5d737538e528377a0168d7c" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/index.json", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "51c6143d87b0bafa97c52d9372957341b711eee1", + "mode": "100644", + "size_bytes": 7071, + "sha256": "7fbfd0777771152f24681b314156c13a091e7887e8ebcd7ea96c1c5f4889d274" + }, + "working_tree": { + "exists": true, + "size_bytes": 7248, + "sha256": "5cd2c08840916f06693272de8d645fce62480781ace89ddce30b40ade970ad8c" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7248, + "sha256": "5cd2c08840916f06693272de8d645fce62480781ace89ddce30b40ade970ad8c" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step0.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step0.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9c89090bc185d63dd2f1abc7be600f6f77731f08", + "mode": "100644", + "size_bytes": 14820, + "sha256": "0e84e4bccd0dbb578dc61e3ba7c09402c467b457da51072c7a3ccd5548fb0d4a" + }, + "working_tree": { + "exists": true, + "size_bytes": 14975, + "sha256": "21436741ce6746df5a8e8635cd1ffb11eecc8a13ff0d594ff7ce3b8651cfe9a7" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14975, + "sha256": "21436741ce6746df5a8e8635cd1ffb11eecc8a13ff0d594ff7ce3b8651cfe9a7" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step1.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step1.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "af5625cee83df4676f3f0f1d94fd8af53818bc47", + "mode": "100644", + "size_bytes": 12145, + "sha256": "7ad460f6579e37112462c7010eb9828537895447f3bd983109d43fdf64430ea9" + }, + "working_tree": { + "exists": true, + "size_bytes": 12278, + "sha256": "58626cc4b37aac8e47dcf874e5f4501cf95812d194cda68a4e1ab9a848685555" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12278, + "sha256": "58626cc4b37aac8e47dcf874e5f4501cf95812d194cda68a4e1ab9a848685555" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step2.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step2.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8a3087cbdba1368a6ad2ad6b69a861f42f8087b5", + "mode": "100644", + "size_bytes": 14343, + "sha256": "fba5cc25492aae609994a75f8a09363794467a63a4e1399ebd50e4bfea3a9cbd" + }, + "working_tree": { + "exists": true, + "size_bytes": 14491, + "sha256": "38b33f932ee7ffc3bc762b76e5508c23f7c6b8185aabb3cce3c2b552fdb4d50a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14491, + "sha256": "38b33f932ee7ffc3bc762b76e5508c23f7c6b8185aabb3cce3c2b552fdb4d50a" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step3.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step3.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "97fe79a889e3fe64d40e011e5a0c326098503df0", + "mode": "100644", + "size_bytes": 12218, + "sha256": "9f7b33a996ecd82c35c9def9369aa7c0b1211abba540233ad5229d0d61421390" + }, + "working_tree": { + "exists": true, + "size_bytes": 12349, + "sha256": "03b7bb3ef015d7dc578defbd5084804cf4754125f2f67d7b71d5adec541e908a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12349, + "sha256": "03b7bb3ef015d7dc578defbd5084804cf4754125f2f67d7b71d5adec541e908a" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step4.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step4.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fe009c4aa3d6f3462cb87d262362a51fa5cc81d0", + "mode": "100644", + "size_bytes": 14362, + "sha256": "df3423cb6307ef5fd867518c3007ed2ee7a4a468facad2b9d8b0df3259e90205" + }, + "working_tree": { + "exists": true, + "size_bytes": 14513, + "sha256": "dbc9a0f1ce418d488ed51aa23df7e0a0f9a69be375b4b3cde3658c5ecd1a3264" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14513, + "sha256": "dbc9a0f1ce418d488ed51aa23df7e0a0f9a69be375b4b3cde3658c5ecd1a3264" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step5.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step5.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "92f80b6d46f7fe624c480f38e888b9b5d11251f0", + "mode": "100644", + "size_bytes": 14685, + "sha256": "33c2faec4669efcb127899c21d2c4f1e593db394fbf63f1856e5ca90fa295d04" + }, + "working_tree": { + "exists": true, + "size_bytes": 14832, + "sha256": "68bf0e10d8be97f4d0a817300bd5f9e6ea2bb7ce73c628e304b7c60ca8e61d08" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14832, + "sha256": "68bf0e10d8be97f4d0a817300bd5f9e6ea2bb7ce73c628e304b7c60ca8e61d08" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step6.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step6.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fe11e592bd60f68b0ccfd300669024e395cd8a1c", + "mode": "100644", + "size_bytes": 14719, + "sha256": "41aba63e610914c9997dec200f2bb5e2b022c6e4bcecc01d2f98cec7d594ea5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 14873, + "sha256": "f0643a35ebd2ab42e1e9a2a4f833ed5d1bde2f0b5ad90e508ef81ddb7781da2e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14873, + "sha256": "f0643a35ebd2ab42e1e9a2a4f833ed5d1bde2f0b5ad90e508ef81ddb7781da2e" + } + }, + { + "target_path": "phases/mitc4-shell-feast-eigen/step7.md", + "fesa_dev": { + "source_path": "phases/mitc4-shell-feast-eigen/step7.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ad05d38fc3d58c21e8d1e83fc7c1aa32f27110e0", + "mode": "100644", + "size_bytes": 15671, + "sha256": "f6bd4ec83c91239546b4c56192f866230a32b8e6f4595115fb39e79aae3cab2b" + }, + "working_tree": { + "exists": true, + "size_bytes": 15824, + "sha256": "a15c3993ca40b1ecc3f634242503a7a76ef8ad65445555bb201d637b03e70522" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 15824, + "sha256": "a15c3993ca40b1ecc3f634242503a7a76ef8ad65445555bb201d637b03e70522" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/index.json", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4bd35b44b31a974e2e0f28a58ea7913a81eae13b", + "mode": "100644", + "size_bytes": 4858, + "sha256": "b6e5f969bf4b0fc49536cc5f9d77ca2e800524afa26edb58492acaf40ec3852a" + }, + "working_tree": { + "exists": true, + "size_bytes": 4969, + "sha256": "b941b903746da19f1460c1022fe3501dfc44ce09e5d72cccccb7e38d7d55fd22" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4969, + "sha256": "b941b903746da19f1460c1022fe3501dfc44ce09e5d72cccccb7e38d7d55fd22" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step0.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step0.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f9c2b0efcac4b8b9b94d95b3c66b59cb4c334768", + "mode": "100644", + "size_bytes": 6284, + "sha256": "b8ae0185d0a264d31e2c382c2b3c24d24707183ba20ce31e3da7ef32cfbe7498" + }, + "working_tree": { + "exists": true, + "size_bytes": 6419, + "sha256": "974800b5f7129701104418be91a6c8a889a7ed3bd565b3cf32a6399652899b95" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6419, + "sha256": "974800b5f7129701104418be91a6c8a889a7ed3bd565b3cf32a6399652899b95" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step1.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step1.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "dcd01a7c2f5f341e425cf54d804bc0c0079ef9ed", + "mode": "100644", + "size_bytes": 5634, + "sha256": "476a21e9cf6184632d1ee1927f7f6f347b8e30d7826555010607e6d837ee8d57" + }, + "working_tree": { + "exists": true, + "size_bytes": 5768, + "sha256": "60d8d9ad4a3dc786d036c859464f4cc1ecd2551d6c8d391183336b3650ea5cb7" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5768, + "sha256": "60d8d9ad4a3dc786d036c859464f4cc1ecd2551d6c8d391183336b3650ea5cb7" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step10.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step10.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "05b7a4d498ad487d0901f5b54a161d315a66c9b3", + "mode": "100644", + "size_bytes": 10541, + "sha256": "82e715d1353a4ee14eaad8572df509bddb9f1e4647d49969b856a84884742932" + }, + "working_tree": { + "exists": true, + "size_bytes": 10722, + "sha256": "a3e0bd8be1c382d1081372688b757d8f6533fe4bd6938b6ab22edc16eb2ca08a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10722, + "sha256": "a3e0bd8be1c382d1081372688b757d8f6533fe4bd6938b6ab22edc16eb2ca08a" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step11.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step11.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "865f7e717c697711fc0b238e228687c2cb1f33d1", + "mode": "100644", + "size_bytes": 23891, + "sha256": "221e793eeeca3dc9c4fd6d216c5d2b852491ddde526eb8953f9541a6ff2bdb20" + }, + "working_tree": { + "exists": true, + "size_bytes": 24299, + "sha256": "ee3b933a7756c124ac08e2e1525a32c49034d6a86e3c9e10535551a7fab1cb5b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 24299, + "sha256": "ee3b933a7756c124ac08e2e1525a32c49034d6a86e3c9e10535551a7fab1cb5b" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step12.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step12.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "22167860ae08821b6517a98730b7ce4842ca7093", + "mode": "100644", + "size_bytes": 12335, + "sha256": "9789965d09780c8263e8298d0f630799044c1bb63d8c707e6f7143d67f198632" + }, + "working_tree": { + "exists": true, + "size_bytes": 12569, + "sha256": "798a4cebe8825cb7f5f4d5080c49cc235467e1dd6c0ab212f9d8c219fafbc006" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12569, + "sha256": "798a4cebe8825cb7f5f4d5080c49cc235467e1dd6c0ab212f9d8c219fafbc006" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step2.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step2.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "40a8444ebd8150d762aab4af669c9d0cb6a5e3a4", + "mode": "100644", + "size_bytes": 3782, + "sha256": "2de7390633e0efc6f0c675be6ba3201d2a9007c3eb0f134b8104e2446b4b9b6f" + }, + "working_tree": { + "exists": true, + "size_bytes": 3882, + "sha256": "3de712d3f855d783211ffaa86d5d6cec365642a3c54565ffcda640431e901edd" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3882, + "sha256": "3de712d3f855d783211ffaa86d5d6cec365642a3c54565ffcda640431e901edd" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step3.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step3.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "09663377e8de85ee37994858209ccd4c53251640", + "mode": "100644", + "size_bytes": 5288, + "sha256": "dab7db248428f7142ca5a0b8d3e185b276c8d6e68bd25ad3fbd8ffe5d6d833c5" + }, + "working_tree": { + "exists": true, + "size_bytes": 5411, + "sha256": "7c1f62ba18ec03e47a4d75916797b8d3e0f51677be991f53cca3edc48eaa530e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5411, + "sha256": "7c1f62ba18ec03e47a4d75916797b8d3e0f51677be991f53cca3edc48eaa530e" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step4.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step4.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "54b64171ede630464bc458a2fd031230b9fe3529", + "mode": "100644", + "size_bytes": 4412, + "sha256": "a2a209df7560c1e41f7fa9f21c296d5e9f374296b53736c1f6a83f567c71470a" + }, + "working_tree": { + "exists": true, + "size_bytes": 4510, + "sha256": "6e0596e41e8c323846d3993eaa39711fe943b55e76261ca3135a2ebd7027f9ac" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4510, + "sha256": "6e0596e41e8c323846d3993eaa39711fe943b55e76261ca3135a2ebd7027f9ac" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step5.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step5.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b0903d48d159bd780ab886895c5ae0d8668a65ff", + "mode": "100644", + "size_bytes": 10508, + "sha256": "44e8835d51dada39ec9ee30a8af84afc6138283306562b14b77acf301d08bae8" + }, + "working_tree": { + "exists": true, + "size_bytes": 10696, + "sha256": "1e194b4e851c58a75650bac9b553147ab85b15a8c7d1c554cec8c79d0985651f" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10696, + "sha256": "1e194b4e851c58a75650bac9b553147ab85b15a8c7d1c554cec8c79d0985651f" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step6.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step6.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8f2cd3bbffdb32a830f9e5fbbfb497ac7a64725c", + "mode": "100644", + "size_bytes": 4259, + "sha256": "e3ea86e507278a209a7a1f4d13f53807357819a27327e2b122fa259fd5241328" + }, + "working_tree": { + "exists": true, + "size_bytes": 4363, + "sha256": "c236a068a584d3ae5ed80adcd0f50335eba5ead8f93fc22e3d9742f76ef5350a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4363, + "sha256": "c236a068a584d3ae5ed80adcd0f50335eba5ead8f93fc22e3d9742f76ef5350a" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step7.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step7.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9865f53b7bc196b01bb8cda24a1a3c2d917179b9", + "mode": "100644", + "size_bytes": 6584, + "sha256": "aff4c0d7b02a6ad49d2ac9da5bc942679077d727223e64227e87d33d8e5d9264" + }, + "working_tree": { + "exists": true, + "size_bytes": 6722, + "sha256": "d683417eee4e4e148f022f9dbee1bda5a9b6cecae12ee817d76d6fc4a60f6bcb" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6722, + "sha256": "d683417eee4e4e148f022f9dbee1bda5a9b6cecae12ee817d76d6fc4a60f6bcb" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step8.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step8.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "28dafb67e616b660e047efa4252f8a2215e809a8", + "mode": "100644", + "size_bytes": 8301, + "sha256": "806ece74b90f45716117f2ef9434715e407f051953dcb7d9df56a22733946cd9" + }, + "working_tree": { + "exists": true, + "size_bytes": 8469, + "sha256": "c68532f5a8ffff8dfbfd2b7ced452eac2dafa7ce9afe2433f9cd963b2c7f8a73" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8469, + "sha256": "c68532f5a8ffff8dfbfd2b7ced452eac2dafa7ce9afe2433f9cd963b2c7f8a73" + } + }, + { + "target_path": "phases/nonlinear-static-newton-raphson/step9.md", + "fesa_dev": { + "source_path": "phases/nonlinear-static-newton-raphson/step9.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e07815bd4f1ecc157eee85159553752a0f46754e", + "mode": "100644", + "size_bytes": 5379, + "sha256": "428261420c0735f8f1cb3cc108362f7183401392dd86e19298480d28ebbb19c9" + }, + "working_tree": { + "exists": true, + "size_bytes": 5496, + "sha256": "32b473a3dc8b6ab390273174cbea07647158ee24a7728793eeed01c918d47da8" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5496, + "sha256": "32b473a3dc8b6ab390273174cbea07647158ee24a7728793eeed01c918d47da8" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/index.json", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/index.json", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1973072b2ae9d72640e5b8aaf8a8d99718558557", + "mode": "100644", + "size_bytes": 2750, + "sha256": "3114ed315ee489002bb72ff60dba994c295c77f2bd06a1f87b19d8ed657a0d76" + }, + "working_tree": { + "exists": true, + "size_bytes": 2813, + "sha256": "684244c990e57eaf07717e6707c43d8f804c630c1f8948abbf0fd18c27d8fea7" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2813, + "sha256": "684244c990e57eaf07717e6707c43d8f804c630c1f8948abbf0fd18c27d8fea7" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/step1.md", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/step1.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fd0816ba5119e71a4953693652b7c9d4798b7449", + "mode": "100644", + "size_bytes": 11777, + "sha256": "487e574598e2149b086d71de51a2ce1d23f5eb253f82a63a95c4052b62650402" + }, + "working_tree": { + "exists": true, + "size_bytes": 11979, + "sha256": "cf353f4df047cce8d9c1df28ea36e7a65478b78782ae3f1be0a619e2a983c5f1" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11979, + "sha256": "cf353f4df047cce8d9c1df28ea36e7a65478b78782ae3f1be0a619e2a983c5f1" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/step2.md", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/step2.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "65d095b7a0a04aed630b62b1fbc40d3ba263a223", + "mode": "100644", + "size_bytes": 7435, + "sha256": "cb7a27ee9b8912ef8c164eee1aaeb31ae46e38ece381b57f3dee53f72b0bac17" + }, + "working_tree": { + "exists": true, + "size_bytes": 7547, + "sha256": "530c72c613b4415d38ed9276309a6ad7470ff713e24589cda6d0de4c0f8ce737" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7547, + "sha256": "530c72c613b4415d38ed9276309a6ad7470ff713e24589cda6d0de4c0f8ce737" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/step3.md", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/step3.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "824213f8c484ff993660b88bdb45d2b01dea63aa", + "mode": "100644", + "size_bytes": 8497, + "sha256": "fbab07f4038c2d1d60d43701cd53ad1c830ac89743b0618efb4339ba6467180a" + }, + "working_tree": { + "exists": true, + "size_bytes": 8642, + "sha256": "71ca0701dcb06f2a80ca80daa5477f18812356a220b381fa1012f5c9fdcd619b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8642, + "sha256": "71ca0701dcb06f2a80ca80daa5477f18812356a220b381fa1012f5c9fdcd619b" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/step4.md", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/step4.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f7d22e7de74c3141615b4e299581e0c120614664", + "mode": "100644", + "size_bytes": 9604, + "sha256": "a596c6239e93bdbbe0aa83a9872387fd509c6f51a70c00f019ca82d21f3927f8" + }, + "working_tree": { + "exists": true, + "size_bytes": 9759, + "sha256": "506956641227ad617f15abdc6e1ef5c3518801eea36e371fe95c278b12267b53" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9759, + "sha256": "506956641227ad617f15abdc6e1ef5c3518801eea36e371fe95c278b12267b53" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/step5.md", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/step5.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f2f6cbd56c2621544eab5d966e6a1e1080f8308f", + "mode": "100644", + "size_bytes": 9555, + "sha256": "42c59372e214184d4501573588de742dea142aca23eca34a222433d943b6aab9" + }, + "working_tree": { + "exists": true, + "size_bytes": 9691, + "sha256": "eaaaa336897904e25782caf6760da7303973613a9d19fc0a3870803d8f487d31" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9691, + "sha256": "eaaaa336897904e25782caf6760da7303973613a9d19fc0a3870803d8f487d31" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/step6.md", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/step6.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "234fe2e91793d3bc2338ea4fe9224d53ebd12bf8", + "mode": "100644", + "size_bytes": 8807, + "sha256": "93a5d4abd3d93506ac18dbc0e6fe01eb77833d88498daf86db94e6bbf3533302" + }, + "working_tree": { + "exists": true, + "size_bytes": 8935, + "sha256": "0eb73d4b0158272247b5f6099ba34cdd92ec6f2f65eff03aef783bdea6a30534" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8935, + "sha256": "0eb73d4b0158272247b5f6099ba34cdd92ec6f2f65eff03aef783bdea6a30534" + } + }, + { + "target_path": "phases/shell-surface-pressure-load/step7.md", + "fesa_dev": { + "source_path": "phases/shell-surface-pressure-load/step7.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "327790e28dc8a481ec1a022605df0c7b773abdf8", + "mode": "100644", + "size_bytes": 8076, + "sha256": "519f091daba89fb963bb3588df9c84e9d29046503d8e2092cc48e824373ca39a" + }, + "working_tree": { + "exists": true, + "size_bytes": 8180, + "sha256": "f9e6b6005ff6d35c30f2a160f30c5528df673ef919be7fd5ee76abf21c2ca397" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8180, + "sha256": "f9e6b6005ff6d35c30f2a160f30c5528df673ef919be7fd5ee76abf21c2ca397" + } + }, + { + "target_path": "pytest.ini", + "fesa_dev": { + "source_path": "pytest.ini", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5ee6477165727539aa0701c22b47da2ceaedeff5", + "mode": "100644", + "size_bytes": 27, + "sha256": "c809c969ec7e11b9ff37784e9c6fcc0b7c5148d168e18b05aed797e03fbd6ead" + }, + "working_tree": { + "exists": true, + "size_bytes": 29, + "sha256": "ddfcf6e0017476e9b9e8e55559c80e166c21f4f1ac242c7468dc85ad9dc69e52" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 29, + "sha256": "ddfcf6e0017476e9b9e8e55559c80e166c21f4f1ac242c7468dc85ad9dc69e52" + } + }, + { + "target_path": "reference/ShellNL.manifest.json", + "refactor": { + "source_path": "reference/ShellNL.manifest.json", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c58285d1608d6bf612a38b862a75017565a010d7", + "mode": "100644", + "size_bytes": 829, + "sha256": "82c84261c1c847da567010a15b59ea82ab9ef2cd490a4cff8cb31edc28119877" + }, + "working_tree": { + "exists": true, + "size_bytes": 856, + "sha256": "97f50bc5d97d677e9e8f84f05f9864adc9ab09095d94aeac23a8240d6eadb11a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-source-import" + }, + { + "target_path": "reference/cantilever beam/cantilever beam displacements.csv", + "fesa_dev": { + "source_path": "reference/cantilever beam/cantilever beam displacements.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9b774599024b0767e9768a3c2538fb6603056854", + "mode": "100644", + "size_bytes": 1778, + "sha256": "269af533a89a45157dd8dfeeacc73ff0622739bcbb270bb86f2e1fee808c27bd" + }, + "working_tree": { + "exists": true, + "size_bytes": 1790, + "sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/cantilever beam/cantilever beam displacements.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9b774599024b0767e9768a3c2538fb6603056854", + "mode": "100644", + "size_bytes": 1778, + "sha256": "269af533a89a45157dd8dfeeacc73ff0622739bcbb270bb86f2e1fee808c27bd" + }, + "working_tree": { + "exists": true, + "size_bytes": 1790, + "sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1790, + "sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + } + }, + { + "target_path": "reference/cantilever beam/cantilever beam elemental forces.csv", + "fesa_dev": { + "source_path": "reference/cantilever beam/cantilever beam elemental forces.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "329bb20c6f520d25aff710e0fbc56b80fc2e3218", + "mode": "100644", + "size_bytes": 2487, + "sha256": "44fbc6b3516aac5865074a66a2ea001d3b42dd231acb9452869eb6a63308cf7d" + }, + "working_tree": { + "exists": true, + "size_bytes": 2508, + "sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/cantilever beam/cantilever beam elemental forces.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "329bb20c6f520d25aff710e0fbc56b80fc2e3218", + "mode": "100644", + "size_bytes": 2487, + "sha256": "44fbc6b3516aac5865074a66a2ea001d3b42dd231acb9452869eb6a63308cf7d" + }, + "working_tree": { + "exists": true, + "size_bytes": 2508, + "sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2508, + "sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + } + }, + { + "target_path": "reference/cantilever beam/cantilever beam reactions.csv", + "fesa_dev": { + "source_path": "reference/cantilever beam/cantilever beam reactions.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fea42349b5f95c5c8450dd8e1ce6b54f5c049028", + "mode": "100644", + "size_bytes": 1768, + "sha256": "76a1bed4f3a495b7ac232c8e9c1210cd65ed9a541d935c81d73432624d866d65" + }, + "working_tree": { + "exists": true, + "size_bytes": 1780, + "sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/cantilever beam/cantilever beam reactions.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fea42349b5f95c5c8450dd8e1ce6b54f5c049028", + "mode": "100644", + "size_bytes": 1768, + "sha256": "76a1bed4f3a495b7ac232c8e9c1210cd65ed9a541d935c81d73432624d866d65" + }, + "working_tree": { + "exists": true, + "size_bytes": 1780, + "sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1780, + "sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + } + }, + { + "target_path": "reference/cantilever beam/cantilever beam.inp", + "fesa_dev": { + "source_path": "reference/cantilever beam/cantilever beam.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9eedc9ce7bae2b222020bf8df87650df0fffff03", + "mode": "100644", + "size_bytes": 2224, + "sha256": "fb6ddbb4630ea081f7fc401ae258b3752cff26fe4f661e51456bc68909276b4f" + }, + "working_tree": { + "exists": true, + "size_bytes": 2330, + "sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/cantilever beam/cantilever beam.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9eedc9ce7bae2b222020bf8df87650df0fffff03", + "mode": "100644", + "size_bytes": 2224, + "sha256": "fb6ddbb4630ea081f7fc401ae258b3752cff26fe4f661e51456bc68909276b4f" + }, + "working_tree": { + "exists": true, + "size_bytes": 2330, + "sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2330, + "sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + } + }, + { + "target_path": "reference/hexa/hexa_dynlinear.inp", + "fesa_dev": { + "source_path": "reference/hexa/hexa_dynlinear.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5c97fbf7d57d7f872640d6ab7e07e48d52d1cc03", + "mode": "100644", + "size_bytes": 36901, + "sha256": "dc90ffe4665462c82245a2b801a81280a104a613b89d1bd1fb24b7def61f40ee" + }, + "working_tree": { + "exists": true, + "size_bytes": 37727, + "sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_dynlinear.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5c97fbf7d57d7f872640d6ab7e07e48d52d1cc03", + "mode": "100644", + "size_bytes": 36901, + "sha256": "dc90ffe4665462c82245a2b801a81280a104a613b89d1bd1fb24b7def61f40ee" + }, + "working_tree": { + "exists": true, + "size_bytes": 37727, + "sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 37727, + "sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e" + } + }, + { + "target_path": "reference/hexa/hexa_dynlinear_U.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_dynlinear_U.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0611f0aeb40d1b4a23ec0044993ff93f78f0a54a", + "mode": "100644", + "size_bytes": 9866048, + "sha256": "fb0203113479e010018b8cfa9aba69b1ee17a11e3ad90c24d1d1749e0f7a0c49" + }, + "working_tree": { + "exists": true, + "size_bytes": 9910691, + "sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_dynlinear_U.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0611f0aeb40d1b4a23ec0044993ff93f78f0a54a", + "mode": "100644", + "size_bytes": 9866048, + "sha256": "fb0203113479e010018b8cfa9aba69b1ee17a11e3ad90c24d1d1749e0f7a0c49" + }, + "working_tree": { + "exists": true, + "size_bytes": 9910691, + "sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9910691, + "sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5" + } + }, + { + "target_path": "reference/hexa/hexa_dynnonlinear.inp", + "fesa_dev": { + "source_path": "reference/hexa/hexa_dynnonlinear.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "49d8b61183e234cac176960f29db068932423cdc", + "mode": "100644", + "size_bytes": 36908, + "sha256": "dd5bd44ed94250a11a1916a7dc72333054f38be95b0647588a07c38b7cea3f92" + }, + "working_tree": { + "exists": true, + "size_bytes": 37734, + "sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_dynnonlinear.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "49d8b61183e234cac176960f29db068932423cdc", + "mode": "100644", + "size_bytes": 36908, + "sha256": "dd5bd44ed94250a11a1916a7dc72333054f38be95b0647588a07c38b7cea3f92" + }, + "working_tree": { + "exists": true, + "size_bytes": 37734, + "sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 37734, + "sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9" + } + }, + { + "target_path": "reference/hexa/hexa_dynnonlinear_U.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_dynnonlinear_U.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "dd287b34e41f521af1a249980fbc748efbee92b5", + "mode": "100644", + "size_bytes": 9999974, + "sha256": "c8c765d283349df58225ebdc020542f4cecd98d5980675c54758b5478fdc0685" + }, + "working_tree": { + "exists": true, + "size_bytes": 10044617, + "sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_dynnonlinear_U.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "dd287b34e41f521af1a249980fbc748efbee92b5", + "mode": "100644", + "size_bytes": 9999974, + "sha256": "c8c765d283349df58225ebdc020542f4cecd98d5980675c54758b5478fdc0685" + }, + "working_tree": { + "exists": true, + "size_bytes": 10044617, + "sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10044617, + "sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226" + } + }, + { + "target_path": "reference/hexa/hexa_freq.inp", + "fesa_dev": { + "source_path": "reference/hexa/hexa_freq.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e90d76d3f9c88ade67f88e6808ace41e770e57fb", + "mode": "100644", + "size_bytes": 36708, + "sha256": "d00168d6200599f5dc7ad1e4f197d27f5d68b369d9638980e605accf56991fd4" + }, + "working_tree": { + "exists": true, + "size_bytes": 37526, + "sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_freq.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e90d76d3f9c88ade67f88e6808ace41e770e57fb", + "mode": "100644", + "size_bytes": 36708, + "sha256": "d00168d6200599f5dc7ad1e4f197d27f5d68b369d9638980e605accf56991fd4" + }, + "working_tree": { + "exists": true, + "size_bytes": 37526, + "sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 37526, + "sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347" + } + }, + { + "target_path": "reference/hexa/hexa_freq.txt", + "fesa_dev": { + "source_path": "reference/hexa/hexa_freq.txt", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5bae66a99ee444527b17cb8550ca7336968ff7dc", + "mode": "100644", + "size_bytes": 671, + "sha256": "8350f0849b296d78aecce5c6257c5e2b0c47b6fde3509cf358329682f81ddee4" + }, + "working_tree": { + "exists": true, + "size_bytes": 682, + "sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_freq.txt", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5bae66a99ee444527b17cb8550ca7336968ff7dc", + "mode": "100644", + "size_bytes": 671, + "sha256": "8350f0849b296d78aecce5c6257c5e2b0c47b6fde3509cf358329682f81ddee4" + }, + "working_tree": { + "exists": true, + "size_bytes": 682, + "sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 682, + "sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370" + } + }, + { + "target_path": "reference/hexa/hexa_linearstatic.inp", + "fesa_dev": { + "source_path": "reference/hexa/hexa_linearstatic.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "010b530ac0c876d5ff9e4d512d0f96d990d8e784", + "mode": "100644", + "size_bytes": 36754, + "sha256": "a41e22ff4c88ecb3af3d503cd16edbe3d8a66140467faa727220884f721cd6e1" + }, + "working_tree": { + "exists": true, + "size_bytes": 37578, + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_linearstatic.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "010b530ac0c876d5ff9e4d512d0f96d990d8e784", + "mode": "100644", + "size_bytes": 36754, + "sha256": "a41e22ff4c88ecb3af3d503cd16edbe3d8a66140467faa727220884f721cd6e1" + }, + "working_tree": { + "exists": true, + "size_bytes": 37578, + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 37578, + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + } + }, + { + "target_path": "reference/hexa/hexa_linearstatic_RF.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_linearstatic_RF.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6cbebb0490e80ab15ee3ae5dc34d6fbcb2658e80", + "mode": "100644", + "size_bytes": 99174, + "sha256": "92ff0ee02117a2a2cc1ae696fa4ab75819f8ec34a2d528a50f4df7d4d9461ba0" + }, + "working_tree": { + "exists": true, + "size_bytes": 99617, + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_linearstatic_RF.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6cbebb0490e80ab15ee3ae5dc34d6fbcb2658e80", + "mode": "100644", + "size_bytes": 99174, + "sha256": "92ff0ee02117a2a2cc1ae696fa4ab75819f8ec34a2d528a50f4df7d4d9461ba0" + }, + "working_tree": { + "exists": true, + "size_bytes": 99617, + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 99617, + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + } + }, + { + "target_path": "reference/hexa/hexa_linearstatic_S.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_linearstatic_S.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3b85f7fd296dc17c5e1ffb39908cfb198fd300b2", + "mode": "100644", + "size_bytes": 1039554, + "sha256": "0d731f5c66e14a32c292fbadf5cdbee43b136fdbbc28526b48b41f2bea7d4575" + }, + "working_tree": { + "exists": true, + "size_bytes": 1041955, + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_linearstatic_S.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3b85f7fd296dc17c5e1ffb39908cfb198fd300b2", + "mode": "100644", + "size_bytes": 1039554, + "sha256": "0d731f5c66e14a32c292fbadf5cdbee43b136fdbbc28526b48b41f2bea7d4575" + }, + "working_tree": { + "exists": true, + "size_bytes": 1041955, + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1041955, + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + } + }, + { + "target_path": "reference/hexa/hexa_linearstatic_U.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_linearstatic_U.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "49a8ae36f13e017409973aa8af9a64bebfe1b039", + "mode": "100644", + "size_bytes": 99174, + "sha256": "8db6a62bb7277bf896dc583d4d02002aa9a29370f3b1c80a37594b1478118291" + }, + "working_tree": { + "exists": true, + "size_bytes": 99617, + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_linearstatic_U.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "49a8ae36f13e017409973aa8af9a64bebfe1b039", + "mode": "100644", + "size_bytes": 99174, + "sha256": "8db6a62bb7277bf896dc583d4d02002aa9a29370f3b1c80a37594b1478118291" + }, + "working_tree": { + "exists": true, + "size_bytes": 99617, + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 99617, + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + } + }, + { + "target_path": "reference/hexa/hexa_nonlinearstatic.inp", + "fesa_dev": { + "source_path": "reference/hexa/hexa_nonlinearstatic.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1ad5119123e0c13e60d1df69a764a707e9d9e4c2", + "mode": "100644", + "size_bytes": 36761, + "sha256": "6409c32c1089c920a75747bbf5890b1bd45d335bd60e360e2fca315ac5f40bee" + }, + "working_tree": { + "exists": true, + "size_bytes": 37585, + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_nonlinearstatic.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1ad5119123e0c13e60d1df69a764a707e9d9e4c2", + "mode": "100644", + "size_bytes": 36761, + "sha256": "6409c32c1089c920a75747bbf5890b1bd45d335bd60e360e2fca315ac5f40bee" + }, + "working_tree": { + "exists": true, + "size_bytes": 37585, + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 37585, + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + } + }, + { + "target_path": "reference/hexa/hexa_nonlinearstatic_RF.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_nonlinearstatic_RF.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "00eb0beb7d46f051241477981faaf9bf71334b1b", + "mode": "100644", + "size_bytes": 100500, + "sha256": "afca488973e8162ca7e8e78cf5cb324b252d1f18c5f39f87bf66a0de6a0a4a39" + }, + "working_tree": { + "exists": true, + "size_bytes": 100943, + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_nonlinearstatic_RF.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "00eb0beb7d46f051241477981faaf9bf71334b1b", + "mode": "100644", + "size_bytes": 100500, + "sha256": "afca488973e8162ca7e8e78cf5cb324b252d1f18c5f39f87bf66a0de6a0a4a39" + }, + "working_tree": { + "exists": true, + "size_bytes": 100943, + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 100943, + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + } + }, + { + "target_path": "reference/hexa/hexa_nonlinearstatic_S.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_nonlinearstatic_S.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ce7d79723be3a13eaa7881a306aeeedddef07887", + "mode": "100644", + "size_bytes": 1046754, + "sha256": "bd5afdf8052ebb60215273c8a39bc028a39e1a7392e841cea2a7a4f6c977fccb" + }, + "working_tree": { + "exists": true, + "size_bytes": 1049155, + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_nonlinearstatic_S.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ce7d79723be3a13eaa7881a306aeeedddef07887", + "mode": "100644", + "size_bytes": 1046754, + "sha256": "bd5afdf8052ebb60215273c8a39bc028a39e1a7392e841cea2a7a4f6c977fccb" + }, + "working_tree": { + "exists": true, + "size_bytes": 1049155, + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1049155, + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + } + }, + { + "target_path": "reference/hexa/hexa_nonlinearstatic_U.csv", + "fesa_dev": { + "source_path": "reference/hexa/hexa_nonlinearstatic_U.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6c84d1c7cf301ccd0acc1cea1bf8f068fadf06c4", + "mode": "100644", + "size_bytes": 100500, + "sha256": "78018d5b747e9e68d82a59acec62fd352cc90b8aad5f189ed49384924eff1c2b" + }, + "working_tree": { + "exists": true, + "size_bytes": 100943, + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/hexa/hexa_nonlinearstatic_U.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6c84d1c7cf301ccd0acc1cea1bf8f068fadf06c4", + "mode": "100644", + "size_bytes": 100500, + "sha256": "78018d5b747e9e68d82a59acec62fd352cc90b8aad5f189ed49384924eff1c2b" + }, + "working_tree": { + "exists": true, + "size_bytes": 100943, + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 100943, + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + } + }, + { + "target_path": "reference/shell-thermal/shell-thermal NodalTemperature.csv", + "fesa_dev": { + "source_path": "reference/shell-thermal/shell-thermal NodalTemperature.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c4c16faae1fb2d005f6841604e1b10e0d1e801fc", + "mode": "100644", + "size_bytes": 48335, + "sha256": "8ee30dd53f9858bf0c2ea34e279222e6848664f1b575ebc69a30bc86a9392feb" + }, + "working_tree": { + "exists": true, + "size_bytes": 49065, + "sha256": "765b0d0f64c24cde6d033d6ef80e0267275a496c97e28d932466eb877810d3e5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shell-thermal/shell-thermal NodalTemperature.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c4c16faae1fb2d005f6841604e1b10e0d1e801fc", + "mode": "100644", + "size_bytes": 48335, + "sha256": "8ee30dd53f9858bf0c2ea34e279222e6848664f1b575ebc69a30bc86a9392feb" + }, + "working_tree": { + "exists": true, + "size_bytes": 49065, + "sha256": "765b0d0f64c24cde6d033d6ef80e0267275a496c97e28d932466eb877810d3e5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 49065, + "sha256": "765b0d0f64c24cde6d033d6ef80e0267275a496c97e28d932466eb877810d3e5" + } + }, + { + "target_path": "reference/shell-thermal/shell-thermal.inp", + "fesa_dev": { + "source_path": "reference/shell-thermal/shell-thermal.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1dca0f4ad4580918fa5cb4a8fc064ba686219b3e", + "mode": "100644", + "size_bytes": 61928, + "sha256": "4df356ddb2ddd6f457fff73a0550343e2dd3809a1999fb1a21efaf385585698f" + }, + "working_tree": { + "exists": true, + "size_bytes": 63528, + "sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shell-thermal/shell-thermal.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1dca0f4ad4580918fa5cb4a8fc064ba686219b3e", + "mode": "100644", + "size_bytes": 61928, + "sha256": "4df356ddb2ddd6f457fff73a0550343e2dd3809a1999fb1a21efaf385585698f" + }, + "working_tree": { + "exists": true, + "size_bytes": 63528, + "sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 63528, + "sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4" + } + }, + { + "target_path": "reference/shell/shell displacements.csv", + "fesa_dev": { + "source_path": "reference/shell/shell displacements.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7595887d288f044ae94c5355f97412ddf8ad2c74", + "mode": "100644", + "size_bytes": 5542, + "sha256": "8f890326a8b09ad416d99e47ca397d20865abe8fa2562b0cb8e3ec929e0327c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 5592, + "sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shell/shell displacements.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7595887d288f044ae94c5355f97412ddf8ad2c74", + "mode": "100644", + "size_bytes": 5542, + "sha256": "8f890326a8b09ad416d99e47ca397d20865abe8fa2562b0cb8e3ec929e0327c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 5592, + "sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5592, + "sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + } + }, + { + "target_path": "reference/shell/shell reactions.csv", + "fesa_dev": { + "source_path": "reference/shell/shell reactions.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ac29d54862a2e4d64ea1ec41e0064dc9d89ecdb5", + "mode": "100644", + "size_bytes": 5474, + "sha256": "1540ca935e8b2bf91c26c087cbabc232b8623d493e802ea0365ba8c15de7f51c" + }, + "working_tree": { + "exists": true, + "size_bytes": 5524, + "sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shell/shell reactions.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ac29d54862a2e4d64ea1ec41e0064dc9d89ecdb5", + "mode": "100644", + "size_bytes": 5474, + "sha256": "1540ca935e8b2bf91c26c087cbabc232b8623d493e802ea0365ba8c15de7f51c" + }, + "working_tree": { + "exists": true, + "size_bytes": 5524, + "sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5524, + "sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + } + }, + { + "target_path": "reference/shell/shell stresses.csv", + "fesa_dev": { + "source_path": "reference/shell/shell stresses.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6a845e1092b7449394a2037f8d464b8d090c273f", + "mode": "100644", + "size_bytes": 43213, + "sha256": "9077b65e7066d86d2f9b91910ab655f20d2d5d40a0c483808542db09c3c400c0" + }, + "working_tree": { + "exists": true, + "size_bytes": 43502, + "sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shell/shell stresses.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6a845e1092b7449394a2037f8d464b8d090c273f", + "mode": "100644", + "size_bytes": 43213, + "sha256": "9077b65e7066d86d2f9b91910ab655f20d2d5d40a0c483808542db09c3c400c0" + }, + "working_tree": { + "exists": true, + "size_bytes": 43502, + "sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 43502, + "sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + } + }, + { + "target_path": "reference/shell/shell.inp", + "fesa_dev": { + "source_path": "reference/shell/shell.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c107a7c61c26dedce6a1d0dab9c90d00fe7c8cf0", + "mode": "100644", + "size_bytes": 4606, + "sha256": "32e6faf4ea47452791d38a56546ad137a92b0629bbee3aab5d6dd4ba03f58e27" + }, + "working_tree": { + "exists": true, + "size_bytes": 4770, + "sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shell/shell.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c107a7c61c26dedce6a1d0dab9c90d00fe7c8cf0", + "mode": "100644", + "size_bytes": 4606, + "sha256": "32e6faf4ea47452791d38a56546ad137a92b0629bbee3aab5d6dd4ba03f58e27" + }, + "working_tree": { + "exists": true, + "size_bytes": 4770, + "sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4770, + "sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + } + }, + { + "target_path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv", + "fesa_dev": { + "source_path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c45dcabd24b47a246152150ea63587e6cd3b3a88", + "mode": "100644", + "size_bytes": 138041, + "sha256": "63be7191755ac25ce5c89b275c162bf2210bdb96021a6e4b71269e14339cecd9" + }, + "working_tree": { + "exists": true, + "size_bytes": 138951, + "sha256": "422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c45dcabd24b47a246152150ea63587e6cd3b3a88", + "mode": "100644", + "size_bytes": 138041, + "sha256": "63be7191755ac25ce5c89b275c162bf2210bdb96021a6e4b71269e14339cecd9" + }, + "working_tree": { + "exists": true, + "size_bytes": 138951, + "sha256": "422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 138951, + "sha256": "422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5" + } + }, + { + "target_path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp", + "fesa_dev": { + "source_path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "77aa5ef2f41121e20c2c4c1fe2a741ae2be4b3a1", + "mode": "100644", + "size_bytes": 55117, + "sha256": "a689c838cb7c42a8959c33f30e50bd0f180d50ff66378b9a2682c7a03ed769b5" + }, + "working_tree": { + "exists": true, + "size_bytes": 56615, + "sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "77aa5ef2f41121e20c2c4c1fe2a741ae2be4b3a1", + "mode": "100644", + "size_bytes": 55117, + "sha256": "a689c838cb7c42a8959c33f30e50bd0f180d50ff66378b9a2682c7a03ed769b5" + }, + "working_tree": { + "exists": true, + "size_bytes": 56615, + "sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 56615, + "sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5" + } + }, + { + "target_path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt", + "fesa_dev": { + "source_path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "11e3bc3de14f79fa5b0c5fc1c329274edee358ad", + "mode": "100644", + "size_bytes": 810, + "sha256": "c2e8beb9b7b0c9c9c71b5092534672c4509d5f5c6ef24bf743539119f1165d44" + }, + "working_tree": { + "exists": true, + "size_bytes": 820, + "sha256": "20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "11e3bc3de14f79fa5b0c5fc1c329274edee358ad", + "mode": "100644", + "size_bytes": 810, + "sha256": "c2e8beb9b7b0c9c9c71b5092534672c4509d5f5c6ef24bf743539119f1165d44" + }, + "working_tree": { + "exists": true, + "size_bytes": 820, + "sha256": "20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 820, + "sha256": "20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b" + } + }, + { + "target_path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp", + "fesa_dev": { + "source_path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5954ef9dd510f20f2e549320c9dcd0e043ebe645", + "mode": "100644", + "size_bytes": 55060, + "sha256": "b128ce84b1abf6c1931f56f3b6fade2d3d032d66f2e23f434d1c0b86b67e6379" + }, + "working_tree": { + "exists": true, + "size_bytes": 56552, + "sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5954ef9dd510f20f2e549320c9dcd0e043ebe645", + "mode": "100644", + "size_bytes": 55060, + "sha256": "b128ce84b1abf6c1931f56f3b6fade2d3d032d66f2e23f434d1c0b86b67e6379" + }, + "working_tree": { + "exists": true, + "size_bytes": 56552, + "sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 56552, + "sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339" + } + }, + { + "target_path": "reference/shellNL/shellNL displacements.csv", + "fesa_dev": { + "source_path": "reference/shellNL/shellNL displacements.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0d80e0294fdd2118d4e2765176efb538b2136ab8", + "mode": "100644", + "size_bytes": 7492, + "sha256": "b782684a729577699f0db067968805d25603d9309d56727263edaa9301067e35" + }, + "working_tree": { + "exists": true, + "size_bytes": 7542, + "sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/ShellNL/shellNL displacements.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0d80e0294fdd2118d4e2765176efb538b2136ab8", + "mode": "100644", + "size_bytes": 7492, + "sha256": "b782684a729577699f0db067968805d25603d9309d56727263edaa9301067e35" + }, + "working_tree": { + "exists": true, + "size_bytes": 7542, + "sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + }, + "working_tree_equals_blob": false + }, + "policy": "map-to-preserved-reference", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7542, + "sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + } + }, + { + "target_path": "reference/shellNL/shellNL reactions.csv", + "fesa_dev": { + "source_path": "reference/shellNL/shellNL reactions.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "866bed13de6599b0a3a6f34a7a821f202bc01f9d", + "mode": "100644", + "size_bytes": 7393, + "sha256": "4776e1592f395cd9dcc456e6aa10aec17fc2ebdd162f5c2c459ab05fa63cdcc4" + }, + "working_tree": { + "exists": true, + "size_bytes": 7443, + "sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/ShellNL/shellNL reactions.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "866bed13de6599b0a3a6f34a7a821f202bc01f9d", + "mode": "100644", + "size_bytes": 7393, + "sha256": "4776e1592f395cd9dcc456e6aa10aec17fc2ebdd162f5c2c459ab05fa63cdcc4" + }, + "working_tree": { + "exists": true, + "size_bytes": 7443, + "sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + }, + "working_tree_equals_blob": false + }, + "policy": "map-to-preserved-reference", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7443, + "sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + } + }, + { + "target_path": "reference/shellNL/shellNL stresses.csv", + "fesa_dev": { + "source_path": "reference/shellNL/shellNL stresses.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "89093bdc378bb1b62b6346c2c012c24d867205be", + "mode": "100644", + "size_bytes": 54431, + "sha256": "133d695f5afdbe2211416d1eda12da1211e2dd334a42c9a71df1d44ce195597e" + }, + "working_tree": { + "exists": true, + "size_bytes": 54720, + "sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/ShellNL/shellNL stresses.csv", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "89093bdc378bb1b62b6346c2c012c24d867205be", + "mode": "100644", + "size_bytes": 54431, + "sha256": "133d695f5afdbe2211416d1eda12da1211e2dd334a42c9a71df1d44ce195597e" + }, + "working_tree": { + "exists": true, + "size_bytes": 54720, + "sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + }, + "working_tree_equals_blob": false + }, + "policy": "map-to-preserved-reference", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 54720, + "sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + } + }, + { + "target_path": "reference/shellNL/shellNL.inp", + "fesa_dev": { + "source_path": "reference/shellNL/shellNL.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "849d3a1cec2c677f3f8004279ec7e8c23da20e85", + "mode": "100644", + "size_bytes": 4614, + "sha256": "09c7e683eae535010ae411cac51e05c7653cd5858ad6a9544ced22c234e9522e" + }, + "working_tree": { + "exists": true, + "size_bytes": 4778, + "sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "reference/ShellNL/shellNL.inp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "849d3a1cec2c677f3f8004279ec7e8c23da20e85", + "mode": "100644", + "size_bytes": 4614, + "sha256": "09c7e683eae535010ae411cac51e05c7653cd5858ad6a9544ced22c234e9522e" + }, + "working_tree": { + "exists": true, + "size_bytes": 4778, + "sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + }, + "working_tree_equals_blob": false + }, + "policy": "map-to-preserved-reference", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4778, + "sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0240c4b85090018f44bd29cf976b078144700a38", + "mode": "100644", + "size_bytes": 110452, + "sha256": "28ee44ce6b1438b6871fd7270eb372ad993e3208d3564e852d454fa23006d279" + }, + "working_tree": { + "exists": true, + "size_bytes": 111182, + "sha256": "2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 111182, + "sha256": "2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "831929299a7f258c5a9914770282f6a97deec1ee", + "mode": "100644", + "size_bytes": 108193, + "sha256": "965794fc1508d07abf83b31b1c2d1c6a62c7e30155e4ebccd1bda7b8fba7a476" + }, + "working_tree": { + "exists": true, + "size_bytes": 108923, + "sha256": "a2347f4e88e4b73c75abe7c23e96bcc696c16c1975e2440b3ad9bf7ecda5f2b6" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 108923, + "sha256": "a2347f4e88e4b73c75abe7c23e96bcc696c16c1975e2440b3ad9bf7ecda5f2b6" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "610b411061824280a1591032760ee1cf0986f4b1", + "mode": "100644", + "size_bytes": 1031467, + "sha256": "0c2326c66db9bbb844523f3826d36469aa91cfd24cbb54b9df73644e46bd7779" + }, + "working_tree": { + "exists": true, + "size_bytes": 1036876, + "sha256": "bc06f3324cc5d6655ded2939b3e1cb9d55a0359fa0d272a6958399464218a128" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1036876, + "sha256": "bc06f3324cc5d6655ded2939b3e1cb9d55a0359fa0d272a6958399464218a128" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5a41700e0452bf6904f9a8cb60e43d72668c6a21", + "mode": "100644", + "size_bytes": 55167, + "sha256": "a9b8abf92b0a98e624ca7b01a4b04cd9b7846748a9b7d3c6e00228f5196f236a" + }, + "working_tree": { + "exists": true, + "size_bytes": 56665, + "sha256": "53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 56665, + "sha256": "53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine/shellNL-meshfine displacements.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine/shellNL-meshfine displacements.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "319d82983eb7002ed386e3d74aa549ca0c352aac", + "mode": "100644", + "size_bytes": 110454, + "sha256": "031747c0e4f68499e94a638a3061e350660ac1c39716c25376d20d3d1860b76a" + }, + "working_tree": { + "exists": true, + "size_bytes": 111184, + "sha256": "740819ff8aed0e279961581f7cdbfa12784cfba3a488c35a652e80103f64433f" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 111184, + "sha256": "740819ff8aed0e279961581f7cdbfa12784cfba3a488c35a652e80103f64433f" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine/shellNL-meshfine reactions.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine/shellNL-meshfine reactions.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "166973edba852f35810f4a82c6b99697502d8875", + "mode": "100644", + "size_bytes": 108221, + "sha256": "cc57958285d9e9379e59fe564880d376b94322d4b67526f393fcb26b34a838c5" + }, + "working_tree": { + "exists": true, + "size_bytes": 108951, + "sha256": "aeb01c98c596792b0e5f2b86a81945cab0beb0c6969cfc6738c6f81df1f94363" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 108951, + "sha256": "aeb01c98c596792b0e5f2b86a81945cab0beb0c6969cfc6738c6f81df1f94363" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine/shellNL-meshfine stresses.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine/shellNL-meshfine stresses.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "eb8ba8300f2ca8d30283061ac4806eeb7e27dcf9", + "mode": "100644", + "size_bytes": 1031460, + "sha256": "4b739cad7d92580c24f95932b4ebabe03bb5a6cfcf5ffaf3892d5d76a4e1fc11" + }, + "working_tree": { + "exists": true, + "size_bytes": 1036869, + "sha256": "6d6213ab5db9d6b1f5fbd641367d08bacc805967b6c5a95bce0e1a5395377782" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1036869, + "sha256": "6d6213ab5db9d6b1f5fbd641367d08bacc805967b6c5a95bce0e1a5395377782" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine/shellNL-meshfine.inp", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine/shellNL-meshfine.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1dd72046b757523472630c69467d3480a75025dd", + "mode": "100644", + "size_bytes": 55022, + "sha256": "636ef0a3579cbcf8907106af4a686e0cc9fe23f4656e34879c8aa6a2bf5db2b8" + }, + "working_tree": { + "exists": true, + "size_bytes": 56516, + "sha256": "40df1ce77311c8d799564a21a60f3bdebb8148d52cae22b7292fdfad32018220" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 56516, + "sha256": "40df1ce77311c8d799564a21a60f3bdebb8148d52cae22b7292fdfad32018220" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bebcf622323ebea853b145a302639046e9a690a6", + "mode": "100644", + "size_bytes": 109825, + "sha256": "1bf7331e6dc2367a4a469487eff9d0012d76b014f3ab5524ccc44e3d84bc2012" + }, + "working_tree": { + "exists": true, + "size_bytes": 110555, + "sha256": "18ec051d265e0bd2c441fe73c08e097b83ee85bc2eb32ffbe3af0dcb9cb89672" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 110555, + "sha256": "18ec051d265e0bd2c441fe73c08e097b83ee85bc2eb32ffbe3af0dcb9cb89672" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bbdec08bff4349464dfed9717a3388b819c638b8", + "mode": "100644", + "size_bytes": 108270, + "sha256": "ff41957db4632b97ea38b8a835cccbda79ac584dc2ede48e1bc5fad32efeaa23" + }, + "working_tree": { + "exists": true, + "size_bytes": 109000, + "sha256": "59348996e0ce80687c9eb2747eeabf84aced4ce97f8a56f0ffddbdca404a57a3" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 109000, + "sha256": "59348996e0ce80687c9eb2747eeabf84aced4ce97f8a56f0ffddbdca404a57a3" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "40678f202e0ea0eef99837547f3a1d0c7f4c4a9a", + "mode": "100644", + "size_bytes": 1031507, + "sha256": "d32660a6a467f115a2c379f0b107b89c43a03b50e6500657dd7dd3612797f2f0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1036916, + "sha256": "933a72025a0e897fd65f81c913e53d1730bd551ce95cbdea96f9f99b10be8b18" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1036916, + "sha256": "933a72025a0e897fd65f81c913e53d1730bd551ce95cbdea96f9f99b10be8b18" + } + }, + { + "target_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02.inp", + "fesa_dev": { + "source_path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02.inp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8f1fe4b48fbb2b13fb0e9a920986ef09469c1570", + "mode": "100644", + "size_bytes": 55058, + "sha256": "c0863e9fc98c278e96aa8675ed1f459e0ce3b83f5fe3a2a849d306b7a9138c9c" + }, + "working_tree": { + "exists": true, + "size_bytes": 56554, + "sha256": "daec7592489837b165d55382caeaf53e21d84d804aa38c73cbf35e5cc0bac3e5" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-excluded-temp-in-place", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 56554, + "sha256": "daec7592489837b165d55382caeaf53e21d84d804aa38c73cbf35e5cc0bac3e5" + } + }, + { + "target_path": "scripts/AGENTS.md", + "refactor": { + "source_path": "scripts/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "224f98998bf4a474710e46b596da7a12baaa1415", + "mode": "100644", + "size_bytes": 1430, + "sha256": "6c4a44b0767a32fb48b8366c8fefb3ea9390f44f544641a0b2d295bdeb51d798" + }, + "working_tree": { + "exists": true, + "size_bytes": 1446, + "sha256": "47caf15288f3da7df59821e3b36b20e93d5b6777ebb91a2886bc0e01ace5db87" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "scripts/verification/capture_run.py", + "refactor": { + "source_path": "scripts/verification/capture_run.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9ee8f4be5a8846fa0a9ef4541e95f1133de238cf", + "mode": "100644", + "size_bytes": 4931, + "sha256": "ca85f6264ab7d9f7bb56f0b325ff8bad14739f2389910b569169c1d32d0f93aa" + }, + "working_tree": { + "exists": true, + "size_bytes": 5048, + "sha256": "d0fbccaafef6344bc138fa16f1e6e6f539d0c1b73a14c3dccc674ba99729b9fb" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "scripts/verification/compare_hex8.py", + "refactor": { + "source_path": "scripts/verification/compare_hex8.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0bbc294614cc05c292b2d3016dc217ef8eb57345", + "mode": "100644", + "size_bytes": 48573, + "sha256": "9d8034867cbf1e9c4b87a9eeec16d1b56ef99fdf9351b017aaa2254a17b7fc77" + }, + "working_tree": { + "exists": true, + "size_bytes": 49380, + "sha256": "691a33d6393cb57358fb10dc3711bae254f6eae1d2dcd035bb2a68a3a64423bb" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "scripts/verification/compare_hht_dynamic.py", + "refactor": { + "source_path": "scripts/verification/compare_hht_dynamic.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "074830a8e7169ff8acda7f477b2e7dcc0db3471a", + "mode": "100644", + "size_bytes": 24621, + "sha256": "4ab5b8e7743d66da869aabba124231fb97095ea04bc329b1bfa14c5da84ab1f4" + }, + "working_tree": { + "exists": true, + "size_bytes": 25057, + "sha256": "59e3e19177e63041c215208a2b9cad8e2d81569ca757d9fe31e588b22ba4a070" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor" + }, + { + "target_path": "scripts/verification/cpu_isa_probe.cpp", + "refactor": { + "source_path": "scripts/verification/cpu_isa_probe.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "da3d9ea4de5d5ececc59286e18998fb9b526c0c4", + "mode": "100644", + "size_bytes": 945, + "sha256": "6eff41372a303a8a483277371c0cd7f9b8314e1a9e19ff5a6cd41b9998bed9fa" + }, + "working_tree": { + "exists": true, + "size_bytes": 970, + "sha256": "aa0b7321b4785e75748815292cfa1d33d3f59ee7d2551a6849e3ebb33d8d7bd0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "scripts/verification/hdf5_inventory.py", + "refactor": { + "source_path": "scripts/verification/hdf5_inventory.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1812e57c2c05d2bc9d29a7f1764070fd2e2f280c", + "mode": "100644", + "size_bytes": 5788, + "sha256": "41fb3b2c96aebdd994643c70181e0d396e8c27e3d3e3f9ff2fa2413dca536633" + }, + "working_tree": { + "exists": true, + "size_bytes": 5910, + "sha256": "6eba89bea45a0752920cc8db325003ac875ae051c434843d96a83f04a8da5d4c" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "scripts/verification/report_nonlinear_baseline.cpp", + "refactor": { + "source_path": "scripts/verification/report_nonlinear_baseline.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "70462455e977b24e9e8896096bbff6ac54db62c8", + "mode": "100644", + "size_bytes": 2937, + "sha256": "eb877cb58948b60c399dbe0d6755da9210218a71bfd00546c4b8b9cb1ad5f0bf" + }, + "working_tree": { + "exists": true, + "size_bytes": 2996, + "sha256": "cc92b430044253b092d4f5ec42e5903dd4714ee79a554aab3ae030e14359be99" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "scripts/verification/source_inventory.py", + "refactor": { + "source_path": "scripts/verification/source_inventory.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e40a52e7c725b5d5507b3453a69b2004d2e86884", + "mode": "100644", + "size_bytes": 6612, + "sha256": "310c56aa84014ab5385b890f98791348754b3ada7cf4bf5bcfc87b2bfbed7108" + }, + "working_tree": { + "exists": true, + "size_bytes": 6731, + "sha256": "2c3cde453d0f1d26f49bfd0715bf7d4216b2cc7104a7677bc6c80ba06ac1186e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content" + }, + { + "target_path": "src/fesa/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9ec337b137d02052585347b5de80ed8bd48bc087", + "mode": "100644", + "size_bytes": 1103, + "sha256": "2da3084e9958e108fe16d1e19afb255ac85ec3878eb46a5991aba86993db2a85" + }, + "working_tree": { + "exists": true, + "size_bytes": 1117, + "sha256": "71b89191cf4dccea03de95baeb651ad22223a5e9dfbdc03c8b39c8ac5f37a1bd" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3f1dce02bc403fba6f08a4c635dca30fd85fa679", + "mode": "100644", + "size_bytes": 1163, + "sha256": "77bb04cfbc8b331eb5daaf4f3976296afb69da2239dbe93d222c4a84bd4311d0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1177, + "sha256": "c9dc90e421d7f1e59f6d66e1abf582727611d2c390ad082757074e0094bd6320" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1117, + "sha256": "71b89191cf4dccea03de95baeb651ad22223a5e9dfbdc03c8b39c8ac5f37a1bd" + } + }, + { + "target_path": "src/fesa/CMakeLists.txt", + "fesa_dev": { + "source_path": "src/fesa/CMakeLists.txt", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "76776790bf054b6a5f0df33cf35b04c7d28b3d3b", + "mode": "100644", + "size_bytes": 7136, + "sha256": "93fb28c6413ac1636c97b6f7af11b14007768e27020bce9f1f51c060f71055ec" + }, + "working_tree": { + "exists": true, + "size_bytes": 7335, + "sha256": "0fe46d465ed53055be78aa14a80072099274c19c6ff6ca9e7b292b5f02bb5d47" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/CMakeLists.txt", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "475748b5084ae4c95bf6633290cfead9559bd180", + "mode": "100644", + "size_bytes": 7253, + "sha256": "b28b84510f9fce25b88140dc643ac1c7fa97e7c329f8f3567b88f49ad96096fb" + }, + "working_tree": { + "exists": true, + "size_bytes": 7455, + "sha256": "5dd2eb0149dd9c615672bcc3b63ebf40bdefc838fe8a89d5566fbad616c5e495" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7335, + "sha256": "0fe46d465ed53055be78aa14a80072099274c19c6ff6ca9e7b292b5f02bb5d47" + } + }, + { + "target_path": "src/fesa/analysis/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/analysis/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "729e026185cffe2cdd4c046f5565b49ad69e505b", + "mode": "100644", + "size_bytes": 1389, + "sha256": "da62a6d51e8de526d545a2f842f6c99079a8e8b23fc6eea33efc29b4fd04596c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1404, + "sha256": "178b63a75018ab28640e761f56b809390dba76addac7092996a57daa25aa6ca4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7bca737bc5b7b4a391d44a8989514943101ddc5e", + "mode": "100644", + "size_bytes": 1662, + "sha256": "52cc5f047ad583548ff18b5c1938bebe6f43320249791422da39235e79c25770" + }, + "working_tree": { + "exists": true, + "size_bytes": 1681, + "sha256": "33058ed0b3c55aa67c1bca4fa45626319930d6c999e787e93272c85546d34ca7" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1405, + "sha256": "bd30580d11375b87160e68ae380a05ac83513a572a6e028c93a970dceb014649" + } + }, + { + "target_path": "src/fesa/analysis/analysis_model.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/analysis_model.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "759c19ea194783b978fd6db5aeff8361f961717d", + "mode": "100644", + "size_bytes": 7285, + "sha256": "6a6b8c393f9c53f6252c7e5e97a3cc34cf8b6a8b6c6f5fee840d37e8d24b1516" + }, + "working_tree": { + "exists": true, + "size_bytes": 7485, + "sha256": "1f2e53a87e187702d6dbd989253e21bbbe63a5ea2b53bd8bde5295f2d8a8be45" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/analysis_model.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "759c19ea194783b978fd6db5aeff8361f961717d", + "mode": "100644", + "size_bytes": 7285, + "sha256": "6a6b8c393f9c53f6252c7e5e97a3cc34cf8b6a8b6c6f5fee840d37e8d24b1516" + }, + "working_tree": { + "exists": true, + "size_bytes": 7485, + "sha256": "1f2e53a87e187702d6dbd989253e21bbbe63a5ea2b53bd8bde5295f2d8a8be45" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7485, + "sha256": "1f2e53a87e187702d6dbd989253e21bbbe63a5ea2b53bd8bde5295f2d8a8be45" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1f2e53a87e187702d6dbd989253e21bbbe63a5ea2b53bd8bde5295f2d8a8be45", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/analysis_procedures.h", + "refactor": { + "source_path": "src/fesa/analysis/analysis_procedures.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "96f075ed3030a74326c1d7e0ba4ad85f914c3e7f", + "mode": "100644", + "size_bytes": 7593, + "sha256": "44e88c95abaf4ef2d8f70832bd0b19fa1b6254d5febf55470c30c6c6957b4172" + }, + "working_tree": { + "exists": true, + "size_bytes": 7763, + "sha256": "0229ebfb74b980663c49cf4b5aae499d000acbfa783fd0678baf3cd38690c21f" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0229ebfb74b980663c49cf4b5aae499d000acbfa783fd0678baf3cd38690c21f", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/analysis_state.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/analysis_state.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "eb82384a70bdd67d95fa5e0ab38de8c3e702bc7e", + "mode": "100644", + "size_bytes": 8075, + "sha256": "bc5e21d5ef42b61d1dfbdf73f925c171a32c27c59c22860f37f78b5e1c5fb7dc" + }, + "working_tree": { + "exists": true, + "size_bytes": 8298, + "sha256": "b3ccefebacc94637023f084de5045dc71a6756c352489fc65db7c597600c7b8e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/analysis_state.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "786be82656811767f39918eba605b3a57f8086fa", + "mode": "100644", + "size_bytes": 7319, + "sha256": "b189951aa24b66be3f89806cb4f088668a8f46728d134960f5ee16e4598622a1" + }, + "working_tree": { + "exists": true, + "size_bytes": 7523, + "sha256": "52b659718f78d1e5ab21cf344b85b773ea71883a3ec8f1196f5458b053cfa1b0" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8298, + "sha256": "b3ccefebacc94637023f084de5045dc71a6756c352489fc65db7c597600c7b8e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "52b659718f78d1e5ab21cf344b85b773ea71883a3ec8f1196f5458b053cfa1b0", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/dynamic_analysis_state.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/dynamic_analysis_state.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b494aa2d027e0da75342dc6da376e5e38761ca80", + "mode": "100644", + "size_bytes": 17776, + "sha256": "54763934e6c38401b56dce483d097baf7573cfcd09c1c3c21cb7ab397963d5bf" + }, + "working_tree": { + "exists": true, + "size_bytes": 18179, + "sha256": "a208e819c46827783b2053ff9dc65c6477b2e801b11ef47c7a8f0b499301858d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/dynamic_analysis_state.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3e374c00e953f949ae6e452380523457c898617b", + "mode": "100644", + "size_bytes": 16152, + "sha256": "7b31319491f6e69c520233f203ab831fcf8cce688cb77a1755e2800b0fb9cedb" + }, + "working_tree": { + "exists": true, + "size_bytes": 16521, + "sha256": "f6192e7d0bdc3a4755b9a80fdc9a9cfc6ceb05d8bf92cf843f901ed9b4e4efc2" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18192, + "sha256": "598015ba5c07c5d6c10df3a635aa3f1afdc345081a690d93ec38382eb13afac5" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f6192e7d0bdc3a4755b9a80fdc9a9cfc6ceb05d8bf92cf843f901ed9b4e4efc2", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/eigen_reduction.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/eigen_reduction.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2b172e40456e22374f1078d926eda1ea38b63b17", + "mode": "100644", + "size_bytes": 18023, + "sha256": "c08a06c7975cdf72904955bff85e0e6ed75b21886f3eaed84463d30de297f875" + }, + "working_tree": { + "exists": true, + "size_bytes": 18464, + "sha256": "ca6953cbbc0a18670ade80e43f578344ffb329a1aa1827d4fd4c70889daaea40" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/eigen_reduction.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a7e7a0d0279f155ce43bba9a0736486d17cd2255", + "mode": "100644", + "size_bytes": 17886, + "sha256": "3dd501f6049e7f3d9086c8a020f63501503ace62f5c69cdf47c962db8ef38555" + }, + "working_tree": { + "exists": true, + "size_bytes": 18322, + "sha256": "043f3aff7eee3318fd48e9ecb6974296ce1f3779a2e25bb7ee8a128a1666eb66" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18464, + "sha256": "ca6953cbbc0a18670ade80e43f578344ffb329a1aa1827d4fd4c70889daaea40" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "043f3aff7eee3318fd48e9ecb6974296ce1f3779a2e25bb7ee8a128a1666eb66", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/eigen_reduction.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/eigen_reduction.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "13ea6afe0fc737ef848fd14c73529c4ccb503dc4", + "mode": "100644", + "size_bytes": 1866, + "sha256": "5d765f983f0b5a83bee2c35de1b8198f1373bdaa0ced11082cd592554ebcc8d9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1923, + "sha256": "2c99e7a5972a6696bb4b46888ff53da6cb94a9ef4784fd28f3d31d5552d37cdf" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/eigen_reduction.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "13ea6afe0fc737ef848fd14c73529c4ccb503dc4", + "mode": "100644", + "size_bytes": 1866, + "sha256": "5d765f983f0b5a83bee2c35de1b8198f1373bdaa0ced11082cd592554ebcc8d9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1923, + "sha256": "2c99e7a5972a6696bb4b46888ff53da6cb94a9ef4784fd28f3d31d5552d37cdf" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1923, + "sha256": "2c99e7a5972a6696bb4b46888ff53da6cb94a9ef4784fd28f3d31d5552d37cdf" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2c99e7a5972a6696bb4b46888ff53da6cb94a9ef4784fd28f3d31d5552d37cdf", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/equilibrium_algorithm.h", + "refactor": { + "source_path": "src/fesa/analysis/equilibrium_algorithm.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b50d4926dc732cae37208c4801f3aebbd7831ae0", + "mode": "100644", + "size_bytes": 3481, + "sha256": "40e2d407ada189144864b95e21ae4ab04f96364d6c24be746d3d6f33cec0c0f7" + }, + "working_tree": { + "exists": true, + "size_bytes": 3567, + "sha256": "b0ff1b287b591bffa422a639c36abbdbbb5c9421ac0b47bda60bd20fb5b02472" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b0ff1b287b591bffa422a639c36abbdbbb5c9421ac0b47bda60bd20fb5b02472", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_dynamic_algebra.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_dynamic_algebra.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "45745fb38c0944c31a560a689b34c40537f3b421", + "mode": "100644", + "size_bytes": 37157, + "sha256": "0bc75fa53ce6575449df1af25c09cd1f165f5bca6f3f14381e3f97668af9eebe" + }, + "working_tree": { + "exists": true, + "size_bytes": 37992, + "sha256": "737597edbb5511d998c57fa44a7eb889310aa163f77028ae3ab0bec268e94044" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_dynamic_algebra.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "09d68039adac6867393ff2d91554a1d2c81564fa", + "mode": "100644", + "size_bytes": 36145, + "sha256": "e99f7d6fc183b56ee0a527b4c09c39d547ea9c82f79cf03204aa86070ebd570c" + }, + "working_tree": { + "exists": true, + "size_bytes": 36956, + "sha256": "0b8595c6bde242b519defddda400334687a7054bc201e20613dc9d6d50e26137" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 37992, + "sha256": "737597edbb5511d998c57fa44a7eb889310aa163f77028ae3ab0bec268e94044" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0b8595c6bde242b519defddda400334687a7054bc201e20613dc9d6d50e26137", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_dynamic_assembly.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_dynamic_assembly.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bc600300b326550bf2154fd0f56d364b72c3f876", + "mode": "100644", + "size_bytes": 33886, + "sha256": "d67a9e7363b48026d070f06ab27846ef29f8469f60caca546d1d1cd07b91386c" + }, + "working_tree": { + "exists": true, + "size_bytes": 34619, + "sha256": "383550a38f5a2636f49d40f9a17e28ed05cf228a2f7318d13edda49bbe7cfdf0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_dynamic_assembly.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "17012ab2e6a069f0f20443d428925ec17764be46", + "mode": "100644", + "size_bytes": 34853, + "sha256": "2b0480b6e0afb2dc90e671870a7cae102f565468792b3df1160e23ea295574f5" + }, + "working_tree": { + "exists": true, + "size_bytes": 35603, + "sha256": "7d7c541131fa4b050b775111f94b3521d53c89c5cb12855283247d00448ae77c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 34619, + "sha256": "383550a38f5a2636f49d40f9a17e28ed05cf228a2f7318d13edda49bbe7cfdf0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7d7c541131fa4b050b775111f94b3521d53c89c5cb12855283247d00448ae77c", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_dynamic_internal.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_dynamic_internal.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c199e93facbf77a3ffd01929c0c7737f712bc8e4", + "mode": "100644", + "size_bytes": 7735, + "sha256": "a2a0b34b0b842ad9a888d248bb016c25b49708bd8217dc282a525b848e0b0813" + }, + "working_tree": { + "exists": true, + "size_bytes": 7913, + "sha256": "dacc5d797e3ed1089a86b8b90c727a16aafc368f3acda3526993aa7476565736" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_dynamic_internal.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2911f41dc1682a433cad3ae026da7fb54a4b7244", + "mode": "100644", + "size_bytes": 8326, + "sha256": "cbf76ec9619e4aee966f83e97856b488d1919a3429a59b9f9edf8a71a328d9b1" + }, + "working_tree": { + "exists": true, + "size_bytes": 8514, + "sha256": "0b5f73b574a5a92e829a5242c6614caf189b3d773687ee146ed34c7807671654" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7913, + "sha256": "dacc5d797e3ed1089a86b8b90c727a16aafc368f3acda3526993aa7476565736" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0b5f73b574a5a92e829a5242c6614caf189b3d773687ee146ed34c7807671654", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_dynamic_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_dynamic_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bf827b730b7b48e5b7f2985f6cf926b5025acf53", + "mode": "100644", + "size_bytes": 666, + "sha256": "0585c58aa6bfa809b4129931b4010924608eb1f31d85c988503afd6ae97500ac" + }, + "working_tree": { + "exists": true, + "size_bytes": 684, + "sha256": "99c1d22d51d7729fb973bf1cf1b5c60ffad0c38d2bce98033674c7a5e67fc8ee" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_dynamic_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bf827b730b7b48e5b7f2985f6cf926b5025acf53", + "mode": "100644", + "size_bytes": 666, + "sha256": "0585c58aa6bfa809b4129931b4010924608eb1f31d85c988503afd6ae97500ac" + }, + "working_tree": { + "exists": true, + "size_bytes": 684, + "sha256": "99c1d22d51d7729fb973bf1cf1b5c60ffad0c38d2bce98033674c7a5e67fc8ee" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 684, + "sha256": "99c1d22d51d7729fb973bf1cf1b5c60ffad0c38d2bce98033674c7a5e67fc8ee" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "99c1d22d51d7729fb973bf1cf1b5c60ffad0c38d2bce98033674c7a5e67fc8ee", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_reduced_increment.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_reduced_increment.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "00ea9de4214b0bacadcf1744866e27c063e7f332", + "mode": "100644", + "size_bytes": 3684, + "sha256": "9ef99d6a2801891e60b181ad598b6ca924b054d6be9c600c0cad358d6fc62a7e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3684, + "sha256": "9ef99d6a2801891e60b181ad598b6ca924b054d6be9c600c0cad358d6fc62a7e" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_reduced_increment.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "00ea9de4214b0bacadcf1744866e27c063e7f332", + "mode": "100644", + "size_bytes": 3684, + "sha256": "9ef99d6a2801891e60b181ad598b6ca924b054d6be9c600c0cad358d6fc62a7e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3779, + "sha256": "88a53eb7b14a07003da29980be3b9beb3725d1a8bad3dc120e98ca28e017fb97" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3779, + "sha256": "88a53eb7b14a07003da29980be3b9beb3725d1a8bad3dc120e98ca28e017fb97" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "88a53eb7b14a07003da29980be3b9beb3725d1a8bad3dc120e98ca28e017fb97", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_reduced_integrator.h", + "refactor": { + "source_path": "src/fesa/analysis/hht_reduced_integrator.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5e461a68cb7dfc7b760b921871b4061a9f2b6a30", + "mode": "100644", + "size_bytes": 2821, + "sha256": "0bdea1af9b33100cb044cdcdcbd4533fc1fee3ddd521f0f9ee1bb1a7f9a46b76" + }, + "working_tree": { + "exists": true, + "size_bytes": 2895, + "sha256": "c24755a15a407827ee0595da155cfb2c0dd3b69ceaf73eaf2223d5cc4d7908ab" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c24755a15a407827ee0595da155cfb2c0dd3b69ceaf73eaf2223d5cc4d7908ab", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_reduced_internal.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_reduced_internal.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fc5b52c348d5b1d9aa8d7aee207a15bef2215f6f", + "mode": "100644", + "size_bytes": 9989, + "sha256": "149b559688acea92a022a95461fe7a1c31b937e4aea0c1aa7db2cd6633a7823f" + }, + "working_tree": { + "exists": true, + "size_bytes": 9989, + "sha256": "149b559688acea92a022a95461fe7a1c31b937e4aea0c1aa7db2cd6633a7823f" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_reduced_internal.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fc5b52c348d5b1d9aa8d7aee207a15bef2215f6f", + "mode": "100644", + "size_bytes": 9989, + "sha256": "149b559688acea92a022a95461fe7a1c31b937e4aea0c1aa7db2cd6633a7823f" + }, + "working_tree": { + "exists": true, + "size_bytes": 10236, + "sha256": "53149a7af8e159ac73f48ae9a4f2925a1fcc73abfea014380fe3eb4f17dd1470" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10236, + "sha256": "53149a7af8e159ac73f48ae9a4f2925a1fcc73abfea014380fe3eb4f17dd1470" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "53149a7af8e159ac73f48ae9a4f2925a1fcc73abfea014380fe3eb4f17dd1470", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_reduced_operators.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_reduced_operators.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a34cb5ae22ba3cd9a83c0228f7bbc37dbba4e892", + "mode": "100644", + "size_bytes": 68437, + "sha256": "aca0ba5d729875a1cebd6981fe62033682d7378863752a32c3d9dd098a04b21f" + }, + "working_tree": { + "exists": true, + "size_bytes": 69872, + "sha256": "ce8d4785d3073f8b55d9aa7ab9d24784aff30e8aa49f6a66046cd34074566baa" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_reduced_operators.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4f0b94b2fc82f813503843771e534b48ae53fa80", + "mode": "100644", + "size_bytes": 66814, + "sha256": "4dff316c72b05df6d365d45209dfbfa51c2bb2d061f3c9b460f401e2dc01e9aa" + }, + "working_tree": { + "exists": true, + "size_bytes": 68207, + "sha256": "6baacadd40d472ece2dcfc7fecf60227b9d5ff96ce1ed1cbed48176f1c752dfa" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 69872, + "sha256": "ce8d4785d3073f8b55d9aa7ab9d24784aff30e8aa49f6a66046cd34074566baa" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6baacadd40d472ece2dcfc7fecf60227b9d5ff96ce1ed1cbed48176f1c752dfa", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_reduced_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_reduced_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e7d9e406304448e591788dbd5ca2817ebdf60a24", + "mode": "100644", + "size_bytes": 53094, + "sha256": "c26ee4966f91eebbe3ec5e5718e6a5980157016bb79be926b5e30b5f37619c6f" + }, + "working_tree": { + "exists": true, + "size_bytes": 53726, + "sha256": "2c0f0e3015626f583fa053dbd12e89ec5116e973186cacdfe1db89731196920e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_reduced_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "efcd372cff96806c1fce7c51dd0e0b7f51c4a673", + "mode": "100644", + "size_bytes": 61697, + "sha256": "fe61de24cf1646d99f00ecbaf2cfb131e2135791abe89229d384b024d09c170c" + }, + "working_tree": { + "exists": true, + "size_bytes": 62819, + "sha256": "927fa94d1836ad0b53ee8a03bace9c3fae63471a69fadf47f63ae5dd06dee7b8" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 54040, + "sha256": "8de5585a8ac7d94a90499e39fbfab251f037387a77564eb8d8101277bec234eb" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "927fa94d1836ad0b53ee8a03bace9c3fae63471a69fadf47f63ae5dd06dee7b8", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_reduced_procedure.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_reduced_procedure.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "93d72d9be19e8af5220eca65f2bdeff443ed031f", + "mode": "100644", + "size_bytes": 803, + "sha256": "30a2325dc970a58a6b02f721e2193df94a99050d864f37e25847a1edbe308326" + }, + "working_tree": { + "exists": true, + "size_bytes": 803, + "sha256": "30a2325dc970a58a6b02f721e2193df94a99050d864f37e25847a1edbe308326" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_reduced_procedure.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "572bfb767003429448caaed7b6ef61afe2d21c1d", + "mode": "100644", + "size_bytes": 1298, + "sha256": "2841746a62b8a1c56a28b8cb7d5cb08c13e8d88cb5070b3e32980704f4ddb5c9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1337, + "sha256": "b2b6f50b206caeb0f9d74866b2c59e9e38fa701d974572bd4ec14f8579bb0448" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 830, + "sha256": "4c7d98491f698f10c3a1611fbef36390ccd93e6fe27682ff0e4a6f9e806cdc0a" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b2b6f50b206caeb0f9d74866b2c59e9e38fa701d974572bd4ec14f8579bb0448", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/hht_time_integration.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/hht_time_integration.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6992522fefa21d424f57143d3be830ece0ef99c1", + "mode": "100644", + "size_bytes": 3983, + "sha256": "281c4e8e630bb19449ca04883ba0ba456757dcd3fe1c0c6172e128102ee061ad" + }, + "working_tree": { + "exists": true, + "size_bytes": 4080, + "sha256": "31c33d2c90a6427b7b699cf1b07cbadc66b02a31bd959516b60c96c325c8f9ba" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/hht_time_integration.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6992522fefa21d424f57143d3be830ece0ef99c1", + "mode": "100644", + "size_bytes": 3983, + "sha256": "281c4e8e630bb19449ca04883ba0ba456757dcd3fe1c0c6172e128102ee061ad" + }, + "working_tree": { + "exists": true, + "size_bytes": 4080, + "sha256": "31c33d2c90a6427b7b699cf1b07cbadc66b02a31bd959516b60c96c325c8f9ba" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4080, + "sha256": "31c33d2c90a6427b7b699cf1b07cbadc66b02a31bd959516b60c96c325c8f9ba" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "31c33d2c90a6427b7b699cf1b07cbadc66b02a31bd959516b60c96c325c8f9ba", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/linear_frequency_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/linear_frequency_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fe3110c7b8556beb24db83b10414bbbf965373fe", + "mode": "100644", + "size_bytes": 19391, + "sha256": "81630176e3e179327449884d240423c591b93e4ba0e053a7c9b0bfedbebbc619" + }, + "working_tree": { + "exists": true, + "size_bytes": 19831, + "sha256": "95208910a4df1b6c26ff4f5247fd596197e02ac7081ff02ffd060b213d21e27e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/linear_frequency_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d351098bcf1f3d35cb781ccaec123bcd952586c3", + "mode": "100644", + "size_bytes": 19685, + "sha256": "33daba55692ed0c87bf9eae43d418195da69c883574eb0bf1b8130ebe1f3b857" + }, + "working_tree": { + "exists": true, + "size_bytes": 20131, + "sha256": "6e550854aa4cfdf0398b11f751bc9e60dd4dd292716493f4d2077f910d620577" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 19831, + "sha256": "95208910a4df1b6c26ff4f5247fd596197e02ac7081ff02ffd060b213d21e27e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6e550854aa4cfdf0398b11f751bc9e60dd4dd292716493f4d2077f910d620577", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/linear_static_analysis.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/linear_static_analysis.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8377207761bab633ca381c896e91bc4847b84d8a", + "mode": "100644", + "size_bytes": 1251, + "sha256": "0dcb941069f098c6ff22c9afd34e1d40773e23003616048db6e8feaeb15375b9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1288, + "sha256": "46411827221f04928eb3221ea1e8e89a5de530cb0c844adae071cd02aef34302" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/linear_static_analysis.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8377207761bab633ca381c896e91bc4847b84d8a", + "mode": "100644", + "size_bytes": 1251, + "sha256": "0dcb941069f098c6ff22c9afd34e1d40773e23003616048db6e8feaeb15375b9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1288, + "sha256": "46411827221f04928eb3221ea1e8e89a5de530cb0c844adae071cd02aef34302" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1288, + "sha256": "46411827221f04928eb3221ea1e8e89a5de530cb0c844adae071cd02aef34302" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "46411827221f04928eb3221ea1e8e89a5de530cb0c844adae071cd02aef34302", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/linear_static_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/linear_static_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f10752395f25b9b0453faaca5dbd33ca2c9f8b7c", + "mode": "100644", + "size_bytes": 6886, + "sha256": "e8a1b8f8861b813e91540118861f81357908ba34e2965e3eb28038312fe107a3" + }, + "working_tree": { + "exists": true, + "size_bytes": 7062, + "sha256": "cdbf0b3c26a3be304c586d3ae0a9cb184c29e6310862014aa8c83808275f7268" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/linear_static_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8734275b5b67cb31e17f9ea8bd4be2dec4a76b26", + "mode": "100644", + "size_bytes": 6899, + "sha256": "a88f547cfa1675a21a189d3ac97094f0f79e38756bb21a3d751ef55ec5cd209d" + }, + "working_tree": { + "exists": true, + "size_bytes": 7075, + "sha256": "7dc57443c9ebb950cde0b6ee05b8392c53ffbd415aed4ddddca42c5a8005a959" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7062, + "sha256": "cdbf0b3c26a3be304c586d3ae0a9cb184c29e6310862014aa8c83808275f7268" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7dc57443c9ebb950cde0b6ee05b8392c53ffbd415aed4ddddca42c5a8005a959", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/newton_iteration_log.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/newton_iteration_log.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "895364ef014dfe0043d701b82cf57c7a6cef3737", + "mode": "100644", + "size_bytes": 22129, + "sha256": "c1ee979719d0e2efbf41d4954d2359f8ed28517153e6f13f013bf3db5b7a3582" + }, + "working_tree": { + "exists": true, + "size_bytes": 22698, + "sha256": "28897eda1e5b3d303199c50b7cce2303506a7e49608c4dd13d10726aebad6edc" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/newton_iteration_log.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "895364ef014dfe0043d701b82cf57c7a6cef3737", + "mode": "100644", + "size_bytes": 22129, + "sha256": "c1ee979719d0e2efbf41d4954d2359f8ed28517153e6f13f013bf3db5b7a3582" + }, + "working_tree": { + "exists": true, + "size_bytes": 22698, + "sha256": "28897eda1e5b3d303199c50b7cce2303506a7e49608c4dd13d10726aebad6edc" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 22698, + "sha256": "28897eda1e5b3d303199c50b7cce2303506a7e49608c4dd13d10726aebad6edc" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "28897eda1e5b3d303199c50b7cce2303506a7e49608c4dd13d10726aebad6edc", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/nonlinear_analysis_state.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/nonlinear_analysis_state.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "79c6a916d2257f9d4e7f8f2249c420a0e9252d96", + "mode": "100644", + "size_bytes": 13003, + "sha256": "00d3e7eacdf7c52b6fd2d6da8d93fa6e7c863946c7b94da821acd332622c2689" + }, + "working_tree": { + "exists": true, + "size_bytes": 13323, + "sha256": "a4d2127c9c6b1e794979889165aae8f1fc26d0ee172c0f336f4bf3f60dee5e91" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/nonlinear_analysis_state.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "23c3ee41d046c3e93c8634b394f82fe40bbb9be7", + "mode": "100644", + "size_bytes": 11335, + "sha256": "eaa8f3cd085b346df55f00d81ac1236118e73d0f245e6a22059a49aa047acaf1" + }, + "working_tree": { + "exists": true, + "size_bytes": 11608, + "sha256": "a8950c19928d66ad16d481711da56f84deb49317e2872f7cb389267a04d0d834" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13323, + "sha256": "a4d2127c9c6b1e794979889165aae8f1fc26d0ee172c0f336f4bf3f60dee5e91" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a8950c19928d66ad16d481711da56f84deb49317e2872f7cb389267a04d0d834", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/nonlinear_static_control.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/nonlinear_static_control.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "86235ae16e5f648651d59e52941aeb6a870a0fca", + "mode": "100644", + "size_bytes": 22810, + "sha256": "459af50bfb694eb5dd4d95b9241147d00ed363a1bda96192e6da6f643a742a6e" + }, + "working_tree": { + "exists": true, + "size_bytes": 23358, + "sha256": "fe8e613fe3f7b52e21334576c63bd3be8125c749f5e3c3c0a9897ecbc304f82c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/nonlinear_static_control.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b1daa03d5c64babc93dcb479ef4128ab7967691e", + "mode": "100644", + "size_bytes": 21552, + "sha256": "5e6c83042a5f7403350a04a742c4073bfa2fbc9fc4b0a4ddd12524ebc968b4b6" + }, + "working_tree": { + "exists": true, + "size_bytes": 22067, + "sha256": "0bf0362bdff08dfba687412b569aa53dbe2c2fb43a3f0a4a2a10ec688e145cf8" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 23358, + "sha256": "fe8e613fe3f7b52e21334576c63bd3be8125c749f5e3c3c0a9897ecbc304f82c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0bf0362bdff08dfba687412b569aa53dbe2c2fb43a3f0a4a2a10ec688e145cf8", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/nonlinear_static_core.h", + "refactor": { + "source_path": "src/fesa/analysis/nonlinear_static_core.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "25298f86302ed00913e547fb72e0a955ac4d3989", + "mode": "100644", + "size_bytes": 729, + "sha256": "571830078bc7a186729d958a99488a454439059364723035716ccac3695b1c2a" + }, + "working_tree": { + "exists": true, + "size_bytes": 745, + "sha256": "983dfbfa48afa2b079a6af168bc4999ddf5bd296064a072c42526999d1b59111" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "983dfbfa48afa2b079a6af168bc4999ddf5bd296064a072c42526999d1b59111", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/nonlinear_static_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/nonlinear_static_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c503758b5da90f231810a3327f1b29799a2e7e60", + "mode": "100644", + "size_bytes": 43144, + "sha256": "154392f99c58cd08b0f3d06e82c2380081d462ede7c837fd66b3022169d17c89" + }, + "working_tree": { + "exists": true, + "size_bytes": 44130, + "sha256": "a65bff3c60608eaa2d7e2ccdecaaa80d8f4f529f1e9ed37e2afc68f12eda5c08" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/nonlinear_static_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4412f2220f0a361721031d394815844d5318c0ff", + "mode": "100644", + "size_bytes": 45459, + "sha256": "afcb8db71bce11cf62dc3544c7072a64c244eb6ba73ee0706242e85b98f2e20f" + }, + "working_tree": { + "exists": true, + "size_bytes": 46475, + "sha256": "67c983ccc020c5ffbcc28b48feed1aadf5d5a98ccd57d917ce07afde74c21d24" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 44130, + "sha256": "a65bff3c60608eaa2d7e2ccdecaaa80d8f4f529f1e9ed37e2afc68f12eda5c08" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "67c983ccc020c5ffbcc28b48feed1aadf5d5a98ccd57d917ce07afde74c21d24", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/prepared_analysis.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/prepared_analysis.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fff5a2ec7f7b65b4d48c68604a272e878be11fcf", + "mode": "100644", + "size_bytes": 10939, + "sha256": "45cc87921bb596df5198e11224c2084f41c23c463cd992960eeb6c2f1062d278" + }, + "working_tree": { + "exists": true, + "size_bytes": 11191, + "sha256": "6f18640f6f92fb68d0b3512d8e8c59740517257bf52ef94a510a7805a80a7357" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/prepared_analysis.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f562a4ea261a3835dc1e5a4381fab75be830551b", + "mode": "100644", + "size_bytes": 11666, + "sha256": "44160e50bf6c0122a3bac95f51193bb42ee10a10868fc9de0825fded67816624" + }, + "working_tree": { + "exists": true, + "size_bytes": 11966, + "sha256": "69f2f675a77e6522fbefe834ce4cc5ff07bbdb68040a10350ff464f89bbe680c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11191, + "sha256": "6f18640f6f92fb68d0b3512d8e8c59740517257bf52ef94a510a7805a80a7357" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "69f2f675a77e6522fbefe834ce4cc5ff07bbdb68040a10350ff464f89bbe680c", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/shell_state_inventory.h", + "refactor": { + "source_path": "src/fesa/analysis/shell_state_inventory.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f18fd5a48e64eb51dd0490f4f72cff02f7daea41", + "mode": "100644", + "size_bytes": 763, + "sha256": "d51ce13004b040138691e7ab9db3e1fca741675e16a83056bcf9c699d5f2f9a0" + }, + "working_tree": { + "exists": true, + "size_bytes": 788, + "sha256": "d88c3320b0ad5e702c7c329bffe990097bfab9b3cf8ab21b6ec38029c2f9bfb7" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "d88c3320b0ad5e702c7c329bffe990097bfab9b3cf8ab21b6ec38029c2f9bfb7", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_dynamic_analysis_state.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_dynamic_analysis_state.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d5e2cab742261a852462b51af4bd72ceb9aad639", + "mode": "100644", + "size_bytes": 13390, + "sha256": "fae258fe8b99d360aab714f0c07962a544c480b9607faec9136a7874f8943b9e" + }, + "working_tree": { + "exists": true, + "size_bytes": 13390, + "sha256": "fae258fe8b99d360aab714f0c07962a544c480b9607faec9136a7874f8943b9e" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_dynamic_analysis_state.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c9bf86ddb558fdb778a5b4e2ed9b72f5ef373363", + "mode": "100644", + "size_bytes": 13097, + "sha256": "71a116b785ee785ff806ada56bf04d84312acd3498fa69f32f6ba6aabefedd48" + }, + "working_tree": { + "exists": true, + "size_bytes": 13372, + "sha256": "353978bfc08bfd06097ad726eb599d81143d1b2ad22bb5f1fedd580799419ecd" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13670, + "sha256": "358a94f866c01bedc07955dd6fb0f1ce68074995d0793f4f001e5cafba3319ef" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "353978bfc08bfd06097ad726eb599d81143d1b2ad22bb5f1fedd580799419ecd", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_frequency_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_frequency_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f3a33dcabe881f98ce996521ab4b954a2673b873", + "mode": "100644", + "size_bytes": 18613, + "sha256": "017a90697c0669cbe4279fd6727e945075c45e1fd7043767eb313c6547d193f3" + }, + "working_tree": { + "exists": true, + "size_bytes": 18995, + "sha256": "6459820a8886291ba52e5be10c7cceb7dbe179d9d18530c7d7940773fd11e9c5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_frequency_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b035ce22c82254760d3abb3d7bcf8be6576d3859", + "mode": "100644", + "size_bytes": 18885, + "sha256": "5d16a284664217225e80e54b9161d2e1257c95a9a165b3fdc3800523192210ee" + }, + "working_tree": { + "exists": true, + "size_bytes": 19273, + "sha256": "8bc27912d6bf0b9faf9a5b696466680a6223fd0de1b6430a5c0166c67d0fece1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18995, + "sha256": "6459820a8886291ba52e5be10c7cceb7dbe179d9d18530c7d7940773fd11e9c5" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "8bc27912d6bf0b9faf9a5b696466680a6223fd0de1b6430a5c0166c67d0fece1", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_hht_core.h", + "refactor": { + "source_path": "src/fesa/analysis/solid_hht_core.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "75f93a191b1c595bd366103294aa3f353dc41e5c", + "mode": "100644", + "size_bytes": 814, + "sha256": "9cb29c5cff2b3dd4ba26b54a7554e3cf62272038214c23ca5fbd3aa53d3ba903" + }, + "working_tree": { + "exists": true, + "size_bytes": 834, + "sha256": "ac17c9183cd1d34b4fec7195ba18ff38e03e6cf5288eec9a747fd471ba63bfb3" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ac17c9183cd1d34b4fec7195ba18ff38e03e6cf5288eec9a747fd471ba63bfb3", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_hht_dynamic_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_hht_dynamic_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f0a833f4eb70efc0629ffcdfd2f2d1bf1811b1be", + "mode": "100644", + "size_bytes": 40717, + "sha256": "fdd45abbb82d54e3c5168075fb4d3eba26386b40d7f604036d97ce6970985ffe" + }, + "working_tree": { + "exists": true, + "size_bytes": 40717, + "sha256": "fdd45abbb82d54e3c5168075fb4d3eba26386b40d7f604036d97ce6970985ffe" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_hht_dynamic_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d5f5d89744df99a65a7147487cc812467cea4d0d", + "mode": "100644", + "size_bytes": 43231, + "sha256": "2da9beadbaabdab3b0b66be7af01b5189f95945e5e0f154786611156e11b8cdf" + }, + "working_tree": { + "exists": true, + "size_bytes": 44141, + "sha256": "3e37a8c198964fcd812737a39de7377117ed1b7d5ef705b61f14530871159bc2" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 41587, + "sha256": "00d0cf74938f7ce8c1033c83685f6a9d03e6e88afdd1999fcbcd272feb945433" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "3e37a8c198964fcd812737a39de7377117ed1b7d5ef705b61f14530871159bc2", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_hht_force_identity.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_hht_force_identity.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c091fe1aa08ab104a6a32ab241e39d6020ad2f96", + "mode": "100644", + "size_bytes": 8510, + "sha256": "cf86a1c6c32bf18386364aa6c1483603ca5467a5a607b7c8ba96d9e7ca512cdd" + }, + "working_tree": { + "exists": true, + "size_bytes": 8510, + "sha256": "cf86a1c6c32bf18386364aa6c1483603ca5467a5a607b7c8ba96d9e7ca512cdd" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_hht_force_identity.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c091fe1aa08ab104a6a32ab241e39d6020ad2f96", + "mode": "100644", + "size_bytes": 8510, + "sha256": "cf86a1c6c32bf18386364aa6c1483603ca5467a5a607b7c8ba96d9e7ca512cdd" + }, + "working_tree": { + "exists": true, + "size_bytes": 8692, + "sha256": "e326852240b431dbe5a5edbeb5ba02e74840c2d5d7b8fbd471ee8e314a114487" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8692, + "sha256": "e326852240b431dbe5a5edbeb5ba02e74840c2d5d7b8fbd471ee8e314a114487" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e326852240b431dbe5a5edbeb5ba02e74840c2d5d7b8fbd471ee8e314a114487", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_hht_high_low.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_hht_high_low.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "45a0794c4d59151ff72588a23ae9aeed2cfbeee2", + "mode": "100644", + "size_bytes": 8381, + "sha256": "fb75f990777f30bad410215fb118577c646ed45818d0ea9e8862525a6a9d8940" + }, + "working_tree": { + "exists": true, + "size_bytes": 8381, + "sha256": "fb75f990777f30bad410215fb118577c646ed45818d0ea9e8862525a6a9d8940" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_hht_high_low.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "45a0794c4d59151ff72588a23ae9aeed2cfbeee2", + "mode": "100644", + "size_bytes": 8381, + "sha256": "fb75f990777f30bad410215fb118577c646ed45818d0ea9e8862525a6a9d8940" + }, + "working_tree": { + "exists": true, + "size_bytes": 8571, + "sha256": "b4aac9f0be4ce3da337e00af9668e0bcbee9b9a121accff0816a601d6bc9ec3b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8571, + "sha256": "b4aac9f0be4ce3da337e00af9668e0bcbee9b9a121accff0816a601d6bc9ec3b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b4aac9f0be4ce3da337e00af9668e0bcbee9b9a121accff0816a601d6bc9ec3b", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_hht_integrator.h", + "refactor": { + "source_path": "src/fesa/analysis/solid_hht_integrator.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4a4ea0e12ef27d3ce21d699411403d22c4d9c09c", + "mode": "100644", + "size_bytes": 3467, + "sha256": "0b1ad2e57837a7a203a5e3199b4d2ddb29acaaf437f31e6859cef73416aa937a" + }, + "working_tree": { + "exists": true, + "size_bytes": 3542, + "sha256": "80ac84463a46f15c5f3b44061170218db2e44affd7032f21fd722ff2d2ecaeae" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "80ac84463a46f15c5f3b44061170218db2e44affd7032f21fd722ff2d2ecaeae", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_hht_representability.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_hht_representability.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "207db94a91586953548cd08da2a933a9fd9509de", + "mode": "100644", + "size_bytes": 9431, + "sha256": "d065981f071d6078acdedbbdc8cc040a74cce7ebf2e9086eb61ca75cf5613fd4" + }, + "working_tree": { + "exists": true, + "size_bytes": 9431, + "sha256": "d065981f071d6078acdedbbdc8cc040a74cce7ebf2e9086eb61ca75cf5613fd4" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_hht_representability.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "207db94a91586953548cd08da2a933a9fd9509de", + "mode": "100644", + "size_bytes": 9431, + "sha256": "d065981f071d6078acdedbbdc8cc040a74cce7ebf2e9086eb61ca75cf5613fd4" + }, + "working_tree": { + "exists": true, + "size_bytes": 9648, + "sha256": "d6bdc01ef05ac8a78a54d6089f1e4c65f4743b1f8d06465c861d315ce1dfa2ba" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9648, + "sha256": "d6bdc01ef05ac8a78a54d6089f1e4c65f4743b1f8d06465c861d315ce1dfa2ba" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "d6bdc01ef05ac8a78a54d6089f1e4c65f4743b1f8d06465c861d315ce1dfa2ba", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_static_core.h", + "refactor": { + "source_path": "src/fesa/analysis/solid_static_core.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "139532c6d8adf3553b73e55c163e71f61dc4f659", + "mode": "100644", + "size_bytes": 1042, + "sha256": "307e294639368204238fc51ce488e066d002bbeef6bd99d59325cbcf91d82cd2" + }, + "working_tree": { + "exists": true, + "size_bytes": 1069, + "sha256": "0a1fb4b341a7d150c04ff65a6bf894e6bab8e8eeecb8ac3c86c1d2fb400e9762" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0a1fb4b341a7d150c04ff65a6bf894e6bab8e8eeecb8ac3c86c1d2fb400e9762", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_static_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_static_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "eeb3195eec7d896fe5af9f19846908239737a450", + "mode": "100644", + "size_bytes": 22307, + "sha256": "725ac027142e05571d992e5739caa96403657428956d32bcb1f4cbba11e35db8" + }, + "working_tree": { + "exists": true, + "size_bytes": 22778, + "sha256": "15b2804a11ab2161bb39439e810143612e4467c861f0b1c05ef98cc61c5c5572" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_static_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "35c23bb8e4bef87b766305bd1f6217ff625085dc", + "mode": "100644", + "size_bytes": 24281, + "sha256": "ef93ede79319359762a504b4ee284b9ef1388ecaefdadb43418dd2f0ac4a07c3" + }, + "working_tree": { + "exists": true, + "size_bytes": 24800, + "sha256": "cbf14e888bbdd2dbbb1fbe1926eaf0328702c862018e824c364a221b048fced9" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 22778, + "sha256": "15b2804a11ab2161bb39439e810143612e4467c861f0b1c05ef98cc61c5c5572" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "cbf14e888bbdd2dbbb1fbe1926eaf0328702c862018e824c364a221b048fced9", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/solid_static_state.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/solid_static_state.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "02bfb52b072579a5ab0a93235d4fdf25fb6faaf8", + "mode": "100644", + "size_bytes": 9837, + "sha256": "ffb0fd553806b0b4f9fd8aa67ba3eaf9404b3fcfd015dd53402444d4c82f539c" + }, + "working_tree": { + "exists": true, + "size_bytes": 10053, + "sha256": "9f5269cecda39701eec3078a77aea4932626010ed38d3d146230e384cdcd763d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/solid_static_state.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ae9b9990e0a124b41ced0826e8660a98e389accc", + "mode": "100644", + "size_bytes": 9746, + "sha256": "bb0730bfdd0aa8ae05e17e2d68d2a5b4f8f00edd9f2ad88a8121e7136d4ebb21" + }, + "working_tree": { + "exists": true, + "size_bytes": 9961, + "sha256": "ef59ff9429bb9981152d4993cdf8152e0711cba86246ccae20de995e6ebca9b3" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10053, + "sha256": "9f5269cecda39701eec3078a77aea4932626010ed38d3d146230e384cdcd763d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ef59ff9429bb9981152d4993cdf8152e0711cba86246ccae20de995e6ebca9b3", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/thermal_analysis_state.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/thermal_analysis_state.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1e2e0349d98350dc06cdb6b3c5f26085941f7fa3", + "mode": "100644", + "size_bytes": 9305, + "sha256": "3ee3ddb2e37e29da867272da38cb024d0cbc2f5b911e3c8d27a31c8d2a0668ed" + }, + "working_tree": { + "exists": true, + "size_bytes": 9534, + "sha256": "9e1d88f50516239954f1816d1418c1b0a1651c66267ace846c24fd58b90011ed" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/thermal_analysis_state.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f229d93f80968ba98b600d8aec2fc6f68a49849a", + "mode": "100644", + "size_bytes": 9326, + "sha256": "2752386bf364d2354076803783eb3fe7abef0eb1cdeafb497a0ec620ccd9d54e" + }, + "working_tree": { + "exists": true, + "size_bytes": 9556, + "sha256": "a233c9d402ccd34b252bc51df1b2cc36730a2424ea4e8f7c3ed692f2bfeeae0a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9534, + "sha256": "9e1d88f50516239954f1816d1418c1b0a1651c66267ace846c24fd58b90011ed" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a233c9d402ccd34b252bc51df1b2cc36730a2424ea4e8f7c3ed692f2bfeeae0a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/thermal_time_grid.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/thermal_time_grid.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "16a3e9a9ca4cf05b49d332ead26e653d196064b7", + "mode": "100644", + "size_bytes": 9129, + "sha256": "ece642dc5802fd8b1f66515299000576c0cd67f96908f945b0f1505ebe57d6b4" + }, + "working_tree": { + "exists": true, + "size_bytes": 9361, + "sha256": "13bc38d26a6f6c310a8468fe1e4bda93544751a5a0e92886cccd00959f5a3bf0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/thermal_time_grid.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "16a3e9a9ca4cf05b49d332ead26e653d196064b7", + "mode": "100644", + "size_bytes": 9129, + "sha256": "ece642dc5802fd8b1f66515299000576c0cd67f96908f945b0f1505ebe57d6b4" + }, + "working_tree": { + "exists": true, + "size_bytes": 9361, + "sha256": "13bc38d26a6f6c310a8468fe1e4bda93544751a5a0e92886cccd00959f5a3bf0" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9361, + "sha256": "13bc38d26a6f6c310a8468fe1e4bda93544751a5a0e92886cccd00959f5a3bf0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "13bc38d26a6f6c310a8468fe1e4bda93544751a5a0e92886cccd00959f5a3bf0", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/thermal_transient_algebra.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/thermal_transient_algebra.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2784d43a13e5c01db8ba3baf36efc5d9a42b3ebf", + "mode": "100644", + "size_bytes": 24750, + "sha256": "dd078914bd1763a1405ebb6978599c9ead73789bb6a657ebd9e3e166c0f4c317" + }, + "working_tree": { + "exists": true, + "size_bytes": 25286, + "sha256": "e73d1283e35fbac5a623be8e383c4d226296bc0ed277ac5e9a8ae5ef3068a5ea" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/thermal_transient_algebra.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d323d4ad99f1888c2713b9b4d1036b91fc778a32", + "mode": "100644", + "size_bytes": 25273, + "sha256": "d1aad492eaaef6da191c99acb96bfe5e4ae61e297277406b393bd0ca22c7ec7b" + }, + "working_tree": { + "exists": true, + "size_bytes": 25821, + "sha256": "f24391c91d2a20fa7e4091aed984fc4b57ed2be73978b34f8a87ac0c73138e3e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 25286, + "sha256": "e73d1283e35fbac5a623be8e383c4d226296bc0ed277ac5e9a8ae5ef3068a5ea" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f24391c91d2a20fa7e4091aed984fc4b57ed2be73978b34f8a87ac0c73138e3e", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/thermal_transient_algebra.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/thermal_transient_algebra.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5b05ce7cc55f808dfe155c9ad503f67fec4d720e", + "mode": "100644", + "size_bytes": 3919, + "sha256": "4a593a6c06788da6a746a71bd9ddae68af195ccccc3005a6e9eb928f681d21b1" + }, + "working_tree": { + "exists": true, + "size_bytes": 4024, + "sha256": "6100584f6deaafab780c9493978f3c7a45654fc78fa7330ebff73f5a93ceffa8" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/thermal_transient_algebra.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a361aea87401f8ebd5a01d42ee5f4e8ae91527d9", + "mode": "100644", + "size_bytes": 6498, + "sha256": "5e2bcac29728e5319ad9965e79ece3fcfd9abe8033866cdd6ab4a8534c73475a" + }, + "working_tree": { + "exists": true, + "size_bytes": 6654, + "sha256": "563230d9dc566df3cb55d5448d5406f6167346927cc1f618fc19bea40128e1c7" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4024, + "sha256": "6100584f6deaafab780c9493978f3c7a45654fc78fa7330ebff73f5a93ceffa8" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "563230d9dc566df3cb55d5448d5406f6167346927cc1f618fc19bea40128e1c7", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/thermal_transient_bounds.h", + "fesa_dev": { + "source_path": "src/fesa/analysis/thermal_transient_bounds.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0a08de034e3d1f662f3a91e95589d83d803f7c8c", + "mode": "100644", + "size_bytes": 3602, + "sha256": "43c91a7c2a3dd6d3e1c289799a747242e5491a8e4136bcc3ad651e325fb4597a" + }, + "working_tree": { + "exists": true, + "size_bytes": 3692, + "sha256": "55dd697c3b432fa435a5b1bc40c105895eaeeeff7c2c23b40da9f20377c90f98" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/thermal_transient_bounds.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0a08de034e3d1f662f3a91e95589d83d803f7c8c", + "mode": "100644", + "size_bytes": 3602, + "sha256": "43c91a7c2a3dd6d3e1c289799a747242e5491a8e4136bcc3ad651e325fb4597a" + }, + "working_tree": { + "exists": true, + "size_bytes": 3692, + "sha256": "55dd697c3b432fa435a5b1bc40c105895eaeeeff7c2c23b40da9f20377c90f98" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3692, + "sha256": "55dd697c3b432fa435a5b1bc40c105895eaeeeff7c2c23b40da9f20377c90f98" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "55dd697c3b432fa435a5b1bc40c105895eaeeeff7c2c23b40da9f20377c90f98", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/analysis/transient_heat_procedure.cpp", + "fesa_dev": { + "source_path": "src/fesa/analysis/transient_heat_procedure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b8cfdf1f06e4f94ccc055aa6393d1a65ac31fa4d", + "mode": "100644", + "size_bytes": 1622, + "sha256": "a3efb8d8bf506f3c0da689a0d9cb5f0e01e00d8856ec610be572356b38a889c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 1661, + "sha256": "25bab066a53e789c2db57a58da2da628e4952f01a973e04642e0317f18398808" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/analysis/transient_heat_procedure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ff819cc2eacb7cf241f42f11f019e2c34f29b7be", + "mode": "100644", + "size_bytes": 1667, + "sha256": "b2f698c51519dc45e768de931ef919ad2f186c654059a91fb0c824d2aad4b994" + }, + "working_tree": { + "exists": true, + "size_bytes": 1707, + "sha256": "02f67b401ee4a182b8709778a674129637a3897fdd6a514cdeb1699ad5736cfc" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1661, + "sha256": "25bab066a53e789c2db57a58da2da628e4952f01a973e04642e0317f18398808" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "02f67b401ee4a182b8709778a674129637a3897fdd6a514cdeb1699ad5736cfc", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/app/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/app/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "facd78df2707ea6c6e3e5c8c095aa62c0cefe85d", + "mode": "100644", + "size_bytes": 1084, + "sha256": "df42af5d84fcef76b8125017f93c19d30274aa7099f1084362c497786b343f44" + }, + "working_tree": { + "exists": true, + "size_bytes": 1099, + "sha256": "e37abf696e687b45bcb3d0d3b9f71784595c896e84bbb24369aac149960e7f87" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/app/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "facd78df2707ea6c6e3e5c8c095aa62c0cefe85d", + "mode": "100644", + "size_bytes": 1084, + "sha256": "df42af5d84fcef76b8125017f93c19d30274aa7099f1084362c497786b343f44" + }, + "working_tree": { + "exists": true, + "size_bytes": 1099, + "sha256": "e37abf696e687b45bcb3d0d3b9f71784595c896e84bbb24369aac149960e7f87" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1099, + "sha256": "e37abf696e687b45bcb3d0d3b9f71784595c896e84bbb24369aac149960e7f87" + } + }, + { + "target_path": "src/fesa/app/fesa_application.cpp", + "fesa_dev": { + "source_path": "src/fesa/app/fesa_application.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f1608778426623861a28c20ea2ff9802363754ce", + "mode": "100644", + "size_bytes": 5929, + "sha256": "98ec887403219d91a57f420451708f9daf5c752575f2b8bdfc5a09ed69bc66a5" + }, + "working_tree": { + "exists": true, + "size_bytes": 6089, + "sha256": "d8855ed2453e54065a08cddaa4bc79f66b79c2024b8a428d52c03e761b5ea5cc" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/app/fesa_application.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "658c460e76edb232431bb7279c235461e34912cb", + "mode": "100644", + "size_bytes": 5423, + "sha256": "88b678469bae60dda4079f6b1c1cdc262df675db94a2b525f9bff1e51ebfd411" + }, + "working_tree": { + "exists": true, + "size_bytes": 5577, + "sha256": "c6eeeac1ffd983debbaaad3bcaf48038d15a6a6113734a8c51e3e2ff41e0cbbf" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6089, + "sha256": "d8855ed2453e54065a08cddaa4bc79f66b79c2024b8a428d52c03e761b5ea5cc" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c6eeeac1ffd983debbaaad3bcaf48038d15a6a6113734a8c51e3e2ff41e0cbbf", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/app/main.cpp", + "fesa_dev": { + "source_path": "src/fesa/app/main.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5a92a9c4f5cfa7df978e2d738d9b9171cecee2ec", + "mode": "100644", + "size_bytes": 478, + "sha256": "c3f8b67da7fe8d897d56c4601fc6ded37c356e2fbcb15064173d616bb7f42bcf" + }, + "working_tree": { + "exists": true, + "size_bytes": 495, + "sha256": "3e67c26faaf2f03af51820d44f19b793ffe24a14b428774f334954a77349c15c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/app/main.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5a92a9c4f5cfa7df978e2d738d9b9171cecee2ec", + "mode": "100644", + "size_bytes": 478, + "sha256": "c3f8b67da7fe8d897d56c4601fc6ded37c356e2fbcb15064173d616bb7f42bcf" + }, + "working_tree": { + "exists": true, + "size_bytes": 495, + "sha256": "3e67c26faaf2f03af51820d44f19b793ffe24a14b428774f334954a77349c15c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 495, + "sha256": "3e67c26faaf2f03af51820d44f19b793ffe24a14b428774f334954a77349c15c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "3e67c26faaf2f03af51820d44f19b793ffe24a14b428774f334954a77349c15c", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/app/output_paths.cpp", + "fesa_dev": { + "source_path": "src/fesa/app/output_paths.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2a2388c0977e72cbf7998416ca8f7ec609491c26", + "mode": "100644", + "size_bytes": 3974, + "sha256": "fdea34341d2b32ec1795793a313ccb24ccdc3d6e09e59fe96bbd6df6e2fce605" + }, + "working_tree": { + "exists": true, + "size_bytes": 4101, + "sha256": "737d7fc12e10f64758a68e7d32aeba8f966e11680009b0c0e4d2fe48891e8d4f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/app/output_paths.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2a2388c0977e72cbf7998416ca8f7ec609491c26", + "mode": "100644", + "size_bytes": 3974, + "sha256": "fdea34341d2b32ec1795793a313ccb24ccdc3d6e09e59fe96bbd6df6e2fce605" + }, + "working_tree": { + "exists": true, + "size_bytes": 4101, + "sha256": "737d7fc12e10f64758a68e7d32aeba8f966e11680009b0c0e4d2fe48891e8d4f" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4101, + "sha256": "737d7fc12e10f64758a68e7d32aeba8f966e11680009b0c0e4d2fe48891e8d4f" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "737d7fc12e10f64758a68e7d32aeba8f966e11680009b0c0e4d2fe48891e8d4f", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/assembly/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/assembly/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7028a88eaeda93b3c3c32395548edf70492c8fe5", + "mode": "100644", + "size_bytes": 925, + "sha256": "bbffc9f69470e09470709c23266eb8841920788f28dc617b926e5a110fb10f4e" + }, + "working_tree": { + "exists": true, + "size_bytes": 938, + "sha256": "3061909847d137dd1e142862a57d2f3285dcdbf0a207063d98c651b9bee2ef4a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/assembly/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7028a88eaeda93b3c3c32395548edf70492c8fe5", + "mode": "100644", + "size_bytes": 925, + "sha256": "bbffc9f69470e09470709c23266eb8841920788f28dc617b926e5a110fb10f4e" + }, + "working_tree": { + "exists": true, + "size_bytes": 938, + "sha256": "3061909847d137dd1e142862a57d2f3285dcdbf0a207063d98c651b9bee2ef4a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 938, + "sha256": "3061909847d137dd1e142862a57d2f3285dcdbf0a207063d98c651b9bee2ef4a" + } + }, + { + "target_path": "src/fesa/assembly/load_assembler.cpp", + "fesa_dev": { + "source_path": "src/fesa/assembly/load_assembler.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "caa05632d25f86f40145d332410ebdf9ffef591d", + "mode": "100644", + "size_bytes": 15121, + "sha256": "eeebcc43dafa868fab599c0211540a3732bb99cd032138c176990337944e42c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 15466, + "sha256": "5d62f922829b909aa585c31ec73d6aaf21a6a0a092328ddda234c01ba0f0bac0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/assembly/load_assembler.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b74d0573bcb54bc410a7395d7a0decfb1e0b361a", + "mode": "100644", + "size_bytes": 10422, + "sha256": "7244e1049955f9c3f512897084b62d37aad3bdb9f352b71cdc5e7cd48ca60bcf" + }, + "working_tree": { + "exists": true, + "size_bytes": 10660, + "sha256": "72e2eb0ac66d21ffa91490491f0e1f7a2bc5da2421791ca8b5cd254cb14f4130" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 15466, + "sha256": "5d62f922829b909aa585c31ec73d6aaf21a6a0a092328ddda234c01ba0f0bac0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "72e2eb0ac66d21ffa91490491f0e1f7a2bc5da2421791ca8b5cd254cb14f4130", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/assembly/ordered_contribution_internal.h", + "refactor": { + "source_path": "src/fesa/assembly/ordered_contribution_internal.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c22e25a5b6a9a253dae9078cbb67de2293648afd", + "mode": "100644", + "size_bytes": 2424, + "sha256": "bd05642bf9b663dcf52e8d2632183fdab4479b935e6ae498cf22cdc70c860a7c" + }, + "working_tree": { + "exists": true, + "size_bytes": 2482, + "sha256": "901ae7fc9ab9de201c06c24e0fe7bd6f0abed87c1198ba113f55c0aab601cfde" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "901ae7fc9ab9de201c06c24e0fe7bd6f0abed87c1198ba113f55c0aab601cfde", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/assembly/parallel_for.cpp", + "fesa_dev": { + "source_path": "src/fesa/assembly/parallel_for.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "919cac7d6cebd2242b49b4d6937d4184f1c2a781", + "mode": "100644", + "size_bytes": 884, + "sha256": "0b8fe2a2d67a44e32224ac86b57819c0074a93ee2495f5ff6da15ef8e0eef544" + }, + "working_tree": { + "exists": true, + "size_bytes": 912, + "sha256": "ed6e9e0ead83f0ba09f4c43ade1961e1ca98e3adc9a64d3e4a68dcbb8c6d05ba" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/assembly/parallel_for.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "919cac7d6cebd2242b49b4d6937d4184f1c2a781", + "mode": "100644", + "size_bytes": 884, + "sha256": "0b8fe2a2d67a44e32224ac86b57819c0074a93ee2495f5ff6da15ef8e0eef544" + }, + "working_tree": { + "exists": true, + "size_bytes": 912, + "sha256": "ed6e9e0ead83f0ba09f4c43ade1961e1ca98e3adc9a64d3e4a68dcbb8c6d05ba" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 912, + "sha256": "ed6e9e0ead83f0ba09f4c43ade1961e1ca98e3adc9a64d3e4a68dcbb8c6d05ba" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ed6e9e0ead83f0ba09f4c43ade1961e1ca98e3adc9a64d3e4a68dcbb8c6d05ba", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/assembly/sparse_assembler.cpp", + "fesa_dev": { + "source_path": "src/fesa/assembly/sparse_assembler.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "61face67ae08d0b39f2b617db70c324742425711", + "mode": "100644", + "size_bytes": 5997, + "sha256": "42722bafa0bb3c39b781049a14cb7a43d60996217877c61b47f39ac1ee4b5387" + }, + "working_tree": { + "exists": true, + "size_bytes": 6149, + "sha256": "5c8206b81751a9aa5e09b6b351dfd49e0c37af14cb34342aa998b52e486d7cd3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/assembly/sparse_assembler.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8cb71469cb108d1d0c8c66a08e5c141faa19f253", + "mode": "100644", + "size_bytes": 5355, + "sha256": "47bc54d76bd39886f98a8b8ae7b41cfa21d5e5de3bbf84eb187071d79be188c6" + }, + "working_tree": { + "exists": true, + "size_bytes": 5493, + "sha256": "c5d2053b04a1cea45f2fcf4e8f09fc246e3d7965acd7e594d5fcf07e97d47bd6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6149, + "sha256": "5c8206b81751a9aa5e09b6b351dfd49e0c37af14cb34342aa998b52e486d7cd3" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c5d2053b04a1cea45f2fcf4e8f09fc246e3d7965acd7e594d5fcf07e97d47bd6", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Local matrix append extracted to ordered contribution helper; ordering requires independent confirmation.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/assembly/surface_pressure_assembler.cpp", + "fesa_dev": { + "source_path": "src/fesa/assembly/surface_pressure_assembler.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "aafe1a6f6bc19b7854fdf6478be42357fcb1ba1c", + "mode": "100644", + "size_bytes": 12552, + "sha256": "12e7e4ac100f099b07f9dd65d5ef366a3d7677b79f6305f90fc76f9395306219" + }, + "working_tree": { + "exists": true, + "size_bytes": 12843, + "sha256": "bb6c68170df8a5082f0d3f9b126f9fe6135b9252ae2e87353134fcb4c5331b2e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/assembly/surface_pressure_assembler.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e5db7b09e7fc7a1d24b3d23b4537dc0b7359e377", + "mode": "100644", + "size_bytes": 12518, + "sha256": "571e306cc703bab844164f6b8d4fd0e2dacb1311908147f377520ed35599dd91" + }, + "working_tree": { + "exists": true, + "size_bytes": 12807, + "sha256": "ba108f6ed38c7940663599029dd70e865d3a49bcb248dac4f295e144a2a5f407" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12843, + "sha256": "bb6c68170df8a5082f0d3f9b126f9fe6135b9252ae2e87353134fcb4c5331b2e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "ba108f6ed38c7940663599029dd70e865d3a49bcb248dac4f295e144a2a5f407", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/assembly/thermal_assembler.cpp", + "fesa_dev": { + "source_path": "src/fesa/assembly/thermal_assembler.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f67e755fec227490058ace9a83ef96762a2a3dd6", + "mode": "100644", + "size_bytes": 16422, + "sha256": "1606a4c3ddd28396e851a0f5da2e77516e8a3d61723775ecc93e284c007f43ed" + }, + "working_tree": { + "exists": true, + "size_bytes": 16796, + "sha256": "81ce889baef2dc9b1027b8d660db4be11967504db3e203a9aa05e97967fca6a8" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/assembly/thermal_assembler.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8fc05f27d8d5041365aa9933ce2f30426a1153c6", + "mode": "100644", + "size_bytes": 17039, + "sha256": "cf3d87115227b7b348b4e4511b609c06c1a35b0e26765c22537d4ffb74e90070" + }, + "working_tree": { + "exists": true, + "size_bytes": 17430, + "sha256": "596bc2cfd0fb7829593399374703cb666654c14883dc562bb4c6f33e9e0ba4ae" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 16796, + "sha256": "81ce889baef2dc9b1027b8d660db4be11967504db3e203a9aa05e97967fca6a8" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "596bc2cfd0fb7829593399374703cb666654c14883dc562bb4c6f33e9e0ba4ae", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/build_info.cpp", + "fesa_dev": { + "source_path": "src/fesa/build_info.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1ff79863c4d8e2700e676edb6c634efa4cd30290", + "mode": "100644", + "size_bytes": 230, + "sha256": "b442b9489f2bcc8fa54333019b5a2a7a467a198b172f66de3cbe599a33320f38" + }, + "working_tree": { + "exists": true, + "size_bytes": 241, + "sha256": "9b3cafb2c50fff8dd6cfab1527051da12122f6cd5c8b1859027a5470c2534c16" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/build_info.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1ff79863c4d8e2700e676edb6c634efa4cd30290", + "mode": "100644", + "size_bytes": 230, + "sha256": "b442b9489f2bcc8fa54333019b5a2a7a467a198b172f66de3cbe599a33320f38" + }, + "working_tree": { + "exists": true, + "size_bytes": 241, + "sha256": "9b3cafb2c50fff8dd6cfab1527051da12122f6cd5c8b1859027a5470c2534c16" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 241, + "sha256": "9b3cafb2c50fff8dd6cfab1527051da12122f6cd5c8b1859027a5470c2534c16" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "9b3cafb2c50fff8dd6cfab1527051da12122f6cd5c8b1859027a5470c2534c16", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/constraints/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/constraints/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "aa4aec9ffb3d11014fc579cf43cc307115cdbeac", + "mode": "100644", + "size_bytes": 908, + "sha256": "fd12947e6e8b8d48200b12ec4b8838f8c0fdaa157331169dc977f2fabf84039e" + }, + "working_tree": { + "exists": true, + "size_bytes": 920, + "sha256": "5bd3dd837ce1087d8288fbb795ab756aa9c13a1abe0408b5a56ad3e2f672623b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/constraints/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "aa4aec9ffb3d11014fc579cf43cc307115cdbeac", + "mode": "100644", + "size_bytes": 908, + "sha256": "fd12947e6e8b8d48200b12ec4b8838f8c0fdaa157331169dc977f2fabf84039e" + }, + "working_tree": { + "exists": true, + "size_bytes": 920, + "sha256": "5bd3dd837ce1087d8288fbb795ab756aa9c13a1abe0408b5a56ad3e2f672623b" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 920, + "sha256": "5bd3dd837ce1087d8288fbb795ab756aa9c13a1abe0408b5a56ad3e2f672623b" + } + }, + { + "target_path": "src/fesa/constraints/essential_constraint_policy.cpp", + "fesa_dev": { + "source_path": "src/fesa/constraints/essential_constraint_policy.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5903d0d3422dacc5f6af357cc2fe88a9e8873440", + "mode": "100644", + "size_bytes": 6317, + "sha256": "959b2521ba6fd168e6778d99eb16eef25b9b06a4dfcb7fe9fba873dcf3474309" + }, + "working_tree": { + "exists": true, + "size_bytes": 6476, + "sha256": "985512458c5ffc96164301ed56e608ee198f227c814045d92e2f626b16768200" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/constraints/essential_constraint_policy.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "40403239736f6142dd9620d0d1c91ad0872965a5", + "mode": "100644", + "size_bytes": 11717, + "sha256": "e8ba3d70b9fc0f0c386cf103313527dfc76aaf39d912ca0315a9d5813c3f63ea" + }, + "working_tree": { + "exists": true, + "size_bytes": 12001, + "sha256": "a671fc9140ddd2d382cd7d5e00939ef6f3d1a57eb2884f7599ac7f5b2baf3dc6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6476, + "sha256": "985512458c5ffc96164301ed56e608ee198f227c814045d92e2f626b16768200" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a671fc9140ddd2d382cd7d5e00939ef6f3d1a57eb2884f7599ac7f5b2baf3dc6", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/constraints/prescribed_displacement.cpp", + "fesa_dev": { + "source_path": "src/fesa/constraints/prescribed_displacement.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1dfd18e879f793fa2f431a49ad10f766f1c53bf3", + "mode": "100644", + "size_bytes": 3984, + "sha256": "9959924fbe6d5ec2b857090d800177096e3f2d9d39a379ab458f2435e82e92fe" + }, + "working_tree": { + "exists": true, + "size_bytes": 4091, + "sha256": "e7542376b043a967293e2bb8eb7c641050cae9c55219ff5e3545586c685602b1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/constraints/prescribed_displacement.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1dfd18e879f793fa2f431a49ad10f766f1c53bf3", + "mode": "100644", + "size_bytes": 3984, + "sha256": "9959924fbe6d5ec2b857090d800177096e3f2d9d39a379ab458f2435e82e92fe" + }, + "working_tree": { + "exists": true, + "size_bytes": 4091, + "sha256": "e7542376b043a967293e2bb8eb7c641050cae9c55219ff5e3545586c685602b1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4091, + "sha256": "e7542376b043a967293e2bb8eb7c641050cae9c55219ff5e3545586c685602b1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e7542376b043a967293e2bb8eb7c641050cae9c55219ff5e3545586c685602b1", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/core/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/core/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7cb79cea891a3c5df36cf4891923de8ce9c8e158", + "mode": "100644", + "size_bytes": 925, + "sha256": "6a8d5033dc2a3d2f5fea4d2e6521f21987371b29422edd5e52a3cc07a0f47fac" + }, + "working_tree": { + "exists": true, + "size_bytes": 938, + "sha256": "0e384b764959a61c10c86b105e89f85d224a7705e8b582806f6726096ab4f3f0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/core/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7cb79cea891a3c5df36cf4891923de8ce9c8e158", + "mode": "100644", + "size_bytes": 925, + "sha256": "6a8d5033dc2a3d2f5fea4d2e6521f21987371b29422edd5e52a3cc07a0f47fac" + }, + "working_tree": { + "exists": true, + "size_bytes": 938, + "sha256": "0e384b764959a61c10c86b105e89f85d224a7705e8b582806f6726096ab4f3f0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 938, + "sha256": "0e384b764959a61c10c86b105e89f85d224a7705e8b582806f6726096ab4f3f0" + } + }, + { + "target_path": "src/fesa/core/ascii.cpp", + "fesa_dev": { + "source_path": "src/fesa/core/ascii.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7a6a24e65ae4b0d4d5bf3656dcf1853d57bef315", + "mode": "100644", + "size_bytes": 1403, + "sha256": "fa3c4316e4473bc42e0aabe72a774651a8be58031cb3790c5afcc999fc34bc32" + }, + "working_tree": { + "exists": true, + "size_bytes": 1452, + "sha256": "e04c686ce4f1d07e059db58b6c191185820625d62ef64a2e0f007b470925891a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/core/ascii.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "32466d399562df82c7966afd2ea7298eb77493da", + "mode": "100644", + "size_bytes": 1595, + "sha256": "3fbe89b5596ed7595e4ec0f832553de9cd69de99b798159c67c04a21ab5ce314" + }, + "working_tree": { + "exists": true, + "size_bytes": 1652, + "sha256": "5dd703481f5bccdca9da88c61b30ac0fb672b3bc6303164540992e3b56b8f1d9" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1452, + "sha256": "e04c686ce4f1d07e059db58b6c191185820625d62ef64a2e0f007b470925891a" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "5dd703481f5bccdca9da88c61b30ac0fb672b3bc6303164540992e3b56b8f1d9", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/core/diagnostic.cpp", + "fesa_dev": { + "source_path": "src/fesa/core/diagnostic.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e94c8fb49ce64ec7b0580d9279a604b9455b4efd", + "mode": "100644", + "size_bytes": 721, + "sha256": "79feb9c14a1f7c4d11baa5ec138718dd4e0e20cce9cef47b87d2ea90676110cf" + }, + "working_tree": { + "exists": true, + "size_bytes": 742, + "sha256": "07b2e69069d258dd3ae9b61b45621e238cc7520dcb5a5bbff88f1778c037bcac" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/core/diagnostic.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e94c8fb49ce64ec7b0580d9279a604b9455b4efd", + "mode": "100644", + "size_bytes": 721, + "sha256": "79feb9c14a1f7c4d11baa5ec138718dd4e0e20cce9cef47b87d2ea90676110cf" + }, + "working_tree": { + "exists": true, + "size_bytes": 742, + "sha256": "07b2e69069d258dd3ae9b61b45621e238cc7520dcb5a5bbff88f1778c037bcac" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 742, + "sha256": "07b2e69069d258dd3ae9b61b45621e238cc7520dcb5a5bbff88f1778c037bcac" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "07b2e69069d258dd3ae9b61b45621e238cc7520dcb5a5bbff88f1778c037bcac", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/core/status.cpp", + "fesa_dev": { + "source_path": "src/fesa/core/status.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cc1aff0f256dd8bed2684ed635b060c69eae605d", + "mode": "100644", + "size_bytes": 973, + "sha256": "3b1ac178075fae445705d85d626e60263809bf56f10e9a7b6df06362b4822f57" + }, + "working_tree": { + "exists": true, + "size_bytes": 1009, + "sha256": "be11a334a7488848a977483e2c86ec2ff54511bd2d45ebd21372b8dc08562269" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/core/status.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cc1aff0f256dd8bed2684ed635b060c69eae605d", + "mode": "100644", + "size_bytes": 973, + "sha256": "3b1ac178075fae445705d85d626e60263809bf56f10e9a7b6df06362b4822f57" + }, + "working_tree": { + "exists": true, + "size_bytes": 1009, + "sha256": "be11a334a7488848a977483e2c86ec2ff54511bd2d45ebd21372b8dc08562269" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1009, + "sha256": "be11a334a7488848a977483e2c86ec2ff54511bd2d45ebd21372b8dc08562269" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "be11a334a7488848a977483e2c86ec2ff54511bd2d45ebd21372b8dc08562269", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/elements/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5a824b13ecb718111b861f070a1ba2055aa80a59", + "mode": "100644", + "size_bytes": 1246, + "sha256": "f163c1ae3a1b1d8017b206bf5b0a3136a7a5f8f9f859c1ac24f4670f0a7d1040" + }, + "working_tree": { + "exists": true, + "size_bytes": 1262, + "sha256": "b31ac3fe80587a894c0c0260bb1144cdd27e46941f59b6cf7c302eb0b4a09ba1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7464fc261f1840084b6d0c01cc4712fca69965d4", + "mode": "100644", + "size_bytes": 1634, + "sha256": "66b6333188a347b72bf19007667c99b4ebb92901692ba7f6df13e618c9fd9420" + }, + "working_tree": { + "exists": true, + "size_bytes": 1654, + "sha256": "e3a77fc18eff793f5f05ff17175e9cc5af6cc99bc94d5546a585d459a7c1327b" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1262, + "sha256": "b31ac3fe80587a894c0c0260bb1144cdd27e46941f59b6cf7c302eb0b4a09ba1" + } + }, + { + "target_path": "src/fesa/elements/element_capabilities.cpp", + "refactor": { + "source_path": "src/fesa/elements/element_capabilities.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "772fc0c32eb2a5caac70b3c3a65e2a482f8e8170", + "mode": "100644", + "size_bytes": 4321, + "sha256": "5b7716090b928218e0e40ba8e51d3e2549a7f1bb09747d563024012de7836c5a" + }, + "working_tree": { + "exists": true, + "size_bytes": 4436, + "sha256": "2e05773ed99829044da9b6f47c20c7f5cd6a73dcef875f9418ada53249289d8f" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2e05773ed99829044da9b6f47c20c7f5cd6a73dcef875f9418ada53249289d8f", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/element_factory.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/element_factory.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5fffbfa7a770f1b808fd0c28e11e5ffce4c8e175", + "mode": "100644", + "size_bytes": 13588, + "sha256": "0a1da58ff92d5e6433d3c546ed5007b61e2feb330626d67e7c0fe11d28a9f0af" + }, + "working_tree": { + "exists": true, + "size_bytes": 13894, + "sha256": "cd19a0fe24114a6858e763e9eef5cb9a891d36bbf479b69e993ab87bcdca54b0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/element_factory.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5f785a53c00adf9426180f1d30859d9e158d2d1b", + "mode": "100644", + "size_bytes": 14104, + "sha256": "7f60e16e0d8a39bbcf620926a2e5e842e57f21cbcfa4ba0a07ef927c6bb87b63" + }, + "working_tree": { + "exists": true, + "size_bytes": 14425, + "sha256": "52a47ba5b3a7ddf950ce7233ceecf3a8b23697bd55fe30dc7b76c90a85d79bc0" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13897, + "sha256": "8fc8b2d598977c1f94634d2fbfab32159e0449aa50cf3780aeb8ca0ad18e57f5" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "52a47ba5b3a7ddf950ce7233ceecf3a8b23697bd55fe30dc7b76c90a85d79bc0", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/euler_beam_3d.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/euler_beam_3d.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "82ca250d480a19e53037f49a7d444d2bbe661eb9", + "mode": "100644", + "size_bytes": 25709, + "sha256": "e8d5f2a3079fe49174dd91b994928740b6ff4cd38340f5750cf4ff27313cdb71" + }, + "working_tree": { + "exists": true, + "size_bytes": 26329, + "sha256": "307b19d5efce16f54ab3174a211a1b22abb5c324ae04a9577a1129322277460f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/euler_beam_3d.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "82ca250d480a19e53037f49a7d444d2bbe661eb9", + "mode": "100644", + "size_bytes": 25709, + "sha256": "e8d5f2a3079fe49174dd91b994928740b6ff4cd38340f5750cf4ff27313cdb71" + }, + "working_tree": { + "exists": true, + "size_bytes": 26329, + "sha256": "307b19d5efce16f54ab3174a211a1b22abb5c324ae04a9577a1129322277460f" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 26329, + "sha256": "307b19d5efce16f54ab3174a211a1b22abb5c324ae04a9577a1129322277460f" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "307b19d5efce16f54ab3174a211a1b22abb5c324ae04a9577a1129322277460f", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/finite_rotation.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/finite_rotation.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4e823908f8673af1393558247f4750539e0d56a6", + "mode": "100644", + "size_bytes": 10186, + "sha256": "05ad48be7b3e6343b7bb08d01d5098286cb1537c68217a57e9b42a27c79aedc0" + }, + "working_tree": { + "exists": true, + "size_bytes": 10472, + "sha256": "65b25e442818c9d1c506f96091c994e7dc5ec91df2243a70af3a0c4f4074685a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/finite_rotation.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8048f4d99d93d665654787a2fcb143e4508cfae1", + "mode": "100644", + "size_bytes": 9017, + "sha256": "ec09963de02f6815673396e6d38fd4b981528d7daa815e43d2b601a111dab6d9" + }, + "working_tree": { + "exists": true, + "size_bytes": 9266, + "sha256": "c2f17c16cd4b23ed0a4cfae990b425a89f09c56b74dd342caebdca0d56da3722" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10472, + "sha256": "65b25e442818c9d1c506f96091c994e7dc5ec91df2243a70af3a0c4f4074685a" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "c2f17c16cd4b23ed0a4cfae990b425a89f09c56b74dd342caebdca0d56da3722", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_element.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_element.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "71de8864c0c736120d6e1dc1e3d9a8415abbe5e5", + "mode": "100644", + "size_bytes": 25625, + "sha256": "76a5bca69b9ae93582b4296606a9e55c3ad3fd778f532abb6d56d085cc43f370" + }, + "working_tree": { + "exists": true, + "size_bytes": 26221, + "sha256": "e852928046324a0aee3a7117448460ff5a33a61acf36f163e704191e574bfa34" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_element.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bb25f4ba6e6119f80f18ffeb26da28624bd0f6bb", + "mode": "100644", + "size_bytes": 27154, + "sha256": "2566fb073eaa8c3a03d8aba381eff0219a769ac7ebf92f33690baf39ac4ebcd9" + }, + "working_tree": { + "exists": true, + "size_bytes": 27781, + "sha256": "1d39b4bcdcb0d21b848c5e80bc9a63eefd0e516cce325e02b3c296c38894c469" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 26221, + "sha256": "e852928046324a0aee3a7117448460ff5a33a61acf36f163e704191e574bfa34" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1d39b4bcdcb0d21b848c5e80bc9a63eefd0e516cce325e02b3c296c38894c469", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Jacobian explicit inverse/gradient multiply replaced by LU transpose solves; reciprocal finiteness gates retained in new execution graph.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_geometry.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_geometry.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e7eff40a421a6f59347fd4a90418490b484f3721", + "mode": "100644", + "size_bytes": 10147, + "sha256": "61eecf5dbb3e1b1ff5e5cfce77605df6420e30e2133d6cd26ee2671d4cf8198d" + }, + "working_tree": { + "exists": true, + "size_bytes": 10382, + "sha256": "5be46597c4a55d04636a23ef9b0ed27730a1aa4a03f8629bed23a4dead3090f0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_geometry.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6d444cf6955dc64ee2058b2d6fc9da63e8425f73", + "mode": "100644", + "size_bytes": 9724, + "sha256": "3c2e1333b1ab92be3eeeb64d8792f13e6b15a0eb4d89810b8aab6f01c531e713" + }, + "working_tree": { + "exists": true, + "size_bytes": 9955, + "sha256": "e8b6dbec546e1d2e93b47caaca69abebec3a5a884edbe586a2b79ab60cf9f9e1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10391, + "sha256": "b1d1006bb226b320aa8e6c55396cf3af0d57e68548cbcd781defb24e324f0abf" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e8b6dbec546e1d2e93b47caaca69abebec3a5a884edbe586a2b79ab60cf9f9e1", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_geometry.h", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_geometry.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6e670c77e7130f04150dcf038bd413d9d0f460f6", + "mode": "100644", + "size_bytes": 1691, + "sha256": "ca33622687c4de35694847a3413f9a6b3ae683b36609fc801767c5b2d8c8cb5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 1721, + "sha256": "97c182084f8f0dabb217d56577312aebe3f8bb8d86638992bd21651d4ec4d472" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_geometry.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "72bf299be0982d77b87dd161cbd8df532db72fe7", + "mode": "100644", + "size_bytes": 1554, + "sha256": "f0bd580c9288731df3a9c07ff2bf05019c2bb270a0114bbc26fc49c691b7d45c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1585, + "sha256": "68c41d36c69753e27b457db4376841fb1152ff809fa2dcc87cef5cf7f532a81e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1724, + "sha256": "2fe9830c84713c3e8d3d6d84174be4d2edd3fb2add007825e5da056451cb7388" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "68c41d36c69753e27b457db4376841fb1152ff809fa2dcc87cef5cf7f532a81e", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_high_low.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_high_low.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ed1f9dc2219cfa4dbe1e5cef7bd4410119f4afb0", + "mode": "100644", + "size_bytes": 16400, + "sha256": "7461a228c003c36a9d88a82cac08cfa05b75559b1177d85ef5b271a0f9406923" + }, + "working_tree": { + "exists": true, + "size_bytes": 16771, + "sha256": "5109a78a43da9fecb1b69fc5a45a676775992489fd7c6574f312900f3b6f2523" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_high_low.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "90cfd2c32bb3464c844c119e60c51d9bed872d0a", + "mode": "100644", + "size_bytes": 16358, + "sha256": "ed4239a808977c22445596fe08337350f0f07ae72c950b2a42279d66e9b2bae6" + }, + "working_tree": { + "exists": true, + "size_bytes": 16728, + "sha256": "e14ec91139cb270a6af073df057700813972650caa0f8af0342ba2fc16fad510" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 16771, + "sha256": "5109a78a43da9fecb1b69fc5a45a676775992489fd7c6574f312900f3b6f2523" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e14ec91139cb270a6af073df057700813972650caa0f8af0342ba2fc16fad510", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "AddPair/MultiplyPair shortcuts replaced with shared HighLow Add/Multiply.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_linear_tangent_cache.h", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_linear_tangent_cache.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6e5087cbf84a1f5419714cfe796768bed826e7c5", + "mode": "100644", + "size_bytes": 750, + "sha256": "056a8c9c5248a78bbf222e1a159fe5a8f0c4e1f10f43c545ab2f84f67525df49" + }, + "working_tree": { + "exists": true, + "size_bytes": 771, + "sha256": "330003d7a9dc556ee09cc20f79408d76cec96f65393127cecbb637fd0830faba" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_linear_tangent_cache.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6e5087cbf84a1f5419714cfe796768bed826e7c5", + "mode": "100644", + "size_bytes": 750, + "sha256": "056a8c9c5248a78bbf222e1a159fe5a8f0c4e1f10f43c545ab2f84f67525df49" + }, + "working_tree": { + "exists": true, + "size_bytes": 771, + "sha256": "330003d7a9dc556ee09cc20f79408d76cec96f65393127cecbb637fd0830faba" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 771, + "sha256": "330003d7a9dc556ee09cc20f79408d76cec96f65393127cecbb637fd0830faba" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "330003d7a9dc556ee09cc20f79408d76cec96f65393127cecbb637fd0830faba", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_pair_arithmetic.h", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_pair_arithmetic.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d2fdd5f0065f71d2fc7bce0ddf3483a0a8ec6f0c", + "mode": "100644", + "size_bytes": 1866, + "sha256": "12d9e716d5be5177f01964d2d15f0968cb7ada818b0de61491b0b8f05f22216b" + }, + "working_tree": { + "exists": true, + "size_bytes": 1906, + "sha256": "3852443c2e555b038134ed9a9f71b49bfe9e6315413ba0fe058e79821eb9cb8a" + }, + "working_tree_equals_blob": false + }, + "policy": "exclude-after-consumer-migration", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1906, + "sha256": "3852443c2e555b038134ed9a9f71b49bfe9e6315413ba0fe058e79821eb9cb8a" + } + }, + { + "target_path": "src/fesa/elements/hex8_pair_simd.h", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_pair_simd.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4dffa07dc2c2accbf89aa80063c7af8af051432f", + "mode": "100644", + "size_bytes": 4125, + "sha256": "849b4a63078cd626f371116ef15d8da8347a2cd6f88c2080c3e1e5287f0efae0" + }, + "working_tree": { + "exists": true, + "size_bytes": 4209, + "sha256": "143be36ec377adceccfac2526416201c4c56003ff8e314bd8ce80d1e9ac62301" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_pair_simd.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4e5a9330f3e423ab25f53b0d380d2e8a1fa94c27", + "mode": "100644", + "size_bytes": 4083, + "sha256": "2b3d91c355ff69b7c1cd4ace9721b2444b4ca52c1bd9ece4282a2def78fe34ec" + }, + "working_tree": { + "exists": true, + "size_bytes": 4167, + "sha256": "51ec8202920bbe2f0c19019bda888f75717cf446aea4f1998605054b854e7bd2" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4209, + "sha256": "143be36ec377adceccfac2526416201c4c56003ff8e314bd8ce80d1e9ac62301" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "51ec8202920bbe2f0c19019bda888f75717cf446aea4f1998605054b854e7bd2", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_pair_simd_avx2.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_pair_simd_avx2.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "570b2a5b4c315e1035483c96bd85ab6df331048c", + "mode": "100644", + "size_bytes": 13910, + "sha256": "361e413ceafe474bcba148b7970d8c38c3a6571b5368761bcd8ec3385bedd6bf" + }, + "working_tree": { + "exists": true, + "size_bytes": 14212, + "sha256": "9830e87c17571e33a1f8100c782d3b244360cb81f67617f78dc6a3dcd763bab6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_pair_simd_avx2.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0a6e5975dcffde9f9841935c768465f1e48c5ef5", + "mode": "100644", + "size_bytes": 13819, + "sha256": "9d619e1d2e24702397a928985220db1999349392c5d84a00edcbc4d1fa125d4e" + }, + "working_tree": { + "exists": true, + "size_bytes": 14121, + "sha256": "8d992defadeef53f6dcd832955f382005d0119ca7787bc7cbdec6359db02e6a3" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14212, + "sha256": "9830e87c17571e33a1f8100c782d3b244360cb81f67617f78dc6a3dcd763bab6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "8d992defadeef53f6dcd832955f382005d0119ca7787bc7cbdec6359db02e6a3", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Exceptional and mixed-zero packet fallbacks remove pair_shortcuts routing.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/hex8_pair_simd_dispatch.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/hex8_pair_simd_dispatch.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "97e01183b6be64bc913851c89cfb1f5392035de6", + "mode": "100644", + "size_bytes": 5447, + "sha256": "d545aa71fd1204c790791d894e4b0195c6516a3e86084f139fc49352df322974" + }, + "working_tree": { + "exists": true, + "size_bytes": 5575, + "sha256": "7490138df171a0a34df533b2fbed431cabaae6fe69b48c15dce408f8044d35c1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/hex8_pair_simd_dispatch.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9c970475fb1896749372c5b3a73ead14d5c910e9", + "mode": "100644", + "size_bytes": 5543, + "sha256": "02a12a309be69f9b60b10e45d8a4a86a1ee6eb14d75b0558846708f2c5daffa0" + }, + "working_tree": { + "exists": true, + "size_bytes": 5671, + "sha256": "978fa504dde5a12e07c6b9a95c821f46d6dcea4ec2fc66ce9050f040b96dd845" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5575, + "sha256": "7490138df171a0a34df533b2fbed431cabaae6fe69b48c15dce408f8044d35c1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "978fa504dde5a12e07c6b9a95c821f46d6dcea4ec2fc66ce9050f040b96dd845", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Scalar lane fallback and geometry/material packet graph now shared HighLow Add/Multiply.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/mitc4_shell.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/mitc4_shell.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "129f05b362248918246b773d17ea77055ad9ec41", + "mode": "100644", + "size_bytes": 49071, + "sha256": "487c55ec21d7e092686c29a170bf5fcefff6ab73de11687b2c4adafb4ecfea51" + }, + "working_tree": { + "exists": true, + "size_bytes": 50264, + "sha256": "fdbbd15e961331f14a73fc0bd13932d3f15213cfe91962bf45f1d2faf0a83f79" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/mitc4_shell.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6aea36ef56878fc5e97c72820a4d2c0cd51b1b74", + "mode": "100644", + "size_bytes": 47934, + "sha256": "34f349da0eb0bf71f389f11614c1c9e93c5e279a4023e6cd29fdb030e63a2ff8" + }, + "working_tree": { + "exists": true, + "size_bytes": 49080, + "sha256": "6361a420545ab3717c412594846043e85abc7f47d89cd95be42cf164a6a23f4e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 50264, + "sha256": "fdbbd15e961331f14a73fc0bd13932d3f15213cfe91962bf45f1d2faf0a83f79" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6361a420545ab3717c412594846043e85abc7f47d89cd95be42cf164a6a23f4e", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Reciprocal-basis Cartesian strain reconstruction replaced by left/right LU solves; scalar scale loops now Matrix::Scale.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/nonlinear_mitc4_configuration_internal.h", + "fesa_dev": { + "source_path": "src/fesa/elements/nonlinear_mitc4_configuration_internal.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "618eebc423b75640c29d269ee1e1f50c654346d3", + "mode": "100644", + "size_bytes": 763, + "sha256": "fd3ebb477154b3bf5b562259d680049e870a47ed6733875553d9e030b82028e3" + }, + "working_tree": { + "exists": true, + "size_bytes": 787, + "sha256": "2def3eacdffde8680b12a400da54de9d5dd637f59664abfc26b3c7170e115a87" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/nonlinear_mitc4_configuration_internal.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "618eebc423b75640c29d269ee1e1f50c654346d3", + "mode": "100644", + "size_bytes": 763, + "sha256": "fd3ebb477154b3bf5b562259d680049e870a47ed6733875553d9e030b82028e3" + }, + "working_tree": { + "exists": true, + "size_bytes": 787, + "sha256": "2def3eacdffde8680b12a400da54de9d5dd637f59664abfc26b3c7170e115a87" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 787, + "sha256": "2def3eacdffde8680b12a400da54de9d5dd637f59664abfc26b3c7170e115a87" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2def3eacdffde8680b12a400da54de9d5dd637f59664abfc26b3c7170e115a87", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/nonlinear_mitc4_inertia.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/nonlinear_mitc4_inertia.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "13198fbe375d9c95f25ed389b9dc41b5cb896a38", + "mode": "100644", + "size_bytes": 44348, + "sha256": "d73427a408964483186f9933f3f90d2cd8a08bb2d3cbfbe83718489270ffb3fa" + }, + "working_tree": { + "exists": true, + "size_bytes": 45382, + "sha256": "5b77592b9070a88484ec8c6d4055e3e50f0bb0e4419af801da81b4efe9fb7154" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/nonlinear_mitc4_inertia.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b0716d49e896fc210c46dd03a128071fcdfa0081", + "mode": "100644", + "size_bytes": 40369, + "sha256": "cbed92c873aae47563dab8c1e94125ddbb35002c1a05fbbf2da9371294c88774" + }, + "working_tree": { + "exists": true, + "size_bytes": 41282, + "sha256": "e2018e6237ac67c1a24301d910b60e00483ef785ccd9983dc780f36eb3689598" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 45382, + "sha256": "5b77592b9070a88484ec8c6d4055e3e50f0bb0e4419af801da81b4efe9fb7154" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e2018e6237ac67c1a24301d910b60e00483ef785ccd9983dc780f36eb3689598", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/nonlinear_mitc4_shell.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/nonlinear_mitc4_shell.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "400d3e72547dc3b3d517ae8d4706a4ba9809b7d5", + "mode": "100644", + "size_bytes": 81884, + "sha256": "75eea882a5c8dca7c3c200696574630d60840aecda5dea9cf63c2a517232b731" + }, + "working_tree": { + "exists": true, + "size_bytes": 83766, + "sha256": "74bc4079c9ffdb4083f9a63cae56493a8d1f207be2984919b04815c981aa7a03" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/nonlinear_mitc4_shell.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d058f18885724b32be9d9e72605ff62eefe49150", + "mode": "100644", + "size_bytes": 81072, + "sha256": "6e476b5cb829168e5a815ba01b52b66641cc5b7668a5c348d2dfd378aaf472ac" + }, + "working_tree": { + "exists": true, + "size_bytes": 82906, + "sha256": "60e704d7b709339755975351df145b7bac3939b5431541056a4632f5a62ebecf" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 83766, + "sha256": "74bc4079c9ffdb4083f9a63cae56493a8d1f207be2984919b04815c981aa7a03" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "60e704d7b709339755975351df145b7bac3939b5431541056a4632f5a62ebecf", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/shell_kernel_values.h", + "refactor": { + "source_path": "src/fesa/elements/shell_kernel_values.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9c0b761682702480b738dbfb22753b26c3732f81", + "mode": "100644", + "size_bytes": 2639, + "sha256": "fa02df36c8ac770aeb509df40f067c1bcf7d34e65f1d066bac4df2fba642ab3c" + }, + "working_tree": { + "exists": true, + "size_bytes": 2718, + "sha256": "fb1608b66157dd7aa71a17c4b45423295d96eb384090cdff4d276cefa9e56f75" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "fb1608b66157dd7aa71a17c4b45423295d96eb384090cdff4d276cefa9e56f75", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/thermal_interval.h", + "fesa_dev": { + "source_path": "src/fesa/elements/thermal_interval.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9b7c8361d0abdad918e12e7dcb896ce2362e2ead", + "mode": "100644", + "size_bytes": 4716, + "sha256": "93359a9e874922e27b7db3688979142d34f565408998ee8b4a598f1faeec4a95" + }, + "working_tree": { + "exists": true, + "size_bytes": 4824, + "sha256": "913e036c3ed9fef95b7123b8edf57c3bf25be7027819e1ab2177565fefb8cd67" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/thermal_interval.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9b7c8361d0abdad918e12e7dcb896ce2362e2ead", + "mode": "100644", + "size_bytes": 4716, + "sha256": "93359a9e874922e27b7db3688979142d34f565408998ee8b4a598f1faeec4a95" + }, + "working_tree": { + "exists": true, + "size_bytes": 4824, + "sha256": "913e036c3ed9fef95b7123b8edf57c3bf25be7027819e1ab2177565fefb8cd67" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4824, + "sha256": "913e036c3ed9fef95b7123b8edf57c3bf25be7027819e1ab2177565fefb8cd67" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "913e036c3ed9fef95b7123b8edf57c3bf25be7027819e1ab2177565fefb8cd67", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/thermal_shell.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/thermal_shell.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "35ccb7da26fcbaf71f0d30e038160fcb93204461", + "mode": "100644", + "size_bytes": 10373, + "sha256": "f655d07d81e5516c29b35f3cc0a502d2ba34fa0f5788e4728dfba0f82f84254e" + }, + "working_tree": { + "exists": true, + "size_bytes": 10609, + "sha256": "e90d9b24859313d5ba46338240fca448ec4e40cb3f73cb95adefffdbcd1f6667" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/thermal_shell.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "35ccb7da26fcbaf71f0d30e038160fcb93204461", + "mode": "100644", + "size_bytes": 10373, + "sha256": "f655d07d81e5516c29b35f3cc0a502d2ba34fa0f5788e4728dfba0f82f84254e" + }, + "working_tree": { + "exists": true, + "size_bytes": 10609, + "sha256": "e90d9b24859313d5ba46338240fca448ec4e40cb3f73cb95adefffdbcd1f6667" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10609, + "sha256": "e90d9b24859313d5ba46338240fca448ec4e40cb3f73cb95adefffdbcd1f6667" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e90d9b24859313d5ba46338240fca448ec4e40cb3f73cb95adefffdbcd1f6667", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/thermal_shell_geometry.cpp", + "fesa_dev": { + "source_path": "src/fesa/elements/thermal_shell_geometry.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8219714278776dff18873c088a9de88e6e3a9ca7", + "mode": "100644", + "size_bytes": 18597, + "sha256": "74c40c961cfd4bc4179a677869813978add1ed74ac355c5f62b6040316575adf" + }, + "working_tree": { + "exists": true, + "size_bytes": 19028, + "sha256": "dbcf7cf920ecc685ccd341f89a33a58c10776c6a869d7889bc291f060d1cf15e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/thermal_shell_geometry.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ac21a9a1cbe218a0433680656b05e0954cce82d0", + "mode": "100644", + "size_bytes": 20013, + "sha256": "c6a18bd754b1a555f0ec8f30c34144dfa89c02a39923d1054851ad0466b807c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 20477, + "sha256": "1e7795d29dfa509db775c533b791329618f8eb46c4ede18468a0a72737bc181c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 19028, + "sha256": "dbcf7cf920ecc685ccd341f89a33a58c10776c6a869d7889bc291f060d1cf15e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1e7795d29dfa509db775c533b791329618f8eb46c4ede18468a0a72737bc181c", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/elements/thermal_shell_geometry.h", + "fesa_dev": { + "source_path": "src/fesa/elements/thermal_shell_geometry.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a31b339072928128d8a332d708915317523214f2", + "mode": "100644", + "size_bytes": 2197, + "sha256": "7e3e39a19f7ea899c2ef77e22ab2a0c6e9168a92dd8cf7425f183265412c4838" + }, + "working_tree": { + "exists": true, + "size_bytes": 2256, + "sha256": "d4409b7db44da090f5b9121d65060797bae4324600e49e260f7455dc5627fec0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/elements/thermal_shell_geometry.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bf007c73d9d084604638401f1236bf3a02d8b7a3", + "mode": "100644", + "size_bytes": 2197, + "sha256": "4a9b36ce15a631c7349652f93b958309fd4f86f85d6313cb2c25dff93fc4d612" + }, + "working_tree": { + "exists": true, + "size_bytes": 2256, + "sha256": "423ceb2fc2fbeede59678d4e1d0b2a9d289bb21507e48d145c7687c210ddc830" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2256, + "sha256": "d4409b7db44da090f5b9121d65060797bae4324600e49e260f7455dc5627fec0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "423ceb2fc2fbeede59678d4e1d0b2a9d289bb21507e48d145c7687c210ddc830", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "quadrature-and-local-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/fem/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/fem/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6d9247a7bb9ec8cc3cc7135c06589dd2f7e5f373", + "mode": "100644", + "size_bytes": 951, + "sha256": "f5f117476092ab766bcbb2b415ba054531dac2a6c095351969ee60a5474fd061" + }, + "working_tree": { + "exists": true, + "size_bytes": 964, + "sha256": "62ff1835af7003a5bb9005f1f0da9d3b9ce073fe493dc4c736b93bbeafc017ab" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/fem/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6d9247a7bb9ec8cc3cc7135c06589dd2f7e5f373", + "mode": "100644", + "size_bytes": 951, + "sha256": "f5f117476092ab766bcbb2b415ba054531dac2a6c095351969ee60a5474fd061" + }, + "working_tree": { + "exists": true, + "size_bytes": 964, + "sha256": "62ff1835af7003a5bb9005f1f0da9d3b9ce073fe493dc4c736b93bbeafc017ab" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 964, + "sha256": "62ff1835af7003a5bb9005f1f0da9d3b9ce073fe493dc4c736b93bbeafc017ab" + } + }, + { + "target_path": "src/fesa/fem/dof_manager.cpp", + "fesa_dev": { + "source_path": "src/fesa/fem/dof_manager.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "17ac70aa83afd32e0145b9162ef506f0f6538be0", + "mode": "100644", + "size_bytes": 32207, + "sha256": "eb8e7893dce2f0507157b23c3f1f42e293b2596aaab7a7cd89de3108a63b484f" + }, + "working_tree": { + "exists": true, + "size_bytes": 32966, + "sha256": "d3ff9df18fc2ea5dff58f07b5c8f9ec45aab22300acbb746a569c6c75e64eacc" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/fem/dof_manager.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a945bef2dc4fade73f9ec81d2134f7eec07800fb", + "mode": "100644", + "size_bytes": 32012, + "sha256": "db8b0e2d4ebc4ab1c0a3176eb0106808ca8a8d8f635e61f7e834e004420bb188" + }, + "working_tree": { + "exists": true, + "size_bytes": 32766, + "sha256": "47049680c445618c3f82771bf0ef41d074c98243e4d121d6d8bd89a6a27786eb" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 32966, + "sha256": "d3ff9df18fc2ea5dff58f07b5c8f9ec45aab22300acbb746a569c6c75e64eacc" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "47049680c445618c3f82771bf0ef41d074c98243e4d121d6d8bd89a6a27786eb", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "reduction-or-operator-order-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8e1eee0a02d40035066693a9fe841eb0fdddb396", + "mode": "100644", + "size_bytes": 1333, + "sha256": "35e98ab7b3357a0d23f4f5370575084bb225117e31409a44bab6ac81d9b88fa0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1350, + "sha256": "2625c2f1fcfb0e02f1fdb305fab8cd9ccce9f3854967ef34176c4a93e72bd619" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8e1eee0a02d40035066693a9fe841eb0fdddb396", + "mode": "100644", + "size_bytes": 1333, + "sha256": "35e98ab7b3357a0d23f4f5370575084bb225117e31409a44bab6ac81d9b88fa0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1350, + "sha256": "2625c2f1fcfb0e02f1fdb305fab8cd9ccce9f3854967ef34176c4a93e72bd619" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1350, + "sha256": "2625c2f1fcfb0e02f1fdb305fab8cd9ccce9f3854967ef34176c4a93e72bd619" + } + }, + { + "target_path": "src/fesa/io/abaqus/domain_builder.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/domain_builder.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f4b73bf0aba3c92ec7688b754f38522a24926315", + "mode": "100644", + "size_bytes": 264, + "sha256": "8300597bc4d18489eb97a9fcdfa5028e8f560927eb7135c0820f43b36a6733ff" + }, + "working_tree": { + "exists": true, + "size_bytes": 275, + "sha256": "635323f1a8cbb39026ee3cddbe31d2ac3a93b523da2a1a3f75fab5eef5c5a429" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/domain_builder.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f4b73bf0aba3c92ec7688b754f38522a24926315", + "mode": "100644", + "size_bytes": 264, + "sha256": "8300597bc4d18489eb97a9fcdfa5028e8f560927eb7135c0820f43b36a6733ff" + }, + "working_tree": { + "exists": true, + "size_bytes": 275, + "sha256": "635323f1a8cbb39026ee3cddbe31d2ac3a93b523da2a1a3f75fab5eef5c5a429" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 275, + "sha256": "635323f1a8cbb39026ee3cddbe31d2ac3a93b523da2a1a3f75fab5eef5c5a429" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "635323f1a8cbb39026ee3cddbe31d2ac3a93b523da2a1a3f75fab5eef5c5a429", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/domain_builder.h", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/domain_builder.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ae6448b83eb6509ac72ab3212b8ac120cbab9a57", + "mode": "100644", + "size_bytes": 538, + "sha256": "ea207534d0deb490664fa0ce74f9f7c50d7c5e9524893278629149df9af01acd" + }, + "working_tree": { + "exists": true, + "size_bytes": 558, + "sha256": "af8a64ab957ff55f9e830563e49f3e41f599a258e00eda8a5a728de6577e108e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/domain_builder.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ae6448b83eb6509ac72ab3212b8ac120cbab9a57", + "mode": "100644", + "size_bytes": 538, + "sha256": "ea207534d0deb490664fa0ce74f9f7c50d7c5e9524893278629149df9af01acd" + }, + "working_tree": { + "exists": true, + "size_bytes": 558, + "sha256": "af8a64ab957ff55f9e830563e49f3e41f599a258e00eda8a5a728de6577e108e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 558, + "sha256": "af8a64ab957ff55f9e830563e49f3e41f599a258e00eda8a5a728de6577e108e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "af8a64ab957ff55f9e830563e49f3e41f599a258e00eda8a5a728de6577e108e", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/domain_mapper.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/domain_mapper.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a64fbe4f50662f3dc24b6a94509561fd11027f91", + "mode": "100644", + "size_bytes": 1326, + "sha256": "1e3fa9b07c32c4805bc5322ed7e0110d9cd9af0a0a2d17161401f5f7f255cecd" + }, + "working_tree": { + "exists": true, + "size_bytes": 1367, + "sha256": "fa9db22f3f78192d207b0789a9c04431d6e0716d0a351ea326deae681e4937e2" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/domain_mapper.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a64fbe4f50662f3dc24b6a94509561fd11027f91", + "mode": "100644", + "size_bytes": 1326, + "sha256": "1e3fa9b07c32c4805bc5322ed7e0110d9cd9af0a0a2d17161401f5f7f255cecd" + }, + "working_tree": { + "exists": true, + "size_bytes": 1367, + "sha256": "fa9db22f3f78192d207b0789a9c04431d6e0716d0a351ea326deae681e4937e2" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1367, + "sha256": "fa9db22f3f78192d207b0789a9c04431d6e0716d0a351ea326deae681e4937e2" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "fa9db22f3f78192d207b0789a9c04431d6e0716d0a351ea326deae681e4937e2", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/domain_mapping_context.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/domain_mapping_context.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4d5b046507ba815f30b98d28f03b32d600f96305", + "mode": "100644", + "size_bytes": 191506, + "sha256": "565e83b68bc2cd3bc358dbb1430b3c430156bae913cf5c6dc555c2f03cc96de6" + }, + "working_tree": { + "exists": true, + "size_bytes": 196139, + "sha256": "cf1174451176c0d3649d93aebd7582cd7cdac243dccc20e6d5553c57c7f39479" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/domain_mapping_context.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "941bf3f3808dd11d6565a4f55373b27d2b1309b3", + "mode": "100644", + "size_bytes": 49418, + "sha256": "1d9ee3411f3464afcfe3822943b558241b95e1a70020672698b576137e7ea428" + }, + "working_tree": { + "exists": true, + "size_bytes": 50692, + "sha256": "32c0e763dd456d781403cf370c3e1b0278c84e7d5d926f88740a3d55543c807a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 196139, + "sha256": "cf1174451176c0d3649d93aebd7582cd7cdac243dccc20e6d5553c57c7f39479" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "32c0e763dd456d781403cf370c3e1b0278c84e7d5d926f88740a3d55543c807a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/domain_mapping_context.h", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/domain_mapping_context.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f32223f46733be1963f8771f6ea3ec1b34919041", + "mode": "100644", + "size_bytes": 2658, + "sha256": "9a2e21f4a2d41bf64bfd561e2fa516b7bdecca7336ca8de3355b1387266a0b9e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2742, + "sha256": "0b8183b931d26c5d1cc45d3b4ffaa7a8e7886c26339b5918d6d08da5c2dc049a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/domain_mapping_context.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f32223f46733be1963f8771f6ea3ec1b34919041", + "mode": "100644", + "size_bytes": 2658, + "sha256": "9a2e21f4a2d41bf64bfd561e2fa516b7bdecca7336ca8de3355b1387266a0b9e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2742, + "sha256": "0b8183b931d26c5d1cc45d3b4ffaa7a8e7886c26339b5918d6d08da5c2dc049a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2742, + "sha256": "0b8183b931d26c5d1cc45d3b4ffaa7a8e7886c26339b5918d6d08da5c2dc049a" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0b8183b931d26c5d1cc45d3b4ffaa7a8e7886c26339b5918d6d08da5c2dc049a", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/input_reader.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/input_reader.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "44ae2179c64363a8edf27a626b083a9c8c3ce6ae", + "mode": "100644", + "size_bytes": 9806, + "sha256": "7e4cb127d04cd986a5d60fbcf4c5f6d90e44117736187b9c52477a0fcf0e5742" + }, + "working_tree": { + "exists": true, + "size_bytes": 10073, + "sha256": "6c5ea89f9f3acff0ce6b1c7192a1c787ec7ae6d3f3008e5016e086b5f25d193e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/input_reader.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a8410c75ff3203f1e1575f71c3487baa96a79b9c", + "mode": "100644", + "size_bytes": 9740, + "sha256": "3023608c9e320869b7c5bf80a8f78009f9b4bc21195b20f98b902b084d4c564f" + }, + "working_tree": { + "exists": true, + "size_bytes": 10003, + "sha256": "6392c6b17d4a594d10772f69cff18573ae3cee92674ac90a0aaae20e2e468092" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10073, + "sha256": "6c5ea89f9f3acff0ce6b1c7192a1c787ec7ae6d3f3008e5016e086b5f25d193e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6392c6b17d4a594d10772f69cff18573ae3cee92674ac90a0aaae20e2e468092", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/mapping_diagnostics.h", + "refactor": { + "source_path": "src/fesa/io/abaqus/mapping_diagnostics.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1a66a99b8f710dd4e00b3935e049601a9037191a", + "mode": "100644", + "size_bytes": 4244, + "sha256": "23a62c4ed3700651270e25722678f62de0537ab808280ae6a632ba191043dda1" + }, + "working_tree": { + "exists": true, + "size_bytes": 4349, + "sha256": "d58a1d632dfd9bc8906cefb37c49d3d9097703e70f5b7201186078d9b74355d8" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "d58a1d632dfd9bc8906cefb37c49d3d9097703e70f5b7201186078d9b74355d8", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/material_property_candidates.h", + "refactor": { + "source_path": "src/fesa/io/abaqus/material_property_candidates.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "de7297b411069b956ff34e010d78066ad14013f2", + "mode": "100644", + "size_bytes": 6464, + "sha256": "deb5aa09467d8301197b0d3ed7adb59bbc3e28422f43ac3cfe22ecb1bc06b51d" + }, + "working_tree": { + "exists": true, + "size_bytes": 6649, + "sha256": "58ec023d66f2c1147b2513aceeee23407b1490b91ceac45d6c74680af0ead34d" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "58ec023d66f2c1147b2513aceeee23407b1490b91ceac45d6c74680af0ead34d", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/material_property_mapper.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/material_property_mapper.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "84cdc2bbf758b1ef43559f31be0ef1cf84d58a53", + "mode": "100644", + "size_bytes": 293, + "sha256": "b447a5a66b7a899c9588d08d446243686d09800b52c559642d62976f8bf0d013" + }, + "working_tree": { + "exists": true, + "size_bytes": 304, + "sha256": "3bb42e635e2de148ce551da3852d734c4eb4f90a32ae93b64ec4bec717a9195d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/material_property_mapper.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "82b43519b3881fd21f353b2d07083afba72b6927", + "mode": "100644", + "size_bytes": 38084, + "sha256": "d1072d638950152110e2b264068f449950807f536d12a852d51da44857111d05" + }, + "working_tree": { + "exists": true, + "size_bytes": 39013, + "sha256": "f79e8927d15f27b329a2063a8cb33fd856b3196580c914b5bc9208e88f259199" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 304, + "sha256": "3bb42e635e2de148ce551da3852d734c4eb4f90a32ae93b64ec4bec717a9195d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f79e8927d15f27b329a2063a8cb33fd856b3196580c914b5bc9208e88f259199", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/material_property_mapper.h", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/material_property_mapper.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "065c6b3234ff9c61bf1fb46e8525cc966e6f0d3b", + "mode": "100644", + "size_bytes": 537, + "sha256": "2e978f076267b3650afa32c651bfbc611f0fe86d9c2124906d68f1dc9ff4496a" + }, + "working_tree": { + "exists": true, + "size_bytes": 556, + "sha256": "14c27361cc65667b900099554ecedfdace2b5bac41a4abbbbf4f902839eafe63" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/material_property_mapper.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "065c6b3234ff9c61bf1fb46e8525cc966e6f0d3b", + "mode": "100644", + "size_bytes": 537, + "sha256": "2e978f076267b3650afa32c651bfbc611f0fe86d9c2124906d68f1dc9ff4496a" + }, + "working_tree": { + "exists": true, + "size_bytes": 556, + "sha256": "14c27361cc65667b900099554ecedfdace2b5bac41a4abbbbf4f902839eafe63" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 556, + "sha256": "14c27361cc65667b900099554ecedfdace2b5bac41a4abbbbf4f902839eafe63" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "14c27361cc65667b900099554ecedfdace2b5bac41a4abbbbf4f902839eafe63", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/step_definition_candidates.h", + "refactor": { + "source_path": "src/fesa/io/abaqus/step_definition_candidates.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "da5d9d7221ce44ab9a68ac3c1743c21b68d46ebd", + "mode": "100644", + "size_bytes": 7014, + "sha256": "3ee9102d5a3f87f57a1678cfc6ef85602f7e03f93c06b219e7d390a1d01e6ded" + }, + "working_tree": { + "exists": true, + "size_bytes": 7210, + "sha256": "002ac1d40d6c4d5cc58a223d37ed6462686d6f2701ea6727f91ed133283faacc" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "002ac1d40d6c4d5cc58a223d37ed6462686d6f2701ea6727f91ed133283faacc", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/step_definition_mapper.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/step_definition_mapper.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2ecd82d0c3d850243d14428ffcc13a94a31c1be5", + "mode": "100644", + "size_bytes": 275, + "sha256": "d30deb11624875e9573986f6fe62a9ce2c83b59270404d2bf97c6159fcb5e72d" + }, + "working_tree": { + "exists": true, + "size_bytes": 286, + "sha256": "ed7aea22c28fe87d7496d069c67fbdfcd3bfbac4b07b4c9352d6979fa7f76058" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/step_definition_mapper.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d54395102e4a54274a6323f04c03d4cbae8e04b3", + "mode": "100644", + "size_bytes": 71227, + "sha256": "e6bf60bb4d9a9442fc3da2c201d0fd9c2141b0e6e8e3982de1fb1d8a68f8ff25" + }, + "working_tree": { + "exists": true, + "size_bytes": 72908, + "sha256": "6f3fa2b919350a3b20bb3e91bbc17b9399858ad51106b57968b8b4be39ac7517" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 286, + "sha256": "ed7aea22c28fe87d7496d069c67fbdfcd3bfbac4b07b4c9352d6979fa7f76058" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "6f3fa2b919350a3b20bb3e91bbc17b9399858ad51106b57968b8b4be39ac7517", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/step_definition_mapper.h", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/step_definition_mapper.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8fe11383abfacc909a3be13e6a1aa6b5f1bc5279", + "mode": "100644", + "size_bytes": 525, + "sha256": "ba4d7294930c69fc009a8baa48ab09563d17d9b87ad4963afdae1cb5377cd403" + }, + "working_tree": { + "exists": true, + "size_bytes": 544, + "sha256": "2e5da26c092da1640eb1ed8af0381193dc59b71ff1462ca827f01b2abe8842ee" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/step_definition_mapper.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8fe11383abfacc909a3be13e6a1aa6b5f1bc5279", + "mode": "100644", + "size_bytes": 525, + "sha256": "ba4d7294930c69fc009a8baa48ab09563d17d9b87ad4963afdae1cb5377cd403" + }, + "working_tree": { + "exists": true, + "size_bytes": 544, + "sha256": "2e5da26c092da1640eb1ed8af0381193dc59b71ff1462ca827f01b2abe8842ee" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 544, + "sha256": "2e5da26c092da1640eb1ed8af0381193dc59b71ff1462ca827f01b2abe8842ee" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2e5da26c092da1640eb1ed8af0381193dc59b71ff1462ca827f01b2abe8842ee", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/surface_definition_candidates.h", + "refactor": { + "source_path": "src/fesa/io/abaqus/surface_definition_candidates.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ce9ed9d10ea1e877be923cfa65e784c54fa6d2c1", + "mode": "100644", + "size_bytes": 2918, + "sha256": "b0d4495d24f9fcc98ecc02a111a872e43845b72d6a71a72687a7943203036931" + }, + "working_tree": { + "exists": true, + "size_bytes": 3005, + "sha256": "9414e236d54c3cef74f24c4131db581a3bd6ee6c5d6d61e28a7dc869b4e38e70" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "9414e236d54c3cef74f24c4131db581a3bd6ee6c5d6d61e28a7dc869b4e38e70", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/surface_definition_mapper.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/surface_definition_mapper.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0855e11052c2a23c932e3562121d4ce059c7ee90", + "mode": "100644", + "size_bytes": 292, + "sha256": "c064c3eae10b98205e875db01319722835509f8f8567a6f1f2d371634b586ea0" + }, + "working_tree": { + "exists": true, + "size_bytes": 303, + "sha256": "b2dd45b490c3cac1284782a5822d0b9b6075ddfc7a6c99d1d7238789fcae058b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/surface_definition_mapper.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9931d7b51b19c2980db1ecca7aeb85f0cf20afec", + "mode": "100644", + "size_bytes": 16112, + "sha256": "3a5e952b9f8c6d79b8c4720d89eef8e73400d373c6a472489762da949ebb1112" + }, + "working_tree": { + "exists": true, + "size_bytes": 16477, + "sha256": "1b28c38e23a923def477fa9fde2f2da159295fbedc84165bab352eb6afaea9fc" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 303, + "sha256": "b2dd45b490c3cac1284782a5822d0b9b6075ddfc7a6c99d1d7238789fcae058b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1b28c38e23a923def477fa9fde2f2da159295fbedc84165bab352eb6afaea9fc", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/surface_definition_mapper.h", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/surface_definition_mapper.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "916a70b8add9673998f66875e71298ec3b271e14", + "mode": "100644", + "size_bytes": 604, + "sha256": "ff0d31fea547672fe86041b9b65271656e4f1375c0b07b9ffe32ab0357bba8e8" + }, + "working_tree": { + "exists": true, + "size_bytes": 624, + "sha256": "cf83acc9010f8e1fb9b19028717788b141b38b0b91dc1bb0f09b9a10a8cbfd8a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/surface_definition_mapper.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "916a70b8add9673998f66875e71298ec3b271e14", + "mode": "100644", + "size_bytes": 604, + "sha256": "ff0d31fea547672fe86041b9b65271656e4f1375c0b07b9ffe32ab0357bba8e8" + }, + "working_tree": { + "exists": true, + "size_bytes": 624, + "sha256": "cf83acc9010f8e1fb9b19028717788b141b38b0b91dc1bb0f09b9a10a8cbfd8a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 624, + "sha256": "cf83acc9010f8e1fb9b19028717788b141b38b0b91dc1bb0f09b9a10a8cbfd8a" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "cf83acc9010f8e1fb9b19028717788b141b38b0b91dc1bb0f09b9a10a8cbfd8a", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/topology_candidates.h", + "refactor": { + "source_path": "src/fesa/io/abaqus/topology_candidates.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c74eb8726ee3a34d88e164d496e7e4bd0723cbe9", + "mode": "100644", + "size_bytes": 4269, + "sha256": "a6bf38bd7f57b7d9762fccf38219a6a2006b7b603d4a78d4fc1e6e08eb3f5c0b" + }, + "working_tree": { + "exists": true, + "size_bytes": 4402, + "sha256": "e982851cc3a11fd376ae5e880564aeaf4d7852d0ea5e5ad3596ddaa87866f617" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e982851cc3a11fd376ae5e880564aeaf4d7852d0ea5e5ad3596ddaa87866f617", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/topology_mapper.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/topology_mapper.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5d78175bfc39e3137ed64e80db8edc463fcf9ec7", + "mode": "100644", + "size_bytes": 372, + "sha256": "d43405eb62d305f8a1aed82d0853b276fda506c3e0a9d06a4b4b18741b88cbda" + }, + "working_tree": { + "exists": true, + "size_bytes": 387, + "sha256": "2f786e29243b40abc0c8c341871912853c47ee9173f16acfd8a0e91ce06729ce" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/topology_mapper.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b48e04562a391b6042c227410db3894862cb39c3", + "mode": "100644", + "size_bytes": 18123, + "sha256": "80c8fd618fd6e6186dd696da891748fc9a9732ca7030297c31d6a7efb0140b29" + }, + "working_tree": { + "exists": true, + "size_bytes": 18543, + "sha256": "4de9e8fe635f06e470a3017c48aca4c4b966289837a5a70aff5f200bb24812d7" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 387, + "sha256": "2f786e29243b40abc0c8c341871912853c47ee9173f16acfd8a0e91ce06729ce" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "4de9e8fe635f06e470a3017c48aca4c4b966289837a5a70aff5f200bb24812d7", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/abaqus/topology_mapper.h", + "fesa_dev": { + "source_path": "src/fesa/io/abaqus/topology_mapper.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "943628ded7abdd8bb3adfccfb3d47f43b7a2401d", + "mode": "100644", + "size_bytes": 621, + "sha256": "b292626380918947a77989a72a0fc91f844ee27ad27a7134c23da8596eb7d8d4" + }, + "working_tree": { + "exists": true, + "size_bytes": 643, + "sha256": "2a538902f45a8a2395a1f8b47c08492c75ab3aada13fa7c8e181edff770db830" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/abaqus/topology_mapper.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "943628ded7abdd8bb3adfccfb3d47f43b7a2401d", + "mode": "100644", + "size_bytes": 621, + "sha256": "b292626380918947a77989a72a0fc91f844ee27ad27a7134c23da8596eb7d8d4" + }, + "working_tree": { + "exists": true, + "size_bytes": 643, + "sha256": "2a538902f45a8a2395a1f8b47c08492c75ab3aada13fa7c8e181edff770db830" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 643, + "sha256": "2a538902f45a8a2395a1f8b47c08492c75ab3aada13fa7c8e181edff770db830" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2a538902f45a8a2395a1f8b47c08492c75ab3aada13fa7c8e181edff770db830", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "26fb572dca62fad0230d47ccb50381dd7468091f", + "mode": "100644", + "size_bytes": 1228, + "sha256": "bf7c7250590f8d91824c1cfe92aa9435dcf97d58ea78a68eba214e18f433b4b5" + }, + "working_tree": { + "exists": true, + "size_bytes": 1243, + "sha256": "019d544926c83cd6e19d35a3e2a45b430a8cd569f2888b6c419c0b3048fa12f9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "26fb572dca62fad0230d47ccb50381dd7468091f", + "mode": "100644", + "size_bytes": 1228, + "sha256": "bf7c7250590f8d91824c1cfe92aa9435dcf97d58ea78a68eba214e18f433b4b5" + }, + "working_tree": { + "exists": true, + "size_bytes": 1243, + "sha256": "019d544926c83cd6e19d35a3e2a45b430a8cd569f2888b6c419c0b3048fa12f9" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1243, + "sha256": "019d544926c83cd6e19d35a3e2a45b430a8cd569f2888b6c419c0b3048fa12f9" + } + }, + { + "target_path": "src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "19ec6c73d4bac8279af425c28ce66aad52c38bee", + "mode": "100644", + "size_bytes": 51182, + "sha256": "6edbc773d760037a41e993a38b2753eca7da0533f16bfc923311b937b92fd2dd" + }, + "working_tree": { + "exists": true, + "size_bytes": 52189, + "sha256": "9775cbc80b3418ce399d62e90ef86b4d6dfbcc39840c39e83f6da66132c5ca05" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "db70de402af4b2cfb18e0969b62618d1f1ef1203", + "mode": "100644", + "size_bytes": 49440, + "sha256": "1940a7d6212a9ff440716cc214f9090d18e54d81b9e3f361ade7e2a0b59f0418" + }, + "working_tree": { + "exists": true, + "size_bytes": 50437, + "sha256": "8d9361ab7dfcbdb128a707b1c6d51b71bef7252bf8034259788bd9fccd5f7162" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 52225, + "sha256": "16ad5e122fac30dc1b35d07e3914a0586087efbaccf1248cd3b3f2ca462d37f4" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "8d9361ab7dfcbdb128a707b1c6d51b71bef7252bf8034259788bd9fccd5f7162", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cbcfa5be4de37a1b3eb907b5bf3724fcc7cd4547", + "mode": "100644", + "size_bytes": 46321, + "sha256": "319e23b46c80317d2012696f814c42f87a47e560a2aa9caf7ebf1f94a6566385" + }, + "working_tree": { + "exists": true, + "size_bytes": 47295, + "sha256": "4406319905f1337c3505b2443633815fba49785824ebee11403d21fabe75071c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "60688de10b9f705bb53bd69d79dd09aebd1d01e9", + "mode": "100644", + "size_bytes": 45510, + "sha256": "66643dd55d9a00645abc8620e83d70376b390a13bad5d9e2a157ff2d9c552132" + }, + "working_tree": { + "exists": true, + "size_bytes": 46466, + "sha256": "a18cb5e4df18f03708d8cda407f669014a2874066d8ec4187f9c9b6c2c8d9b67" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 47295, + "sha256": "4406319905f1337c3505b2443633815fba49785824ebee11403d21fabe75071c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a18cb5e4df18f03708d8cda407f669014a2874066d8ec4187f9c9b6c2c8d9b67", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/eigen_hdf5_self_check.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/eigen_hdf5_self_check.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c54c43e607bb6ac9324b06857ecba795000abb89", + "mode": "100644", + "size_bytes": 39748, + "sha256": "a3d643fc0288a03fcdefe358edc396decdb370cc044adba5e3a2e03f13a27977" + }, + "working_tree": { + "exists": true, + "size_bytes": 40575, + "sha256": "2f6ca2bd2a39cef0acc5dfc494125a18a4cc03acb1b91cb9a10be6f199b2afa9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/eigen_hdf5_self_check.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b41907eec96ff572057245baa852dc5be269439e", + "mode": "100644", + "size_bytes": 39407, + "sha256": "16665fe73f03087317260e0623567b9896e9df3913886c02560aac658af79b38" + }, + "working_tree": { + "exists": true, + "size_bytes": 40228, + "sha256": "82e197cc3e59a0d99a282d87cc1cb48173517edc8388064f6839185811752ffd" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 40575, + "sha256": "2f6ca2bd2a39cef0acc5dfc494125a18a4cc03acb1b91cb9a10be6f199b2afa9" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "82e197cc3e59a0d99a282d87cc1cb48173517edc8388064f6839185811752ffd", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/eigen_hdf5_self_check.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/eigen_hdf5_self_check.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "da7458ea803ba2779fe576002be3ee70638d7a6e", + "mode": "100644", + "size_bytes": 694, + "sha256": "473fe9206adefb9fa650b28b08c253fda7c61450985c04dde64241dc5080ee63" + }, + "working_tree": { + "exists": true, + "size_bytes": 718, + "sha256": "46d45f7f576c5ee6f4849e4e0a16fc62f79068c06cb4d2286fd1c4c43c0a2d22" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/eigen_hdf5_self_check.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "da7458ea803ba2779fe576002be3ee70638d7a6e", + "mode": "100644", + "size_bytes": 694, + "sha256": "473fe9206adefb9fa650b28b08c253fda7c61450985c04dde64241dc5080ee63" + }, + "working_tree": { + "exists": true, + "size_bytes": 718, + "sha256": "46d45f7f576c5ee6f4849e4e0a16fc62f79068c06cb4d2286fd1c4c43c0a2d22" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 718, + "sha256": "46d45f7f576c5ee6f4849e4e0a16fc62f79068c06cb4d2286fd1c4c43c0a2d22" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "46d45f7f576c5ee6f4849e4e0a16fc62f79068c06cb4d2286fd1c4c43c0a2d22", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_atomic_file.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_atomic_file.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4bf91f56fe1893c1c01498d253e3401b64fc1f69", + "mode": "100644", + "size_bytes": 2822, + "sha256": "f62aa0f3aaa07de3f9409d3deeee249b738ebcb884139d7d6b96f36eff327b1e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2910, + "sha256": "811e6839d60b4cfee0f86d01a69b34dd64a9a8cd7457a9d38847271cd548dfcd" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_atomic_file.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4bf91f56fe1893c1c01498d253e3401b64fc1f69", + "mode": "100644", + "size_bytes": 2822, + "sha256": "f62aa0f3aaa07de3f9409d3deeee249b738ebcb884139d7d6b96f36eff327b1e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2910, + "sha256": "811e6839d60b4cfee0f86d01a69b34dd64a9a8cd7457a9d38847271cd548dfcd" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2910, + "sha256": "811e6839d60b4cfee0f86d01a69b34dd64a9a8cd7457a9d38847271cd548dfcd" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "811e6839d60b4cfee0f86d01a69b34dd64a9a8cd7457a9d38847271cd548dfcd", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_atomic_file.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_atomic_file.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "98d540d2eb4b8be0b3aca76105427201bbf92980", + "mode": "100644", + "size_bytes": 1118, + "sha256": "6278a0032adc91ba1bc7816707f22efea28ec66aec6f1b00d36ff9da25400330" + }, + "working_tree": { + "exists": true, + "size_bytes": 1155, + "sha256": "555acd91ad255279e45d89f136b84f4844869459e0d72fc49d2cc4339f0002d1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_atomic_file.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "98d540d2eb4b8be0b3aca76105427201bbf92980", + "mode": "100644", + "size_bytes": 1118, + "sha256": "6278a0032adc91ba1bc7816707f22efea28ec66aec6f1b00d36ff9da25400330" + }, + "working_tree": { + "exists": true, + "size_bytes": 1155, + "sha256": "555acd91ad255279e45d89f136b84f4844869459e0d72fc49d2cc4339f0002d1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1155, + "sha256": "555acd91ad255279e45d89f136b84f4844869459e0d72fc49d2cc4339f0002d1" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "555acd91ad255279e45d89f136b84f4844869459e0d72fc49d2cc4339f0002d1", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_model_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_model_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "628c3313b2f7e014d8ce5eb1bf8f0e6be6d5eaef", + "mode": "100644", + "size_bytes": 23043, + "sha256": "35b3e716949cd59dbec477f6bbaf840ccd82fe7a6df0eb4def2065264c165f21" + }, + "working_tree": { + "exists": true, + "size_bytes": 23534, + "sha256": "feb777ce0edeeb14b70866174008a4a9dd90f98aa9e398cf1100f3412457485e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_model_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "91e83f57407b1559b1382ce9c46eebf4d7cbb5ff", + "mode": "100644", + "size_bytes": 22702, + "sha256": "8c48adc2ba68882d035923cd7bb607a4a47b039a47573c1c4c5fc90fbf3c9231" + }, + "working_tree": { + "exists": true, + "size_bytes": 23187, + "sha256": "2d45539ecfe8516f43ae9f960966646f6b7ebe57910fb2e0c38cbbbca7087343" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 23534, + "sha256": "feb777ce0edeeb14b70866174008a4a9dd90f98aa9e398cf1100f3412457485e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2d45539ecfe8516f43ae9f960966646f6b7ebe57910fb2e0c38cbbbca7087343", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_model_writer.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_model_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "38fbdb482b695214b9165e23f4cdb7cd623def2f", + "mode": "100644", + "size_bytes": 580, + "sha256": "b1924429dda5d8dc80ec92ca1c7b83ec83d7fbef97eadc3f18f998e55b169fbe" + }, + "working_tree": { + "exists": true, + "size_bytes": 600, + "sha256": "df4fe16486427b2a3a17aedb81f5148d61e89b6e7fbea1a1082b69139146c13a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_model_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "38fbdb482b695214b9165e23f4cdb7cd623def2f", + "mode": "100644", + "size_bytes": 580, + "sha256": "b1924429dda5d8dc80ec92ca1c7b83ec83d7fbef97eadc3f18f998e55b169fbe" + }, + "working_tree": { + "exists": true, + "size_bytes": 600, + "sha256": "df4fe16486427b2a3a17aedb81f5148d61e89b6e7fbea1a1082b69139146c13a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 600, + "sha256": "df4fe16486427b2a3a17aedb81f5148d61e89b6e7fbea1a1082b69139146c13a" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "df4fe16486427b2a3a17aedb81f5148d61e89b6e7fbea1a1082b69139146c13a", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_primitives.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_primitives.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1256580db5b8bc975b46c42f5c157ef5b585eacb", + "mode": "100644", + "size_bytes": 11935, + "sha256": "89d9f21d890ee1dada936efc233487fd71d4a061546e6456d2a76f3c742ea93f" + }, + "working_tree": { + "exists": true, + "size_bytes": 12222, + "sha256": "8b2a769af447cb29aa41188ec48719249c9168edf5712343a88f14ca96f6d0fb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_primitives.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7a872b8fb73744d2440a7f8871de0b72677975dc", + "mode": "100644", + "size_bytes": 14539, + "sha256": "43c11b6bdee846f2545bfd2d1e5db59f13b50d2bd08773888801ea6bc9e0a237" + }, + "working_tree": { + "exists": true, + "size_bytes": 14895, + "sha256": "62962671f4d5c013354aa12cfa6c1905276d3645dd5df371523bd5027e724cf7" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12222, + "sha256": "8b2a769af447cb29aa41188ec48719249c9168edf5712343a88f14ca96f6d0fb" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "62962671f4d5c013354aa12cfa6c1905276d3645dd5df371523bd5027e724cf7", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_primitives.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_primitives.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "da215e4df6a19c93601530dcf40b38b6f44a66a5", + "mode": "100644", + "size_bytes": 5492, + "sha256": "e8484a81707a6d13e5947a9e18852f5ebd4e869ed75ee51150fee402b019e602" + }, + "working_tree": { + "exists": true, + "size_bytes": 5626, + "sha256": "86bfa51fc536267f473aa31c31f09f4f41b8d9b26067bcd3b87d12e09473e4d7" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_primitives.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "dcca53ea184c1eebc482403a0ca273094471c007", + "mode": "100644", + "size_bytes": 7036, + "sha256": "17764deb93d12ca4335a86b38d0f992b99fb046e97cc030a032b2be5ce0458b5" + }, + "working_tree": { + "exists": true, + "size_bytes": 7193, + "sha256": "a48b1a39e70799e02c2a34b9cb8d23aad7622d2b5533ac96b60bd5fa6ebed726" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5626, + "sha256": "86bfa51fc536267f473aa31c31f09f4f41b8d9b26067bcd3b87d12e09473e4d7" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a48b1a39e70799e02c2a34b9cb8d23aad7622d2b5533ac96b60bd5fa6ebed726", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_raii.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_raii.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "051c4736d72f51877bb2b9536e69ee74e88c072f", + "mode": "100644", + "size_bytes": 2795, + "sha256": "1684ce99cc7ef883354247a588fed8c99dfe12540317bad0065cc982a7a4ed5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 2905, + "sha256": "30de3d2be1b1b4ac190599525c75ccd1c56c89ff676d044aec22ae50811f1a95" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_raii.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "051c4736d72f51877bb2b9536e69ee74e88c072f", + "mode": "100644", + "size_bytes": 2795, + "sha256": "1684ce99cc7ef883354247a588fed8c99dfe12540317bad0065cc982a7a4ed5b" + }, + "working_tree": { + "exists": true, + "size_bytes": 2905, + "sha256": "30de3d2be1b1b4ac190599525c75ccd1c56c89ff676d044aec22ae50811f1a95" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2905, + "sha256": "30de3d2be1b1b4ac190599525c75ccd1c56c89ff676d044aec22ae50811f1a95" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "30de3d2be1b1b4ac190599525c75ccd1c56c89ff676d044aec22ae50811f1a95", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_result_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_result_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "779b839909dddb971679ee4125c7ecb400a3795c", + "mode": "100644", + "size_bytes": 43971, + "sha256": "546872a2b6b7bc71e910bc6659940a49d3424ec0258e922e04e908aa63ba6425" + }, + "working_tree": { + "exists": true, + "size_bytes": 44926, + "sha256": "817621b6c60422d09a98ef89e46fd9d223908e5d2fb1076aff767b84f7312599" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_result_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d832f9d83d7a3451f3f0311061f2a399045cf92e", + "mode": "100644", + "size_bytes": 43759, + "sha256": "cee7ff487594fe8b4fa0e368cb3a3806daa6eaf91cde2ea189324a933d1d201b" + }, + "working_tree": { + "exists": true, + "size_bytes": 44706, + "sha256": "333071ee6d3c4c123327498282d7150f7bfbebfeba1fb3d883604bc99500437a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 44926, + "sha256": "817621b6c60422d09a98ef89e46fd9d223908e5d2fb1076aff767b84f7312599" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "333071ee6d3c4c123327498282d7150f7bfbebfeba1fb3d883604bc99500437a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_result_writer.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_result_writer.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5afaaab3723126978736f2ce61d5ad315c4d9813", + "mode": "100644", + "size_bytes": 1367, + "sha256": "da2de12bb82800d944cb43e397236b16e09032e5cbaf932d19df19a218a9dc1e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1403, + "sha256": "761b78b351e5ae6e47891d42787b3f68790e1aeaaad2c2c7c58be5ad3334509d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_result_writer.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5afaaab3723126978736f2ce61d5ad315c4d9813", + "mode": "100644", + "size_bytes": 1367, + "sha256": "da2de12bb82800d944cb43e397236b16e09032e5cbaf932d19df19a218a9dc1e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1403, + "sha256": "761b78b351e5ae6e47891d42787b3f68790e1aeaaad2c2c7c58be5ad3334509d" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1403, + "sha256": "761b78b351e5ae6e47891d42787b3f68790e1aeaaad2c2c7c58be5ad3334509d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "761b78b351e5ae6e47891d42787b3f68790e1aeaaad2c2c7c58be5ad3334509d", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_results_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_results_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "077ca8177d29826a26304e30e341aa0ba24edae9", + "mode": "100644", + "size_bytes": 3100, + "sha256": "b66632b81fcd0cfd7fdd7886fa444869629c045346418158cbab8df4b0e6494e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3174, + "sha256": "e5125214002b7a18812016a0af254e50dddf240e72f71c3f6b9a4984ba143c9e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_results_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "077ca8177d29826a26304e30e341aa0ba24edae9", + "mode": "100644", + "size_bytes": 3100, + "sha256": "b66632b81fcd0cfd7fdd7886fa444869629c045346418158cbab8df4b0e6494e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3174, + "sha256": "e5125214002b7a18812016a0af254e50dddf240e72f71c3f6b9a4984ba143c9e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3174, + "sha256": "e5125214002b7a18812016a0af254e50dddf240e72f71c3f6b9a4984ba143c9e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e5125214002b7a18812016a0af254e50dddf240e72f71c3f6b9a4984ba143c9e", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_self_check.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_self_check.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6a776191c30cf758a249be6d76e60c919f30279d", + "mode": "100644", + "size_bytes": 47014, + "sha256": "59d90c924585cd77b2db625c9d4ed29a161bdab63dd74c7ee1480d1e4212f681" + }, + "working_tree": { + "exists": true, + "size_bytes": 47968, + "sha256": "2b99c5ad7e48fa87b467b4da116dfd1c711a236eeedae2e4484bbe94ad7ad1ac" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_self_check.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2779079e7fd600ad8cac68e98e50b3c2e455b85e", + "mode": "100644", + "size_bytes": 46658, + "sha256": "a50e58eb9f1353d82647a193371892f1200af9c04b3f68b8839761fe3a26f262" + }, + "working_tree": { + "exists": true, + "size_bytes": 47605, + "sha256": "59e0a3bbc9e31782a13bd7262a203e14f5ad0b964a7b863d44f1f2011fa4708a" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 47968, + "sha256": "2b99c5ad7e48fa87b467b4da116dfd1c711a236eeedae2e4484bbe94ad7ad1ac" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "59e0a3bbc9e31782a13bd7262a203e14f5ad0b964a7b863d44f1f2011fa4708a", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/hdf5_self_check.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/hdf5_self_check.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "be6fb94c4e0235c85183473cce131adb635b9706", + "mode": "100644", + "size_bytes": 1010, + "sha256": "ba33bcb917f234aff0108b6a9180eb525670e816f86f118a31ca865174342deb" + }, + "working_tree": { + "exists": true, + "size_bytes": 1038, + "sha256": "7ec99bfdf9a9d12b98b3a77023268d09ed0a99a872a6ab16378997e36c6089b8" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/hdf5_self_check.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "be6fb94c4e0235c85183473cce131adb635b9706", + "mode": "100644", + "size_bytes": 1010, + "sha256": "ba33bcb917f234aff0108b6a9180eb525670e816f86f118a31ca865174342deb" + }, + "working_tree": { + "exists": true, + "size_bytes": 1038, + "sha256": "7ec99bfdf9a9d12b98b3a77023268d09ed0a99a872a6ab16378997e36c6089b8" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1038, + "sha256": "7ec99bfdf9a9d12b98b3a77023268d09ed0a99a872a6ab16378997e36c6089b8" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7ec99bfdf9a9d12b98b3a77023268d09ed0a99a872a6ab16378997e36c6089b8", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "dd75d6902eba607b6ba677e93b0556f649a85fa7", + "mode": "100644", + "size_bytes": 53865, + "sha256": "ce53e39847bfdc874818a6778f542f1c38bee722548613554eec2b4009f88419" + }, + "working_tree": { + "exists": true, + "size_bytes": 54978, + "sha256": "047cf0bb282b9ad9e595fa9dcb12c9b91ad722aed7b746a9e6b7f2a1410241de" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cadd201241dce4b86fcfcbbbb2513f51e8d2899f", + "mode": "100644", + "size_bytes": 50795, + "sha256": "d46a895a63182e0d6ca5e7f5ebf434a59908c49811e20a1b22047816f84bfe39" + }, + "working_tree": { + "exists": true, + "size_bytes": 51819, + "sha256": "03031d25e6cee1f68614c69d6388516134ece0addee8153d557670c96bffcbc9" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 54978, + "sha256": "047cf0bb282b9ad9e595fa9dcb12c9b91ad722aed7b746a9e6b7f2a1410241de" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "03031d25e6cee1f68614c69d6388516134ece0addee8153d557670c96bffcbc9", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/solid_hdf5_results_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/solid_hdf5_results_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ba70639555e49a7c565693c38cf5eebf031e12a3", + "mode": "100644", + "size_bytes": 37888, + "sha256": "c588f4f302972ce8aea0a45424aeda92a0c3566e4b460cb879fb47059dc5d5a7" + }, + "working_tree": { + "exists": true, + "size_bytes": 38650, + "sha256": "5b414737318f1d8588b49ebbd62ae180181e94c6439db9c15eb6013b0473373b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/solid_hdf5_results_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4b72f291681035b091245cbc3fc432bc35c4441e", + "mode": "100644", + "size_bytes": 37765, + "sha256": "ef73f4b819a857d1f3b4ec2504d8722331cb6f500b7687363492cd532d199e7c" + }, + "working_tree": { + "exists": true, + "size_bytes": 38523, + "sha256": "066fb7b105ab7c8e40c0094c15e39aed88531123fbb826797181c5ed20fbba6b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 38651, + "sha256": "b63e029f6d5d1bf6b1f185fd897c09f162f29153f1d6041fbd08c1e62fe38ba7" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "066fb7b105ab7c8e40c0094c15e39aed88531123fbb826797181c5ed20fbba6b", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/solid_hdf5_self_check.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/solid_hdf5_self_check.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "01281504d40716bbb3340a2ce1d41ff10392c2fb", + "mode": "100644", + "size_bytes": 10063, + "sha256": "0e5a8dd37b22e9504b61c40413cb852f2a87f37784f872cfca2d84f1f6a77b4a" + }, + "working_tree": { + "exists": true, + "size_bytes": 10280, + "sha256": "f45fd4485b653dfdfe4381e71a0c51834b4589e4f0a7608d8301db7f34f4d8a0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/solid_hdf5_self_check.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "01281504d40716bbb3340a2ce1d41ff10392c2fb", + "mode": "100644", + "size_bytes": 10063, + "sha256": "0e5a8dd37b22e9504b61c40413cb852f2a87f37784f872cfca2d84f1f6a77b4a" + }, + "working_tree": { + "exists": true, + "size_bytes": 10280, + "sha256": "f45fd4485b653dfdfe4381e71a0c51834b4589e4f0a7608d8301db7f34f4d8a0" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10280, + "sha256": "f45fd4485b653dfdfe4381e71a0c51834b4589e4f0a7608d8301db7f34f4d8a0" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f45fd4485b653dfdfe4381e71a0c51834b4589e4f0a7608d8301db7f34f4d8a0", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/solid_hdf5_self_check.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/solid_hdf5_self_check.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c28e3bcd56be602ac1fa21b29d44ef97b42d0c85", + "mode": "100644", + "size_bytes": 2403, + "sha256": "2767d94241a62ceb04f59d7dda1bf5bfd21fb0daca80465cf0ad021d9a017559" + }, + "working_tree": { + "exists": true, + "size_bytes": 2467, + "sha256": "5456ea89b83c3575a0eebbee431ce7182bca3beb708ce246a33301763459d89d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/solid_hdf5_self_check.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c28e3bcd56be602ac1fa21b29d44ef97b42d0c85", + "mode": "100644", + "size_bytes": 2403, + "sha256": "2767d94241a62ceb04f59d7dda1bf5bfd21fb0daca80465cf0ad021d9a017559" + }, + "working_tree": { + "exists": true, + "size_bytes": 2467, + "sha256": "5456ea89b83c3575a0eebbee431ce7182bca3beb708ce246a33301763459d89d" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2467, + "sha256": "5456ea89b83c3575a0eebbee431ce7182bca3beb708ce246a33301763459d89d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "5456ea89b83c3575a0eebbee431ce7182bca3beb708ce246a33301763459d89d", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/thermal_hdf5_results_writer.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/thermal_hdf5_results_writer.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "feb5c23975682032e87d4f73c24d29148a4be24e", + "mode": "100644", + "size_bytes": 20988, + "sha256": "9797f8cf7de87a19bf13b159f1b2848f38f9849c03881be96ddcd9594d66da09" + }, + "working_tree": { + "exists": true, + "size_bytes": 21433, + "sha256": "aa748145336164ee42e8920e52061afead9d4fdfe73369835693ba2485acf6d3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/thermal_hdf5_results_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "feb5c23975682032e87d4f73c24d29148a4be24e", + "mode": "100644", + "size_bytes": 20988, + "sha256": "9797f8cf7de87a19bf13b159f1b2848f38f9849c03881be96ddcd9594d66da09" + }, + "working_tree": { + "exists": true, + "size_bytes": 21433, + "sha256": "aa748145336164ee42e8920e52061afead9d4fdfe73369835693ba2485acf6d3" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 21433, + "sha256": "aa748145336164ee42e8920e52061afead9d4fdfe73369835693ba2485acf6d3" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "aa748145336164ee42e8920e52061afead9d4fdfe73369835693ba2485acf6d3", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/thermal_hdf5_self_check.cpp", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/thermal_hdf5_self_check.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fb19698ef34f327d4486e9971324c56831c8d67e", + "mode": "100644", + "size_bytes": 26844, + "sha256": "d1bdaaf7a1d2552022041a5c319a175d0df1d522b2a1c8af5f73f4d50d390fcb" + }, + "working_tree": { + "exists": true, + "size_bytes": 27425, + "sha256": "961c81bf79174acafe1a239e0859df025bcd4d9a2d4412b8abc5de4f67eb2e7e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/thermal_hdf5_self_check.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bf2ddfb1ff3b059751a01c53578a202a9cbcb87e", + "mode": "100644", + "size_bytes": 26752, + "sha256": "894aea519d020837205bfc95d81152b0ead13c5dadfa8860d793173722f7efaf" + }, + "working_tree": { + "exists": true, + "size_bytes": 27332, + "sha256": "1645a88ca476a61593dba4222bf773e8ff418669a919d7c15c393de84a7ccb38" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 27425, + "sha256": "961c81bf79174acafe1a239e0859df025bcd4d9a2d4412b8abc5de4f67eb2e7e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1645a88ca476a61593dba4222bf773e8ff418669a919d7c15c393de84a7ccb38", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/io/hdf5/thermal_hdf5_self_check.h", + "fesa_dev": { + "source_path": "src/fesa/io/hdf5/thermal_hdf5_self_check.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "048d5cfb1985391378335049f193f616d1a5021e", + "mode": "100644", + "size_bytes": 2133, + "sha256": "09aa1f981533b3112455a53109869b3dff2f990424dfe28a4916831a9d589575" + }, + "working_tree": { + "exists": true, + "size_bytes": 2182, + "sha256": "1c7483f34380dc9432d9d3a917402384f6f92dbb79752cdd610b3b5c29408be4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/io/hdf5/thermal_hdf5_self_check.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "048d5cfb1985391378335049f193f616d1a5021e", + "mode": "100644", + "size_bytes": 2133, + "sha256": "09aa1f981533b3112455a53109869b3dff2f990424dfe28a4916831a9d589575" + }, + "working_tree": { + "exists": true, + "size_bytes": 2182, + "sha256": "1c7483f34380dc9432d9d3a917402384f6f92dbb79752cdd610b3b5c29408be4" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2182, + "sha256": "1c7483f34380dc9432d9d3a917402384f6f92dbb79752cdd610b3b5c29408be4" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1c7483f34380dc9432d9d3a917402384f6f92dbb79752cdd610b3b5c29408be4", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/loads/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/loads/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "570862a0531ffd31b04495eed9167a908f0c3d4f", + "mode": "100644", + "size_bytes": 1009, + "sha256": "6af578f15bcc89e95f89e8f1eb11babde4011545fc61eac45be7241e3a6c442e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1021, + "sha256": "8cd2a414129a947638f3bf74de1442a3a452f1356b4d06ed7b711008b1b7f3cb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/loads/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "570862a0531ffd31b04495eed9167a908f0c3d4f", + "mode": "100644", + "size_bytes": 1009, + "sha256": "6af578f15bcc89e95f89e8f1eb11babde4011545fc61eac45be7241e3a6c442e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1021, + "sha256": "8cd2a414129a947638f3bf74de1442a3a452f1356b4d06ed7b711008b1b7f3cb" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1021, + "sha256": "8cd2a414129a947638f3bf74de1442a3a452f1356b4d06ed7b711008b1b7f3cb" + } + }, + { + "target_path": "src/fesa/loads/concentrated_nodal_load.cpp", + "fesa_dev": { + "source_path": "src/fesa/loads/concentrated_nodal_load.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3f3dd05b8c7a24e1d26562dcc9ce3410a75f163f", + "mode": "100644", + "size_bytes": 6317, + "sha256": "432e7ae46810baa0209ac10043b66ed22ca69ff1e9e2ec1b3c7ef90a3de54efa" + }, + "working_tree": { + "exists": true, + "size_bytes": 6477, + "sha256": "af82862af945227f2c5b37018b1a4f2d34c02ae96b01e5f016b3bfcb7c125850" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/loads/concentrated_nodal_load.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3f3dd05b8c7a24e1d26562dcc9ce3410a75f163f", + "mode": "100644", + "size_bytes": 6317, + "sha256": "432e7ae46810baa0209ac10043b66ed22ca69ff1e9e2ec1b3c7ef90a3de54efa" + }, + "working_tree": { + "exists": true, + "size_bytes": 6477, + "sha256": "af82862af945227f2c5b37018b1a4f2d34c02ae96b01e5f016b3bfcb7c125850" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6477, + "sha256": "af82862af945227f2c5b37018b1a4f2d34c02ae96b01e5f016b3bfcb7c125850" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "af82862af945227f2c5b37018b1a4f2d34c02ae96b01e5f016b3bfcb7c125850", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/loads/shell_surface_pressure.cpp", + "fesa_dev": { + "source_path": "src/fesa/loads/shell_surface_pressure.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "603fda54776a5c9e69d22e2866239778f4283a81", + "mode": "100644", + "size_bytes": 13121, + "sha256": "6f477bfc59441fba7f315db31ce7f398cdb0c36faa6c832fc53181bcb34ef506" + }, + "working_tree": { + "exists": true, + "size_bytes": 13459, + "sha256": "60f1abeaee269943e27463705d96db412b3d418ea535853d9a8bcc7cc9d70887" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/loads/shell_surface_pressure.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "01a98962525cac6ceb0d2650bbc5e672a588a25c", + "mode": "100644", + "size_bytes": 12819, + "sha256": "897aa92d7460ba6aec521c9ae7bae6f107a9a5c35457e1cde8f2e8c7553174fd" + }, + "working_tree": { + "exists": true, + "size_bytes": 13150, + "sha256": "cc49655f10bcc231fee876b642d317b844a078d8fd07a5480fb855ea0dfbb729" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13459, + "sha256": "60f1abeaee269943e27463705d96db412b3d418ea535853d9a8bcc7cc9d70887" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "cc49655f10bcc231fee876b642d317b844a078d8fd07a5480fb855ea0dfbb729", + "changed_from_integration_baseline": true, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/materials/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/materials/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "863e364fb0b878b7992208e56702945d85e1ebe5", + "mode": "100644", + "size_bytes": 923, + "sha256": "dd8e97d81aecde120099557ea7096ef83b04430b824003544a8c6bb76e192ad0" + }, + "working_tree": { + "exists": true, + "size_bytes": 936, + "sha256": "e48e915f644a75a7f8bb1fb3be940742b50c8537d380303550d7ea9af5ca2711" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/materials/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "863e364fb0b878b7992208e56702945d85e1ebe5", + "mode": "100644", + "size_bytes": 923, + "sha256": "dd8e97d81aecde120099557ea7096ef83b04430b824003544a8c6bb76e192ad0" + }, + "working_tree": { + "exists": true, + "size_bytes": 936, + "sha256": "e48e915f644a75a7f8bb1fb3be940742b50c8537d380303550d7ea9af5ca2711" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 936, + "sha256": "e48e915f644a75a7f8bb1fb3be940742b50c8537d380303550d7ea9af5ca2711" + } + }, + { + "target_path": "src/fesa/materials/isotropic_linear_elastic_material.cpp", + "fesa_dev": { + "source_path": "src/fesa/materials/isotropic_linear_elastic_material.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5d448478631fa7b7f4162b55cf67df717505a01f", + "mode": "100644", + "size_bytes": 3163, + "sha256": "44982962101222587a858216b09f8c2472b087730ce1a55fbc3b6d738e5ab733" + }, + "working_tree": { + "exists": true, + "size_bytes": 3252, + "sha256": "350a78f7f7ab11265a6492a8e0bc0651383972c0426b81408f2cc545f143be47" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/materials/isotropic_linear_elastic_material.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5d448478631fa7b7f4162b55cf67df717505a01f", + "mode": "100644", + "size_bytes": 3163, + "sha256": "44982962101222587a858216b09f8c2472b087730ce1a55fbc3b6d738e5ab733" + }, + "working_tree": { + "exists": true, + "size_bytes": 3252, + "sha256": "350a78f7f7ab11265a6492a8e0bc0651383972c0426b81408f2cc545f143be47" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3252, + "sha256": "350a78f7f7ab11265a6492a8e0bc0651383972c0426b81408f2cc545f143be47" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "350a78f7f7ab11265a6492a8e0bc0651383972c0426b81408f2cc545f143be47", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/materials/isotropic_thermal_material.cpp", + "fesa_dev": { + "source_path": "src/fesa/materials/isotropic_thermal_material.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2f30661b54ad5b94e68e6c6f80bfda6f5a8ce536", + "mode": "100644", + "size_bytes": 2654, + "sha256": "f320c5dd3bd1bd0eb6fe75bad4a29678b87ca7e728c05149f2e98cb60a161e15" + }, + "working_tree": { + "exists": true, + "size_bytes": 2731, + "sha256": "e9f4a15c83ae983b25bc45554ad376fdb4208a803b3068a564dbb3bf0d9f2056" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/materials/isotropic_thermal_material.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2f30661b54ad5b94e68e6c6f80bfda6f5a8ce536", + "mode": "100644", + "size_bytes": 2654, + "sha256": "f320c5dd3bd1bd0eb6fe75bad4a29678b87ca7e728c05149f2e98cb60a161e15" + }, + "working_tree": { + "exists": true, + "size_bytes": 2731, + "sha256": "e9f4a15c83ae983b25bc45554ad376fdb4208a803b3068a564dbb3bf0d9f2056" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2731, + "sha256": "e9f4a15c83ae983b25bc45554ad376fdb4208a803b3068a564dbb3bf0d9f2056" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e9f4a15c83ae983b25bc45554ad376fdb4208a803b3068a564dbb3bf0d9f2056", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/math/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "382b80aa6e24ae4fa90660adbfb341cbaee9f780", + "mode": "100644", + "size_bytes": 884, + "sha256": "87b2e9741fec39cd039df5cf02a27d70801dc249eac198a7b98c3077ad9190e0" + }, + "working_tree": { + "exists": true, + "size_bytes": 896, + "sha256": "ae29290717014bd463ccd97e14edeebe18f383b26815208835aa05cf5ffa02c2" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/math/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "382b80aa6e24ae4fa90660adbfb341cbaee9f780", + "mode": "100644", + "size_bytes": 884, + "sha256": "87b2e9741fec39cd039df5cf02a27d70801dc249eac198a7b98c3077ad9190e0" + }, + "working_tree": { + "exists": true, + "size_bytes": 896, + "sha256": "ae29290717014bd463ccd97e14edeebe18f383b26815208835aa05cf5ffa02c2" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 896, + "sha256": "ae29290717014bd463ccd97e14edeebe18f383b26815208835aa05cf5ffa02c2" + } + }, + { + "target_path": "src/fesa/math/compensated_sum.h", + "refactor": { + "source_path": "src/fesa/math/compensated_sum.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7201513c5cc795bfb1ef5550030bd5c990c1e21a", + "mode": "100644", + "size_bytes": 861, + "sha256": "ed5e1d2a1411799322d8202515294e8c36a74a7bc84eaaf3e134f69c90042503" + }, + "working_tree": { + "exists": true, + "size_bytes": 891, + "sha256": "d5b4d2f8de956f95c9a3a3361b0aa806334569f7057a5a2d31047299d66fdf95" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "d5b4d2f8de956f95c9a3a3361b0aa806334569f7057a5a2d31047299d66fdf95", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/dense_blas_internal.cpp", + "fesa_dev": { + "source_path": "src/fesa/math/dense_blas_internal.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ed5de9d90beefb2f061a575a072f2c88d6d7f9b8", + "mode": "100644", + "size_bytes": 7576, + "sha256": "ef87aa495e3baeb60ebebbfe404c13c4f382397b1f2223c4e03d991ce56691d2" + }, + "working_tree": { + "exists": true, + "size_bytes": 7769, + "sha256": "65eb751e0316d06311ebb899f09e66344fb5cd9637460f5b803c4d3c2b24e54b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/math/dense_blas_internal.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bc03aba6baf99c36f243c63585d63548ff9766d1", + "mode": "100644", + "size_bytes": 16750, + "sha256": "f9a12b0efc58874c86d096939b318093ed9808e5aad37d5ce18f2067bb23fc1f" + }, + "working_tree": { + "exists": true, + "size_bytes": 17160, + "sha256": "4c34c393d50fe11c23fdf562487518713ac743c99eeec8b29a1d387df9568025" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7769, + "sha256": "65eb751e0316d06311ebb899f09e66344fb5cd9637460f5b803c4d3c2b24e54b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "4c34c393d50fe11c23fdf562487518713ac743c99eeec8b29a1d387df9568025", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/dense_blas_internal.h", + "fesa_dev": { + "source_path": "src/fesa/math/dense_blas_internal.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b2d448105cd370a732c00e519cd0d2013dc2cbad", + "mode": "100644", + "size_bytes": 5083, + "sha256": "4536f2c43838742509cc4fefe14167c378a8328331487135f8862030256fa5af" + }, + "working_tree": { + "exists": true, + "size_bytes": 5192, + "sha256": "cf45c1836fd5481ac827227db9b171deeae380c67f8290623121c8ea37e15891" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/math/dense_blas_internal.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "037c94ac28383e6ac4d06eda95511c15285410a5", + "mode": "100644", + "size_bytes": 9581, + "sha256": "a77ca4f6a9b23e16c33e55a30987ecd888e237fa0c476f0b4e1e24f8a22a1029" + }, + "working_tree": { + "exists": true, + "size_bytes": 9776, + "sha256": "15008a79758189131893f983bfdae0370beb5e8cf2fb05b891a51c40c3b579d6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5192, + "sha256": "cf45c1836fd5481ac827227db9b171deeae380c67f8290623121c8ea37e15891" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "15008a79758189131893f983bfdae0370beb5e8cf2fb05b891a51c40c3b579d6", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/finite_values.h", + "refactor": { + "source_path": "src/fesa/math/finite_values.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3433915f515c49285103e315dbd7eaff7b9885a4", + "mode": "100644", + "size_bytes": 1024, + "sha256": "22f901899d9358943f101cec382ecbf8f7e9c2f42c3ab5dad9fdf385288faac5" + }, + "working_tree": { + "exists": true, + "size_bytes": 1064, + "sha256": "06fb743582dfbb1a114a443b20b6abe86a9123bb74f85e71bc784f2bb71f470d" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "06fb743582dfbb1a114a443b20b6abe86a9123bb74f85e71bc784f2bb71f470d", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/high_low_arithmetic.h", + "fesa_dev": { + "source_path": "src/fesa/math/high_low_arithmetic.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8e9bde6e982da864b919c864a95f75bb0a810e0e", + "mode": "100644", + "size_bytes": 8809, + "sha256": "323a824f5e859e724c68230d12014fd06d31bb66740ddfe16d19c77ce95c7ea0" + }, + "working_tree": { + "exists": true, + "size_bytes": 9016, + "sha256": "4f360fd4d11fca68863e9fa7c084ed80e70fc4d903b9df170ac946d19472987c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/math/high_low_arithmetic.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "97767246604a66921d07a7b4f6ea90c866d1d49b", + "mode": "100644", + "size_bytes": 9491, + "sha256": "19fbe003f0fc39983050bf0d57d68c484dafefdf9e7ec45ee5d94d6dd070313c" + }, + "working_tree": { + "exists": true, + "size_bytes": 9711, + "sha256": "bf26c811169c71cd4aa647e2eaa18a8605ec2fec9a2b46b66fa6b591d2767045" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9016, + "sha256": "4f360fd4d11fca68863e9fa7c084ed80e70fc4d903b9df170ac946d19472987c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "bf26c811169c71cd4aa647e2eaa18a8605ec2fec9a2b46b66fa6b591d2767045", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/jet_arithmetic.h", + "refactor": { + "source_path": "src/fesa/math/jet_arithmetic.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "439e4395909036055a27b4ece3b6a3d0039bbc0b", + "mode": "100644", + "size_bytes": 1684, + "sha256": "5377c1b3e7599d33c7c18918c95a63579595246cad784615744224470d95575c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1722, + "sha256": "8f1f0f731928dc1951007802aad56a00e3ec349e9cdb8eb02e0321b449c03f2b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "8f1f0f731928dc1951007802aad56a00e3ec349e9cdb8eb02e0321b449c03f2b", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/jet_linear_solve.h", + "refactor": { + "source_path": "src/fesa/math/jet_linear_solve.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8bb63b1bda3380358962a93fb9a4e41b1d710949", + "mode": "100644", + "size_bytes": 4221, + "sha256": "cc392aea9b0d2dee922464ba862004cc53a2068be38168ebc5efa799d397ef62" + }, + "working_tree": { + "exists": true, + "size_bytes": 4306, + "sha256": "1d3e0b93bef3eb88558489443a2ab9f072dee39675117e37f7884a7dc0109910" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1d3e0b93bef3eb88558489443a2ab9f072dee39675117e37f7884a7dc0109910", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/matrix.cpp", + "fesa_dev": { + "source_path": "src/fesa/math/matrix.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a28e167046966b8c404a04fec63e0b0d110f04e7", + "mode": "100644", + "size_bytes": 4903, + "sha256": "70af20150977a1859eb21f8b8ceb92dc8a1a3d58d14b15a86eb2027d14f2be51" + }, + "working_tree": { + "exists": true, + "size_bytes": 5059, + "sha256": "2d10bedd159a06c25225685c5504db2b075b02379653d2bbf49b31278e66a611" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/math/matrix.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b991f24b79410a32becceacf6623cd54a0e9e7a9", + "mode": "100644", + "size_bytes": 3141, + "sha256": "4d08edb33c18bafdd657f1f4778740982f5813912f98d281972e96407057d798" + }, + "working_tree": { + "exists": true, + "size_bytes": 3253, + "sha256": "b26c9ae6c7d7abb002d77314f7bf3c1c4bdfcb7c7e54a1abce57734b73fd55fb" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5059, + "sha256": "2d10bedd159a06c25225685c5504db2b075b02379653d2bbf49b31278e66a611" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b26c9ae6c7d7abb002d77314f7bf3c1c4bdfcb7c7e54a1abce57734b73fd55fb", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/sparse_matrix.cpp", + "fesa_dev": { + "source_path": "src/fesa/math/sparse_matrix.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "988964e62609907b3e914be5b1ad5719956e68a7", + "mode": "100644", + "size_bytes": 10588, + "sha256": "b22f630d02761093bb6db0cd6342282091908c15ea63beab80b366801ffeda36" + }, + "working_tree": { + "exists": true, + "size_bytes": 10857, + "sha256": "36b6d58ef1a1bcbc525e6483a887fe04eefbc19e8e429fdac25d0b7b74dc920d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/math/sparse_matrix.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b2d9c16a4d87218156ab8b736c42da7304e5bee0", + "mode": "100644", + "size_bytes": 10554, + "sha256": "25b688a11a34fdda2454d49aa3752b5a9077af602df9714fa910ca9f0e8769cd" + }, + "working_tree": { + "exists": true, + "size_bytes": 10822, + "sha256": "7c0b95cb26e78f9634e35ecbda098c47dda3e7df5755d1c99bbfbaf4d0353546" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10857, + "sha256": "36b6d58ef1a1bcbc525e6483a887fe04eefbc19e8e429fdac25d0b7b74dc920d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7c0b95cb26e78f9634e35ecbda098c47dda3e7df5755d1c99bbfbaf4d0353546", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Removed unused dof_manager include; no arithmetic diff observed.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/vector.cpp", + "fesa_dev": { + "source_path": "src/fesa/math/vector.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "feadd380d589db9ad81bed830e2a58d290cbf952", + "mode": "100644", + "size_bytes": 2633, + "sha256": "cc081d68706ed3c408512424c51c0c00e200f83a608c1189ba7c003ad321af3e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2741, + "sha256": "17f557a916f569e4ad82084cad6fa281bec950cc1b6ca87d37558c1223a396cf" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/math/vector.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b60da8ffaf5cb2e7f4ef8b9d84b50c34fd0443e8", + "mode": "100644", + "size_bytes": 2063, + "sha256": "127b863e94af9b90c50515262c50099017be0c15523f93e2a059b185181b35de" + }, + "working_tree": { + "exists": true, + "size_bytes": 2140, + "sha256": "71834bc656340615dab152c7a3222f78e4996f8560964e368b435246f47491da" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2741, + "sha256": "17f557a916f569e4ad82084cad6fa281bec950cc1b6ca87d37558c1223a396cf" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "71834bc656340615dab152c7a3222f78e4996f8560964e368b435246f47491da", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/math/vector3_operations.h", + "refactor": { + "source_path": "src/fesa/math/vector3_operations.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "06daf7cd93a373f19bdb3d84c8e4af58108651d0", + "mode": "100644", + "size_bytes": 1914, + "sha256": "bba30284c0cdb7247840cf47d16530ebd4f1f653419f5b00936789b5dadea0d9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1971, + "sha256": "e7c562232318be95281a226a388b014669f8beb580b238fc47b507095d8767b1" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "e7c562232318be95281a226a388b014669f8beb580b238fc47b507095d8767b1", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/model/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/model/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bfcbd9a585f1e79ecab9df8a695c85250e55cee4", + "mode": "100644", + "size_bytes": 1043, + "sha256": "100564dc8349a06a5c7e71bd8d690f8c169a92d96fa2d26d7a362913167c41c5" + }, + "working_tree": { + "exists": true, + "size_bytes": 1057, + "sha256": "a7d15d052e109deb846ad02d8259fa77ccad4bacb245bf04ba55f93f87e27716" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/model/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bfcbd9a585f1e79ecab9df8a695c85250e55cee4", + "mode": "100644", + "size_bytes": 1043, + "sha256": "100564dc8349a06a5c7e71bd8d690f8c169a92d96fa2d26d7a362913167c41c5" + }, + "working_tree": { + "exists": true, + "size_bytes": 1057, + "sha256": "a7d15d052e109deb846ad02d8259fa77ccad4bacb245bf04ba55f93f87e27716" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1057, + "sha256": "a7d15d052e109deb846ad02d8259fa77ccad4bacb245bf04ba55f93f87e27716" + } + }, + { + "target_path": "src/fesa/model/domain.cpp", + "fesa_dev": { + "source_path": "src/fesa/model/domain.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "20e49d47e08220abd2b1271d1d30d7e910739383", + "mode": "100644", + "size_bytes": 32927, + "sha256": "1c82dde39c22f4570a12ec05955244ee62640a270e8dbe73c29a7f940a55cb39" + }, + "working_tree": { + "exists": true, + "size_bytes": 33724, + "sha256": "1aaa071bc1d9ed1a6feb50b9341cccd6e9013ee9cace587dc7367106795b4d75" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/model/domain.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "20e49d47e08220abd2b1271d1d30d7e910739383", + "mode": "100644", + "size_bytes": 32927, + "sha256": "1c82dde39c22f4570a12ec05955244ee62640a270e8dbe73c29a7f940a55cb39" + }, + "working_tree": { + "exists": true, + "size_bytes": 33724, + "sha256": "1aaa071bc1d9ed1a6feb50b9341cccd6e9013ee9cace587dc7367106795b4d75" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 33724, + "sha256": "1aaa071bc1d9ed1a6feb50b9341cccd6e9013ee9cace587dc7367106795b4d75" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "1aaa071bc1d9ed1a6feb50b9341cccd6e9013ee9cace587dc7367106795b4d75", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/model/shell_geometry.cpp", + "fesa_dev": { + "source_path": "src/fesa/model/shell_geometry.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9e152fe2f693aae2e00c98ad241466e88df3d08e", + "mode": "100644", + "size_bytes": 19116, + "sha256": "e2bef40106b9e0be88137eeee7de86f1a94f73045c574d2a67e82525deb7de95" + }, + "working_tree": { + "exists": true, + "size_bytes": 19543, + "sha256": "50fade5b588b9da1e56fe012e697d52db0f4808298783177fd43c4d6021dbc6c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/model/shell_geometry.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3998ad79de4aba8ee625fa915187293a17a3a1fa", + "mode": "100644", + "size_bytes": 18943, + "sha256": "9bdc364b9109dffb1c83c6c6f8ffaac91b6c6fbe80747b82589d3f0377986d8b" + }, + "working_tree": { + "exists": true, + "size_bytes": 19368, + "sha256": "07a7a7ff6d2f79fe8c096a6985759bfa4515d2dfe1adc36dd7fc049bdd2ed041" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 19543, + "sha256": "50fade5b588b9da1e56fe012e697d52db0f4808298783177fd43c4d6021dbc6c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "07a7a7ff6d2f79fe8c096a6985759bfa4515d2dfe1adc36dd7fc049bdd2ed041", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/model/source_target_resolver.cpp", + "fesa_dev": { + "source_path": "src/fesa/model/source_target_resolver.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fd81c0193c0869b52629bf5d146ef6807d73084c", + "mode": "100644", + "size_bytes": 8033, + "sha256": "309dc57d800b7f0a5a4813f2ec51ce0f6760c42136ce73e04f350019e93ddb01" + }, + "working_tree": { + "exists": true, + "size_bytes": 8250, + "sha256": "852bd2969300094184ad9f39bce0d0b0b974987c2fb2134feb31b77a17d7f50d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/model/source_target_resolver.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "df77c54529688ca6d6fcdf727b802113474f4cca", + "mode": "100644", + "size_bytes": 8314, + "sha256": "ce0888867ce03d09f54f765d3a40c8a018b5b82f8589ac3f2bf35d500c5e9ce9" + }, + "working_tree": { + "exists": true, + "size_bytes": 8539, + "sha256": "251a981e4f5c528c6de98694bc7b39c6a444ab4e9d6d176cf7a91c1f24fb55db" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8250, + "sha256": "852bd2969300094184ad9f39bce0d0b0b974987c2fb2134feb31b77a17d7f50d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "251a981e4f5c528c6de98694bc7b39c6a444ab4e9d6d176cf7a91c1f24fb55db", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/properties/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/properties/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2809857391ed26a1763fb946e8abfc4dc1232890", + "mode": "100644", + "size_bytes": 944, + "sha256": "665406041febaf05395a85c1b918fdfe6a3e6fa9d86192a24a45bd8c0d157beb" + }, + "working_tree": { + "exists": true, + "size_bytes": 956, + "sha256": "87721be40f07741f09c1c0681e4033f80977dbcd3470b7f9c8249ddfcba45211" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/properties/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "146db1add37ca89edc46d3c081de15b1ec0b993e", + "mode": "100644", + "size_bytes": 947, + "sha256": "9a27253d1017093d52505476b69ccb80b9f22db56541e6fc5fc2e190990596cf" + }, + "working_tree": { + "exists": true, + "size_bytes": 959, + "sha256": "3783c88f5a671ca1a21ee7d90d353ed4903f3c3dfe242431795d39a30130d292" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 956, + "sha256": "87721be40f07741f09c1c0681e4033f80977dbcd3470b7f9c8249ddfcba45211" + } + }, + { + "target_path": "src/fesa/properties/general_beam_section.cpp", + "fesa_dev": { + "source_path": "src/fesa/properties/general_beam_section.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ddc395929946133b8e944e1786015a70fe13575f", + "mode": "100644", + "size_bytes": 5287, + "sha256": "0412c64b9e5a900162aff1d2733494d5a53c5755f803e2c8babbae13efcd56e1" + }, + "working_tree": { + "exists": true, + "size_bytes": 5427, + "sha256": "2f74db860abb18223b1113ff27c54445668145b2ae990183922b595c455acf7b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/properties/general_beam_section.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ddc395929946133b8e944e1786015a70fe13575f", + "mode": "100644", + "size_bytes": 5287, + "sha256": "0412c64b9e5a900162aff1d2733494d5a53c5755f803e2c8babbae13efcd56e1" + }, + "working_tree": { + "exists": true, + "size_bytes": 5427, + "sha256": "2f74db860abb18223b1113ff27c54445668145b2ae990183922b595c455acf7b" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5427, + "sha256": "2f74db860abb18223b1113ff27c54445668145b2ae990183922b595c455acf7b" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2f74db860abb18223b1113ff27c54445668145b2ae990183922b595c455acf7b", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/properties/shell_section.cpp", + "fesa_dev": { + "source_path": "src/fesa/properties/shell_section.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "01654fd47cde553f8a7e663b8a84325beb4d26ca", + "mode": "100644", + "size_bytes": 2749, + "sha256": "a3b718807371bb49dfab3247d1e2cf73a4a470c0d644c9cb350c46bcc281aa9e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2827, + "sha256": "f25e6ce77781a03644b1489d3dc6a01af7b5dfae2e9b58c02fa090026839d6b9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/properties/shell_section.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "01654fd47cde553f8a7e663b8a84325beb4d26ca", + "mode": "100644", + "size_bytes": 2749, + "sha256": "a3b718807371bb49dfab3247d1e2cf73a4a470c0d644c9cb350c46bcc281aa9e" + }, + "working_tree": { + "exists": true, + "size_bytes": 2827, + "sha256": "f25e6ce77781a03644b1489d3dc6a01af7b5dfae2e9b58c02fa090026839d6b9" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2827, + "sha256": "f25e6ce77781a03644b1489d3dc6a01af7b5dfae2e9b58c02fa090026839d6b9" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f25e6ce77781a03644b1489d3dc6a01af7b5dfae2e9b58c02fa090026839d6b9", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/results/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5b298d2479fb5f27c877497c49e9ba032a678912", + "mode": "100644", + "size_bytes": 1109, + "sha256": "f50a9fd708f7ee4c1686b868202c5f238567b83fc8b14b0692ee277907c58b2e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1123, + "sha256": "25671fa29390b97ffaf73a01ad47f201d39f8855fd96771b626c1c4f10207a2e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5b298d2479fb5f27c877497c49e9ba032a678912", + "mode": "100644", + "size_bytes": 1109, + "sha256": "f50a9fd708f7ee4c1686b868202c5f238567b83fc8b14b0692ee277907c58b2e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1123, + "sha256": "25671fa29390b97ffaf73a01ad47f201d39f8855fd96771b626c1c4f10207a2e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1123, + "sha256": "25671fa29390b97ffaf73a01ad47f201d39f8855fd96771b626c1c4f10207a2e" + } + }, + { + "target_path": "src/fesa/results/analysis_state_commit.cpp", + "fesa_dev": { + "source_path": "src/fesa/results/analysis_state_commit.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "df6ed96dabe88ed46daed829b2fd4307d38aa8d4", + "mode": "100644", + "size_bytes": 3953, + "sha256": "9003d5b1194105369c0cf4df7e28e203376e713720bf86419d3f40bdf88ed941" + }, + "working_tree": { + "exists": true, + "size_bytes": 4039, + "sha256": "162e775a6ff316790f4906568e7c520e8dfc5d441ccb054a14a645ec63b78bd9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/analysis_state_commit.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "df6ed96dabe88ed46daed829b2fd4307d38aa8d4", + "mode": "100644", + "size_bytes": 3953, + "sha256": "9003d5b1194105369c0cf4df7e28e203376e713720bf86419d3f40bdf88ed941" + }, + "working_tree": { + "exists": true, + "size_bytes": 4039, + "sha256": "162e775a6ff316790f4906568e7c520e8dfc5d441ccb054a14a645ec63b78bd9" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4039, + "sha256": "162e775a6ff316790f4906568e7c520e8dfc5d441ccb054a14a645ec63b78bd9" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "162e775a6ff316790f4906568e7c520e8dfc5d441ccb054a14a645ec63b78bd9", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/analysis_state_commit.h", + "fesa_dev": { + "source_path": "src/fesa/results/analysis_state_commit.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bb324648be06db7c163bcd5445c3f29d69b9c639", + "mode": "100644", + "size_bytes": 527, + "sha256": "d41dbca80f4775992fe21121ca1a8a809f1e5f84345943eb04fdc456b4477d0c" + }, + "working_tree": { + "exists": true, + "size_bytes": 543, + "sha256": "a76675ad61681d1b4435e0512f913a9be146fdde9b1ea22dac13e658fbb313f6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/analysis_state_commit.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bb324648be06db7c163bcd5445c3f29d69b9c639", + "mode": "100644", + "size_bytes": 527, + "sha256": "d41dbca80f4775992fe21121ca1a8a809f1e5f84345943eb04fdc456b4477d0c" + }, + "working_tree": { + "exists": true, + "size_bytes": 543, + "sha256": "a76675ad61681d1b4435e0512f913a9be146fdde9b1ea22dac13e658fbb313f6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 543, + "sha256": "a76675ad61681d1b4435e0512f913a9be146fdde9b1ea22dac13e658fbb313f6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a76675ad61681d1b4435e0512f913a9be146fdde9b1ea22dac13e658fbb313f6", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/beam_result_recovery.cpp", + "fesa_dev": { + "source_path": "src/fesa/results/beam_result_recovery.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8db716f7dbde8c7e488ac2a0511ebc7d35fcefa9", + "mode": "100644", + "size_bytes": 4584, + "sha256": "98ae2a4e756ae07b5d977ce85c1fadd1e4b481cbaf7521c6c1241105c7894162" + }, + "working_tree": { + "exists": true, + "size_bytes": 4690, + "sha256": "3f3758f6618053ced0abef12b523949fa89e4c53059686debd12534adc3b4c04" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/beam_result_recovery.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8db716f7dbde8c7e488ac2a0511ebc7d35fcefa9", + "mode": "100644", + "size_bytes": 4584, + "sha256": "98ae2a4e756ae07b5d977ce85c1fadd1e4b481cbaf7521c6c1241105c7894162" + }, + "working_tree": { + "exists": true, + "size_bytes": 4690, + "sha256": "3f3758f6618053ced0abef12b523949fa89e4c53059686debd12534adc3b4c04" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4690, + "sha256": "3f3758f6618053ced0abef12b523949fa89e4c53059686debd12534adc3b4c04" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "3f3758f6618053ced0abef12b523949fa89e4c53059686debd12534adc3b4c04", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/beam_result_recovery.h", + "fesa_dev": { + "source_path": "src/fesa/results/beam_result_recovery.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "45938acd62b8b844b258e8ea4e0dea3bc5123a94", + "mode": "100644", + "size_bytes": 822, + "sha256": "12f7d0de7bb55c27532748d398b064d291967d1d75f9a38b326b8835b3a3b61e" + }, + "working_tree": { + "exists": true, + "size_bytes": 845, + "sha256": "4e9ec0b48f6c0499697e9006032bb7f6c0535007b7732f9d76ba3536328f2f48" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/beam_result_recovery.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "45938acd62b8b844b258e8ea4e0dea3bc5123a94", + "mode": "100644", + "size_bytes": 822, + "sha256": "12f7d0de7bb55c27532748d398b064d291967d1d75f9a38b326b8835b3a3b61e" + }, + "working_tree": { + "exists": true, + "size_bytes": 845, + "sha256": "4e9ec0b48f6c0499697e9006032bb7f6c0535007b7732f9d76ba3536328f2f48" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 845, + "sha256": "4e9ec0b48f6c0499697e9006032bb7f6c0535007b7732f9d76ba3536328f2f48" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "4e9ec0b48f6c0499697e9006032bb7f6c0535007b7732f9d76ba3536328f2f48", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/global_equilibrium_recovery.cpp", + "fesa_dev": { + "source_path": "src/fesa/results/global_equilibrium_recovery.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3f36bca0b3dd1ee265e7d1dabe4bdb12ca346809", + "mode": "100644", + "size_bytes": 11895, + "sha256": "1ab6093036ae69e7292e1a229db20e743965a41b4e7f08ca28bda7bb48dc00ea" + }, + "working_tree": { + "exists": true, + "size_bytes": 12166, + "sha256": "859313f28b759f04e607826babd53e0f9be053224b95d337c9ff33f3e80bcfb6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/global_equilibrium_recovery.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3f36bca0b3dd1ee265e7d1dabe4bdb12ca346809", + "mode": "100644", + "size_bytes": 11895, + "sha256": "1ab6093036ae69e7292e1a229db20e743965a41b4e7f08ca28bda7bb48dc00ea" + }, + "working_tree": { + "exists": true, + "size_bytes": 12166, + "sha256": "859313f28b759f04e607826babd53e0f9be053224b95d337c9ff33f3e80bcfb6" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12166, + "sha256": "859313f28b759f04e607826babd53e0f9be053224b95d337c9ff33f3e80bcfb6" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "859313f28b759f04e607826babd53e0f9be053224b95d337c9ff33f3e80bcfb6", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/global_equilibrium_recovery.h", + "fesa_dev": { + "source_path": "src/fesa/results/global_equilibrium_recovery.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4119c39f054a45b289c8eb086a78d47eb7f68703", + "mode": "100644", + "size_bytes": 1443, + "sha256": "5d203712ec658748fb512fd0ef092a6773ac355a32140e0222d8fc8d8fb30c2c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1480, + "sha256": "3501eecba97e84852901c44a63c23e04f1a44cb29ead4940c9090c78c4fab53e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/global_equilibrium_recovery.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4119c39f054a45b289c8eb086a78d47eb7f68703", + "mode": "100644", + "size_bytes": 1443, + "sha256": "5d203712ec658748fb512fd0ef092a6773ac355a32140e0222d8fc8d8fb30c2c" + }, + "working_tree": { + "exists": true, + "size_bytes": 1480, + "sha256": "3501eecba97e84852901c44a63c23e04f1a44cb29ead4940c9090c78c4fab53e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1480, + "sha256": "3501eecba97e84852901c44a63c23e04f1a44cb29ead4940c9090c78c4fab53e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "3501eecba97e84852901c44a63c23e04f1a44cb29ead4940c9090c78c4fab53e", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/prepared_results_writer.cpp", + "refactor": { + "source_path": "src/fesa/results/prepared_results_writer.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "aa69c41cd52f7189e2d6c1721867e19657dc07d3", + "mode": "100644", + "size_bytes": 3659, + "sha256": "46bd535d5bd902fb95a51aa03dc129efe76a808f689804d759a0ea2aefc79335" + }, + "working_tree": { + "exists": true, + "size_bytes": 3742, + "sha256": "b362e5ade74f5dd86e2366b96a7c6863b8a742f5f114454274989c45e629431c" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "b362e5ade74f5dd86e2366b96a7c6863b8a742f5f114454274989c45e629431c", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/recovery_candidate.cpp", + "fesa_dev": { + "source_path": "src/fesa/results/recovery_candidate.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d16300c8f430a9c9ede2576c9674197aecf66939", + "mode": "100644", + "size_bytes": 1245, + "sha256": "8910215d489cff535853eba06b5c689e83dae9a9beea291ee954c16716c73d1e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1284, + "sha256": "4a1558c3d6c719ef55dbe06374d07d8013b87908c2acfc563af748d9b26ad96e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/recovery_candidate.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "762931d4d0b895fae2e03854b45786bcb5758469", + "mode": "100644", + "size_bytes": 1020, + "sha256": "1744a2baa95b1b1ef1dfd55968dd59cb5898c869bc5db03b91c5bfce27e397d5" + }, + "working_tree": { + "exists": true, + "size_bytes": 1052, + "sha256": "af82c9b07d6cc2e48efafc6d1c09e3a9c5f7199aa8246e434415dd08d951d19e" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1284, + "sha256": "4a1558c3d6c719ef55dbe06374d07d8013b87908c2acfc563af748d9b26ad96e" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "af82c9b07d6cc2e48efafc6d1c09e3a9c5f7199aa8246e434415dd08d951d19e", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/recovery_candidate.h", + "fesa_dev": { + "source_path": "src/fesa/results/recovery_candidate.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ab11fcd7d688dbf6b66c34b1c9867491fdd10bcf", + "mode": "100644", + "size_bytes": 2216, + "sha256": "3de91c3a2cebaf81f594308c457b03890b9e1500beab1805afcc06f9f4e566b6" + }, + "working_tree": { + "exists": true, + "size_bytes": 2281, + "sha256": "52601ac6bc57a8f57d064d491e38f538bdd0e278aba3e09dfc52e9ea18ca1d17" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/recovery_candidate.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9141e6227ec94d6d37bfd0cd33a811633fb0db48", + "mode": "100644", + "size_bytes": 2122, + "sha256": "8a24e972f32f1cb456e9366fe953386090f2c8190c19b167d6cd25d376585997" + }, + "working_tree": { + "exists": true, + "size_bytes": 2185, + "sha256": "753826e7d5bcec2af42dece8f8b61d21a9dfd2e6c192d5b4cd9b345820747db9" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2281, + "sha256": "52601ac6bc57a8f57d064d491e38f538bdd0e278aba3e09dfc52e9ea18ca1d17" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "753826e7d5bcec2af42dece8f8b61d21a9dfd2e6c192d5b4cd9b345820747db9", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/result_recovery.cpp", + "fesa_dev": { + "source_path": "src/fesa/results/result_recovery.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b23041a69b63c0b66295d22ba57bb0c09e55a314", + "mode": "100644", + "size_bytes": 26684, + "sha256": "7040903aad4e6ac6494e87b8af0c266b559c376163a9863970c0fb69c012a9b3" + }, + "working_tree": { + "exists": true, + "size_bytes": 27290, + "sha256": "880911864fc221ef6c36d7aa86b1e6435bd01c65fcc4a2922acbdf4bf688c73c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/result_recovery.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6ffe396ce860da86184b4a81f4467972219ad1ac", + "mode": "100644", + "size_bytes": 26059, + "sha256": "ecdab7556432874752e9324b1582df8ebb284d1177488168fabc8e64e4a43a09" + }, + "working_tree": { + "exists": true, + "size_bytes": 26652, + "sha256": "7866b65949059314cb63948c3977c04f78e301bbd5ee0985990a73963f43ac12" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 27290, + "sha256": "880911864fc221ef6c36d7aa86b1e6435bd01c65fcc4a2922acbdf4bf688c73c" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "7866b65949059314cb63948c3977c04f78e301bbd5ee0985990a73963f43ac12", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/shell_result_recovery.cpp", + "fesa_dev": { + "source_path": "src/fesa/results/shell_result_recovery.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bd476846caee5607056dceb7fc4e8476123e203f", + "mode": "100644", + "size_bytes": 2312, + "sha256": "44b44626d569c607505670558562919d57b7a45a3ded6d86e23f49115b9ebc8f" + }, + "working_tree": { + "exists": true, + "size_bytes": 2377, + "sha256": "55aea88441735deb433ff93cffb9bdd06c906d11d400e7852d8307429df5558d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/shell_result_recovery.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b7c00da2a546d9071c6d1dd11a514884d997afd7", + "mode": "100644", + "size_bytes": 2283, + "sha256": "82a6763fc1ea9e7a14d33a0673ee0b503ce7f90a34233bf52c21f4776615f4e8" + }, + "working_tree": { + "exists": true, + "size_bytes": 2345, + "sha256": "f86eff1d4f7edb3ccc41bef084723442db53871eed1ace926a88298ad5770209" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2377, + "sha256": "55aea88441735deb433ff93cffb9bdd06c906d11d400e7852d8307429df5558d" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "f86eff1d4f7edb3ccc41bef084723442db53871eed1ace926a88298ad5770209", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/results/shell_result_recovery.h", + "fesa_dev": { + "source_path": "src/fesa/results/shell_result_recovery.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "183eba4cdb07f9072d9e872e6e77b7cb0f01e03b", + "mode": "100644", + "size_bytes": 735, + "sha256": "9528aabb383b64354aa72127fe403f72e3a5362cf57f5c90480cd0bf5dcacb64" + }, + "working_tree": { + "exists": true, + "size_bytes": 755, + "sha256": "34ade52c40572b90318e68585e91f46b3e121952343b4b0d0180dc419d3686d9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/results/shell_result_recovery.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "01bc18657d6b5e3934a8572dc305b4077ec959ca", + "mode": "100644", + "size_bytes": 857, + "sha256": "4a08c7d2145a99750d1e6b20f540d2e24e0d965bf9cd7a0bb2c588f7458ce340" + }, + "working_tree": { + "exists": true, + "size_bytes": 880, + "sha256": "0f48bff1b0f7659ed85b7a17a0e3e4b3a5f08bf97de38480ae8ce78566dd8bc4" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 755, + "sha256": "34ade52c40572b90318e68585e91f46b3e121952343b4b0d0180dc419d3686d9" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "0f48bff1b0f7659ed85b7a17a0e3e4b3a5f08bf97de38480ae8ce78566dd8bc4", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/solvers/eigen/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/solvers/eigen/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7d2cf9761429b97f9f73b3941791513784cbd7d9", + "mode": "100644", + "size_bytes": 937, + "sha256": "a8fb82b47c207a87b5d65d567a704e51c262134d724365c57183f0ea0564e96a" + }, + "working_tree": { + "exists": true, + "size_bytes": 950, + "sha256": "cb2ed6b7e98d7c2e775ba85290948ab4ffe0fdc4900a064506617a7380fdeab3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/solvers/eigen/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7d2cf9761429b97f9f73b3941791513784cbd7d9", + "mode": "100644", + "size_bytes": 937, + "sha256": "a8fb82b47c207a87b5d65d567a704e51c262134d724365c57183f0ea0564e96a" + }, + "working_tree": { + "exists": true, + "size_bytes": 950, + "sha256": "cb2ed6b7e98d7c2e775ba85290948ab4ffe0fdc4900a064506617a7380fdeab3" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 950, + "sha256": "cb2ed6b7e98d7c2e775ba85290948ab4ffe0fdc4900a064506617a7380fdeab3" + } + }, + { + "target_path": "src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp", + "fesa_dev": { + "source_path": "src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7e3a237a0744531e6ed450d8abb6391bc29df1bf", + "mode": "100644", + "size_bytes": 55042, + "sha256": "b71f619d3acc09311d9c10428a27dcf9d717c0221c7bb2fedefb3747c4981188" + }, + "working_tree": { + "exists": true, + "size_bytes": 56309, + "sha256": "bc09f19c7737efb515cb9521d31bc506aa1ef95bd96cbbe27d1572397abf5f86" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e97674d1e4cad6353507de0f0894b42614c42556", + "mode": "100644", + "size_bytes": 55023, + "sha256": "129aa34d92017df890e5f77d72a4b181fea12a263ccdb9c6961099e5f9a8c9c1" + }, + "working_tree": { + "exists": true, + "size_bytes": 56291, + "sha256": "2a504cc3dc4bd7db44c47ae0e538f29a7650382062e74b3474447a9b0b0bf682" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 56309, + "sha256": "bc09f19c7737efb515cb9521d31bc506aa1ef95bd96cbbe27d1572397abf5f86" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "2a504cc3dc4bd7db44c47ae0e538f29a7650382062e74b3474447a9b0b0bf682", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/solvers/eigen/mkl_feast_eigen_solver_test_seam.h", + "fesa_dev": { + "source_path": "src/fesa/solvers/eigen/mkl_feast_eigen_solver_test_seam.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "dcfbd0966ae47cb6b0373f945ef4de802a8d8eb7", + "mode": "100644", + "size_bytes": 1999, + "sha256": "c98ed05f4711a5943e67d761c2abb897237d9c74ef17d8a8f1db9bab84a4f98c" + }, + "working_tree": { + "exists": true, + "size_bytes": 2069, + "sha256": "42ad3e07300fda75f73ba64187f6c3630339ca0c7abebf284f641ed0f44cafbc" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/solvers/eigen/mkl_feast_eigen_solver_test_seam.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "dcfbd0966ae47cb6b0373f945ef4de802a8d8eb7", + "mode": "100644", + "size_bytes": 1999, + "sha256": "c98ed05f4711a5943e67d761c2abb897237d9c74ef17d8a8f1db9bab84a4f98c" + }, + "working_tree": { + "exists": true, + "size_bytes": 2069, + "sha256": "42ad3e07300fda75f73ba64187f6c3630339ca0c7abebf284f641ed0f44cafbc" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2069, + "sha256": "42ad3e07300fda75f73ba64187f6c3630339ca0c7abebf284f641ed0f44cafbc" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "42ad3e07300fda75f73ba64187f6c3630339ca0c7abebf284f641ed0f44cafbc", + "changed_from_integration_baseline": false, + "numerical_review_categories": [], + "review_owner": null, + "classification_basis": "Identical to T1 integration baseline; no T2 byte change.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/solvers/linear/AGENTS.md", + "fesa_dev": { + "source_path": "src/fesa/solvers/linear/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "3f16801b69664b0a0273f51ae21ca94fdc482b97", + "mode": "100644", + "size_bytes": 960, + "sha256": "f90080f4f0aa50ff7f3c12694e12840aa6ff421751c706822e16256833c3926d" + }, + "working_tree": { + "exists": true, + "size_bytes": 973, + "sha256": "b2686ec9c90d4d56bfd2f1ae68cc06d95ef043167e7ed146811335f53dbd6d6d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/solvers/linear/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3f16801b69664b0a0273f51ae21ca94fdc482b97", + "mode": "100644", + "size_bytes": 960, + "sha256": "f90080f4f0aa50ff7f3c12694e12840aa6ff421751c706822e16256833c3926d" + }, + "working_tree": { + "exists": true, + "size_bytes": 973, + "sha256": "b2686ec9c90d4d56bfd2f1ae68cc06d95ef043167e7ed146811335f53dbd6d6d" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 973, + "sha256": "b2686ec9c90d4d56bfd2f1ae68cc06d95ef043167e7ed146811335f53dbd6d6d" + } + }, + { + "target_path": "src/fesa/solvers/linear/mkl_pardiso_solver.cpp", + "fesa_dev": { + "source_path": "src/fesa/solvers/linear/mkl_pardiso_solver.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0cc9adc8056bbd84fc9df50b76919a881b9f8f99", + "mode": "100644", + "size_bytes": 12265, + "sha256": "fea00279d5b3fc0759311dba336a75bf623bd7d1d421956a23316993e21e51c1" + }, + "working_tree": { + "exists": true, + "size_bytes": 12616, + "sha256": "f7b0de5c715661953ce66b0bfde719a482e08d10c2e39a0dbff66378409e5341" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/solvers/linear/mkl_pardiso_solver.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "edf319ab6cc4c0832ac25f31cb6b889a27dd911d", + "mode": "100644", + "size_bytes": 665, + "sha256": "dc215316011ba25a31b25e59c72f077636b4b148b73f1248a100607e20ad6ab2" + }, + "working_tree": { + "exists": true, + "size_bytes": 692, + "sha256": "9e15164e8a726dbfb58cdd71a202477b2b529e0928be46f68eb04f0df83b94bd" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12616, + "sha256": "f7b0de5c715661953ce66b0bfde719a482e08d10c2e39a0dbff66378409e5341" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "9e15164e8a726dbfb58cdd71a202477b2b529e0928be46f68eb04f0df83b94bd", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp", + "fesa_dev": { + "source_path": "src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b5443123f3de5397223b2c4534256096a21f3e81", + "mode": "100644", + "size_bytes": 9988, + "sha256": "7af611225009fac39e4181795967b00a4a739127b61564494f8c6a5b164cea1c" + }, + "working_tree": { + "exists": true, + "size_bytes": 10285, + "sha256": "c278a1d8d7333b464c0d0e9883fa446f57c86c183754c913e2c651ff8bfb4168" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "728dc5358a2103ca936db0f33a23ce8060a19aa5", + "mode": "100644", + "size_bytes": 744, + "sha256": "7e9669b84d8a7747c31ad7d637b3139e9e26f9f0fe31b59bd22a318b8d9b7917" + }, + "working_tree": { + "exists": true, + "size_bytes": 771, + "sha256": "da98030db0fa6377a477a58651184205a85039dbfef1aae6f8d73a62de2ae799" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10285, + "sha256": "c278a1d8d7333b464c0d0e9883fa446f57c86c183754c913e2c651ff8bfb4168" + }, + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "da98030db0fa6377a477a58651184205a85039dbfef1aae6f8d73a62de2ae799", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/solvers/linear/pardiso_session.cpp", + "refactor": { + "source_path": "src/fesa/solvers/linear/pardiso_session.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b6fcfcc11fdd7c6739105c525df626a79f628410", + "mode": "100644", + "size_bytes": 13627, + "sha256": "95e0f07b6586d13ea3951da2288810e7800264835df77d7497d65414814c4d72" + }, + "working_tree": { + "exists": true, + "size_bytes": 14011, + "sha256": "a039127e896a4354c2c580aa28657d01c3ee4fbfd32634625f87f2ce0e4eaeba" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "a039127e896a4354c2c580aa28657d01c3ee4fbfd32634625f87f2ce0e4eaeba", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/solvers/linear/pardiso_session.h", + "refactor": { + "source_path": "src/fesa/solvers/linear/pardiso_session.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "28311c80214e433c9c82643886b7458bf23346a0", + "mode": "100644", + "size_bytes": 1771, + "sha256": "a273bb5fa98785cc5a0198f135ba26864dd75e663877f2cae3684972aad87cd0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1831, + "sha256": "afea0500b8519292469aa2e51eecb57070df08d039c4cd9d5cf7a6086b382180" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "afea0500b8519292469aa2e51eecb57070df08d039c4cd9d5cf7a6086b382180", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "src/fesa/solvers/linear/pardiso_session_test_seam.h", + "refactor": { + "source_path": "src/fesa/solvers/linear/pardiso_session_test_seam.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9cc0f02bad0b4f25931d9530958afb1cb10d6bae", + "mode": "100644", + "size_bytes": 1294, + "sha256": "693dd5b0d3007dad176be2b98d263d6949dd59ffc23940c8f7e0140eef6e953b" + }, + "working_tree": { + "exists": true, + "size_bytes": 1335, + "sha256": "4fdd30e28205d6362de2dd9ea43d7f354384b700afb13bab96e700c0903851c3" + }, + "working_tree_equals_blob": false + }, + "policy": "adopt-refactor-bytes", + "t2": { + "adoption": "copied-refactor-working-tree-bytes", + "sha256_verified": "4fdd30e28205d6362de2dd9ea43d7f354384b700afb13bab96e700c0903851c3", + "changed_from_integration_baseline": true, + "numerical_review_categories": [ + "formula-or-arithmetic-execution-review", + "cache-trial-commit-lifetime-review" + ], + "review_owner": "T5", + "classification_basis": "Conservative file-owner triage of changed API/implementation; independent diff review pending.", + "numerical_equivalence": "not-claimed" + } + }, + { + "target_path": "tests/AGENTS.md", + "fesa_dev": { + "source_path": "tests/AGENTS.md", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "38c09ad167114b14a44e8816f06de207e7ad0e24", + "mode": "100644", + "size_bytes": 1312, + "sha256": "18aee7c622327cc5dd22beb5916532fd73567e42d03bae4e020fe07bc3a523f8" + }, + "working_tree": { + "exists": true, + "size_bytes": 1328, + "sha256": "c2413bbcde33dad56ffd227536b79b9b9c707a5eb4a7874f0bc840824c4abfd5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/AGENTS.md", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2506ba449cb368bcb39892b18d8c1b5fc834fda3", + "mode": "100644", + "size_bytes": 1814, + "sha256": "d370a6fb7284dde3c41c1d5b117abccf69dfb790823ef224b52c855307512bff" + }, + "working_tree": { + "exists": true, + "size_bytes": 1833, + "sha256": "afbc4a6eb7bfc01c099c4b15c5907a2782043a63a2de03e37a84159e5f4acdb0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1328, + "sha256": "c2413bbcde33dad56ffd227536b79b9b9c707a5eb4a7874f0bc840824c4abfd5" + } + }, + { + "target_path": "tests/CMakeLists.txt", + "fesa_dev": { + "source_path": "tests/CMakeLists.txt", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "be0178cc1c2cd1a7fc91ad74446c8b690cbc4b72", + "mode": "100644", + "size_bytes": 9516, + "sha256": "7faf0664f1caccc190d801c85a4403211f3bb60ae7c94d19d6620ae3189faf0a" + }, + "working_tree": { + "exists": true, + "size_bytes": 9752, + "sha256": "53cb1f15138a3e271131ffca6a73425ee886feaa14733c9655642fa15e278ba6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/CMakeLists.txt", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "584570804e550ea13493fc1dd83a7bb8787dd15c", + "mode": "100644", + "size_bytes": 9564, + "sha256": "570b4fa84b4b84fa0460427565d6de7ac835cca29f1e98c10cc4566b838ce5b8" + }, + "working_tree": { + "exists": true, + "size_bytes": 9822, + "sha256": "8c8c0b8343ada0c1ea259c017a5332bfa0e0a313adbfaabe84406327bc9dc8c9" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9773, + "sha256": "7abaa48fa059aac076957434478f35eb9ff9afa3970ddc7d15648cb43b4eff32" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/linear_frequency_procedure_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/analysis/linear_frequency_procedure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cd15396eff5bd0e6c5bc80033b3072f925becf6a", + "mode": "100644", + "size_bytes": 11240, + "sha256": "d5a3b1b0adcd4f99328a871e9baad9214c0bd48ef2f3c47c0da7b37b2f3ff346" + }, + "working_tree": { + "exists": true, + "size_bytes": 11520, + "sha256": "73da42092ea16d533f8a1725f6e925338fb4d8ff6901c5a462004aef3cacc770" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/linear_frequency_procedure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cd15396eff5bd0e6c5bc80033b3072f925becf6a", + "mode": "100644", + "size_bytes": 11240, + "sha256": "d5a3b1b0adcd4f99328a871e9baad9214c0bd48ef2f3c47c0da7b37b2f3ff346" + }, + "working_tree": { + "exists": true, + "size_bytes": 11520, + "sha256": "73da42092ea16d533f8a1725f6e925338fb4d8ff6901c5a462004aef3cacc770" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11520, + "sha256": "73da42092ea16d533f8a1725f6e925338fb4d8ff6901c5a462004aef3cacc770" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/linear_static_analysis_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/analysis/linear_static_analysis_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "220523003c8ce26d9de4753801ebe21cbbfa3a71", + "mode": "100644", + "size_bytes": 16777, + "sha256": "00a89ac4335dde0426163cbff178bb21c5577a03da7ce68bdc4a74da63b3fe2d" + }, + "working_tree": { + "exists": true, + "size_bytes": 17284, + "sha256": "c796815b0cdc8b655da47ddab48bb3df2ef5d7334d949c9ede355e046b12294b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/linear_static_analysis_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "220523003c8ce26d9de4753801ebe21cbbfa3a71", + "mode": "100644", + "size_bytes": 16777, + "sha256": "00a89ac4335dde0426163cbff178bb21c5577a03da7ce68bdc4a74da63b3fe2d" + }, + "working_tree": { + "exists": true, + "size_bytes": 17284, + "sha256": "c796815b0cdc8b655da47ddab48bb3df2ef5d7334d949c9ede355e046b12294b" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 17284, + "sha256": "c796815b0cdc8b655da47ddab48bb3df2ef5d7334d949c9ede355e046b12294b" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/nonlinear_static_procedure_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/analysis/nonlinear_static_procedure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b5adfa50bf9fd3e19697d9d045c9a63f78268cba", + "mode": "100644", + "size_bytes": 11561, + "sha256": "ee94597ecd2274ccf2751600dc3c0c3ce2dd0d7732581decbec050e6de5b1a68" + }, + "working_tree": { + "exists": true, + "size_bytes": 11907, + "sha256": "1e061b20491b18339e35610d48168180a3a8dc329fd09565e392268dbce7011c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/nonlinear_static_procedure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8f41c340c2b95938cc2e9ed2dde6dc12182211f7", + "mode": "100644", + "size_bytes": 11498, + "sha256": "40c9261593fc5cb9c3676a9217f012399d4bb75a1b6567f14871b962b95c9eb9" + }, + "working_tree": { + "exists": true, + "size_bytes": 11843, + "sha256": "88175e6ca8c6905e7706f40141e85676d7ce3c1763b49e2ebfb7beecd6d9feab" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11907, + "sha256": "1e061b20491b18339e35610d48168180a3a8dc329fd09565e392268dbce7011c" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/shell_surface_pressure_linear_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/analysis/shell_surface_pressure_linear_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8912b8738cbfa7b4903e32c8d64591fceaa32672", + "mode": "100644", + "size_bytes": 8994, + "sha256": "3575ee087dd73c989d7e867af14c8a7c26203c513868634b2e3de7389eaf0756" + }, + "working_tree": { + "exists": true, + "size_bytes": 9266, + "sha256": "f160a13c739276bb27b6b769f4b5d7fc53ab6bbe0e4917b1388aa171313f834e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/shell_surface_pressure_linear_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8912b8738cbfa7b4903e32c8d64591fceaa32672", + "mode": "100644", + "size_bytes": 8994, + "sha256": "3575ee087dd73c989d7e867af14c8a7c26203c513868634b2e3de7389eaf0756" + }, + "working_tree": { + "exists": true, + "size_bytes": 9266, + "sha256": "f160a13c739276bb27b6b769f4b5d7fc53ab6bbe0e4917b1388aa171313f834e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9266, + "sha256": "f160a13c739276bb27b6b769f4b5d7fc53ab6bbe0e4917b1388aa171313f834e" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0cde0e3642235a6e746f098c87319b4c9ce4ed0b", + "mode": "100644", + "size_bytes": 14973, + "sha256": "3e48088614d604d0e8887071dedf9de34d7b84f97c4d9bb78156bb5faed13749" + }, + "working_tree": { + "exists": true, + "size_bytes": 15403, + "sha256": "76f0d621c519f1ca1cb68fafd700bca52c94c69ac975a274eac995298ff77df3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0cde0e3642235a6e746f098c87319b4c9ce4ed0b", + "mode": "100644", + "size_bytes": 14973, + "sha256": "3e48088614d604d0e8887071dedf9de34d7b84f97c4d9bb78156bb5faed13749" + }, + "working_tree": { + "exists": true, + "size_bytes": 15403, + "sha256": "76f0d621c519f1ca1cb68fafd700bca52c94c69ac975a274eac995298ff77df3" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 15403, + "sha256": "76f0d621c519f1ca1cb68fafd700bca52c94c69ac975a274eac995298ff77df3" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/thermal_gauss_oracle.h", + "fesa_dev": { + "source_path": "tests/integration/analysis/thermal_gauss_oracle.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e1822e90f89b2710871c60a0b5e6ea580891917e", + "mode": "100644", + "size_bytes": 3219, + "sha256": "eefed1217413733d2b6f2c59534a7501f9a2256dddd8140f1b6fc970af8bcec6" + }, + "working_tree": { + "exists": true, + "size_bytes": 3289, + "sha256": "d788dbffcaedabfd16337b9683fd30803efb69cee2e64da08c09c4ccff29d12f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/thermal_gauss_oracle.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e1822e90f89b2710871c60a0b5e6ea580891917e", + "mode": "100644", + "size_bytes": 3219, + "sha256": "eefed1217413733d2b6f2c59534a7501f9a2256dddd8140f1b6fc970af8bcec6" + }, + "working_tree": { + "exists": true, + "size_bytes": 3289, + "sha256": "d788dbffcaedabfd16337b9683fd30803efb69cee2e64da08c09c4ccff29d12f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3289, + "sha256": "d788dbffcaedabfd16337b9683fd30803efb69cee2e64da08c09c4ccff29d12f" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/thermal_oracle_generator.py", + "fesa_dev": { + "source_path": "tests/integration/analysis/thermal_oracle_generator.py", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7c643f980a52884b47bc7cc251a4fe4a70e4b5e2", + "mode": "100644", + "size_bytes": 10763, + "sha256": "d4becc345b011814acd7b54a5b7bc16e1d2dddd80b4c1d167273d844dcb8818d" + }, + "working_tree": { + "exists": true, + "size_bytes": 11007, + "sha256": "9c7d218fb43f93b77f0b84d158fcdc32033931a63f67b46e0e8adbac48b678dd" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/thermal_oracle_generator.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7c643f980a52884b47bc7cc251a4fe4a70e4b5e2", + "mode": "100644", + "size_bytes": 10763, + "sha256": "d4becc345b011814acd7b54a5b7bc16e1d2dddd80b4c1d167273d844dcb8818d" + }, + "working_tree": { + "exists": true, + "size_bytes": 11007, + "sha256": "9c7d218fb43f93b77f0b84d158fcdc32033931a63f67b46e0e8adbac48b678dd" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11007, + "sha256": "9c7d218fb43f93b77f0b84d158fcdc32033931a63f67b46e0e8adbac48b678dd" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/thermal_physics_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/analysis/thermal_physics_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "de76b299dcd3079802f6980078e9b10c58ffb25c", + "mode": "100644", + "size_bytes": 51878, + "sha256": "adc141999e15d96214f875ab0a4924551f4ef61493712ee9bfa6a2d89d9af974" + }, + "working_tree": { + "exists": true, + "size_bytes": 53017, + "sha256": "76b826d9162c196c136134c48c4c5116b8b95d0dee90f65fa7a8359f97d26894" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/thermal_physics_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "172628d961a67d91b255fbb4330cd9998a09dc5c", + "mode": "100644", + "size_bytes": 51924, + "sha256": "2a9192a4715a455614443a1ea88284a7694347eaac8c837ebc6d41bbe57fa595" + }, + "working_tree": { + "exists": true, + "size_bytes": 53065, + "sha256": "fd272656d0a4bfda4a8cf075b0064a27ac6f493cb32d73c32f7e308844148c81" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 53017, + "sha256": "76b826d9162c196c136134c48c4c5116b8b95d0dee90f65fa7a8359f97d26894" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/analysis/thermal_slab_oracle.h", + "fesa_dev": { + "source_path": "tests/integration/analysis/thermal_slab_oracle.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "01577f9e010f37c4fda0c3d254587be9b98f85e8", + "mode": "100644", + "size_bytes": 19023, + "sha256": "3dfe0819fc272857692d3de89c30080b4f509c425b6169550bba89114be56c1f" + }, + "working_tree": { + "exists": true, + "size_bytes": 19382, + "sha256": "2d4d4f58df2a9f08b25f850c59617100f2a8af10ba7bdebb7ee80e15b079ad27" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/analysis/thermal_slab_oracle.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "01577f9e010f37c4fda0c3d254587be9b98f85e8", + "mode": "100644", + "size_bytes": 19023, + "sha256": "3dfe0819fc272857692d3de89c30080b4f509c425b6169550bba89114be56c1f" + }, + "working_tree": { + "exists": true, + "size_bytes": 19382, + "sha256": "2d4d4f58df2a9f08b25f850c59617100f2a8af10ba7bdebb7ee80e15b079ad27" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 19382, + "sha256": "2d4d4f58df2a9f08b25f850c59617100f2a8af10ba7bdebb7ee80e15b079ad27" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/app/eigen_application_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/app/eigen_application_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2f8d8b643c16754a9261f0b27d1423cec9e9b1c3", + "mode": "100644", + "size_bytes": 2930, + "sha256": "3062659883cdb4118fc8a2e4294c0c5e49c66fb5c4349968a740aec5790705a1" + }, + "working_tree": { + "exists": true, + "size_bytes": 3041, + "sha256": "7632397db2daf06eb0ff79a311f4f61832f415ebee4aebe334c8bf5d97e83772" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/app/eigen_application_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2f8d8b643c16754a9261f0b27d1423cec9e9b1c3", + "mode": "100644", + "size_bytes": 2930, + "sha256": "3062659883cdb4118fc8a2e4294c0c5e49c66fb5c4349968a740aec5790705a1" + }, + "working_tree": { + "exists": true, + "size_bytes": 3041, + "sha256": "7632397db2daf06eb0ff79a311f4f61832f415ebee4aebe334c8bf5d97e83772" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3041, + "sha256": "7632397db2daf06eb0ff79a311f4f61832f415ebee4aebe334c8bf5d97e83772" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/app/fesa_application_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/app/fesa_application_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "efdbb4f494e9ea3b89a3b36faf4dd34bd82033a1", + "mode": "100644", + "size_bytes": 18949, + "sha256": "2d6905f3681d227c0400927d84e17b66b20cb93415a230e6cf709afc839817e3" + }, + "working_tree": { + "exists": true, + "size_bytes": 19477, + "sha256": "07d63eb93467254f069d6ae86e2af022287e1ff0dba8272dbb08e830709a9ff0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/app/fesa_application_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "efdbb4f494e9ea3b89a3b36faf4dd34bd82033a1", + "mode": "100644", + "size_bytes": 18949, + "sha256": "2d6905f3681d227c0400927d84e17b66b20cb93415a230e6cf709afc839817e3" + }, + "working_tree": { + "exists": true, + "size_bytes": 19477, + "sha256": "07d63eb93467254f069d6ae86e2af022287e1ff0dba8272dbb08e830709a9ff0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 19477, + "sha256": "07d63eb93467254f069d6ae86e2af022287e1ff0dba8272dbb08e830709a9ff0" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/app/shell_surface_pressure_application_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/app/shell_surface_pressure_application_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "24d77aead2aa2efab0d696ccb114ac16fb7771b8", + "mode": "100644", + "size_bytes": 5786, + "sha256": "af9c3b7ef50d0229c1729edf247d90f964a9247fcc187b92a6dc45d05006135e" + }, + "working_tree": { + "exists": true, + "size_bytes": 5981, + "sha256": "369cc07b69791c67f80fefdfebd3b3986bdd7ec3ddae0fc20cc7f9f01f1e4d07" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/app/shell_surface_pressure_application_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "24d77aead2aa2efab0d696ccb114ac16fb7771b8", + "mode": "100644", + "size_bytes": 5786, + "sha256": "af9c3b7ef50d0229c1729edf247d90f964a9247fcc187b92a6dc45d05006135e" + }, + "working_tree": { + "exists": true, + "size_bytes": 5981, + "sha256": "369cc07b69791c67f80fefdfebd3b3986bdd7ec3ddae0fc20cc7f9f01f1e4d07" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5981, + "sha256": "369cc07b69791c67f80fefdfebd3b3986bdd7ec3ddae0fc20cc7f9f01f1e4d07" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/app/solid_application_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/app/solid_application_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "51635811df4436f4a46249550862f9f5da024c04", + "mode": "100644", + "size_bytes": 7095, + "sha256": "7220d8d1edf7fac089915d17d53f2f7aa293fa9a95dbdd6b7635543b6d9b3082" + }, + "working_tree": { + "exists": true, + "size_bytes": 7269, + "sha256": "4fe3fa020951bd776343af5d26def36392794dd74c5e19ca3d57427c489c6831" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/app/solid_application_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "51635811df4436f4a46249550862f9f5da024c04", + "mode": "100644", + "size_bytes": 7095, + "sha256": "7220d8d1edf7fac089915d17d53f2f7aa293fa9a95dbdd6b7635543b6d9b3082" + }, + "working_tree": { + "exists": true, + "size_bytes": 7269, + "sha256": "4fe3fa020951bd776343af5d26def36392794dd74c5e19ca3d57427c489c6831" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7269, + "sha256": "4fe3fa020951bd776343af5d26def36392794dd74c5e19ca3d57427c489c6831" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/integration/app/thermal_application_test.cpp", + "fesa_dev": { + "source_path": "tests/integration/app/thermal_application_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b97b05a29c398ab8bada3e158cfba60b5a4c02c8", + "mode": "100644", + "size_bytes": 19373, + "sha256": "eca0ff4db44ca8d54e862c12691e29db76a30936b0bff66f6fec57c38d4bf687" + }, + "working_tree": { + "exists": true, + "size_bytes": 19864, + "sha256": "671f8895de95c3883587d1766671fc911af679e0ee1104ba90d6f260e2bb7ed4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/integration/app/thermal_application_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c43fd9718c3dc2d73414a07bec94ad9686e6c6a1", + "mode": "100644", + "size_bytes": 19426, + "sha256": "aaf67e121b8b6d90b3763c17e0de8ead50b48b027536a10b91eeda90f7e679ab" + }, + "working_tree": { + "exists": true, + "size_bytes": 19919, + "sha256": "921d9686ce735dc7e44d0e9bd61580838f969ce08e3f858550a099c9fc98cbef" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 19864, + "sha256": "671f8895de95c3883587d1766671fc911af679e0ee1104ba90d6f260e2bb7ed4" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/b33_reference_comparison_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/b33_reference_comparison_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "29878694cf88108563d62c3fa960967198e1c5c5", + "mode": "100644", + "size_bytes": 10650, + "sha256": "423f67b4aa654f4c16e7f7a06eb98e771dd086e75b1265350a1839b039818fb5" + }, + "working_tree": { + "exists": true, + "size_bytes": 10910, + "sha256": "8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/b33_reference_comparison_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "29878694cf88108563d62c3fa960967198e1c5c5", + "mode": "100644", + "size_bytes": 10650, + "sha256": "423f67b4aa654f4c16e7f7a06eb98e771dd086e75b1265350a1839b039818fb5" + }, + "working_tree": { + "exists": true, + "size_bytes": 10910, + "sha256": "8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10910, + "sha256": "8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/eigen_reference_cases_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/eigen_reference_cases_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "97aee97d3c83f675fbe9f9b90139e54922699827", + "mode": "100644", + "size_bytes": 2558, + "sha256": "8c6bbc6d541737b38d6d68250c8599677724571a3ab9988f589c65c3595ba4ee" + }, + "working_tree": { + "exists": true, + "size_bytes": 2628, + "sha256": "f91504b627d58c1ea91174e4d32575067afd8ad6f6e8e9ca79b0bce519a4e661" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/eigen_reference_cases_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d6c5af66bd8b07ace643b6cf6a2aa1a18af361dc", + "mode": "100644", + "size_bytes": 2979, + "sha256": "6fb33ec42399bcbec2d155a82452822e1487a0163efe4e60f7249283f982d4b7" + }, + "working_tree": { + "exists": true, + "size_bytes": 3058, + "sha256": "4890fe18f1ff259890fbc9baf6f4f1c39fabd3bc0a42b8059581dfff7604aeb6" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2628, + "sha256": "f91504b627d58c1ea91174e4d32575067afd8ad6f6e8e9ca79b0bce519a4e661" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/eigen_reference_comparison.cpp", + "fesa_dev": { + "source_path": "tests/reference/eigen_reference_comparison.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6a80dd5d25376dca000f9f6a25ea24f28bd53c33", + "mode": "100644", + "size_bytes": 18100, + "sha256": "f8341d7432300658ef47c07672af81668f135597ea1bad54b73a9c9000e3c51b" + }, + "working_tree": { + "exists": true, + "size_bytes": 18536, + "sha256": "b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/eigen_reference_comparison.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6a80dd5d25376dca000f9f6a25ea24f28bd53c33", + "mode": "100644", + "size_bytes": 18100, + "sha256": "f8341d7432300658ef47c07672af81668f135597ea1bad54b73a9c9000e3c51b" + }, + "working_tree": { + "exists": true, + "size_bytes": 18536, + "sha256": "b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18536, + "sha256": "b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/eigen_reference_comparison.h", + "fesa_dev": { + "source_path": "tests/reference/eigen_reference_comparison.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cb6c0028c69d7d703e0f7c4d36bbbf4c83760d24", + "mode": "100644", + "size_bytes": 1327, + "sha256": "c66c08bae4956e9e12aa43fd98fcb70678b043ac7046cd085f1662494f61f0e0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1378, + "sha256": "96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/eigen_reference_comparison.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cb6c0028c69d7d703e0f7c4d36bbbf4c83760d24", + "mode": "100644", + "size_bytes": 1327, + "sha256": "c66c08bae4956e9e12aa43fd98fcb70678b043ac7046cd085f1662494f61f0e0" + }, + "working_tree": { + "exists": true, + "size_bytes": 1378, + "sha256": "96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1378, + "sha256": "96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/eigen_reference_comparison_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/eigen_reference_comparison_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "8b3dc6b1448fa918c4a1a5d37cd3c1e39b295a7d", + "mode": "100644", + "size_bytes": 8100, + "sha256": "d4929a20c1ea4415f0bdf038a8b9e87bac8b1746e5f184143e058147be0fe080" + }, + "working_tree": { + "exists": true, + "size_bytes": 8293, + "sha256": "f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/eigen_reference_comparison_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8b3dc6b1448fa918c4a1a5d37cd3c1e39b295a7d", + "mode": "100644", + "size_bytes": 8100, + "sha256": "d4929a20c1ea4415f0bdf038a8b9e87bac8b1746e5f184143e058147be0fe080" + }, + "working_tree": { + "exists": true, + "size_bytes": 8293, + "sha256": "f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8293, + "sha256": "f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/mitc4_reference_cases_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/mitc4_reference_cases_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "75b3fe61d1ba26611fe69d156729e5cf61fe261d", + "mode": "100644", + "size_bytes": 8053, + "sha256": "d9656b62fd61be0f578ca74441c8b94747bd39bdb62b7c84a4c109f1c76d16d3" + }, + "working_tree": { + "exists": true, + "size_bytes": 8251, + "sha256": "60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/mitc4_reference_cases_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "75b3fe61d1ba26611fe69d156729e5cf61fe261d", + "mode": "100644", + "size_bytes": 8053, + "sha256": "d9656b62fd61be0f578ca74441c8b94747bd39bdb62b7c84a4c109f1c76d16d3" + }, + "working_tree": { + "exists": true, + "size_bytes": 8251, + "sha256": "60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8251, + "sha256": "60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/mitc4_reference_comparison.cpp", + "fesa_dev": { + "source_path": "tests/reference/mitc4_reference_comparison.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bc8100cd2399ff21f15e31ab68c9ad195285dd5a", + "mode": "100644", + "size_bytes": 38131, + "sha256": "ba7f7e025e2dad0fa22b02dc44d600c2edb732f2bec5f89856fb2dab648b0958" + }, + "working_tree": { + "exists": true, + "size_bytes": 39104, + "sha256": "58ffb13b5dff2e34b3e57df1376627be96d8d0cd8691ca1f77568d5991f8a191" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/mitc4_reference_comparison.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bc8100cd2399ff21f15e31ab68c9ad195285dd5a", + "mode": "100644", + "size_bytes": 38131, + "sha256": "ba7f7e025e2dad0fa22b02dc44d600c2edb732f2bec5f89856fb2dab648b0958" + }, + "working_tree": { + "exists": true, + "size_bytes": 39115, + "sha256": "1e23f52e7a9ff7172bf67f5f9c3e460a05b86089b4df1f91566e502b3f7a3c69" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 39115, + "sha256": "1e23f52e7a9ff7172bf67f5f9c3e460a05b86089b4df1f91566e502b3f7a3c69" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/mitc4_reference_comparison.h", + "fesa_dev": { + "source_path": "tests/reference/mitc4_reference_comparison.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2fb07b85172acb81fa695e4a70979cdf51d48dd5", + "mode": "100644", + "size_bytes": 2277, + "sha256": "66926b7d72ccfcf4d1a0a42bfa456a43a8b71eac6b7dea8b91f381aff620cb5f" + }, + "working_tree": { + "exists": true, + "size_bytes": 2363, + "sha256": "8bd6a36cb25ac102569f733fb560433f5352ddeb7788182e6bbd561da49e846c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/mitc4_reference_comparison.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2fb07b85172acb81fa695e4a70979cdf51d48dd5", + "mode": "100644", + "size_bytes": 2277, + "sha256": "66926b7d72ccfcf4d1a0a42bfa456a43a8b71eac6b7dea8b91f381aff620cb5f" + }, + "working_tree": { + "exists": true, + "size_bytes": 2370, + "sha256": "51c8b78b44583986eeb175a839fd72a11ca5f3405bf016432da9563878c8f1f6" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2370, + "sha256": "51c8b78b44583986eeb175a839fd72a11ca5f3405bf016432da9563878c8f1f6" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/mitc4_reference_comparison_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/mitc4_reference_comparison_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a65397ffba7a41dc65c5b59673ae97be3b3f2739", + "mode": "100644", + "size_bytes": 30314, + "sha256": "eb89700a0e217caa2a38cdfd69ed450c2fa143a86afbc3e9270e499e80370c13" + }, + "working_tree": { + "exists": true, + "size_bytes": 31085, + "sha256": "84620741c644b7ae7ae1cfc527b6effa1fe32d47175b1755be6f337f8d20aa45" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/mitc4_reference_comparison_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a65397ffba7a41dc65c5b59673ae97be3b3f2739", + "mode": "100644", + "size_bytes": 30314, + "sha256": "eb89700a0e217caa2a38cdfd69ed450c2fa143a86afbc3e9270e499e80370c13" + }, + "working_tree": { + "exists": true, + "size_bytes": 31087, + "sha256": "b886b3cf9a6d3569e73f6792ce8ff0a84052c81eb21d78a31245fc74033bf370" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 31087, + "sha256": "b886b3cf9a6d3569e73f6792ce8ff0a84052c81eb21d78a31245fc74033bf370" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/nonlinear_static_reference_cases_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/nonlinear_static_reference_cases_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0bf9c0df880a23fa46617528d9d813ea26737ea2", + "mode": "100644", + "size_bytes": 16972, + "sha256": "1e7ae6f6847c826b8156dcbaf76dd184731b58106acf1790141e840042004bdc" + }, + "working_tree": { + "exists": true, + "size_bytes": 17383, + "sha256": "d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/nonlinear_static_reference_cases_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0bf9c0df880a23fa46617528d9d813ea26737ea2", + "mode": "100644", + "size_bytes": 16972, + "sha256": "1e7ae6f6847c826b8156dcbaf76dd184731b58106acf1790141e840042004bdc" + }, + "working_tree": { + "exists": true, + "size_bytes": 17383, + "sha256": "d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 17383, + "sha256": "d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/nonlinear_static_reference_comparison.cpp", + "fesa_dev": { + "source_path": "tests/reference/nonlinear_static_reference_comparison.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f23d8a293fee1eac97fcb610a92ad11bb673b8b0", + "mode": "100644", + "size_bytes": 73480, + "sha256": "8d82015808ca837c0f643c5999afb602674fcf02f51c7f60ac8c0347bddee582" + }, + "working_tree": { + "exists": true, + "size_bytes": 75202, + "sha256": "e71f156cb5bede1369b6b2e0999d21c5e89e8af5516f74ced906811a3eca55f5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/nonlinear_static_reference_comparison.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "874e7013ce21e51a48dfb6f75e67790a98408ea8", + "mode": "100644", + "size_bytes": 73429, + "sha256": "97dfe70f99b977337fc72e71aec2c6097d686525bd022b595ba95f7343275488" + }, + "working_tree": { + "exists": true, + "size_bytes": 75150, + "sha256": "64d9fa7d7067830bedd7316e66d68c32839c7e701fa8f6a49421cbbcce3938a2" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 75202, + "sha256": "e71f156cb5bede1369b6b2e0999d21c5e89e8af5516f74ced906811a3eca55f5" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/nonlinear_static_reference_comparison.h", + "fesa_dev": { + "source_path": "tests/reference/nonlinear_static_reference_comparison.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a0ac0aa4aa4d70319191ef026c7a4f759a48b167", + "mode": "100644", + "size_bytes": 4575, + "sha256": "e61520b0bf03ec971e428abd42887d86bd74ee157eb174f0da25be3ca00d20ae" + }, + "working_tree": { + "exists": true, + "size_bytes": 4718, + "sha256": "6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/nonlinear_static_reference_comparison.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a0ac0aa4aa4d70319191ef026c7a4f759a48b167", + "mode": "100644", + "size_bytes": 4575, + "sha256": "e61520b0bf03ec971e428abd42887d86bd74ee157eb174f0da25be3ca00d20ae" + }, + "working_tree": { + "exists": true, + "size_bytes": 4718, + "sha256": "6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4718, + "sha256": "6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/reference_comparison.cpp", + "fesa_dev": { + "source_path": "tests/reference/reference_comparison.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "af14ddf69ef825ad0d185991749c81442d2698f7", + "mode": "100644", + "size_bytes": 61278, + "sha256": "4f6eadb9f7705f35da852e0f4cf63f1af16a1f951faf90b6895841a4a7b12380" + }, + "working_tree": { + "exists": true, + "size_bytes": 62797, + "sha256": "9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/reference_comparison.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "af14ddf69ef825ad0d185991749c81442d2698f7", + "mode": "100644", + "size_bytes": 61278, + "sha256": "4f6eadb9f7705f35da852e0f4cf63f1af16a1f951faf90b6895841a4a7b12380" + }, + "working_tree": { + "exists": true, + "size_bytes": 62797, + "sha256": "9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 62797, + "sha256": "9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/reference_comparison.h", + "fesa_dev": { + "source_path": "tests/reference/reference_comparison.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c9ae21a50cd61a0373894aa33667f1358e94b326", + "mode": "100644", + "size_bytes": 2958, + "sha256": "1f39624e67c37926b656243337baed8a87b43b96547388e0d41dd6a25db0e37e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3060, + "sha256": "1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/reference_comparison.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c9ae21a50cd61a0373894aa33667f1358e94b326", + "mode": "100644", + "size_bytes": 2958, + "sha256": "1f39624e67c37926b656243337baed8a87b43b96547388e0d41dd6a25db0e37e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3060, + "sha256": "1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3060, + "sha256": "1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/reference_comparison_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/reference_comparison_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f4742a31885d8353e0c666c399eb810533f4e7dc", + "mode": "100644", + "size_bytes": 30296, + "sha256": "9fa0e6c22983453a72c5bf30d16660b03619b3ada264234d0d648706b9967a63" + }, + "working_tree": { + "exists": true, + "size_bytes": 30997, + "sha256": "2dca374a67a3c55239c2402d4cd9541444283ec49ffb685037f90dad09c0e82f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/reference_comparison_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f4742a31885d8353e0c666c399eb810533f4e7dc", + "mode": "100644", + "size_bytes": 30296, + "sha256": "9fa0e6c22983453a72c5bf30d16660b03619b3ada264234d0d648706b9967a63" + }, + "working_tree": { + "exists": true, + "size_bytes": 31014, + "sha256": "e39732a6cb8747725a43f7fc6341fd4688d04cd3f9f936ec33cbc79b232886af" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 31014, + "sha256": "e39732a6cb8747725a43f7fc6341fd4688d04cd3f9f936ec33cbc79b232886af" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/reference_tolerance_policy.cpp", + "fesa_dev": { + "source_path": "tests/reference/reference_tolerance_policy.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cecdc51558f1b3eebd575a4ed990a9ab1d2a4825", + "mode": "100644", + "size_bytes": 5231, + "sha256": "27b71db22073ee923ba13a8c32bff7ea14ab488d80c2ceefb7767747b68d52f0" + }, + "working_tree": { + "exists": true, + "size_bytes": 5369, + "sha256": "b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/reference_tolerance_policy.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cecdc51558f1b3eebd575a4ed990a9ab1d2a4825", + "mode": "100644", + "size_bytes": 5231, + "sha256": "27b71db22073ee923ba13a8c32bff7ea14ab488d80c2ceefb7767747b68d52f0" + }, + "working_tree": { + "exists": true, + "size_bytes": 5369, + "sha256": "b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5369, + "sha256": "b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/reference_tolerance_policy.h", + "fesa_dev": { + "source_path": "tests/reference/reference_tolerance_policy.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5d41d19671568cc3c370117034faab27deec86ad", + "mode": "100644", + "size_bytes": 2045, + "sha256": "de2c46296fb2b5947a46c739ae21ad66802622b97ee4845543d3cd2a50ba03ac" + }, + "working_tree": { + "exists": true, + "size_bytes": 2125, + "sha256": "9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/reference_tolerance_policy.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5d41d19671568cc3c370117034faab27deec86ad", + "mode": "100644", + "size_bytes": 2045, + "sha256": "de2c46296fb2b5947a46c739ae21ad66802622b97ee4845543d3cd2a50ba03ac" + }, + "working_tree": { + "exists": true, + "size_bytes": 2125, + "sha256": "9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2125, + "sha256": "9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/reference_tolerance_policy_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/reference_tolerance_policy_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bb56f058d3d8247163f1da353af4cc21afce819e", + "mode": "100644", + "size_bytes": 6760, + "sha256": "71152029868dbbfc39b98441041520d07a73df4a3a8fbb5502b32c8d404b1237" + }, + "working_tree": { + "exists": true, + "size_bytes": 6933, + "sha256": "be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/reference_tolerance_policy_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bb56f058d3d8247163f1da353af4cc21afce819e", + "mode": "100644", + "size_bytes": 6760, + "sha256": "71152029868dbbfc39b98441041520d07a73df4a3a8fbb5502b32c8d404b1237" + }, + "working_tree": { + "exists": true, + "size_bytes": 6933, + "sha256": "be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6933, + "sha256": "be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/shell_surface_pressure_reference_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/shell_surface_pressure_reference_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d54a90f5f3772aba2704920115a673d9aece910d", + "mode": "100644", + "size_bytes": 1135, + "sha256": "095736cd8b2eefd76bdaaa35aa9bbbeb82e7a87f376af1f8be807e133a67566e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1167, + "sha256": "45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/shell_surface_pressure_reference_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d54a90f5f3772aba2704920115a673d9aece910d", + "mode": "100644", + "size_bytes": 1135, + "sha256": "095736cd8b2eefd76bdaaa35aa9bbbeb82e7a87f376af1f8be807e133a67566e" + }, + "working_tree": { + "exists": true, + "size_bytes": 1167, + "sha256": "45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1167, + "sha256": "45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/thermal_reference_cases_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/thermal_reference_cases_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1484203801f0d2a37083f71c9122ca7c7f5f3a0e", + "mode": "100644", + "size_bytes": 2833, + "sha256": "b6e9e9a1c88be2695a4d405b409fc61bb929fc4dffda7e82b333dd3f2d3a49dd" + }, + "working_tree": { + "exists": true, + "size_bytes": 2901, + "sha256": "f796b0d84b1289f58caa791fe2c380e1b28b4322030ed505476f39c788f0db86" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/thermal_reference_cases_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "8ff59e0a1457765787a2ecdb145bc12a195dcda4", + "mode": "100644", + "size_bytes": 3199, + "sha256": "44c1850ce7bf40b483531d5ae784f4f815138b9d25d6b5f0f4fd9545366d0b6e" + }, + "working_tree": { + "exists": true, + "size_bytes": 3274, + "sha256": "8b340c31cb028e1cf8e676f35869cb74d923c7e3f05d5ed8d3cc428722b4aed3" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2901, + "sha256": "f796b0d84b1289f58caa791fe2c380e1b28b4322030ed505476f39c788f0db86" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/thermal_reference_comparison.cpp", + "fesa_dev": { + "source_path": "tests/reference/thermal_reference_comparison.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "60569720b29791f37cf983ad4951e1614caee772", + "mode": "100644", + "size_bytes": 18101, + "sha256": "56b6cc4aad9b0122c1a0d266048c889280113757493d372501e163005bab9e1f" + }, + "working_tree": { + "exists": true, + "size_bytes": 18518, + "sha256": "0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/thermal_reference_comparison.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "60569720b29791f37cf983ad4951e1614caee772", + "mode": "100644", + "size_bytes": 18101, + "sha256": "56b6cc4aad9b0122c1a0d266048c889280113757493d372501e163005bab9e1f" + }, + "working_tree": { + "exists": true, + "size_bytes": 18518, + "sha256": "0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18518, + "sha256": "0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/thermal_reference_comparison.h", + "fesa_dev": { + "source_path": "tests/reference/thermal_reference_comparison.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0d02343302e8f871773ec9ea0eb9ea4d5d8cfb60", + "mode": "100644", + "size_bytes": 1904, + "sha256": "c1ecc31681e11d2a2b9a7f64773dc821acd8b3678d77c6063044b481a7f2409d" + }, + "working_tree": { + "exists": true, + "size_bytes": 1961, + "sha256": "c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/thermal_reference_comparison.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0d02343302e8f871773ec9ea0eb9ea4d5d8cfb60", + "mode": "100644", + "size_bytes": 1904, + "sha256": "c1ecc31681e11d2a2b9a7f64773dc821acd8b3678d77c6063044b481a7f2409d" + }, + "working_tree": { + "exists": true, + "size_bytes": 1961, + "sha256": "c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 1961, + "sha256": "c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/reference/thermal_reference_comparison_test.cpp", + "fesa_dev": { + "source_path": "tests/reference/thermal_reference_comparison_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2d469fec63ddaf10d2f795121f771f114d7f1617", + "mode": "100644", + "size_bytes": 13157, + "sha256": "f4faae634443f042cee8752cdb4b3a63439695501a6cf3f9ec785f1c2546aef8" + }, + "working_tree": { + "exists": true, + "size_bytes": 13487, + "sha256": "d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/reference/thermal_reference_comparison_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2d469fec63ddaf10d2f795121f771f114d7f1617", + "mode": "100644", + "size_bytes": 13157, + "sha256": "f4faae634443f042cee8752cdb4b3a63439695501a6cf3f9ec785f1c2546aef8" + }, + "working_tree": { + "exists": true, + "size_bytes": 13487, + "sha256": "d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13487, + "sha256": "d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/test_compare_hex8.py", + "refactor": { + "source_path": "tests/test_compare_hex8.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "431188691046c80be3b50961e5b1ef87050586f4", + "mode": "100644", + "size_bytes": 46060, + "sha256": "551a7edb59720523a50047ed7baa78e77657c698819c8935ab115aa49bde78d2" + }, + "working_tree": { + "exists": true, + "size_bytes": 46916, + "sha256": "48770f6e83f1b7c34a15e396fd7f21bc02c2c102f47f7bab520203d4ac4d872c" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor", + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": null, + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/test_compare_hht_dynamic.py", + "refactor": { + "source_path": "tests/test_compare_hht_dynamic.py", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3bbe9a73489c1ac1d328a9cfeae608670a799e9e", + "mode": "100644", + "size_bytes": 17785, + "sha256": "ff1c16eca0ba33c6f39b295904194f864162d1e9fe4e0d28aeae9bc209d58c72" + }, + "working_tree": { + "exists": true, + "size_bytes": 18136, + "sha256": "717065b241e599f704598cf92f1fdab29dfea77ee0fc7ed8e6f95c215d0354c4" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor", + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": null, + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/test_cpp_policy_contract.py", + "fesa_dev": { + "source_path": "tests/test_cpp_policy_contract.py", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a303fed462c57877849658f104fab770c19242c0", + "mode": "100644", + "size_bytes": 3936, + "sha256": "6a88a04b8fb4d979f0c0fd569e76268a470cd2092e3776daeb6c15612fd0635f" + }, + "working_tree": { + "exists": true, + "size_bytes": 4034, + "sha256": "7f97a7758e483ca293caa39713202bd0c29097ce9983776c7b67c759a53513fc" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4034, + "sha256": "7f97a7758e483ca293caa39713202bd0c29097ce9983776c7b67c759a53513fc" + } + }, + { + "target_path": "tests/unit/analysis/analysis_model_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/analysis_model_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "81cc32a5a9b6b4e16553500176c6116aab9d6b5f", + "mode": "100644", + "size_bytes": 8733, + "sha256": "44864f2744a7234dfb7fd327dfd7fd0a08dec7d6da22db573f14849a70baedca" + }, + "working_tree": { + "exists": true, + "size_bytes": 8939, + "sha256": "008c38d245f54595a9a057575e264b408f235df5e9ff4fad3ef342ab6ff4301a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/analysis_model_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "81cc32a5a9b6b4e16553500176c6116aab9d6b5f", + "mode": "100644", + "size_bytes": 8733, + "sha256": "44864f2744a7234dfb7fd327dfd7fd0a08dec7d6da22db573f14849a70baedca" + }, + "working_tree": { + "exists": true, + "size_bytes": 8939, + "sha256": "008c38d245f54595a9a057575e264b408f235df5e9ff4fad3ef342ab6ff4301a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8939, + "sha256": "008c38d245f54595a9a057575e264b408f235df5e9ff4fad3ef342ab6ff4301a" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/analysis_state_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/analysis_state_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ea2247b10f6164b90d15e29e41873a3decdb6243", + "mode": "100644", + "size_bytes": 6371, + "sha256": "9fc377b9d2837506be28fe8de861c2b2f28e1713b11286b96a12826fc23cc77a" + }, + "working_tree": { + "exists": true, + "size_bytes": 6541, + "sha256": "fc1756cf35f167a555753a2b8ae5c3be3dec48e851ffb2d1a02003088024dbb1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/analysis_state_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ad28e1a73ba5aaf0b4b3cb4f33bd9c0e8e574fe9", + "mode": "100644", + "size_bytes": 6448, + "sha256": "88b9a43634fcd364e429b91bb8cf98ebe3c8b0e9ff5f21ccc8877d9b6bba4e77" + }, + "working_tree": { + "exists": true, + "size_bytes": 6621, + "sha256": "cc752a188e4daa7862e6602271a728de64f67de407ab7e573e9f87380d2b5bbb" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6541, + "sha256": "fc1756cf35f167a555753a2b8ae5c3be3dec48e851ffb2d1a02003088024dbb1" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/analysis_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/analysis_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "72f5bf88911311fd490026d6f6f6cba867f8e528", + "mode": "100644", + "size_bytes": 2071, + "sha256": "882655a24ce03b664db0c1b58d875f938f609ead96b58515fabfc2d6971a8f0d" + }, + "working_tree": { + "exists": true, + "size_bytes": 2138, + "sha256": "5ee75fcbd1bc5a9a634d16239720a814a8fee06b04acb0893a617d557fe8cda7" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/analysis_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f45aa50404195bdc302edfd38d0c624e84cbd319", + "mode": "100644", + "size_bytes": 31739, + "sha256": "0a5189b86a010716ed7eed7b0a3a43b7d1d1ad7d31ec26ae060ef694cd6eea1f" + }, + "working_tree": { + "exists": true, + "size_bytes": 32369, + "sha256": "7fa4c3708ec692f95b5c230c7d7c36f1ef665363228d1d26eea41fe5560eedfd" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2138, + "sha256": "5ee75fcbd1bc5a9a634d16239720a814a8fee06b04acb0893a617d557fe8cda7" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/dynamic_analysis_state_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/dynamic_analysis_state_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9a7faf917b75a528ba9ace76a7f8b6372a226e95", + "mode": "100644", + "size_bytes": 13645, + "sha256": "e086c633d3895b68376d1617fdd62f5f1b5145b605b9559c2bbcb6db186e62cc" + }, + "working_tree": { + "exists": true, + "size_bytes": 13949, + "sha256": "cef74dec5c670c9ebe42f481a7a2ed4dfe3b3eecd14e28451e9433cb86c29a07" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/dynamic_analysis_state_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9a7faf917b75a528ba9ace76a7f8b6372a226e95", + "mode": "100644", + "size_bytes": 13645, + "sha256": "e086c633d3895b68376d1617fdd62f5f1b5145b605b9559c2bbcb6db186e62cc" + }, + "working_tree": { + "exists": true, + "size_bytes": 13967, + "sha256": "25e30b540c37be5c7699132ddf7c5da319a4a1bf3fb8988b054c8e9941ca594f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13967, + "sha256": "25e30b540c37be5c7699132ddf7c5da319a4a1bf3fb8988b054c8e9941ca594f" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/eigen_mass_assembly_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/eigen_mass_assembly_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d8f580fe909c444422999d7d2405ac1401f6d0dd", + "mode": "100644", + "size_bytes": 6128, + "sha256": "c3b36e101a60c733bb396b89e17a524ba0ae7a77bdf282a083800dad80141ab8" + }, + "working_tree": { + "exists": true, + "size_bytes": 6308, + "sha256": "8489602024286b7c66c26750ecbf627d361b893fa9083c7d2dd97d34bbe3c25e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/eigen_mass_assembly_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d8f580fe909c444422999d7d2405ac1401f6d0dd", + "mode": "100644", + "size_bytes": 6128, + "sha256": "c3b36e101a60c733bb396b89e17a524ba0ae7a77bdf282a083800dad80141ab8" + }, + "working_tree": { + "exists": true, + "size_bytes": 6308, + "sha256": "8489602024286b7c66c26750ecbf627d361b893fa9083c7d2dd97d34bbe3c25e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6308, + "sha256": "8489602024286b7c66c26750ecbf627d361b893fa9083c7d2dd97d34bbe3c25e" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/eigen_reduction_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/eigen_reduction_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a7f9108945487568547b133a8e89ed487749afcb", + "mode": "100644", + "size_bytes": 9172, + "sha256": "4bb44a9bf96970de26b2759dd82749e9f8eb7109d0713c0a2f4c72d2a4a5c288" + }, + "working_tree": { + "exists": true, + "size_bytes": 9389, + "sha256": "8b9ae7711b40d67884aa28e863e458d968ae4d5c717e00034405aced6bddc9bb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/eigen_reduction_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4d4ba8ac8daf466929e42833d0f8f745fde734f5", + "mode": "100644", + "size_bytes": 10687, + "sha256": "500d17fbabd48a67481399c75301c64d707da3f9b2af2ec8743d1be327cce3e5" + }, + "working_tree": { + "exists": true, + "size_bytes": 10938, + "sha256": "c6d306df8de16086aaa2c1b8135de697180ed6576dce01cbbc550c0147469c30" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9389, + "sha256": "8b9ae7711b40d67884aa28e863e458d968ae4d5c717e00034405aced6bddc9bb" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/hht_dynamic_algebra_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/hht_dynamic_algebra_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f77f54075e992a58475cdf4d550b62f9de093670", + "mode": "100644", + "size_bytes": 29266, + "sha256": "48b53a8adedf058176a6b19a6710df3d2f42825bfae7329ac624f8c458312501" + }, + "working_tree": { + "exists": true, + "size_bytes": 29892, + "sha256": "dc1a43a08e360283baf9701bf5a2839a21d561397d4ad732c921b31a10cf570e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/hht_dynamic_algebra_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f77f54075e992a58475cdf4d550b62f9de093670", + "mode": "100644", + "size_bytes": 29266, + "sha256": "48b53a8adedf058176a6b19a6710df3d2f42825bfae7329ac624f8c458312501" + }, + "working_tree": { + "exists": true, + "size_bytes": 29938, + "sha256": "e926831b44741880a7a729c57266c668eeeccc9130be07eacdb97c5330338ad2" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 29938, + "sha256": "e926831b44741880a7a729c57266c668eeeccc9130be07eacdb97c5330338ad2" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/hht_dynamic_procedure_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/hht_dynamic_procedure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9e876534289babe258d81bc4b619397588b50eb6", + "mode": "100644", + "size_bytes": 26737, + "sha256": "42a090c90b8d79ba51ba9f68980d291bae9fbec0f4f795e84bd7457fc7599c00" + }, + "working_tree": { + "exists": true, + "size_bytes": 26889, + "sha256": "c6f5b9faf1cca0ae80f587dc0b07dde9513b35303ee69d7bbb126583df98423b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/hht_dynamic_procedure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9e876534289babe258d81bc4b619397588b50eb6", + "mode": "100644", + "size_bytes": 26737, + "sha256": "42a090c90b8d79ba51ba9f68980d291bae9fbec0f4f795e84bd7457fc7599c00" + }, + "working_tree": { + "exists": true, + "size_bytes": 27308, + "sha256": "7b16fff8a3edd6482b56b0c6ac02cbac5b292aecb05c82d51ac460f691befd3a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 27308, + "sha256": "7b16fff8a3edd6482b56b0c6ac02cbac5b292aecb05c82d51ac460f691befd3a" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/hht_energy_verification_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/hht_energy_verification_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2726693e7396b6c67471638169d7c74a7d7ca54e", + "mode": "100644", + "size_bytes": 8798, + "sha256": "5a8a7ac9abe5b62ba399a85f0b5f046adea3411a197b3b46a5af10ae4c25bb26" + }, + "working_tree": { + "exists": true, + "size_bytes": 9021, + "sha256": "9d0c672737a65b301b38b949aef26d0099451719a7fd98ffa7c5d1171e97a885" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/hht_energy_verification_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2726693e7396b6c67471638169d7c74a7d7ca54e", + "mode": "100644", + "size_bytes": 8798, + "sha256": "5a8a7ac9abe5b62ba399a85f0b5f046adea3411a197b3b46a5af10ae4c25bb26" + }, + "working_tree": { + "exists": true, + "size_bytes": 9021, + "sha256": "9d0c672737a65b301b38b949aef26d0099451719a7fd98ffa7c5d1171e97a885" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9021, + "sha256": "9d0c672737a65b301b38b949aef26d0099451719a7fd98ffa7c5d1171e97a885" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/hht_reduced_shell_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/hht_reduced_shell_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d8ce519bff9bfee91aac8aca00b2ccb358659781", + "mode": "100644", + "size_bytes": 82690, + "sha256": "33743478d14a0452b3092ce5a33a028f6bce541c40068800e00fbbe2544909ba" + }, + "working_tree": { + "exists": true, + "size_bytes": 84430, + "sha256": "d715219a60c73ce9803f2c386be3843221c48b1f90882c224ad714db3ea6c785" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/hht_reduced_shell_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1933119331960da4218e6cd0f51cbd30f150d167", + "mode": "100644", + "size_bytes": 56600, + "sha256": "6c00de8d55bd98dbc9b1e47bb7767252609852ca333c5e165db1e7fdfb8ecad4" + }, + "working_tree": { + "exists": true, + "size_bytes": 57744, + "sha256": "d4ad83f9f7c7f4ba18942abb13ef3838edb8e39eea2d32a5cc2b8870a85f81d5" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 84430, + "sha256": "d715219a60c73ce9803f2c386be3843221c48b1f90882c224ad714db3ea6c785" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/hht_shell_physics_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/hht_shell_physics_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e5a3548cb46fa27814b4672b22fa537769274fe1", + "mode": "100644", + "size_bytes": 180426, + "sha256": "c082c092d4be831313b29768f61ec8dc8247a09b8453dbe59a09c41b3b49a4ad" + }, + "working_tree": { + "exists": true, + "size_bytes": 183714, + "sha256": "b8a2dbd416d53e6807dba075bb2f98ee88c0331d5398840569823997248412c4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/hht_shell_physics_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "13b49c9c88c44bcc6f830b29204dc91414285087", + "mode": "100644", + "size_bytes": 180323, + "sha256": "8fd43d98a3eab7e093135608b92b8a7e45196051056d821337ca7d16a4c88414" + }, + "working_tree": { + "exists": true, + "size_bytes": 183989, + "sha256": "029bc0a2ece9780b1c904e966bf71a2a43741317000b7bd1ea3544c2d07968a1" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 184096, + "sha256": "cd99f3300d17e9e74297ddfd12c969fdc10c58bde027ccbbe25b1d39f4d29c6a" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/hht_temporal_verification_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/hht_temporal_verification_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f88bdcd23198d94ee308a6fb3200a15d891499df", + "mode": "100644", + "size_bytes": 20580, + "sha256": "36e3c8eedf651bcb4c5fd2797878122e015fe575c51442322b018eceb3edaa6e" + }, + "working_tree": { + "exists": true, + "size_bytes": 21087, + "sha256": "03565773d95b6bad350d360bb1b2b2489c81b19c5877a5c7bcc6362c951fb013" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/hht_temporal_verification_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f88bdcd23198d94ee308a6fb3200a15d891499df", + "mode": "100644", + "size_bytes": 20580, + "sha256": "36e3c8eedf651bcb4c5fd2797878122e015fe575c51442322b018eceb3edaa6e" + }, + "working_tree": { + "exists": true, + "size_bytes": 21087, + "sha256": "03565773d95b6bad350d360bb1b2b2489c81b19c5877a5c7bcc6362c951fb013" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 21087, + "sha256": "03565773d95b6bad350d360bb1b2b2489c81b19c5877a5c7bcc6362c951fb013" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/hht_time_integration_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/hht_time_integration_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "af2ed95ad5d5d02036408d90549837e4da09fc37", + "mode": "100644", + "size_bytes": 3700, + "sha256": "907f2bedae08ee0447928000972a6770dc9d51d1396452dd66d1521227f1f1c7" + }, + "working_tree": { + "exists": true, + "size_bytes": 3797, + "sha256": "068a7d057ec10b7f70a883d56ad54bb12f20873028b3bd7c34a1eb5c29adce20" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/hht_time_integration_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "af2ed95ad5d5d02036408d90549837e4da09fc37", + "mode": "100644", + "size_bytes": 3700, + "sha256": "907f2bedae08ee0447928000972a6770dc9d51d1396452dd66d1521227f1f1c7" + }, + "working_tree": { + "exists": true, + "size_bytes": 3797, + "sha256": "068a7d057ec10b7f70a883d56ad54bb12f20873028b3bd7c34a1eb5c29adce20" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3797, + "sha256": "068a7d057ec10b7f70a883d56ad54bb12f20873028b3bd7c34a1eb5c29adce20" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/newton_iteration_log_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/newton_iteration_log_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "afebbd9fcf1cfe28d3034adca2f599279a377a3e", + "mode": "100644", + "size_bytes": 24503, + "sha256": "c0b36f294cef91247fe0c8d789ef1053160cc31f585275dd6bb46d3ddaa34eae" + }, + "working_tree": { + "exists": true, + "size_bytes": 25068, + "sha256": "d3101c094646165ee241aa223245bcbf7d58accb1a8f018d2c83fed3f484b9dc" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/newton_iteration_log_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "afebbd9fcf1cfe28d3034adca2f599279a377a3e", + "mode": "100644", + "size_bytes": 24503, + "sha256": "c0b36f294cef91247fe0c8d789ef1053160cc31f585275dd6bb46d3ddaa34eae" + }, + "working_tree": { + "exists": true, + "size_bytes": 25068, + "sha256": "d3101c094646165ee241aa223245bcbf7d58accb1a8f018d2c83fed3f484b9dc" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 25068, + "sha256": "d3101c094646165ee241aa223245bcbf7d58accb1a8f018d2c83fed3f484b9dc" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/nonlinear_analysis_state_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/nonlinear_analysis_state_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4fc9ad30a0588303bc2527d8b8400ab44dc9e6e7", + "mode": "100644", + "size_bytes": 18945, + "sha256": "289488a74b5e502fe091467f2c4c313c996ff48dee3d2baf5b60eb582adb15f6" + }, + "working_tree": { + "exists": true, + "size_bytes": 19401, + "sha256": "71de713d652861fd086471944762c2ce289442e6e2ba2e259db76fad20e63db1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/nonlinear_analysis_state_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "4fc9ad30a0588303bc2527d8b8400ab44dc9e6e7", + "mode": "100644", + "size_bytes": 18945, + "sha256": "289488a74b5e502fe091467f2c4c313c996ff48dee3d2baf5b60eb582adb15f6" + }, + "working_tree": { + "exists": true, + "size_bytes": 19401, + "sha256": "71de713d652861fd086471944762c2ce289442e6e2ba2e259db76fad20e63db1" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 19401, + "sha256": "71de713d652861fd086471944762c2ce289442e6e2ba2e259db76fad20e63db1" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/nonlinear_static_control_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/nonlinear_static_control_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "884d049850e85c02404e779faac540b508b1ddff", + "mode": "100644", + "size_bytes": 22642, + "sha256": "05a03304d16c4c109eb2276ca827a991790b0986b304a46c6e7744ef69faa00b" + }, + "working_tree": { + "exists": true, + "size_bytes": 23176, + "sha256": "d12853400861a54e112f715d41be7470bf32caff38740282301f452c636a668c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/nonlinear_static_control_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "884d049850e85c02404e779faac540b508b1ddff", + "mode": "100644", + "size_bytes": 22642, + "sha256": "05a03304d16c4c109eb2276ca827a991790b0986b304a46c6e7744ef69faa00b" + }, + "working_tree": { + "exists": true, + "size_bytes": 23176, + "sha256": "d12853400861a54e112f715d41be7470bf32caff38740282301f452c636a668c" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 23176, + "sha256": "d12853400861a54e112f715d41be7470bf32caff38740282301f452c636a668c" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/solid_frequency_procedure_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/solid_frequency_procedure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "cb0b20269192c9f7b0e94fdd8f85e122c1610275", + "mode": "100644", + "size_bytes": 13500, + "sha256": "742ee33a0664770591ea495ced06a5334735f6302e6e41019be949c9c31078f3" + }, + "working_tree": { + "exists": true, + "size_bytes": 13782, + "sha256": "80a7a0dd4e765af6155d0ca9e52edc3c13f00e2082a4fcb60601e1ec20a23c56" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/solid_frequency_procedure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cb0b20269192c9f7b0e94fdd8f85e122c1610275", + "mode": "100644", + "size_bytes": 13500, + "sha256": "742ee33a0664770591ea495ced06a5334735f6302e6e41019be949c9c31078f3" + }, + "working_tree": { + "exists": true, + "size_bytes": 13806, + "sha256": "afb4cc6cb6b1b6913bcfd0d473260ab060c91b66835e5570073472e3bc7f3dd5" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13806, + "sha256": "afb4cc6cb6b1b6913bcfd0d473260ab060c91b66835e5570073472e3bc7f3dd5" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f577af2e62a1f824370614c94640628bd8473dc6", + "mode": "100644", + "size_bytes": 67530, + "sha256": "50e3c180fd86b7b8a2886d44d322fea83c11316445febad13640fb3ef13f62be" + }, + "working_tree": { + "exists": true, + "size_bytes": 69035, + "sha256": "1c1936b269135cad28f1bc2608001f50c8992fbca8c9e29c713f28439ffd7eda" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "3eb945c7002b70dfa446be3e1be8a4e880bcfffd", + "mode": "100644", + "size_bytes": 67573, + "sha256": "e920ef25ec99b1e2ec799a08a6482f6e8e65a58954f4625e1a4f6a5c77b01f5f" + }, + "working_tree": { + "exists": true, + "size_bytes": 69089, + "sha256": "8d90de51b606957522feabd9c9e063a463a91ecf2065fc63a21c893aed45276d" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 69044, + "sha256": "71a4ef2edd5b2e4cf40f47c17468a6f37cd7ca8937df212436438cfa65dbba70" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/solid_hht_temporal_verification_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/solid_hht_temporal_verification_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6adf1340fa1cec806bb94e2525edea5b61958f94", + "mode": "100644", + "size_bytes": 31885, + "sha256": "2e63ec697c8f5a27bf7c91c8480e671900dadfb05261d2f21a9994758d535c0f" + }, + "working_tree": { + "exists": true, + "size_bytes": 32560, + "sha256": "f741d023883fd91114346b233a5a1b14c9bc760085fe9830079643d4eea06f84" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/solid_hht_temporal_verification_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6adf1340fa1cec806bb94e2525edea5b61958f94", + "mode": "100644", + "size_bytes": 31885, + "sha256": "2e63ec697c8f5a27bf7c91c8480e671900dadfb05261d2f21a9994758d535c0f" + }, + "working_tree": { + "exists": true, + "size_bytes": 32579, + "sha256": "2973549ac31485ce1ab52ad5dc69ca0e8790f437361cf696f53e4bac0b9c627c" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 32579, + "sha256": "2973549ac31485ce1ab52ad5dc69ca0e8790f437361cf696f53e4bac0b9c627c" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/solid_hht_test_fixture.h", + "fesa_dev": { + "source_path": "tests/unit/analysis/solid_hht_test_fixture.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d7b13cff74425247991a574d34cf5f8dada62e79", + "mode": "100644", + "size_bytes": 2075, + "sha256": "e2621f72b12715391a06e51ec23a320063679e90af74443afd5237197194b962" + }, + "working_tree": { + "exists": true, + "size_bytes": 2075, + "sha256": "e2621f72b12715391a06e51ec23a320063679e90af74443afd5237197194b962" + }, + "working_tree_equals_blob": true + }, + "refactor": { + "source_path": "tests/unit/analysis/solid_hht_test_fixture.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d7b13cff74425247991a574d34cf5f8dada62e79", + "mode": "100644", + "size_bytes": 2075, + "sha256": "e2621f72b12715391a06e51ec23a320063679e90af74443afd5237197194b962" + }, + "working_tree": { + "exists": true, + "size_bytes": 2127, + "sha256": "2ffd1ec89405f926f038cb58fc612604ff8e17853c134caf7cb127c32685cefd" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2127, + "sha256": "2ffd1ec89405f926f038cb58fc612604ff8e17853c134caf7cb127c32685cefd" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/solid_static_procedure_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/solid_static_procedure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "acebcee89878b61ce924f32067a64c96064daa13", + "mode": "100644", + "size_bytes": 36903, + "sha256": "a19bbe9017f2dc15ba571aa7d985aea34a5cc068c962b09b3f8bb3f9ebb7c372" + }, + "working_tree": { + "exists": true, + "size_bytes": 37729, + "sha256": "34391f18bae6f8ff3abe2d99d252ab74cbdd481fd066ba1594419eb2f1da5ab1" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/solid_static_procedure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "19e0fee30041d80dab376c647e59a2b70c4b10f4", + "mode": "100644", + "size_bytes": 42844, + "sha256": "0c88dee0f22812cf164b96f2c1ea5b5aa3b35f6eafbb56aa67b3ed46fad255e7" + }, + "working_tree": { + "exists": true, + "size_bytes": 43787, + "sha256": "8253b2e91a4db4d52cc039a5084ddfb93f7b0ffd1d10b1680e0e79439eabcb04" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 37729, + "sha256": "34391f18bae6f8ff3abe2d99d252ab74cbdd481fd066ba1594419eb2f1da5ab1" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/solid_static_state_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/solid_static_state_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "745713a19078d1f4344119a6ecef6660350a6fe8", + "mode": "100644", + "size_bytes": 2463, + "sha256": "c7116211892b048665c9358acbf4d09f95b1330d6bd2f2bd045f2d32dcf4a4e9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2523, + "sha256": "1693abc34bf1b4346ff3a17979cb8a763cb16950fee6b5a5471e402d4faf621d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/solid_static_state_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "745713a19078d1f4344119a6ecef6660350a6fe8", + "mode": "100644", + "size_bytes": 2463, + "sha256": "c7116211892b048665c9358acbf4d09f95b1330d6bd2f2bd045f2d32dcf4a4e9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2523, + "sha256": "1693abc34bf1b4346ff3a17979cb8a763cb16950fee6b5a5471e402d4faf621d" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2523, + "sha256": "1693abc34bf1b4346ff3a17979cb8a763cb16950fee6b5a5471e402d4faf621d" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/thermal_analysis_state_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/thermal_analysis_state_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c1f58b825ad9247fb9465216de9f5ab2be74d425", + "mode": "100644", + "size_bytes": 12988, + "sha256": "4c3356aad638cdf2cf5124b5b4cd0b6bbe57ee9a89ffef35db9c8973bb30fc76" + }, + "working_tree": { + "exists": true, + "size_bytes": 13289, + "sha256": "a6d89b30f8bb178f16912e6f1fca3bed6b31c6b4b3439095542d51ae5eef5b60" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/thermal_analysis_state_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "04a092acb37ecfd0630de9b98494feeee87a4d4d", + "mode": "100644", + "size_bytes": 13034, + "sha256": "e2177d9884a8353114026ede1d4e107f7f9b4fc91441c08d8f8080da5ad4bac1" + }, + "working_tree": { + "exists": true, + "size_bytes": 13337, + "sha256": "505bda8adef4e2255a4ce1d76d08c96b5806da8652e397048a0b49e5fb364557" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13289, + "sha256": "a6d89b30f8bb178f16912e6f1fca3bed6b31c6b4b3439095542d51ae5eef5b60" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/thermal_time_grid_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/thermal_time_grid_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "30144453e68a2ef0756eb8407d9388b9751eed9a", + "mode": "100644", + "size_bytes": 4501, + "sha256": "3560b994d7309d03bcf6e3eb0cd88defc23c1578678e0a82de27ce792031e0b3" + }, + "working_tree": { + "exists": true, + "size_bytes": 4609, + "sha256": "a2f5f4ff554e4c7d127640394d45cd41bba3df2adde92d39071f720af402ff3e" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/thermal_time_grid_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "30144453e68a2ef0756eb8407d9388b9751eed9a", + "mode": "100644", + "size_bytes": 4501, + "sha256": "3560b994d7309d03bcf6e3eb0cd88defc23c1578678e0a82de27ce792031e0b3" + }, + "working_tree": { + "exists": true, + "size_bytes": 4609, + "sha256": "a2f5f4ff554e4c7d127640394d45cd41bba3df2adde92d39071f720af402ff3e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4609, + "sha256": "a2f5f4ff554e4c7d127640394d45cd41bba3df2adde92d39071f720af402ff3e" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/analysis/transient_heat_procedure_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/analysis/transient_heat_procedure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b31af426a680cd12286ea10fa1fb0aebd5e6bc4b", + "mode": "100644", + "size_bytes": 20708, + "sha256": "767a2554d6647bdbd1458d15df9d6395094361cbe126f50ccdb25522a826317d" + }, + "working_tree": { + "exists": true, + "size_bytes": 21180, + "sha256": "ee408d0deb583f35c838e9e7457ef28de8d017edab31e6c2eae3b6eb3cdf03cd" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/analysis/transient_heat_procedure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "646c0e3d2c892a8f2d5588112fde72925e6b5144", + "mode": "100644", + "size_bytes": 20754, + "sha256": "5234db5e795bf920e7810d0dec11798c474aec377b1339edd18414b96e1b620e" + }, + "working_tree": { + "exists": true, + "size_bytes": 21228, + "sha256": "efff26c6a7451be803515541313038b9555ee01362e280915dab4d272586bef6" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 21180, + "sha256": "ee408d0deb583f35c838e9e7457ef28de8d017edab31e6c2eae3b6eb3cdf03cd" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/app/output_paths_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/app/output_paths_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f21eeaf181480582705830a6c49c2f6222efa674", + "mode": "100644", + "size_bytes": 5189, + "sha256": "0edad59fdbd880b1af9e047dd239404b6b6b0e7625b685f8dff1112d0483d91c" + }, + "working_tree": { + "exists": true, + "size_bytes": 5330, + "sha256": "23aa6fa1dac950505061d2d64a2ad10abffb76bcabc0232cd0afef512c863107" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/app/output_paths_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f21eeaf181480582705830a6c49c2f6222efa674", + "mode": "100644", + "size_bytes": 5189, + "sha256": "0edad59fdbd880b1af9e047dd239404b6b6b0e7625b685f8dff1112d0483d91c" + }, + "working_tree": { + "exists": true, + "size_bytes": 5330, + "sha256": "23aa6fa1dac950505061d2d64a2ad10abffb76bcabc0232cd0afef512c863107" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5330, + "sha256": "23aa6fa1dac950505061d2d64a2ad10abffb76bcabc0232cd0afef512c863107" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/assembly/load_assembler_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/assembly/load_assembler_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e8f9b5aefabaf0627dba1f8650c9cb3f00581ad6", + "mode": "100644", + "size_bytes": 22824, + "sha256": "69552211e0e305818eed1fa00c61eb9f4f29a7711bf30166c73c497a12234548" + }, + "working_tree": { + "exists": true, + "size_bytes": 23351, + "sha256": "34eb602efea7903941426ad18f10ba54bdabd46e4e262ba6efcb5ffabf2af2d3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/assembly/load_assembler_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b8f5ad872cc975f85bde7273f6c17299164e54ff", + "mode": "100644", + "size_bytes": 21080, + "sha256": "7f5bc7d7edb5dad9d94a6245b4a7c49fee4ab7dd5a4fe048084b594904013598" + }, + "working_tree": { + "exists": true, + "size_bytes": 21563, + "sha256": "67464dfa75fd5a01a96d5757f20061cbbf936c4ac7f16b605314de94aabeeee3" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 23351, + "sha256": "34eb602efea7903941426ad18f10ba54bdabd46e4e262ba6efcb5ffabf2af2d3" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/assembly/parallel_for_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/assembly/parallel_for_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "2b150aee3ee90971a66d1ada0b91c63e3278cf73", + "mode": "100644", + "size_bytes": 4107, + "sha256": "cf43162a7af975f41c178cf7a7f9d596bf0064c2b286aced8b38c64066b44e28" + }, + "working_tree": { + "exists": true, + "size_bytes": 4221, + "sha256": "c33eb3d92d7e4fd8c3ae369e223cc123437ab59d17653a4114fc4d80b1230314" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/assembly/parallel_for_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2b150aee3ee90971a66d1ada0b91c63e3278cf73", + "mode": "100644", + "size_bytes": 4107, + "sha256": "cf43162a7af975f41c178cf7a7f9d596bf0064c2b286aced8b38c64066b44e28" + }, + "working_tree": { + "exists": true, + "size_bytes": 4221, + "sha256": "c33eb3d92d7e4fd8c3ae369e223cc123437ab59d17653a4114fc4d80b1230314" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4221, + "sha256": "c33eb3d92d7e4fd8c3ae369e223cc123437ab59d17653a4114fc4d80b1230314" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/assembly/sparse_assembler_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/assembly/sparse_assembler_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "564ddbd33deddb17d6e0a213fcfce1d067fdec5c", + "mode": "100644", + "size_bytes": 17316, + "sha256": "6c02495a9f12bfdd174968ae5cc68441c01be1a4ae71fb9df5d179620a7f2443" + }, + "working_tree": { + "exists": true, + "size_bytes": 17733, + "sha256": "189583b8d3501b8337b55f56051ea1d57e55626bb5358df9787651ef96c34697" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/assembly/sparse_assembler_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "33ef76711e18e0526fe822d69614082e588092d6", + "mode": "100644", + "size_bytes": 20218, + "sha256": "5e260c49be3a7c32dbaabb33ef8e22f4fafff6ed1d9d9ff7f10a779444fe6ad4" + }, + "working_tree": { + "exists": true, + "size_bytes": 20696, + "sha256": "0a9627a0923db100df6ce2d8ca2fada0d5d86cd156d2f12ac1c979a6f8291215" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 17733, + "sha256": "189583b8d3501b8337b55f56051ea1d57e55626bb5358df9787651ef96c34697" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/assembly/surface_pressure_assembler_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/assembly/surface_pressure_assembler_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b9515e6de0c95eab0762ff100e2cd868f97e5582", + "mode": "100644", + "size_bytes": 7580, + "sha256": "96dd814156ab9bcca2a139ae9d7a37f89ba6364f4eb9e16ca0f4372974f2ccf7" + }, + "working_tree": { + "exists": true, + "size_bytes": 7775, + "sha256": "65b0c1bd703fc7bafdbd8200cf61935a039da6b80295f0ddee35027d2cf2dc78" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/assembly/surface_pressure_assembler_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b9515e6de0c95eab0762ff100e2cd868f97e5582", + "mode": "100644", + "size_bytes": 7580, + "sha256": "96dd814156ab9bcca2a139ae9d7a37f89ba6364f4eb9e16ca0f4372974f2ccf7" + }, + "working_tree": { + "exists": true, + "size_bytes": 7775, + "sha256": "65b0c1bd703fc7bafdbd8200cf61935a039da6b80295f0ddee35027d2cf2dc78" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7775, + "sha256": "65b0c1bd703fc7bafdbd8200cf61935a039da6b80295f0ddee35027d2cf2dc78" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/assembly/thermal_assembler_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/assembly/thermal_assembler_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "9445c77579a937c64d3326f467cc4fbfc0d9178b", + "mode": "100644", + "size_bytes": 14617, + "sha256": "200a2858a5d146c4983d87ac7a2705a5f01d02e6f8d97663402b4dcf7de99487" + }, + "working_tree": { + "exists": true, + "size_bytes": 14940, + "sha256": "bcac60bb3167ad3e6ec2d45f9ee08c7535bb121f71cae21a7cac9053440ec25a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/assembly/thermal_assembler_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "9445c77579a937c64d3326f467cc4fbfc0d9178b", + "mode": "100644", + "size_bytes": 14617, + "sha256": "200a2858a5d146c4983d87ac7a2705a5f01d02e6f8d97663402b4dcf7de99487" + }, + "working_tree": { + "exists": true, + "size_bytes": 14940, + "sha256": "bcac60bb3167ad3e6ec2d45f9ee08c7535bb121f71cae21a7cac9053440ec25a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 14940, + "sha256": "bcac60bb3167ad3e6ec2d45f9ee08c7535bb121f71cae21a7cac9053440ec25a" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/build_info_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/build_info_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "aac736e3ac1eb071c89a307c57c622a8319281a1", + "mode": "100644", + "size_bytes": 777, + "sha256": "7d1de4d124e998d0cca902cc84b80970d7990ffd40c1b76ec32d5af476a90388" + }, + "working_tree": { + "exists": true, + "size_bytes": 804, + "sha256": "8bf9bfef45c45c9a09e0a0f98ee4cc38316e2550894c6e27ca599fdd650298b8" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/build_info_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "aac736e3ac1eb071c89a307c57c622a8319281a1", + "mode": "100644", + "size_bytes": 777, + "sha256": "7d1de4d124e998d0cca902cc84b80970d7990ffd40c1b76ec32d5af476a90388" + }, + "working_tree": { + "exists": true, + "size_bytes": 804, + "sha256": "8bf9bfef45c45c9a09e0a0f98ee4cc38316e2550894c6e27ca599fdd650298b8" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 804, + "sha256": "8bf9bfef45c45c9a09e0a0f98ee4cc38316e2550894c6e27ca599fdd650298b8" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/constraints/boundary_condition_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/constraints/boundary_condition_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6e98e2ea8810a559101778e519e973f468af4f04", + "mode": "100644", + "size_bytes": 8488, + "sha256": "22b1aa6c1d72fbd9fe569d4d6512a82dd2ba0dfd0bde9ad4da06e0c0a1b19ad0" + }, + "working_tree": { + "exists": true, + "size_bytes": 8705, + "sha256": "b5ff07b5925aab743568eff705c8827f7186889ad15541e90d2ed9fe6998ce79" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/constraints/boundary_condition_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6e98e2ea8810a559101778e519e973f468af4f04", + "mode": "100644", + "size_bytes": 8488, + "sha256": "22b1aa6c1d72fbd9fe569d4d6512a82dd2ba0dfd0bde9ad4da06e0c0a1b19ad0" + }, + "working_tree": { + "exists": true, + "size_bytes": 8705, + "sha256": "b5ff07b5925aab743568eff705c8827f7186889ad15541e90d2ed9fe6998ce79" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8705, + "sha256": "b5ff07b5925aab743568eff705c8827f7186889ad15541e90d2ed9fe6998ce79" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/constraints/essential_constraints_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/constraints/essential_constraints_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "166f0d0a88bff13e88f082f48cad82366114e4e9", + "mode": "100644", + "size_bytes": 12831, + "sha256": "b224ef557b113b36f8cabf8419aa07c7ab85c40671d71b0d57576a2a4bb65ab6" + }, + "working_tree": { + "exists": true, + "size_bytes": 13149, + "sha256": "ba9c09cde54c8d7ff5a12a38159a7c1de0001262a0186201a81bcbd2bade63d6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/constraints/essential_constraints_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "88ea8884c11df617f6ed9793614fbb14b6a0c355", + "mode": "100644", + "size_bytes": 15938, + "sha256": "48853ecfb976e1f746724d98efe126d9289907d74a31f1b5367f142e33b77b7f" + }, + "working_tree": { + "exists": true, + "size_bytes": 16324, + "sha256": "3bbaa9486249cbfa5978af50408dc25eab1164fe110ebec87ea7f60f2019353a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13149, + "sha256": "ba9c09cde54c8d7ff5a12a38159a7c1de0001262a0186201a81bcbd2bade63d6" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/core/ascii_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/core/ascii_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c0fff581486b0d55f2b42ca1702fcc168d279617", + "mode": "100644", + "size_bytes": 2167, + "sha256": "2b64107f84f0d79b5cc2d8621f988b9fe3bdac36ae2eab79a795ad09577b12d9" + }, + "working_tree": { + "exists": true, + "size_bytes": 2224, + "sha256": "b26eaed43661b405fda69e4a287f40ce7f0d5efd2f7ff7aa0459cf32dd802ae4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/core/ascii_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ec0036c084cd0a839743e07665667d699f27ea33", + "mode": "100644", + "size_bytes": 2730, + "sha256": "36c64d56a6e6f23cce212c1a041851b949e651ac76bb7eaa1485db6a3722df71" + }, + "working_tree": { + "exists": true, + "size_bytes": 2802, + "sha256": "25872dbd7f04fbdb796adecf712db87424f628615095e50d25e86d7ff05d70f1" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2224, + "sha256": "b26eaed43661b405fda69e4a287f40ce7f0d5efd2f7ff7aa0459cf32dd802ae4" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/core/diagnostic_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/core/diagnostic_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "15dc7ceca847815603d73a2a2aea553a4b68f4f0", + "mode": "100644", + "size_bytes": 2104, + "sha256": "58585055a7161a384b8eed98288d0d5bb8c6ac2a29141d37b3380be26415ade1" + }, + "working_tree": { + "exists": true, + "size_bytes": 2159, + "sha256": "440becb7f8e8ffe6db9b32b757b08a56baea19da46808dc42c426e0f9edb14e5" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/core/diagnostic_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "15dc7ceca847815603d73a2a2aea553a4b68f4f0", + "mode": "100644", + "size_bytes": 2104, + "sha256": "58585055a7161a384b8eed98288d0d5bb8c6ac2a29141d37b3380be26415ade1" + }, + "working_tree": { + "exists": true, + "size_bytes": 2159, + "sha256": "440becb7f8e8ffe6db9b32b757b08a56baea19da46808dc42c426e0f9edb14e5" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2159, + "sha256": "440becb7f8e8ffe6db9b32b757b08a56baea19da46808dc42c426e0f9edb14e5" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/core/source_identity_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/core/source_identity_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0201bf7c795ab99569da6528a8809356ebc4cc3b", + "mode": "100644", + "size_bytes": 660, + "sha256": "6d9f9098326e95aeefb7e1cab4a9565ec6672011d5b2c632aaf3096a009de39f" + }, + "working_tree": { + "exists": true, + "size_bytes": 680, + "sha256": "601d563a839e0ce63c6a47ddbb4cb2dc60386ecb2483519532e969affe387b85" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/core/source_identity_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f0ac82a4b33c226b67ed3d527c5ffe7456cc6bbe", + "mode": "100644", + "size_bytes": 1048, + "sha256": "fdf08661f5acb4205ae47404ec6b4453cad45b52c4fb80b9a24f1587bc996ec9" + }, + "working_tree": { + "exists": true, + "size_bytes": 1076, + "sha256": "a6ebba2d2f9e09be684e817e41b14b6572bcce0706d5114c8c8a88f6ac145746" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 680, + "sha256": "601d563a839e0ce63c6a47ddbb4cb2dc60386ecb2483519532e969affe387b85" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/core/status_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/core/status_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "90ace79004e6148edc5d9200a34d94e5e52d5626", + "mode": "100644", + "size_bytes": 2226, + "sha256": "cadf83c49792c65e2ae9c528cbc3187566398782a2cd7505b5f2ff3327332305" + }, + "working_tree": { + "exists": true, + "size_bytes": 2290, + "sha256": "5c035458f1d67d43c340b41fa3f4581a1b3b1df2859903ddfa12da838ac7ff69" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/core/status_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "cd3223ff8187f4301ce6761c15c1a28b56b2a80d", + "mode": "100644", + "size_bytes": 4208, + "sha256": "848b30c9e310704e76b06ab4274149985d452caba2672ddf4d96cdcedd00f190" + }, + "working_tree": { + "exists": true, + "size_bytes": 4333, + "sha256": "3cae23bb04187b6d104c3575d24a87daee20f5c1779dfcfd762ef299105aea42" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2290, + "sha256": "5c035458f1d67d43c340b41fa3f4581a1b3b1df2859903ddfa12da838ac7ff69" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/element_capabilities_test.cpp", + "refactor": { + "source_path": "tests/unit/elements/element_capabilities_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "585d7496f41d0a156151a4488357ae93f40d00a5", + "mode": "100644", + "size_bytes": 19192, + "sha256": "2d3ac8a552c4ed5c367b05c80add32d7f4a4b1186d1521cb5cfbe4ad759b9ebe" + }, + "working_tree": { + "exists": true, + "size_bytes": 19605, + "sha256": "bce1a8538bc2a53ac05e99e96e19e1d25a556eeea42285230ac6c5cbe7c9060f" + }, + "working_tree_equals_blob": false + }, + "policy": "import-refactor", + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": null, + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/element_factory_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/element_factory_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "db61b157eb7e0b8f19e9a26368ac5e1a02ca856e", + "mode": "100644", + "size_bytes": 18275, + "sha256": "53a9f0d04f17a3c9967d7e817067ff562165bd47e04e49e1076196cdf24e7a05" + }, + "working_tree": { + "exists": true, + "size_bytes": 18614, + "sha256": "26a556dd970ee14c9fefbdcdfabb78eae52ccf0edbeda4940c2657488459d3f0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/element_factory_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "db61b157eb7e0b8f19e9a26368ac5e1a02ca856e", + "mode": "100644", + "size_bytes": 18275, + "sha256": "53a9f0d04f17a3c9967d7e817067ff562165bd47e04e49e1076196cdf24e7a05" + }, + "working_tree": { + "exists": true, + "size_bytes": 18723, + "sha256": "39cdff0a92b9a86f0efe54457c47f57bb8fa0a48887eae940198046c8f5249f0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 18723, + "sha256": "39cdff0a92b9a86f0efe54457c47f57bb8fa0a48887eae940198046c8f5249f0" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/euler_beam_3d_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/euler_beam_3d_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d146bd41b163f8f0247c9dc99046f9367015ab0a", + "mode": "100644", + "size_bytes": 47327, + "sha256": "f3fac4c1e53a319393a3846d10cc78516b2bd89f5339d0cb096bae74cd54f056" + }, + "working_tree": { + "exists": true, + "size_bytes": 48466, + "sha256": "36b1305028805eacc62bf2e85b8abdf3512eb322f1a41429062b810365d79c0f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/euler_beam_3d_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d146bd41b163f8f0247c9dc99046f9367015ab0a", + "mode": "100644", + "size_bytes": 47327, + "sha256": "f3fac4c1e53a319393a3846d10cc78516b2bd89f5339d0cb096bae74cd54f056" + }, + "working_tree": { + "exists": true, + "size_bytes": 48466, + "sha256": "36b1305028805eacc62bf2e85b8abdf3512eb322f1a41429062b810365d79c0f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 48466, + "sha256": "36b1305028805eacc62bf2e85b8abdf3512eb322f1a41429062b810365d79c0f" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/finite_rotation_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/finite_rotation_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "913ec791ef7e229f16755f4c9c346a63f796443e", + "mode": "100644", + "size_bytes": 8581, + "sha256": "e2ed48561218c472e48da888133b703dbc27b368a2912897fa512bc56dc58c2c" + }, + "working_tree": { + "exists": true, + "size_bytes": 8810, + "sha256": "6404d4c360ec2cc2779d394442b7ed9dd520ad9a2742394650f50a699619c5af" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/finite_rotation_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bbf8248aecbe90d80b2e2280a85dc15a5d9a0397", + "mode": "100644", + "size_bytes": 9454, + "sha256": "c566b1944b775bd06595d713338898ec16d06027257d4b46dc1ec5f8d28fca17" + }, + "working_tree": { + "exists": true, + "size_bytes": 9700, + "sha256": "ab332c787f3b6a987180c4901cf8c713e08c640e2e197f1c7be52afb11e698a3" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8810, + "sha256": "6404d4c360ec2cc2779d394442b7ed9dd520ad9a2742394650f50a699619c5af" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/hex8_element_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/hex8_element_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7c055aff1e97766c789e01a3c316bddce44c4109", + "mode": "100644", + "size_bytes": 53376, + "sha256": "f67914083da75e8a24672f681270a370d84d647d98410a67dbba8f4ebe563eea" + }, + "working_tree": { + "exists": true, + "size_bytes": 54589, + "sha256": "e346ef7775cc96410eacfea1e7e15ecf2b62b6f125a2e475f9e15e3e97e1acaa" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/hex8_element_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2d00739446d14927f93c187317b6d66ef64ba987", + "mode": "100644", + "size_bytes": 52579, + "sha256": "f053f38ed5ed4efacc5106e6276800e524755d2d56862ad98e1a61945f4cee4a" + }, + "working_tree": { + "exists": true, + "size_bytes": 53776, + "sha256": "978acb597d8a388a003add362d3eff59ae3def1be2a2ec7db8f43a0b42e56aed" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 54589, + "sha256": "e346ef7775cc96410eacfea1e7e15ecf2b62b6f125a2e475f9e15e3e97e1acaa" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/hex8_high_low_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/hex8_high_low_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d1df9e71010405ca6effd8d263618ff5e296fa40", + "mode": "100644", + "size_bytes": 58717, + "sha256": "7cce5633996dd7de61da32273fe5d7d500921839fc0a9bd35166d16806e90a0c" + }, + "working_tree": { + "exists": true, + "size_bytes": 59984, + "sha256": "893b48807ff3d9b7cb80069df3cca46787af5dfc366f244c726f4bcadf59b451" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/hex8_high_low_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "add510bfa6521a7288ef82ee6d66e84abf18b52c", + "mode": "100644", + "size_bytes": 15769, + "sha256": "11208533fd2add328567b8fd857f47ee6637680058babe3abfcacb497229c293" + }, + "working_tree": { + "exists": true, + "size_bytes": 16103, + "sha256": "bd210e7159c44b5db38e38d37fc8f030f4f98048b973e9971a07e11f692fbc69" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 59984, + "sha256": "893b48807ff3d9b7cb80069df3cca46787af5dfc366f244c726f4bcadf59b451" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/mitc4_shell_mass_contract_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/mitc4_shell_mass_contract_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d0697f92980af942a85cc8b900d420cde1a9d11c", + "mode": "100644", + "size_bytes": 20235, + "sha256": "cb89f20ca6058da3805861af9d2831821b066dfa30e9656b463153213b25278c" + }, + "working_tree": { + "exists": true, + "size_bytes": 20671, + "sha256": "1fd73892c2678a5b3ad8fd34edd0292394836a3494c540f4ecc005b6e6a269d9" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/mitc4_shell_mass_contract_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "d0697f92980af942a85cc8b900d420cde1a9d11c", + "mode": "100644", + "size_bytes": 20235, + "sha256": "cb89f20ca6058da3805861af9d2831821b066dfa30e9656b463153213b25278c" + }, + "working_tree": { + "exists": true, + "size_bytes": 20671, + "sha256": "1fd73892c2678a5b3ad8fd34edd0292394836a3494c540f4ecc005b6e6a269d9" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 20671, + "sha256": "1fd73892c2678a5b3ad8fd34edd0292394836a3494c540f4ecc005b6e6a269d9" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/mitc4_shell_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/mitc4_shell_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "d90edc27e85a647ed92f0e171f3ad3fda9af5562", + "mode": "100644", + "size_bytes": 51108, + "sha256": "f14c9222228619cb83d45fd24309722570f6bda70aa202eec5ac190d3cc2e71f" + }, + "working_tree": { + "exists": true, + "size_bytes": 52283, + "sha256": "690b9a24e116e86b67d26c75d76305c766aeaf2835fb1c040ba1cae247734f31" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/mitc4_shell_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0cc2d9c21244780e4792ea155013a87e5dafcdb9", + "mode": "100644", + "size_bytes": 51736, + "sha256": "7fbaf3715dd9665024a33392ecaf8a5fd4ec83922f0697fd5e3e4f229b7fb29c" + }, + "working_tree": { + "exists": true, + "size_bytes": 52924, + "sha256": "0099c4e8370d63a61cdf37604008ecc5ff2dc96461b678052febd0a2fa248aa8" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 52283, + "sha256": "690b9a24e116e86b67d26c75d76305c766aeaf2835fb1c040ba1cae247734f31" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/nonlinear_mitc4_inertia_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/nonlinear_mitc4_inertia_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "6257951609ad3707e992069732e9a114976b56cc", + "mode": "100644", + "size_bytes": 55687, + "sha256": "8847c55e09dbc7a3a7d0c725ef4227fb53a2a257fac2cdf127d39a55049d1dc1" + }, + "working_tree": { + "exists": true, + "size_bytes": 56993, + "sha256": "eb4562c8abedcfbc7c2f953b58bae30f67a84d7ccf0bbea9ae384dfcf595f055" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/nonlinear_mitc4_inertia_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "79f5761408a85168a24dccd94720c8ffc8b95458", + "mode": "100644", + "size_bytes": 55324, + "sha256": "02e16e2fd7aa3bc983124bb30843b2621181be484314166291d51a5f2a9f780a" + }, + "working_tree": { + "exists": true, + "size_bytes": 56622, + "sha256": "7274bef28faa7c8a38da9436edf00d3d2356031a9ee82618a8b16226f99d687f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 56993, + "sha256": "eb4562c8abedcfbc7c2f953b58bae30f67a84d7ccf0bbea9ae384dfcf595f055" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "331abee5361104dcf58775b8d3e74c1cc8f7add9", + "mode": "100644", + "size_bytes": 34575, + "sha256": "7bc8ca10aa1eebfc3f41e19692da8a277453bcfa7b1550d2d5460957608d6400" + }, + "working_tree": { + "exists": true, + "size_bytes": 35335, + "sha256": "8b41aba213d2ba4ae2a24bdff623bf663253b89997cc5f4a99c70953af1cc092" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "331abee5361104dcf58775b8d3e74c1cc8f7add9", + "mode": "100644", + "size_bytes": 34575, + "sha256": "7bc8ca10aa1eebfc3f41e19692da8a277453bcfa7b1550d2d5460957608d6400" + }, + "working_tree": { + "exists": true, + "size_bytes": 35413, + "sha256": "a2053f0d24af51ecdfe345ef14267b8a57a2530e994c46da68a5bb17f7250341" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 35413, + "sha256": "a2053f0d24af51ecdfe345ef14267b8a57a2530e994c46da68a5bb17f7250341" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/nonlinear_mitc4_shell_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/nonlinear_mitc4_shell_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "acabd75e224b34af052974ad3ffefd71fc944a11", + "mode": "100644", + "size_bytes": 11258, + "sha256": "acaa6033ecc8962660debd1b46ce85f23573914fcdf4feb6bf7c8e7e3d13f57a" + }, + "working_tree": { + "exists": true, + "size_bytes": 11552, + "sha256": "0436d99db81007fd4713cbcfd2850b351089fc3c05ab34e291a90e1e7621d07d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/nonlinear_mitc4_shell_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "acabd75e224b34af052974ad3ffefd71fc944a11", + "mode": "100644", + "size_bytes": 11258, + "sha256": "acaa6033ecc8962660debd1b46ce85f23573914fcdf4feb6bf7c8e7e3d13f57a" + }, + "working_tree": { + "exists": true, + "size_bytes": 11552, + "sha256": "0436d99db81007fd4713cbcfd2850b351089fc3c05ab34e291a90e1e7621d07d" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11552, + "sha256": "0436d99db81007fd4713cbcfd2850b351089fc3c05ab34e291a90e1e7621d07d" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/elements/thermal_shell_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/elements/thermal_shell_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fc68ad45830dfb9d28fa3232de88f32bfa63ae8f", + "mode": "100644", + "size_bytes": 21260, + "sha256": "50b713189c7974b7522c6c639d1568fa505c5f5e76cd8665988412cbf573abc0" + }, + "working_tree": { + "exists": true, + "size_bytes": 21758, + "sha256": "70b2d6efab8783f723e6abf838fd6c50a1ea25a436480271f0ad9d9234b062db" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/elements/thermal_shell_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fc68ad45830dfb9d28fa3232de88f32bfa63ae8f", + "mode": "100644", + "size_bytes": 21260, + "sha256": "50b713189c7974b7522c6c639d1568fa505c5f5e76cd8665988412cbf573abc0" + }, + "working_tree": { + "exists": true, + "size_bytes": 21758, + "sha256": "70b2d6efab8783f723e6abf838fd6c50a1ea25a436480271f0ad9d9234b062db" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 21758, + "sha256": "70b2d6efab8783f723e6abf838fd6c50a1ea25a436480271f0ad9d9234b062db" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/fem/dof_manager_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/fem/dof_manager_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c93823ca2cf0be5446e560c2c313af1755fc29b1", + "mode": "100644", + "size_bytes": 26790, + "sha256": "8b28d5231c93c9eb5e9fa57d48940825d5fe6217ffcf1c53f5e51b3819217026" + }, + "working_tree": { + "exists": true, + "size_bytes": 27402, + "sha256": "752d1a2138fc77ec40346e6575f87c9e96d69dd9f9c097eff316e6de887d2195" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/fem/dof_manager_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0a95cceb9386967630b5244a1f61f892f62560b5", + "mode": "100644", + "size_bytes": 26868, + "sha256": "f7e2d8b51d9d63da7866a65fa1c278a6583e19d3437060aa4d72c34de9548a9b" + }, + "working_tree": { + "exists": true, + "size_bytes": 27483, + "sha256": "bd0972cde135770050c66143519332b17cb62a5c17b81530927fb27ef017c844" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 27402, + "sha256": "752d1a2138fc77ec40346e6575f87c9e96d69dd9f9c097eff316e6de887d2195" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/domain_mapper_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/domain_mapper_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5492611cdd55d7cf0d9425552861d3e3c3d20103", + "mode": "100644", + "size_bytes": 46615, + "sha256": "c771d86564737b861e5120697e08dea713e6bb472b6220122cc8c5f2a186b9fd" + }, + "working_tree": { + "exists": true, + "size_bytes": 47762, + "sha256": "cdc14b4c935734140f44849672a8a15b2137233b1a5853a685577d3eb16dc728" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/domain_mapper_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5492611cdd55d7cf0d9425552861d3e3c3d20103", + "mode": "100644", + "size_bytes": 46615, + "sha256": "c771d86564737b861e5120697e08dea713e6bb472b6220122cc8c5f2a186b9fd" + }, + "working_tree": { + "exists": true, + "size_bytes": 47762, + "sha256": "cdc14b4c935734140f44849672a8a15b2137233b1a5853a685577d3eb16dc728" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 47762, + "sha256": "cdc14b4c935734140f44849672a8a15b2137233b1a5853a685577d3eb16dc728" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/domain_mapping_components_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/domain_mapping_components_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "64d2c0c0adaaf916762a6a21970328cd9b743e66", + "mode": "100644", + "size_bytes": 8524, + "sha256": "b9328272dbc1d3afe333e64e8c88cc6d1ccca286d50f0d7e480c225d0e0aa200" + }, + "working_tree": { + "exists": true, + "size_bytes": 8766, + "sha256": "a515704fe97d521d11a2b7c95e41e0f7ec6557f3ee7e4dd5017a8c9757358f9a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/domain_mapping_components_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "64d2c0c0adaaf916762a6a21970328cd9b743e66", + "mode": "100644", + "size_bytes": 8524, + "sha256": "b9328272dbc1d3afe333e64e8c88cc6d1ccca286d50f0d7e480c225d0e0aa200" + }, + "working_tree": { + "exists": true, + "size_bytes": 8766, + "sha256": "a515704fe97d521d11a2b7c95e41e0f7ec6557f3ee7e4dd5017a8c9757358f9a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8766, + "sha256": "a515704fe97d521d11a2b7c95e41e0f7ec6557f3ee7e4dd5017a8c9757358f9a" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/eigen_domain_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/eigen_domain_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "355d1d6e908619897b599eb52c99c7e1ef347427", + "mode": "100644", + "size_bytes": 7262, + "sha256": "1f395fa9c894ef7098dcd2b21c086b81dcf09f00b44adb0bd8d2325a3d57a299" + }, + "working_tree": { + "exists": true, + "size_bytes": 7469, + "sha256": "092b4127f43e6ba27485ad4043ba8b2d80b310299cdf66858fbc239342faa746" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/eigen_domain_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "355d1d6e908619897b599eb52c99c7e1ef347427", + "mode": "100644", + "size_bytes": 7262, + "sha256": "1f395fa9c894ef7098dcd2b21c086b81dcf09f00b44adb0bd8d2325a3d57a299" + }, + "working_tree": { + "exists": true, + "size_bytes": 7469, + "sha256": "092b4127f43e6ba27485ad4043ba8b2d80b310299cdf66858fbc239342faa746" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7469, + "sha256": "092b4127f43e6ba27485ad4043ba8b2d80b310299cdf66858fbc239342faa746" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/hex8_semantics_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/hex8_semantics_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c45c7bd3c57a6997015d6eb3af88c405de9d49d2", + "mode": "100644", + "size_bytes": 26294, + "sha256": "fa700c443db53b9a05075bb2f042f6dbce21aebc84b8faee3d5e1f04fb689338" + }, + "working_tree": { + "exists": true, + "size_bytes": 26849, + "sha256": "0804a9ef5cb15fdee5c06d4f3ba05b626ebcae6952360bb769271d457bc9530c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/hex8_semantics_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c45c7bd3c57a6997015d6eb3af88c405de9d49d2", + "mode": "100644", + "size_bytes": 26294, + "sha256": "fa700c443db53b9a05075bb2f042f6dbce21aebc84b8faee3d5e1f04fb689338" + }, + "working_tree": { + "exists": true, + "size_bytes": 26849, + "sha256": "0804a9ef5cb15fdee5c06d4f3ba05b626ebcae6952360bb769271d457bc9530c" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 26849, + "sha256": "0804a9ef5cb15fdee5c06d4f3ba05b626ebcae6952360bb769271d457bc9530c" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/hht_dynamic_domain_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/hht_dynamic_domain_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fd9f86356de7f40fc7ecc6008dd5878f3f0586a2", + "mode": "100644", + "size_bytes": 6723, + "sha256": "6a54ea3b4e3208d449cad0a5fbd97989b8818459170ac32f47e210eaa550b510" + }, + "working_tree": { + "exists": true, + "size_bytes": 6929, + "sha256": "e5a7cec78d6b44cfd120f3883d44964842e52ab1781c6a9c678b93c1768a893b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/hht_dynamic_domain_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "fd9f86356de7f40fc7ecc6008dd5878f3f0586a2", + "mode": "100644", + "size_bytes": 6723, + "sha256": "6a54ea3b4e3208d449cad0a5fbd97989b8818459170ac32f47e210eaa550b510" + }, + "working_tree": { + "exists": true, + "size_bytes": 6929, + "sha256": "e5a7cec78d6b44cfd120f3883d44964842e52ab1781c6a9c678b93c1768a893b" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 6929, + "sha256": "e5a7cec78d6b44cfd120f3883d44964842e52ab1781c6a9c678b93c1768a893b" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/input_reader_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/input_reader_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "46510a38975e4d128e6e8ea093fe3e4691fbfedf", + "mode": "100644", + "size_bytes": 5835, + "sha256": "ce9e23b55dd6ce965898f4d8f369c76eda5bda8aea35bafd38b9e582f2e60392" + }, + "working_tree": { + "exists": true, + "size_bytes": 5986, + "sha256": "30c6b51c5910fb07f94969370ced1e063bcbf212266e228e3c09ef5a4575ad96" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/input_reader_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "46510a38975e4d128e6e8ea093fe3e4691fbfedf", + "mode": "100644", + "size_bytes": 5835, + "sha256": "ce9e23b55dd6ce965898f4d8f369c76eda5bda8aea35bafd38b9e582f2e60392" + }, + "working_tree": { + "exists": true, + "size_bytes": 5986, + "sha256": "30c6b51c5910fb07f94969370ced1e063bcbf212266e228e3c09ef5a4575ad96" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5986, + "sha256": "30c6b51c5910fb07f94969370ced1e063bcbf212266e228e3c09ef5a4575ad96" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/input_syntax_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/input_syntax_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "717e7ea8f37fb9f2b2e17109e254fb2d8561715e", + "mode": "100644", + "size_bytes": 3000, + "sha256": "3cff969bf35e051155b4d31a77d286704cf47515c3b7e2ceaa73b74c08203870" + }, + "working_tree": { + "exists": true, + "size_bytes": 3089, + "sha256": "6a0ecd5814f476c566f96a1e64d8e1b2757a0dfd70f17d3543519b1d6226a7b7" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/input_syntax_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "717e7ea8f37fb9f2b2e17109e254fb2d8561715e", + "mode": "100644", + "size_bytes": 3000, + "sha256": "3cff969bf35e051155b4d31a77d286704cf47515c3b7e2ceaa73b74c08203870" + }, + "working_tree": { + "exists": true, + "size_bytes": 3089, + "sha256": "6a0ecd5814f476c566f96a1e64d8e1b2757a0dfd70f17d3543519b1d6226a7b7" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3089, + "sha256": "6a0ecd5814f476c566f96a1e64d8e1b2757a0dfd70f17d3543519b1d6226a7b7" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bb6ae7339be1365459adabaf0cab505d613cfd0f", + "mode": "100644", + "size_bytes": 23459, + "sha256": "c2fe05378a87217c5fabc68a12c71c7302a9a7dc27c9949b55692eb0d46769d4" + }, + "working_tree": { + "exists": true, + "size_bytes": 24047, + "sha256": "f28acc507f7b42094ff105589aa020384ae0c3b6c6b4c67edb7d4e36f7928af6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "bb6ae7339be1365459adabaf0cab505d613cfd0f", + "mode": "100644", + "size_bytes": 23459, + "sha256": "c2fe05378a87217c5fabc68a12c71c7302a9a7dc27c9949b55692eb0d46769d4" + }, + "working_tree": { + "exists": true, + "size_bytes": 24047, + "sha256": "f28acc507f7b42094ff105589aa020384ae0c3b6c6b4c67edb7d4e36f7928af6" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 24047, + "sha256": "f28acc507f7b42094ff105589aa020384ae0c3b6c6b4c67edb7d4e36f7928af6" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/abaqus/thermal_domain_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/abaqus/thermal_domain_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "118a2112c7f30a17ed57825bca46a874556a6986", + "mode": "100644", + "size_bytes": 46418, + "sha256": "7f7c93c854ebcf9f1626f2466d4d73dd40e583d8b664c0f832005896db089604" + }, + "working_tree": { + "exists": true, + "size_bytes": 47468, + "sha256": "efd4b1c00fa1db1fa4fe9ccd369c34f9bea4cc2665b5c00972792a0fd66d9483" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/abaqus/thermal_domain_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "118a2112c7f30a17ed57825bca46a874556a6986", + "mode": "100644", + "size_bytes": 46418, + "sha256": "7f7c93c854ebcf9f1626f2466d4d73dd40e583d8b664c0f832005896db089604" + }, + "working_tree": { + "exists": true, + "size_bytes": 47468, + "sha256": "efd4b1c00fa1db1fa4fe9ccd369c34f9bea4cc2665b5c00972792a0fd66d9483" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 47468, + "sha256": "efd4b1c00fa1db1fa4fe9ccd369c34f9bea4cc2665b5c00972792a0fd66d9483" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0de145c926296d135994748fbc5202f56bdc4097", + "mode": "100644", + "size_bytes": 29856, + "sha256": "a8dbfd5f13481c483b2ebf84a09f4933be3e9630ac99b3a0805a700e63c3cb4b" + }, + "working_tree": { + "exists": true, + "size_bytes": 30491, + "sha256": "5d309a1b119015721f17821d48e950cf534158a32c914e89a799118380647c7f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0de145c926296d135994748fbc5202f56bdc4097", + "mode": "100644", + "size_bytes": 29856, + "sha256": "a8dbfd5f13481c483b2ebf84a09f4933be3e9630ac99b3a0805a700e63c3cb4b" + }, + "working_tree": { + "exists": true, + "size_bytes": 30528, + "sha256": "55a2e65c40382b393210d36625666ce014008eaf3cbfbe9610a6dfaf0f840d11" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 30528, + "sha256": "55a2e65c40382b393210d36625666ce014008eaf3cbfbe9610a6dfaf0f840d11" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "926d667edfba0fadb652818325663961b196b3a3", + "mode": "100644", + "size_bytes": 6848, + "sha256": "97668a1eb71dd72bb69b9fd8af6f08157c3f6534e38238e8ebb601784b125963" + }, + "working_tree": { + "exists": true, + "size_bytes": 7003, + "sha256": "249f07429c5bb0dd50db784f6be559e15db7c705baa3db44e0591c9c7914d9e3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "926d667edfba0fadb652818325663961b196b3a3", + "mode": "100644", + "size_bytes": 6848, + "sha256": "97668a1eb71dd72bb69b9fd8af6f08157c3f6534e38238e8ebb601784b125963" + }, + "working_tree": { + "exists": true, + "size_bytes": 7003, + "sha256": "249f07429c5bb0dd50db784f6be559e15db7c705baa3db44e0591c9c7914d9e3" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7003, + "sha256": "249f07429c5bb0dd50db784f6be559e15db7c705baa3db44e0591c9c7914d9e3" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/hdf5_results_writer_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/hdf5_results_writer_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "5250cd4aae503971a4a467cbd7d664198ce21fca", + "mode": "100644", + "size_bytes": 58443, + "sha256": "99b0dddff427046700f6f30f470eae631125eb52f89a21787718388d0012ef1d" + }, + "working_tree": { + "exists": true, + "size_bytes": 59788, + "sha256": "dd680025af1f1e85cfd08e97d2dad7db8c857238d3b73cb23d824690670f58c3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/hdf5_results_writer_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "5250cd4aae503971a4a467cbd7d664198ce21fca", + "mode": "100644", + "size_bytes": 58443, + "sha256": "99b0dddff427046700f6f30f470eae631125eb52f89a21787718388d0012ef1d" + }, + "working_tree": { + "exists": true, + "size_bytes": 59788, + "sha256": "dd680025af1f1e85cfd08e97d2dad7db8c857238d3b73cb23d824690670f58c3" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 59788, + "sha256": "dd680025af1f1e85cfd08e97d2dad7db8c857238d3b73cb23d824690670f58c3" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/hdf5_writer_components_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/hdf5_writer_components_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "830eca3c257ef24a940ca644669e4575406f28fd", + "mode": "100644", + "size_bytes": 7702, + "sha256": "cb5c5d18b624a836ff397170337bf391920070e5e8da32a7d41d8a478b233399" + }, + "working_tree": { + "exists": true, + "size_bytes": 7893, + "sha256": "cedde4c3b4576ff6568b8dabefbc0ad56bc54ef4d3adbf2c8eb74ad7f7f711e4" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/hdf5_writer_components_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "830eca3c257ef24a940ca644669e4575406f28fd", + "mode": "100644", + "size_bytes": 7702, + "sha256": "cb5c5d18b624a836ff397170337bf391920070e5e8da32a7d41d8a478b233399" + }, + "working_tree": { + "exists": true, + "size_bytes": 7893, + "sha256": "cedde4c3b4576ff6568b8dabefbc0ad56bc54ef4d3adbf2c8eb74ad7f7f711e4" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7893, + "sha256": "cedde4c3b4576ff6568b8dabefbc0ad56bc54ef4d3adbf2c8eb74ad7f7f711e4" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "ee8d73bb213e76e0a6202e37535d5d6bac6ba2aa", + "mode": "100644", + "size_bytes": 24088, + "sha256": "656d36f63488d6316434276e44c701af3d6334ca9e4423ad6efb5b513bd44ac4" + }, + "working_tree": { + "exists": true, + "size_bytes": 24705, + "sha256": "ea65dd1a637d3517aba6239dd53b411bf465a04769ae57ffc2ca970247080a4a" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "ee8d73bb213e76e0a6202e37535d5d6bac6ba2aa", + "mode": "100644", + "size_bytes": 24088, + "sha256": "656d36f63488d6316434276e44c701af3d6334ca9e4423ad6efb5b513bd44ac4" + }, + "working_tree": { + "exists": true, + "size_bytes": 24705, + "sha256": "ea65dd1a637d3517aba6239dd53b411bf465a04769ae57ffc2ca970247080a4a" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 24705, + "sha256": "ea65dd1a637d3517aba6239dd53b411bf465a04769ae57ffc2ca970247080a4a" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1a3ea6bbec9efd7405c1874212cb53af4e7af1c5", + "mode": "100644", + "size_bytes": 39300, + "sha256": "788c4661913de5678ec932f317a097dd3cb354327d6370799dcac3195b20788d" + }, + "working_tree": { + "exists": true, + "size_bytes": 40170, + "sha256": "6af9fa2932e01e6d814a73aa2368b5f5d7206f9c39004377d7d0ca5fbe11463d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "92ce68a66c087edb2d1c3b6fcd5d18bb47068b91", + "mode": "100644", + "size_bytes": 39406, + "sha256": "a5281ec4e174e4ef296cd1283769fce3b02ee55eb365de74ae94da3eac42ebd0" + }, + "working_tree": { + "exists": true, + "size_bytes": 40280, + "sha256": "0e288ede59628ee0256258206f78ba4830a13b65c68d9a42125b767bf15fed78" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 40171, + "sha256": "bde4a8151895a48cd9d3bc6216b5d97ccfb51cc9991fd13c9eac5c30f4ad8c7e" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/solid_output_test_fixture.h", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/solid_output_test_fixture.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b5dbf1393a38b1a1cb5b72553e4c42439141c942", + "mode": "100644", + "size_bytes": 2304, + "sha256": "9e7195cd7096815c237160ff0315fabca314fe8068ef1ea88751543cac732307" + }, + "working_tree": { + "exists": true, + "size_bytes": 2362, + "sha256": "f55daaac80ffbb33f56431eb37931b48dc0202107b74e298254f9fcd2a2e5977" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/solid_output_test_fixture.h", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b5dbf1393a38b1a1cb5b72553e4c42439141c942", + "mode": "100644", + "size_bytes": 2304, + "sha256": "9e7195cd7096815c237160ff0315fabca314fe8068ef1ea88751543cac732307" + }, + "working_tree": { + "exists": true, + "size_bytes": 2362, + "sha256": "f55daaac80ffbb33f56431eb37931b48dc0202107b74e298254f9fcd2a2e5977" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2362, + "sha256": "f55daaac80ffbb33f56431eb37931b48dc0202107b74e298254f9fcd2a2e5977" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "e475d618c381b97e25f7f920c171cf24f00dbc67", + "mode": "100644", + "size_bytes": 40524, + "sha256": "5b54f03078695afa4b2355641cb8f3f8dc727971070ec0d83311e057acf7b048" + }, + "working_tree": { + "exists": true, + "size_bytes": 41517, + "sha256": "576b253a222e41e7b8bd6643a47706eec1ed333eaf5a09c2206b89ef1bb06895" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e475d618c381b97e25f7f920c171cf24f00dbc67", + "mode": "100644", + "size_bytes": 40524, + "sha256": "5b54f03078695afa4b2355641cb8f3f8dc727971070ec0d83311e057acf7b048" + }, + "working_tree": { + "exists": true, + "size_bytes": 41517, + "sha256": "576b253a222e41e7b8bd6643a47706eec1ed333eaf5a09c2206b89ef1bb06895" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 41517, + "sha256": "576b253a222e41e7b8bd6643a47706eec1ed333eaf5a09c2206b89ef1bb06895" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/loads/load_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/loads/load_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "f723d1090d65e715aa879eeb15c4e80644d5d4b2", + "mode": "100644", + "size_bytes": 4148, + "sha256": "1c582767f6d64a3ebf09720940e5694aba0107bdbbf2815e768ce8fb6430c679" + }, + "working_tree": { + "exists": true, + "size_bytes": 4255, + "sha256": "ce8c7aa7d0372bf0cd2f1627ed19cc2b1c603240d03517e959169eb746f8dd64" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/loads/load_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "f723d1090d65e715aa879eeb15c4e80644d5d4b2", + "mode": "100644", + "size_bytes": 4148, + "sha256": "1c582767f6d64a3ebf09720940e5694aba0107bdbbf2815e768ce8fb6430c679" + }, + "working_tree": { + "exists": true, + "size_bytes": 4255, + "sha256": "ce8c7aa7d0372bf0cd2f1627ed19cc2b1c603240d03517e959169eb746f8dd64" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4255, + "sha256": "ce8c7aa7d0372bf0cd2f1627ed19cc2b1c603240d03517e959169eb746f8dd64" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/loads/shell_surface_pressure_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/loads/shell_surface_pressure_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "05b9d6160671babbc744d92c5876a3f5fb678dc3", + "mode": "100644", + "size_bytes": 20044, + "sha256": "c8400416ee1e9b5cca4dee559470a6093f7e2461893b73d8db1a154c84ccfb41" + }, + "working_tree": { + "exists": true, + "size_bytes": 20557, + "sha256": "094f2106b557380c45c24cf92d2f4b860ece37d53faea45b704bfd456be26945" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/loads/shell_surface_pressure_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "05b9d6160671babbc744d92c5876a3f5fb678dc3", + "mode": "100644", + "size_bytes": 20044, + "sha256": "c8400416ee1e9b5cca4dee559470a6093f7e2461893b73d8db1a154c84ccfb41" + }, + "working_tree": { + "exists": true, + "size_bytes": 20557, + "sha256": "094f2106b557380c45c24cf92d2f4b860ece37d53faea45b704bfd456be26945" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 20557, + "sha256": "094f2106b557380c45c24cf92d2f4b860ece37d53faea45b704bfd456be26945" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/materials/material_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/materials/material_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a06b02969684a4ddcf0e80075d3fd7a1357e4cef", + "mode": "100644", + "size_bytes": 2372, + "sha256": "1279d3f4f8a0d78718f2d9d2123bd3b33ca9cf3e98f55e59af5635b86258ded5" + }, + "working_tree": { + "exists": true, + "size_bytes": 2435, + "sha256": "0e4f0a0beafc60dfc9ed3a016a544ed2b93a305867f8b820dc6817ebe58d8b7d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/materials/material_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a06b02969684a4ddcf0e80075d3fd7a1357e4cef", + "mode": "100644", + "size_bytes": 2372, + "sha256": "1279d3f4f8a0d78718f2d9d2123bd3b33ca9cf3e98f55e59af5635b86258ded5" + }, + "working_tree": { + "exists": true, + "size_bytes": 2435, + "sha256": "0e4f0a0beafc60dfc9ed3a016a544ed2b93a305867f8b820dc6817ebe58d8b7d" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2435, + "sha256": "0e4f0a0beafc60dfc9ed3a016a544ed2b93a305867f8b820dc6817ebe58d8b7d" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/math/dense_blas_internal_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/math/dense_blas_internal_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7ddfb666c50958355b64096918d92405b9a0598e", + "mode": "100644", + "size_bytes": 11659, + "sha256": "421e2ce34502b74e9e485153f0774017a83841f1471639d6d2784df152656175" + }, + "working_tree": { + "exists": true, + "size_bytes": 11958, + "sha256": "d63714753d2cb3dc08d74b1d95b437b2a44ecf84087888f8814d62f227623aeb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/math/dense_blas_internal_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e08f0f40eeb30a726847281fa5e2b615945906c6", + "mode": "100644", + "size_bytes": 18098, + "sha256": "49d3813186cf6cfa3a6e0d6286a704401555eb61fc79205d0ef266f60b5879b8" + }, + "working_tree": { + "exists": true, + "size_bytes": 18526, + "sha256": "92b3b3a482f320eb9e0206baf3190e6c96f110b5c3e63a27cfc038cb6dc5bf5e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 11958, + "sha256": "d63714753d2cb3dc08d74b1d95b437b2a44ecf84087888f8814d62f227623aeb" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/math/high_low_arithmetic_original.h", + "fesa_dev": { + "source_path": "tests/unit/math/high_low_arithmetic_original.h", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "072fe6b7a70c01f2f775b6f57179b1e5ff40fea8", + "mode": "100644", + "size_bytes": 7106, + "sha256": "3c01c8a5c85ec696c3d39b4027401fe16d04fa0fbe3fc70f44336bb242e20339" + }, + "working_tree": { + "exists": true, + "size_bytes": 7268, + "sha256": "e2d9911ce60d0b689c5ebe9fe46c089f5edd05068b62c2b940b37c7cbc1e0ead" + }, + "working_tree_equals_blob": false + }, + "policy": "preserve-dev", + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7268, + "sha256": "e2d9911ce60d0b689c5ebe9fe46c089f5edd05068b62c2b940b37c7cbc1e0ead" + } + }, + { + "target_path": "tests/unit/math/high_low_arithmetic_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/math/high_low_arithmetic_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fc41fadb66a9f21d0e087dc99a097324ddcd0b92", + "mode": "100644", + "size_bytes": 10186, + "sha256": "728d650657decd7aaa663c002f8f40329a9597e2b858312cdbe4d27ea404a5c4" + }, + "working_tree": { + "exists": true, + "size_bytes": 10425, + "sha256": "bb3a73827650ecd71ab92015e1add5c2836c5e9bc6e712068823e228d7389f5f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/math/high_low_arithmetic_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "2727e24965f9dfb561bd0552580c26f1437ca310", + "mode": "100644", + "size_bytes": 9365, + "sha256": "8580874504e0d3c6345af31e408341fdb97612cb3e0b95052b4321f8fff65fbd" + }, + "working_tree": { + "exists": true, + "size_bytes": 9571, + "sha256": "9a7cff8145fef7279b78dae9839d85d69d4b85de012ff89c943efc9e3aa02e6f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 10425, + "sha256": "bb3a73827650ecd71ab92015e1add5c2836c5e9bc6e712068823e228d7389f5f" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/math/matrix_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/math/matrix_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b315b44dafcad446990cc3520f4bad9648205b1c", + "mode": "100644", + "size_bytes": 4397, + "sha256": "1797d09d9dacaaf0441f40d2bfdef72bf024494a219eb7f705f0b5803b2ca276" + }, + "working_tree": { + "exists": true, + "size_bytes": 4528, + "sha256": "24d515a2397f12e2951d055c69e82e00f1cef93c2451520a5d180cc8ca02ccf0" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/math/matrix_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "e6fe1776cdea80d85abaaa945a7acdb2a1d179a8", + "mode": "100644", + "size_bytes": 5780, + "sha256": "443237a469d496cba0f65b889c9758748c2b965e2204ed1aee3de86e2336632a" + }, + "working_tree": { + "exists": true, + "size_bytes": 5950, + "sha256": "2c6513a08239b1a3280aba9945c43da4f1dc34c3dd8e2c6b31232436e9481854" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4528, + "sha256": "24d515a2397f12e2951d055c69e82e00f1cef93c2451520a5d180cc8ca02ccf0" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/math/sparse_matrix_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/math/sparse_matrix_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "7185f91831e56cf604afba241e11087909627724", + "mode": "100644", + "size_bytes": 9538, + "sha256": "966b505c935a0c16cdd1965e642bae35aaaab0d6840820efe2bb14104e1a10ea" + }, + "working_tree": { + "exists": true, + "size_bytes": 9774, + "sha256": "ce2d95faaa89e5b4887d791745eee4b97e882482fa91e04b787dceaa268d663b" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/math/sparse_matrix_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "7754a2f5c2703b16bcb51563c63b7841eb28b484", + "mode": "100644", + "size_bytes": 5272, + "sha256": "01e805c194376d0aca68bfbbf7da5e496c6229b8dcf1786133346a0cfe38e594" + }, + "working_tree": { + "exists": true, + "size_bytes": 5406, + "sha256": "2d60a8b6821d8cf61c56f088cf73ad4324638979db7776a27f68113740e14ad7" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9774, + "sha256": "ce2d95faaa89e5b4887d791745eee4b97e882482fa91e04b787dceaa268d663b" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/math/vector3_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/math/vector3_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bd51337318ff19f3ddf90b62ddf1c1f10269d401", + "mode": "100644", + "size_bytes": 3665, + "sha256": "cb525ac88eef599e0717b9ff0eeb32dbdf21c8ff4f74579c12ab4b3b78604bdc" + }, + "working_tree": { + "exists": true, + "size_bytes": 3781, + "sha256": "73d76da9064531db15cd5c7aaaafca04cffcc9853b56171055ed35789cf649ae" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/math/vector3_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "48d2d643c55c46013183666c1f0bd6385084f523", + "mode": "100644", + "size_bytes": 4209, + "sha256": "800cfad5f4c458808db279b94759e4d6efc6dfb246b5f81025450e82100c79a0" + }, + "working_tree": { + "exists": true, + "size_bytes": 4339, + "sha256": "442331d7ccb19a8f989c48d0f71fdfb0f0a6473adf7af53e7a4b477f45b965a4" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 3781, + "sha256": "73d76da9064531db15cd5c7aaaafca04cffcc9853b56171055ed35789cf649ae" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/math/vector_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/math/vector_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bd62869ec5bcff0fdf4ddc278abcb0e7e41bc30d", + "mode": "100644", + "size_bytes": 2431, + "sha256": "fad2583fcd1698fa271b1ccd1f657642726e3d9d202e64059a729d4de3eeda44" + }, + "working_tree": { + "exists": true, + "size_bytes": 2518, + "sha256": "4b7cd27e186d0cc818854d87e9540d182e952dfc2c3a372f67a656f4d4d4b873" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/math/vector_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "59d221b84447eaf88544a7a0bf5ad503dc6411dd", + "mode": "100644", + "size_bytes": 3400, + "sha256": "4fbc8cfd4e05a4ff66993bdaf70b2f1c9a304ac4db049558d4883b55bd93d15f" + }, + "working_tree": { + "exists": true, + "size_bytes": 3514, + "sha256": "d1f3266cdc2f7f4c586e7512fe090580a641b270ebe8b0525660fa4e737c788c" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 2518, + "sha256": "4b7cd27e186d0cc818854d87e9540d182e952dfc2c3a372f67a656f4d4d4b873" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/model/domain_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/model/domain_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "93425f489c4e7f6ffc730426cd4242435984903a", + "mode": "100644", + "size_bytes": 16744, + "sha256": "17a541d1c97b2b281ea27fb5c3fd24e45cf280c6ba5c1e66c7b52ddbf92d3fb3" + }, + "working_tree": { + "exists": true, + "size_bytes": 17115, + "sha256": "fc0dd95c444cac746db6083b88376bc8365ccd7d26790dd0dd6d51c3f41d6f77" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/model/domain_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "93425f489c4e7f6ffc730426cd4242435984903a", + "mode": "100644", + "size_bytes": 16744, + "sha256": "17a541d1c97b2b281ea27fb5c3fd24e45cf280c6ba5c1e66c7b52ddbf92d3fb3" + }, + "working_tree": { + "exists": true, + "size_bytes": 17115, + "sha256": "fc0dd95c444cac746db6083b88376bc8365ccd7d26790dd0dd6d51c3f41d6f77" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 17115, + "sha256": "fc0dd95c444cac746db6083b88376bc8365ccd7d26790dd0dd6d51c3f41d6f77" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/model/model_types_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/model/model_types_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "0237d699c86d109adb47a13667cb159a6d243cf9", + "mode": "100644", + "size_bytes": 7080, + "sha256": "52a8b3e8e1b21c9ec0dc7531e5580af92684259c1f2d05465a6d21db4736b6a0" + }, + "working_tree": { + "exists": true, + "size_bytes": 7247, + "sha256": "8e73c0944e4a0592a63c397fe368b2568b35f9b176af5cb8a5f7eb409dd4556c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/model/model_types_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0237d699c86d109adb47a13667cb159a6d243cf9", + "mode": "100644", + "size_bytes": 7080, + "sha256": "52a8b3e8e1b21c9ec0dc7531e5580af92684259c1f2d05465a6d21db4736b6a0" + }, + "working_tree": { + "exists": true, + "size_bytes": 7247, + "sha256": "8e73c0944e4a0592a63c397fe368b2568b35f9b176af5cb8a5f7eb409dd4556c" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 7247, + "sha256": "8e73c0944e4a0592a63c397fe368b2568b35f9b176af5cb8a5f7eb409dd4556c" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/model/shell_geometry_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/model/shell_geometry_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "41ab69191c7be51d938f23c749ec7a9ca4692dc6", + "mode": "100644", + "size_bytes": 12091, + "sha256": "786f4e32e0dfaa6273f77d42b7c2dde85644f0f07400cbc925faf89254f605c2" + }, + "working_tree": { + "exists": true, + "size_bytes": 12376, + "sha256": "9fee2fde5365fea4144fc87591e88e48dfd45376f3dd0ead45f9b7246fff1b3f" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/model/shell_geometry_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "460b716e97cdc38460a96be6d2bea47669fbec00", + "mode": "100644", + "size_bytes": 12613, + "sha256": "63c5ebc37637884535068fa57b8665f483557e5eb6aa621957fdb46c194bc2f7" + }, + "working_tree": { + "exists": true, + "size_bytes": 12909, + "sha256": "3abea01e7cb6543d3f25106cfa97ad5f94c9166a91bf90fbd390a700401d6d9f" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12376, + "sha256": "9fee2fde5365fea4144fc87591e88e48dfd45376f3dd0ead45f9b7246fff1b3f" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/model/source_target_resolver_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/model/source_target_resolver_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "fc94cb8249771ad297bd6630aae5f6a77e497cae", + "mode": "100644", + "size_bytes": 5728, + "sha256": "a336a7b8397bc3691aeee5889f44d1c3226c0be523cfa72ad92e8dca9ed4c31a" + }, + "working_tree": { + "exists": true, + "size_bytes": 5863, + "sha256": "0fd2a3f57be9e3dcc6a0710f23d07618b100d9f8fa6d46945bf7951063145ebb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/model/source_target_resolver_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1aa6273946c44269987062775fc85df4f2176ef7", + "mode": "100644", + "size_bytes": 7631, + "sha256": "bc534b88e8d8cdfa740c9bf2be2673de0b5c3a9b18a8a5532bdf2b1ad3af6884" + }, + "working_tree": { + "exists": true, + "size_bytes": 7804, + "sha256": "5868bd88560af25dea83f385748c40d274712c9dc28a344fca03f3cab760f8d1" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5863, + "sha256": "0fd2a3f57be9e3dcc6a0710f23d07618b100d9f8fa6d46945bf7951063145ebb" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/model/thermal_semantics_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/model/thermal_semantics_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "08229aae845892127110afb9f632644f30539d75", + "mode": "100644", + "size_bytes": 12203, + "sha256": "99e7100816444e57d7bd1e1efa0805a96c212261c39a5dffaeb61a1973a93163" + }, + "working_tree": { + "exists": true, + "size_bytes": 12468, + "sha256": "e35fdae0a9d314a157526b4ebd72ff54eef3f8123b3646fd8f5f3c50b39bbaea" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/model/thermal_semantics_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "08229aae845892127110afb9f632644f30539d75", + "mode": "100644", + "size_bytes": 12203, + "sha256": "99e7100816444e57d7bd1e1efa0805a96c212261c39a5dffaeb61a1973a93163" + }, + "working_tree": { + "exists": true, + "size_bytes": 12468, + "sha256": "e35fdae0a9d314a157526b4ebd72ff54eef3f8123b3646fd8f5f3c50b39bbaea" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 12468, + "sha256": "e35fdae0a9d314a157526b4ebd72ff54eef3f8123b3646fd8f5f3c50b39bbaea" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/model/thermal_shell_geometry_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/model/thermal_shell_geometry_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4c7633da1f1f39ae466c6f14a950a2e12c3fef99", + "mode": "100644", + "size_bytes": 8494, + "sha256": "f8ddeededca968056cdb0990a9d8315b16c215c59eacf35990bc475e9abc9fd8" + }, + "working_tree": { + "exists": true, + "size_bytes": 8706, + "sha256": "754d05288c9ba4de3c7cba2153621be4af8489b5c7e0946e387ee86ffaa0776c" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/model/thermal_shell_geometry_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "6988e6532437f76d5063056d502b4307416e40e1", + "mode": "100644", + "size_bytes": 11483, + "sha256": "2e3e4b4cc46d47f7fa7269146ccb201d352d652ca6e450a24bdf6fa70179299f" + }, + "working_tree": { + "exists": true, + "size_bytes": 11761, + "sha256": "2011bdeb9d673496a31e6ee31317452fb401fbfefb928cd97d085c99406dd033" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 8706, + "sha256": "754d05288c9ba4de3c7cba2153621be4af8489b5c7e0946e387ee86ffaa0776c" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/properties/element_property_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/properties/element_property_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b406bbe12e9d8590a97599b8e9aa9bdb32599821", + "mode": "100644", + "size_bytes": 4139, + "sha256": "1cfd6f29c195964c3121a5661cfb693dbf7bf0341ae87a097087c4862fde8675" + }, + "working_tree": { + "exists": true, + "size_bytes": 4238, + "sha256": "37fe800c84baee1240c919337d93fdaf0b06540901fcf27c1de88b3cab07b049" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/properties/element_property_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "b406bbe12e9d8590a97599b8e9aa9bdb32599821", + "mode": "100644", + "size_bytes": 4139, + "sha256": "1cfd6f29c195964c3121a5661cfb693dbf7bf0341ae87a097087c4862fde8675" + }, + "working_tree": { + "exists": true, + "size_bytes": 4238, + "sha256": "37fe800c84baee1240c919337d93fdaf0b06540901fcf27c1de88b3cab07b049" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 4238, + "sha256": "37fe800c84baee1240c919337d93fdaf0b06540901fcf27c1de88b3cab07b049" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/results/result_records_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/results/result_records_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "a418ddf98144ca78bd3e03f3c92c97edb5086066", + "mode": "100644", + "size_bytes": 13338, + "sha256": "3f7b082dc709a72a1c7922e4a8e126915580bb7f2fefb0006565a5a50189cc07" + }, + "working_tree": { + "exists": true, + "size_bytes": 13625, + "sha256": "ee0513e6ac8e92851a82d5f5bc932f841483b2640413b105465b71bb77cb1ccb" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/results/result_records_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c35285c5eb7634943cd02829bbf74104ebee4d13", + "mode": "100644", + "size_bytes": 13415, + "sha256": "6a0e305b49c735c98167ee20d8332dbdeee559fe58f9d7d7ff2a97093fdffa05" + }, + "working_tree": { + "exists": true, + "size_bytes": 13705, + "sha256": "bb72829dd1c5a3b89f5fcca9ae669acf8bc90697a26a5aa0c4ad0cddd14ac83e" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13625, + "sha256": "ee0513e6ac8e92851a82d5f5bc932f841483b2640413b105465b71bb77cb1ccb" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/results/result_recovery_components_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/results/result_recovery_components_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "1f9a057ae988b15c68f8f4f8f0043edf11147ef7", + "mode": "100644", + "size_bytes": 29714, + "sha256": "e7fd119d3f1e4dbf7117462b040c8b621a3309fb5242b3428cac78ce87f2f0e9" + }, + "working_tree": { + "exists": true, + "size_bytes": 30343, + "sha256": "e5f882061497e99d8210a474c7f662c17de029fc7542ae8b4c7334a2be162c6d" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/results/result_recovery_components_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "91bcc79a1da7feea0fa7bd05f85400501c7ee958", + "mode": "100644", + "size_bytes": 28022, + "sha256": "046f01c01025a6a3b5aabd28098d22a7020413e950de8af02ef85f3968d00b35" + }, + "working_tree": { + "exists": true, + "size_bytes": 28615, + "sha256": "558db157e75e1cfb16f157c2ea2f181be03075ec5447d369c24eb0bc17047476" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 30343, + "sha256": "e5f882061497e99d8210a474c7f662c17de029fc7542ae8b4c7334a2be162c6d" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/results/result_recovery_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/results/result_recovery_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "c80bf81db64d592847a4b4f8849b2b69a123bd73", + "mode": "100644", + "size_bytes": 54070, + "sha256": "cedb3c15d9ebcd199673c22034cb8cd1e1e7f07339f9d6885870eb72e4d0de21" + }, + "working_tree": { + "exists": true, + "size_bytes": 55269, + "sha256": "7b9358cc8459e3ec9c7fd6384982951ff5520dca7ee1b41eb671976c79c254e6" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/results/result_recovery_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "c80bf81db64d592847a4b4f8849b2b69a123bd73", + "mode": "100644", + "size_bytes": 54070, + "sha256": "cedb3c15d9ebcd199673c22034cb8cd1e1e7f07339f9d6885870eb72e4d0de21" + }, + "working_tree": { + "exists": true, + "size_bytes": 55269, + "sha256": "7b9358cc8459e3ec9c7fd6384982951ff5520dca7ee1b41eb671976c79c254e6" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 55269, + "sha256": "7b9358cc8459e3ec9c7fd6384982951ff5520dca7ee1b41eb671976c79c254e6" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/results/results_writer_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/results/results_writer_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b2dceb8f1fadf96986cb15fc7caa37f7dedbb74a", + "mode": "100644", + "size_bytes": 677, + "sha256": "33272c49028087f879e966999cc2bcc48bc7750881a4eee92a48d84618909e6c" + }, + "working_tree": { + "exists": true, + "size_bytes": 700, + "sha256": "dab162df80e0126149d6fd61a4d6a18b71935517fd6f4567da8ab998310ebdb2" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/results/results_writer_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "a4842c77519286c7e72a38619c9766f1eb3d6880", + "mode": "100644", + "size_bytes": 9179, + "sha256": "4246182863783dbd7aa70e118590ebcc8a4594a82952c6f51328ce0f410e4c40" + }, + "working_tree": { + "exists": true, + "size_bytes": 9393, + "sha256": "afa4f1287a951645a1e9bd2c4cc5cb8603615670944362cf89f3780befd82dee" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 700, + "sha256": "dab162df80e0126149d6fd61a4d6a18b71935517fd6f4567da8ab998310ebdb2" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "52e3c31a48201e4afe3eca059b441a438844be1f", + "mode": "100644", + "size_bytes": 31445, + "sha256": "a1a16b5d6a0ac2ebc2fc1667fb86471a8d927ddac4a89d619b28db342faeff21" + }, + "working_tree": { + "exists": true, + "size_bytes": 32231, + "sha256": "eaebae0e4350e20ce66e07f762b7d2c867a06db4ad89afaac90c92bfc1d4ca61" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "52e3c31a48201e4afe3eca059b441a438844be1f", + "mode": "100644", + "size_bytes": 31445, + "sha256": "a1a16b5d6a0ac2ebc2fc1667fb86471a8d927ddac4a89d619b28db342faeff21" + }, + "working_tree": { + "exists": true, + "size_bytes": 32231, + "sha256": "eaebae0e4350e20ce66e07f762b7d2c867a06db4ad89afaac90c92bfc1d4ca61" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": true, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 32231, + "sha256": "eaebae0e4350e20ce66e07f762b7d2c867a06db4ad89afaac90c92bfc1d4ca61" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/solvers/linear/linear_solver_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/solvers/linear/linear_solver_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "b9b95aa10820d68dc2dca0b4d3a0027f7365c356", + "mode": "100644", + "size_bytes": 5197, + "sha256": "0911ea70bd9011657043a8c160d4e4c8e769f28714ac62639afa88135d3c5210" + }, + "working_tree": { + "exists": true, + "size_bytes": 5324, + "sha256": "f8ac257d9699d9c10673fcf5d315a0be18b2a37c88a245a16683b2cdca2bf6b3" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/solvers/linear/linear_solver_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "98025f342df5ea77cc7dc7468ba79e82395b1ebe", + "mode": "100644", + "size_bytes": 16777, + "sha256": "d6030c4f1ff7e283ebafd3bce792e05210bc5bfb8edcff7f3fe276c330e17614" + }, + "working_tree": { + "exists": true, + "size_bytes": 17187, + "sha256": "a5aa18ef7c3aedac56b92f87740e0fa5b59acdb8ccd714ae16cc54b732ddcee0" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 5324, + "sha256": "f8ac257d9699d9c10673fcf5d315a0be18b2a37c88a245a16683b2cdca2bf6b3" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "4758e70ccbae09e9ad8a42a71e3f433ca7a23931", + "mode": "100644", + "size_bytes": 12795, + "sha256": "4df88e09d5dc808626b13dae781e05826acf9af392ebac2deaabb85aa028775a" + }, + "working_tree": { + "exists": true, + "size_bytes": 13118, + "sha256": "b278df4853fd35b4a609df18ba48bf7d27eeba7a88d58b7ff00d759f5461ccff" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "1a6953efe4ad690b706cd660e8eab82e83a5c841", + "mode": "100644", + "size_bytes": 9958, + "sha256": "efbd4cb3e7818a3dc51d72442514f35158ead3ae4d3907bbab5ec493862b0cec" + }, + "working_tree": { + "exists": true, + "size_bytes": 10217, + "sha256": "27c0608a66a44ffba73d2d081a5689bece07002b272a0cc5443ce4457e35a8ae" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 13118, + "sha256": "b278df4853fd35b4a609df18ba48bf7d27eeba7a88d58b7ff00d759f5461ccff" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + }, + { + "target_path": "tests/unit/solvers/linear/tangent_solver_test.cpp", + "fesa_dev": { + "source_path": "tests/unit/solvers/linear/tangent_solver_test.cpp", + "source_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "git_blob": { + "oid": "bb7096fccdeccaf0f4fdca9b9b0b95588ce9eec0", + "mode": "100644", + "size_bytes": 9493, + "sha256": "d952c7ea0130d31a0b97973507d5f2bd22d609c2f528cf6c7e5460f6a6afb826" + }, + "working_tree": { + "exists": true, + "size_bytes": 9727, + "sha256": "c457f80368b1e01bab7e7d177c0bda8283d0590e7150e064c270f86c9a95e858" + }, + "working_tree_equals_blob": false + }, + "refactor": { + "source_path": "tests/unit/solvers/linear/tangent_solver_test.cpp", + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "git_blob": { + "oid": "0dab893b40219ada24471d038b4443c135eedc84", + "mode": "100644", + "size_bytes": 4605, + "sha256": "8ed78de792ec5a05a121085f8f17f6b9d4c265a889d661cf6806ff55506bf300" + }, + "working_tree": { + "exists": true, + "size_bytes": 4737, + "sha256": "b6c7c50cbf6f3b4472f9058ed517905a66a3dea42255867c451d0c308aba7507" + }, + "working_tree_equals_blob": false + }, + "policy": "integrate-content", + "working_trees_equal": false, + "integration_baseline_working_tree": { + "exists": true, + "size_bytes": 9727, + "sha256": "c457f80368b1e01bab7e7d177c0bda8283d0590e7150e064c270f86c9a95e858" + }, + "t2": { + "adoption": "Refactor initial new-API staging", + "old_assertion_baseline_commit": "7438c82744e5fad2db26ee900172d7067485b5ba", + "assertion_migration_owner": "T3", + "old_assertions_obsolete": false, + "execution": "deferred to T3 and later" + } + } + ], + "protected_working_tree_files": [ + { + "path": "reference/cantilever beam/cantilever beam displacements.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 1790, + "sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/cantilever beam/cantilever beam elemental forces.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 2508, + "sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/cantilever beam/cantilever beam reactions.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 1780, + "sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/cantilever beam/cantilever beam.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 2330, + "sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_dynlinear.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 37727, + "sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_dynlinear_U.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 9910691, + "sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_dynnonlinear.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 37734, + "sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_dynnonlinear_U.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 10044617, + "sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_freq.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 37526, + "sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_freq.txt", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 682, + "sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_linearstatic.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 37578, + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_linearstatic_RF.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 99617, + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_linearstatic_S.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 1041955, + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_linearstatic_U.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 99617, + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 37585, + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_RF.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 100943, + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_S.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 1049155, + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_U.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 100943, + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shell/shell displacements.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 5592, + "sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shell/shell reactions.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 5524, + "sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shell/shell stresses.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 43502, + "sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shell/shell.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 4770, + "sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shell-thermal/shell-thermal NodalTemperature.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 49065, + "sha256": "765b0d0f64c24cde6d033d6ef80e0267275a496c97e28d932466eb877810d3e5" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shell-thermal/shell-thermal.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 63528, + "sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shell-thermal/shell-thermal_log.txt", + "tracked": false, + "content": { + "exists": true, + "size_bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "policy": "preserve-in-place", + "integration_present": false, + "kind": "existing-log" + }, + { + "path": "reference/shell-thermal/shell-thermal_results.h5", + "tracked": false, + "content": { + "exists": true, + "size_bytes": 42770741, + "sha256": "f13076f5ea98469f2642d9ec8b3b4c16b8a6c9642347c4a71204c439d309370c" + }, + "policy": "preserve-in-place", + "integration_present": false, + "kind": "existing-result" + }, + { + "path": "reference/shellNL/shellNL displacements.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 7542, + "sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL/shellNL reactions.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 7443, + "sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL/shellNL stresses.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 54720, + "sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL/shellNL.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 4778, + "sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 138951, + "sha256": "422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 56615, + "sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 820, + "sha256": "20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 56552, + "sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "reference-original" + }, + { + "path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_log.txt", + "tracked": false, + "content": { + "exists": true, + "size_bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "policy": "preserve-in-place", + "integration_present": false, + "kind": "existing-log" + }, + { + "path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine_results.h5", + "tracked": false, + "content": { + "exists": true, + "size_bytes": 753422, + "sha256": "1a9cdace658451de0acecc783eaa0c938f7d2f6d004c57b3804af534c355d5c2" + }, + "policy": "preserve-in-place", + "integration_present": false, + "kind": "existing-result" + }, + { + "path": "reference/temp/shellNL-meshfine/shellNL-meshfine displacements.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 111184, + "sha256": "740819ff8aed0e279961581f7cdbfa12784cfba3a488c35a652e80103f64433f" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine/shellNL-meshfine reactions.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 108951, + "sha256": "aeb01c98c596792b0e5f2b86a81945cab0beb0c6969cfc6738c6f81df1f94363" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine/shellNL-meshfine stresses.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 1036869, + "sha256": "6d6213ab5db9d6b1f5fbd641367d08bacc805967b6c5a95bce0e1a5395377782" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine/shellNL-meshfine.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 56516, + "sha256": "40df1ce77311c8d799564a21a60f3bdebb8148d52cae22b7292fdfad32018220" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 111182, + "sha256": "2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 108923, + "sha256": "a2347f4e88e4b73c75abe7c23e96bcc696c16c1975e2440b3ad9bf7ecda5f2b6" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 1036876, + "sha256": "bc06f3324cc5d6655ded2939b3e1cb9d55a0359fa0d272a6958399464218a128" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 56665, + "sha256": "53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 110555, + "sha256": "18ec051d265e0bd2c441fe73c08e097b83ee85bc2eb32ffbe3af0dcb9cb89672" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 109000, + "sha256": "59348996e0ce80687c9eb2747eeabf84aced4ce97f8a56f0ffddbdca404a57a3" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 1036916, + "sha256": "933a72025a0e897fd65f81c913e53d1730bd551ce95cbdea96f9f99b10be8b18" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": "reference/temp/shellNL-meshfine_02/shellNL-meshfine_02.inp", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 56554, + "sha256": "daec7592489837b165d55382caeaf53e21d84d804aa38c73cbf35e5cc0bac3e5" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "excluded-reference" + }, + { + "path": ".codex/skills/fem-theory-query/.gitignore", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 15, + "sha256": "a0b0ae55b0ad8eb762fc546c1c44b7804b282a44bef9797d15ae7a53a859b272" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "skill-setting-or-historical-plan" + }, + { + "path": ".codex/skills/fem-theory-query/agents/openai.yaml", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 227, + "sha256": "798e8cc82f818a76d5d31cbdbe56e9180609fbb92e101ce36f5a15c3a9ec4580" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "skill-setting-or-historical-plan" + }, + { + "path": ".codex/skills/fem-theory-query/SKILL.md", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 2662, + "sha256": "a15ff36d478823e2577b64c5bcc2e8c5b2be393eef6022750c67419b380dfacc" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "skill-setting-or-historical-plan" + }, + { + "path": ".codex/skills/fem-theory-query/vault-path.example.txt", + "tracked": true, + "content": { + "exists": true, + "size_bytes": 189, + "sha256": "0c62dd97d000760c886463d7a93f70187c313007f45591180763f0c37769b528" + }, + "policy": "preserve-in-place", + "integration_present": true, + "kind": "skill-setting-or-historical-plan" + }, + { + "path": ".dryforge/001/handoff.md", + "tracked": false, + "content": { + "exists": true, + "size_bytes": 4011, + "sha256": "293707c06c6dd9369131ae3a41d1fd67e6ed523e5d2a12c2139ba74d7598a79d" + }, + "policy": "preserve-in-place", + "integration_present": false, + "kind": "skill-setting-or-historical-plan" + }, + { + "path": ".dryforge/001/plan.md", + "tracked": false, + "content": { + "exists": true, + "size_bytes": 10289, + "sha256": "31b3698b5999df3a284dec0374a78df9fc5f0b6f4c3f8074521a51c24a797d14" + }, + "policy": "preserve-in-place", + "integration_present": false, + "kind": "skill-setting-or-historical-plan" + }, + { + "path": ".dryforge/001/spec.md", + "tracked": false, + "content": { + "exists": true, + "size_bytes": 10211, + "sha256": "65aa0ea1aa7987a9bf8462aa077d072ff2738ebe1c77a7e6c67923b696fcb324" + }, + "policy": "preserve-in-place", + "integration_present": false, + "kind": "skill-setting-or-historical-plan" + } + ], + "shellnl_mapping": [ + { + "source": "reference/ShellNL/shellNL displacements.csv", + "target": "reference/shellNL/shellNL displacements.csv", + "working_tree_sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786", + "equal": true, + "action": "preserve existing lowercase Dev tracked path; no copy" + }, + { + "source": "reference/ShellNL/shellNL reactions.csv", + "target": "reference/shellNL/shellNL reactions.csv", + "working_tree_sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069", + "equal": true, + "action": "preserve existing lowercase Dev tracked path; no copy" + }, + { + "source": "reference/ShellNL/shellNL stresses.csv", + "target": "reference/shellNL/shellNL stresses.csv", + "working_tree_sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f", + "equal": true, + "action": "preserve existing lowercase Dev tracked path; no copy" + }, + { + "source": "reference/ShellNL/shellNL.inp", + "target": "reference/shellNL/shellNL.inp", + "working_tree_sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2", + "equal": true, + "action": "preserve existing lowercase Dev tracked path; no copy" + } + ], + "documentation": { + "authority": "Dev docs/README.md and feature README/formulation. Preserve equations/assumptions/adopted/research/historical distinctions. Do not restore PRD/ADR/obsolete workflow wholesale.", + "feature_readmes": [ + "docs/README.md", + "docs/calculation-performance/README.md", + "docs/cpp-object-oriented-modular-refactoring/README.md", + "docs/hex8-structural-analysis/README.md", + "docs/hht-implicit-dynamics/README.md", + "docs/linear-static-3d-euler-beam/README.md", + "docs/linear-static-mitc4-shell/README.md", + "docs/mitc4-shell-feast-eigen/README.md", + "docs/mitc4-shell-feast-eigen2/README.md", + "docs/nonlinear-static-newton-raphson/README.md", + "docs/shell-surface-pressure-load/README.md", + "docs/shell-transient-heat-transfer/README.md", + "docs/solver-core/README.md" + ], + "formulations": [ + "docs/hex8-structural-analysis/formulation.md", + "docs/hex8-structural-analysis/precision-formulation.md", + "docs/hht-implicit-dynamics/formulation-acceleration-recovery.md", + "docs/hht-implicit-dynamics/formulation-c08b-newton-research-20261012.md", + "docs/hht-implicit-dynamics/formulation-carried-a-noise.md", + "docs/hht-implicit-dynamics/formulation-dae-research-20261012.md", + "docs/hht-implicit-dynamics/formulation-fixed-null-basis.md", + "docs/hht-implicit-dynamics/formulation-graph-certificate-draft-20261012.md", + "docs/hht-implicit-dynamics/formulation-historical-docs-cleanup-20261004.md", + "docs/hht-implicit-dynamics/formulation-inertia-historical-docs-cleanup-20261004.md", + "docs/hht-implicit-dynamics/formulation-inertia.md", + "docs/hht-implicit-dynamics/formulation-momentum-research-20261012.md", + "docs/hht-implicit-dynamics/formulation-reduced-coordinate.md", + "docs/hht-implicit-dynamics/formulation.md", + "docs/linear-static-3d-euler-beam/formulation.md", + "docs/linear-static-mitc4-shell/formulation.md", + "docs/mitc4-shell-feast-eigen/formulation.md", + "docs/mitc4-shell-feast-eigen2/formulation-eigen.md", + "docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md", + "docs/mitc4-shell-feast-eigen2/formulation.md", + "docs/nonlinear-static-newton-raphson/formulation.md", + "docs/shell-surface-pressure-load/formulation.md", + "docs/shell-transient-heat-transfer/formulation.md" + ], + "region_guidance": [ + "AGENTS.md", + "cmake/AGENTS.md", + "include/fesa/AGENTS.md", + "src/fesa/AGENTS.md", + "src/fesa/analysis/AGENTS.md", + "src/fesa/app/AGENTS.md", + "src/fesa/assembly/AGENTS.md", + "src/fesa/constraints/AGENTS.md", + "src/fesa/core/AGENTS.md", + "src/fesa/elements/AGENTS.md", + "src/fesa/fem/AGENTS.md", + "src/fesa/io/abaqus/AGENTS.md", + "src/fesa/io/hdf5/AGENTS.md", + "src/fesa/loads/AGENTS.md", + "src/fesa/materials/AGENTS.md", + "src/fesa/math/AGENTS.md", + "src/fesa/model/AGENTS.md", + "src/fesa/properties/AGENTS.md", + "src/fesa/results/AGENTS.md", + "src/fesa/solvers/eigen/AGENTS.md", + "src/fesa/solvers/linear/AGENTS.md", + "tests/AGENTS.md" + ], + "selective_refactor_content": [ + { + "source": "docs/tracking/object-copy-verification.md; final-architecture-fix-architecture.md; final-architecture-fix-verification.md; t13-architecture.md", + "target": "Dev docs/cpp-object-oriented-modular-refactoring/README.md", + "purpose": "ownership/copy-removal/dependency boundaries, bounded historical evidence and limitations" + }, + { + "source": "docs/tracking/build-bootstrap.md; docs/operations.md", + "target": "Dev docs/solver-core/README.md", + "purpose": "direct MSBuild primary, CMake/Ninja auxiliary and local dependency/runtime setup; do not hardcode personal paths" + }, + { + "source": "docs/TOLERANCE.md; feature io.md/reference-model.md", + "target": "corresponding current Dev feature README", + "purpose": "only unique useful identity/comparison details with current scope/limitations retained" + } + ] + }, + "comparison": { + "status": "NOT_RUN_T1", + "policies": { + "common-reference-tolerance": "S=max(abs(reference)) per case/step/frame/quantity/unit/coordinate/disposition family; B=.01S, abs(ref)<=B => abs(error)<=B else relative<=.05; family RMS/S<=.01; S=0 exact zero. Schema/identity/location/finite/missing/extra/duplicate prechecks always blocking.", + "mitc4-eigen-first-implementation": "shell eigen2 singleton Value only row<=.05 RMS<=.05, retain near-zero/zero/prechecks and internal1e-10; never apply to Hex8" + }, + "cases": [ + { + "case_id": "b33", + "feature_readme": "docs/linear-static-3d-euler-beam/README.md", + "input_path": "reference/cantilever beam/cantilever beam.inp", + "input_working_tree_sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3", + "step_frame": "Step-1/frame0", + "policy": "common-reference-tolerance", + "comparator": "tests/reference/reference_comparison.cpp; b33_reference_comparison_test.cpp", + "quantity_and_disposition": "11 nodes global U/UR, constrained RF/RM and source element endpoint actions blocking; stress external N/A, no endpoint averaging", + "materials": [ + { + "path": "reference/cantilever beam/cantilever beam.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 2330, + "sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + }, + "integration": { + "exists": true, + "size_bytes": 2330, + "sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + }, + "refactor": { + "exists": true, + "size_bytes": 2330, + "sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/cantilever beam/cantilever beam displacements.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 1790, + "sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + }, + "integration": { + "exists": true, + "size_bytes": 1790, + "sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + }, + "refactor": { + "exists": true, + "size_bytes": 1790, + "sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/cantilever beam/cantilever beam reactions.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 1780, + "sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + }, + "integration": { + "exists": true, + "size_bytes": 1780, + "sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + }, + "refactor": { + "exists": true, + "size_bytes": 1780, + "sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/cantilever beam/cantilever beam elemental forces.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 2508, + "sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + }, + "integration": { + "exists": true, + "size_bytes": 2508, + "sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + }, + "refactor": { + "exists": true, + "size_bytes": 2508, + "sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "shell-s4", + "feature_readme": "docs/linear-static-mitc4-shell/README.md", + "input_path": "reference/shell/shell.inp", + "input_working_tree_sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf", + "step_frame": "Step-1/frame0", + "policy": "common-reference-tolerance", + "comparator": "tests/reference/mitc4_reference_comparison.cpp; mitc4_reference_cases_test.cpp; nonlinear_static_reference_cases_test.cpp", + "quantity_and_disposition": "49 nodes/36 S4; U1-3 blocking, UR1-3 warning-only; source frame/instance/node/component; stress external equality excluded", + "materials": [ + { + "path": "reference/shell/shell.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 4770, + "sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + }, + "integration": { + "exists": true, + "size_bytes": 4770, + "sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + }, + "refactor": { + "exists": true, + "size_bytes": 4770, + "sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shell/shell displacements.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 5592, + "sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + }, + "integration": { + "exists": true, + "size_bytes": 5592, + "sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + }, + "refactor": { + "exists": true, + "size_bytes": 5592, + "sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shell/shell reactions.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 5524, + "sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + }, + "integration": { + "exists": true, + "size_bytes": 5524, + "sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + }, + "refactor": { + "exists": true, + "size_bytes": 5524, + "sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shell/shell stresses.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 43502, + "sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + }, + "integration": { + "exists": true, + "size_bytes": 43502, + "sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + }, + "refactor": { + "exists": true, + "size_bytes": 43502, + "sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "shellNL", + "feature_readme": "docs/nonlinear-static-newton-raphson/README.md", + "input_path": "reference/shellNL/shellNL.inp", + "input_working_tree_sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2", + "step_frame": "factor-one final accepted frame", + "policy": "common-reference-tolerance", + "comparator": "tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts + nonlinear_static_reference_cases_test.cpp; _02 is README-only follow-up gap", + "quantity_and_disposition": "U1-3 blocking; UR1-3 warning-only; constrained local RF1-3/spatial RM1-2 review-only; RM3/stress external equality excluded. Fine/pressure canonical material absence is not satisfied by excluded reference/temp.", + "materials": [ + { + "path": "reference/shellNL/shellNL.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 4778, + "sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + }, + "integration": { + "exists": true, + "size_bytes": 4778, + "sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + }, + "refactor": { + "exists": true, + "size_bytes": 4778, + "sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shellNL/shellNL displacements.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 7542, + "sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + }, + "integration": { + "exists": true, + "size_bytes": 7542, + "sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + }, + "refactor": { + "exists": true, + "size_bytes": 7542, + "sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shellNL/shellNL reactions.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 7443, + "sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + }, + "integration": { + "exists": true, + "size_bytes": 7443, + "sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + }, + "refactor": { + "exists": true, + "size_bytes": 7443, + "sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shellNL/shellNL stresses.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 54720, + "sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + }, + "integration": { + "exists": true, + "size_bytes": 54720, + "sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + }, + "refactor": { + "exists": true, + "size_bytes": 54720, + "sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "shellNL-meshfine", + "feature_readme": "docs/nonlinear-static-newton-raphson/README.md", + "input_path": "reference/shellNL-meshfine/shellNL-meshfine.inp", + "input_working_tree_sha256": null, + "step_frame": "factor-one final accepted frame", + "policy": "common-reference-tolerance", + "comparator": "tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts + nonlinear_static_reference_cases_test.cpp; _02 is README-only follow-up gap", + "quantity_and_disposition": "U1-3 blocking; UR1-3 warning-only; constrained local RF1-3/spatial RM1-2 review-only; RM3/stress external equality excluded. Fine/pressure canonical material absence is not satisfied by excluded reference/temp.", + "materials": [ + { + "path": "reference/shellNL-meshfine/shellNL-meshfine.inp", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine/shellNL-meshfine displacements.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine/shellNL-meshfine reactions.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine/shellNL-meshfine stresses.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + } + ], + "material_readiness": "missing-required-canonical-material", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "shellNL-meshfine_02", + "feature_readme": "docs/nonlinear-static-newton-raphson/README.md", + "input_path": "reference/shellNL-meshfine_02/shellNL-meshfine_02.inp", + "input_working_tree_sha256": null, + "step_frame": "factor-one final accepted frame", + "policy": "common-reference-tolerance", + "comparator": "tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts + nonlinear_static_reference_cases_test.cpp; _02 is README-only follow-up gap", + "quantity_and_disposition": "U1-3 blocking; UR1-3 warning-only; constrained local RF1-3/spatial RM1-2 review-only; RM3/stress external equality excluded. Fine/pressure canonical material absence is not satisfied by excluded reference/temp.", + "materials": [ + { + "path": "reference/shellNL-meshfine_02/shellNL-meshfine_02.inp", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + } + ], + "material_readiness": "missing-required-canonical-material", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "shellNL-meshfine-pressure", + "feature_readme": "docs/shell-surface-pressure-load/README.md", + "input_path": "reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp", + "input_working_tree_sha256": null, + "step_frame": "factor-one final accepted frame", + "policy": "common-reference-tolerance", + "comparator": "tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts + nonlinear_static_reference_cases_test.cpp; _02 is README-only follow-up gap", + "quantity_and_disposition": "U1-3 blocking; UR1-3 warning-only; constrained local RF1-3/spatial RM1-2 review-only; RM3/stress external equality excluded. Fine/pressure canonical material absence is not satisfied by excluded reference/temp.", + "materials": [ + { + "path": "reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + }, + { + "path": "reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv", + "fesa_dev": { + "exists": false + }, + "integration": { + "exists": false + }, + "refactor": { + "exists": false + }, + "excluded_temp_candidate_exists": true + } + ], + "material_readiness": "missing-required-canonical-material", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "shell-eigen", + "feature_readme": "docs/mitc4-shell-feast-eigen2/README.md", + "input_path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp", + "input_working_tree_sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339", + "step_frame": "source Step-2/modal IDs1..10; storage Step-1", + "policy": "mitc4-eigen-first-implementation", + "comparator": "tests/reference/eigen_reference_comparison.cpp; eigen_reference_cases_test.cpp", + "quantity_and_disposition": "raw Value=lambda 1/time^2 singleton per source mode blocking, no Freq reconstruction/nearest matching; internal all-c residual/Gram/normalization1e-10", + "materials": [ + { + "path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 56552, + "sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339" + }, + "integration": { + "exists": true, + "size_bytes": 56552, + "sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339" + }, + "refactor": { + "exists": true, + "size_bytes": 56552, + "sha256": "913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt", + "fesa_dev": { + "exists": true, + "size_bytes": 820, + "sha256": "20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b" + }, + "integration": { + "exists": true, + "size_bytes": 820, + "sha256": "20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b" + }, + "refactor": { + "exists": true, + "size_bytes": 820, + "sha256": "20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "shell-hht", + "feature_readme": "docs/hht-implicit-dynamics/README.md", + "input_path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp", + "input_working_tree_sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5", + "step_frame": "Step-1/101 frames0..100 h=.1 T=10", + "policy": "common-reference-tolerance", + "comparator": "Refactor scripts/verification/compare_hht_dynamic.py; tests/test_compare_hht_dynamic.py", + "quantity_and_disposition": "all729-node/101-frame schema/identity/finite precheck before fixed9-node [2,21,22,69,70,165,309,442,586] projection; U1-3 blocking27 scalars/frame, UR1-3 warning-only; no v/a/A/energy external oracle", + "materials": [ + { + "path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 56615, + "sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5" + }, + "integration": { + "exists": true, + "size_bytes": 56615, + "sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5" + }, + "refactor": { + "exists": true, + "size_bytes": 56615, + "sha256": "b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 138951, + "sha256": "422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5" + }, + "integration": { + "exists": true, + "size_bytes": 138951, + "sha256": "422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5" + }, + "refactor": { + "exists": true, + "size_bytes": 138951, + "sha256": "422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "hexa_linearstatic", + "feature_readme": "docs/hex8-structural-analysis/README.md", + "input_path": "reference/hexa/hexa_linearstatic.inp", + "input_working_tree_sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647", + "step_frame": "Step-1/increment10 factor1", + "policy": "common-reference-tolerance", + "comparator": "Refactor scripts/verification/compare_hex8.py; tests/test_compare_hex8.py", + "quantity_and_disposition": "442x3 U, constrained RF projection after full442-node inventory, 300x8x6 point global Cauchy S blocking; lumped-reference mass; PART-1-1, source node/element/IntPt/component; GP order --- +-- -+- ++- --+ +-+ -++ +++", + "materials": [ + { + "path": "reference/hexa/hexa_linearstatic.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 37578, + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + "integration": { + "exists": true, + "size_bytes": 37578, + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + "refactor": { + "exists": true, + "size_bytes": 37578, + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_linearstatic_U.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 99617, + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + }, + "integration": { + "exists": true, + "size_bytes": 99617, + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + }, + "refactor": { + "exists": true, + "size_bytes": 99617, + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_linearstatic_RF.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 99617, + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + "integration": { + "exists": true, + "size_bytes": 99617, + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + "refactor": { + "exists": true, + "size_bytes": 99617, + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_linearstatic_S.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 1041955, + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + "integration": { + "exists": true, + "size_bytes": 1041955, + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + "refactor": { + "exists": true, + "size_bytes": 1041955, + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "hexa_nonlinearstatic", + "feature_readme": "docs/hex8-structural-analysis/README.md", + "input_path": "reference/hexa/hexa_nonlinearstatic.inp", + "input_working_tree_sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb", + "step_frame": "Step-1/increment10 factor1", + "policy": "common-reference-tolerance", + "comparator": "Refactor scripts/verification/compare_hex8.py; tests/test_compare_hex8.py", + "quantity_and_disposition": "442x3 U, constrained RF projection after full442-node inventory, 300x8x6 point global Cauchy S blocking; lumped-reference mass; PART-1-1, source node/element/IntPt/component; GP order --- +-- -+- ++- --+ +-+ -++ +++", + "materials": [ + { + "path": "reference/hexa/hexa_nonlinearstatic.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 37585, + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + "integration": { + "exists": true, + "size_bytes": 37585, + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + "refactor": { + "exists": true, + "size_bytes": 37585, + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_U.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 100943, + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + }, + "integration": { + "exists": true, + "size_bytes": 100943, + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + }, + "refactor": { + "exists": true, + "size_bytes": 100943, + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_RF.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 100943, + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + "integration": { + "exists": true, + "size_bytes": 100943, + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + "refactor": { + "exists": true, + "size_bytes": 100943, + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_S.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 1049155, + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + "integration": { + "exists": true, + "size_bytes": 1049155, + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + "refactor": { + "exists": true, + "size_bytes": 1049155, + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "hexa_freq", + "feature_readme": "docs/hex8-structural-analysis/README.md", + "input_path": "reference/hexa/hexa_freq.inp", + "input_working_tree_sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347", + "step_frame": "Step-1/modes1..10 Value", + "policy": "common-reference-tolerance", + "comparator": "Refactor scripts/verification/compare_hex8.py; tests/test_compare_hex8.py", + "quantity_and_disposition": "Mode1..10 Value=lambda blocking, common RMS1%, no shell eigen exception; lumped-reference mass; PART-1-1, source node/element/IntPt/component; GP order --- +-- -+- ++- --+ +-+ -++ +++", + "materials": [ + { + "path": "reference/hexa/hexa_freq.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 37526, + "sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347" + }, + "integration": { + "exists": true, + "size_bytes": 37526, + "sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347" + }, + "refactor": { + "exists": true, + "size_bytes": 37526, + "sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_freq.txt", + "fesa_dev": { + "exists": true, + "size_bytes": 682, + "sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370" + }, + "integration": { + "exists": true, + "size_bytes": 682, + "sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370" + }, + "refactor": { + "exists": true, + "size_bytes": 682, + "sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "hexa_dynlinear", + "feature_readme": "docs/hex8-structural-analysis/README.md", + "input_path": "reference/hexa/hexa_dynlinear.inp", + "input_working_tree_sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e", + "step_frame": "Step-1/101 frames0..100 h=.1 T=10", + "policy": "common-reference-tolerance", + "comparator": "Refactor scripts/verification/compare_hex8.py; tests/test_compare_hex8.py", + "quantity_and_disposition": "442x3 U blocking each frame; lumped-reference mass; PART-1-1, source node/element/IntPt/component; GP order --- +-- -+- ++- --+ +-+ -++ +++", + "materials": [ + { + "path": "reference/hexa/hexa_dynlinear.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 37727, + "sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e" + }, + "integration": { + "exists": true, + "size_bytes": 37727, + "sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e" + }, + "refactor": { + "exists": true, + "size_bytes": 37727, + "sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_dynlinear_U.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 9910691, + "sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5" + }, + "integration": { + "exists": true, + "size_bytes": 9910691, + "sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5" + }, + "refactor": { + "exists": true, + "size_bytes": 9910691, + "sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "hexa_dynnonlinear", + "feature_readme": "docs/hex8-structural-analysis/README.md", + "input_path": "reference/hexa/hexa_dynnonlinear.inp", + "input_working_tree_sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9", + "step_frame": "Step-1/101 frames0..100 h=.1 T=10", + "policy": "common-reference-tolerance", + "comparator": "Refactor scripts/verification/compare_hex8.py; tests/test_compare_hex8.py", + "quantity_and_disposition": "442x3 U blocking each frame; lumped-reference mass; PART-1-1, source node/element/IntPt/component; GP order --- +-- -+- ++- --+ +-+ -++ +++", + "materials": [ + { + "path": "reference/hexa/hexa_dynnonlinear.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 37734, + "sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9" + }, + "integration": { + "exists": true, + "size_bytes": 37734, + "sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9" + }, + "refactor": { + "exists": true, + "size_bytes": 37734, + "sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/hexa/hexa_dynnonlinear_U.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 10044617, + "sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226" + }, + "integration": { + "exists": true, + "size_bytes": 10044617, + "sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226" + }, + "refactor": { + "exists": true, + "size_bytes": 10044617, + "sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "thermal-original-diagnostic", + "feature_readme": "docs/shell-transient-heat-transfer/README.md", + "input_path": "reference/shell-thermal/shell-thermal.inp", + "input_working_tree_sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4", + "step_frame": "Step-1/t37/DOF11 bottom NT11", + "policy": "common-reference-tolerance", + "comparator": "tests/reference/thermal_reference_comparison.cpp; thermal_reference_cases_test.cpp", + "quantity_and_disposition": "729 nodes/676 DS4; CSV has no instance, bind hash-checked input unique instance. Diagnostic/nonblocking expected failure87/729, RMS .049674084615673214; cannot substitute new mandatory model/NT11 CSV", + "materials": [ + { + "path": "reference/shell-thermal/shell-thermal.inp", + "fesa_dev": { + "exists": true, + "size_bytes": 63528, + "sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4" + }, + "integration": { + "exists": true, + "size_bytes": 63528, + "sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4" + }, + "refactor": { + "exists": true, + "size_bytes": 63528, + "sha256": "955c8beec35ce53da5f5dd48785cf8c12fce726ebfde7eae40cf69dbf00d6ea4" + }, + "excluded_temp_candidate_exists": false + }, + { + "path": "reference/shell-thermal/shell-thermal NodalTemperature.csv", + "fesa_dev": { + "exists": true, + "size_bytes": 49065, + "sha256": "765b0d0f64c24cde6d033d6ef80e0267275a496c97e28d932466eb877810d3e5" + }, + "integration": { + "exists": true, + "size_bytes": 49065, + "sha256": "765b0d0f64c24cde6d033d6ef80e0267275a496c97e28d932466eb877810d3e5" + }, + "refactor": { + "exists": true, + "size_bytes": 49065, + "sha256": "765b0d0f64c24cde6d033d6ef80e0267275a496c97e28d932466eb877810d3e5" + }, + "excluded_temp_candidate_exists": false + } + ], + "material_readiness": "available", + "execution_status": "NOT_RUN_T1" + }, + { + "case_id": "thermal-new-mandatory", + "feature_readme": "docs/shell-transient-heat-transfer/README.md:122-133", + "input_path": null, + "input_working_tree_sha256": null, + "step_frame": null, + "quantity_and_disposition": "new mandatory NT11 comparison; approved model/CSV/source identity/time/hash not yet supplied", + "policy": "common-reference-tolerance", + "comparator": "not configured for new bundle", + "materials": [], + "material_readiness": "missing-required-new-model-and-CSV", + "execution_status": "NOT_RUN_T1" + } + ], + "actual_hexa_freq_Value_inventory": [ + { + "mode_id": 1, + "Value_text": "496.28", + "Freq_text": "3.5456" + }, + { + "mode_id": 2, + "Value_text": "496.28", + "Freq_text": "3.5456" + }, + { + "mode_id": 3, + "Value_text": "18302.", + "Freq_text": "21.531" + }, + { + "mode_id": 4, + "Value_text": "18302.", + "Freq_text": "21.531" + }, + { + "mode_id": 5, + "Value_text": "52797.", + "Freq_text": "36.570" + }, + { + "mode_id": 6, + "Value_text": "1.31213E+05", + "Freq_text": "57.651" + }, + { + "mode_id": 7, + "Value_text": "1.31214E+05", + "Freq_text": "57.651" + }, + { + "mode_id": 8, + "Value_text": "1.65943E+05", + "Freq_text": "64.834" + }, + { + "mode_id": 9, + "Value_text": "4.49258E+05", + "Freq_text": "106.68" + }, + { + "mode_id": 10, + "Value_text": "4.49260E+05", + "Freq_text": "106.68" + } + ], + "frozen_comparator_hash_contracts": [ + { + "path": "reference/hexa/hexa_dynlinear.inp", + "expected_sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e", + "observed_sha256": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_dynlinear_U.csv", + "expected_sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5", + "observed_sha256": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_dynnonlinear.inp", + "expected_sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9", + "observed_sha256": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_dynnonlinear_U.csv", + "expected_sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226", + "observed_sha256": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_freq.inp", + "expected_sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347", + "observed_sha256": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_freq.txt", + "expected_sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370", + "observed_sha256": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_linearstatic.inp", + "expected_sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647", + "observed_sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_linearstatic_RF.csv", + "expected_sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b", + "observed_sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_linearstatic_S.csv", + "expected_sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8", + "observed_sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_linearstatic_U.csv", + "expected_sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f", + "observed_sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic.inp", + "expected_sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb", + "observed_sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_RF.csv", + "expected_sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b", + "observed_sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_S.csv", + "expected_sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba", + "observed_sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_U.csv", + "expected_sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6", + "observed_sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6", + "matches": true, + "source": "Refactor scripts/verification/compare_hex8.py SOURCE_SHA256 (Windows working-tree bytes)" + }, + { + "path": "reference/shellNL/shellNL.inp", + "expected_sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2", + "observed_sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + }, + { + "path": "reference/shellNL/shellNL displacements.csv", + "expected_sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786", + "observed_sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + }, + { + "path": "reference/shellNL/shellNL reactions.csv", + "expected_sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069", + "observed_sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + }, + { + "path": "reference/shellNL/shellNL stresses.csv", + "expected_sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f", + "observed_sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + }, + { + "path": "reference/shell/shell.inp", + "expected_sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf", + "observed_sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + }, + { + "path": "reference/shell/shell displacements.csv", + "expected_sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b", + "observed_sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + }, + { + "path": "reference/shell/shell reactions.csv", + "expected_sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41", + "observed_sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + }, + { + "path": "reference/shell/shell stresses.csv", + "expected_sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7", + "observed_sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7", + "matches": true, + "source": "Dev tests/reference/nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + } + ], + "body_helper_evidence": [ + { + "repository": "fesa_dev", + "path": "docs/README.md", + "working_tree_sha256": "a9faa7423260c2b2f6b6e711482d7b13d0088a662d69807936c98db20c442c79", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "docs/calculation-performance/README.md", + "working_tree_sha256": "e76eb775421726eea281b88ee1421254a08b01b9f507e43868b5e28059d9af43", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "docs/cpp-object-oriented-modular-refactoring/README.md", + "working_tree_sha256": "a678e0640d87d552019e5fb6c573691b041bc5452c242928ed84727867b9510f", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "docs/hex8-structural-analysis/README.md", + "working_tree_sha256": "b0b0a78ff13b99b8d0e150ff08f6b8a599f0379f82937ba8afbc6e10600ab4df", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "docs/hht-implicit-dynamics/README.md", + "working_tree_sha256": "374db46e416c488e5c2ef586ac5b86ac48d24ac831189bad496fd3d62a348ddf", + "observations": [ + { + "line": 78, + "text": "Reference는 reference/shellNL-dyn-meshfine의 INP와 displacements CSV다. 전체729-node/" + } + ] + }, + { + "repository": "fesa_dev", + "path": "docs/linear-static-3d-euler-beam/README.md", + "working_tree_sha256": "8ac6aaf7231805659a93dd200e3f87669a21e75313edb043d0b8dc7d18fdcdfd", + "observations": [ + { + "line": 37, + "text": "| 원본 `reference/cantilever beam/` | 비교 의미 |" + } + ] + }, + { + "repository": "fesa_dev", + "path": "docs/linear-static-mitc4-shell/README.md", + "working_tree_sha256": "381134f552b6182322cc719ffdd6bea4f8ee94700f3f620cbf7471a4f2c7bfba", + "observations": [ + { + "line": 42, + "text": "| `reference/shell/shell.inp`와 `shell displacements.csv` | 49 nodes, 36 S4; global U1–3 blocking, UR1–3 warning-only |" + } + ] + }, + { + "repository": "fesa_dev", + "path": "docs/mitc4-shell-feast-eigen/README.md", + "working_tree_sha256": "c38b8def0d14ab23545f06bc99bbf087c95ad66ea4c102a51a86358f1972dd9f", + "observations": [ + { + "line": 38, + "text": "현재 reference는 `reference/shellNL-eigen-meshfine/`의 지정 input과 eigenvalues TXT다." + } + ] + }, + { + "repository": "fesa_dev", + "path": "docs/mitc4-shell-feast-eigen2/README.md", + "working_tree_sha256": "77c54e58643bb4e37f15f96114c0957ce6ad306eeaaa908d46dae026a2bc1e1a", + "observations": [ + { + "line": 47, + "text": "| `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp` | 유일한 source frequency step `Step-2`, N=10 |" + }, + { + "line": 78, + "text": "Retained shell/shellNL 회귀와 내부 검증 의무를 유지하며 `reference/temp` 제외 예제를 재사용하지 않는다." + } + ] + }, + { + "repository": "fesa_dev", + "path": "docs/nonlinear-static-newton-raphson/README.md", + "working_tree_sha256": "8d42136c6a2fbcf6acd590b60435cb03fa5d417326e0af3cecb30bdb5017c127", + "observations": [ + { + "line": 39, + "text": "| `reference/shell/` | linear-limit 회귀, 비선형 응답 evidence 아님 |" + }, + { + "line": 40, + "text": "| `reference/shellNL/` | 49 nodes·36 S4의 factor-one final displacement |" + }, + { + "line": 41, + "text": "| `reference/shellNL-meshfine/` | 729 nodes·676 S4의 factor-one final displacement |" + }, + { + "line": 42, + "text": "| `reference/shellNL-meshfine_02/` | 별도 후속 final-state 비교, 앞 사례의 단순 대체 아님 |" + } + ] + }, + { + "repository": "fesa_dev", + "path": "docs/shell-surface-pressure-load/README.md", + "working_tree_sha256": "b6ac40448045392c4c884eeb761c6a1c72a1e81084616d5d23f4ba1f5b75408d", + "observations": [ + { + "line": 47, + "text": "| `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | 729 nodes, 676 S4의 nonlinear follower pressure |" + }, + { + "line": 62, + "text": "[실제 구현](../../src/fesa/loads/shell_surface_pressure.cpp)은 reference/current geometry를 선택한다." + } + ] + }, + { + "repository": "fesa_dev", + "path": "docs/shell-transient-heat-transfer/README.md", + "working_tree_sha256": "a72664571702f4fa5e782b552f163978f0844ec96b101c7b683c5b2b78a9e8f0", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "docs/solver-core/README.md", + "working_tree_sha256": "d4da6270ddfe49cc8db6d534e833d81ea2d86235fe46af09bd6bb61fe0fa47bf", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/b33_reference_comparison_test.cpp", + "working_tree_sha256": "8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296", + "observations": [ + { + "line": 148, + "text": "TEST(B33ReferenceComparison, GeneratesAuthoritativeHdf5AndComparisonEvidence) {" + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/eigen_reference_cases_test.cpp", + "working_tree_sha256": "f91504b627d58c1ea91174e4d32575067afd8ad6f6e8e9ca79b0bce519a4e661", + "observations": [ + { + "line": 32, + "text": "TEST(EigenReference, RunsOriginalInputAndComparesAllModalFrameIdentities) {" + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/eigen_reference_comparison.cpp", + "working_tree_sha256": "b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/eigen_reference_comparison.h", + "working_tree_sha256": "96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/eigen_reference_comparison_test.cpp", + "working_tree_sha256": "f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a", + "observations": [ + { + "line": 55, + "text": "TEST(EigenReferenceComparison," + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/mitc4_reference_cases_test.cpp", + "working_tree_sha256": "60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745", + "observations": [ + { + "line": 178, + "text": "TEST(Mitc4S4Reference, PreservesS4AndWritesCommonMitc4Metadata) {" + }, + { + "line": 188, + "text": "TEST(Mitc4S4Reference, PassesBlockingUAndReportsEveryUrRow) {" + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/mitc4_reference_comparison.cpp", + "working_tree_sha256": "58ffb13b5dff2e34b3e57df1376627be96d8d0cd8691ca1f77568d5991f8a191", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/mitc4_reference_comparison.h", + "working_tree_sha256": "8bd6a36cb25ac102569f733fb560433f5352ddeb7788182e6bbd561da49e846c", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/mitc4_reference_comparison_test.cpp", + "working_tree_sha256": "84620741c644b7ae7ae1cfc527b6effa1fe32d47175b1755be6f337f8d20aa45", + "observations": [ + { + "line": 477, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 511, + "text": "TEST(Mitc4ReferenceComparison, RejectsInvalidInventoryBeforeNumericComparison) {" + }, + { + "line": 593, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 640, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 666, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 688, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 708, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 757, + "text": "TEST(Mitc4ReferenceComparison, RequiresOnlyDeclaredInputCsvAndHdf5) {" + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/nonlinear_static_reference_cases_test.cpp", + "working_tree_sha256": "d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269", + "observations": [ + { + "line": 114, + "text": "TEST(NonlinearStaticReference, AuditsEveryDeclaredArtifactBeforeExecution) {" + }, + { + "line": 122, + "text": "\"4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2\");" + }, + { + "line": 124, + "text": "\"5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F\");" + }, + { + "line": 130, + "text": "\"4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF\");" + }, + { + "line": 132, + "text": "\"2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7\");" + }, + { + "line": 136, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 204, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 248, + "text": "TEST(NonlinearStaticReference, AuditsRetainedStaticArtifacts) {" + }, + { + "line": 275, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 297, + "text": "TEST(NonlinearStaticReference, BlocksOnGlobalBalanceAndAcceptedFreeResidual) {" + }, + { + "line": 340, + "text": "TEST(" + }, + { + "line": 368, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 379, + "text": "fesa::test::EvaluateGlobalBalance(identity, 1.0e-8, 1.0, 0.0);" + }, + { + "line": 382, + "text": "EXPECT_EQ(*boundary.normalized_metric, 1.0e-8) << identity;" + }, + { + "line": 386, + "text": "std::nextafter(1.0e-8, std::numeric_limits::infinity()), 1.0," + }, + { + "line": 390, + "text": "EXPECT_GT(*above.normalized_metric, 1.0e-8) << identity;" + }, + { + "line": 395, + "text": "TEST(NonlinearStaticReference," + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/nonlinear_static_reference_comparison.cpp", + "working_tree_sha256": "e71f156cb5bede1369b6b2e0999d21c5e89e8af5516f74ced906811a3eca55f5", + "observations": [ + { + "line": 47, + "text": "constexpr double kInternalGlobalBalanceRelativeTolerance = 1.0e-8;" + }, + { + "line": 295, + "text": "\"53718CCC9B41C23FCC1B509A51D66F1347E87ACA43A74F1D6CEC4D2085F4B90E\"," + }, + { + "line": 298, + "text": "\"2FE53F98EAC9F04779100721C3EDF8049EB1DBFE733EBCBD819AEEED03B81198\"," + }, + { + "line": 330, + "text": "\"40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220\"}," + }, + { + "line": 332, + "text": "\"740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F\"}," + }, + { + "line": 334, + "text": "\"AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363\"}," + }, + { + "line": 336, + "text": "\"6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782\"}};" + }, + { + "line": 354, + "text": "\"4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2\"}," + }, + { + "line": 356, + "text": "\"4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786\"}," + }, + { + "line": 358, + "text": "\"001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069\"}," + }, + { + "line": 360, + "text": "\"5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F\"}};" + }, + { + "line": 378, + "text": "\"4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF\"}," + }, + { + "line": 380, + "text": "\"C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B\"}," + }, + { + "line": 382, + "text": "\"0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41\"}," + }, + { + "line": 384, + "text": "\"2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7\"}};" + }, + { + "line": 1516, + "text": "metric <= kInternalGlobalBalanceRelativeTolerance," + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/nonlinear_static_reference_comparison.h", + "working_tree_sha256": "6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/reference_comparison.cpp", + "working_tree_sha256": "9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602", + "observations": [ + { + "line": 1451, + "text": "stream << \",\\\"reference\\\":\";" + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/reference_comparison.h", + "working_tree_sha256": "1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/reference_comparison_test.cpp", + "working_tree_sha256": "2dca374a67a3c55239c2402d4cd9541444283ec49ffb685037f90dad09c0e82f", + "observations": [ + { + "line": 425, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 537, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 592, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 662, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 686, + "text": "TEST(ReferenceComparisonContract," + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/reference_tolerance_policy.cpp", + "working_tree_sha256": "b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/reference_tolerance_policy.h", + "working_tree_sha256": "9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/reference_tolerance_policy_test.cpp", + "working_tree_sha256": "be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f", + "observations": [ + { + "line": 27, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 55, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 72, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 94, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 107, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 118, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 134, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 156, + "text": "TEST(ReferenceTolerancePolicy," + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/shell_surface_pressure_reference_test.cpp", + "working_tree_sha256": "45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d", + "observations": [ + { + "line": 13, + "text": "TEST(ShellSurfacePressureReference," + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/thermal_reference_cases_test.cpp", + "working_tree_sha256": "f796b0d84b1289f58caa791fe2c380e1b28b4322030ed505476f39c788f0db86", + "observations": [ + { + "line": 16, + "text": "TEST(ThermalReference, OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic) {" + }, + { + "line": 18, + "text": "std::filesystem::path{FESA_TEST_SOURCE_DIR} / \"reference/shell-thermal\";" + } + ] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/thermal_reference_comparison.cpp", + "working_tree_sha256": "0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/thermal_reference_comparison.h", + "working_tree_sha256": "c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0", + "observations": [] + }, + { + "repository": "fesa_dev", + "path": "tests/reference/thermal_reference_comparison_test.cpp", + "working_tree_sha256": "d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e", + "observations": [ + { + "line": 171, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 205, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 222, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 253, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 284, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 301, + "text": "TEST(ThermalReferenceComparison," + } + ] + }, + { + "repository": "refactor", + "path": "scripts/verification/compare_hex8.py", + "working_tree_sha256": "691a33d6393cb57358fb10dc3711bae254f6eae1d2dcd035bb2a68a3a64423bb", + "observations": [ + { + "line": 3, + "text": "This entry point is intentionally restricted to reference/hexa's fixed original" + }, + { + "line": 25, + "text": "REFERENCE_DIRECTORY = ROOT / \"reference/hexa\"" + }, + { + "line": 40, + "text": "SOURCE_SHA256 = {" + }, + { + "line": 41, + "text": "\"hexa_dynlinear.inp\": \"f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e\"," + }, + { + "line": 42, + "text": "\"hexa_dynlinear_U.csv\": \"623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5\"," + }, + { + "line": 43, + "text": "\"hexa_dynnonlinear.inp\": \"1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9\"," + }, + { + "line": 44, + "text": "\"hexa_dynnonlinear_U.csv\": \"f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226\"," + }, + { + "line": 45, + "text": "\"hexa_freq.inp\": \"42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347\"," + }, + { + "line": 46, + "text": "\"hexa_freq.txt\": \"3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370\"," + }, + { + "line": 47, + "text": "\"hexa_linearstatic.inp\": \"67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647\"," + }, + { + "line": 48, + "text": "\"hexa_linearstatic_RF.csv\": \"3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b\"," + }, + { + "line": 49, + "text": "\"hexa_linearstatic_S.csv\": \"8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8\"," + }, + { + "line": 50, + "text": "\"hexa_linearstatic_U.csv\": \"1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f\"," + }, + { + "line": 51, + "text": "\"hexa_nonlinearstatic.inp\": \"7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb\"," + }, + { + "line": 52, + "text": "\"hexa_nonlinearstatic_RF.csv\": \"3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b\"," + }, + { + "line": 53, + "text": "\"hexa_nonlinearstatic_S.csv\": \"a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba\"," + }, + { + "line": 54, + "text": "\"hexa_nonlinearstatic_U.csv\": \"bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6\"," + }, + { + "line": 114, + "text": "require(sha256(path) == SOURCE_SHA256[f\"{case}.inp\"], \"source-input-hash-mismatch\", str(path))" + }, + { + "line": 678, + "text": "report[\"approved_input_sha256\"] = SOURCE_SHA256[f\"{case}.inp\"]" + }, + { + "line": 701, + "text": "require(report[\"identities\"][\"Value\"][\"sha256\"] == SOURCE_SHA256[\"hexa_freq.txt\"]," + }, + { + "line": 705, + "text": "require(report[\"identities\"][quantity][\"sha256\"] == SOURCE_SHA256[f\"{case}_{quantity}.csv\"]," + } + ] + }, + { + "repository": "refactor", + "path": "scripts/verification/compare_hht_dynamic.py", + "working_tree_sha256": "59e3e19177e63041c215208a2b9cad8e2d81569ca757d9fe31e588b22ba4a070", + "observations": [ + { + "line": 26, + "text": "NODE_LABELS = (2, 21, 22, 69, 70, 165, 309, 442, 586)" + }, + { + "line": 30, + "text": "FRAME_COUNT = 101" + }, + { + "line": 121, + "text": "require(len(nodes) == NODE_COUNT and set(NODE_LABELS) <= nodes.keys()," + }, + { + "line": 160, + "text": "expected = {(frame, label) for frame in range(FRAME_COUNT) for label in NODE_LABELS}" + }, + { + "line": 262, + "text": "accepted = dataset(file, f\"steps/{STEP}/accepted_frames\", (FRAME_COUNT,))" + }, + { + "line": 270, + "text": "and set(file[frame_path]) == {str(i) for i in range(FRAME_COUNT)}," + }, + { + "line": 272, + "text": "selection = [node_indices[label] for label in NODE_LABELS]" + }, + { + "line": 323, + "text": "\"accepted_frame_count\": FRAME_COUNT, \"checked_result_scalars\": NODE_COUNT * FRAME_COUNT * 6," + }, + { + "line": 324, + "text": "\"projected_node_labels\": list(NODE_LABELS)}" + }, + { + "line": 353, + "text": "rows.append({\"instance\": INSTANCE, \"node_label\": NODE_LABELS[index // 3]," + }, + { + "line": 390, + "text": "for frame in range(FRAME_COUNT):" + }, + { + "line": 393, + "text": "expected = [value for label in NODE_LABELS for value in reference[(frame, label)][first:first + 3]]" + }, + { + "line": 396, + "text": "\"reference_frame_count\": FRAME_COUNT, **evidence}" + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/b33_reference_comparison_test.cpp", + "working_tree_sha256": "8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296", + "observations": [ + { + "line": 148, + "text": "TEST(B33ReferenceComparison, GeneratesAuthoritativeHdf5AndComparisonEvidence) {" + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/eigen_reference_cases_test.cpp", + "working_tree_sha256": "4890fe18f1ff259890fbc9baf6f4f1c39fabd3bc0a42b8059581dfff7604aeb6", + "observations": [ + { + "line": 32, + "text": "TEST(EigenReference, RunsOriginalInputAndComparesAllModalFrameIdentities) {" + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/eigen_reference_comparison.cpp", + "working_tree_sha256": "b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/eigen_reference_comparison.h", + "working_tree_sha256": "96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/eigen_reference_comparison_test.cpp", + "working_tree_sha256": "f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a", + "observations": [ + { + "line": 55, + "text": "TEST(EigenReferenceComparison," + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/mitc4_reference_cases_test.cpp", + "working_tree_sha256": "60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745", + "observations": [ + { + "line": 178, + "text": "TEST(Mitc4S4Reference, PreservesS4AndWritesCommonMitc4Metadata) {" + }, + { + "line": 188, + "text": "TEST(Mitc4S4Reference, PassesBlockingUAndReportsEveryUrRow) {" + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/mitc4_reference_comparison.cpp", + "working_tree_sha256": "1e23f52e7a9ff7172bf67f5f9c3e460a05b86089b4df1f91566e502b3f7a3c69", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/mitc4_reference_comparison.h", + "working_tree_sha256": "51c8b78b44583986eeb175a839fd72a11ca5f3405bf016432da9563878c8f1f6", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/mitc4_reference_comparison_test.cpp", + "working_tree_sha256": "b886b3cf9a6d3569e73f6792ce8ff0a84052c81eb21d78a31245fc74033bf370", + "observations": [ + { + "line": 477, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 511, + "text": "TEST(Mitc4ReferenceComparison, RejectsInvalidInventoryBeforeNumericComparison) {" + }, + { + "line": 593, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 640, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 666, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 688, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 708, + "text": "TEST(Mitc4ReferenceComparison," + }, + { + "line": 757, + "text": "TEST(Mitc4ReferenceComparison, RequiresOnlyDeclaredInputCsvAndHdf5) {" + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/nonlinear_static_reference_cases_test.cpp", + "working_tree_sha256": "d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269", + "observations": [ + { + "line": 114, + "text": "TEST(NonlinearStaticReference, AuditsEveryDeclaredArtifactBeforeExecution) {" + }, + { + "line": 122, + "text": "\"4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2\");" + }, + { + "line": 124, + "text": "\"5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F\");" + }, + { + "line": 130, + "text": "\"4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF\");" + }, + { + "line": 132, + "text": "\"2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7\");" + }, + { + "line": 136, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 204, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 248, + "text": "TEST(NonlinearStaticReference, AuditsRetainedStaticArtifacts) {" + }, + { + "line": 275, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 297, + "text": "TEST(NonlinearStaticReference, BlocksOnGlobalBalanceAndAcceptedFreeResidual) {" + }, + { + "line": 340, + "text": "TEST(" + }, + { + "line": 368, + "text": "TEST(NonlinearStaticReference," + }, + { + "line": 379, + "text": "fesa::test::EvaluateGlobalBalance(identity, 1.0e-8, 1.0, 0.0);" + }, + { + "line": 382, + "text": "EXPECT_EQ(*boundary.normalized_metric, 1.0e-8) << identity;" + }, + { + "line": 386, + "text": "std::nextafter(1.0e-8, std::numeric_limits::infinity()), 1.0," + }, + { + "line": 390, + "text": "EXPECT_GT(*above.normalized_metric, 1.0e-8) << identity;" + }, + { + "line": 395, + "text": "TEST(NonlinearStaticReference," + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/nonlinear_static_reference_comparison.cpp", + "working_tree_sha256": "64d9fa7d7067830bedd7316e66d68c32839c7e701fa8f6a49421cbbcce3938a2", + "observations": [ + { + "line": 47, + "text": "constexpr double kInternalGlobalBalanceRelativeTolerance = 1.0e-8;" + }, + { + "line": 295, + "text": "\"53718CCC9B41C23FCC1B509A51D66F1347E87ACA43A74F1D6CEC4D2085F4B90E\"," + }, + { + "line": 298, + "text": "\"2FE53F98EAC9F04779100721C3EDF8049EB1DBFE733EBCBD819AEEED03B81198\"," + }, + { + "line": 330, + "text": "\"40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220\"}," + }, + { + "line": 332, + "text": "\"740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F\"}," + }, + { + "line": 334, + "text": "\"AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363\"}," + }, + { + "line": 336, + "text": "\"6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782\"}};" + }, + { + "line": 354, + "text": "\"4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2\"}," + }, + { + "line": 356, + "text": "\"4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786\"}," + }, + { + "line": 358, + "text": "\"001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069\"}," + }, + { + "line": 360, + "text": "\"5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F\"}};" + }, + { + "line": 378, + "text": "\"4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF\"}," + }, + { + "line": 380, + "text": "\"C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B\"}," + }, + { + "line": 382, + "text": "\"0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41\"}," + }, + { + "line": 384, + "text": "\"2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7\"}};" + }, + { + "line": 1515, + "text": "metric <= kInternalGlobalBalanceRelativeTolerance," + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/nonlinear_static_reference_comparison.h", + "working_tree_sha256": "6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/reference_comparison.cpp", + "working_tree_sha256": "9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602", + "observations": [ + { + "line": 1451, + "text": "stream << \",\\\"reference\\\":\";" + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/reference_comparison.h", + "working_tree_sha256": "1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/reference_comparison_test.cpp", + "working_tree_sha256": "e39732a6cb8747725a43f7fc6341fd4688d04cd3f9f936ec33cbc79b232886af", + "observations": [ + { + "line": 425, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 537, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 592, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 662, + "text": "TEST(ReferenceComparisonContract," + }, + { + "line": 686, + "text": "TEST(ReferenceComparisonContract," + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/reference_tolerance_policy.cpp", + "working_tree_sha256": "b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/reference_tolerance_policy.h", + "working_tree_sha256": "9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/reference_tolerance_policy_test.cpp", + "working_tree_sha256": "be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f", + "observations": [ + { + "line": 27, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 55, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 72, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 94, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 107, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 118, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 134, + "text": "TEST(ReferenceTolerancePolicy," + }, + { + "line": 156, + "text": "TEST(ReferenceTolerancePolicy," + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/shell_surface_pressure_reference_test.cpp", + "working_tree_sha256": "45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d", + "observations": [ + { + "line": 13, + "text": "TEST(ShellSurfacePressureReference," + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/thermal_reference_cases_test.cpp", + "working_tree_sha256": "8b340c31cb028e1cf8e676f35869cb74d923c7e3f05d5ed8d3cc428722b4aed3", + "observations": [ + { + "line": 16, + "text": "TEST(ThermalReference, OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic) {" + }, + { + "line": 18, + "text": "std::filesystem::path{FESA_TEST_BINARY_DIR} / \"reference/thermal-execution\";" + }, + { + "line": 23, + "text": "std::filesystem::path{FESA_TEST_SOURCE_DIR} / \"reference/shell-thermal\" / name," + } + ] + }, + { + "repository": "refactor", + "path": "tests/reference/thermal_reference_comparison.cpp", + "working_tree_sha256": "0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/thermal_reference_comparison.h", + "working_tree_sha256": "c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0", + "observations": [] + }, + { + "repository": "refactor", + "path": "tests/reference/thermal_reference_comparison_test.cpp", + "working_tree_sha256": "d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e", + "observations": [ + { + "line": 171, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 205, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 222, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 253, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 284, + "text": "TEST(ThermalReferenceComparison," + }, + { + "line": 301, + "text": "TEST(ThermalReferenceComparison," + } + ] + } + ] + }, + "required_later_checks": [ + { + "name": "MSVC x64 Debug all native", + "commands": [ + "MSBuild FESA.sln /m:2 /p:Configuration=Debug /p:Platform=x64", + "discover and execute complete native unit/integration/reference identity set" + ], + "requires": [ + "FESA.sln + msvc tracked configs", + "both valid test/oracle sets", + "configured compiler/dependency/runtime environment" + ], + "status": "NOT_RUN_T1" + }, + { + "name": "CMake/CTest Debug", + "commands": [ + "cmake --preset windows-msvc-ninja-debug", + "cmake --build --preset windows-msvc-ninja-debug", + "ctest --preset windows-msvc-ninja-debug --show-only=json-v1", + "ctest --preset windows-msvc-ninja-debug --output-on-failure" + ], + "requires": [ + "merged CMake target graph/presets", + "local packages", + "nonzero discovery and native identity parity" + ], + "status": "NOT_RUN_T1" + }, + { + "name": "Python suites", + "sources": [ + "Dev tests/test_cpp_policy_contract.py", + "Refactor tests/test_compare_hex8.py", + "Refactor tests/test_compare_hht_dynamic.py" + ], + "requires": [ + "preserved pytest.ini", + "imported comparison scripts", + "pytest/numpy/h5py" + ], + "status": "NOT_RUN_T1; separate from CTest" + }, + { + "name": "mandatory case comparisons", + "requires": "all comparison.cases materials with exact input bytes, quantities, frames and dispositions", + "execution_location": "new isolated input copy only; never overwrite root reference/result/log", + "status": "NOT_RUN_T1; missing materials do not count as PASS" + } + ], + "external_raw_evidence": { + "repository": "C:/git/FESADEV_Refactor", + "policy": "preserve ignored raw in place, never import existing build/obj/exe/DLL; historical claims are not current PASS", + "tree_states": [ + { + "path": "C:/git/FESADEV_Refactor/.build/master-integration-20261016", + "exists": true, + "file_count": 6, + "size_bytes": 5045644, + "metadata_sha256": "4066a873bc764ed4c48ab762a5d74260ec3495bf12d38392f1acbb1d83380cdf", + "unfollowed_reparse_points": [] + }, + { + "path": "C:/git/FESADEV_Refactor/.build/object-copy-20261016", + "exists": true, + "file_count": 784, + "size_bytes": 2566690756, + "metadata_sha256": "a035fcc155cf480a9edfa4eaf85895a22c64360b7cd5604fb6afed50828fbc20", + "unfollowed_reparse_points": [] + }, + { + "path": "C:/git/FESADEV_Refactor/.build/performance-baseline-headers", + "exists": true, + "file_count": 136, + "size_bytes": 388525, + "metadata_sha256": "96770efe15b56ab41f315372f9d4e165e04790d0080552c06884cdc95d71f89a", + "unfollowed_reparse_points": [] + }, + { + "path": "C:/git/FESADEV_Refactor/.build/verification-archive", + "exists": true, + "file_count": 17754, + "size_bytes": 15366175215, + "metadata_sha256": "563f242166ad983b72d3fb92224fce379c1d7627eb0584e35e1657c1727ed960", + "unfollowed_reparse_points": [] + }, + { + "path": "C:/git/FESADEV_Refactor/.build/vtune-shellnl-20261016", + "exists": true, + "file_count": 559, + "size_bytes": 235864599, + "metadata_sha256": "245102a487eec418750b6238fef297fb9af66b70ae9afb7753723f5314df6aec", + "unfollowed_reparse_points": [] + } + ], + "receipt_files": [ + { + "path": "C:/git/FESADEV_Refactor/.build/object-copy-finish-20261016.json", + "content": { + "exists": true, + "size_bytes": 1108, + "sha256": "fc54a429981ca260c970709fec00e658080d93abaffda1c4be4be49334f52c5f" + } + }, + { + "path": "C:/git/FESADEV_Refactor/.build/object-copy-integration-20261016.json", + "content": { + "exists": true, + "size_bytes": 1117, + "sha256": "b92052d2e844561be15330e6dfcf16352d6067a2dbc39509258167928ca61e4b" + } + }, + { + "path": "C:/git/FESADEV_Refactor/.build/object-copy-transfer-20261016.json", + "content": { + "exists": true, + "size_bytes": 143497, + "sha256": "4544acea2f29eb04b08ac5141ef857e7fbcccaacadd2d3efca6a0d87155c3c40" + } + } + ], + "documented_path_presence": [ + { + "path": "C:/git/FESADEV_Refactor/.build/env.cmd", + "exists": false + }, + { + "path": "C:/git/FESADEV_Refactor/.build/t13", + "exists": false + }, + { + "path": "C:/git/FESADEV_Refactor/.build/final-architecture-fix", + "exists": false + }, + { + "path": "C:/git/FESADEV_Refactor/.build/object-copy-20261016/after", + "exists": true + }, + { + "path": "C:/git/FESADEV_Refactor/.build/object-copy-20261016/comparison", + "exists": true + }, + { + "path": "C:/git/FESADEV_Refactor/.build/verification-archive", + "exists": true + } + ], + "metadata_hash_definition": "SHA256 UTF8 compact JSON sorted [relative-path,size-bytes,mtime-ns] rows, no reparse traversal. Raw tree content is not fully rehashed; receipt content hashes are listed. This records preservation state, not numerical claim validation." + }, + "local_environment": { + "tool_versions": [ + { + "name": "MSBuild", + "path": "C:/Program Files/Microsoft Visual Studio/18/Community/MSBuild/Current/Bin/MSBuild.exe", + "exists": true, + "on_current_path": false, + "exit_code": 0, + "version_output": [ + "18.11.0.47511" + ] + }, + { + "name": "cl", + "path": "C:/Program Files/Microsoft Visual Studio/18/Community/VC/Tools/MSVC/14.51.36231/bin/Hostx64/x64/cl.exe", + "exists": true, + "on_current_path": false, + "exit_code": 0, + "version_output": [ + "MSVC cl.exe FileVersion 19.51.36260.0; ProductVersion 14.51.36260.0" + ], + "version_evidence": "read-only Get-Item cl.exe .VersionInfo; toolset directory 14.51.36231 does not itself establish current binary version" + }, + { + "name": "Ninja", + "path": "C:/Program Files/Microsoft Visual Studio/18/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe", + "exists": true, + "on_current_path": false, + "exit_code": 0, + "version_output": [ + "1.13.2" + ] + }, + { + "name": "CMake", + "path": "C:/Program Files/CMake/bin/cmake.EXE", + "exists": true, + "on_current_path": true, + "exit_code": 0, + "version_output": [ + "cmake version 4.4.0", + "", + "CMake suite maintained and supported by Kitware (kitware.com/cmake)." + ] + }, + { + "name": "CTest", + "path": "C:/Program Files/CMake/bin/ctest.EXE", + "exists": true, + "on_current_path": true, + "exit_code": 0, + "version_output": [ + "ctest version 4.4.0", + "", + "CMake suite maintained and supported by Kitware (kitware.com/cmake)." + ] + }, + { + "name": "Python", + "path": "C:/Users/baram/AppData/Local/hermes/hermes-agent/venv/Scripts/python.exe", + "exists": true, + "on_current_path": true, + "exit_code": 0, + "version_output": [ + "Python 3.11.15" + ] + } + ], + "visual_studio": { + "installation": "C:/Program Files/Microsoft Visual Studio/18/Community", + "developer_entry": "C:/Program Files/Microsoft Visual Studio/18/Community/Common7/Tools/VsDevCmd.bat", + "entry_exists": true, + "later_shell_setup": "call VsDevCmd.bat -arch=x64 -host_arch=x64; chcp65001 before CMake configure/build; T1 changes no environment" + }, + "dependencies": [ + { + "name": "GoogleTest", + "root": "C:/git/googletest", + "files": [ + { + "path": "C:/git/googletest/CMakeLists.txt", + "exists": true, + "size_bytes": 1022, + "sha256": "2bce2c6f698c2f86bf2099f3231d52aa029a52263049b486bffb0179c98a283f" + }, + { + "path": "C:/git/googletest/googletest/include/gtest/gtest.h", + "exists": true, + "size_bytes": 94841, + "sha256": "8f5ba021f8bca40acca7dda1df50fe6e391c7323f2bf25f849daebec2b4d73ef" + } + ], + "source": "Dev build/windows-msvc-ninja-debug/CMakeCache.txt and actual filesystem", + "git_head": "04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4", + "version_lines": [ + "cmake_minimum_required(VERSION 3.16)", + "set(GOOGLETEST_VERSION 1.16.0)" + ] + }, + { + "name": "oneMKL", + "root": "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1", + "files": [ + { + "path": "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl/MKLConfig.cmake", + "exists": true, + "size_bytes": 52058, + "sha256": "d7b0ca7e61dbbc41d4956ef3ae621f97a37292456ec6a27383f80971b3c44b5a" + }, + { + "path": "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/include/mkl_version.h", + "exists": true, + "size_bytes": 1274, + "sha256": "d02f9b23212882b8302d4a7a35bb72de9b0fdf663ceff51873807077912639cd" + } + ], + "source": "Dev build/windows-msvc-ninja-debug/CMakeCache.txt and actual filesystem", + "version_lines": [ + "#define __INTEL_MKL_BUILD_DATE 20260612", + "#define __INTEL_MKL__ 2026", + "#define __INTEL_MKL_MINOR__ 0", + "#define __INTEL_MKL_UPDATE__ 1", + "#define __INTEL_MKL_PATCH__ 0" + ] + }, + { + "name": "oneTBB", + "root": "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1", + "files": [ + { + "path": "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb/TBBConfig.cmake", + "exists": true, + "size_bytes": 6182, + "sha256": "8601734b38f4e98eb98ad4f1801b287f808b61d442ec72fe84b1ffc3a8c7363c" + }, + { + "path": "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/include/oneapi/tbb/version.h", + "exists": true, + "size_bytes": 4375, + "sha256": "23e053d5fe9c290949c1370fa94cf614c772aa44dbb21e94083382a08bdaa3bb" + } + ], + "source": "Dev build/windows-msvc-ninja-debug/CMakeCache.txt and actual filesystem", + "version_lines": [ + "#define TBB_VERSION_MAJOR 2023", + "#define TBB_VERSION_MINOR 1", + "#define TBB_VERSION_PATCH 0", + "#define TBB_VERSION_STRING \\", + "#define TBB_VERSION_STRINGS_P(N) \\", + "#define TBB_VERSION_STRINGS TBB_VERSION_STRINGS_P(oneTBB)" + ] + }, + { + "name": "HDF5", + "root": "C:/Program Files/HDF_Group/HDF5/2.1.1", + "files": [ + { + "path": "C:/Program Files/HDF_Group/HDF5/2.1.1/cmake/hdf5-config.cmake", + "exists": true, + "size_bytes": 14335, + "sha256": "235b35cff9bf994dc693f3fdeb4288c8ea7e2e23f6131221b9c88320e461dedc" + }, + { + "path": "C:/Program Files/HDF_Group/HDF5/2.1.1/include/H5public.h", + "exists": true, + "size_bytes": 40652, + "sha256": "b1c026442abbe7bac478c0fc94a1d86821b5bb79e08b24e9a57a17bfb1b8576e" + } + ], + "source": "Dev build/windows-msvc-ninja-debug/CMakeCache.txt and actual filesystem", + "version_lines": [ + "#define H5_VERS_MAJOR 2", + "#define H5_VERS_MINOR 1", + "#define H5_VERS_RELEASE 1", + " * Valid: #define H5_VERS_SUBRELEASE \"\"", + " * Valid: #define H5_VERS_SUBRELEASE \"-snap0\"", + " * Invalid: #define H5_VERS_SUBRELEASE -snap0", + "#define H5_VERS_SUBRELEASE \"\"", + "#define H5_VERS_STR_HELPER(major, minor, release) #major \".\" #minor \".\" #release", + "#define H5_VERS_STR_CONCAT(major, minor, release, sub) H5_VERS_STR_HELPER(major, minor, release) sub", + "#define H5_VERS_STR H5_VERS_STR_CONCAT(H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE, H5_VERS_SUBRELEASE)", + "#define H5_VERS_INFO \"HDF5 library version: \" H5_VERS_STR" + ] + }, + { + "name": "Intel OpenMP/math runtime", + "root": "C:/Program Files (x86)/Intel/oneAPI/compiler/2026.1", + "version_observations": { + "libiomp5md.dll": "20260213", + "libmmd.dll": "2026.0.0" + }, + "files": [ + { + "path": "C:/Program Files (x86)/Intel/oneAPI/compiler/2026.1/bin/libiomp5md.dll", + "exists": true, + "size_bytes": 1617536, + "sha256": "ee527c978999653eb18edc3ef372b4e95d4ad9a7691b6d08817be9d38c7d0a02" + }, + { + "path": "C:/Program Files (x86)/Intel/oneAPI/compiler/2026.1/bin/libmmd.dll", + "exists": true, + "size_bytes": 4380288, + "sha256": "1529f6b0066827fb01137cc37af1f6f5dea0aa203b5491770bbc05e85a61b794" + }, + { + "path": "C:/Program Files (x86)/Intel/oneAPI/compiler/2026.1/lib/libiomp5md.lib", + "exists": true, + "size_bytes": 271444, + "sha256": "f282d5c65dd65ff089de7047bd5adf901ad2356e14a9333f7bb122859f8f1ebf" + } + ], + "later_environment_variable": "FESA_OMP_ROOT", + "source": "actual filesystem existence and FileVersion, not historical build-bootstrap version claim" + } + ], + "scoped_environment_variables": { + "FESA_GTEST_SOURCE_DIR": null, + "FESA_MKL_ROOT": null, + "FESA_TBB_ROOT": null, + "FESA_HDF5_ROOT": null, + "FESA_OMP_ROOT": null, + "MKL_DIR": null, + "TBB_DIR": null, + "HDF5_DIR": null + }, + "python_packages": { + "pytest": { + "installed": false + }, + "h5py": { + "installed": false + }, + "numpy": { + "installed": false + } + }, + "preparation_status": "NOT_READY_CURRENT_SHELL: MSBuild/cl/Ninja absent from PATH and required dependency variables unset. Default Hermes Python lacks pytest/numpy/h5py; existing cached test Python has them. Installed roots/runtime candidates are listed for later setup. No automatic install/download.", + "historical_env_cmd_exists": false, + "existing_cached_test_interpreter": { + "path": "C:/Users/baram/AppData/Local/uv/cache/archive-v0/a_Fu78thpTA_hDVk/Scripts/python.exe", + "probe_argv": [ + "C:\\Users\\baram\\AppData\\Local\\uv\\cache\\archive-v0\\a_Fu78thpTA_hDVk\\Scripts\\python.exe", + "-B", + "-c", + "import importlib.metadata as m,importlib.util,json,sys; print(json.dumps({\"executable\":sys.executable,\"version\":sys.version,\"packages\":{n:{\"import_spec_exists\":importlib.util.find_spec(n) is not None,\"version\":m.version(n) if importlib.util.find_spec(n) is not None else None} for n in [\"pytest\",\"numpy\",\"h5py\",\"psutil\"]}}))" + ], + "probe_exit_code": 0, + "probe_result": { + "executable": "C:\\Users\\baram\\AppData\\Local\\uv\\cache\\archive-v0\\a_Fu78thpTA_hDVk\\Scripts\\python.exe", + "version": "3.11.15 (main, Jul 18 2026, 17:06:27) [MSC v.1944 64 bit (AMD64)]", + "packages": { + "pytest": { + "import_spec_exists": true, + "version": "9.1.1" + }, + "numpy": { + "import_spec_exists": true, + "version": "2.4.6" + }, + "h5py": { + "import_spec_exists": true, + "version": "3.16.0" + }, + "psutil": { + "import_spec_exists": false, + "version": null + } + } + }, + "evidence_source": "Refactor docs/tracking/object-copy-verification.md:34-36; actual read-only probe", + "action": "existing cache only, no package installation/download" + }, + "uv": { + "path": "C:/Users/baram/AppData/Local/hermes/bin/uv.exe", + "version": "0.11.31 (b7fdec626 2026-07-21 x86_64-pc-windows-msvc)", + "version_probe_exit_code": 0 + }, + "preserved_setting_states": [ + { + "path": ".clang-format", + "source_repository": "fesa_dev", + "status": "present/tracked; preserve baseline bytes", + "content": { + "exists": true, + "size_bytes": 55, + "sha256": "2689abf044bc3778ea606c8e94888296ec30f7c37205558ed1d8060bf36a8c9a" + } + }, + { + "path": ".clang-tidy", + "source_repository": "fesa_dev", + "status": "present/tracked; preserve baseline bytes", + "content": { + "exists": true, + "size_bytes": 1356, + "sha256": "92316704ded7c80b5d55bb1fb50639933cf01e72fce26e6adf9cfcb84941a90e" + } + }, + { + "path": "Doxyfile", + "source_repository": "fesa_dev", + "status": "present/tracked; preserve baseline bytes", + "content": { + "exists": true, + "size_bytes": 360, + "sha256": "47067e23f1b18605fa3e2729475e3532faec4b960baebc58c55eba41d6e63891" + } + }, + { + "path": "pytest.ini", + "source_repository": "fesa_dev", + "status": "present/tracked; preserve baseline bytes", + "content": { + "exists": true, + "size_bytes": 29, + "sha256": "ddfcf6e0017476e9b9e8e55559c80e166c21f4f1ac242c7468dc85ad9dc69e52" + } + } + ] + }, + "unresolved_items": [ + { + "kind": "missing-required-material", + "id": "canonical-fine-pressure", + "evidence": [ + "Dev nonlinear README:41-42", + "Dev pressure README:47-50", + "nonlinear_static_reference_comparison.cpp DeclaredArtifacts" + ], + "impact": "canonical fine/_02/pressure bundles missing; reference/temp excluded originals cannot satisfy readiness. _02 also lacks dedicated current test body." + }, + { + "kind": "missing-required-material", + "id": "new-thermal-reference", + "evidence": [ + "Dev thermal README:122-133" + ], + "impact": "approved new model/NT11 CSV identity/time/hash not yet supplied; existing diagnostic/nonblocking expected failure retained." + }, + { + "kind": "documentation-discrepancy", + "id": "global-balance-vs-free-residual", + "evidence": [ + "Dev nonlinear README:51", + "Dev pressure README:57", + "both nonlinear_static_reference_comparison.cpp kInternalGlobalBalanceRelativeTolerance=1e-8", + "Dev nonlinear_static_reference_cases_test.cpp GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate", + "Refactor docs/nonlinear-static-newton-raphson/io.md:703-714,828,911", + "Dev nonlinear formulation:1532", + "Refactor docs/nonlinear-static-newton-raphson/reference-model.md:11-12 USER-DECISION-004 option1 and balance_gate_decision <=1e-8; accepted free residual NSNR-069 is separately defined" + ], + "impact": "README summarizes internal residual/global balance as1e-10, while USER-DECISION-004 option1 explicitly approved factor-one global force/moment normalized <=1e-8. Accepted free force/moment residual NSNR-069 has distinct external-nonzero relative<=1e-2/exact-zero typed absolute<=1e-3 gates. Not a new solver regression; later docs task reconcile exact distinctions without changing acceptance." + }, + { + "kind": "unresolved-physics", + "id": "shellnl-reaction-stress", + "impact": "RF/RM review-only; RM3/stress external equality excluded; stress location mapping unadjudicated." + }, + { + "kind": "unresolved-physics", + "id": "shell-hht", + "impact": "latest whole shell HHT and time convergence incomplete; old/partial/cancelled execution not current PASS; displacement reference lacks v/a/A/energy oracle." + }, + { + "kind": "unresolved-physics", + "id": "eigen-s3", + "impact": "partial-BC S3 public static equilibrium conflict and external Value improvement deferred; preserve named policy/internal1e-10." + }, + { + "kind": "unresolved-performance", + "id": "performance", + "impact": "existing time-target misses/partial VTune and missing current complete final runs remain; no T1 timing." + }, + { + "kind": "historical-evidence-location", + "id": "raw-location", + "impact": "original env.cmd/t13/final-architecture-fix locations referenced by historical docs absent; actual archived roots listed separately, no current PASS inherited." + }, + { + "kind": "checkout-byte-representation", + "id": "fresh-checkout-EOL", + "impact": "41 tracked worker files differ from root WT only by line endings under core.autocrlf=true, including four preserved fem-theory-query files; reference originals unchanged. Both fingerprints recorded; no T1 source/skill edits. Future preservation must use explicit original-root WT bytes if byte identity is required." + } + ], + "verification": { + "status": "PASS_STATIC_INVENTORY", + "scope": "JSON parse, tracked sets/blob+working-tree SHA256, protected originals/settings/logs/results and metadata-only raw tree snapshot, casefold uniqueness", + "tool_version_commands": [ + { + "argv": [ + "C:\\Program Files\\Microsoft Visual Studio\\18\\Community\\MSBuild\\Current\\Bin\\MSBuild.exe", + "-version", + "-nologo" + ], + "exit_code": 0 + }, + { + "argv": [ + "C:\\Program Files\\Microsoft Visual Studio\\18\\Community\\VC\\Tools\\MSVC\\14.51.36231\\bin\\Hostx64\\x64\\cl.exe", + "/?" + ], + "exit_code": 0 + }, + { + "argv": [ + "C:\\Program Files\\Microsoft Visual Studio\\18\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\CMake\\Ninja\\ninja.exe", + "--version" + ], + "exit_code": 0 + }, + { + "argv": [ + "C:\\Program Files\\CMake\\bin\\cmake.EXE", + "--version" + ], + "exit_code": 0 + }, + { + "argv": [ + "C:\\Program Files\\CMake\\bin\\ctest.EXE", + "--version" + ], + "exit_code": 0 + }, + { + "argv": [ + "C:\\Users\\baram\\AppData\\Local\\hermes\\hermes-agent\\venv\\Scripts\\python.exe", + "--version" + ], + "exit_code": 0 + } + ], + "numerical_runs": 0, + "inventory_generation_attempts": [ + { + "command": "python -B .build/merge-verification/t1-20261018/inventory.py", + "exit_code": 1, + "reason": "temporary text inventory helper initially asserted on an empty hexa_freq.txt line; original bytes untouched; helper amended to skip empty text lines only" + }, + { + "command": "python -B .build/merge-verification/t1-20261018/inventory.py", + "exit_code": 0, + "reason": "JSON generated; all14 Hex8 frozen working-tree hash contracts match" + } + ], + "temporary_helpers": "Untracked .build/merge-verification/t1-20261018/inventory.py, verify_manifest.py and baseline.json are T1 temporary helpers, not product files or committed artifacts. Persistent judgments/evidence are in this manifest; no source/reference files deleted.", + "inventory_validation_attempts": [ + { + "command": "python -B .build/merge-verification/t1-20261018/verify_manifest.py --record", + "exit_code": 1, + "reason": "initial validator assumed root WT bytes equal fresh checkout bytes; failed on preserved skill .gitignore. Manifest now explicitly records actual integration baseline bytes and EOL-only differences; no original file changes." + } + ], + "final_command": { + "command": "python -B .build/merge-verification/t1-20261018/verify_manifest.py --record", + "cwd": "C:/git/FESADev/.dryforge/worktrees/worker", + "exit_code": 0, + "result": { + "fesa_dev_tracked_verified": 587, + "refactor_tracked_verified": 563, + "canonical_targets": 728, + "protected_files_verified": 55, + "source_raw_tree_states_verified": 5, + "shellnl_mappings": 4, + "hexa_Value_modes": 10, + "numerical_runs": 0 + } + }, + "preparation_and_numeric_status": "Inventory PASS does not mean environment ready or numerical tests pass. All future run statuses remain NOT_RUN_T1.", + "static_commands": [ + { + "command": "git rev-parse --show-toplevel", + "cwd": "C:/git/FESADev/.dryforge/worktrees/worker", + "exit_code": 0, + "result": "pinned worker path confirmed as first command" + }, + { + "command": "python -B .build/merge-verification/t1-20261018/verify_manifest.py --record", + "exit_code": 0, + "result": "JSON parse, 587/563 tracked set/blob/WT hash,728 targets,55 protected files,5 raw tree metadata states,4 ShellNL mappings,10 actual modal Values, dependency files and22 frozen comparator hash contracts checked" + }, + { + "command": "git diff --cached --check", + "exit_code": 0, + "result": "manifest-only staged whitespace review" + } + ] + }, + "integration_checkout_observations": { + "core_autocrlf": "true", + "tracked_files_with_different_working_tree_bytes": 41, + "reference_byte_differences": 0, + "differences": [ + { + "path": ".codex/skills/fem-theory-query/.gitignore", + "fesa_dev_sha256": "a0b0ae55b0ad8eb762fc546c1c44b7804b282a44bef9797d15ae7a53a859b272", + "integration_baseline_sha256": "c17f949202ec3b183529282d5446ccdf8c79be08552a806d3cb3b8e22bed5ea0", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": ".codex/skills/fem-theory-query/SKILL.md", + "fesa_dev_sha256": "a15ff36d478823e2577b64c5bcc2e8c5b2be393eef6022750c67419b380dfacc", + "integration_baseline_sha256": "d30e22ec02ee0ceefab792b3da85556a84e5c01a7e2d8e37578067953eca0ef0", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": ".codex/skills/fem-theory-query/agents/openai.yaml", + "fesa_dev_sha256": "798e8cc82f818a76d5d31cbdbe56e9180609fbb92e101ce36f5a15c3a9ec4580", + "integration_baseline_sha256": "a67c5aab389c4b89fcab4d60209cb5319a8a43b61d2ac4c986ce3120b632e0af", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": ".codex/skills/fem-theory-query/vault-path.example.txt", + "fesa_dev_sha256": "0c62dd97d000760c886463d7a93f70187c313007f45591180763f0c37769b528", + "integration_baseline_sha256": "b9aafa19a0e5719bca63fb88becdfab81cfa6de50b2f0273686589f12f3d8e65", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "include/fesa/analysis/dynamic_analysis_state.h", + "fesa_dev_sha256": "e44c641af99c892c725841f75fe3b42d23bb8a2151b892e913d8f7f15b3877db", + "integration_baseline_sha256": "89065f2c9a029624edb22a407cc2b61c9cd2d735c7563d3c9b71eb2f1870ca00", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "include/fesa/analysis/solid_dynamic_analysis_state.h", + "fesa_dev_sha256": "8d79583e9bab62eb0eaecee44213029587601e1006ffc663fdc8c6ca3d40188c", + "integration_baseline_sha256": "a12a5ce2357f47d97f4e97a2a8bd3491dd1608b95611478f30fe39b82cba1da0", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "include/fesa/analysis/solid_hht_dynamic_procedure.h", + "fesa_dev_sha256": "ec81b53c67080c7fff4649e0daf81431b8f4421566c643ec3fe8ccabbe0cf5b8", + "integration_baseline_sha256": "e82b58299ee5b7b3132da94c75c37a2a2deee5ee3c11b55c59fa3f14f9c768a7", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "include/fesa/io/hdf5/dynamic_hdf5_results_writer.h", + "fesa_dev_sha256": "b563cc5101019fd08b217214fac93b633df290310f11a060f527e9139d98ed11", + "integration_baseline_sha256": "94eefd90f976441d4b6ff5c636a9aceb83a5837a680af37e0061c0208f2aada0", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/AGENTS.md", + "fesa_dev_sha256": "178b63a75018ab28640e761f56b809390dba76addac7092996a57daa25aa6ca4", + "integration_baseline_sha256": "bd30580d11375b87160e68ae380a05ac83513a572a6e028c93a970dceb014649", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/dynamic_analysis_state.cpp", + "fesa_dev_sha256": "a208e819c46827783b2053ff9dc65c6477b2e801b11ef47c7a8f0b499301858d", + "integration_baseline_sha256": "598015ba5c07c5d6c10df3a635aa3f1afdc345081a690d93ec38382eb13afac5", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/hht_reduced_increment.h", + "fesa_dev_sha256": "9ef99d6a2801891e60b181ad598b6ca924b054d6be9c600c0cad358d6fc62a7e", + "integration_baseline_sha256": "88a53eb7b14a07003da29980be3b9beb3725d1a8bad3dc120e98ca28e017fb97", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/hht_reduced_internal.h", + "fesa_dev_sha256": "149b559688acea92a022a95461fe7a1c31b937e4aea0c1aa7db2cd6633a7823f", + "integration_baseline_sha256": "53149a7af8e159ac73f48ae9a4f2925a1fcc73abfea014380fe3eb4f17dd1470", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/hht_reduced_procedure.cpp", + "fesa_dev_sha256": "2c0f0e3015626f583fa053dbd12e89ec5116e973186cacdfe1db89731196920e", + "integration_baseline_sha256": "8de5585a8ac7d94a90499e39fbfab251f037387a77564eb8d8101277bec234eb", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/hht_reduced_procedure.h", + "fesa_dev_sha256": "30a2325dc970a58a6b02f721e2193df94a99050d864f37e25847a1edbe308326", + "integration_baseline_sha256": "4c7d98491f698f10c3a1611fbef36390ccd93e6fe27682ff0e4a6f9e806cdc0a", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/solid_dynamic_analysis_state.cpp", + "fesa_dev_sha256": "fae258fe8b99d360aab714f0c07962a544c480b9607faec9136a7874f8943b9e", + "integration_baseline_sha256": "358a94f866c01bedc07955dd6fb0f1ce68074995d0793f4f001e5cafba3319ef", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/solid_hht_dynamic_procedure.cpp", + "fesa_dev_sha256": "fdd45abbb82d54e3c5168075fb4d3eba26386b40d7f604036d97ce6970985ffe", + "integration_baseline_sha256": "00d0cf74938f7ce8c1033c83685f6a9d03e6e88afdd1999fcbcd272feb945433", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/solid_hht_force_identity.h", + "fesa_dev_sha256": "cf86a1c6c32bf18386364aa6c1483603ca5467a5a607b7c8ba96d9e7ca512cdd", + "integration_baseline_sha256": "e326852240b431dbe5a5edbeb5ba02e74840c2d5d7b8fbd471ee8e314a114487", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/solid_hht_high_low.h", + "fesa_dev_sha256": "fb75f990777f30bad410215fb118577c646ed45818d0ea9e8862525a6a9d8940", + "integration_baseline_sha256": "b4aac9f0be4ce3da337e00af9668e0bcbee9b9a121accff0816a601d6bc9ec3b", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/analysis/solid_hht_representability.h", + "fesa_dev_sha256": "d065981f071d6078acdedbbdc8cc040a74cce7ebf2e9086eb61ca75cf5613fd4", + "integration_baseline_sha256": "d6bdc01ef05ac8a78a54d6089f1e4c65f4743b1f8d06465c861d315ce1dfa2ba", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/elements/element_factory.cpp", + "fesa_dev_sha256": "cd19a0fe24114a6858e763e9eef5cb9a891d36bbf479b69e993ab87bcdca54b0", + "integration_baseline_sha256": "8fc8b2d598977c1f94634d2fbfab32159e0449aa50cf3780aeb8ca0ad18e57f5", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/elements/hex8_geometry.cpp", + "fesa_dev_sha256": "5be46597c4a55d04636a23ef9b0ed27730a1aa4a03f8629bed23a4dead3090f0", + "integration_baseline_sha256": "b1d1006bb226b320aa8e6c55396cf3af0d57e68548cbcd781defb24e324f0abf", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/elements/hex8_geometry.h", + "fesa_dev_sha256": "97c182084f8f0dabb217d56577312aebe3f8bb8d86638992bd21651d4ec4d472", + "integration_baseline_sha256": "2fe9830c84713c3e8d3d6d84174be4d2edd3fb2add007825e5da056451cb7388", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp", + "fesa_dev_sha256": "9775cbc80b3418ce399d62e90ef86b4d6dfbcc39840c39e83f6da66132c5ca05", + "integration_baseline_sha256": "16ad5e122fac30dc1b35d07e3914a0586087efbaccf1248cd3b3f2ca462d37f4", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "src/fesa/io/hdf5/solid_hdf5_results_writer.cpp", + "fesa_dev_sha256": "5b414737318f1d8588b49ebbd62ae180181e94c6439db9c15eb6013b0473373b", + "integration_baseline_sha256": "b63e029f6d5d1bf6b1f185fd897c09f162f29153f1d6041fbd08c1e62fe38ba7", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/CMakeLists.txt", + "fesa_dev_sha256": "53cb1f15138a3e271131ffca6a73425ee886feaa14733c9655642fa15e278ba6", + "integration_baseline_sha256": "7abaa48fa059aac076957434478f35eb9ff9afa3970ddc7d15648cb43b4eff32", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/reference/mitc4_reference_comparison.cpp", + "fesa_dev_sha256": "58ffb13b5dff2e34b3e57df1376627be96d8d0cd8691ca1f77568d5991f8a191", + "integration_baseline_sha256": "1e23f52e7a9ff7172bf67f5f9c3e460a05b86089b4df1f91566e502b3f7a3c69", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/reference/mitc4_reference_comparison.h", + "fesa_dev_sha256": "8bd6a36cb25ac102569f733fb560433f5352ddeb7788182e6bbd561da49e846c", + "integration_baseline_sha256": "51c8b78b44583986eeb175a839fd72a11ca5f3405bf016432da9563878c8f1f6", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/reference/mitc4_reference_comparison_test.cpp", + "fesa_dev_sha256": "84620741c644b7ae7ae1cfc527b6effa1fe32d47175b1755be6f337f8d20aa45", + "integration_baseline_sha256": "b886b3cf9a6d3569e73f6792ce8ff0a84052c81eb21d78a31245fc74033bf370", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/reference/reference_comparison_test.cpp", + "fesa_dev_sha256": "2dca374a67a3c55239c2402d4cd9541444283ec49ffb685037f90dad09c0e82f", + "integration_baseline_sha256": "e39732a6cb8747725a43f7fc6341fd4688d04cd3f9f936ec33cbc79b232886af", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/dynamic_analysis_state_test.cpp", + "fesa_dev_sha256": "cef74dec5c670c9ebe42f481a7a2ed4dfe3b3eecd14e28451e9433cb86c29a07", + "integration_baseline_sha256": "25e30b540c37be5c7699132ddf7c5da319a4a1bf3fb8988b054c8e9941ca594f", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/hht_dynamic_algebra_test.cpp", + "fesa_dev_sha256": "dc1a43a08e360283baf9701bf5a2839a21d561397d4ad732c921b31a10cf570e", + "integration_baseline_sha256": "e926831b44741880a7a729c57266c668eeeccc9130be07eacdb97c5330338ad2", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/hht_dynamic_procedure_test.cpp", + "fesa_dev_sha256": "c6f5b9faf1cca0ae80f587dc0b07dde9513b35303ee69d7bbb126583df98423b", + "integration_baseline_sha256": "7b16fff8a3edd6482b56b0c6ac02cbac5b292aecb05c82d51ac460f691befd3a", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/hht_shell_physics_test.cpp", + "fesa_dev_sha256": "b8a2dbd416d53e6807dba075bb2f98ee88c0331d5398840569823997248412c4", + "integration_baseline_sha256": "cd99f3300d17e9e74297ddfd12c969fdc10c58bde027ccbbe25b1d39f4d29c6a", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/solid_frequency_procedure_test.cpp", + "fesa_dev_sha256": "80a7a0dd4e765af6155d0ca9e52edc3c13f00e2082a4fcb60601e1ec20a23c56", + "integration_baseline_sha256": "afb4cc6cb6b1b6913bcfd0d473260ab060c91b66835e5570073472e3bc7f3dd5", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp", + "fesa_dev_sha256": "1c1936b269135cad28f1bc2608001f50c8992fbca8c9e29c713f28439ffd7eda", + "integration_baseline_sha256": "71a4ef2edd5b2e4cf40f47c17468a6f37cd7ca8937df212436438cfa65dbba70", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/solid_hht_temporal_verification_test.cpp", + "fesa_dev_sha256": "f741d023883fd91114346b233a5a1b14c9bc760085fe9830079643d4eea06f84", + "integration_baseline_sha256": "2973549ac31485ce1ab52ad5dc69ca0e8790f437361cf696f53e4bac0b9c627c", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/analysis/solid_hht_test_fixture.h", + "fesa_dev_sha256": "e2621f72b12715391a06e51ec23a320063679e90af74443afd5237197194b962", + "integration_baseline_sha256": "2ffd1ec89405f926f038cb58fc612604ff8e17853c134caf7cb127c32685cefd", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/elements/element_factory_test.cpp", + "fesa_dev_sha256": "26a556dd970ee14c9fefbdcdfabb78eae52ccf0edbeda4940c2657488459d3f0", + "integration_baseline_sha256": "39cdff0a92b9a86f0efe54457c47f57bb8fa0a48887eae940198046c8f5249f0", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp", + "fesa_dev_sha256": "8b41aba213d2ba4ae2a24bdff623bf663253b89997cc5f4a99c70953af1cc092", + "integration_baseline_sha256": "a2053f0d24af51ecdfe345ef14267b8a57a2530e994c46da68a5bb17f7250341", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp", + "fesa_dev_sha256": "5d309a1b119015721f17821d48e950cf534158a32c914e89a799118380647c7f", + "integration_baseline_sha256": "55a2e65c40382b393210d36625666ce014008eaf3cbfbe9610a6dfaf0f840d11", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + }, + { + "path": "tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp", + "fesa_dev_sha256": "6af9fa2932e01e6d814a73aa2368b5f5d7206f9c39004377d7d0ca5fbe11463d", + "integration_baseline_sha256": "bde4a8151895a48cd9d3bc6216b5d97ccfb51cc9991fd13c9eac5c30f4ad8c7e", + "diagnosis": "EOL-only difference: in-memory CRLF-to-LF byte comparison equal; no file normalization/correction performed" + } + ], + "policy": "record fresh checkout WT separately from source root WT and Git blob; do not silently normalize protected files or source references; source/root bytes unchanged" + }, + "t2_introduction": { + "source_commit": "11f09eeb9460115758eada96deda1d0b08c4a442", + "production_files": 274, + "test_staging": "Refactor tracked tests copied; Dev-only files preserved. Different same-path assertions remain tracked by T1 baseline commit for T3 mapping; no assertion obsolescence decision.", + "stale_header": "Removed after imported consumers no longer reference hex8_pair_arithmetic.h.", + "dependency_helper": "Dev/Refactor Git blob hashes equal; imported working-tree bytes equal Refactor.", + "docs_target": "Preserved optional fesa_docs from Dev in imported root CMake.", + "evidence_directory": ".build/merge-verification/t2-20261018-01", + "T5_review": "Per-file t2 categories are conservative review routing, not numerical-equivalence findings; source diff preserved in production-diff.patch.", + "verification": { + "msbuild-02": { + "command": "MSBuild msvc\\fesa_cli.vcxproj /m:2 /p:Configuration=Debug /p:Platform=x64", + "exit": 0, + "seconds": 104.56687712669373, + "log": ".build\\merge-verification\\t2-20261018-01\\msbuild-02.log" + }, + "configure": { + "command": "cmake --preset windows-msvc-ninja-debug", + "exit": 0, + "seconds": 5.767545700073242, + "log": ".build\\merge-verification\\t2-20261018-01\\configure.log" + }, + "cmake-build": { + "command": "cmake --build --preset windows-msvc-ninja-debug --target fesa_cli --parallel 2", + "exit": 0, + "seconds": 79.89109897613525, + "log": ".build\\merge-verification\\t2-20261018-01\\cmake-build.log" + }, + "runtime": { + "minimal_PATH_usage_exit": { + "native": 2, + "cmake": 2 + }, + "DLL_names_and_hashes_equal": true, + "DLL_count_each": 7, + "evidence": "runtime-parity.json" + }, + "initial_wrapper_failure": { + "command": "MSBuild msvc\\fesa_cli.vcxproj /m:2 /p:Configuration=Debug /p:Platform=x64", + "exit": 123, + "cause": "Temporary Python cmd argument quoting passed full command as quoted executable; corrected temporary runner only; first log retained as msbuild.log." + } + } + }, + "t3_test_migration": { + "base_commit": "26009169bf51a05ce2516f73e75487f593d1bd25", + "scope": "검사와 읽기 전용 comparator helper만 변경; 제품·reference 수정 및 최종 삭제 없음", + "migration_table": "docs/cpp-object-oriented-modular-refactoring/test-migration.tsv", + "table_summary": { + "common_files": 130, + "byte_identical": 72, + "byte_different": 58, + "dev_only": [ + "tests/test_cpp_policy_contract.py", + "tests/unit/math/high_low_arithmetic_original.h" + ], + "refactor_only": [ + "tests/test_compare_hex8.py", + "tests/test_compare_hht_dynamic.py", + "tests/unit/elements/element_capabilities_test.cpp" + ], + "rows": 2876, + "missing_identities": [], + "deletions": [] + }, + "raw_evidence": ".build/merge-verification/t3-20261018-01", + "builds": { + "final-cmake-03": { + "command": "cmake --build .build/cmake-debug --target fesa_tests --parallel 2", + "exit": 0, + "seconds": 3.9731388092041016, + "log": ".build\\merge-verification\\t3-20261018-01\\final-cmake-03.log" + }, + "final-native": { + "command": "msbuild FESA.sln /m:2 /p:Configuration=Debug /p:Platform=x64 /t:fesa_unit_tests,fesa_integration_tests,fesa_reference_tests", + "exit": 0, + "seconds": 4.966400384902954, + "log": ".build\\merge-verification\\t3-20261018-01\\final-native.log" + }, + "ctest-discovery": { + "command": "ctest --test-dir .build/cmake-debug --show-only=json-v1", + "exit": 0, + "seconds": 2.725306987762451, + "log": ".build\\merge-verification\\t3-20261018-01\\ctest-discovery.log" + } + }, + "registration": { + "fesa_unit_tests": { + "native_count": 90, + "cmake_count": 90, + "native_only": [], + "cmake_only": [] + }, + "fesa_integration_tests": { + "native_count": 11, + "cmake_count": 11, + "native_only": [], + "cmake_only": [] + }, + "fesa_reference_tests": { + "native_count": 17, + "cmake_count": 17, + "native_only": [], + "cmake_only": [] + } + }, + "discovery_counts": { + "fesa_unit_tests": 849, + "fesa_integration_tests": 72, + "fesa_reference_tests": 43 + }, + "ctest_discovered": 964, + "focused_results": { + "final-cpp-focused": { + "tests": 176, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "final-native-focused": { + "tests": 15, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "final-reference-focused": { + "tests": 28, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "python-focused": { + "tests": 145, + "failures": 0, + "errors": 0, + "skipped": 0 + } + }, + "source_snapshot": ".build/merge-verification/t3-20261018-01/final-source-hashes.json", + "product_final": { + "count": 274, + "mismatches": [] + }, + "reference_final": { + "dev_tracked_files": 44, + "byte_mismatches": [], + "hex8_frozen_hashes_matched": 14 + }, + "pending": "canonical shellNL-meshfine 세 변형 자료는 승인 대기 상태로 보존하며 복원 의존 검증은 미실행. 전체 CTest/Python/reference 검증은 T5 범위.", + "structural_migrations": [ + "AddPair/MultiplyPair 및 ScalarPacketAdd bool 경계는 공통 checked 산술로 이관하고 두 기존 consumer의 독립 frozen oracle를 유지한다.", + "Cholesky inverse out-parameter·reason enum은 DenseFactor lower action과 typed Result 실패로 이관하며 이전 owned candidate 보존을 검사한다.", + "rotation inverse matrix API는 모든 basis solve로 이관하고 positive unit null의 동등한 analytic invariant를 유지한다." + ], + "removed_tests": [], + "policy_failure_reproduction": "native ExceptionHandling을 메모리에서 false로 바꾸면 현재 policy 검사가 AssertionError로 거부하고 원문 설정에서는 통과한다. 파일은 수정하지 않는다.", + "policy_failure_evidence": ".build/merge-verification/t3-20261018-01/policy-mutation.log" + }, + "t5_before_prune_verification": { + "status": "IN_PROGRESS_NOT_A_T5_COMPLETION_OR_T6_GATE", + "snapshot_utc": "2026-10-18T02:59:51.000255+00:00", + "base_commit": "0635cec53d9d617503d4ae9b57a97c82b8f9f9b9", + "scope": "정리 전 전체 검증의 중간 근거. 제품·검사·등록·정식 reference 수정이나 테스트 삭제 없음. 미생성 exit/XML을 통과로 계산하지 않는다.", + "raw_evidence": ".build/merge-verification/t5-20261018-01/before-prune", + "user_decision": "reference/temp는 검증에 사용하지 않는다. 임시 입력/CSV/결과를 읽어 검증·비교·복사하거나 정식 자료로 대체하지 않았다.", + "completed_build_checks": { + "native-build": { + "record": ".build/merge-verification/t5-20261018-01/before-prune/native-build.json", + "log": ".build/merge-verification/t5-20261018-01/before-prune/native-build.log", + "argv": [ + "MSBuild", + "FESA.sln", + "/m:2", + "/p:Configuration=Debug", + "/p:Platform=x64" + ], + "actual_argv": [ + "cmd", + "/d", + "/c", + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\native-build.cmd" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "exit": 0, + "seconds": 2.6927127838134766, + "removed_filter_variables": {}, + "environment": { + "TMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\native-build-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\native-build-tmp", + "PYTHONUTF8": "1", + "PYTHONIOENCODING": "utf-8" + }, + "log_sha256": "e49b0b496b2e4a0c6e6fa8aa1e108e405a75647df0ecb0ef08044bd178f8b422" + }, + "configure": { + "record": ".build/merge-verification/t5-20261018-01/before-prune/configure.json", + "log": ".build/merge-verification/t5-20261018-01/before-prune/configure.log", + "argv": [ + "cmake", + "--preset", + "windows-msvc-ninja-debug" + ], + "actual_argv": [ + "cmd", + "/d", + "/c", + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\configure.cmd" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "exit": 0, + "seconds": 1.9974191188812256, + "removed_filter_variables": {}, + "environment": { + "TMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\configure-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\configure-tmp", + "PYTHONUTF8": "1", + "PYTHONIOENCODING": "utf-8" + }, + "log_sha256": "6723be76fc9b32cb2579c441582eadd6a31d0f42bebdf7d33a274235f1f3305c" + }, + "cmake-build": { + "record": ".build/merge-verification/t5-20261018-01/before-prune/cmake-build.json", + "log": ".build/merge-verification/t5-20261018-01/before-prune/cmake-build.log", + "argv": [ + "cmake", + "--build", + "--preset", + "windows-msvc-ninja-debug", + "--parallel", + "2" + ], + "actual_argv": [ + "cmd", + "/d", + "/c", + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\cmake-build.cmd" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "exit": 0, + "seconds": 3.918487310409546, + "removed_filter_variables": {}, + "environment": { + "TMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\cmake-build-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\cmake-build-tmp", + "PYTHONUTF8": "1", + "PYTHONIOENCODING": "utf-8" + }, + "log_sha256": "db6dcbe64f97503b1513ba88244422e134ec6a15385f58b854eda665b462b76f" + }, + "ninja-deps": { + "record": ".build/merge-verification/t5-20261018-01/before-prune/ninja-deps.json", + "log": ".build/merge-verification/t5-20261018-01/before-prune/ninja-deps.log", + "argv": [ + "ninja", + "-C", + ".build/cmake-debug", + "-t", + "deps" + ], + "actual_argv": [ + "cmd", + "/d", + "/c", + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\ninja-deps.cmd" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "exit": 0, + "seconds": 1.740182876586914, + "removed_filter_variables": {}, + "environment": { + "TMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\ninja-deps-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\ninja-deps-tmp", + "PYTHONUTF8": "1", + "PYTHONIOENCODING": "utf-8" + }, + "log_sha256": "98e36f6181baa49c61172dcf61a757ef89295bdb8383037071599da5022780db" + }, + "headers-compile": { + "record": ".build/merge-verification/t5-20261018-01/before-prune/headers-compile.json", + "log": ".build/merge-verification/t5-20261018-01/before-prune/headers-compile.log", + "argv": [ + "cl", + "@C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\headers\\compile.rsp" + ], + "actual_argv": [ + "cmd", + "/d", + "/c", + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\headers-compile.cmd" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "exit": 0, + "seconds": 201.70288968086243, + "removed_filter_variables": {}, + "environment": { + "TMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\headers-compile-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\headers-compile-tmp", + "PYTHONUTF8": "1", + "PYTHONIOENCODING": "utf-8" + }, + "log_sha256": "99ec0b9178d41ec674584c6e2f94d8f414daf81af3e3b57f83d876f81ec8bf83" + }, + "baseline-build": { + "record": ".build/merge-verification/t5-20261018-01/before-prune/baseline-build.json", + "log": ".build/merge-verification/t5-20261018-01/before-prune/baseline-build.log", + "argv": [ + "MSBuild", + "msvc/fesa_cli.vcxproj", + "/m:2", + "/p:Configuration=Debug", + "/p:Platform=x64" + ], + "actual_argv": [ + "cmd", + "/d", + "/c", + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\baseline-build.cmd" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\t5-refactor-baseline", + "exit": 0, + "seconds": 161.69524788856506, + "removed_filter_variables": {}, + "environment": { + "TMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\baseline-build-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\baseline-build-tmp", + "PYTHONUTF8": "1", + "PYTHONIOENCODING": "utf-8" + }, + "log_sha256": "1c763c2aee61f9f1975912373576f420322a892f260ec23c05dc495294d1b6c2" + } + }, + "source_fidelity": { + "product_files": 274, + "refactor_working_bytes_equal": true, + "rechecked_before_interim_record": true, + "hash_evidence": ".build/merge-verification/t5-20261018-01/before-prune/pre-execution-hashes.json", + "canonical_reference_files_checked": 32, + "canonical_reference_bytes_unchanged": true, + "temp_paths_excluded_before_byte_reads": 12 + }, + "discovery": { + "native_unit": 849, + "native_integration": 72, + "native_reference": 43, + "cmake_unit": 849, + "cmake_integration": 72, + "cmake_reference": 43, + "ctest": 964, + "canonical_identity_match": true, + "evidence": ".build/merge-verification/t5-20261018-01/before-prune/discovery-summary.json" + }, + "public_header_check": { + "independent_translation_units": 111, + "mode": "MSVC C++17 /EHsc /W4 /WX /MDd /Zs; include/ and VS/Windows standard INCLUDE only, no private/vendor include path", + "exit": 0, + "translation_unit_map": ".build/merge-verification/t5-20261018-01/before-prune/headers-map.json", + "environment": ".build/merge-verification/t5-20261018-01/before-prune/headers-environment.log" + }, + "dependency_check": { + "all_object_entries": 222, + "production_object_entries": 102, + "invalid_production_entries": [] + }, + "runtime_dlls": { + "count": 7, + "native_cli_native_tests_cmake_cli_cmake_tests_sha256_equal": true, + "fresh_refactor_baseline_equal": true, + "evidence": [ + ".build/merge-verification/t5-20261018-01/before-prune/all-target-runtime-dll-parity.json", + ".build/merge-verification/t5-20261018-01/before-prune/baseline-runtime.json" + ] + }, + "full_suite_execution": { + "status": "RUNNING_NATIVE_UNIT_NO_SUITE_EXIT_OR_XML_YET", + "serial_queue": [ + "Native unit849 unfiltered", + "Native integration72 unfiltered", + "Native reference43 unfiltered", + "CTest964 unfiltered -j1", + "Python entire tests/ suite" + ], + "per_run_TMP_TEMP_and_raw_separated": true, + "inherited_GTEST_CTEST_variables_removed": true, + "pre_existing_fixed_reference_outputs_preserved": ".build/merge-verification/t5-20261018-01/before-prune/pre-existing", + "explicit_ctest_timeout_properties": 0, + "timeout_evidence": ".build/merge-verification/t5-20261018-01/before-prune/ctest-timeout-static.json", + "native_completed_identity_count_in_stdout": 57, + "native_completed_identities_in_stdout": [ + { + "identity": "BuildInfo.VersionIsStableAndNonEmpty", + "milliseconds": 0 + }, + { + "identity": "BuildInfo.PublicHeaderHasNoBackendDependency", + "milliseconds": 0 + }, + { + "identity": "Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis", + "milliseconds": 0 + }, + { + "identity": "AnalysisProcedure.PreparedConsumerPreservesDomainFailureAndLifetime", + "milliseconds": 0 + }, + { + "identity": "EquilibriumAlgorithm.RetainsMoveOnlyCandidateUntilProcedureTakesIt", + "milliseconds": 0 + }, + { + "identity": "EquilibriumAlgorithm.FirstFailedEvaluationLeavesNoAcceptedCandidate", + "milliseconds": 0 + }, + { + "identity": "EquilibriumAlgorithm.InjectsAlternativeOrderAndPreservesTypedPendingOnFailure", + "milliseconds": 0 + }, + { + "identity": "ProcedureIntegratorInjection.ShellValuesUseProductionStepAndPreserveHistory", + "milliseconds": 0 + }, + { + "identity": "ProcedureIntegratorInjection.SolidPairedValuesUseProductionStepAndPreserveHistory", + "milliseconds": 2 + }, + { + "identity": "ProcedureIntegratorInjection.HeatValuesUseProductionRecoveryCommitAndPreserveHistory", + "milliseconds": 0 + }, + { + "identity": "AnalysisModel.ClassifiesActiveEntitiesInStableOrder", + "milliseconds": 0 + }, + { + "identity": "AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain", + "milliseconds": 0 + }, + { + "identity": "AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices", + "milliseconds": 0 + }, + { + "identity": "AnalysisModel.RejectsMissingOrMultipleStep", + "milliseconds": 0 + }, + { + "identity": "AnalysisState.AllocatesOnlyV0FullVectors", + "milliseconds": 0 + }, + { + "identity": "AnalysisState.CopiesOrMovesWithoutAliasing", + "milliseconds": 0 + }, + { + "identity": "AnalysisState.PreservesStepFrameAndStableRowOrder", + "milliseconds": 0 + }, + { + "identity": "AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder", + "milliseconds": 0 + }, + { + "identity": "AnalysisState.CommitsFiniteShellGlobalEvidence", + "milliseconds": 0 + }, + { + "identity": "AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged", + "milliseconds": 0 + }, + { + "identity": "DynamicAnalysisState.RejectsUnknownOrChangingIntegrationFormulation", + "milliseconds": 5 + }, + { + "identity": "DynamicAnalysisState.DefaultStateRejectsTrialAndCommit", + "milliseconds": 0 + }, + { + "identity": "DynamicAnalysisState.CommitsCompleteZeroCorrectionHistoryAndCopiesTrials", + "milliseconds": 1 + }, + { + "identity": "DynamicAnalysisState.RejectsMalformedInventoryScheduleAndPreservesEndpoint", + "milliseconds": 4 + }, + { + "identity": "DynamicAnalysisState.RejectsInvalidInitialStateAndFreeReaction", + "milliseconds": 1 + }, + { + "identity": "DynamicAnalysisState.CreateRejectsInvalidScheduleAndNonzeroBoundary", + "milliseconds": 3 + }, + { + "identity": "EigenReduction.RejectsNonfiniteUsedBasisAndPreservesPriorCandidate", + "milliseconds": 4 + }, + { + "identity": "EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil", + "milliseconds": 0 + }, + { + "identity": "EigenReduction.RemovesOnlyActualFreeDirectorNull", + "milliseconds": 1 + }, + { + "identity": "EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs", + "milliseconds": 0 + }, + { + "identity": "EigenReduction.WhitensOffDiagonalMassAndRestoresOriginalPencil", + "milliseconds": 135 + }, + { + "identity": "EigenReduction.PreservesSmallResolvablePositivePartialRotationMass", + "milliseconds": 0 + }, + { + "identity": "EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace", + "milliseconds": 0 + }, + { + "identity": "EigenReduction.PureMassWhiteningRetainsInclusiveInfinityConditionGate", + "milliseconds": 0 + }, + { + "identity": "EigenReduction.PureOffDiagonalWhiteningMatchesAnalyticGramAndPencil", + "milliseconds": 0 + }, + { + "identity": "EigenMassAssembly.ScattersHeterogeneousSharedNodeMassInSourceOrder", + "milliseconds": 88 + }, + { + "identity": "HhtTimeIntegrationTest.KeepsPhysicalAndAlgorithmicAccelerationDistinct", + "milliseconds": 0 + }, + { + "identity": "HhtTimeIntegrationTest.RejectsInvalidParametersAndTime", + "milliseconds": 0 + }, + { + "identity": "HhtTimeIntegrationTest.StepOscillatorHasSecondOrderMaximumError", + "milliseconds": 6 + }, + { + "identity": "HhtShellPhysics.NodalRigidForceRatesMatchIndependentTimeDifferences", + "milliseconds": 73 + }, + { + "identity": "HhtShellPhysics.ExternalDrillingHessianBalancesGradientAcceleration", + "milliseconds": 40 + }, + { + "identity": "HhtShellPhysics.ManufacturedHiddenCountsExternalHessianOnce", + "milliseconds": 153 + }, + { + "identity": "HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum", + "milliseconds": 2462 + }, + { + "identity": "HhtShellPhysics.BasisCoefficientRadiusSurvivesSparseProjectionAndLift", + "milliseconds": 0 + }, + { + "identity": "HhtShellPhysics.BasisRadiusReplayMatchesCompensatedProjectionAndCombinedLift", + "milliseconds": 0 + }, + { + "identity": "HhtShellPhysics.BasisLiftedAlgorithmicCorrectionUsesHhtFilterFactor", + "milliseconds": 0 + }, + { + "identity": "HhtShellPhysics.CarriedArRadiiIncludeAbsorbedUpdatesAndInputHistory", + "milliseconds": 0 + }, + { + "identity": "HhtShellPhysics.PrimaryCoordinateRetainsCorrectionAbsorbedByCarriedAr", + "milliseconds": 0 + }, + { + "identity": "HhtShellPhysics.CompensatedCoordinateRetainsAbsorbedNewtonCorrections", + "milliseconds": 0 + }, + { + "identity": "HhtShellPhysics.FrozenGraphIndicatorIncludesCoordinateAndRateCurvature", + "milliseconds": 3 + }, + { + "identity": "HhtShellPhysics.GraphBasisCertificateBoundsMatrixAndRhsPerturbations", + "milliseconds": 2 + }, + { + "identity": "HhtShellPhysics.RestrictedLastSolvePreservesOmittedTranslationDefect", + "milliseconds": 0 + }, + { + "identity": "HhtShellPhysics.RestrictedRecordNoiseIncludesFullModelOmittedUDefect", + "milliseconds": 316 + }, + { + "identity": "HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit", + "milliseconds": 396862 + }, + { + "identity": "HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence", + "milliseconds": 7153515 + }, + { + "identity": "HhtShellPhysics.C08bInitialPhysicalSpectrumProbe", + "milliseconds": 716 + }, + { + "identity": "HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid", + "milliseconds": 539678 + } + ], + "native_failed_identity_lines_so_far": [], + "native_skipped_identity_lines_so_far": [], + "native_current_identity": "HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants", + "native_c08b_completed_time_grids": [ + { + "h": "1/64", + "increments": 16 + }, + { + "h": "1/128", + "increments": 32 + }, + { + "h": "1/256", + "increments": 64 + }, + { + "h": "1/512", + "increments": 128 + }, + { + "h": "1/1024", + "increments": 256 + } + ], + "c08b_remaining_fine_grid_increments": [ + 8192, + 16384, + 32768 + ], + "c08b_total_increments_all_grids": 57840, + "c08b_final_convergence_and_physics_status": "NOT_COMPLETE", + "warning": "stdout 관측은 전체 XML/exit를 대신하지 않는다. CPU/RSS/로그 크기를 수치 진척이나 통과의 근거로 쓰지 않는다.", + "running_checkpoint": ".build/merge-verification/t5-20261018-01/before-prune/running-checkpoint.json", + "native_stdout": ".build/merge-verification/t5-20261018-01/before-prune/native-fesa_unit_tests.log", + "queued_suites_and_python": "NOT_RUN_YET" + }, + "fresh_refactor_baseline": { + "source_root": "C:/git/FESADev/.dryforge/t5-refactor-baseline", + "source_pin": "11f09eeb9460115758eada96deda1d0b08c4a442", + "tracked_selected_files_copied": 304, + "copied_roots": [ + "include", + "src", + "msvc", + "FESA.sln" + ], + "excluded": [ + ".build", + "reference/temp", + "original retained outputs" + ], + "source_snapshot": ".build/merge-verification/t5-20261018-01/before-prune/baseline-source-snapshot.json", + "build": "Native MSVC x64 Debug solver/CLI fresh build exit0", + "fresh_model_execution": "NOT_RUN_YET; starts after all suites including Python exit", + "model_queue": "11 available canonical inputs x Refactor baseline/Native/CMake; minimum static5 plus affected frequency/HHT/thermal models; serial, no arbitrary wall timeout", + "pipeline_scripts": [ + ".build/merge-verification/t5-20261018-01/before-prune/after-suites.py", + ".build/merge-verification/t5-20261018-01/before-prune/models.py", + ".build/merge-verification/t5-20261018-01/before-prune/hdf-parity.py", + ".build/merge-verification/t5-20261018-01/before-prune/reference-harness.cpp" + ], + "parity_policy": "동일 scratch input 경로·bytes에서 새로 실행한 schema·identity·각 field 값과 실제 차이를 대조한다. 출처 동일성을 수치/물리 동등성으로 주장하지 않는다." + }, + "independent_numerical_review": { + "status": "CONCERNS_STATIC_REVIEW_ONLY", + "report": ".build/merge-verification/t5-20261018-01/before-prune/numerical-review-ko.md", + "sha256": "3a181a24665e778a19111e8d5e145c01547300dd4f2651f81b6cbfee31d884cd", + "conclusion": "검토한 원문과 소스에서 명백한 식 오류·승인 기준 변경은 발견하지 못했으나 rounding graph·수명 영향과 실제 검증 의무는 남는다. 이 의견은 full T5 PASS 또는 T6 승인 근거가 아니다." + }, + "supplemental_numerical_impact_classification": [ + { + "path": "src/fesa/io/hdf5/hdf5_primitives.cpp", + "category": "spatial reaction output arithmetic: analytic inverse-transpose multiply -> LU solve J^T m=g", + "contract": "virtual-work spatial moment 변환식은 같으나 rounding graph가 달라 비트 보존을 가정하지 않는다. schema·identity·수치 허용치 변경 없음.", + "reason": "T2 numerical routing 누락을 독립 수치 검토가 발견했다. T1/T2 원본 필드를 수정하지 않고 T5에 보충한다.", + "required_oracle_identities": [ + "FiniteRotation.SpatialMomentSolvePreservesKnownLoadAndVirtualWork", + "FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent", + "DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction", + "NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment", + "NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly", + "NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal" + ], + "current_full_execution_status": "PENDING; discovered but not reached in current Native full unit; CTest not started yet" + }, + { + "path": "src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp", + "category": "spatial reaction output arithmetic: analytic inverse-transpose multiply -> LU solve J^T m=g", + "contract": "virtual-work spatial moment 변환식은 같으나 rounding graph가 달라 비트 보존을 가정하지 않는다. schema·identity·수치 허용치 변경 없음.", + "reason": "T2 numerical routing 누락을 독립 수치 검토가 발견했다. T1/T2 원본 필드를 수정하지 않고 T5에 보충한다.", + "required_oracle_identities": [ + "FiniteRotation.SpatialMomentSolvePreservesKnownLoadAndVirtualWork", + "FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent", + "DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction", + "NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment", + "NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly", + "NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal" + ], + "current_full_execution_status": "PENDING; discovered but not reached in current Native full unit; CTest not started yet" + }, + { + "path": "src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp", + "category": "spatial reaction output arithmetic: analytic inverse-transpose multiply -> LU solve J^T m=g", + "contract": "virtual-work spatial moment 변환식은 같으나 rounding graph가 달라 비트 보존을 가정하지 않는다. schema·identity·수치 허용치 변경 없음.", + "reason": "T2 numerical routing 누락을 독립 수치 검토가 발견했다. T1/T2 원본 필드를 수정하지 않고 T5에 보충한다.", + "required_oracle_identities": [ + "FiniteRotation.SpatialMomentSolvePreservesKnownLoadAndVirtualWork", + "FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent", + "DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction", + "NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment", + "NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly", + "NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal" + ], + "current_full_execution_status": "PENDING; discovered but not reached in current Native full unit; CTest not started yet" + } + ], + "unresolved_reference_checks": [ + { + "case": "shellNL-meshfine", + "status": "NOT_RUN_MISSING_CANONICAL_MATERIAL", + "reason": "정식 입력/CSV 미확보; temp는 사용하지 않는다." + }, + { + "case": "shellNL-meshfine_02", + "status": "NOT_RUN_MISSING_CANONICAL_MATERIAL_AND_CURRENT_COMPARATOR_CONNECTION", + "reason": "정식 자료도 없고 현재 ContractFor 연결도 없는 별도 후속 범위다." + }, + { + "case": "shellNL-meshfine-pressure", + "status": "NOT_RUN_MISSING_CANONICAL_MATERIAL", + "reason": "정식 입력/CSV 미확보; temp는 사용하지 않는다." + }, + { + "case": "thermal-new-required-reference", + "status": "NOT_RUN_NOT_SUPPLIED", + "reason": "새 필수 모델/NT11 CSV 미확보. 기존 NT11 비교는 diagnostic/nonblocking 불일치로 유지하며 새 필수자료 통과로 대체하지 않는다." + } + ], + "preserved_limits": [ + "ShellNL RF/RM review-only, stress Gauss/CSV mapping 미판정", + "기존 thermal NT11 diagnostic 불일치를 외부 PASS로 승격하지 않음", + "HHT C08a 현재 개별 PASS와 C08b·전체 회귀·전체 물리 closure 구분", + "eigen S3 partial-BC 정적 충돌·성능 미완료 유지" + ], + "helper_attempts": ".build/merge-verification/t5-20261018-01/before-prune/helper-preparation-attempts.json", + "test_pruning": { + "removed_tests": [], + "status": "BLOCKED_BEHIND_REQUIRED_T5_CHECKS", + "reason": "필수 실제 비교와 전체 실행 gate가 충족되지 않았다." + }, + "temporary_evidence_floor": { + "status": "synthetic tooling checks only; no FESA model execution", + "checked_cases": { + "scope": "임시 검증도구의 증거 하한 검사만 수행. FESA solver·물리·reference 검증이 아니다.", + "checks": [ + { + "synthetic_tooling_case": "empty", + "exit": 1, + "expected": 1, + "report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-empty\\parity.json" + }, + { + "synthetic_tooling_case": "attribute-dtype-mismatch", + "exit": 1, + "expected": 1, + "report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-attribute-dtype-mismatch\\parity.json" + }, + { + "synthetic_tooling_case": "missing-result", + "exit": 2, + "expected": 2, + "report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-missing-result\\parity.json" + }, + { + "synthetic_tooling_case": "nonempty-identical", + "exit": 0, + "expected": 0, + "report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-nonempty-identical\\parity.json" + }, + { + "synthetic_tooling_case": "comparator exit0 with malformed JSON", + "exit": 2, + "expected": 2 + } + ] + }, + "validators": [ + ".build\\merge-verification\\t5-20261018-01\\before-prune\\hdf-parity.py", + ".build\\merge-verification\\t5-20261018-01\\before-prune\\validate-report.py" + ], + "aggregate": "Every solver/comparator/validator/parity exit is preserved; any nonzero yields nonzero aggregate. Known thermal diagnostic numeric FAIL remains separately classified, never numeric PASS.", + "tool_source_sha256": { + "models.py": "d59893216881fea11d48f28fc38e4d0c195815ea1c688ce5b20c308dd5708ce9", + "hdf-parity.py": "a277726e72fd335d0e1e5af8fc4df46a62e71d45d57d91d3ee21e859d56cb9f8", + "validate-report.py": "80a9729285969b81a4e2f2f7773a3f3588ddaff59586f1902c61e84c94796abc", + "reference-harness.cpp": "dac5dbf6ad084420e94439224191ca328f1ef01a4fc9892512bc06e1782fac11" + }, + "false_green_regression_checks": { + "scope": "임시 도구의 false-green 재현/수정 확인만 수행. FESA 제품·물리·실제 reference 통과가 아니다.", + "checks": [ + { + "synthetic_case": "legacy-empty", + "before_exit": 0, + "after_exit": 1, + "expected_after_exit": 1, + "before_report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-legacy-empty\\legacy-false-green-parity.json", + "after_report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-legacy-empty\\parity.json" + }, + { + "synthetic_case": "legacy-missing", + "before_exit": 0, + "after_exit": 2, + "expected_after_exit": 2, + "before_report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-legacy-missing\\legacy-false-green-parity.json", + "after_report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-legacy-missing\\parity.json" + }, + { + "synthetic_case": "numeric-mismatch", + "before_exit": null, + "after_exit": 1, + "expected_after_exit": 1, + "before_report": null, + "after_report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-numeric-mismatch\\parity.json" + }, + { + "synthetic_case": "nonfinite", + "before_exit": null, + "after_exit": 1, + "expected_after_exit": 1, + "before_report": null, + "after_report": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\models\\tooling-floor-nonfinite\\parity.json" + } + ] + }, + "synthetic_case_count": 9, + "parity_disposition": "Exact-field nonzero is a comparison assertion result, not a new physical acceptance tolerance. Differences require source/dtype/identity/rounding cause classification against existing approved policies; no tolerance added or relaxed.", + "aggregate_validation_status": "Static implementation reviewed; actual full model aggregate has not run yet." + } + }, + "t5_static_scope_verification": { + "status": "APPROVED_STATIC_SCOPE_COMPLETE_WITH_CONCERNS", + "user_scope_change": "HHT 등 비정적 실제 수치 검증 유예, 정적 검증 후 다음 단계 허용; 테스트 보존", + "source_pin": "0c763baa1d91b89cb48486320acaa2ce18c002c7", + "raw": ".build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01", + "cancelled_full_queue": { + "classification": "user_cancelled_static_only", + "reason": "사용자 명시 지시: HHT 동해석 검증을 중단하고 정적해석만 검증 후 다음 단계로 진행. 중단을 수치 FAIL/PASS로 계산하지 않는다.", + "utc": "2026-10-18T03:09:27Z", + "verified_task_processes": [ + { + "pid": 16232, + "name": "python.exe", + "argv": [ + "C:\\Users\\baram\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\python.exe", + ".build/merge-verification/t5-20261018-01/before-prune/after-suites.py" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "create_time": 1792263155.385302, + "root_orchestration": true + }, + { + "pid": 23232, + "name": "python.exe", + "argv": [ + "C:\\Users\\baram\\AppData\\Roaming\\uv\\python\\cpython-3.11-windows-x86_64-none\\python.exe", + ".build/merge-verification/t5-20261018-01/before-prune/suites.py" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "create_time": 1792262211.6124952, + "root_orchestration": true + }, + { + "pid": 25804, + "name": "fesa_unit_tests.exe", + "argv": [ + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\native\\Debug\\tests\\fesa_unit_tests.exe", + "--gtest_output=xml:C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\native-fesa_unit_tests.xml" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "create_time": 1792262212.862038, + "root_orchestration": false + } + ], + "outcomes": [ + { + "pid": 16232, + "action": "terminated_verified_task_process" + }, + { + "pid": 23232, + "action": "terminated_verified_task_process" + }, + { + "pid": 25804, + "action": "terminated_verified_task_process" + } + ], + "still_alive_verified_pids": [], + "preserved_partial_outputs": [ + { + "path": ".build\\merge-verification\\t5-20261018-01\\before-prune\\native-fesa_unit_tests.log", + "size": 139053, + "sha256": "3c4d78a1aad62f195d8463e1d0e8438c3c0865972cfdf2a956db5f75d3a583e4" + } + ], + "post_termination_pid_checks": [ + { + "pid": 16232, + "alive": false + }, + { + "pid": 21216, + "alive": false + }, + { + "pid": 23232, + "alive": false + }, + { + "pid": 25804, + "alive": false + } + ] + }, + "selection": { + "source_pin": "0c763ba", + "total": 964, + "counts": { + "unit": { + "selected": 555, + "deferred": 294 + }, + "integration": { + "selected": 35, + "deferred": 37 + }, + "reference": { + "selected": 41, + "deferred": 2 + } + }, + "historical_selected": 553, + "historical_now_deferred": [ + "EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil", + "EigenReduction.RemovesOnlyActualFreeDirectorNull", + "EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs", + "EigenReduction.PreservesSmallResolvablePositivePartialRotationMass", + "EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace", + "EigenReduction.PureMassWhiteningRetainsInclusiveInfinityConditionGate", + "EigenReduction.PureOffDiagonalWhiteningMatchesAnalyticGramAndPencil", + "DynamicHdf5ResultsWriter.SeparatesReducedFilterCombinationFromLegacyDriver", + "DynamicHdf5ResultsWriter.WritesCompletePhysicalClampedHistoryAndSchema", + "ThermalGeometryAction.EnclosesIndependentDyadicTangentialConstraints", + "ThermalGeometryAction.PreservesWholePatchAndScaledFiniteRejections" + ], + "newly_selected": [ + "DynamicNewtonIterationLog.WritesTimeAndAllTwoChannelMetrics", + "DynamicNewtonIterationLog.EscapesFailureContextAndKeepsZeroScaleFailure", + "DynamicNewtonIterationLog.InvalidEvidencePreservesFlushedPrefixAndFailsLifecycle", + "LoadAssembly.PreservesOrderedCancellationInPrescribedCorrection", + "LoadAssembly.SelectsFirstOrderedOverflowDiagnostic", + "SparseAssembly.MultipliesRectangularCopyMoveAndConcurrentConstCalls", + "SparseAssembly.PreservesZeroShapesAndEmptyRows", + "SparseAssembly.RejectsNonfiniteRhsAndRecoversAfterFiniteOverflow", + "SparseAssembly.MatchesIndependentLongDoubleResidualOnUnevenRows", + "ElementFactory.SolidBindingPreservesThreeComponentsAndReferenceMass", + "Hex8Element.ExactBrickStiffnessAndRowSumLumpedMass", + "Hex8Element.RowSumLumpedMassHasAll24PositiveDirectionsAndReferenceInvariance", + "Hex8Element.RejectsUnrepresentableShearAndMassInsteadOfReturningZeros", + "Hex8Element.WarpedRowSumMassMatchesIndependentNodalIntegralsAndNonuniformEnergy", + "Hex8Element.BackendOperandRejectionRetainsOriginalStiffnessDiagnostic", + "Hex8Element.TensorFailureRetainsPriorityOverEnergyAndTangentOverflow", + "Hex8HighLow.ScalarCrossProductShortcutMatchesOriginalBits", + "Hex8HighLow.FourColumnMaterialPacketMatchesFrozenScalarBits", + "Hex8HighLow.PacketSpecialLaneDoesNotChangeOtherColumns", + "Hex8HighLow.UniformDyadicPacketsExerciseEachLowZeroShape", + "Hex8HighLow.OverflowLaneIsNeutralizedBeforeResidualFma", + "Hex8HighLow.PacketVectorGuardsPreserveScalarFlagsAndBits", + "Hex8HighLow.PacketTailScreenRetainsExactBoundaryAndFallback", + "Hex8HighLow.GeometryPacketPreservesAsymmetricLanesAndUniformShapes", + "Hex8HighLow.GeometryPacketRetainsSpecialLanesAndExactTailBoundary", + "Hex8HighLow.GeometryPacketPreservesOrderedOverflowAndPreparedInvalid", + "Hex8HighLow.GeometryPacketSumFallbackPreservesNearMaxAndSubnormalStatus", + "Hex8HighLow.PacketBackendSelectionRecoversAfterEnvironmentRestoration", + "Hex8HighLow.PacketScalarBridgesPreserveOriginalRawBits", + "Hex8HighLow.PacketCapabilityRejectsMissingIntegerIsaAndOsState", + "Hex8HighLow.PacketDoesNotClearPriorMaskedStickyFlags", + "Hex8HighLow.ConcurrentFirstLinearTrialsAcrossCopiesAndMoveKeepBits", + "Hex8HighLow.FirstLinearPreparationRecoversAfterTrialAndEnvironmentFailure", + "EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy", + "NonlinearMitc4Residual.SmallRotationPhysicalForceRetainsDrillingNullIdentity", + "NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian", + "NonlinearMitc4Residual.ExternalDrillingConstraintIncludesForceTimeAndCurvatureTerms", + "NonlinearMitc4Residual.ExternalDrillingConstraintRejectsInvalidRotationAndHasZeroForceValue", + "ThermalDofManager.MapsOnlyConnectedNodesAndOverridesModelBoundary", + "ThermalDofManager.RejectsChangedThermalLayoutInventory", + "ThermalDofManager.KeepsDisconnectedThermalComponentsInSeparateCsrBlocks", + "ThermalDofManager.RejectsThermalLayoutsForStructuralModels", + "DenseBlasInternal.DiagonalProductKeepsEntrywiseCancellationAndChecks", + "DenseBlasInternal.LocalDenseScopeRestoresTlsAfterProductsAndUnwind", + "DenseBlasInternal.OuterProductLeavesFiniteInputOverflowForOwnerGate", + "DenseBlasInternal.OuterProductUsesRectangularStorageAndPreservesRejection", + "DenseBlasInternal.PolicyQueryPreservesDefaultPositiveAndNestedTls", + "DenseBlasInternal.SingleEquationScopeRestoresTlsAndRespectsOverrides", + "DenseBlasInternal.TransposeProductChecksShapeAndKnownRectangularAction", + "DenseBlasInternal.TransposeRightProductUsesInnerAndRectangularStrides", + "DenseBlasInternal.CholeskyAndInverseMatchKnownFactorsAndKeepFailedOutput", + "DenseBlasInternal.CholeskyFailureReasonPreservesCandidatesAndResetsOnReuse", + "HighLowArithmetic.FiniteClassificationMatchesBinary64Boundaries", + "HighLowArithmetic.BitExponentMatchesFrozenOracleAcrossEveryExponent", + "HighLowArithmetic.OptimizedArithmeticMatchesFrozenOriginalBits", + "DenseMath.MatrixProductsRejectNonfiniteOperandsAndPreserveValidReuse", + "InpDomainMapping.RejectsUnsupportedNonlinearProceduresAndMixedModels", + "InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio", + "Hex8Semantics.SamplesIndependentAmplitudeLoadsAtActualEndpoints", + "Hex8Semantics.RejectsAmplitudeOptionsDataAndCrossFamilyUse", + "Hex8Semantics.MapsAllFiveUnmodifiedRequiredSourceDecks", + "Hex8Semantics.ValidatesOutputNoOpsAndRejectsUnapprovedDynamicChildren", + "Hex8Semantics.RejectsSecondProcedureBeforeReadingItsOptionsOrData", + "Hex8Semantics.AllowsOnlyApprovedStaticRestartNoOp", + "Hex8Semantics.RejectsInvalidSolidDynamicSchedulesAndIncrementLimits", + "HhtDynamicDomainMapping.MapsOriginalReferenceDeckWithoutMutation", + "ThermalDomainMapping.MapsApprovedShellThermalReference", + "ThermalDomainMapping.InactiveTargetsFailWithOriginalKeywordAndIdentity", + "ThermalDomainMapping.ModelBoundaryInheritanceAndStepOverrideReachDofManager", + "SolidPreparedAnalysis.MissingSolidAdapterFailsWithoutLegacyDispatch", + "SolidNewtonIterationLog.InvalidScalarEvidencePermanentlyFailsLogLifecycle", + "ThermalAnalysisModel.KeepsThermalSectionMaterialIndicesSeparateFromDomainMaterials", + "ThermalAnalysisModel.ViewsConnectedDs4EntitiesWithoutOwningDomain", + "ResultRecoveryComponents.PartitionedScaleKeepsCancelledInternalTerms", + "MklPardisoSolver.SingleEquationPolicyPreservesLifecycleAndConcurrentTls", + "MklPardisoSolver.SingleEquationScopeTransitionsBetweenRetainedSizes", + "TangentSolver.ReusesRhsButFreshValuesAndFailureCannotReuseStaleState", + "TangentSolver.SingleEquationScopeRestoresTlsAcrossFreshFailureAndReuse", + "TangentSolver.SingleEquationScopeTransitionsBetweenRetainedSizes", + "EigenReferenceComparison.DirectSchemaFixtureAcceptsRepeatedReorderedModes", + "ReferenceTolerancePolicy.EigenFirstImplementationDoesNotRelaxCommonPolicy", + "ReferenceTolerancePolicy.EigenFirstImplementationPreservesZeroAndFiniteChecks", + "ReferenceTolerancePolicy.EigenFirstImplementationRejectsNonmodalFamilies", + "ThermalReferenceComparison.HdfSchemaMappingRejectsMalformedStationFrameAndNodeData", + "ThermalReferenceComparison.MapsSourceLabelsWithoutRowOrderAndPreservesSignedValues", + "ThermalReferenceComparison.RejectsMissingExtraDuplicateAndNonfiniteBeforeTolerance", + "ThermalReferenceComparison.RejectsWrongStepTimeIncrementInstanceAndStation", + "ThermalReferenceComparison.UsesUnmodifiedFivePercentOnePercentAndExactZeroPolicy", + "ThermalReferenceComparison.CsvRequiresExactHeaderFrameFiniteValuesAndSoleInstance" + ], + "no_past_pass_inherited": true, + "all_identities_one_to_one": true + }, + "parity_floor": { + "scope": "temporary tooling evidence, not FESA physics validation", + "checks": [ + { + "name": "length-zero-v2-false-green", + "exit": 0 + }, + { + "name": "length-zero-only", + "exit": 1, + "expected": 1 + }, + { + "name": "meaningful-identical", + "exit": 0, + "expected": 0 + }, + { + "name": "meaningful-mismatch", + "exit": 1, + "expected": 1 + } + ] + }, + "missing_canonical_reference_status": "shellNL-meshfine/pressure 자료 미확보, _02 자료 및 comparator 연결 미확보; PASS/삭제 근거 아님", + "deferred_actual_physics": [ + "HHT", + "solid dynamic", + "eigen/frequency", + "transient thermal" + ], + "past_pass_inheritance": false, + "final_static_summary": { + "path": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\final-static-summary.json", + "sha256": "6ad49397d827a8f35ab8400d62582e544e2b5a9a4d2f5e50f7b9030972e336a8" + }, + "selection_evidence": { + "path": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\selection.json", + "sha256": "5f129bce23afb05a76efc288db37cc3c698132cb90a615ce863dc360929b8861", + "source_files": 82 + }, + "scope_execution": { + "unique_selected_cpp": 631, + "deferred_cpp": 333, + "native": { + "unit": 555, + "integration_short_tmp": 35, + "reference": 41, + "exit": 0, + "skip": 0 + }, + "cmake_direct": { + "unit": 555, + "integration_short_tmp": 35, + "reference": 41, + "exit": 0, + "skip": 0 + }, + "ctest": { + "count": 631, + "identity_match": true, + "exit": 0, + "skip": 0 + }, + "python_synthetic_policy": { + "count": 145, + "exit": 0, + "failure": 0, + "error": 0, + "skip": 0 + }, + "original_suite_aggregate_exit": 1, + "original_suite_nonzero_classification": "environment/path limit; preserved, same-exe long1 short0; both integration35 short TMP confirmed0", + "actual_model_count": 15, + "registered_comparisons": 15, + "model_stage_count": 50, + "model_stage_aggregate_exit": 0, + "products274_and_canonical_references32_unchanged": true, + "original_manifest_top_fields_unchanged": true + }, + "same_exe_path_probe": [ + { + "name": "path-probe-long", + "argv": [ + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\native\\Debug\\tests\\fesa_integration_tests.exe", + "--gtest_filter=ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior", + "--gtest_output=xml:C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\path-probe-long.xml" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "TMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\native-Debug-integration-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\native-Debug-integration-tmp", + "exit": 1, + "seconds": 0.0917518138885498, + "exe_sha256": "2f840c974d76511ab3ce36b2acfcf640729802e185eb0b076dce087fc2e414df", + "removed_filters": {}, + "log_sha256": "8acb5c13977c6f95949da7c6ea9e7a4a809bbd85bd23e645f1a25868c7f08eb2", + "xml_sha256": "5ba4b6fd33e8d16300de594aba6b69cfc522e84f9015aaf1298e48838a8c8eee", + "failure_count": 2 + }, + { + "name": "path-probe-short", + "argv": [ + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\native\\Debug\\tests\\fesa_integration_tests.exe", + "--gtest_filter=ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior", + "--gtest_output=xml:C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\path-probe-short.xml" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "TMP": "C:\\git\\FESADev\\.dryforge\\tmp\\t5s1\\probe-short", + "TEMP": "C:\\git\\FESADev\\.dryforge\\tmp\\t5s1\\probe-short", + "exit": 0, + "seconds": 0.6247260570526123, + "exe_sha256": "2f840c974d76511ab3ce36b2acfcf640729802e185eb0b076dce087fc2e414df", + "removed_filters": {}, + "log_sha256": "a4e3e2819e1c36c2e1dc93c48a24c27608399be5ffe5cce59012d3a3bd526286", + "xml_sha256": "39302958daa00efb48893d54f98e16248994f4e153fa769826a918340ebaa612", + "failure_count": 0 + } + ], + "integration_short_tmp_confirmation": [ + { + "name": "native-Debug-integration-short-tmp", + "argv": [ + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\native\\Debug\\tests\\fesa_integration_tests.exe", + "--gtest_flagfile=C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\native-Debug-integration.flags", + "--gtest_output=xml:C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\native-Debug-integration-short-tmp.xml" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "TMP": "C:\\git\\FESADev\\.dryforge\\tmp\\t5s1\\native-Debug-integration-short-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\tmp\\t5s1\\native-Debug-integration-short-tmp", + "exit": 0, + "seconds": 8.323283672332764, + "count": 35, + "skip": 0, + "failed_testcases": 0, + "failure_assertions": 0, + "errors": 0, + "identity_match": true, + "exe_sha256": "2f840c974d76511ab3ce36b2acfcf640729802e185eb0b076dce087fc2e414df", + "removed_filters": {}, + "log_sha256": "a36fd261722050a6008de4ca6a5e9a96f7515a88ff7ca638056fe6dc8cb8922f", + "xml_sha256": "a2838c6f90f48c7fc4e730156fe23260fa227ba5b42e6184be7040e6c3471f54" + }, + { + "name": "cmake-debug-integration-short-tmp", + "argv": [ + "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\cmake-debug\\tests\\fesa_integration_tests.exe", + "--gtest_flagfile=C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\cmake-debug-integration.flags", + "--gtest_output=xml:C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\cmake-debug-integration-short-tmp.xml" + ], + "cwd": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker", + "TMP": "C:\\git\\FESADev\\.dryforge\\tmp\\t5s1\\cmake-debug-integration-short-tmp", + "TEMP": "C:\\git\\FESADev\\.dryforge\\tmp\\t5s1\\cmake-debug-integration-short-tmp", + "exit": 0, + "seconds": 8.566259622573853, + "count": 35, + "skip": 0, + "failed_testcases": 0, + "failure_assertions": 0, + "errors": 0, + "identity_match": true, + "exe_sha256": "ce14dd8bea3f4b78f67d1d6079107087e96a6270f075226304b91e2191d62ebb", + "removed_filters": {}, + "log_sha256": "7fc1442f2c1da1f9dd9de4c495f54969babc6b596a51ceeaf1c302c53a04d5de", + "xml_sha256": "56ba509e0595bde41fedff7b079480a3a2830d7235331fc93cefd28ba705b7ab" + } + ], + "static_numerical_review": { + "status": "CONCERNS", + "required_static_missing": false, + "copy_sha256": "991e8c06781437e4637d6ea8a6ebf3f2da373a063de192e1dc11e564c2909b1d" + }, + "concerns": [ + "HHT/solid dynamic/eigen/frequency/transient thermal actual verification", + "missing fine/_02/pressure canonical comparison", + "ShellNL RF/RM numeric pass", + "ShellNL stress mapping", + "full964 pass", + "test pruning or final repository integration" + ], + "t6_scope_disposition": "사용자 수정 지시에 따라 확보된 정적 gate 통과 후 다음 단계 허용; 비정적·누락자료 미완료를 PASS/테스트삭제 근거로 사용하지 않음", + "tool_source_sha256": { + "final-static-check.py": "0866727db4e094b03faad59b74e9bdd72fc9785ba7734ac71513bd3d8e3c4c83", + "hdf-inventory.py": "1820a0ab855dfbfd8ea4c84f123668309f1d3a380be332e15a179c7c7ca1f4e4", + "hdf-parity-v2.py": "a277726e72fd335d0e1e5af8fc4df46a62e71d45d57d91d3ee21e859d56cb9f8", + "hdf-parity.py": "253cb7c40b76ec6e3a46f365573d8a2afdbfec4b2221ff9876135581faa19b3f", + "models.py": "de000d628eec1326373c29e46359dded468e7b48fee4406426b84fd3876a9af7", + "parity-floor.py": "179c538476e597491e39f3ef1d9d4570734ef3da2cbf91c747f8f29f174e6d16", + "path-probe.py": "67c073d064321725bc647683a11ddb88c6a6f1a5e9fcbd693cc34c45f6993e63", + "post-suite-check.py": "72f0dbb161388f1cc5fcdcc181e30f42fb0a06cee41882327c344b2986ee5699", + "publish-static-evidence.py": "daf9f3f4590513027ff1d1789dd61b57ddc8b6e05848b5772af69f4b609bdb8a", + "retry-integration.py": "84f331c2951fc8fd79d824457f341e33b22c735fa9dfeaf5ab8eb093e40a47e3", + "runner-deep-tmp.py": "b1a977948a9eafdc25cd94e0046b69fbd18f8ffcfa82e7ee73fab7993f8d203e", + "runner.py": "a71ca7d688fe93cf9009a1598db1bf801db1d34064099a317e81d03c01589b8f", + "static-suites.py": "b8d4f64fd7403ee92550fcd09eb01e034e508d35ee577f60dc268ed5d3bbd46d", + "validate-report.py": "296084e5af8fa79aa12af07b061afd29a80338684623ce7086f69e4035f90f80" + }, + "static_models": [ + { + "case": "beam", + "original_input": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\reference\\cantilever beam\\cantilever beam.inp", + "original_input_sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3", + "same_scratch_path_and_bytes": true, + "step_frame": "Step-1/frame0", + "policy": "승인 공통 near-zero=1%, relative=5%, RMS=1%; exact-zero 유지. shell UR warning-only, shellNL RF/RM review-only; 내부평형 별도 기존 gate.", + "families": [ + { + "identity": "displacement-translation", + "passed": true, + "blocking": true, + "row_count": 33, + "components": [ + "UX", + "UY", + "UZ" + ] + }, + { + "identity": "displacement-rotation", + "passed": true, + "blocking": true, + "row_count": 33, + "components": [ + "URX", + "URY", + "URZ" + ] + }, + { + "identity": "reaction-force", + "passed": true, + "blocking": true, + "row_count": 33, + "components": [ + "RF1", + "RF2", + "RF3" + ] + }, + { + "identity": "reaction-moment", + "passed": true, + "blocking": true, + "row_count": 33, + "components": [ + "RM1", + "RM2", + "RM3" + ] + }, + { + "identity": "section-force", + "passed": true, + "blocking": true, + "row_count": 20, + "components": [ + "N" + ] + }, + { + "identity": "section-moment", + "passed": true, + "blocking": true, + "row_count": 60, + "components": [ + "T", + "My", + "Mz" + ] + } + ], + "source_identities": null, + "original_artifacts": [ + { + "path": "reference/cantilever beam/cantilever beam displacements.csv", + "original_sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31", + "worker_sha256": "7b3312fbc8848e81d9a0fd4ff2b56bc1954636a2c14b5c1cbb269cb9477d3c31" + }, + { + "path": "reference/cantilever beam/cantilever beam elemental forces.csv", + "original_sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a", + "worker_sha256": "0093c0a506142bd3dc8eeeb87d5f08fd7490567a1ed144920029a2d2f38d119a" + }, + { + "path": "reference/cantilever beam/cantilever beam reactions.csv", + "original_sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23", + "worker_sha256": "bf30cdb0cd50106885de14d63492737736c587426ebd787de4f7ee6aa86daa23" + }, + { + "path": "reference/cantilever beam/cantilever beam.inp", + "original_sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3", + "worker_sha256": "e406ea9560321b791dbdb829e03bd24593b9875e0195d35b86bd931eda122ef3" + } + ], + "internal_equilibrium": null, + "variants": [ + { + "variant": "refactor-baseline", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "4e7701173036406ad58f3610d896f53ee5d7fd3ad395e12f9afeb632d0fbfa89", + "comparison_json_sha256": "ad00680aa610a516c8ea83473ad6329a00aa67d69ff983c2be7ce0673a535bd2", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\beam\\refactor-baseline\\execution.json", + "closed_execution_record_sha256": "9b8d73f91d4832f1ae8ca66c7f790bf693667cfac4f1ca5131e1ab8e83081e3c" + }, + { + "variant": "integrated-native", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "bdfe4f223469c44682a4dbe4413800c05eb8dd4656a27ddabed9fe56358e5cf7", + "comparison_json_sha256": "ad00680aa610a516c8ea83473ad6329a00aa67d69ff983c2be7ce0673a535bd2", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\beam\\integrated-native\\execution.json", + "closed_execution_record_sha256": "bf9c503067be9f0750e6c0001ce67d6bd85e5776f5a59be0a77c72b135f3caca" + }, + { + "variant": "integrated-cmake", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "bdfe4f223469c44682a4dbe4413800c05eb8dd4656a27ddabed9fe56358e5cf7", + "comparison_json_sha256": "ad00680aa610a516c8ea83473ad6329a00aa67d69ff983c2be7ce0673a535bd2", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\beam\\integrated-cmake\\execution.json", + "closed_execution_record_sha256": "703ce7ed8823a0655d62f92f0d9c3958cd48320d3ec6e6468f46e276e3c73b04" + } + ], + "parity_exact_field_equality": true, + "parity_json_sha256": "c0d9219b7f41ae3f6f1447660f4b98ac26dd02c37a0a83a605e0a43b7420c226" + }, + { + "case": "shell", + "original_input": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\reference\\shell\\shell.inp", + "original_input_sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf", + "same_scratch_path_and_bytes": true, + "step_frame": "Step-1/frame0", + "policy": "승인 공통 near-zero=1%, relative=5%, RMS=1%; exact-zero 유지. shell UR warning-only, shellNL RF/RM review-only; 내부평형 별도 기존 gate.", + "families": [ + { + "identity": "displacement-translation", + "passed": true, + "blocking": true, + "row_count": 147, + "components": [ + "U1", + "U2", + "U3" + ] + }, + { + "identity": "displacement-rotation", + "passed": true, + "blocking": false, + "row_count": 147, + "components": [ + "UR1", + "UR2", + "UR3" + ] + } + ], + "source_identities": null, + "original_artifacts": [ + { + "path": "reference/shell/shell displacements.csv", + "original_sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b", + "worker_sha256": "c81d94e0b4a849f87aa0f79c83a79b94d5661ac79e44ed826919ab432c87746b" + }, + { + "path": "reference/shell/shell reactions.csv", + "original_sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41", + "worker_sha256": "0e34eec27e700c3c0c744c1dafd8a3b95efef34b8616fe96665876586fe82d41" + }, + { + "path": "reference/shell/shell stresses.csv", + "original_sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7", + "worker_sha256": "2b75a5b0deb045a283c9bb7e9b1153b79f7537ff487214bf4a23316b59b660a7" + }, + { + "path": "reference/shell/shell.inp", + "original_sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf", + "worker_sha256": "4005851e1ab22fd3a16ac17a8d5da3e051233f69f37419079f3553ad134ecfcf" + } + ], + "internal_equilibrium": null, + "variants": [ + { + "variant": "refactor-baseline", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "5b65511a17d5c95165c71f06999d1dfcd50b0b100a5d33e79f46bad61efbb094", + "comparison_json_sha256": "8c3dcd1805e3a9c899bb05d4a93292f158c5c7b04931a86d3a610db074f0e0a7", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\shell\\refactor-baseline\\execution.json", + "closed_execution_record_sha256": "ef780ccb8093fc27a809099a2e02b2e9466beb0fa09dbd6a1a193d7a64be248e" + }, + { + "variant": "integrated-native", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "f9bd051f14553ff09d931977563e8045beeacd6bddd3f07e2b7c265d4579d353", + "comparison_json_sha256": "8c3dcd1805e3a9c899bb05d4a93292f158c5c7b04931a86d3a610db074f0e0a7", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\shell\\integrated-native\\execution.json", + "closed_execution_record_sha256": "dbd6d65b9a6925fee6829c918e8f8db22437325d701f1dd35a083071ff5933ae" + }, + { + "variant": "integrated-cmake", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "61d4076756aff52bd11d3f1634dfaad15897082f623f4cacea5a3fec55066511", + "comparison_json_sha256": "8c3dcd1805e3a9c899bb05d4a93292f158c5c7b04931a86d3a610db074f0e0a7", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\shell\\integrated-cmake\\execution.json", + "closed_execution_record_sha256": "a7a8f35103feb265ce09542bcdefde7fda7e910fcc5ed2e50474947804515d99" + } + ], + "parity_exact_field_equality": true, + "parity_json_sha256": "6c9333ec2d260c94f77128a594017ac620772b0541c1f4f56000ae4a1c2c28c4" + }, + { + "case": "shellNL", + "original_input": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\reference\\shellNL\\shellNL.inp", + "original_input_sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2", + "same_scratch_path_and_bytes": true, + "step_frame": "Step-1/frame9/increment10/load factor1", + "policy": "승인 공통 near-zero=1%, relative=5%, RMS=1%; exact-zero 유지. shell UR warning-only, shellNL RF/RM review-only; 내부평형 별도 기존 gate.", + "families": [ + { + "identity": "coarse.translation", + "passed": true, + "disposition": "blocking", + "rows": 147 + }, + { + "identity": "coarse.rotation", + "passed": true, + "disposition": "warning-only", + "rows": 147 + }, + { + "identity": "coarse.local_reaction_inplane_force", + "passed": false, + "disposition": "review-only", + "rows": 48 + }, + { + "identity": "coarse.local_reaction_transverse_force", + "passed": false, + "disposition": "review-only", + "rows": 24 + }, + { + "identity": "coarse.local_reaction_physical_moment", + "passed": false, + "disposition": "review-only", + "rows": 48 + } + ], + "source_identities": null, + "original_artifacts": [ + { + "path": "reference/shellNL/shellNL displacements.csv", + "original_sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786", + "worker_sha256": "4e0f99ca9372b1adf7faf102f43bc0b887dc743fdeda378e4342d2cf8e0c0786" + }, + { + "path": "reference/shellNL/shellNL reactions.csv", + "original_sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069", + "worker_sha256": "001cb1541a9e94424e5e650509d46bc8724970df4de47184d9db09c7938ab069" + }, + { + "path": "reference/shellNL/shellNL stresses.csv", + "original_sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f", + "worker_sha256": "5500e5114b1c44887528e30cec054a1eb0f68be3f4b8ce81fa59fc74a881483f" + }, + { + "path": "reference/shellNL/shellNL.inp", + "original_sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2", + "worker_sha256": "4bf3ecb0f7f1e8462c573e993dbc97ac5d920c91cf6f23ad4c6891d77ffbada2" + } + ], + "internal_equilibrium": [ + { + "identity": "coarse.global_force_balance", + "rows": 3, + "numerator": 8.250208361466102e-07, + "scale": 100000.0043929911, + "normalized": 8.250207999035198e-12, + "passed": true + }, + { + "identity": "coarse.global_moment_balance", + "rows": 3, + "numerator": 1.1424141050618153e-10, + "scale": 295586.7896222235, + "normalized": 3.864902442094535e-16, + "passed": true + }, + { + "identity": "coarse.accepted_free_force_residual", + "rows": 75, + "numerator": 0.03147525900497561, + "scale": 100000.00000106171, + "normalized": 3.1475259004641434e-07, + "passed": true + }, + { + "identity": "coarse.accepted_free_moment_residual", + "rows": 75, + "numerator": 3.5872449718902036e-07, + "scale": 0, + "normalized": null, + "passed": true + } + ], + "variants": [ + { + "variant": "refactor-baseline", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "473b21e57e86bf920603b9174e23bf08e54ccfcf3830048319b170b721a78ae8", + "comparison_json_sha256": "1849a26e3244c2a15c0301855081dfe218fa2d76d4b89e3171480a43457c3124", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\shellNL\\refactor-baseline\\execution.json", + "closed_execution_record_sha256": "1e68a78c45907d6dadf07bc166115155bc625ee7db61416e8e2d58672c37e305" + }, + { + "variant": "integrated-native", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "110ab7ba28a8b42fa66a4b883185fd1371a29d3caafcba69e144218622c03380", + "comparison_json_sha256": "1849a26e3244c2a15c0301855081dfe218fa2d76d4b89e3171480a43457c3124", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\shellNL\\integrated-native\\execution.json", + "closed_execution_record_sha256": "ded05fcef56b37440683c3258feb237b49c6e1d22b0e75c525b5d56481189e83" + }, + { + "variant": "integrated-cmake", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "733139c6c831dde9e3977b4b3a9da5bd279b7b428a32950e5b0d20f0c4ed93c7", + "comparison_json_sha256": "1849a26e3244c2a15c0301855081dfe218fa2d76d4b89e3171480a43457c3124", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\shellNL\\integrated-cmake\\execution.json", + "closed_execution_record_sha256": "47a86f6f77a7a5819ea6a70c0aa5ced27f256abc1fd38efc5b7578d1ff2d3b2a" + } + ], + "parity_exact_field_equality": true, + "parity_json_sha256": "7ae0e493480d1da86bc883cafd289dd9665666ebd1d473dd27e7515afcf83699" + }, + { + "case": "hexa_linearstatic", + "original_input": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\reference\\hexa\\hexa_linearstatic.inp", + "original_input_sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647", + "same_scratch_path_and_bytes": true, + "step_frame": "Step-1/increment10", + "policy": "승인 공통 near-zero=1%, relative=5%, RMS=1%; exact-zero 유지. shell UR warning-only, shellNL RF/RM review-only; 내부평형 별도 기존 gate.", + "families": [ + { + "absolute_rms": 1.7343612573050297e-11, + "case": "hexa_linearstatic", + "coordinate_system": "global-cartesian", + "diagnostic_code": null, + "identity": "hexa_linearstatic:Step-1:increment-10:U-global", + "impact": "blocking", + "increment": 10, + "maximum_absolute_error": 6.096261212854004e-11, + "near_zero_band": 1.86131289e-05, + "passed": true, + "policy": { + "near_zero_ratio": 0.01, + "relative_rms_tolerance": 0.01, + "relative_tolerance": 0.05, + "zero_scale": "exact-zero" + }, + "quantity": "U", + "reference_scale": 0.00186131289, + "reference_sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f", + "relative_rms": 9.31794577162698e-09, + "rms_passed": true, + "row_count": 1326, + "rows_passed": true, + "step": "Step-1", + "unit_dimensions": "length" + }, + { + "absolute_rms": 0.003753553196815386, + "case": "hexa_linearstatic", + "coordinate_system": "global-cartesian", + "diagnostic_code": null, + "identity": "hexa_linearstatic:Step-1:increment-10:RF-global", + "impact": "blocking", + "increment": 10, + "maximum_absolute_error": 0.014747577370144427, + "near_zero_band": 5134.97094, + "passed": true, + "policy": { + "near_zero_ratio": 0.01, + "relative_rms_tolerance": 0.01, + "relative_tolerance": 0.05, + "zero_scale": "exact-zero" + }, + "quantity": "RF", + "reference_scale": 513497.094, + "reference_sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b", + "relative_rms": 7.309784691430768e-09, + "rms_passed": true, + "row_count": 51, + "rows_passed": true, + "step": "Step-1", + "unit_dimensions": "force" + }, + { + "absolute_rms": 0.01175146192247426, + "case": "hexa_linearstatic", + "coordinate_system": "global-cartesian", + "diagnostic_code": null, + "identity": "hexa_linearstatic:Step-1:increment-10:S-global", + "impact": "blocking", + "increment": 10, + "maximum_absolute_error": 0.12245092866942286, + "near_zero_band": 34301.45, + "passed": true, + "policy": { + "near_zero_ratio": 0.01, + "relative_rms_tolerance": 0.01, + "relative_tolerance": 0.05, + "zero_scale": "exact-zero" + }, + "quantity": "S", + "reference_scale": 3430145.0, + "reference_sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8", + "relative_rms": 3.4259373648852337e-09, + "rms_passed": true, + "row_count": 14400, + "rows_passed": true, + "step": "Step-1", + "unit_dimensions": "force/length^2" + } + ], + "source_identities": { + "RF": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/reference/hexa/hexa_linearstatic_RF.csv", + "sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + "S": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/reference/hexa/hexa_linearstatic_S.csv", + "sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + "U": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/reference/hexa/hexa_linearstatic_U.csv", + "sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + }, + "input": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/.build/merge-verification/t5-20261018-01/before-prune/static-only/run-20261018-01/models/hexa_linearstatic/hexa_linearstatic.inp", + "sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + "results": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/.build/merge-verification/t5-20261018-01/before-prune/static-only/run-20261018-01/models/hexa_linearstatic/refactor-baseline/hexa_linearstatic_results.h5", + "sha256": "4b873c562a4235fccaa4a0223d4127f9bb831dc3cb0030f4e95b636f330f3191" + } + }, + "original_artifacts": [ + { + "path": "reference/hexa/hexa_linearstatic.inp", + "original_sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647", + "worker_sha256": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647" + }, + { + "path": "reference/hexa/hexa_linearstatic_RF.csv", + "original_sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b", + "worker_sha256": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b" + }, + { + "path": "reference/hexa/hexa_linearstatic_S.csv", + "original_sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8", + "worker_sha256": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8" + }, + { + "path": "reference/hexa/hexa_linearstatic_U.csv", + "original_sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f", + "worker_sha256": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f" + } + ], + "internal_equilibrium": null, + "variants": [ + { + "variant": "refactor-baseline", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "4b873c562a4235fccaa4a0223d4127f9bb831dc3cb0030f4e95b636f330f3191", + "comparison_json_sha256": "b6fe5cef31878764d446b7115b6c9719c2230f3b693f8c0337c39b3acf3f8b57", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\hexa_linearstatic\\refactor-baseline\\execution.json", + "closed_execution_record_sha256": "fa8d379fc09382d45a20be01c6819a653e918cde9d4185df388df85e4ba32288" + }, + { + "variant": "integrated-native", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "a15569ea49fa4471a44e234dd8bea4746ff23555199d7c3b190ee98ac88d6862", + "comparison_json_sha256": "b831efdc22de87c9e9291ec072e962825916ec6c3b9972bf0c016171007e15d6", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\hexa_linearstatic\\integrated-native\\execution.json", + "closed_execution_record_sha256": "be49e9d99f045fb41d730897430c18da8ed0c06541fa866691aea1637e4c8ce4" + }, + { + "variant": "integrated-cmake", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "d7403f7eb7cffc114d0160239139a07b59416beb1e438c4dea5c663fe2f4a508", + "comparison_json_sha256": "663cdb6b90d3424152a667ea0d4234e1e0134437cb1b3b5c1fde2c952ba60ab5", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\hexa_linearstatic\\integrated-cmake\\execution.json", + "closed_execution_record_sha256": "d91ec0e13064081fbb90f9a91cea606cc3ec1cfd4518a320761f43245391d045" + } + ], + "parity_exact_field_equality": true, + "parity_json_sha256": "1712feb9f4e805464a1e3ccbff14506db5dc4fd1a41a929af1e71507be7b848e" + }, + { + "case": "hexa_nonlinearstatic", + "original_input": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\reference\\hexa\\hexa_nonlinearstatic.inp", + "original_input_sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb", + "same_scratch_path_and_bytes": true, + "step_frame": "Step-1/increment10", + "policy": "승인 공통 near-zero=1%, relative=5%, RMS=1%; exact-zero 유지. shell UR warning-only, shellNL RF/RM review-only; 내부평형 별도 기존 gate.", + "families": [ + { + "absolute_rms": 4.0384401297166145e-10, + "case": "hexa_nonlinearstatic", + "coordinate_system": "global-cartesian", + "diagnostic_code": null, + "identity": "hexa_nonlinearstatic:Step-1:increment-10:U-global", + "impact": "blocking", + "increment": 10, + "maximum_absolute_error": 9.832466004058268e-10, + "near_zero_band": 1.86110672e-05, + "passed": true, + "policy": { + "near_zero_ratio": 0.01, + "relative_rms_tolerance": 0.01, + "relative_tolerance": 0.05, + "zero_scale": "exact-zero" + }, + "quantity": "U", + "reference_scale": 0.00186110672, + "reference_sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6", + "relative_rms": 2.1699132490997694e-07, + "rms_passed": true, + "row_count": 1326, + "rows_passed": true, + "step": "Step-1", + "unit_dimensions": "length" + }, + { + "absolute_rms": 3.45450971453263, + "case": "hexa_nonlinearstatic", + "coordinate_system": "global-cartesian", + "diagnostic_code": null, + "identity": "hexa_nonlinearstatic:Step-1:increment-10:RF-global", + "impact": "blocking", + "increment": 10, + "maximum_absolute_error": 12.82618010538863, + "near_zero_band": 5134.45594, + "passed": true, + "policy": { + "near_zero_ratio": 0.01, + "relative_rms_tolerance": 0.01, + "relative_tolerance": 0.05, + "zero_scale": "exact-zero" + }, + "quantity": "RF", + "reference_scale": 513445.594, + "reference_sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b", + "relative_rms": 6.728093014919571e-06, + "rms_passed": true, + "row_count": 51, + "rows_passed": true, + "step": "Step-1", + "unit_dimensions": "force" + }, + { + "absolute_rms": 32.03072457600377, + "case": "hexa_nonlinearstatic", + "coordinate_system": "global-cartesian", + "diagnostic_code": null, + "identity": "hexa_nonlinearstatic:Step-1:increment-10:S-global", + "impact": "blocking", + "increment": 10, + "maximum_absolute_error": 93.3499531284906, + "near_zero_band": 34298.1775, + "passed": true, + "policy": { + "near_zero_ratio": 0.01, + "relative_rms_tolerance": 0.01, + "relative_tolerance": 0.05, + "zero_scale": "exact-zero" + }, + "quantity": "S", + "reference_scale": 3429817.75, + "reference_sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba", + "relative_rms": 9.338899880614289e-06, + "rms_passed": true, + "row_count": 14400, + "rows_passed": true, + "step": "Step-1", + "unit_dimensions": "force/length^2" + } + ], + "source_identities": { + "RF": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/reference/hexa/hexa_nonlinearstatic_RF.csv", + "sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + "S": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/reference/hexa/hexa_nonlinearstatic_S.csv", + "sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + "U": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/reference/hexa/hexa_nonlinearstatic_U.csv", + "sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + }, + "input": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/.build/merge-verification/t5-20261018-01/before-prune/static-only/run-20261018-01/models/hexa_nonlinearstatic/hexa_nonlinearstatic.inp", + "sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + "results": { + "path": "C:/git/FESADev/.dryforge/worktrees/worker/.build/merge-verification/t5-20261018-01/before-prune/static-only/run-20261018-01/models/hexa_nonlinearstatic/refactor-baseline/hexa_nonlinearstatic_results.h5", + "sha256": "4ba47cc3faafba3d965120cac84ce1f97e612e5378d6ad1ece3a3ce71134a33e" + } + }, + "original_artifacts": [ + { + "path": "reference/hexa/hexa_nonlinearstatic.inp", + "original_sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb", + "worker_sha256": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_RF.csv", + "original_sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b", + "worker_sha256": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_S.csv", + "original_sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba", + "worker_sha256": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba" + }, + { + "path": "reference/hexa/hexa_nonlinearstatic_U.csv", + "original_sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6", + "worker_sha256": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6" + } + ], + "internal_equilibrium": null, + "variants": [ + { + "variant": "refactor-baseline", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "4ba47cc3faafba3d965120cac84ce1f97e612e5378d6ad1ece3a3ce71134a33e", + "comparison_json_sha256": "b69456e5379fc8ad880b571de562975ea0498a30c2aa2c3e40e48665ee56a87c", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\hexa_nonlinearstatic\\refactor-baseline\\execution.json", + "closed_execution_record_sha256": "14f8a9b88c694638bd78a87caa9fe2843f356fb93397f68b088bf582a0cbd617" + }, + { + "variant": "integrated-native", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "1f1e38f17c556e8b6665a148df54f664d5ba32ccce06fc994743117376a2be7e", + "comparison_json_sha256": "6882a517c8ff33887faa1a561dbf6d9da3d0e19783525ffbccd3349073a7e3fc", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\hexa_nonlinearstatic\\integrated-native\\execution.json", + "closed_execution_record_sha256": "05bdc431fcd010514d2e39aa47267ed1f953dada1363ea7d3e31cedd5cacf47a" + }, + { + "variant": "integrated-cmake", + "native_exit": 0, + "comparison_exit": 0, + "validation_exit": 0, + "result_sha256": "7804976c4689ddfd1ca4d8771bd7f67769012a9479cdf3348d2c1f86b00558cb", + "comparison_json_sha256": "5fd36891de72e2dcee58a2211aa3f96a02972f453f5ab28bd0311641380eef1a", + "closed_execution_record": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\models\\hexa_nonlinearstatic\\integrated-cmake\\execution.json", + "closed_execution_record_sha256": "06fb959abc86c50986bf6a0159cca149f8a6cf5c096fecc0eb908d052550b387" + } + ], + "parity_exact_field_equality": true, + "parity_json_sha256": "541545aab76de46ce701e608f0299ba650bd263646ac55b12247cfc7266d7129" + } + ], + "hdf_schema_identity_inventory": { + "path": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t5-20261018-01\\before-prune\\static-only\\run-20261018-01\\hdf-schema-identity-inventory.json", + "sha256": "72b672a1cfcde5873552a2a9758981ae0f262f3a944cd71219ac5d7d83f2f3bd" + } + }, + "t6_test_cleanup": { + "status": "DONE_WITH_CONCERNS", + "baseline": "26939140dae4fc83746d05d4fcf48085462ef83b", + "scope": "R6 applied only to approved static/common tests; nonstatic tests preserved", + "deleted_tests": 0, + "deleted_helpers": 0, + "replacements": [], + "reason": "Equivalent behavior/failure/numerical coverage or obsolete-only internal structure not sufficiently established; conservative retention required by R6", + "ledger": { + "rows": 2876, + "original_columns_preserved": 12, + "appended_columns": [ + "cleanup_decision", + "cleanup_reason_id", + "cleanup_evidence" + ], + "reason_counts_are_history_rows_not_unique_tests": { + "R-SUPPORT": 785, + "R-DEFER": 631, + "R-STATIC": 923, + "R-COMPARISON": 297, + "R-POLICY": 6, + "R-NUMERIC": 224, + "R-ORACLE": 2, + "R-CAPABILITY": 8 + } + }, + "review": { + "path": "docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md", + "sha256": "568146a93285181ad0b091458589255e50d708beac8e9d7209fe306aa4f35da9" + }, + "source_or_registration_changes": 0, + "discovery_count_preserved": 964, + "unique_static_common_preserved": 631, + "deferred_nonstatic_preserved": 333, + "registration_sources": { + "fesa_unit_tests": 90, + "fesa_integration_tests": 11, + "fesa_reference_tests": 17 + }, + "products274_refactor_bytes_exact": true, + "source_test_build_execution": "not run: documentation/table only, per AGENTS; T5 execution artifacts inspected and hashes preserved", + "verification": [ + { + "command": "python .build/merge-verification/t6-20261018/audit.py", + "exit": 0, + "path": ".build/merge-verification/t6-20261018/audit.json", + "sha256": "3bebab66024a4804cca618c918c295637c1fc4cb6f8e5ec6f2bf02cd3ad1d2b3" + }, + { + "command": "python .build/merge-verification/t6-20261018/finalize.py", + "exit": 0, + "path": ".build/merge-verification/t6-20261018/t5-xml-static-check.json", + "sha256": "e913ee695a972ecaf4b600548a46e969d43d3f748e24dde6008b5c42ff010053" + } + ], + "raw": ".build/merge-verification/t6-20261018", + "historical_t1_t2_t3_t5_fields_unchanged": true, + "remaining_limits": [ + "333 deferred nonstatic identities are not validated by this cleanup", + "missing fine/_02/pressure canonical data; _02 comparator connection absent", + "ShellNL RF/RM false/review-only; stress mapping undecided", + "thermal new reference missing; NT11 diagnostic limit retained", + "T7 final static verification and final integration remain separate" + ] + }, + "t7_final_handoff": { + "status": "APPROVED_STATIC_SCOPE_VERIFIED_PENDING_FINAL_REVIEW_AND_USER_INTEGRATION", + "code_state_commit": "4846206ede28624a6854483424c34683145d5d0e", + "t5_actual_verified_commit": "4841f1226f2a15c0a9a3fc004be9bee8ac3efb2b", + "new_build_test_solver_invocations": 0, + "reason_for_reuse": "T6/T7 are documentation only. All product/test/helper/script/registration inputs and actual executables/runtime/input/result hashes match T5. AGENTS.md requires static checks without build/test for documentation only changes.", + "current_source": { + "products_exact_refactor": 274, + "discovery_identities": 964, + "selected_static_common": 631, + "deferred_preserved": 333, + "deleted_tests": 0, + "deleted_helpers": 0, + "formulations_unchanged": 23, + "canonical_reference_hashes_verified": 32, + "protected_original_non_temp_files_verified": 43, + "reference_temp_read_or_used": false + }, + "verification": { + "path": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t7-20261018\\final-static-state.json", + "sha256": "f1263e50442157ded4d4eacc11689861f2636050c66990ab50184157c7988f5a", + "command": "python .build/merge-verification/t7-20261018/verify-final.py", + "exit": 0 + }, + "source_body_runtime_audit": { + "path": "C:\\git\\FESADev\\.dryforge\\worktrees\\worker\\.build\\merge-verification\\t7-20261018\\audit.json", + "sha256": "3bebab66024a4804cca618c918c295637c1fc4cb6f8e5ec6f2bf02cd3ad1d2b3", + "command": "python .build/merge-verification/t7-20261018/verify-state.py", + "exit": 0 + }, + "portable_evidence": { + "archive_root": "C:\\git\\FESADev\\.build\\merge-verification\\refactor-integration-final-20261018-01", + "inventory_path": "C:\\git\\FESADev\\.build\\merge-verification\\refactor-integration-final-20261018-01\\archive-inventory.json", + "inventory_sha256": "4bb779f0625210a8f14cc4a4322c70bae0ab58b62b4e94f0b92200f0015a210b", + "integrity_path": "C:\\git\\FESADev\\.build\\merge-verification\\refactor-integration-final-20261018-01\\archive-integrity.json", + "integrity_sha256": "b0a4277b11d13e97f826878c52e64626edb258d290d4a6c4f1a9f543c4b8517c", + "copied_files": 1379, + "actual_executables": 9, + "runtime_dll_snapshots": 35, + "fresh_refactor_source_files": 304, + "copy_integrity_exit": 0, + "originals_moved_or_deleted": false, + "historical_argv_paths_rewritten": false + }, + "limits": [ + "No full964 or nonstatic physics PASS; HHT user-cancelled/deferred", + "Missing canonical fine/_02/pressure comparisons; _02 comparator unavailable", + "ShellNL RF/RM false/review-only and stress mapping unresolved", + "Thermal new reference unavailable; NT11 diagnostic limits unchanged", + "Initial long TMP integration exit1 retained; same-exe short TMP35 reruns exit0", + "Original dev and Refactor preserved; no final dev merge or push yet" + ], + "temporary_static_audit_corrections": [ + { + "exit": 1, + "reason": "Initial55 protected count included12 forbidden temp paths; final verifies43 without reading temp." + }, + { + "exit": 1, + "reason": "Markdown URL-encoded link destination needed URL decoding; final397 relative links verified." + } + ] + } +} diff --git a/docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md b/docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md new file mode 100644 index 0000000..0dbbeca --- /dev/null +++ b/docs/cpp-object-oriented-modular-refactoring/test-cleanup-review.md @@ -0,0 +1,104 @@ +# T6 검사 정리 판정 — 승인된 정적 범위 + +삭제는 **0개**다. 검사 본문·helper·CMake/MSVC 등록을 변경하지 않았다. +같은 행동·실패 경계·수치 조건의 동등 대체 또는 폐기된 내부 구조만 검사한다는 근거가 +충분한 후보를 찾지 못했다. 모든 검사가 서로 독립적이라고 증명했다는 뜻은 아니다. +판정이 불충분한 검사를 보존한다는 R6 계약을 적용했다. + +[이관표](test-migration.tsv)의 기존 2,876행·12열·identity·assertion 셀은 보존하고 +`cleanup_decision`, `cleanup_reason_id`, `cleanup_evidence` 3열만 덧붙였다. +Dev/Refactor의 같은 최종 검사로 연결되는 두 행은 출처 이력이며 실행 중복이 아니다. +삭제가 없으므로 대체 identity도 없다. 아래 identity는 **대체 지정이 아닌 비교 검토 대상**이다. +`disposition`, `final_sha256` 등 옛 셀과 T3 manifest는 당시 이력으로 그대로 둔다. + +## R-DEFER + +HHT·dynamic·eigen/frequency·transient thermal 실제 수치 검증 333개를 유예 상태로 +보존한다. 선택 밖이라는 이유로 삭제하지 않는다. 같은 파일의 공통/helper 구간도 보존한다. +전체 body hash의 유일한 반복 묶음은 +`FixedStations/ThermalSlab.ActualMeshesMatchCertifiedP2AndSeparateFourierError/0`부터 +`/11`까지다. 같은 `TEST_P` 본문을 서로 다른 parameter로 실행하는 12개 identity이고 +비정적 범위이므로 중복 삭제 후보로 채택하지 않았다. + +## R-POLICY + +`tests/test_cpp_policy_contract.py`의 두 검사를 유지한다. +`test_p_style_001_cpp_style_and_doxygen_tooling_contract`는 clang 형식·명명 규약, +Doxyfile의 입력/제외/경고와 optional `fesa_docs` 계약을 검사한다. +`test_p_style_002_msvc_targets_enable_standard_exception_unwinding`는 CMake의 +solver/CLI `/EHsc`, 직접 MSVC의 shared props `Sync`, 다섯 프로젝트의 import와 +override를 검사한다. Refactor에 파일이 없다는 사실은 폐기 근거가 아니다. + +## R-ORACLE + +`tests/unit/math/high_low_arithmetic_original.h`를 유지한다. include consumer는 +`high_low_arithmetic_test.cpp`와 `hex8_high_low_test.cpp` 두 개다. +`HighLowArithmetic.OptimizedArithmeticMatchesFrozenOriginalBits`는 원본 연산으로 raw +pair를 정규화한 뒤 high/low 비트를 비교한다. 제품 predicate를 oracle로 쓰지 않는다. +`BitExponentMatchesFrozenOracleAcrossEveryExponent`는 normal exponent·trailing bit와 +subnormal 경계를 검사한다. Hex8의 `FrozenMaterialPacket`·`FrozenGeometryPacket`도 +이 helper의 원본 연산 순서로 독립 expected를 만든다. 제품 helper로 치환하면 독립성이 사라진다. + +## R-NUMERIC + +다음은 이름/행동이 비슷해도 전체 계약의 동등 대체가 입증되지 않은 실제 본문 비교다. + +| 비교 대상 | 유지 근거 | +| --- | --- | +| `DenseMath.RowMajorMatrixMatchesKnownGemvGemm`, `MatrixProductKeepsShapeAndFiniteValidationOrder`와 private `DenseBlasInternal.RawProductsPreserveDestinationOnNonfiniteInput` | Public Matrix는 storage copy/move·차원 예외와 shape-before-finite 진단 순서를 소유한다. Private raw adapter는 caller 출력 buffer 보존을 검사한다. 공개 wrapper 성공만으로 private 실패 경계가 검증되지 않는다. | +| `DenseFactor.CholeskySolvesAndWhiteningRetainsScaleAndOrientation`와 `DenseBlasInternal.CholeskyAndInverseMatchKnownFactorsAndKeepFailedOutput` | 전자는 좌우·전치·직사각 RHS와 scaled whitening Gram을 검사한다. 후자는 identity RHS로 lower inverse의 명시적 `.5,-.25,.5` 값과 실패 뒤 기존 lower/inverse·factor 재사용을 검사한다. 일부 값의 중첩만으로 양쪽 전체 조건을 대체할 수 없다. | +| `DenseFactor.OwnsSnapshotAndFailedCandidatesPreserveReusableFactor`, `EmptyAndInfinityConditionBoundaryAreExplicit` | 입력 변경 후 snapshot, shape/NaN/pivot 실패·overflow solve 후 재사용, 빈 좌우 RHS 및 `2^-32` 양측/포함 경계가 있다. 낡은 lower/inverse 명칭이 남아 있어도 본문은 현재 factor 계약을 검사한다. | +| `MklPardisoSolver.SingleEquationScopeTransitionsBetweenRetainedSizes`와 `TangentSolver.SingleEquationScopeTransitionsBetweenRetainedSizes` | SPD `Factorize/Solve`와 비대칭 `FactorizeFresh/SolveCorrection` owner가 다르며 후자는 `{2,1,0,3}` 행렬을 쓴다. `ReusesRhsButFreshValuesAndFailureCannotReuseStaleState`는 fresh 실패 후 `solver-not-factorized`와 correction 보존도 검사한다. TLS 공통화만으로 각 owner 호출 경계가 없어지지 않는다. | +| `HighLowArithmetic.PacketDispatchRetainsComponentsAndInstructionGates`와 `Hex8HighLow.PacketVectorGuardsPreserveScalarFlagsAndBits`, `PacketDoesNotClearPriorMaskedStickyFlags`, `ConcurrentFirstLinearTrialsAcrossCopiesAndMoveKeepBits` | dispatch ISA/OS·FTZ 복원과 scalar/packet 선택, SIMD lane의 RN64/status·FP sticky flag·비트, copy/move/concurrent cache 결정론은 다른 경계다. 단순 scalar 성공/값 비교가 flags와 결정론을 대체하지 않는다. | + +이 범주의 나머지 행도 본래 assertion/oracle와 identity를 유지한다. 전체 쌍에 대한 +의미적 동등성을 주장하지 않으며, 추가 증명 없이 시험을 합치거나 helper를 제거하지 않았다. + +## R-CAPABILITY + +`tests/unit/elements/element_capabilities_test.cpp`는 adapter 경계를 소유한다. +`ShellTrialPreservesCompleteDirectionalResponseAndFailure` 본문은 kernel과 capability의 +force/tangent/recovery·drilling 고차 directional 응답을 비트로 비교하고 direction 입력을 +보존한다. 잘못된 trial의 structured status와 이후 정상 재사용까지 비교한다. +`BoundViewsSurviveOwnerVectorMovesAndRejectOtherFamilies`는 borrowed view 수명·다른 family +거부를 검사한다. Kernel 수식 검사만으로 adapter 전달·소유 경계가 검증되지 않는다. +Inertia/thermal 전용 identity는 R-DEFER로 분류하며 삭제하지 않았다. + +## R-COMPARISON + +C++ reference policy와 Python comparator는 같은 5%/1% 기준을 구현해도 별도 consumer다. +`ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries`는 +C++ family row branch·threshold·relative applicability를 검사하고, +`test_inclusive_row_and_rms_boundaries_are_independent`는 Python 결과의 독립 row/RMS +경계를 검사한다. Python `test_report_is_deterministic_and_keeps_family_boundaries`는 +보고서 JSON과 U/RF/S family·reference hash를 검사한다. Header collision·identity-before-NaN· +dtype/shape·없는 자료의 not-run도 solver 실제 실행과 다른 합성 계약이다. +정식 fine/_02/pressure 자료 부재·`_02` comparator 연결 부재는 여전히 미완료이며 +유일 검사를 지우는 근거로 삼지 않았다. 비정적 이름의 합성 정책 검사를 실제 동해석 통과로 세지 않는다. + +## R-STATIC + +현재 정적·공통 선택 identity는 유지한다. T5의 source body/행/hash와 현재 본문을 +대조하고 이관표의 최종 macro identity에 연결했다. 완전한 대체의 행동·실패 경계·수치 +조건을 입증하지 못했으므로 기존 assertion과 독립 oracle를 보존한다. 실행 성공·장시간· +과거 제외 여부를 삭제 근거로 사용하지 않았다. + +## R-SUPPORT + +파일 record·helper/oracle/fixture/include/static assertion·등록/정책 문서 행이다. +같은 최종 파일을 가리키는 역사 행을 제거하지 않았다. 제품/검사를 삭제하지 않아 이번 +변경이 만든 orphan은 없다. 기존 helper의 모든 간접 참조를 의미적으로 입증했다고 +주장하지 않으며, 참조 없는 폐기 구조라고 확정할 근거가 부족한 항목도 보존한다. + +## 정적 검증과 인계 + +T6 raw는 `.build/merge-verification/t6-20261018/`다. `audit.py`는 솔버/테스트를 실행하지 +않고 TSV 원셀·전체 최종 행 분류, T5 964개 body 및 631/333 선택, 양쪽 source 등록, +제품274개 Refactor bytes, T5 실행물·기준자료·원본 manifest 보존을 검사한다. +구체 명령·exit·hash·검사 수는 `audit.json`과 manifest의 `t6_test_cleanup`에 기록한다. +검사 source·등록 변화가 0이므로 AGENTS의 문서 전용 규칙에 따라 build/test를 재실행하지 않았다. + +T5 Native/CMake/CTest 각631·Python145, 정식 정적5모델의 기존 실행 근거를 그대로 +인계한다. T6 정적 검토를 새 solver 실행·전체964개 PASS로 보고하지 않는다. +비정적333·fine/_02/pressure·thermal 새 reference와 NT11 제한, ShellNL RF/RM +false/review-only와 stress mapping 미판정은 유지한다. T7 최종 정적 검증은 별도 작업이다. diff --git a/docs/cpp-object-oriented-modular-refactoring/test-migration.tsv b/docs/cpp-object-oriented-modular-refactoring/test-migration.tsv new file mode 100644 index 0000000..841bb54 --- /dev/null +++ b/docs/cpp-object-oriented-modular-refactoring/test-migration.tsv @@ -0,0 +1,2877 @@ +source original_path original_identity verification_behavior final_path final_identity disposition reason original_sha256 final_sha256 original_assertions final_assertions cleanup_decision cleanup_reason_id cleanup_evidence +Dev tests/AGENTS.md file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/AGENTS.md file 유지 Dev의 현재 검사 정책을 유지한다. Refactor의 과거 실행별 지시는 이번 승인 범위를 대체하지 않는다. c2413bbcde33dad56ffd227536b79b9b9c707a5eb4a7874f0bc840824c4abfd5 c2413bbcde33dad56ffd227536b79b9b9c707a5eb4a7874f0bc840824c4abfd5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/AGENTS.md support@1-16 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/AGENTS.md file-support 유지 Dev의 현재 검사 정책을 유지한다. Refactor의 과거 실행별 지시는 이번 승인 범위를 대체하지 않는다. 18aee7c622327cc5dd22beb5916532fd73567e42d03bae4e020fe07bc3a523f8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/CMakeLists.txt file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/CMakeLists.txt file 이관 Refactor capability source 등록을 유지한다. 실제 native/CMake source 목록이 세 target 모두 일치하므로 본문 복원에 따른 translation unit 추가는 없다. 53cb1f15138a3e271131ffca6a73425ee886feaa14733c9655642fa15e278ba6 8c8c0b8343ada0c1ea259c017a5332bfa0e0a313adbfaabe84406327bc9dc8c9 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/CMakeLists.txt support@1-257 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/CMakeLists.txt file-support 이관 Refactor capability source 등록을 유지한다. 실제 native/CMake source 목록이 세 target 모두 일치하므로 본문 복원에 따른 translation unit 추가는 없다. 7faf0664f1caccc190d801c85a4403211f3bb60ae7c94d19d6620ae3189faf0a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/integration/analysis/linear_frequency_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 73da42092ea16d533f8a1725f6e925338fb4d8ff6901c5a462004aef3cacc770 73da42092ea16d533f8a1725f6e925338fb4d8ff6901c5a462004aef3cacc770 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.RejectsDomainWithoutFrequencyStep LinearFrequencyProcedureExecutor.RejectsDomainWithoutFrequencyStep; assertion 5개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.RejectsDomainWithoutFrequencyStep 유지 원문 검사 body 및 assertion 동일. e35f98ccd120a34e369c9100a4b68bc5f2bd57a79f0516fe8aace490a6157623 e35f98ccd120a34e369c9100a4b68bc5f2bd57a79f0516fe8aace490a6157623 "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-frequency-procedure"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-frequency-procedure"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.MatchesPartialBoundaryPencilAndFullResidualCovariance LinearFrequencyProcedureExecutor.MatchesPartialBoundaryPencilAndFullResidualCovariance; assertion 25개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.MatchesPartialBoundaryPencilAndFullResidualCovariance 유지 원문 검사 body 및 assertion 동일. 8112af69b3ed3bf699174664e3f50bc7fe4927aa4d8a1e3841e3c840ed29bbbe 8112af69b3ed3bf699174664e3f50bc7fe4927aa4d8a1e3841e3c840ed29bbbe ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), 1U) | EXPECT_EQ(state.mass_null_dimension, 0U) | EXPECT_EQ(state.finite_dimension, 1U) | EXPECT_NEAR(state.modes[0].eigenvalue, 10369.0 / 450.0, 1e-10) | EXPECT_EQ(state.modes[0].classification, 1U) | EXPECT_EQ(state.vectors.Rows(), 1U) | EXPECT_EQ(state.vectors.Columns(), 24U) | EXPECT_NEAR(state.vectors(0U, 5U), std::sqrt(50.0 / 3.0), 1e-12) | EXPECT_EQ(state.vectors(0U, dof), 0.0) | ASSERT_EQ(state.eigenpair_checks.size(), 1U) | EXPECT_NEAR(state.eigenpair_checks[0].modal_mass, 1.0, 1e-12) | EXPECT_LE(state.eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].rho_b, 1e-10) | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | ASSERT_TRUE(static_domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_NEAR(kff, 10369.0 / 7500.0, 1e-12) | EXPECT_NEAR(displacement[5U], 7500.0 / 10369.0, 1e-12) | EXPECT_NEAR(residual[5U], 0.0, 1e-12) | EXPECT_NEAR(residual[i], expected, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), 1U) | EXPECT_EQ(state.mass_null_dimension, 0U) | EXPECT_EQ(state.finite_dimension, 1U) | EXPECT_NEAR(state.modes[0].eigenvalue, 10369.0 / 450.0, 1e-10) | EXPECT_EQ(state.modes[0].classification, 1U) | EXPECT_EQ(state.vectors.Rows(), 1U) | EXPECT_EQ(state.vectors.Columns(), 24U) | EXPECT_NEAR(state.vectors(0U, 5U), std::sqrt(50.0 / 3.0), 1e-12) | EXPECT_EQ(state.vectors(0U, dof), 0.0) | ASSERT_EQ(state.eigenpair_checks.size(), 1U) | EXPECT_NEAR(state.eigenpair_checks[0].modal_mass, 1.0, 1e-12) | EXPECT_LE(state.eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].rho_b, 1e-10) | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | ASSERT_TRUE(static_domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_NEAR(kff, 10369.0 / 7500.0, 1e-12) | EXPECT_NEAR(displacement[5U], 7500.0 / 10369.0, 1e-12) | EXPECT_NEAR(residual[5U], 0.0, 1e-12) | EXPECT_NEAR(residual[i], expected, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PartialBoundaryStaticRejectsUnbalancedDrillingMoment LinearFrequencyProcedureExecutor.PartialBoundaryStaticRejectsUnbalancedDrillingMoment; assertion 3개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PartialBoundaryStaticRejectsUnbalancedDrillingMoment 유지 원문 검사 body 및 assertion 동일. 3257ad730d16550e25ba4286cfa165f6b4e84d2a54d3cc6b5d8163feea05465d 3257ad730d16550e25ba4286cfa165f6b4e84d2a54d3cc6b5d8163feea05465d "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_NE(StatusText(result.GetStatus()) .find(""global-equilibrium-tolerance-failure""), std::string::npos)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_NE(StatusText(result.GetStatus()) .find(""global-equilibrium-tolerance-failure""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.FreePanelRetainsSixRigidModesAndAllComputedEvidence LinearFrequencyProcedureExecutor.FreePanelRetainsSixRigidModesAndAllComputedEvidence; assertion 15개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.FreePanelRetainsSixRigidModesAndAllComputedEvidence 유지 원문 검사 body 및 assertion 동일. 9606266d6f08472c9d911615beddbfed51886ef04a943c708901bb30e245a992 9606266d6f08472c9d911615beddbfed51886ef04a943c708901bb30e245a992 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(state.mass_null_dimension, 4U) | EXPECT_EQ(state.finite_dimension, 20U) | ASSERT_EQ(state.modes.size(), 6U) | EXPECT_GE(state.eigenpair_checks.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(mode.cluster_id, 1U) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_LE(state.eta_mz, 1e-12) | EXPECT_LE(state.eta_kz, 1e-12) | EXPECT_LE(check.eta_r, 1e-10) | EXPECT_LE(check.eta_norm, 1e-10) | EXPECT_LE(check.eta_energy, 1e-10) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(state.mass_null_dimension, 4U) | EXPECT_EQ(state.finite_dimension, 20U) | ASSERT_EQ(state.modes.size(), 6U) | EXPECT_GE(state.eigenpair_checks.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(mode.cluster_id, 1U) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_LE(state.eta_mz, 1e-12) | EXPECT_LE(state.eta_kz, 1e-12) | EXPECT_LE(check.eta_r, 1e-10) | EXPECT_LE(check.eta_norm, 1e-10) | EXPECT_LE(check.eta_energy, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.ExcessRequestedModesFailsWithSourceContext LinearFrequencyProcedureExecutor.ExcessRequestedModesFailsWithSourceContext; assertion 6개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.ExcessRequestedModesFailsWithSourceContext 유지 원문 검사 body 및 assertion 동일. a384ea179cd4b72a4bedea2b8a465ff0e824a37858da50dfe0702d96c91b6c55 a384ea179cd4b72a4bedea2b8a465ff0e824a37858da50dfe0702d96c91b6c55 "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""insufficient-finite-modes"") | EXPECT_GT(result.GetStatus().Diagnostics()[0].location.line, 0U)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""insufficient-finite-modes"") | EXPECT_GT(result.GetStatus().Diagnostics()[0].location.line, 0U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PreservesDensityAndPhysicalUnitScaling LinearFrequencyProcedureExecutor.PreservesDensityAndPhysicalUnitScaling; assertion 12개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PreservesDensityAndPhysicalUnitScaling 유지 원문 검사 body 및 assertion 동일. 54d62ee92fd5f41120fda65ddaeb341ba1f3bd0390e7cdf03c81b5f13b9f4fcd 54d62ee92fd5f41120fda65ddaeb341ba1f3bd0390e7cdf03c81b5f13b9f4fcd ASSERT_TRUE(baseline_domain.HasValue()) | ASSERT_TRUE(dense_domain.HasValue()) | ASSERT_TRUE(units_domain.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(dense.HasValue()) | ASSERT_TRUE(units.HasValue()) | EXPECT_NEAR( dense.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 0.25, 1e-12) | EXPECT_NEAR(dense.Value().vectors(0U, 5U) / baseline.Value().vectors(0U, 5U), 0.5, 1e-12) | EXPECT_NEAR( units.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 1.0, 1e-12) | EXPECT_NEAR( units.Value().vectors(0U, 5U) * length / baseline.Value().vectors(0U, 5U), 1.0, 1e-12) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_energy, 1e-10) ASSERT_TRUE(baseline_domain.HasValue()) | ASSERT_TRUE(dense_domain.HasValue()) | ASSERT_TRUE(units_domain.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(dense.HasValue()) | ASSERT_TRUE(units.HasValue()) | EXPECT_NEAR( dense.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 0.25, 1e-12) | EXPECT_NEAR(dense.Value().vectors(0U, 5U) / baseline.Value().vectors(0U, 5U), 0.5, 1e-12) | EXPECT_NEAR( units.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 1.0, 1e-12) | EXPECT_NEAR( units.Value().vectors(0U, 5U) * length / baseline.Value().vectors(0U, 5U), 1.0, 1e-12) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_energy, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp support@1-25 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a51e24264f3ae36759924761dd98817a3de835465648e49acff3d7c0b74e8f7c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp support@42-124 helper/oracle/fixture/include/static assertion 구간: StatusText, PanelDomain, if tests/integration/analysis/linear_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d9beda2ab213d77168db3de7088b66badb8266554add0a1df0249a3f53e814b2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_frequency_procedure_test.cpp support@191-193 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d7ebb4e7a53ff4630e82b0c32bb66fd1bae66f119405d224a134d6256734b442 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_static_analysis_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/integration/analysis/linear_static_analysis_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c796815b0cdc8b655da47ddab48bb3df2ef5d7334d949c9ede355e046b12294b c796815b0cdc8b655da47ddab48bb3df2ef5d7334d949c9ede355e046b12294b 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization; assertion 5개 tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization 유지 원문 검사 body 및 assertion 동일. 6da58cc645e25d2814d2622f68d964c8320625f00110b2e16ba19e5b1522ccc2 6da58cc645e25d2814d2622f68d964c8320625f00110b2e16ba19e5b1522ccc2 "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad; assertion 8개 tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad 유지 원문 검사 body 및 assertion 동일. 65404a724a1ea299f6ceec1870dfa2b75eff091a7e83809aa589613be7e4e2fc 65404a724a1ea299f6ceec1870dfa2b75eff091a7e83809aa589613be7e4e2fc "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 0) | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize""}))" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 0) | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription; assertion 17개 tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription 유지 원문 검사 body 및 assertion 동일. 34f491015c713169674ef652f3e235e52cff78d9c55158b3dfa94614562c2a94 34f491015c713169674ef652f3e235e52cff78d9c55158b3dfa94614562c2a94 "ASSERT_TRUE(status.IsOk()) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 2U) | EXPECT_TRUE(writer.Diagnostics().empty()) | ASSERT_EQ(state.Displacement().Size(), 12U) | EXPECT_EQ(state.Identity().step_name, ""Step-1"") | EXPECT_EQ(state.Identity().frame_index, 0U) | EXPECT_NEAR(state.Displacement()[0U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[6U], 0.2, 2.0e-10) | EXPECT_NEAR(state.ExternalForce()[6U], 10.0, 1.0e-12) | EXPECT_NEAR(state.InternalForce()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.InternalForce()[6U], 10.0, 1.0e-9) | EXPECT_NEAR(state.Reaction()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.Residual()[6U], 0.0, 1.0e-9) | EXPECT_EQ(state.EndpointResults().size(), 2U) | EXPECT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.StressResults().size(), 2U)" "ASSERT_TRUE(status.IsOk()) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 2U) | EXPECT_TRUE(writer.Diagnostics().empty()) | ASSERT_EQ(state.Displacement().Size(), 12U) | EXPECT_EQ(state.Identity().step_name, ""Step-1"") | EXPECT_EQ(state.Identity().frame_index, 0U) | EXPECT_NEAR(state.Displacement()[0U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[6U], 0.2, 2.0e-10) | EXPECT_NEAR(state.ExternalForce()[6U], 10.0, 1.0e-12) | EXPECT_NEAR(state.InternalForce()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.InternalForce()[6U], 10.0, 1.0e-9) | EXPECT_NEAR(state.Reaction()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.Residual()[6U], 0.0, 1.0e-9) | EXPECT_EQ(state.EndpointResults().size(), 2U) | EXPECT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.StressResults().size(), 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization; assertion 5개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization 유지 원문 검사 body 및 assertion 동일. 1dea412548e1077c66d10536f0f8640b34a5b0eadc19bb0cebbf47878b4c0b9b 1dea412548e1077c66d10536f0f8640b34a5b0eadc19bb0cebbf47878b4c0b9b "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement; assertion 17개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement 유지 원문 검사 body 및 assertion 동일. 221c877473ceb9bc29a9ba1386ab2485083b7474572a5ba936ae3b9524c1e15a 221c877473ceb9bc29a9ba1386ab2485083b7474572a5ba936ae3b9524c1e15a EXPECT_TRUE(status.IsOk()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(solver.FactorizeCalls(), 1) | ASSERT_EQ(solver.SolveCalls(), 1) | ASSERT_EQ(solver.FactorizedDimension(), 1U) | ASSERT_EQ(solver.Rhs().size(), 1U) | EXPECT_NEAR(solver.ScalarStiffness(), 440.0 / 9.0, 1.0e-12) | EXPECT_NEAR(solver.Rhs()[0U], -4.0 / 9.0, 1.0e-12) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 4U) | EXPECT_EQ(writer.ShellElementCount(), 1U) | ASSERT_EQ(state.Displacement().Size(), 24U) | EXPECT_NEAR(state.Displacement()[6U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[12U], -1.0 / 110.0, 1.0e-12) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) | EXPECT_EQ(state.ShellResults().size(), 4U) | EXPECT_GT(state.PhysicalStrainEnergy(), 0.0) EXPECT_TRUE(status.IsOk()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(solver.FactorizeCalls(), 1) | ASSERT_EQ(solver.SolveCalls(), 1) | ASSERT_EQ(solver.FactorizedDimension(), 1U) | ASSERT_EQ(solver.Rhs().size(), 1U) | EXPECT_NEAR(solver.ScalarStiffness(), 440.0 / 9.0, 1.0e-12) | EXPECT_NEAR(solver.Rhs()[0U], -4.0 / 9.0, 1.0e-12) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 4U) | EXPECT_EQ(writer.ShellElementCount(), 1U) | ASSERT_EQ(state.Displacement().Size(), 24U) | EXPECT_NEAR(state.Displacement()[6U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[12U], -1.0 / 110.0, 1.0e-12) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) | EXPECT_EQ(state.ShellResults().size(), 4U) | EXPECT_GT(state.PhysicalStrainEnergy(), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem; assertion 9개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem 유지 원문 검사 body 및 assertion 동일. 9bc841e0fc20cccf0cec07e025f03be672a5123d4c9fa5fcf23f9d0072fd34d6 9bc841e0fc20cccf0cec07e025f03be672a5123d4c9fa5fcf23f9d0072fd34d6 ASSERT_FALSE(singular.IsOk()) | EXPECT_EQ(singular.Category(), fesa::FailureCategory::kSolver) | EXPECT_EQ(singular_writer.WriteCalls(), 0) | ASSERT_TRUE(constrained.IsOk()) | EXPECT_EQ(constrained_solver.FactorizeCalls(), 1) | EXPECT_EQ(constrained_solver.FactorizedDimension(), 0U) | EXPECT_EQ(constrained_solver.SolveCalls(), 1) | EXPECT_TRUE(constrained_solver.Rhs().empty()) | EXPECT_EQ(constrained_writer.State().ShellResults().size(), 4U) ASSERT_FALSE(singular.IsOk()) | EXPECT_EQ(singular.Category(), fesa::FailureCategory::kSolver) | EXPECT_EQ(singular_writer.WriteCalls(), 0) | ASSERT_TRUE(constrained.IsOk()) | EXPECT_EQ(constrained_solver.FactorizeCalls(), 1) | EXPECT_EQ(constrained_solver.FactorizedDimension(), 0U) | EXPECT_EQ(constrained_solver.SolveCalls(), 1) | EXPECT_TRUE(constrained_solver.Rhs().empty()) | EXPECT_EQ(constrained_writer.State().ShellResults().size(), 4U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate; assertion 6개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate 유지 원문 검사 body 및 assertion 동일. 8c9ed32ac29d2ce92de257c1fe16ae692ff037e47ae1e267ceb47d2e14fb3999 8c9ed32ac29d2ce92de257c1fe16ae692ff037e47ae1e267ceb47d2e14fb3999 "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-recovery-value"") | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_TRUE(adapter_events.empty())" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-recovery-value"") | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_TRUE(adapter_events.empty())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/linear_static_analysis_test.cpp support@1-306 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, AxialDeck, AllConstrainedShellDeck, PrescribedShellDeck, SpyLinearSolver, RecordingMklSolver, NonfiniteLinearSolver, SpyResultsWriter, CapturingResultsWriter, State tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 09f71dbb33b22661eb43b04ddd7730f00b09cf63202093cb5008f37fe51a59f2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_static_analysis_test.cpp support@388-389 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 36bbca6d939f00341c98ba573a4fdc3cfc85b6ef660852c5b0a862bfcfc0fd6c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_static_analysis_test.cpp support@411-412 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 58066e545facf79db27e598db7e91f24ed93b6771efa3ca779ecfe4df76a7344 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_static_analysis_test.cpp support@449-450 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dd0e363915792cde8bf2d8793ddaec5a8c40204888921d46f70f1f507387ac4a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/linear_static_analysis_test.cpp support@485-486 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 83bce9b68552044428c9e22ca488475bf399b515887403c179e0f49d9230a028 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/nonlinear_static_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/integration/analysis/nonlinear_static_procedure_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1e061b20491b18339e35610d48168180a3a8dc329fd09565e392268dbce7011c 88175e6ca8c6905e7706f40141e85676d7ce3c1763b49e2ebfb7beecd6d9feab 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.AllConstrainedNlgeomRunWritesSchemaV1AfterAcceptedFrames NonlinearStaticProcedure.AllConstrainedNlgeomRunWritesSchemaV1AfterAcceptedFrames; assertion 6개 tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.AllConstrainedNlgeomRunWritesSchemaV1AfterAcceptedFrames 유지 원문 검사 body 및 assertion 동일. f26bd90fa30e1fa68296b58bf1a76cc5630c88cda15c0ef729d651d3395c74ec f26bd90fa30e1fa68296b58bf1a76cc5630c88cda15c0ef729d651d3395c74ec "ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(metadata, 0) | EXPECT_EQ(ReadStringAttribute(metadata, ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" "ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(metadata, 0) | EXPECT_EQ(ReadStringAttribute(metadata, ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance; assertion 4개 tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance 유지 원문 검사 body 및 assertion 동일. 9ff42852bb00d02f437a4da95165fdf5d26e6b838001a0d5ab14a85a04317640 9ff42852bb00d02f437a4da95165fdf5d26e6b838001a0d5ab14a85a04317640 ASSERT_EQ(exit_code, 0) | ASSERT_GE(dataset, 0) | ASSERT_GE(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, actual.data()), 0) | EXPECT_NEAR(actual[component], expected[component], 1.0e-10) ASSERT_EQ(exit_code, 0) | ASSERT_GE(dataset, 0) | ASSERT_GE(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, actual.data()), 0) | EXPECT_NEAR(actual[component], expected[component], 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/nonlinear_static_procedure_test.cpp support@1-292 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, AllConstrainedNonlinearShellDeck, NonzeroPrescribedNonlinearShellDeck, Hdf5File, ReadStringAttribute, ReadNodalDataset, ReadConstraintMask, SpatialMoment, ReconstructGlobalBalance tests/integration/analysis/nonlinear_static_procedure_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 28bacfe1a5c4b6f4da94867bd5ac79b2b4e93a6f5fecfb0c4ab146dc9b324eef 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/nonlinear_static_procedure_test.cpp support@316-317 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/nonlinear_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 185679e57938f51bc52ac8004de60266decc8599baf2c9e6aac91a3cec7811be 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/nonlinear_static_procedure_test.cpp support@345-346 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/nonlinear_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/shell_surface_pressure_linear_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f160a13c739276bb27b6b769f4b5d7fc53ab6bbe0e4917b1388aa171313f834e f160a13c739276bb27b6b769f4b5d7fc53ab6bbe0e4917b1388aa171313f834e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement; assertion 2개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement 유지 원문 검사 body 및 assertion 동일. e721439d9254d983e65489ab2bbc4fb02e07d31658fc561f5401bfbd83abaa10 e721439d9254d983e65489ab2bbc4fb02e07d31658fc561f5401bfbd83abaa10 EXPECT_DOUBLE_EQ(state.Displacement()[8U], 5.0) | EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) EXPECT_DOUBLE_EQ(state.Displacement()[8U], 5.0) | EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction; assertion 2개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction 유지 원문 검사 body 및 assertion 동일. ba222e9848a5e378bcf9c71a3c33243ac8771e3fac0c5822851e2102ed967c4d ba222e9848a5e378bcf9c71a3c33243ac8771e3fac0c5822851e2102ed967c4d EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) | EXPECT_EQ(SumTranslation(state.Reaction()), (std::array{0.0, 0.0, 4.0})) EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) | EXPECT_EQ(SumTranslation(state.Reaction()), (std::array{0.0, 0.0, 4.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment; assertion 2개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment 유지 원문 검사 body 및 assertion 동일. 171514cf20d839500b5919fd98671a3c0f805d8552929fcc111886400eb35cb3 171514cf20d839500b5919fd98671a3c0f805d8552929fcc111886400eb35cb3 EXPECT_NEAR(value, 0.0, 1.0e-8) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) EXPECT_NEAR(value, 0.0, 1.0e-8) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance; assertion 6개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance 유지 원문 검사 body 및 assertion 동일. 1439f391357b0fe3f6dd44f5b7ce79f74d7ed2df71d6eb5a3b1f4c7081cf4237 1439f391357b0fe3f6dd44f5b7ce79f74d7ed2df71d6eb5a3b1f4c7081cf4237 ASSERT_EQ(s4.ExternalForce().Size(), s4r.ExternalForce().Size()) | ASSERT_EQ(s4.ExternalForce().Size(), cyclic.ExternalForce().Size()) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], s4r.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], cyclic.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], s4r.Reaction()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], cyclic.Reaction()[index]) ASSERT_EQ(s4.ExternalForce().Size(), s4r.ExternalForce().Size()) | ASSERT_EQ(s4.ExternalForce().Size(), cyclic.ExternalForce().Size()) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], s4r.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], cyclic.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], s4r.Reaction()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], cyclic.Reaction()[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset; assertion 12개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset 유지 원문 검사 body 및 assertion 동일. a1753dcd30b46c5386bcb0198661ae6982efcbbce8c4b8deb2ab12729c7cd5c0 a1753dcd30b46c5386bcb0198661ae6982efcbbce8c4b8deb2ab12729c7cd5c0 "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | ASSERT_GE(metadata, 0) | ASSERT_GE(schema, 0) | ASSERT_GE(H5Aread(schema, H5T_NATIVE_UINT64, &schema_version), 0) | EXPECT_EQ(schema_version, 0U) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Aclose(schema), 0) | EXPECT_GE(H5Gclose(metadata), 0) | EXPECT_GE(H5Fclose(file), 0)" "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | ASSERT_GE(metadata, 0) | ASSERT_GE(schema, 0) | ASSERT_GE(H5Aread(schema, H5T_NATIVE_UINT64, &schema_version), 0) | EXPECT_EQ(schema_version, 0U) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Aclose(schema), 0) | EXPECT_GE(H5Gclose(metadata), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_linear_test.cpp support@1-176 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, ShellDeck, CapturingResultsWriter, State, RunLinear, SumTranslation tests/integration/analysis/shell_surface_pressure_linear_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e57c8ba9f74968a8c7ca06c327d4bae2312eb212b552414c2365975b785c1ef3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 76f0d621c519f1ca1cb68fafd700bca52c94c69ac975a274eac995298ff77df3 76f0d621c519f1ca1cb68fafd700bca52c94c69ac975a274eac995298ff77df3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry; assertion 1개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry 유지 원문 검사 body 및 assertion 동일. 275b59b0a99ff5bcb4936eac0dd4373eb3fb04e88d56a47ff1aff8a27b2c86f9 275b59b0a99ff5bcb4936eac0dd4373eb3fb04e88d56a47ff1aff8a27b2c86f9 EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns 유지 원문 검사 body 및 assertion 동일. 0a6136e7ba03b60316d311f5f6b42f16252978acda71b7d0b56f16eb12b209ba 0a6136e7ba03b60316d311f5f6b42f16252978acda71b7d0b56f16eb12b209ba EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_NEAR(SumTranslation(residual, 2U), 6.0, 1.0e-12) EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_NEAR(SumTranslation(residual, 2U), 6.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce; assertion 1개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce 유지 원문 검사 body 및 assertion 동일. fd422711071867040b064e56df5df62d50a20128bb59e934095f3657cf85f95e fd422711071867040b064e56df5df62d50a20128bb59e934095f3657cf85f95e EXPECT_NEAR(SumTranslation(external, 2U), -0.42, 1.0e-12) EXPECT_NEAR(SumTranslation(external, 2U), -0.42, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath; assertion 7개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath 유지 원문 검사 body 및 assertion 동일. 63a34f032cb16dd83f579b4dd4b484e3c326615ba25fa1133eee16013843c11f 63a34f032cb16dd83f579b4dd4b484e3c326615ba25fa1133eee16013843c11f EXPECT_NE(SumTranslation(external, 2U), 0.0) | EXPECT_NE(SumTranslation(residual, 2U), 0.0) | ASSERT_TRUE(central.HasValue()) | ASSERT_TRUE(forward.HasValue()) | ASSERT_TRUE(backward.HasValue()) | EXPECT_NEAR(finite_difference, central.Value().external_tangent[row * 24U + 12U], 1.0e-8) | EXPECT_TRUE(has_antisymmetric_entry) EXPECT_NE(SumTranslation(external, 2U), 0.0) | EXPECT_NE(SumTranslation(residual, 2U), 0.0) | ASSERT_TRUE(central.HasValue()) | ASSERT_TRUE(forward.HasValue()) | ASSERT_TRUE(backward.HasValue()) | EXPECT_NEAR(finite_difference, central.Value().external_tangent[row * 24U + 12U], 1.0e-8) | EXPECT_TRUE(has_antisymmetric_entry) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence 유지 원문 검사 body 및 assertion 동일. 04b9fe95ba4947d608fc9a7ec79b1740e70ecfbbcd3a01e2e16606d5243818ae 04b9fe95ba4947d608fc9a7ec79b1740e70ecfbbcd3a01e2e16606d5243818ae "EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" "EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance; assertion 1개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance 유지 원문 검사 body 및 assertion 동일. 57b26b0b13a3b8aeb13983659e70fa74ee28ce08b9657ee48534d4357dec6986 57b26b0b13a3b8aeb13983659e70fa74ee28ce08b9657ee48534d4357dec6986 EXPECT_LE(MaximumAbs(equilibrium), 1.0e-8) EXPECT_LE(MaximumAbs(equilibrium), 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea; assertion 4개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea 유지 원문 검사 body 및 assertion 동일. bf38184a7460af3225ecdfb1d17c748cb2827953f7ab20cb0d09aa512b765102 bf38184a7460af3225ecdfb1d17c748cb2827953f7ab20cb0d09aa512b765102 ASSERT_TRUE(contribution.HasValue()) | EXPECT_NEAR(force_x, 0.0, 1.0e-12) | EXPECT_NEAR(force_y, 4.0, 1.0e-12) | EXPECT_NEAR(force_z, 0.0, 1.0e-12) ASSERT_TRUE(contribution.HasValue()) | EXPECT_NEAR(force_x, 0.0, 1.0e-12) | EXPECT_NEAR(force_y, 4.0, 1.0e-12) | EXPECT_NEAR(force_z, 0.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically 유지 원문 검사 body 및 assertion 동일. 7221071e8ff084a8b909b3820cf880025e76e8d17c003c07e58ce9bac6e812b5 7221071e8ff084a8b909b3820cf880025e76e8d17c003c07e58ce9bac6e812b5 EXPECT_EQ(first_force, second_force) | EXPECT_NE(SumTranslation(first_force, 2U), 0.0) EXPECT_EQ(first_force, second_force) | EXPECT_NE(SumTranslation(first_force, 2U), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput 유지 원문 검사 body 및 assertion 동일. 36e810eaf381a43605bffdffe6997ad85e7b0ed2e01de1c00989cbbb49d0f80d 36e810eaf381a43605bffdffe6997ad85e7b0ed2e01de1c00989cbbb49d0f80d EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium; assertion 3개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium 유지 원문 검사 body 및 assertion 동일. 43eabc099c0167988e47483e5a56b5be6f7af1257dc4992ee64c812b925d6ad9 43eabc099c0167988e47483e5a56b5be6f7af1257dc4992ee64c812b925d6ad9 "EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0)" "EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp support@1-224 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, Hdf5File, WriteText, ReadBytes, NonlinearPressureDeck, ReadFrameDataset, ReadEquilibrium, SumTranslation, MaximumAbs, for, CurrentPressureInput, RunNonlinearPressure tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ef95b2da7f58bff98fb85e60df3206dec9935f7f1af799fca4fade510af8a9aa 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_gauss_oracle.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/integration/analysis/thermal_gauss_oracle.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d788dbffcaedabfd16337b9683fd30803efb69cee2e64da08c09c4ccff29d12f d788dbffcaedabfd16337b9683fd30803efb69cee2e64da08c09c4ccff29d12f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_gauss_oracle.h support@1-70 helper/oracle/fixture/include/static assertion 구간: thermal_oracle, GaussPoint tests/integration/analysis/thermal_gauss_oracle.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eefed1217413733d2b6f2c59534a7501f9a2256dddd8140f1b6fc970af8bcec6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/integration/analysis/thermal_oracle_generator.py file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9c7d218fb43f93b77f0b84d158fcdc32033931a63f67b46e0e8adbac48b678dd 9c7d218fb43f93b77f0b84d158fcdc32033931a63f67b46e0e8adbac48b678dd 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py add fixture/oracle/helper add tests/integration/analysis/thermal_oracle_generator.py add 유지 원문 검사 body 및 assertion 동일. 23e1150085d3fe1a5d74d2299831c98dd48f86eb9930a91b18600fc30d590845 23e1150085d3fe1a5d74d2299831c98dd48f86eb9930a91b18600fc30d590845 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py neg fixture/oracle/helper neg tests/integration/analysis/thermal_oracle_generator.py neg 유지 원문 검사 body 및 assertion 동일. 7f7c8cb6ea41ea38bda49db120a6d2cd2848779150281160c8d32c61b566b46e 7f7c8cb6ea41ea38bda49db120a6d2cd2848779150281160c8d32c61b566b46e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py mul fixture/oracle/helper mul tests/integration/analysis/thermal_oracle_generator.py mul 유지 원문 검사 body 및 assertion 동일. 8be987139da7dda1626167aab28c0cff97553f2597f44e6e365ceab74df9bf11 8be987139da7dda1626167aab28c0cff97553f2597f44e6e365ceab74df9bf11 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py div fixture/oracle/helper div tests/integration/analysis/thermal_oracle_generator.py div 유지 원문 검사 body 및 assertion 동일. f88c22b7ecdac33d93b72af346a9809c1076dff336d7fe05e45a8ea0ce5cda98 f88c22b7ecdac33d93b72af346a9809c1076dff336d7fe05e45a8ea0ce5cda98 assert b[0] > 0 or b[1] < 0 assert b[0] > 0 or b[1] < 0 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py scale fixture/oracle/helper scale tests/integration/analysis/thermal_oracle_generator.py scale 유지 원문 검사 body 및 assertion 동일. b2d4e44e7198bea03d4b8e9aa478db99139a37e2df97553ad90c222e6c2d363e b2d4e44e7198bea03d4b8e9aa478db99139a37e2df97553ad90c222e6c2d363e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py legendre fixture/oracle/helper legendre tests/integration/analysis/thermal_oracle_generator.py legendre 유지 원문 검사 body 및 assertion 동일. ac998c8e064d80b57bf76d7a32e7414ee2a98bc41f5bf66df11460e2a866ded5 ac998c8e064d80b57bf76d7a32e7414ee2a98bc41f5bf66df11460e2a866ded5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py bracket fixture/oracle/helper bracket tests/integration/analysis/thermal_oracle_generator.py bracket 유지 원문 검사 body 및 assertion 동일. 6547b8bc55d38c8fc5108617a4b670ec13e1a35ff637dc4c2b49d4a89a27d47a 6547b8bc55d38c8fc5108617a4b670ec13e1a35ff637dc4c2b49d4a89a27d47a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py rule fixture/oracle/helper rule tests/integration/analysis/thermal_oracle_generator.py rule 유지 원문 검사 body 및 assertion 동일. 66e3896608075721c4941eace553b6bd6dfb46f4035079736663145c9fe97998 66e3896608075721c4941eace553b6bd6dfb46f4035079736663145c9fe97998 assert pl * ph < 0 | assert all(a[1] < b[0] for a, b in zip(result, result[1:])) | assert sum(F(r[2]) for r in result) < 2 < sum(F(r[3]) for r in result) assert pl * ph < 0 | assert all(a[1] < b[0] for a, b in zip(result, result[1:])) | assert sum(F(r[2]) for r in result) < 2 < sum(F(r[3]) for r in result) 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py slab_fixtures fixture/oracle/helper slab_fixtures tests/integration/analysis/thermal_oracle_generator.py slab_fixtures 유지 원문 검사 body 및 assertion 동일. 975f511ac674e3b180991c3f72b487234ce8712cb424a85094be969c99361561 975f511ac674e3b180991c3f72b487234ce8712cb424a85094be969c99361561 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py support@1-14 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/thermal_oracle_generator.py file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a3be554d66397807817915492b0f6e5d20acf5873a97c99032017cd6cc6d01a5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_oracle_generator.py support@215-244 helper/oracle/fixture/include/static assertion 구간: thermal_oracle, GaussPoint, Bracket, SlabCase tests/integration/analysis/thermal_oracle_generator.py file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5d91b01795d7cc5fbaa1b6c701fdd468978526c523b9a5d14136b3d82b5e9279 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_physics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/integration/analysis/thermal_physics_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 76b826d9162c196c136134c48c4c5116b8b95d0dee90f65fa7a8359f97d26894 fd272656d0a4bfda4a8cf075b0064a27ac6f493cb32d73c32f7e308844148c81 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.InsulatedUniformAndZeroRetainAllFramesWithConservation ThermalPhysics.InsulatedUniformAndZeroRetainAllFramesWithConservation; assertion 5개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.InsulatedUniformAndZeroRetainAllFramesWithConservation 유지 원문 검사 body 및 assertion 동일. edf0f539db5122e88db306402c100c973d9367d15826ff41df5831b9874050c7 edf0f539db5122e88db306402c100c973d9367d15826ff41df5831b9874050c7 EXPECT_LE(std::abs(frame.temperature[i] - temperature), bound) | EXPECT_EQ(metrics.capacity_budget, 0) | EXPECT_EQ(metrics.energy_defect, 0) | EXPECT_EQ(metrics.dissipation_defect, 0) | EXPECT_EQ(metrics.flux_values, 8U * 4U * 72U) EXPECT_LE(std::abs(frame.temperature[i] - temperature), bound) | EXPECT_EQ(metrics.capacity_budget, 0) | EXPECT_EQ(metrics.energy_defect, 0) | EXPECT_EQ(metrics.dissipation_defect, 0) | EXPECT_EQ(metrics.flux_values, 8U * 4U * 72U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.DiscreteEigenmodeHasFirstOrderTimeConvergence ThermalPhysics.DiscreteEigenmodeHasFirstOrderTimeConvergence; assertion 4개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.DiscreteEigenmodeHasFirstOrderTimeConvergence 유지 원문 검사 body 및 assertion 동일. 1d52f524f76f2684bb44a8432cd192d154ee2cc3246fbea4cbe564c74132a60d 1d52f524f76f2684bb44a8432cd192d154ee2cc3246fbea4cbe564c74132a60d EXPECT_LE(agreement.hi, total_budget.hi) | EXPECT_LE((total_budget / mode_norm).hi, error_norm.lo / 1000) | EXPECT_GE(order, .97) | EXPECT_LE(order, 1.02) EXPECT_LE(agreement.hi, total_budget.hi) | EXPECT_LE((total_budget / mode_norm).hi, error_norm.lo / 1000) | EXPECT_GE(order, .97) | EXPECT_LE(order, 1.02) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.SignedOverlappingAndConstrainedPowerBalanceByComponent ThermalPhysics.SignedOverlappingAndConstrainedPowerBalanceByComponent; assertion 6개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.SignedOverlappingAndConstrainedPowerBalanceByComponent 유지 원문 검사 body 및 assertion 동일. 2d2c5cc010b1987f2ab8df39ea5a39746869dd7c226da2fdfe5f0337a2adbe16 2d2c5cc010b1987f2ab8df39ea5a39746869dd7c226da2fdfe5f0337a2adbe16 EXPECT_EQ(p.assembly.HeatInput()[20], 5) | EXPECT_EQ(p.assembly.HeatInput()[34], -5) | EXPECT_DOUBLE_EQ(frame.temperature[i], other_frame.temperature[i]) | EXPECT_LE(first.Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(energy[1].Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(reaction_shift.Abs(), subtraction.hi) EXPECT_EQ(p.assembly.HeatInput()[20], 5) | EXPECT_EQ(p.assembly.HeatInput()[34], -5) | EXPECT_DOUBLE_EQ(frame.temperature[i], other_frame.temperature[i]) | EXPECT_LE(first.Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(energy[1].Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(reaction_shift.Abs(), subtraction.hi) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateFullEndStripRespectsThicknessMaterialJumpAndFoldResistance ThermalPhysics.PrivateFullEndStripRespectsThicknessMaterialJumpAndFoldResistance; assertion 7개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateFullEndStripRespectsThicknessMaterialJumpAndFoldResistance 유지 원문 검사 body 및 assertion 동일. 98716955c3d594ac8083ae9a474374c5888912c98ba4d073f991296e2b65c1ae 98716955c3d594ac8083ae9a474374c5888912c98ba4d073f991296e2b65c1ae ASSERT_GT(denominator.lo, 0) | EXPECT_LE((I{result.temperature[i]} - mid).Abs(), bound.hi + (mid - I{mid.Mid()}).Abs()) | EXPECT_LE((right - mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + right).Abs(), result.evidence.energy_bound) | EXPECT_LE((I{q.X()} + mid).Abs(), 24 * bound.hi + Gamma(2048).hi * 24) | EXPECT_LE((I{component} + I{5} / I{3}).Abs(), 400 * bound.hi + Gamma(2048).hi * 400) ASSERT_GT(denominator.lo, 0) | EXPECT_LE((I{result.temperature[i]} - mid).Abs(), bound.hi + (mid - I{mid.Mid()}).Abs()) | EXPECT_LE((right - mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + right).Abs(), result.evidence.energy_bound) | EXPECT_LE((I{q.X()} + mid).Abs(), 24 * bound.hi + Gamma(2048).hi * 24) | EXPECT_LE((I{component} + I{5} / I{3}).Abs(), 400 * bound.hi + Gamma(2048).hi * 400) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateAffineFieldRotationNormalAndUnaveragedMidplaneTraces ThermalPhysics.PrivateAffineFieldRotationNormalAndUnaveragedMidplaneTraces; assertion 7개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateAffineFieldRotationNormalAndUnaveragedMidplaneTraces 유지 원문 검사 body 및 assertion 동일. 0149790ce0000a7f3bfa36e529afff49efc9d2cd79b3a2fa2038d5eaf5765773 0149790ce0000a7f3bfa36e529afff49efc9d2cd79b3a2fa2038d5eaf5765773 EXPECT_FALSE(cache.matrix.has_value()) | EXPECT_LE((dot - I{static_cast(a == b)}).Abs(), (Gamma(2048) * absolute).hi) | EXPECT_GT(r[0].Cross(r[1]).Dot(r[2]), 0) | EXPECT_LE(std::abs(q[c] - expected[c]), budget) | EXPECT_LE((actual_local - expected_local).Abs(), budget + Gamma(16).hi * k * (8 + 16 / h) * scale) | EXPECT_EQ(traces[0][6 * point + 2].Dot(normal), 0) | EXPECT_LE( std::abs(traces[0][6 * point + 3].Dot(normal) + 4 * k / h), (Gamma(2048) * I{2 * k * (8 + 16 / h)}).hi) EXPECT_FALSE(cache.matrix.has_value()) | EXPECT_LE((dot - I{static_cast(a == b)}).Abs(), (Gamma(2048) * absolute).hi) | EXPECT_GT(r[0].Cross(r[1]).Dot(r[2]), 0) | EXPECT_LE(std::abs(q[c] - expected[c]), budget) | EXPECT_LE((actual_local - expected_local).Abs(), budget + Gamma(16).hi * k * (8 + 16 / h) * scale) | EXPECT_EQ(traces[0][6 * point + 2].Dot(normal), 0) | EXPECT_LE( std::abs(traces[0][6 * point + 3].Dot(normal) + 4 * k / h), (Gamma(2048) * I{2 * k * (8 + 16 / h)}).hi) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.FullTwoDimensionalMeshesHaveSecondOrderTemperatureAndFirstOrderGradient ThermalPhysics.FullTwoDimensionalMeshesHaveSecondOrderTemperatureAndFirstOrderGradient; assertion 11개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.FullTwoDimensionalMeshesHaveSecondOrderTemperatureAndFirstOrderGradient 유지 원문 검사 body 및 assertion 동일. 0ceca38a5febc9b2b1dd637a6fdc3c6bade908c088a878422dd93f60377d48e4 0ceca38a5febc9b2b1dd637a6fdc3c6bade908c088a878422dd93f60377d48e4 EXPECT_LE((twelve.temperature - sixteen.temperature).Abs(), sixteen.temperature.lo * 1e-8) | EXPECT_LE((twelve.gradient - sixteen.gradient).Abs(), sixteen.gradient.lo * 1e-8) | EXPECT_LE(agreement.hi, forward.hi) | EXPECT_LE(forward.hi, sixteen.temperature.lo / 1000) | EXPECT_LE((Sqrt(I{24. * n * n + 1280}) * forward).hi, sixteen.gradient.lo / 1000) | EXPECT_LE(temporal.hi, spatial_error.temperature.lo / 32) | EXPECT_GE(temperature_order, 1.95) | EXPECT_LE(temperature_order, 2.05) | EXPECT_GE(gradient_order, .98) | EXPECT_LE(gradient_order, 1.03) | EXPECT_EQ(8 * (metrics.temperature_values + metrics.flux_values), 81074472U) EXPECT_LE((twelve.temperature - sixteen.temperature).Abs(), sixteen.temperature.lo * 1e-8) | EXPECT_LE((twelve.gradient - sixteen.gradient).Abs(), sixteen.gradient.lo * 1e-8) | EXPECT_LE(agreement.hi, forward.hi) | EXPECT_LE(forward.hi, sixteen.temperature.lo / 1000) | EXPECT_LE((Sqrt(I{24. * n * n + 1280}) * forward).hi, sixteen.gradient.lo / 1000) | EXPECT_LE(temporal.hi, spatial_error.temperature.lo / 32) | EXPECT_GE(temperature_order, 1.95) | EXPECT_LE(temperature_order, 2.05) | EXPECT_GE(gradient_order, .98) | EXPECT_LE(gradient_order, 1.03) | EXPECT_EQ(8 * (metrics.temperature_values + metrics.flux_values), 81074472U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/thermal_physics_test.cpp ThermalSlab.ActualMeshesMatchCertifiedP2AndSeparateFourierError ThermalSlab.ActualMeshesMatchCertifiedP2AndSeparateFourierError; assertion 10개 tests/integration/analysis/thermal_physics_test.cpp ThermalSlab.ActualMeshesMatchCertifiedP2AndSeparateFourierError 유지 원문 검사 body 및 assertion 동일. 35d85f768c1c0df7ccdf1dcfe80c2a8294bffdfc09fc9f32bef7e529eaa29491 35d85f768c1c0df7ccdf1dcfe80c2a8294bffdfc09fc9f32bef7e529eaa29491 EXPECT_EQ(p.state.CommittedState().temperature[row], 0) | ASSERT_GT(inverse_denominator.lo, 0) | EXPECT_LE(std::abs(element[sample][0]), flux_budget.hi) | EXPECT_LE(std::abs(element[sample][1]), flux_budget.hi) | EXPECT_LE((samples[quantity] - first_mesh[quantity]).Abs(), (I{first_budget[group]} + I{solver_budget[group]}).hi) | EXPECT_LE(roundoff.hi, oracle.space[group] / 1000) | EXPECT_LE(agreement[group], roundoff.hi) | EXPECT_LE(physical[group], (I{oracle.space[group]} + I{time_error[group]} + roundoff).hi) | EXPECT_LE((I{physical[group]} - I{space_error[group]}).Abs(), (I{time_error[group]} + roundoff).hi) | EXPECT_TRUE(plateau) EXPECT_EQ(p.state.CommittedState().temperature[row], 0) | ASSERT_GT(inverse_denominator.lo, 0) | EXPECT_LE(std::abs(element[sample][0]), flux_budget.hi) | EXPECT_LE(std::abs(element[sample][1]), flux_budget.hi) | EXPECT_LE((samples[quantity] - first_mesh[quantity]).Abs(), (I{first_budget[group]} + I{solver_budget[group]}).hi) | EXPECT_LE(roundoff.hi, oracle.space[group] / 1000) | EXPECT_LE(agreement[group], roundoff.hi) | EXPECT_LE(physical[group], (I{oracle.space[group]} + I{time_error[group]} + roundoff).hi) | EXPECT_LE((I{physical[group]} - I{space_error[group]}).Abs(), (I{time_error[group]} + roundoff).hi) | EXPECT_TRUE(plateau) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/analysis/thermal_physics_test.cpp support@1-335 helper/oracle/fixture/include/static assertion 구간: ti, Down, Up, I, Mid, Abs, Sqrt, Square, Gamma, Pi, Cos, if, ExpNegative, while, Power, T, Take, Checked, Mesh, Prepared, RunMetrics, Advance, for, Print, CapacityNorm tests/integration/analysis/thermal_physics_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e22ee5f0f8df809604139d7a6e4a6ee465534fa0dca5e807d128683d4dba9edf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_physics_test.cpp support@355-429 helper/oracle/fixture/include/static assertion 구간: VerifyDiscreteEigenmode tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 302213d4b2826eec0d855386a82aa934f7517ca58b5a648eee7d7312b379e6a7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_physics_test.cpp support@537-600 helper/oracle/fixture/include/static assertion 구간: ZeroLike, CertifiedInverse, if tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ed80a8f1fe0a8a5a570f4eee10c069f506b9a07b7e1187cae5bd9481521fb22a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_physics_test.cpp support@797-868 helper/oracle/fixture/include/static assertion 구간: ThicknessMass, ThicknessGradient, SpatialError, IntegrateSpatialError, for tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6fe84510f8e89a0b45ac65e8b403973d1a9f3333b13d9c73deaf7076f9ca12ee 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_physics_test.cpp support@957-959 helper/oracle/fixture/include/static assertion 구간: Bracket, ThermalSlab tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 132c3f6724f847d2eb1cb70298ba8cbba9a8d0a5f070b51734e71be7e07e0616 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_physics_test.cpp support@1131-1139 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e43aa8e23b2faf52e75adc8f5647bf291d27a232530b2c49b1bb17df2d2e329e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_slab_oracle.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/integration/analysis/thermal_slab_oracle.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2d4d4f58df2a9f08b25f850c59617100f2a8af10ba7bdebb7ee80e15b079ad27 2d4d4f58df2a9f08b25f850c59617100f2a8af10ba7bdebb7ee80e15b079ad27 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/analysis/thermal_slab_oracle.h support@1-359 helper/oracle/fixture/include/static assertion 구간: thermal_oracle, Bracket, SlabCase tests/integration/analysis/thermal_slab_oracle.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3dfe0819fc272857692d3de89c30080b4f509c425b6169550bba89114be56c1f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/eigen_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/integration/app/eigen_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7632397db2daf06eb0ff79a311f4f61832f415ebee4aebe334c8bf5d97e83772 7632397db2daf06eb0ff79a311f4f61832f415ebee4aebe334c8bf5d97e83772 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/eigen_application_test.cpp EigenApplicationTest.DispatchesFrequencyAndWritesModalSibling EigenApplicationTest.DispatchesFrequencyAndWritesModalSibling; assertion 9개 tests/integration/app/eigen_application_test.cpp EigenApplicationTest.DispatchesFrequencyAndWritesModalSibling 유지 원문 검사 body 및 assertion 동일. 68264a89e2eea378557e983ac8734ba58b464af83c2ac2b3628f1f1fafa70ee3 68264a89e2eea378557e983ac8734ba58b464af83c2ac2b3628f1f1fafa70ee3 "ASSERT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output_)) | ASSERT_TRUE(std::filesystem::exists(log_)) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/vectors"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" "ASSERT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output_)) | ASSERT_TRUE(std::filesystem::exists(log_)) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/vectors"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/eigen_application_test.cpp EigenApplicationTest.EmptyPencilPreservesPreviousFinalAndEmptyLog EigenApplicationTest.EmptyPencilPreservesPreviousFinalAndEmptyLog; assertion 3개 tests/integration/app/eigen_application_test.cpp EigenApplicationTest.EmptyPencilPreservesPreviousFinalAndEmptyLog 유지 원문 검사 body 및 assertion 동일. c919926a783cca5aacef016773b325fbad92557b269875233aa77feb5f4cf253 c919926a783cca5aacef016773b325fbad92557b269875233aa77feb5f4cf253 EXPECT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 4) | EXPECT_TRUE(std::string(std::istreambuf_iterator{previous}, {}) == original) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) EXPECT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 4) | EXPECT_TRUE(std::string(std::istreambuf_iterator{previous}, {}) == original) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/eigen_application_test.cpp support@1-81 helper/oracle/fixture/include/static assertion 구간: EigenApplicationTest, WriteDeck tests/integration/app/eigen_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 34d85c877e290ff9094967418cedc08e2751fe6074e5f3007b0b1dd16a22e861 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/eigen_application_test.cpp support@110-111 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/eigen_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/fesa_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/integration/app/fesa_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 07d63eb93467254f069d6ae86e2af022287e1ff0dba8272dbb08e830709a9ff0 07d63eb93467254f069d6ae86e2af022287e1ff0dba8272dbb08e830709a9ff0 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/fesa_application_test.cpp LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName; assertion 2개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName 유지 원문 검사 body 및 assertion 동일. 32a254e96576eb69d5fa023125fa0bf941cf0d2a73be539df402feb8687b097f 32a254e96576eb69d5fa023125fa0bf941cf0d2a73be539df402feb8687b097f "ASSERT_EQ(result.exit_code, 0) | EXPECT_FALSE(std::filesystem::exists(directory.Path() / ""results.h5""))" "ASSERT_EQ(result.exit_code, 0) | EXPECT_FALSE(std::filesystem::exists(directory.Path() / ""results.h5""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/fesa_application_test.cpp FesaApplication.OpensDerivedLogBeforeInputMapping FesaApplication.OpensDerivedLogBeforeInputMapping; assertion 3개 tests/integration/app/fesa_application_test.cpp FesaApplication.OpensDerivedLogBeforeInputMapping 유지 원문 검사 body 및 assertion 동일. 0ff45e4e3ddc200c86c04a2c7aeafc773da2345f78afda2eadc06eddd4d6d006 0ff45e4e3ddc200c86c04a2c7aeafc773da2345f78afda2eadc06eddd4d6d006 EXPECT_EQ(result.exit_code, 3) | ASSERT_TRUE(std::filesystem::exists(log)) | EXPECT_EQ(std::filesystem::file_size(log), 0U) EXPECT_EQ(result.exit_code, 3) | ASSERT_TRUE(std::filesystem::exists(log)) | EXPECT_EQ(std::filesystem::file_size(log), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/fesa_application_test.cpp LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic; assertion 9개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic 유지 원문 검사 body 및 assertion 동일. 466456fe6183443de50011587199f89bcfe4345da298f5ffcb6fb3bf21b27f83 466456fe6183443de50011587199f89bcfe4345da298f5ffcb6fb3bf21b27f83 "EXPECT_EQ(success.exit_code, 0) | EXPECT_EQ(usage.exit_code, 2) | EXPECT_EQ(input.exit_code, 3) | EXPECT_EQ(model.exit_code, 4) | EXPECT_EQ(solver.exit_code, 5) | EXPECT_EQ(repeated_output.exit_code, 2) | EXPECT_NE(repeated_output.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(unknown_output_option.exit_code, 2) | EXPECT_NE(unknown_output_option.standard_error.find(""code=cli-usage""), std::string::npos)" "EXPECT_EQ(success.exit_code, 0) | EXPECT_EQ(usage.exit_code, 2) | EXPECT_EQ(input.exit_code, 3) | EXPECT_EQ(model.exit_code, 4) | EXPECT_EQ(solver.exit_code, 5) | EXPECT_EQ(repeated_output.exit_code, 2) | EXPECT_NE(repeated_output.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(unknown_output_option.exit_code, 2) | EXPECT_NE(unknown_output_option.standard_error.find(""code=cli-usage""), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged; assertion 7개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged 유지 원문 검사 body 및 assertion 동일. 15e900377c4aa714bb7d75ea9dcefa8e379107ec7b3aae46f27c39781c4d73e4 15e900377c4aa714bb7d75ea9dcefa8e379107ec7b3aae46f27c39781c4d73e4 "EXPECT_EQ(result.exit_code, 2) | EXPECT_EQ( std::count(result.standard_error.begin(), result.standard_error.end(), '\n'), 1U) | EXPECT_NE(result.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" "EXPECT_EQ(result.exit_code, 2) | EXPECT_EQ( std::count(result.standard_error.begin(), result.standard_error.end(), '\n'), 1U) | EXPECT_NE(result.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/fesa_application_test.cpp LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged; assertion 7개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged 유지 원문 검사 body 및 assertion 동일. 28fec91071cedec614407118354e3d04c18bccaf67210f5351846382380f4def 28fec91071cedec614407118354e3d04c18bccaf67210f5351846382380f4def "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(result.exit_code, 6) | EXPECT_NE(result.standard_error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(result.exit_code, 6) | EXPECT_NE(result.standard_error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults; assertion 6개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults 유지 원문 검사 body 및 assertion 동일. 36ab47846953b9f89467d79516155a88696bf76e752f34933d9dc6169a28f6a3 36ab47846953b9f89467d79516155a88696bf76e752f34933d9dc6169a28f6a3 "ASSERT_EQ(plain.exit_code, 0) | ASSERT_EQ(requested.exit_code, 0) | EXPECT_EQ(ReadDoubleDataset(requested_file.Get(), path), ReadDoubleDataset(plain_file.Get(), path)) | EXPECT_EQ(DatasetDimensions(plain_file.Get(), ""/diagnostics""), std::vector({0U})) | ASSERT_EQ(requested_diagnostics.size(), 1U) | EXPECT_GT(requested_diagnostics[0U], 0U)" "ASSERT_EQ(plain.exit_code, 0) | ASSERT_EQ(requested.exit_code, 0) | EXPECT_EQ(ReadDoubleDataset(requested_file.Get(), path), ReadDoubleDataset(plain_file.Get(), path)) | EXPECT_EQ(DatasetDimensions(plain_file.Get(), ""/diagnostics""), std::vector({0U})) | ASSERT_EQ(requested_diagnostics.size(), 1U) | EXPECT_GT(requested_diagnostics[0U], 0U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/fesa_application_test.cpp Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute; assertion 1개 tests/integration/app/fesa_application_test.cpp Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute 유지 원문 검사 body 및 assertion 동일. f437d9ab3ce6cc9db9242318e612bb8e0f5acdf70ce8ca47910c24a6e2fefbf9 f437d9ab3ce6cc9db9242318e612bb8e0f5acdf70ce8ca47910c24a6e2fefbf9 ASSERT_EQ(result.exit_code, 0) ASSERT_EQ(result.exit_code, 0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/fesa_application_test.cpp support@1-355 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, CurrentDirectoryGuard, Hdf5Handle, WriteText, AxialDeck, AllConstrainedShellDeck, OpenFile, OpenDataset, DatasetDimensions, ReadDoubleDataset, for, ReadStringAttribute, ExpectMandatoryInventory, ExpectFesaHdf5Identity, ExpectShellHdf5Identity, AppRun, RunApplication, catch, ExpectDiagnosticFieldOrder, FileSnapshot, SnapshotFile tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 86ad01a4a2d9c96621b43860360f5db1b874f41c64a92f5331a7d2c5f7a090b2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/fesa_application_test.cpp support@370-371 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0d9a57af3a9392fe92e3468c81957fece71dccadbc9c5c1d2ae25abcdcfcbf96 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/fesa_application_test.cpp support@424-426 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2e743f1bbe2074a4e496d4e18d5f0fb1d01581db88662ac2b7000cbbf3235f48 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/fesa_application_test.cpp support@454-456 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 485a5a091491fa984b66ae21431bff2ac7e5bd7b5981645f350c41c4c4d1ceff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/fesa_application_test.cpp support@517-518 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7210dc43217ee6c97222f26b3a7441a44ac19ae603a5360e08ac32b4c466f12d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/shell_surface_pressure_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/integration/app/shell_surface_pressure_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 369cc07b69791c67f80fefdfebd3b3986bdd7ec3ddae0fc20cc7f9f01f1e4d07 369cc07b69791c67f80fefdfebd3b3986bdd7ec3ddae0fc20cc7f9f01f1e4d07 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate; assertion 2개 tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate 유지 원문 검사 body 및 assertion 동일. 4352e654ee0cbb33ae714e1d066609c2a6e2daf28d16df65df2da019d8af4e50 4352e654ee0cbb33ae714e1d066609c2a6e2daf28d16df65df2da019d8af4e50 EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior; assertion 7개 tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior 유지 원문 검사 body 및 assertion 동일. 53128674e01206097130820f16e2df3d01c24e0961f07bad72972d923ed96683 53128674e01206097130820f16e2df3d01c24e0961f07bad72972d923ed96683 "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/displacement"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/displacement"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior; assertion 7개 tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior 유지 원문 검사 body 및 assertion 동일. a92cd868028262e66a83bd771b9a654819e00285b03907d87f49c87ae6ceb5fe a92cd868028262e66a83bd771b9a654819e00285b03907d87f49c87ae6ceb5fe "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/shell_surface_pressure_application_test.cpp support@1-137 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, ReadBytes, ShellDeck, NonlinearShellDeck tests/integration/app/shell_surface_pressure_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 018b3c3f47b9ffbf3ee6fc438e63618a745aef6195e249c4b5acf8cbfd00ac04 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/solid_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/integration/app/solid_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4fe3fa020951bd776343af5d26def36392794dd74c5e19ca3d57427c489c6831 4fe3fa020951bd776343af5d26def36392794dd74c5e19ca3d57427c489c6831 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/solid_application_test.cpp SolidApplication.AllFiveActualProceduresWriteOfficialSolidSchema SolidApplication.AllFiveActualProceduresWriteOfficialSolidSchema; assertion 6개 tests/integration/app/solid_application_test.cpp SolidApplication.AllFiveActualProceduresWriteOfficialSolidSchema 유지 원문 검사 body 및 assertion 동일. 0cddac0e04be42a231c5f6677e088fd87072a425b750a23aab5690b0ed8c84bd 0cddac0e04be42a231c5f6677e088fd87072a425b750a23aab5690b0ed8c84bd ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_GE(f, 0) | ASSERT_GE(g, 0) | ASSERT_GE(a, 0) | ASSERT_GE(H5Aread(a, t, &value), 0) | EXPECT_STREQ(value, solid_output_test::Procedure(p)) ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_GE(f, 0) | ASSERT_GE(g, 0) | ASSERT_GE(a, 0) | ASSERT_GE(H5Aread(a, t, &value), 0) | EXPECT_STREQ(value, solid_output_test::Procedure(p)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/solid_application_test.cpp SolidApplication.NativeExecutableRunsAllFiveAndKeepsWarningsAndTypedLogs SolidApplication.NativeExecutableRunsAllFiveAndKeepsWarningsAndTypedLogs; assertion 20개 tests/integration/app/solid_application_test.cpp SolidApplication.NativeExecutableRunsAllFiveAndKeepsWarningsAndTypedLogs 유지 원문 검사 body 및 assertion 동일. 6fa687c0d3ddc09ca8dfdbe276e14156ffb4b98874acb4e66b2a3a815956eb96 6fa687c0d3ddc09ca8dfdbe276e14156ffb4b98874acb4e66b2a3a815956eb96 "ASSERT_GT(length, 0u) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | ASSERT_EQ(exit, 0u) | EXPECT_GT(H5Fis_hdf5(files.output.string().c_str()), 0) | EXPECT_EQ(NumericSnapshot(files.output, p), expected) | EXPECT_EQ(log.find(""correction_rotation""), std::string::npos) | EXPECT_EQ(log.find(""residual_moment""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-static-log-v1""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-hht-log-v1""), std::string::npos) | EXPECT_NE(log.find(""h2_physical_da_over_L=""), std::string::npos) | EXPECT_NE(log.find(""h2_algorithmic_dA_over_L=""), std::string::npos) | EXPECT_NE(log.find(""normalized-high-low-physical-state;RN64-observables""), std::string::npos) | ASSERT_GE(file, 0) | ASSERT_GE(diagnostics, 0) | EXPECT_GT(rows, 0u)" "ASSERT_GT(length, 0u) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | ASSERT_EQ(exit, 0u) | EXPECT_GT(H5Fis_hdf5(files.output.string().c_str()), 0) | EXPECT_EQ(NumericSnapshot(files.output, p), expected) | EXPECT_EQ(log.find(""correction_rotation""), std::string::npos) | EXPECT_EQ(log.find(""residual_moment""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-static-log-v1""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-hht-log-v1""), std::string::npos) | EXPECT_NE(log.find(""h2_physical_da_over_L=""), std::string::npos) | EXPECT_NE(log.find(""h2_algorithmic_dA_over_L=""), std::string::npos) | EXPECT_NE(log.find(""normalized-high-low-physical-state;RN64-observables""), std::string::npos) | ASSERT_GE(file, 0) | ASSERT_GE(diagnostics, 0) | EXPECT_GT(rows, 0u)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/solid_application_test.cpp SolidApplication.SuccessfulWarningsRetainSourceLocationAndTarget SolidApplication.SuccessfulWarningsRetainSourceLocationAndTarget; assertion 5개 tests/integration/app/solid_application_test.cpp SolidApplication.SuccessfulWarningsRetainSourceLocationAndTarget 유지 원문 검사 body 및 assertion 동일. cb7efd965f709cfc1e66b1751aaaf1c95e875fafa95a45ce6b96ab5f92a47918 cb7efd965f709cfc1e66b1751aaaf1c95e875fafa95a45ce6b96ab5f92a47918 "ASSERT_EQ(exit, 0) | EXPECT_NE(diagnostics.find(""code=inactive-solid-rotation-boundary""), std::string::npos) | EXPECT_NE(diagnostics.find(""entity_identity=Fixed""), std::string::npos) | EXPECT_NE(diagnostics.find(""line=30""), std::string::npos) | EXPECT_NE(diagnostics.find(files.input.generic_u8string()), std::string::npos)" "ASSERT_EQ(exit, 0) | EXPECT_NE(diagnostics.find(""code=inactive-solid-rotation-boundary""), std::string::npos) | EXPECT_NE(diagnostics.find(""entity_identity=Fixed""), std::string::npos) | EXPECT_NE(diagnostics.find(""line=30""), std::string::npos) | EXPECT_NE(diagnostics.find(files.input.generic_u8string()), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/integration/app/solid_application_test.cpp support@1-73 helper/oracle/fixture/include/static assertion 구간: NumericSnapshot, for, if tests/integration/app/solid_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fae87db4332db2d58466c577879e346b24a315f8b02442f98f89f063011d1cdf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/solid_application_test.cpp support@174-174 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/solid_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/thermal_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/integration/app/thermal_application_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 671f8895de95c3883587d1766671fc911af679e0ee1104ba90d6f260e2bb7ed4 921d9686ce735dc7e44d0e9bd61580838f969ce08e3f858550a099c9fc98cbef 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExecutesThermalInputThroughAtomicOutput ThermalApplicationTest.ExecutesThermalInputThroughAtomicOutput; assertion 27개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExecutesThermalInputThroughAtomicOutput 유지 원문 검사 body 및 assertion 동일. f6df36c87719748f81960dad63fa6e838d8bc71a7814c36d0d7cb28449bed204 f6df36c87719748f81960dad63fa6e838d8bc71a7814c36d0d7cb28449bed204 "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""Heat.Model_results.h5"").string().c_str()), 0) | EXPECT_EQ(std::filesystem::file_size(Path(""Heat.Model_log.txt"")), 0U) | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_step_name""), ""Raw Heat"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""feature_id""), ""shell-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""analysis_procedure""), ""uncoupled-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_input_identity"") .find(""path="" + Path(""Heat.Model.INP"").generic_u8string() + "";content_identity=""), 0U) | ASSERT_EQ(frames.size(), 4U) | EXPECT_EQ(frame.frame_index, index) | EXPECT_EQ(frame.increment_index, index) | EXPECT_EQ(frame.is_initial, index == 0 ? 1 : 0) | EXPECT_DOUBLE_EQ(frame.time, index == 3 ? .7 : static_cast(index) * .3) | EXPECT_DOUBLE_EQ(frame.time_increment, index == 0 ? 0 : index == 3 ? std::fma(-2., .3, .7) : .3) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/temperature""), (std::vector{4, 5})) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_LT(value, 0.) | EXPECT_DOUBLE_EQ(value, -2.) | EXPECT_EQ( H5Lexists(file.Get(), (root + ""/nodal/reaction_heat_rate"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), (root + ""/element"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{0})) | EXPECT_EQ(Shape(file.Get(), root + ""/element/heat_flux""), (std::vector{1, 4, 6, 3})) | EXPECT_EQ(Shape(file.Get(), ""/diagnostics""), (std::vector{1})) | ASSERT_GE(H5Tset_size(string_type.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(string_type.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(row_type.Get(), ""code"", 0, string_type.Get()), 0) | ASSERT_GE(H5Dread(diagnostics.Get(), row_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &code), 0) | EXPECT_STREQ(code, ""ignored-input-keyword"")" "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""Heat.Model_results.h5"").string().c_str()), 0) | EXPECT_EQ(std::filesystem::file_size(Path(""Heat.Model_log.txt"")), 0U) | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_step_name""), ""Raw Heat"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""feature_id""), ""shell-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""analysis_procedure""), ""uncoupled-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_input_identity"") .find(""path="" + Path(""Heat.Model.INP"").generic_u8string() + "";content_identity=""), 0U) | ASSERT_EQ(frames.size(), 4U) | EXPECT_EQ(frame.frame_index, index) | EXPECT_EQ(frame.increment_index, index) | EXPECT_EQ(frame.is_initial, index == 0 ? 1 : 0) | EXPECT_DOUBLE_EQ(frame.time, index == 3 ? .7 : static_cast(index) * .3) | EXPECT_DOUBLE_EQ(frame.time_increment, index == 0 ? 0 : index == 3 ? std::fma(-2., .3, .7) : .3) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/temperature""), (std::vector{4, 5})) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_LT(value, 0.) | EXPECT_DOUBLE_EQ(value, -2.) | EXPECT_EQ( H5Lexists(file.Get(), (root + ""/nodal/reaction_heat_rate"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), (root + ""/element"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{0})) | EXPECT_EQ(Shape(file.Get(), root + ""/element/heat_flux""), (std::vector{1, 4, 6, 3})) | EXPECT_EQ(Shape(file.Get(), ""/diagnostics""), (std::vector{1})) | ASSERT_GE(H5Tset_size(string_type.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(string_type.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(row_type.Get(), ""code"", 0, string_type.Get()), 0) | ASSERT_GE(H5Dread(diagnostics.Get(), row_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &code), 0) | EXPECT_STREQ(code, ""ignored-input-keyword"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.EndpointCloseUsesActualDeltaAndLargeIncrementUsesPeriod ThermalApplicationTest.EndpointCloseUsesActualDeltaAndLargeIncrementUsesPeriod; assertion 8개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.EndpointCloseUsesActualDeltaAndLargeIncrementUsesPeriod 유지 원문 검사 body 및 assertion 동일. ad5bd959038bf1bc1167ca2796d5badbb5ec663f87fe89df335c5b8acb760992 ad5bd959038bf1bc1167ca2796d5badbb5ec663f87fe89df335c5b8acb760992 ASSERT_EQ(run.exit_code, 0) | ASSERT_EQ(frames.size(), 4U) | EXPECT_DOUBLE_EQ(frames.back().time, .9) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .3) | EXPECT_NE(frames.back().time_increment, frames[3].time - frames[2].time) | ASSERT_EQ(frames.size(), 2U) | EXPECT_DOUBLE_EQ(frames.back().time, .7) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .7) ASSERT_EQ(run.exit_code, 0) | ASSERT_EQ(frames.size(), 4U) | EXPECT_DOUBLE_EQ(frames.back().time, .9) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .3) | EXPECT_NE(frames.back().time_increment, frames[3].time - frames[2].time) | ASSERT_EQ(frames.size(), 2U) | EXPECT_DOUBLE_EQ(frames.back().time, .7) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .7) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RawInitialPrecedesPrescribedBoundaryProjection ThermalApplicationTest.RawInitialPrecedesPrescribedBoundaryProjection; assertion 5개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RawInitialPrecedesPrescribedBoundaryProjection 유지 원문 검사 body 및 assertion 동일. 28ecc20ef5539e10837bbd26888c6c4700394e032a556a72b3732e7322abaad7 28ecc20ef5539e10837bbd26888c6c4700394e032a556a72b3732e7322abaad7 "ASSERT_EQ(run.exit_code, 0) | EXPECT_DOUBLE_EQ(value, -2) | EXPECT_DOUBLE_EQ(temperature[5 * node], 1) | EXPECT_DOUBLE_EQ(temperature[5 * node + 4], 1) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{8}))" "ASSERT_EQ(run.exit_code, 0) | EXPECT_DOUBLE_EQ(value, -2) | EXPECT_DOUBLE_EQ(temperature[5 * node], 1) | EXPECT_DOUBLE_EQ(temperature[5 * node + 4], 1) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{8}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.InputAndSolverFailuresPreservePreviousFinal ThermalApplicationTest.InputAndSolverFailuresPreservePreviousFinal; assertion 4개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.InputAndSolverFailuresPreservePreviousFinal 유지 원문 검사 body 및 assertion 동일. cfe5e9a34c0cbd33635c6d35935173a280c1378f0735dfc9e5a5777696c1bc7b cfe5e9a34c0cbd33635c6d35935173a280c1378f0735dfc9e5a5777696c1bc7b "EXPECT_EQ(run.exit_code, test.second) | EXPECT_FALSE(run.error.empty()) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), previous) | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U)" "EXPECT_EQ(run.exit_code, test.second) | EXPECT_FALSE(run.error.empty()) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), previous) | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.BusyLeasePrecedesParsingAndPreservesBothOutputs ThermalApplicationTest.BusyLeasePrecedesParsingAndPreservesBothOutputs; assertion 5개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.BusyLeasePrecedesParsingAndPreservesBothOutputs 유지 원문 검사 body 및 assertion 동일. be71949b43487d6eed86586a4994ed0d9fd08e1263cb47f5d13b7c995aaf01a0 be71949b43487d6eed86586a4994ed0d9fd08e1263cb47f5d13b7c995aaf01a0 "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(run.exit_code, 6) | EXPECT_NE(run.error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"") | EXPECT_EQ(ReadBytes(paths.log_path), ""previous log"")" "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(run.exit_code, 6) | EXPECT_NE(run.error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"") | EXPECT_EQ(ReadBytes(paths.log_path), ""previous log"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RealFinalizeFailurePreservesFinalAndRemovesCandidate ThermalApplicationTest.RealFinalizeFailurePreservesFinalAndRemovesCandidate; assertion 6개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RealFinalizeFailurePreservesFinalAndRemovesCandidate 유지 원문 검사 body 및 assertion 동일. 5f48d5b0464432fadf5f0f9522ae62bb204c588633cc77c86517b58a81667be0 5f48d5b0464432fadf5f0f9522ae62bb204c588633cc77c86517b58a81667be0 "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_TRUE(CloseHandle(locked)) | EXPECT_EQ(run.exit_code, 6) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), ""previous final"") | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U) | EXPECT_EQ(entry.path().filename().string().find("".tmp.""), std::string::npos)" "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_TRUE(CloseHandle(locked)) | EXPECT_EQ(run.exit_code, 6) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), ""previous final"") | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U) | EXPECT_EQ(entry.path().filename().string().find("".tmp.""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.MissingAdaptersHaveSpecificFailureCategories ThermalApplicationTest.MissingAdaptersHaveSpecificFailureCategories; assertion 14개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.MissingAdaptersHaveSpecificFailureCategories 유지 원문 검사 body 및 assertion 동일. 96329adf31d0773e0ed5ee9335cb9c21be7908e2179d2c8abb4a74f7a5ba71c1 96329adf31d0773e0ed5ee9335cb9c21be7908e2179d2c8abb4a74f7a5ba71c1 "ASSERT_TRUE(prepared.HasValue()) | ASSERT_EQ(prepared.Value().domain.Steps().Size(), 0U) | ASSERT_TRUE(log.Open(Path(""model_log.txt"")).IsOk()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""missing-thermal-executor"") | ASSERT_TRUE(outcome.HasValue()) | ASSERT_TRUE( std::holds_alternative(outcome.Value())) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-thermal-writer"") | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"")" "ASSERT_TRUE(prepared.HasValue()) | ASSERT_EQ(prepared.Value().domain.Steps().Size(), 0U) | ASSERT_TRUE(log.Open(Path(""model_log.txt"")).IsOk()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""missing-thermal-executor"") | ASSERT_TRUE(outcome.HasValue()) | ASSERT_TRUE( std::holds_alternative(outcome.Value())) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-thermal-writer"") | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExistingStructuralStaticNonlinearAndHhtRoutesRemainAvailable ThermalApplicationTest.ExistingStructuralStaticNonlinearAndHhtRoutesRemainAvailable; assertion 2개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExistingStructuralStaticNonlinearAndHhtRoutesRemainAvailable 유지 원문 검사 body 및 assertion 동일. b103892efb098072fe2035f37dbc8731fa5d2819279d54cc1cc3a7e0dfc3b29d b103892efb098072fe2035f37dbc8731fa5d2819279d54cc1cc3a7e0dfc3b29d "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""model_results.h5"").string().c_str()), 0)" "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""model_results.h5"").string().c_str()), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.NativeExecutableAcceptsThermalInputAndRejectsInteriorBoundary ThermalApplicationTest.NativeExecutableAcceptsThermalInputAndRejectsInteriorBoundary; assertion 9개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.NativeExecutableAcceptsThermalInputAndRejectsInteriorBoundary 유지 원문 검사 body 및 assertion 동일. 24830ff7dc3c76bc4465be558297597f8626d2f17796512e86b1853983bb48da 24830ff7dc3c76bc4465be558297597f8626d2f17796512e86b1853983bb48da "ASSERT_GT(length, 0U) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | EXPECT_EQ(exit, valid ? 0U : 3U) | EXPECT_GT(H5Fis_hdf5(Path(""native_results.h5"").string().c_str()), 0) | EXPECT_EQ(ReadBytes(Path(""native_results.h5"")), previous)" "ASSERT_GT(length, 0U) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | EXPECT_EQ(exit, valid ? 0U : 3U) | EXPECT_GT(H5Fis_hdf5(Path(""native_results.h5"").string().c_str()), 0) | EXPECT_EQ(ReadBytes(Path(""native_results.h5"")), previous)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/integration/app/thermal_application_test.cpp support@1-208 helper/oracle/fixture/include/static assertion 구간: HdfHandle, Get, Shape, Doubles, StringAttribute, FrameRow, Frames, ReadBytes, Replace, AppRun, RunApplication, ThermalApplicationTest, Path, Write, Deck tests/integration/app/thermal_application_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 41bdb373a6e9bad882ced3ad466906c1fd0524cc64b6f6824100f7ead487b3cf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/integration/app/thermal_application_test.cpp support@490-491 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/thermal_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/reference/b33_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/b33_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296 8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/b33_reference_comparison_test.cpp B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence; assertion 35개 tests/reference/b33_reference_comparison_test.cpp B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence 유지 원문 검사 body 및 assertion 동일. 082a94dba1c41737c5aad55d0f5f0c0e94a339a24de29e3dfba6d70ddf48f0ea 082a94dba1c41737c5aad55d0f5f0c0e94a339a24de29e3dfba6d70ddf48f0ea "ASSERT_TRUE(std::filesystem::create_directories(output_directory, error)) | ASSERT_FALSE(error) | ASSERT_EQ(reference_before.size(), 4U) | EXPECT_EQ(reference_before[0U].relative_path, std::filesystem::path{""cantilever beam displacements.csv""}) | EXPECT_EQ(reference_before[1U].relative_path, std::filesystem::path{""cantilever beam elemental forces.csv""}) | EXPECT_EQ(reference_before[2U].relative_path, std::filesystem::path{""cantilever beam reactions.csv""}) | EXPECT_EQ(reference_before[3U].relative_path, std::filesystem::path{""cantilever beam.inp""}) | ASSERT_TRUE(std::filesystem::copy_file(input, execution_input, error)) | ASSERT_FALSE(error) | ASSERT_EQ(application.Run({execution_input.string()}), 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_GT(H5Fis_hdf5(results.string().c_str()), 0) | EXPECT_GT(StressRowCount(results), 0U) | ASSERT_TRUE(comparison_result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), kExpectedRowCount) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed && std::isfinite(row.absolute_error) && std::isfinite(row.tolerance) && row.tolerance >= 0.0 && std::isfinite(row.reference_scale) && std::isfinite(row.near_zero_band) && std::isfinite(row.relative_error) && row.fesa.model_id == ""cantilever-beam-b33"" && row.reference.model_id == ""cantilever-beam-b33"" && row.fesa.step_name == ""Step-1"" && row.reference.step_name == ""Step-1"" && row.fesa.frame_index == 0U && row.reference.frame_index == 0U && row.fesa.instance_name == ""PART-1_1-1"" && row.reference.instance_name == ""PART-1_1-1"" && !row.fesa.hdf5_dataset_path.empty(); })) | EXPECT_TRUE( std::all_of(report.metrics.begin(), report.metrics.end(), [](const fesa::test::ComponentMetrics& metric) { return std::isfinite(metric.reference_scale) && std::isfinite(metric.near_zero_band) && std::isfinite(metric.maximum_absolute_error) && std::isfinite(metric.relative_rms) && metric.rms_passed && metric.passed && metric.row_count > 0U && !metric.components.empty(); })) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | EXPECT_TRUE(std::isfinite(report.physics_evidence.free_residual_norm)) | EXPECT_LE(report.physics_evidence.free_residual_norm, 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_force, report.physics_evidence.reaction_force)), 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_moment_about_origin, report.physics_evidence.reaction_moment_about_origin)), 1.0e-2) | ASSERT_TRUE(fesa::test::ReferenceComparison::WriteDeterministicJson( report, comparison) .IsOk()) | ASSERT_TRUE(std::filesystem::is_regular_file(comparison)) | EXPECT_NE(json.find(""\""stress_comparison_applicable\"":false""), std::string::npos) | EXPECT_NE(json.find(""\""physics_evidence\""""), std::string::npos) | EXPECT_NE(json.find(""\""source_element_label\""""), std::string::npos) | EXPECT_NE(json.find(""\""family_identity\""""), std::string::npos) | EXPECT_NE(json.find(""\""row_count\""""), std::string::npos) | EXPECT_EQ(generated_names, (std::vector{""cantilever beam.inp"", ""cantilever beam_log.txt"", ""cantilever beam_results.h5"", ""comparison.json""}))" "ASSERT_TRUE(std::filesystem::create_directories(output_directory, error)) | ASSERT_FALSE(error) | ASSERT_EQ(reference_before.size(), 4U) | EXPECT_EQ(reference_before[0U].relative_path, std::filesystem::path{""cantilever beam displacements.csv""}) | EXPECT_EQ(reference_before[1U].relative_path, std::filesystem::path{""cantilever beam elemental forces.csv""}) | EXPECT_EQ(reference_before[2U].relative_path, std::filesystem::path{""cantilever beam reactions.csv""}) | EXPECT_EQ(reference_before[3U].relative_path, std::filesystem::path{""cantilever beam.inp""}) | ASSERT_TRUE(std::filesystem::copy_file(input, execution_input, error)) | ASSERT_FALSE(error) | ASSERT_EQ(application.Run({execution_input.string()}), 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_GT(H5Fis_hdf5(results.string().c_str()), 0) | EXPECT_GT(StressRowCount(results), 0U) | ASSERT_TRUE(comparison_result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), kExpectedRowCount) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed && std::isfinite(row.absolute_error) && std::isfinite(row.tolerance) && row.tolerance >= 0.0 && std::isfinite(row.reference_scale) && std::isfinite(row.near_zero_band) && std::isfinite(row.relative_error) && row.fesa.model_id == ""cantilever-beam-b33"" && row.reference.model_id == ""cantilever-beam-b33"" && row.fesa.step_name == ""Step-1"" && row.reference.step_name == ""Step-1"" && row.fesa.frame_index == 0U && row.reference.frame_index == 0U && row.fesa.instance_name == ""PART-1_1-1"" && row.reference.instance_name == ""PART-1_1-1"" && !row.fesa.hdf5_dataset_path.empty(); })) | EXPECT_TRUE( std::all_of(report.metrics.begin(), report.metrics.end(), [](const fesa::test::ComponentMetrics& metric) { return std::isfinite(metric.reference_scale) && std::isfinite(metric.near_zero_band) && std::isfinite(metric.maximum_absolute_error) && std::isfinite(metric.relative_rms) && metric.rms_passed && metric.passed && metric.row_count > 0U && !metric.components.empty(); })) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | EXPECT_TRUE(std::isfinite(report.physics_evidence.free_residual_norm)) | EXPECT_LE(report.physics_evidence.free_residual_norm, 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_force, report.physics_evidence.reaction_force)), 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_moment_about_origin, report.physics_evidence.reaction_moment_about_origin)), 1.0e-2) | ASSERT_TRUE(fesa::test::ReferenceComparison::WriteDeterministicJson( report, comparison) .IsOk()) | ASSERT_TRUE(std::filesystem::is_regular_file(comparison)) | EXPECT_NE(json.find(""\""stress_comparison_applicable\"":false""), std::string::npos) | EXPECT_NE(json.find(""\""physics_evidence\""""), std::string::npos) | EXPECT_NE(json.find(""\""source_element_label\""""), std::string::npos) | EXPECT_NE(json.find(""\""family_identity\""""), std::string::npos) | EXPECT_NE(json.find(""\""row_count\""""), std::string::npos) | EXPECT_EQ(generated_names, (std::vector{""cantilever beam.inp"", ""cantilever beam_log.txt"", ""cantilever beam_results.h5"", ""comparison.json""}))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/b33_reference_comparison_test.cpp support@1-147 helper/oracle/fixture/include/static assertion 구간: Hdf5Handle, if, ReferenceSnapshotEntry, ReadBytes, SnapshotTree, sort, ExpectTreeUnchanged, Norm, Sum, StressRowCount tests/reference/b33_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 08f0770f5aeb24b1560b8da3f35b583cbf85abfbf36dded9d21e96dfb54c38c3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/eigen_reference_cases_test.cpp file 이관 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 modal identity·수치 기준은 유지한다. f91504b627d58c1ea91174e4d32575067afd8ad6f6e8e9ca79b0bce519a4e661 4890fe18f1ff259890fbc9baf6f4f1c39fabd3bc0a42b8059581dfff7604aeb6 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_cases_test.cpp EigenReference.RunsOriginalInputAndComparesAllModalFrameIdentities EigenReference.RunsOriginalInputAndComparesAllModalFrameIdentities; assertion 16개 tests/reference/eigen_reference_cases_test.cpp EigenReference.RunsOriginalInputAndComparesAllModalFrameIdentities 이관 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 modal identity·수치 기준은 유지한다. fa57f3fdb447c190ddefaab2218f9e44265ca1eaf577b3c5b28dd587f66ad32c e4f451acf146ec42a498f137080e48e956b4c57c5dbbbaff1a880d95123d254c "EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before) | ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().passed) | EXPECT_EQ(comparison.Value().source_step_name, ""Step-2"") | EXPECT_EQ(comparison.Value().requested_mode_count, 10U) | ASSERT_EQ(comparison.Value().rows.size(), 10U) | ASSERT_EQ(comparison.Value().families.size(), 10U) | EXPECT_EQ(comparison.Value().rows[index].mode_id, index + 1U) | EXPECT_EQ(comparison.Value().rows[index].component, ""Value"") | EXPECT_EQ(comparison.Value().families[index].row_count, 1U) | EXPECT_TRUE(comparison.Value().families[index].passed) | EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before)" "EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before) | ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().passed) | EXPECT_EQ(comparison.Value().source_step_name, ""Step-2"") | EXPECT_EQ(comparison.Value().requested_mode_count, 10U) | ASSERT_EQ(comparison.Value().rows.size(), 10U) | ASSERT_EQ(comparison.Value().families.size(), 10U) | EXPECT_EQ(comparison.Value().rows[index].mode_id, index + 1U) | EXPECT_EQ(comparison.Value().rows[index].component, ""Value"") | EXPECT_EQ(comparison.Value().families[index].row_count, 1U) | EXPECT_TRUE(comparison.Value().families[index].passed) | EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/reference/eigen_reference_cases_test.cpp support@1-31 helper/oracle/fixture/include/static assertion 구간: ReadBytes, if tests/reference/eigen_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 modal identity·수치 기준은 유지한다. e6d5ed00a9bcbd734a958a0c92005773d61527a1f2fdad5e04571e08bb892da2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_cases_test.cpp support@69-70 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/eigen_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 modal identity·수치 기준은 유지한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/eigen_reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000 b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison.cpp support@1-436 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonFailure, Fail, FailureStatus, Hdf5Handle, if, RequireId, RequireHdf, ReadUtf8Attribute, ReadUint64Attribute, Hdf5Mode, ReadModes, ParseFiniteNumber, data, RequireNumberSyntax, ReadReferenceText, while, Result, Compare, for, catch tests/reference/eigen_reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f8341d7432300658ef47c07672af81668f135597ea1bad54b73a9c9000e3c51b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/eigen_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15 96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison.h support@1-51 helper/oracle/fixture/include/static assertion 구간: fesa, EigenReferenceCase, EigenReferenceRowDecision, EigenReferenceComparisonReport, EigenReferenceComparison tests/reference/eigen_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c66c08bae4956e9e12aa43fd98fcb70678b043ac7046cd085f1662494f61f0e0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/eigen_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison_test.cpp EigenReferenceComparison.DirectSchemaFixtureAcceptsRepeatedReorderedModes EigenReferenceComparison.DirectSchemaFixtureAcceptsRepeatedReorderedModes; assertion 14개 tests/reference/eigen_reference_comparison_test.cpp EigenReferenceComparison.DirectSchemaFixtureAcceptsRepeatedReorderedModes 유지 원문 검사 body 및 assertion 동일. c756a589e4eb9b1be73380851a5bf8e12dae19900777b023aa6929938a0f7db5 c756a589e4eb9b1be73380851a5bf8e12dae19900777b023aa6929938a0f7db5 "ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(ok.HasValue()) | EXPECT_EQ(ok.Value().policy_id, ""mitc4-eigen-first-implementation"") | EXPECT_DOUBLE_EQ(ok.Value().relative_rms_tolerance, 0.05) | EXPECT_EQ(ok.Value().families.size(), 2U) | ASSERT_GE(H5Dwrite(ds, t, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_EQ(comparison.Value().passed, sample.second) | EXPECT_EQ(comparison.Value().families[0].rms_passed, sample.second) | EXPECT_TRUE(comparison.Value().families[1].passed) | ASSERT_FALSE(comparison.HasValue()) | ASSERT_EQ(comparison.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(comparison.GetStatus().Diagnostics()[0U].code, invalid_text.expected_code) | EXPECT_FALSE( fesa::test::EigenReferenceComparison::Compare(reference_case).HasValue())" "ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(ok.HasValue()) | EXPECT_EQ(ok.Value().policy_id, ""mitc4-eigen-first-implementation"") | EXPECT_DOUBLE_EQ(ok.Value().relative_rms_tolerance, 0.05) | EXPECT_EQ(ok.Value().families.size(), 2U) | ASSERT_GE(H5Dwrite(ds, t, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_EQ(comparison.Value().passed, sample.second) | EXPECT_EQ(comparison.Value().families[0].rms_passed, sample.second) | EXPECT_TRUE(comparison.Value().families[1].passed) | ASSERT_FALSE(comparison.HasValue()) | ASSERT_EQ(comparison.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(comparison.GetStatus().Diagnostics()[0U].code, invalid_text.expected_code) | EXPECT_FALSE( fesa::test::EigenReferenceComparison::Compare(reference_case).HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison_test.cpp support@1-54 helper/oracle/fixture/include/static assertion 구간: UniqueFixtureDirectory, Mode, Str, U tests/reference/eigen_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c8f66a74f9a84a0ee73ed94a47674bcef6637bcbda68daa9b9cac52cd0715989 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/eigen_reference_comparison_test.cpp support@193-193 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/eigen_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/reference/mitc4_reference_cases_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745 60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata; assertion 0개 tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata 유지 원문 검사 body 및 assertion 동일. 0a439f95ff0f8ff6baf1784c2b8286af7c5e9abe4027f6ab711e7cfd274dd297 0a439f95ff0f8ff6baf1784c2b8286af7c5e9abe4027f6ab711e7cfd274dd297 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow; assertion 0개 tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow 유지 원문 검사 body 및 assertion 동일. 4305a332a97418a4548f580e4efd059145ba1f826292cc21d959bbeb55443add 4305a332a97418a4548f580e4efd059145ba1f826292cc21d959bbeb55443add 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_cases_test.cpp support@1-177 helper/oracle/fixture/include/static assertion 구간: ReadBytes, if, ArtifactSnapshot, Snapshot, ExpectUnchanged, CaseEvidence, RunCase, for, ExpectCommonMetadata, ExpectComparisonCoverage, count_if, EXPECT_TRUE, find_if tests/reference/mitc4_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 00c52267b127eef3d2cd68d7bf6171119e37f97b63bd848ff0448f70687590f3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_cases_test.cpp support@186-187 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 60b4486538263f1db4cc916d19cd7fe382e843507683db5da9f99168f7336722 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_cases_test.cpp support@197-198 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/mitc4_reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 58ffb13b5dff2e34b3e57df1376627be96d8d0cd8691ca1f77568d5991f8a191 1e23f52e7a9ff7172bf67f5f9c3e460a05b86089b4df1f91566e502b3f7a3c69 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison.cpp support@1-984 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonFailure, Fail, FailureStatus, Trim, find_if_not, SplitCsvLine, while, if, ParsePositiveLabel, ParseFiniteDouble, UppercaseAscii, transform, IdentityKey, WideRow, ReadReferenceCsv, Hdf5Handle, Hdf5ErrorSilencer, Hdf5VlenReclaimer, Reclaim, RequireId, RequireHdf, MakeUtf8StringType, OpenDataset, Dimensions, ReadStringAttribute, ReadUint64Attribute, RequireStringAttribute, RequireExactCompoundMembers, NodeReadRow, ReadNodes, ElementIdentityReadRow, RequireElementIdentity, for, ReadDisplacement, Hdf5Projection, ReadHdf5, RequireArtifacts, FiniteText, BranchName, switch, JsonEscape, WriteJsonStrings, Result, Compare, catch, WriteDeterministicJson tests/reference/mitc4_reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ba7f7e025e2dad0fa22b02dc44d600c2edb732f2bec5f89856fb2dab648b0958 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/mitc4_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8bd6a36cb25ac102569f733fb560433f5352ddeb7788182e6bbd561da49e846c 51c8b78b44583986eeb175a839fd72a11ca5f3405bf016432da9563878c8f1f6 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison.h support@1-93 helper/oracle/fixture/include/static assertion 구간: fesa, Mitc4ReferenceCase, Mitc4RowDecision, Mitc4ComponentMetrics, Mitc4VectorMetrics, Mitc4Warning, Mitc4ComparisonReport, Mitc4ReferenceComparison tests/reference/mitc4_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 66926b7d72ccfcf4d1a0a42bfa456a43a8b71eac6b7dea8b91f381aff620cb5f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/reference/mitc4_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84620741c644b7ae7ae1cfc527b6effa1fe32d47175b1755be6f337f8d20aa45 b886b3cf9a6d3569e73f6792ce8ff0a84052c81eb21d78a31245fc74033bf370 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity; assertion 11개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity 유지 원문 검사 body 및 assertion 동일. 44461d859079ddd35dd95bcca00277017ed16033e7164b9e62d27f9d98e54836 44461d859079ddd35dd95bcca00277017ed16033e7164b9e62d27f9d98e54836 "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), 12U) | EXPECT_EQ(report.rows[0U].source_node_label, 1) | EXPECT_EQ(report.rows[0U].component, ""U1"") | EXPECT_EQ(report.rows[5U].component, ""UR3"") | EXPECT_EQ(report.rows[6U].source_node_label, 2) | ASSERT_EQ(report.metrics.size(), 2U) | EXPECT_EQ(report.metrics[0U].row_count, 6U) | EXPECT_EQ(report.metrics[1U].row_count, 6U) | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.case_id == ""shell-contract"" && row.instance_name == kInstanceName && row.within_tolerance; }))" "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), 12U) | EXPECT_EQ(report.rows[0U].source_node_label, 1) | EXPECT_EQ(report.rows[0U].component, ""U1"") | EXPECT_EQ(report.rows[5U].component, ""UR3"") | EXPECT_EQ(report.rows[6U].source_node_label, 2) | ASSERT_EQ(report.metrics.size(), 2U) | EXPECT_EQ(report.metrics[0U].row_count, 6U) | EXPECT_EQ(report.metrics[1U].row_count, 6U) | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.case_id == ""shell-contract"" && row.instance_name == kInstanceName && row.within_tolerance; }))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison; assertion 1개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison 유지 원문 검사 body 및 assertion 동일. d4d1ef19df229bad1f14847b9c437910e324f55f638cb91dbec9ec9815681c09 d4d1ef19df229bad1f14847b9c437910e324f55f638cb91dbec9ec9815681c09 ASSERT_TRUE(std::filesystem::remove(fixture.Input())) ASSERT_TRUE(std::filesystem::remove(fixture.Input())) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches; assertion 19개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches 유지 원문 검사 body 및 assertion 동일. 3dbbc317c15107ab849cb8e39ca1a7f85c3a111c899a6074f98efcda9b6b5311 3dbbc317c15107ab849cb8e39ca1a7f85c3a111c899a6074f98efcda9b6b5311 "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | ASSERT_NE(u1_zero, nullptr) | ASSERT_NE(u1_scaled, nullptr) | ASSERT_NE(u2_near, nullptr) | ASSERT_NE(u2_over, nullptr) | EXPECT_DOUBLE_EQ(u1_zero->tolerance, 8.0e-2) | EXPECT_TRUE(u1_zero->within_tolerance) | EXPECT_FALSE(u1_zero->relative_error_applicable) | EXPECT_FALSE(u1_scaled->within_tolerance) | EXPECT_NEAR(u1_scaled->normalized_error, 0.05005, 1.0e-12) | EXPECT_DOUBLE_EQ(u2_near->tolerance, 8.0e-2) | EXPECT_TRUE(u2_near->within_tolerance) | EXPECT_FALSE(u2_near->relative_error_applicable) | EXPECT_FALSE(u2_over->within_tolerance) | EXPECT_DOUBLE_EQ(u2_over->tolerance, 8.0e-2) | ASSERT_NE(translation, nullptr) | EXPECT_DOUBLE_EQ(translation->reference_scale, 8.0) | EXPECT_EQ(translation->components, (std::vector{""U1"", ""U2"", ""U3""}))" "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | ASSERT_NE(u1_zero, nullptr) | ASSERT_NE(u1_scaled, nullptr) | ASSERT_NE(u2_near, nullptr) | ASSERT_NE(u2_over, nullptr) | EXPECT_DOUBLE_EQ(u1_zero->tolerance, 8.0e-2) | EXPECT_TRUE(u1_zero->within_tolerance) | EXPECT_FALSE(u1_zero->relative_error_applicable) | EXPECT_FALSE(u1_scaled->within_tolerance) | EXPECT_NEAR(u1_scaled->normalized_error, 0.05005, 1.0e-12) | EXPECT_DOUBLE_EQ(u2_near->tolerance, 8.0e-2) | EXPECT_TRUE(u2_near->within_tolerance) | EXPECT_FALSE(u2_near->relative_error_applicable) | EXPECT_FALSE(u2_over->within_tolerance) | EXPECT_DOUBLE_EQ(u2_over->tolerance, 8.0e-2) | ASSERT_NE(translation, nullptr) | EXPECT_DOUBLE_EQ(translation->reference_scale, 8.0) | EXPECT_EQ(translation->components, (std::vector{""U1"", ""U2"", ""U3""}))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict; assertion 11개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict 유지 원문 검사 body 및 assertion 동일. 0a685f2a0ea27dcdc95dc89c981067220e0418afd2c3cc242569d38d86212613 0a685f2a0ea27dcdc95dc89c981067220e0418afd2c3cc242569d38d86212613 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | ASSERT_NE(row, nullptr) | EXPECT_FALSE(row->blocking) | EXPECT_FALSE(row->within_tolerance) | EXPECT_EQ(report.warnings[0U].row, static_cast(row - report.rows.data())) | EXPECT_NE(report.warnings[0U].message.find(""shell-contract""), std::string::npos) | EXPECT_NE(report.warnings[0U].message.find(""UR1""), std::string::npos)" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | ASSERT_NE(row, nullptr) | EXPECT_FALSE(row->blocking) | EXPECT_FALSE(row->within_tolerance) | EXPECT_EQ(report.warnings[0U].row, static_cast(row - report.rows.data())) | EXPECT_NE(report.warnings[0U].message.find(""shell-contract""), std::string::npos) | EXPECT_NE(report.warnings[0U].message.find(""UR1""), std::string::npos)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses; assertion 5개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses 유지 원문 검사 body 및 assertion 동일. b300a3ed2c250fb7fe702e7abdc96b7f2d90a9231c2f09107719e9be524a4521 b300a3ed2c250fb7fe702e7abdc96b7f2d90a9231c2f09107719e9be524a4521 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 1U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-rms-exceedance"") | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.within_tolerance; }))" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 1U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-rms-exceedance"") | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.within_tolerance; }))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings; assertion 7개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings 유지 원문 검사 body 및 assertion 동일. deca37dbcad9f79f872439a23d198ead553f7e589eddb78d69f9c74acd722c39 deca37dbcad9f79f872439a23d198ead553f7e589eddb78d69f9c74acd722c39 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | EXPECT_LT(report.warnings[0U].row, report.rows.size()) | EXPECT_LT(report.warnings[1U].row, report.rows.size())" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | EXPECT_LT(report.warnings[0U].row, report.rows.size()) | EXPECT_LT(report.warnings[1U].row, report.rows.size())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically; assertion 18개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically 유지 원문 검사 body 및 assertion 동일. cff2c517222a6a1e2b7e9aba2c8336edfcb6740cb671e64b4a0ab0cb9c1172c6 cff2c517222a6a1e2b7e9aba2c8336edfcb6740cb671e64b4a0ab0cb9c1172c6 "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), 2U) | ASSERT_EQ(report.vector_metrics.size(), 2U) | EXPECT_NEAR(report.vector_metrics[0U].displacement_norm_error, std::sqrt(0.3125) * 1.0e-9, 1.0e-21) | EXPECT_DOUBLE_EQ(report.vector_metrics[0U].rotation_norm_error, 0.75e-9) | ASSERT_LT(report.worst_row, report.rows.size()) | EXPECT_EQ(report.rows[report.worst_row].component, ""UR1"") | EXPECT_TRUE(std::isfinite(metric.reference_scale)) | EXPECT_TRUE(std::isfinite(metric.near_zero_band)) | EXPECT_TRUE(std::isfinite(metric.maximum_absolute_error)) | EXPECT_TRUE(std::isfinite(metric.relative_rms)) | EXPECT_FALSE(metric.components.empty()) | EXPECT_LT(metric.worst_row, report.rows.size()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_a) .IsOk()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(key), std::string::npos)" "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), 2U) | ASSERT_EQ(report.vector_metrics.size(), 2U) | EXPECT_NEAR(report.vector_metrics[0U].displacement_norm_error, std::sqrt(0.3125) * 1.0e-9, 1.0e-21) | EXPECT_DOUBLE_EQ(report.vector_metrics[0U].rotation_norm_error, 0.75e-9) | ASSERT_LT(report.worst_row, report.rows.size()) | EXPECT_EQ(report.rows[report.worst_row].component, ""UR1"") | EXPECT_TRUE(std::isfinite(metric.reference_scale)) | EXPECT_TRUE(std::isfinite(metric.near_zero_band)) | EXPECT_TRUE(std::isfinite(metric.maximum_absolute_error)) | EXPECT_TRUE(std::isfinite(metric.relative_rms)) | EXPECT_FALSE(metric.components.empty()) | EXPECT_LT(metric.worst_row, report.rows.size()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_a) .IsOk()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(key), std::string::npos)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5 Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5; assertion 3개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5 유지 원문 검사 body 및 assertion 동일. 5e8e14898d5f4d7dc448a30743686c8627513240f85ab704fe3dc6e23c603a55 5e8e14898d5f4d7dc448a30743686c8627513240f85ab704fe3dc6e23c603a55 "EXPECT_EQ(names, (std::vector{""case.inp"", ""displacements.csv"", ""results.h5""})) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed)" "EXPECT_EQ(names, (std::vector{""case.inp"", ""displacements.csv"", ""results.h5""})) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp support@1-476 helper/oracle/fixture/include/static assertion 구간: Hdf5Handle, if, RequireId, RequireHdf, MakeUtf8StringType, WriteStringAttribute, WriteUint64Attribute, CreateGroup, ComparisonValueRow, DefaultRows, Hdf5Options, NodeWriteRow, ElementWriteRow, WriteNodes, for, WriteElements, WriteDisplacement, WriteCsv, ContractFixture, ReferenceCase, ExpectFailureCode, FindRow, find_if, FindMetric, ReadBytes tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 37402c89c01cf3d2cc2e8ab77859308b01ab38311dacae197ad4bc1c5b5ab9f9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp support@509-510 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0395266b04005731c3a8af3c854de2e8675b475916ea8b790258cd372ba59d80 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp support@591-592 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bbe05c4478ba04dae1068ff83f56d7e512486c768824cd8b6645449c28f0076c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp support@638-639 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ee84c2fb6946961d9421c461d0c0de38916103a6aa11929f0b95ecb0bae198a2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp support@706-707 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 54b3ad86c7b60c18d9bd032f8ba2e7e827c96c6da35e0194fb82dc04afcbae8e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp support@755-756 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b1f4e55b34b476926e1cf7fe2ada3941a66cdc5cd6e79bd7e94ad257167f6dcc 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/mitc4_reference_comparison_test.cpp support@772-773 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/reference/nonlinear_static_reference_cases_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269 d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsEveryDeclaredArtifactBeforeExecution NonlinearStaticReference.AuditsEveryDeclaredArtifactBeforeExecution; assertion 8개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsEveryDeclaredArtifactBeforeExecution 유지 원문 검사 body 및 assertion 동일. 188bdb8763fbe96d17021a85b71a95d57a69789bc2d7a07ca0d86dbceb1d6c70 188bdb8763fbe96d17021a85b71a95d57a69789bc2d7a07ca0d86dbceb1d6c70 "ASSERT_TRUE(nonlinear_artifacts.HasValue()) | ASSERT_EQ(nonlinear_artifacts.Value().size(), 4U) | EXPECT_EQ(nonlinear_artifacts.Value()[0U].sha256, ""4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2"") | EXPECT_EQ(nonlinear_artifacts.Value()[3U].sha256, ""5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F"") | ASSERT_TRUE(linear_artifacts.HasValue()) | ASSERT_EQ(linear_artifacts.Value().size(), 4U) | EXPECT_EQ(linear_artifacts.Value()[0U].sha256, ""4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"") | EXPECT_EQ(linear_artifacts.Value()[3U].sha256, ""2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7"")" "ASSERT_TRUE(nonlinear_artifacts.HasValue()) | ASSERT_EQ(nonlinear_artifacts.Value().size(), 4U) | EXPECT_EQ(nonlinear_artifacts.Value()[0U].sha256, ""4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2"") | EXPECT_EQ(nonlinear_artifacts.Value()[3U].sha256, ""5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F"") | ASSERT_TRUE(linear_artifacts.HasValue()) | ASSERT_EQ(linear_artifacts.Value().size(), 4U) | EXPECT_EQ(linear_artifacts.Value()[0U].sha256, ""4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"") | EXPECT_EQ(linear_artifacts.Value()[3U].sha256, ""2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory; assertion 16개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory 유지 원문 검사 body 및 assertion 동일. 2eede76606712cf98bc621846084840a3172005b4d3d556415eeb01cef3e286a 2eede76606712cf98bc621846084840a3172005b4d3d556415eeb01cef3e286a "ASSERT_TRUE(before.HasValue()) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | EXPECT_EQ(ReadBytes(copied.Value()), ReadBytes(reference_case.original_input_path)) | ASSERT_TRUE(generated.HasValue()) | EXPECT_EQ(generated.Value().copied_input_path, copied.Value()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | EXPECT_TRUE( std::filesystem::is_regular_file(generated.Value().generated_log_path)) | EXPECT_EQ(generated.Value().generated_results_hdf5.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_results.h5"" : ""shell_results.h5"") | EXPECT_EQ( generated.Value().generated_log_path.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_log.txt"" : ""shell_log.txt"") | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().blocking_passed) | EXPECT_EQ(comparison.Value().copied_input_path, copied.Value()) | EXPECT_EQ(comparison.Value().generated_log_path, generated.Value().generated_log_path) | EXPECT_EQ(FindFamily(comparison.Value(), ""RM3""), nullptr) | ASSERT_TRUE(after.HasValue())" "ASSERT_TRUE(before.HasValue()) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | EXPECT_EQ(ReadBytes(copied.Value()), ReadBytes(reference_case.original_input_path)) | ASSERT_TRUE(generated.HasValue()) | EXPECT_EQ(generated.Value().copied_input_path, copied.Value()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | EXPECT_TRUE( std::filesystem::is_regular_file(generated.Value().generated_log_path)) | EXPECT_EQ(generated.Value().generated_results_hdf5.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_results.h5"" : ""shell_results.h5"") | EXPECT_EQ( generated.Value().generated_log_path.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_log.txt"" : ""shell_log.txt"") | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().blocking_passed) | EXPECT_EQ(comparison.Value().copied_input_path, copied.Value()) | EXPECT_EQ(comparison.Value().generated_log_path, generated.Value().generated_log_path) | EXPECT_EQ(FindFamily(comparison.Value(), ""RM3""), nullptr) | ASSERT_TRUE(after.HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsInvalidHdf5BeforeToleranceAndKeepsWarningOnlyClassification NonlinearStaticReference.RejectsInvalidHdf5BeforeToleranceAndKeepsWarningOnlyClassification; assertion 4개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsInvalidHdf5BeforeToleranceAndKeepsWarningOnlyClassification 유지 원문 검사 body 및 assertion 동일. c212189f32ba963e3f1464a12d8527079d439ef8c08cf77fa6186ab4c701cf1d c212189f32ba963e3f1464a12d8527079d439ef8c08cf77fa6186ab4c701cf1d ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_FALSE( fesa::test::CompareHdf5ToReferenceCsv(reference_case, invalid_hdf5) .HasValue()) | EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_FALSE( fesa::test::CompareHdf5ToReferenceCsv(reference_case, invalid_hdf5) .HasValue()) | EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsRetainedStaticArtifacts NonlinearStaticReference.AuditsRetainedStaticArtifacts; assertion 7개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsRetainedStaticArtifacts 유지 원문 검사 body 및 assertion 동일. d8455237b6913bfc17eb366ce869732b1034a695dbc6da8104f52942fa5fa6fb d8455237b6913bfc17eb366ce869732b1034a695dbc6da8104f52942fa5fa6fb ASSERT_TRUE(before.HasValue()) | ASSERT_EQ(before.Value().size(), 4U) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | ASSERT_TRUE(after.HasValue()) ASSERT_TRUE(before.HasValue()) | ASSERT_EQ(before.Value().size(), 4U) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | ASSERT_TRUE(after.HasValue()) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict; assertion 4개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict 유지 원문 검사 body 및 assertion 동일. 65b04d41c62639181a36905c13090411b957dc30b224c524136459e7b051deb4 65b04d41c62639181a36905c13090411b957dc30b224c524136459e7b051deb4 ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().external_blocking_passed) ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().external_blocking_passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual; assertion 7개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual 유지 원문 검사 body 및 assertion 동일. 007fcebce090b5bf09d568e58cd17470b556ad70894f09e2dc2703f4cec41e51 007fcebce090b5bf09d568e58cd17470b556ad70894f09e2dc2703f4cec41e51 ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | ASSERT_NE(found, comparison.Value().internal_equilibrium.end()) | EXPECT_TRUE(found->passed) | EXPECT_TRUE(comparison.Value().internal_blocking_passed) | EXPECT_NE(comparison.Value().constrained_reaction_resultant.force, zero_resultant) ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | ASSERT_NE(found, comparison.Value().internal_equilibrium.end()) | EXPECT_TRUE(found->passed) | EXPECT_TRUE(comparison.Value().internal_blocking_passed) | EXPECT_NE(comparison.Value().constrained_reaction_resultant.force, zero_resultant) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings; assertion 3개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings 유지 원문 검사 body 및 assertion 동일. f98dddaed34ee9b825986ce96db9d50e870ce4a58ceaa9e262995c448f58d601 f98dddaed34ee9b825986ce96db9d50e870ce4a58ceaa9e262995c448f58d601 "EXPECT_EQ(fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kFailed) | EXPECT_EQ(report.precheck_findings[1U].diagnostic_code, ""duplicate-row"") | EXPECT_EQ(report.precheck_findings[2U].diagnostic_code, ""nonfinite-row"")" "EXPECT_EQ(fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kFailed) | EXPECT_EQ(report.precheck_findings[1U].diagnostic_code, ""duplicate-row"") | EXPECT_EQ(report.precheck_findings[2U].diagnostic_code, ""nonfinite-row"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate; assertion 9개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate 유지 원문 검사 body 및 assertion 동일. 37b6f0097c7fdc4525f9c98325a913cc1c66be9a852f7ec7ea8d6dbe8e973336 37b6f0097c7fdc4525f9c98325a913cc1c66be9a852f7ec7ea8d6dbe8e973336 EXPECT_TRUE(below.passed) | ASSERT_TRUE(below.normalized_metric.has_value()) | EXPECT_EQ(*below.normalized_metric, 5.0e-9) | EXPECT_TRUE(boundary.passed) | ASSERT_TRUE(boundary.normalized_metric.has_value()) | EXPECT_EQ(*boundary.normalized_metric, 1.0e-8) | EXPECT_FALSE(above.passed) | ASSERT_TRUE(above.normalized_metric.has_value()) | EXPECT_GT(*above.normalized_metric, 1.0e-8) EXPECT_TRUE(below.passed) | ASSERT_TRUE(below.normalized_metric.has_value()) | EXPECT_EQ(*below.normalized_metric, 5.0e-9) | EXPECT_TRUE(boundary.passed) | ASSERT_TRUE(boundary.normalized_metric.has_value()) | EXPECT_EQ(*boundary.normalized_metric, 1.0e-8) | EXPECT_FALSE(above.passed) | ASSERT_TRUE(above.normalized_metric.has_value()) | EXPECT_GT(*above.normalized_metric, 1.0e-8) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance; assertion 6개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance 유지 원문 검사 body 및 assertion 동일. 04cc9d2dc3f468c5abd9317787db0c7dea8bb935021cf0bc51375c2e8a90d1bc 04cc9d2dc3f468c5abd9317787db0c7dea8bb935021cf0bc51375c2e8a90d1bc EXPECT_TRUE(exact_zero.passed) | EXPECT_EQ(exact_zero.scale, 0.0) | EXPECT_FALSE(exact_zero.normalized_metric.has_value()) | EXPECT_FALSE(nonzero.passed) | EXPECT_EQ(nonzero.scale, 0.0) | EXPECT_FALSE(nonzero.normalized_metric.has_value()) EXPECT_TRUE(exact_zero.passed) | EXPECT_EQ(exact_zero.scale, 0.0) | EXPECT_FALSE(exact_zero.normalized_metric.has_value()) | EXPECT_FALSE(nonzero.passed) | EXPECT_EQ(nonzero.scale, 0.0) | EXPECT_FALSE(nonzero.normalized_metric.has_value()) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@1-113 helper/oracle/fixture/include/static assertion 구간: ReadBytes, if, MakeCase, ExpectSnapshotsEqual, FindFamily, find_if, ExpectFamily, ExpectBlockingFamiliesPassed, for, ExpectInternalFamiliesPassed tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 287a99d8f479a4d4ed54bfe04a80c303dd3ef8d3b6dd67665ce65ec0404d6d3b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@134-135 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 90e14ecb07fccdcf231e83a52c8f744d9319ba16ae7f04c27256c406a6429dac 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@202-203 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 87ef91571b7fcd7d7161bb8b385c8e0bfdc90da3dc29f8a77c0e4592e5be6f83 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@246-247 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 75ed650921b2a719d01db3b9a8699b87ebb403589335c0dab3766f91a93dd189 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@273-274 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3989248f6a5e57cdd68d8ef2bf85830b385196f16f2e293b504208192705563c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@295-296 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f580803fc945d7c5cc37b9dcda1e262d1c4026b9a5b6544073525786b07f48be 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@338-339 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a7955cbfd2f91685d3d922391e61a1c415c6daed4cf7b2eddc4407e3fe715bc0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@366-367 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3e9b6724351d2c4044c018875a3878cef2b85ee06c40f3ad50c76fe5acc6c8fb 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_cases_test.cpp support@393-394 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d365ebad227c3cdf28bfb737c8976d06bc3484e90b5556e13a91605a5367aabe 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/nonlinear_static_reference_comparison.cpp file 이관 SpatialMoment helper는 production inverse API 제거에 따라 독립 closed-form oracle로 이관한다. 비교 family·global balance·RF/RM review-only·finite 사전 gate는 유지한다. e71f156cb5bede1369b6b2e0999d21c5e89e8af5516f74ced906811a3eca55f5 64d9fa7d7067830bedd7316e66d68c32839c7e701fa8f6a49421cbbcce3938a2 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_comparison.cpp support@1-1722 helper/oracle/fixture/include/static assertion 구간: fesa, CaseContract, ContractFor, if, ComparisonFailure, Fail, FailureStatus, Normalized, IsDescendantOf, GenericPath, Trim, find_if_not, UppercaseAscii, transform, ReadBytes, RotateRight, Sha256, for, while, Fnv1a64, DeclaredArtifact, DeclaredArtifacts, Snapshot, SplitCsv, ParsePositiveLabel, ParseFiniteDouble, CsvWideRow, ReadCsvWideRows, Hdf5Handle, Hdf5ErrorSilencer, Hdf5VlenReclaimer, Reclaim, RequireId, RequireHdf, OpenDataset, Dimensions, MakeUtf8StringType, ReadStringAttribute, ReadUint64Attribute, RequireStringAttribute, NodeReadRow, Hdf5Node, ReadNodes, AcceptedFrameReadRow, ReadFactorOneFrame, ReadNodalDataset, ReadConstraintMask, Hdf5Projection, CopiedInputPathFor, ReadGlobalBalance, ReadNonlinearHdf5, RequireExactNodeLabels, RequirePressureInstance, Key, IsSelected, ProjectCsv, ProjectHdf5, EvaluateFamily, AppendFamily, ExpectedConstrainedLabels, RequiredConstrainedLabels, VectorAt, SpatialMoment, MaskedResidual, InfinityNorm, FreeRowCount, AppendInternal, AppendFreeResidual, AppendGlobalBalance, AppendInternalEquilibrium, DerivedLogPath, DerivedResultsPath, MakeReport, CompareLinearCase, CompareNonlinearCase, ComparePressureCase, NonlinearInternalEquilibriumReport, EvaluateGlobalBalance, ArtifactCheck, catch, CopyInputToExecutionDirectory, RunFesaApplicationOnCopiedInput, CompareHdf5ToReferenceCsv, ClassifyReferenceComparison, any_of, BuildReferenceComparisonReport tests/reference/nonlinear_static_reference_comparison.cpp file-support 이관 SpatialMoment helper는 production inverse API 제거에 따라 독립 closed-form oracle로 이관한다. 비교 family·global balance·RF/RM review-only·finite 사전 gate는 유지한다. 8d82015808ca837c0f643c5999afb602674fcf02f51c7f60ac8c0347bddee582 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/nonlinear_static_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be 6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/nonlinear_static_reference_comparison.h support@1-143 helper/oracle/fixture/include/static assertion 구간: fesa, NonlinearReferenceArtifactDisposition, NonlinearReferenceCase, ArtifactSnapshot, NonlinearReferenceDisposition, NonlinearReferenceRowKey, NonlinearReferenceFamilyReport, NonlinearReferencePrecheckFinding, NonlinearInternalEquilibriumReport, ConstrainedReactionResultantReport, GeneratedRunArtifacts, NonlinearReferenceComparisonReport, NonlinearReferenceClassification tests/reference/nonlinear_static_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e61520b0bf03ec971e428abd42887d86bd74ee157eb174f0da25be3ca00d20ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602 9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison.cpp support@1-1519 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonFailure, Fail, ComparisonFailureStatus, Trim, find_if_not, CollapseWhitespace, for, if, AsciiLower, transform, SplitCsvLine, while, ParsePositiveLabel, ParseFiniteDouble, WideReferenceRow, ReferenceTable, SectionReferenceRow, SectionReferenceTable, ReadReferenceCsv, find_if, ReadSectionReferenceCsv, RequireExactArtifactInventory, increment, ReadApprovedDomain, Hdf5Handle, Hdf5ErrorSilencer, Hdf5VlenReclaimer, RequireId, RequireHdf, OpenDataset, DatasetDimensions, ReadStringAttribute, ReadUint64Attribute, RequireStringAttribute, RequireResultAttributes, ReadDoubleDataset, RequireCompoundMembers, MakeVariableStringType, NodeMemoryRow, ElementMemoryRow, HdfNode, HdfElement, ReadNodeRows, ReadElementRows, RequireFiniteStress, StressValue, ExpectedLocalAxes, HdfProjection, ReadHdfProjection, OrderedRows, OrderedSectionRows, CanonicalRow, AppendNodalRows, AppendSectionRows, BranchName, switch, EvaluateFamily, MakePhysicsEvidence, QuantityName, WriteJsonString, WriteCanonicalRow, WriteArray, WriteStrings, FiniteReport, all_of, Result, Compare, catch, WriteDeterministicJson tests/reference/reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4f6eadb9f7705f35da852e0f4cf63f1af16a1f951faf90b6895841a4a7b12380 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0 1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison.h support@1-102 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonQuantity, CanonicalComparisonRow, RowDecision, ComponentMetrics, PhysicsEvidence, ComparisonReport, ReferenceComparison tests/reference/reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1f39624e67c37926b656243337baed8a87b43b96547388e0d41dd6a25db0e37e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/reference/reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2dca374a67a3c55239c2402d4cd9541444283ec49ffb685037f90dad09c0e82f e39732a6cb8747725a43f7fc6341fd4688d04cd3f9f936ec33cbc79b232886af 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows; assertion 7개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows 유지 원문 검사 body 및 assertion 동일. 810238882b3a881527ffba11344288d641d606f3538f88d2f5e55adba4409905 810238882b3a881527ffba11344288d641d606f3538f88d2f5e55adba4409905 ASSERT_TRUE(std::filesystem::remove(fixture.Legacy() / kDisplacementName)) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_GT(lines.size(), 2U) ASSERT_TRUE(std::filesystem::remove(fixture.Legacy() / kDisplacementName)) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_GT(lines.size(), 2U) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate; assertion 28개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate 유지 원문 검사 body 및 assertion 동일. f6ca0c5aae73df95b70d24611a1948a63e24dc842bc9da29f03f7182f05ad9fd f6ca0c5aae73df95b70d24611a1948a63e24dc842bc9da29f03f7182f05ad9fd "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | EXPECT_EQ(report.rows.size(), kExpectedRowCount) | EXPECT_EQ(report.metrics.size(), kExpectedMetricCount) | ASSERT_NE(zero, nullptr) | ASSERT_NE(near_zero, nullptr) | ASSERT_NE(deliberate_failure, nullptr) | EXPECT_DOUBLE_EQ(zero->reference.value, 0.0) | EXPECT_DOUBLE_EQ(zero->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(zero->tolerance, near_zero_band) | EXPECT_TRUE(zero->passed) | EXPECT_TRUE(near_zero->passed) | EXPECT_FALSE(deliberate_failure->passed) | EXPECT_EQ(near_zero->tolerance_branch, ""near-zero"") | EXPECT_FALSE(near_zero->relative_error_applicable) | ASSERT_NE(my_metric, nullptr) | EXPECT_DOUBLE_EQ(my_metric->reference_scale, 1.0e7) | EXPECT_EQ(my_metric->components, (std::vector{""T"", ""My"", ""Mz""})) | ASSERT_NE(scaled, nullptr) | ASSERT_NE(residue, nullptr) | EXPECT_DOUBLE_EQ(scaled->tolerance, 5.0e5) | EXPECT_DOUBLE_EQ(scaled->absolute_error, 4.999e5) | EXPECT_TRUE(scaled->passed) | EXPECT_DOUBLE_EQ(residue->reference.value, -1.5625e-2) | EXPECT_DOUBLE_EQ(residue->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(residue->absolute_error, 1.5625e-2) | EXPECT_DOUBLE_EQ(residue->tolerance, 1.0e5) | EXPECT_TRUE(residue->passed)" "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | EXPECT_EQ(report.rows.size(), kExpectedRowCount) | EXPECT_EQ(report.metrics.size(), kExpectedMetricCount) | ASSERT_NE(zero, nullptr) | ASSERT_NE(near_zero, nullptr) | ASSERT_NE(deliberate_failure, nullptr) | EXPECT_DOUBLE_EQ(zero->reference.value, 0.0) | EXPECT_DOUBLE_EQ(zero->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(zero->tolerance, near_zero_band) | EXPECT_TRUE(zero->passed) | EXPECT_TRUE(near_zero->passed) | EXPECT_FALSE(deliberate_failure->passed) | EXPECT_EQ(near_zero->tolerance_branch, ""near-zero"") | EXPECT_FALSE(near_zero->relative_error_applicable) | ASSERT_NE(my_metric, nullptr) | EXPECT_DOUBLE_EQ(my_metric->reference_scale, 1.0e7) | EXPECT_EQ(my_metric->components, (std::vector{""T"", ""My"", ""Mz""})) | ASSERT_NE(scaled, nullptr) | ASSERT_NE(residue, nullptr) | EXPECT_DOUBLE_EQ(scaled->tolerance, 5.0e5) | EXPECT_DOUBLE_EQ(scaled->absolute_error, 4.999e5) | EXPECT_TRUE(scaled->passed) | EXPECT_DOUBLE_EQ(residue->reference.value, -1.5625e-2) | EXPECT_DOUBLE_EQ(residue->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(residue->absolute_error, 1.5625e-2) | EXPECT_DOUBLE_EQ(residue->tolerance, 1.0e5) | EXPECT_TRUE(residue->passed)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically; assertion 24개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically 유지 원문 검사 body 및 assertion 동일. 3aeb231f836acf51af5432b7c06df1e786278ff6fceeb3a53d50a9377653df3c 3aeb231f836acf51af5432b7c06df1e786278ff6fceeb3a53d50a9377653df3c "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed; })) | ASSERT_NE(metric, nullptr) | ASSERT_NE(worst, nullptr) | EXPECT_EQ(metric->row_count, kNodeCount * 3U) | EXPECT_DOUBLE_EQ(metric->reference_scale, 1.90476272e-2) | EXPECT_DOUBLE_EQ(metric->maximum_absolute_error, 1.0e-9) | EXPECT_NEAR(metric->relative_rms, std::sqrt(1.25 / static_cast(kNodeCount * 3U)) * 1.0e-9 / metric->reference_scale, 1.0e-21) | EXPECT_EQ(metric->worst_row, static_cast(worst - report.rows.data())) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_DOUBLE_EQ(report.physics_evidence.free_residual_norm, 0.0) | EXPECT_EQ(report.physics_evidence.applied_force, (std::array{0.0, 0.0, -1.0e6})) | EXPECT_EQ(report.physics_evidence.reaction_force, (std::array{0.0, 0.0, 1.0e6})) | EXPECT_EQ(report.physics_evidence.applied_moment_about_origin, (std::array{0.0, 1.0e7, 0.0})) | EXPECT_EQ(report.physics_evidence.reaction_moment_about_origin, (std::array{0.0, -1.0e7, 0.0})) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_a) .IsOk()) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(required), std::string::npos)" "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed; })) | ASSERT_NE(metric, nullptr) | ASSERT_NE(worst, nullptr) | EXPECT_EQ(metric->row_count, kNodeCount * 3U) | EXPECT_DOUBLE_EQ(metric->reference_scale, 1.90476272e-2) | EXPECT_DOUBLE_EQ(metric->maximum_absolute_error, 1.0e-9) | EXPECT_NEAR(metric->relative_rms, std::sqrt(1.25 / static_cast(kNodeCount * 3U)) * 1.0e-9 / metric->reference_scale, 1.0e-21) | EXPECT_EQ(metric->worst_row, static_cast(worst - report.rows.data())) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_DOUBLE_EQ(report.physics_evidence.free_residual_norm, 0.0) | EXPECT_EQ(report.physics_evidence.applied_force, (std::array{0.0, 0.0, -1.0e6})) | EXPECT_EQ(report.physics_evidence.reaction_force, (std::array{0.0, 0.0, 1.0e6})) | EXPECT_EQ(report.physics_evidence.applied_moment_about_origin, (std::array{0.0, 1.0e7, 0.0})) | EXPECT_EQ(report.physics_evidence.reaction_moment_about_origin, (std::array{0.0, -1.0e7, 0.0})) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_a) .IsOk()) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(required), std::string::npos)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization; assertion 10개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization 유지 원문 검사 body 및 assertion 동일. 35b078826866908199d78ce70bc394087ad8ad257cc7db971e29412a67ab19d2 35b078826866908199d78ce70bc394087ad8ad257cc7db971e29412a67ab19d2 ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_NE(interior, nullptr) | EXPECT_DOUBLE_EQ(interior->fesa.value, 9.0e6 - 5.0) | EXPECT_DOUBLE_EQ(interior->reference.value, 9.0e6) | EXPECT_DOUBLE_EQ(interior->absolute_error, 5.0) | ASSERT_NE(adjacent, nullptr) | EXPECT_DOUBLE_EQ(adjacent->fesa.value, 9.0e6) | EXPECT_DOUBLE_EQ(adjacent->reference.value, 9.0e6) ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_NE(interior, nullptr) | EXPECT_DOUBLE_EQ(interior->fesa.value, 9.0e6 - 5.0) | EXPECT_DOUBLE_EQ(interior->reference.value, 9.0e6) | EXPECT_DOUBLE_EQ(interior->absolute_error, 5.0) | ASSERT_NE(adjacent, nullptr) | EXPECT_DOUBLE_EQ(adjacent->fesa.value, 9.0e6) | EXPECT_DOUBLE_EQ(adjacent->reference.value, 9.0e6) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant; assertion 15개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant 유지 원문 검사 body 및 assertion 동일. cb0ba7caae79f4c0d6d33c2fe7d29658710974c27d49edc9d208987cd21dcb73 cb0ba7caae79f4c0d6d33c2fe7d29658710974c27d49edc9d208987cd21dcb73 ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_NE(n, nullptr) | ASSERT_NE(t, nullptr) | ASSERT_NE(my, nullptr) | ASSERT_NE(mz, nullptr) | EXPECT_DOUBLE_EQ(n->reference.value, 11.0) | EXPECT_DOUBLE_EQ(t->reference.value, 22.0) | EXPECT_DOUBLE_EQ(my->reference.value, 33.0) | EXPECT_DOUBLE_EQ(mz->reference.value, 44.0) | EXPECT_DOUBLE_EQ(n->fesa.value, 11.0) | EXPECT_DOUBLE_EQ(t->fesa.value, 22.0) | EXPECT_DOUBLE_EQ(my->fesa.value, 33.0) | EXPECT_DOUBLE_EQ(mz->fesa.value, 44.0) ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_NE(n, nullptr) | ASSERT_NE(t, nullptr) | ASSERT_NE(my, nullptr) | ASSERT_NE(mz, nullptr) | EXPECT_DOUBLE_EQ(n->reference.value, 11.0) | EXPECT_DOUBLE_EQ(t->reference.value, 22.0) | EXPECT_DOUBLE_EQ(my->reference.value, 33.0) | EXPECT_DOUBLE_EQ(mz->reference.value, 44.0) | EXPECT_DOUBLE_EQ(n->fesa.value, 11.0) | EXPECT_DOUBLE_EQ(t->fesa.value, 22.0) | EXPECT_DOUBLE_EQ(my->fesa.value, 33.0) | EXPECT_DOUBLE_EQ(mz->fesa.value, 44.0) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_comparison_test.cpp support@1-424 helper/oracle/fixture/include/static assertion 구간: ComparisonValues, SourceRoot, BinaryRoot, ReadBytes, if, WriteBytes, ReadLines, WriteLines, for, ReplaceFirst, ReferenceValues, MakeDefinition, WriteResultsFixture, ContractFixture, ExpectFailureCode, FindRow, find_if, FindMetric, FindSectionRow, ExpectExactRowInventory tests/reference/reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 26a9f2cdd31fc7384d94d10efdfe1ab22d82b8c620ee16874094069b4671958b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_tolerance_policy.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy.cpp support@1-138 helper/oracle/fixture/include/static assertion 구간: fesa, IsFiniteFamily, if, all_of, EvaluateFamilies, for, ReferenceToleranceEvaluation, Evaluate, EvaluateMitc4EigenFirstImplementation tests/reference/reference_tolerance_policy.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 27b71db22073ee923ba13a8c32bff7ea14ab488d80c2ceefb7767747b68d52f0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_tolerance_policy.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24 9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy.h support@1-80 helper/oracle/fixture/include/static assertion 구간: fesa, ReferenceToleranceBranch, ReferenceToleranceRow, ReferenceToleranceFamily, ReferenceToleranceRowDecision, ReferenceToleranceFamilyDecision, ReferenceToleranceEvaluation, ReferenceTolerancePolicy tests/reference/reference_tolerance_policy.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. de2c46296fb2b5947a46c739ae21ad66802622b97ee4845543d3cd2a50ba03ac 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/reference/reference_tolerance_policy_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries; assertion 19개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries 유지 원문 검사 body 및 assertion 동일. 0796acda78954b1bf9b52659b043f23a0435245c7198961ebd96d84b241c9265 0796acda78954b1bf9b52659b043f23a0435245c7198961ebd96d84b241c9265 ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 1U) | EXPECT_EQ(family.row_count, 4U) | EXPECT_DOUBLE_EQ(family.reference_scale, 100.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 1.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_FALSE(family.passed) | ASSERT_EQ(family.rows.size(), 4U) | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kRelative) | EXPECT_TRUE(family.rows[0U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[0U].relative_error, 0.05) | EXPECT_DOUBLE_EQ(family.rows[0U].threshold, 5.0) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_EQ(family.rows[2U].branch, ReferenceToleranceBranch::kNearZero) | EXPECT_FALSE(family.rows[2U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[2U].threshold, 1.0) | EXPECT_TRUE(family.rows[2U].passed) | EXPECT_FALSE(family.rows[3U].passed) ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 1U) | EXPECT_EQ(family.row_count, 4U) | EXPECT_DOUBLE_EQ(family.reference_scale, 100.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 1.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_FALSE(family.passed) | ASSERT_EQ(family.rows.size(), 4U) | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kRelative) | EXPECT_TRUE(family.rows[0U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[0U].relative_error, 0.05) | EXPECT_DOUBLE_EQ(family.rows[0U].threshold, 5.0) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_EQ(family.rows[2U].branch, ReferenceToleranceBranch::kNearZero) | EXPECT_FALSE(family.rows[2U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[2U].threshold, 1.0) | EXPECT_TRUE(family.rows[2U].passed) | EXPECT_FALSE(family.rows[3U].passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent; assertion 7개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent 유지 원문 검사 body 및 assertion 동일. c92918fb5b5c06da814ac1213a2b80b8af1ffd52bd0f11339468ab1ff87eed5f c92918fb5b5c06da814ac1213a2b80b8af1ffd52bd0f11339468ab1ff87eed5f ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 4U) | EXPECT_TRUE(std::all_of(family.rows.begin(), family.rows.end(), [](const auto& row) { return row.passed; })) | EXPECT_NEAR(family.relative_rms, 0.011, 1.0e-15) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed) | EXPECT_FALSE(evaluation.passed) ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 4U) | EXPECT_TRUE(std::all_of(family.rows.begin(), family.rows.end(), [](const auto& row) { return row.passed; })) | EXPECT_NEAR(family.relative_rms, 0.011, 1.0e-15) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed) | EXPECT_FALSE(evaluation.passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics; assertion 14개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics 유지 원문 검사 body 및 assertion 동일. 38ca8bda67fdaa127b1694bc937e3ca56f701ea313ab767da299fc747b33c7de 38ca8bda67fdaa127b1694bc937e3ca56f701ea313ab767da299fc747b33c7de "ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 2U) | EXPECT_DOUBLE_EQ(family.reference_scale, 0.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 0.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_EQ(family.diagnostic_code, ""zero-reference-scale-nonzero-error"") | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kZeroScaleExact) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_FALSE(family.rows[1U].relative_error_applicable) | EXPECT_TRUE(std::isfinite(family.relative_rms)) | EXPECT_DOUBLE_EQ(family.relative_rms, 0.0) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed)" "ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 2U) | EXPECT_DOUBLE_EQ(family.reference_scale, 0.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 0.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_EQ(family.diagnostic_code, ""zero-reference-scale-nonzero-error"") | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kZeroScaleExact) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_FALSE(family.rows[1U].relative_error_applicable) | EXPECT_TRUE(std::isfinite(family.relative_rms)) | EXPECT_DOUBLE_EQ(family.relative_rms, 0.0) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict; assertion 5개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict 유지 원문 검사 body 및 assertion 동일. ea07bf7d6def7cbd89bc911f979f710846ad558b1711613f3abcc97e14be0b8a ea07bf7d6def7cbd89bc911f979f710846ad558b1711613f3abcc97e14be0b8a ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 2U) | EXPECT_TRUE(evaluation.families[0U].passed) | EXPECT_FALSE(evaluation.families[1U].passed) | EXPECT_TRUE(evaluation.passed) ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 2U) | EXPECT_TRUE(evaluation.families[0U].passed) | EXPECT_FALSE(evaluation.families[1U].passed) | EXPECT_TRUE(evaluation.passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation; assertion 3개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation 유지 원문 검사 body 및 assertion 동일. 42628fe515d6debce07e8553911bb1a6b74e316265a0702267056258db827b45 42628fe515d6debce07e8553911bb1a6b74e316265a0702267056258db827b45 "EXPECT_FALSE(evaluation.valid) | EXPECT_EQ(evaluation.diagnostic_code, ""nonfinite-comparison-value"") | EXPECT_TRUE(evaluation.families.empty())" "EXPECT_FALSE(evaluation.valid) | EXPECT_EQ(evaluation.diagnostic_code, ""nonfinite-comparison-value"") | EXPECT_TRUE(evaluation.families.empty())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationDoesNotRelaxCommonPolicy ReferenceTolerancePolicy.EigenFirstImplementationDoesNotRelaxCommonPolicy; assertion 6개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationDoesNotRelaxCommonPolicy 유지 원문 검사 body 및 assertion 동일. d4090ddd26b57509606e7f1dfdbfd22996f95d19c5d761d6368b6c07a467aca2 d4090ddd26b57509606e7f1dfdbfd22996f95d19c5d761d6368b6c07a467aca2 ASSERT_TRUE(common.valid) | ASSERT_TRUE(eigen.valid) | EXPECT_FALSE(common.passed) | EXPECT_TRUE(eigen.passed) | EXPECT_DOUBLE_EQ(eigen.families[0].relative_rms, 0.05) | EXPECT_DOUBLE_EQ(common.families[0].relative_rms, eigen.families[0].relative_rms) ASSERT_TRUE(common.valid) | ASSERT_TRUE(eigen.valid) | EXPECT_FALSE(common.passed) | EXPECT_TRUE(eigen.passed) | EXPECT_DOUBLE_EQ(eigen.families[0].relative_rms, 0.05) | EXPECT_DOUBLE_EQ(common.families[0].relative_rms, eigen.families[0].relative_rms) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationPreservesZeroAndFiniteChecks ReferenceTolerancePolicy.EigenFirstImplementationPreservesZeroAndFiniteChecks; assertion 5개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationPreservesZeroAndFiniteChecks 유지 원문 검사 body 및 assertion 동일. 463cda2ec4b8c4b83cc64d2b655af56b24f310add1ee6bc486c3f319e6ad076a 463cda2ec4b8c4b83cc64d2b655af56b24f310add1ee6bc486c3f319e6ad076a "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | ASSERT_TRUE(result.valid) | EXPECT_EQ(result.passed, row.fesa_value == 0.0) | EXPECT_EQ(result.families[0].diagnostic_code, ""zero-reference-scale-nonzero-error"")" "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | ASSERT_TRUE(result.valid) | EXPECT_EQ(result.passed, row.fesa_value == 0.0) | EXPECT_EQ(result.families[0].diagnostic_code, ""zero-reference-scale-nonzero-error"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationRejectsNonmodalFamilies ReferenceTolerancePolicy.EigenFirstImplementationRejectsNonmodalFamilies; assertion 3개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationRejectsNonmodalFamilies 유지 원문 검사 body 및 assertion 동일. cacd7f2e9c5bdc6c907786187817305395ce12155fa51e4e10ce01d364df2741 cacd7f2e9c5bdc6c907786187817305395ce12155fa51e4e10ce01d364df2741 "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | EXPECT_EQ(result.diagnostic_code, ""invalid-eigen-tolerance-family"")" "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | EXPECT_EQ(result.diagnostic_code, ""invalid-eigen-tolerance-family"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp support@1-26 helper/oracle/fixture/include/static assertion 구간: MakeFamily tests/reference/reference_tolerance_policy_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9c2d3b770c78989b0bbe4bf618d87e318a4ddd8322aa0debfffe7cc932d3f028 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/reference_tolerance_policy_test.cpp support@172-173 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/reference_tolerance_policy_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 804f89fc0ec98c9824183e795d3edd19e930f7bc471f9012aa3d503be2f8974b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/shell_surface_pressure_reference_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/shell_surface_pressure_reference_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d 45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/shell_surface_pressure_reference_test.cpp ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly; assertion 1개 tests/reference/shell_surface_pressure_reference_test.cpp ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly 유지 원문 검사 body 및 assertion 동일. ed6f0cea1655c6b579fecd966c3c2b1b62812f1e69475b98610c093cd4229455 ed6f0cea1655c6b579fecd966c3c2b1b62812f1e69475b98610c093cd4229455 EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/shell_surface_pressure_reference_test.cpp support@1-12 helper/oracle/fixture/include/static assertion 구간: MakeTolerance tests/reference/shell_surface_pressure_reference_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8d9d1942187a363e8bc49004c4b7df1b110071843d5cdf55dccc741ee6066ea7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/shell_surface_pressure_reference_test.cpp support@31-32 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/shell_surface_pressure_reference_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/thermal_reference_cases_test.cpp file 이관 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 기존 diagnostic/nonblocking 판정은 유지한다. f796b0d84b1289f58caa791fe2c380e1b28b4322030ed505476f39c788f0db86 8b340c31cb028e1cf8e676f35869cb74d923c7e3f05d5ed8d3cc428722b4aed3 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_cases_test.cpp ThermalReference.OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic ThermalReference.OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic; assertion 16개 tests/reference/thermal_reference_cases_test.cpp ThermalReference.OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic 이관 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 기존 diagnostic/nonblocking 판정은 유지한다. 552d85894324a70ebef68ce1b260bc7310dc32cc8f2e91bd12749b9883ab0f1c 86884d662acf255866202f5682b4e95db4785ee4a0da1ae2e83fc410f36a4290 ASSERT_FALSE(before_input.empty()) | ASSERT_FALSE(before_csv.empty()) | EXPECT_EQ(Bytes(input), before_input) | EXPECT_EQ(Bytes(csv), before_csv) | ASSERT_EQ(exit, 0) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(r.rows.size(), 729U) | ASSERT_TRUE(rows.good()) | EXPECT_EQ(r.family.reference_scale, 1000) | EXPECT_EQ(r.family.near_zero_band, 10) | EXPECT_FALSE(r.family.blocking) | EXPECT_FALSE(r.passed) | EXPECT_FALSE(r.family.rms_passed) | EXPECT_EQ(failed, 87U) | EXPECT_GT(r.family.relative_rms, fesa::test::ReferenceTolerancePolicy::kRelativeRmsTolerance) | EXPECT_GT(r.family.maximum_absolute_error, r.family.near_zero_band) ASSERT_FALSE(before_input.empty()) | ASSERT_FALSE(before_csv.empty()) | EXPECT_EQ(Bytes(input), before_input) | EXPECT_EQ(Bytes(csv), before_csv) | ASSERT_EQ(exit, 0) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(r.rows.size(), 729U) | ASSERT_TRUE(rows.good()) | EXPECT_EQ(r.family.reference_scale, 1000) | EXPECT_EQ(r.family.near_zero_band, 10) | EXPECT_FALSE(r.family.blocking) | EXPECT_FALSE(r.passed) | EXPECT_FALSE(r.family.rms_passed) | EXPECT_EQ(failed, 87U) | EXPECT_GT(r.family.relative_rms, fesa::test::ReferenceTolerancePolicy::kRelativeRmsTolerance) | EXPECT_GT(r.family.maximum_absolute_error, r.family.near_zero_band) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/reference/thermal_reference_cases_test.cpp support@1-15 helper/oracle/fixture/include/static assertion 구간: Bytes tests/reference/thermal_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 기존 diagnostic/nonblocking 판정은 유지한다. d748735499aeda58e97d6652289f5ba2fb3a8b1143f03a04e6159b38f93dbf0b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_cases_test.cpp support@68-68 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/thermal_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 기존 diagnostic/nonblocking 판정은 유지한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/thermal_reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0 0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison.cpp support@1-417 helper/oracle/fixture/include/static assertion 구간: fesa, Failure, Require, H, Id, Shape, Attr, if, T, Scalar, Primitive, Field, Label, Trim, Result, CompareThermalSnapshots, for, catch, ReadThermalReferenceCsv, while, ReadThermalReferenceHdf5, NodeRow, Frame, CompareThermalReferenceFiles tests/reference/thermal_reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 56b6cc4aad9b0122c1a0d266048c889280113757493d372501e163005bab9e1f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/thermal_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0 c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison.h support@1-57 helper/oracle/fixture/include/static assertion 구간: fesa, ThermalReferenceRow, ThermalReferenceSnapshot, ThermalReferenceRowDecision, ThermalReferenceReport tests/reference/thermal_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c1ecc31681e11d2a2b9a7f64773dc821acd8b3678d77c6063044b481a7f2409d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/reference/thermal_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.HdfSchemaMappingRejectsMalformedStationFrameAndNodeData ThermalReferenceComparison.HdfSchemaMappingRejectsMalformedStationFrameAndNodeData; assertion 4개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.HdfSchemaMappingRejectsMalformedStationFrameAndNodeData 유지 원문 검사 body 및 assertion 동일. b5991ec2a055de6dd67134f1cbf7445a7cfe8618f7089e1fe9968a22b3df1aaa b5991ec2a055de6dd67134f1cbf7445a7cfe8618f7089e1fe9968a22b3df1aaa ASSERT_TRUE(read.HasValue()) | EXPECT_EQ(result.HasValue(), defect == 0) | EXPECT_TRUE(result.Value().passed) | EXPECT_FALSE(read.HasValue()) ASSERT_TRUE(read.HasValue()) | EXPECT_EQ(result.HasValue(), defect == 0) | EXPECT_TRUE(result.Value().passed) | EXPECT_FALSE(read.HasValue()) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.MapsSourceLabelsWithoutRowOrderAndPreservesSignedValues ThermalReferenceComparison.MapsSourceLabelsWithoutRowOrderAndPreservesSignedValues; assertion 9개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.MapsSourceLabelsWithoutRowOrderAndPreservesSignedValues 유지 원문 검사 body 및 assertion 동일. 9fbe3d06c90283b2e1b9473474b689354f9dbd1bd2eca8c120e10127bfc472b9 9fbe3d06c90283b2e1b9473474b689354f9dbd1bd2eca8c120e10127bfc472b9 ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed) | ASSERT_EQ(result.Value().rows.size(), 3U) | EXPECT_EQ(result.Value().rows[1].label, 7U) | EXPECT_EQ(result.Value().rows[1].reference, -15.5742216) | EXPECT_EQ(result.Value().rows[1].tolerance.branch, fesa::test::ReferenceToleranceBranch::kRelative) | EXPECT_EQ(result.Value().family.reference_scale, 1000) | EXPECT_EQ(result.Value().family.near_zero_band, 10) | EXPECT_FALSE(result.Value().family.blocking) ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed) | ASSERT_EQ(result.Value().rows.size(), 3U) | EXPECT_EQ(result.Value().rows[1].label, 7U) | EXPECT_EQ(result.Value().rows[1].reference, -15.5742216) | EXPECT_EQ(result.Value().rows[1].tolerance.branch, fesa::test::ReferenceToleranceBranch::kRelative) | EXPECT_EQ(result.Value().family.reference_scale, 1000) | EXPECT_EQ(result.Value().family.near_zero_band, 10) | EXPECT_FALSE(result.Value().family.blocking) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsMissingExtraDuplicateAndNonfiniteBeforeTolerance ThermalReferenceComparison.RejectsMissingExtraDuplicateAndNonfiniteBeforeTolerance; assertion 1개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsMissingExtraDuplicateAndNonfiniteBeforeTolerance 유지 원문 검사 body 및 assertion 동일. bb8b648993b9f4ae838901f9566db7ca32f22e6bdbd6018213d68e1ff48dfc46 bb8b648993b9f4ae838901f9566db7ca32f22e6bdbd6018213d68e1ff48dfc46 "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsWrongStepTimeIncrementInstanceAndStation ThermalReferenceComparison.RejectsWrongStepTimeIncrementInstanceAndStation; assertion 1개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsWrongStepTimeIncrementInstanceAndStation 유지 원문 검사 body 및 assertion 동일. e9b3d7890b38b8ac9d7124ef7b38cea8037bd5f2977145231c47928af3112462 e9b3d7890b38b8ac9d7124ef7b38cea8037bd5f2977145231c47928af3112462 "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.UsesUnmodifiedFivePercentOnePercentAndExactZeroPolicy ThermalReferenceComparison.UsesUnmodifiedFivePercentOnePercentAndExactZeroPolicy; assertion 5개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.UsesUnmodifiedFivePercentOnePercentAndExactZeroPolicy 유지 원문 검사 body 및 assertion 동일. 6fa4b28f03af7accaa46980c8de1e428a784bed83de862984ec5c1fed45ea9db 6fa4b28f03af7accaa46980c8de1e428a784bed83de862984ec5c1fed45ea9db ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | EXPECT_EQ(result.Value().family.reference_scale, 0) ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | EXPECT_EQ(result.Value().family.reference_scale, 0) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.CsvRequiresExactHeaderFrameFiniteValuesAndSoleInstance ThermalReferenceComparison.CsvRequiresExactHeaderFrameFiniteValuesAndSoleInstance; assertion 2개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.CsvRequiresExactHeaderFrameFiniteValuesAndSoleInstance 유지 원문 검사 body 및 assertion 동일. 6a725850decb91c07895b0f8e6513e95e866004b4885a6f9cd0959b79b3d05f8 6a725850decb91c07895b0f8e6513e95e866004b4885a6f9cd0959b79b3d05f8 "EXPECT_EQ(result.HasValue(), text == header + valid) | EXPECT_FALSE(fesa::test::ReadThermalReferenceCsv(path, """").HasValue())" "EXPECT_EQ(result.HasValue(), text == header + valid) | EXPECT_FALSE(fesa::test::ReadThermalReferenceCsv(path, """").HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp support@1-170 helper/oracle/fixture/include/static assertion 구간: TemporaryFolder, Handle, StringAttribute, T, ScalarAttribute, Dataset, comparator, Node, Frame tests/reference/thermal_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8fe742ff0a0ff661b374df3df48724fad479ad1702325197a6ff058cd08f3942 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp support@196-204 helper/oracle/fixture/include/static assertion 구간: Snapshot tests/reference/thermal_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 32bf1858c73c1cbf1f65ee1adc11e7230a993eb21b972a8b16916a5fe4eb2d21 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/reference/thermal_reference_comparison_test.cpp support@330-330 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/thermal_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Dev tests/test_cpp_policy_contract.py file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/test_cpp_policy_contract.py file 이관 Dev 정책과 Doxygen 선택성 검사를 유지한다. native 공통 property sheet와 다섯 consumer도 standard exception unwinding을 요구하도록 확장한다. 7f97a7758e483ca293caa39713202bd0c29097ce9983776c7b67c759a53513fc 48e7c3be9bfc735e239a5b023867fdd336e271fe44bcecb30cdebedc356a41c9 해당 없음 해당 없음 유지-정책계약 R-POLICY test-cleanup-review.md#r-policy +Dev tests/test_cpp_policy_contract.py read fixture/oracle/helper read tests/test_cpp_policy_contract.py read 유지 원문 검사 body 및 assertion 동일. 6850e04b82047b75e3cb9aaad4ff0ca00023108c96bdaeae20465eb8a0b1de51 6850e04b82047b75e3cb9aaad4ff0ca00023108c96bdaeae20465eb8a0b1de51 해당 없음 해당 없음 유지-정책계약 R-POLICY test-cleanup-review.md#r-policy +Dev tests/test_cpp_policy_contract.py doxygen_assignments fixture/oracle/helper doxygen_assignments tests/test_cpp_policy_contract.py doxygen_assignments 유지 원문 검사 body 및 assertion 동일. 109a90d7e1c2575992749ca28402bb0a2ebf9f35d2928a019c1de315108baa70 109a90d7e1c2575992749ca28402bb0a2ebf9f35d2928a019c1de315108baa70 해당 없음 해당 없음 유지-정책계약 R-POLICY test-cleanup-review.md#r-policy +Dev tests/test_cpp_policy_contract.py test_p_style_001_cpp_style_and_doxygen_tooling_contract test_p_style_001_cpp_style_and_doxygen_tooling_contract; assertion 0개 tests/test_cpp_policy_contract.py test_p_style_001_cpp_style_and_doxygen_tooling_contract 유지 원문 검사 body 및 assertion 동일. d9c1cca6221f3430bdf4d46bc51bbe14c3afe01a88948d1464ee406791e97524 d9c1cca6221f3430bdf4d46bc51bbe14c3afe01a88948d1464ee406791e97524 "assert not missing_paths, f""missing C++ policy files: {missing_paths}"" | assert setting in clang_format | assert setting in clang_tidy | assert doxyfile[""INPUT""].split() == [""include"", ""src""] | assert doxyfile[""EXCLUDE""].split() == [""tests""] | assert doxyfile[""WARN_AS_ERROR""] == ""YES"" | assert doxyfile[""OUTPUT_DIRECTORY""] == ""build/doxygen"" | assert doxyfile[""HTML_OUTPUT""] == ""html"" | assert ""build/"" in gitignore_lines | assert ""find_package(Doxygen QUIET)"" in cmake | assert doxygen_block is not None | assert ""add_custom_target(fesa_docs"" in doxygen_block.group(""body"") | assert ""Doxyfile"" in doxygen_block.group(""body"") | assert re.search(r""add_custom_target\(fesa_docs\s+ALL\b"", cmake) is None" "assert not missing_paths, f""missing C++ policy files: {missing_paths}"" | assert setting in clang_format | assert setting in clang_tidy | assert doxyfile[""INPUT""].split() == [""include"", ""src""] | assert doxyfile[""EXCLUDE""].split() == [""tests""] | assert doxyfile[""WARN_AS_ERROR""] == ""YES"" | assert doxyfile[""OUTPUT_DIRECTORY""] == ""build/doxygen"" | assert doxyfile[""HTML_OUTPUT""] == ""html"" | assert ""build/"" in gitignore_lines | assert ""find_package(Doxygen QUIET)"" in cmake | assert doxygen_block is not None | assert ""add_custom_target(fesa_docs"" in doxygen_block.group(""body"") | assert ""Doxyfile"" in doxygen_block.group(""body"") | assert re.search(r""add_custom_target\(fesa_docs\s+ALL\b"", cmake) is None" 유지-정책계약 R-POLICY test-cleanup-review.md#r-policy +Dev tests/test_cpp_policy_contract.py test_p_style_002_msvc_targets_enable_standard_exception_unwinding test_p_style_002_msvc_targets_enable_standard_exception_unwinding; assertion 0개 tests/test_cpp_policy_contract.py test_p_style_002_msvc_targets_enable_standard_exception_unwinding 이관 Dev 정책과 Doxygen 선택성 검사를 유지한다. native 공통 property sheet와 다섯 consumer도 standard exception unwinding을 요구하도록 확장한다. e01149ce11e343bcbf48355921b911803d9ea98bdd18c12d781e47dd7f56d853 f4b84302b1f5e2b2720c51c01f8a577b7f2716a19fb641b2d2c12d26cf5aa33e "assert compile_options is not None, f""missing compile options for {target}"" | assert ""/EHsc"" in compile_options.group(""body""), (" "assert compile_options is not None, f""missing compile options for {target}"" | assert ""/EHsc"" in compile_options.group(""body""), ( | assert props.findtext("".//m:ExceptionHandling"", namespaces=ns) == ""Sync"" | assert ""Fesa.Common.props"" in imports, target | assert all(item.text == ""Sync"" for item in overrides), target" 유지-정책계약 R-POLICY test-cleanup-review.md#r-policy +Dev tests/test_cpp_policy_contract.py support@1-7 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/test_cpp_policy_contract.py file-support 유지 Dev 정책과 Doxygen 선택성 검사를 유지한다. native 공통 property sheet와 다섯 consumer도 standard exception unwinding을 요구하도록 확장한다. cf93027038b44959a49c21bfaa3400d9cf59d302de2fff8fd023629ba7bb65f8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-정책계약 R-POLICY test-cleanup-review.md#r-policy +Dev tests/unit/analysis/analysis_model_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/analysis/analysis_model_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 008c38d245f54595a9a057575e264b408f235df5e9ff4fad3ef342ab6ff4301a 008c38d245f54595a9a057575e264b408f235df5e9ff4fad3ef342ab6ff4301a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ClassifiesActiveEntitiesInStableOrder AnalysisModel.ClassifiesActiveEntitiesInStableOrder; assertion 9개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ClassifiesActiveEntitiesInStableOrder 유지 원문 검사 body 및 assertion 동일. a295d00387546de59b989c3ac1abc3835489a6a9cc331a2b564b4ab6f5b76497 a295d00387546de59b989c3ac1abc3835489a6a9cc331a2b564b4ab6f5b76497 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveSections(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveBoundaryConditions(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U})) | EXPECT_EQ(model.ActiveLoads(), (std::vector{0U, 1U, 2U})) | ASSERT_EQ(model.Step().Loads().size(), 3U) | EXPECT_EQ(&model.Step().Loads()[0U].get(), &domain_result.Value().Steps()[0U].Loads()[0U].get()) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveSections(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveBoundaryConditions(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U})) | EXPECT_EQ(model.ActiveLoads(), (std::vector{0U, 1U, 2U})) | ASSERT_EQ(model.Step().Loads().size(), 3U) | EXPECT_EQ(&model.Step().Loads()[0U].get(), &domain_result.Value().Steps()[0U].Loads()[0U].get()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain; assertion 12개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain 유지 원문 검사 body 및 assertion 동일. f48acbdd2020c7f7dcf6795c0bcb2efd01e531fca508a98469183cadaa6af312 f48acbdd2020c7f7dcf6795c0bcb2efd01e531fca508a98469183cadaa6af312 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(&model.Step(), &domain.Steps()[0]) | EXPECT_EQ(&model.GetDomain().Elements()[0U], element_address) | EXPECT_EQ(&model.GetDomain().Materials()[0U], material_address) | EXPECT_EQ(&model.GetDomain().Sections()[0U], section_address) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[1]], &domain.Elements()[1]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[2]], &domain.Materials()[2]) | EXPECT_EQ(&model.GetDomain().Sections()[model.ActiveSections()[1]], &domain.Sections()[1]) | EXPECT_EQ(domain.Steps()[0].Name(), step_name) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[0U], first_load_magnitude) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(&model.Step(), &domain.Steps()[0]) | EXPECT_EQ(&model.GetDomain().Elements()[0U], element_address) | EXPECT_EQ(&model.GetDomain().Materials()[0U], material_address) | EXPECT_EQ(&model.GetDomain().Sections()[0U], section_address) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[1]], &domain.Elements()[1]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[2]], &domain.Materials()[2]) | EXPECT_EQ(&model.GetDomain().Sections()[model.ActiveSections()[1]], &domain.Sections()[1]) | EXPECT_EQ(domain.Steps()[0].Name(), step_name) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[0U], first_load_magnitude) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/analysis_model_test.cpp AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices; assertion 9개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices 유지 원문 검사 body 및 assertion 동일. 36df6ff3f545836b79af2c8987b7bc0042b748e43cc1a2a8a83f2679904abb16 36df6ff3f545836b79af2c8987b7bc0042b748e43cc1a2a8a83f2679904abb16 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U, 4U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveProperties(), (std::vector{0U, 1U, 2U, 4U})) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[4U]], &domain.Elements()[4U]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[1U]], &domain.Materials()[1U]) | EXPECT_EQ(&model.GetDomain().Properties()[model.ActiveProperties()[3U]], &domain.Properties()[4U]) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U, 4U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveProperties(), (std::vector{0U, 1U, 2U, 4U})) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[4U]], &domain.Elements()[4U]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[1U]], &domain.Materials()[1U]) | EXPECT_EQ(&model.GetDomain().Properties()[model.ActiveProperties()[3U]], &domain.Properties()[4U]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/analysis_model_test.cpp AnalysisModel.RejectsMissingOrMultipleStep AnalysisModel.RejectsMissingOrMultipleStep; assertion 15개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.RejectsMissingOrMultipleStep 유지 원문 검사 body 및 assertion 동일. 0815824dc498c89c2c43b00880b4458ce2b620a55e337c0a65de481074bb5318 0815824dc498c89c2c43b00880b4458ce2b620a55e337c0a65de481074bb5318 "ASSERT_TRUE(missing_domain.HasValue()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""invalid-model-cardinality"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].entity_identity, ""0"") | ASSERT_TRUE(multiple_domain.HasValue()) | ASSERT_FALSE(multiple.HasValue()) | EXPECT_EQ(multiple.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(multiple.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].code, ""unsupported-multiple-step"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].entity_identity, ""Step-2"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].location.line, 60U)" "ASSERT_TRUE(missing_domain.HasValue()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""invalid-model-cardinality"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].entity_identity, ""0"") | ASSERT_TRUE(multiple_domain.HasValue()) | ASSERT_FALSE(multiple.HasValue()) | EXPECT_EQ(multiple.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(multiple.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].code, ""unsupported-multiple-step"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].entity_identity, ""Step-2"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].location.line, 60U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/analysis_model_test.cpp support@1-94 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, MakeMixedDefinition tests/unit/analysis/analysis_model_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 06aad822bf2ade2c6877393bd23043babd0680f2b0dd2fb85a7f4cda1d5a6287 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/analysis_model_test.cpp support@148-149 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/analysis_model_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c4948f64c25c201003b0122f19efe90f365b9e8c9e4aeb1f21a6cffa974d706a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/analysis/analysis_state_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fc1756cf35f167a555753a2b8ae5c3be3dec48e851ffb2d1a02003088024dbb1 cc752a188e4daa7862e6602271a728de64f67de407ab7e573e9f87380d2b5bbb 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/analysis_state_test.cpp AnalysisState.AllocatesOnlyV0FullVectors AnalysisState.AllocatesOnlyV0FullVectors; assertion 14개 tests/unit/analysis/analysis_state_test.cpp AnalysisState.AllocatesOnlyV0FullVectors 유지 원문 검사 body 및 assertion 동일. 42f5f3563e7bf05df3559cd1173b200e4625be35cbe6ebf91140bb4275cc7961 42f5f3563e7bf05df3559cd1173b200e4625be35cbe6ebf91140bb4275cc7961 ASSERT_EQ(dofs.FullDofCount(), 12U) | ASSERT_EQ(dofs.ConstrainedDofCount(), 6U) | EXPECT_EQ(vector->Size(), dofs.FullDofCount()) | EXPECT_NE(vectors[left]->Data(), vectors[right]->Data()) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 4.0) | EXPECT_DOUBLE_EQ(state.Reaction()[11], -9.0) | EXPECT_DOUBLE_EQ(state.ExternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[0], 0.0) | EXPECT_FALSE(HasVelocity::value) | EXPECT_FALSE(HasAcceleration::value) | EXPECT_FALSE(HasTemperature::value) | EXPECT_FALSE(HasIterationHistory::value) | EXPECT_FALSE(HasNonlinearState::value) ASSERT_EQ(dofs.FullDofCount(), 12U) | ASSERT_EQ(dofs.ConstrainedDofCount(), 6U) | EXPECT_EQ(vector->Size(), dofs.FullDofCount()) | EXPECT_NE(vectors[left]->Data(), vectors[right]->Data()) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 4.0) | EXPECT_DOUBLE_EQ(state.Reaction()[11], -9.0) | EXPECT_DOUBLE_EQ(state.ExternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[0], 0.0) | EXPECT_FALSE(HasVelocity::value) | EXPECT_FALSE(HasAcceleration::value) | EXPECT_FALSE(HasTemperature::value) | EXPECT_FALSE(HasIterationHistory::value) | EXPECT_FALSE(HasNonlinearState::value) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/analysis_state_test.cpp AnalysisState.CopiesOrMovesWithoutAliasing AnalysisState.CopiesOrMovesWithoutAliasing; assertion 17개 tests/unit/analysis/analysis_state_test.cpp AnalysisState.CopiesOrMovesWithoutAliasing 유지 원문 검사 body 및 assertion 동일. 20bcbe30286b42f64657a68599fd57793c882e3a0a1e6eab8a654ad6909dc75b 20bcbe30286b42f64657a68599fd57793c882e3a0a1e6eab8a654ad6909dc75b "EXPECT_NE(copied.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(copied.Reaction().Data(), original.Reaction().Data()) | EXPECT_NE(copied.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_NE(copied.GaussResults().data(), original.GaussResults().data()) | EXPECT_NE(copied.StressResults().data(), original.StressResults().data()) | EXPECT_DOUBLE_EQ(original.Displacement()[0], 3.0) | EXPECT_DOUBLE_EQ(original.EndpointResults()[0].end_action[0], 1.0) | EXPECT_EQ(moved.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(moved.Displacement()[0], 30.0) | EXPECT_DOUBLE_EQ(moved.EndpointResults()[0].end_action[0], 20.0) | EXPECT_NE(moved.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(moved.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_DOUBLE_EQ(original.Reaction()[11], -2.0) | EXPECT_EQ(copy_assigned.Identity().step_name, ""Step-1"") | EXPECT_EQ(move_assigned.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(move_assigned.Reaction()[11], -20.0) | EXPECT_NE(move_assigned.Reaction().Data(), original.Reaction().Data())" "EXPECT_NE(copied.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(copied.Reaction().Data(), original.Reaction().Data()) | EXPECT_NE(copied.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_NE(copied.GaussResults().data(), original.GaussResults().data()) | EXPECT_NE(copied.StressResults().data(), original.StressResults().data()) | EXPECT_DOUBLE_EQ(original.Displacement()[0], 3.0) | EXPECT_DOUBLE_EQ(original.EndpointResults()[0].end_action[0], 1.0) | EXPECT_EQ(moved.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(moved.Displacement()[0], 30.0) | EXPECT_DOUBLE_EQ(moved.EndpointResults()[0].end_action[0], 20.0) | EXPECT_NE(moved.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(moved.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_DOUBLE_EQ(original.Reaction()[11], -2.0) | EXPECT_EQ(copy_assigned.Identity().step_name, ""Step-1"") | EXPECT_EQ(move_assigned.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(move_assigned.Reaction()[11], -20.0) | EXPECT_NE(move_assigned.Reaction().Data(), original.Reaction().Data())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/analysis_state_test.cpp support@1-83 helper/oracle/fixture/include/static assertion 구간: T, HasVelocity, HasAcceleration, HasTemperature, HasIterationHistory, HasNonlinearState, MakeDofs, ExpectAllZero tests/unit/analysis/analysis_state_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d26e13e59ba23688906ac1371820260a0ced12f4b89c06c777da7435bda0ebbd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/analysis_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/analysis/analysis_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5ee75fcbd1bc5a9a634d16239720a814a8fee06b04acb0893a617d557fe8cda7 7fa4c3708ec692f95b5c230c7d7c36f1ef665363228d1d26eea41fe5560eedfd 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/analysis_test.cpp Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis; assertion 7개 tests/unit/analysis/analysis_test.cpp Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis 유지 원문 검사 body 및 assertion 동일. 946fa72dea150d4bb8404a904b626c9d3037ae9eb3b765a68e288560e7b21975 946fa72dea150d4bb8404a904b626c9d3037ae9eb3b765a68e288560e7b21975 "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""analysis-test-failure"") | EXPECT_EQ(concrete_observer->Request().input_path, request.input_path) | EXPECT_EQ(concrete_observer->Request().output_path, request.output_path) | EXPECT_TRUE(destroyed)" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""analysis-test-failure"") | EXPECT_EQ(concrete_observer->Request().input_path, request.input_path) | EXPECT_EQ(concrete_observer->Request().output_path, request.output_path) | EXPECT_TRUE(destroyed)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/analysis_test.cpp support@1-40 helper/oracle/fixture/include/static assertion 구간: StatusAnalysis tests/unit/analysis/analysis_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5bebc48a355bf5e3306b1308047561d64e68a810108a4e8848f96ea0e1b97cd2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/analysis/dynamic_analysis_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cef74dec5c670c9ebe42f481a7a2ed4dfe3b3eecd14e28451e9433cb86c29a07 25e30b540c37be5c7699132ddf7c5da319a4a1bf3fb8988b054c8e9941ca594f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsUnknownOrChangingIntegrationFormulation DynamicAnalysisState.RejectsUnknownOrChangingIntegrationFormulation; assertion 6개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsUnknownOrChangingIntegrationFormulation 유지 원문 검사 body 및 assertion 동일. b299952d9c0f3e19395a6d489944cf36625188d909376ec71022cdfc3c04478e b299952d9c0f3e19395a6d489944cf36625188d909376ec71022cdfc3c04478e EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(next).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_TRUE(fixture.state.CommitAcceptedFrame(next).IsOk()) EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(next).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_TRUE(fixture.state.CommitAcceptedFrame(next).IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.DefaultStateRejectsTrialAndCommit DynamicAnalysisState.DefaultStateRejectsTrialAndCommit; assertion 7개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.DefaultStateRejectsTrialAndCommit 유지 원문 검사 body 및 assertion 동일. b4737286e2144fd021d33353dc82bdd2e178140858c8f7abd06756e0ce44a186 b4737286e2144fd021d33353dc82bdd2e178140858c8f7abd06756e0ce44a186 "EXPECT_FALSE(state.IsInitialized()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_FALSE(state.BeginTrialFromCommitted().HasValue()) | EXPECT_THROW((void)state.CommittedState(), std::logic_error) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"")" "EXPECT_FALSE(state.IsInitialized()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_FALSE(state.BeginTrialFromCommitted().HasValue()) | EXPECT_THROW((void)state.CommittedState(), std::logic_error) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CommitsCompleteZeroCorrectionHistoryAndCopiesTrials DynamicAnalysisState.CommitsCompleteZeroCorrectionHistoryAndCopiesTrials; assertion 11개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CommitsCompleteZeroCorrectionHistoryAndCopiesTrials 유지 원문 검사 body 및 assertion 동일. 6724599255887b6bf6c6e95acb67cf1a050081f3bbb2af3617e3abd7d2c2f4be 6724599255887b6bf6c6e95acb67cf1a050081f3bbb2af3617e3abd7d2c2f4be EXPECT_TRUE(fixture.state.IsInitialized()) | EXPECT_FALSE(fixture.state.BeginTrialFromCommitted().HasValue()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), index + 1U) | ASSERT_TRUE(trial.HasValue()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().generalized_coordinates[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState() .shell_results[0U] .stress[0U] .components[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.5) | EXPECT_FALSE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 3U)).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 3U) EXPECT_TRUE(fixture.state.IsInitialized()) | EXPECT_FALSE(fixture.state.BeginTrialFromCommitted().HasValue()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), index + 1U) | ASSERT_TRUE(trial.HasValue()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().generalized_coordinates[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState() .shell_results[0U] .stress[0U] .components[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.5) | EXPECT_FALSE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 3U)).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsMalformedInventoryScheduleAndPreservesEndpoint DynamicAnalysisState.RejectsMalformedInventoryScheduleAndPreservesEndpoint; assertion 8개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsMalformedInventoryScheduleAndPreservesEndpoint 유지 원문 검사 body 및 assertion 동일. ebf23f327fb58c09d0aa92da9d41f6059c31e1ff89f221511925e93e12b65922 ebf23f327fb58c09d0aa92da9d41f6059c31e1ff89f221511925e93e12b65922 "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"") | ASSERT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 1U)).IsOk())" "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"") | ASSERT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 1U)).IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsInvalidInitialStateAndFreeReaction DynamicAnalysisState.RejectsInvalidInitialStateAndFreeReaction; assertion 6개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsInvalidInitialStateAndFreeReaction 유지 원문 검사 body 및 assertion 동일. 7651255fed1f126aeef752981e055c05207296c59c2ea57c8ece5b759bf5050e 7651255fed1f126aeef752981e055c05207296c59c2ea57c8ece5b759bf5050e EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CreateRejectsInvalidScheduleAndNonzeroBoundary DynamicAnalysisState.CreateRejectsInvalidScheduleAndNonzeroBoundary; assertion 4개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CreateRejectsInvalidScheduleAndNonzeroBoundary 유지 원문 검사 body 및 assertion 동일. bbfb29c502216154504e82bbab6dc0df768128bc6ce0543958c4637ea1f32ef6 bbfb29c502216154504e82bbab6dc0df768128bc6ce0543958c4637ea1f32ef6 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_FALSE( fesa::DynamicAnalysisState::Create(domain.Value(), dofs.Value()) .HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_FALSE( fesa::DynamicAnalysisState::Create(domain.Value(), dofs.Value()) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp support@1-142 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, if, Fixture, MakeFixture, MakeFrame tests/unit/analysis/dynamic_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7a11e3f45e7410305d59981204ce69f453199fac55bfeaf62d2a5c8e6c409fa2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/dynamic_analysis_state_test.cpp support@321-322 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/dynamic_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/eigen_mass_assembly_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/analysis/eigen_mass_assembly_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8489602024286b7c66c26750ecbf627d361b893fa9083c7d2dd97d34bbe3c25e 8489602024286b7c66c26750ecbf627d361b893fa9083c7d2dd97d34bbe3c25e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/eigen_mass_assembly_test.cpp EigenMassAssembly.ScattersHeterogeneousSharedNodeMassInSourceOrder EigenMassAssembly.ScattersHeterogeneousSharedNodeMassInSourceOrder; assertion 9개 tests/unit/analysis/eigen_mass_assembly_test.cpp EigenMassAssembly.ScattersHeterogeneousSharedNodeMassInSourceOrder 유지 원문 검사 body 및 assertion 동일. 6d9e4d731b921c8e3a160847675ebe72b28977b65f3abdee8fc959a4a183b62f 6d9e4d731b921c8e3a160847675ebe72b28977b65f3abdee8fc959a4a183b62f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_LE(std::abs(expected.Value().mass - analytic_shared_rotary_mass) / analytic_shared_rotary_mass, 1e-12) | ASSERT_TRUE(state.HasValue()) | ASSERT_EQ(state.Value().free_dof_count, 1U) | ASSERT_EQ(state.Value().modes.size(), 1U) | EXPECT_LE(std::abs(state.Value().modes[0U].eigenvalue - expected_eigenvalue) / (std::abs(state.Value().modes[0U].eigenvalue) + std::abs(expected_eigenvalue)), 1e-12) | EXPECT_LE(std::abs(amplitude * amplitude * analytic_shared_rotary_mass - 1.0), 1e-12) | EXPECT_NEAR(eigenvalues[0U], eigenvalues[1U], 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_LE(std::abs(expected.Value().mass - analytic_shared_rotary_mass) / analytic_shared_rotary_mass, 1e-12) | ASSERT_TRUE(state.HasValue()) | ASSERT_EQ(state.Value().free_dof_count, 1U) | ASSERT_EQ(state.Value().modes.size(), 1U) | EXPECT_LE(std::abs(state.Value().modes[0U].eigenvalue - expected_eigenvalue) / (std::abs(state.Value().modes[0U].eigenvalue) + std::abs(expected_eigenvalue)), 1e-12) | EXPECT_LE(std::abs(amplitude * amplitude * analytic_shared_rotary_mass - 1.0), 1e-12) | EXPECT_NEAR(eigenvalues[0U], eigenvalues[1U], 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_mass_assembly_test.cpp support@1-148 helper/oracle/fixture/include/static assertion 구간: StatusText, SharedNodeDomain, SharedDofPencil, DirectSharedDofPencil tests/unit/analysis/eigen_mass_assembly_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 53cc183efe17e5050e7ea520df0757fe7dfdc9eba5668b6a1a2bcb51ae107667 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/eigen_mass_assembly_test.cpp support@179-180 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/eigen_mass_assembly_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/eigen_reduction_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/analysis/eigen_reduction_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8b9ae7711b40d67884aa28e863e458d968ae4d5c717e00034405aced6bddc9bb deeb284988187961964b2a213d19e3b2655f399294debdc175e43be75dada796 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil; assertion 6개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil 유지 원문 검사 body 및 assertion 동일. 399fa920a441080dca52e78288f339ef61c0a5a2ffd35eac3374a02d2732c42a 399fa920a441080dca52e78288f339ef61c0a5a2ffd35eac3374a02d2732c42a ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_NEAR(result.Value().whitened_operator.Values()[0], 10369.0 / 450.0, 1e-12) | EXPECT_DOUBLE_EQ(y[i], 0.0) | EXPECT_NEAR(y[5U] * y[5U] * (3.0 / 50.0), 1.0, 1e-12) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_NEAR(result.Value().whitened_operator.Values()[0], 10369.0 / 450.0, 1e-12) | EXPECT_DOUBLE_EQ(y[i], 0.0) | EXPECT_NEAR(y[5U] * y[5U] * (3.0 / 50.0), 1.0, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RemovesOnlyActualFreeDirectorNull EigenReduction.RemovesOnlyActualFreeDirectorNull; assertion 7개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RemovesOnlyActualFreeDirectorNull 유지 원문 검사 body 및 assertion 동일. 471fdf9ca8aeae5af42703e726987365971308fc83bc8104410a6a1840e1082a 471fdf9ca8aeae5af42703e726987365971308fc83bc8104410a6a1840e1082a ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().free_count, 6U) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_NEAR(action[i], 7.0, 1e-12) | EXPECT_LE(result.Value().eta_kz, 1e-12) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, std::vector(6U, 0U), {0.25}, 2.0) .HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().free_count, 6U) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_NEAR(action[i], 7.0, 1e-12) | EXPECT_LE(result.Value().eta_kz, 1e-12) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, std::vector(6U, 0U), {0.25}, 2.0) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RejectsNonfiniteUsedBasisAndPreservesPriorCandidate EigenReduction.RejectsNonfiniteUsedBasisAndPreservesPriorCandidate; assertion 7개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RejectsNonfiniteUsedBasisAndPreservesPriorCandidate 유지 원문 검사 body 및 assertion 동일. 17b15f6df7d9d73d6c12f13f053f2e1efa72c49bfff52c6f4dcbbfbcdc2c45c7 17b15f6df7d9d73d6c12f13f053f2e1efa72c49bfff52c6f4dcbbfbcdc2c45c7 "ASSERT_TRUE(prior.HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kSolver) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""invalid-eigen-mass-space"") | EXPECT_EQ(prior.Value().whitened_operator.Values(), prior_values) | ASSERT_TRUE(rerun.HasValue()) | EXPECT_EQ(rerun.Value().whitened_operator.Values(), prior_values)" "ASSERT_TRUE(prior.HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kSolver) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""invalid-eigen-mass-space"") | EXPECT_EQ(prior.Value().whitened_operator.Values(), prior_values) | ASSERT_TRUE(rerun.HasValue()) | EXPECT_EQ(rerun.Value().whitened_operator.Values(), prior_values)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs; assertion 2개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs 유지 원문 검사 body 및 assertion 동일. f6d11adf25938f2049286ead08de4b4714864ca4b1322e18bf3633bcf7854c31 f6d11adf25938f2049286ead08de4b4714864ca4b1322e18bf3633bcf7854c31 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""eigen-mass-conditioning"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""eigen-mass-conditioning"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.WhitensOffDiagonalMassAndRestoresOriginalPencil EigenReduction.WhitensOffDiagonalMassAndRestoresOriginalPencil; assertion 7개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.WhitensOffDiagonalMassAndRestoresOriginalPencil 유지 원문 검사 body 및 assertion 동일. b5a7c3d712f378cd6568ccd879c6c7390686b963b0528af91c9a20bf8353e277 b5a7c3d712f378cd6568ccd879c6c7390686b963b0528af91c9a20bf8353e277 ASSERT_TRUE(reduction.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_EQ(eigen.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(eigen.Value().eigenvalues[0], 2.0, 1e-12) | EXPECT_NEAR(eigen.Value().eigenvalues[1], 10.0 / 3.0, 1e-12) | EXPECT_NEAR(q.Dot(mq), 1.0, 1e-12) | EXPECT_LE(residual.Norm(), 1e-12) ASSERT_TRUE(reduction.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_EQ(eigen.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(eigen.Value().eigenvalues[0], 2.0, 1e-12) | EXPECT_NEAR(eigen.Value().eigenvalues[1], 10.0 / 3.0, 1e-12) | EXPECT_NEAR(q.Dot(mq), 1.0, 1e-12) | EXPECT_LE(residual.Norm(), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PreservesSmallResolvablePositivePartialRotationMass EigenReduction.PreservesSmallResolvablePositivePartialRotationMass; assertion 4개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PreservesSmallResolvablePositivePartialRotationMass 유지 원문 검사 body 및 assertion 동일. aff919e78c5664fb5231773c44978a9d7cbf02ee6f62c4a2a94d2abb33948434 aff919e78c5664fb5231773c44978a9d7cbf02ee6f62c4a2a94d2abb33948434 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_GE(result.Value().nodes[0].record.rcond_inf, 0x1p-32) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_GE(result.Value().nodes[0].record.rcond_inf, 0x1p-32) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace; assertion 7개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace 유지 원문 검사 body 및 assertion 동일. 9291ee1eebaa0910609397a4c53ac7f706ee44b9c19994ed2c1976a7c0e8befe 9291ee1eebaa0910609397a4c53ac7f706ee44b9c19994ed2c1976a7c0e8befe "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, mask, {0.25}, 1.0) .HasValue()) | ASSERT_FALSE(empty.HasValue()) | EXPECT_EQ(empty.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(empty.GetStatus().Diagnostics()[0].code, ""empty-eigenproblem"")" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, mask, {0.25}, 1.0) .HasValue()) | ASSERT_FALSE(empty.HasValue()) | EXPECT_EQ(empty.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(empty.GetStatus().Diagnostics()[0].code, ""empty-eigenproblem"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/eigen_reduction_test.cpp support@1-51 helper/oracle/fixture/include/static assertion 구간: Sparse, NodalMass, TiltedFrame tests/unit/analysis/eigen_reduction_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f10d759cbbc50f34e2d035e0f584c041ad24aa29fd15de0651681519ec5258b5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 20개 tests/unit/analysis/hht_dynamic_algebra_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dc1a43a08e360283baf9701bf5a2839a21d561397d4ad732c921b31a10cf570e e926831b44741880a7a729c57266c668eeeccc9130be07eacdb97c5330338ad2 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidPredictorPreservesRatesFixedDofsAndOldState HhtNewtonStart.ValidPredictorPreservesRatesFixedDofsAndOldState; assertion 16개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidPredictorPreservesRatesFixedDofsAndOldState 유지 원문 검사 body 및 assertion 동일. 83ff51b06a72feea0d70aa1de3e1d8fa07f7128d4c4194861b5bb148ba8813f9 83ff51b06a72feea0d70aa1de3e1d8fa07f7128d4c4194861b5bb148ba8813f9 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_GT(frame.generalized_coordinates[2U], 0.0) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], predictor.coordinates[i]) | EXPECT_DOUBLE_EQ(frame.velocity[i], predictor.velocity[i]) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], parameters.alpha * old.acceleration[i] / (1.0 + parameters.alpha)) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(old.velocity[2U], 0.2) | EXPECT_DOUBLE_EQ(old.acceleration[2U], 0.3) | EXPECT_EQ(old.iteration_count, 7U) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_GT(frame.generalized_coordinates[2U], 0.0) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], predictor.coordinates[i]) | EXPECT_DOUBLE_EQ(frame.velocity[i], predictor.velocity[i]) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], parameters.alpha * old.acceleration[i] / (1.0 + parameters.alpha)) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(old.velocity[2U], 0.2) | EXPECT_DOUBLE_EQ(old.acceleration[2U], 0.3) | EXPECT_EQ(old.iteration_count, 7U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.InvalidPredictorGeometryUsesUnchangedAcceptedCoordinates HhtNewtonStart.InvalidPredictorGeometryUsesUnchangedAcceptedCoordinates; assertion 6개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.InvalidPredictorGeometryUsesUnchangedAcceptedCoordinates 유지 원문 검사 body 및 assertion 동일. 7f1ecc04486786cb084db0832cdaf162e71ddcf7e8ad02c3193dbb36d5d195f3 7f1ecc04486786cb084db0832cdaf162e71ddcf7e8ad02c3193dbb36d5d195f3 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(start.Value().frame.algorithmic_acceleration[i], auxiliary) | EXPECT_DOUBLE_EQ(start.Value().frame.acceleration[i], auxiliary / (1.0 + parameters.alpha)) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(start.Value().frame.algorithmic_acceleration[i], auxiliary) | EXPECT_DOUBLE_EQ(start.Value().frame.acceleration[i], auxiliary / (1.0 + parameters.alpha)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidChartRateOverflowIsNotReplacedByAcceptedGeometry HhtNewtonStart.ValidChartRateOverflowIsNotReplacedByAcceptedGeometry; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidChartRateOverflowIsNotReplacedByAcceptedGeometry 유지 원문 검사 body 및 assertion 동일. 52556a58a35b9a39362efc3fd2fff266da52dea44cfdea0e89c4c1c288705fee 52556a58a35b9a39362efc3fd2fff266da52dea44cfdea0e89c4c1c288705fee "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.LaterOutsideChartNodeDoesNotHideEarlierRateOverflow HhtNewtonStart.LaterOutsideChartNodeDoesNotHideEarlierRateOverflow; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.LaterOutsideChartNodeDoesNotHideEarlierRateOverflow 유지 원문 검사 body 및 assertion 동일. 30d8bdf6512795f74fb1e1322a2a7266e83e2545f10f4cc95ecde8c83530594e 30d8bdf6512795f74fb1e1322a2a7266e83e2545f10f4cc95ecde8c83530594e "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.UsesTheExistingPrincipalChartMarginForInitialSelection HhtNewtonStart.UsesTheExistingPrincipalChartMarginForInitialSelection; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.UsesTheExistingPrincipalChartMarginForInitialSelection 유지 원문 검사 body 및 assertion 동일. aad0befacc29ae3638004bedd9fcd0c4a0be3dcd89ec1c4a5f2b4ff45d505b57 aad0befacc29ae3638004bedd9fcd0c4a0be3dcd89ec1c4a5f2b4ff45d505b57 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], inside ? predictor.coordinates[5U] : 0.0) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], inside ? predictor.coordinates[5U] : 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.CommonEnergyScalingSelectsTheSmallerFreeResidual HhtNewtonStart.CommonEnergyScalingSelectsTheSmallerFreeResidual; assertion 5개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.CommonEnergyScalingSelectsTheSmallerFreeResidual 유지 원문 검사 body 및 assertion 동일. c81160bc3e25344f04144572f3efb18f086dfca03dab2442ab766da8e00fbb69 c81160bc3e25344f04144572f3efb18f086dfca03dab2442ab766da8e00fbb69 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_GT(drill_residual, 0.0) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_GT(drill_residual, 0.0) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ConstrainedReactionDoesNotChangeNontrivialFreeResidualTie HhtNewtonStart.ConstrainedReactionDoesNotChangeNontrivialFreeResidualTie; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ConstrainedReactionDoesNotChangeNontrivialFreeResidualTie 유지 원문 검사 body 및 assertion 동일. 82af7082c22c2e465b2b74e21b3fab82eebce0a797ce924fb0e62a7a6e4b8977 82af7082c22c2e465b2b74e21b3fab82eebce0a797ce924fb0e62a7a6e4b8977 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ScaledResidualOverflowRemainsAFailure HhtNewtonStart.ScaledResidualOverflowRemainsAFailure; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ScaledResidualOverflowRemainsAFailure 유지 원문 검사 body 및 assertion 동일. db53879667603238b22caad54b437d6e9355b60a01d62fcc5895c0ea29bd2206 db53879667603238b22caad54b437d6e9355b60a01d62fcc5895c0ea29bd2206 "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.AcceptedStartArithmeticFailureIsNotIgnoredDuringComparison HhtNewtonStart.AcceptedStartArithmeticFailureIsNotIgnoredDuringComparison; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.AcceptedStartArithmeticFailureIsNotIgnoredDuringComparison 유지 원문 검사 body 및 assertion 동일. ae45e703f39d5173207289f5bac55b10d4912d7faaeb7e31b0828c6c3d84bd59 ae45e703f39d5173207289f5bac55b10d4912d7faaeb7e31b0828c6c3d84bd59 "ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(valid_predictor.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(valid_predictor.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.RejectedPredictorDoesNotHideInvalidAcceptedStartRates HhtNewtonStart.RejectedPredictorDoesNotHideInvalidAcceptedStartRates; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.RejectedPredictorDoesNotHideInvalidAcceptedStartRates 유지 원문 검사 body 및 assertion 동일. 87af7acedf54a8bacd7dc709d4cf98bab2e8dd55c6033d7decfc9edf545cd69e 87af7acedf54a8bacd7dc709d4cf98bab2e8dd55c6033d7decfc9edf545cd69e "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"") | EXPECT_DOUBLE_EQ(old.generalized_coordinates[5U], 0.0)" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"") | EXPECT_DOUBLE_EQ(old.generalized_coordinates[5U], 0.0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidGeometryStressOverflowRemainsARecoveryFailure HhtNewtonStart.ValidGeometryStressOverflowRemainsARecoveryFailure; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidGeometryStressOverflowRemainsARecoveryFailure 유지 원문 검사 body 및 assertion 동일. 608c3757178a373edae163916eb616d060f80ed87e569f1a747ef533fba5e841 608c3757178a373edae163916eb616d060f80ed87e569f1a747ef533fba5e841 "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-nonlinear-shell-recovery"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-nonlinear-shell-recovery"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.InitializesCoupledMasslessAccelerationFromHiddenEquation HhtDynamicAlgebra.InitializesCoupledMasslessAccelerationFromHiddenEquation; assertion 10개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.InitializesCoupledMasslessAccelerationFromHiddenEquation 유지 원문 검사 body 및 assertion 동일. dca81e4f5956f5fd2a869a3a5b03c9e15df863b98e40c9cf8489678b3d516a02 dca81e4f5956f5fd2a869a3a5b03c9e15df863b98e40c9cf8489678b3d516a02 ASSERT_TRUE(acceleration.HasValue()) | EXPECT_NEAR(acceleration.Value()[0], 1.0, 1.0e-12) | EXPECT_NEAR(acceleration.Value()[5], 0.7, 1.0e-12) | EXPECT_EQ(acceleration.Value()[full], 0.0) | ASSERT_EQ(nodes, std::vector{0U}) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, nodes, positive, tangent, &frame) .IsOk()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), 1U) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], 0.0, 1.0e-12) | EXPECT_GT(frame.hidden_acceleration_defect_scale[0], 0.0) | EXPECT_FALSE(pseudoinverse.IsOk()) ASSERT_TRUE(acceleration.HasValue()) | EXPECT_NEAR(acceleration.Value()[0], 1.0, 1.0e-12) | EXPECT_NEAR(acceleration.Value()[5], 0.7, 1.0e-12) | EXPECT_EQ(acceleration.Value()[full], 0.0) | ASSERT_EQ(nodes, std::vector{0U}) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, nodes, positive, tangent, &frame) .IsOk()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), 1U) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], 0.0, 1.0e-12) | EXPECT_GT(frame.hidden_acceleration_defect_scale[0], 0.0) | EXPECT_FALSE(pseudoinverse.IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsMissingCanonicalHiddenGradient HhtDynamicAlgebra.RejectsMissingCanonicalHiddenGradient; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsMissingCanonicalHiddenGradient 유지 원문 검사 body 및 assertion 동일. 74a7c54d874d6dc0045725cdb30a80de28ba7e3bfb9624462ed9234575436bbd 74a7c54d874d6dc0045725cdb30a80de28ba7e3bfb9624462ed9234575436bbd "ASSERT_FALSE(acceleration.HasValue()) | ASSERT_FALSE(acceleration.GetStatus().Diagnostics().empty()) | EXPECT_EQ(acceleration.GetStatus().Diagnostics().front().code, ""dynamic-algebraic-gradient"")" "ASSERT_FALSE(acceleration.HasValue()) | ASSERT_FALSE(acceleration.GetStatus().Diagnostics().empty()) | EXPECT_EQ(acceleration.GetStatus().Diagnostics().front().code, ""dynamic-algebraic-gradient"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.ChecksInitialConstraintAndVelocityWithoutRepair HhtDynamicAlgebra.ChecksInitialConstraintAndVelocityWithoutRepair; assertion 2개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.ChecksInitialConstraintAndVelocityWithoutRepair 유지 원문 검사 body 및 assertion 동일. 1f8d68dac0766ed6cfd75b6e55633612751022e7d9c6e8f77d67c06a694973a4 1f8d68dac0766ed6cfd75b6e55633612751022e7d9c6e8f77d67c06a694973a4 EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.KeepsAcceptedHiddenRateDefectsAsDiagnostics HhtDynamicAlgebra.KeepsAcceptedHiddenRateDefectsAsDiagnostics; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.KeepsAcceptedHiddenRateDefectsAsDiagnostics 유지 원문 검사 body 및 assertion 동일. b6656cadbd8eff4fe59cb6e649da8b73f332d6371a24e089e51a502fd701812a b6656cadbd8eff4fe59cb6e649da8b73f332d6371a24e089e51a502fd701812a ASSERT_TRUE(result.IsOk()) | EXPECT_NEAR(frame.hidden_velocity_defect[0], 0.3, 1.0e-12) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], -0.6, 1.0e-12) ASSERT_TRUE(result.IsOk()) | EXPECT_NEAR(frame.hidden_velocity_defect[0], 0.3, 1.0e-12) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], -0.6, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsNegativePhysicalMassAndAlgebraicRankLoss HhtDynamicAlgebra.RejectsNegativePhysicalMassAndAlgebraicRankLoss; assertion 2개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsNegativePhysicalMassAndAlgebraicRankLoss 유지 원문 검사 body 및 assertion 동일. 78d8a27b28858536af53be59122d7afd794a448f30eee56de369e82b20ecb0a8 78d8a27b28858536af53be59122d7afd794a448f30eee56de369e82b20ecb0a8 EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, negative, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, singular, 2.0, positive, tangent) .HasValue()) EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, negative, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, singular, 2.0, positive, tangent) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AppliesTheExactRegularityConditionBoundary HhtDynamicAlgebra.AppliesTheExactRegularityConditionBoundary; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AppliesTheExactRegularityConditionBoundary 유지 원문 검사 body 및 assertion 동일. 6c6023800e47f2dee4b1e70509312f6286db2bb011b24117d285dca77fb219e3 6c6023800e47f2dee4b1e70509312f6286db2bb011b24117d285dca77fb219e3 "EXPECT_EQ(result.HasValue(), exponent <= 32) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-algebraic-conditioning"")" "EXPECT_EQ(result.HasValue(), exponent <= 32) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-algebraic-conditioning"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AllFixedModelHasAnEmptyValidAccelerationSolve HhtDynamicAlgebra.AllFixedModelHasAnEmptyValidAccelerationSolve; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AllFixedModelHasAnEmptyValidAccelerationSolve 유지 원문 검사 body 및 assertion 동일. b46d03f9802058ea1af7e6fb69903168a20526878111f1e1994389b609273c36 b46d03f9802058ea1af7e6fb69903168a20526878111f1e1994389b609273c36 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Norm(), 0.0) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, {}, positive, tangent, &frame) .IsOk()) | EXPECT_EQ(frame.hidden_constraint.Size(), 0U) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Norm(), 0.0) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, {}, positive, tangent, &frame) .IsOk()) | EXPECT_EQ(frame.hidden_constraint.Size(), 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.PartialBoundaryRetainsEveryNonzeroPhysicalDirection HhtDynamicAlgebra.PartialBoundaryRetainsEveryNonzeroPhysicalDirection; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.PartialBoundaryRetainsEveryNonzeroPhysicalDirection 유지 원문 검사 body 및 assertion 동일. 7d72f765cafbf817a9f26d9f8abd9d654664b17589b1824d0bdc885f35ffd953 7d72f765cafbf817a9f26d9f8abd9d654664b17589b1824d0bdc885f35ffd953 "EXPECT_EQ(nodes.size(), p == 0.0 ? 1U : 0U) | EXPECT_EQ(result.HasValue(), expected) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-positive-mass-conditioning"")" "EXPECT_EQ(nodes.size(), p == 0.0 ? 1U : 0U) | EXPECT_EQ(result.HasValue(), expected) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-positive-mass-conditioning"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsAdmissibleNullRankChangeBeforeAcceptingFrame HhtDynamicAlgebra.RejectsAdmissibleNullRankChangeBeforeAcceptingFrame; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsAdmissibleNullRankChangeBeforeAcceptingFrame 유지 원문 검사 body 및 assertion 동일. 614b49ef2166dc30907a57a85d9ecada764ca8a1864a6c55562c7e645b410611 614b49ef2166dc30907a57a85d9ecada764ca8a1864a6c55562c7e645b410611 "ASSERT_EQ(initial_nodes.size(), 1U) | ASSERT_FALSE(result.IsOk()) | EXPECT_EQ(result.Diagnostics()[0].code, ""dynamic-mass-null-rank-change"") | EXPECT_EQ(frame.hidden_constraint[0], 23.0)" "ASSERT_EQ(initial_nodes.size(), 1U) | ASSERT_FALSE(result.IsOk()) | EXPECT_EQ(result.Diagnostics()[0].code, ""dynamic-mass-null-rank-change"") | EXPECT_EQ(frame.hidden_constraint[0], 23.0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp support@1-161 helper/oracle/fixture/include/static assertion 구간: Fixture, MakeFixture, if, Sparse, Assembly, EmptyTrial tests/unit/analysis/hht_dynamic_algebra_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b54e2c2f814694abbd26a1b4accdd404cb99fbcdb05093dd7f89602ee20ba702 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_dynamic_algebra_test.cpp support@671-672 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_dynamic_algebra_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/analysis/hht_dynamic_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c6f5b9faf1cca0ae80f587dc0b07dde9513b35303ee69d7bbb126583df98423b 7b16fff8a3edd6482b56b0c6ac02cbac5b292aecb05c82d51ac460f691befd3a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.ClampedStepLoadHasPhysicalReactionAndZeroMotion HhtDynamicProcedure.ClampedStepLoadHasPhysicalReactionAndZeroMotion; assertion 13개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.ClampedStepLoadHasPhysicalReactionAndZeroMotion 유지 원문 검사 body 및 assertion 동일. af10ef2634dd693ac1345389ffd20c559b5cab842c16135d6ee600f40b749c52 af10ef2634dd693ac1345389ffd20c559b5cab842c16135d6ee600f40b749c52 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.reaction[2U], -4.0) | EXPECT_DOUBLE_EQ(frame.external_force[2U], 4.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.reaction[2U], -4.0) | EXPECT_DOUBLE_EQ(frame.external_force[2U], 4.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UnloadedFreeChannelsRemainExactlyAtRest HhtDynamicProcedure.UnloadedFreeChannelsRemainExactlyAtRest; assertion 13개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UnloadedFreeChannelsRemainExactlyAtRest 유지 원문 검사 body 및 assertion 동일. 16d814c3946a314c5b19636f0dda7cbe9d6c7702feaf70a007d2e9546e81ab56 16d814c3946a314c5b19636f0dda7cbe9d6c7702feaf70a007d2e9546e81ab56 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ((*values)[i], 0.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.drilling_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(metric, 0.0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ((*values)[i], 0.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.drilling_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(metric, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry; assertion 10개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry 유지 원문 검사 body 및 assertion 동일. 03acc1280ba57f65c34c10dcee9d444861d413107a82328c271e8affa1349c9e 03acc1280ba57f65c34c10dcee9d444861d413107a82328c271e8affa1349c9e ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT( std::abs(result.Value().state.AcceptedFrames()[0U].acceleration[14U]), 1e5) | EXPECT_LT(result.Value().state.CommittedState().generalized_coordinates[14U], 0.0) | EXPECT_LE(metric, 1e-10) | EXPECT_GT(result.Value().state.CommittedState().iteration_count, 0U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[dof], (1.0 + alpha) * frame.acceleration[dof] - alpha * frames[frame_index - 1U].acceleration[dof]) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT( std::abs(result.Value().state.AcceptedFrames()[0U].acceleration[14U]), 1e5) | EXPECT_LT(result.Value().state.CommittedState().generalized_coordinates[14U], 0.0) | EXPECT_LE(metric, 1e-10) | EXPECT_GT(result.Value().state.CommittedState().iteration_count, 0U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[dof], (1.0 + alpha) * frame.acceleration[dof] - alpha * frames[frame_index - 1U].acceleration[dof]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.PreservesBackendCauseAndAddsInitialFailureContext HhtDynamicProcedure.PreservesBackendCauseAndAddsInitialFailureContext; assertion 13개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.PreservesBackendCauseAndAddsInitialFailureContext 유지 원문 검사 body 및 assertion 동일. b869904675bfc24f3eff1a042534df660eca2c47b484a361461060c349de2e1f b869904675bfc24f3eff1a042534df660eca2c47b484a361461060c349de2e1f "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""injected-tangent-backend"") | ASSERT_NE(found, result.GetStatus().Diagnostics().end()) | EXPECT_EQ(found->location.file, std::filesystem::path{""dynamic-state.inp""}) | EXPECT_EQ(found->location.line, 13U) | EXPECT_EQ(found->entity_identity, ""Transient Load"") | EXPECT_NE(found->message.find(""stage=initial""), std::string::npos) | EXPECT_NE(found->message.find(""increment=0""), std::string::npos) | EXPECT_NE(found->message.find(""time=0""), std::string::npos)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""injected-tangent-backend"") | ASSERT_NE(found, result.GetStatus().Diagnostics().end()) | EXPECT_EQ(found->location.file, std::filesystem::path{""dynamic-state.inp""}) | EXPECT_EQ(found->location.line, 13U) | EXPECT_EQ(found->entity_identity, ""Transient Load"") | EXPECT_NE(found->message.find(""stage=initial""), std::string::npos) | EXPECT_NE(found->message.find(""increment=0""), std::string::npos) | EXPECT_NE(found->message.find(""time=0""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions HhtDynamicProcedure.UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions; assertion 15개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions 유지 원문 검사 body 및 assertion 동일. b0478c8b2a601459afa174f5b801ee5cfd08d11a8a971e979ef7ba8cde76dc28 b0478c8b2a601459afa174f5b801ee5cfd08d11a8a971e979ef7ba8cde76dc28 ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(partitioned.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(finite_rotation.HasValue()) | ASSERT_TRUE(rotated_finite_rotation.HasValue()) | ASSERT_EQ(frames.size(), 3U) | EXPECT_LE(std::abs(frame.physical_strain_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.drilling_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node] - frame.generalized_coordinates[0U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 1U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 2U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + rotation]), 1e-12) | EXPECT_GT(frames.back().generalized_coordinates[0U], 0.0) | EXPECT_GT(maximum_rotation, 0.0) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(partitioned.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(finite_rotation.HasValue()) | ASSERT_TRUE(rotated_finite_rotation.HasValue()) | ASSERT_EQ(frames.size(), 3U) | EXPECT_LE(std::abs(frame.physical_strain_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.drilling_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node] - frame.generalized_coordinates[0U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 1U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 2U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + rotation]), 1e-12) | EXPECT_GT(frames.back().generalized_coordinates[0U], 0.0) | EXPECT_GT(maximum_rotation, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp support@1-330 helper/oracle/fixture/include/static assertion 구간: InjectedTangentFailure, FailingTangent, FailureText, for, MakeRigidTranslationDefinition, RotateGlobal, MakeRotatedRigidTranslationDefinition, MakeFiniteRotationDefinition, MakeRotatedFiniteRotationDefinition, RigidTranslationRun, ExpectSameSourceIds, RunRigidTranslation, ExpectSameDynamicHistory, ExpectRotatedDofVector, ExpectCovariantDynamicHistory, MakeDefinition, if tests/unit/analysis/hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 678fa0e4df0f56e62f9a30783ffbf7e564661fc06a0fbc9bbf69bd6e25c8123c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_dynamic_procedure_test.cpp support@570-571 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_energy_verification_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/analysis/hht_energy_verification_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9d0c672737a65b301b38b949aef26d0099451719a7fd98ffa7c5d1171e97a885 9d0c672737a65b301b38b949aef26d0099451719a7fd98ffa7c5d1171e97a885 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07AlphaZeroConservesLinearOscillatorEnergy HhtEnergyVerification.C07AlphaZeroConservesLinearOscillatorEnergy; assertion 2개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07AlphaZeroConservesLinearOscillatorEnergy 유지 원문 검사 body 및 assertion 동일. c212f946ce9196b35236724d344066dbfcb8d3df5910b001c265f1f5e8ef53b3 c212f946ce9196b35236724d344066dbfcb8d3df5910b001c265f1f5e8ef53b3 ASSERT_TRUE(parameters.HasValue()) | EXPECT_LE(maximum, 1.0e-10) ASSERT_TRUE(parameters.HasValue()) | EXPECT_LE(maximum, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07DefaultAlphaReportsEnergyAndPhaseChanges HhtEnergyVerification.C07DefaultAlphaReportsEnergyAndPhaseChanges; assertion 3개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07DefaultAlphaReportsEnergyAndPhaseChanges 유지 원문 검사 body 및 assertion 동일. 683b5ca010185dc76cd3ecf37078c479637fd0a00c07ed5a1a80a5a116c14933 683b5ca010185dc76cd3ecf37078c479637fd0a00c07ed5a1a80a5a116c14933 ASSERT_TRUE(parameters.HasValue()) | EXPECT_TRUE(std::isfinite(energy)) | EXPECT_LT(energy, 2.0) ASSERT_TRUE(parameters.HasValue()) | EXPECT_TRUE(std::isfinite(energy)) | EXPECT_LT(energy, 2.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07IndependentAmplificationHasThePrescribedSpectrum HhtEnergyVerification.C07IndependentAmplificationHasThePrescribedSpectrum; assertion 4개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07IndependentAmplificationHasThePrescribedSpectrum 유지 원문 검사 body 및 assertion 동일. a96cd1993dfff2d5f5c40fdaf6139af7e5f6aa82dfc5cc784de896f1df437bca a96cd1993dfff2d5f5c40fdaf6139af7e5f6aa82dfc5cc784de896f1df437bca EXPECT_NEAR(std::abs(roots[1]), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(roots[2]), 1.0, 1.0e-10) | EXPECT_LE(radius, 1.0 + 1.0e-10) | EXPECT_LT(error, previous_limit_error) EXPECT_NEAR(std::abs(roots[1]), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(roots[2]), 1.0, 1.0e-10) | EXPECT_LE(radius, 1.0 + 1.0e-10) | EXPECT_LT(error, previous_limit_error) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07SupportReactionUsesPhysicalAccelerationAndCoupling HhtEnergyVerification.C07SupportReactionUsesPhysicalAccelerationAndCoupling; assertion 4개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07SupportReactionUsesPhysicalAccelerationAndCoupling 유지 원문 검사 body 및 assertion 동일. 3462a480370c4e1ef1adba61c8cecbd490c5a188b1c0f71c8f381a648f7717f7 3462a480370c4e1ef1adba61c8cecbd490c5a188b1c0f71c8f381a648f7717f7 ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(reaction, 0.5 * state.a[0]) | EXPECT_LE(std::abs(balance) / scale, 1.0e-10) | EXPECT_GT(mutation_difference, 1.0e-6) ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(reaction, 0.5 * state.a[0]) | EXPECT_LE(std::abs(balance) / scale, 1.0e-10) | EXPECT_GT(mutation_difference, 1.0e-6) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_energy_verification_test.cpp support@1-119 helper/oracle/fixture/include/static assertion 구간: Oscillator, Advance, Amplification, Eigenvalues, if, for tests/unit/analysis/hht_energy_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 85df404875102d22dc4c86031757dd24174a652f4dc39cf7ce0f561c59a977b4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_energy_verification_test.cpp support@222-223 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_energy_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_reduced_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 25개 tests/unit/analysis/hht_reduced_shell_test.cpp file 이관 Dev trial cache·context 변경·copy/move 소유권·실패 우선순위·left-association 검사를 복원한다. 같은 trial의 독립 local 평가만 ShellTrialElement::EvaluateTrial 호출로 이관한다. d715219a60c73ce9803f2c386be3843221c48b1f90882c224ad714db3ea6c785 243fb1edd3dfd485e824cf11291087e0e6daf469a9c8d0f2ed04ce893e385129 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.SelectsCanonicalPivotAndLiftsCoordinates HhtReducedChart.SelectsCanonicalPivotAndLiftsCoordinates; assertion 7개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.SelectsCanonicalPivotAndLiftsCoordinates 유지 원문 검사 body 및 assertion 동일. 9be1e26c0f12a99552fa2c7e2a706eb69bf9829d16cea9fda53f6d60ed62dd86 9be1e26c0f12a99552fa2c7e2a706eb69bf9829d16cea9fda53f6d60ed62dd86 ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 4U) | EXPECT_EQ(chart.Value().pivot_components[node], 2U) | EXPECT_EQ(chart.Value().z_dofs[node], 6U * node + 5U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().p_dofs[i]], p[i]) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().z_dofs[i]], z[i]) ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 4U) | EXPECT_EQ(chart.Value().pivot_components[node], 2U) | EXPECT_EQ(chart.Value().z_dofs[node], 6U * node + 5U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().p_dofs[i]], p[i]) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().z_dofs[i]], z[i]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RetainsNodeWhenItsPartialBoundaryCutsTheNull HhtReducedChart.RetainsNodeWhenItsPartialBoundaryCutsTheNull; assertion 9개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RetainsNodeWhenItsPartialBoundaryCutsTheNull 유지 원문 검사 body 및 assertion 동일. 6233920d1de0cb982482e84f4acac2853c5d4b5f8b76431c4e52cc215134cc89 6233920d1de0cb982482e84f4acac2853c5d4b5f8b76431c4e52cc215134cc89 ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 3U) | EXPECT_TRUE(std::find(chart.Value().null_nodes.begin(), chart.Value().null_nodes.end(), 0U) == chart.Value().null_nodes.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 3U) != chart.Value().p_dofs.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 4U) != chart.Value().p_dofs.end()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_EQ(operators.Value().rows.size(), 3U) ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 3U) | EXPECT_TRUE(std::find(chart.Value().null_nodes.begin(), chart.Value().null_nodes.end(), 0U) == chart.Value().null_nodes.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 3U) != chart.Value().p_dofs.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 4U) != chart.Value().p_dofs.end()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_EQ(operators.Value().rows.size(), 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.UsesActualFiniteInitialNullAndPreservesTransposeActions HhtReducedChart.UsesActualFiniteInitialNullAndPreservesTransposeActions; assertion 13개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.UsesActualFiniteInitialNullAndPreservesTransposeActions 유지 원문 검사 body 및 assertion 동일. 3a0cce3ce539ccc6181768741375eed175e179b4e875a97b2369e6bd7f6a4c2f 3a0cce3ce539ccc6181768741375eed175e179b4e875a97b2369e6bd7f6a4c2f ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(built.HasValue()) | EXPECT_EQ(chart.minimum_axes.front(), axis) | ASSERT_EQ(chart.z_columns.front().support.size(), 3U) | EXPECT_NEAR(column.support[i].value, raw[i] / norm, 1e-15) | EXPECT_TRUE(std::isfinite(column.support_radii[i])) | EXPECT_GE(column.support_radii[i], 0.0) | EXPECT_GT(std::abs(chart.z_columns.front().support[0U].value), 0.01) | ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(projected_p.HasValue()) | ASSERT_TRUE(projected_z.HasValue()) | EXPECT_NEAR(projected_p.Value()[i], p[i], 1e-15) | EXPECT_NEAR(projected_z.Value()[i], z[i], 1e-15) ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(built.HasValue()) | EXPECT_EQ(chart.minimum_axes.front(), axis) | ASSERT_EQ(chart.z_columns.front().support.size(), 3U) | EXPECT_NEAR(column.support[i].value, raw[i] / norm, 1e-15) | EXPECT_TRUE(std::isfinite(column.support_radii[i])) | EXPECT_GE(column.support_radii[i], 0.0) | EXPECT_GT(std::abs(chart.z_columns.front().support[0U].value), 0.01) | ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(projected_p.HasValue()) | ASSERT_TRUE(projected_z.HasValue()) | EXPECT_NEAR(projected_p.Value()[i], p[i], 1e-15) | EXPECT_NEAR(projected_z.Value()[i], z[i], 1e-15) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.MinimumAxisTieAndPartialBoundaryRetainExactZeros HhtReducedChart.MinimumAxisTieAndPartialBoundaryRetainExactZeros; assertion 5개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.MinimumAxisTieAndPartialBoundaryRetainExactZeros 유지 원문 검사 body 및 assertion 동일. 199055f0e67f5c20880dc18741e1294140016db419e6a95628c00e1cb1277f8b 199055f0e67f5c20880dc18741e1294140016db419e6a95628c00e1cb1277f8b ASSERT_TRUE(chart.HasValue()) | EXPECT_EQ(axis, 0U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[5U], 0.0) | EXPECT_FALSE(column.fixed_plane) ASSERT_TRUE(chart.HasValue()) | EXPECT_EQ(axis, 0U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[5U], 0.0) | EXPECT_FALSE(column.fixed_plane) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.ProperRotationRelatesRetainedPlanesByConstantOrthogonalMap HhtReducedChart.ProperRotationRelatesRetainedPlanesByConstantOrthogonalMap; assertion 8개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.ProperRotationRelatesRetainedPlanesByConstantOrthogonalMap 유지 원문 검사 body 및 assertion 동일. 0a3d19b8bfc9be9ba9e6f6d45bf817a8cde05698c75a9ae3355fb4c74ac52e62 0a3d19b8bfc9be9ba9e6f6d45bf817a8cde05698c75a9ae3355fb4c74ac52e62 ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(source.HasValue()) | ASSERT_TRUE(target.HasValue()) | ASSERT_EQ(si, 2U) | ASSERT_EQ(ti, 2U) | EXPECT_NEAR(target_plane[0U][k] * t[0U][j] + target_plane[1U][k] * t[1U][j], rotated[k], 1e-14) | EXPECT_NEAR(t[0U][i] * t[0U][j] + t[1U][i] * t[1U][j], i == j ? 1.0 : 0.0, 1e-14) ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(source.HasValue()) | ASSERT_TRUE(target.HasValue()) | ASSERT_EQ(si, 2U) | ASSERT_EQ(ti, 2U) | EXPECT_NEAR(target_plane[0U][k] * t[0U][j] + target_plane[1U][k] * t[1U][j], rotated[k], 1e-14) | EXPECT_NEAR(t[0U][i] * t[0U][j] + t[1U][i] * t[1U][j], i == j ? 1.0 : 0.0, 1e-14) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RejectsSubnormalNormWithoutAValidCoefficientCertificate HhtReducedChart.RejectsSubnormalNormWithoutAValidCoefficientCertificate; assertion 1개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RejectsSubnormalNormWithoutAValidCoefficientCertificate 유지 원문 검사 body 및 assertion 동일. c8389950eef75e9147da8658be67e71bb4c52c46db7991d0488a4937ac82c439 c8389950eef75e9147da8658be67e71bb4c52c46db7991d0488a4937ac82c439 EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, rotations).HasValue()) EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, rotations).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.NativeCoefficientRadiiExportFixedInputReplay HhtReducedChart.NativeCoefficientRadiiExportFixedInputReplay; assertion 7개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.NativeCoefficientRadiiExportFixedInputReplay 유지 원문 검사 body 및 assertion 동일. 9c220fc2bc4ffd53650d9c3af693560d6beeaf06b5631d766ae082ff5ec3e8fb 9c220fc2bc4ffd53650d9c3af693560d6beeaf06b5631d766ae082ff5ec3e8fb ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(column, 2U) | ASSERT_EQ(p->support.size(), 3U) | EXPECT_TRUE(std::isfinite(radius)) | EXPECT_GE(radius, 0.0) | EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, invalid).HasValue()) ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(column, 2U) | ASSERT_EQ(p->support.size(), 3U) | EXPECT_TRUE(std::isfinite(radius)) | EXPECT_GE(radius, 0.0) | EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, invalid).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.InvertibleGraphDoesNotCertifySelectorTransversality HhtReducedChart.InvertibleGraphDoesNotCertifySelectorTransversality; assertion 6개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.InvertibleGraphDoesNotCertifySelectorTransversality 유지 원문 검사 body 및 assertion 동일. 23c5ac02ecae6f1ee4b38528c74d1fe93200138fd51a2ab0d23b694c7e04abbe 23c5ac02ecae6f1ee4b38528c74d1fe93200138fd51a2ab0d23b694c7e04abbe ASSERT_TRUE(chart.HasValue()) | EXPECT_TRUE(fesa::hht_reduced_internal::SolveGraphSystem( fesa::hht_reduced_internal::GraphJacobian(operators, chart.Value()), fesa::Vector(4U, 1.0), solver).HasValue()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) ASSERT_TRUE(chart.HasValue()) | EXPECT_TRUE(fesa::hht_reduced_internal::SolveGraphSystem( fesa::hht_reduced_internal::GraphJacobian(operators, chart.Value()), fesa::Vector(4U, 1.0), solver).HasValue()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.CompleteTrialConstraintDataMatchesFreshAndOwnsCopies HhtReducedOperators.CompleteTrialConstraintDataMatchesFreshAndOwnsCopies; assertion 16개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.CompleteTrialConstraintDataMatchesFreshAndOwnsCopies 이관 Dev trial cache·context 변경·copy/move 소유권·실패 우선순위·left-association 검사를 복원한다. 같은 trial의 독립 local 평가만 ShellTrialElement::EvaluateTrial 호출로 이관한다. c2550db2c3c2e988d3d7a1555cd933c9a2371d66d7e30d05aec89e026e8c1f28 8d91faae89582464d44dbe22e850c9d57ef109d3e474e000e43bce1cd93266c5 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_EQ(assembled.Value().trial_constraints->shells.size(), shells.Value().size()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(saved.directional_internal) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(reused.HasValue()) | ASSERT_TRUE(marker.HasValue()) | EXPECT_NE(marker.Value().rows[0U].value, reused.Value().rows[0U].value) | EXPECT_NE( copy.trial_constraints->shells[0U].drilling_constraint[0U], assembled.Value().trial_constraints->shells[0U].drilling_constraint[0U]) | ASSERT_TRUE(moved_result.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(tbb_result.HasValue()) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_EQ(assembled.Value().trial_constraints->shells.size(), shells.Value().size()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(saved.directional_internal) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(reused.HasValue()) | ASSERT_TRUE(marker.HasValue()) | EXPECT_NE(marker.Value().rows[0U].value, reused.Value().rows[0U].value) | EXPECT_NE( copy.trial_constraints->shells[0U].drilling_constraint[0U], assembled.Value().trial_constraints->shells[0U].drilling_constraint[0U]) | ASSERT_TRUE(moved_result.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(tbb_result.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.ChangedTrialConstraintContextFallsBackInOriginalPosition HhtReducedOperators.ChangedTrialConstraintContextFallsBackInOriginalPosition; assertion 19개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.ChangedTrialConstraintContextFallsBackInOriginalPosition 유지 원문 검사 body 및 assertion 동일. c9c5b148483d6a734246aa230aa71782a630877d3309f2849b78b1abb6a32042 c9c5b148483d6a734246aa230aa71782a630877d3309f2849b78b1abb6a32042 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_TRUE( assembled.Value().trial_constraints->shells[0U].directional_internal) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_EQ(mkl_set_num_threads_local(0), 2) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_FALSE(failed.HasValue()) | ASSERT_FALSE(original.HasValue()) | ASSERT_EQ(failed.GetStatus().Diagnostics().size(), original.GetStatus().Diagnostics().size()) | EXPECT_EQ(failed.GetStatus().Diagnostics()[0U].code, original.GetStatus().Diagnostics()[0U].code) | EXPECT_EQ(failed.GetStatus().Diagnostics()[0U].message, original.GetStatus().Diagnostics()[0U].message) | ASSERT_TRUE(rerun.HasValue()) | ASSERT_TRUE(reference.HasValue()) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_TRUE( assembled.Value().trial_constraints->shells[0U].directional_internal) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_EQ(mkl_set_num_threads_local(0), 2) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_FALSE(failed.HasValue()) | ASSERT_FALSE(original.HasValue()) | ASSERT_EQ(failed.GetStatus().Diagnostics().size(), original.GetStatus().Diagnostics().size()) | EXPECT_EQ(failed.GetStatus().Diagnostics()[0U].code, original.GetStatus().Diagnostics()[0U].code) | EXPECT_EQ(failed.GetStatus().Diagnostics()[0U].message, original.GetStatus().Diagnostics()[0U].message) | ASSERT_TRUE(rerun.HasValue()) | ASSERT_TRUE(reference.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.TrialContextControlsAndInitialFalseFailureLifetime HhtReducedOperators.TrialContextControlsAndInitialFalseFailureLifetime; assertion 25개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.TrialContextControlsAndInitialFalseFailureLifetime 유지 원문 검사 body 및 assertion 동일. 67b5b1519ea7f824e562dd9e5ecc22d093d8ccb9a5daefffe7ae7eea7e1c60db 67b5b1519ea7f824e562dd9e5ecc22d093d8ccb9a5daefffe7ae7eea7e1c60db ASSERT_TRUE(fesa::hht_internal::ReusableTrialContext(context, context)) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(context, changed)) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(unmasked, unmasked)) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(positive, positive)) | EXPECT_EQ(mkl_set_num_threads_local(0), 2) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(dynamic, dynamic)) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(position.HasValue()) | EXPECT_FALSE(position.Value().trial_constraints.has_value()) | ASSERT_TRUE(dynamic_trial.HasValue()) | ASSERT_TRUE(dynamic_trial.Value().trial_constraints.has_value()) | EXPECT_FALSE( dynamic_trial.Value().trial_constraints->shells[0U].directional_internal) | EXPECT_EQ(mkl_set_num_threads_local(0), 2) | ASSERT_TRUE(positive_trial.HasValue()) | ASSERT_TRUE(positive_trial.Value().trial_constraints.has_value()) | EXPECT_FALSE(positive_trial.Value() .trial_constraints->shells[0U] .directional_internal) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(initial.HasValue()) | EXPECT_FALSE(initial.Value().trial_constraints.has_value()) | EXPECT_FALSE(failure.HasValue()) | ASSERT_TRUE(current.HasValue()) | ASSERT_TRUE(next.HasValue()) | ASSERT_EQ(current.Value().trial_constraints->shells.size(), shells.Value().size()) | ASSERT_EQ(next.Value().trial_constraints->shells.size(), shells.Value().size()) | EXPECT_NE(¤t.Value().trial_constraints->shells[0U], &next.Value().trial_constraints->shells[0U]) ASSERT_TRUE(fesa::hht_internal::ReusableTrialContext(context, context)) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(context, changed)) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(unmasked, unmasked)) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(positive, positive)) | EXPECT_EQ(mkl_set_num_threads_local(0), 2) | EXPECT_FALSE(fesa::hht_internal::ReusableTrialContext(dynamic, dynamic)) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(position.HasValue()) | EXPECT_FALSE(position.Value().trial_constraints.has_value()) | ASSERT_TRUE(dynamic_trial.HasValue()) | ASSERT_TRUE(dynamic_trial.Value().trial_constraints.has_value()) | EXPECT_FALSE( dynamic_trial.Value().trial_constraints->shells[0U].directional_internal) | EXPECT_EQ(mkl_set_num_threads_local(0), 2) | ASSERT_TRUE(positive_trial.HasValue()) | ASSERT_TRUE(positive_trial.Value().trial_constraints.has_value()) | EXPECT_FALSE(positive_trial.Value() .trial_constraints->shells[0U] .directional_internal) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(initial.HasValue()) | EXPECT_FALSE(initial.Value().trial_constraints.has_value()) | EXPECT_FALSE(failure.HasValue()) | ASSERT_TRUE(current.HasValue()) | ASSERT_TRUE(next.HasValue()) | ASSERT_EQ(current.Value().trial_constraints->shells.size(), shells.Value().size()) | ASSERT_EQ(next.Value().trial_constraints->shells.size(), shells.Value().size()) | EXPECT_NE(¤t.Value().trial_constraints->shells[0U], &next.Value().trial_constraints->shells[0U]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.NonfiniteMatchingTrialKeysPreserveOriginalFailure HhtReducedOperators.NonfiniteMatchingTrialKeysPreserveOriginalFailure; assertion 16개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.NonfiniteMatchingTrialKeysPreserveOriginalFailure 유지 원문 검사 body 및 assertion 동일. a0ae08eb280056ac6d02aef7595237997364b0fb7b5a8665e86687b24983559d a0ae08eb280056ac6d02aef7595237997364b0fb7b5a8665e86687b24983559d ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_TRUE( assembled.Value().trial_constraints->shells[0U].directional_internal) | ASSERT_TRUE(chart.HasValue()) | ASSERT_FALSE(original.HasValue()) | ASSERT_FALSE(actual.HasValue()) | EXPECT_EQ(actual.GetStatus().Category(), original.GetStatus().Category()) | ASSERT_EQ(a.size(), b.size()) | EXPECT_EQ(a[j].severity, b[j].severity) | EXPECT_EQ(a[j].code, b[j].code) | EXPECT_EQ(a[j].location.file, b[j].location.file) | EXPECT_EQ(a[j].location.line, b[j].location.line) | EXPECT_EQ(a[j].keyword, b[j].keyword) | EXPECT_EQ(a[j].entity_identity, b[j].entity_identity) | EXPECT_EQ(a[j].message, b[j].message) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_TRUE( assembled.Value().trial_constraints->shells[0U].directional_internal) | ASSERT_TRUE(chart.HasValue()) | ASSERT_FALSE(original.HasValue()) | ASSERT_FALSE(actual.HasValue()) | EXPECT_EQ(actual.GetStatus().Category(), original.GetStatus().Category()) | ASSERT_EQ(a.size(), b.size()) | EXPECT_EQ(a[j].severity, b[j].severity) | EXPECT_EQ(a[j].code, b[j].code) | EXPECT_EQ(a[j].location.file, b[j].location.file) | EXPECT_EQ(a[j].location.line, b[j].location.line) | EXPECT_EQ(a[j].keyword, b[j].keyword) | EXPECT_EQ(a[j].entity_identity, b[j].entity_identity) | EXPECT_EQ(a[j].message, b[j].message) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.NonfiniteMatchingTimeKeyMissPreservesFreshSuccess HhtReducedOperators.NonfiniteMatchingTimeKeyMissPreservesFreshSuccess; assertion 10개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.NonfiniteMatchingTimeKeyMissPreservesFreshSuccess 유지 원문 검사 body 및 assertion 동일. 06af6ebcbfae999adf35c836f87c4f1fd38e57c385028adec4ca457d2f798fd2 06af6ebcbfae999adf35c836f87c4f1fd38e57c385028adec4ca457d2f798fd2 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(producer.HasValue()) | EXPECT_FALSE(producer.Value().trial_constraints.has_value()) | ASSERT_TRUE(producer_result.HasValue()) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(assembled.Value().trial_constraints.has_value()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(reference.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(producer.HasValue()) | EXPECT_FALSE(producer.Value().trial_constraints.has_value()) | ASSERT_TRUE(producer_result.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.ScatterShellDerivativesByConstraintRow HhtReducedOperators.ScatterShellDerivativesByConstraintRow; assertion 15개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.ScatterShellDerivativesByConstraintRow 유지 원문 검사 body 및 assertion 동일. b57a6ce0864234af355f619fb8be4a19898393df437f5b314c8f1e2ee79dc0bd b57a6ce0864234af355f619fb8be4a19898393df437f5b314c8f1e2ee79dc0bd ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(operators.HasValue()) | ASSERT_EQ(operators.Value().rows.size(), 4U) | ASSERT_TRUE(graph_condition.HasValue()) | EXPECT_GE(graph_condition.Value(), std::ldexp(1.0, -32)) | EXPECT_DOUBLE_EQ(row.value, 0.0) | EXPECT_DOUBLE_EQ(row.value_scale, expected_scale) | EXPECT_FALSE(row.gradient.empty()) | EXPECT_FALSE(row.hessian.empty()) | EXPECT_LT(row.gradient.size(), fixture.dofs.FullDofCount()) | EXPECT_LT(entry.row, fixture.dofs.FullDofCount()) | EXPECT_LT(entry.column, fixture.dofs.FullDofCount()) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(operators.HasValue()) | ASSERT_EQ(operators.Value().rows.size(), 4U) | ASSERT_TRUE(graph_condition.HasValue()) | EXPECT_GE(graph_condition.Value(), std::ldexp(1.0, -32)) | EXPECT_DOUBLE_EQ(row.value, 0.0) | EXPECT_DOUBLE_EQ(row.value_scale, expected_scale) | EXPECT_FALSE(row.gradient.empty()) | EXPECT_FALSE(row.hessian.empty()) | EXPECT_LT(row.gradient.size(), fixture.dofs.FullDofCount()) | EXPECT_LT(entry.row, fixture.dofs.FullDofCount()) | EXPECT_LT(entry.column, fixture.dofs.FullDofCount()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RejectsNonfiniteGraphResidualBeforeAcceptance HhtReducedEmbedding.RejectsNonfiniteGraphResidualBeforeAcceptance; assertion 4개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RejectsNonfiniteGraphResidualBeforeAcceptance 유지 원문 검사 body 및 assertion 동일. aba990268187a0cee9fe762ab5acefe258144c3a8bcaf27245174b8cc87d6ac6 aba990268187a0cee9fe762ab5acefe258144c3a8bcaf27245174b8cc87d6ac6 "ASSERT_TRUE(chart.HasValue()) | ASSERT_FALSE(root.HasValue()) | ASSERT_FALSE(root.GetStatus().Diagnostics().empty()) | EXPECT_EQ(root.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" "ASSERT_TRUE(chart.HasValue()) | ASSERT_FALSE(root.HasValue()) | ASSERT_FALSE(root.GetStatus().Diagnostics().empty()) | EXPECT_EQ(root.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsExactTwoCycleForFullHiddenCertification HhtReducedEmbedding.ReturnsExactTwoCycleForFullHiddenCertification; assertion 4개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsExactTwoCycleForFullHiddenCertification 유지 원문 검사 body 및 assertion 동일. 1c20656897f7812ce5cf1b2993fc07ba03b3b4c04bcc5d9b8111bffb775607ab 1c20656897f7812ce5cf1b2993fc07ba03b3b4c04bcc5d9b8111bffb775607ab ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().q[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, -2.0) ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().q[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, -2.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsEvaluatedTrialWhenLiftAbsorbsAChangedPrivateRoot HhtReducedEmbedding.ReturnsEvaluatedTrialWhenLiftAbsorbsAChangedPrivateRoot; assertion 12개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsEvaluatedTrialWhenLiftAbsorbsAChangedPrivateRoot 유지 원문 검사 body 및 assertion 동일. 72f50cedc425b3beda1ad7a34363c76203e2792acbf3eff5bfdc4c3dee43c148 72f50cedc425b3beda1ad7a34363c76203e2792acbf3eff5bfdc4c3dee43c148 ASSERT_TRUE(built.HasValue()) | ASSERT_EQ(angular, 2U) | ASSERT_TRUE(original.HasValue()) | EXPECT_NE(changed[0U], seed[0U]) | ASSERT_TRUE(absorbed.HasValue()) | EXPECT_EQ(original.Value()[i], absorbed.Value()[i]) | ASSERT_TRUE(root.HasValue()) | EXPECT_EQ(root.Value().z[0U], seed[0U]) | EXPECT_NE(root.Value().operators.rows[0U].value, 0.0) | EXPECT_GT(root.Value().graph_residual_relative, 1e-10) | EXPECT_EQ(root.Value().graph_iteration_count, 0U) | EXPECT_EQ(root.Value().q[i], original.Value()[i]) ASSERT_TRUE(built.HasValue()) | ASSERT_EQ(angular, 2U) | ASSERT_TRUE(original.HasValue()) | EXPECT_NE(changed[0U], seed[0U]) | ASSERT_TRUE(absorbed.HasValue()) | EXPECT_EQ(original.Value()[i], absorbed.Value()[i]) | ASSERT_TRUE(root.HasValue()) | EXPECT_EQ(root.Value().z[0U], seed[0U]) | EXPECT_NE(root.Value().operators.rows[0U].value, 0.0) | EXPECT_GT(root.Value().graph_residual_relative, 1e-10) | EXPECT_EQ(root.Value().graph_iteration_count, 0U) | EXPECT_EQ(root.Value().q[i], original.Value()[i]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.StopsAtExistingScaledPositionCertificate HhtReducedEmbedding.StopsAtExistingScaledPositionCertificate; assertion 5개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.StopsAtExistingScaledPositionCertificate 유지 원문 검사 body 및 assertion 동일. 40399a56a3e5ee5dd124159d271c7c833a7fb9bf4de311a17d44b0752fe90716 40399a56a3e5ee5dd124159d271c7c833a7fb9bf4de311a17d44b0752fe90716 ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_infinity, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_relative, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_correction_infinity, 0.0) ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_infinity, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_relative, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_correction_infinity, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RequiresExactZeroWhenPositionScaleIsZero HhtReducedEmbedding.RequiresExactZeroWhenPositionScaleIsZero; assertion 3개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RequiresExactZeroWhenPositionScaleIsZero 유지 원문 검사 body 및 assertion 동일. 781274b693d154f790a5b856ea36ce7faf58048779d75a99636edfed40153d2d 781274b693d154f790a5b856ea36ce7faf58048779d75a99636edfed40153d2d ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, 0.0) ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsRatesAcrossSelectedPartitionCancellation HhtReducedEmbedding.ReconstructsRatesAcrossSelectedPartitionCancellation; assertion 11개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsRatesAcrossSelectedPartitionCancellation 유지 원문 검사 body 및 assertion 동일. 99f396cb603db35827fd7516d26285d29dfd1fc5149f7f1ae100caf12b3c027f 99f396cb603db35827fd7516d26285d29dfd1fc5149f7f1ae100caf12b3c027f EXPECT_DOUBLE_EQ(plain_velocity_rhs, 0.0) | EXPECT_DOUBLE_EQ(plain_acceleration_rhs, 0.0) | ASSERT_TRUE(rates.HasValue()) | EXPECT_DOUBLE_EQ(rates.Value().velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[1U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[0U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[1U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_acceleration[0U], 1.0) EXPECT_DOUBLE_EQ(plain_velocity_rhs, 0.0) | EXPECT_DOUBLE_EQ(plain_acceleration_rhs, 0.0) | ASSERT_TRUE(rates.HasValue()) | EXPECT_DOUBLE_EQ(rates.Value().velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[1U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[0U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[1U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_acceleration[0U], 1.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsActualShellRatesWithMixedTimeLoad HhtReducedEmbedding.ReconstructsActualShellRatesWithMixedTimeLoad; assertion 53개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsActualShellRatesWithMixedTimeLoad 유지 원문 검사 body 및 assertion 동일. d7e9c115b48ed36f68722faa84b348585d6fd80567b49019bbac78cde25cd8b9 d7e9c115b48ed36f68722faa84b348585d6fd80567b49019bbac78cde25cd8b9 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(initial.HasValue()) | ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().q[2U], 0.01) | ASSERT_TRUE(rates.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_NEAR(hidden[0U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[1U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[2U], 0.0, 1.0e-8) | EXPECT_TRUE(saw_time_term) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(reference_length.HasValue()) | ASSERT_TRUE(system.HasValue()) | ASSERT_EQ(system.Value().physical_count, chart.Value().p_dofs.size()) | ASSERT_EQ(system.Value().algebraic_count, chart.Value().z_dofs.size()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], cv * 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], ca * 0.004) | EXPECT_NEAR(mapped.Value().coordinate[entry.dof], -0.003 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().velocity[entry.dof], 0.002 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().acceleration[entry.dof], -0.001 * entry.value, 1e-17) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(projected_base.HasValue()) | EXPECT_NEAR(base.Value()[i], system.Value().row_scale[i] * projected_base.Value()[i], 1e-13 * system.Value().row_scale[i] * uncancelled) | ASSERT_GT(direction_norm, 0.0) | ASSERT_TRUE(mapped_direction.HasValue()) | ASSERT_GT(tangent_frobenius, 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_EQ(consecutive, expected_pass) | ASSERT_TRUE(no_force_actual.HasValue()) | ASSERT_TRUE(no_force_operators.HasValue()) | ASSERT_EQ(omitted_external_gradient.rows.size(), no_force_operators.Value().rows.size()) | ASSERT_EQ(omitted.size(), no_force.size()) | ASSERT_EQ(omitted[entry].dof, no_force[entry].dof) | ASSERT_TRUE(saw_external_position_gradient) | ASSERT_TRUE(omitted_external_gradient_system.HasValue()) | ASSERT_TRUE(ha_actual.HasValue()) | ASSERT_TRUE(ha_operators.HasValue()) | ASSERT_TRUE(ha_system.HasValue()) | ASSERT_TRUE(omitted_ha_system.HasValue()) | ASSERT_TRUE(hw_actual.HasValue()) | ASSERT_TRUE(hw_operators.HasValue()) | ASSERT_TRUE(hw_system.HasValue()) | ASSERT_TRUE(omitted_hw_system.HasValue()) | ASSERT_TRUE(third_system.HasValue()) | ASSERT_TRUE(mixed_time_system.HasValue()) | ASSERT_TRUE(omitted_second_time_rates.HasValue()) | EXPECT_GT(omitted_second_time_hidden, 1.0e-8) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(initial.HasValue()) | ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().q[2U], 0.01) | ASSERT_TRUE(rates.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_NEAR(hidden[0U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[1U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[2U], 0.0, 1.0e-8) | EXPECT_TRUE(saw_time_term) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(reference_length.HasValue()) | ASSERT_TRUE(system.HasValue()) | ASSERT_EQ(system.Value().physical_count, chart.Value().p_dofs.size()) | ASSERT_EQ(system.Value().algebraic_count, chart.Value().z_dofs.size()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], cv * 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], ca * 0.004) | EXPECT_NEAR(mapped.Value().coordinate[entry.dof], -0.003 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().velocity[entry.dof], 0.002 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().acceleration[entry.dof], -0.001 * entry.value, 1e-17) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(projected_base.HasValue()) | EXPECT_NEAR(base.Value()[i], system.Value().row_scale[i] * projected_base.Value()[i], 1e-13 * system.Value().row_scale[i] * uncancelled) | ASSERT_GT(direction_norm, 0.0) | ASSERT_TRUE(mapped_direction.HasValue()) | ASSERT_GT(tangent_frobenius, 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_EQ(consecutive, expected_pass) | ASSERT_TRUE(no_force_actual.HasValue()) | ASSERT_TRUE(no_force_operators.HasValue()) | ASSERT_EQ(omitted_external_gradient.rows.size(), no_force_operators.Value().rows.size()) | ASSERT_EQ(omitted.size(), no_force.size()) | ASSERT_EQ(omitted[entry].dof, no_force[entry].dof) | ASSERT_TRUE(saw_external_position_gradient) | ASSERT_TRUE(omitted_external_gradient_system.HasValue()) | ASSERT_TRUE(ha_actual.HasValue()) | ASSERT_TRUE(ha_operators.HasValue()) | ASSERT_TRUE(ha_system.HasValue()) | ASSERT_TRUE(omitted_ha_system.HasValue()) | ASSERT_TRUE(hw_actual.HasValue()) | ASSERT_TRUE(hw_operators.HasValue()) | ASSERT_TRUE(hw_system.HasValue()) | ASSERT_TRUE(omitted_hw_system.HasValue()) | ASSERT_TRUE(third_system.HasValue()) | ASSERT_TRUE(mixed_time_system.HasValue()) | ASSERT_TRUE(omitted_second_time_rates.HasValue()) | EXPECT_GT(omitted_second_time_hidden, 1.0e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RequiresEveryTranslationGateAndThaws HhtReducedChannelNewton.RequiresEveryTranslationGateAndThaws; assertion 10개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RequiresEveryTranslationGateAndThaws 유지 원문 검사 body 및 assertion 동일. 635a7b5bdebdb547e60223694971085c31ae50c328a17ee943f24d0f968e86b3 635a7b5bdebdb547e60223694971085c31ae50c328a17ee943f24d0f968e86b3 EXPECT_TRUE(refine({1e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({2e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 1e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero, false)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({std::numeric_limits::infinity(), 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, std::numeric_limits::quiet_NaN()}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) EXPECT_TRUE(refine({1e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({2e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 1e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero, false)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({std::numeric_limits::infinity(), 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, std::numeric_limits::quiet_NaN()}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RetainsAllAuxiliaryBlocksAndFullModelDefect HhtReducedChannelNewton.RetainsAllAuxiliaryBlocksAndFullModelDefect; assertion 22개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RetainsAllAuxiliaryBlocksAndFullModelDefect 유지 원문 검사 body 및 assertion 동일. e1aa1e05ebaeb7f832033a6db8283163510c5d3266ee5a5863a445694b12e3d7 e1aa1e05ebaeb7f832033a6db8283163510c5d3266ee5a5863a445694b12e3d7 ASSERT_TRUE(tangent.HasValue()) | ASSERT_TRUE(selected.HasValue()) | EXPECT_EQ(selected.Value().full_indices, (std::vector{1U, 2U, 3U, 4U, 5U})) | ASSERT_TRUE(solver.FactorizeFresh(selected.Value().tangent).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(selected.Value().rhs, step).IsOk()) | EXPECT_TRUE(fesa::hht_internal::CheckLinearSolve( selected.Value().tangent, selected.Value().rhs, step).IsOk()) | ASSERT_TRUE(embedded.HasValue()) | EXPECT_DOUBLE_EQ(embedded.Value()[0U], 0.0) | EXPECT_NEAR(embedded.Value()[i], expected[i], 1e-14) | EXPECT_FALSE(fesa::hht_internal::CheckLinearSolve( full.tangent, full.rhs, embedded.Value()).IsOk()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], 0.0) | EXPECT_NEAR(mapped.Value().coordinate[5U], 0.4, 1e-14) | EXPECT_NEAR(mapped.Value().velocity[5U], 0.2, 1e-14) | EXPECT_NEAR(mapped.Value().acceleration[5U], -0.3, 1e-14) | ASSERT_TRUE(thawed.HasValue()) | EXPECT_EQ(thawed.Value().full_indices.size(), 6U) | EXPECT_DOUBLE_EQ(thawed.Value().rhs[0U], rhs[0U]) | EXPECT_FALSE(fesa::hht_reduced_internal::SelectAugmentedSolve( invalid, chart, true).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::EmbedAugmentedSolution( selected.Value(), step, 6U).HasValue()) ASSERT_TRUE(tangent.HasValue()) | ASSERT_TRUE(selected.HasValue()) | EXPECT_EQ(selected.Value().full_indices, (std::vector{1U, 2U, 3U, 4U, 5U})) | ASSERT_TRUE(solver.FactorizeFresh(selected.Value().tangent).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(selected.Value().rhs, step).IsOk()) | EXPECT_TRUE(fesa::hht_internal::CheckLinearSolve( selected.Value().tangent, selected.Value().rhs, step).IsOk()) | ASSERT_TRUE(embedded.HasValue()) | EXPECT_DOUBLE_EQ(embedded.Value()[0U], 0.0) | EXPECT_NEAR(embedded.Value()[i], expected[i], 1e-14) | EXPECT_FALSE(fesa::hht_internal::CheckLinearSolve( full.tangent, full.rhs, embedded.Value()).IsOk()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], 0.0) | EXPECT_NEAR(mapped.Value().coordinate[5U], 0.4, 1e-14) | EXPECT_NEAR(mapped.Value().velocity[5U], 0.2, 1e-14) | EXPECT_NEAR(mapped.Value().acceleration[5U], -0.3, 1e-14) | ASSERT_TRUE(thawed.HasValue()) | EXPECT_EQ(thawed.Value().full_indices.size(), 6U) | EXPECT_DOUBLE_EQ(thawed.Value().rhs[0U], rhs[0U]) | EXPECT_FALSE(fesa::hht_reduced_internal::SelectAugmentedSolve( invalid, chart, true).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::EmbedAugmentedSolution( selected.Value(), step, 6U).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RestrictedSingularityIsNotFullInvertibility HhtReducedChannelNewton.RestrictedSingularityIsNotFullInvertibility; assertion 4개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RestrictedSingularityIsNotFullInvertibility 유지 원문 검사 body 및 assertion 동일. 929b1e67526d7ea5095985c949c85d901e3f90db028afcd2bdd3826dba226d7b 929b1e67526d7ea5095985c949c85d901e3f90db028afcd2bdd3826dba226d7b ASSERT_TRUE(matrix.HasValue()) | ASSERT_TRUE(restricted.HasValue()) | ASSERT_TRUE(solver.FactorizeFresh(full.tangent).IsOk()) | EXPECT_FALSE(solver.FactorizeFresh(restricted.Value().tangent).IsOk()) ASSERT_TRUE(matrix.HasValue()) | ASSERT_TRUE(restricted.HasValue()) | ASSERT_TRUE(solver.FactorizeFresh(full.tangent).IsOk()) | EXPECT_FALSE(solver.FactorizeFresh(restricted.Value().tangent).IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.NullMetricKeepsFiniteLeftAssociatedProducts HhtReducedOperators.NullMetricKeepsFiniteLeftAssociatedProducts; assertion 9개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.NullMetricKeepsFiniteLeftAssociatedProducts 유지 원문 검사 body 및 assertion 동일. 4998c48dc3585979cd5e3480513dd96d58f984516945f1cadc4f32557ea92960 4998c48dc3585979cd5e3480513dd96d58f984516945f1cadc4f32557ea92960 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(std::isfinite(original_metric)) | ASSERT_GT(original_metric, 0.0) | ASSERT_FALSE(std::isfinite(block[1U] * n[1U] + block[2U] * n[2U])) | ASSERT_TRUE(metric.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(checked.HasValue()) | EXPECT_GE(checked.Value(), std::ldexp(1.0, -32)) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(std::isfinite(original_metric)) | ASSERT_GT(original_metric, 0.0) | ASSERT_FALSE(std::isfinite(block[1U] * n[1U] + block[2U] * n[2U])) | ASSERT_TRUE(metric.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(checked.HasValue()) | EXPECT_GE(checked.Value(), std::ldexp(1.0, -32)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_reduced_shell_test.cpp support@1-222 helper/oracle/fixture/include/static assertion 구간: RestoreTrialEnvironment, ExpectSameBits, ExpectSameOperators, Fixture, MakeFixture, if, Rotations, Assemble, SetComponentColumns, PIndex, Hidden, for tests/unit/analysis/hht_reduced_shell_test.cpp file-support 유지 Dev trial cache·context 변경·copy/move 소유권·실패 우선순위·left-association 검사를 복원한다. 같은 trial의 독립 local 평가만 ShellTrialElement::EvaluateTrial 호출로 이관한다. 4d9a4a9a4013ce8095a53b150b5202796b635ea1771c1143571453afa1f6bd63 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_reduced_shell_test.cpp support@1739-1740 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_reduced_shell_test.cpp file-support 유지 Dev trial cache·context 변경·copy/move 소유권·실패 우선순위·left-association 검사를 복원한다. 같은 trial의 독립 local 평가만 ShellTrialElement::EvaluateTrial 호출로 이관한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 27개 tests/unit/analysis/hht_shell_physics_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b8a2dbd416d53e6807dba075bb2f98ee88c0331d5398840569823997248412c4 029bc0a2ece9780b1c904e966bf71a2a43741317000b7bd1ea3544c2d07968a1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.NodalRigidForceRatesMatchIndependentTimeDifferences HhtShellPhysics.NodalRigidForceRatesMatchIndependentTimeDifferences; assertion 2개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.NodalRigidForceRatesMatchIndependentTimeDifferences 유지 원문 검사 body 및 assertion 동일. 8e7bbb65a70d3694839108bc430e01ae3292d6b4ab980922f7c9577af3185f6c 8e7bbb65a70d3694839108bc430e01ae3292d6b4ab980922f7c9577af3185f6c ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1.0e-6) ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1.0e-6) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ExternalDrillingHessianBalancesGradientAcceleration HhtShellPhysics.ExternalDrillingHessianBalancesGradientAcceleration; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ExternalDrillingHessianBalancesGradientAcceleration 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e83c3c64a41a332d6dea5ac10002e9e4ff3915552778b2396731397294b40b0a 9456fd3f90ad9a3f30a93fd5e5d513eb2798f88ae63df197d1c0db7471c84a53 ASSERT_TRUE(external.HasValue()) | EXPECT_NEAR(external.Value().directional_second, -1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(gradient_acceleration, 1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(external.Value().directional_second + gradient_acceleration, 0.0, 1.0e-14) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(middle.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(finite_difference, external.Value().directional_second, 1.0e-8) ASSERT_TRUE(external.HasValue()) | EXPECT_NEAR(external.Value().directional_second, -1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(gradient_acceleration, 1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(external.Value().directional_second + gradient_acceleration, 0.0, 1.0e-14) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(middle.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(finite_difference, external.Value().directional_second, 1.0e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ManufacturedHiddenCountsExternalHessianOnce HhtShellPhysics.ManufacturedHiddenCountsExternalHessianOnce; assertion 2개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ManufacturedHiddenCountsExternalHessianOnce 유지 원문 검사 body 및 assertion 동일. 66c7a72b17bea62b6f47d56a3ad1c08c66eec8169ebaaa0adcdc71e7b85a892c 66c7a72b17bea62b6f47d56a3ad1c08c66eec8169ebaaa0adcdc71e7b85a892c ASSERT_GT(scale, 0.0) | EXPECT_LE(std::abs(balance.hidden_acceleration_defect[node] - expected) / scale, 1.0e-12) ASSERT_GT(scale, 0.0) | EXPECT_LE(std::abs(balance.hidden_acceleration_defect[node] - expected) / scale, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum; assertion 14개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum 유지 원문 검사 body 및 assertion 동일. fcb752c10cea7eb76dfcbb5e2035bb3eb8392589fafa6e8673656dd5ecfe934f fcb752c10cea7eb76dfcbb5e2035bb3eb8392589fafa6e8673656dd5ecfe934f EXPECT_LE(difference.Norm() / oracle.force.Norm(), 1.0e-12) | EXPECT_LE(std::abs(assembly.frame.kinetic_energy - static_cast(oracle.kinetic)) / static_cast(oracle.kinetic), 1.0e-12) | EXPECT_LE(std::abs(oracle.force.Dot(exact.velocity) - static_cast(oracle.power)) / static_cast(oracle.power_scale), 1.0e-10) | EXPECT_LE(assembly.frame.physical_strain_energy / 800.0, 1.0e-10) | EXPECT_LE(assembly.frame.drilling_energy / 800.0, 1.0e-10) | EXPECT_DOUBLE_EQ(scaled_force.Norm(), 0.0) | EXPECT_LE(scaled_force.Norm() / force_scale, 1.0e-10) | EXPECT_LE(momentum_error / static_cast(oracle.momentum_scale), 1.0e-12) | EXPECT_LE( angular_error / static_cast(oracle.angular_momentum_scale), 1.0e-12) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_LE(value / scale, 1.0e-10) | EXPECT_TRUE(fesa::hht_internal::CompleteEquilibrium( *fixture.domain, fixture.dofs, assembly, &balance) .IsOk()) | EXPECT_LE(assembly.mass.Multiply(null).Norm() / mass_norm, 1.0e-12) | EXPECT_GT(maximum_rotation, 0.5) EXPECT_LE(difference.Norm() / oracle.force.Norm(), 1.0e-12) | EXPECT_LE(std::abs(assembly.frame.kinetic_energy - static_cast(oracle.kinetic)) / static_cast(oracle.kinetic), 1.0e-12) | EXPECT_LE(std::abs(oracle.force.Dot(exact.velocity) - static_cast(oracle.power)) / static_cast(oracle.power_scale), 1.0e-10) | EXPECT_LE(assembly.frame.physical_strain_energy / 800.0, 1.0e-10) | EXPECT_LE(assembly.frame.drilling_energy / 800.0, 1.0e-10) | EXPECT_DOUBLE_EQ(scaled_force.Norm(), 0.0) | EXPECT_LE(scaled_force.Norm() / force_scale, 1.0e-10) | EXPECT_LE(momentum_error / static_cast(oracle.momentum_scale), 1.0e-12) | EXPECT_LE( angular_error / static_cast(oracle.angular_momentum_scale), 1.0e-12) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_LE(value / scale, 1.0e-10) | EXPECT_TRUE(fesa::hht_internal::CompleteEquilibrium( *fixture.domain, fixture.dofs, assembly, &balance) .IsOk()) | EXPECT_LE(assembly.mass.Multiply(null).Norm() / mass_norm, 1.0e-12) | EXPECT_GT(maximum_rotation, 0.5) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisCoefficientRadiusSurvivesSparseProjectionAndLift HhtShellPhysics.BasisCoefficientRadiusSurvivesSparseProjectionAndLift; assertion 4개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisCoefficientRadiusSurvivesSparseProjectionAndLift 유지 원문 검사 body 및 assertion 동일. 28a447ddb306564c9364deaf08aacaeeb7189e3b604a6c594230eae915501a84 28a447ddb306564c9364deaf08aacaeeb7189e3b604a6c594230eae915501a84 EXPECT_GT(lifted[3U], 0.0) | EXPECT_GE(lifted[4U], 4.0 * 0x1p-53) | EXPECT_GE(lifted[5U], 4.0 * 0x1p-53) | EXPECT_GT(projected[0U], 2.0 * 0x1p-53) EXPECT_GT(lifted[3U], 0.0) | EXPECT_GE(lifted[4U], 4.0 * 0x1p-53) | EXPECT_GE(lifted[5U], 4.0 * 0x1p-53) | EXPECT_GT(projected[0U], 2.0 * 0x1p-53) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisRadiusReplayMatchesCompensatedProjectionAndCombinedLift HhtShellPhysics.BasisRadiusReplayMatchesCompensatedProjectionAndCombinedLift; assertion 11개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisRadiusReplayMatchesCompensatedProjectionAndCombinedLift 유지 원문 검사 body 및 assertion 동일. 31474d755fe7fa0af870a6fbb2bbba642858fd2250d3d8c7e01158e109379958 31474d755fe7fa0af870a6fbb2bbba642858fd2250d3d8c7e01158e109379958 EXPECT_DOUBLE_EQ(projected[0U], 1.0) | EXPECT_DOUBLE_EQ(projection_center[0U], projected[0U]) | EXPECT_GT(projection_radius[0U], 0.0) | EXPECT_DOUBLE_EQ(lifted[0U], 1.0) | EXPECT_DOUBLE_EQ(replay.center[0U], lifted[0U]) | EXPECT_DOUBLE_EQ(plain, 0.0) | EXPECT_GE(target_radius, 0.25) | EXPECT_DOUBLE_EQ(small_replay.center[0U], small_lifted[0U]) | EXPECT_DOUBLE_EQ(small_replay.center[0U], 1.0) | ASSERT_LT(small_replay.radius[0U], 0.25) | EXPECT_GE(small_target_radius, 0.25) EXPECT_DOUBLE_EQ(projected[0U], 1.0) | EXPECT_DOUBLE_EQ(projection_center[0U], projected[0U]) | EXPECT_GT(projection_radius[0U], 0.0) | EXPECT_DOUBLE_EQ(lifted[0U], 1.0) | EXPECT_DOUBLE_EQ(replay.center[0U], lifted[0U]) | EXPECT_DOUBLE_EQ(plain, 0.0) | EXPECT_GE(target_radius, 0.25) | EXPECT_DOUBLE_EQ(small_replay.center[0U], small_lifted[0U]) | EXPECT_DOUBLE_EQ(small_replay.center[0U], 1.0) | ASSERT_LT(small_replay.radius[0U], 0.25) | EXPECT_GE(small_target_radius, 0.25) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisLiftedAlgorithmicCorrectionUsesHhtFilterFactor HhtShellPhysics.BasisLiftedAlgorithmicCorrectionUsesHhtFilterFactor; assertion 3개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisLiftedAlgorithmicCorrectionUsesHhtFilterFactor 유지 원문 검사 body 및 assertion 동일. 1135c210293ec3de4a84aed758353386e122ef4db703182ee03e2b48fca4340c 1135c210293ec3de4a84aed758353386e122ef4db703182ee03e2b48fca4340c EXPECT_NEAR(projected[0U], delta_ar, 1.0e-15) | ASSERT_GT(omission_scale, 0.0) | EXPECT_GT(std::abs(omitted[0U] - delta_ar) / omission_scale, 1.0e-12) EXPECT_NEAR(projected[0U], delta_ar, 1.0e-15) | ASSERT_GT(omission_scale, 0.0) | EXPECT_GT(std::abs(omitted[0U] - delta_ar) / omission_scale, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CarriedArRadiiIncludeAbsorbedUpdatesAndInputHistory HhtShellPhysics.CarriedArRadiiIncludeAbsorbedUpdatesAndInputHistory; assertion 10개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CarriedArRadiiIncludeAbsorbedUpdatesAndInputHistory 유지 원문 검사 body 및 assertion 동일. b6ca11dc0cf68db6fc9d0a966480453e8c85dff9d3588962557189cb91cf455b b6ca11dc0cf68db6fc9d0a966480453e8c85dff9d3588962557189cb91cf455b ASSERT_EQ(std::fegetround(), FE_TONEAREST) | ASSERT_DOUBLE_EQ(doubled, 2.0 * std::numeric_limits::denorm_min()) | ASSERT_DOUBLE_EQ(rounded, 1.0) | EXPECT_GE(first, tiny) | EXPECT_GT(second, first) | EXPECT_GE(second, 2.0 * tiny) | EXPECT_GE(ProductRadius(2.0, tiny, 4.0, tiny), 6.0 * tiny) | EXPECT_GE(QuotientRadius(1.0, tiny, 2.0, 0.0), 0.5 * tiny) | EXPECT_THROW(QuotientRadius(1.0, 0.0, 1.0, 1.0), std::runtime_error) | EXPECT_TRUE(std::isinf(AddRadius(std::numeric_limits::max(), std::numeric_limits::max(), 0.0))) ASSERT_EQ(std::fegetround(), FE_TONEAREST) | ASSERT_DOUBLE_EQ(doubled, 2.0 * std::numeric_limits::denorm_min()) | ASSERT_DOUBLE_EQ(rounded, 1.0) | EXPECT_GE(first, tiny) | EXPECT_GT(second, first) | EXPECT_GE(second, 2.0 * tiny) | EXPECT_GE(ProductRadius(2.0, tiny, 4.0, tiny), 6.0 * tiny) | EXPECT_GE(QuotientRadius(1.0, tiny, 2.0, 0.0), 0.5 * tiny) | EXPECT_THROW(QuotientRadius(1.0, 0.0, 1.0, 1.0), std::runtime_error) | EXPECT_TRUE(std::isinf(AddRadius(std::numeric_limits::max(), std::numeric_limits::max(), 0.0))) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PrimaryCoordinateRetainsCorrectionAbsorbedByCarriedAr HhtShellPhysics.PrimaryCoordinateRetainsCorrectionAbsorbedByCarriedAr; assertion 6개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PrimaryCoordinateRetainsCorrectionAbsorbedByCarriedAr 유지 원문 검사 body 및 assertion 동일. 4b84aaf12146380cfb61eeebe617e119bce3a1155aa3ea45d9c020bda2c1cb42 4b84aaf12146380cfb61eeebe617e119bce3a1155aa3ea45d9c020bda2c1cb42 EXPECT_DOUBLE_EQ(pp + factor * next_ar, initial_p) | EXPECT_GT(next_p, initial_p) | EXPECT_DOUBLE_EQ(next_p - initial_p, delta_p) | EXPECT_LE(std::abs(next_p - (pp + factor * next_ar)) / scale, 1.0e-12) | EXPECT_GT(first_radius, inherited_radius) | EXPECT_GT(AddRadius(next_p + delta_p, first_radius, 0.0), first_radius) EXPECT_DOUBLE_EQ(pp + factor * next_ar, initial_p) | EXPECT_GT(next_p, initial_p) | EXPECT_DOUBLE_EQ(next_p - initial_p, delta_p) | EXPECT_LE(std::abs(next_p - (pp + factor * next_ar)) / scale, 1.0e-12) | EXPECT_GT(first_radius, inherited_radius) | EXPECT_GT(AddRadius(next_p + delta_p, first_radius, 0.0), first_radius) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CompensatedCoordinateRetainsAbsorbedNewtonCorrections HhtShellPhysics.CompensatedCoordinateRetainsAbsorbedNewtonCorrections; assertion 12개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CompensatedCoordinateRetainsAbsorbedNewtonCorrections 유지 원문 검사 body 및 assertion 동일. f9679eaf06ac657dba93fb8d8bcd5d4b9942deb7d677c1fe4ffe86fc6f7fd072 f9679eaf06ac657dba93fb8d8bcd5d4b9942deb7d677c1fe4ffe86fc6f7fd072 EXPECT_DOUBLE_EQ(high, 1.0) | EXPECT_DOUBLE_EQ(low, delta) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_GT(radius, inherited_radius) | EXPECT_GE(UpSum(radius, std::abs(low)), inherited_radius) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, -delta) | EXPECT_DOUBLE_EQ(high, 2.0 * std::numeric_limits::denorm_min()) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_FALSE(std::isfinite(high)) | EXPECT_FALSE(std::isfinite(radius)) EXPECT_DOUBLE_EQ(high, 1.0) | EXPECT_DOUBLE_EQ(low, delta) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_GT(radius, inherited_radius) | EXPECT_GE(UpSum(radius, std::abs(low)), inherited_radius) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, -delta) | EXPECT_DOUBLE_EQ(high, 2.0 * std::numeric_limits::denorm_min()) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_FALSE(std::isfinite(high)) | EXPECT_FALSE(std::isfinite(radius)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.FrozenGraphIndicatorIncludesCoordinateAndRateCurvature HhtShellPhysics.FrozenGraphIndicatorIncludesCoordinateAndRateCurvature; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.FrozenGraphIndicatorIncludesCoordinateAndRateCurvature 유지 원문 검사 body 및 assertion 동일. 5f98ecd78623006a570c8acf4c252ad547abf5c9d490d0888e9ec4ccb39baa08 5f98ecd78623006a570c8acf4c252ad547abf5c9d490d0888e9ec4ccb39baa08 EXPECT_GE(indicator.coordinates[1U], 2.0e-6) | EXPECT_GE(indicator.velocity[1U], 2.0e-6 + 2.0e-7) | EXPECT_GE(indicator.acceleration[1U], 4.0e-6 + 4.0e-7 + 2.0e-8) | EXPECT_TRUE(std::isfinite(indicator.acceleration[1U])) | EXPECT_GE(indicator.algorithmic_acceleration[1U], (1.0 + parameters.alpha) * indicator.acceleration[1U]) | EXPECT_TRUE(std::isinf(unresolved.coordinates[1U])) | EXPECT_TRUE(std::isinf(unresolved.velocity[1U])) | EXPECT_TRUE(std::isinf(unresolved.acceleration[1U])) EXPECT_GE(indicator.coordinates[1U], 2.0e-6) | EXPECT_GE(indicator.velocity[1U], 2.0e-6 + 2.0e-7) | EXPECT_GE(indicator.acceleration[1U], 4.0e-6 + 4.0e-7 + 2.0e-8) | EXPECT_TRUE(std::isfinite(indicator.acceleration[1U])) | EXPECT_GE(indicator.algorithmic_acceleration[1U], (1.0 + parameters.alpha) * indicator.acceleration[1U]) | EXPECT_TRUE(std::isinf(unresolved.coordinates[1U])) | EXPECT_TRUE(std::isinf(unresolved.velocity[1U])) | EXPECT_TRUE(std::isinf(unresolved.acceleration[1U])) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.GraphBasisCertificateBoundsMatrixAndRhsPerturbations HhtShellPhysics.GraphBasisCertificateBoundsMatrixAndRhsPerturbations; assertion 13개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.GraphBasisCertificateBoundsMatrixAndRhsPerturbations 유지 원문 검사 body 및 assertion 동일. d620963924f330ab1f029380440d739230f3c3341475bcdbf97a3453f7fe5339 d620963924f330ab1f029380440d739230f3c3341475bcdbf97a3453f7fe5339 ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[0U] - center[0U]), bound[0U]) | EXPECT_GT(bound[0U], 0.0) | EXPECT_GE(centered[0U], std::ldexp(1.0, -30)) | EXPECT_EQ(UpProduct(0.0, std::numeric_limits::infinity()), 0.0) | EXPECT_TRUE(std::isinf(UpProduct(0.0, std::numeric_limits::quiet_NaN()))) | EXPECT_FALSE(CertifyGraphInverse(products, &solver).complete) | EXPECT_THROW(BoundGraphSolution(products, inverse, rhs, fesa::Vector(1U), center), std::runtime_error) | ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[i] - center[i]), bound[i]) | EXPECT_GT(bound[i], 9.0) | ASSERT_TRUE(invalid_inverse.complete) | EXPECT_THROW(BoundGraphSolution(products, invalid_inverse, rhs, fesa::Vector(4U), center), std::runtime_error) ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[0U] - center[0U]), bound[0U]) | EXPECT_GT(bound[0U], 0.0) | EXPECT_GE(centered[0U], std::ldexp(1.0, -30)) | EXPECT_EQ(UpProduct(0.0, std::numeric_limits::infinity()), 0.0) | EXPECT_TRUE(std::isinf(UpProduct(0.0, std::numeric_limits::quiet_NaN()))) | EXPECT_FALSE(CertifyGraphInverse(products, &solver).complete) | EXPECT_THROW(BoundGraphSolution(products, inverse, rhs, fesa::Vector(1U), center), std::runtime_error) | ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[i] - center[i]), bound[i]) | EXPECT_GT(bound[i], 9.0) | ASSERT_TRUE(invalid_inverse.complete) | EXPECT_THROW(BoundGraphSolution(products, invalid_inverse, rhs, fesa::Vector(4U), center), std::runtime_error) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedLastSolvePreservesOmittedTranslationDefect HhtShellPhysics.RestrictedLastSolvePreservesOmittedTranslationDefect; assertion 10개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedLastSolvePreservesOmittedTranslationDefect 유지 원문 검사 body 및 assertion 동일. c779af538471833c822bd7697c9114c63dcca6dbaa3ba7953dd8abadf7c306f2 c779af538471833c822bd7697c9114c63dcca6dbaa3ba7953dd8abadf7c306f2 ASSERT_TRUE(reduced::ShouldRefineAngular(chart, {0.0, 1.0}, {0.0, 0.0, 0.0, 0.0}, true)) | ASSERT_TRUE(selected.angular_only) | ASSERT_EQ(selected.full_indices, std::vector({1U})) | EXPECT_EQ(embedded[0U], 0.0) | EXPECT_EQ(embedded[1U], 1.0) | EXPECT_EQ(selected_residual[0U] - selected.rhs[0U], 0.0) | EXPECT_EQ(full_defect[0U], -2.0) | EXPECT_EQ(full_defect[1U], 0.0) | EXPECT_GT(std::abs(full_model[0U]), 0.0) | EXPECT_GT(std::abs(full_model[1U]), 0.0) ASSERT_TRUE(reduced::ShouldRefineAngular(chart, {0.0, 1.0}, {0.0, 0.0, 0.0, 0.0}, true)) | ASSERT_TRUE(selected.angular_only) | ASSERT_EQ(selected.full_indices, std::vector({1U})) | EXPECT_EQ(embedded[0U], 0.0) | EXPECT_EQ(embedded[1U], 1.0) | EXPECT_EQ(selected_residual[0U] - selected.rhs[0U], 0.0) | EXPECT_EQ(full_defect[0U], -2.0) | EXPECT_EQ(full_defect[1U], 0.0) | EXPECT_GT(std::abs(full_model[0U]), 0.0) | EXPECT_GT(std::abs(full_model[1U]), 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedRecordNoiseIncludesFullModelOmittedUDefect HhtShellPhysics.RestrictedRecordNoiseIncludesFullModelOmittedUDefect; assertion 6개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedRecordNoiseIncludesFullModelOmittedUDefect 유지 원문 검사 body 및 assertion 동일. 2deecf4d898da2c40d311b18173e7ae7a11f75f87024cc2f64e1cf63d0caedd1 2deecf4d898da2c40d311b18173e7ae7a11f75f87024cc2f64e1cf63d0caedd1 ASSERT_LT(u, chart.p_columns.size()) | ASSERT_LT(angular, chart.p_columns.size()) | ASSERT_EQ(restricted_selected.full_indices, baseline_selected.full_indices) | ASSERT_NE(full_defect[u], 0.0) | EXPECT_GT(mapped_model.coordinate.Norm(), 0.0) | EXPECT_GT(restricted_noise, baseline_noise) ASSERT_LT(u, chart.p_columns.size()) | ASSERT_LT(angular, chart.p_columns.size()) | ASSERT_EQ(restricted_selected.full_indices, baseline_selected.full_indices) | ASSERT_NE(full_defect[u], 0.0) | EXPECT_GT(mapped_model.coordinate.Norm(), 0.0) | EXPECT_GT(restricted_noise, baseline_noise) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit; assertion 16개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit 유지 원문 검사 body 및 assertion 동일. 9bc51b902d77a1dbb6f75c292ca75f05e1bf8beb71bc73aef1176005d73804fd 9bc51b902d77a1dbb6f75c292ca75f05e1bf8beb71bc73aef1176005d73804fd ASSERT_EQ(grid.history.size(), 65U) | EXPECT_DOUBLE_EQ(grid.history.front().generalized_coordinates[i], exact.generalized_coordinates[i]) | EXPECT_DOUBLE_EQ(grid.history.front().velocity[i], exact.velocity[i]) | EXPECT_DOUBLE_EQ(grid.history.front().acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(grid.history.front().algorithmic_acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(frame.time, static_cast(index) / 64.0) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.generalized_coordinates.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.velocity.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.acceleration.Size(), fixture.dofs.FullDofCount()) | EXPECT_TRUE(std::isfinite((*channel)[i])) | EXPECT_LE(residual, 1.0e-10) | EXPECT_TRUE(std::isfinite((*defect)[i])) | EXPECT_EQ(grid.history.back().time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(grid.history.back().time, 1.0) | EXPECT_GT(grid.maximum_rotation, 0.5) ASSERT_EQ(grid.history.size(), 65U) | EXPECT_DOUBLE_EQ(grid.history.front().generalized_coordinates[i], exact.generalized_coordinates[i]) | EXPECT_DOUBLE_EQ(grid.history.front().velocity[i], exact.velocity[i]) | EXPECT_DOUBLE_EQ(grid.history.front().acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(grid.history.front().algorithmic_acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(frame.time, static_cast(index) / 64.0) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.generalized_coordinates.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.velocity.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.acceleration.Size(), fixture.dofs.FullDofCount()) | EXPECT_TRUE(std::isfinite((*channel)[i])) | EXPECT_LE(residual, 1.0e-10) | EXPECT_TRUE(std::isfinite((*defect)[i])) | EXPECT_EQ(grid.history.back().time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(grid.history.back().time, 1.0) | EXPECT_GT(grid.maximum_rotation, 0.5) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence; assertion 15개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence 유지 원문 검사 body 및 assertion 동일. 19dc62f139091fea4190eb7e7034119c9b725c4e46570f8acb6af9d590471c22 19dc62f139091fea4190eb7e7034119c9b725c4e46570f8acb6af9d590471c22 EXPECT_GT(grid.maximum_rotation, 0.5) | ASSERT_EQ(frame.hidden_velocity_defect.Size(), fixture.domain->Nodes().size()) | ASSERT_EQ(frame.hidden_velocity_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_TRUE(std::isfinite(values.first)) | ASSERT_TRUE(std::isfinite(values.second)) | ASSERT_GE(values.second, 0.0) | EXPECT_DOUBLE_EQ(values.first, 0.0) | EXPECT_LE(std::abs(values.first) / values.second, 1.0e-10) | EXPECT_LE(errors.back()[channel], 1.0e-4) | ASSERT_GT(errors[grid][channel], 0.0) | ASSERT_GT(errors[grid + 1U][channel], 0.0) | EXPECT_GE(std::log2(errors[grid][channel] / errors[grid + 1U][channel]), 1.8) | EXPECT_GT(errors[grid][channel], 100.0 * std::max(grids[grid].solve_noise[channel], grids[grid].arithmetic_noise[channel])) EXPECT_GT(grid.maximum_rotation, 0.5) | ASSERT_EQ(frame.hidden_velocity_defect.Size(), fixture.domain->Nodes().size()) | ASSERT_EQ(frame.hidden_velocity_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_TRUE(std::isfinite(values.first)) | ASSERT_TRUE(std::isfinite(values.second)) | ASSERT_GE(values.second, 0.0) | EXPECT_DOUBLE_EQ(values.first, 0.0) | EXPECT_LE(std::abs(values.first) / values.second, 1.0e-10) | EXPECT_LE(errors.back()[channel], 1.0e-4) | ASSERT_GT(errors[grid][channel], 0.0) | ASSERT_GT(errors[grid + 1U][channel], 0.0) | EXPECT_GE(std::log2(errors[grid][channel] / errors[grid + 1U][channel]), 1.8) | EXPECT_GT(errors[grid][channel], 100.0 * std::max(grids[grid].solve_noise[channel], grids[grid].arithmetic_noise[channel])) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bInitialPhysicalSpectrumProbe HhtShellPhysics.C08bInitialPhysicalSpectrumProbe; assertion 4개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bInitialPhysicalSpectrumProbe 유지 원문 검사 body 및 assertion 동일. 7673da377048ad5e617480ff75b5ef812d216306aa82ee6bd55e576582ea3551 7673da377048ad5e617480ff75b5ef812d216306aa82ee6bd55e576582ea3551 ASSERT_EQ(matrix.Rows(), 54U) | ASSERT_EQ(matrix.Columns(), 54U) | ASSERT_EQ(matrix.RowOffsets().size(), 55U) | ASSERT_LT(column, values.size()) ASSERT_EQ(matrix.Rows(), 54U) | ASSERT_EQ(matrix.Columns(), 54U) | ASSERT_EQ(matrix.RowOffsets().size(), 55U) | ASSERT_LT(column, values.size()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid; assertion 4개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid 유지 원문 검사 body 및 assertion 동일. 874c85b16464eb1986a4f6579949282d69aec903ef832d63d9212c6eb545d4f0 874c85b16464eb1986a4f6579949282d69aec903ef832d63d9212c6eb545d4f0 ASSERT_EQ(evidence.history.size(), 65U) | EXPECT_DOUBLE_EQ(evidence.history.back().time, kEndTime) | EXPECT_GE(evidence.maximum_rotation, 0.2) | EXPECT_LT(evidence.maximum_rotation, std::acos(-1.0)) ASSERT_EQ(evidence.history.size(), 65U) | EXPECT_DOUBLE_EQ(evidence.history.back().time, kEndTime) | EXPECT_GE(evidence.maximum_rotation, 0.2) | EXPECT_LT(evidence.maximum_rotation, std::acos(-1.0)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants; assertion 11개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants 유지 원문 검사 body 및 assertion 동일. 33dea1e6e2f44f6945fb386065b0319493f3658f049437474babe90c53736d20 33dea1e6e2f44f6945fb386065b0319493f3658f049437474babe90c53736d20 EXPECT_GE(grids.back().maximum_rotation, 0.2) | EXPECT_LE(differences.back()[channel], 1.0e-4) | ASSERT_GT(first, 0.0) | ASSERT_GT(second, 0.0) | EXPECT_GE(first / second, threshold) | EXPECT_GT(differences[pair][channel], 100.0 * noise) | EXPECT_LT(grids[final - 1U].*member, grids[final - 2U].*member) | EXPECT_LT(grids[final].*member, grids[final - 1U].*member) | EXPECT_LE(grids[final].*member, 0.6 * (grids[final - 1U].*member)) | EXPECT_LE(grids[final].*member, 1.0e-3) | EXPECT_LE(grids.back().momentum_error, 1.0e-3) EXPECT_GE(grids.back().maximum_rotation, 0.2) | EXPECT_LE(differences.back()[channel], 1.0e-4) | ASSERT_GT(first, 0.0) | ASSERT_GT(second, 0.0) | EXPECT_GE(first / second, threshold) | EXPECT_GT(differences[pair][channel], 100.0 * noise) | EXPECT_LT(grids[final - 1U].*member, grids[final - 2U].*member) | EXPECT_LT(grids[final].*member, grids[final - 1U].*member) | EXPECT_LE(grids[final].*member, 0.6 * (grids[final - 1U].*member)) | EXPECT_LE(grids[final].*member, 1.0e-3) | EXPECT_LE(grids.back().momentum_error, 1.0e-3) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.FrozenNearestCoordinatesPassPairArithmeticWithoutChangingHigh HhtReducedIncrement.FrozenNearestCoordinatesPassPairArithmeticWithoutChangingHigh; assertion 7개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.FrozenNearestCoordinatesPassPairArithmeticWithoutChangingHigh 유지 원문 검사 body 및 assertion 동일. ba5a3f724636ab75d38249cfc9c5583f72f8a08b3c0d67109c843892031a85d2 ba5a3f724636ab75d38249cfc9c5583f72f8a08b3c0d67109c843892031a85d2 EXPECT_TRUE(first.storage_pass) | EXPECT_TRUE(first.arithmetic_pass) | EXPECT_EQ(first.defect, 0.0) | EXPECT_TRUE(worst.storage_pass) | EXPECT_TRUE(worst.arithmetic_pass) | EXPECT_EQ(worst.defect, 0.0) | EXPECT_FALSE(missing_low.arithmetic_pass) EXPECT_TRUE(first.storage_pass) | EXPECT_TRUE(first.arithmetic_pass) | EXPECT_EQ(first.defect, 0.0) | EXPECT_TRUE(worst.storage_pass) | EXPECT_TRUE(worst.arithmetic_pass) | EXPECT_EQ(worst.defect, 0.0) | EXPECT_FALSE(missing_low.arithmetic_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.StorageRequiresNearestEvenIncludingBothMidpointDirections HhtReducedIncrement.StorageRequiresNearestEvenIncludingBothMidpointDirections; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.StorageRequiresNearestEvenIncludingBothMidpointDirections 유지 원문 검사 body 및 assertion 동일. 01ead07c8dcec86cc541b6c45ad646cb7c1d2dd4d9eef28ba89436d7082a2954 01ead07c8dcec86cc541b6c45ad646cb7c1d2dd4d9eef28ba89436d7082a2954 EXPECT_TRUE(reduced::CheckPairIncrement(1.0, half_upper_spacing, 1.0, {half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(1.0, -std::ldexp(1.0, -54), 1.0, {-std::ldexp(1.0, -54)}, std::ldexp(1.0, -54)).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(-1.0, -half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(odd_tie.arithmetic_pass) | EXPECT_FALSE(odd_tie.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(-odd, half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(misplaced_high.arithmetic_pass) | EXPECT_FALSE(misplaced_high.storage_pass) EXPECT_TRUE(reduced::CheckPairIncrement(1.0, half_upper_spacing, 1.0, {half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(1.0, -std::ldexp(1.0, -54), 1.0, {-std::ldexp(1.0, -54)}, std::ldexp(1.0, -54)).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(-1.0, -half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(odd_tie.arithmetic_pass) | EXPECT_FALSE(odd_tie.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(-odd, half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(misplaced_high.arithmetic_pass) | EXPECT_FALSE(misplaced_high.storage_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.WholeUpdateAndIndependentTraceRejectMissingCorrection HhtReducedIncrement.WholeUpdateAndIndependentTraceRejectMissingCorrection; assertion 5개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.WholeUpdateAndIndependentTraceRejectMissingCorrection 유지 원문 검사 body 및 assertion 동일. 262933302f3210cf4380812f75addf653e952d4ba8595c66d7d3b5772c59b6b5 262933302f3210cf4380812f75addf653e952d4ba8595c66d7d3b5772c59b6b5 EXPECT_TRUE(valid_whole.arithmetic_pass && valid_whole.storage_pass) | EXPECT_TRUE(valid_trace.arithmetic_pass && valid_trace.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {correction, 0.0, correction}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, -2.0 * correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) EXPECT_TRUE(valid_whole.arithmetic_pass && valid_whole.storage_pass) | EXPECT_TRUE(valid_trace.arithmetic_pass && valid_trace.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {correction, 0.0, correction}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, -2.0 * correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ExactThresholdRejectsTailHiddenByRoundedRatio HhtReducedIncrement.ExactThresholdRejectsTailHiddenByRoundedRatio; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ExactThresholdRejectsTailHiddenByRoundedRatio 유지 원문 검사 body 및 assertion 동일. a91408b59790f93c59b20fc737d66f81ae8f8cfe1e8502b13836b5ad0efbb24e a91408b59790f93c59b20fc737d66f81ae8f8cfe1e8502b13836b5ad0efbb24e EXPECT_TRUE(equality.arithmetic_pass) | EXPECT_EQ(above.ratio, threshold) | EXPECT_FALSE(above.arithmetic_pass) | EXPECT_EQ(above_decimal.ratio, threshold) | EXPECT_FALSE(above_decimal.arithmetic_pass) | EXPECT_TRUE(below.arithmetic_pass) | EXPECT_TRUE(maximum.arithmetic_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) EXPECT_TRUE(equality.arithmetic_pass) | EXPECT_EQ(above.ratio, threshold) | EXPECT_FALSE(above.arithmetic_pass) | EXPECT_EQ(above_decimal.ratio, threshold) | EXPECT_FALSE(above_decimal.arithmetic_pass) | EXPECT_TRUE(below.arithmetic_pass) | EXPECT_TRUE(maximum.arithmetic_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ZeroScaleAndSubnormalArithmeticRemainExact HhtReducedIncrement.ZeroScaleAndSubnormalArithmeticRemainExact; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ZeroScaleAndSubnormalArithmeticRemainExact 유지 원문 검사 body 및 assertion 동일. 6c6c8a54ef0f513faca05e189ae080d712597fbe859edf9c0df7169058d7086d 6c6c8a54ef0f513faca05e189ae080d712597fbe859edf9c0df7169058d7086d EXPECT_TRUE(zero.arithmetic_pass && zero.storage_pass) | EXPECT_TRUE(fixed_zero.arithmetic_pass && fixed_zero.storage_pass) | EXPECT_TRUE(tiny_valid.arithmetic_pass && tiny_valid.storage_pass) | EXPECT_EQ(tiny_valid.defect, 0.0) | EXPECT_TRUE(tiny_nonzero.storage_pass) | EXPECT_FALSE(tiny_nonzero.arithmetic_pass) | EXPECT_EQ(tiny_nonzero.defect, tiny) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, tiny, 0.0, {tiny}, tiny).storage_pass) EXPECT_TRUE(zero.arithmetic_pass && zero.storage_pass) | EXPECT_TRUE(fixed_zero.arithmetic_pass && fixed_zero.storage_pass) | EXPECT_TRUE(tiny_valid.arithmetic_pass && tiny_valid.storage_pass) | EXPECT_EQ(tiny_valid.defect, 0.0) | EXPECT_TRUE(tiny_nonzero.storage_pass) | EXPECT_FALSE(tiny_nonzero.arithmetic_pass) | EXPECT_EQ(tiny_nonzero.defect, tiny) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, tiny, 0.0, {tiny}, tiny).storage_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.NonfiniteAndOverflowFailBeforeAcceptance HhtReducedIncrement.NonfiniteAndOverflowFailBeforeAcceptance; assertion 9개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.NonfiniteAndOverflowFailBeforeAcceptance 유지 원문 검사 body 및 assertion 동일. fb5fe44c1510d94b22e68a48f545271af54787ba6f38e7d57105f584b02eda1f fb5fe44c1510d94b22e68a48f545271af54787ba6f38e7d57105f584b02eda1f EXPECT_FALSE(reduced::CheckPairIncrement(invalid, 0.0, 0.0, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, invalid, 0.0, {0.0}, 0.0).storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, invalid, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {invalid}, 1.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {0.0}, invalid).arithmetic_pass) | EXPECT_FALSE(overflow.arithmetic_pass) | EXPECT_FALSE(overflow.storage_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) | EXPECT_FALSE(unsupported.storage_pass) EXPECT_FALSE(reduced::CheckPairIncrement(invalid, 0.0, 0.0, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, invalid, 0.0, {0.0}, 0.0).storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, invalid, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {invalid}, 1.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {0.0}, invalid).arithmetic_pass) | EXPECT_FALSE(overflow.arithmetic_pass) | EXPECT_FALSE(overflow.storage_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) | EXPECT_FALSE(unsupported.storage_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.AllowsEvaluationAfterCorrection100ButNeverCorrection101 HhtReducedLifecycle.AllowsEvaluationAfterCorrection100ButNeverCorrection101; assertion 7개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.AllowsEvaluationAfterCorrection100ButNeverCorrection101 유지 원문 검사 body 및 assertion 동일. 60a86b1cfb0b9cc5f37aec09bacc49496468028cdff28ddf5010a1f482add364 60a86b1cfb0b9cc5f37aec09bacc49496468028cdff28ddf5010a1f482add364 EXPECT_TRUE(CanApplyOuterCorrection(0U)) | EXPECT_TRUE(CanApplyOuterCorrection(99U)) | EXPECT_FALSE(CanApplyOuterCorrection(100U)) | EXPECT_FALSE(CanApplyOuterCorrection(101U)) | EXPECT_EQ(corrections, 100U) | EXPECT_EQ(last_evaluation, 100U) | EXPECT_EQ(accepted, accept_at_100) EXPECT_TRUE(CanApplyOuterCorrection(0U)) | EXPECT_TRUE(CanApplyOuterCorrection(99U)) | EXPECT_FALSE(CanApplyOuterCorrection(100U)) | EXPECT_FALSE(CanApplyOuterCorrection(101U)) | EXPECT_EQ(corrections, 100U) | EXPECT_EQ(last_evaluation, 100U) | EXPECT_EQ(accepted, accept_at_100) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.FailedExecutionDoesNotPublishCandidateOrContaminateRetry HhtReducedLifecycle.FailedExecutionDoesNotPublishCandidateOrContaminateRetry; assertion 18개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.FailedExecutionDoesNotPublishCandidateOrContaminateRetry 유지 원문 검사 body 및 assertion 동일. 200703a9b2cc195cf471123955a0f052d0732809a02789d894ab9df46002879a 200703a9b2cc195cf471123955a0f052d0732809a02789d894ab9df46002879a "ASSERT_TRUE(baseline.HasValue()) | ASSERT_EQ(baseline.Value().state.AcceptedFrames().size(), 3U) | EXPECT_GT(baseline.Value().state.AcceptedFrames()[1U].generalized_coordinates[0U], 0.0) | ASSERT_FALSE(failed.HasValue()) | EXPECT_EQ(failing.failures, 1U) | EXPECT_EQ(failed.GetStatus().Diagnostics().front().code, ""c10-injected-backend"") | EXPECT_NE(partial_log.find(""\tincrement=2\t""), std::string::npos) | EXPECT_NE(partial_log.find(""\toutcome=failed""), std::string::npos) | EXPECT_NE(ReadLifecycleLog(baseline_path).find(line + '\n'), std::string::npos) | EXPECT_EQ(line.find(""\tincrement=2\t""), std::string::npos) | ASSERT_TRUE(retry.HasValue()) | ASSERT_EQ(actual.size(), expected.size()) | EXPECT_EQ(actual[frame].frame_index, expected[frame].frame_index) | EXPECT_EQ(actual[frame].iteration_count, expected[frame].iteration_count) | EXPECT_EQ(actual[frame].time, expected[frame].time) | ASSERT_EQ(left.Size(), right.Size()) | EXPECT_EQ(left[i], right[i]) | EXPECT_EQ(ReadLifecycleLog(retry_path), ReadLifecycleLog(baseline_path))" "ASSERT_TRUE(baseline.HasValue()) | ASSERT_EQ(baseline.Value().state.AcceptedFrames().size(), 3U) | EXPECT_GT(baseline.Value().state.AcceptedFrames()[1U].generalized_coordinates[0U], 0.0) | ASSERT_FALSE(failed.HasValue()) | EXPECT_EQ(failing.failures, 1U) | EXPECT_EQ(failed.GetStatus().Diagnostics().front().code, ""c10-injected-backend"") | EXPECT_NE(partial_log.find(""\tincrement=2\t""), std::string::npos) | EXPECT_NE(partial_log.find(""\toutcome=failed""), std::string::npos) | EXPECT_NE(ReadLifecycleLog(baseline_path).find(line + '\n'), std::string::npos) | EXPECT_EQ(line.find(""\tincrement=2\t""), std::string::npos) | ASSERT_TRUE(retry.HasValue()) | ASSERT_EQ(actual.size(), expected.size()) | EXPECT_EQ(actual[frame].frame_index, expected[frame].frame_index) | EXPECT_EQ(actual[frame].iteration_count, expected[frame].iteration_count) | EXPECT_EQ(actual[frame].time, expected[frame].time) | ASSERT_EQ(left.Size(), right.Size()) | EXPECT_EQ(left[i], right[i]) | EXPECT_EQ(ReadLifecycleLog(retry_path), ReadLifecycleLog(baseline_path))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@1-528 helper/oracle/fixture/include/static assertion 구간: Message, Require, Add, Scale, Cross, Dot, Norm, Triple, Coordinates, Store, Fixture, MakeFixture, if, EmptyFrame, Evaluate, VolumeOracle, Integrate, OrbitChart, RigidOrbit, OrbitPhysicalRates, RigidForceRates, SparseNorm, ManufacturedHidden, CompleteManufacturedConstraints tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bff094dc63055b397162f08ce704ce39f346436a57378522c8c80557b71d9529 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@738-987 helper/oracle/fixture/include/static assertion 구간: InitializeNullVelocity, GridEvidence, RecoveredAcceleration, ArithmeticRadii, Up, UpSum, UpProduct, RoundoffRadius, AddRadius, ProductRadius, RateSumRadius, Add, Value, Radius, QuotientRadius, reduced, ProjectBasisRadii, AccumulateLiftBasisRadii, BasisLiftReplay, ReplayLiftBasisRadii, LiftBasisRadii tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 13a1ff8e33d6400d5bdcf494a3a6abe02fdbf33582c3f5de2ef4f71bf5bd18d7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@1137-1157 helper/oracle/fixture/include/static assertion 구간: AdditionLowPart, AdvanceCoordinate tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 61ed0abe9524b8e3099608f9f117ed4ed88fb40aa98039f13024486c80f3d640 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@1189-1673 helper/oracle/fixture/include/static assertion 구간: HhtCoordinateFactorRadius, RadiusNorm, GraphBasisProducts, GraphInverseCertificate, ContractGraphBasis, for, SparseFromDense, UpperRowSum, FiniteMatrix, FiniteNonnegativeMatrix, FiniteVector, FiniteNonnegativeVector, HasInfiniteRadius, FillInfinite, CertifyGraphInverse, AddPhysicalContractionRadius, BoundGraphSolution, GraphArithmeticIndicator, if tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b2e045bbe0fa0615cde9321d1f050fb0e003242df9c3c54c8ad5fa110caf906a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@1799-1929 helper/oracle/fixture/include/static assertion 구간: LastSolve, RecordNoise, for tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6b9392a417c11f51d48a97f27a0dc0542c4f005b1063414cb4b9403d1550a5e3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@2059-3079 helper/oracle/fixture/include/static assertion 구간: RecoverAcceleration, if, CompleteOriginalConstraints, RunPlate, for, Require, Trial, UpdateTrace, Differences, FrameError, RecoveredFrameError, RecoveredDifferences, AccelerationSplit tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 82a60a9bab9a1165f469ca2106a81e8e004ec8c859ea5301ab896f1da9329e8e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@3565-3600 helper/oracle/fixture/include/static assertion 구간: ReadLifecycleLog, FailAfterAcceptedIncrement, while, if tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fdaacc9c5e36ed4d024ff28652880353526b01b1ea8bb6ab1fb4b1a86e0279f5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_shell_physics_test.cpp support@3669-3670 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_temporal_verification_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/analysis/hht_temporal_verification_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 03565773d95b6bad350d360bb1b2b2489c81b19c5877a5c7bcc6362c951fb013 03565773d95b6bad350d360bb1b2b2489c81b19c5877a5c7bcc6362c951fb013 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C01MatchesConstantMassRecurrenceAndSecondOrder HhtTemporalVerification.C01MatchesConstantMassRecurrenceAndSecondOrder; assertion 1개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C01MatchesConstantMassRecurrenceAndSecondOrder 유지 원문 검사 body 및 assertion 동일. 17fe998913063fd19bb6401c48b979bf998384569d88bb14e42ce753c13ca7e6 17fe998913063fd19bb6401c48b979bf998384569d88bb14e42ce753c13ca7e6 EXPECT_LE(error.constant_mass_recurrence_difference, 1.0e-12) EXPECT_LE(error.constant_mass_recurrence_difference, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C03VariableMassIsSecondOrderAndNaiveWeightingIsNot HhtTemporalVerification.C03VariableMassIsSecondOrderAndNaiveWeightingIsNot; assertion 2개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C03VariableMassIsSecondOrderAndNaiveWeightingIsNot 유지 원문 검사 body 및 assertion 동일. c1215c7361ecf522a71c80084595558d3433a6afa624d162f76e2d3535f641f7 c1215c7361ecf522a71c80084595558d3433a6afa624d162f76e2d3535f641f7 EXPECT_GT(errors.back().auxiliary_difference, 0.0) | EXPECT_LT(order, 1.5) EXPECT_GT(errors.back().auxiliary_difference, 0.0) | EXPECT_LT(order, 1.5) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aCoupledMasslessCoordinatesHaveSecondOrder HhtTemporalVerification.C04aCoupledMasslessCoordinatesHaveSecondOrder; assertion 2개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aCoupledMasslessCoordinatesHaveSecondOrder 유지 원문 검사 body 및 assertion 동일. 3b88debb5cff0df98f0085bd9f58e4fc847d99251be567cee3fb1e277d42e2c0 3b88debb5cff0df98f0085bd9f58e4fc847d99251be567cee3fb1e277d42e2c0 EXPECT_LE(errors[grid].constant_mass_recurrence_difference, 1.0e-12) | EXPECT_LE(errors[grid].reduced_difference, 1.0e-10) EXPECT_LE(errors[grid].constant_mass_recurrence_difference, 1.0e-12) | EXPECT_LE(errors[grid].reduced_difference, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved; assertion 1개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved 유지 원문 검사 body 및 assertion 동일. 29e3b4fcb4310f058433aebe1547c1b5df41000e2e29b6cae9506c8dc4960555 29e3b4fcb4310f058433aebe1547c1b5df41000e2e29b6cae9506c8dc4960555 EXPECT_LE(error.reduced_difference, 1.0e-10) EXPECT_LE(error.reduced_difference, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04bFullCartesianMovingNullConverges HhtTemporalVerification.C04bFullCartesianMovingNullConverges; assertion 5개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04bFullCartesianMovingNullConverges 유지 원문 검사 body 및 assertion 동일. d6e5f3a57a0983661a209be99ff249fae0ce28d7343f1a2d0e74de29a2ccfc95 d6e5f3a57a0983661a209be99ff249fae0ce28d7343f1a2d0e74de29a2ccfc95 EXPECT_LE(error.position_constraint, 1.0e-10) | EXPECT_LT(errors[grid].hidden_velocity, errors[grid - 1U].hidden_velocity) | EXPECT_LT(errors[grid].hidden_acceleration, errors[grid - 1U].hidden_acceleration) | EXPECT_LE(errors.back().hidden_velocity, 1.0e-6) | EXPECT_LE(errors.back().hidden_acceleration, 1.0e-4) EXPECT_LE(error.position_constraint, 1.0e-10) | EXPECT_LT(errors[grid].hidden_velocity, errors[grid - 1U].hidden_velocity) | EXPECT_LT(errors[grid].hidden_acceleration, errors[grid - 1U].hidden_acceleration) | EXPECT_LE(errors.back().hidden_velocity, 1.0e-6) | EXPECT_LE(errors.back().hidden_acceleration, 1.0e-4) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_temporal_verification_test.cpp support@1-451 helper/oracle/fixture/include/static assertion 구간: Case, ExactState, Dimension, Exact, if, Amplitudes, Equation, Evaluate, Multiply, Solve, Effective, Errors, Integrate, Sweep tests/unit/analysis/hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c427466b945f2d0b9cbfec1a629323a8f2d81fd7574c29f611baa1e6c07860ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_temporal_verification_test.cpp support@506-507 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_time_integration_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/analysis/hht_time_integration_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 068a7d057ec10b7f70a883d56ad54bb12f20873028b3bd7c34a1eb5c29adce20 068a7d057ec10b7f70a883d56ad54bb12f20873028b3bd7c34a1eb5c29adce20 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.KeepsPhysicalAndAlgorithmicAccelerationDistinct HhtTimeIntegrationTest.KeepsPhysicalAndAlgorithmicAccelerationDistinct; assertion 6개 tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.KeepsPhysicalAndAlgorithmicAccelerationDistinct 유지 원문 검사 body 및 assertion 동일. bc5623fd45c2fb228f48298ee47d4f1c5a287a1d18591f8e4f618814f7ffd9b8 bc5623fd45c2fb228f48298ee47d4f1c5a287a1d18591f8e4f618814f7ffd9b8 ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_NEAR(rates.Value().algorithmic_acceleration[0U], 2.0, 1e-14) | EXPECT_NEAR(rates.Value().acceleration[0U], 1.95 / 0.95, 1e-14) | EXPECT_NEAR(rates.Value().velocity[0U], 0.155, 1e-14) ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_NEAR(rates.Value().algorithmic_acceleration[0U], 2.0, 1e-14) | EXPECT_NEAR(rates.Value().acceleration[0U], 1.95 / 0.95, 1e-14) | EXPECT_NEAR(rates.Value().velocity[0U], 0.155, 1e-14) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.RejectsInvalidParametersAndTime HhtTimeIntegrationTest.RejectsInvalidParametersAndTime; assertion 7개 tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.RejectsInvalidParametersAndTime 유지 원문 검사 body 및 assertion 동일. 8f052b7f1a3b8fb822dc564e2365883b6827c3e9f566e2fd07dc2a67c9246816 8f052b7f1a3b8fb822dc564e2365883b6827c3e9f566e2fd07dc2a67c9246816 EXPECT_FALSE(MakeHhtParameters(0.01).HasValue()) | EXPECT_FALSE(MakeHhtParameters(-0.34).HasValue()) | ASSERT_TRUE(MakeHhtParameters(-1.0 / 3.0).HasValue()) | ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(parameters.Value().beta, 0.25) | EXPECT_EQ(parameters.Value().gamma, 0.5) | EXPECT_FALSE(PredictHht(zero, zero, zero, 0.0, parameters.Value()).HasValue()) EXPECT_FALSE(MakeHhtParameters(0.01).HasValue()) | EXPECT_FALSE(MakeHhtParameters(-0.34).HasValue()) | ASSERT_TRUE(MakeHhtParameters(-1.0 / 3.0).HasValue()) | ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(parameters.Value().beta, 0.25) | EXPECT_EQ(parameters.Value().gamma, 0.5) | EXPECT_FALSE(PredictHht(zero, zero, zero, 0.0, parameters.Value()).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.StepOscillatorHasSecondOrderMaximumError HhtTimeIntegrationTest.StepOscillatorHasSecondOrderMaximumError; assertion 9개 tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.StepOscillatorHasSecondOrderMaximumError 유지 원문 검사 body 및 assertion 동일. 75ff32c40233ae10ed77f6cd3ffb13361d13d1c6a0acb05720d450f0d5f4d053 75ff32c40233ae10ed77f6cd3ffb13361d13d1c6a0acb05720d450f0d5f4d053 ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_GE(std::log2(previous_q / error_q), 1.8) | EXPECT_GE(std::log2(previous_v / error_v), 1.8) | EXPECT_GE(std::log2(previous_a / error_a), 1.8) | EXPECT_LT(error_q, 1e-4) | EXPECT_LT(error_v, 1e-4) | EXPECT_LT(error_a, 1e-4) ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_GE(std::log2(previous_q / error_q), 1.8) | EXPECT_GE(std::log2(previous_v / error_v), 1.8) | EXPECT_GE(std::log2(previous_a / error_a), 1.8) | EXPECT_LT(error_q, 1e-4) | EXPECT_LT(error_v, 1e-4) | EXPECT_LT(error_a, 1e-4) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/hht_time_integration_test.cpp support@1-9 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/analysis/hht_time_integration_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ae92a1fab37e019e61be13e7179238f0a1920b5d84bd46e196d22971dc9f979d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_time_integration_test.cpp support@40-41 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_time_integration_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5f00a39140d4b7cac4217349f6c92160b11694234e9665516332598cd78d2637 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/hht_time_integration_test.cpp support@95-97 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/analysis/hht_time_integration_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/analysis/newton_iteration_log_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d3101c094646165ee241aa223245bcbf7d58accb1a8f018d2c83fed3f484b9dc d3101c094646165ee241aa223245bcbf7d58accb1a8f018d2c83fed3f484b9dc 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.WritesOneLfTerminated39FieldRecordInApprovedOrder NewtonIterationLog.WritesOneLfTerminated39FieldRecordInApprovedOrder; assertion 4개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.WritesOneLfTerminated39FieldRecordInApprovedOrder 유지 원문 검사 body 및 assertion 동일. 478006c691de24dd68fd00fb670f08f3df30134ddab9b8d2c1300bcb3bbf9b9b 478006c691de24dd68fd00fb670f08f3df30134ddab9b8d2c1300bcb3bbf9b9b "ASSERT_EQ(fields.size(), labels.size()) | EXPECT_EQ(fields[index].substr(0U, fields[index].find('=')), labels[index]) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=nsnr-log-v1"")" "ASSERT_EQ(fields.size(), labels.size()) | EXPECT_EQ(fields[index].substr(0U, fields[index].find('=')), labels[index]) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=nsnr-log-v1"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.FormatsFiniteNumbersForLocaleIndependentRoundTrip NewtonIterationLog.FormatsFiniteNumbersForLocaleIndependentRoundTrip; assertion 5개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.FormatsFiniteNumbersForLocaleIndependentRoundTrip 유지 원문 검사 body 및 assertion 동일. af49c065bc4263fecd936356c425497319528bab0b5bbf04bcc82a252eac4ed0 af49c065bc4263fecd936356c425497319528bab0b5bbf04bcc82a252eac4ed0 EXPECT_EQ(result.ec, std::errc{}) | EXPECT_EQ(result.ptr, value.data() + value.size()) | EXPECT_DOUBLE_EQ(parsed, 0.12345678901234567) | EXPECT_NE(value.find('.'), std::string::npos) | EXPECT_EQ(value.find(','), std::string::npos) EXPECT_EQ(result.ec, std::errc{}) | EXPECT_EQ(result.ptr, value.data() + value.size()) | EXPECT_DOUBLE_EQ(parsed, 0.12345678901234567) | EXPECT_NE(value.find('.'), std::string::npos) | EXPECT_EQ(value.find(','), std::string::npos) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesChannelDecisionsAndExplicitOutcomeFields NewtonIterationLog.SerializesChannelDecisionsAndExplicitOutcomeFields; assertion 13개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesChannelDecisionsAndExplicitOutcomeFields 유지 원문 검사 body 및 assertion 동일. a72dbdfb59417fdad8806c162889401a17f516cfe5f527c4b08d6bfd1c12d076 a72dbdfb59417fdad8806c162889401a17f516cfe5f527c4b08d6bfd1c12d076 "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_channel""), std::string{prefix} + ""_channel="" + std::string{prefix}) | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0.0012345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=1.2345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=relative"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.01"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold_unit""), std::string{prefix} + ""_threshold_unit=1"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_pass""), std::string{prefix} + ""_pass=1"") | EXPECT_EQ(FieldValue(fields, ""last_completed_stage""), ""last_completed_stage=convergence-gates"") | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=none"") | EXPECT_EQ(FieldValue(fields, ""combined_pass""), ""combined_pass=1"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=accept"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=accepted"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=none"")" "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_channel""), std::string{prefix} + ""_channel="" + std::string{prefix}) | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0.0012345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=1.2345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=relative"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.01"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold_unit""), std::string{prefix} + ""_threshold_unit=1"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_pass""), std::string{prefix} + ""_pass=1"") | EXPECT_EQ(FieldValue(fields, ""last_completed_stage""), ""last_completed_stage=convergence-gates"") | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=none"") | EXPECT_EQ(FieldValue(fields, ""combined_pass""), ""combined_pass=1"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=accept"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=accepted"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=none"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEmptyChannelsAsTypedZeroScaleDecisions NewtonIterationLog.SerializesEmptyChannelsAsTypedZeroScaleDecisions; assertion 8개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEmptyChannelsAsTypedZeroScaleDecisions 유지 원문 검사 body 및 assertion 동일. 52595116ab45dfc4a15efc3027ebda7ed94578e61ba5516a49952da4787b3aea 52595116ab45dfc4a15efc3027ebda7ed94578e61ba5516a49952da4787b3aea "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.001"") | EXPECT_EQ(FieldValue(fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | EXPECT_EQ(FieldValue(fields, ""correction_translation_threshold_unit""), ""correction_translation_threshold_unit=length"") | EXPECT_EQ(FieldValue(fields, ""correction_rotation_threshold_unit""), ""correction_rotation_threshold_unit=1"")" "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.001"") | EXPECT_EQ(FieldValue(fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | EXPECT_EQ(FieldValue(fields, ""correction_translation_threshold_unit""), ""correction_translation_threshold_unit=length"") | EXPECT_EQ(FieldValue(fields, ""correction_rotation_threshold_unit""), ""correction_rotation_threshold_unit=1"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.EscapesStringsAndOmitsUnevaluatedFailureFields NewtonIterationLog.EscapesStringsAndOmitsUnevaluatedFailureFields; assertion 5개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.EscapesStringsAndOmitsUnevaluatedFailureFields 유지 원문 검사 body 및 assertion 동일. 2f3470b4d8bf9aacf7f50890f7b53816dfe990193f8af3a6d0cc066b88f7037d 2f3470b4d8bf9aacf7f50890f7b53816dfe990193f8af3a6d0cc066b88f7037d "EXPECT_EQ(ValueAfterEquals(fields[index]), not_evaluated) | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=load-boundary"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=fail\\ttransition"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\nrecord"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=external\\\\load\\r\\0"")" "EXPECT_EQ(ValueAfterEquals(fields[index]), not_evaluated) | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=load-boundary"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=fail\\ttransition"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\nrecord"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=external\\\\load\\r\\0"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.ReportsWriteFlushAndCloseStateFailures NewtonIterationLog.ReportsWriteFlushAndCloseStateFailures; assertion 2개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.ReportsWriteFlushAndCloseStateFailures 유지 원문 검사 body 및 assertion 동일. af4d515b9dc0ca7b6af0fa1cfae5d26577b3efc5ab172f3ee816db7044509e96 af4d515b9dc0ca7b6af0fa1cfae5d26577b3efc5ab172f3ee816db7044509e96 ASSERT_TRUE(closed_writer.Open(path).IsOk()) | ASSERT_TRUE(closed_writer.Close().IsOk()) ASSERT_TRUE(closed_writer.Open(path).IsOk()) | ASSERT_TRUE(closed_writer.Close().IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.LeavesZeroByteLogForNonNewtonControlledFailurePath NewtonIterationLog.LeavesZeroByteLogForNonNewtonControlledFailurePath; assertion 4개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.LeavesZeroByteLogForNonNewtonControlledFailurePath 유지 원문 검사 body 및 assertion 동일. 6e9b83153024bcd0b3e29402a533faf17fa26d708db7bc574ee13b8a1ffa9902 6e9b83153024bcd0b3e29402a533faf17fa26d708db7bc574ee13b8a1ffa9902 ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_TRUE(std::filesystem::exists(path)) | EXPECT_EQ(std::filesystem::file_size(path), 0U) ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_TRUE(std::filesystem::exists(path)) | EXPECT_EQ(std::filesystem::file_size(path), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEvaluatorProducedExternalScaleResidualDecisions NewtonIterationLog.SerializesEvaluatorProducedExternalScaleResidualDecisions; assertion 19개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEvaluatorProducedExternalScaleResidualDecisions 유지 원문 검사 body 및 assertion 동일. 883a7d046a0275863ab3ba8717420a46120cd4730070a07ebf692cad2fdc6b1c 883a7d046a0275863ab3ba8717420a46120cd4730070a07ebf692cad2fdc6b1c "ASSERT_EQ(zero_fields.size(), 39U) | EXPECT_EQ(FieldValue(zero_fields, ""schema""), ""schema=nsnr-log-v1"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_branch""), ""residual_force_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_branch""), ""residual_moment_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold""), ""residual_force_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | ASSERT_EQ(relative_fields.size(), 39U) | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_branch""), ""residual_force_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_branch""), ""residual_moment_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold""), ""residual_force_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=1"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=1"")" "ASSERT_EQ(zero_fields.size(), 39U) | EXPECT_EQ(FieldValue(zero_fields, ""schema""), ""schema=nsnr-log-v1"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_branch""), ""residual_force_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_branch""), ""residual_moment_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold""), ""residual_force_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | ASSERT_EQ(relative_fields.size(), 39U) | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_branch""), ""residual_force_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_branch""), ""residual_moment_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold""), ""residual_force_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=1"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=1"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.WritesTimeAndAllTwoChannelMetrics DynamicNewtonIterationLog.WritesTimeAndAllTwoChannelMetrics; assertion 24개 tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.WritesTimeAndAllTwoChannelMetrics 유지 원문 검사 body 및 assertion 동일. 21230f3c31871e11f03f9fb62d0be2dc01e29447bf22847af4e642acd48094d0 21230f3c31871e11f03f9fb62d0be2dc01e29447bf22847af4e642acd48094d0 "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | ASSERT_FALSE(bytes.empty()) | EXPECT_EQ(bytes.back(), '\n') | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(bytes.find('\r'), std::string::npos) | EXPECT_EQ(bytes.find(""target_factor""), std::string::npos) | EXPECT_EQ(bytes.find(""nsnr-log-v1""), std::string::npos) | EXPECT_EQ(fields.size(), 24U) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=dynamic-newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=hht-log-v1"") | EXPECT_EQ(FieldValue(fields, ""increment""), ""increment=2"") | EXPECT_EQ(FieldValue(fields, ""iteration""), ""iteration=3"") | EXPECT_EQ(FieldValue(fields, ""time""), ""time=0.25"") | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=convergence"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=relative"") | EXPECT_EQ(FieldValue(fields, ""residual_phi_branch""), ""residual_phi_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=1"") | EXPECT_EQ(FieldValue(fields, ""correction_pass""), ""correction_pass=1"") | EXPECT_EQ(parsed.ec, std::errc{}) | EXPECT_EQ(parsed.ptr, text.data() + text.size()) | EXPECT_DOUBLE_EQ(value, metric.second)" "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | ASSERT_FALSE(bytes.empty()) | EXPECT_EQ(bytes.back(), '\n') | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(bytes.find('\r'), std::string::npos) | EXPECT_EQ(bytes.find(""target_factor""), std::string::npos) | EXPECT_EQ(bytes.find(""nsnr-log-v1""), std::string::npos) | EXPECT_EQ(fields.size(), 24U) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=dynamic-newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=hht-log-v1"") | EXPECT_EQ(FieldValue(fields, ""increment""), ""increment=2"") | EXPECT_EQ(FieldValue(fields, ""iteration""), ""iteration=3"") | EXPECT_EQ(FieldValue(fields, ""time""), ""time=0.25"") | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=convergence"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=relative"") | EXPECT_EQ(FieldValue(fields, ""residual_phi_branch""), ""residual_phi_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=1"") | EXPECT_EQ(FieldValue(fields, ""correction_pass""), ""correction_pass=1"") | EXPECT_EQ(parsed.ec, std::errc{}) | EXPECT_EQ(parsed.ptr, text.data() + text.size()) | EXPECT_DOUBLE_EQ(value, metric.second)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.EscapesFailureContextAndKeepsZeroScaleFailure DynamicNewtonIterationLog.EscapesFailureContextAndKeepsZeroScaleFailure; assertion 11개 tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.EscapesFailureContextAndKeepsZeroScaleFailure 유지 원문 검사 body 및 assertion 동일. 0f65cd37830b1416f99088775f625be1000782b62f4d62110c4c68d39859d164 0f65cd37830b1416f99088775f625be1000782b62f4d62110c4c68d39859d164 "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=mass\\tcheck"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\ntrial"") | EXPECT_EQ(FieldValue(fields, ""failure_code""), ""failure_code=dynamic\\\\mass\\rregularity"") | EXPECT_EQ(FieldValue(fields, ""residual_u_numerator""), ""residual_u_numerator=1"") | EXPECT_EQ(FieldValue(fields, ""residual_u_scale""), ""residual_u_scale=0"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=0"")" "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=mass\\tcheck"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\ntrial"") | EXPECT_EQ(FieldValue(fields, ""failure_code""), ""failure_code=dynamic\\\\mass\\rregularity"") | EXPECT_EQ(FieldValue(fields, ""residual_u_numerator""), ""residual_u_numerator=1"") | EXPECT_EQ(FieldValue(fields, ""residual_u_scale""), ""residual_u_scale=0"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=0"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.InvalidEvidencePreservesFlushedPrefixAndFailsLifecycle DynamicNewtonIterationLog.InvalidEvidencePreservesFlushedPrefixAndFailsLifecycle; assertion 4개 tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.InvalidEvidencePreservesFlushedPrefixAndFailsLifecycle 유지 원문 검사 body 및 assertion 동일. 6b1f341aed7b1b9de8b7a2a0f6a8da67a51219a45b3cd7d50ed8535e224165bc 6b1f341aed7b1b9de8b7a2a0f6a8da67a51219a45b3cd7d50ed8535e224165bc ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(CompleteDynamicRecord()).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | EXPECT_EQ(ReadLogBytes(path), prefix) ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(CompleteDynamicRecord()).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | EXPECT_EQ(ReadLogBytes(path), prefix) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@1-148 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, ExpectLogOutputFailure, SplitTabs, while, FieldValue, for, ValueAfterEquals, VectorFrom, MakeDecision, CompleteRecord, WriteAndRead tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3f36093d9eeb5955577586d7074fcf8e441c479b923ff29b85d93f9fa0a014db 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@181-182 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 19386ea2961b53078a1506ac96caf435499c2ce389a6c4bc8b1d1334e3450291 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@198-199 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f968f62ecd764a93d0aebdeb90b34d4f95aea19862f1025a8f99eeaa0f513e90 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@233-234 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 66bb75d8fde94c7f7e4f4ae4f2d8b281f4bd149a8cda9b86613f7499da6a8973 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@275-276 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 71ce16e6c3d23ad2f7d4620ddc39c24e95471753e20be5b664c828f13cb2ebb1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@303-304 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2289d04b1dccb850b21a2112940a26b854cfb47de6032c0404ffd2a9a1257809 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@324-325 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ed7ec9f2fea8c0942706f056482e9ebbdd7f1c498b5b8ba0a274bdb7a0e1705b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@336-337 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 611c87e9e2a44fb7f16bfcb907f0ca1acf1ffc4101a78393551ee362850e63bf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@416-439 helper/oracle/fixture/include/static assertion 구간: CompleteDynamicRecord, ReadLogBytes tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9f652c12fbac5b067b0d88e3ec7dcfe31f9bb9bdad34b6a378d15c84ae567c39 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/newton_iteration_log_test.cpp support@564-565 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/analysis/nonlinear_analysis_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 71de713d652861fd086471944762c2ce289442e6e2ba2e259db76fad20e63db1 71de713d652861fd086471944762c2ce289442e6e2ba2e259db76fad20e63db1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CreatesFactorZeroBaselineInStableIdentityOrder NonlinearAnalysisState.CreatesFactorZeroBaselineInStableIdentityOrder; assertion 10개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CreatesFactorZeroBaselineInStableIdentityOrder 유지 원문 검사 body 및 assertion 동일. e055bd3a2aa163dedf599de37840273eb34bd74e59a8a94225360994929673f3 e055bd3a2aa163dedf599de37840273eb34bd74e59a8a94225360994929673f3 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(committed.increment_index, 0U) | EXPECT_DOUBLE_EQ(committed.load_factor, 0.0) | EXPECT_TRUE(committed.is_factor_zero_baseline) | EXPECT_TRUE(result.Value().AcceptedFrames().empty()) | ASSERT_EQ(committed.nodal_internal_order.size(), fixture.domain->Nodes().size()) | ASSERT_EQ(committed.nodal_source_ids.size(), fixture.domain->Nodes().size()) | EXPECT_EQ(committed.nodal_internal_order[node], node) | ASSERT_EQ(vector->Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ((*vector)[index], 0.0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(committed.increment_index, 0U) | EXPECT_DOUBLE_EQ(committed.load_factor, 0.0) | EXPECT_TRUE(committed.is_factor_zero_baseline) | EXPECT_TRUE(result.Value().AcceptedFrames().empty()) | ASSERT_EQ(committed.nodal_internal_order.size(), fixture.domain->Nodes().size()) | ASSERT_EQ(committed.nodal_source_ids.size(), fixture.domain->Nodes().size()) | EXPECT_EQ(committed.nodal_internal_order[node], node) | ASSERT_EQ(vector->Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ((*vector)[index], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsInvalidBaselineInventoryBeforeStateCreation NonlinearAnalysisState.RejectsInvalidBaselineInventoryBeforeStateCreation; assertion 1개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsInvalidBaselineInventoryBeforeStateCreation 유지 원문 검사 body 및 assertion 동일. 4ec9496b06d3904c913dea2c3ce00de01fbb8f56585ffc969b4c3ef52fcd464d 4ec9496b06d3904c913dea2c3ce00de01fbb8f56585ffc969b4c3ef52fcd464d EXPECT_FALSE(result.HasValue()) EXPECT_FALSE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsNonfiniteBaselineAndDofMismatch NonlinearAnalysisState.RejectsNonfiniteBaselineAndDofMismatch; assertion 4개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsNonfiniteBaselineAndDofMismatch 유지 원문 검사 body 및 assertion 동일. 3ba1563177a1cb2640413807396826918fd0e25aa71517fdf1ec53fb5054735a 3ba1563177a1cb2640413807396826918fd0e25aa71517fdf1ec53fb5054735a EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_triad) .HasValue()) | EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_director) .HasValue()) | ASSERT_TRUE(empty_domain_result.HasValue()) | EXPECT_FALSE(dof_mismatch.HasValue()) EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_triad) .HasValue()) | EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_director) .HasValue()) | ASSERT_TRUE(empty_domain_result.HasValue()) | EXPECT_FALSE(dof_mismatch.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.PreservesDuplicateLabelsWhenInstancesDiffer NonlinearAnalysisState.PreservesDuplicateLabelsWhenInstancesDiffer; assertion 7개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.PreservesDuplicateLabelsWhenInstancesDiffer 유지 원문 검사 body 및 assertion 동일. e5a32acb933b1e65d2b1efef48bdee5223bd4276460d245229bf10410bfbf59b e5a32acb933b1e65d2b1efef48bdee5223bd4276460d245229bf10410bfbf59b ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().CommittedState().nodal_source_ids.size(), 2U) | EXPECT_EQ(result.Value().CommittedState().nodal_source_ids[0U].source_label, result.Value().CommittedState().nodal_source_ids[1U].source_label) | EXPECT_NE(result.Value().CommittedState().nodal_source_ids[0U].instance_name, result.Value().CommittedState().nodal_source_ids[1U].instance_name) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().CommittedState().nodal_source_ids.size(), 2U) | EXPECT_EQ(result.Value().CommittedState().nodal_source_ids[0U].source_label, result.Value().CommittedState().nodal_source_ids[1U].source_label) | EXPECT_NE(result.Value().CommittedState().nodal_source_ids[0U].instance_name, result.Value().CommittedState().nodal_source_ids[1U].instance_name) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StartsIndependentTrialAndDiscardPreservesCommit NonlinearAnalysisState.StartsIndependentTrialAndDiscardPreservesCommit; assertion 3개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StartsIndependentTrialAndDiscardPreservesCommit 유지 원문 검사 body 및 assertion 동일. c8246ffc811a47dcc57b704918eb2f14188fef66dd65d0f63ce0892482986949 c8246ffc811a47dcc57b704918eb2f14188fef66dd65d0f63ce0892482986949 ASSERT_TRUE(trial.HasValue()) | EXPECT_NE(trial.Value().displacement.Data(), state.CommittedState().displacement.Data()) | EXPECT_DOUBLE_EQ(state.CommittedState().nodal_director[0U][2U], 1.0) ASSERT_TRUE(trial.HasValue()) | EXPECT_NE(trial.Value().displacement.Data(), state.CommittedState().displacement.Data()) | EXPECT_DOUBLE_EQ(state.CommittedState().nodal_director[0U][2U], 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CommitsOnlyStableCompleteAcceptedFrames NonlinearAnalysisState.CommitsOnlyStableCompleteAcceptedFrames; assertion 16개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CommitsOnlyStableCompleteAcceptedFrames 유지 원문 검사 body 및 assertion 동일. c2c798a56a4a0a3e7e44c9a7208e608f5244ce3ba8f2e2204f03adf4dafdbac9 c2c798a56a4a0a3e7e44c9a7208e608f5244ce3ba8f2e2204f03adf4dafdbac9 ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(state.AcceptedFrames()[0U].frame_index, 0U) | EXPECT_EQ(state.AcceptedFrames()[0U].increment_index, 1U) | EXPECT_FALSE(state.AcceptedFrames()[0U].is_factor_one) | EXPECT_EQ(state.CommittedState().increment_index, 1U) | EXPECT_FALSE(state.CommittedState().is_factor_zero_baseline) | EXPECT_DOUBLE_EQ(state.CommittedState().residual[0U], 5.0) | EXPECT_DOUBLE_EQ(state.CommittedState().reaction[0U], 5.0) | ASSERT_EQ(state.CommittedState().shell_results.size(), 4U) | EXPECT_EQ(state.CommittedState().shell_results[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.CommittedState().shell_results[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | ASSERT_TRUE(state.CommitAcceptedFrame(final_frame).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 2U) | EXPECT_EQ(state.AcceptedFrames()[1U].frame_index, 1U) | EXPECT_TRUE(state.AcceptedFrames()[1U].is_factor_one) ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(state.AcceptedFrames()[0U].frame_index, 0U) | EXPECT_EQ(state.AcceptedFrames()[0U].increment_index, 1U) | EXPECT_FALSE(state.AcceptedFrames()[0U].is_factor_one) | EXPECT_EQ(state.CommittedState().increment_index, 1U) | EXPECT_FALSE(state.CommittedState().is_factor_zero_baseline) | EXPECT_DOUBLE_EQ(state.CommittedState().residual[0U], 5.0) | EXPECT_DOUBLE_EQ(state.CommittedState().reaction[0U], 5.0) | ASSERT_EQ(state.CommittedState().shell_results.size(), 4U) | EXPECT_EQ(state.CommittedState().shell_results[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.CommittedState().shell_results[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | ASSERT_TRUE(state.CommitAcceptedFrame(final_frame).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 2U) | EXPECT_EQ(state.AcceptedFrames()[1U].frame_index, 1U) | EXPECT_TRUE(state.AcceptedFrames()[1U].is_factor_one) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsMalformedAcceptedFrames NonlinearAnalysisState.AtomicallyRejectsMalformedAcceptedFrames; assertion 7개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsMalformedAcceptedFrames 유지 원문 검사 body 및 assertion 동일. c5236c5ae93e09ba72c3ae4a4deefec8eff58282d70ec1a3125f9895785189f5 c5236c5ae93e09ba72c3ae4a4deefec8eff58282d70ec1a3125f9895785189f5 "ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_EQ(state.AcceptedFrames().size(), frame_count) | EXPECT_EQ(state.CommittedState().increment_index, before.increment_index) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" "ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_EQ(state.AcceptedFrames().size(), frame_count) | EXPECT_EQ(state.CommittedState().increment_index, before.increment_index) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsNonfiniteAcceptedFrame NonlinearAnalysisState.AtomicallyRejectsNonfiniteAcceptedFrame; assertion 6개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsNonfiniteAcceptedFrame 유지 원문 검사 body 및 assertion 동일. cc5e4a6773c3318499122f00929c214489dbb84190929c6eb5997ced2860c51c cc5e4a6773c3318499122f00929c214489dbb84190929c6eb5997ced2860c51c "ASSERT_TRUE(state.CommitAcceptedFrame(valid).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" "ASSERT_TRUE(state.CommitAcceptedFrame(valid).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StoresNoUnapprovedVerificationMetrics NonlinearAnalysisState.StoresNoUnapprovedVerificationMetrics; assertion 2개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StoresNoUnapprovedVerificationMetrics 유지 원문 검사 body 및 assertion 동일. b69ab505986f7c4e96d680112f051eb4ad264b5a4b0d00534017599fbcec886d b69ab505986f7c4e96d680112f051eb4ad264b5a4b0d00534017599fbcec886d EXPECT_FALSE((HasVerificationMetrics::value)) | EXPECT_FALSE((HasVerificationMetrics::value)) EXPECT_FALSE((HasVerificationMetrics::value)) | EXPECT_FALSE((HasVerificationMetrics::value)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@1-184 helper/oracle/fixture/include/static assertion 구간: Fixture, MakeFixture, if, MakeBaseline, MakeState, MakeShellRow, MakeShellRows, MakeFrame, T, HasVerificationMetrics, ExpectSourceIdEqual, ExpectVectorEqual tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2e56a14c0097a3200d0e43093dd79e3af9fbde80419d3561620f97d79996642e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@215-216 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bd37a239145c5cebe3e142065918acfbe17a8b4a9038df01ef0c3dc0653dd7a6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@251-252 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8fe7a38902e0f0554e724e21bd6626055452ad1f94713ee1115cc0415d753fb2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@276-277 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 284e6386154a0d7de7b977bffbccc58a0cccdd9f7d48f388d64f6bedeab4288e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@318-319 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 00e2be860cc981a9ca4aa4ec18c34ff5e6071b8d9df6a4e02a2b41acdfb1cb7c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@336-338 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7926abaabd465ec5f2df8c1281d0d9f682d634e296091035784916bea8ca5ed0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@369-370 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 15735dfe66660b9315679d163a8e4573eb57893a4db8bf85e7542c4cf8cc664b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@431-432 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 44e172af12e1ad94ad0079a1ed7dcc3e57c9ad141594f6626542163024522747 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_analysis_state_test.cpp support@451-452 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5064d5792cabc37a1beb0d4085f57716fdb52851fdf8bff86383f061be0fd2ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 13개 tests/unit/analysis/nonlinear_static_control_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d12853400861a54e112f715d41be7470bf32caff38740282301f452c636a668c d12853400861a54e112f715d41be7470bf32caff38740282301f452c636a668c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.BuildsFixedFactorSequenceWithExactEndpoint NonlinearStaticControl.BuildsFixedFactorSequenceWithExactEndpoint; assertion 10개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.BuildsFixedFactorSequenceWithExactEndpoint 유지 원문 검사 body 및 assertion 동일. 03cf5328984955e5bd0957b26938892dbadee29219434b903c919e1c159bfc6f 03cf5328984955e5bd0957b26938892dbadee29219434b903c919e1c159bfc6f ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 10U) | EXPECT_EQ(increment.increment_index, static_cast(index + 1U)) | EXPECT_DOUBLE_EQ(increment.load_factor, static_cast(index + 1U) * 0.1) | EXPECT_EQ(increment.is_factor_one, index + 1U == result.Value().size()) | EXPECT_DOUBLE_EQ(result.Value().back().load_factor, 1.0) | ASSERT_TRUE(one_hundred_result.HasValue()) | ASSERT_EQ(one_hundred_result.Value().size(), 100U) | EXPECT_EQ(one_hundred_result.Value().back().increment_index, 100U) | EXPECT_TRUE(one_hundred_result.Value().back().is_factor_one) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 10U) | EXPECT_EQ(increment.increment_index, static_cast(index + 1U)) | EXPECT_DOUBLE_EQ(increment.load_factor, static_cast(index + 1U) * 0.1) | EXPECT_EQ(increment.is_factor_one, index + 1U == result.Value().size()) | EXPECT_DOUBLE_EQ(result.Value().back().load_factor, 1.0) | ASSERT_TRUE(one_hundred_result.HasValue()) | ASSERT_EQ(one_hundred_result.Value().size(), 100U) | EXPECT_EQ(one_hundred_result.Value().back().increment_index, 100U) | EXPECT_TRUE(one_hundred_result.Value().back().is_factor_one) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.IgnoresPositiveMinimumAndMaximumDuringStepping NonlinearStaticControl.IgnoresPositiveMinimumAndMaximumDuringStepping; assertion 5개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.IgnoresPositiveMinimumAndMaximumDuringStepping 유지 원문 검사 body 및 assertion 동일. 99470076262ba5d8b53bbdc942349594b403bf7b4c1ffbb01e172701fb11f882 99470076262ba5d8b53bbdc942349594b403bf7b4c1ffbb01e172701fb11f882 ASSERT_TRUE(first_result.HasValue()) | ASSERT_TRUE(second_result.HasValue()) | ASSERT_EQ(first_result.Value().size(), second_result.Value().size()) | EXPECT_DOUBLE_EQ(first_result.Value()[index].load_factor, second_result.Value()[index].load_factor) | EXPECT_EQ(first_result.Value()[index].increment_index, second_result.Value()[index].increment_index) ASSERT_TRUE(first_result.HasValue()) | ASSERT_TRUE(second_result.HasValue()) | ASSERT_EQ(first_result.Value().size(), second_result.Value().size()) | EXPECT_DOUBLE_EQ(first_result.Value()[index].load_factor, second_result.Value()[index].load_factor) | EXPECT_EQ(first_result.Value()[index].increment_index, second_result.Value()[index].increment_index) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AppliesAbsoluteBoundaryTargetsWithoutCorrection NonlinearLoadBoundary.AppliesAbsoluteBoundaryTargetsWithoutCorrection; assertion 5개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AppliesAbsoluteBoundaryTargetsWithoutCorrection 유지 원문 검사 body 및 assertion 동일. 5e3b97613fd46bce571853e5787057d6cae4c99e6b8114c00823878a5a43e764 5e3b97613fd46bce571853e5787057d6cae4c99e6b8114c00823878a5a43e764 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 2U) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(result.Value()[1U], -0.125) | EXPECT_EQ(TrialCoordinates(fixture)[constrained], 0.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 2U) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(result.Value()[1U], -0.125) | EXPECT_EQ(TrialCoordinates(fixture)[constrained], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AssemblesEverySharedNodeLoadOnceInFixedGlobalAxes NonlinearLoadBoundary.AssemblesEverySharedNodeLoadOnceInFixedGlobalAxes; assertion 7개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AssemblesEverySharedNodeLoadOnceInFixedGlobalAxes 유지 원문 검사 body 및 assertion 동일. f9fd946c0c146cac052d1f2ce57c48e989e1700b61bc00e546bd78376a8707ba f9fd946c0c146cac052d1f2ce57c48e989e1700b61bc00e546bd78376a8707ba ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().generalized_external_force.Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[0U], 2.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[1U], -1.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[3U], 0.5) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[0U] .GlobalComponents()[0U], 8.0) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[2U] .GlobalComponents()[3U], 2.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().generalized_external_force.Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[0U], 2.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[1U], -1.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[3U], 0.5) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[0U] .GlobalComponents()[0U], 8.0) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[2U] .GlobalComponents()[3U], 2.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.RejectsDirectorAlignedMomentAboveTheExactBand NonlinearLoadBoundary.RejectsDirectorAlignedMomentAboveTheExactBand; assertion 4개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.RejectsDirectorAlignedMomentAboveTheExactBand 유지 원문 검사 body 및 assertion 동일. 6fd8c584b65e4594d07dee3e89a681ebbf4990173da1ace05bde715753ca71f3 6fd8c584b65e4594d07dee3e89a681ebbf4990173da1ace05bde715753ca71f3 "EXPECT_TRUE( fesa::CheckMomentAdmissibility(director, {1.0, 0.0, 1.0e-12}).IsOk()) | EXPECT_FALSE(rejected.IsOk()) | ASSERT_EQ(rejected.Diagnostics().size(), 1U) | EXPECT_EQ(rejected.Diagnostics()[0U].code, ""unsupported-drilling-load"")" "EXPECT_TRUE( fesa::CheckMomentAdmissibility(director, {1.0, 0.0, 1.0e-12}).IsOk()) | EXPECT_FALSE(rejected.IsOk()) | ASSERT_EQ(rejected.Diagnostics().size(), 1U) | EXPECT_EQ(rejected.Diagnostics()[0U].code, ""unsupported-drilling-load"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.PreservesSourceOrderDuringGlobalAccumulation NonlinearLoadBoundary.PreservesSourceOrderDuringGlobalAccumulation; assertion 6개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.PreservesSourceOrderDuringGlobalAccumulation 유지 원문 검사 body 및 assertion 동일. c3bb30245b6f1676ea97c2d939256da763d500b601a670f86968efa43d87b75a c3bb30245b6f1676ea97c2d939256da763d500b601a670f86968efa43d87b75a ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().generalized_external_force[0U], 1.0) | EXPECT_EQ(first.Value().generalized_external_tangent.RowOffsets(), second.Value().generalized_external_tangent.RowOffsets()) | EXPECT_EQ(first.Value().generalized_external_tangent.ColumnIndices(), second.Value().generalized_external_tangent.ColumnIndices()) | EXPECT_EQ(first.Value().generalized_external_tangent.Values(), second.Value().generalized_external_tangent.Values()) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().generalized_external_force[0U], 1.0) | EXPECT_EQ(first.Value().generalized_external_tangent.RowOffsets(), second.Value().generalized_external_tangent.RowOffsets()) | EXPECT_EQ(first.Value().generalized_external_tangent.ColumnIndices(), second.Value().generalized_external_tangent.ColumnIndices()) | EXPECT_EQ(first.Value().generalized_external_tangent.Values(), second.Value().generalized_external_tangent.Values()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.DifferentiatesOneFixedSpatialMomentAndUsesSubtraction NonlinearLoadBoundary.DifferentiatesOneFixedSpatialMomentAndUsesSubtraction; assertion 6개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.DifferentiatesOneFixedSpatialMomentAndUsesSubtraction 유지 원문 검사 body 및 assertion 동일. e3040db107a7fc1174faf58c76c4c5915e3a021adbdc44927ec95bf2dbf7877b e3040db107a7fc1174faf58c76c4c5915e3a021adbdc44927ec95bf2dbf7877b ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE(MaximumAbsoluteDifference(derivative, tangent_action), 1.0e-8) | EXPECT_DOUBLE_EQ(residual[3U], 5.0 - result.Value().generalized_external_force[3U]) | EXPECT_DOUBLE_EQ( -tangent_action[3U], -result.Value().generalized_external_tangent.Multiply(direction)[3U]) ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE(MaximumAbsoluteDifference(derivative, tangent_action), 1.0e-8) | EXPECT_DOUBLE_EQ(residual[3U], 5.0 - result.Value().generalized_external_force[3U]) | EXPECT_DOUBLE_EQ( -tangent_action[3U], -result.Value().generalized_external_tangent.Multiply(direction)[3U]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesOwnedRelativeThresholdsForEveryChannel NonlinearConvergence.UsesOwnedRelativeThresholdsForEveryChannel; assertion 8개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesOwnedRelativeThresholdsForEveryChannel 유지 원문 검사 body 및 assertion 동일. 6cfe9ea574efccc73afb0318189186da892593dc1ca54dcecc940c9f96d4b6ae 6cfe9ea574efccc73afb0318189186da892593dc1ca54dcecc940c9f96d4b6ae EXPECT_TRUE(result.combined_passed) | EXPECT_FALSE(decision.identity.empty()) | EXPECT_DOUBLE_EQ(decision.numerator_norm, 1.0e-2) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 1.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) EXPECT_TRUE(result.combined_passed) | EXPECT_FALSE(decision.identity.empty()) | EXPECT_DOUBLE_EQ(decision.numerator_norm, 1.0e-2) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 1.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.AppliesTypedZeroScaleGatesToEmptyChannels NonlinearConvergence.AppliesTypedZeroScaleGatesToEmptyChannels; assertion 7개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.AppliesTypedZeroScaleGatesToEmptyChannels 유지 원문 검사 body 및 assertion 동일. 6dae4244b6d4b6af487b476312174ee8d379aae3416c77f5833eeb43b1ac0a2f 6dae4244b6d4b6af487b476312174ee8d379aae3416c77f5833eeb43b1ac0a2f EXPECT_TRUE(result.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].numerator_norm, 0.0) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) EXPECT_TRUE(result.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].numerator_norm, 0.0) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.SelectsTypedZeroScaleFromExactZeroExternalResidualChannels NonlinearConvergence.SelectsTypedZeroScaleFromExactZeroExternalResidualChannels; assertion 10개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.SelectsTypedZeroScaleFromExactZeroExternalResidualChannels 유지 원문 검사 body 및 assertion 동일. 83f1b0cae81f3d8f7b93fe76c1857758f18b6e9d9c97b091cb9e101fb23f1f3e 83f1b0cae81f3d8f7b93fe76c1857758f18b6e9d9c97b091cb9e101fb23f1f3e EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) | EXPECT_FALSE(force_rejected.force_residual.passed) | EXPECT_FALSE(force_rejected.combined_passed) | EXPECT_FALSE(moment_rejected.moment_residual.passed) | EXPECT_FALSE(moment_rejected.combined_passed) EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) | EXPECT_FALSE(force_rejected.force_residual.passed) | EXPECT_FALSE(force_rejected.combined_passed) | EXPECT_FALSE(moment_rejected.moment_residual.passed) | EXPECT_FALSE(moment_rejected.combined_passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesRelativeResidualScaleOnlyWhenMatchingExternalScaleIsNonzero NonlinearConvergence.UsesRelativeResidualScaleOnlyWhenMatchingExternalScaleIsNonzero; assertion 10개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesRelativeResidualScaleOnlyWhenMatchingExternalScaleIsNonzero 유지 원문 검사 body 및 assertion 동일. 6d42f6c27a543b480e86044b3b77d0943d8cb2d2482dd1aba56d30e16a39058c 6d42f6c27a543b480e86044b3b77d0943d8cb2d2482dd1aba56d30e16a39058c EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 2.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).force_residual.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).moment_residual.passed) | EXPECT_FALSE(relative_rejected.force_residual.passed) | EXPECT_FALSE(relative_rejected.combined_passed) EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 2.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).force_residual.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).moment_residual.passed) | EXPECT_FALSE(relative_rejected.force_residual.passed) | EXPECT_FALSE(relative_rejected.combined_passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RejectsNonfiniteResidualInputsBeforeSelectingOrAcceptingAChannel NonlinearConvergence.RejectsNonfiniteResidualInputsBeforeSelectingOrAcceptingAChannel; assertion 7개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RejectsNonfiniteResidualInputsBeforeSelectingOrAcceptingAChannel 유지 원문 검사 body 및 assertion 동일. df264b5cae771cdeb5f4ea6aa1ca08c5353da8a51e88409b08509e598dd6e79e df264b5cae771cdeb5f4ea6aa1ca08c5353da8a51e88409b08509e598dd6e79e EXPECT_FALSE(decision.passed) | EXPECT_FALSE(result.combined_passed) | EXPECT_TRUE(relative.force_residual.passed) | EXPECT_DOUBLE_EQ(relative.force_residual.denominator_scale, smallest_external) | EXPECT_EQ(relative.force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(relative.force_residual.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(relative.force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) EXPECT_FALSE(decision.passed) | EXPECT_FALSE(result.combined_passed) | EXPECT_TRUE(relative.force_residual.passed) | EXPECT_DOUBLE_EQ(relative.force_residual.denominator_scale, smallest_external) | EXPECT_EQ(relative.force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(relative.force_residual.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(relative.force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RequiresEveryResidualAndCorrectionChannelToPass NonlinearConvergence.RequiresEveryResidualAndCorrectionChannelToPass; assertion 8개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RequiresEveryResidualAndCorrectionChannelToPass 유지 원문 검사 body 및 assertion 동일. a832011e0feb435ce0aa354c482a5af20cdcc12a5b3ee069a6805fa2760daa0f a832011e0feb435ce0aa354c482a5af20cdcc12a5b3ee069a6805fa2760daa0f EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(accepted.translation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.translation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(accepted.translation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_EQ(accepted.rotation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_FALSE(result.combined_passed) EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(accepted.translation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.translation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(accepted.translation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_EQ(accepted.rotation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_FALSE(result.combined_passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@1-158 helper/oracle/fixture/include/static assertion 구간: VectorFrom, Fixture, if, TrialCoordinates, AddScaled, MaximumAbsoluteDifference, RelativeConvergenceInput, ExactZeroExternalResidualInput tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a0d6117066d7bc0244668abef8eff3eb3f09fefb66e56d8ff7dae4978b297e2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@184-185 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a728c5ddd282acb272a289129b2beaaf82361231a53854f9678579e963ca7bf5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@204-205 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5d5d51f179b49fab4320bca3fb1a67c9514c031c6eb4146cd06e0fd67d94e32b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@221-222 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b88abcc3396bee3d80864ac6e5b5d69fd7a65489104a60fee981bfb1f80dcf66 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@250-251 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6d84fb8f223d3d49be0a8b3f94cc76dc49eb532f98b45a89eaf3f6b7c0d9d928 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@262-263 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 891df0432d2d49bd73ab72565c58f1833e37588e6e1f011e9622f474b2164e52 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@285-286 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. de1e68c7ef81aa7e6db55005224ab3b7051d71f20a74f0a005cadc3d2950055f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@324-325 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 577d29344a758ac62f396a9e34591982aab171dd34082649c877701cf8834124 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@346-347 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 66b90623292bf823c4ec82313343514c4d6118d131a2112173300ffc87582cc6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@376-377 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0413b1a93aa4812b4c92ab8aeba36ae964d35ffceb3ae14bde002cc02b4a128a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@414-415 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c2e9bb7f999bfecdf11b504b8f331912407fc2aace0ed3334b7095b7686f5f8a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@454-455 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dc36777ce188869f3f1f91b7963b011739df7f02cac290f3dfac4efbe4bf15bf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@500-501 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d661490b198257d4473dc5b81ce890e2389d53e281ec635145449812542abe98 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/nonlinear_static_control_test.cpp support@533-534 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/analysis/solid_frequency_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 80a7a0dd4e765af6155d0ca9e52edc3c13f00e2082a4fcb60601e1ec20a23c56 afb4cc6cb6b1b6913bcfd0d473260ab060c91b66835e5570073472e3bc7f3dd5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.FreeBrickRetainsSixRigidModes SolidFrequencyProcedure.FreeBrickRetainsSixRigidModes; assertion 6개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.FreeBrickRetainsSixRigidModes 유지 원문 검사 body 및 assertion 동일. cce9667bb3dd958f4277c3c2cea2cd1c9d7a29bbc73e03edfe674518cb099309 cce9667bb3dd958f4277c3c2cea2cd1c9d7a29bbc73e03edfe674518cb099309 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().modes.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(result.Value().vectors.Rows(), 6U) | EXPECT_EQ(result.Value().vectors.Columns(), 24U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().modes.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(result.Value().vectors.Rows(), 6U) | EXPECT_EQ(result.Value().vectors.Columns(), 24U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RowSumLumpedPencilMatchesIndependentDenseOracle SolidFrequencyProcedure.RowSumLumpedPencilMatchesIndependentDenseOracle; assertion 22개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RowSumLumpedPencilMatchesIndependentDenseOracle 유지 원문 검사 body 및 assertion 동일. 4c97e6d2016b331fe2696c558e569c93fce6a5040249a4fa536634b8617ae5fb 4c97e6d2016b331fe2696c558e569c93fce6a5040249a4fa536634b8617ae5fb "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), oracle.size()) | ASSERT_EQ(state.eigenpair_checks.size(), oracle.size()) | EXPECT_NEAR(state.modes[c].eigenvalue, oracle[c], 1e-10 * state.classification_scale) | EXPECT_EQ(state.modes[c].mode_id, c + 1) | EXPECT_EQ(state.eigenpair_checks[c].sorted_rank, c + 1) | EXPECT_LE(state.eigenpair_checks[c].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_norm, 1e-10) | EXPECT_NEAR(state.eigenpair_checks[c].modal_mass, 1.0, 1e-10) | EXPECT_EQ(state.vectors(c, row), 0.0) | EXPECT_GT(state.vectors(c, pivot), 0.0) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_NEAR(state.mass_ideal_lower_bound, 12.0 / 27.0, 1e-13) | EXPECT_GT(state.mass_lower_bound, 0.0) | EXPECT_LT(state.mass_lower_bound, state.mass_ideal_lower_bound) | EXPECT_GT(state.mass_roundoff_guard, 0.0) | EXPECT_EQ(state.backend.integer_abi, ""ILP64"") | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | EXPECT_EQ(state.backend.backend_calls.front().kind, ""mass-spd"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), oracle.size()) | ASSERT_EQ(state.eigenpair_checks.size(), oracle.size()) | EXPECT_NEAR(state.modes[c].eigenvalue, oracle[c], 1e-10 * state.classification_scale) | EXPECT_EQ(state.modes[c].mode_id, c + 1) | EXPECT_EQ(state.eigenpair_checks[c].sorted_rank, c + 1) | EXPECT_LE(state.eigenpair_checks[c].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_norm, 1e-10) | EXPECT_NEAR(state.eigenpair_checks[c].modal_mass, 1.0, 1e-10) | EXPECT_EQ(state.vectors(c, row), 0.0) | EXPECT_GT(state.vectors(c, pivot), 0.0) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_NEAR(state.mass_ideal_lower_bound, 12.0 / 27.0, 1e-13) | EXPECT_GT(state.mass_lower_bound, 0.0) | EXPECT_LT(state.mass_lower_bound, state.mass_ideal_lower_bound) | EXPECT_GT(state.mass_roundoff_guard, 0.0) | EXPECT_EQ(state.backend.integer_abi, ""ILP64"") | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | EXPECT_EQ(state.backend.backend_calls.front().kind, ""mass-spd"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.DensityLengthAndMaterialScaling SolidFrequencyProcedure.DensityLengthAndMaterialScaling; assertion 5개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.DensityLengthAndMaterialScaling 유지 원문 검사 body 및 assertion 동일. cdee8e33c911874556fd0de7f4206dabb00b6323ffc6dc258ea2775cd9d4203c cdee8e33c911874556fd0de7f4206dabb00b6323ffc6dc258ea2775cd9d4203c ASSERT_TRUE(base_domain.HasValue()) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[c].eigenvalue, base.Value().modes[c].eigenvalue * parameters[3], 1e-10 * result.Value().classification_scale) ASSERT_TRUE(base_domain.HasValue()) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[c].eigenvalue, base.Value().modes[c].eigenvalue * parameters[3], 1e-10 * result.Value().classification_scale) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.OneFreeDofAndAllConstrainedAndExcessRequest SolidFrequencyProcedure.OneFreeDofAndAllConstrainedAndExcessRequest; assertion 5개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.OneFreeDofAndAllConstrainedAndExcessRequest 유지 원문 검사 body 및 assertion 동일. c873c04a035270f6496bcb1e0d60a1558b2eccd3043729a891bc459cd0f18927 c873c04a035270f6496bcb1e0d60a1558b2eccd3043729a891bc459cd0f18927 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[0].eigenvalue, DenseOracle({2U})[0], 1e-11) | ASSERT_TRUE(invalid.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(invalid.Value()) .HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[0].eigenvalue, DenseOracle({2U})[0], 1e-11) | ASSERT_TRUE(invalid.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(invalid.Value()) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.MissingDensityAndFailedBackendPreservePriorCandidate SolidFrequencyProcedure.MissingDensityAndFailedBackendPreservePriorCandidate; assertion 7개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.MissingDensityAndFailedBackendPreservePriorCandidate 유지 원문 검사 body 및 assertion 동일. 3f418707dfaaffaae21da5242f50881cd3b4e2d1049377e14af02ad858f84b9c 3f418707dfaaffaae21da5242f50881cd3b4e2d1049377e14af02ad858f84b9c EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(missing.Value()) .HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(good.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(domain.Value()) .HasValue()) | EXPECT_EQ(good.Value().modes[0].eigenvalue, previous) | ASSERT_TRUE(again.HasValue()) | EXPECT_NEAR(again.Value().modes[0].eigenvalue, previous, 1e-12) EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(missing.Value()) .HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(good.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(domain.Value()) .HasValue()) | EXPECT_EQ(good.Value().modes[0].eigenvalue, previous) | ASSERT_TRUE(again.HasValue()) | EXPECT_NEAR(again.Value().modes[0].eigenvalue, previous, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.NearZeroNegativeRemainsRawWithoutFrequency SolidFrequencyProcedure.NearZeroNegativeRemainsRawWithoutFrequency; assertion 6개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.NearZeroNegativeRemainsRawWithoutFrequency 유지 원문 검사 body 및 assertion 동일. 5c7466461ae588cfbd0a9a9bdd24664d5d7cf8f721ecf9fa68b53fa3041f35eb 5c7466461ae588cfbd0a9a9bdd24664d5d7cf8f721ecf9fa68b53fa3041f35eb ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_LT(result.Value().modes[0].eigenvalue, 0.0) | EXPECT_EQ(result.Value().modes[0].classification, 0U) | EXPECT_FALSE(result.Value().modes[0].frequency.has_value()) | EXPECT_EQ(mode.cluster_id, 1U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_LT(result.Value().modes[0].eigenvalue, 0.0) | EXPECT_EQ(result.Value().modes[0].classification, 0U) | EXPECT_FALSE(result.Value().modes[0].frequency.has_value()) | EXPECT_EQ(mode.cluster_id, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.SuppliedFrequencyInputHasIndependentNumericalEvidence SolidFrequencyProcedure.SuppliedFrequencyInputHasIndependentNumericalEvidence; assertion 10개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.SuppliedFrequencyInputHasIndependentNumericalEvidence 유지 원문 검사 body 및 assertion 동일. 0287bfd4fea7a6dcac7e9ad689ef6fde57e28ebbe300516a82f71d32366695b0 0287bfd4fea7a6dcac7e9ad689ef6fde57e28ebbe300516a82f71d32366695b0 ASSERT_FALSE(root.empty()) | ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().modes.size(), 10U) | EXPECT_EQ(result.Value().vectors.Columns(), 3U * 442U) | EXPECT_GE(result.Value().eigenpair_checks.size(), 10U) | EXPECT_GT(result.Value().mass_lower_bound, 0.0) | EXPECT_LE(result.Value().eta_gram, 1e-10) | EXPECT_LE(result.Value().max_eta_orth, 1e-10) ASSERT_FALSE(root.empty()) | ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().modes.size(), 10U) | EXPECT_EQ(result.Value().vectors.Columns(), 3U * 442U) | EXPECT_GE(result.Value().eigenpair_checks.size(), 10U) | EXPECT_GT(result.Value().mass_lower_bound, 0.0) | EXPECT_LE(result.Value().eta_gram, 1e-10) | EXPECT_LE(result.Value().max_eta_orth, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RejectsOverflowingOriginalPencilValidationScale SolidFrequencyProcedure.RejectsOverflowingOriginalPencilValidationScale; assertion 5개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RejectsOverflowingOriginalPencilValidationScale 유지 원문 검사 body 및 assertion 동일. 23de9158e3984de0b4196abe914a4980b20b59e595d0f6de100b63c0608b4e5c 23de9158e3984de0b4196abe914a4980b20b59e595d0f6de100b63c0608b4e5c "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""solid-eigenpair-validation-failed"") | EXPECT_NE(result.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""solid-eigenpair-validation-failed"") | EXPECT_NE(result.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp support@1-64 helper/oracle/fixture/include/static assertion 구간: StatusText, Brick tests/unit/analysis/solid_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 338ba214915b6614a5178292ab8ca1c8409f79c52bfdae155360a152c9033cc2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_frequency_procedure_test.cpp support@77-136 helper/oracle/fixture/include/static assertion 구간: GradientIntegral, DenseOracle, FaceFree tests/unit/analysis/solid_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ce1a07c50cc327f05d6a67dcefec86324ec510e7189bc09589a7347b3ebac1a1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 30개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1c1936b269135cad28f1bc2608001f50c8992fbca8c9e29c713f28439ffd7eda 8d90de51b606957522feabd9c9e063a463a91ecf2065fc63a21c893aed45276d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InitialLowPartsSurviveTrialCopyAndRejectedCommit SolidHhtPairedState.InitialLowPartsSurviveTrialCopyAndRejectedCommit; assertion 13개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InitialLowPartsSurviveTrialCopyAndRejectedCommit 유지 원문 검사 body 및 assertion 동일. 825c8f0dad20f8717e1ea0b6b8603fd2644a8f3994ac000270d5f9e4327983e2 825c8f0dad20f8717e1ea0b6b8603fd2644a8f3994ac000270d5f9e4327983e2 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(initial).IsOk()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_EQ(trial.Value().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(trial.Value().low.residual_scale[0], std::ldexp(1.0, -61)) | EXPECT_EQ(trial.Value().low.linear_momentum_rate[0], std::ldexp(1.0, -59)) | EXPECT_EQ(trial.Value().low.angular_momentum_rate[1], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.inertia_force[0], std::ldexp(1.0, -62)) | EXPECT_EQ(state.Value().CommittedState().low.angular_momentum_rate[2], -std::ldexp(1.0, -60)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(initial).IsOk()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_EQ(trial.Value().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(trial.Value().low.residual_scale[0], std::ldexp(1.0, -61)) | EXPECT_EQ(trial.Value().low.linear_momentum_rate[0], std::ldexp(1.0, -59)) | EXPECT_EQ(trial.Value().low.angular_momentum_rate[1], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.inertia_force[0], std::ldexp(1.0, -62)) | EXPECT_EQ(state.Value().CommittedState().low.angular_momentum_rate[2], -std::ldexp(1.0, -60)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InvalidLowShapeFiniteNormalizationAndIdentitiesFail SolidHhtPairedState.InvalidLowShapeFiniteNormalizationAndIdentitiesFail; assertion 4개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InvalidLowShapeFiniteNormalizationAndIdentitiesFail 유지 원문 검사 body 및 assertion 동일. 2b78c719a88df0067bb2b21166b8c312c308d89d1c1983c1c771809eb499d299 2b78c719a88df0067bb2b21166b8c312c308d89d1c1983c1c771809eb499d299 ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.SubUlpPhysicalDisplacementRecoversNonzeroRates SolidHhtPairedKinematics.SubUlpPhysicalDisplacementRecoversNonzeroRates; assertion 13개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.SubUlpPhysicalDisplacementRecoversNonzeroRates 유지 원문 검사 body 및 assertion 동일. 1f4fe6c56fb73d89e0ad67e5ff0f7f140cbcf1ec8e26da6ea909fe446d6f19c3 1f4fe6c56fb73d89e0ad67e5ff0f7f140cbcf1ec8e26da6ea909fe446d6f19c3 ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | EXPECT_EQ(predictor.Value().displacement[0], 1) | EXPECT_EQ(predictor.Value().displacement_low[0], epsilon) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().velocity[0], 2 * epsilon) | EXPECT_EQ(rates.Value().algorithmic_acceleration_low[0], 0) | EXPECT_EQ(rates.Value().acceleration_low[0], 0) | EXPECT_EQ(rates.Value().velocity_low[0], 0) | ASSERT_TRUE(rounded_rates.HasValue()) | EXPECT_EQ(rounded_rates.Value().acceleration[0], 0) ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | EXPECT_EQ(predictor.Value().displacement[0], 1) | EXPECT_EQ(predictor.Value().displacement_low[0], epsilon) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().velocity[0], 2 * epsilon) | EXPECT_EQ(rates.Value().algorithmic_acceleration_low[0], 0) | EXPECT_EQ(rates.Value().acceleration_low[0], 0) | EXPECT_EQ(rates.Value().velocity_low[0], 0) | ASSERT_TRUE(rounded_rates.HasValue()) | EXPECT_EQ(rounded_rates.Value().acceleration[0], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.PhysicalAndAuxiliaryRatesKeepOldPhysicalTerm SolidHhtPairedKinematics.PhysicalAndAuxiliaryRatesKeepOldPhysicalTerm; assertion 5개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.PhysicalAndAuxiliaryRatesKeepOldPhysicalTerm 유지 원문 검사 body 및 assertion 동일. 50303350d2b5f81d3838936cc4b1c4aefb9d23acffa5f1db16b392d59eadbc49 50303350d2b5f81d3838936cc4b1c4aefb9d23acffa5f1db16b392d59eadbc49 ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 0) | EXPECT_EQ(rates.Value().velocity[0], 6 * epsilon) ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 0) | EXPECT_EQ(rates.Value().velocity[0], 6 * epsilon) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.InvalidLowInputsFailWithoutChangingPredictor SolidHhtPairedKinematics.InvalidLowInputsFailWithoutChangingPredictor; assertion 6개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.InvalidLowInputsFailWithoutChangingPredictor 유지 원문 검사 body 및 assertion 동일. 42be154d7316bf84811c30432c01f348e2cd4964c15a9ca2a8542b3a4d099a72 42be154d7316bf84811c30432c01f348e2cd4964c15a9ca2a8542b3a4d099a72 ASSERT_TRUE(p.HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1, low), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_EQ(predictor.displacement[0], 1) | EXPECT_EQ(predictor.displacement_low[0], 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(0), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1), predictor, fesa::Vector(1), fesa::Vector(1), 1, invalid_parameters) .HasValue()) ASSERT_TRUE(p.HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1, low), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_EQ(predictor.displacement[0], 1) | EXPECT_EQ(predictor.displacement_low[0], 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(0), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1), predictor, fesa::Vector(1), fesa::Vector(1), 1, invalid_parameters) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.MassMultiplyKeepsSubUlpActionAndCancellation SolidHhtPairedKinematics.MassMultiplyKeepsSubUlpActionAndCancellation; assertion 7개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.MassMultiplyKeepsSubUlpActionAndCancellation 유지 원문 검사 body 및 assertion 동일. ef6f15688746af81bfd5dd21af5158228a986336d03b3619f12ec626edb65ebb ef6f15688746af81bfd5dd21af5158228a986336d03b3619f12ec626edb65ebb ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().high[0], 3 * epsilon) | EXPECT_EQ(result.Value().low[0], 0) | EXPECT_EQ(result.Value().high[1], -3) | EXPECT_EQ(result.Value().low[1], 3 * epsilon) | EXPECT_EQ(mass.Value().Multiply(high)[0], 0) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().high[0], 3 * epsilon) | EXPECT_EQ(result.Value().low[0], 0) | EXPECT_EQ(result.Value().high[1], -3) | EXPECT_EQ(result.Value().low[1], 3 * epsilon) | EXPECT_EQ(mass.Value().Multiply(high)[0], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.WeightedIdentityPreservesNonzeroOldResidualLow SolidHhtPairedKinematics.WeightedIdentityPreservesNonzeroOldResidualLow; assertion 11개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.WeightedIdentityPreservesNonzeroOldResidualLow 유지 원문 검사 body 및 assertion 동일. 7bbac5223481362748fa1ff73b62f4b7a0758b25cbf6c9128cf1eeb983846480 7bbac5223481362748fa1ff73b62f4b7a0758b25cbf6c9128cf1eeb983846480 ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.original.high, 3.25) | EXPECT_EQ(result.original.low, epsilon) | EXPECT_EQ(result.solved.high, 3.25) | EXPECT_EQ(result.solved.low, epsilon) | EXPECT_EQ(result.defect.high, 0) | EXPECT_EQ(result.metric.high, 0) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.solved.low, 0) | EXPECT_EQ(result.defect.high, epsilon) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.original.high, 3.25) | EXPECT_EQ(result.original.low, epsilon) | EXPECT_EQ(result.solved.high, 3.25) | EXPECT_EQ(result.solved.low, epsilon) | EXPECT_EQ(result.defect.high, 0) | EXPECT_EQ(result.metric.high, 0) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.solved.low, 0) | EXPECT_EQ(result.defect.high, epsilon) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.BackendEnvironmentMutationFailsAndPreservesPairs SolidHhtPairedState.BackendEnvironmentMutationFailsAndPreservesPairs; assertion 14개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.BackendEnvironmentMutationFailsAndPreservesPairs 유지 원문 검사 body 및 assertion 동일. 3f256cc73e3837028a0a56cde57bac0f445e407b546e0ec820c96be62645c8de 3f256cc73e3837028a0a56cde57bac0f445e407b546e0ec820c96be62645c8de "ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::math_internal::ArithmeticEnvironmentSupported()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""solid-dynamic-arithmetic-environment"") | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(actual.displacement[0], expected.displacement[0]) | EXPECT_EQ(actual.low.displacement[0], expected.low.displacement[0]) | EXPECT_EQ(actual.acceleration[0], expected.acceleration[0]) | EXPECT_EQ(actual.low.acceleration[0], expected.low.acceleration[0]) | EXPECT_EQ(actual.external_work, expected.external_work) | EXPECT_EQ(actual.low.external_work, expected.low.external_work)" "ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::math_internal::ArithmeticEnvironmentSupported()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""solid-dynamic-arithmetic-environment"") | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(actual.displacement[0], expected.displacement[0]) | EXPECT_EQ(actual.low.displacement[0], expected.low.displacement[0]) | EXPECT_EQ(actual.acceleration[0], expected.acceleration[0]) | EXPECT_EQ(actual.low.acceleration[0], expected.low.acceleration[0]) | EXPECT_EQ(actual.external_work, expected.external_work) | EXPECT_EQ(actual.low.external_work, expected.low.external_work)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllConstrainedRetainsPhysicalReactionAndEightPoints SolidHhtDynamics.AllConstrainedRetainsPhysicalReactionAndEightPoints; assertion 9개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllConstrainedRetainsPhysicalReactionAndEightPoints 유지 원문 검사 body 및 assertion 동일. 9aae6cd617d88f7c8d407f069a1bb691963a5b920d9c6ade7953aac765a05542 9aae6cd617d88f7c8d407f069a1bb691963a5b920d9c6ade7953aac765a05542 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 21U) | EXPECT_EQ(f.displacement.Size(), 24U) | EXPECT_EQ(f.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(f.reaction[1], -7) | EXPECT_DOUBLE_EQ(f.acceleration[1], 0) | EXPECT_DOUBLE_EQ(f.external_work, 0) | EXPECT_EQ(f.iteration_count, 0U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 21U) | EXPECT_EQ(f.displacement.Size(), 24U) | EXPECT_EQ(f.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(f.reaction[1], -7) | EXPECT_DOUBLE_EQ(f.acceleration[1], 0) | EXPECT_DOUBLE_EQ(f.external_work, 0) | EXPECT_EQ(f.iteration_count, 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.ActualEndpointsUseDifferentCurvesKnotsInteriorsAndHolds SolidHhtDynamics.ActualEndpointsUseDifferentCurvesKnotsInteriorsAndHolds; assertion 5개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.ActualEndpointsUseDifferentCurvesKnotsInteriorsAndHolds 유지 원문 검사 body 및 assertion 동일. c5e559e653ca89a7bb7004a700e7f2eeff2550e6ceb1f76318567165f97bed7a c5e559e653ca89a7bb7004a700e7f2eeff2550e6ceb1f76318567165f97bed7a ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.external_force[0], 2 * a + 3 * b, 1e-14) | EXPECT_DOUBLE_EQ(f.reaction[0], -f.external_force[0]) | EXPECT_DOUBLE_EQ(f.external_force[5], 7) | EXPECT_DOUBLE_EQ(f.time, static_cast(f.increment_index) * .125) ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.external_force[0], 2 * a + 3 * b, 1e-14) | EXPECT_DOUBLE_EQ(f.reaction[0], -f.external_force[0]) | EXPECT_DOUBLE_EQ(f.external_force[5], 7) | EXPECT_DOUBLE_EQ(f.time, static_cast(f.increment_index) * .125) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RampStartsAtZeroAndAuxiliaryAccelerationIsDistinct SolidHhtDynamics.RampStartsAtZeroAndAuxiliaryAccelerationIsDistinct; assertion 10개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RampStartsAtZeroAndAuxiliaryAccelerationIsDistinct 유지 원문 검사 body 및 assertion 동일. 8806b0f8147101e938132724b2e9fdc8f4a536db7c7d0c03962e17393a021ec9 8806b0f8147101e938132724b2e9fdc8f4a536db7c7d0c03962e17393a021ec9 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frames.front().acceleration[0], 0) | EXPECT_GT(std::abs(frames[1].acceleration[0] - frames[1].algorithmic_acceleration[0]), 1e-5) | EXPECT_NEAR(f.algorithmic_acceleration[0], .95 * f.acceleration[0] + .05 * old.acceleration[0], 1e-14) | EXPECT_LT(f.iterations.back().update_metric, 1e-12) | EXPECT_LE(f.iterations.back().residual_metric, 1e-10) | EXPECT_DOUBLE_EQ(f.displacement[i], 0) | EXPECT_DOUBLE_EQ(f.velocity[i], 0) | EXPECT_DOUBLE_EQ(f.acceleration[i], 0) | EXPECT_DOUBLE_EQ(f.algorithmic_acceleration[i], 0) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frames.front().acceleration[0], 0) | EXPECT_GT(std::abs(frames[1].acceleration[0] - frames[1].algorithmic_acceleration[0]), 1e-5) | EXPECT_NEAR(f.algorithmic_acceleration[0], .95 * f.acceleration[0] + .05 * old.acceleration[0], 1e-14) | EXPECT_LT(f.iterations.back().update_metric, 1e-12) | EXPECT_LE(f.iterations.back().residual_metric, 1e-10) | EXPECT_DOUBLE_EQ(f.displacement[i], 0) | EXPECT_DOUBLE_EQ(f.velocity[i], 0) | EXPECT_DOUBLE_EQ(f.acceleration[i], 0) | EXPECT_DOUBLE_EQ(f.algorithmic_acceleration[i], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.OneFreeTranslationHasAnalyticLumpedInertialSupportReactions SolidHhtDynamics.OneFreeTranslationHasAnalyticLumpedInertialSupportReactions; assertion 4개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.OneFreeTranslationHasAnalyticLumpedInertialSupportReactions 유지 원문 검사 body 및 assertion 동일. 1c002e47b63b342b26d3651c49bb19e06ac80d6f2744f2f435c9190103f3d797 1c002e47b63b342b26d3651c49bb19e06ac80d6f2744f2f435c9190103f3d797 ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.reaction[3 * b + c], reaction, roundoff * scale) | EXPECT_NEAR(weighted, endpoint_identity, roundoff * scale) | EXPECT_NEAR(f.iterations.back().weighted_residual_numerator, std::abs(weighted), roundoff * scale) ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.reaction[3 * b + c], reaction, roundoff * scale) | EXPECT_NEAR(weighted, endpoint_identity, roundoff * scale) | EXPECT_NEAR(f.iterations.back().weighted_residual_numerator, std::abs(weighted), roundoff * scale) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.BackendNanNonconvergenceAndInversionPreserveAcceptedInitial SolidHhtDynamics.BackendNanNonconvergenceAndInversionPreserveAcceptedInitial; assertion 21개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.BackendNanNonconvergenceAndInversionPreserveAcceptedInitial 유지 원문 검사 body 및 assertion 동일. 994315fd5e36287233e88949fa06cdd1a82a3df567118949362421a330549049 994315fd5e36287233e88949fa06cdd1a82a3df567118949362421a330549049 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 0U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], 0) | EXPECT_NEAR(state.Value().CommittedState().acceleration[0], .01 / .25, 1e-14) | ASSERT_FALSE(state.Value().IterationRecords().empty()) | EXPECT_EQ(state.Value().IterationRecords().back().stage, ""failed"") | EXPECT_FALSE(state.Value().IterationRecords().back().failure_code.empty()) | EXPECT_EQ(failed.evidence.iteration_index, 100U) | EXPECT_EQ(failed.failure_code, ""solid-dynamic-nonconvergence"") | EXPECT_FALSE(failed.failure_force_sum.has_value()) | EXPECT_NEAR(failed.evidence.worst_force_terms[1], expected_inertia, 32 * std::numeric_limits::epsilon() * std::abs(expected_inertia)) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[2], 0) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[3], .01) | EXPECT_FALSE(failed.evidence.residual_pass) | EXPECT_TRUE(failed.evidence.update_pass) | EXPECT_TRUE(failed.evidence.correction_pass) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().low.displacement[i], 0)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 0U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], 0) | EXPECT_NEAR(state.Value().CommittedState().acceleration[0], .01 / .25, 1e-14) | ASSERT_FALSE(state.Value().IterationRecords().empty()) | EXPECT_EQ(state.Value().IterationRecords().back().stage, ""failed"") | EXPECT_FALSE(state.Value().IterationRecords().back().failure_code.empty()) | EXPECT_EQ(failed.evidence.iteration_index, 100U) | EXPECT_EQ(failed.failure_code, ""solid-dynamic-nonconvergence"") | EXPECT_FALSE(failed.failure_force_sum.has_value()) | EXPECT_NEAR(failed.evidence.worst_force_terms[1], expected_inertia, 32 * std::numeric_limits::epsilon() * std::abs(expected_inertia)) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[2], 0) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[3], .01) | EXPECT_FALSE(failed.evidence.residual_pass) | EXPECT_TRUE(failed.evidence.update_pass) | EXPECT_TRUE(failed.evidence.correction_pass) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().low.displacement[i], 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.LateBackendFailurePreservesActualCommittedMotionAndHistory SolidHhtDynamics.LateBackendFailurePreservesActualCommittedMotionAndHistory; assertion 11개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.LateBackendFailurePreservesActualCommittedMotionAndHistory 유지 원문 검사 body 및 assertion 동일. 0e04bfa810734cd17fe3ed9b0ce99f803e24ecf3224cfee93f44df7f79d2f3b9 0e04bfa810734cd17fe3ed9b0ce99f803e24ecf3224cfee93f44df7f79d2f3b9 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 1U) | EXPECT_GT(state.Value().CommittedState().displacement[0], 0) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().strain_energy, committed.strain_energy) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 1U) | EXPECT_GT(state.Value().CommittedState().displacement[0], 0) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().strain_energy, committed.strain_energy) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.NonfiniteWeightedEvidenceCannotContaminateAcceptedHistory SolidHhtDynamics.NonfiniteWeightedEvidenceCannotContaminateAcceptedHistory; assertion 7개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.NonfiniteWeightedEvidenceCannotContaminateAcceptedHistory 유지 원문 검사 body 및 assertion 동일. 6e0271bb8ebda6f0a0c5a3a7a2287c385827fd8d17d18652b2208b204bf6ab8e 6e0271bb8ebda6f0a0c5a3a7a2287c385827fd8d17d18652b2208b204bf6ab8e ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::SolidHhtDynamicProcedureExecutor(parallel, mass, tangent) .ExecuteInto(domain.Value(), state.Value()) .IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::SolidHhtDynamicProcedureExecutor(parallel, mass, tangent) .ExecuteInto(domain.Value(), state.Value()) .IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AlphaZeroLinearUnforcedTailConservesEnergyAndTrapezoidWork SolidHhtDynamics.AlphaZeroLinearUnforcedTailConservesEnergyAndTrapezoidWork; assertion 6개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AlphaZeroLinearUnforcedTailConservesEnergyAndTrapezoidWork 유지 원문 검사 body 및 assertion 동일. dd866c138e709fdc9aa58b3b2e87b3781004ecb72d2991144c208d93d71b1ea8 dd866c138e709fdc9aa58b3b2e87b3781004ecb72d2991144c208d93d71b1ea8 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_GT(tail, 1e-7) | EXPECT_NEAR(frames[n].external_work, work, 1e-16) | EXPECT_NEAR(frames[n].energy_balance_error, 0, 2e-12 * tail) | EXPECT_NEAR(frames[n].kinetic_energy + frames[n].strain_energy, tail, 2e-12 * tail) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_GT(tail, 1e-7) | EXPECT_NEAR(frames[n].external_work, work, 1e-16) | EXPECT_NEAR(frames[n].energy_balance_error, 0, 2e-12 * tail) | EXPECT_NEAR(frames[n].kinetic_energy + frames[n].strain_energy, tail, 2e-12 * tail) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.InitialMassBackendFailuresPreserveEmptyHistory SolidHhtDynamics.InitialMassBackendFailuresPreserveEmptyHistory; assertion 12개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.InitialMassBackendFailuresPreserveEmptyHistory 유지 원문 검사 body 및 assertion 동일. e05bf94288c50cbcb48e82d010333756d3468e53ca60fd91f161a749ed0f1ffc e05bf94288c50cbcb48e82d010333756d3468e53ca60fd91f161a749ed0f1ffc "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) | ASSERT_EQ(records.size(), factorization ? 1U : 2U) | EXPECT_EQ(records.front().stage, ""initial-mass"") | EXPECT_EQ(records.front().outcome, ""residual-refinement"") | EXPECT_EQ(records.front().evidence.iteration_index, 0U) | EXPECT_FALSE(records.front().evidence.residual_pass) | EXPECT_EQ(records.back().stage, ""failed"") | EXPECT_EQ(records.back().failure_code, ""injected-backend"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) | ASSERT_EQ(records.size(), factorization ? 1U : 2U) | EXPECT_EQ(records.front().stage, ""initial-mass"") | EXPECT_EQ(records.front().outcome, ""residual-refinement"") | EXPECT_EQ(records.front().evidence.iteration_index, 0U) | EXPECT_FALSE(records.front().evidence.residual_pass) | EXPECT_EQ(records.back().stage, ""failed"") | EXPECT_EQ(records.back().failure_code, ""injected-backend"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllFreeNoForceIsExactlyAtRestForLinearAndTl SolidHhtDynamics.AllFreeNoForceIsExactlyAtRestForLinearAndTl; assertion 10개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllFreeNoForceIsExactlyAtRestForLinearAndTl 유지 원문 검사 body 및 assertion 동일. d09d84966fea765d732e231ff5dde9c2e8a649cbd91c3a946e2020274e398ddd d09d84966fea765d732e231ff5dde9c2e8a649cbd91c3a946e2020274e398ddd ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0) | EXPECT_DOUBLE_EQ(frame.strain_energy, 0) | EXPECT_DOUBLE_EQ(frame.displacement[i], 0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0) | EXPECT_DOUBLE_EQ(frame.strain_energy, 0) | EXPECT_DOUBLE_EQ(frame.displacement[i], 0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalLinearAcceptsAll101Endpoints SolidHhtSourceSmoke.ReadOnlyOriginalLinearAcceptsAll101Endpoints; assertion 0개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalLinearAcceptsAll101Endpoints 유지 원문 검사 body 및 assertion 동일. 5391fef4221914378a7f90aee66f4b5dfdce359f6f20a5206103e3df7bc40d95 5391fef4221914378a7f90aee66f4b5dfdce359f6f20a5206103e3df7bc40d95 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalNonlinearAcceptsAll101Endpoints SolidHhtSourceSmoke.ReadOnlyOriginalNonlinearAcceptsAll101Endpoints; assertion 0개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalNonlinearAcceptsAll101Endpoints 유지 원문 검사 body 및 assertion 동일. 24b67b4ab019d0f53319e5523d3aa2893debf73e13edf2dab5f27889e9547dfd 24b67b4ab019d0f53319e5523d3aa2893debf73e13edf2dab5f27889e9547dfd 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRetainsNonzeroOldResidualAndEffectiveTangent SolidHhtDynamics.WeightedIdentityRetainsNonzeroOldResidualAndEffectiveTangent; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRetainsNonzeroOldResidualAndEffectiveTangent 유지 원문 검사 body 및 assertion 동일. f7634aeb2f9bf5b13387abd6ef3e10c9f2f0024741dbc34a156e27668892ce91 f7634aeb2f9bf5b13387abd6ef3e10c9f2f0024741dbc34a156e27668892ce91 ASSERT_TRUE(mass.HasValue()) | ASSERT_NE(old.residual[0], 0) | ASSERT_NE(old.residual[1], 0) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), i, MA[i], next, old, alpha, &identities[i])) | EXPECT_LE(identities[i].metric, 1e-12) | EXPECT_NEAR( identities[i].original, identities[i].solved, 512 * std::numeric_limits::epsilon() * identities[i].scale) | EXPECT_GT( std::abs(identities[i].solved - (1 + alpha) * next.residual[i]), .01) | EXPECT_NEAR((right[i].solved - left[i].solved) / (2 * epsilon), tangent_direction[i], 1e-9 * std::abs(tangent_direction[i])) ASSERT_TRUE(mass.HasValue()) | ASSERT_NE(old.residual[0], 0) | ASSERT_NE(old.residual[1], 0) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), i, MA[i], next, old, alpha, &identities[i])) | EXPECT_LE(identities[i].metric, 1e-12) | EXPECT_NEAR( identities[i].original, identities[i].solved, 512 * std::numeric_limits::epsilon() * identities[i].scale) | EXPECT_GT( std::abs(identities[i].solved - (1 + alpha) * next.residual[i]), .01) | EXPECT_NEAR((right[i].solved - left[i].solved) / (2 * epsilon), tangent_direction[i], 1e-9 * std::abs(tangent_direction[i])) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRejectsNonfiniteAndOverflowBeforeNormReduction SolidHhtDynamics.WeightedIdentityRejectsNonfiniteAndOverflowBeforeNormReduction; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRejectsNonfiniteAndOverflowBeforeNormReduction 유지 원문 검사 body 및 assertion 동일. 21767e2f26a9783ef8b3ea4897f8543314f9353f4d55800634852db6ca5e9b2a 21767e2f26a9783ef8b3ea4897f8543314f9353f4d55800634852db6ca5e9b2a ASSERT_TRUE(mass.HasValue()) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_EQ(identity.scale, 0) | EXPECT_EQ(identity.metric, 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, invalid, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, bad, previous, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) ASSERT_TRUE(mass.HasValue()) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_EQ(identity.scale, 0) | EXPECT_EQ(identity.metric, 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, invalid, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, bad, previous, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FullFreeNewtonRecoversAllComponentsAfterCoupledTrialPerturbation SolidHhtDynamics.FullFreeNewtonRecoversAllComponentsAfterCoupledTrialPerturbation; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FullFreeNewtonRecoversAllComponentsAfterCoupledTrialPerturbation 유지 원문 검사 body 및 assertion 동일. 9e1a1f350b3a8da815127d3678f269e8701013a5e689bab8a5a1c4dc5e965a41 9e1a1f350b3a8da815127d3678f269e8701013a5e689bab8a5a1c4dc5e965a41 ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(tangent.kicked) | EXPECT_TRUE(tangent.full_size_all_calls) | EXPECT_TRUE(tangent.solved_after_kick) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * n], .5 * frame.time * frame.time, roundoff * .5 * frame.time * frame.time) ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(tangent.kicked) | EXPECT_TRUE(tangent.full_size_all_calls) | EXPECT_TRUE(tangent.solved_after_kick) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * n], .5 * frame.time * frame.time, roundoff * .5 * frame.time * frame.time) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.RepresentableNeighborUsesHeldCouplingAndOriginalFullForceMetric SolidHhtFloat64History.RepresentableNeighborUsesHeldCouplingAndOriginalFullForceMetric; assertion 24개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.RepresentableNeighborUsesHeldCouplingAndOriginalFullForceMetric 유지 원문 검사 body 및 assertion 동일. edbbaae61828136237c20662167cca044b5992c324f9989e801d85b6ae72343a edbbaae61828136237c20662167cca044b5992c324f9989e801d85b6ae72343a ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | ASSERT_GT(initial, 1e-10) | ASSERT_EQ(frame.residual[1], 0) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected)) | ASSERT_TRUE(selected.found) | EXPECT_EQ(selected.full_dof, 1U) | EXPECT_EQ(selected.displacement, std::nextafter(.5, -std::numeric_limits::infinity())) | EXPECT_EQ(selected.delta, selected.displacement - frame.displacement[1]) | EXPECT_LT(selected.predicted_metric, initial) | EXPECT_LE(selected.predicted_metric, 1e-10) | EXPECT_EQ(selected.predicted_metric, exact_metric) | ASSERT_TRUE(alternative_tangent.HasValue()) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), alternative_tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected, &ranked)) | ASSERT_EQ(ranked.size(), 2U) | EXPECT_EQ(ranked[0].full_dof, 0U) | EXPECT_EQ(ranked[1].full_dof, 1U) | EXPECT_LT(ranked[0].predicted_metric, ranked[1].predicted_metric) | EXPECT_LT(ranked[1].predicted_metric, initial) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_TRUE(accepted.Value()) | EXPECT_EQ(tried, (std::vector{0, 1})) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(tried, (std::vector{0})) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | ASSERT_GT(initial, 1e-10) | ASSERT_EQ(frame.residual[1], 0) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected)) | ASSERT_TRUE(selected.found) | EXPECT_EQ(selected.full_dof, 1U) | EXPECT_EQ(selected.displacement, std::nextafter(.5, -std::numeric_limits::infinity())) | EXPECT_EQ(selected.delta, selected.displacement - frame.displacement[1]) | EXPECT_LT(selected.predicted_metric, initial) | EXPECT_LE(selected.predicted_metric, 1e-10) | EXPECT_EQ(selected.predicted_metric, exact_metric) | ASSERT_TRUE(alternative_tangent.HasValue()) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), alternative_tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected, &ranked)) | ASSERT_EQ(ranked.size(), 2U) | EXPECT_EQ(ranked[0].full_dof, 0U) | EXPECT_EQ(ranked[1].full_dof, 1U) | EXPECT_LT(ranked[0].predicted_metric, ranked[1].predicted_metric) | EXPECT_LT(ranked[1].predicted_metric, initial) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_TRUE(accepted.Value()) | EXPECT_EQ(tried, (std::vector{0, 1})) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(tried, (std::vector{0})) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RepresentableNeighborKeepsExactZeroAndRejectsInvalidArithmetic SolidHhtDynamics.RepresentableNeighborKeepsExactZeroAndRejectsInvalidArithmetic; assertion 6개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RepresentableNeighborKeepsExactZeroAndRejectsInvalidArithmetic 유지 원문 검사 body 및 assertion 동일. d9613a73dba9cc37e8a8f2190ca794fcacc17920cf0fba558508b576429d4d31 d9613a73dba9cc37e8a8f2190ca794fcacc17920cf0fba558508b576429d4d31 ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | EXPECT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, .1, -.05, .275625, &selected)) | EXPECT_FALSE(selected.found) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, bad, .1, -.05, .275625, &selected)) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, 0, -.05, .275625, &selected)) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | EXPECT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, .1, -.05, .275625, &selected)) | EXPECT_FALSE(selected.found) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, bad, .1, -.05, .275625, &selected)) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, 0, -.05, .275625, &selected)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ActualNewtonStallAtLowHalfOfTwoCycleTriesFallback SolidHhtFloat64History.ActualNewtonStallAtLowHalfOfTwoCycleTriesFallback; assertion 10개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ActualNewtonStallAtLowHalfOfTwoCycleTriesFallback 유지 원문 검사 body 및 assertion 동일. 704d7a705643dd225528629f4b721162a3c853dd1a41efd579935737b8adeb80 704d7a705643dd225528629f4b721162a3c853dd1a41efd579935737b8adeb80 "ASSERT_LT(current_metric, previous_metric) | ASSERT_TRUE(history.Capture(previous, mask, metrics, 0, false)) | ASSERT_TRUE(history.Capture(current, mask, metrics, 1, false)) | EXPECT_TRUE(history.Match(previous, mask, metrics, false, &repeat)) | ASSERT_TRUE(selected.HasValue()) | EXPECT_TRUE(selected.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton"", ""actual-neighbor""})) | ASSERT_TRUE(productive.HasValue()) | EXPECT_FALSE(productive.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton""}))" "ASSERT_LT(current_metric, previous_metric) | ASSERT_TRUE(history.Capture(previous, mask, metrics, 0, false)) | ASSERT_TRUE(history.Capture(current, mask, metrics, 1, false)) | EXPECT_TRUE(history.Match(previous, mask, metrics, false, &repeat)) | ASSERT_TRUE(selected.HasValue()) | EXPECT_TRUE(selected.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton"", ""actual-neighbor""})) | ASSERT_TRUE(productive.HasValue()) | EXPECT_FALSE(productive.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton""}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ExactNewtonLoopHistoryDetectsThreeStateRecurrence SolidHhtFloat64History.ExactNewtonLoopHistoryDetectsThreeStateRecurrence; assertion 28개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ExactNewtonLoopHistoryDetectsThreeStateRecurrence 유지 원문 검사 body 및 assertion 동일. 0d255c9f25e86d515bd140a91ed3a0af1f996156162df0c81c8e8cb340b2cd78 0d255c9f25e86d515bd140a91ed3a0af1f996156162df0c81c8e8cb340b2cd78 ASSERT_TRUE(history.Capture(first, first_mask, first_metrics, 4, false)) | ASSERT_TRUE(history.Capture(second, second_mask, second_metrics, 5, false)) | ASSERT_TRUE(history.Capture(third, first_mask, second_metrics, 6, false)) | EXPECT_EQ(history.Size(), 3U) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 4U) | EXPECT_EQ(e.history_entry_count, 3U) | EXPECT_EQ(e.changed_translations, 0U) | EXPECT_EQ(e.changed_holding_mask, 0U) | EXPECT_EQ(e.changed_correction_metrics, 0U) | ASSERT_TRUE(history.Match(first, second_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, different_metrics, false, &e)) | EXPECT_TRUE( e.repeat) | EXPECT_EQ(e.changed_correction_metrics, 1U) | ASSERT_TRUE(history.Match(first, first_mask, failing_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, true, &e)) | EXPECT_FALSE(e.repeat) | EXPECT_FALSE( history.Match(fesa::Vector(2), first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, {false}, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, first_metrics, 7, false)) | EXPECT_FALSE(history.Match(first, first_mask, bad_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, bad_metrics, 7, false)) ASSERT_TRUE(history.Capture(first, first_mask, first_metrics, 4, false)) | ASSERT_TRUE(history.Capture(second, second_mask, second_metrics, 5, false)) | ASSERT_TRUE(history.Capture(third, first_mask, second_metrics, 6, false)) | EXPECT_EQ(history.Size(), 3U) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 4U) | EXPECT_EQ(e.history_entry_count, 3U) | EXPECT_EQ(e.changed_translations, 0U) | EXPECT_EQ(e.changed_holding_mask, 0U) | EXPECT_EQ(e.changed_correction_metrics, 0U) | ASSERT_TRUE(history.Match(first, second_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, different_metrics, false, &e)) | EXPECT_TRUE( e.repeat) | EXPECT_EQ(e.changed_correction_metrics, 1U) | ASSERT_TRUE(history.Match(first, first_mask, failing_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, true, &e)) | EXPECT_FALSE(e.repeat) | EXPECT_FALSE( history.Match(fesa::Vector(2), first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, {false}, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, first_metrics, 7, false)) | EXPECT_FALSE(history.Match(first, first_mask, bad_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, bad_metrics, 7, false)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.EquivalentFailedNewtonEntrySurvivesRepresentableMove SolidHhtFloat64History.EquivalentFailedNewtonEntrySurvivesRepresentableMove; assertion 21개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.EquivalentFailedNewtonEntrySurvivesRepresentableMove 유지 원문 검사 body 및 assertion 동일. 6b2aeb48d13d507d18a5dd85677f1fbc3204be7f109d4237fb3cae32ca59e4e1 6b2aeb48d13d507d18a5dd85677f1fbc3204be7f109d4237fb3cae32ca59e4e1 "ASSERT_TRUE(history.Capture(failed, mask, correction, 23, true)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, large, 23, false)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, correction, 23, false)) | EXPECT_TRUE(history.Match(failed, mask, correction, false, &e)) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(first.Value()) | EXPECT_NE(actual[0], failed[0]) | EXPECT_TRUE(history.Match(failed, mask, new_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 23U) | ASSERT_TRUE(second.HasValue()) | EXPECT_TRUE(second.Value()) | EXPECT_EQ(applied, (std::vector{""accepted-ulp"", ""returning-newton-evaluated"", ""another-accepted-ulp""})) | ASSERT_TRUE(history.Match(fresh, mask, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, {true, false}, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, mask, new_metrics, true, &e)) | EXPECT_FALSE(e.repeat)" "ASSERT_TRUE(history.Capture(failed, mask, correction, 23, true)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, large, 23, false)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, correction, 23, false)) | EXPECT_TRUE(history.Match(failed, mask, correction, false, &e)) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(first.Value()) | EXPECT_NE(actual[0], failed[0]) | EXPECT_TRUE(history.Match(failed, mask, new_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 23U) | ASSERT_TRUE(second.HasValue()) | EXPECT_TRUE(second.Value()) | EXPECT_EQ(applied, (std::vector{""accepted-ulp"", ""returning-newton-evaluated"", ""another-accepted-ulp""})) | ASSERT_TRUE(history.Match(fresh, mask, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, {true, false}, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, mask, new_metrics, true, &e)) | EXPECT_FALSE(e.repeat)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.UnsupportedPairedProductsPreserveEmptyHistory SolidHhtDynamics.UnsupportedPairedProductsPreserveEmptyHistory; assertion 9개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.UnsupportedPairedProductsPreserveEmptyHistory 유지 원문 검사 body 및 assertion 동일. ee1b43798dba3932ce708b5da15e9939ca00a2600a213127e00db3b0a0fdfd03 ee1b43798dba3932ce708b5da15e9939ca00a2600a213127e00db3b0a0fdfd03 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(status.Diagnostics().front().message.find(""supported""), std::string::npos) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue())" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(status.Diagnostics().front().message.find(""supported""), std::string::npos) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FailureShadowRecoversCancellationAndRejectsOverflow SolidHhtDynamics.FailureShadowRecoversCancellationAndRejectsOverflow; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FailureShadowRecoversCancellationAndRejectsOverflow 유지 원문 검사 body 및 assertion 동일. e0a5f34b9c1b33e66905824b7b4c1a4a0987200be7dc62c0e9f98a1ff767e22b e0a5f34b9c1b33e66905824b7b4c1a4a0987200be7dc62c0e9f98a1ff767e22b ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( term, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 0) | EXPECT_EQ(sum + correction, 1) | ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( 1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( -1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 1e308) | EXPECT_EQ(absolute_sum, 1e308) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( 0, std::numeric_limits::quiet_NaN(), &sum, &correction, &absolute_sum)) ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( term, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 0) | EXPECT_EQ(sum + correction, 1) | ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( 1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( -1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 1e308) | EXPECT_EQ(absolute_sum, 1e308) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( 0, std::numeric_limits::quiet_NaN(), &sum, &correction, &absolute_sum)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp support@1-151 helper/oracle/fixture/include/static assertion 구간: RunDynamics, Injected, ControlledTangent, FailedMass, OneFree, namespace, PairedUniformInitial tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e167ec455207cb5017c17c0b7637acff39128fa39f59e11d3c25f2701f98c2ff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp support@375-444 helper/oracle/fixture/include/static assertion 구간: RestoreArithmeticEnvironment, MutateArithmeticEnvironment, defined, EnvironmentMass, EnvironmentTangent tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b2d00fc08e11c3ce43e06b98f3dae891caf968c4b4fa6bd29a53bdab50fb2004 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp support@854-975 helper/oracle/fixture/include/static assertion 구간: CheckOriginalSourceDeck, if, for tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3246a745bf72b60f32cde913fdf1d843b9baa70e5c6d6a3887a9d41f9bbbdf45 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f741d023883fd91114346b233a5a1b14c9bc760085fe9830079643d4eea06f84 2973549ac31485ce1ab52ad5dc69ca0e8790f437361cf696f53e4bac0b9c627c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedSerialAndTbbPreserveEveryLowComponent SolidHhtTemporal.PairedSerialAndTbbPreserveEveryLowComponent; assertion 0개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedSerialAndTbbPreserveEveryLowComponent 유지 원문 검사 body 및 assertion 동일. 925f400f0ca59d4e2137357ae92f2a0dd2d7509f13b020d8976c51c5aca4650c 925f400f0ca59d4e2137357ae92f2a0dd2d7509f13b020d8976c51c5aca4650c 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FreeConstantForceHasAnalyticalInitialAcceleration SolidHhtTemporal.FreeConstantForceHasAnalyticalInitialAcceleration; assertion 4개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FreeConstantForceHasAnalyticalInitialAcceleration 유지 원문 검사 body 및 assertion 동일. cb0a64053e82c3ccc5536f4e9436ad00984a15283b69f2f32cad33eb3f89713f cb0a64053e82c3ccc5536f4e9436ad00984a15283b69f2f32cad33eb3f89713f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(initial.acceleration[3 * node], 1, 1e-13) | EXPECT_DOUBLE_EQ(initial.displacement[3 * node], 0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(initial.acceleration[3 * node], 1, 1e-13) | EXPECT_DOUBLE_EQ(initial.displacement[3 * node], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.AllFreeUniformForceRetainsExactRigidTranslationBehavior SolidHhtTemporal.AllFreeUniformForceRetainsExactRigidTranslationBehavior; assertion 9개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.AllFreeUniformForceRetainsExactRigidTranslationBehavior 유지 원문 검사 body 및 assertion 동일. 8f852ae83f87b923ddb98e6b8def6326dadb54b8a8e7f239ca53f21cb5740be0 8f852ae83f87b923ddb98e6b8def6326dadb54b8a8e7f239ca53f21cb5740be0 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(std::any_of( state.Value().IterationRecords().begin(), state.Value().IterationRecords().end(), [](const auto& record) { return record.outcome == ""paired-candidate""; })) | EXPECT_NEAR(f.displacement[3 * n], .5 * f.time * f.time, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n], f.time, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n], 1, roundoff) | EXPECT_NEAR(f.displacement[3 * n + c], 0, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n + c], 0, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n + c], 0, roundoff)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(std::any_of( state.Value().IterationRecords().begin(), state.Value().IterationRecords().end(), [](const auto& record) { return record.outcome == ""paired-candidate""; })) | EXPECT_NEAR(f.displacement[3 * n], .5 * f.time * f.time, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n], f.time, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n], 1, roundoff) | EXPECT_NEAR(f.displacement[3 * n + c], 0, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n + c], 0, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n + c], 0, roundoff)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedNewtonKeepsAllOriginalComponentsAcrossAxesAndScales SolidHhtTemporal.PairedNewtonKeepsAllOriginalComponentsAcrossAxesAndScales; assertion 10개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedNewtonKeepsAllOriginalComponentsAcrossAxesAndScales 유지 원문 검사 body 및 assertion 동일. 7652c6a7c34e2a7cb0a270e47e8f0e15059187b39635ba1980ddbfac049e0764 7652c6a7c34e2a7cb0a270e47e8f0e15059187b39635ba1980ddbfac049e0764 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * node + c], .5 * a * frame.time * frame.time, roundoff * .5 * acceleration * frame.time * frame.time) | EXPECT_NEAR(frame.velocity[3 * node + c], a * frame.time, roundoff * acceleration * frame.time) | EXPECT_NEAR(frame.acceleration[3 * node + c], a, roundoff * acceleration) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * node + c], .5 * a * frame.time * frame.time, roundoff * .5 * acceleration * frame.time * frame.time) | EXPECT_NEAR(frame.velocity[3 * node + c], a * frame.time, roundoff * acceleration * frame.time) | EXPECT_NEAR(frame.acceleration[3 * node + c], a, roundoff * acceleration) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.ActualTwoBrickLinearAndRotatingSmallStrainTlAreSecondOrder SolidHhtTemporal.ActualTwoBrickLinearAndRotatingSmallStrainTlAreSecondOrder; assertion 4개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.ActualTwoBrickLinearAndRotatingSmallStrainTlAreSecondOrder 유지 원문 검사 body 및 assertion 동일. e27884c416eb70f27d47e3985209f13751955e5c30a689ad6d938474f41ca416 e27884c416eb70f27d47e3985209f13751955e5c30a689ad6d938474f41ca416 EXPECT_GT(fine[j], 1e-8) | EXPECT_LT(coarse[j], .1) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) EXPECT_GT(fine[j], 1e-8) | EXPECT_LT(coarse[j], .1) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentThreeDofBrickOscillatorHasSecondOrderUVA SolidHhtTemporal.IndependentThreeDofBrickOscillatorHasSecondOrderUVA; assertion 5개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentThreeDofBrickOscillatorHasSecondOrderUVA 유지 원문 검사 body 및 assertion 동일. a3cc00aa843d56fb0d6354682dccb6ddb98a61b624f57e2337a37499cc7e3efa a3cc00aa843d56fb0d6354682dccb6ddb98a61b624f57e2337a37499cc7e3efa ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-15) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-15) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentScalarBrickOscillatorHasSecondOrderUVA SolidHhtTemporal.IndependentScalarBrickOscillatorHasSecondOrderUVA; assertion 7개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentScalarBrickOscillatorHasSecondOrderUVA 유지 원문 검사 body 및 assertion 동일. 8cd02e0db682a2480cd82a7ce3bb9d235ada6080f491eb79a280b4fd3469633f 8cd02e0db682a2480cd82a7ce3bb9d235ada6080f491eb79a280b4fd3469633f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR( f.kinetic_energy, .5 * m * f.velocity[0] * f.velocity[0], 512 * std::numeric_limits::epsilon() * f.kinetic_energy) | EXPECT_NEAR(f.strain_energy, .5 * k * f.displacement[0] * f.displacement[0], 512 * std::numeric_limits::epsilon() * f.strain_energy) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-8) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR( f.kinetic_energy, .5 * m * f.velocity[0] * f.velocity[0], 512 * std::numeric_limits::epsilon() * f.kinetic_energy) | EXPECT_NEAR(f.strain_energy, .5 * k * f.displacement[0] * f.displacement[0], 512 * std::numeric_limits::epsilon() * f.strain_energy) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FixedThicknessBendingRetainsDiscreteBulkBias SolidHhtTemporal.FixedThicknessBendingRetainsDiscreteBulkBias; assertion 3개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FixedThicknessBendingRetainsDiscreteBulkBias 유지 원문 검사 body 및 assertion 동일. e9210764d5fd451d439b84dfd39db8695cac0f2bb2e9aefc1913caaa132185f4 e9210764d5fd451d439b84dfd39db8695cac0f2bb2e9aefc1913caaa132185f4 EXPECT_NEAR(energy[0] / continuum, limit + parasitic, 2e-11) | EXPECT_NEAR(energy[2] / continuum, 0, 2e-13) | EXPECT_NEAR(previous_parasitic / parasitic, 4, 1e-13) EXPECT_NEAR(energy[0] / continuum, limit + parasitic, 2e-11) | EXPECT_NEAR(energy[2] / continuum, 0, 2e-13) | EXPECT_NEAR(previous_parasitic / parasitic, 4, 1e-13) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.BendingMeshRefinementQuantifiesFullIntegrationShearLocking SolidHhtTemporal.BendingMeshRefinementQuantifiesFullIntegrationShearLocking; assertion 4개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.BendingMeshRefinementQuantifiesFullIntegrationShearLocking 유지 원문 검사 body 및 assertion 동일. f2d9632408ddbfd1de879876b41c4dbed627801d1bc3b1454cedd7b77345ce1d f2d9632408ddbfd1de879876b41c4dbed627801d1bc3b1454cedd7b77345ce1d EXPECT_NEAR(error, shear - missing_bulk, 2e-11) | EXPECT_NEAR(energy[1] / continuum, 4 * mu / (3 * axial) + shear, 2e-11) | EXPECT_NEAR(energy[2] / continuum, bulk / axial - missing_bulk, 2e-11) | EXPECT_NEAR(previous_error / error, 4, 1e-10) EXPECT_NEAR(error, shear - missing_bulk, 2e-11) | EXPECT_NEAR(energy[1] / continuum, 4 * mu / (3 * axial) + shear, 2e-11) | EXPECT_NEAR(energy[2] / continuum, bulk / axial - missing_bulk, 2e-11) | EXPECT_NEAR(previous_error / error, 4, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp support@1-332 helper/oracle/fixture/include/static assertion 구간: AffineMotion, Motion, if, Apply, TwoBricks, ExactForce, ExactMassProduct, AddCross, ManufacturedRun, for tests/unit/analysis/solid_hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4c8ee89aab5bd9798906f93ce66756ce94ef4d24fd91379106f91fb317702361 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_temporal_verification_test.cpp support@602-649 helper/oracle/fixture/include/static assertion 구간: BendingEnergy tests/unit/analysis/solid_hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5ea1a45d3745809343ba4a3358aaafeb00f60c830f663189069687af8a684b7f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_test_fixture.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/unit/analysis/solid_hht_test_fixture.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e2621f72b12715391a06e51ec23a320063679e90af74443afd5237197194b962 2ffd1ec89405f926f038cb58fc612604ff8e17853c134caf7cb127c32685cefd 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_hht_test_fixture.h support@1-52 helper/oracle/fixture/include/static assertion 구간: solid_hht_test, Brick, Message tests/unit/analysis/solid_hht_test_fixture.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e2621f72b12715391a06e51ec23a320063679e90af74443afd5237197194b962 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_static_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 22개 tests/unit/analysis/solid_static_procedure_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 34391f18bae6f8ff3abe2d99d252ab74cbdd481fd066ba1594419eb2f1da5ab1 8253b2e91a4db4d52cc039a5084ddfb93f7b0ffd1d10b1680e0e79439eabcb04 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LinearForceNonzeroSupportAndCompleteRecovery SolidStaticProcedure.LinearForceNonzeroSupportAndCompleteRecovery; assertion 17개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LinearForceNonzeroSupportAndCompleteRecovery 유지 원문 검사 body 및 assertion 동일. 0661804c27dc3d473e445fb06a9874f92a9e56b90ad2f77cafcd5eda24a801ed 0661804c27dc3d473e445fb06a9874f92a9e56b90ad2f77cafcd5eda24a801ed ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_EQ(frame.frame_index, 0U) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | ASSERT_EQ(frame.displacement.Size(), 24U) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_NEAR(frame.displacement[3 * a], 0.02 + 0.01 * kX[a][0], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 1], -0.0025 * kX[a][1], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 2], -0.0025 * kX[a][2], 1e-13) | EXPECT_DOUBLE_EQ(frame.reaction[3 * a], 0.0) | EXPECT_NEAR(frame.reaction[3 * a], -0.3, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 0.006, 1e-13) | EXPECT_NEAR(point.cauchy_stress[0], 1.2, 1e-12) | EXPECT_NEAR(point.cauchy_stress[1], 0.0, 1e-12) | EXPECT_NEAR(point.strain[0], 0.01, 1e-13) | EXPECT_NEAR(value, 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_EQ(frame.frame_index, 0U) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | ASSERT_EQ(frame.displacement.Size(), 24U) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_NEAR(frame.displacement[3 * a], 0.02 + 0.01 * kX[a][0], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 1], -0.0025 * kX[a][1], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 2], -0.0025 * kX[a][2], 1e-13) | EXPECT_DOUBLE_EQ(frame.reaction[3 * a], 0.0) | EXPECT_NEAR(frame.reaction[3 * a], -0.3, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 0.006, 1e-13) | EXPECT_NEAR(point.cauchy_stress[0], 1.2, 1e-12) | EXPECT_NEAR(point.cauchy_stress[1], 0.0, 1e-12) | EXPECT_NEAR(point.strain[0], 0.01, 1e-13) | EXPECT_NEAR(value, 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.AllConstrainedShearHasTensorStrainAndLinearMomentEvidence SolidStaticProcedure.AllConstrainedShearHasTensorStrainAndLinearMomentEvidence; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.AllConstrainedShearHasTensorStrainAndLinearMomentEvidence 유지 원문 검사 body 및 assertion 동일. e2c2aaea106d7f59e5ac8f4e9b545fe99ced00b92c0113d4e36fd40d305a972b e2c2aaea106d7f59e5ac8f4e9b545fe99ced00b92c0113d4e36fd40d305a972b ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[3], 0.015, 1e-13) | EXPECT_NEAR(point.cauchy_stress[3], 1.44, 1e-12) | EXPECT_NEAR(frame.physical_strain_energy, 0.0504, 1e-13) | EXPECT_GT(std::abs(frame.balance.current_internal_moment[2]), 1e-5) | EXPECT_NEAR(frame.balance.current_internal_moment[2], frame.balance.linearization_moment[2], 1e-12) | EXPECT_NEAR(frame.balance.reference_internal_moment[2], 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[3], 0.015, 1e-13) | EXPECT_NEAR(point.cauchy_stress[3], 1.44, 1e-12) | EXPECT_NEAR(frame.physical_strain_energy, 0.0504, 1e-13) | EXPECT_GT(std::abs(frame.balance.current_internal_moment[2]), 1e-5) | EXPECT_NEAR(frame.balance.current_internal_moment[2], frame.balance.linearization_moment[2], 1e-12) | EXPECT_NEAR(frame.balance.reference_internal_moment[2], 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.NonlinearDirectScheduleScalesForceAndAbsoluteTargets SolidStaticProcedure.NonlinearDirectScheduleScalesForceAndAbsoluteTargets; assertion 13개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.NonlinearDirectScheduleScalesForceAndAbsoluteTargets 유지 원문 검사 body 및 assertion 동일. d9e5db680ab7cfefe0bb0adc600921ea6a1ce60566317367656d013931bfebf6 d9e5db680ab7cfefe0bb0adc600921ea6a1ce60566317367656d013931bfebf6 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_EQ(frame.frame_index, n) | EXPECT_EQ(frame.increment_index, n + 1U) | EXPECT_DOUBLE_EQ(frame.load_factor, 0.25 * (n + 1)) | EXPECT_DOUBLE_EQ(frame.displacement[0], 0.02 * frame.load_factor) | EXPECT_DOUBLE_EQ(frame.external_force[3], 0.3 * frame.load_factor) | EXPECT_GT(frame.iteration_count, 1U) | EXPECT_EQ(frame.is_factor_one, n == 3) | EXPECT_NEAR(value, 0.0, 1e-12) | ASSERT_FALSE(result.Value().state.IterationRecords().empty()) | EXPECT_TRUE(result.Value().state.IterationRecords().back().accepted) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_EQ(frame.frame_index, n) | EXPECT_EQ(frame.increment_index, n + 1U) | EXPECT_DOUBLE_EQ(frame.load_factor, 0.25 * (n + 1)) | EXPECT_DOUBLE_EQ(frame.displacement[0], 0.02 * frame.load_factor) | EXPECT_DOUBLE_EQ(frame.external_force[3], 0.3 * frame.load_factor) | EXPECT_GT(frame.iteration_count, 1U) | EXPECT_EQ(frame.is_factor_one, n == 3) | EXPECT_NEAR(value, 0.0, 1e-12) | ASSERT_FALSE(result.Value().state.IterationRecords().empty()) | EXPECT_TRUE(result.Value().state.IterationRecords().back().accepted) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PurePrescribedNonlinearAndSmallLoadLinearLimit SolidStaticProcedure.PurePrescribedNonlinearAndSmallLoadLinearLimit; assertion 9개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PurePrescribedNonlinearAndSmallLoadLinearLimit 유지 원문 검사 body 및 assertion 동일. 45b82b45c2f4ba29abb9e5f78b83dea26d453f512441f7bb2d79443d02ab4f92 45b82b45c2f4ba29abb9e5f78b83dea26d453f512441f7bb2d79443d02ab4f92 ASSERT_TRUE(pure.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(record.force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(record.force_residual.denominator_scale, 0.0) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_NEAR(l.Value().state.CommittedState().displacement[i], n.Value().state.CommittedState().displacement[i], 2e-13) ASSERT_TRUE(pure.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(record.force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(record.force_residual.denominator_scale, 0.0) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_NEAR(l.Value().state.CommittedState().displacement[i], n.Value().state.CommittedState().displacement[i], 2e-13) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StrainedThenRotatedTLCauchyAndEnergyOracle SolidStaticProcedure.StrainedThenRotatedTLCauchyAndEnergyOracle; assertion 7개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StrainedThenRotatedTLCauchyAndEnergyOracle 유지 원문 검사 body 및 assertion 동일. ae7f274dc580d801db003d380539c0153f30638e98a1aef9ddb9bed86a5cf421 ae7f274dc580d801db003d380539c0153f30638e98a1aef9ddb9bed86a5cf421 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[0], green, 1e-13) | EXPECT_NEAR( point.cauchy_stress[0], std::pow(std::cos(angle), 2) * s0 + std::pow(std::sin(angle), 2) * s1, 1e-11) | EXPECT_NEAR(point.cauchy_stress[3], std::sin(angle) * std::cos(angle) * (s0 - s1), 1e-11) | EXPECT_NEAR(frame.physical_strain_energy, 72 * green * green, 1e-12) | EXPECT_NEAR(value, 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[0], green, 1e-13) | EXPECT_NEAR( point.cauchy_stress[0], std::pow(std::cos(angle), 2) * s0 + std::pow(std::sin(angle), 2) * s1, 1e-11) | EXPECT_NEAR(point.cauchy_stress[3], std::sin(angle) * std::cos(angle) * (s0 - s1), 1e-11) | EXPECT_NEAR(frame.physical_strain_energy, 72 * green * green, 1e-12) | EXPECT_NEAR(value, 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FailedBackendKeepsActualAcceptedHistory SolidStaticProcedure.FailedBackendKeepsActualAcceptedHistory; assertion 11개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FailedBackendKeepsActualAcceptedHistory 유지 원문 검사 body 및 assertion 동일. 8fcbb8d30b751700e685c57cf7f932779ef1105776f8c5cde20834df611a5075 8fcbb8d30b751700e685c57cf7f932779ef1105776f8c5cde20834df611a5075 "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25) | EXPECT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().diagnostic_code, ""injected-backend"") | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25) | EXPECT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().diagnostic_code, ""injected-backend"") | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.GeometryIterationAndNonfiniteFailuresPreserveBaseline SolidStaticProcedure.GeometryIterationAndNonfiniteFailuresPreserveBaseline; assertion 10개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.GeometryIterationAndNonfiniteFailuresPreserveBaseline 유지 원문 검사 body 및 assertion 동일. d01826c155aeded9026db515baedaf45ea10080a9ac6c9e5604e3e8f05b46770 d01826c155aeded9026db515baedaf45ea10080a9ac6c9e5604e3e8f05b46770 ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.0) | ASSERT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(state.CommittedState().displacement[i], 0.0) | ASSERT_FALSE(state.IterationRecords().empty()) | EXPECT_FALSE(state.IterationRecords().back().accepted) | EXPECT_FALSE(state.IterationRecords().back().diagnostic_code.empty()) | EXPECT_EQ(state.IterationRecords().back().iteration, 100U) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.0) | ASSERT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(state.CommittedState().displacement[i], 0.0) | ASSERT_FALSE(state.IterationRecords().empty()) | EXPECT_FALSE(state.IterationRecords().back().accepted) | EXPECT_FALSE(state.IterationRecords().back().diagnostic_code.empty()) | EXPECT_EQ(state.IterationRecords().back().iteration, 100U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UnconstrainedSolidFailsWithoutRegularization SolidStaticProcedure.UnconstrainedSolidFailsWithoutRegularization; assertion 2개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UnconstrainedSolidFailsWithoutRegularization 유지 원문 검사 body 및 assertion 동일. 26a02bf428c8b4d8684b66f3b75d4fc83e96c18d6497d81dba18879b19b2c81f 26a02bf428c8b4d8684b66f3b75d4fc83e96c18d6497d81dba18879b19b2c81f ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.EightElementAffinePatchHasSolvedInteriorAndStableRows SolidStaticProcedure.EightElementAffinePatchHasSolvedInteriorAndStableRows; assertion 18개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.EightElementAffinePatchHasSolvedInteriorAndStableRows 유지 원문 검사 body 및 assertion 동일. db9abadb927e8b0a0bb434ae43107b27275e65355b74fbba89d72cfad8c88d91 db9abadb927e8b0a0bb434ae43107b27275e65355b74fbba89d72cfad8c88d91 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.solid_results.size(), 64U) | EXPECT_NEAR(frame.displacement[3 * 13], 0.05, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 2], 0.0, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 8 * 0.0504, 1e-12) | EXPECT_EQ(frame.solid_results[g].element, g / 8) | EXPECT_EQ(frame.solid_results[g].integration_point, static_cast(g % 8 + 1)) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[0], 2.88, 1e-12) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[3], 1.44, 1e-12) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_DOUBLE_EQ(parallel_frame.physical_strain_energy, frame.physical_strain_energy) | EXPECT_DOUBLE_EQ(parallel_frame.displacement[i], frame.displacement[i]) | EXPECT_DOUBLE_EQ(parallel_frame.internal_force[i], frame.internal_force[i]) | EXPECT_DOUBLE_EQ(parallel_frame.residual[i], frame.residual[i]) | EXPECT_EQ(parallel_frame.solid_results[g].cauchy_stress, frame.solid_results[g].cauchy_stress) | EXPECT_EQ(parallel_frame.solid_results[g].strain, frame.solid_results[g].strain) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.solid_results.size(), 64U) | EXPECT_NEAR(frame.displacement[3 * 13], 0.05, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 2], 0.0, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 8 * 0.0504, 1e-12) | EXPECT_EQ(frame.solid_results[g].element, g / 8) | EXPECT_EQ(frame.solid_results[g].integration_point, static_cast(g % 8 + 1)) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[0], 2.88, 1e-12) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[3], 1.44, 1e-12) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_DOUBLE_EQ(parallel_frame.physical_strain_energy, frame.physical_strain_energy) | EXPECT_DOUBLE_EQ(parallel_frame.displacement[i], frame.displacement[i]) | EXPECT_DOUBLE_EQ(parallel_frame.internal_force[i], frame.internal_force[i]) | EXPECT_DOUBLE_EQ(parallel_frame.residual[i], frame.residual[i]) | EXPECT_EQ(parallel_frame.solid_results[g].cauchy_stress, frame.solid_results[g].cauchy_stress) | EXPECT_EQ(parallel_frame.solid_results[g].strain, frame.solid_results[g].strain) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterInvertedPrescribedTrialPreservesThreeAcceptedFrames SolidStaticProcedure.LaterInvertedPrescribedTrialPreservesThreeAcceptedFrames; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterInvertedPrescribedTrialPreservesThreeAcceptedFrames 유지 원문 검사 body 및 assertion 동일. aa4fc98ea93ac0cf4107c008482a044d58aa6fe24db7d22ac1f070603a8cd04c aa4fc98ea93ac0cf4107c008482a044d58aa6fe24db7d22ac1f070603a8cd04c ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 3U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.75) | EXPECT_NEAR(state.CommittedState().displacement[3], -0.9, 1e-15) | ASSERT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().increment_index, 4U) | EXPECT_FALSE(state.IterationRecords().back().accepted) ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 3U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.75) | EXPECT_NEAR(state.CommittedState().displacement[3], -0.9, 1e-15) | ASSERT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().increment_index, 4U) | EXPECT_FALSE(state.IterationRecords().back().accepted) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PartiallySupportedRigidMechanismAlsoFailsUnloaded SolidStaticProcedure.PartiallySupportedRigidMechanismAlsoFailsUnloaded; assertion 3개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PartiallySupportedRigidMechanismAlsoFailsUnloaded 유지 원문 검사 body 및 assertion 동일. 7f3830b55f5ac74af77b283eb5c3bc1c1e747a146c92b19de6d45f417141e9c5 7f3830b55f5ac74af77b283eb5c3bc1c1e747a146c92b19de6d45f417141e9c5 ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.SerialAndTbbFramesAndFailureEvidenceAreIdentical SolidStaticProcedure.SerialAndTbbFramesAndFailureEvidenceAreIdentical; assertion 18개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.SerialAndTbbFramesAndFailureEvidenceAreIdentical 유지 원문 검사 body 및 assertion 동일. 2204b6d824ccabcf85805a5c154e72abfcd625aa56a832f3814e99a3e0e70a47 2204b6d824ccabcf85805a5c154e72abfcd625aa56a832f3814e99a3e0e70a47 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(a.HasValue()) | ASSERT_TRUE(b.HasValue()) | ASSERT_EQ(a.Value().state.AcceptedFrames().size(), b.Value().state.AcceptedFrames().size()) | EXPECT_DOUBLE_EQ(af.physical_strain_energy, bf.physical_strain_energy) | EXPECT_EQ(af.global_equilibrium, bf.global_equilibrium) | EXPECT_DOUBLE_EQ(af.displacement[i], bf.displacement[i]) | EXPECT_DOUBLE_EQ(af.residual[i], bf.residual[i]) | EXPECT_DOUBLE_EQ(af.reaction[i], bf.reaction[i]) | EXPECT_EQ(af.solid_results[g].cauchy_stress, bf.solid_results[g].cauchy_stress) | EXPECT_EQ(af.solid_results[g].strain, bf.solid_results[g].strain) | ASSERT_TRUE(invalid.HasValue()) | ASSERT_FALSE(as.IsOk()) | ASSERT_FALSE(bs.IsOk()) | EXPECT_EQ(as.Diagnostics()[0].code, bs.Diagnostics()[0].code) | EXPECT_EQ(sa.AcceptedFrames().size(), sb.AcceptedFrames().size()) | EXPECT_EQ(sa.IterationRecords().back().stage, sb.IterationRecords().back().stage) | EXPECT_DOUBLE_EQ(sa.CommittedState().physical_strain_energy, sb.CommittedState().physical_strain_energy) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(a.HasValue()) | ASSERT_TRUE(b.HasValue()) | ASSERT_EQ(a.Value().state.AcceptedFrames().size(), b.Value().state.AcceptedFrames().size()) | EXPECT_DOUBLE_EQ(af.physical_strain_energy, bf.physical_strain_energy) | EXPECT_EQ(af.global_equilibrium, bf.global_equilibrium) | EXPECT_DOUBLE_EQ(af.displacement[i], bf.displacement[i]) | EXPECT_DOUBLE_EQ(af.residual[i], bf.residual[i]) | EXPECT_DOUBLE_EQ(af.reaction[i], bf.reaction[i]) | EXPECT_EQ(af.solid_results[g].cauchy_stress, bf.solid_results[g].cauchy_stress) | EXPECT_EQ(af.solid_results[g].strain, bf.solid_results[g].strain) | ASSERT_TRUE(invalid.HasValue()) | ASSERT_FALSE(as.IsOk()) | ASSERT_FALSE(bs.IsOk()) | EXPECT_EQ(as.Diagnostics()[0].code, bs.Diagnostics()[0].code) | EXPECT_EQ(sa.AcceptedFrames().size(), sb.AcceptedFrames().size()) | EXPECT_EQ(sa.IterationRecords().back().stage, sb.IterationRecords().back().stage) | EXPECT_DOUBLE_EQ(sa.CommittedState().physical_strain_energy, sb.CommittedState().physical_strain_energy) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.InvalidRecoveryAndRepeatedExecutionKeepAcceptedFrame SolidStaticProcedure.InvalidRecoveryAndRepeatedExecutionKeepAcceptedFrame; assertion 9개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.InvalidRecoveryAndRepeatedExecutionKeepAcceptedFrame 유지 원문 검사 body 및 assertion 동일. c7dfc371a7b67a1c78981dc4d1deb65f7122dcff6108ae6c7ec65caf7448d811 c7dfc371a7b67a1c78981dc4d1deb65f7122dcff6108ae6c7ec65caf7448d811 ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().physical_strain_energy, valid.physical_strain_energy) | EXPECT_EQ(state.CommittedState().solid_results[0].cauchy_stress, valid.solid_results[0].cauchy_stress) | EXPECT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().physical_strain_energy, valid.physical_strain_energy) | EXPECT_EQ(state.CommittedState().solid_results[0].cauchy_stress, valid.solid_results[0].cauchy_stress) | EXPECT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StressedIndefiniteFreeTangentUsesCapableBackend SolidStaticProcedure.StressedIndefiniteFreeTangentUsesCapableBackend; assertion 6개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StressedIndefiniteFreeTangentUsesCapableBackend 유지 원문 검사 body 및 assertion 동일. b812d55397294e1477756f267282142cdab4613da0d6ba78c49161e44a4bb757 b812d55397294e1477756f267282142cdab4613da0d6ba78c49161e44a4bb757 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(tangent.rayleigh_sum, -21.12, 1e-12) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_NEAR(frame.displacement[3 * a + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.solid_results[0].strain[0], -.48, 1e-13) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(tangent.rayleigh_sum, -21.12, 1e-12) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_NEAR(frame.displacement[3 * a + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.solid_results[0].strain[0], -.48, 1e-13) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FullyConstrainedZeroDisplacementRetainsSupportLoadResidual SolidStaticProcedure.FullyConstrainedZeroDisplacementRetainsSupportLoadResidual; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FullyConstrainedZeroDisplacementRetainsSupportLoadResidual 유지 원문 검사 body 및 assertion 동일. 956d6dd86eb3526eb262dd5e38e7b4245a5a0dda8fba51effed01c553a14f29f 956d6dd86eb3526eb262dd5e38e7b4245a5a0dda8fba51effed01c553a14f29f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.internal_force[0], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[0], -7.0) | EXPECT_DOUBLE_EQ(frame.reaction[0], -7.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.internal_force[0], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[0], -7.0) | EXPECT_DOUBLE_EQ(frame.reaction[0], -7.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UniformPrescribedTranslationHasExactlyZeroRecovery SolidStaticProcedure.UniformPrescribedTranslationHasExactlyZeroRecovery; assertion 11개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UniformPrescribedTranslationHasExactlyZeroRecovery 유지 원문 검사 body 및 assertion 동일. 283e16609b747830674f685910884882be83a270558850725c06370227b2ff47 283e16609b747830674f685910884882be83a270558850725c06370227b2ff47 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(frame.displacement[i], translation[i % 3U]) | EXPECT_DOUBLE_EQ(frame.internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0.0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(strain, 0.0) | EXPECT_DOUBLE_EQ(stress, 0.0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(frame.displacement[i], translation[i % 3U]) | EXPECT_DOUBLE_EQ(frame.internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0.0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(strain, 0.0) | EXPECT_DOUBLE_EQ(stress, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.MixedStrainAndTranslationPreserveAnalyticRecovery SolidStaticProcedure.MixedStrainAndTranslationPreserveAnalyticRecovery; assertion 16개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.MixedStrainAndTranslationPreserveAnalyticRecovery 유지 원문 검사 body 및 assertion 동일. d39c4b7c1d12b2e0b05fc9b5df66b9d0a184eee9e1f297b5fb4ea583f8655f8d d39c4b7c1d12b2e0b05fc9b5df66b9d0a184eee9e1f297b5fb4ea583f8655f8d ASSERT_TRUE(original_domain.HasValue()) | ASSERT_TRUE(translated_domain.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_NEAR(frame->physical_strain_energy, 0.1640625, 1e-13) | EXPECT_NEAR(point.strain[0], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.strain[3], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.cauchy_stress[c], stress[c], 1e-13) | EXPECT_NEAR(frame->internal_force[3 * node + c], exact_force[c], 1e-13) | EXPECT_NEAR(frame->reaction[3 * node + c], exact_force[c], 1e-13) | EXPECT_DOUBLE_EQ(a.physical_strain_energy, b.physical_strain_energy) | EXPECT_DOUBLE_EQ(a.internal_force[i], b.internal_force[i]) | EXPECT_DOUBLE_EQ(a.reaction[i], b.reaction[i]) | EXPECT_DOUBLE_EQ(a.residual[i], b.residual[i]) | EXPECT_EQ(a.solid_results[g].strain, b.solid_results[g].strain) | EXPECT_EQ(a.solid_results[g].cauchy_stress, b.solid_results[g].cauchy_stress) ASSERT_TRUE(original_domain.HasValue()) | ASSERT_TRUE(translated_domain.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_NEAR(frame->physical_strain_energy, 0.1640625, 1e-13) | EXPECT_NEAR(point.strain[0], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.strain[3], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.cauchy_stress[c], stress[c], 1e-13) | EXPECT_NEAR(frame->internal_force[3 * node + c], exact_force[c], 1e-13) | EXPECT_NEAR(frame->reaction[3 * node + c], exact_force[c], 1e-13) | EXPECT_DOUBLE_EQ(a.physical_strain_energy, b.physical_strain_energy) | EXPECT_DOUBLE_EQ(a.internal_force[i], b.internal_force[i]) | EXPECT_DOUBLE_EQ(a.reaction[i], b.reaction[i]) | EXPECT_DOUBLE_EQ(a.residual[i], b.residual[i]) | EXPECT_EQ(a.solid_results[g].strain, b.solid_results[g].strain) | EXPECT_EQ(a.solid_results[g].cauchy_stress, b.solid_results[g].cauchy_stress) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PureLargeRigidRotationEndsAtZeroStrainEnergy SolidStaticProcedure.PureLargeRigidRotationEndsAtZeroStrainEnergy; assertion 5개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PureLargeRigidRotationEndsAtZeroStrainEnergy 유지 원문 검사 body 및 assertion 동일. 4fe6729cebd103240b949a646d1071d16c80aa9b748edec55cac4187a571090d 4fe6729cebd103240b949a646d1071d16c80aa9b748edec55cac4187a571090d ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(frame.physical_strain_energy, 0.0, 1e-25) | EXPECT_NEAR(value, 0.0, 1e-14) | EXPECT_NEAR(value, 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(frame.physical_strain_energy, 0.0, 1e-25) | EXPECT_NEAR(value, 0.0, 1e-14) | EXPECT_NEAR(value, 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.OrdinaryStaticKeepsExistingFinalShortFactorPath SolidStaticProcedure.OrdinaryStaticKeepsExistingFinalShortFactorPath; assertion 6개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.OrdinaryStaticKeepsExistingFinalShortFactorPath 유지 원문 검사 body 및 assertion 동일. f89b10887a1fc24fed122505ce929cd71894836076dc926635924d209419eb98 f89b10887a1fc24fed122505ce929cd71894836076dc926635924d209419eb98 ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_NEAR(result.Value().state.AcceptedFrames()[i].load_factor, factors[i], 1e-15) | EXPECT_DOUBLE_EQ(result.Value().state.CommittedState().load_factor, 1.0) ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_NEAR(result.Value().state.AcceptedFrames()[i].load_factor, factors[i], 1e-15) | EXPECT_DOUBLE_EQ(result.Value().state.CommittedState().load_factor, 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.BoundedSpatialRefinementReportsFullIntegrationLocking SolidStaticProcedure.BoundedSpatialRefinementReportsFullIntegrationLocking; assertion 6개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.BoundedSpatialRefinementReportsFullIntegrationLocking 유지 원문 검사 body 및 assertion 동일. 0be527378cf6b99c5d21b37fae3756fcf90b3baf550974c57e04fc9f1f828875 0be527378cf6b99c5d21b37fae3756fcf90b3baf550974c57e04fc9f1f828875 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT(tip, previous[material]) | EXPECT_LT(tip, 1.05 * beam_limit) | EXPECT_LT(final[1], final[0]) | EXPECT_GT(std::abs(final[1] - beam_limit), std::abs(final[0] - beam_limit)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT(tip, previous[material]) | EXPECT_LT(tip, 1.05 * beam_limit) | EXPECT_LT(final[1], final[0]) | EXPECT_GT(std::abs(final[1] - beam_limit), std::abs(final[0] - beam_limit)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterIterationNonfiniteAndGeometryFailureKeepEveryAcceptedQuantity SolidStaticProcedure.LaterIterationNonfiniteAndGeometryFailureKeepEveryAcceptedQuantity; assertion 16개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterIterationNonfiniteAndGeometryFailureKeepEveryAcceptedQuantity 유지 원문 검사 body 및 assertion 동일. d625f760d2aab29539cf34d792d6540f1c67c9e627fe2e17ec186ddc74df2f36 d625f760d2aab29539cf34d792d6540f1c67c9e627fe2e17ec186ddc74df2f36 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(successful.HasValue()) | ASSERT_EQ(expected.iteration_count, 2U) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(actual.global_equilibrium, expected.global_equilibrium) | EXPECT_DOUBLE_EQ(actual.physical_strain_energy, expected.physical_strain_energy) | EXPECT_DOUBLE_EQ(actual.displacement[i], expected.displacement[i]) | EXPECT_DOUBLE_EQ(actual.internal_force[i], expected.internal_force[i]) | EXPECT_DOUBLE_EQ(actual.external_force[i], expected.external_force[i]) | EXPECT_DOUBLE_EQ(actual.residual[i], expected.residual[i]) | EXPECT_DOUBLE_EQ(actual.reaction[i], expected.reaction[i]) | EXPECT_EQ(actual.solid_results[g].strain, expected.solid_results[g].strain) | EXPECT_EQ(actual.solid_results[g].cauchy_stress, expected.solid_results[g].cauchy_stress) | EXPECT_EQ(state.IterationRecords().back().increment_index, 2U) | EXPECT_FALSE(state.IterationRecords().back().accepted) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(successful.HasValue()) | ASSERT_EQ(expected.iteration_count, 2U) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(actual.global_equilibrium, expected.global_equilibrium) | EXPECT_DOUBLE_EQ(actual.physical_strain_energy, expected.physical_strain_energy) | EXPECT_DOUBLE_EQ(actual.displacement[i], expected.displacement[i]) | EXPECT_DOUBLE_EQ(actual.internal_force[i], expected.internal_force[i]) | EXPECT_DOUBLE_EQ(actual.external_force[i], expected.external_force[i]) | EXPECT_DOUBLE_EQ(actual.residual[i], expected.residual[i]) | EXPECT_DOUBLE_EQ(actual.reaction[i], expected.reaction[i]) | EXPECT_EQ(actual.solid_results[g].strain, expected.solid_results[g].strain) | EXPECT_EQ(actual.solid_results[g].cauchy_stress, expected.solid_results[g].cauchy_stress) | EXPECT_EQ(state.IterationRecords().back().increment_index, 2U) | EXPECT_FALSE(state.IterationRecords().back().accepted) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.ExecutesBothUnmodifiedStaticSourceDecksThroughDirectApi SolidStaticProcedure.ExecutesBothUnmodifiedStaticSourceDecksThroughDirectApi; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.ExecutesBothUnmodifiedStaticSourceDecksThroughDirectApi 유지 원문 검사 body 및 assertion 동일. d3a90f93d9d9490f75afc00c665defc23cf55c13bfbca813fa2fed3140416ce3 d3a90f93d9d9490f75afc00c665defc23cf55c13bfbca813fa2fed3140416ce3 ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | EXPECT_EQ(frame.increment_index, 10U) | EXPECT_EQ(frame.displacement.Size(), 442U * 3U) | EXPECT_EQ(frame.solid_results.size(), 300U * 8U) | EXPECT_EQ(state.AcceptedFrames().size(), domain.Value().Steps()[0].IsNonlinearStatic() ? 10U : 1U) ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | EXPECT_EQ(frame.increment_index, 10U) | EXPECT_EQ(frame.displacement.Size(), 442U * 3U) | EXPECT_EQ(frame.solid_results.size(), 300U * 8U) | EXPECT_EQ(state.AcceptedFrames().size(), domain.Value().Steps()[0].IsNonlinearStatic() ? 10U : 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_procedure_test.cpp support@1-151 helper/oracle/fixture/include/static assertion 구간: Deck, Map, Message, ExecuteSolid, Supports, Tension, AffineBoundary, FailedTangent, Mode, ObservedIndefiniteTangent tests/unit/analysis/solid_static_procedure_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e4768526452793c2de88bf64c053e12858ebb196ae6e2088db2b57174f836c7a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_static_procedure_test.cpp support@687-728 helper/oracle/fixture/include/static assertion 구간: Cantilever tests/unit/analysis/solid_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 18b6fff6c45d794f77ce9044335c69313a256236f3b9cee759f0d5d8a33ca76e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_static_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/analysis/solid_static_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1693abc34bf1b4346ff3a17979cb8a763cb16950fee6b5a5471e402d4faf621d 1693abc34bf1b4346ff3a17979cb8a763cb16950fee6b5a5471e402d4faf621d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.PurePrescribedUsesAbsoluteForceAndOnlyTwoChannels SolidStaticControls.PurePrescribedUsesAbsoluteForceAndOnlyTwoChannels; assertion 8개 tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.PurePrescribedUsesAbsoluteForceAndOnlyTwoChannels 유지 원문 검사 body 및 assertion 동일. 64090bf859cad1c1f823058b375f44107bd69be3ea8a455abc6f1eb059ba2578 64090bf859cad1c1f823058b375f44107bd69be3ea8a455abc6f1eb059ba2578 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 0.0) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kForce) | EXPECT_EQ(result.Value().translation_correction.threshold_unit, fesa::NewtonChannelUnit::kLength) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence( residual, internal, external, correction, increment) .Value() .force_residual.passed) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 0.0) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kForce) | EXPECT_EQ(result.Value().translation_correction.threshold_unit, fesa::NewtonChannelUnit::kLength) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence( residual, internal, external, correction, increment) .Value() .force_residual.passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.RelativeLimitsRawNormsAndNonfiniteFailure SolidStaticControls.RelativeLimitsRawNormsAndNonfiniteFailure; assertion 10개 tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.RelativeLimitsRawNormsAndNonfiniteFailure 유지 원문 검사 body 및 assertion 동일. 9ced91c636ffa144e3fe1bd9748589a2a38f7afe41bd79eb1a71a7d0336144a8 9ced91c636ffa144e3fe1bd9748589a2a38f7afe41bd79eb1a71a7d0336144a8 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().force_residual.numerator_norm, 1.0) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 100.0) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u) .Value() .force_residual.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u).HasValue()) | EXPECT_FALSE( fesa::EvaluateSolidStaticConvergence(r, f, fesa::Vector{2U}, du, u) .HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().force_residual.numerator_norm, 1.0) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 100.0) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u) .Value() .force_residual.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u).HasValue()) | EXPECT_FALSE( fesa::EvaluateSolidStaticConvergence(r, f, fesa::Vector{2U}, du, u) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/analysis/solid_static_state_test.cpp support@1-6 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/solid_static_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e53402f8f5992b27b6c5a2443adf6251c74adbe566e295fba59e1621404883ca 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/thermal_analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/analysis/thermal_analysis_state_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a6d89b30f8bb178f16912e6f1fca3bed6b31c6b4b3439095542d51ae5eef5b60 505bda8adef4e2255a4ce1d76d08c96b5806da8652e397048a0b49e5fb364557 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.OwnsRawInitialInventoryAfterDomainAndAssemblyDestruction ThermalAnalysisState.OwnsRawInitialInventoryAfterDomainAndAssemblyDestruction; assertion 24개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.OwnsRawInitialInventoryAfterDomainAndAssemblyDestruction 유지 원문 검사 body 및 assertion 동일. 29995b83f8751fc439725b0f3a266b7237c909a921280e02a60ef86b340ba760 29995b83f8751fc439725b0f3a266b7237c909a921280e02a60ef86b340ba760 "ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().NodeOrder(), (std::vector{1, 2, 3, 4})) | EXPECT_EQ(state.Value().NodeSourceIds()[0].source_label_text, ""0007"") | EXPECT_EQ(state.Value().ElementSourceIds()[0].source_label_text, ""0013"") | EXPECT_EQ(state.Value().ElementOrder(), (std::vector{0})) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_TRUE(initial.is_initial) | EXPECT_FALSE(initial.completed.has_value()) | EXPECT_EQ(initial.time, 0) | EXPECT_EQ(initial.time_increment, 0) | EXPECT_EQ(initial.temperature[a], -20.) | EXPECT_EQ(initial.temperature[5 + a], 0.) | EXPECT_EQ(initial.temperature[10 + a], 0.) | EXPECT_EQ(initial.temperature[15 + a], 7.125) | ASSERT_EQ(state.Value().ReactionDofs().size(), 2U) | EXPECT_EQ(state.Value().ReactionDofs()[0].node, 1U) | EXPECT_EQ(state.Value().ReactionDofs()[0].source_dof, 11) | EXPECT_EQ(state.Value().ReactionDofs()[1].node, 4U) | EXPECT_EQ(state.Value().ReactionDofs()[1].source_dof, 15) | EXPECT_EQ(state.Value().ConstraintMask()[row][a], ((row == 0 && a == 0) || (row == 3 && a == 4)) ? 1 : 0) | ASSERT_EQ(state.Value().FluxLocalFrames().size(), 1U) | EXPECT_EQ(frame[0], (fesa::Vector3{1, 0, 0})) | EXPECT_EQ(frame[1], (fesa::Vector3{0, 1, 0})) | EXPECT_EQ(frame[2], (fesa::Vector3{0, 0, 1}))" "ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().NodeOrder(), (std::vector{1, 2, 3, 4})) | EXPECT_EQ(state.Value().NodeSourceIds()[0].source_label_text, ""0007"") | EXPECT_EQ(state.Value().ElementSourceIds()[0].source_label_text, ""0013"") | EXPECT_EQ(state.Value().ElementOrder(), (std::vector{0})) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_TRUE(initial.is_initial) | EXPECT_FALSE(initial.completed.has_value()) | EXPECT_EQ(initial.time, 0) | EXPECT_EQ(initial.time_increment, 0) | EXPECT_EQ(initial.temperature[a], -20.) | EXPECT_EQ(initial.temperature[5 + a], 0.) | EXPECT_EQ(initial.temperature[10 + a], 0.) | EXPECT_EQ(initial.temperature[15 + a], 7.125) | ASSERT_EQ(state.Value().ReactionDofs().size(), 2U) | EXPECT_EQ(state.Value().ReactionDofs()[0].node, 1U) | EXPECT_EQ(state.Value().ReactionDofs()[0].source_dof, 11) | EXPECT_EQ(state.Value().ReactionDofs()[1].node, 4U) | EXPECT_EQ(state.Value().ReactionDofs()[1].source_dof, 15) | EXPECT_EQ(state.Value().ConstraintMask()[row][a], ((row == 0 && a == 0) || (row == 3 && a == 4)) ? 1 : 0) | ASSERT_EQ(state.Value().FluxLocalFrames().size(), 1U) | EXPECT_EQ(frame[0], (fesa::Vector3{1, 0, 0})) | EXPECT_EQ(frame[1], (fesa::Vector3{0, 1, 0})) | EXPECT_EQ(frame[2], (fesa::Vector3{0, 0, 1}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CompletedZeroReactionPayloadAndExactActualDelta ThermalAnalysisState.CompletedZeroReactionPayloadAndExactActualDelta; assertion 20개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CompletedZeroReactionPayloadAndExactActualDelta 유지 원문 검사 body 및 assertion 동일. faed8c798f105f506facfa91da0c77b9b7b74944851a63a32542901d8887197f faed8c798f105f506facfa91da0c77b9b7b74944851a63a32542901d8887197f ASSERT_TRUE(state.HasValue()) | EXPECT_TRUE(state.Value().ReactionDofs().empty()) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(frame.HasValue()) | ASSERT_TRUE(frame.Value().completed.has_value()) | EXPECT_EQ(frame.Value().completed->reaction_heat_rate.Size(), 0U) | EXPECT_EQ(frame.Value().time_increment, .3) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(frame.Value()).IsOk()) | EXPECT_TRUE(state.Value().IsComplete()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 4U) | EXPECT_EQ(state.Value().CommittedState().time, .9) | EXPECT_EQ(state.Value().CommittedState().time_increment, .3) | EXPECT_NE(state.Value().CommittedState().time - state.Value().AcceptedFrames()[2].time, .3) | EXPECT_EQ(state.Value().NominalTimeIncrement(), .3) | EXPECT_EQ(state.Value().TimePeriod(), .9) | EXPECT_FALSE( state.Value().CommitAcceptedFrame(state.Value().CommittedState()).IsOk()) | ASSERT_TRUE(short_state.HasValue()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().time, 10.) | EXPECT_EQ(last.Value().time_increment, 1.) ASSERT_TRUE(state.HasValue()) | EXPECT_TRUE(state.Value().ReactionDofs().empty()) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(frame.HasValue()) | ASSERT_TRUE(frame.Value().completed.has_value()) | EXPECT_EQ(frame.Value().completed->reaction_heat_rate.Size(), 0U) | EXPECT_EQ(frame.Value().time_increment, .3) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(frame.Value()).IsOk()) | EXPECT_TRUE(state.Value().IsComplete()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 4U) | EXPECT_EQ(state.Value().CommittedState().time, .9) | EXPECT_EQ(state.Value().CommittedState().time_increment, .3) | EXPECT_NE(state.Value().CommittedState().time - state.Value().AcceptedFrames()[2].time, .3) | EXPECT_EQ(state.Value().NominalTimeIncrement(), .3) | EXPECT_EQ(state.Value().TimePeriod(), .9) | EXPECT_FALSE( state.Value().CommitAcceptedFrame(state.Value().CommittedState()).IsOk()) | ASSERT_TRUE(short_state.HasValue()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().time, 10.) | EXPECT_EQ(last.Value().time_increment, 1.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.EveryRejectedCandidatePreservesEntireAcceptedHistory ThermalAnalysisState.EveryRejectedCandidatePreservesEntireAcceptedHistory; assertion 9개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.EveryRejectedCandidatePreservesEntireAcceptedHistory 유지 원문 검사 body 및 assertion 동일. aaa377193cb0575e53405ed69aeeb7cc32e7c97bc56c05922bce6edcc2b1e74c aaa377193cb0575e53405ed69aeeb7cc32e7c97bc56c05922bce6edcc2b1e74c ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(first.Value()).IsOk()) | ASSERT_TRUE(candidate.HasValue()) | EXPECT_FALSE(state.CommitAcceptedFrame(candidate.Value()).IsOk()) | EXPECT_EQ(Snapshot(state), snapshot) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(second.Value()).IsOk()) | EXPECT_NE(state.CommittedState().temperature[0], 900) ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(first.Value()).IsOk()) | ASSERT_TRUE(candidate.HasValue()) | EXPECT_FALSE(state.CommitAcceptedFrame(candidate.Value()).IsOk()) | EXPECT_EQ(Snapshot(state), snapshot) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(second.Value()).IsOk()) | EXPECT_NE(state.CommittedState().temperature[0], 900) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CheckedCandidateRejectsMissingDataAndHugeGridDoesNotPreallocateHistory ThermalAnalysisState.CheckedCandidateRejectsMissingDataAndHugeGridDoesNotPreallocateHistory; assertion 11개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CheckedCandidateRejectsMissingDataAndHugeGridDoesNotPreallocateHistory 유지 원문 검사 body 및 assertion 동일. 5d135e0312f358eb833a0a1dfd014621f15196041711663bd84ceb65e3027aec 5d135e0312f358eb833a0a1dfd014621f15196041711663bd84ceb65e3027aec ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().TimeGrid().Count(), 4294967295U) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().frame_index, 4294967295ULL) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(last.Value()).IsOk()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(0, fesa::Vector{20}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{19}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{1}, {{}}) .HasValue()) | EXPECT_FALSE(state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{0}, {}) .HasValue()) ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().TimeGrid().Count(), 4294967295U) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().frame_index, 4294967295ULL) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(last.Value()).IsOk()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(0, fesa::Vector{20}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{19}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{1}, {{}}) .HasValue()) | EXPECT_FALSE(state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{0}, {}) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.RejectsAssemblyFromAnotherDomainAndInvalidSchedule ThermalAnalysisState.RejectsAssemblyFromAnotherDomainAndInvalidSchedule; assertion 9개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.RejectsAssemblyFromAnotherDomainAndInvalidSchedule 유지 원문 검사 body 및 assertion 동일. 6cf18a4e7b7be31455ff4b43a91438c2dd613d6d822d85a7ba34e30d330c4bfd 6cf18a4e7b7be31455ff4b43a91438c2dd613d6d822d85a7ba34e30d330c4bfd ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(fm.HasValue()) | ASSERT_TRUE(sm.HasValue()) | ASSERT_TRUE(fd.HasValue()) | ASSERT_TRUE(sd.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | EXPECT_FALSE(fesa::ThermalAnalysisState::Create(sm.Value(), sd.Value(), assembly.Value()) .HasValue()) | EXPECT_FALSE(State(false, 10, 3, 3).HasValue()) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(fm.HasValue()) | ASSERT_TRUE(sm.HasValue()) | ASSERT_TRUE(fd.HasValue()) | ASSERT_TRUE(sd.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | EXPECT_FALSE(fesa::ThermalAnalysisState::Create(sm.Value(), sd.Value(), assembly.Value()) .HasValue()) | EXPECT_FALSE(State(false, 10, 3, 3).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_analysis_state_test.cpp support@1-115 helper/oracle/fixture/include/static assertion 구간: Definition, if, State, Candidate, Snapshot, for tests/unit/analysis/thermal_analysis_state_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7fe1bd0d0fcf6ec2be86f1abdffa0db02e82fa5f0b1a7070b8ac08221bff9429 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/thermal_time_grid_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/analysis/thermal_time_grid_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a2f5f4ff554e4c7d127640394d45cd41bba3df2adde92d39071f720af402ff3e a2f5f4ff554e4c7d127640394d45cd41bba3df2adde92d39071f720af402ff3e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.SingleStepUsesPeriodAsActualIncrement ThermalTimeGrid.SingleStepUsesPeriodAsActualIncrement; assertion 3개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.SingleStepUsesPeriodAsActualIncrement 유지 원문 검사 body 및 assertion 동일. df81cdf149e0a1f046502f072502b69775e5fded5a9aa972da75fc19d78c9157 df81cdf149e0a1f046502f072502b69775e5fded5a9aa972da75fc19d78c9157 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 1U) | EXPECT_EQ(grid.Value().Delta(1U), 2.0) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 1U) | EXPECT_EQ(grid.Value().Delta(1U), 2.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.PreservesGenuineRemainderOutsideInputCells ThermalTimeGrid.PreservesGenuineRemainderOutsideInputCells; assertion 3개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.PreservesGenuineRemainderOutsideInputCells 유지 원문 검사 body 및 assertion 동일. 1e5b5e3355eb2dd4f5bf7575918fd02b20d03764ecd41dad7b95bacae0ca4ee0 1e5b5e3355eb2dd4f5bf7575918fd02b20d03764ecd41dad7b95bacae0ca4ee0 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Delta(4U), 1.6653345369377348e-16) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Delta(4U), 1.6653345369377348e-16) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.OriginalSubnormalCellsRespectOpenAndClosedContact ThermalTimeGrid.OriginalSubnormalCellsRespectOpenAndClosedContact; assertion 5개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.OriginalSubnormalCellsRespectOpenAndClosedContact 유지 원문 검사 body 및 assertion 동일. b3750249efc6650ce8d7651338ad3bbd1a681960df204dc61df4047dbb7b7cec b3750249efc6650ce8d7651338ad3bbd1a681960df204dc61df4047dbb7b7cec ASSERT_TRUE(even.HasValue()) | ASSERT_TRUE(odd.HasValue()) | EXPECT_EQ(even.Value().Count(), 3U) | EXPECT_EQ(odd.Value().Count(), 4U) | EXPECT_EQ(odd.Value().Delta(4U), 2 * tiny) ASSERT_TRUE(even.HasValue()) | ASSERT_TRUE(odd.HasValue()) | EXPECT_EQ(even.Value().Count(), 3U) | EXPECT_EQ(odd.Value().Count(), 4U) | EXPECT_EQ(odd.Value().Delta(4U), 2 * tiny) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.DecimalCellsCounterexampleAndScale ThermalTimeGrid.DecimalCellsCounterexampleAndScale; assertion 8개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.DecimalCellsCounterexampleAndScale 유지 원문 검사 body 및 assertion 동일. 55542fd9e560e9916102520ef1a4955d9b86bf134c0bbc4d6010cee6fa01e746 55542fd9e560e9916102520ef1a4955d9b86bf134c0bbc4d6010cee6fa01e746 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), delta) | EXPECT_EQ(grid.Value().Time(3U), period) | ASSERT_TRUE(old_counterexample.HasValue()) | EXPECT_EQ(old_counterexample.Value().Count(), 31U) | EXPECT_EQ(old_counterexample.Value().Delta(31U), .17262758624947144) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(5.351455173733616, .17262758624947144, 30U) .HasValue()) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), delta) | EXPECT_EQ(grid.Value().Time(3U), period) | ASSERT_TRUE(old_counterexample.HasValue()) | EXPECT_EQ(old_counterexample.Value().Count(), 31U) | EXPECT_EQ(old_counterexample.Value().Delta(31U), .17262758624947144) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(5.351455173733616, .17262758624947144, 30U) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.BinadeLimitsAndMaximumFinitePreserveOriginalCells ThermalTimeGrid.BinadeLimitsAndMaximumFinitePreserveOriginalCells; assertion 8개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.BinadeLimitsAndMaximumFinitePreserveOriginalCells 유지 원문 검사 body 및 assertion 동일. 51807a8419bb57da7a52205af4bae20dd05265ee7bc2f446e396d861b9894232 51807a8419bb57da7a52205af4bae20dd05265ee7bc2f446e396d861b9894232 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), max / 3) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().Count(), 4294967295U) | EXPECT_TRUE(upper.Value().Frame(4294967295U).HasValue()) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(4294967296., 1., 4294967295U).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create( max, std::numeric_limits::denorm_min(), 4294967295U) .HasValue()) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), max / 3) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().Count(), 4294967295U) | EXPECT_TRUE(upper.Value().Frame(4294967295U).HasValue()) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(4294967296., 1., 4294967295U).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create( max, std::numeric_limits::denorm_min(), 4294967295U) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.ShortenedIncrementAndCheckedFrames ThermalTimeGrid.ShortenedIncrementAndCheckedFrames; assertion 15개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.ShortenedIncrementAndCheckedFrames 유지 원문 검사 body 및 assertion 동일. 26a8db8885d7920f5ee954491b801daefb3c4ad8e88e8bca8ffc4a394f668c07 26a8db8885d7920f5ee954491b801daefb3c4ad8e88e8bca8ffc4a394f668c07 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Time(0U), 0.) | ASSERT_TRUE(grid.Value().Frame(i).HasValue()) | EXPECT_EQ(grid.Value().Time(i), i == 4 ? 10. : 3. * i) | EXPECT_EQ(grid.Value().Delta(i), i == 4 ? 1. : 3.) | EXPECT_FALSE(grid.Value().Frame(0U).HasValue()) | EXPECT_FALSE(grid.Value().Frame(5U).HasValue()) | ASSERT_TRUE(decimals.HasValue()) | EXPECT_EQ(decimals.Value().Time(3U), .30000000000000004) | EXPECT_EQ(decimals.Value().Delta(10U), .1) | ASSERT_TRUE(close.HasValue()) | ASSERT_TRUE(short_last.HasValue()) | EXPECT_EQ(close.Value().Delta(3U), .3) | EXPECT_EQ(short_last.Value().Delta(3U), .2999999999999998) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Time(0U), 0.) | ASSERT_TRUE(grid.Value().Frame(i).HasValue()) | EXPECT_EQ(grid.Value().Time(i), i == 4 ? 10. : 3. * i) | EXPECT_EQ(grid.Value().Delta(i), i == 4 ? 1. : 3.) | EXPECT_FALSE(grid.Value().Frame(0U).HasValue()) | EXPECT_FALSE(grid.Value().Frame(5U).HasValue()) | ASSERT_TRUE(decimals.HasValue()) | EXPECT_EQ(decimals.Value().Time(3U), .30000000000000004) | EXPECT_EQ(decimals.Value().Delta(10U), .1) | ASSERT_TRUE(close.HasValue()) | ASSERT_TRUE(short_last.HasValue()) | EXPECT_EQ(close.Value().Delta(3U), .3) | EXPECT_EQ(short_last.Value().Delta(3U), .2999999999999998) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.RejectsInvalidControlsBeforeIntegerConversion ThermalTimeGrid.RejectsInvalidControlsBeforeIntegerConversion; assertion 5개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.RejectsInvalidControlsBeforeIntegerConversion 유지 원문 검사 body 및 assertion 동일. b7b300d2a27beb1ef71e1c4d21f574e4e5ae22ed3fe52417e940fbd4138cc5d4 b7b300d2a27beb1ef71e1c4d21f574e4e5ae22ed3fe52417e940fbd4138cc5d4 EXPECT_FALSE(fesa::ThermalTimeGrid::Create(bad, 1.).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., bad).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., 1., 0U).HasValue()) | ASSERT_TRUE(equal.HasValue()) | EXPECT_EQ(equal.Value().Delta(1U), 2.) EXPECT_FALSE(fesa::ThermalTimeGrid::Create(bad, 1.).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., bad).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., 1., 0U).HasValue()) | ASSERT_TRUE(equal.HasValue()) | EXPECT_EQ(equal.Value().Delta(1U), 2.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/thermal_time_grid_test.cpp support@1-7 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/thermal_time_grid_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4d7509a96a86780faf4709a37c3191b68a01d0bb865d28925558e8e69d405ef2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/transient_heat_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/unit/analysis/transient_heat_procedure_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ee408d0deb583f35c838e9e7457ef28de8d017edab31e6c2eae3b6eb3cdf03cd efff26c6a7451be803515541313038b9555ee01362e280915dab4d272586bef6 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.RawConstrainedCapacityProducesSignedTwoDofJump TransientHeatProcedure.RawConstrainedCapacityProducesSignedTwoDofJump; assertion 8개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.RawConstrainedCapacityProducesSignedTwoDofJump 유지 원문 검사 body 및 assertion 동일. 980805fa102cb221909d1766e40746ce9cf7fae52ceea5e89b51cf424ad0b73f 980805fa102cb221909d1766e40746ce9cf7fae52ceea5e89b51cf424ad0b73f ASSERT_TRUE(first.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().temperature[0], -.2) | EXPECT_DOUBLE_EQ(first.Value().reaction[0], 4.8) | ASSERT_TRUE(second.HasValue()) | EXPECT_NEAR(second.Value().temperature[0], .04, 16 * std::numeric_limits::epsilon() * .04) | EXPECT_DOUBLE_EQ(second.Value().reaction[0], 1.44) | EXPECT_EQ(solver.factorizations, 1) | EXPECT_EQ(solver.solves, 2) ASSERT_TRUE(first.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().temperature[0], -.2) | EXPECT_DOUBLE_EQ(first.Value().reaction[0], 4.8) | ASSERT_TRUE(second.HasValue()) | EXPECT_NEAR(second.Value().temperature[0], .04, 16 * std::numeric_limits::epsilon() * .04) | EXPECT_DOUBLE_EQ(second.Value().reaction[0], 1.44) | EXPECT_EQ(solver.factorizations, 1) | EXPECT_EQ(solver.solves, 2) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.AllConstrainedBypassesZeroSizeFactorization TransientHeatProcedure.AllConstrainedBypassesZeroSizeFactorization; assertion 5개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.AllConstrainedBypassesZeroSizeFactorization 유지 원문 검사 body 및 assertion 동일. 202ca407a90853cb361a166c1a72d391cf1a085616e54ed9c39d5c3d5d13a566 202ca407a90853cb361a166c1a72d391cf1a085616e54ed9c39d5c3d5d13a566 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().reaction[0], 6) | EXPECT_EQ(result.Value().reaction[1], 6) | EXPECT_EQ(solver.factorizations, 0) | EXPECT_EQ(solver.solves, 0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().reaction[0], 6) | EXPECT_EQ(result.Value().reaction[1], 6) | EXPECT_EQ(solver.factorizations, 0) | EXPECT_EQ(solver.solves, 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.CancellationCannotUseFullSystemScaleToPassCertificate TransientHeatProcedure.CancellationCannotUseFullSystemScaleToPassCertificate; assertion 3개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.CancellationCannotUseFullSystemScaleToPassCertificate 유지 원문 검사 body 및 assertion 동일. 5e0a1ecdf9e220cf428d03065cb6e98777df3afbfa34e41ce945372420f3004e 5e0a1ecdf9e220cf428d03065cb6e98777df3afbfa34e41ce945372420f3004e ASSERT_TRUE(valid.HasValue()) | EXPECT_DOUBLE_EQ(valid.Value().temperature[0], .8) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, old, .5, solver, cache) .HasValue()) ASSERT_TRUE(valid.HasValue()) | EXPECT_DOUBLE_EQ(valid.Value().temperature[0], .8) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, old, .5, solver, cache) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ExactZeroAndUniformInsulatedStatesAndActualDeltaCache TransientHeatProcedure.ExactZeroAndUniformInsulatedStatesAndActualDeltaCache; assertion 12개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ExactZeroAndUniformInsulatedStatesAndActualDeltaCache 유지 원문 검사 body 및 assertion 동일. ac935c01b0c672b156e573888f2e14ff26dfd1ee8579b195b45a210b274f7b78 ac935c01b0c672b156e573888f2e14ff26dfd1ee8579b195b45a210b274f7b78 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(state.IsComplete()) | EXPECT_EQ(state.AcceptedFrames().size(), schedule.steps + 1) | EXPECT_EQ(state.CommittedState().time, schedule.period) | EXPECT_EQ(state.CommittedState().time_increment, schedule.last) | EXPECT_EQ(solver.factorizations, schedule.factors) | EXPECT_EQ(solver.solves, static_cast(schedule.steps)) | EXPECT_FALSE(state.AcceptedFrames()[0].completed.has_value()) | EXPECT_EQ(frame.temperature[i], 0) | EXPECT_NEAR(frame.temperature[i], initial, 4096 * 0x1p-53 * initial) | EXPECT_EQ(frame.completed->reaction_heat_rate.Size(), 0U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(state.IsComplete()) | EXPECT_EQ(state.AcceptedFrames().size(), schedule.steps + 1) | EXPECT_EQ(state.CommittedState().time, schedule.period) | EXPECT_EQ(state.CommittedState().time_increment, schedule.last) | EXPECT_EQ(solver.factorizations, schedule.factors) | EXPECT_EQ(solver.solves, static_cast(schedule.steps)) | EXPECT_FALSE(state.AcceptedFrames()[0].completed.has_value()) | EXPECT_EQ(frame.temperature[i], 0) | EXPECT_NEAR(frame.temperature[i], initial, 4096 * 0x1p-53 * initial) | EXPECT_EQ(frame.completed->reaction_heat_rate.Size(), 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.MklMatchesIndependentAffineDiscreteModeAndDissipation TransientHeatProcedure.MklMatchesIndependentAffineDiscreteModeAndDissipation; assertion 15개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.MklMatchesIndependentAffineDiscreteModeAndDissipation 유지 원문 검사 body 및 assertion 동일. 469b0381e9116d635764dd3052feeddf1df682d761cf3122988c87b66b6157ec 469b0381e9116d635764dd3052feeddf1df682d761cf3122988c87b66b6157ec ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(candidate.temperature[i], mode[i / 5] / 4, bound) | EXPECT_LE(candidate.evidence.beta_cert, candidate.evidence.beta_limit) | EXPECT_LE(candidate.evidence.energy_defect, candidate.evidence.energy_bound) | EXPECT_TRUE(candidate.evidence.dissipation_checked) | EXPECT_LE(candidate.evidence.dissipation_defect, candidate.evidence.dissipation_bound) | ASSERT_TRUE(flux.HasValue()) | EXPECT_NEAR(q.X(), .5, 16 * bound + 4096 * 0x1p-53 * .5) | EXPECT_NEAR(q.Y(), 0, 16 * bound) | EXPECT_NEAR(q.Z(), 0, 16 * bound) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(candidate.temperature[i], mode[i / 5] / 4, bound) | EXPECT_LE(candidate.evidence.beta_cert, candidate.evidence.beta_limit) | EXPECT_LE(candidate.evidence.energy_defect, candidate.evidence.energy_bound) | EXPECT_TRUE(candidate.evidence.dissipation_checked) | EXPECT_LE(candidate.evidence.dissipation_defect, candidate.evidence.dissipation_bound) | ASSERT_TRUE(flux.HasValue()) | EXPECT_NEAR(q.X(), .5, 16 * bound + 4096 * 0x1p-53 * .5) | EXPECT_NEAR(q.Y(), 0, 16 * bound) | EXPECT_NEAR(q.Z(), 0, 16 * bound) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.LaterSolveRecoveryAndPayloadFailuresPreserveEveryAcceptedBit TransientHeatProcedure.LaterSolveRecoveryAndPayloadFailuresPreserveEveryAcceptedBit; assertion 13개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.LaterSolveRecoveryAndPayloadFailuresPreserveEveryAcceptedBit 유지 원문 검사 body 및 assertion 동일. 2f4ea89dc0b1fb735d45915b043a1f2de650e0a55a98df2b4d95ce7bad84c001 2f4ea89dc0b1fb735d45915b043a1f2de650e0a55a98df2b4d95ce7bad84c001 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().IsComplete()) | EXPECT_EQ(evidence.size(), 1U) | EXPECT_EQ(Snapshot(state.Value()), before) | EXPECT_EQ(state.Value().AcceptedFrames()[0].temperature[0], 2) | EXPECT_EQ(state.Value().CommittedState().temperature[0], 1) | EXPECT_EQ(solver.factorizations, 1) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().IsComplete()) | EXPECT_EQ(evidence.size(), 1U) | EXPECT_EQ(Snapshot(state.Value()), before) | EXPECT_EQ(state.Value().AcceptedFrames()[0].temperature[0], 2) | EXPECT_EQ(state.Value().CommittedState().temperature[0], 1) | EXPECT_EQ(solver.factorizations, 1) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SignedPowerConstrainedReactionAndDisconnectedComponentBalance TransientHeatProcedure.SignedPowerConstrainedReactionAndDisconnectedComponentBalance; assertion 14개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SignedPowerConstrainedReactionAndDisconnectedComponentBalance 유지 원문 검사 body 및 assertion 동일. c99828c6527db730f1bb8ec96e489a85090c34c5d3084fe0a1dc5fc3dd507e15 c99828c6527db730f1bb8ec96e489a85090c34c5d3084fe0a1dc5fc3dd507e15 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(evidence.size(), 2U) | EXPECT_NEAR(balance[0], .25 * reaction, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[0]) | EXPECT_NEAR(balance[1], 0, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[1]) | EXPECT_FALSE(evidence[step - 1].dissipation_checked) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other.HasValue()) | EXPECT_NEAR(first.temperature[i], second.temperature[i], 4096 * 0x1p-53 * std::abs(second.temperature[i])) | EXPECT_NEAR(first.completed->reaction_heat_rate[0] - second.completed->reaction_heat_rate[0], -3., 4096 * 0x1p-53 * 3) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(evidence.size(), 2U) | EXPECT_NEAR(balance[0], .25 * reaction, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[0]) | EXPECT_NEAR(balance[1], 0, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[1]) | EXPECT_FALSE(evidence[step - 1].dissipation_checked) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other.HasValue()) | EXPECT_NEAR(first.temperature[i], second.temperature[i], 4096 * 0x1p-53 * std::abs(second.temperature[i])) | EXPECT_NEAR(first.completed->reaction_heat_rate[0] - second.completed->reaction_heat_rate[0], -3., 4096 * 0x1p-53 * 3) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ConstructionEnclosuresRetainExactIdentitiesAndSubnormalLoss TransientHeatProcedure.ConstructionEnclosuresRetainExactIdentitiesAndSubnormalLoss; assertion 9개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ConstructionEnclosuresRetainExactIdentitiesAndSubnormalLoss 유지 원문 검사 body 및 assertion 동일. 99c40aa53ebd7840c50827f7a7cba6e8c37e21c37797d984dfff01c81f812fb5 99c40aa53ebd7840c50827f7a7cba6e8c37e21c37797d984dfff01c81f812fb5 EXPECT_EQ(value.lower, expected) | EXPECT_EQ(value.upper, expected) | EXPECT_LE(midpoint.lower, 1) | EXPECT_GE(midpoint.upper, std::nextafter(1., 2.)) | EXPECT_LE(half.lower, 0) | EXPECT_GE(half.upper, tiny) | EXPECT_NE(half.lower, half.upper) | EXPECT_FALSE( b::Mul(b::I{std::numeric_limits::max()}, b::I{2}).IsFinite()) | EXPECT_GT(b::Roundoff(80, b::I{tiny}).upper, 0) EXPECT_EQ(value.lower, expected) | EXPECT_EQ(value.upper, expected) | EXPECT_LE(midpoint.lower, 1) | EXPECT_GE(midpoint.upper, std::nextafter(1., 2.)) | EXPECT_LE(half.lower, 0) | EXPECT_GE(half.upper, tiny) | EXPECT_NE(half.lower, half.upper) | EXPECT_FALSE( b::Mul(b::I{std::numeric_limits::max()}, b::I{2}).IsFinite()) | EXPECT_GT(b::Roundoff(80, b::I{tiny}).upper, 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.GenericAlgebraRejectsInvalidInputsAndUncertifiedSubnormalSolve TransientHeatProcedure.GenericAlgebraRejectsInvalidInputsAndUncertifiedSubnormalSolve; assertion 5개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.GenericAlgebraRejectsInvalidInputsAndUncertifiedSubnormalSolve 유지 원문 검사 body 및 assertion 동일. 521aae60d1b90ac0380baf56f738a93910d9d758dbc2a785fb80e0cc5548087b 521aae60d1b90ac0380baf56f738a93910d9d758dbc2a785fb80e0cc5548087b EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{2}, delta, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, {{0}, {0}, fesa::Vector{1, 1}}, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{1}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({invalid, c, q}, p, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, small, fesa::Vector{2}, .5, solver, cache) .HasValue()) EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{2}, delta, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, {{0}, {0}, fesa::Vector{1, 1}}, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{1}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({invalid, c, q}, p, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, small, fesa::Vector{2}, .5, solver, cache) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SerialAndTbbExecutionsHaveIdenticalAcceptedHistories TransientHeatProcedure.SerialAndTbbExecutionsHaveIdenticalAcceptedHistories; assertion 4개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SerialAndTbbExecutionsHaveIdenticalAcceptedHistories 유지 원문 검사 body 및 assertion 동일. d88a406c7cd08b89d4d7877bf387792819e771b3133dbf4ab7f248ecbd55cb22 d88a406c7cd08b89d4d7877bf387792819e771b3133dbf4ab7f248ecbd55cb22 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(left.HasValue()) | ASSERT_TRUE(right.HasValue()) | EXPECT_EQ(Snapshot(left.Value().state), Snapshot(right.Value().state)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(left.HasValue()) | ASSERT_TRUE(right.HasValue()) | EXPECT_EQ(Snapshot(left.Value().state), Snapshot(right.Value().state)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/analysis/transient_heat_procedure_test.cpp support@1-101 helper/oracle/fixture/include/static assertion 구간: ti, Messages, Plate, TwoMatrix, CountingSolver, Snapshot, for, if tests/unit/analysis/transient_heat_procedure_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 431e3b6b4a2eb8c51ca8135b26c47253934ad5c305674bac102094a5382a2d1d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/app/output_paths_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/app/output_paths_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 23aa6fa1dac950505061d2d64a2ad10abffb76bcabc0232cd0afef512c863107 23aa6fa1dac950505061d2d64a2ad10abffb76bcabc0232cd0afef512c863107 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/app/output_paths_test.cpp OutputPaths.RejectsFirstTokenContainingOutputSubstring OutputPaths.RejectsFirstTokenContainingOutputSubstring; assertion 2개 tests/unit/app/output_paths_test.cpp OutputPaths.RejectsFirstTokenContainingOutputSubstring 유지 원문 검사 body 및 assertion 동일. b5fcd67ff4f6a7eaa6e06e55668193dd70ba3822879887699b02d4baf7b419b1 b5fcd67ff4f6a7eaa6e06e55668193dd70ba3822879887699b02d4baf7b419b1 "ASSERT_FALSE(paths.HasValue()) | EXPECT_EQ(paths.GetStatus().Diagnostics().front().entity_identity, ""argument_index=0;argument=abc--outputdef"")" "ASSERT_FALSE(paths.HasValue()) | EXPECT_EQ(paths.GetStatus().Diagnostics().front().entity_identity, ""argument_index=0;argument=abc--outputdef"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/app/output_paths_test.cpp OutputPaths.RejectsEveryOutputSubstringVariant OutputPaths.RejectsEveryOutputSubstringVariant; assertion 1개 tests/unit/app/output_paths_test.cpp OutputPaths.RejectsEveryOutputSubstringVariant 유지 원문 검사 body 및 assertion 동일. 9ccaab67728c7c0a433b6ece05c14731aa50e6b5010d9de5e18eb258fe6b4d3d 9ccaab67728c7c0a433b6ece05c14731aa50e6b5010d9de5e18eb258fe6b4d3d ASSERT_FALSE(paths.HasValue()) ASSERT_FALSE(paths.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/app/output_paths_test.cpp OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput; assertion 4개 tests/unit/app/output_paths_test.cpp OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput 유지 원문 검사 body 및 assertion 동일. be83317f7274e5567210d53981799a741b7beb27bd40f47391f2417fac426bd0 be83317f7274e5567210d53981799a741b7beb27bd40f47391f2417fac426bd0 "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ( paths.Value().input_path, std::filesystem::path{""C:/invocation/current/models/Beam.Model.INP""}) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_log.txt""})" "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ( paths.Value().input_path, std::filesystem::path{""C:/invocation/current/models/Beam.Model.INP""}) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_log.txt""})" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/app/output_paths_test.cpp OutputPaths.PreservesBasenameCaseAndPrecedingDots OutputPaths.PreservesBasenameCaseAndPrecedingDots; assertion 3개 tests/unit/app/output_paths_test.cpp OutputPaths.PreservesBasenameCaseAndPrecedingDots 유지 원문 검사 body 및 assertion 동일. 61885c6eea856194a2be897fc370b6aaaab094a608da558e7459b8e5798941a8 61885c6eea856194a2be897fc370b6aaaab094a608da558e7459b8e5798941a8 "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{""C:/models/.Beam.v2_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{""C:/models/.Beam.v2_log.txt""})" "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{""C:/models/.Beam.v2_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{""C:/models/.Beam.v2_log.txt""})" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/app/output_paths_test.cpp OutputPaths.RejectsInputWithoutInpFinalExtension OutputPaths.RejectsInputWithoutInpFinalExtension; assertion 1개 tests/unit/app/output_paths_test.cpp OutputPaths.RejectsInputWithoutInpFinalExtension 유지 원문 검사 body 및 assertion 동일. 0014158f8fc76b488d78ce4409d51ef8f401c1f051f2cd0db5620a776c3b9953 0014158f8fc76b488d78ce4409d51ef8f401c1f051f2cd0db5620a776c3b9953 ASSERT_FALSE(paths.HasValue()) ASSERT_FALSE(paths.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/app/output_paths_test.cpp OutputPaths.LeaseCollisionPreservesPublicOutputPaths OutputPaths.LeaseCollisionPreservesPublicOutputPaths; assertion 6개 tests/unit/app/output_paths_test.cpp OutputPaths.LeaseCollisionPreservesPublicOutputPaths 유지 원문 검사 body 및 assertion 동일. b93c20d80194e4d6ef75b5cc9deeed307c666c32d1eb009a75058426755fa409 b93c20d80194e4d6ef75b5cc9deeed307c666c32d1eb009a75058426755fa409 ASSERT_TRUE(first.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) | ASSERT_FALSE(second.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) ASSERT_TRUE(first.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) | ASSERT_FALSE(second.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/app/output_paths_test.cpp OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths; assertion 3개 tests/unit/app/output_paths_test.cpp OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths 유지 원문 검사 body 및 assertion 동일. c48fbc834105a6cd2380b9a77237a1f2990fd348e4c796cb5ba405a37b2d07b2 c48fbc834105a6cd2380b9a77237a1f2990fd348e4c796cb5ba405a37b2d07b2 "EXPECT_EQ(request.input_path, ""C:/models/model.inp"") | EXPECT_EQ(request.output_path, ""C:/models/model_results.h5"") | EXPECT_EQ(request.log_path, ""C:/models/model_log.txt"")" "EXPECT_EQ(request.input_path, ""C:/models/model.inp"") | EXPECT_EQ(request.output_path, ""C:/models/model_results.h5"") | EXPECT_EQ(request.log_path, ""C:/models/model_log.txt"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/app/output_paths_test.cpp support@1-49 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, ExpectFailureCode tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8dbf6924f3d67728bb5446141ed4ace5ac53a860966902e0e81cfe6dc39db3c4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/app/output_paths_test.cpp support@71-72 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b196b7affd091bd4430c558ecb836979300676f2db7a408c62e9271c62e40d71 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/app/output_paths_test.cpp support@89-90 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a5bd942724af8adb3d7c4b014a78f9a28247931c4ea15756008b12b39aeb68fd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/app/output_paths_test.cpp support@109-110 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. af57532578cc6d4bc6c633b7417372ef65a6b94c1efa40c6a66a0c0a47624792 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/app/output_paths_test.cpp support@128-129 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 30515567df68d6c58a8531445f79936aa9236b7440ac2d675f11334b4e1278b9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/app/output_paths_test.cpp support@140-141 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/load_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 13개 tests/unit/assembly/load_assembler_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 34eb602efea7903941426ad18f10ba54bdabd46e4e262ba6efcb5ffabf2af2d3 34eb602efea7903941426ad18f10ba54bdabd46e4e262ba6efcb5ffabf2af2d3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder; assertion 3개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder 유지 원문 검사 body 및 assertion 동일. aff7361b21837067a746e74160c69e478361e53af3444bffe4d0e557a557c690 aff7361b21837067a746e74160c69e478361e53af3444bffe4d0e557a557c690 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[0U], -1.0) | EXPECT_DOUBLE_EQ(result.Value()[2U], -2.5) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[0U], -1.0) | EXPECT_DOUBLE_EQ(result.Value()[2U], -2.5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit; assertion 2개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit 유지 원문 검사 body 및 assertion 동일. 4516bacc631826833398902d64155fc5f6d7c6906375f9966010ff7e7691dc7e 4516bacc631826833398902d64155fc5f6d7c6906375f9966010ff7e7691dc7e ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(repeated.Value()[1U], 3.0) ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(repeated.Value()[1U], 3.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AssemblesNodeSetAndSixComponentLoads LoadAssembly.AssemblesNodeSetAndSixComponentLoads; assertion 5개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AssemblesNodeSetAndSixComponentLoads 유지 원문 검사 body 및 assertion 동일. 1bdb44b82711f7c6e58780cce70be76a8c21cd6eb2017a77241d7b4ed031b4d5 1bdb44b82711f7c6e58780cce70be76a8c21cd6eb2017a77241d7b4ed031b4d5 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 12U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 12U), (std::vector{1.0, 2.0, 0.0, -4.0, 5.0, 0.0, 1.0, 0.0, 3.0, 0.0, 5.0, 6.0})) | EXPECT_EQ(fixture.dofs->ConstrainedDofs(), (std::vector{0U})) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 12U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 12U), (std::vector{1.0, 2.0, 0.0, -4.0, 5.0, 0.0, 1.0, 0.0, 3.0, 0.0, 5.0, 6.0})) | EXPECT_EQ(fixture.dofs->ConstrainedDofs(), (std::vector{0U})) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesSignedLoadsInSourceOrder LoadAssembly.AccumulatesSignedLoadsInSourceOrder; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesSignedLoadsInSourceOrder 유지 원문 검사 body 및 assertion 동일. 0e27baa9eedd061df41e6eb0ceaaf6ed5073343675c3d17412eb4bb33f7c055f 0e27baa9eedd061df41e6eb0ceaaf6ed5073343675c3d17412eb4bb33f7c055f ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(second.Value()[0U], 0.0) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(second.Value()[0U], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder; assertion 3개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder 유지 원문 검사 body 및 assertion 동일. 79cc99592d223bf47a84a2e6417bf67d9cd139106e217bba7ea034759ea36814 79cc99592d223bf47a84a2e6417bf67d9cd139106e217bba7ea034759ea36814 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 24U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 6U), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0, 0.0})) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 24U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 6U), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0, 0.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AcceptsExactlyZeroAggregateShellMoment LoadAssembly.AcceptsExactlyZeroAggregateShellMoment; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AcceptsExactlyZeroAggregateShellMoment 유지 원문 검사 body 및 assertion 동일. 733bd45f5146ff23a07a82104b8331e28b49c335ddf6a0aec54ad75bf642a316 733bd45f5146ff23a07a82104b8331e28b49c335ddf6a0aec54ad75bf642a316 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[5U], 0.0) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[5U], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold; assertion 7개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold 유지 원문 검사 body 및 assertion 동일. fea2c3252ba8945cb8611b9feb2879b6eeaa387e739a47709caf10ce8a447337 fea2c3252ba8945cb8611b9feb2879b6eeaa387e739a47709caf10ce8a447337 "ASSERT_TRUE(accepted.HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].keyword, ""CLOAD"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""10"")" "ASSERT_TRUE(accepted.HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].keyword, ""CLOAD"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""10"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed 유지 원문 검사 body 및 assertion 동일. 18508214d24d7672307273a6b6575be56d3d3e18b1890c1a5889d38969795375 18508214d24d7672307273a6b6575be56d3d3e18b1890c1a5889d38969795375 "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"")" "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.FormsNonzeroPrescribedEffectiveRhs LoadAssembly.FormsNonzeroPrescribedEffectiveRhs; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.FormsNonzeroPrescribedEffectiveRhs 유지 원문 검사 body 및 assertion 동일. ec68ce4b41d1de543a53650df90bfd6ff69f294deb6e1ed1ccdf92e34e1a90b4 ec68ce4b41d1de543a53650df90bfd6ff69f294deb6e1ed1ccdf92e34e1a90b4 ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(rhs.HasValue()) | ASSERT_EQ(rhs.Value().Size(), 4U) | EXPECT_EQ(std::vector(rhs.Value().Data(), rhs.Value().Data() + 4U), (std::vector{10.0, 18.0, 39.0, 38.0})) ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(rhs.HasValue()) | ASSERT_EQ(rhs.Value().Size(), 4U) | EXPECT_EQ(std::vector(rhs.Value().Data(), rhs.Value().Data() + 4U), (std::vector{10.0, 18.0, 39.0, 38.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsNonfiniteOrDimensionMismatch LoadAssembly.RejectsNonfiniteOrDimensionMismatch; assertion 0개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsNonfiniteOrDimensionMismatch 유지 원문 검사 body 및 assertion 동일. 5cc4ddbbe4657de7260e4d3d06882ec35eddc096aaa2410c36fc7c0d1d8c2d87 5cc4ddbbe4657de7260e4d3d06882ec35eddc096aaa2410c36fc7c0d1d8c2d87 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.ZeroLoadsRemainZero LoadAssembly.ZeroLoadsRemainZero; assertion 8개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.ZeroLoadsRemainZero 유지 원문 검사 body 및 assertion 동일. 7635872252315cd7031e15d3dc4016b63f745528c55c7be84c6651c5f25dcf19 7635872252315cd7031e15d3dc4016b63f745528c55c7be84c6651c5f25dcf19 ASSERT_TRUE(full.HasValue()) | EXPECT_TRUE(std::all_of(full.Value().Data(), full.Value().Data() + full.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(free_rhs.HasValue()) | EXPECT_EQ(free_rhs.Value().Size(), 6U) | EXPECT_TRUE(std::all_of(free_rhs.Value().Data(), free_rhs.Value().Data() + free_rhs.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(constrained_full.HasValue()) | ASSERT_TRUE(constrained_rhs.HasValue()) | EXPECT_EQ(constrained_rhs.Value().Size(), 0U) ASSERT_TRUE(full.HasValue()) | EXPECT_TRUE(std::all_of(full.Value().Data(), full.Value().Data() + full.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(free_rhs.HasValue()) | EXPECT_EQ(free_rhs.Value().Size(), 6U) | EXPECT_TRUE(std::all_of(free_rhs.Value().Data(), free_rhs.Value().Data() + free_rhs.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(constrained_full.HasValue()) | ASSERT_TRUE(constrained_rhs.HasValue()) | EXPECT_EQ(constrained_rhs.Value().Size(), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.PreservesOrderedCancellationInPrescribedCorrection LoadAssembly.PreservesOrderedCancellationInPrescribedCorrection; assertion 5개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.PreservesOrderedCancellationInPrescribedCorrection 유지 원문 검사 body 및 assertion 동일. d6e8d73924701453a7baadca084ff79663c300ab2e9b670eebdc2af86b2345d0 d6e8d73924701453a7baadca084ff79663c300ab2e9b670eebdc2af86b2345d0 ASSERT_TRUE(rhs.HasValue()) | ASSERT_EQ(rhs.Value().Size(), 3U) | EXPECT_DOUBLE_EQ(rhs.Value()[0U], 0.0) | EXPECT_DOUBLE_EQ(rhs.Value()[1U], -1.0) | EXPECT_DOUBLE_EQ(rhs.Value()[2U], 0.0) ASSERT_TRUE(rhs.HasValue()) | ASSERT_EQ(rhs.Value().Size(), 3U) | EXPECT_DOUBLE_EQ(rhs.Value()[0U], 0.0) | EXPECT_DOUBLE_EQ(rhs.Value()[1U], -1.0) | EXPECT_DOUBLE_EQ(rhs.Value()[2U], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp LoadAssembly.SelectsFirstOrderedOverflowDiagnostic LoadAssembly.SelectsFirstOrderedOverflowDiagnostic; assertion 3개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.SelectsFirstOrderedOverflowDiagnostic 유지 원문 검사 body 및 assertion 동일. e3e2469155d1d3b62eb83bc0d55881ce8a93c78cf7ae13c191f54a00fe1a8655 e3e2469155d1d3b62eb83bc0d55881ce8a93c78cf7ae13c191f54a00fe1a8655 "ASSERT_EQ(rhs.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rhs.GetStatus().Diagnostics()[0U].entity_identity, ""0"") | EXPECT_NE(rhs.GetStatus().Diagnostics()[0U].message.find(""row sum""), std::string::npos)" "ASSERT_EQ(rhs.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rhs.GetStatus().Diagnostics()[0U].entity_identity, ""0"") | EXPECT_NE(rhs.GetStatus().Diagnostics()[0U].message.find(""row sum""), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/load_assembler_test.cpp support@1-189 helper/oracle/fixture/include/static assertion 구간: LoadFixture, MakeFixture, if, MakeShellFixture, MakeDenseSparse, ExpectFailureCode, FakeLoad tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 09f288a427937029f1c93b5bd10b79a1ce75968600aab87a6017627ab43bbb4d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/load_assembler_test.cpp support@276-277 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a0c3d2fdca7428b4606aecf54fc991ff71f42a6f8dfbf900da33db75c07db5e7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/load_assembler_test.cpp support@301-302 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e5f1c6b05c193f37b5f5903549e70c2637df4efaa741399afea556790fcdd57d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/load_assembler_test.cpp support@320-321 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6d8dccf1a14f246c0076046744d9f5f32eb359e499a133ad3f09fc9a287f59b3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/load_assembler_test.cpp support@343-344 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 27a372ac23810e34bb1331fb06ff49031906985bdadbc563bb9322e0c7b5e944 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/parallel_for_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/assembly/parallel_for_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c33eb3d92d7e4fd8c3ae369e223cc123437ab59d17653a4114fc4d80b1230314 c33eb3d92d7e4fd8c3ae369e223cc123437ab59d17653a4114fc4d80b1230314 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/parallel_for_test.cpp ParallelFor.ZeroOneManyExecuteExactlyOnce ParallelFor.ZeroOneManyExecuteExactlyOnce; assertion 2개 tests/unit/assembly/parallel_for_test.cpp ParallelFor.ZeroOneManyExecuteExactlyOnce 유지 원문 검사 body 및 assertion 동일. ae877ba853b9d44bca19a62c65606b8130804cfd09d020aed0c560e1bf25fbb3 ae877ba853b9d44bca19a62c65606b8130804cfd09d020aed0c560e1bf25fbb3 EXPECT_EQ(zero_visits.load(std::memory_order_relaxed), 0U) | EXPECT_EQ(visits[index].load(std::memory_order_relaxed), 1U) EXPECT_EQ(zero_visits.load(std::memory_order_relaxed), 0U) | EXPECT_EQ(visits[index].load(std::memory_order_relaxed), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/parallel_for_test.cpp ParallelFor.SerialAndTbbProduceStableIndexedOutput ParallelFor.SerialAndTbbProduceStableIndexedOutput; assertion 4개 tests/unit/assembly/parallel_for_test.cpp ParallelFor.SerialAndTbbProduceStableIndexedOutput 유지 원문 검사 body 및 assertion 동일. 2ab6268405c5255e272585cd37131ac4b46b20a59e68b8e4a151839a35ac727b 2ab6268405c5255e272585cd37131ac4b46b20a59e68b8e4a151839a35ac727b EXPECT_EQ(serial_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), serial_output[index].load(std::memory_order_relaxed)) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), value_for_index(index)) EXPECT_EQ(serial_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), serial_output[index].load(std::memory_order_relaxed)) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), value_for_index(index)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/parallel_for_test.cpp ParallelFor.PropagatesBodyExceptionByContract ParallelFor.PropagatesBodyExceptionByContract; assertion 1개 tests/unit/assembly/parallel_for_test.cpp ParallelFor.PropagatesBodyExceptionByContract 유지 원문 검사 body 및 assertion 동일. e3d433539fb80a97ab4be815cbe5d2cd45434502bb2566bf94ff67bc15d4ee84 e3d433539fb80a97ab4be815cbe5d2cd45434502bb2566bf94ff67bc15d4ee84 "EXPECT_EQ(std::string{error.what()}, ""parallel-for-body-failure"")" "EXPECT_EQ(std::string{error.what()}, ""parallel-for-body-failure"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/parallel_for_test.cpp support@1-25 helper/oracle/fixture/include/static assertion 구간: fesa, ParallelForBodyError, ParallelForBackends tests/unit/assembly/parallel_for_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9cd2b8b3b770e02c02d2fe88f4966177d86c949c6fc0904fdbcfbedc9994989a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/parallel_for_test.cpp support@112-114 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/assembly/parallel_for_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/sparse_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/assembly/sparse_assembler_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 189583b8d3501b8337b55f56051ea1d57e55626bb5358df9787651ef96c34697 0a9627a0923db100df6ce2d8ca2fada0d5d86cd156d2f12ac1c979a6f8291215 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr; assertion 14개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr 유지 원문 검사 body 및 assertion 동일. 12ccb35b0634063643caa859a19ad70b4c5ffdd9c844561cf80ee3c18ab716f0 12ccb35b0634063643caa859a19ad70b4c5ffdd9c844561cf80ee3c18ab716f0 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), elements.size()) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), (std::vector{0U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 6U, 6U, 9U, 9U, 9U, 12U})) | EXPECT_EQ(serial.Value().ColumnIndices(), (std::vector{0U, 12U, 0U, 12U, 14U, 17U, 12U, 14U, 17U, 12U, 14U, 17U})) | EXPECT_EQ(serial.Value().Values(), (std::vector{1.0, 2.0, 3.0, 9.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0})) | ASSERT_TRUE(repeated.HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), elements.size()) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), (std::vector{0U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 6U, 6U, 9U, 9U, 9U, 12U})) | EXPECT_EQ(serial.Value().ColumnIndices(), (std::vector{0U, 12U, 0U, 12U, 14U, 17U, 12U, 14U, 17U, 12U, 14U, 17U})) | EXPECT_EQ(serial.Value().Values(), (std::vector{1.0, 2.0, 3.0, 9.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0})) | ASSERT_TRUE(repeated.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical; assertion 20개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical 유지 원문 검사 body 및 assertion 동일. 5849dbe7757b88a61317b8233042ef8e96361c3df7ffc77c6e5f428e52989d1e 5849dbe7757b88a61317b8233042ef8e96361c3df7ffc77c6e5f428e52989d1e ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), dofs_result.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(serial.Value().ColumnIndices(), dofs_result.Value().GetSparsePattern().column_indices) | EXPECT_TRUE(serial.Value().Validate().IsOk()) | ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(Entry(serial.Value(), row, column), Entry(serial.Value(), column, row)) | EXPECT_NEAR(Entry(serial.Value(), 0U, 0U), 120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 0U, 6U), -120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 6U), 200.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 12U), -80.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 12U, 12U), 80.0, 1.0e-12) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), dofs_result.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(serial.Value().ColumnIndices(), dofs_result.Value().GetSparsePattern().column_indices) | EXPECT_TRUE(serial.Value().Validate().IsOk()) | ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(Entry(serial.Value(), row, column), Entry(serial.Value(), column, row)) | EXPECT_NEAR(Entry(serial.Value(), 0U, 0U), 120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 0U, 6U), -120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 6U), 200.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 12U), -80.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 12U, 12U), 80.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots; assertion 12개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots 유지 원문 검사 body 및 assertion 동일. 49e404af06df45dd33c41511e4b767b397f204af6dee8ddf123a19cc1159d489 49e404af06df45dd33c41511e4b767b397f204af6dee8ddf123a19cc1159d489 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_EQ(assembled.Value().Rows(), 24U) | EXPECT_EQ(assembled.Value().Columns(), 24U) | EXPECT_EQ(assembled.Value().Values().size(), 24U * 24U) | EXPECT_EQ(assembled.Value().RowOffsets(), dofs.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(assembled.Value().ColumnIndices(), dofs.Value().GetSparsePattern().column_indices) | EXPECT_NE(std::lower_bound(begin, end, row), end) | EXPECT_DOUBLE_EQ(Entry(assembled.Value(), row, column), expected.Value().stabilized_global24(row, column)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_EQ(assembled.Value().Rows(), 24U) | EXPECT_EQ(assembled.Value().Columns(), 24U) | EXPECT_EQ(assembled.Value().Values().size(), 24U * 24U) | EXPECT_EQ(assembled.Value().RowOffsets(), dofs.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(assembled.Value().ColumnIndices(), dofs.Value().GetSparsePattern().column_indices) | EXPECT_NE(std::lower_bound(begin, end, row), end) | EXPECT_DOUBLE_EQ(Entry(assembled.Value(), row, column), expected.Value().stabilized_global24(row, column)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical; assertion 6개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical 유지 원문 검사 body 및 assertion 동일. 8a7b6de57d65db7469d0151373d4dc4642b7279f6e4e036f8cc76bb27e0db170 8a7b6de57d65db7469d0151373d4dc4642b7279f6e4e036f8cc76bb27e0db170 ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | ASSERT_TRUE(repeated.HasValue()) ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | ASSERT_TRUE(repeated.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness; assertion 3개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness 유지 원문 검사 body 및 assertion 동일. e5a06a15276973da6be56d1ee497a913c183e8fae82909c70d28845de7fd434c e5a06a15276973da6be56d1ee497a913c183e8fae82909c70d28845de7fd434c ASSERT_TRUE(s4.HasValue()) | ASSERT_TRUE(s4r.HasValue()) | EXPECT_TRUE(std::any_of(s4.Value().Values().begin(), s4.Value().Values().end(), [](const double value) { return value != 0.0; })) ASSERT_TRUE(s4.HasValue()) | ASSERT_TRUE(s4r.HasValue()) | EXPECT_TRUE(std::any_of(s4.Value().Values().begin(), s4.Value().Values().end(), [](const double value) { return value != 0.0; })) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/sparse_assembler_test.cpp support@1-228 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, MakeShellDefinition, if, DirectShellStiffness, AssembleShell, T, ByteIdentical, Entry, ReverseParallelFor, FakeStiffnessElement, MatrixFromRows, ExpectByteIdentical tests/unit/assembly/sparse_assembler_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c50684935a4642f8ccb99b80d27ad56a660aac55c1dbe5627c85a45c24cbafb5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/sparse_assembler_test.cpp support@416-417 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/sparse_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/surface_pressure_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/assembly/surface_pressure_assembler_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 65b0c1bd703fc7bafdbd8200cf61935a039da6b80295f0ddee35027d2cf2dc78 65b0c1bd703fc7bafdbd8200cf61935a039da6b80295f0ddee35027d2cf2dc78 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder; assertion 12개 tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder 유지 원문 검사 body 및 assertion 동일. 61ec658b973ff4f2a3c4dc06cd90c2b4dd2b5ac5d323c41996fcea64dd0375c7 61ec658b973ff4f2a3c4dc06cd90c2b4dd2b5ac5d323c41996fcea64dd0375c7 ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().diagnostics.empty()) | ASSERT_EQ(result.Value().full_external_force.Size(), 24U) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 2U], -0.5) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 5U], 0.0) | EXPECT_EQ(result.Value().full_external_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().full_external_tangent.Columns(), 24U) | EXPECT_EQ(value, 0.0) ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().diagnostics.empty()) | ASSERT_EQ(result.Value().full_external_force.Size(), 24U) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 2U], -0.5) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 5U], 0.0) | EXPECT_EQ(result.Value().full_external_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().full_external_tangent.Columns(), 24U) | EXPECT_EQ(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce; assertion 2개 tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce 유지 원문 검사 body 및 assertion 동일. 8fdc8dc50f731553ae45c3c08e921158c7ddc9dd639562d30ea5261e09ad46d8 8fdc8dc50f731553ae45c3c08e921158c7ddc9dd639562d30ea5261e09ad46d8 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[node * 6U + 2U], -1.0) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[node * 6U + 2U], -1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation; assertion 8개 tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation 유지 원문 검사 body 및 assertion 동일. 48444c6f2917e44301611c69abf5fe3192dddea0f8bd5491faa6798a1b1ee682 48444c6f2917e44301611c69abf5fe3192dddea0f8bd5491faa6798a1b1ee682 ASSERT_TRUE(serial_result.HasValue()) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_EQ(Values(serial_result.Value().full_external_force), Values(parallel_result.Value().full_external_force)) | EXPECT_EQ(serial_result.Value().full_external_tangent.RowOffsets(), parallel_result.Value().full_external_tangent.RowOffsets()) | EXPECT_EQ(serial_result.Value().full_external_tangent.ColumnIndices(), parallel_result.Value().full_external_tangent.ColumnIndices()) | EXPECT_EQ(serial_result.Value().full_external_tangent.Values(), parallel_result.Value().full_external_tangent.Values()) | EXPECT_TRUE(serial_result.Value().diagnostics.empty()) | EXPECT_TRUE(parallel_result.Value().diagnostics.empty()) ASSERT_TRUE(serial_result.HasValue()) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_EQ(Values(serial_result.Value().full_external_force), Values(parallel_result.Value().full_external_force)) | EXPECT_EQ(serial_result.Value().full_external_tangent.RowOffsets(), parallel_result.Value().full_external_tangent.RowOffsets()) | EXPECT_EQ(serial_result.Value().full_external_tangent.ColumnIndices(), parallel_result.Value().full_external_tangent.ColumnIndices()) | EXPECT_EQ(serial_result.Value().full_external_tangent.Values(), parallel_result.Value().full_external_tangent.Values()) | EXPECT_TRUE(serial_result.Value().diagnostics.empty()) | EXPECT_TRUE(parallel_result.Value().diagnostics.empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/assembly/surface_pressure_assembler_test.cpp support@1-122 helper/oracle/fixture/include/static assertion 구간: PressureFixture, MakeFixture, if, Values tests/unit/assembly/surface_pressure_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 212fb026f9860fa82917c9a2a8e06c719b1338a414784431d36b14ce79330338 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/thermal_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/assembly/thermal_assembler_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bcac60bb3167ad3e6ec2d45f9ee08c7535bb121f71cae21a7cac9053440ec25a bcac60bb3167ad3e6ec2d45f9ee08c7535bb121f71cae21a7cac9053440ec25a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.HandAssemblyPreservesSharedStationsMaterialOffsetAndThicknessJump ThermalAssembler.HandAssemblyPreservesSharedStationsMaterialOffsetAndThicknessJump; assertion 12개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.HandAssemblyPreservesSharedStationsMaterialOffsetAndThicknessJump 유지 원문 검사 body 및 assertion 동일. 2b58c82002dcecc533fba0030b665848e18c223902521a1e83fd2a87d742cb62 2b58c82002dcecc533fba0030b665848e18c223902521a1e83fd2a87d742cb62 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_EQ(assembled.Value().Conductivity().Rows(), 30U) | EXPECT_LE(std::abs(k(i, j) - expected.k(i, j)), ek(i, j) + gamma * expected.pk(i, j)) | EXPECT_LE(std::abs(c(i, j) - expected.c(i, j)), ec(i, j) + gamma * expected.pc(i, j)) | EXPECT_EQ(domain.Value().ThermalElements()[0].MaterialIndex(), 1U) | EXPECT_EQ(domain.Value().ThermalElements()[1].MaterialIndex(), 2U) | EXPECT_EQ(assembled.Value().ElementOrder(), (std::vector{0, 1})) | EXPECT_EQ(assembled.Value().Kernels()[0].SourceId().source_label_text, ""0009"") | EXPECT_EQ(assembled.Value().Scatters()[0][5 + a], assembled.Value().Scatters()[1][a])" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_EQ(assembled.Value().Conductivity().Rows(), 30U) | EXPECT_LE(std::abs(k(i, j) - expected.k(i, j)), ek(i, j) + gamma * expected.pk(i, j)) | EXPECT_LE(std::abs(c(i, j) - expected.c(i, j)), ec(i, j) + gamma * expected.pc(i, j)) | EXPECT_EQ(domain.Value().ThermalElements()[0].MaterialIndex(), 1U) | EXPECT_EQ(domain.Value().ThermalElements()[1].MaterialIndex(), 2U) | EXPECT_EQ(assembled.Value().ElementOrder(), (std::vector{0, 1})) | EXPECT_EQ(assembled.Value().Kernels()[0].SourceId().source_label_text, ""0009"") | EXPECT_EQ(assembled.Value().Scatters()[0][5 + a], assembled.Value().Scatters()[1][a])" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SourceRowHeatInputRetainsPrescribedSignedDuplicateContributions ThermalAssembler.SourceRowHeatInputRetainsPrescribedSignedDuplicateContributions; assertion 15개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SourceRowHeatInputRetainsPrescribedSignedDuplicateContributions 유지 원문 검사 body 및 assertion 동일. 17db9c94e9a588ae74c5f1a31a66d769b4b99a42263a1a0e04de71a3a1d53b0a 17db9c94e9a588ae74c5f1a31a66d769b4b99a42263a1a0e04de71a3a1d53b0a ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.Value().FreeEquation(full).has_value()) | EXPECT_EQ(result.Value().HeatInput()[full], 5.) | EXPECT_EQ(result.Value().HeatInput()[4], -7.) | EXPECT_GE(result.Value().HeatInputError()[full], 1.) | EXPECT_EQ(result.Value().HeatInput()[i], 0.) | EXPECT_EQ(result.Value().HeatInputError()[i], 0.) | ASSERT_TRUE(second_domain.HasValue()) | ASSERT_TRUE(second_model.HasValue()) | ASSERT_TRUE(second_dofs.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().HeatInput()[full], 6.) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.Value().FreeEquation(full).has_value()) | EXPECT_EQ(result.Value().HeatInput()[full], 5.) | EXPECT_EQ(result.Value().HeatInput()[4], -7.) | EXPECT_GE(result.Value().HeatInputError()[full], 1.) | EXPECT_EQ(result.Value().HeatInput()[i], 0.) | EXPECT_EQ(result.Value().HeatInputError()[i], 0.) | ASSERT_TRUE(second_domain.HasValue()) | ASSERT_TRUE(second_model.HasValue()) | ASSERT_TRUE(second_dofs.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().HeatInput()[full], 6.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SerialAndActualTbbOperatorsBoundsAndFluxAreBitwiseEqual ThermalAssembler.SerialAndActualTbbOperatorsBoundsAndFluxAreBitwiseEqual; assertion 11개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SerialAndActualTbbOperatorsBoundsAndFluxAreBitwiseEqual 유지 원문 검사 body 및 assertion 동일. 7083d3f901965e28ae9783d436dcef27b2622cb304a5b6631c6081a6656a27e3 7083d3f901965e28ae9783d436dcef27b2622cb304a5b6631c6081a6656a27e3 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Conductivity().RowOffsets(), parallel.Value().Conductivity().RowOffsets()) | EXPECT_EQ(serial.Value().Conductivity().ColumnIndices(), parallel.Value().Conductivity().ColumnIndices()) | EXPECT_EQ( std::memcmp(serial.Value().HeatInput().Data(), parallel.Value().HeatInput().Data(), 30 * sizeof(double)), 0) | ASSERT_TRUE(sf.HasValue()) | ASSERT_TRUE(pf.HasValue()) | EXPECT_EQ( std::memcmp(sf.Value()[e][r].Components().data(), pf.Value()[e][r].Components().data(), 3 * sizeof(double)), 0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Conductivity().RowOffsets(), parallel.Value().Conductivity().RowOffsets()) | EXPECT_EQ(serial.Value().Conductivity().ColumnIndices(), parallel.Value().Conductivity().ColumnIndices()) | EXPECT_EQ( std::memcmp(serial.Value().HeatInput().Data(), parallel.Value().HeatInput().Data(), 30 * sizeof(double)), 0) | ASSERT_TRUE(sf.HasValue()) | ASSERT_TRUE(pf.HasValue()) | EXPECT_EQ( std::memcmp(sf.Value()[e][r].Components().data(), pf.Value()[e][r].Components().data(), 3 * sizeof(double)), 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.DisconnectedComponentsHaveNoCrossBlockEntries ThermalAssembler.DisconnectedComponentsHaveNoCrossBlockEntries; assertion 6개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.DisconnectedComponentsHaveNoCrossBlockEntries 유지 원문 검사 body 및 assertion 동일. 18403e156469c7c5012f27a63e4d9f13d4a7cef5d14cf64fb3c66e8b2b461fd9 18403e156469c7c5012f27a63e4d9f13d4a7cef5d14cf64fb3c66e8b2b461fd9 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(matrix.Rows(), 40U) | EXPECT_EQ(row < 20, matrix.ColumnIndices()[p] < 20) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(matrix.Rows(), 40U) | EXPECT_EQ(row < 20, matrix.ColumnIndices()[p] < 20) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.RejectsWrongProfilesPartitionsAndNonfiniteAccumulation ThermalAssembler.RejectsWrongProfilesPartitionsAndNonfiniteAccumulation; assertion 11개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.RejectsWrongProfilesPartitionsAndNonfiniteAccumulation 유지 원문 검사 body 및 assertion 동일. 17b959b03e9990bb95823d4e571e8e027d95babe4d8e5f02400d920e12e24961 17b959b03e9990bb95823d4e571e8e027d95babe4d8e5f02400d920e12e24961 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), fesa::DofManager{}, fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other_model.HasValue()) | ASSERT_TRUE(other_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), other_dofs.Value(), fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(overflow_domain.HasValue()) | ASSERT_TRUE(overflow_model.HasValue()) | ASSERT_TRUE(overflow_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(overflow_model.Value(), overflow_dofs.Value(), fesa::TbbParallelFor{}) .HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), fesa::DofManager{}, fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other_model.HasValue()) | ASSERT_TRUE(other_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), other_dofs.Value(), fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(overflow_domain.HasValue()) | ASSERT_TRUE(overflow_model.HasValue()) | ASSERT_TRUE(overflow_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(overflow_model.Value(), overflow_dofs.Value(), fesa::TbbParallelFor{}) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.ParallelKernelFailuresSelectStableSourceElement ThermalAssembler.ParallelKernelFailuresSelectStableSourceElement; assertion 7개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.ParallelKernelFailuresSelectStableSourceElement 유지 원문 검사 body 및 assertion 동일. 705c5cdaa64861e8c3cdc7f638eb3bbc8d6d8bb25de3e78dec00674cb5bee2f4 705c5cdaa64861e8c3cdc7f638eb3bbc8d6d8bb25de3e78dec00674cb5bee2f4 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_FALSE(serial.HasValue()) | ASSERT_FALSE(parallel.HasValue()) | EXPECT_EQ(serial.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"") | EXPECT_EQ(parallel.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_FALSE(serial.HasValue()) | ASSERT_FALSE(parallel.HasValue()) | EXPECT_EQ(serial.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"") | EXPECT_EQ(parallel.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/assembly/thermal_assembler_test.cpp support@1-117 helper/oracle/fixture/include/static assertion 구간: Model, Dense, ExpectedMatrices, Expected, SameBits tests/unit/assembly/thermal_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b3e9525aaced1be323ec738ea9213a2323dd745f550425b6a612fa09fa176d50 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/build_info_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/build_info_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8bf9bfef45c45c9a09e0a0f98ee4cc38316e2550894c6e27ca599fdd650298b8 8bf9bfef45c45c9a09e0a0f98ee4cc38316e2550894c6e27ca599fdd650298b8 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/build_info_test.cpp BuildInfo.VersionIsStableAndNonEmpty BuildInfo.VersionIsStableAndNonEmpty; assertion 3개 tests/unit/build_info_test.cpp BuildInfo.VersionIsStableAndNonEmpty 유지 원문 검사 body 및 assertion 동일. 0cb8bda21730c82347550102836f3bade449b4c590aa77348381f5066c040bd0 0cb8bda21730c82347550102836f3bade449b4c590aa77348381f5066c040bd0 "EXPECT_FALSE(first.empty()) | EXPECT_EQ(first, second) | EXPECT_TRUE(std::regex_match(std::string(first), std::regex{R""(^[0-9]+\.[0-9]+\.[0-9]+$)""}))" "EXPECT_FALSE(first.empty()) | EXPECT_EQ(first, second) | EXPECT_TRUE(std::regex_match(std::string(first), std::regex{R""(^[0-9]+\.[0-9]+\.[0-9]+$)""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/build_info_test.cpp BuildInfo.PublicHeaderHasNoBackendDependency BuildInfo.PublicHeaderHasNoBackendDependency; assertion 0개 tests/unit/build_info_test.cpp BuildInfo.PublicHeaderHasNoBackendDependency 유지 원문 검사 body 및 assertion 동일. 918ff7cf6a6f923c243045921b33a38cf1e94cfc73a2247b7fac6ac76ecc09a8 918ff7cf6a6f923c243045921b33a38cf1e94cfc73a2247b7fac6ac76ecc09a8 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/build_info_test.cpp support@1-9 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/build_info_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c574474e8a7db434a18523c880adfe46ee608d4109b4dffa1ea623ef3c291ac5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/constraints/boundary_condition_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/constraints/boundary_condition_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b5ff07b5925aab743568eff705c8827f7186889ad15541e90d2ed9fe6998ce79 b5ff07b5925aab743568eff705c8827f7186889ad15541e90d2ed9fe6998ce79 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase; assertion 8개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase 유지 원문 검사 body 및 assertion 동일. 8a449e3e0a082370655dda3bce51393da93ba796aac899f07b22572bffcc239d 8a449e3e0a082370655dda3bce51393da93ba796aac899f07b22572bffcc239d ASSERT_TRUE(definitions.HasValue()) | ASSERT_EQ(definitions.Value().size(), 2U) | EXPECT_EQ(definitions.Value()[0U].source_order, 4U) | EXPECT_EQ(definitions.Value()[0U].full_dof_index, 8U) | EXPECT_DOUBLE_EQ(definitions.Value()[0U].prescribed_value, 2.5) | EXPECT_EQ(definitions.Value()[1U].source_order, 4U) | EXPECT_EQ(definitions.Value()[1U].full_dof_index, 2U) | EXPECT_DOUBLE_EQ(definitions.Value()[1U].prescribed_value, 2.5) ASSERT_TRUE(definitions.HasValue()) | ASSERT_EQ(definitions.Value().size(), 2U) | EXPECT_EQ(definitions.Value()[0U].source_order, 4U) | EXPECT_EQ(definitions.Value()[0U].full_dof_index, 8U) | EXPECT_DOUBLE_EQ(definitions.Value()[0U].prescribed_value, 2.5) | EXPECT_EQ(definitions.Value()[1U].source_order, 4U) | EXPECT_EQ(definitions.Value()[1U].full_dof_index, 2U) | EXPECT_DOUBLE_EQ(definitions.Value()[1U].prescribed_value, 2.5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably; assertion 10개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably 유지 원문 검사 body 및 assertion 동일. ccb7ed25f7f922616192d64201aa0dd2e02b20fc5f8c7e0b71b99921adff83f8 ccb7ed25f7f922616192d64201aa0dd2e02b20fc5f8c7e0b71b99921adff83f8 ASSERT_EQ(boundaries.size(), 2U) | EXPECT_EQ(fixture.model->ActiveBoundaryConditions(), (std::vector{0U, 1U})) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(first.Value()[0U].source_order, 0U) | EXPECT_EQ(first.Value()[0U].full_dof_index, 6U) | EXPECT_EQ(second.Value()[0U].source_order, 1U) | EXPECT_EQ(second.Value()[0U].full_dof_index, 7U) | EXPECT_DOUBLE_EQ(first.Value()[0U].prescribed_value, 1.25) | EXPECT_DOUBLE_EQ(second.Value()[0U].prescribed_value, 1.25) ASSERT_EQ(boundaries.size(), 2U) | EXPECT_EQ(fixture.model->ActiveBoundaryConditions(), (std::vector{0U, 1U})) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(first.Value()[0U].source_order, 0U) | EXPECT_EQ(first.Value()[0U].full_dof_index, 6U) | EXPECT_EQ(second.Value()[0U].source_order, 1U) | EXPECT_EQ(second.Value()[0U].full_dof_index, 7U) | EXPECT_DOUBLE_EQ(first.Value()[0U].prescribed_value, 1.25) | EXPECT_DOUBLE_EQ(second.Value()[0U].prescribed_value, 1.25) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit; assertion 1개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit 유지 원문 검사 body 및 assertion 동일. 0777dfa7d90a00f5b781ac55fbcd26140ce971f90872e5d827092036852f2a74 0777dfa7d90a00f5b781ac55fbcd26140ce971f90872e5d827092036852f2a74 ASSERT_TRUE( fixture.dofs->Build(*fixture.model, elements, {std::cref(initial)}) .IsOk()) ASSERT_TRUE( fixture.dofs->Build(*fixture.model, elements, {std::cref(initial)}) .IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions; assertion 1개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions 유지 원문 검사 body 및 assertion 동일. 55ca5cd284184aa80c4d75cdced2736d1dedf3ee376f11277ff7ce933d8b1ba7 55ca5cd284184aa80c4d75cdced2736d1dedf3ee376f11277ff7ce933d8b1ba7 ASSERT_TRUE(status.IsOk()) ASSERT_TRUE(status.IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue; assertion 3개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue 유지 원문 검사 body 및 assertion 동일. 365ded0ccec2ef519edcd4c018361f02600a7e9ad1cf3964445965e9828e3a4a 365ded0ccec2ef519edcd4c018361f02600a7e9ad1cf3964445965e9828e3a4a "ASSERT_FALSE(result.HasValue()) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""nonfinite-prescribed-value"")" "ASSERT_FALSE(result.HasValue()) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""nonfinite-prescribed-value"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/boundary_condition_test.cpp support@1-104 helper/oracle/fixture/include/static assertion 구간: BoundaryFixture, FakeBoundaryCondition, ExpectFailureCode, ExpectCandidate tests/unit/constraints/boundary_condition_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7f03c2fa0d373d6420b1c18029f29a429ed75303d12a175e71a3ce669882c48a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/constraints/essential_constraints_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/constraints/essential_constraints_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ba9c09cde54c8d7ff5a12a38159a7c1de0001262a0186201a81bcbd2bade63d6 3bbaa9486249cbfa5978af50408dc25eab1164fe110ebec87ea7f60f2019353a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ExtractsHandComputedBlocksInStableOrder EssentialConstraints.ExtractsHandComputedBlocksInStableOrder; assertion 18개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ExtractsHandComputedBlocksInStableOrder 유지 원문 검사 body 및 assertion 동일. 674065ab604b3a41a09e73738260e57022bc1c90af16f0d1ff822a3fe000a923 674065ab604b3a41a09e73738260e57022bc1c90af16f0d1ff822a3fe000a923 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(blocks.k_ff.RowOffsets(), (std::vector{0U, 4U, 8U, 12U, 16U})) | EXPECT_EQ(blocks.k_ff.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_ff.Values(), (std::vector{1.0, 3.0, 4.0, 6.0, 21.0, 23.0, 24.0, 26.0, 31.0, 33.0, 34.0, 36.0, 51.0, 53.0, 54.0, 56.0})) | EXPECT_EQ(blocks.k_fc.RowOffsets(), (std::vector{0U, 2U, 4U, 6U, 8U})) | EXPECT_EQ(blocks.k_fc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U, 0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_fc.Values(), (std::vector{2.0, 5.0, 22.0, 0.0, 32.0, 35.0, 52.0, 55.0})) | EXPECT_EQ(blocks.k_cf.RowOffsets(), (std::vector{0U, 4U, 8U})) | EXPECT_EQ(blocks.k_cf.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_cf.Values(), (std::vector{11.0, 13.0, 14.0, 16.0, 41.0, 43.0, 44.0, 46.0})) | EXPECT_EQ(blocks.k_cc.RowOffsets(), (std::vector{0U, 2U, 4U})) | EXPECT_EQ(blocks.k_cc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_cc.Values(), (std::vector{12.0, 15.0, 42.0, 45.0})) | EXPECT_EQ(blocks.k_fc.Values()[3U], 0.0) | EXPECT_TRUE(blocks.k_ff.Validate().IsOk()) | EXPECT_TRUE(blocks.k_fc.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cf.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cc.Validate().IsOk()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(blocks.k_ff.RowOffsets(), (std::vector{0U, 4U, 8U, 12U, 16U})) | EXPECT_EQ(blocks.k_ff.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_ff.Values(), (std::vector{1.0, 3.0, 4.0, 6.0, 21.0, 23.0, 24.0, 26.0, 31.0, 33.0, 34.0, 36.0, 51.0, 53.0, 54.0, 56.0})) | EXPECT_EQ(blocks.k_fc.RowOffsets(), (std::vector{0U, 2U, 4U, 6U, 8U})) | EXPECT_EQ(blocks.k_fc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U, 0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_fc.Values(), (std::vector{2.0, 5.0, 22.0, 0.0, 32.0, 35.0, 52.0, 55.0})) | EXPECT_EQ(blocks.k_cf.RowOffsets(), (std::vector{0U, 4U, 8U})) | EXPECT_EQ(blocks.k_cf.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_cf.Values(), (std::vector{11.0, 13.0, 14.0, 16.0, 41.0, 43.0, 44.0, 46.0})) | EXPECT_EQ(blocks.k_cc.RowOffsets(), (std::vector{0U, 2U, 4U})) | EXPECT_EQ(blocks.k_cc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_cc.Values(), (std::vector{12.0, 15.0, 42.0, 45.0})) | EXPECT_EQ(blocks.k_fc.Values()[3U], 0.0) | EXPECT_TRUE(blocks.k_ff.Validate().IsOk()) | EXPECT_TRUE(blocks.k_fc.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cf.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cc.Validate().IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.HandlesNoAllAndMixedConstraints EssentialConstraints.HandlesNoAllAndMixedConstraints; assertion 5개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.HandlesNoAllAndMixedConstraints 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4cf6053dbce4a0b8d79b1da2940de913fac25bdc4c6032dbdb6ba5be584c5efb 66201f4cf9837297e77488d6cb0babc1c5dd36934af64abe3b39cf85b4865cfd ASSERT_TRUE(none.HasValue()) | EXPECT_EQ(none.Value().k_ff.Values(), full.Values()) | ASSERT_TRUE(all.HasValue()) | EXPECT_EQ(all.Value().k_cc.Values(), full.Values()) | ASSERT_TRUE(mixed.HasValue()) ASSERT_TRUE(none.HasValue()) | EXPECT_EQ(none.Value().k_ff.Values(), full.Values()) | ASSERT_TRUE(all.HasValue()) | EXPECT_EQ(all.Value().k_cc.Values(), full.Values()) | ASSERT_TRUE(empty_rhs.HasValue()) | EXPECT_EQ(empty_rhs.Value().Size(), 0U) | ASSERT_TRUE(full_rhs.HasValue()) | EXPECT_EQ(full_rhs.Value()[i], static_cast(i) - 2.0) | EXPECT_EQ(full_load[i], static_cast(i) - 2.0) | ASSERT_TRUE(mixed.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips; assertion 7개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips 유지 원문 검사 body 및 assertion 동일. c943e0be6dafdad411e9dc5b075259ff93ba3d6edad1aac44186128b70255f2f c943e0be6dafdad411e9dc5b075259ff93ba3d6edad1aac44186128b70255f2f ASSERT_TRUE(none.HasValue()) | ASSERT_TRUE(mixed.HasValue()) | ASSERT_EQ(mixed_reconstructed.Size(), mixed_full.Size()) | EXPECT_DOUBLE_EQ(mixed_reconstructed[index], mixed_full[index]) | ASSERT_TRUE(all.HasValue()) | ASSERT_EQ(all_reconstructed.Size(), 24U) | EXPECT_DOUBLE_EQ(all_reconstructed[node * 6U + component], node + 1.0) ASSERT_TRUE(none.HasValue()) | ASSERT_TRUE(mixed.HasValue()) | ASSERT_EQ(mixed_reconstructed.Size(), mixed_full.Size()) | EXPECT_DOUBLE_EQ(mixed_reconstructed[index], mixed_full[index]) | ASSERT_TRUE(all.HasValue()) | ASSERT_EQ(all_reconstructed.Size(), 24U) | EXPECT_DOUBLE_EQ(all_reconstructed[node * 6U + component], node + 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ReconstructsNonzeroPrescribedValues EssentialConstraints.ReconstructsNonzeroPrescribedValues; assertion 12개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ReconstructsNonzeroPrescribedValues 유지 원문 검사 body 및 assertion 동일. 38aa54591420c254c738c4a4c26e333f8bfdf17f2f7e937f55b241729d5668fb 38aa54591420c254c738c4a4c26e333f8bfdf17f2f7e937f55b241729d5668fb EXPECT_EQ(free.Size(), 4U) | EXPECT_DOUBLE_EQ(free[0U], 10.0) | EXPECT_DOUBLE_EQ(free[1U], 20.0) | EXPECT_DOUBLE_EQ(free[2U], 30.0) | EXPECT_DOUBLE_EQ(free[3U], 40.0) | EXPECT_EQ(constrained.Size(), 2U) | EXPECT_DOUBLE_EQ(constrained[0U], 2.5) | EXPECT_DOUBLE_EQ(constrained[1U], -3.25) | EXPECT_EQ(constrained[0U], dofs.PrescribedValues()[0U]) | EXPECT_EQ(constrained[1U], dofs.PrescribedValues()[1U]) | ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) EXPECT_EQ(free.Size(), 4U) | EXPECT_DOUBLE_EQ(free[0U], 10.0) | EXPECT_DOUBLE_EQ(free[1U], 20.0) | EXPECT_DOUBLE_EQ(free[2U], 30.0) | EXPECT_DOUBLE_EQ(free[3U], 40.0) | EXPECT_EQ(constrained.Size(), 2U) | EXPECT_DOUBLE_EQ(constrained[0U], 2.5) | EXPECT_DOUBLE_EQ(constrained[1U], -3.25) | EXPECT_EQ(constrained[0U], dofs.PrescribedValues()[0U]) | EXPECT_EQ(constrained[1U], dofs.PrescribedValues()[1U]) | ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.RejectsDimensionOrOrderMismatch EssentialConstraints.RejectsDimensionOrOrderMismatch; assertion 9개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.RejectsDimensionOrOrderMismatch 유지 원문 검사 body 및 assertion 동일. fc0cc64c86498e9c8468b6ad373ac9e32ec0bca9361615ae3f974df070dab2cf fc0cc64c86498e9c8468b6ad373ac9e32ec0bca9361615ae3f974df070dab2cf "ASSERT_FALSE(wrong_dimension.HasValue()) | EXPECT_EQ(wrong_dimension.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(wrong_dimension.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(wrong_dimension.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | ASSERT_FALSE(wrong_order.HasValue()) | EXPECT_EQ(wrong_order.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | EXPECT_THROW(static_cast(policy.GatherFree(fesa::Vector{5U}, dofs)), std::invalid_argument) | EXPECT_THROW( static_cast(policy.GatherConstrained(fesa::Vector{7U}, dofs)), std::invalid_argument) | EXPECT_THROW(static_cast(policy.ReconstructFull( fesa::Vector{4U}, fesa::Vector{2U}, dofs)), std::invalid_argument)" "ASSERT_FALSE(wrong_dimension.HasValue()) | EXPECT_EQ(wrong_dimension.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(wrong_dimension.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(wrong_dimension.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | ASSERT_FALSE(wrong_order.HasValue()) | EXPECT_EQ(wrong_order.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | EXPECT_THROW(static_cast(policy.GatherFree(fesa::Vector{5U}, dofs)), std::invalid_argument) | EXPECT_THROW( static_cast(policy.GatherConstrained(fesa::Vector{7U}, dofs)), std::invalid_argument) | EXPECT_THROW(static_cast(policy.ReconstructFull( fesa::Vector{4U}, fesa::Vector{2U}, dofs)), std::invalid_argument)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/constraints/essential_constraints_test.cpp support@1-119 helper/oracle/fixture/include/static assertion 구간: MakeDofs, MakeShellSizedDofs, MakeMatrix, SequentialDense, ExpectShape tests/unit/constraints/essential_constraints_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c602591b393576ff60645484d498b40d49ed261333bf24372248afc863e80d03 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/constraints/essential_constraints_test.cpp support@196-197 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/constraints/essential_constraints_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f6c2b9c304b34fa866abe406a7be1ab65a57b15b93aee4428636ed4eaa067081 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/ascii_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/core/ascii_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b26eaed43661b405fda69e4a287f40ce7f0d5efd2f7ff7aa0459cf32dd802ae4 25872dbd7f04fbdb796adecf712db87424f628615095e50d25e86d7ff05d70f1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/ascii_test.cpp Ascii.LowercasesOnlyAsciiUppercaseBytes Ascii.LowercasesOnlyAsciiUppercaseBytes; assertion 5개 tests/unit/core/ascii_test.cpp Ascii.LowercasesOnlyAsciiUppercaseBytes 유지 원문 검사 body 및 assertion 동일. 909d024cf51f4c78bfbfbc0f844a4deb4d7995a1359e245bab03859c6a3f9dde 909d024cf51f4c78bfbfbc0f844a4deb4d7995a1359e245bab03859c6a3f9dde EXPECT_EQ(fesa::AsciiLower('A'), 'a') | EXPECT_EQ(fesa::AsciiLower('Z'), 'z') | EXPECT_EQ(fesa::AsciiLower('a'), 'a') | EXPECT_EQ(fesa::AsciiLower('0'), '0') | EXPECT_EQ(fesa::AsciiLower(non_ascii), non_ascii) EXPECT_EQ(fesa::AsciiLower('A'), 'a') | EXPECT_EQ(fesa::AsciiLower('Z'), 'z') | EXPECT_EQ(fesa::AsciiLower('a'), 'a') | EXPECT_EQ(fesa::AsciiLower('0'), '0') | EXPECT_EQ(fesa::AsciiLower(non_ascii), non_ascii) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/core/ascii_test.cpp Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding; assertion 3개 tests/unit/core/ascii_test.cpp Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding 유지 원문 검사 body 및 assertion 동일. 3db876d5e00670ef938aa3f78a4b4841b4aa9eb02bf470d659053719c7a47c27 3db876d5e00670ef938aa3f78a4b4841b4aa9eb02bf470d659053719c7a47c27 "EXPECT_TRUE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""bEaM-1"")) | EXPECT_FALSE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""Beam-10"")) | EXPECT_FALSE( fesa::AsciiCaseInsensitiveEquals(uppercase_byte, lowercase_byte))" "EXPECT_TRUE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""bEaM-1"")) | EXPECT_FALSE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""Beam-10"")) | EXPECT_FALSE( fesa::AsciiCaseInsensitiveEquals(uppercase_byte, lowercase_byte))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/core/ascii_test.cpp Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels; assertion 11개 tests/unit/core/ascii_test.cpp Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels 유지 원문 검사 body 및 assertion 동일. 5770a5761723357706fadea333c7cf6c288511a29681077cb3f914cb4a236bf4 5770a5761723357706fadea333c7cf6c288511a29681077cb3f914cb4a236bf4 "ASSERT_TRUE(one.HasValue()) | EXPECT_EQ(one.Value(), 1) | ASSERT_TRUE(leading_zeroes.HasValue()) | EXPECT_EQ(leading_zeroes.Value(), 42) | ASSERT_TRUE(maximum.HasValue()) | EXPECT_EQ(maximum.Value(), (std::numeric_limits::max)()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-source-label"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].entity_identity, invalid)" "ASSERT_TRUE(one.HasValue()) | EXPECT_EQ(one.Value(), 1) | ASSERT_TRUE(leading_zeroes.HasValue()) | EXPECT_EQ(leading_zeroes.Value(), 42) | ASSERT_TRUE(maximum.HasValue()) | EXPECT_EQ(maximum.Value(), (std::numeric_limits::max)()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-source-label"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].entity_identity, invalid)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/core/ascii_test.cpp support@1-9 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/core/ascii_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 92beb48f1d8771676e841d9c0e884cace86bb18b98dbe9a629f21fa1d9e0bc9e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/diagnostic_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/core/diagnostic_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 440becb7f8e8ffe6db9b32b757b08a56baea19da46808dc42c426e0f9edb14e5 440becb7f8e8ffe6db9b32b757b08a56baea19da46808dc42c426e0f9edb14e5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/diagnostic_test.cpp CoreDiagnostics.DiagnosticsSortDeterministically CoreDiagnostics.DiagnosticsSortDeterministically; assertion 15개 tests/unit/core/diagnostic_test.cpp CoreDiagnostics.DiagnosticsSortDeterministically 유지 원문 검사 body 및 assertion 동일. 2f659a7cf12be1a5e3e0221806e86f389fb3992907f5bcb4d533d160bbeb90ab 2f659a7cf12be1a5e3e0221806e86f389fb3992907f5bcb4d533d160bbeb90ab "ASSERT_EQ(diagnostics.size(), 7U) | EXPECT_EQ(diagnostics[0].message, ""line"") | EXPECT_EQ(diagnostics[1].message, ""keyword"") | EXPECT_EQ(diagnostics[2].message, ""first-equal"") | EXPECT_EQ(diagnostics[3].message, ""second-equal"") | EXPECT_EQ(diagnostics[4].message, ""code-z"") | EXPECT_EQ(diagnostics[5].message, ""entity-2"") | EXPECT_EQ(diagnostics[6].message, ""file-b"") | EXPECT_EQ(exact.severity, fesa::Severity::kError) | EXPECT_EQ(exact.code, ""a"") | EXPECT_EQ(exact.location.file, std::filesystem::path{""a.inp""}) | EXPECT_EQ(exact.location.line, 3U) | EXPECT_EQ(exact.keyword, ""*NODE"") | EXPECT_EQ(exact.entity_identity, ""I.1"") | EXPECT_EQ(exact.message, ""first-equal"")" "ASSERT_EQ(diagnostics.size(), 7U) | EXPECT_EQ(diagnostics[0].message, ""line"") | EXPECT_EQ(diagnostics[1].message, ""keyword"") | EXPECT_EQ(diagnostics[2].message, ""first-equal"") | EXPECT_EQ(diagnostics[3].message, ""second-equal"") | EXPECT_EQ(diagnostics[4].message, ""code-z"") | EXPECT_EQ(diagnostics[5].message, ""entity-2"") | EXPECT_EQ(diagnostics[6].message, ""file-b"") | EXPECT_EQ(exact.severity, fesa::Severity::kError) | EXPECT_EQ(exact.code, ""a"") | EXPECT_EQ(exact.location.file, std::filesystem::path{""a.inp""}) | EXPECT_EQ(exact.location.line, 3U) | EXPECT_EQ(exact.keyword, ""*NODE"") | EXPECT_EQ(exact.entity_identity, ""I.1"") | EXPECT_EQ(exact.message, ""first-equal"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/core/diagnostic_test.cpp support@1-25 helper/oracle/fixture/include/static assertion 구간: MakeDiagnostic tests/unit/core/diagnostic_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ae3d439e5440487b75c91d95add36374b3f77363663cdc902e830a9174a669e9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/source_identity_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/core/source_identity_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 601d563a839e0ce63c6a47ddbb4cb2dc60386ecb2483519532e969affe387b85 a6ebba2d2f9e09be684e817e41b14b6572bcce0706d5114c8c8a88f6ac145746 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/source_identity_test.cpp CoreDiagnostics.SourceIdentityPreservesRawIdentity CoreDiagnostics.SourceIdentityPreservesRawIdentity; assertion 5개 tests/unit/core/source_identity_test.cpp CoreDiagnostics.SourceIdentityPreservesRawIdentity 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0fe861b09827bc7d70b9062d27ca9696e91dd91c1a8d62f2482b3f761915b0a3 f466209fca1d6d1f9aff769f37534515999cf4a71f1da756c95e007d1a1599c3 "EXPECT_EQ(location.file, std::filesystem::path{""models/My Beam.inp""}) | EXPECT_EQ(location.line, 27U) | EXPECT_EQ(identity.instance_name, ""Beam-Instance_A"") | EXPECT_EQ(identity.source_label, 42) | EXPECT_EQ(identity.source_label_text, ""00042"")" "EXPECT_EQ(location.file, std::filesystem::path{""models/My Beam.inp""}) | EXPECT_EQ(location.line, 27U) | EXPECT_EQ(identity.instance_name, ""Beam-Instance_A"") | EXPECT_EQ(identity.source_label, 42) | EXPECT_EQ(identity.source_label_text, ""00042"") | EXPECT_TRUE(fesa::SourceIdentityEquals(identity, identity)) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""beam-instance_a"", std::int64_t{42}, ""00042""})) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""Beam-Instance_A"", std::int64_t{43}, ""00042""})) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""Beam-Instance_A"", std::int64_t{42}, ""42""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/core/source_identity_test.cpp support@1-8 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/core/source_identity_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d2c1c5608afd74a75014476a740b7734f890ded534eb9532ad90766dcc16b86a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/status_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/core/status_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5c035458f1d67d43c340b41fa3f4581a1b3b1df2859903ddfa12da838ac7ff69 3cae23bb04187b6d104c3575d24a87daee20f5c1779dfcfd762ef299105aea42 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/core/status_test.cpp CoreDiagnostics.ResultEnforcesValueErrorExclusivity CoreDiagnostics.ResultEnforcesValueErrorExclusivity; assertion 21개 tests/unit/core/status_test.cpp CoreDiagnostics.ResultEnforcesValueErrorExclusivity 유지 원문 검사 body 및 assertion 동일. 9e7d9261f2c51e9a1cb0ef57442073618731b3a1867833debe5c3b9d0b064be2 9e7d9261f2c51e9a1cb0ef57442073618731b3a1867833debe5c3b9d0b064be2 "EXPECT_TRUE(ok.IsOk()) | EXPECT_FALSE(ok.Category().has_value()) | EXPECT_TRUE(ok.Diagnostics().empty()) | EXPECT_FALSE(uncategorized.IsOk()) | EXPECT_FALSE(uncategorized.Category().has_value()) | ASSERT_EQ(uncategorized.Diagnostics().size(), 1U) | EXPECT_EQ(uncategorized.Diagnostics()[0].code, ""invalid-beam-length"") | EXPECT_FALSE(categorized.IsOk()) | ASSERT_TRUE(categorized.Category().has_value()) | EXPECT_EQ(*categorized.Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(success.HasValue()) | EXPECT_TRUE(success.GetStatus().IsOk()) | EXPECT_EQ(success.Value(), ""solved"") | EXPECT_EQ(copied.Value(), ""solved"") | EXPECT_EQ(moved.Value(), ""solved"") | EXPECT_FALSE(failure.HasValue()) | EXPECT_FALSE(failure.GetStatus().IsOk()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_THROW(failure.Value(), std::logic_error) | EXPECT_THROW(const_failure.Value(), std::logic_error) | EXPECT_THROW((void)fesa::Result::Failure(fesa::Status::Ok()), std::invalid_argument)" "EXPECT_TRUE(ok.IsOk()) | EXPECT_FALSE(ok.Category().has_value()) | EXPECT_TRUE(ok.Diagnostics().empty()) | EXPECT_FALSE(uncategorized.IsOk()) | EXPECT_FALSE(uncategorized.Category().has_value()) | ASSERT_EQ(uncategorized.Diagnostics().size(), 1U) | EXPECT_EQ(uncategorized.Diagnostics()[0].code, ""invalid-beam-length"") | EXPECT_FALSE(categorized.IsOk()) | ASSERT_TRUE(categorized.Category().has_value()) | EXPECT_EQ(*categorized.Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(success.HasValue()) | EXPECT_TRUE(success.GetStatus().IsOk()) | EXPECT_EQ(success.Value(), ""solved"") | EXPECT_EQ(copied.Value(), ""solved"") | EXPECT_EQ(moved.Value(), ""solved"") | EXPECT_FALSE(failure.HasValue()) | EXPECT_FALSE(failure.GetStatus().IsOk()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_THROW(failure.Value(), std::logic_error) | EXPECT_THROW(const_failure.Value(), std::logic_error) | EXPECT_THROW((void)fesa::Result::Failure(fesa::Status::Ok()), std::invalid_argument)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/core/status_test.cpp support@1-23 helper/oracle/fixture/include/static assertion 구간: ModelDiagnostic tests/unit/core/status_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f1984a10d2ad68533d1189e8e10140c63e153857bb4df27e6279f8ad7345c9ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/element_factory_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/elements/element_factory_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 26a556dd970ee14c9fefbdcdfabb78eae52ccf0edbeda4940c2657488459d3f0 39cdff0a92b9a86f0efe54457c47f57bb8fa0a48887eae940198046c8f5249f0 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery; assertion 21개 tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery 유지 원문 검사 body 및 assertion 동일. 6ea821d717c92f195c2f3d8cac87a3f58f9db2377459cd40674d113374366e34 6ea821d717c92f195c2f3d8cac87a3f58f9db2377459cd40674d113374366e34 "EXPECT_NE(probe, nullptr) | EXPECT_TRUE(destroyed) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(layout.source_id.source_label_text, ""7"") | EXPECT_EQ(layout.node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(layout.components_per_node, (std::vector{ fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz, fesa::DofComponent::kUrx, fesa::DofComponent::kUry, fesa::DofComponent::kUrz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().layout.node_indices, layout.node_indices) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_id.source_label_text, ""7"") | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.endpoint_rows.size(), 2U) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].end_action[0U], -10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[1U].end_action[0U], 10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].section_resultant[0U], 10.0) | EXPECT_EQ(rows.endpoint_rows[0U].node.source_label_text, ""1"") | EXPECT_EQ(rows.endpoint_rows[1U].node.source_label_text, ""2"") | EXPECT_EQ(rows.gauss_rows.size(), 2U) | EXPECT_EQ(rows.stress_rows.size(), 2U)" "EXPECT_NE(probe, nullptr) | EXPECT_TRUE(destroyed) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(layout.source_id.source_label_text, ""7"") | EXPECT_EQ(layout.node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(layout.components_per_node, (std::vector{ fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz, fesa::DofComponent::kUrx, fesa::DofComponent::kUry, fesa::DofComponent::kUrz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().layout.node_indices, layout.node_indices) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_id.source_label_text, ""7"") | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.endpoint_rows.size(), 2U) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].end_action[0U], -10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[1U].end_action[0U], 10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].section_resultant[0U], 10.0) | EXPECT_EQ(rows.endpoint_rows[0U].node.source_label_text, ""1"") | EXPECT_EQ(rows.endpoint_rows[1U].node.source_label_text, ""2"") | EXPECT_EQ(rows.gauss_rows.size(), 2U) | EXPECT_EQ(rows.stress_rows.size(), 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery; assertion 15개 tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery 유지 원문 검사 body 및 assertion 동일. 998ad7873f34e6ae9b95cc403602d8c995903164d6857c4952be354731aa6645 998ad7873f34e6ae9b95cc403602d8c995903164d6857c4952be354731aa6645 ASSERT_EQ(domain.Elements().Size(), 2U) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(element->DofLayout().node_indices, (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(element->DofLayout().components_per_node.size(), 6U) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(direct_stiffness.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.rows.size(), 4U) | EXPECT_DOUBLE_EQ(rows.physical_strain_energy, 0.0) | EXPECT_EQ(rows.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(rows.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(row.element, fesa::EntityIndex{1U}) ASSERT_EQ(domain.Elements().Size(), 2U) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(element->DofLayout().node_indices, (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(element->DofLayout().components_per_node.size(), 6U) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(direct_stiffness.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.rows.size(), 4U) | EXPECT_DOUBLE_EQ(rows.physical_strain_energy, 0.0) | EXPECT_EQ(rows.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(rows.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(row.element, fesa::EntityIndex{1U}) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/element_factory_test.cpp ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder; assertion 7개 tests/unit/elements/element_factory_test.cpp ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder 유지 원문 검사 body 및 assertion 동일. 11cc51a03beb75fe145b0865b12fb782a7bea43f352e46f4c198462f397e1196 11cc51a03beb75fe145b0865b12fb782a7bea43f352e46f4c198462f397e1196 "ASSERT_TRUE(beam.HasValue()) | ASSERT_TRUE(shell.HasValue()) | ASSERT_EQ(view.size(), 2U) | EXPECT_EQ(&view[0U].get(), owner[0U].get()) | EXPECT_EQ(&view[1U].get(), owner[1U].get()) | EXPECT_EQ(view[0U].get().DofLayout().source_id.source_label_text, ""7"") | EXPECT_EQ(view[1U].get().DofLayout().source_id.source_label_text, ""9"")" "ASSERT_TRUE(beam.HasValue()) | ASSERT_TRUE(shell.HasValue()) | ASSERT_EQ(view.size(), 2U) | EXPECT_EQ(&view[0U].get(), owner[0U].get()) | EXPECT_EQ(&view[1U].get(), owner[1U].get()) | EXPECT_EQ(view[0U].get().DofLayout().source_id.source_label_text, ""7"") | EXPECT_EQ(view[1U].get().DofLayout().source_id.source_label_text, ""9"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/element_factory_test.cpp ElementFactory.RejectsUnknownAndIncompatibleDefinitions ElementFactory.RejectsUnknownAndIncompatibleDefinitions; assertion 1개 tests/unit/elements/element_factory_test.cpp ElementFactory.RejectsUnknownAndIncompatibleDefinitions 유지 원문 검사 body 및 assertion 동일. 0e0b2765c7cebcbf59f6649a659226c9e963c37cf207db198ee2dd0a7a23f2c8 0e0b2765c7cebcbf59f6649a659226c9e963c37cf207db198ee2dd0a7a23f2c8 "EXPECT_EQ(missing_frame_result.GetStatus().Diagnostics()[0U].code, ""missing-shell-frame"")" "EXPECT_EQ(missing_frame_result.GetStatus().Diagnostics()[0U].code, ""missing-shell-frame"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingPreservesThreeComponentsAndReferenceMass ElementFactory.SolidBindingPreservesThreeComponentsAndReferenceMass; assertion 15개 tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingPreservesThreeComponentsAndReferenceMass 유지 원문 검사 body 및 assertion 동일. e0459ed0666964dd9f2f6f40d000d99842fe6e79acb14fe683fed56000f054f2 e0459ed0666964dd9f2f6f40d000d99842fe6e79acb14fe683fed56000f054f2 ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_EQ(solid->DofLayout().source_id.source_label, 99) | EXPECT_EQ(solid->DofLayout().components_per_node, (std::vector{fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().values.Rows(), 24U) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(mass.Value().values.Rows(), 24U) | ASSERT_EQ(mass.Value().values.Columns(), 24U) | EXPECT_NEAR(total_mass, 2.0, 1.0e-13) | EXPECT_NEAR(mass.Value().values(row, column), 0.25, 1.0e-15) | EXPECT_DOUBLE_EQ(mass.Value().values(row, column), 0.0) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().points[point].element, 0U) | EXPECT_EQ(response.Value().points[point].integration_point, point + 1U) ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_EQ(solid->DofLayout().source_id.source_label, 99) | EXPECT_EQ(solid->DofLayout().components_per_node, (std::vector{fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().values.Rows(), 24U) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(mass.Value().values.Rows(), 24U) | ASSERT_EQ(mass.Value().values.Columns(), 24U) | EXPECT_NEAR(total_mass, 2.0, 1.0e-13) | EXPECT_NEAR(mass.Value().values(row, column), 0.25, 1.0e-15) | EXPECT_DOUBLE_EQ(mass.Value().values(row, column), 0.0) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().points[point].element, 0U) | EXPECT_EQ(response.Value().points[point].integration_point, point + 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/element_factory_test.cpp ElementFactory.SolidStaticBindingKeepsAbsentDensityAndRejectsForeignOwner ElementFactory.SolidStaticBindingKeepsAbsentDensityAndRejectsForeignOwner; assertion 6개 tests/unit/elements/element_factory_test.cpp ElementFactory.SolidStaticBindingKeepsAbsentDensityAndRejectsForeignOwner 유지 원문 검사 body 및 assertion 동일. 67e0aa39b78dbefe0e852900de54f14318d5ae806e09ab40348a8798d246bd3f 67e0aa39b78dbefe0e852900de54f14318d5ae806e09ab40348a8798d246bd3f "ASSERT_TRUE(candidate.HasValue()) | EXPECT_TRUE(candidate.Value()->ComputeStiffness().HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_FALSE(solid->ComputeMass().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""invalid-element-definition"")" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_TRUE(candidate.Value()->ComputeStiffness().HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_FALSE(solid->ComputeMass().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""invalid-element-definition"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingRejectsReferenceInversionWithSourceContext ElementFactory.SolidBindingRejectsReferenceInversionWithSourceContext; assertion 3개 tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingRejectsReferenceInversionWithSourceContext 유지 원문 검사 body 및 assertion 동일. ae4abe144881d88e3568e44f6d0bd4559ad3f9fdb401f326a722bbce37b492e7 ae4abe144881d88e3568e44f6d0bd4559ad3f9fdb401f326a722bbce37b492e7 "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""Solid-1:99"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].location.line, 12U)" "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""Solid-1:99"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].location.line, 12U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/element_factory_test.cpp support@1-203 helper/oracle/fixture/include/static assertion 구간: ShellDefinition, MakeDomain, if, SolidDefinition, ExpectSameMatrix, ExpectModelFailure, UnknownElementDefinition, DestructionProbeElement tests/unit/elements/element_factory_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5df55285ae0fae1c4f738f882bddf024296bcd204b785093108491fe34daed7d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/euler_beam_3d_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/elements/euler_beam_3d_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 36b1305028805eacc62bf2e85b8abdf3512eb322f1a41429062b810365d79c0f 36b1305028805eacc62bf2e85b8abdf3512eb322f1a41429062b810365d79c0f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns; assertion 8개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns 유지 원문 검사 body 및 assertion 동일. 72cf906f5dc17ad6e999e6805a6067f89c06a80fc3bb6982948a7ea36cfee95d 72cf906f5dc17ad6e999e6805a6067f89c06a80fc3bb6982948a7ea36cfee95d EXPECT_NEAR(recovery.gauss_generalized_strains[point][0U], axial_strain, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][1U], twist, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][2U], -curvature(w, x), 1.0e-13) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][3U], curvature(v, x), 1.0e-13) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][2U], material.youngs_modulus * section.i11 * -curvature(w, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][2U], material.youngs_modulus * section.i11 * -curvature(w, length), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][3U], material.youngs_modulus * section.i22 * curvature(v, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][3U], material.youngs_modulus * section.i22 * curvature(v, length), 1.0e-5) EXPECT_NEAR(recovery.gauss_generalized_strains[point][0U], axial_strain, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][1U], twist, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][2U], -curvature(w, x), 1.0e-13) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][3U], curvature(v, x), 1.0e-13) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][2U], material.youngs_modulus * section.i11 * -curvature(w, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][2U], material.youngs_modulus * section.i11 * -curvature(w, length), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][3U], material.youngs_modulus * section.i22 * curvature(v, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][3U], material.youngs_modulus * section.i22 * curvature(v, length), 1.0e-5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.TwoPointGaussMatchesClosedStiffness EulerBeam3D.TwoPointGaussMatchesClosedStiffness; assertion 2개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.TwoPointGaussMatchesClosedStiffness 유지 원문 검사 body 및 assertion 동일. 5051a070e070c7eae4c852c1ea6f81abc26e94829ee91053d119f37018340643 5051a070e070c7eae4c852c1ea6f81abc26e94829ee91053d119f37018340643 EXPECT_LE(NormalizedMatrixError(actual, closed), kMatrixTolerance) | EXPECT_LE(NormalizedMatrixError(actual, transpose), kMatrixTolerance) EXPECT_LE(NormalizedMatrixError(actual, closed), kMatrixTolerance) | EXPECT_LE(NormalizedMatrixError(actual, transpose), kMatrixTolerance) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy; assertion 4개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy 유지 원문 검사 body 및 assertion 동일. 516ae9c2a58b6b19177233b4b31579a5096c950576c35ec6af2ad868dc41b63b 516ae9c2a58b6b19177233b4b31579a5096c950576c35ec6af2ad868dc41b63b EXPECT_LE(normalizedResidual, kRigidTolerance) | EXPECT_EQ(positive_count, 6) | EXPECT_GE(value, -kRigidTolerance * maximum_singular_value) | EXPECT_GT(QuadraticEnergy(stiffness, deformation), 0.0) EXPECT_LE(normalizedResidual, kRigidTolerance) | EXPECT_EQ(positive_count, 6) | EXPECT_GE(value, -kRigidTolerance * maximum_singular_value) | EXPECT_GT(QuadraticEnergy(stiffness, deformation), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RotatedTransformPreservesWorkAndEnergy EulerBeam3D.RotatedTransformPreservesWorkAndEnergy; assertion 4개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RotatedTransformPreservesWorkAndEnergy 유지 원문 검사 body 및 assertion 동일. bcead48fa3010457278ea1a7c367260ca6fb9d4e01d8f58374fcfeafbd0c653d bcead48fa3010457278ea1a7c367260ca6fb9d4e01d8f58374fcfeafbd0c653d EXPECT_NEAR(dot, row == column ? 1.0 : 0.0, 1.0e-14) | EXPECT_NEAR(Determinant(rotation), 1.0, 1.0e-14) | EXPECT_LE(NormalizedMatrixError(global, expected_global), kMatrixTolerance) | EXPECT_NEAR(recovery.gauss_generalized_strains[0U][0U], (local_displacement[6U] - local_displacement[0U]) / 3.0, 1.0e-14) EXPECT_NEAR(dot, row == column ? 1.0 : 0.0, 1.0e-14) | EXPECT_NEAR(Determinant(rotation), 1.0, 1.0e-14) | EXPECT_LE(NormalizedMatrixError(global, expected_global), kMatrixTolerance) | EXPECT_NEAR(recovery.gauss_generalized_strains[0U][0U], (local_displacement[6U] - local_displacement[0U]) / 3.0, 1.0e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration; assertion 11개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration 유지 원문 검사 body 및 assertion 동일. cf0127ac571a9fbf42f03f5ca9df5cb1211781ca31220dd266c7494bd465005b cf0127ac571a9fbf42f03f5ca9df5cb1211781ca31220dd266c7494bd465005b EXPECT_DOUBLE_EQ(delta.Norm(), 3.0) | EXPECT_DOUBLE_EQ(global(0U, 0U), 0x1.65f135da12f68p+28) | EXPECT_DOUBLE_EQ(global(0U, 1U), 0x1.6261c084bda12p+28) | EXPECT_DOUBLE_EQ(global(0U, 2U), 0x1.630ca684bda13p+27) | EXPECT_DOUBLE_EQ(global(4U, 4U), 0x1.068e359b59b58p+22) | EXPECT_DOUBLE_EQ(global(5U, 11U), 0x1.2d14a7ee7ee7bp+22) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][0U], 0x1.1111111111110p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][1U], 0x1.1111111111111p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][2U], -0x1.382425a7d2473p-6) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][3U], -0x1.a9389137b051dp-6) | EXPECT_DOUBLE_EQ(recovery.endpoint_section_resultants[1U][2U], 0x1.525c94a87359fp+17) EXPECT_DOUBLE_EQ(delta.Norm(), 3.0) | EXPECT_DOUBLE_EQ(global(0U, 0U), 0x1.65f135da12f68p+28) | EXPECT_DOUBLE_EQ(global(0U, 1U), 0x1.6261c084bda12p+28) | EXPECT_DOUBLE_EQ(global(0U, 2U), 0x1.630ca684bda13p+27) | EXPECT_DOUBLE_EQ(global(4U, 4U), 0x1.068e359b59b58p+22) | EXPECT_DOUBLE_EQ(global(5U, 11U), 0x1.2d14a7ee7ee7bp+22) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][0U], 0x1.1111111111110p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][1U], 0x1.1111111111111p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][2U], -0x1.382425a7d2473p-6) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][3U], -0x1.a9389137b051dp-6) | EXPECT_DOUBLE_EQ(recovery.endpoint_section_resultants[1U][2U], 0x1.525c94a87359fp+17) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents; assertion 5개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents 유지 원문 검사 body 및 assertion 동일. 6d608896998acfb9e31d28e2a9700cc5bfa9f3f273b5de08f201f18d6358f4f5 6d608896998acfb9e31d28e2a9700cc5bfa9f3f273b5de08f201f18d6358f4f5 ASSERT_EQ(equivalent.Size(), expected.size()) | EXPECT_GT(relative_errors[0U], relative_errors[1U]) | EXPECT_GT(relative_errors[1U], relative_errors[2U]) | EXPECT_NEAR( std::log(relative_errors[0U] / relative_errors[1U]) / std::log(2.0), 4.0, 1.0e-8) | EXPECT_NEAR( std::log(relative_errors[1U] / relative_errors[2U]) / std::log(2.0), 4.0, 1.0e-8) ASSERT_EQ(equivalent.Size(), expected.size()) | EXPECT_GT(relative_errors[0U], relative_errors[1U]) | EXPECT_GT(relative_errors[1U], relative_errors[2U]) | EXPECT_NEAR( std::log(relative_errors[0U] / relative_errors[1U]) / std::log(2.0), 4.0, 1.0e-8) | EXPECT_NEAR( std::log(relative_errors[1U] / relative_errors[2U]) / std::log(2.0), 4.0, 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover; assertion 2개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover 유지 원문 검사 body 및 assertion 동일. ec321db32dec17dd4598bb2af11029172b73838ff38e434a120520c4c8a66136 ec321db32dec17dd4598bb2af11029172b73838ff38e434a120520c4c8a66136 EXPECT_NEAR(local_yrecovery.endpoint_section_resultants[1U][3U], 0.0, 1.0e-8) | EXPECT_NEAR(local_zrecovery.endpoint_section_resultants[1U][2U], 0.0, 1.0e-8) EXPECT_NEAR(local_yrecovery.endpoint_section_resultants[1U][3U], 0.0, 1.0e-8) | EXPECT_NEAR(local_zrecovery.endpoint_section_resultants[1U][2U], 0.0, 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RejectsInvalidGeometryAndProperties EulerBeam3D.RejectsInvalidGeometryAndProperties; assertion 5개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RejectsInvalidGeometryAndProperties 유지 원문 검사 body 및 assertion 동일. 84aca3252ee968479adb3ff42de486fae5c3eb0ecfc270ead2f5b7272471a512 84aca3252ee968479adb3ff42de486fae5c3eb0ecfc270ead2f5b7272471a512 EXPECT_EQ(result.GetStatus().Category(), FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, code) | EXPECT_TRUE(EulerBeam3D::Create(scaled_first, above_threshold, valid_section, valid_material) .HasValue()) | EXPECT_TRUE( EulerBeam3D::Create(origin, unit_x, guide_above_threshold, valid_material) .HasValue()) EXPECT_EQ(result.GetStatus().Category(), FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, code) | EXPECT_TRUE(EulerBeam3D::Create(scaled_first, above_threshold, valid_section, valid_material) .HasValue()) | EXPECT_TRUE( EulerBeam3D::Create(origin, unit_x, guide_above_threshold, valid_material) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11 EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11; assertion 11개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11 유지 원문 검사 body 및 assertion 동일. 22288ebdd3e81a891dc0f67b7ce14995403506506faa4cc045838d070fdd22d2 22288ebdd3e81a891dc0f67b7ce14995403506506faa4cc045838d070fdd22d2 "ASSERT_EQ(recovery.stress_points.size(), 4U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, point + 1U) | EXPECT_DOUBLE_EQ(stress.x1, x1) | EXPECT_DOUBLE_EQ(stress.x2, x2) | ASSERT_EQ(default_recovery.stress_points.size(), 2U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, 0U) | EXPECT_DOUBLE_EQ(stress.x1, 0.0) | EXPECT_DOUBLE_EQ(stress.x2, 0.0) | EXPECT_EQ(stress.source, ""fesa-default"")" "ASSERT_EQ(recovery.stress_points.size(), 4U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, point + 1U) | EXPECT_DOUBLE_EQ(stress.x1, x1) | EXPECT_DOUBLE_EQ(stress.x2, x2) | ASSERT_EQ(default_recovery.stress_points.size(), 2U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, 0U) | EXPECT_DOUBLE_EQ(stress.x1, 0.0) | EXPECT_DOUBLE_EQ(stress.x2, 0.0) | EXPECT_EQ(stress.source, ""fesa-default"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches; assertion 4개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches 유지 원문 검사 body 및 assertion 동일. 4fa6d99d84b69f21604df5fa097dd5c21494f16445f261d75d87e8ebfbccd76e 4fa6d99d84b69f21604df5fa097dd5c21494f16445f261d75d87e8ebfbccd76e EXPECT_NEAR(recovery.equilibrium_end_actions[0U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[0U][2U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][2U], 0.0, 1.0e-8) EXPECT_NEAR(recovery.equilibrium_end_actions[0U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[0U][2U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][2U], 0.0, 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.OnePointNegativeControlHasRankFour EulerBeam3D.OnePointNegativeControlHasRankFour; assertion 2개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.OnePointNegativeControlHasRankFour 유지 원문 검사 body 및 assertion 동일. 09b807bbb8c23f7aca5a27cdb8df60f75e866fec3d12dfce52a2c9271fec75da 09b807bbb8c23f7aca5a27cdb8df60f75e866fec3d12dfce52a2c9271fec75da EXPECT_EQ(SymmetricRank(one_point, kRigidTolerance), 4U) | EXPECT_EQ(SymmetricRank(production, kRigidTolerance), 6U) EXPECT_EQ(SymmetricRank(one_point, kRigidTolerance), 4U) | EXPECT_EQ(SymmetricRank(production, kRigidTolerance), 6U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/euler_beam_3d_test.cpp support@1-500 helper/oracle/fixture/include/static assertion 구간: fesa, MakeNode, MakeMaterial, RequireBeam, if, AlignedBeam, MaximumAbsoluteEntry, MatrixIsFinite, NormalizedMatrixError, VectorNorm, QuadraticEnergy, ExpectScaledNear, ExpectRelativeNear, ExpectedClosedStiffness, SymmetricEigenvalues, SymmetricRank, for, count_if, TestOnlyOnePointStiffness, SolveFixedFirstNode, SolveDenseSystem, SolveUniformTransverseCantilever, UniformLoadInteriorDisplacementError, TransformationFromKnownRows, TransposeMultiply, Determinant tests/unit/elements/euler_beam_3d_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8fe565c3a19d57cd6870d3739c431b99fc41c549a91faa396fd25baea0ebb604 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/euler_beam_3d_test.cpp support@1137-1139 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/elements/euler_beam_3d_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/finite_rotation_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/elements/finite_rotation_test.cpp file 이관 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. 6404d4c360ec2cc2779d394442b7ed9dd520ad9a2742394650f50a699619c5af 60399a9c2b20a3752b3f57a1b74807dbb4db0800c7aa8c5ce375375a1f93340f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/finite_rotation_test.cpp FiniteRotation.ZeroCoordinatePreservesInitialFrameAndDirector FiniteRotation.ZeroCoordinatePreservesInitialFrameAndDirector; assertion 2개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.ZeroCoordinatePreservesInitialFrameAndDirector 유지 원문 검사 body 및 assertion 동일. aad5b1d13028179488b58dd96eca0f52247abdd44548c24f6b2a5c67b6a12aa5 aad5b1d13028179488b58dd96eca0f52247abdd44548c24f6b2a5c67b6a12aa5 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().phi, Vector3{}) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().phi, Vector3{}) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/finite_rotation_test.cpp FiniteRotation.FiniteCoordinateBuildsProperTriadAndDirector FiniteRotation.FiniteCoordinateBuildsProperTriadAndDirector; assertion 1개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.FiniteCoordinateBuildsProperTriadAndDirector 유지 원문 검사 body 및 assertion 동일. 1013327e87dfbcfd8516fe145e8e8051a97b90d1f4321ff5bdc4f99dbe198e94 1013327e87dfbcfd8516fe145e8e8051a97b90d1f4321ff5bdc4f99dbe198e94 ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/finite_rotation_test.cpp FiniteRotation.GlobalIncrementRebuildsFixedReferenceOrientation FiniteRotation.GlobalIncrementRebuildsFixedReferenceOrientation; assertion 3개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.GlobalIncrementRebuildsFixedReferenceOrientation 유지 원문 검사 body 및 assertion 동일. 069a14c550efe63bd5178dae6e8c3ae73a67dbff8c75ee68d7af81582d3336dd 069a14c550efe63bd5178dae6e8c3ae73a67dbff8c75ee68d7af81582d3336dd ASSERT_TRUE(committed.HasValue()) | ASSERT_TRUE(updated.HasValue()) | EXPECT_EQ(updated.Value().phi, expected_phi) ASSERT_TRUE(committed.HasValue()) | ASSERT_TRUE(updated.HasValue()) | EXPECT_EQ(updated.Value().phi, expected_phi) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsCoordinatesInsidePrincipalBranchMargin FiniteRotation.RejectsCoordinatesInsidePrincipalBranchMargin; assertion 5개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsCoordinatesInsidePrincipalBranchMargin 유지 원문 검사 body 및 assertion 동일. 12de3e3e90b293e3c19a0cc9620342eab8bad27fd9185362bf6aefb4c3c4334d 12de3e3e90b293e3c19a0cc9620342eab8bad27fd9185362bf6aefb4c3c4334d "EXPECT_TRUE(MakeFiniteRotationState(Vector3{pi - 2.0 * margin, 0.0, 0.0}, initial_frame) .HasValue()) | ASSERT_FALSE(ambiguous.HasValue()) | ASSERT_FALSE(ambiguous.GetStatus().IsOk()) | ASSERT_EQ(ambiguous.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(ambiguous.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" "EXPECT_TRUE(MakeFiniteRotationState(Vector3{pi - 2.0 * margin, 0.0, 0.0}, initial_frame) .HasValue()) | ASSERT_FALSE(ambiguous.HasValue()) | ASSERT_FALSE(ambiguous.GetStatus().IsOk()) | ASSERT_EQ(ambiguous.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(ambiguous.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/finite_rotation_test.cpp FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent; assertion 3개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent 이관 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. de23e8a2e899273546a62b6d2d04f9b13ca22c99017a7e110d3680b0f54a2d05 a39013f3e24d31e9ecb14e3117116d4f8be30cb57b65c734d2d81b560719432a EXPECT_TRUE(IsFinite(left_jacobian)) | EXPECT_TRUE(IsFinite(inverse_transpose)) | EXPECT_NEAR(identity(row, column), row == column ? 1.0 : 0.0, 1.0e-11) EXPECT_TRUE(IsFinite(left_jacobian)) | ASSERT_TRUE(solved.HasValue()) | EXPECT_TRUE(std::isfinite(solved.Value().X())) | EXPECT_TRUE(std::isfinite(solved.Value().Y())) | EXPECT_TRUE(std::isfinite(solved.Value().Z())) | EXPECT_NEAR(identity_column[row], row == column ? 1.0 : 0.0, 1.0e-11) | ASSERT_TRUE(spatial.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsNonfiniteCoordinatesAndInvalidInitialFrames FiniteRotation.RejectsNonfiniteCoordinatesAndInvalidInitialFrames; assertion 8개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsNonfiniteCoordinatesAndInvalidInitialFrames 유지 원문 검사 body 및 assertion 동일. 5da1952beb0840c9e5ab9fb79e02c5a2519d977763fb497904b3741c3d2a52d7 5da1952beb0840c9e5ab9fb79e02c5a2519d977763fb497904b3741c3d2a52d7 "ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_EQ(nonfinite.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(nonfinite.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_FALSE(MakeFiniteRotationState(Vector3{}, invalid_frame).HasValue()) | ASSERT_TRUE(committed.HasValue()) | ASSERT_FALSE(invalid_increment.HasValue()) | ASSERT_EQ(invalid_increment.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(invalid_increment.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" "ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_EQ(nonfinite.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(nonfinite.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_FALSE(MakeFiniteRotationState(Vector3{}, invalid_frame).HasValue()) | ASSERT_TRUE(committed.HasValue()) | ASSERT_FALSE(invalid_increment.HasValue()) | ASSERT_EQ(invalid_increment.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(invalid_increment.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/finite_rotation_test.cpp support@1-97 helper/oracle/fixture/include/static assertion 구간: fesa, InitialFrame, Transpose, Multiply, Determinant, IsFinite, if, ExpectMatrixNear, ExpectVectorNear, ExpectProperOrthogonal tests/unit/elements/finite_rotation_test.cpp file-support 유지 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. 214fd606ec176af7e65bf83ad0dd1cdaf0a15c0de6afd34a6fc06b5596dfab88 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/finite_rotation_test.cpp support@227-229 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/elements/finite_rotation_test.cpp file-support 유지 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/hex8_element_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 35개 tests/unit/elements/hex8_element_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e346ef7775cc96410eacfea1e7e15ecf2b62b6f125a2e475f9e15e3e97e1acaa a80b2714cc9ea75d6b97dead96c8ff8d443812c306278883e54a74d8b4515d40 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.ExactBrickStiffnessAndRowSumLumpedMass Hex8Element.ExactBrickStiffnessAndRowSumLumpedMass; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.ExactBrickStiffnessAndRowSumLumpedMass 유지 원문 검사 body 및 assertion 동일. 4958ab7f7854bb45aa79de051af75399166c78d31010d04061a611e3f1b0af57 4958ab7f7854bb45aa79de051af75399166c78d31010d04061a611e3f1b0af57 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(k.Rows(), 24U) | ASSERT_EQ(m.Columns(), 24U) | EXPECT_NEAR(k(3 * a + i, 3 * b + j), exact, 2e-12) | EXPECT_NEAR(m(3 * a + i, 3 * b + j), expected_mass, 2e-14) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(k.Rows(), 24U) | ASSERT_EQ(m.Columns(), 24U) | EXPECT_NEAR(k(3 * a + i, 3 * b + j), exact, 2e-12) | EXPECT_NEAR(m(3 * a + i, 3 * b + j), expected_mass, 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.AffineTensorShearAndEightDistinctRecoveryPoints Hex8Element.AffineTensorShearAndEightDistinctRecoveryPoints; assertion 13개 tests/unit/elements/hex8_element_test.cpp Hex8Element.AffineTensorShearAndEightDistinctRecoveryPoints 유지 원문 검사 body 및 assertion 동일. 313b67ab5495cf7f93ddcbf2e7b5060057d3b60bbe619ea1a8bf18aa0c834287 313b67ab5495cf7f93ddcbf2e7b5060057d3b60bbe619ea1a8bf18aa0c834287 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 48.0 * 48.0 * 0.0002, 1e-12) | EXPECT_EQ(p.element, 7U) | EXPECT_EQ(p.integration_point, static_cast(g + 1)) | EXPECT_NEAR(p.strain[3], 0.01, 1e-16) | EXPECT_NEAR(p.cauchy_stress[3], 0.96, 1e-14) | EXPECT_DOUBLE_EQ(p.natural_coordinates[i], natural[i]) | EXPECT_NEAR(p.reference_coordinates[i], natural[i] * static_cast(i + 1U), 2e-15) | EXPECT_LT(r.Value().points[2].natural_coordinates[0], 0.0) | EXPECT_GT(r.Value().points[2].natural_coordinates[1], 0.0) | ASSERT_TRUE(recovered.HasValue()) | EXPECT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 48.0 * 48.0 * 0.0002, 1e-12) | EXPECT_EQ(p.element, 7U) | EXPECT_EQ(p.integration_point, static_cast(g + 1)) | EXPECT_NEAR(p.strain[3], 0.01, 1e-16) | EXPECT_NEAR(p.cauchy_stress[3], 0.96, 1e-14) | EXPECT_DOUBLE_EQ(p.natural_coordinates[i], natural[i]) | EXPECT_NEAR(p.reference_coordinates[i], natural[i] * static_cast(i + 1U), 2e-15) | EXPECT_LT(r.Value().points[2].natural_coordinates[0], 0.0) | EXPECT_GT(r.Value().points[2].natural_coordinates[1], 0.0) | ASSERT_TRUE(recovered.HasValue()) | EXPECT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.UniformTranslationHasExactlyZeroLinearForceAndEnergy Hex8Element.UniformTranslationHasExactlyZeroLinearForceAndEnergy; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.UniformTranslationHasExactlyZeroLinearForceAndEnergy 유지 원문 검사 body 및 assertion 동일. d26359e5ed35c184732756cded1c265d5d66185d9350490c6338e407985d9af7 d26359e5ed35c184732756cded1c265d5d66185d9350490c6338e407985d9af7 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().strain_energy, 0.0) | EXPECT_EQ(response.Value().internal_force[i], 0.0) | EXPECT_EQ(point.strain[i], 0.0) | EXPECT_EQ(point.cauchy_stress[i], 0.0) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().strain_energy, 0.0) | EXPECT_EQ(response.Value().internal_force[i], 0.0) | EXPECT_EQ(point.strain[i], 0.0) | EXPECT_EQ(point.cauchy_stress[i], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearResponseIsUnchangedByExactlyRepresentableTranslation Hex8Element.LinearResponseIsUnchangedByExactlyRepresentableTranslation; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearResponseIsUnchangedByExactlyRepresentableTranslation 유지 원문 검사 body 및 assertion 동일. b6369e091941f9510897d937e44e5aea48b57bb6b78b0075ad1061ff7a9de3ab b6369e091941f9510897d937e44e5aea48b57bb6b78b0075ad1061ff7a9de3ab ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_EQ(translated.Value().strain_energy, original.Value().strain_energy) | EXPECT_EQ(translated.Value().internal_force[i], original.Value().internal_force[i]) | EXPECT_EQ(translated.Value().points[g].strain, original.Value().points[g].strain) | EXPECT_EQ(translated.Value().points[g].cauchy_stress, original.Value().points[g].cauchy_stress) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_EQ(translated.Value().strain_energy, original.Value().strain_energy) | EXPECT_EQ(translated.Value().internal_force[i], original.Value().internal_force[i]) | EXPECT_EQ(translated.Value().points[g].strain, original.Value().points[g].strain) | EXPECT_EQ(translated.Value().points[g].cauchy_stress, original.Value().points[g].cauchy_stress) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.TinySignedAffineStretchRetainsStvkStressForceAndEnergy Hex8Element.TinySignedAffineStretchRetainsStvkStressForceAndEnergy; assertion 8개 tests/unit/elements/hex8_element_test.cpp Hex8Element.TinySignedAffineStretchRetainsStvkStressForceAndEnergy 유지 원문 검사 body 및 assertion 동일. 78a9f3a03973517e375627e6db91c92f87055a4a578afaad01162ecd40bb8807 78a9f3a03973517e375627e6db91c92f87055a4a578afaad01162ecd40bb8807 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected_energy, 1e-12 * expected_energy) | EXPECT_NEAR(point.strain[0], green, 1e-12 * std::abs(green)) | EXPECT_NEAR(point.cauchy_stress[0], (1.0 + stretch) * sxx, 1e-12 * std::abs(sxx)) | EXPECT_NEAR(point.cauchy_stress[1], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(point.cauchy_stress[2], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(response.Value().internal_force[3U * a + i], expected[i], 1e-12 * std::abs(expected[i])) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected_energy, 1e-12 * expected_energy) | EXPECT_NEAR(point.strain[0], green, 1e-12 * std::abs(green)) | EXPECT_NEAR(point.cauchy_stress[0], (1.0 + stretch) * sxx, 1e-12 * std::abs(sxx)) | EXPECT_NEAR(point.cauchy_stress[1], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(point.cauchy_stress[2], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(response.Value().internal_force[3U * a + i], expected[i], 1e-12 * std::abs(expected[i])) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteRigidRotationHasZeroGreenEnergyAndForce Hex8Element.FiniteRigidRotationHasZeroGreenEnergyAndForce; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteRigidRotationHasZeroGreenEnergyAndForce 유지 원문 검사 body 및 assertion 동일. e455a9ed32fdd0e8e47fc3c290a1b727a91e2fa4e8bdaf6fbdc1afcf350feff8 e455a9ed32fdd0e8e47fc3c290a1b727a91e2fa4e8bdaf6fbdc1afcf350feff8 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 0.0, 1e-25) | EXPECT_LT(r.Value().internal_force.Norm(), 1e-11) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 0.0, 1e-25) | EXPECT_LT(r.Value().internal_force.Norm(), 1e-11) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsCollapsedAndInvalidMaterial Hex8Element.RejectsCollapsedAndInvalidMaterial; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsCollapsedAndInvalidMaterial 유지 원문 검사 body 및 assertion 동일. f7a6d301ea33b5e96a07e058df286d6cd4862431368a3073a678fb7d25013412 f7a6d301ea33b5e96a07e058df286d6cd4862431368a3073a678fb7d25013412 EXPECT_FALSE(Make(x).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, 0.5).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, -1.0).HasValue()) EXPECT_FALSE(Make(x).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, 0.5).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, -1.0).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.CertifiesPositiveQuadraticAfterSubdivision Hex8Element.CertifiesPositiveQuadraticAfterSubdivision; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.CertifiesPositiveQuadraticAfterSubdivision 유지 원문 검사 body 및 assertion 동일. 95b193341de90670eec4e7255153d7dceed178a93f1f64c003a50b742b00a37d 95b193341de90670eec4e7255153d7dceed178a93f1f64c003a50b742b00a37d ASSERT_TRUE(r.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(total, 2.0 * 8.0 * (.1125 + 1.0 / 3.0), 2e-14) ASSERT_TRUE(r.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(total, 2.0 * 8.0 * (.1125 + 1.0 / 3.0), 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsInteriorFoldDespiteAll27SamplesAndGaussBeingPositive Hex8Element.RejectsInteriorFoldDespiteAll27SamplesAndGaussBeingPositive; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsInteriorFoldDespiteAll27SamplesAndGaussBeingPositive 유지 원문 검사 body 및 assertion 동일. bbc9326a1a8cd88f3825aed2389ec7e1ef842966741646d352f0832789f5d0c2 bbc9326a1a8cd88f3825aed2389ec7e1ef842966741646d352f0832789f5d0c2 "EXPECT_GT(xi * xi - .5 * xi + .0575, 0.0) | EXPECT_LT(.25 * .25 - .5 * .25 + .0575, 0.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""nonpositive""), std::string::npos) | ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) | EXPECT_FALSE(valid.Value().EvaluateLinear(u).HasValue())" "EXPECT_GT(xi * xi - .5 * xi + .0575, 0.0) | EXPECT_LT(.25 * .25 - .5 * .25 + .0575, 0.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""nonpositive""), std::string::npos) | ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) | EXPECT_FALSE(valid.Value().EvaluateLinear(u).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.UnresolvedZeroInteriorJacobianFailsClosed Hex8Element.UnresolvedZeroInteriorJacobianFailsClosed; assertion 2개 tests/unit/elements/hex8_element_test.cpp Hex8Element.UnresolvedZeroInteriorJacobianFailsClosed 유지 원문 검사 body 및 assertion 동일. 25134743bf7dbd34b8f67e84c1f7410aca7787da7e52867c5219e8fd69b5915a 25134743bf7dbd34b8f67e84c1f7410aca7787da7e52867c5219e8fd69b5915a "ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""unresolved""), std::string::npos)" "ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""unresolved""), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.TinyUncertainCurrentAdditionCannotBeAccepted Hex8Element.TinyUncertainCurrentAdditionCannotBeAccepted; assertion 2개 tests/unit/elements/hex8_element_test.cpp Hex8Element.TinyUncertainCurrentAdditionCannotBeAccepted 유지 원문 검사 body 및 assertion 동일. 27e5e73c83e4d58b025bd6e1a66cee4ffbee4247950b398ed98dace4cc6cb471 27e5e73c83e4d58b025bd6e1a66cee4ffbee4247950b398ed98dace4cc6cb471 ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.SixRigidModesAndZeroStateTangent Hex8Element.SixRigidModesAndZeroStateTangent; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.SixRigidModesAndZeroStateTangent 유지 원문 검사 body 및 assertion 동일. 981fc257d430c76b022b6abdc8164538b5b2b0ad71090c5ad34aa8687b2600f4 981fc257d430c76b022b6abdc8164538b5b2b0ad71090c5ad34aa8687b2600f4 ASSERT_TRUE(element.HasValue()) | EXPECT_LT(k.Multiply(u).Norm(), 2e-12) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().tangent(i, j), k(i, j), 2e-12) | EXPECT_DOUBLE_EQ(trial.Value().geometric_tangent(i, j), 0.0) | EXPECT_NEAR(k(i, j), k(j, i), 2e-12) ASSERT_TRUE(element.HasValue()) | EXPECT_LT(k.Multiply(u).Norm(), 2e-12) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().tangent(i, j), k(i, j), 2e-12) | EXPECT_DOUBLE_EQ(trial.Value().geometric_tangent(i, j), 0.0) | EXPECT_NEAR(k(i, j), k(j, i), 2e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.RowSumLumpedMassHasAll24PositiveDirectionsAndReferenceInvariance Hex8Element.RowSumLumpedMassHasAll24PositiveDirectionsAndReferenceInvariance; assertion 5개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RowSumLumpedMassHasAll24PositiveDirectionsAndReferenceInvariance 유지 원문 검사 body 및 assertion 동일. 83b4b4951ae0ceb3a1ebba1031cb1b93db157eb11ceafe07c0e9a6efaf526056 83b4b4951ae0ceb3a1ebba1031cb1b93db157eb11ceafe07c0e9a6efaf526056 ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(mv[a], eigenvalue * v[a], 3e-14) | EXPECT_GT(v.Dot(mv), 0.0) | ASSERT_TRUE(element.Value().EvaluateNonlinear(Affine(Brick(), f)).HasValue()) | EXPECT_DOUBLE_EQ(before(i, j), after(i, j)) ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(mv[a], eigenvalue * v[a], 3e-14) | EXPECT_GT(v.Dot(mv), 0.0) | ASSERT_TRUE(element.Value().EvaluateNonlinear(Affine(Brick(), f)).HasValue()) | EXPECT_DOUBLE_EQ(before(i, j), after(i, j)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.GeometryMaterialDensityScalingAndCoordinateCovariance Hex8Element.GeometryMaterialDensityScalingAndCoordinateCovariance; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.GeometryMaterialDensityScalingAndCoordinateCovariance 유지 원문 검사 body 및 assertion 동일. 4eb1091302e1a3fe888acb6e43f848406b05514f67e8e607ebebb448e2c3ae33 4eb1091302e1a3fe888acb6e43f848406b05514f67e8e607ebebb448e2c3ae33 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(rotated_element.HasValue()) | ASSERT_TRUE(scaled.HasValue()) | EXPECT_NEAR(kr(3 * a + i, 3 * b + j), oracle, 3e-12) | EXPECT_NEAR(mr(3 * a + i, 3 * b + j), m(3 * a + i, 3 * b + j), 3e-14) | EXPECT_NEAR(ks(3 * a + i, 3 * b + j), 7.5 * k(3 * a + i, 3 * b + j), 3e-11) | EXPECT_NEAR(ms(3 * a + i, 3 * b + j), 5.0 * 15.625 * m(3 * a + i, 3 * b + j), 3e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(rotated_element.HasValue()) | ASSERT_TRUE(scaled.HasValue()) | EXPECT_NEAR(kr(3 * a + i, 3 * b + j), oracle, 3e-12) | EXPECT_NEAR(mr(3 * a + i, 3 * b + j), m(3 * a + i, 3 * b + j), 3e-14) | EXPECT_NEAR(ks(3 * a + i, 3 * b + j), 7.5 * k(3 * a + i, 3 * b + j), 3e-11) | EXPECT_NEAR(ms(3 * a + i, 3 * b + j), 5.0 * 15.625 * m(3 * a + i, 3 * b + j), 3e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedAffinePatchHasExactEnergyAndGlobalCauchyGreenTensors Hex8Element.WarpedAffinePatchHasExactEnergyAndGlobalCauchyGreenTensors; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedAffinePatchHasExactEnergyAndGlobalCauchyGreenTensors 유지 원문 검사 body 및 assertion 동일. fe44f6f0a2891d1d47828642165b5b6797671cfe463b004bbb2fb282a442fd8d fe44f6f0a2891d1d47828642165b5b6797671cfe463b004bbb2fb282a442fd8d ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().strain_energy, volume * (24.0 * trace * trace + 48.0 * contraction), 2e-12) | EXPECT_NEAR(p.strain[c], green[i][j], 5e-16) | EXPECT_NEAR(p.cauchy_stress[c], sigma[i][j], 8e-14) | EXPECT_NEAR(force[i], 0.0, 5e-13) | EXPECT_NEAR(moment[i], 0.0, 2e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().strain_energy, volume * (24.0 * trace * trace + 48.0 * contraction), 2e-12) | EXPECT_NEAR(p.strain[c], green[i][j], 5e-16) | EXPECT_NEAR(p.cauchy_stress[c], sigma[i][j], 8e-14) | EXPECT_NEAR(force[i], 0.0, 5e-13) | EXPECT_NEAR(moment[i], 0.0, 2e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.StrainedRigidRotationPreservesEnergyAndCovariantForceTangent Hex8Element.StrainedRigidRotationPreservesEnergyAndCovariantForceTangent; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.StrainedRigidRotationPreservesEnergyAndCovariantForceTangent 유지 원문 검사 body 및 assertion 동일. cdc4257cf115d6d2c10dbdfb298f45077d8821f024dcec44056b2a7a71c3589f cdc4257cf115d6d2c10dbdfb298f45077d8821f024dcec44056b2a7a71c3589f ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | EXPECT_NEAR(rotated.Value().strain_energy, baseline.Value().strain_energy, 3e-12) | EXPECT_NEAR(rotated.Value().internal_force[3 * a + i], expected[i], 3e-12) | EXPECT_NEAR(rotated.Value().tangent(3 * a + i, 3 * b + j), expected_k, 7e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | EXPECT_NEAR(rotated.Value().strain_energy, baseline.Value().strain_energy, 3e-12) | EXPECT_NEAR(rotated.Value().internal_force[3 * a + i], expected[i], 3e-12) | EXPECT_NEAR(rotated.Value().tangent(3 * a + i, 3 * b + j), expected_k, 7e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.EnergyForceAndForceTangentDirectionalStepSweep Hex8Element.EnergyForceAndForceTangentDirectionalStepSweep; assertion 11개 tests/unit/elements/hex8_element_test.cpp Hex8Element.EnergyForceAndForceTangentDirectionalStepSweep 유지 원문 검사 body 및 assertion 동일. c1ac1963af7f68ce46427d45877d677e804ed410b87c23a0a35910fb1386ff55 c1ac1963af7f68ce46427d45877d677e804ed410b87c23a0a35910fb1386ff55 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(energy_error[1], .02 * energy_error[0]) | EXPECT_LT(force_error[1], .02 * force_error[0]) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) | EXPECT_GT(energy_error.back(), *std::min_element(energy_error.begin(), energy_error.end())) | EXPECT_NEAR(trial.Value().tangent(i, j), trial.Value().tangent(j, i), MaxEntry(trial.Value().tangent) * 2e-14) | EXPECT_DOUBLE_EQ(trial.Value().tangent(i, j), trial.Value().material_tangent(i, j) + trial.Value().geometric_tangent(i, j)) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(energy_error[1], .02 * energy_error[0]) | EXPECT_LT(force_error[1], .02 * force_error[0]) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) | EXPECT_GT(energy_error.back(), *std::min_element(energy_error.begin(), energy_error.end())) | EXPECT_NEAR(trial.Value().tangent(i, j), trial.Value().tangent(j, i), MaxEntry(trial.Value().tangent) * 2e-14) | EXPECT_DOUBLE_EQ(trial.Value().tangent(i, j), trial.Value().material_tangent(i, j) + trial.Value().geometric_tangent(i, j)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.TranslatedWarpedLinearResponseRetainsEnergyAndTangentVariation Hex8Element.TranslatedWarpedLinearResponseRetainsEnergyAndTangentVariation; assertion 8개 tests/unit/elements/hex8_element_test.cpp Hex8Element.TranslatedWarpedLinearResponseRetainsEnergyAndTangentVariation 유지 원문 검사 body 및 assertion 동일. 3aee6e7ad64dc19c22977520ef31f2117eb4c6fd4f7fdf4c71fdbc351525e89c 3aee6e7ad64dc19c22977520ef31f2117eb4c6fd4f7fdf4c71fdbc351525e89c ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_NE(derivative, 0.0) | ASSERT_GT(tangent_direction.Norm(), 0.0) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_NE(derivative, 0.0) | ASSERT_GT(tangent_direction.Norm(), 0.0) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidInputsAndFailedTrialPreservePriorResponseAndReference Hex8Element.InvalidInputsAndFailedTrialPreservePriorResponseAndReference; assertion 23개 tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidInputsAndFailedTrialPreservePriorResponseAndReference 유지 원문 검사 body 및 assertion 동일. eafc89af7adfd7c0e8325f391adaccb0253f22989cd839d88e804ef1747ba172 eafc89af7adfd7c0e8325f391adaccb0253f22989cd839d88e804ef1747ba172 "EXPECT_FALSE(Make(Brick(), 0.0).HasValue()) | EXPECT_FALSE( Make(Brick(), std::numeric_limits::infinity()).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, std::numeric_limits::quiet_NaN()) .HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, 0.0).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, -1.0).HasValue()) | EXPECT_FALSE( Make(Brick(), 120.0, .25, std::numeric_limits::infinity()) .HasValue()) | EXPECT_FALSE(Make(nonfinite).HasValue()) | ASSERT_TRUE(no_density.HasValue()) | EXPECT_FALSE(no_density.Value().ComputeMass().HasValue()) | ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_FALSE(element.Value().EvaluateNonlinear(failed).HasValue()) | EXPECT_FALSE(element.Value().EvaluateLinear(fesa::Vector{23U}).HasValue()) | EXPECT_FALSE(Make(inverted).HasValue()) | ASSERT_TRUE(again.HasValue()) | EXPECT_DOUBLE_EQ(accepted.Value().strain_energy, again.Value().strain_energy) | EXPECT_DOUBLE_EQ(accepted.Value().internal_force[i], again.Value().internal_force[i]) | EXPECT_DOUBLE_EQ(accepted.Value().tangent(i, j), again.Value().tangent(i, j)) | ASSERT_FALSE(failure.HasValue()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(diagnostic.location.line, 4U) | EXPECT_EQ(diagnostic.keyword, ""C3D8"") | EXPECT_EQ(diagnostic.entity_identity, ""PART-1:42"")" "EXPECT_FALSE(Make(Brick(), 0.0).HasValue()) | EXPECT_FALSE( Make(Brick(), std::numeric_limits::infinity()).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, std::numeric_limits::quiet_NaN()) .HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, 0.0).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, -1.0).HasValue()) | EXPECT_FALSE( Make(Brick(), 120.0, .25, std::numeric_limits::infinity()) .HasValue()) | EXPECT_FALSE(Make(nonfinite).HasValue()) | ASSERT_TRUE(no_density.HasValue()) | EXPECT_FALSE(no_density.Value().ComputeMass().HasValue()) | ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_FALSE(element.Value().EvaluateNonlinear(failed).HasValue()) | EXPECT_FALSE(element.Value().EvaluateLinear(fesa::Vector{23U}).HasValue()) | EXPECT_FALSE(Make(inverted).HasValue()) | ASSERT_TRUE(again.HasValue()) | EXPECT_DOUBLE_EQ(accepted.Value().strain_energy, again.Value().strain_energy) | EXPECT_DOUBLE_EQ(accepted.Value().internal_force[i], again.Value().internal_force[i]) | EXPECT_DOUBLE_EQ(accepted.Value().tangent(i, j), again.Value().tangent(i, j)) | ASSERT_FALSE(failure.HasValue()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(diagnostic.location.line, 4U) | EXPECT_EQ(diagnostic.keyword, ""C3D8"") | EXPECT_EQ(diagnostic.entity_identity, ""PART-1:42"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidLayoutsAreRejectedBeforeNumericalWork Hex8Element.InvalidLayoutsAreRejectedBeforeNumericalWork; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidLayoutsAreRejectedBeforeNumericalWork 유지 원문 검사 body 및 assertion 동일. a7ca0be993c579446617dabcfc9a712b6f62501b3ac95ccceb134dd90997bee1 a7ca0be993c579446617dabcfc9a712b6f62501b3ac95ccceb134dd90997bee1 EXPECT_FALSE( fesa::Hex8Element::Create(7U, duplicate, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, missing, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, wrong_order, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, rotation, Brick(), material).HasValue()) EXPECT_FALSE( fesa::Hex8Element::Create(7U, duplicate, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, missing, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, wrong_order, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, rotation, Brick(), material).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearStiffnessHasOnlyTheSixRigidNullDirections Hex8Element.LinearStiffnessHasOnlyTheSixRigidNullDirections; assertion 2개 tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearStiffnessHasOnlyTheSixRigidNullDirections 유지 원문 검사 body 및 assertion 동일. 87f05ea3e4d1a7ddcb6193da61ab7d81812977f0bb3598ad5b32781d868650f2 87f05ea3e4d1a7ddcb6193da61ab7d81812977f0bb3598ad5b32781d868650f2 ASSERT_TRUE(element.HasValue()) | ASSERT_GT(value, 0.0) ASSERT_TRUE(element.HasValue()) | ASSERT_GT(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.NonlinearSmallLoadApproachesLinearResponse Hex8Element.NonlinearSmallLoadApproachesLinearResponse; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.NonlinearSmallLoadApproachesLinearResponse 유지 원문 검사 body 및 assertion 동일. 3c2e1d6f5f5b8adf802500e646e7efca6aed2be1a4f2b685d98bc30f7927f326 3c2e1d6f5f5b8adf802500e646e7efca6aed2be1a4f2b685d98bc30f7927f326 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(linear.HasValue()) | EXPECT_NEAR(linear.Value().strain_energy, .5 * u.Dot(k.Multiply(u)), 1e-14) | EXPECT_LT(error[1], .12 * error[0]) | EXPECT_LT(error[2], .12 * error[1]) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(linear.HasValue()) | EXPECT_NEAR(linear.Value().strain_energy, .5 * u.Dot(k.Multiply(u)), 1e-14) | EXPECT_LT(error[1], .12 * error[0]) | EXPECT_LT(error[2], .12 * error[1]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsUnrepresentableShearAndMassInsteadOfReturningZeros Hex8Element.RejectsUnrepresentableShearAndMassInsteadOfReturningZeros; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsUnrepresentableShearAndMassInsteadOfReturningZeros 유지 원문 검사 body 및 assertion 동일. 030f54c1c851716efb795775685d456b6b30de54201b82b51707735e2ce8993e 030f54c1c851716efb795775685d456b6b30de54201b82b51707735e2ce8993e EXPECT_FALSE(Make(Brick(), tiny, .25).HasValue()) | ASSERT_TRUE(element.HasValue()) | EXPECT_FALSE(element.Value().ComputeMass().HasValue()) EXPECT_FALSE(Make(Brick(), tiny, .25).HasValue()) | ASSERT_TRUE(element.HasValue()) | EXPECT_FALSE(element.Value().ComputeMass().HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.DirectBulkSurvivesNearNegativePoissonBound Hex8Element.DirectBulkSurvivesNearNegativePoissonBound; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.DirectBulkSurvivesNearNegativePoissonBound 유지 원문 검사 body 및 assertion 동일. b409b61a9964e0974b9805bd990ef6c7ff26668ed043b3966161af7cd68927ce b409b61a9964e0974b9805bd990ef6c7ff26668ed043b3966161af7cd68927ce ASSERT_TRUE(element.HasValue()) | EXPECT_GT(1.0 / (3.0 * (1.0 - 2.0 * nu)), 0.0) | EXPECT_TRUE(element.Value().EvaluateLinear(zero).HasValue()) ASSERT_TRUE(element.HasValue()) | EXPECT_GT(1.0 / (3.0 * (1.0 - 2.0 * nu)), 0.0) | EXPECT_TRUE(element.Value().EvaluateLinear(zero).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.OrdinaryNegativePoissonRatioRetainsPositiveVolumetricEnergy Hex8Element.OrdinaryNegativePoissonRatioRetainsPositiveVolumetricEnergy; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.OrdinaryNegativePoissonRatioRetainsPositiveVolumetricEnergy 유지 원문 검사 body 및 assertion 동일. b73dc4b5fd199b08ca51058ccbaf627b1e6a18d8977180164595181c99323fb7 b73dc4b5fd199b08ca51058ccbaf627b1e6a18d8977180164595181c99323fb7 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, 48.0 * .5 * bulk * trace * trace, 2e-14) | EXPECT_NEAR(point.cauchy_stress[i], bulk * trace, 2e-14) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, 48.0 * .5 * bulk * trace * trace, 2e-14) | EXPECT_NEAR(point.cauchy_stress[i], bulk * trace, 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteInputsThatOverflowDerivedArithmeticFailClosed Hex8Element.FiniteInputsThatOverflowDerivedArithmeticFailClosed; assertion 10개 tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteInputsThatOverflowDerivedArithmeticFailClosed 유지 원문 검사 body 및 assertion 동일. 5e6ac7207369709d94127e8b67d20735dc11818d5ff0e03fe463d16a3c34300f 5e6ac7207369709d94127e8b67d20735dc11818d5ff0e03fe463d16a3c34300f "ASSERT_FALSE(bad_material.HasValue()) | EXPECT_NE(bad_material.GetStatus().Diagnostics()[0].message.find(""finite""), std::string::npos) | ASSERT_FALSE(bad_geometry.HasValue()) | EXPECT_NE(bad_geometry.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_TRUE(element.HasValue()) | ASSERT_FALSE(bad_mass.HasValue()) | EXPECT_NE(bad_mass.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_FALSE(bad_trial.HasValue()) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""trial""), std::string::npos) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" "ASSERT_FALSE(bad_material.HasValue()) | EXPECT_NE(bad_material.GetStatus().Diagnostics()[0].message.find(""finite""), std::string::npos) | ASSERT_FALSE(bad_geometry.HasValue()) | EXPECT_NE(bad_geometry.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_TRUE(element.HasValue()) | ASSERT_FALSE(bad_mass.HasValue()) | EXPECT_NE(bad_mass.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_FALSE(bad_trial.HasValue()) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""trial""), std::string::npos) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.BackendOperandRejectionRetainsOriginalStiffnessDiagnostic Hex8Element.BackendOperandRejectionRetainsOriginalStiffnessDiagnostic; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.BackendOperandRejectionRetainsOriginalStiffnessDiagnostic 유지 원문 검사 body 및 assertion 동일. 5e5f0b08b76057ba308b8598cfbb4bff467e83ec36a8f2d6a6a4b6ba392773c6 5e5f0b08b76057ba308b8598cfbb4bff467e83ec36a8f2d6a6a4b6ba392773c6 "ASSERT_FALSE(element.HasValue()) | EXPECT_EQ(element.GetStatus().Diagnostics()[0].code, ""invalid-hex8"") | EXPECT_EQ(element.GetStatus().Diagnostics()[0].message, ""Hex8 reference stiffness is nonfinite."")" "ASSERT_FALSE(element.HasValue()) | EXPECT_EQ(element.GetStatus().Diagnostics()[0].code, ""invalid-hex8"") | EXPECT_EQ(element.GetStatus().Diagnostics()[0].message, ""Hex8 reference stiffness is nonfinite."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.TensorFailureRetainsPriorityOverEnergyAndTangentOverflow Hex8Element.TensorFailureRetainsPriorityOverEnergyAndTangentOverflow; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.TensorFailureRetainsPriorityOverEnergyAndTangentOverflow 유지 원문 검사 body 및 assertion 동일. 824f69867bc8e222afd9c8430f87581663312e6964833b42fb11af055bc84f84 824f69867bc8e222afd9c8430f87581663312e6964833b42fb11af055bc84f84 "ASSERT_TRUE(element.HasValue()) | ASSERT_FALSE(response.HasValue()) | EXPECT_EQ(response.GetStatus().Diagnostics()[0].code, ""invalid-hex8"") | EXPECT_EQ(response.GetStatus().Diagnostics()[0].message, ""Hex8 trial tensor is nonfinite."")" "ASSERT_TRUE(element.HasValue()) | ASSERT_FALSE(response.HasValue()) | EXPECT_EQ(response.GetStatus().Diagnostics()[0].code, ""invalid-hex8"") | EXPECT_EQ(response.GetStatus().Diagnostics()[0].message, ""Hex8 trial tensor is nonfinite."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedRowSumMassMatchesIndependentNodalIntegralsAndNonuniformEnergy Hex8Element.WarpedRowSumMassMatchesIndependentNodalIntegralsAndNonuniformEnergy; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedRowSumMassMatchesIndependentNodalIntegralsAndNonuniformEnergy 유지 원문 검사 body 및 assertion 동일. bf8a73def3fe445aed1d34414e6487babf97967f7a2eee63f30dc54cc56e719b bf8a73def3fe445aed1d34414e6487babf97967f7a2eee63f30dc54cc56e719b ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(actual(3U * a + i, 3U * a + j), i == j ? expected[a] : 0.0, 3e-14) | EXPECT_GT(max_nodal - min_nodal, 1e-4) | EXPECT_NEAR(lumped_energy, independent_energy, 3e-14 * independent_energy) | EXPECT_GT(std::abs(lumped_energy - uniform_energy), 1e-4) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(actual(3U * a + i, 3U * a + j), i == j ? expected[a] : 0.0, 3e-14) | EXPECT_GT(max_nodal - min_nodal, 1e-4) | EXPECT_NEAR(lumped_energy, independent_energy, 3e-14 * independent_energy) | EXPECT_GT(std::abs(lumped_energy - uniform_energy), 1e-4) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedNonaffineQuadratureDifferenceIsQuantifiedAndRefines Hex8Element.WarpedNonaffineQuadratureDifferenceIsQuantifiedAndRefines; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedNonaffineQuadratureDifferenceIsQuantifiedAndRefines 유지 원문 검사 body 및 assertion 동일. 5d17d7efabd51400aebc4c48b3b6ce69588a7ceabc7181514c40a0fbc9b85a80 5d17d7efabd51400aebc4c48b3b6ce69588a7ceabc7181514c40a0fbc9b85a80 ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(.5 * u.Dot(k.Multiply(u)), q2[0], budget * q2[0]) | EXPECT_GT(stiffness_discrepancy, 1e-8) | EXPECT_LT(std::abs(q5[0] - q7[0]), .05 * std::abs(q3[0] - q7[0])) ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(.5 * u.Dot(k.Multiply(u)), q2[0], budget * q2[0]) | EXPECT_GT(stiffness_discrepancy, 1e-8) | EXPECT_LT(std::abs(q5[0] - q7[0]), .05 * std::abs(q3[0] - q7[0])) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeNonaffinePolynomialEnergyForceHessianAndActualStrain Hex8Element.MeanVolumeNonaffinePolynomialEnergyForceHessianAndActualStrain; assertion 14개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeNonaffinePolynomialEnergyForceHessianAndActualStrain 유지 원문 검사 body 및 assertion 동일. 57b07c678307c09776b4d21ca346b44d0c11e07901b38c8ded396f3d1b7a05e4 57b07c678307c09776b4d21ca346b44d0c11e07901b38c8ded396f3d1b7a05e4 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(r.strain_energy, energy, 2e-14) | EXPECT_NEAR(r.internal_force[6] + r.internal_force[18], force, 2e-13) | EXPECT_NEAR(r.tangent(6, 6) + r.tangent(6, 18) + r.tangent(18, 6) + r.tangent(18, 18), hessian, 2e-12) | EXPECT_NEAR(point.strain[0], exx, 2e-15) | EXPECT_NEAR(point.strain[1], eyy, 2e-15) | EXPECT_NEAR(point.strain[3], exy, 2e-15) | EXPECT_NEAR( point.cauchy_stress[0], nonlinear ? (t * t * sxx + 2 * t * c * px * sxy + c * c * px * px * syy) / t : sxx, 2e-13) | EXPECT_NEAR(point.cauchy_stress[1], nonlinear ? syy / t : syy, 2e-13) | EXPECT_NEAR(point.cauchy_stress[2], nonlinear ? szz / t : szz, 2e-13) | EXPECT_NEAR(point.cauchy_stress[3], nonlinear ? (t * sxy + c * px * syy) / t : sxy, 2e-13) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(r.strain_energy, energy, 2e-14) | EXPECT_NEAR(r.internal_force[6] + r.internal_force[18], force, 2e-13) | EXPECT_NEAR(r.tangent(6, 6) + r.tangent(6, 18) + r.tangent(18, 6) + r.tangent(18, 18), hessian, 2e-12) | EXPECT_NEAR(point.strain[0], exx, 2e-15) | EXPECT_NEAR(point.strain[1], eyy, 2e-15) | EXPECT_NEAR(point.strain[3], exy, 2e-15) | EXPECT_NEAR( point.cauchy_stress[0], nonlinear ? (t * t * sxx + 2 * t * c * px * sxy + c * c * px * px * syy) / t : sxx, 2e-13) | EXPECT_NEAR(point.cauchy_stress[1], nonlinear ? syy / t : syy, 2e-13) | EXPECT_NEAR(point.cauchy_stress[2], nonlinear ? szz / t : szz, 2e-13) | EXPECT_NEAR(point.cauchy_stress[3], nonlinear ? (t * sxy + c * px * syy) / t : sxy, 2e-13) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedStressUsesReferenceWeightedTrace Hex8Element.MeanVolumeWarpedStressUsesReferenceWeightedTrace; assertion 5개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedStressUsesReferenceWeightedTrace 유지 원문 검사 body 및 assertion 동일. 59532de38aa69f4c4457d06696198fcd7c2f3a8fa6ff9c031d5167d0997ff48f 59532de38aa69f4c4457d06696198fcd7c2f3a8fa6ff9c031d5167d0997ff48f ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_GT(std::abs(mean - arithmetic), 1e-8) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 80 * mean, 2e-13) | EXPECT_NEAR(response.Value().strain_energy, WarpedQuadratureEnergies(u, 2)[0], 2e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_GT(std::abs(mean - arithmetic), 1e-8) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 80 * mean, 2e-13) | EXPECT_NEAR(response.Value().strain_energy, WarpedQuadratureEnergies(u, 2)[0], 2e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeDirectBulkSupportsBoundsWithoutLambdaOrThreeBulkGuard Hex8Element.MeanVolumeDirectBulkSupportsBoundsWithoutLambdaOrThreeBulkGuard; assertion 9개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeDirectBulkSupportsBoundsWithoutLambdaOrThreeBulkGuard 유지 원문 검사 body 및 assertion 동일. c28569a10dbd624762f2603dcbc1fde256d3cb97dba712040d799994fbf19f2f c28569a10dbd624762f2603dcbc1fde256d3cb97dba712040d799994fbf19f2f EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 12, std::nextafter(-1.0, 0.0)).HasValue()) | EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 1, std::nextafter(.5, 0.0)).HasValue()) | ASSERT_TRUE(huge.HasValue()) | ASSERT_TRUE(std::isfinite(direct_bulk)) | ASSERT_FALSE(std::isfinite(3 * direct_bulk)) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected, 1e-13 * expected) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), 1e308, .499).HasValue()) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), std::numeric_limits::denorm_min(), -.5) .HasValue()) EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 12, std::nextafter(-1.0, 0.0)).HasValue()) | EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 1, std::nextafter(.5, 0.0)).HasValue()) | ASSERT_TRUE(huge.HasValue()) | ASSERT_TRUE(std::isfinite(direct_bulk)) | ASSERT_FALSE(std::isfinite(3 * direct_bulk)) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected, 1e-13 * expected) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), 1e308, .499).HasValue()) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), std::numeric_limits::denorm_min(), -.5) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedIndependentEnergyHasCoupledNodeZeroDerivatives Hex8Element.MeanVolumeWarpedIndependentEnergyHasCoupledNodeZeroDerivatives; assertion 9개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedIndependentEnergyHasCoupledNodeZeroDerivatives 유지 원문 검사 body 및 assertion 동일. 3b485161230c69549e449fb7f27b5a942570fa036874622b9d715638e65df1e2 3b485161230c69549e449fb7f27b5a942570fa036874622b9d715638e65df1e2 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(paired.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, energy, 2e-12) | EXPECT_NEAR(paired.Value().high.strain_energy, energy, 2e-12) | EXPECT_NEAR(direction.Dot(response.Value().internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(paired.Value().high.internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(response.Value().tangent.Multiply(direction)), ddf, 2e-8) | EXPECT_NEAR(direction.Dot(paired.Value().high.tangent.Multiply(direction)), ddf, 2e-8) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(paired.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, energy, 2e-12) | EXPECT_NEAR(paired.Value().high.strain_energy, energy, 2e-12) | EXPECT_NEAR(direction.Dot(response.Value().internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(paired.Value().high.internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(response.Value().tangent.Multiply(direction)), ddf, 2e-8) | EXPECT_NEAR(direction.Dot(paired.Value().high.tangent.Multiply(direction)), ddf, 2e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedLowOnlyStateRetainsWeightedCubicEnergy Hex8Element.MeanVolumeWarpedLowOnlyStateRetainsWeightedCubicEnergy; assertion 8개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedLowOnlyStateRetainsWeightedCubicEnergy 유지 원문 검사 body 및 assertion 동일. b232e31a9ebe5946b4d1192b8712f0debd77a8a716c425571f5e2c83529bf37b b232e31a9ebe5946b4d1192b8712f0debd77a8a716c425571f5e2c83529bf37b ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(linear.Value().high.strain_energy, quadratic * c * c, 1e-12 * c * c) | EXPECT_NEAR(actual_cubic.high, cubic * c * c * c, 1e-11 * c * c * c) | EXPECT_NE(actual_cubic.high, 0) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(linear.Value().high.strain_energy, quadratic * c * c, 1e-12 * c * c) | EXPECT_NEAR(actual_cubic.high, cubic * c * c * c, 1e-11 * c * c * c) | EXPECT_NE(actual_cubic.high, 0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/hex8_element_test.cpp support@1-50 helper/oracle/fixture/include/static assertion 구간: Brick, Make, GradientProduct tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 839b075a0d0eda927ed3a1940c15bef4980783019187ede4daa63b2dd3a9a398 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/hex8_element_test.cpp support@228-268 helper/oracle/fixture/include/static assertion 구간: Rotate, Affine, Warped, QuadraticMap, MaxEntry tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 50c481031d1e74a0a358dee1dddea4c0acb477e97c84969072b8a1a3b50d27b2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/hex8_element_test.cpp support@843-961 helper/oracle/fixture/include/static assertion 구간: LegendreRule, WarpedLumpedMass3x3, for, Cross, WarpedQuadratureEnergies tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f67b10e521588921549e46a4ae49bde140f46022a0aff343b4ce97263808d386 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/hex8_element_test.cpp support@1018-1024 helper/oracle/fixture/include/static assertion 구간: MeanVolumeUnitBrick tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b1b4b6e8408b50361c87580a49c4b608c96d1d0120b7bdaeea6162789efd43d7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/hex8_element_test.cpp support@1213-1213 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/hex8_high_low_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 29개 tests/unit/elements/hex8_high_low_test.cpp file 이관 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 893b48807ff3d9b7cb80069df3cca46787af5dfc366f244c726f4bcadf59b451 892dc78a07a9f7eba27df4cb71e9443359920da45fa7dc5795505d36edf0bc75 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.ScalarCrossProductShortcutMatchesOriginalBits Hex8HighLow.ScalarCrossProductShortcutMatchesOriginalBits; assertion 1개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.ScalarCrossProductShortcutMatchesOriginalBits 유지 원문 검사 body 및 assertion 동일. 55cf32bcacbee69f118d863fd4a1a530ea37fba13ff1262677bdeff80b31ea86 55cf32bcacbee69f118d863fd4a1a530ea37fba13ff1262677bdeff80b31ea86 ASSERT_TRUE(fesa::math_internal::ArithmeticEnvironmentSupported()) ASSERT_TRUE(fesa::math_internal::ArithmeticEnvironmentSupported()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FourColumnMaterialPacketMatchesFrozenScalarBits Hex8HighLow.FourColumnMaterialPacketMatchesFrozenScalarBits; assertion 1개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FourColumnMaterialPacketMatchesFrozenScalarBits 유지 원문 검사 body 및 assertion 동일. 5dc7a0232796a2ce3e86de363e352e790dec6ab6cdbf1ed5890d426ddeb6c530 5dc7a0232796a2ce3e86de363e352e790dec6ab6cdbf1ed5890d426ddeb6c530 ASSERT_TRUE(fesa::math_internal::ArithmeticEnvironmentSupported()) ASSERT_TRUE(fesa::math_internal::ArithmeticEnvironmentSupported()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketSpecialLaneDoesNotChangeOtherColumns Hex8HighLow.PacketSpecialLaneDoesNotChangeOtherColumns; assertion 2개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketSpecialLaneDoesNotChangeOtherColumns 유지 원문 검사 body 및 assertion 동일. 5c7e9b257c3d0da7e9c19cf13dff9c85ea0c6b4c0e9e76eb211e11abc27c6eb7 5c7e9b257c3d0da7e9c19cf13dff9c85ea0c6b4c0e9e76eb211e11abc27c6eb7 EXPECT_EQ(PairBits(actual.values[other].high), PairBits(reference.values[other].high)) | EXPECT_EQ(PairBits(actual.values[other].low), PairBits(reference.values[other].low)) EXPECT_EQ(PairBits(actual.values[other].high), PairBits(reference.values[other].high)) | EXPECT_EQ(PairBits(actual.values[other].low), PairBits(reference.values[other].low)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.UniformDyadicPacketsExerciseEachLowZeroShape Hex8HighLow.UniformDyadicPacketsExerciseEachLowZeroShape; assertion 0개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.UniformDyadicPacketsExerciseEachLowZeroShape 유지 원문 검사 body 및 assertion 동일. d1e86044f93bb17fa63cc65d06c3e8e313d0165fa8199610f68334bc6bdd7ef1 d1e86044f93bb17fa63cc65d06c3e8e313d0165fa8199610f68334bc6bdd7ef1 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.OverflowLaneIsNeutralizedBeforeResidualFma Hex8HighLow.OverflowLaneIsNeutralizedBeforeResidualFma; assertion 6개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.OverflowLaneIsNeutralizedBeforeResidualFma 유지 원문 검사 body 및 assertion 동일. fa110e83b61c2788801a3cca289b80850e2b3147cc1529d01cbe04b376070e8f fa110e83b61c2788801a3cca289b80850e2b3147cc1529d01cbe04b376070e8f ASSERT_EQ(std::fegetenv(&original), 0) | EXPECT_EQ(std::feclearexcept(FE_ALL_EXCEPT), 0) | EXPECT_EQ(std::fesetenv(&original), 0) | EXPECT_FALSE(extra_invalid) | EXPECT_EQ(PairBits(output.values[lane].high), PairBits(expected.values[lane].high)) | EXPECT_EQ(PairBits(output.values[lane].low), PairBits(expected.values[lane].low)) ASSERT_EQ(std::fegetenv(&original), 0) | EXPECT_EQ(std::feclearexcept(FE_ALL_EXCEPT), 0) | EXPECT_EQ(std::fesetenv(&original), 0) | EXPECT_FALSE(extra_invalid) | EXPECT_EQ(PairBits(output.values[lane].high), PairBits(expected.values[lane].high)) | EXPECT_EQ(PairBits(output.values[lane].low), PairBits(expected.values[lane].low)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketVectorGuardsPreserveScalarFlagsAndBits Hex8HighLow.PacketVectorGuardsPreserveScalarFlagsAndBits; assertion 0개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketVectorGuardsPreserveScalarFlagsAndBits 유지 원문 검사 body 및 assertion 동일. a2f4b4a4f4474064091b72b522e841f1d8e00a08b554c31cc15e88ad8d18ec7e a2f4b4a4f4474064091b72b522e841f1d8e00a08b554c31cc15e88ad8d18ec7e 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketTailScreenRetainsExactBoundaryAndFallback Hex8HighLow.PacketTailScreenRetainsExactBoundaryAndFallback; assertion 0개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketTailScreenRetainsExactBoundaryAndFallback 유지 원문 검사 body 및 assertion 동일. 6b884ed1f7b42f80cc7a3fc926f8d6030dd24e04cda644a742b893dd79919a73 6b884ed1f7b42f80cc7a3fc926f8d6030dd24e04cda644a742b893dd79919a73 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketPreservesAsymmetricLanesAndUniformShapes Hex8HighLow.GeometryPacketPreservesAsymmetricLanesAndUniformShapes; assertion 0개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketPreservesAsymmetricLanesAndUniformShapes 유지 원문 검사 body 및 assertion 동일. 2395f87793a733d9bb9c1e91d28698111bd41292bd0bb0512f29b617eaccbda5 2395f87793a733d9bb9c1e91d28698111bd41292bd0bb0512f29b617eaccbda5 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketRetainsSpecialLanesAndExactTailBoundary Hex8HighLow.GeometryPacketRetainsSpecialLanesAndExactTailBoundary; assertion 0개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketRetainsSpecialLanesAndExactTailBoundary 유지 원문 검사 body 및 assertion 동일. bbf49f52b871cb317e6e40a9abe3d9a5ffffef8c38ac97b8f9dd5c24343085bc bbf49f52b871cb317e6e40a9abe3d9a5ffffef8c38ac97b8f9dd5c24343085bc 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketPreservesOrderedOverflowAndPreparedInvalid Hex8HighLow.GeometryPacketPreservesOrderedOverflowAndPreparedInvalid; assertion 0개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketPreservesOrderedOverflowAndPreparedInvalid 유지 원문 검사 body 및 assertion 동일. 7f945200a866e442db527cd8753d4f5b12474c018d4d3a00898dd640557a2414 7f945200a866e442db527cd8753d4f5b12474c018d4d3a00898dd640557a2414 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketSumFallbackPreservesNearMaxAndSubnormalStatus Hex8HighLow.GeometryPacketSumFallbackPreservesNearMaxAndSubnormalStatus; assertion 0개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryPacketSumFallbackPreservesNearMaxAndSubnormalStatus 유지 원문 검사 body 및 assertion 동일. 0f9f52e106a3cd6720a68eda098651b0d42c3cbeeec05ed9c99364fc598aac5f 0f9f52e106a3cd6720a68eda098651b0d42c3cbeeec05ed9c99364fc598aac5f 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketBackendSelectionRecoversAfterEnvironmentRestoration Hex8HighLow.PacketBackendSelectionRecoversAfterEnvironmentRestoration; assertion 6개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketBackendSelectionRecoversAfterEnvironmentRestoration 유지 원문 검사 body 및 assertion 동일. ca5ac348923812cc8155de59df806b241a163cf53120abc8b9123be07804485a ca5ac348923812cc8155de59df806b241a163cf53120abc8b9123be07804485a ASSERT_EQ(std::fesetround(FE_UPWARD), 0) | EXPECT_EQ(fesa::hex8_internal::SelectMaterialPacketEvaluator(), fesa::hex8_internal::EvaluateMaterialPacketScalar) | EXPECT_EQ(std::fesetround(rounding), 0) | EXPECT_EQ(fesa::hex8_internal::SelectMaterialPacketEvaluator(), fesa::hex8_internal::EvaluateMaterialPacketScalar) | EXPECT_EQ(unmasked, fesa::hex8_internal::EvaluateMaterialPacketScalar) | EXPECT_EQ(fesa::hex8_internal::SelectMaterialPacketEvaluator(), initial) ASSERT_EQ(std::fesetround(FE_UPWARD), 0) | EXPECT_EQ(fesa::hex8_internal::SelectMaterialPacketEvaluator(), fesa::hex8_internal::EvaluateMaterialPacketScalar) | EXPECT_EQ(std::fesetround(rounding), 0) | EXPECT_EQ(fesa::hex8_internal::SelectMaterialPacketEvaluator(), fesa::hex8_internal::EvaluateMaterialPacketScalar) | EXPECT_EQ(unmasked, fesa::hex8_internal::EvaluateMaterialPacketScalar) | EXPECT_EQ(fesa::hex8_internal::SelectMaterialPacketEvaluator(), initial) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketScalarBridgesPreserveOriginalRawBits Hex8HighLow.PacketScalarBridgesPreserveOriginalRawBits; assertion 2개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketScalarBridgesPreserveOriginalRawBits 이관 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 1ceef74682e95486cba3564337e7c84d2aac4904a79013990da0f4ee61e20c07 1b19b2a6133828f658e5ba8b711792eed69c5274e80798ed055151b6261dcfac EXPECT_EQ(PairBits(result.values[lane].high), PairBits(expected.high)) | EXPECT_EQ(PairBits(result.values[lane].low), PairBits(expected.low)) EXPECT_EQ(PairBits(result.values[lane].high), PairBits(expected.high)) | EXPECT_EQ(PairBits(result.values[lane].low), PairBits(expected.low)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketCapabilityRejectsMissingIntegerIsaAndOsState Hex8HighLow.PacketCapabilityRejectsMissingIntegerIsaAndOsState; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketCapabilityRejectsMissingIntegerIsaAndOsState 유지 원문 검사 body 및 assertion 동일. 362080c019526bea600c5658aa6deb15e68d159828fff53ddaa9677dc40b6995 362080c019526bea600c5658aa6deb15e68d159828fff53ddaa9677dc40b6995 EXPECT_TRUE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1, 6, leaf7)) | EXPECT_FALSE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1, 6, leaf7 & ~missing)) | EXPECT_FALSE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1 & ~missing, 6, leaf7)) | EXPECT_FALSE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1, state, leaf7)) EXPECT_TRUE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1, 6, leaf7)) | EXPECT_FALSE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1, 6, leaf7 & ~missing)) | EXPECT_FALSE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1 & ~missing, 6, leaf7)) | EXPECT_FALSE(fesa::hex8_internal::SupportsMaterialPacketInstructions( leaf1, state, leaf7)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketDoesNotClearPriorMaskedStickyFlags Hex8HighLow.PacketDoesNotClearPriorMaskedStickyFlags; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.PacketDoesNotClearPriorMaskedStickyFlags 유지 원문 검사 body 및 assertion 동일. d5aaf2d448b2510d15df5fba26ce1d668f2acd6e376fae86de30152fad3c84fb d5aaf2d448b2510d15df5fba26ce1d668f2acd6e376fae86de30152fad3c84fb ASSERT_EQ(std::fegetenv(&original), 0) | ASSERT_EQ(std::feraiseexcept(FE_INEXACT), 0) | EXPECT_EQ(std::fesetenv(&original), 0) | EXPECT_TRUE(preserved) ASSERT_EQ(std::fegetenv(&original), 0) | ASSERT_EQ(std::feraiseexcept(FE_INEXACT), 0) | EXPECT_EQ(std::fesetenv(&original), 0) | EXPECT_TRUE(preserved) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.ConcurrentFirstLinearTrialsAcrossCopiesAndMoveKeepBits Hex8HighLow.ConcurrentFirstLinearTrialsAcrossCopiesAndMoveKeepBits; assertion 3개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.ConcurrentFirstLinearTrialsAcrossCopiesAndMoveKeepBits 유지 원문 검사 body 및 assertion 동일. eb9b491edb65e3a3636501ffd6387f89c1b901fafd5161134cdb173f1ee7ce75 eb9b491edb65e3a3636501ffd6387f89c1b901fafd5161134cdb173f1ee7ce75 ASSERT_TRUE(expected_a.HasValue()) | ASSERT_TRUE(expected_b.HasValue()) | ASSERT_TRUE(response.HasValue()) ASSERT_TRUE(expected_a.HasValue()) | ASSERT_TRUE(expected_b.HasValue()) | ASSERT_TRUE(response.HasValue()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FirstLinearPreparationRecoversAfterTrialAndEnvironmentFailure Hex8HighLow.FirstLinearPreparationRecoversAfterTrialAndEnvironmentFailure; assertion 11개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FirstLinearPreparationRecoversAfterTrialAndEnvironmentFailure 유지 원문 검사 body 및 assertion 동일. c102c1858835db4be00cdeaa1bcba9ef309197723b06d916da051736e9dc5b34 c102c1858835db4be00cdeaa1bcba9ef309197723b06d916da051736e9dc5b34 "ASSERT_TRUE(fesa::math_internal::ArithmeticEnvironmentSupported()) | EXPECT_FALSE(element.EvaluateLinearHighLow(fesa::Vector(23), low).HasValue()) | EXPECT_FALSE(element.EvaluateLinearHighLow(high, low).HasValue()) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | ASSERT_FALSE(bad_environment.HasValue()) | EXPECT_EQ(bad_environment.GetStatus().Diagnostics()[0].message, ""Hex8 high+low requires nearest rounding and gradual underflow."") | ASSERT_EQ(std::fesetround(FE_TONEAREST), 0) | EXPECT_FALSE(element.EvaluateLinearHighLow(high, low).HasValue()) | ASSERT_TRUE(recovered.HasValue()) | EXPECT_FALSE(element.EvaluateLinearHighLow(high, low).HasValue()) | ASSERT_TRUE(after_failure.HasValue())" "ASSERT_TRUE(fesa::math_internal::ArithmeticEnvironmentSupported()) | EXPECT_FALSE(element.EvaluateLinearHighLow(fesa::Vector(23), low).HasValue()) | EXPECT_FALSE(element.EvaluateLinearHighLow(high, low).HasValue()) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | ASSERT_FALSE(bad_environment.HasValue()) | EXPECT_EQ(bad_environment.GetStatus().Diagnostics()[0].message, ""Hex8 high+low requires nearest rounding and gradual underflow."") | ASSERT_EQ(std::fesetround(FE_TONEAREST), 0) | EXPECT_FALSE(element.EvaluateLinearHighLow(high, low).HasValue()) | ASSERT_TRUE(recovered.HasValue()) | EXPECT_FALSE(element.EvaluateLinearHighLow(high, low).HasValue()) | ASSERT_TRUE(after_failure.HasValue())" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LowOnlyAffineStrainSurvivesUniformHighTranslation Hex8HighLow.LowOnlyAffineStrainSurvivesUniformHighTranslation; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LowOnlyAffineStrainSurvivesUniformHighTranslation 유지 원문 검사 body 및 assertion 동일. 4462f0b7416fafcfad45c7261d11b2ac9efd9b84ecc8174f859764ab23039b7c 4462f0b7416fafcfad45c7261d11b2ac9efd9b84ecc8174f859764ab23039b7c ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().high.internal_force[3 * a], (positive ? 3 : -3) * strain, 1e-13 * strain) | EXPECT_NEAR(response.Value().high.strain_energy, 6 * strain * strain, 1e-13 * strain * strain) | EXPECT_NEAR(row.strain[0], strain, 1e-13 * strain) ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().high.internal_force[3 * a], (positive ? 3 : -3) * strain, 1e-13 * strain) | EXPECT_NEAR(response.Value().high.strain_energy, 6 * strain * strain, 1e-13 * strain * strain) | EXPECT_NEAR(row.strain[0], strain, 1e-13 * strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NonlinearLowGradientProducesSecondOrderForce Hex8HighLow.NonlinearLowGradientProducesSecondOrderForce; assertion 3개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NonlinearLowGradientProducesSecondOrderForce 유지 원문 검사 body 및 assertion 동일. 979f0ef23c5f1008caa390d90e6009aa9a5d31c011169ea1b43a67f5f15da557 979f0ef23c5f1008caa390d90e6009aa9a5d31c011169ea1b43a67f5f15da557 ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(increment.high, 4.5 * strain * strain, 1e-12 * strain * strain) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(increment.high, 4.5 * strain * strain, 1e-12 * strain * strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.VolumetricAndTransverseTermsRetainLowStrain Hex8HighLow.VolumetricAndTransverseTermsRetainLowStrain; assertion 6개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.VolumetricAndTransverseTermsRetainLowStrain 유지 원문 검사 body 및 assertion 동일. 846ec5c0b418ef7ec32bb21ce63c53f4d186afbf40d8c37be769ff45ab8f108e 846ec5c0b418ef7ec32bb21ce63c53f4d186afbf40d8c37be769ff45ab8f108e ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(linear.Value().high.internal_force[3], 3.6*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.internal_force[7], 1.2*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.strain_energy, 7.2*strain*strain, 1e-13*strain*strain) | EXPECT_NEAR(quadratic.high, 5.4*strain*strain, 1e-12*strain*strain) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(linear.Value().high.internal_force[3], 3.6*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.internal_force[7], 1.2*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.strain_energy, 7.2*strain*strain, 1e-13*strain*strain) | EXPECT_NEAR(quadratic.high, 5.4*strain*strain, 1e-12*strain*strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.RejectsInvalidLowShapeAndOverlappingComponents Hex8HighLow.RejectsInvalidLowShapeAndOverlappingComponents; assertion 2개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.RejectsInvalidLowShapeAndOverlappingComponents 유지 원문 검사 body 및 assertion 동일. 7abccdcb75d007db4ef2421719b99cb7e5330d25e5d05d2da511b098a2428848 7abccdcb75d007db4ef2421719b99cb7e5330d25e5d05d2da511b098a2428848 EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | EXPECT_FALSE(brick.EvaluateNonlinearHighLow(high, low).HasValue()) EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | EXPECT_FALSE(brick.EvaluateNonlinearHighLow(high, low).HasValue()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LinearAndNonlinearZeroStateHaveSameFullHessian Hex8HighLow.LinearAndNonlinearZeroStateHaveSameFullHessian; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LinearAndNonlinearZeroStateHaveSameFullHessian 유지 원문 검사 body 및 assertion 동일. e2079fe27aab893fafc1428c6fd97d975eddd067ca1131589425cc569ece3958 e2079fe27aab893fafc1428c6fd97d975eddd067ca1131589425cc569ece3958 ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_EQ(linear.Value().high.tangent(i, j), nonlinear.Value().high.tangent(i, j)) | EXPECT_EQ(linear.Value().tangent_low(i, j), nonlinear.Value().tangent_low(i, j)) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_EQ(linear.Value().high.tangent(i, j), nonlinear.Value().high.tangent(i, j)) | EXPECT_EQ(linear.Value().tangent_low(i, j), nonlinear.Value().tangent_low(i, j)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CachedLinearHessianIsIndependentOfTrialAndPriorFailure Hex8HighLow.CachedLinearHessianIsIndependentOfTrialAndPriorFailure; assertion 8개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CachedLinearHessianIsIndependentOfTrialAndPriorFailure 유지 원문 검사 body 및 assertion 동일. 046984e4a0f5d6ab548fdef7ea0980b866ff34cbeb603b918c9b1adb76ae7935 046984e4a0f5d6ab548fdef7ea0980b866ff34cbeb603b918c9b1adb76ae7935 ASSERT_TRUE(reference.HasValue()) | EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | ASSERT_TRUE(strained.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), strained.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), strained.Value().tangent_low(i,j)) | ASSERT_TRUE(nonlinear_zero.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), nonlinear_zero.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), nonlinear_zero.Value().tangent_low(i,j)) ASSERT_TRUE(reference.HasValue()) | EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | ASSERT_TRUE(strained.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), strained.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), strained.Value().tangent_low(i,j)) | ASSERT_TRUE(nonlinear_zero.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), nonlinear_zero.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), nonlinear_zero.Value().tangent_low(i,j)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CoupledBricksTransmitLowStrainAcrossSharedFace Hex8HighLow.CoupledBricksTransmitLowStrainAcrossSharedFace; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CoupledBricksTransmitLowStrainAcrossSharedFace 유지 원문 검사 body 및 assertion 동일. 83ae6a75481955497b50ac6ac1eff98c37df884ba2ed66da2557210deefa72a2 83ae6a75481955497b50ac6ac1eff98c37df884ba2ed66da2557210deefa72a2 ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(assembled.high, 0, 1e-13 * strain) | EXPECT_NEAR(l.Value().high.strain_energy + r.Value().high.strain_energy, 12 * strain * strain, 1e-13 * strain * strain) ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(assembled.high, 0, 1e-13 * strain) | EXPECT_NEAR(l.Value().high.strain_energy + r.Value().high.strain_energy, 12 * strain * strain, 1e-13 * strain * strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NodeZeroSignedDirectionMatchesForceAndEnergyDerivatives Hex8HighLow.NodeZeroSignedDirectionMatchesForceAndEnergyDerivatives; assertion 5개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NodeZeroSignedDirectionMatchesForceAndEnergyDerivatives 유지 원문 검사 body 및 assertion 동일. 8ca0e0b8462f489c123d6d5a32a0ae42c56b897b155459e2e7c55dfa8c030d0d 8ca0e0b8462f489c123d6d5a32a0ae42c56b897b155459e2e7c55dfa8c030d0d ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_LE(std::abs(error.high), 1e-25) | EXPECT_LE(std::abs(energy_error.high), 32 * step * step + 1e-44) ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_LE(std::abs(error.high), 1e-25) | EXPECT_LE(std::abs(energy_error.high), 32 * step * step + 1e-44) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryCertificateIncludesLowOnlyCurrentCellWidth Hex8HighLow.GeometryCertificateIncludesLowOnlyCurrentCellWidth; assertion 3개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryCertificateIncludesLowOnlyCurrentCellWidth 유지 원문 검사 body 및 assertion 동일. a99f71b85735e03d5245e265d4b95f2b624f4b5475c1f1ff15ea665e18c72c4d a99f71b85735e03d5245e265d4b95f2b624f4b5475c1f1ff15ea665e18c72c4d EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &positive_low), Certificate::kPositive) | EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &negative_low), Certificate::kNonpositive) | EXPECT_NE(fesa::hex8_internal::Certify(coordinates, &high), Certificate::kPositive) EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &positive_low), Certificate::kPositive) | EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &negative_low), Certificate::kNonpositive) | EXPECT_NE(fesa::hex8_internal::Certify(coordinates, &high), Certificate::kPositive) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.SignedZeroMaterialCoefficientHasIdenticalResponse Hex8HighLow.SignedZeroMaterialCoefficientHasIdenticalResponse; assertion 8개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.SignedZeroMaterialCoefficientHasIdenticalResponse 유지 원문 검사 body 및 assertion 동일. 3972742ed5e27b3dd1f33a5c2fb9a603b32972c71c7ecb8dd341b9c76d18d3d3 3972742ed5e27b3dd1f33a5c2fb9a603b32972c71c7ecb8dd341b9c76d18d3d3 ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_EQ(p.Value().high.strain_energy, n.Value().high.strain_energy) | EXPECT_EQ(p.Value().strain_energy_low, n.Value().strain_energy_low) | EXPECT_EQ(p.Value().high.internal_force[i], n.Value().high.internal_force[i]) | EXPECT_EQ(p.Value().internal_force_low[i], n.Value().internal_force_low[i]) | EXPECT_EQ(p.Value().high.tangent(i,j), n.Value().high.tangent(i,j)) | EXPECT_EQ(p.Value().tangent_low(i,j), n.Value().tangent_low(i,j)) ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_EQ(p.Value().high.strain_energy, n.Value().high.strain_energy) | EXPECT_EQ(p.Value().strain_energy_low, n.Value().strain_energy_low) | EXPECT_EQ(p.Value().high.internal_force[i], n.Value().high.internal_force[i]) | EXPECT_EQ(p.Value().internal_force_low[i], n.Value().internal_force_low[i]) | EXPECT_EQ(p.Value().high.tangent(i,j), n.Value().high.tangent(i,j)) | EXPECT_EQ(p.Value().tangent_low(i,j), n.Value().tangent_low(i,j)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FiniteRotationRetainsTinyShearForceCovariance Hex8HighLow.FiniteRotationRetainsTinyShearForceCovariance; assertion 7개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FiniteRotationRetainsTinyShearForceCovariance 유지 원문 검사 body 및 assertion 동일. 397b230944498c7db14592dc4408d7fbdee0199b43be2c7b4d7e68dda9cb08e9 397b230944498c7db14592dc4408d7fbdee0199b43be2c7b4d7e68dda9cb08e9 ASSERT_TRUE(origin.HasValue()) | ASSERT_TRUE(deformed.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(turned_deformed.HasValue()) | EXPECT_LE(std::abs(Add(rotated[0], baseline[1]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[1], baseline[0]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[2], baseline[2]).high), 1e-13*gamma) ASSERT_TRUE(origin.HasValue()) | ASSERT_TRUE(deformed.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(turned_deformed.HasValue()) | EXPECT_LE(std::abs(Add(rotated[0], baseline[1]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[1], baseline[0]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[2], baseline[2]).high), 1e-13*gamma) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.MeanVolumeLowOnlyNonuniformTraceRetainsMeanAndCrossPointHessian Hex8HighLow.MeanVolumeLowOnlyNonuniformTraceRetainsMeanAndCrossPointHessian; assertion 11개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.MeanVolumeLowOnlyNonuniformTraceRetainsMeanAndCrossPointHessian 유지 원문 검사 body 및 assertion 동일. 45ace4ab87c97eeeb71c680d4cd90bdc4d0b2438c4335b7539a7207529d171fb 45ace4ab87c97eeeb71c680d4cd90bdc4d0b2438c4335b7539a7207529d171fb ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(response.Value().high.strain_energy, coefficient * c * c, 1e-13 * c * c) | EXPECT_NEAR(response.Value().high.internal_force[6] + response.Value().high.internal_force[18], 2 * coefficient * c, 1e-13 * c) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 4 * c, 1e-13 * c) | EXPECT_NEAR(point.strain[0], c * point.reference_coordinates[1], 1e-13 * c) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(cubic_energy.high, (5 * 4.8 / 18 + 8.0 / 6) * c * c * c, 1e-12 * c * c * c) ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(response.Value().high.strain_energy, coefficient * c * c, 1e-13 * c * c) | EXPECT_NEAR(response.Value().high.internal_force[6] + response.Value().high.internal_force[18], 2 * coefficient * c, 1e-13 * c) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 4 * c, 1e-13 * c) | EXPECT_NEAR(point.strain[0], c * point.reference_coordinates[1], 1e-13 * c) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(cubic_energy.high, (5 * 4.8 / 18 + 8.0 / 6) * c * c * c, 1e-12 * c * c * c) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp support@1-48 helper/oracle/fixture/include/static assertion 구간: PairBits, ExpectOriginalProduct tests/unit/elements/hex8_high_low_test.cpp file-support 이관 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 7f7cee402cbc1858b86c84652f94d6c61d0eda418d18a14b11a48648d4a6d113 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp support@88-134 helper/oracle/fixture/include/static assertion 구간: RawPacketPair, FrozenMaterialPacket, ExpectFrozenMaterialPacket tests/unit/elements/hex8_high_low_test.cpp file-support 유지 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 570a3f41b0e56e284d6df12b9caa91c67db80930b93a760d2dffd69b36206c50 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp support@311-374 helper/oracle/fixture/include/static assertion 구간: ExpectPacketFlagsAndBits, Observation, if, DyadicPacketFixture tests/unit/elements/hex8_high_low_test.cpp file-support 유지 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 8cef855736ef4113f6c3b606128ed22c9a39c1faa08365b7d5eecb0b5784fbea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp support@450-581 helper/oracle/fixture/include/static assertion 구간: defined, GeometryDyadicFixture, ExpectGeometryPacketBitsAndFlags, Observation, if tests/unit/elements/hex8_high_low_test.cpp file-support 이관 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 2645f04d5bdda6cb2c861a8d1ac8aa209aa28cfbeb3a7da99b82ce21225296e4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp support@740-741 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/hex8_high_low_test.cpp file-support 유지 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 8b63d4e2e6cce4baf5403993210754bed64f3d3fa8e57007f2c3eeff4491a972 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp support@837-884 helper/oracle/fixture/include/static assertion 구간: UnitBrick, ExpectSamePairResponse tests/unit/elements/hex8_high_low_test.cpp file-support 유지 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. ece3a979ef74489bbfd5deb8abf98a643af66e310ec44820453056f10d4b6549 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/hex8_high_low_test.cpp support@1267-1267 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/hex8_high_low_test.cpp file-support 유지 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1fd73892c2678a5b3ad8fd34edd0292394836a3494c540f4ecc005b6e6a269d9 1fd73892c2678a5b3ad8fd34edd0292394836a3494c540f4ecc005b6e6a269d9 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.PreservesWarpedMomentsRowsAndFirstSpatialMoment Mitc4ShellMassContract.PreservesWarpedMomentsRowsAndFirstSpatialMoment; assertion 4개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.PreservesWarpedMomentsRowsAndFirstSpatialMoment 유지 원문 검사 body 및 assertion 동일. 76f7825ab0d079445fad2d14b91e7d6e835a997d5299706cb5cdc7c05a968c14 76f7825ab0d079445fad2d14b91e7d6e835a997d5299706cb5cdc7c05a968c14 ASSERT_TRUE(mass.HasValue()) | EXPECT_LE(std::abs(value.consistent_moments[moment](row, column) - expected[moment][row][column]) / scale, 1e-12) | EXPECT_LE(std::abs(value.nodal_moments[row][moment] - expected_row) / scale, 1e-12) | EXPECT_LE(difference / (element_mass * std::hypot(2.0, 0.3)), 1e-12) ASSERT_TRUE(mass.HasValue()) | EXPECT_LE(std::abs(value.consistent_moments[moment](row, column) - expected[moment][row][column]) / scale, 1e-12) | EXPECT_LE(std::abs(value.nodal_moments[row][moment] - expected_row) / scale, 1e-12) | EXPECT_LE(difference / (element_mass * std::hypot(2.0, 0.3)), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.RecomputesWarpedMassWithScaledCovariance Mitc4ShellMassContract.RecomputesWarpedMassWithScaledCovariance; assertion 4개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.RecomputesWarpedMassWithScaledCovariance 유지 원문 검사 body 및 assertion 동일. e3e985596112fdd2ba30d9c9f0721d183914e4c7e3e4bb4ae11cd9f32b820991 e3e985596112fdd2ba30d9c9f0721d183914e4c7e3e4bb4ae11cd9f32b820991 ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(transformed_mass.HasValue()) ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(transformed_mass.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.SatisfiesUniformAndJensenEnergyContracts Mitc4ShellMassContract.SatisfiesUniformAndJensenEnergyContracts; assertion 3개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.SatisfiesUniformAndJensenEnergyContracts 유지 원문 검사 body 및 assertion 동일. 4ca13bda8eeda1a740d91e0eca5b06c177bff1348c4c2aae9fb7cd28c36fa25b 4ca13bda8eeda1a740d91e0eca5b06c177bff1348c4c2aae9fb7cd28c36fa25b ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(Quadratic(mass.Value().consistent_global24, translation), Quadratic(mass.Value().lumped_global24, translation), 1e-12) | EXPECT_GE(Quadratic(mass.Value().lumped_global24, field) + 1e-12, Quadratic(mass.Value().consistent_global24, field)) ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(Quadratic(mass.Value().consistent_global24, translation), Quadratic(mass.Value().lumped_global24, translation), 1e-12) | EXPECT_GE(Quadratic(mass.Value().lumped_global24, field) + 1e-12, Quadratic(mass.Value().consistent_global24, field)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.MapsScalarMomentsIntoBothMassBlocks Mitc4ShellMassContract.MapsScalarMomentsIntoBothMassBlocks; assertion 6개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.MapsScalarMomentsIntoBothMassBlocks 유지 원문 검사 body 및 assertion 동일. c3f3d3fcbbb356610124a670ed3e56e053f742c3150650dc3d0690b8a081e44f c3f3d3fcbbb356610124a670ed3e56e053f742c3150650dc3d0690b8a081e44f ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(mass.Value().consistent_global24(row, column), expected_consistent(row, column), 1e-12) | EXPECT_NEAR(mass.Value().lumped_global24(row, column), expected_lumped(row, column), 1e-12) | EXPECT_LE(FrobeniusNorm(consistent_difference, length) / (FrobeniusNorm(mass.Value().consistent_global24, length) + FrobeniusNorm(expected_consistent, length)), 1e-12) | EXPECT_LE(FrobeniusNorm(lumped_difference, length) / (FrobeniusNorm(mass.Value().lumped_global24, length) + FrobeniusNorm(expected_lumped, length)), 1e-12) | EXPECT_LE(std::abs((lumped_work - consistent_work) - pairwise_work) / (lumped_work + consistent_work), 1e-12) ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(mass.Value().consistent_global24(row, column), expected_consistent(row, column), 1e-12) | EXPECT_NEAR(mass.Value().lumped_global24(row, column), expected_lumped(row, column), 1e-12) | EXPECT_LE(FrobeniusNorm(consistent_difference, length) / (FrobeniusNorm(mass.Value().consistent_global24, length) + FrobeniusNorm(expected_consistent, length)), 1e-12) | EXPECT_LE(FrobeniusNorm(lumped_difference, length) / (FrobeniusNorm(mass.Value().lumped_global24, length) + FrobeniusNorm(expected_lumped, length)), 1e-12) | EXPECT_LE(std::abs((lumped_work - consistent_work) - pairwise_work) / (lumped_work + consistent_work), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.ReproducesAffineSquareVelocityWork Mitc4ShellMassContract.ReproducesAffineSquareVelocityWork; assertion 4개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.ReproducesAffineSquareVelocityWork 유지 원문 검사 body 및 assertion 동일. 7f75a86e005eff60d026f8d15ee5cae2fa95e0ee4232fca201dcb8f8f81df18c 7f75a86e005eff60d026f8d15ee5cae2fa95e0ee4232fca201dcb8f8f81df18c ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(consistent_work, 4.0 / 3.0, 1e-12) | EXPECT_NEAR(lumped_work - consistent_work, 8.0 / (3.0 * mesh * mesh), 1e-12) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(consistent_work, 4.0 / 3.0, 1e-12) | EXPECT_NEAR(lumped_work - consistent_work, 8.0 / (3.0 * mesh * mesh), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@1-130 helper/oracle/fixture/include/static assertion 구간: FrobeniusNorm, MaximumEdgeLength, Rotate, DirectorCross, Dot, RotateCongruently, ExpectScaledCovariance, Node, Pointers, WarpedShell, Quadratic tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 80222550f9438f2e2e97eef70b77702be0f22f69e5dfd86f3f5f19eea8635684 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@207-208 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 47dd2fa44f91e342b907e45fa1b98a8b620d5590812aea5a8d5b7ceda6534e82 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@244-246 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 82c1f775b61eb1c42b39d952b6856edb28d0334faf8544d19199125c6142efa5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@263-265 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 311a3ce7805d89cc36a6c5dc4f988aad66e9d65c53bd7fc5dae1c90f7731d0ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@399-400 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 86832b878d6de5792a69735ed18cbdf64bf5f90afdd3d773d77424b25242a7f6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@435-436 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 20개 tests/unit/elements/mitc4_shell_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 690b9a24e116e86b67d26c75d76305c766aeaf2835fb1c040ba1cae247734f31 0099c4e8370d63a61cdf37604008ecc5ff2dc96461b678052febd0a2fa248aa8 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities; assertion 5개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities 유지 원문 검사 body 및 assertion 동일. ce0d5d609ea4e2f0467991262a26eecb2e3dfe8f67b77325353db454953dfaf3 ce0d5d609ea4e2f0467991262a26eecb2e3dfe8f67b77325353db454953dfaf3 EXPECT_DOUBLE_EQ(shape.values[node_index], point == node_index ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(value_sum, 1.0) | EXPECT_DOUBLE_EQ(xi_derivative_sum, 0.0) | EXPECT_DOUBLE_EQ(eta_derivative_sum, 0.0) | EXPECT_EQ(shape.values, (std::array{0.28125, 0.46875, 0.15625, 0.09375})) EXPECT_DOUBLE_EQ(shape.values[node_index], point == node_index ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(value_sum, 1.0) | EXPECT_DOUBLE_EQ(xi_derivative_sum, 0.0) | EXPECT_DOUBLE_EQ(eta_derivative_sum, 0.0) | EXPECT_EQ(shape.values, (std::array{0.28125, 0.46875, 0.15625, 0.09375})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps; assertion 13개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps 유지 원문 검사 body 및 assertion 동일. a48c1e71779c07d794a93e7fb032fe851a7b6250798b500c11394d304eea2c51 a48c1e71779c07d794a93e7fb032fe851a7b6250798b500c11394d304eea2c51 ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(physical.Rows(), 20U) | ASSERT_EQ(physical.Columns(), 24U) | ASSERT_EQ(drilling.Rows(), 4U) | ASSERT_EQ(drilling.Columns(), 24U) | EXPECT_DOUBLE_EQ( physical(physical_offset + component, global_offset + component), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_offset + 4U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_offset + 5U), 1.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_offset + 3U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_dof), 0.0) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), invalid_directors, Section(), Material()) .HasValue()) ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(physical.Rows(), 20U) | ASSERT_EQ(physical.Columns(), 24U) | ASSERT_EQ(drilling.Rows(), 4U) | ASSERT_EQ(drilling.Columns(), 24U) | EXPECT_DOUBLE_EQ( physical(physical_offset + component, global_offset + component), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_offset + 4U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_offset + 5U), 1.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_offset + 3U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_dof), 0.0) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), invalid_directors, Section(), Material()) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples; assertion 37개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples 유지 원문 검사 body 및 assertion 동일. 96cbc6952413ebb1639c3743d6825a4b80c52b4c450d79ccddd004e64fa816c6 96cbc6952413ebb1639c3743d6825a4b80c52b4c450d79ccddd004e64fa816c6 ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(direct.Rows(), 5U) | ASSERT_EQ(direct.Columns(), 20U) | EXPECT_DOUBLE_EQ(direct(0U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(0U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(1U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(1U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(3U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(3U, 4U), 0.25) | EXPECT_DOUBLE_EQ(direct(4U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(4U, 3U), -0.25) | ASSERT_EQ(samples.Rows(), 4U) | ASSERT_EQ(samples.Columns(), 20U) | EXPECT_DOUBLE_EQ(samples(0U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(0U, 4U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 7U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 9U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 14U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 17U), -0.25) | EXPECT_DOUBLE_EQ(samples(1U, 19U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 3U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 17U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 18U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 7U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 8U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(3U, 13U), -0.25) | EXPECT_EQ(weights.xi_zeta, (std::array{0.75, 0.25})) | EXPECT_EQ(weights.eta_zeta, (std::array{0.375, 0.625})) | EXPECT_DOUBLE_EQ(tied(3U, 4U), 2.0 * (0.5 * samples(0U, 4U) + 0.5 * samples(1U, 4U))) | EXPECT_DOUBLE_EQ(tied(4U, 3U), 2.0 * (0.5 * samples(2U, 3U) + 0.5 * samples(3U, 3U))) ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(direct.Rows(), 5U) | ASSERT_EQ(direct.Columns(), 20U) | EXPECT_DOUBLE_EQ(direct(0U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(0U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(1U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(1U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(3U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(3U, 4U), 0.25) | EXPECT_DOUBLE_EQ(direct(4U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(4U, 3U), -0.25) | ASSERT_EQ(samples.Rows(), 4U) | ASSERT_EQ(samples.Columns(), 20U) | EXPECT_DOUBLE_EQ(samples(0U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(0U, 4U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 7U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 9U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 14U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 17U), -0.25) | EXPECT_DOUBLE_EQ(samples(1U, 19U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 3U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 17U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 18U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 7U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 8U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(3U, 13U), -0.25) | EXPECT_EQ(weights.xi_zeta, (std::array{0.75, 0.25})) | EXPECT_EQ(weights.eta_zeta, (std::array{0.375, 0.625})) | EXPECT_DOUBLE_EQ(tied(3U, 4U), 2.0 * (0.5 * samples(0U, 4U) + 0.5 * samples(1U, 4U))) | EXPECT_DOUBLE_EQ(tied(4U, 3U), 2.0 * (0.5 * samples(2U, 3U) + 0.5 * samples(3U, 3U))) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits; assertion 25개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits 유지 원문 검사 body 및 assertion 동일. cafb3bc50695fe76a6a088a21953389aedb24938d4af5236ad5e1907069eef70 cafb3bc50695fe76a6a088a21953389aedb24938d4af5236ad5e1907069eef70 ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(cps.Rows(), 3U) | EXPECT_EQ(cps.Columns(), 3U) | EXPECT_EQ(c5.Rows(), 5U) | EXPECT_EQ(c5.Columns(), 5U) | EXPECT_EQ(a.Rows(), 3U) | EXPECT_EQ(d.Rows(), 3U) | EXPECT_EQ(as.Rows(), 2U) | EXPECT_DOUBLE_EQ(cps(0U, 0U), 128.0) | EXPECT_DOUBLE_EQ(cps(0U, 1U), 32.0) | EXPECT_DOUBLE_EQ(cps(2U, 2U), 48.0) | EXPECT_DOUBLE_EQ(c5(3U, 3U), 40.0) | EXPECT_DOUBLE_EQ(c5(4U, 4U), 40.0) | EXPECT_DOUBLE_EQ(a(0U, 0U), 256.0) | EXPECT_NEAR(d(0U, 0U), 256.0 / 3.0, 1.0e-12) | EXPECT_DOUBLE_EQ(as(0U, 0U), 80.0) | EXPECT_TRUE(HasPositiveCholeskyPivots(cps)) | EXPECT_TRUE(HasPositiveCholeskyPivots(c5)) | EXPECT_TRUE(HasPositiveCholeskyPivots(a)) | EXPECT_TRUE(HasPositiveCholeskyPivots(d)) | EXPECT_TRUE(HasPositiveCholeskyPivots(as)) | ASSERT_TRUE(scaled_candidate.HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(0.0), Material()) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(0.0, 0.25)) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(120.0, 0.5)) .HasValue()) ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(cps.Rows(), 3U) | EXPECT_EQ(cps.Columns(), 3U) | EXPECT_EQ(c5.Rows(), 5U) | EXPECT_EQ(c5.Columns(), 5U) | EXPECT_EQ(a.Rows(), 3U) | EXPECT_EQ(d.Rows(), 3U) | EXPECT_EQ(as.Rows(), 2U) | EXPECT_DOUBLE_EQ(cps(0U, 0U), 128.0) | EXPECT_DOUBLE_EQ(cps(0U, 1U), 32.0) | EXPECT_DOUBLE_EQ(cps(2U, 2U), 48.0) | EXPECT_DOUBLE_EQ(c5(3U, 3U), 40.0) | EXPECT_DOUBLE_EQ(c5(4U, 4U), 40.0) | EXPECT_DOUBLE_EQ(a(0U, 0U), 256.0) | EXPECT_NEAR(d(0U, 0U), 256.0 / 3.0, 1.0e-12) | EXPECT_DOUBLE_EQ(as(0U, 0U), 80.0) | EXPECT_TRUE(HasPositiveCholeskyPivots(cps)) | EXPECT_TRUE(HasPositiveCholeskyPivots(c5)) | EXPECT_TRUE(HasPositiveCholeskyPivots(a)) | EXPECT_TRUE(HasPositiveCholeskyPivots(d)) | EXPECT_TRUE(HasPositiveCholeskyPivots(as)) | ASSERT_TRUE(scaled_candidate.HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(0.0), Material()) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(0.0, 0.25)) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(120.0, 0.5)) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder; assertion 3개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder 유지 원문 검사 body 및 assertion 동일. 65e8535a920578bf82342d17de948fc260aa98d66b9a261545430700d7c0a54b 65e8535a920578bf82342d17de948fc260aa98d66b9a261545430700d7c0a54b ASSERT_EQ(points.size(), 8U) | EXPECT_EQ(points[point].natural_coordinates, expected[point]) | EXPECT_DOUBLE_EQ(points[point].weight, 1.0) ASSERT_EQ(points.size(), 8U) | EXPECT_EQ(points[point].natural_coordinates, expected[point]) | EXPECT_DOUBLE_EQ(points[point].weight, 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness; assertion 14개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness 유지 원문 검사 body 및 assertion 동일. e0c10c61702d95893fa0b05caff80fba991b5bc41ac9085dc477e5b1e1a37a07 e0c10c61702d95893fa0b05caff80fba991b5bc41ac9085dc477e5b1e1a37a07 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(stiffness.physical_local20.Rows(), 20U) | EXPECT_EQ(stiffness.physical_local20.Columns(), 20U) | EXPECT_EQ(stiffness.physical_global24.Rows(), 24U) | EXPECT_EQ(stiffness.drilling_global24.Rows(), 24U) | EXPECT_EQ(stiffness.stabilized_global24.Rows(), 24U) | EXPECT_TRUE(std::isfinite((*matrix)(row, column))) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_local20, 5U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.drilling_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.stabilized_global24, 6U, 2.0), 1.0e-12) | ASSERT_TRUE(repeated_candidate.HasValue()) | EXPECT_DOUBLE_EQ(repeated.drilling_stiffness, stiffness.drilling_stiffness) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(stiffness.physical_local20.Rows(), 20U) | EXPECT_EQ(stiffness.physical_local20.Columns(), 20U) | EXPECT_EQ(stiffness.physical_global24.Rows(), 24U) | EXPECT_EQ(stiffness.drilling_global24.Rows(), 24U) | EXPECT_EQ(stiffness.stabilized_global24.Rows(), 24U) | EXPECT_TRUE(std::isfinite((*matrix)(row, column))) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_local20, 5U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.drilling_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.stabilized_global24, 6U, 2.0), 1.0e-12) | ASSERT_TRUE(repeated_candidate.HasValue()) | EXPECT_DOUBLE_EQ(repeated.drilling_stiffness, stiffness.drilling_stiffness) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration; assertion 13개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration 유지 원문 검사 body 및 assertion 동일. dd458622e798b9a301ec132ddda748c8225d2dbc21d2623561828c90551d37ce dd458622e798b9a301ec132ddda748c8225d2dbc21d2623561828c90551d37ce ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(frame_e3.X(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Y(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Z(), 1.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 0U), 0x1.d555555555554p+6) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 4U), 0.0) | EXPECT_DOUBLE_EQ(stiffness.physical_global24(2U, 2U), 0x1.aaaaaaaaaaaadp+5) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0x1.20a3d70a3d70bp+6) | EXPECT_EQ(recovery.points[0U].generalized_strain, kExpectedStrain) | EXPECT_DOUBLE_EQ(patch[0U], 0x1.9999999999999p-3) | EXPECT_DOUBLE_EQ(patch[component], 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(frame_e3.X(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Y(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Z(), 1.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 0U), 0x1.d555555555554p+6) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 4U), 0.0) | EXPECT_DOUBLE_EQ(stiffness.physical_global24(2U, 2U), 0x1.aaaaaaaaaaaadp+5) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0x1.20a3d70a3d70bp+6) | EXPECT_EQ(recovery.points[0U].generalized_strain, kExpectedStrain) | EXPECT_DOUBLE_EQ(patch[0U], 0x1.9999999999999p-3) | EXPECT_DOUBLE_EQ(patch[component], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence; assertion 5개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence 유지 원문 검사 body 및 assertion 동일. 2811e8ca758b586de936d283c2520a2cea673d1b676771c2bc74d718e98a74a1 2811e8ca758b586de936d283c2520a2cea673d1b676771c2bc74d718e98a74a1 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_NE(local_energy, 0.0) | ASSERT_NE(global_energy, 0.0) | EXPECT_LE(std::abs(global_energy - local_energy) / (std::abs(global_energy) + std::abs(local_energy)), 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_NE(local_energy, 0.0) | ASSERT_NE(global_energy, 0.0) | EXPECT_LE(std::abs(global_energy - local_energy) / (std::abs(global_energy) + std::abs(local_energy)), 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank; assertion 9개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank 유지 원문 검사 body 및 assertion 동일. f388cb98b5e4d023a89e149554f8288d9250847c7a5738a0657dcbddf4e5220d f388cb98b5e4d023a89e149554f8288d9250847c7a5738a0657dcbddf4e5220d ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(NumericalRank(scaled_physical20), 14U) | EXPECT_EQ(NumericalRank(scaled_stabilized24), 18U) | ASSERT_GT(physical_norm, 0.0) | ASSERT_GT(stabilized_norm, 0.0) | ASSERT_GT(modeNorm, 0.0) | EXPECT_LE(scaled_physical24.Multiply(scaledMode).Norm() / (physical_norm * modeNorm), 1.0e-10) | EXPECT_LE(scaled_stabilized24.Multiply(scaledMode).Norm() / (stabilized_norm * modeNorm), 1.0e-10) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(NumericalRank(scaled_physical20), 14U) | EXPECT_EQ(NumericalRank(scaled_stabilized24), 18U) | ASSERT_GT(physical_norm, 0.0) | ASSERT_GT(stabilized_norm, 0.0) | ASSERT_GT(modeNorm, 0.0) | EXPECT_LE(scaled_physical24.Multiply(scaledMode).Norm() / (physical_norm * modeNorm), 1.0e-10) | EXPECT_LE(scaled_stabilized24.Multiply(scaledMode).Norm() / (stabilized_norm * modeNorm), 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields; assertion 3개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields 유지 원문 검사 body 및 assertion 동일. 85d6d3543ba1e1a40665939da00f88617f4bc27a8cb54ee6ca6f26848d3abe12 85d6d3543ba1e1a40665939da00f88617f4bc27a8cb54ee6ca6f26848d3abe12 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(QuadraticEnergy(stiffness, field), 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(QuadraticEnergy(stiffness, field), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.UsesAllPhysicalRotationDiagonalsAndFixedFactor Mitc4ShellDrilling.UsesAllPhysicalRotationDiagonalsAndFixedFactor; assertion 5개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.UsesAllPhysicalRotationDiagonalsAndFixedFactor 유지 원문 검사 body 및 assertion 동일. 8b0addafb6afb8018440c8784db44a56ead47ff68faa9389836024122e94a95f 8b0addafb6afb8018440c8784db44a56ead47ff68faa9389836024122e94a95f ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(std::isfinite(diagonal)) | ASSERT_GE(diagonal, 0.0) | EXPECT_DOUBLE_EQ(stiffness.drilling_stiffness, 1.0e-3 * expected_sum / 8.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(std::isfinite(diagonal)) | ASSERT_GE(diagonal, 0.0) | EXPECT_DOUBLE_EQ(stiffness.drilling_stiffness, 1.0e-3 * expected_sum / 8.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.IntegratesFlatConsistentAndScalarRowSumLumpedMass Mitc4ShellMass.IntegratesFlatConsistentAndScalarRowSumLumpedMass; assertion 10개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.IntegratesFlatConsistentAndScalarRowSumLumpedMass 유지 원문 검사 body 및 assertion 동일. 13d278e7f55aa0a671221d5a7335510907c58490fb3d02e8defde941b85ec16f 13d278e7f55aa0a671221d5a7335510907c58490fb3d02e8defde941b85ec16f ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.nodal_moments[row][0U], 6.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][1U], 0.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][2U], 2.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[0U](row, column), pattern[row][column] * (2.0 / 3.0), 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](row, column), 0.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](row, column), pattern[row][column] * (2.0 / 9.0), 1.0e-12) | EXPECT_NEAR( mass.lumped_global24(6U * row + component, 6U * row + component), 6.0, 1.0e-12) | EXPECT_NEAR(mass.lumped_global24(6U * row + 3U + component, 6U * row + 3U + component), component == 2U ? 0.0 : 2.0, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.nodal_moments[row][0U], 6.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][1U], 0.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][2U], 2.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[0U](row, column), pattern[row][column] * (2.0 / 3.0), 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](row, column), 0.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](row, column), pattern[row][column] * (2.0 / 9.0), 1.0e-12) | EXPECT_NEAR( mass.lumped_global24(6U * row + component, 6U * row + component), 6.0, 1.0e-12) | EXPECT_NEAR(mass.lumped_global24(6U * row + 3U + component, 6U * row + 3U + component), component == 2U ? 0.0 : 2.0, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RejectsNonpositiveAndNonfiniteDensity Mitc4ShellMass.RejectsNonpositiveAndNonfiniteDensity; assertion 4개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RejectsNonpositiveAndNonfiniteDensity 유지 원문 검사 body 및 assertion 동일. 85d0b08a8b413046a1dd64d263b9a847bb933dc7411f5f611651c1fe772f8220 85d0b08a8b413046a1dd64d263b9a847bb933dc7411f5f611651c1fe772f8220 "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_FALSE(mass.HasValue()) | ASSERT_EQ(mass.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(mass.GetStatus().Diagnostics()[0U].code, ""invalid-shell-mass"")" "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_FALSE(mass.HasValue()) | ASSERT_EQ(mass.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(mass.GetStatus().Diagnostics()[0U].code, ""invalid-shell-mass"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesFiniteNodalVarianceAcrossDensityScale Mitc4ShellMass.PreservesFiniteNodalVarianceAcrossDensityScale; assertion 6개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesFiniteNodalVarianceAcrossDensityScale 유지 원문 검사 body 및 assertion 동일. 35f70d35723a1a6a5ca19dbe73e587dc1c35ec4828f98616aa2dab17d4920e3e 35f70d35723a1a6a5ca19dbe73e587dc1c35ec4828f98616aa2dab17d4920e3e ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_TRUE(std::isfinite(moments[0U])) | EXPECT_TRUE(std::isfinite(moments[1U])) | EXPECT_TRUE(std::isfinite(moments[2U])) | EXPECT_GT(moments[2U] - moments[1U] * (moments[1U] / moments[0U]), 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_TRUE(std::isfinite(moments[0U])) | EXPECT_TRUE(std::isfinite(moments[1U])) | EXPECT_TRUE(std::isfinite(moments[2U])) | EXPECT_GT(moments[2U] - moments[1U] * (moments[1U] / moments[0U]), 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesIndependentWarpedMomentOracle Mitc4ShellMass.PreservesIndependentWarpedMomentOracle; assertion 8개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesIndependentWarpedMomentOracle 유지 원문 검사 body 및 assertion 동일. 643cacec125570c0bafe60064f994407b8a1491199f88ce3b0e9af13472d444d 643cacec125570c0bafe60064f994407b8a1491199f88ce3b0e9af13472d444d ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.consistent_moments[0U](0U, 0U), 17609.0 / 28800.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](0U, 0U), 11003.0 / 1440000.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](0U, 0U), 88177.0 / 6912000.0, 1.0e-12) | EXPECT_NEAR(total_mass, 7743.0 / 1600.0, 1.0e-12) | EXPECT_NEAR(total_first_moment, 739.0 / 12000.0, 1.0e-12) | EXPECT_NEAR(total_second_moment, 517.0 / 5120.0, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.consistent_moments[0U](0U, 0U), 17609.0 / 28800.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](0U, 0U), 11003.0 / 1440000.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](0U, 0U), 88177.0 / 6912000.0, 1.0e-12) | EXPECT_NEAR(total_mass, 7743.0 / 1600.0, 1.0e-12) | EXPECT_NEAR(total_first_moment, 739.0 / 12000.0, 1.0e-12) | EXPECT_NEAR(total_second_moment, 517.0 / 5120.0, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.MeetsPartialBoundaryCompleteMatrixTargets Mitc4ShellMass.MeetsPartialBoundaryCompleteMatrixTargets; assertion 7개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.MeetsPartialBoundaryCompleteMatrixTargets 유지 원문 검사 body 및 assertion 동일. 7b4ca55c7d526b275a1ca19f3c65a04f168c1ca514a329671b9fc594f4f468a1 7b4ca55c7d526b275a1ca19f3c65a04f168c1ca514a329671b9fc594f4f468a1 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(stiffness_candidate.Value().drilling_stiffness, 19.0 / 4800.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness, 10369.0 / 7500.0, 1.0e-12) | EXPECT_NEAR(lumped_mass, 3.0 / 50.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness / lumped_mass, 10369.0 / 450.0, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(stiffness_candidate.Value().drilling_stiffness, 19.0 / 4800.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness, 10369.0 / 7500.0, 1.0e-12) | EXPECT_NEAR(lumped_mass, 3.0 / 50.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness / lumped_mass, 10369.0 / 450.0, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RecomputesCompleteMassAndStiffnessCovariantly Mitc4ShellMass.RecomputesCompleteMassAndStiffnessCovariantly; assertion 6개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RecomputesCompleteMassAndStiffnessCovariantly 유지 원문 검사 body 및 assertion 동일. 1235757b19e3bdacbfc2226ca9a3b839417e1f295516a1d4de6259acb4d0be43 1235757b19e3bdacbfc2226ca9a3b839417e1f295516a1d4de6259acb4d0be43 ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(original_stiffness.HasValue()) | ASSERT_TRUE(rotated_stiffness.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(rotated_mass.HasValue()) ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(original_stiffness.HasValue()) | ASSERT_TRUE(rotated_stiffness.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(rotated_mass.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate; assertion 13개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate 유지 원문 검사 body 및 assertion 동일. 0d2b529828fad74fc88ca1a545fe19d255f87c53d24275ec741bd114bbebe1ca 0d2b529828fad74fc88ca1a545fe19d255f87c53d24275ec741bd114bbebe1ca "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_global24.Multiply(pure_drill).Norm(), 0.0) | EXPECT_DOUBLE_EQ(drill_action[6U * node_index + 5U], stiffness.drilling_stiffness) | EXPECT_GT(QuadraticEnergy(stiffness.drilling_global24, pure_drill), 0.0) | ASSERT_TRUE(extreme_shell.HasValue()) | ASSERT_FALSE(failure.HasValue()) | ASSERT_EQ(failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(failure.GetStatus().Diagnostics()[0].code, ""invalid-shell-stiffness"") | ASSERT_FALSE(repeated_failure.HasValue()) | ASSERT_EQ(repeated_failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].code, failure.GetStatus().Diagnostics()[0].code) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].message, failure.GetStatus().Diagnostics()[0].message)" "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_global24.Multiply(pure_drill).Norm(), 0.0) | EXPECT_DOUBLE_EQ(drill_action[6U * node_index + 5U], stiffness.drilling_stiffness) | EXPECT_GT(QuadraticEnergy(stiffness.drilling_global24, pure_drill), 0.0) | ASSERT_TRUE(extreme_shell.HasValue()) | ASSERT_FALSE(failure.HasValue()) | ASSERT_EQ(failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(failure.GetStatus().Diagnostics()[0].code, ""invalid-shell-stiffness"") | ASSERT_FALSE(repeated_failure.HasValue()) | ASSERT_EQ(repeated_failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].code, failure.GetStatus().Diagnostics()[0].code) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].message, failure.GetStatus().Diagnostics()[0].message)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy; assertion 8개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy 유지 원문 검사 body 및 assertion 동일. 3dad0709f8a7d8746df1e04699e6777b558a71db23f22ac13f5c98ecbd6b084d 3dad0709f8a7d8746df1e04699e6777b558a71db23f22ac13f5c98ecbd6b084d ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(stiffness_candidate.Value() .stabilized_global24.Multiply(pure_drill) .Norm(), 0.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(stiffness_candidate.Value() .stabilized_global24.Multiply(pure_drill) .Norm(), 0.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions; assertion 8개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions 유지 원문 검사 body 및 assertion 동일. 2a4132bcc260b96aec7e5c144e1ccf92a65c7dec753c940e378fac3737f08d83 2a4132bcc260b96aec7e5c144e1ccf92a65c7dec753c940e378fac3737f08d83 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(recovery_candidate.HasValue()) | ASSERT_EQ(recovery.points.size(), expected_coordinates.size()) | EXPECT_EQ(point.natural_coordinates, expected_coordinates[point_index]) | EXPECT_NEAR(point.generalized_strain[component], kGeneralized[component], 1.0e-12) | EXPECT_NEAR(point.section_resultant[component], kExpectedResultant[component], 1.0e-12) | EXPECT_NEAR(point.in_plane_stress[position][component], kExpectedStress[position][component], 1.0e-12) | EXPECT_NEAR(recovery.strain_energy, 72.16, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(recovery_candidate.HasValue()) | ASSERT_EQ(recovery.points.size(), expected_coordinates.size()) | EXPECT_EQ(point.natural_coordinates, expected_coordinates[point_index]) | EXPECT_NEAR(point.generalized_strain[component], kGeneralized[component], 1.0e-12) | EXPECT_NEAR(point.section_resultant[component], kExpectedResultant[component], 1.0e-12) | EXPECT_NEAR(point.in_plane_stress[position][component], kExpectedStress[position][component], 1.0e-12) | EXPECT_NEAR(recovery.strain_energy, 72.16, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/mitc4_shell_test.cpp support@1-314 helper/oracle/fixture/include/static assertion 구간: Node, NodePointers, Section, Material, Dot, Cross, RotateAboutGlobalZ, Norm, ExpectVectorNear, ExpectOrthonormalRightHanded, ExpectMatrixNear, ExpectSymmetric, HasPositiveCholeskyPivots, if, FrobeniusNorm, ScaledSymmetryError, ScaledStiffness, SymmetricEigenvalues, NumericalRank, for, count_if, SymmetricOperatorNorm, QuadraticEnergy, PhysicalField, ExpectStrain, PhysicalRigidMode, PlanarNodes tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 297d7d85ca88c30c2fcba28e5add8b21550acc876c07a4f72e58bd5671374614 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@345-346 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3871bd00e76dc57ff62fcabeb11b45bf1f6672a56529f21deb75b04370bafdcb 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@400-401 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2b2e2de4330e6f7b2a8bc958c220fa5074cae2a894fdec078de809b1494a88c0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@455-456 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0e9489db8c044b5eac22c751c63b47dd64307874cd16a718c86fe5d4d8183fd5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@540-541 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3c4055c21da1e40459430c329495ace7af1b4404b56501366394a6789c7fd255 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@555-556 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d78ec2164cda37dda980863249f1d1b8f01e17f082f71061e46180accb42a7b4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@656-657 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 297c797dbfa396881a360ce5e6061cad0ac811f3829247f77cbbe5c5d6ef704a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@685-686 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 832b8cc9cff26faa1e25dd5159b323b77839151eb7675edaaf4f6ff39d91a055 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@734-735 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6b0492533ad982e0ff4c2695c4236ab7345f4db760494bf6488680ce4ce90747 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@797-798 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 50f5a0316e8562dadd3155c301e30fc715e3dc4c735874d08f7567003cc894f3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@890-923 helper/oracle/fixture/include/static assertion 구간: ExpectGlobalZCovariance tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ee879d5be51cb0e71626e93a8224bba6a7ee8b8929d124939771c99853c476ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@1027-1028 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 87cbab04a4d00f30b6ca88389a388eaaee48f9eab162d6d6f1a1a33f1d1c4b41 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@1070-1071 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9445081d68e7ef72263ba262a8525bf8acd4c08d0212a48e0f87fa92b0d99c6b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/mitc4_shell_test.cpp support@1108-1109 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 31f30d2b75293b2d01a063d68a9dfdb4e607867386078578966eb04a63d4496a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 17개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file 이관 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. eb4562c8abedcfbc7c2f953b58bae30f67a84d7ccf0bbea9ae384dfcf595f055 7274bef28faa7c8a38da9436edf00d3d2356031a9ee82618a8b16226f99d687f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IntegratesTheRectangleNodalLumpedMassAndNull NonlinearMitc4Inertia.IntegratesTheRectangleNodalLumpedMassAndNull; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IntegratesTheRectangleNodalLumpedMassAndNull 유지 원문 검사 body 및 assertion 동일. 717e3fc84d47b730a49e4677ba77a96fdeab3929b1e3b870c9fd73495ddf445e 717e3fc84d47b730a49e4677ba77a96fdeab3929b1e3b870c9fd73495ddf445e ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(mass(6U * row, 6U * column), row == column ? 0.2 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 3U, 6U * column + 3U), row == column ? 0.2 * 0.2 * 0.2 / 12.0 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 5U, 6U * row + 5U), 0.0, 1.0e-12) | EXPECT_LE(mass.Multiply(drilling_null).Norm(), 1.0e-12) ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(mass(6U * row, 6U * column), row == column ? 0.2 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 3U, 6U * column + 3U), row == column ? 0.2 * 0.2 * 0.2 / 12.0 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 5U, 6U * row + 5U), 0.0, 1.0e-12) | EXPECT_LE(mass.Multiply(drilling_null).Norm(), 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UsesPhysicalAccelerationAndExactCurrentForce NonlinearMitc4Inertia.UsesPhysicalAccelerationAndExactCurrentForce; assertion 3개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UsesPhysicalAccelerationAndExactCurrentForce 유지 원문 검사 body 및 assertion 동일. ddce9716997e9842683e77402fbf5b3b865335261d285318138c471950069a35 ddce9716997e9842683e77402fbf5b3b865335261d285318138c471950069a35 ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(evaluation.Value().force[index], expected[index], 1.0e-11) | EXPECT_NEAR(evaluation.Value().convective_force[index], 0.0, 1.0e-11) ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(evaluation.Value().force[index], expected[index], 1.0e-11) | EXPECT_NEAR(evaluation.Value().convective_force[index], 0.0, 1.0e-11) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PreservesTinyAngularAccelerationAlongsideRigidTranslationAcceleration NonlinearMitc4Inertia.PreservesTinyAngularAccelerationAlongsideRigidTranslationAcceleration; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PreservesTinyAngularAccelerationAlongsideRigidTranslationAcceleration 유지 원문 검사 body 및 assertion 동일. 9b2033a70c6b58db45bfc94101520b88db958b78ab526763fbe07eb9c2971b7f 9b2033a70c6b58db45bfc94101520b88db958b78ab526763fbe07eb9c2971b7f ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(actual.Value().convective_force[full], 0.0) | ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(actual.Value().convective_force[full], 0.0) | ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MixedScaleRotationDerivativeAndAngularMomentum NonlinearMitc4Inertia.MixedScaleRotationDerivativeAndAngularMomentum; assertion 6개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MixedScaleRotationDerivativeAndAngularMomentum 유지 원문 검사 body 및 assertion 동일. 81949ff3504ddccc0cbef056e78d8596ee31b99ff69aae08a4dc6503e09bd230 81949ff3504ddccc0cbef056e78d8596ee31b99ff69aae08a4dc6503e09bd230 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE(derivative_error / (nodal_rotary_inertia * epsilon), 1e-12) | EXPECT_LE(rate_error / (nodal_rotary_inertia * epsilon), 1e-12) | ASSERT_TRUE(moving.HasValue()) | EXPECT_LE(momentum_error / (nodal_rotary_inertia * epsilon), 1e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE(derivative_error / (nodal_rotary_inertia * epsilon), 1e-12) | EXPECT_LE(rate_error / (nodal_rotary_inertia * epsilon), 1e-12) | ASSERT_TRUE(moving.HasValue()) | EXPECT_LE(momentum_error / (nodal_rotary_inertia * epsilon), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.FlatRotatedLargeOffsetKeepsCenteredRotationalInertiaExactlyZero NonlinearMitc4Inertia.FlatRotatedLargeOffsetKeepsCenteredRotationalInertiaExactlyZero; assertion 4개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.FlatRotatedLargeOffsetKeepsCenteredRotationalInertiaExactlyZero 유지 원문 검사 body 및 assertion 동일. f5b834d0bbcf878284e79ee64f605b5d50f2671a207a226ab6226be2b1d242c8 f5b834d0bbcf878284e79ee64f605b5d50f2671a207a226ab6226be2b1d242c8 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_DOUBLE_EQ(value.Value().force[6U * node + 3U + component], 0.0) | EXPECT_DOUBLE_EQ(mass_times_acceleration[6U * node + 3U + component], 0.0) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_DOUBLE_EQ(value.Value().force[6U * node + 3U + component], 0.0) | EXPECT_DOUBLE_EQ(mass_times_acceleration[6U * node + 3U + component], 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.WarpedGeometryRetainsNonzeroFirstThicknessMoment NonlinearMitc4Inertia.WarpedGeometryRetainsNonzeroFirstThicknessMoment; assertion 3개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.WarpedGeometryRetainsNonzeroFirstThicknessMoment 유지 원문 검사 body 및 assertion 동일. 89f7e9f4b875516c794ec880dbf48d5a8e55b0402e9a1c3dfa1382b255cacf26 89f7e9f4b875516c794ec880dbf48d5a8e55b0402e9a1c3dfa1382b255cacf26 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_GT(coupling, 0.0) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_GT(coupling, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.InverseIdentityAndCurrentAnalyticNullAtFiniteRotation DynamicRotation.InverseIdentityAndCurrentAnalyticNullAtFiniteRotation; assertion 9개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.InverseIdentityAndCurrentAnalyticNullAtFiniteRotation 이관 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. cd06eaf77eb17e3b6b87e26c1c7da6266678a5a1cf51952a44dcde328ab3e100 a38ec8c66743c96d9852840c0a2a33e0c3a14f330dd00369fcaedf51b341f3ee ASSERT_TRUE(value.HasValue()) | EXPECT_LE( (value.Value().drill_null - inverse_column / inverse_column.Norm()) .Norm(), 1.0e-12) | EXPECT_NEAR(identity_column[row], row == column ? 1.0 : 0.0, 1.0e-12) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_LE(mass.Multiply(n).Norm() / MatrixNorm(mass), 1.0e-12) | EXPECT_LE(std::abs(n.Dot(scaled_force)) / scaled_force.Norm(), 1.0e-10) | EXPECT_GT(mass.Multiply(fixed_drill).Norm() / MatrixNorm(mass), 1.0e-8) ASSERT_TRUE(value.HasValue()) | EXPECT_GT(mapped[column], 0.0) | EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1e-12) | EXPECT_NEAR(mapped[row], 0.0, 1e-12) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_LE(mass.Multiply(n).Norm() / MatrixNorm(mass), 1.0e-12) | EXPECT_LE(std::abs(n.Dot(scaled_force)) / scaled_force.Norm(), 1.0e-10) | EXPECT_GT(mass.Multiply(fixed_drill).Norm() / MatrixNorm(mass), 1.0e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.RejectsIllConditionedPhysicalMassWithoutDeletingIt NonlinearMitc4Inertia.RejectsIllConditionedPhysicalMassWithoutDeletingIt; assertion 3개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.RejectsIllConditionedPhysicalMassWithoutDeletingIt 유지 원문 검사 body 및 assertion 동일. 5f0adf729846e876c90ddcd5db8123c9005a2541189d7a72ac1736116d411500 5f0adf729846e876c90ddcd5db8123c9005a2541189d7a72ac1736116d411500 "EXPECT_TRUE(normal.Create().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""ill-conditioned-nonlinear-inertia-positive-mass"")" "EXPECT_TRUE(normal.Create().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""ill-conditioned-nonlinear-inertia-positive-mass"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.ConvectiveForceDoesNotLoseSmallValuesToAcceleration NonlinearMitc4Inertia.ConvectiveForceDoesNotLoseSmallValuesToAcceleration; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.ConvectiveForceDoesNotLoseSmallValuesToAcceleration 유지 원문 검사 body 및 assertion 동일. 25d5baa1b968f822aa4dd035d4e323310708e8e73f2ceaffcf3f657b99b2b86a 25d5baa1b968f822aa4dd035d4e323310708e8e73f2ceaffcf3f657b99b2b86a ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(ordinary.HasValue()) | ASSERT_TRUE(large.HasValue()) | EXPECT_GT(ordinary.Value().convective_force.Norm(), 0.0) | EXPECT_EQ(ordinary.Value().convective_force[i], large.Value().convective_force[i]) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(ordinary.HasValue()) | ASSERT_TRUE(large.HasValue()) | EXPECT_GT(ordinary.Value().convective_force.Norm(), 0.0) | EXPECT_EQ(ordinary.Value().convective_force[i], large.Value().convective_force[i]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PartialAndEffectiveTangentsPassTheScaledFixedSweep NonlinearMitc4Inertia.PartialAndEffectiveTangentsPassTheScaledFixedSweep; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PartialAndEffectiveTangentsPassTheScaledFixedSweep 유지 원문 검사 body 및 assertion 동일. e5946458fbc3006710a0af48c556f989a6be04fde87c4c61c0e4bd18366c8315 e5946458fbc3006710a0af48c556f989a6be04fde87c4c61c0e4bd18366c8315 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(vp.HasValue()) | ASSERT_TRUE(vm.HasValue()) | EXPECT_TRUE(consecutive) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(vp.HasValue()) | ASSERT_TRUE(vm.HasValue()) | EXPECT_TRUE(consecutive) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MatchesIndependentWarpedNodalMomentsEnergyAndPower NonlinearMitc4Inertia.MatchesIndependentWarpedNodalMomentsEnergyAndPower; assertion 17개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MatchesIndependentWarpedNodalMomentsEnergyAndPower 유지 원문 검사 body 및 assertion 동일. 259d4f9247683cf706cedd32eb2bf44ce9e33d0ed8119ef7a57f197466e3d8aa 259d4f9247683cf706cedd32eb2bf44ce9e33d0ed8119ef7a57f197466e3d8aa ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_LE(mass_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE(symmetry_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE( std::abs(value.Value().kinetic_energy - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(0.5 * state.v.Dot(value.Value().mass.Multiply(state.v)) - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(state.v.Dot(value.Value().force) - oracle.power) / std::abs(oracle.power), 1.0e-10) | EXPECT_LE(Difference(ApplyD(value.Value().force, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum - oracle.momentum).Norm() / oracle.momentum.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum - oracle.angular_momentum).Norm() / oracle.angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum_rate - oracle.momentum_rate).Norm() / oracle.momentum_rate.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum_rate - oracle.angular_momentum_rate) .Norm() / oracle.angular_momentum_rate.Norm(), 1.0e-12) | ASSERT_TRUE(bi.HasValue()) | ASSERT_TRUE(bj.HasValue()) | EXPECT_LE(std::abs(numerator[k] / denominator[k] - oracle.moments[k][i][j]) / scale, 1.0e-12) | ASSERT_TRUE(translation.HasValue()) | EXPECT_NEAR(translation.Value().kinetic_energy / oracle.total_mass, 0.25, 1.0e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_LE(mass_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE(symmetry_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE( std::abs(value.Value().kinetic_energy - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(0.5 * state.v.Dot(value.Value().mass.Multiply(state.v)) - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(state.v.Dot(value.Value().force) - oracle.power) / std::abs(oracle.power), 1.0e-10) | EXPECT_LE(Difference(ApplyD(value.Value().force, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum - oracle.momentum).Norm() / oracle.momentum.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum - oracle.angular_momentum).Norm() / oracle.angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum_rate - oracle.momentum_rate).Norm() / oracle.momentum_rate.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum_rate - oracle.angular_momentum_rate) .Norm() / oracle.angular_momentum_rate.Norm(), 1.0e-12) | ASSERT_TRUE(bi.HasValue()) | ASSERT_TRUE(bj.HasValue()) | EXPECT_LE(std::abs(numerator[k] / denominator[k] - oracle.moments[k][i][j]) / scale, 1.0e-12) | ASSERT_TRUE(translation.HasValue()) | EXPECT_NEAR(translation.Value().kinetic_energy / oracle.total_mass, 0.25, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.InitialMassMatchesEigenLumpingAndFiniteEnergyObeysJensen NonlinearMitc4Inertia.InitialMassMatchesEigenLumpingAndFiniteEnergyObeysJensen; assertion 8개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.InitialMassMatchesEigenLumpingAndFiniteEnergyObeysJensen 유지 원문 검사 body 및 assertion 동일. c9725cc3d16533a26647720f977a41ee8e1edcbfddf43560b3abf4a638464969 c9725cc3d16533a26647720f977a41ee8e1edcbfddf43560b3abf4a638464969 ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(initial.HasValue()) | EXPECT_NEAR(initial.Value().mass(i, j), eigen.Value().lumped_global24(i, j), 1.0e-12) | EXPECT_EQ(initial.Value().mass(i, j), 0.0) | EXPECT_GT(lumped.energy - consistent.energy, 0.0) | EXPECT_NEAR(lumped.total_mass, consistent.total_mass, 1.0e-12) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(initial.HasValue()) | EXPECT_NEAR(initial.Value().mass(i, j), eigen.Value().lumped_global24(i, j), 1.0e-12) | EXPECT_EQ(initial.Value().mass(i, j), 0.0) | EXPECT_GT(lumped.energy - consistent.energy, 0.0) | EXPECT_NEAR(lumped.total_mass, consistent.total_mass, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep; assertion 6개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep 유지 원문 검사 body 및 assertion 동일. fed5b777e0226e78a7a852200777d80a3d9736b13300e6670b9d244bea2fe464 fed5b777e0226e78a7a852200777d80a3d9736b13300e6670b9d244bea2fe464 ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE((analytic - oracle).Norm(), 1.0e-12) | EXPECT_LE((analytic - Third(value.Value(), directions[t], directions[p], directions[r])) .Norm(), 1.0e-12) | EXPECT_TRUE(consecutive[r][t]) ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE((analytic - oracle).Norm(), 1.0e-12) | EXPECT_LE((analytic - Third(value.Value(), directions[t], directions[p], directions[r])) .Norm(), 1.0e-12) | EXPECT_TRUE(consecutive[r][t]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.NormalizedNullDerivativesIncludeNormalizationCurvature DynamicRotation.NormalizedNullDerivativesIncludeNormalizationCurvature; assertion 9개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.NormalizedNullDerivativesIncludeNormalizationCurvature 유지 원문 검사 body 및 assertion 동일. b1519383145d86730f51475376a73c825a7eb748c5e69bbe9a502bc32069efcd b1519383145d86730f51475376a73c825a7eb748c5e69bbe9a502bc32069efcd ASSERT_TRUE(value.HasValue()) | EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1.0e-12) | EXPECT_NEAR(value.Value().drill_null.Dot(first), 0.0, 1.0e-12) | EXPECT_NEAR( value.Value().drill_null.Dot(value.Value().null_directional_second), -first.Dot(first), 1.0e-12) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(consecutive) | EXPECT_FALSE(fesa::EvaluateDynamicRotation({}, {0, 0, 2}, {}, {}).HasValue()) | EXPECT_FALSE( fesa::EvaluateDynamicRotation( {std::numeric_limits::quiet_NaN(), 0, 0}, initial, {}, {}) .HasValue()) ASSERT_TRUE(value.HasValue()) | EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1.0e-12) | EXPECT_NEAR(value.Value().drill_null.Dot(first), 0.0, 1.0e-12) | EXPECT_NEAR( value.Value().drill_null.Dot(value.Value().null_directional_second), -first.Dot(first), 1.0e-12) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(consecutive) | EXPECT_FALSE(fesa::EvaluateDynamicRotation({}, {0, 0, 2}, {}, {}).HasValue()) | EXPECT_FALSE( fesa::EvaluateDynamicRotation( {std::numeric_limits::quiet_NaN(), 0, 0}, initial, {}, {}) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UnitAndGlobalFrameChangesPreservePhysicalMetrics NonlinearMitc4Inertia.UnitAndGlobalFrameChangesPreservePhysicalMetrics; assertion 14개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UnitAndGlobalFrameChangesPreservePhysicalMetrics 유지 원문 검사 body 및 assertion 동일. d1d1d2152f232cee2453d1b80ac93c5759be9c4a35df8128bf14ddec28c2b2c8 d1d1d2152f232cee2453d1b80ac93c5759be9c4a35df8128bf14ddec28c2b2c8 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(converted_inertia.HasValue()) | ASSERT_TRUE(uv.HasValue()) | EXPECT_LE(std::abs(uv.Value().kinetic_energy / energy_scale - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE(error / MatrixNorm(original_scaled), 1.0e-12) | EXPECT_LE(Difference(original_force, converted_force, 1.0).Norm() / original_force.Norm(), 1.0e-10) | ASSERT_TRUE(frame_inertia.HasValue()) | ASSERT_TRUE(fv.HasValue()) | EXPECT_LE(std::abs(fv.Value().kinetic_energy - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE((fv.Value().momentum - rotate(value.Value().momentum)).Norm() / value.Value().momentum.Norm(), 1.0e-12) | EXPECT_LE( (fv.Value().angular_momentum - rotate(value.Value().angular_momentum)) .Norm() / value.Value().angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((actual - expected).Norm() / expected.Norm(), 1.0e-10) | EXPECT_LE(covariance_error / MatrixNorm(value.Value().mass), 1.0e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(converted_inertia.HasValue()) | ASSERT_TRUE(uv.HasValue()) | EXPECT_LE(std::abs(uv.Value().kinetic_energy / energy_scale - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE(error / MatrixNorm(original_scaled), 1.0e-12) | EXPECT_LE(Difference(original_force, converted_force, 1.0).Norm() / original_force.Norm(), 1.0e-10) | ASSERT_TRUE(frame_inertia.HasValue()) | ASSERT_TRUE(fv.HasValue()) | EXPECT_LE(std::abs(fv.Value().kinetic_energy - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE((fv.Value().momentum - rotate(value.Value().momentum)).Norm() / value.Value().momentum.Norm(), 1.0e-12) | EXPECT_LE( (fv.Value().angular_momentum - rotate(value.Value().angular_momentum)) .Norm() / value.Value().angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((actual - expected).Norm() / expected.Norm(), 1.0e-10) | EXPECT_LE(covariance_error / MatrixNorm(value.Value().mass), 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors; assertion 4개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors 유지 원문 검사 body 및 assertion 동일. afd5da8bcdde50b87721fb93bff8d47f1886f6b6812e83259d1208ec2b2dfb06 afd5da8bcdde50b87721fb93bff8d47f1886f6b6812e83259d1208ec2b2dfb06 ASSERT_TRUE(value.HasValue()) | EXPECT_LE((Third(value.Value(), e1, e1, e1) - expected[i][0]).Norm(), 1.0e-12) | EXPECT_LE((Third(value.Value(), e1, e2, e3) - expected[i][1]).Norm(), 1.0e-12) | EXPECT_LE( (Third(value.Value(), mixed, mixed, mixed) - expected[i][2]).Norm(), 1.0e-12) ASSERT_TRUE(value.HasValue()) | EXPECT_LE((Third(value.Value(), e1, e1, e1) - expected[i][0]).Norm(), 1.0e-12) | EXPECT_LE((Third(value.Value(), e1, e2, e3) - expected[i][1]).Norm(), 1.0e-12) | EXPECT_LE( (Third(value.Value(), mixed, mixed, mixed) - expected[i][2]).Norm(), 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IndependentOracleDetectsEachRequiredOmission NonlinearMitc4Inertia.IndependentOracleDetectsEachRequiredOmission; assertion 10개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IndependentOracleDetectsEachRequiredOmission 유지 원문 검사 body 및 assertion 동일. cd75fd015eb68d73365632968c883ff3e0361d16f81d4c93e4e1f28bb39fba01 cd75fd015eb68d73365632968c883ff3e0361d16f81d4c93e4e1f28bb39fba01 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GT(Difference(mutant, fd, 1.0).Norm() / (mutant.Norm() + fd.Norm()), 1.0e-6) | EXPECT_GT(Difference(ApplyD(no_convective, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-6) | ASSERT_TRUE(vplus.HasValue()) | ASSERT_TRUE(vminus.HasValue()) | EXPECT_GT(vfd.Norm(), 0.0) | EXPECT_GT(Difference(missing_dv, vfd, 1.0).Norm() / vfd.Norm(), 1.0e-6) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GT(Difference(mutant, fd, 1.0).Norm() / (mutant.Norm() + fd.Norm()), 1.0e-6) | EXPECT_GT(Difference(ApplyD(no_convective, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-6) | ASSERT_TRUE(vplus.HasValue()) | ASSERT_TRUE(vminus.HasValue()) | EXPECT_GT(vfd.Norm(), 0.0) | EXPECT_GT(Difference(missing_dv, vfd, 1.0).Norm() / vfd.Norm(), 1.0e-6) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@1-81 helper/oracle/fixture/include/static assertion 구간: Node, Nodes, Pointers, Frames, Inertia, AddRotation, Difference tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. d69ff9a4f48af8ab96bdc107989f8cb690b3bd03e7302f69630eb2aaf558871a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@177-180 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. 494a3ced593041a4d3ea62a53340f75d552373b567d3ec7ca404700ea0c42534 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@251-443 helper/oracle/fixture/include/static assertion 구간: Multiply, BlockExponentialDerivative, if, Second, Third, MatrixNorm, Fixture, Length, Create, Warped, WarpedNonuniformDirectors, RotateFrame, FlatRotatedLargeOffset, State, FiniteState, ApplyD tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. 222b0316695fd6559144c2fdfdaa9c8cac92e01ef32ad6685b7aff0384ebcc78 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@481-492 helper/oracle/fixture/include/static assertion 구간: ScaledMatrix tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. b069eba225770ec661e53431edf8f9c1df71af521445644b835793d185124063 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@655-779 helper/oracle/fixture/include/static assertion 구간: Integral, IntegrateFivePoints tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. af98d35bc14d69e1d57beb2df3c82bd29703cc630af22865fd95463987225795 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@1305-1306 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 16개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8b41aba213d2ba4ae2a24bdff623bf663253b89997cc5f4a99c70953af1cc092 a2053f0d24af51ecdfe345ef14267b8a57a2530e994c46da68a5bb17f7250341 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.EvaluatesResidualTangentAndRecoveryAtOneTrial NonlinearMitc4Residual.EvaluatesResidualTangentAndRecoveryAtOneTrial; assertion 10개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.EvaluatesResidualTangentAndRecoveryAtOneTrial 유지 원문 검사 body 및 assertion 동일. 2bf5788132debdfcd7990b78d66be3ec5eb35b7039badcbff3737f49e5e0502a 2bf5788132debdfcd7990b78d66be3ec5eb35b7039badcbff3737f49e5e0502a ASSERT_TRUE(recovery.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().internal_residual.Size(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Columns(), 24U) | EXPECT_DOUBLE_EQ(result.Value().physical_strain_energy, result.Value().recovery.physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().recovery.physical_strain_energy, recovery.Value().physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().internal_residual[index], result.Value().internal_force[index]) | EXPECT_EQ(result.Value().recovery.gauss_points[point].generalized_strain, recovery.Value().gauss_points[point].generalized_strain) | EXPECT_EQ(result.Value().recovery.gauss_points[point].section_resultant, recovery.Value().gauss_points[point].section_resultant) ASSERT_TRUE(recovery.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().internal_residual.Size(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Columns(), 24U) | EXPECT_DOUBLE_EQ(result.Value().physical_strain_energy, result.Value().recovery.physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().recovery.physical_strain_energy, recovery.Value().physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().internal_residual[index], result.Value().internal_force[index]) | EXPECT_EQ(result.Value().recovery.gauss_points[point].generalized_strain, recovery.Value().gauss_points[point].generalized_strain) | EXPECT_EQ(result.Value().recovery.gauss_points[point].section_resultant, recovery.Value().gauss_points[point].section_resultant) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.MatchesTheApprovedDirectionalSchedule NonlinearMitc4Tangent.MatchesTheApprovedDirectionalSchedule; assertion 9개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.MatchesTheApprovedDirectionalSchedule 유지 원문 검사 body 및 assertion 동일. 852d3d6bf5b1eb3a07504509b711d63cf08be10b7b4309a5668469b327b54991 852d3d6bf5b1eb3a07504509b711d63cf08be10b7b4309a5668469b327b54991 ASSERT_TRUE(equilibrium.HasValue()) | ASSERT_GT(ChannelNorm(analytical, true), 0.0) | ASSERT_GT(ChannelNorm(analytical, false), 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GE(force_order_count, 2U) | EXPECT_GE(moment_order_count, 2U) | EXPECT_LE(force_errors[3U], 1.0e-6) | EXPECT_LE(moment_errors[3U], 1.0e-6) ASSERT_TRUE(equilibrium.HasValue()) | ASSERT_GT(ChannelNorm(analytical, true), 0.0) | ASSERT_GT(ChannelNorm(analytical, false), 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GE(force_order_count, 2U) | EXPECT_GE(moment_order_count, 2U) | EXPECT_LE(force_errors[3U], 1.0e-6) | EXPECT_LE(moment_errors[3U], 1.0e-6) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.PreservesRigidTranslationNullspaceAndSymmetry NonlinearMitc4Tangent.PreservesRigidTranslationNullspaceAndSymmetry; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.PreservesRigidTranslationNullspaceAndSymmetry 유지 원문 검사 body 및 assertion 동일. 0f79a384735c9e1976d518ca10d5c463a3d6fd669c1c995425c37c2c94e9f080 0f79a384735c9e1976d518ca10d5c463a3d6fd669c1c995425c37c2c94e9f080 ASSERT_TRUE(equilibrium.HasValue()) | EXPECT_LE(null_action.Norm(), 1.0e-10) | ASSERT_GT(FrobeniusNorm(scaled_tangent), 0.0) | EXPECT_LE(FrobeniusNorm(antisymmetric) / FrobeniusNorm(scaled_tangent), 1.0e-12) ASSERT_TRUE(equilibrium.HasValue()) | EXPECT_LE(null_action.Norm(), 1.0e-10) | ASSERT_GT(FrobeniusNorm(scaled_tangent), 0.0) | EXPECT_LE(FrobeniusNorm(antisymmetric) / FrobeniusNorm(scaled_tangent), 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.DoesNotAcceptExternalLoadShares NonlinearMitc4Residual.DoesNotAcceptExternalLoadShares; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.DoesNotAcceptExternalLoadShares 유지 원문 검사 body 및 assertion 동일. 826f6bda479841d9de0424ce957e015e087b41afa0149ca94cfe07d3699f1107 826f6bda479841d9de0424ce957e015e087b41afa0149ca94cfe07d3699f1107 ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().internal_residual[index], second.Value().internal_residual[index]) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().internal_residual[index], second.Value().internal_residual[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Objectivity.FiniteRigidMotionHasZeroInternalForce NonlinearMitc4Objectivity.FiniteRigidMotionHasZeroInternalForce; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Objectivity.FiniteRigidMotionHasZeroInternalForce 유지 원문 검사 body 및 assertion 동일. 2495a42787caa073516e20ed9797534fb25f3a8a4789d7c71231800206e8ce86 2495a42787caa073516e20ed9797534fb25f3a8a4789d7c71231800206e8ce86 ASSERT_TRUE(result.HasValue()) | EXPECT_LE(result.Value().internal_residual.Norm(), 1.0e-10) | EXPECT_LE(result.Value().physical_strain_energy, 1.0e-12) ASSERT_TRUE(result.HasValue()) | EXPECT_LE(result.Value().internal_residual.Norm(), 1.0e-10) | EXPECT_LE(result.Value().physical_strain_energy, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Patch.RetainsPhysicalRecoveryIdentities NonlinearMitc4Patch.RetainsPhysicalRecoveryIdentities; assertion 1개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Patch.RetainsPhysicalRecoveryIdentities 유지 원문 검사 body 및 assertion 동일. f1b5a3a3696e0af3f261839b80c1164a0c28944c41ad77b4256a31b55f5906b3 f1b5a3a3696e0af3f261839b80c1164a0c28944c41ad77b4256a31b55f5906b3 ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.RejectsNonfiniteTrialData NonlinearMitc4Residual.RejectsNonfiniteTrialData; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.RejectsNonfiniteTrialData 유지 원문 검사 body 및 assertion 동일. 3e2e0c59444ee3b19641d2b76ca17ee825160e1821798a88bb12d225f0823f29 3e2e0c59444ee3b19641d2b76ca17ee825160e1821798a88bb12d225f0823f29 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-trial"") | EXPECT_FALSE(overflow_result.HasValue())" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-trial"") | EXPECT_FALSE(overflow_result.HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ZeroTrialOnTranslatedDecimalMeshHasNoArtificialForce NonlinearMitc4Residual.ZeroTrialOnTranslatedDecimalMeshHasNoArtificialForce; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ZeroTrialOnTranslatedDecimalMeshHasNoArtificialForce 유지 원문 검사 body 및 assertion 동일. dbba37dc6b52df765552dc588e502f3d8435f43ff28832f9702bd655c905951e dbba37dc6b52df765552dc588e502f3d8435f43ff28832f9702bd655c905951e ASSERT_TRUE(evaluated.HasValue()) | EXPECT_DOUBLE_EQ(evaluated.Value().internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(evaluated.Value().drilling_energy, 0.0) ASSERT_TRUE(evaluated.HasValue()) | EXPECT_DOUBLE_EQ(evaluated.Value().internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(evaluated.Value().drilling_energy, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDirectionalThirdGradientMatchesTangentSweep NonlinearMitc4Residual.ExactDirectionalThirdGradientMatchesTangentSweep; assertion 0개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDirectionalThirdGradientMatchesTangentSweep 유지 원문 검사 body 및 assertion 동일. 6d549b636640f56a6c955107a00503e9d58a2649a56aff87cdb9c2e688678c5c 6d549b636640f56a6c955107a00503e9d58a2649a56aff87cdb9c2e688678c5c 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.SmallRotationPhysicalForceRetainsDrillingNullIdentity NonlinearMitc4Residual.SmallRotationPhysicalForceRetainsDrillingNullIdentity; assertion 7개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.SmallRotationPhysicalForceRetainsDrillingNullIdentity 유지 원문 검사 body 및 assertion 동일. 614e3f70648e94b8a868a6e234984c0fc0c47cb9e02c17b202a3955faea48feb 614e3f70648e94b8a868a6e234984c0fc0c47cb9e02c17b202a3955faea48feb ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | ASSERT_GT(physical_scale, 0.0) | ASSERT_GT(total_scale, 0.0) | EXPECT_LE(std::abs(physical) / physical_scale, 1.0e-10) | EXPECT_LE(std::abs(projected - response.Value().drilling_constraint[node]) / total_scale, 1.0e-10) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | ASSERT_GT(physical_scale, 0.0) | ASSERT_GT(total_scale, 0.0) | EXPECT_LE(std::abs(physical) / physical_scale, 1.0e-10) | EXPECT_LE(std::abs(projected - response.Value().drilling_constraint[node]) / total_scale, 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ThirdGradientIsStableAcrossSmallAngleBranches NonlinearMitc4Residual.ThirdGradientIsStableAcrossSmallAngleBranches; assertion 0개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ThirdGradientIsStableAcrossSmallAngleBranches 유지 원문 검사 body 및 assertion 동일. af1fb78eb8d4496f5767606062cf3f28bcf27e5aed115ee79e830293a3479d40 af1fb78eb8d4496f5767606062cf3f28bcf27e5aed115ee79e830293a3479d40 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian; assertion 7개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian 유지 원문 검사 body 및 assertion 동일. a5e30f5af2df2749898ee64cb0c470bdfcf03e6750df0325a9f2a59855b486f6 a5e30f5af2df2749898ee64cb0c470bdfcf03e6750df0325a9f2a59855b486f6 ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_NEAR(exact.Value().drilling_constraint[node], psi, 1e-11) | EXPECT_NEAR(exact.Value().drilling_constraint_gradient(node, i), gradient, 1e-10) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(passed) ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_NEAR(exact.Value().drilling_constraint[node], psi, 1e-11) | EXPECT_NEAR(exact.Value().drilling_constraint_gradient(node, i), gradient, 1e-10) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExposesExactDrillingConstraintThirdDirectionalGradient NonlinearMitc4Residual.ExposesExactDrillingConstraintThirdDirectionalGradient; assertion 5개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExposesExactDrillingConstraintThirdDirectionalGradient 유지 원문 검사 body 및 assertion 동일. 4a38b5b4ff71243f88af5dc3b4c43d5c10f8ae54ed6456715399299ab8653b88 4a38b5b4ff71243f88af5dc3b4c43d5c10f8ae54ed6456715399299ab8653b88 ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | ASSERT_EQ(exact.Value().drilling_constraint_third_directional_gradient[node] .Size(), 24U) | EXPECT_NEAR( exact.Value().drilling_constraint_third_directional_gradient[node] [row], finite_difference, 2.0e-5) ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | ASSERT_EQ(exact.Value().drilling_constraint_third_directional_gradient[node] .Size(), 24U) | EXPECT_NEAR( exact.Value().drilling_constraint_third_directional_gradient[node] [row], finite_difference, 2.0e-5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintIncludesForceTimeAndCurvatureTerms NonlinearMitc4Residual.ExternalDrillingConstraintIncludesForceTimeAndCurvatureTerms; assertion 10개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintIncludesForceTimeAndCurvatureTerms 유지 원문 검사 body 및 assertion 동일. ae7d5f1cfc46795fbb1f8992fddd0ff8a72d6148c99d90735a68e0dd5da0bba1 ae7d5f1cfc46795fbb1f8992fddd0ff8a72d6148c99d90735a68e0dd5da0bba1 ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(exact.Value().directional_first, (plus.Value().value - minus.Value().value) / (2.0 * h), 2.0e-8) | EXPECT_NEAR(exact.Value().directional_second, (plus.Value().value - 2.0 * exact.Value().value + minus.Value().value) / (h * h), 3.0e-7) | EXPECT_NEAR(exact.Value().gradient_directional_first[row], (plus.Value().gradient[row] - minus.Value().gradient[row]) / (2.0 * h), 3.0e-8) | EXPECT_NEAR( exact.Value().gradient_directional_second[row], (plus.Value().gradient[row] - 2.0 * exact.Value().gradient[row] + minus.Value().gradient[row]) / (h * h), 4.0e-7) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_NEAR(exact.Value().hessian(row, column), (positive.Value().gradient[row] - negative.Value().gradient[row]) / (2.0 * h), 2.0e-7) ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(exact.Value().directional_first, (plus.Value().value - minus.Value().value) / (2.0 * h), 2.0e-8) | EXPECT_NEAR(exact.Value().directional_second, (plus.Value().value - 2.0 * exact.Value().value + minus.Value().value) / (h * h), 3.0e-7) | EXPECT_NEAR(exact.Value().gradient_directional_first[row], (plus.Value().gradient[row] - minus.Value().gradient[row]) / (2.0 * h), 3.0e-8) | EXPECT_NEAR( exact.Value().gradient_directional_second[row], (plus.Value().gradient[row] - 2.0 * exact.Value().gradient[row] + minus.Value().gradient[row]) / (h * h), 4.0e-7) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_NEAR(exact.Value().hessian(row, column), (positive.Value().gradient[row] - negative.Value().gradient[row]) / (2.0 * h), 2.0e-7) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintRejectsInvalidRotationAndHasZeroForceValue NonlinearMitc4Residual.ExternalDrillingConstraintRejectsInvalidRotationAndHasZeroForceValue; assertion 9개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintRejectsInvalidRotationAndHasZeroForceValue 유지 원문 검사 body 및 assertion 동일. c6774c3ef132d2277a95b92d7df0c1f0a2c9cae68cd1562a36ec07921aefc433 c6774c3ef132d2277a95b92d7df0c1f0a2c9cae68cd1562a36ec07921aefc433 "ASSERT_TRUE(zero.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().value, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_first, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_second, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_first[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_second[row], 0.0) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-rotation"")" "ASSERT_TRUE(zero.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().value, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_first, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_second, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_first[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_second[row], 0.0) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-rotation"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.TinyRotationPreservesPhysicalForceAndRecoveryEnergy NonlinearMitc4Residual.TinyRotationPreservesPhysicalForceAndRecoveryEnergy; assertion 11개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.TinyRotationPreservesPhysicalForceAndRecoveryEnergy 유지 원문 검사 body 및 assertion 동일. d165f9780c2e6af21e2fd97f7ce8451f18ab885a26d92761617a13cae977696e d165f9780c2e6af21e2fd97f7ce8451f18ab885a26d92761617a13cae977696e ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(zero.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().physical_force[row], 0.0) | ASSERT_GT(scale, 0.0) | ASSERT_GT(quadratic_energy, 0.0) | EXPECT_LE(error / scale, 1e-12) | EXPECT_GT(actual.Value().physical_strain_energy, 0.0) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - quadratic_energy) / quadratic_energy, 1e-12) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - shear_energy) / shear_energy, 1e-12) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(zero.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().physical_force[row], 0.0) | ASSERT_GT(scale, 0.0) | ASSERT_GT(quadratic_energy, 0.0) | EXPECT_LE(error / scale, 1e-12) | EXPECT_GT(actual.Value().physical_strain_energy, 0.0) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - quadratic_energy) / quadratic_energy, 1e-12) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - shear_energy) / shear_energy, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@1-197 helper/oracle/fixture/include/static assertion 구간: Node, Nodes, NodePointers, Frames, Shell, if, Trial, AddScaled, Direction, ToVector, ReferenceLength, WorkConjugateDirection, WorkConjugate, ChannelNorm, FrobeniusNorm, WorkConjugateTangent, ExpectRelative tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 90ea99ff9b85b927825b8ae83597911a8c75a64fb655d2f0407528119a4fe7aa 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@226-227 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a5600c1fcbcc2b375d90f9a0b51fcb733f74bb959c86447c819b9a8f8c6bced8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@290-291 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 138ed0391b2a8c8081bcdd75fe8ff2c89800a73301b761308a5607407eac6b85 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@321-322 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 80a26bf8dd830eafbfa37a987c6ca13ed7f75849c83da7f86476be70612b7b5a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@336-337 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 808b628cf835f37ca1165035141cf55c77f1b82ba64e5e88837d89c12aa5edc4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@362-363 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b43457f2efa97906a6ef783cd74e022646ee67c2ef526f6a96855ce0af4d2471 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@401-402 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f2cfb81414bf1e8f81009769c5476d4bfb83a9e564ab1c3851411dfc077ad757 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@420-480 helper/oracle/fixture/include/static assertion 구간: CheckThirdSweep, if tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d3556f4001a86aab0161a4dc5f94d4903c713cd3a2e71db2c68fc845b7929abd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@837-838 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0436d99db81007fd4713cbcfd2850b351089fc3c05ab34e291a90e1e7621d07d 0436d99db81007fd4713cbcfd2850b351089fc3c05ab34e291a90e1e7621d07d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UndeformedStateHasZeroPhysicalRecovery NonlinearMitc4Shell.UndeformedStateHasZeroPhysicalRecovery; assertion 1개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UndeformedStateHasZeroPhysicalRecovery 유지 원문 검사 body 및 assertion 동일. f3b34af9d811fbfa8302ccb17c75561b3d2674fee61705e5476681bfe4fd4489 f3b34af9d811fbfa8302ccb17c75561b3d2674fee61705e5476681bfe4fd4489 ASSERT_TRUE(recovery.HasValue()) ASSERT_TRUE(recovery.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.BendingResultantsMatchStressThicknessMoments NonlinearMitc4Recovery.BendingResultantsMatchStressThicknessMoments; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.BendingResultantsMatchStressThicknessMoments 유지 원문 검사 body 및 assertion 동일. 34fd7f143c5939eb6db783e82cb725a6ffab1e0bd5e788a2215805ba0232fdcb 34fd7f143c5939eb6db783e82cb725a6ffab1e0bd5e788a2215805ba0232fdcb ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | ASSERT_GT(std::abs(moment), 0.0) | EXPECT_NEAR(point.section_resultant[3U + component], moment, 1.0e-12 * std::abs(moment)) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | ASSERT_GT(std::abs(moment), 0.0) | EXPECT_NEAR(point.section_resultant[3U + component], moment, 1.0e-12 * std::abs(moment)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsInvalidNodeAndInitialFrameContracts NonlinearMitc4Shell.RejectsInvalidNodeAndInitialFrameContracts; assertion 6개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsInvalidNodeAndInitialFrameContracts 유지 원문 검사 body 및 assertion 동일. 09059c92e764720f2295f7dd9557530496e4f458cb2eae0317a64daccaae6ac3 09059c92e764720f2295f7dd9557530496e4f458cb2eae0317a64daccaae6ac3 "ASSERT_FALSE(null_node.HasValue()) | EXPECT_EQ(null_node.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-geometry"") | ASSERT_FALSE(duplicate_frame.HasValue()) | EXPECT_EQ(duplicate_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"") | ASSERT_FALSE(invalid_frame.HasValue()) | EXPECT_EQ(invalid_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"")" "ASSERT_FALSE(null_node.HasValue()) | EXPECT_EQ(null_node.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-geometry"") | ASSERT_FALSE(duplicate_frame.HasValue()) | EXPECT_EQ(duplicate_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"") | ASSERT_FALSE(invalid_frame.HasValue()) | EXPECT_EQ(invalid_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UsesFixedInitialReferenceGeometry NonlinearMitc4Shell.UsesFixedInitialReferenceGeometry; assertion 1개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UsesFixedInitialReferenceGeometry 유지 원문 검사 body 및 assertion 동일. 54a10626cf3848a02f009f15114e4ee270eddc556033d856cbde1a6232e2dd50 54a10626cf3848a02f009f15114e4ee270eddc556033d856cbde1a6232e2dd50 ASSERT_TRUE(recovery.HasValue()) ASSERT_TRUE(recovery.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.PreservesUnnormalizedInterpolatedDirector NonlinearMitc4Shell.PreservesUnnormalizedInterpolatedDirector; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.PreservesUnnormalizedInterpolatedDirector 유지 원문 검사 body 및 assertion 동일. acae08ee38b9b527574ad3d03d4dc5ded4224d8d4c298c4166d587dfe2d2f1c5 acae08ee38b9b527574ad3d03d4dc5ded4224d8d4c298c4166d587dfe2d2f1c5 ASSERT_TRUE(recovery.HasValue()) | EXPECT_GT(recovery.Value().physical_strain_energy, 0.0) | EXPECT_NEAR(recovery.Value().gauss_points[0U].generalized_strain[0U], expected_membrane, 1.0e-12) ASSERT_TRUE(recovery.HasValue()) | EXPECT_GT(recovery.Value().physical_strain_energy, 0.0) | EXPECT_NEAR(recovery.Value().gauss_points[0U].generalized_strain[0U], expected_membrane, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsOpposedOrDegenerateCurrentDirectors NonlinearMitc4Shell.RejectsOpposedOrDegenerateCurrentDirectors; assertion 2개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsOpposedOrDegenerateCurrentDirectors 유지 원문 검사 body 및 assertion 동일. 022372a03ed1384ea9018c527e60a8bb2e92a34abcabf2a3114b60516a9b39bc 022372a03ed1384ea9018c527e60a8bb2e92a34abcabf2a3114b60516a9b39bc "ASSERT_FALSE(recovery.HasValue()) | EXPECT_EQ(recovery.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-director"")" "ASSERT_FALSE(recovery.HasValue()) | EXPECT_EQ(recovery.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-director"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.MatchesLinearMitc4RecoveryInSmallRotationLimit NonlinearMitc4Shell.MatchesLinearMitc4RecoveryInSmallRotationLimit; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.MatchesLinearMitc4RecoveryInSmallRotationLimit 유지 원문 검사 body 및 assertion 동일. fd4b13f2fcc4938b50ae86d5f55795e3a40d899b81407fca14f78e5a9d6becd0 fd4b13f2fcc4938b50ae86d5f55795e3a40d899b81407fca14f78e5a9d6becd0 ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear_recovery.HasValue()) | ASSERT_TRUE(linear_recovery.HasValue()) | EXPECT_NEAR(nonlinear_recovery.Value().gauss_points[point] .generalized_strain[component], linear_recovery.Value().points[point] .generalized_strain[component], 1.0e-11) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear_recovery.HasValue()) | ASSERT_TRUE(linear_recovery.HasValue()) | EXPECT_NEAR(nonlinear_recovery.Value().gauss_points[point] .generalized_strain[component], linear_recovery.Value().points[point] .generalized_strain[component], 1.0e-11) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.FiniteRigidMotionIsObjective NonlinearMitc4Shell.FiniteRigidMotionIsObjective; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.FiniteRigidMotionIsObjective 유지 원문 검사 body 및 assertion 동일. d31c4760ff39f940a70cb95e45b595095d334feafcc4f498f930764011944a71 d31c4760ff39f940a70cb95e45b595095d334feafcc4f498f930764011944a71 ASSERT_TRUE(recovery.HasValue()) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(recovery.Value().physical_strain_energy, 0.0, 1.0e-12) ASSERT_TRUE(recovery.HasValue()) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(recovery.Value().physical_strain_energy, 0.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.EmitsOnlyFixedPhysicalGaussAndStressRows NonlinearMitc4Recovery.EmitsOnlyFixedPhysicalGaussAndStressRows; assertion 7개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.EmitsOnlyFixedPhysicalGaussAndStressRows 유지 원문 검사 body 및 assertion 동일. 0008b0829c8e00bd25ac54d72bd223db1acd69f836b6804b78b3557549fac911 0008b0829c8e00bd25ac54d72bd223db1acd69f836b6804b78b3557549fac911 ASSERT_TRUE(recovery.HasValue()) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates[0U], point == 0U || point == 3U ? -gauss : gauss) | EXPECT_EQ(row.natural_coordinates[1U], point < 2U ? -gauss : gauss) | EXPECT_EQ(row.stress[stress].position, positions[stress]) | EXPECT_EQ(row.stress[stress].zeta, zeta[stress]) | EXPECT_EQ(row.stress[stress].components.size(), 3U) ASSERT_TRUE(recovery.HasValue()) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates[0U], point == 0U || point == 3U ? -gauss : gauss) | EXPECT_EQ(row.natural_coordinates[1U], point < 2U ? -gauss : gauss) | EXPECT_EQ(row.stress[stress].position, positions[stress]) | EXPECT_EQ(row.stress[stress].zeta, zeta[stress]) | EXPECT_EQ(row.stress[stress].components.size(), 3U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@1-85 helper/oracle/fixture/include/static assertion 구간: Node, Nodes, NodePointers, Frames, Section, Material, ZeroTrial, Multiply, ExpectZeroRecovery, for, Shell tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a6879fd0fa6466d6fb021e12f76588f690a846dd854355d61c5bfd6fbe0de63b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@124-125 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8dee679c89e7fcd7d139da1813c32774ca38d795655c80ce8208b3ab09423c5d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@152-153 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ff3e2239c30471e94bbc18e563e41bb3744f9395c5d81311174b05782fb6ebc8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@165-166 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 51ced39c2cbb72399c0b49dc9722cc1329c34f357f19be7280ef1e77b2b3e145 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@183-184 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2c8cd1d1980cb0d96addfd4b8037f4d929026a5ac7d0a6ec8856069b5ea0c9d0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@196-197 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 97be9107d040c13bb40f904c4c01ca1d474fce4260203ac57dfa81b0e1c90824 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@235-236 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9b570c15351976fab371b347ec27443d3155262b9585a574bef6a511922d035c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@264-265 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cd67c16794266a7614069ddb2948a60455ba1fa76721f5c3df9ff598aa83e25f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@293-294 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/thermal_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/unit/elements/thermal_shell_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 70b2d6efab8783f723e6abf838fd6c50a1ea25a436480271f0ad9d9234b062db 70b2d6efab8783f723e6abf838fd6c50a1ea25a436480271f0ad9d9234b062db 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.RationalMatricesSymmetryAndConstantModeUseFixedBudgets ThermalShell.RationalMatricesSymmetryAndConstantModeUseFixedBudgets; assertion 9개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.RationalMatricesSymmetryAndConstantModeUseFixedBudgets 유지 원문 검사 body 및 assertion 동일. b77746063cee453fa1b02d7e825896772f68eda7c436d562a9f120ee00254067 b77746063cee453fa1b02d7e825896772f68eda7c436d562a9f120ee00254067 "ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), exact.c), ec) | EXPECT_LE(Difference(kernel.Conductivity(), exact.k), ek) | EXPECT_LE(cs, 2 * ec) | EXPECT_LE(ks, 2 * ek) | EXPECT_LE(null, std::sqrt(20.) * ek) | EXPECT_LE(std::abs(total - 2), 20 * ec) | EXPECT_EQ(kernel.SourceId().source_label_text, ""0019"") | EXPECT_EQ(kernel.NodeIndices(), (std::array{{7, 2, 9, 4}}))" "ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), exact.c), ec) | EXPECT_LE(Difference(kernel.Conductivity(), exact.k), ek) | EXPECT_LE(cs, 2 * ec) | EXPECT_LE(ks, 2 * ek) | EXPECT_LE(null, std::sqrt(20.) * ek) | EXPECT_LE(std::abs(total - 2), 20 * ec) | EXPECT_EQ(kernel.SourceId().source_label_text, ""0019"") | EXPECT_EQ(kernel.NodeIndices(), (std::array{{7, 2, 9, 4}}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.CapacityIsPositiveAndConductionHasExactlyOneNullMode ThermalShell.CapacityIsPositiveAndConductionHasExactlyOneNullMode; assertion 4개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.CapacityIsPositiveAndConductionHasExactlyOneNullMode 유지 원문 검사 body 및 assertion 동일. ebcd38fd5f93e481370605596eae5bfee78bd230ee37b0a15d07f1eeead80087 ebcd38fd5f93e481370605596eae5bfee78bd230ee37b0a15d07f1eeead80087 ASSERT_TRUE(created.HasValue()) | EXPECT_GT(capacity.first, Gamma(4096) * Norm(exact.pc) + backward) | EXPECT_LE(std::abs(conduction.first), Gamma(4096) * Norm(exact.pk) + backward) | EXPECT_GT(positive.first, Gamma(4096) * Norm(exact.pk) + backward + projection_budget) ASSERT_TRUE(created.HasValue()) | EXPECT_GT(capacity.first, Gamma(4096) * Norm(exact.pc) + backward) | EXPECT_LE(std::abs(conduction.first), Gamma(4096) * Norm(exact.pk) + backward) | EXPECT_GT(positive.first, Gamma(4096) * Norm(exact.pk) + backward + projection_budget) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.Direct54MatchesSeparatedOperatorsOnActualThreeDimensionalPatches ThermalShell.Direct54MatchesSeparatedOperatorsOnActualThreeDimensionalPatches; assertion 3개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.Direct54MatchesSeparatedOperatorsOnActualThreeDimensionalPatches 유지 원문 검사 body 및 assertion 동일. fcd2050a389cecd6349305c4f881f5347bda524a64af04cf7b5e1e6228aea544 fcd2050a389cecd6349305c4f881f5347bda524a64af04cf7b5e1e6228aea544 ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), direct.c), Norm(kernel.CapacityError()) + Gamma(8192) * Norm(direct.pc)) | EXPECT_LE(Difference(kernel.Conductivity(), direct.k), Norm(kernel.ConductivityError()) + Gamma(8192) * Norm(direct.pk)) ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), direct.c), Norm(kernel.CapacityError()) + Gamma(8192) * Norm(direct.pc)) | EXPECT_LE(Difference(kernel.Conductivity(), direct.k), Norm(kernel.ConductivityError()) + Gamma(8192) * Norm(direct.pk)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.ThicknessScalingPreservesBothConductionTermsAndCapacity ThermalShell.ThicknessScalingPreservesBothConductionTermsAndCapacity; assertion 3개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.ThicknessScalingPreservesBothConductionTermsAndCapacity 유지 원문 검사 body 및 assertion 동일. 4af2e5d6dba4e15c7ef44c0f8aefc95988294ee8693ef71d0e3ef0f398507b61 4af2e5d6dba4e15c7ef44c0f8aefc95988294ee8693ef71d0e3ef0f398507b61 ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), exact.c), Gamma(4096) * Norm(exact.pc)) | EXPECT_LE(Difference(created.Value().Conductivity(), exact.k), Gamma(4096) * Norm(exact.pk)) ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), exact.c), Gamma(4096) * Norm(exact.pc)) | EXPECT_LE(Difference(created.Value().Conductivity(), exact.k), Gamma(4096) * Norm(exact.pk)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.AffineLinearFluxFramesAndSeparateMidsurfaceTraces ThermalShell.AffineLinearFluxFramesAndSeparateMidsurfaceTraces; assertion 10개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.AffineLinearFluxFramesAndSeparateMidsurfaceTraces 유지 원문 검사 body 및 assertion 동일. 00b41e05c43005233fd41fe3065da06b97e3a43af290bea482c61bdf1875eaaf 00b41e05c43005233fd41fe3065da06b97e3a43af290bea482c61bdf1875eaaf ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | EXPECT_LE( (recovery.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (linear_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_NEAR(frame[i].Dot(frame[j]), i == j ? 1. : 0., Gamma(2048)) | EXPECT_NEAR(frame[0].Cross(frame[1]).Dot(frame[2]), 1., Gamma(2048)) | ASSERT_TRUE(traces.HasValue()) | EXPECT_EQ(traces.Value().global_flux[6 * ip + 2].Z(), 0.) | EXPECT_NEAR(traces.Value().global_flux[6 * ip + 3].Z(), -2., Gamma(2048) * 2) | ASSERT_TRUE(constant.HasValue()) | EXPECT_LE(constant.Value().global_flux[row].Norm(), Gamma(2048) * constant_scale.scale[row]) ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | EXPECT_LE( (recovery.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (linear_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_NEAR(frame[i].Dot(frame[j]), i == j ? 1. : 0., Gamma(2048)) | EXPECT_NEAR(frame[0].Cross(frame[1]).Dot(frame[2]), 1., Gamma(2048)) | ASSERT_TRUE(traces.HasValue()) | EXPECT_EQ(traces.Value().global_flux[6 * ip + 2].Z(), 0.) | EXPECT_NEAR(traces.Value().global_flux[6 * ip + 3].Z(), -2., Gamma(2048) * 2) | ASSERT_TRUE(constant.HasValue()) | EXPECT_LE(constant.Value().global_flux[row].Norm(), Gamma(2048) * constant_scale.scale[row]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.TranslationRotationAndReversedNormalPreservePhysicalFlux ThermalShell.TranslationRotationAndReversedNormalPreservePhysicalFlux; assertion 10개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.TranslationRotationAndReversedNormalPreservePhysicalFlux 유지 원문 검사 body 및 assertion 동일. d3b3148c1533aa48c401f4b4d92418d4c57abdb89b589de242b5394ac13349b0 d3b3148c1533aa48c401f4b4d92418d4c57abdb89b589de242b5394ac13349b0 ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(moved.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(flipped.HasValue()) | EXPECT_LE( Difference(base.Value().Capacity(), moved.Value().Capacity()), Norm(base.Value().CapacityError()) + Norm(moved.Value().CapacityError())) | EXPECT_LE( Difference(base.Value().Conductivity(), turned.Value().Conductivity()), Norm(base.Value().ConductivityError()) + Norm(turned.Value().ConductivityError())) | ASSERT_TRUE(flux.HasValue()) | ASSERT_TRUE(reverse.HasValue()) | EXPECT_LE((flux.Value().global_flux[row] - rotate({-3, 2, -4})).Norm(), Gamma(2048) * (turn_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_LE( (reverse.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (reverse_scale.scale[row] + Vector3{3, -2, 4}.Norm())) ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(moved.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(flipped.HasValue()) | EXPECT_LE( Difference(base.Value().Capacity(), moved.Value().Capacity()), Norm(base.Value().CapacityError()) + Norm(moved.Value().CapacityError())) | EXPECT_LE( Difference(base.Value().Conductivity(), turned.Value().Conductivity()), Norm(base.Value().ConductivityError()) + Norm(turned.Value().ConductivityError())) | ASSERT_TRUE(flux.HasValue()) | ASSERT_TRUE(reverse.HasValue()) | EXPECT_LE((flux.Value().global_flux[row] - rotate({-3, 2, -4})).Norm(), Gamma(2048) * (turn_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_LE( (reverse.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (reverse_scale.scale[row] + Vector3{3, -2, 4}.Norm())) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.CheckedCreationAndRecoveryRetainSourceAndRejectNonfinite ThermalShell.CheckedCreationAndRecoveryRetainSourceAndRejectNonfinite; assertion 7개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.CheckedCreationAndRecoveryRetainSourceAndRejectNonfinite 유지 원문 검사 body 및 assertion 동일. fa5ae9a4a6c78eb6502fe375b86097724b5484608a38dc580d02729c1662512e fa5ae9a4a6c78eb6502fe375b86097724b5484608a38dc580d02729c1662512e "EXPECT_FALSE(Kernel(kSquare, bad).HasValue()) | EXPECT_FALSE(Kernel(kSquare, 2, bad).HasValue()) | ASSERT_TRUE(created.HasValue()) | ASSERT_FALSE(bad.HasValue()) | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].entity_identity, ""patch:0019"") | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].location.line, 42U) | EXPECT_FALSE(created.Value().Recover(temperature).HasValue())" "EXPECT_FALSE(Kernel(kSquare, bad).HasValue()) | EXPECT_FALSE(Kernel(kSquare, 2, bad).HasValue()) | ASSERT_TRUE(created.HasValue()) | ASSERT_FALSE(bad.HasValue()) | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].entity_identity, ""patch:0019"") | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].location.line, 42U) | EXPECT_FALSE(created.Value().Recover(temperature).HasValue())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.GeneralWarpedFluxUsesActualReciprocalTangentsAndTraceOrder ThermalShell.GeneralWarpedFluxUsesActualReciprocalTangentsAndTraceOrder; assertion 4개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.GeneralWarpedFluxUsesActualReciprocalTangentsAndTraceOrder 유지 원문 검사 body 및 assertion 동일. d8ac116acd93e87e33b2b21c1880b4f4b554f07a2d11fcaba6c3031151e9b780 d8ac116acd93e87e33b2b21c1880b4f4b554f07a2d11fcaba6c3031151e9b780 ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE((actual.Value().global_flux[row] - expected.value[row]).Norm(), 2 * Gamma(2048) * expected.scale[row]) | EXPECT_GT((actual.Value().frames[0][2] - actual.Value().frames[1][2]).Norm(), 1.) ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE((actual.Value().global_flux[row] - expected.value[row]).Norm(), 2 * Gamma(2048) * expected.scale[row]) | EXPECT_GT((actual.Value().frames[0][2] - actual.Value().frames[1][2]).Norm(), 1.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.PowerOfTwoCoordinateScalingPreservesDimensionedOperators ThermalShell.PowerOfTwoCoordinateScalingPreservesDimensionedOperators; assertion 3개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.PowerOfTwoCoordinateScalingPreservesDimensionedOperators 유지 원문 검사 body 및 assertion 동일. c09333202e2a4f5cf6a42a31c1e5cd786979db0b59663bca37fc8bd4e508762d c09333202e2a4f5cf6a42a31c1e5cd786979db0b59663bca37fc8bd4e508762d ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), c), Norm(created.Value().CapacityError()) + Gamma(4096) * Norm(c)) | EXPECT_LE( Difference(created.Value().Conductivity(), k), Norm(created.Value().ConductivityError()) + Gamma(4096) * Norm(k)) ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), c), Norm(created.Value().CapacityError()) + Gamma(4096) * Norm(c)) | EXPECT_LE( Difference(created.Value().Conductivity(), k), Norm(created.Value().ConductivityError()) + Gamma(4096) * Norm(k)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp ThermalShell.RejectsUnrepresentablePositivePropertiesWithoutClamping ThermalShell.RejectsUnrepresentablePositivePropertiesWithoutClamping; assertion 2개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.RejectsUnrepresentablePositivePropertiesWithoutClamping 유지 원문 검사 body 및 assertion 동일. ce5c3d9a306fa53f5457ea5db0a9d002d806423381a139cd329f8c6b42bae98b ce5c3d9a306fa53f5457ea5db0a9d002d806423381a139cd329f8c6b42bae98b EXPECT_FALSE(underflow.HasValue()) | EXPECT_FALSE(overflow.HasValue()) EXPECT_FALSE(underflow.HasValue()) | EXPECT_FALSE(overflow.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/elements/thermal_shell_test.cpp support@1-245 helper/oracle/fixture/include/static assertion 구간: Gamma, Norm, Difference, Kernel, Oracle, Rational, Direct54, FluxOracle, Flux, EigenExtrema, if tests/unit/elements/thermal_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4b36e387f8082d0a918209d0e72ac417a3b4be25b0bcd07da65f3c169413c725 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/fem/dof_manager_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 12개 tests/unit/fem/dof_manager_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 752d1a2138fc77ec40346e6575f87c9e96d69dd9f9c097eff316e6de887d2195 bd0972cde135770050c66143519332b17cb62a5c17b81530927fb27ef017c844 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/fem/dof_manager_test.cpp DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder; assertion 17개 tests/unit/fem/dof_manager_test.cpp DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder 유지 원문 검사 body 및 assertion 동일. 41f2338c870fdbb3eff99743a0ef8112756b63092f3525a035a3755eb09882b1 41f2338c870fdbb3eff99743a0ef8112756b63092f3525a035a3755eb09882b1 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(dofs.ValidateInvariants().IsOk()) | ASSERT_TRUE(first_scatter.HasValue()) | ASSERT_TRUE(second_scatter.HasValue()) | EXPECT_EQ(first_scatter.Value(), (std::vector{14U, 12U, 2U, 0U})) | EXPECT_EQ(second_scatter.Value(), (std::vector{11U, 7U, 9U})) | EXPECT_EQ(RowColumns(pattern, 14U), (std::vector{0U, 2U, 12U, 14U})) | EXPECT_EQ(RowColumns(pattern, 7U), (std::vector{7U, 9U, 11U})) | ASSERT_FALSE(reversed_status.IsOk()) | ASSERT_EQ(reversed_status.Diagnostics().size(), 1U) | EXPECT_EQ(reversed_status.Diagnostics()[0U].code, ""invalid-element-layout-order"") | EXPECT_EQ(dofs.FreeDofs(), expected_free_dofs) | EXPECT_EQ(dofs.ConstrainedDofs(), expected_constrained_dofs) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, expected_row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, expected_columns)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(dofs.ValidateInvariants().IsOk()) | ASSERT_TRUE(first_scatter.HasValue()) | ASSERT_TRUE(second_scatter.HasValue()) | EXPECT_EQ(first_scatter.Value(), (std::vector{14U, 12U, 2U, 0U})) | EXPECT_EQ(second_scatter.Value(), (std::vector{11U, 7U, 9U})) | EXPECT_EQ(RowColumns(pattern, 14U), (std::vector{0U, 2U, 12U, 14U})) | EXPECT_EQ(RowColumns(pattern, 7U), (std::vector{7U, 9U, 11U})) | ASSERT_FALSE(reversed_status.IsOk()) | ASSERT_EQ(reversed_status.Diagnostics().size(), 1U) | EXPECT_EQ(reversed_status.Diagnostics()[0U].code, ""invalid-element-layout-order"") | EXPECT_EQ(dofs.FreeDofs(), expected_free_dofs) | EXPECT_EQ(dofs.ConstrainedDofs(), expected_constrained_dofs) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, expected_row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, expected_columns)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp DofManager.RejectsEveryCorruptedOwnerMappingInvariant DofManager.RejectsEveryCorruptedOwnerMappingInvariant; assertion 0개 tests/unit/fem/dof_manager_test.cpp DofManager.RejectsEveryCorruptedOwnerMappingInvariant 유지 원문 검사 body 및 assertion 동일. f3a2d0c1bdbc2bfcc10e6a27711d07586fe8076fb87c957f8448b0edef5ff5f0 f3a2d0c1bdbc2bfcc10e6a27711d07586fe8076fb87c957f8448b0edef5ff5f0 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp DofManager.NumbersSixDofsAndFreeEquationsStably DofManager.NumbersSixDofsAndFreeEquationsStably; assertion 13개 tests/unit/fem/dof_manager_test.cpp DofManager.NumbersSixDofsAndFreeEquationsStably 유지 원문 검사 body 및 assertion 동일. 164a3c027dad0f2949360355d4e84d64180d8478dc812815c46df9d2e9de63fa 164a3c027dad0f2949360355d4e84d64180d8478dc812815c46df9d2e9de63fa EXPECT_EQ(dofs.FullDofCount(), 18U) | EXPECT_EQ(dofs.FreeDofCount(), 13U) | EXPECT_EQ(dofs.ConstrainedDofCount(), 5U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUx), 0U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUrz), 5U) | EXPECT_EQ(dofs.FullDof(1U, fesa::DofComponent::kUx), 6U) | EXPECT_EQ(dofs.FullDof(2U, fesa::DofComponent::kUrz), 17U) | EXPECT_EQ(dofs.FreeDofs(), (std::vector{3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 12U, 13U, 15U, 16U, 17U})) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 1U, 2U, 11U, 14U})) | EXPECT_EQ(dofs.FreeEquation(0U), std::nullopt) | EXPECT_EQ(dofs.FreeEquation(3U), std::optional{0U}) | EXPECT_EQ(dofs.FreeEquation(10U), std::optional{7U}) | EXPECT_EQ(dofs.FreeEquation(17U), std::optional{12U}) EXPECT_EQ(dofs.FullDofCount(), 18U) | EXPECT_EQ(dofs.FreeDofCount(), 13U) | EXPECT_EQ(dofs.ConstrainedDofCount(), 5U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUx), 0U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUrz), 5U) | EXPECT_EQ(dofs.FullDof(1U, fesa::DofComponent::kUx), 6U) | EXPECT_EQ(dofs.FullDof(2U, fesa::DofComponent::kUrz), 17U) | EXPECT_EQ(dofs.FreeDofs(), (std::vector{3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 12U, 13U, 15U, 16U, 17U})) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 1U, 2U, 11U, 14U})) | EXPECT_EQ(dofs.FreeEquation(0U), std::nullopt) | EXPECT_EQ(dofs.FreeEquation(3U), std::optional{0U}) | EXPECT_EQ(dofs.FreeEquation(10U), std::optional{7U}) | EXPECT_EQ(dofs.FreeEquation(17U), std::optional{12U}) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp DofManager.ExpandsAndValidatesPrescribedValues DofManager.ExpandsAndValidatesPrescribedValues; assertion 16개 tests/unit/fem/dof_manager_test.cpp DofManager.ExpandsAndValidatesPrescribedValues 유지 원문 검사 body 및 assertion 동일. 6cf0e5ec3dec89d94ff24af258558bcf13c72a823748c36a839c4a4d5daf9b1c 6cf0e5ec3dec89d94ff24af258558bcf13c72a823748c36a839c4a4d5daf9b1c "ASSERT_EQ(values.Size(), 5U) | EXPECT_DOUBLE_EQ(values[0], 0.0) | EXPECT_DOUBLE_EQ(values[1], 0.0) | EXPECT_DOUBLE_EQ(values[2], 0.25) | EXPECT_DOUBLE_EQ(values[3], -0.5) | EXPECT_DOUBLE_EQ(values[4], 0.25) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(conflict.HasValue()) | EXPECT_EQ(conflict.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(conflict.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""conflicting-boundary-condition"") | EXPECT_EQ(diagnostic.keyword, ""BOUNDARY"") | EXPECT_EQ(diagnostic.entity_identity, ""root"") | EXPECT_EQ(diagnostic.location.file, std::filesystem::path{""models/dof-manager.inp""}) | EXPECT_EQ(diagnostic.location.line, 77U)" "ASSERT_EQ(values.Size(), 5U) | EXPECT_DOUBLE_EQ(values[0], 0.0) | EXPECT_DOUBLE_EQ(values[1], 0.0) | EXPECT_DOUBLE_EQ(values[2], 0.25) | EXPECT_DOUBLE_EQ(values[3], -0.5) | EXPECT_DOUBLE_EQ(values[4], 0.25) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(conflict.HasValue()) | EXPECT_EQ(conflict.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(conflict.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""conflicting-boundary-condition"") | EXPECT_EQ(diagnostic.keyword, ""BOUNDARY"") | EXPECT_EQ(diagnostic.entity_identity, ""root"") | EXPECT_EQ(diagnostic.location.file, std::filesystem::path{""models/dof-manager.inp""}) | EXPECT_EQ(diagnostic.location.line, 77U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp DofManager.BuildsTwelveDofScatterAndSortedUniquePattern DofManager.BuildsTwelveDofScatterAndSortedUniquePattern; assertion 8개 tests/unit/fem/dof_manager_test.cpp DofManager.BuildsTwelveDofScatterAndSortedUniquePattern 유지 원문 검사 body 및 assertion 동일. 777cf0c0c96c7791e264fff4c6af066a696eb2afd008d54cdbf4ccd1d84f11bb 777cf0c0c96c7791e264fff4c6af066a696eb2afd008d54cdbf4ccd1d84f11bb EXPECT_EQ(dofs.ElementScatter(0U), (std::array{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U})) | EXPECT_EQ(dofs.ElementScatter(1U), (std::array{6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U})) | EXPECT_EQ(pattern.row_offsets, (std::vector{0U, 12U, 24U, 36U, 48U, 60U, 72U, 90U, 108U, 126U, 144U, 162U, 180U, 192U, 204U, 216U, 228U, 240U, 252U})) | EXPECT_EQ(RowColumns(pattern, 0U), first_block) | EXPECT_EQ(RowColumns(pattern, 7U), shared_block) | EXPECT_EQ(RowColumns(pattern, 17U), last_block) | EXPECT_TRUE(std::is_sorted(columns.begin(), columns.end())) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) EXPECT_EQ(dofs.ElementScatter(0U), (std::array{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U})) | EXPECT_EQ(dofs.ElementScatter(1U), (std::array{6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U})) | EXPECT_EQ(pattern.row_offsets, (std::vector{0U, 12U, 24U, 36U, 48U, 60U, 72U, 90U, 108U, 126U, 144U, 162U, 180U, 192U, 204U, 216U, 228U, 240U, 252U})) | EXPECT_EQ(RowColumns(pattern, 0U), first_block) | EXPECT_EQ(RowColumns(pattern, 7U), shared_block) | EXPECT_EQ(RowColumns(pattern, 17U), last_block) | EXPECT_TRUE(std::is_sorted(columns.begin(), columns.end())) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp DofManager.BuildsShellScatterInSourceNodeAndComponentOrder DofManager.BuildsShellScatterInSourceNodeAndComponentOrder; assertion 2개 tests/unit/fem/dof_manager_test.cpp DofManager.BuildsShellScatterInSourceNodeAndComponentOrder 유지 원문 검사 body 및 assertion 동일. 8e1b5e8d8a5b5b681055207235c9565bd84ba56615922df7dbe69f84482a7911 8e1b5e8d8a5b5b681055207235c9565bd84ba56615922df7dbe69f84482a7911 EXPECT_EQ(dofs.FullDofCount(), 24U) | EXPECT_EQ(dofs.ShellElementScatter(0U), (std::array{ 12U, 13U, 14U, 15U, 16U, 17U, 0U, 1U, 2U, 3U, 4U, 5U, 18U, 19U, 20U, 21U, 22U, 23U, 6U, 7U, 8U, 9U, 10U, 11U})) EXPECT_EQ(dofs.FullDofCount(), 24U) | EXPECT_EQ(dofs.ShellElementScatter(0U), (std::array{ 12U, 13U, 14U, 15U, 16U, 17U, 0U, 1U, 2U, 3U, 4U, 5U, 18U, 19U, 20U, 21U, 22U, 23U, 6U, 7U, 8U, 9U, 10U, 11U})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern; assertion 8개 tests/unit/fem/dof_manager_test.cpp DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern 유지 원문 검사 body 및 assertion 동일. 92c8de2bfcae8aace6b388803d0a64c9ac18f2d175a866e225089b21c4a623c8 92c8de2bfcae8aace6b388803d0a64c9ac18f2d175a866e225089b21c4a623c8 ASSERT_EQ(pattern.row_offsets.size(), 25U) | ASSERT_EQ(pattern.column_indices.size(), 24U * 24U) | EXPECT_EQ(pattern.row_offsets[row], row * 24U) | EXPECT_EQ(pattern.row_offsets[row + 1U], (row + 1U) * 24U) | ASSERT_EQ(columns.size(), 24U) | EXPECT_EQ(columns[column], column) | EXPECT_TRUE(std::binary_search(columns.begin(), columns.end(), row)) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) ASSERT_EQ(pattern.row_offsets.size(), 25U) | ASSERT_EQ(pattern.column_indices.size(), 24U * 24U) | EXPECT_EQ(pattern.row_offsets[row], row * 24U) | EXPECT_EQ(pattern.row_offsets[row + 1U], (row + 1U) * 24U) | ASSERT_EQ(columns.size(), 24U) | EXPECT_EQ(columns[column], column) | EXPECT_TRUE(std::binary_search(columns.begin(), columns.end(), row)) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp DofManager.ReconstructsFullReducedRoundTrip DofManager.ReconstructsFullReducedRoundTrip; assertion 2개 tests/unit/fem/dof_manager_test.cpp DofManager.ReconstructsFullReducedRoundTrip 유지 원문 검사 body 및 assertion 동일. bcaf1e9c9f316b66734a1487522db16345e115f41d6580164af239c16aef76e0 bcaf1e9c9f316b66734a1487522db16345e115f41d6580164af239c16aef76e0 ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp ThermalDofManager.MapsOnlyConnectedNodesAndOverridesModelBoundary ThermalDofManager.MapsOnlyConnectedNodesAndOverridesModelBoundary; assertion 42개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.MapsOnlyConnectedNodesAndOverridesModelBoundary 유지 원문 검사 body 및 assertion 동일. 14c6b2472e4b37fd66fa0c929e96926cb3dbd44664ac0b9917708049cc8ae79b 14c6b2472e4b37fd66fa0c929e96926cb3dbd44664ac0b9917708049cc8ae79b "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(dofs.Profile(), fesa::DofProfile::kThermal) | EXPECT_EQ(dofs.FullDofCount(), 30U) | EXPECT_THROW(dofs.FullDof(0U, fesa::DofComponent::kUx), std::logic_error) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 9U})) | ASSERT_EQ(dofs.PrescribedValues().Size(), 2U) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[0U], 3.0) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[1U], 2.0) | EXPECT_EQ(dofs.FullThermalDof(6U, fesa::ThermalDofComponent::kTop), 29U) | EXPECT_THROW(dofs.FullThermalDof(3U, fesa::ThermalDofComponent::kBottom), std::out_of_range) | EXPECT_THROW( dofs.FullThermalDof( 0U, static_cast( (std::numeric_limits::min)())), std::out_of_range) | ASSERT_TRUE(first.HasValue()) | EXPECT_EQ(first.Value(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(std::vector(second.Value().begin(), second.Value().begin() + 5U), (std::vector{5U, 6U, 7U, 8U, 9U})) | EXPECT_EQ(std::vector(second.Value().end() - 5U, second.Value().end()), (std::vector{10U, 11U, 12U, 13U, 14U})) | EXPECT_FALSE(dofs.ElementScatter(structural_layout).HasValue()) | ASSERT_FALSE(repeated.HasValue()) | EXPECT_EQ(repeated.GetStatus().Diagnostics()[0U].code, ""duplicate-element-dof"") | ASSERT_FALSE(reordered.HasValue()) | ASSERT_FALSE(invalid_component.HasValue()) | EXPECT_EQ(RowColumns(dofs.GetSparsePattern(), 0U), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(scatter_before.HasValue()) | ASSERT_FALSE(invalid.IsOk()) | EXPECT_EQ(invalid.Diagnostics()[0U].code, ""invalid-thermal-element-layout"") | EXPECT_EQ(dofs.Profile(), profile_before) | EXPECT_EQ(dofs.FullDofCount(), full_count_before) | EXPECT_EQ(dofs.FreeDofCount(), free_count_before) | EXPECT_EQ(dofs.ConstrainedDofCount(), constrained_count_before) | EXPECT_EQ(dofs.FreeDofs(), free_before) | EXPECT_EQ(dofs.ConstrainedDofs(), constrained_before) | ASSERT_EQ(dofs.PrescribedValues().Size(), prescribed_before.Size()) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[index], prescribed_before[index]) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, pattern_before.column_indices) | ASSERT_TRUE(scatter_after.HasValue()) | EXPECT_EQ(scatter_after.Value(), scatter_before.Value()) | ASSERT_FALSE(structural_misuse.IsOk()) | EXPECT_EQ(structural_misuse.Diagnostics()[0U].code, ""invalid-dof-profile"") | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(dofs.Profile(), fesa::DofProfile::kThermal) | EXPECT_EQ(dofs.FullDofCount(), 30U) | EXPECT_THROW(dofs.FullDof(0U, fesa::DofComponent::kUx), std::logic_error) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 9U})) | ASSERT_EQ(dofs.PrescribedValues().Size(), 2U) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[0U], 3.0) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[1U], 2.0) | EXPECT_EQ(dofs.FullThermalDof(6U, fesa::ThermalDofComponent::kTop), 29U) | EXPECT_THROW(dofs.FullThermalDof(3U, fesa::ThermalDofComponent::kBottom), std::out_of_range) | EXPECT_THROW( dofs.FullThermalDof( 0U, static_cast( (std::numeric_limits::min)())), std::out_of_range) | ASSERT_TRUE(first.HasValue()) | EXPECT_EQ(first.Value(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(std::vector(second.Value().begin(), second.Value().begin() + 5U), (std::vector{5U, 6U, 7U, 8U, 9U})) | EXPECT_EQ(std::vector(second.Value().end() - 5U, second.Value().end()), (std::vector{10U, 11U, 12U, 13U, 14U})) | EXPECT_FALSE(dofs.ElementScatter(structural_layout).HasValue()) | ASSERT_FALSE(repeated.HasValue()) | EXPECT_EQ(repeated.GetStatus().Diagnostics()[0U].code, ""duplicate-element-dof"") | ASSERT_FALSE(reordered.HasValue()) | ASSERT_FALSE(invalid_component.HasValue()) | EXPECT_EQ(RowColumns(dofs.GetSparsePattern(), 0U), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(scatter_before.HasValue()) | ASSERT_FALSE(invalid.IsOk()) | EXPECT_EQ(invalid.Diagnostics()[0U].code, ""invalid-thermal-element-layout"") | EXPECT_EQ(dofs.Profile(), profile_before) | EXPECT_EQ(dofs.FullDofCount(), full_count_before) | EXPECT_EQ(dofs.FreeDofCount(), free_count_before) | EXPECT_EQ(dofs.ConstrainedDofCount(), constrained_count_before) | EXPECT_EQ(dofs.FreeDofs(), free_before) | EXPECT_EQ(dofs.ConstrainedDofs(), constrained_before) | ASSERT_EQ(dofs.PrescribedValues().Size(), prescribed_before.Size()) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[index], prescribed_before[index]) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, pattern_before.column_indices) | ASSERT_TRUE(scatter_after.HasValue()) | EXPECT_EQ(scatter_after.Value(), scatter_before.Value()) | ASSERT_FALSE(structural_misuse.IsOk()) | EXPECT_EQ(structural_misuse.Diagnostics()[0U].code, ""invalid-dof-profile"") | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsChangedThermalLayoutInventory ThermalDofManager.RejectsChangedThermalLayoutInventory; assertion 6개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsChangedThermalLayoutInventory 유지 원문 검사 body 및 assertion 동일. 24dfec1451d61871c9de4765e12b026aec9b6b1285976d60b47e34c047330d85 24dfec1451d61871c9de4765e12b026aec9b6b1285976d60b47e34c047330d85 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_identity).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_order).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_nodes).IsOk()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_identity).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_order).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_nodes).IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp ThermalDofManager.KeepsDisconnectedThermalComponentsInSeparateCsrBlocks ThermalDofManager.KeepsDisconnectedThermalComponentsInSeparateCsrBlocks; assertion 6개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.KeepsDisconnectedThermalComponentsInSeparateCsrBlocks 유지 원문 검사 body 및 assertion 동일. 3c945c7278e08616de4858fb363c62549e22c8e97d0f6742280b2f61f0a218af 3c945c7278e08616de4858fb363c62549e22c8e97d0f6742280b2f61f0a218af ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().FullDofCount(), 40U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 0U).size(), 20U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 20U).front(), 20U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().FullDofCount(), 40U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 0U).size(), 20U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 20U).front(), 20U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsThermalLayoutsForStructuralModels ThermalDofManager.RejectsThermalLayoutsForStructuralModels; assertion 6개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsThermalLayoutsForStructuralModels 유지 원문 검사 body 및 assertion 동일. 87aec2f1aa1dcfc017a94fb57393f0d486489a38edebfa67898ef75e8b1cd2fc 87aec2f1aa1dcfc017a94fb57393f0d486489a38edebfa67898ef75e8b1cd2fc "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-dof-profile"") | ASSERT_FALSE(thermal_create.HasValue()) | EXPECT_EQ(thermal_create.GetStatus().Diagnostics()[0U].code, ""invalid-dof-profile"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-dof-profile"") | ASSERT_FALSE(thermal_create.HasValue()) | EXPECT_EQ(thermal_create.GetStatus().Diagnostics()[0U].code, ""invalid-dof-profile"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/fem/dof_manager_test.cpp support@1-204 helper/oracle/fixture/include/static assertion 구간: fesa, DofManagerTestAccess, DuplicateOwnership, RemoveFullMapping, ReverseFreeMapping, ReverseConstrainedMapping, CorruptEquationMapping, RemoveSparsePatternEntry, AddSparsePatternEntry, GenericLayoutElement, MakeDefinition, MakeShellDefinition, MakeThermalDefinition, DofFixture, MakeDofFixture, RowColumns, ExpectInvariantFailure tests/unit/fem/dof_manager_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2426139ebb5201edffc23485e54073039b9d44668f1802c880802f9b6a9b77e9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/fem/dof_manager_test.cpp support@375-376 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/fem/dof_manager_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. edda67d5ae3e698f84e25f71acc0ab095496b8f704006cd9bd5d64597a7e94e3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/fem/dof_manager_test.cpp support@387-388 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/fem/dof_manager_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 639575113829ba3af23c869e39aa0c68dfba327851149b3234d6c75f83aaa755 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 15개 tests/unit/io/abaqus/domain_mapper_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cdc14b4c935734140f44849672a8a15b2137233b1a5853a685577d3eb16dc728 cdc14b4c935734140f44849672a8a15b2137233b1a5853a685577d3eb16dc728 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck; assertion 54개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck 유지 원문 검사 body 및 assertion 동일. 8f78580d37874c8e4e673f2ddf25cc61801dbcae17fb3ed4731609edd952f3d3 8f78580d37874c8e4e673f2ddf25cc61801dbcae17fb3ed4731609edd952f3d3 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0001"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label_text, ""0002"") | EXPECT_DOUBLE_EQ(domain.Nodes()[1].coordinates[0], 2.0) | ASSERT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(element.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(element.SourceId().source_label_text, ""0007"") | EXPECT_EQ(element.SourceElementType(), ""B33"") | EXPECT_EQ(element.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(&element, &domain.BeamElements()[0U]) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(domain.LinearElasticMaterials()[0U].name, ""Steel"") | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].youngs_modulus, 210000.0) | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].poisson_ratio, 0.75) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(section.area, 2.0) | EXPECT_DOUBLE_EQ(section.i11, 3.0) | EXPECT_DOUBLE_EQ(section.i12, 0.0) | EXPECT_DOUBLE_EQ(section.i22, 4.0) | EXPECT_DOUBLE_EQ(section.torsional_constant, 5.0) | EXPECT_EQ(section.first_axis, (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.section_points, (std::vector>{{-0.5, 0.25}, {0.5, -0.25}})) | EXPECT_EQ(domain.BeamElements()[0U].material_index, 0U) | EXPECT_EQ(domain.BeamElements()[0U].section_index, 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.25) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.5) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.01) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 1.5) | ASSERT_EQ(step.PrescribedDisplacements().Size(), 2U) | EXPECT_EQ(step.PrescribedDisplacements()[0U].Target().target_name_or_label, ""rootassembly"") | EXPECT_EQ(step.PrescribedDisplacements()[0U].Component(), fesa::DofComponent::kUx) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[0U].PrescribedValue(), 0.125) | EXPECT_EQ(step.PrescribedDisplacements()[1U].Component(), fesa::DofComponent::kUy) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[1U].PrescribedValue(), 0.0) | ASSERT_EQ(step.ConcentratedLoads().Size(), 1U) | EXPECT_EQ(step.ConcentratedLoads()[0U].Target().target_name_or_label, ""RootAssembly"") | EXPECT_DOUBLE_EQ(step.ConcentratedLoads()[0U].GlobalComponents()[5U], -12.5) | EXPECT_EQ(domain.Warnings().size(), 8U) | ASSERT_TRUE(parsed_legacy.HasValue()) | ASSERT_TRUE(legacy.HasValue()) | EXPECT_EQ(legacy.Value().Nodes().size(), 11U) | EXPECT_EQ(legacy.Value().Elements().Size(), 10U) | EXPECT_EQ(legacy.Value().Materials().Size(), 1U) | EXPECT_EQ(legacy.Value().Sections().Size(), 1U) | EXPECT_EQ(legacy.Value().Steps().Size(), 1U) | EXPECT_EQ(legacy.Value().Warnings().size(), 7U) | EXPECT_EQ(ReadExactBytes(legacy_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(legacy_path), timestamp_before)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0001"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label_text, ""0002"") | EXPECT_DOUBLE_EQ(domain.Nodes()[1].coordinates[0], 2.0) | ASSERT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(element.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(element.SourceId().source_label_text, ""0007"") | EXPECT_EQ(element.SourceElementType(), ""B33"") | EXPECT_EQ(element.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(&element, &domain.BeamElements()[0U]) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(domain.LinearElasticMaterials()[0U].name, ""Steel"") | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].youngs_modulus, 210000.0) | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].poisson_ratio, 0.75) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(section.area, 2.0) | EXPECT_DOUBLE_EQ(section.i11, 3.0) | EXPECT_DOUBLE_EQ(section.i12, 0.0) | EXPECT_DOUBLE_EQ(section.i22, 4.0) | EXPECT_DOUBLE_EQ(section.torsional_constant, 5.0) | EXPECT_EQ(section.first_axis, (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.section_points, (std::vector>{{-0.5, 0.25}, {0.5, -0.25}})) | EXPECT_EQ(domain.BeamElements()[0U].material_index, 0U) | EXPECT_EQ(domain.BeamElements()[0U].section_index, 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.25) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.5) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.01) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 1.5) | ASSERT_EQ(step.PrescribedDisplacements().Size(), 2U) | EXPECT_EQ(step.PrescribedDisplacements()[0U].Target().target_name_or_label, ""rootassembly"") | EXPECT_EQ(step.PrescribedDisplacements()[0U].Component(), fesa::DofComponent::kUx) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[0U].PrescribedValue(), 0.125) | EXPECT_EQ(step.PrescribedDisplacements()[1U].Component(), fesa::DofComponent::kUy) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[1U].PrescribedValue(), 0.0) | ASSERT_EQ(step.ConcentratedLoads().Size(), 1U) | EXPECT_EQ(step.ConcentratedLoads()[0U].Target().target_name_or_label, ""RootAssembly"") | EXPECT_DOUBLE_EQ(step.ConcentratedLoads()[0U].GlobalComponents()[5U], -12.5) | EXPECT_EQ(domain.Warnings().size(), 8U) | ASSERT_TRUE(parsed_legacy.HasValue()) | ASSERT_TRUE(legacy.HasValue()) | EXPECT_EQ(legacy.Value().Nodes().size(), 11U) | EXPECT_EQ(legacy.Value().Elements().Size(), 10U) | EXPECT_EQ(legacy.Value().Materials().Size(), 1U) | EXPECT_EQ(legacy.Value().Sections().Size(), 1U) | EXPECT_EQ(legacy.Value().Steps().Size(), 1U) | EXPECT_EQ(legacy.Value().Warnings().size(), 7U) | EXPECT_EQ(ReadExactBytes(legacy_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(legacy_path), timestamp_before)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically; assertion 44개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically 유지 원문 검사 body 및 assertion 동일. bf2734852f2ee6378dde74ca60a0a11d717385260626eff82987b59932ab65a4 bf2734852f2ee6378dde74ca60a0a11d717385260626eff82987b59932ab65a4 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[3].source_id.source_label, 20) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.BeamElements()[0].node_indices, (std::array{0U, 1U})) | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.BeamElements()[1].node_indices, (std::array{2U, 3U})) | ASSERT_EQ(domain.NodeSets().size(), 3U) | EXPECT_EQ(domain.NodeSets()[0].name, ""Ends"") | EXPECT_EQ(domain.NodeSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.NodeSets()[0].node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.NodeSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.NodeSets()[1].node_indices, (std::vector{2U, 3U})) | EXPECT_EQ(domain.NodeSets()[2].name, ""OnlySecond"") | EXPECT_EQ(domain.NodeSets()[2].node_indices, (std::vector{3U})) | ASSERT_EQ(domain.ElementSets().size(), 3U) | EXPECT_EQ(domain.ElementSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U})) | EXPECT_EQ(domain.ElementSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.ElementSets()[1].element_indices, (std::vector{1U})) | EXPECT_EQ(domain.ElementSets()[2].name, ""OnlySecondBeam"") | EXPECT_EQ(domain.ElementSets()[2].element_indices, (std::vector{1U})) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""OnlySecond"") | EXPECT_EQ( domain.Steps()[0].ConcentratedLoads()[0U].Target().target_name_or_label, ""OnlySecond"") | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value() .Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""1"") | EXPECT_EQ(direct.Value() .Steps()[0] .ConcentratedLoads()[0U] .Target() .target_name_or_label, ""2"") | ASSERT_TRUE(above_thresholds.HasValue()) | ASSERT_TRUE(large_finite.HasValue()) | ASSERT_EQ(large_domain.Nodes().size(), 2U) | EXPECT_TRUE(large_delta.IsFinite()) | EXPECT_TRUE(std::isfinite(large_delta.Norm())) | EXPECT_DOUBLE_EQ(large_delta.Y(), 1.0e297) | EXPECT_TRUE(large_guide.IsFinite()) | EXPECT_TRUE(std::isfinite(large_guide.Norm()))" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[3].source_id.source_label, 20) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.BeamElements()[0].node_indices, (std::array{0U, 1U})) | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.BeamElements()[1].node_indices, (std::array{2U, 3U})) | ASSERT_EQ(domain.NodeSets().size(), 3U) | EXPECT_EQ(domain.NodeSets()[0].name, ""Ends"") | EXPECT_EQ(domain.NodeSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.NodeSets()[0].node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.NodeSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.NodeSets()[1].node_indices, (std::vector{2U, 3U})) | EXPECT_EQ(domain.NodeSets()[2].name, ""OnlySecond"") | EXPECT_EQ(domain.NodeSets()[2].node_indices, (std::vector{3U})) | ASSERT_EQ(domain.ElementSets().size(), 3U) | EXPECT_EQ(domain.ElementSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U})) | EXPECT_EQ(domain.ElementSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.ElementSets()[1].element_indices, (std::vector{1U})) | EXPECT_EQ(domain.ElementSets()[2].name, ""OnlySecondBeam"") | EXPECT_EQ(domain.ElementSets()[2].element_indices, (std::vector{1U})) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""OnlySecond"") | EXPECT_EQ( domain.Steps()[0].ConcentratedLoads()[0U].Target().target_name_or_label, ""OnlySecond"") | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value() .Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""1"") | EXPECT_EQ(direct.Value() .Steps()[0] .ConcentratedLoads()[0U] .Target() .target_name_or_label, ""2"") | ASSERT_TRUE(above_thresholds.HasValue()) | ASSERT_TRUE(large_finite.HasValue()) | ASSERT_EQ(large_domain.Nodes().size(), 2U) | EXPECT_TRUE(large_delta.IsFinite()) | EXPECT_TRUE(std::isfinite(large_delta.Norm())) | EXPECT_DOUBLE_EQ(large_delta.Y(), 1.0e297) | EXPECT_TRUE(large_guide.IsFinite()) | EXPECT_TRUE(std::isfinite(large_guide.Norm()))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces; assertion 12개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces 유지 원문 검사 body 및 assertion 동일. 2aba9a9e28b849050f1881692d962a2144d083d109388698a14e43a9c5c8b3fa 2aba9a9e28b849050f1881692d962a2144d083d109388698a14e43a9c5c8b3fa "ASSERT_TRUE(shared_name.HasValue()) | EXPECT_TRUE(std::any_of( domain.NodeSets().begin(), domain.NodeSets().end(), [](const fesa::NodeSet& set) { return set.name == ""ShellS4""; })) | EXPECT_TRUE(std::any_of( domain.ElementSets().begin(), domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""ShellS4""; })) | ASSERT_FALSE(duplicate_node_set.HasValue()) | EXPECT_NE(FindDiagnostic(duplicate_node_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_FALSE(duplicate_element_set.HasValue()) | EXPECT_NE( FindDiagnostic(duplicate_element_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_TRUE(assembly_shared_name.HasValue()) | EXPECT_EQ(root_node_set_count, 1) | ASSERT_NE(root_node_set, assembly_domain.NodeSets().end()) | EXPECT_EQ(root_node_set->node_indices, (std::vector{0U})) | EXPECT_EQ(std::count_if( assembly_domain.ElementSets().begin(), assembly_domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""Root""; }), 1)" "ASSERT_TRUE(shared_name.HasValue()) | EXPECT_TRUE(std::any_of( domain.NodeSets().begin(), domain.NodeSets().end(), [](const fesa::NodeSet& set) { return set.name == ""ShellS4""; })) | EXPECT_TRUE(std::any_of( domain.ElementSets().begin(), domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""ShellS4""; })) | ASSERT_FALSE(duplicate_node_set.HasValue()) | EXPECT_NE(FindDiagnostic(duplicate_node_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_FALSE(duplicate_element_set.HasValue()) | EXPECT_NE( FindDiagnostic(duplicate_element_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_TRUE(assembly_shared_name.HasValue()) | EXPECT_EQ(root_node_set_count, 1) | ASSERT_NE(root_node_set, assembly_domain.NodeSets().end()) | EXPECT_EQ(root_node_set->node_indices, (std::vector{0U})) | EXPECT_EQ(std::count_if( assembly_domain.ElementSets().begin(), assembly_domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""Root""; }), 1)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect; assertion 23개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect 유지 원문 검사 body 및 assertion 동일. 9556663b9437fa4d24f82ae5e96bbab4bc6f0cb6dc06ec796f94eafbe3bcb829 9556663b9437fa4d24f82ae5e96bbab4bc6f0cb6dc06ec796f94eafbe3bcb829 "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(with_no_ops.HasValue()) | EXPECT_TRUE(plain.Value().Warnings().empty()) | ASSERT_EQ(with_no_ops.Value().Warnings().size(), 8U) | EXPECT_EQ(with_no_ops.Value().Warnings()[0].code, ""ignored-input-keyword"") | EXPECT_EQ(with_no_ops.Value().Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[1].keyword, ""TRANSVERSE SHEAR STIFFNESS"") | EXPECT_EQ(with_no_ops.Value().Warnings()[2].keyword, ""RESTART"") | EXPECT_EQ(with_no_ops.Value().Warnings()[3].keyword, ""OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[4].keyword, ""NODE OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[5].keyword, ""ELEMENT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[6].keyword, ""CONTACT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[7].keyword, ""OUTPUT"") | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(with_no_ops.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(with_no_ops.Value().Elements().Size(), plain.Value().Elements().Size()) | EXPECT_EQ(with_no_ops.Value().Materials().Size(), plain.Value().Materials().Size()) | EXPECT_EQ(with_no_ops.Value().Sections().Size(), plain.Value().Sections().Size()) | EXPECT_EQ(with_no_ops.Value().NodeSets().size(), plain.Value().NodeSets().size()) | EXPECT_EQ(with_no_ops.Value().ElementSets().size(), plain.Value().ElementSets().size()) | EXPECT_EQ(with_no_ops.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].BoundaryConditions().size(), plain.Value().Steps()[0].BoundaryConditions().size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].Loads().size(), plain.Value().Steps()[0].Loads().size())" "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(with_no_ops.HasValue()) | EXPECT_TRUE(plain.Value().Warnings().empty()) | ASSERT_EQ(with_no_ops.Value().Warnings().size(), 8U) | EXPECT_EQ(with_no_ops.Value().Warnings()[0].code, ""ignored-input-keyword"") | EXPECT_EQ(with_no_ops.Value().Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[1].keyword, ""TRANSVERSE SHEAR STIFFNESS"") | EXPECT_EQ(with_no_ops.Value().Warnings()[2].keyword, ""RESTART"") | EXPECT_EQ(with_no_ops.Value().Warnings()[3].keyword, ""OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[4].keyword, ""NODE OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[5].keyword, ""ELEMENT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[6].keyword, ""CONTACT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[7].keyword, ""OUTPUT"") | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(with_no_ops.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(with_no_ops.Value().Elements().Size(), plain.Value().Elements().Size()) | EXPECT_EQ(with_no_ops.Value().Materials().Size(), plain.Value().Materials().Size()) | EXPECT_EQ(with_no_ops.Value().Sections().Size(), plain.Value().Sections().Size()) | EXPECT_EQ(with_no_ops.Value().NodeSets().size(), plain.Value().NodeSets().size()) | EXPECT_EQ(with_no_ops.Value().ElementSets().size(), plain.Value().ElementSets().size()) | EXPECT_EQ(with_no_ops.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].BoundaryConditions().size(), plain.Value().Steps()[0].BoundaryConditions().size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].Loads().size(), plain.Value().Steps()[0].Loads().size())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsNonlinearStaticShellProcedureAndRawControls InpDomainMapping.MapsNonlinearStaticShellProcedureAndRawControls; assertion 12개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsNonlinearStaticShellProcedureAndRawControls 유지 원문 검사 body 및 assertion 동일. 2e73d6a87d1ffc3aec44a5df50e01816e4fdf726356ea95f337dbf60a1e4d902 2e73d6a87d1ffc3aec44a5df50e01816e4fdf726356ea95f337dbf60a1e4d902 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.ProcedureKind(), fesa::StaticProcedureKind::kNonlinearFullNewton) | EXPECT_TRUE(step.IsNonlinearStatic()) | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.001) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 0.1) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0U].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[1U].source_type, fesa::ShellSourceElementType::kS4r) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.ProcedureKind(), fesa::StaticProcedureKind::kNonlinearFullNewton) | EXPECT_TRUE(step.IsNonlinearStatic()) | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.001) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 0.1) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0U].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[1U].source_type, fesa::ShellSourceElementType::kS4r) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsExplicitAndImplicitLinearStaticProcedures InpDomainMapping.KeepsExplicitAndImplicitLinearStaticProcedures; assertion 4개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsExplicitAndImplicitLinearStaticProcedures 유지 원문 검사 body 및 assertion 동일. 645611caad1634687946216c661df3ce027c77b5ea68d779fac476741753a12b 645611caad1634687946216c661df3ce027c77b5ea68d779fac476741753a12b ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Steps().Size(), 1U) | EXPECT_EQ(result.Value().Steps()[0U].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(result.Value().Steps()[0U].IsNonlinearStatic()) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Steps().Size(), 1U) | EXPECT_EQ(result.Value().Steps()[0U].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(result.Value().Steps()[0U].IsNonlinearStatic()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidNonlinearStaticControlValues InpDomainMapping.RejectsInvalidNonlinearStaticControlValues; assertion 3개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidNonlinearStaticControlValues 유지 원문 검사 body 및 assertion 동일. 4833f2bb3b01123f8994ec47b375d524c9247177bb8f2e8318fbde641ce2fd45 4833f2bb3b01123f8994ec47b375d524c9247177bb8f2e8318fbde641ce2fd45 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-nonlinear-static-data""), nullptr)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-nonlinear-static-data""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedNonlinearProceduresAndMixedModels InpDomainMapping.RejectsUnsupportedNonlinearProceduresAndMixedModels; assertion 6개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedNonlinearProceduresAndMixedModels 유지 원문 검사 body 및 assertion 동일. ecf6c6c09f3477f2db467ff9106e3b19c1553237de80831fdd99cc22dca3e390 ecf6c6c09f3477f2db467ff9106e3b19c1553237de80831fdd99cc22dca3e390 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.first == ""dynamic"" ? ""invalid-dynamic-data"" : ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_EQ(mixed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-mixed-element-model""), nullptr)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.first == ""dynamic"" ? ""invalid-dynamic-data"" : ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_EQ(mixed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-mixed-element-model""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.AcceptsOnlyNonlinearPreselectOutputNoOps InpDomainMapping.AcceptsOnlyNonlinearPreselectOutputNoOps; assertion 11개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.AcceptsOnlyNonlinearPreselectOutputNoOps 유지 원문 검사 body 및 assertion 동일. 0bb0af8b7d98b402f61fa466169286371cf638754a75cfdcd433f5066d8c1fee 0bb0af8b7d98b402f61fa466169286371cf638754a75cfdcd433f5066d8c1fee "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(result.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(result.Value().Steps()[0U].BoundaryConditions().size(), plain.Value().Steps()[0U].BoundaryConditions().size()) | EXPECT_EQ(result.Value().Steps()[0U].Loads().size(), plain.Value().Steps()[0U].Loads().size()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0U].keyword, ""OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-keyword-parameter""), nullptr)" "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(result.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(result.Value().Steps()[0U].BoundaryConditions().size(), plain.Value().Steps()[0U].BoundaryConditions().size()) | EXPECT_EQ(result.Value().Steps()[0U].Loads().size(), plain.Value().Steps()[0U].Loads().size()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0U].keyword, ""OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-keyword-parameter""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity; assertion 40개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity 유지 원문 검사 body 및 assertion 동일. 73516cc1de335e84ad43308d44db8ab9748911b9df15b569a3db4a78b3694a71 73516cc1de335e84ad43308d44db8ab9748911b9df15b569a3db4a78b3694a71 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.Elements().Size(), 4U) | EXPECT_EQ(domain.Elements()[0U].Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(domain.Elements()[0U].SourceElementType(), ""S4"") | EXPECT_EQ(domain.Elements()[1U].SourceElementType(), ""S4R"") | EXPECT_EQ(&domain.Elements()[0U], &domain.ShellElements()[0U]) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0010"") | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices, (std::array{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].node_indices, (std::array{1U, 4U, 5U, 2U})) | EXPECT_EQ(domain.ShellElements()[1].section_index, 1U) | EXPECT_EQ(domain.ShellElements()[1].material_index, 1U) | EXPECT_EQ(domain.ShellElements()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.ShellElements()[2].node_indices, (std::array{6U, 7U, 8U, 9U})) | EXPECT_EQ(domain.ShellElements()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""ShellS4"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.1) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""ShellS4R"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[1].thickness, 0.2) | EXPECT_EQ(domain.ShellSections()[1].material_index, 1U) | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), domain.Nodes().size()) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 0U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_EQ(domain.Steps().Size(), 1U) | ASSERT_EQ(domain.Steps()[0].PrescribedDisplacements().Size(), 6U) | EXPECT_EQ(domain.Steps()[0].PrescribedDisplacements()[5U].Component(), fesa::DofComponent::kUrz) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[5U], 1.0)" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.Elements().Size(), 4U) | EXPECT_EQ(domain.Elements()[0U].Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(domain.Elements()[0U].SourceElementType(), ""S4"") | EXPECT_EQ(domain.Elements()[1U].SourceElementType(), ""S4R"") | EXPECT_EQ(&domain.Elements()[0U], &domain.ShellElements()[0U]) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0010"") | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices, (std::array{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].node_indices, (std::array{1U, 4U, 5U, 2U})) | EXPECT_EQ(domain.ShellElements()[1].section_index, 1U) | EXPECT_EQ(domain.ShellElements()[1].material_index, 1U) | EXPECT_EQ(domain.ShellElements()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.ShellElements()[2].node_indices, (std::array{6U, 7U, 8U, 9U})) | EXPECT_EQ(domain.ShellElements()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""ShellS4"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.1) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""ShellS4R"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[1].thickness, 0.2) | EXPECT_EQ(domain.ShellSections()[1].material_index, 1U) | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), domain.Nodes().size()) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 0U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_EQ(domain.Steps().Size(), 1U) | ASSERT_EQ(domain.Steps()[0].PrescribedDisplacements().Size(), 6U) | EXPECT_EQ(domain.Steps()[0].PrescribedDisplacements()[5U].Component(), fesa::DofComponent::kUrz) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[5U], 1.0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties; assertion 3개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties 유지 원문 검사 body 및 assertion 동일. 785c82079cd94789aa85628e9ec1e3529ac1ca34099e3eb76d1e740bc3de5cb8 785c82079cd94789aa85628e9ec1e3529ac1ca34099e3eb76d1e740bc3de5cb8 ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels; assertion 3개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels 유지 원문 검사 body 및 assertion 동일. 1156d85feb44cb57821111e3498517c200f57a2a20825d5ee20c89de67879b15 1156d85feb44cb57821111e3498517c200f57a2a20825d5ee20c89de67879b15 ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells; assertion 8개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells 유지 원문 검사 body 및 assertion 동일. 7dad7b84e339df37b9157bcf3dbb1d1899586060ffd077353911cde6901f8aae 7dad7b84e339df37b9157bcf3dbb1d1899586060ffd077353911cde6901f8aae "ASSERT_TRUE(valid.HasValue()) | ASSERT_EQ(valid.Value().Warnings().size(), 3U) | EXPECT_EQ(valid.Value().Warnings()[0].keyword, ""OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[1].keyword, ""NODE OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[2].keyword, ""ELEMENT OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr)" "ASSERT_TRUE(valid.HasValue()) | ASSERT_EQ(valid.Value().Warnings().size(), 3U) | EXPECT_EQ(valid.Value().Warnings()[0].keyword, ""OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[1].keyword, ""NODE OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[2].keyword, ""ELEMENT OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio; assertion 14개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio 유지 원문 검사 body 및 assertion 동일. 33dae7daee6b5f3283f0dc0c01c58157947c30d91394f6804227b17e827a84ad 33dae7daee6b5f3283f0dc0c01c58157947c30d91394f6804227b17e827a84ad "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_FALSE(diagnostic->location.file.empty()) | EXPECT_GT(diagnostic->location.line, 0U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_EQ(diagnostic->keyword, test_case.expected_keyword) | EXPECT_EQ(diagnostic->entity_identity, ""1"") | EXPECT_EQ(diagnostic->location.line, test_case.expected_line) | EXPECT_EQ(diagnostic->location.file.filename().string(), ""fesa-domain-mapper-same-token-"" + test_case.name + "".inp"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_FALSE(diagnostic->location.file.empty()) | EXPECT_GT(diagnostic->location.line, 0U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_EQ(diagnostic->keyword, test_case.expected_keyword) | EXPECT_EQ(diagnostic->entity_identity, ""1"") | EXPECT_EQ(diagnostic->location.line, test_case.expected_line) | EXPECT_EQ(diagnostic->location.file.filename().string(), ""fesa-domain-mapper-same-token-"" + test_case.name + "".inp"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsDloadWithoutDistributedLoadObject InpDomainMapping.RejectsDloadWithoutDistributedLoadObject; assertion 4개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsDloadWithoutDistributedLoadObject 유지 원문 검사 body 및 assertion 동일. e3e84f2ef580a2306947632bf01bb5fbe250460b5c86095164b54fb00f2ebea9 e3e84f2ef580a2306947632bf01bb5fbe250460b5c86095164b54fb00f2ebea9 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->keyword, ""DLOAD"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->keyword, ""DLOAD"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@1-253 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, ReadExactBytes, RepositoryRoot, FindDiagnostic, find_if, ReplaceOnce, MinimalDeck, ShellDeck, NonlinearShellDeck, SupportedInventoryDeck tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d4a3cb30beb5a5732a40fb39fe5981aa1156d1ea97812454c30bf93fbbff733e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@578-579 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a17d35bc26ea1a9c371b82c2b0318318ea0f138663e240361e4f36b6b36e28a3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@601-602 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d3465cabe35b62c482d5bfbc700278989749bc95ced8528c179fabf2e46b1e9d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@618-619 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2dda137dd997f072d5e1721f3fef902ee6eba433d87b0cc65c0ec3bcc92449aa 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@643-644 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9d6708ab0855db443bd63e7f30d47944821695395efba5b5687f458ad88232ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@680-681 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 48cc0be2d1c45cc611d13733472689fca4e37d761ae0374cc74fa3e4f1e83bac 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@717-719 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5fd581bec64057435da242b600880b7876a63ab7f90c83629f761adb523253b9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@781-782 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f887854314ac3472576dbefddf88818cb395844ceb68f8e943b64a304cae6a92 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@824-825 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fad76b68876263d3277eb79c04e1ae0ce1719f94a92fdd3b1765729c0e1790b0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapper_test.cpp support@863-864 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3b8e0519340ad1aa555a27d246833b7379abb093fe25d9f4bc115c04a15f18f1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapping_components_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/io/abaqus/domain_mapping_components_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a515704fe97d521d11a2b7c95e41e0f7ec6557f3ee7e4dd5017a8c9757358f9a a515704fe97d521d11a2b7c95e41e0f7ec6557f3ee7e4dd5017a8c9757358f9a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit; assertion 32개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit 유지 원문 검사 body 및 assertion 동일. 5d6ea9aacc764e212a94ecc20d15d795679922368c9c6404c6375192ba222df7 5d6ea9aacc764e212a94ecc20d15d795679922368c9c6404c6375192ba222df7 "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | EXPECT_EQ(summary.part_count, 1U) | EXPECT_EQ(summary.node_count, 2U) | EXPECT_EQ(summary.element_count, 1U) | EXPECT_EQ(summary.instance_count, 1U) | EXPECT_EQ(summary.node_set_count, 3U) | EXPECT_EQ(summary.element_set_count, 1U) | EXPECT_EQ(summary.material_count, 1U) | EXPECT_EQ(summary.beam_section_count, 1U) | EXPECT_EQ(summary.shell_section_count, 0U) | EXPECT_EQ(summary.model_boundary_count, 1U) | EXPECT_EQ(summary.step_boundary_count, 1U) | EXPECT_EQ(summary.step_load_count, 1U) | EXPECT_TRUE(summary.has_static_step) | ASSERT_TRUE(material_property_mapper.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_TRUE(step_definition_mapper.Map(context).IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Properties().Size(), 1U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0].BoundaryConditions().size(), 7U) | EXPECT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Warnings().size(), 3U) | EXPECT_EQ(domain.Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ( domain.Warnings()[0].message, ""The allowlisted Abaqus keyword is ignored without semantic effect."") | EXPECT_EQ(domain.Warnings()[1].keyword, ""OUTPUT"") | EXPECT_EQ(domain.Warnings()[2].keyword, ""NODE OUTPUT"")" "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | EXPECT_EQ(summary.part_count, 1U) | EXPECT_EQ(summary.node_count, 2U) | EXPECT_EQ(summary.element_count, 1U) | EXPECT_EQ(summary.instance_count, 1U) | EXPECT_EQ(summary.node_set_count, 3U) | EXPECT_EQ(summary.element_set_count, 1U) | EXPECT_EQ(summary.material_count, 1U) | EXPECT_EQ(summary.beam_section_count, 1U) | EXPECT_EQ(summary.shell_section_count, 0U) | EXPECT_EQ(summary.model_boundary_count, 1U) | EXPECT_EQ(summary.step_boundary_count, 1U) | EXPECT_EQ(summary.step_load_count, 1U) | EXPECT_TRUE(summary.has_static_step) | ASSERT_TRUE(material_property_mapper.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_TRUE(step_definition_mapper.Map(context).IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Properties().Size(), 1U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0].BoundaryConditions().size(), 7U) | EXPECT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Warnings().size(), 3U) | EXPECT_EQ(domain.Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ( domain.Warnings()[0].message, ""The allowlisted Abaqus keyword is ignored without semantic effect."") | EXPECT_EQ(domain.Warnings()[1].keyword, ""OUTPUT"") | EXPECT_EQ(domain.Warnings()[2].keyword, ""NODE OUTPUT"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade; assertion 12개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade 유지 원문 검사 body 및 assertion 동일. 77d7cab182b4b08c392cd8698050105755faa3d1fbfef4c56fdd4d02bca34624 77d7cab182b4b08c392cd8698050105755faa3d1fbfef4c56fdd4d02bca34624 "ASSERT_FALSE(component_status.IsOk()) | ASSERT_EQ(component_status.Diagnostics().size(), 1U) | EXPECT_EQ(component_status.Category(), FailureCategory::kInput) | EXPECT_EQ(component_diagnostic.severity, Severity::kError) | EXPECT_EQ(component_diagnostic.code, ""unsupported-keyword"") | EXPECT_EQ(component_diagnostic.location.line, 1U) | EXPECT_EQ(component_diagnostic.keyword, ""NODE"") | EXPECT_TRUE(component_diagnostic.entity_identity.empty()) | EXPECT_EQ(component_diagnostic.message, ""The keyword is outside the approved Abaqus subset."") | ASSERT_FALSE(facade_result.HasValue()) | ASSERT_EQ(facade_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(facade_result.GetStatus().Category(), component_status.Category())" "ASSERT_FALSE(component_status.IsOk()) | ASSERT_EQ(component_status.Diagnostics().size(), 1U) | EXPECT_EQ(component_status.Category(), FailureCategory::kInput) | EXPECT_EQ(component_diagnostic.severity, Severity::kError) | EXPECT_EQ(component_diagnostic.code, ""unsupported-keyword"") | EXPECT_EQ(component_diagnostic.location.line, 1U) | EXPECT_EQ(component_diagnostic.keyword, ""NODE"") | EXPECT_TRUE(component_diagnostic.entity_identity.empty()) | EXPECT_EQ(component_diagnostic.message, ""The keyword is outside the approved Abaqus subset."") | ASSERT_FALSE(facade_result.HasValue()) | ASSERT_EQ(facade_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(facade_result.GetStatus().Category(), component_status.Category())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent; assertion 9개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent 유지 원문 검사 body 및 assertion 동일. ace412f6dba5699c19fff85961b58458545b93fc1e7be9ec005053d32d7acf22 ace412f6dba5699c19fff85961b58458545b93fc1e7be9ec005053d32d7acf22 "ASSERT_TRUE(TopologyMapper{}.Map(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kModel) | EXPECT_EQ(diagnostic.code, ""invalid-beam-property"") | EXPECT_EQ(diagnostic.location.line, 26U) | EXPECT_EQ(diagnostic.keyword, ""ELASTIC"") | EXPECT_EQ(diagnostic.entity_identity, ""Steel"") | EXPECT_EQ(diagnostic.message, ""E and the derived G=E/(2*(1+nu)) must be positive."")" "ASSERT_TRUE(TopologyMapper{}.Map(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kModel) | EXPECT_EQ(diagnostic.code, ""invalid-beam-property"") | EXPECT_EQ(diagnostic.location.line, 26U) | EXPECT_EQ(diagnostic.keyword, ""ELASTIC"") | EXPECT_EQ(diagnostic.entity_identity, ""Steel"") | EXPECT_EQ(diagnostic.message, ""E and the derived G=E/(2*(1+nu)) must be positive."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent; assertion 11개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent 유지 원문 검사 body 및 assertion 동일. 22839ffd4c1c68b4f200226079345550d9e13e7c212d27881edf14d3bea5ae3a 22839ffd4c1c68b4f200226079345550d9e13e7c212d27881edf14d3bea5ae3a "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | ASSERT_TRUE(MaterialPropertyMapper{}.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kInput) | EXPECT_EQ(diagnostic.code, ""unresolved-reference"") | EXPECT_EQ(diagnostic.location.line, 35U) | EXPECT_EQ(diagnostic.keyword, ""CLOAD"") | EXPECT_EQ(diagnostic.entity_identity, ""Missing"") | EXPECT_EQ(diagnostic.message, ""The boundary or load target must resolve unambiguously to one "" ""node or one node set."")" "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | ASSERT_TRUE(MaterialPropertyMapper{}.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kInput) | EXPECT_EQ(diagnostic.code, ""unresolved-reference"") | EXPECT_EQ(diagnostic.location.line, 35U) | EXPECT_EQ(diagnostic.keyword, ""CLOAD"") | EXPECT_EQ(diagnostic.entity_identity, ""Missing"") | EXPECT_EQ(diagnostic.message, ""The boundary or load target must resolve unambiguously to one "" ""node or one node set."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/domain_mapping_components_test.cpp support@1-116 helper/oracle/fixture/include/static assertion 구간: fesa, TemporaryComponentInput, if, ParseComponentInput, ValidComponentDeck, ReplaceOnce, ExpectSameDiagnostic tests/unit/io/abaqus/domain_mapping_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eafbafda80ba9658302f8c6c61d966863cd6dcaf43f376b99f8eafae256f165b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/domain_mapping_components_test.cpp support@240-242 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/io/abaqus/domain_mapping_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8aeadfd7d5a45c48cf01367ce365d0afada064b00686836fc0fc603596c9df16 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/eigen_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/io/abaqus/eigen_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 092b4127f43e6ba27485ad4043ba8b2d80b310299cdf66858fbc239342faa746 092b4127f43e6ba27485ad4043ba8b2d80b310299cdf66858fbc239342faa746 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.PreservesFrequencyDensityAndSourceStepIdentity EigenDomainMapping.PreservesFrequencyDensityAndSourceStepIdentity; assertion 16개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.PreservesFrequencyDensityAndSourceStepIdentity 유지 원문 검사 body 및 assertion 동일. 0e1fbd3de3417171d6a1a291aeafd0b174bc5cd44701267198cf8826ca5bf074 0e1fbd3de3417171d6a1a291aeafd0b174bc5cd44701267198cf8826ca5bf074 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_EQ(domain.Densities()[0].material_index, fesa::EntityIndex{0U}) | EXPECT_DOUBLE_EQ(domain.Densities()[0].rho, 2700.0) | ASSERT_NE(domain.Frequency(), nullptr) | EXPECT_EQ(domain.Frequency()->source_step_name_raw, ""Step-2"") | EXPECT_EQ(domain.Frequency()->source_step_name_canonical, ""STEP-2"") | EXPECT_EQ(domain.Frequency()->requested_mode_count, 10) | EXPECT_TRUE(domain.Frequency()->perturbation_explicit) | EXPECT_TRUE(domain.Frequency()->sim_explicit) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsFrequency()) | EXPECT_EQ(domain.Steps()[0U].Frequency(), domain.Frequency()) | EXPECT_EQ(domain.Steps()[0U].Name(), ""Step-2"") | ASSERT_EQ(domain.Steps()[0U].BoundaryConditions().size(), 6U) | EXPECT_TRUE(domain.Steps()[0U].Loads().empty())" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_EQ(domain.Densities()[0].material_index, fesa::EntityIndex{0U}) | EXPECT_DOUBLE_EQ(domain.Densities()[0].rho, 2700.0) | ASSERT_NE(domain.Frequency(), nullptr) | EXPECT_EQ(domain.Frequency()->source_step_name_raw, ""Step-2"") | EXPECT_EQ(domain.Frequency()->source_step_name_canonical, ""STEP-2"") | EXPECT_EQ(domain.Frequency()->requested_mode_count, 10) | EXPECT_TRUE(domain.Frequency()->perturbation_explicit) | EXPECT_TRUE(domain.Frequency()->sim_explicit) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsFrequency()) | EXPECT_EQ(domain.Steps()[0U].Frequency(), domain.Frequency()) | EXPECT_EQ(domain.Steps()[0U].Name(), ""Step-2"") | ASSERT_EQ(domain.Steps()[0U].BoundaryConditions().size(), 6U) | EXPECT_TRUE(domain.Steps()[0U].Loads().empty())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidDensityAndFrequencySlots EigenDomainMapping.RejectsInvalidDensityAndFrequencySlots; assertion 4개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidDensityAndFrequencySlots 유지 원문 검사 body 및 assertion 동일. 92b68d2ac096a03a02bfacd600af2432bfd869eedeeeeb2f06aa6d4d156e4797 92b68d2ac096a03a02bfacd600af2432bfd869eedeeeeb2f06aa6d4d156e4797 "ASSERT_FALSE(density.HasValue()) | EXPECT_NE(FindDiagnostic(density.GetStatus(), ""invalid-density-data""), nullptr) | ASSERT_FALSE(slots.HasValue()) | EXPECT_NE(FindDiagnostic(slots.GetStatus(), ""invalid-frequency-data""), nullptr)" "ASSERT_FALSE(density.HasValue()) | EXPECT_NE(FindDiagnostic(density.GetStatus(), ""invalid-density-data""), nullptr) | ASSERT_FALSE(slots.HasValue()) | EXPECT_NE(FindDiagnostic(slots.GetStatus(), ""invalid-frequency-data""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMissingActiveDensityAndNonzeroBoundary EigenDomainMapping.RejectsMissingActiveDensityAndNonzeroBoundary; assertion 6개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMissingActiveDensityAndNonzeroBoundary 유지 원문 검사 body 및 assertion 동일. 0b9cfbdd813264e533fb5963dcf276adbd874f0777af515e8fb4aac85015b873 0b9cfbdd813264e533fb5963dcf276adbd874f0777af515e8fb4aac85015b873 "ASSERT_NE(density_location, std::string::npos) | ASSERT_FALSE(missing.HasValue()) | EXPECT_NE(FindDiagnostic(missing.GetStatus(), ""missing-material-density""), nullptr) | ASSERT_NE(location, std::string::npos) | ASSERT_FALSE(boundary.HasValue()) | EXPECT_NE(FindDiagnostic(boundary.GetStatus(), ""unsupported-eigen-boundary""), nullptr)" "ASSERT_NE(density_location, std::string::npos) | ASSERT_FALSE(missing.HasValue()) | EXPECT_NE(FindDiagnostic(missing.GetStatus(), ""missing-material-density""), nullptr) | ASSERT_NE(location, std::string::npos) | ASSERT_FALSE(boundary.HasValue()) | EXPECT_NE(FindDiagnostic(boundary.GetStatus(), ""unsupported-eigen-boundary""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMixedProceduresInvalidOutputAndSurface EigenDomainMapping.RejectsMixedProceduresInvalidOutputAndSurface; assertion 5개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMixedProceduresInvalidOutputAndSurface 유지 원문 검사 body 및 assertion 동일. 435331124510d6cb20b7a86e468786ff0faa434d408e82d0534542553d875f92 435331124510d6cb20b7a86e468786ff0faa434d408e82d0534542553d875f92 "ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(wrong_output.HasValue()) | EXPECT_NE(FindDiagnostic(wrong_output.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(surface_result.HasValue())" "ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(wrong_output.HasValue()) | EXPECT_NE(FindDiagnostic(wrong_output.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(surface_result.HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidPreprintAndAcceptsStrictNoOp EigenDomainMapping.RejectsInvalidPreprintAndAcceptsStrictNoOp; assertion 7개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidPreprintAndAcceptsStrictNoOp 유지 원문 검사 body 및 assertion 동일. 8c7a14159391fe657f7760127eb8ab1901d5a25a41c138256a5d83cce9c427ee 8c7a14159391fe657f7760127eb8ab1901d5a25a41c138256a5d83cce9c427ee "ASSERT_TRUE(accepted.HasValue()) | ASSERT_NE(warning, accepted.Value().Warnings().end()) | EXPECT_EQ(warning->message, ""mandatory-eigen-output-unchanged"") | ASSERT_FALSE(rejected.HasValue()) | EXPECT_NE(FindDiagnostic(rejected.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(missing_parameters.HasValue()) | EXPECT_NE( FindDiagnostic(missing_parameters.GetStatus(), ""unsupported-keyword""), nullptr)" "ASSERT_TRUE(accepted.HasValue()) | ASSERT_NE(warning, accepted.Value().Warnings().end()) | EXPECT_EQ(warning->message, ""mandatory-eigen-output-unchanged"") | ASSERT_FALSE(rejected.HasValue()) | EXPECT_NE(FindDiagnostic(rejected.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(missing_parameters.HasValue()) | EXPECT_NE( FindDiagnostic(missing_parameters.GetStatus(), ""unsupported-keyword""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/eigen_domain_test.cpp support@1-98 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, EigenDeck, FindDiagnostic, for tests/unit/io/abaqus/eigen_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6c0ec5ff9d6242012df3aba6a1f123cd5503d7d8e747d530582db2a7f767719c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/eigen_domain_test.cpp support@206-207 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/eigen_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 20개 tests/unit/io/abaqus/hex8_semantics_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0804a9ef5cb15fdee5c06d4f3ba05b626ebcae6952360bb769271d457bc9530c 0804a9ef5cb15fdee5c06d4f3ba05b626ebcae6952360bb769271d457bc9530c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsEightSourceNodesAndExactlyThreePhysicalDofs Hex8Semantics.MapsEightSourceNodesAndExactlyThreePhysicalDofs; assertion 9개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsEightSourceNodesAndExactlyThreePhysicalDofs 유지 원문 검사 body 및 assertion 동일. c75e22a597ed7445ed43c51b03fb254b6373984026f78f773a97d32687cb7272 c75e22a597ed7445ed43c51b03fb254b6373984026f78f773a97d32687cb7272 "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Elements().Size(), 1U) | EXPECT_EQ(domain.Value().Elements()[0].SourceElementType(), ""C3D8"") | EXPECT_EQ(domain.Value().Elements()[0].SourceId().source_label, 99) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices().size(), 8U) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 3U)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Elements().Size(), 1U) | EXPECT_EQ(domain.Value().Elements()[0].SourceElementType(), ""C3D8"") | EXPECT_EQ(domain.Value().Elements()[0].SourceId().source_label, 99) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices().size(), 8U) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 3U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.InactiveZeroRotationsWarnAndDoNotCreateConstraints Hex8Semantics.InactiveZeroRotationsWarnAndDoNotCreateConstraints; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.InactiveZeroRotationsWarnAndDoNotCreateConstraints 유지 원문 검사 body 및 assertion 동일. 4e9c9d68352626fe0b450e289080ee34f84a54c33b71e1520c4b57a389fe61cb 4e9c9d68352626fe0b450e289080ee34f84a54c33b71e1520c4b57a389fe61cb "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Steps()[0].BoundaryConditions().size(), 3U) | ASSERT_FALSE(domain.Value().Warnings().empty()) | EXPECT_EQ(domain.Value().Warnings().back().keyword, ""BOUNDARY"") | EXPECT_EQ(domain.Value().Warnings().back().entity_identity, ""10"") | EXPECT_GT(domain.Value().Warnings().back().location.line, 0U)" "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Steps()[0].BoundaryConditions().size(), 3U) | ASSERT_FALSE(domain.Value().Warnings().empty()) | EXPECT_EQ(domain.Value().Warnings().back().keyword, ""BOUNDARY"") | EXPECT_EQ(domain.Value().Warnings().back().entity_identity, ""10"") | EXPECT_GT(domain.Value().Warnings().back().location.line, 0U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsNonzeroRotationsAndAllRotationalLoads Hex8Semantics.RejectsNonzeroRotationsAndAllRotationalLoads; assertion 2개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsNonzeroRotationsAndAllRotationalLoads 유지 원문 검사 body 및 assertion 동일. a6d35c2ca679aa7f1b383ead3d9f703d1fa2c74effec04ea46aa3d85e197d622 a6d35c2ca679aa7f1b383ead3d9f703d1fa2c74effec04ea46aa3d85e197d622 "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", ""10,4,4,1\n"")).HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n*Cload\n20,4,0\n"")).HasValue())" "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", ""10,4,4,1\n"")).HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n*Cload\n20,4,0\n"")).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RotationNoOpPreservesPhysicalMapAndLoads Hex8Semantics.RotationNoOpPreservesPhysicalMapAndLoads; assertion 17개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RotationNoOpPreservesPhysicalMapAndLoads 유지 원문 검사 body 및 assertion 동일. 3df0931a844f2efcc21ddebf1505036c8f9a55af7163f978f456efad1136cbdc 3df0931a844f2efcc21ddebf1505036c8f9a55af7163f978f456efad1136cbdc ASSERT_TRUE(physical.HasValue()) | ASSERT_TRUE(extra.HasValue()) | ASSERT_TRUE(pd.HasValue()) | ASSERT_TRUE(ed.HasValue()) | EXPECT_EQ(pd.Value().FreeDofs(), ed.Value().FreeDofs()) | EXPECT_EQ(pd.Value().ConstrainedDofs(), ed.Value().ConstrainedDofs()) | EXPECT_EQ(pd.Value().GetSparsePattern().column_indices, ed.Value().GetSparsePattern().column_indices) | EXPECT_EQ(ed.Value().Profile(), fesa::DofProfile::kSolidStructural) | EXPECT_EQ(ed.Value().ComponentsPerNode(), 3U) | EXPECT_THROW(ed.Value().FullDof(0, fesa::DofComponent::kUrx), std::out_of_range) | ASSERT_TRUE(scatter.HasValue()) | EXPECT_EQ(scatter.Value().size(), 24U) | EXPECT_EQ(scatter.Value().front(), 0U) | EXPECT_EQ(scatter.Value().back(), 23U) | ASSERT_TRUE(pf.HasValue()) | ASSERT_TRUE(ef.HasValue()) | EXPECT_EQ(pf.Value()[i], ef.Value()[i]) ASSERT_TRUE(physical.HasValue()) | ASSERT_TRUE(extra.HasValue()) | ASSERT_TRUE(pd.HasValue()) | ASSERT_TRUE(ed.HasValue()) | EXPECT_EQ(pd.Value().FreeDofs(), ed.Value().FreeDofs()) | EXPECT_EQ(pd.Value().ConstrainedDofs(), ed.Value().ConstrainedDofs()) | EXPECT_EQ(pd.Value().GetSparsePattern().column_indices, ed.Value().GetSparsePattern().column_indices) | EXPECT_EQ(ed.Value().Profile(), fesa::DofProfile::kSolidStructural) | EXPECT_EQ(ed.Value().ComponentsPerNode(), 3U) | EXPECT_THROW(ed.Value().FullDof(0, fesa::DofComponent::kUrx), std::out_of_range) | ASSERT_TRUE(scatter.HasValue()) | EXPECT_EQ(scatter.Value().size(), 24U) | EXPECT_EQ(scatter.Value().front(), 0U) | EXPECT_EQ(scatter.Value().back(), 23U) | ASSERT_TRUE(pf.HasValue()) | ASSERT_TRUE(ef.HasValue()) | EXPECT_EQ(pf.Value()[i], ef.Value()[i]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsTinyRotationBadTargetsOptionsAndDofRanges Hex8Semantics.RejectsTinyRotationBadTargetsOptionsAndDofRanges; assertion 7개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsTinyRotationBadTargetsOptionsAndDofRanges 유지 원문 검사 body 및 assertion 동일. fbaffb1fa7018c85cecd369894293b24dc2a62bf82f918cbd99dbb3c17a70589 fbaffb1fa7018c85cecd369894293b24dc2a62bf82f918cbd99dbb3c17a70589 "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", row)).HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""*Boundary"", ""*Boundary,"" + option)).HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().Steps()[0].BoundaryConditions().empty()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0].code, ""inactive-solid-rotation-boundary"") | EXPECT_EQ(result.Value().Warnings()[0].severity, fesa::Severity::kWarning)" "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", row)).HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""*Boundary"", ""*Boundary,"" + option)).HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().Steps()[0].BoundaryConditions().empty()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0].code, ""inactive-solid-rotation-boundary"") | EXPECT_EQ(result.Value().Warnings()[0].severity, fesa::Severity::kWarning)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsEmptyFreeAndNoBoundaryModels Hex8Semantics.AllowsEmptyFreeAndNoBoundaryModels; assertion 4개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsEmptyFreeAndNoBoundaryModels 유지 원문 검사 body 및 assertion 동일. b57d0718c1ed58f9fc97136333cada362aeee8c776148cd4cd14bf251fdbb27b b57d0718c1ed58f9fc97136333cada362aeee8c776148cd4cd14bf251fdbb27b ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FreeDofCount(), boundaries.empty() ? 24U : 0U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FreeDofCount(), boundaries.empty() ? 24U : 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RetainsStaticDensityTargetsAndDirectSchedule Hex8Semantics.RetainsStaticDensityTargetsAndDirectSchedule; assertion 13개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RetainsStaticDensityTargetsAndDirectSchedule 유지 원문 검사 body 및 assertion 동일. ecc27dfd2d6e7370b729c72942f53b8a8cd0bf76a40ce684aeaeb88e64fa2c40 ecc27dfd2d6e7370b729c72942f53b8a8cd0bf76a40ce684aeaeb88e64fa2c40 "ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(domain.Value().IsSolid()) | ASSERT_EQ(domain.Value().SolidSections().Size(), 1U) | EXPECT_EQ(domain.Value().SolidSections()[0].MaterialIndex(), 0U) | EXPECT_EQ(domain.Value().Densities()[0].rho, 2.0) | EXPECT_EQ(step.Name(), ""Solid"") | EXPECT_TRUE(step.IsDirectStatic()) | EXPECT_EQ(step.IncrementCount(), 10U) | EXPECT_EQ(step.MaximumIncrements(), 100U) | EXPECT_EQ(dofs.Value().PrescribedValues()[0], .25) | EXPECT_FALSE(Map(Deck(""*Static,direct\n"" + values)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,.5"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,-1"")).HasValue())" "ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(domain.Value().IsSolid()) | ASSERT_EQ(domain.Value().SolidSections().Size(), 1U) | EXPECT_EQ(domain.Value().SolidSections()[0].MaterialIndex(), 0U) | EXPECT_EQ(domain.Value().Densities()[0].rho, 2.0) | EXPECT_EQ(step.Name(), ""Solid"") | EXPECT_TRUE(step.IsDirectStatic()) | EXPECT_EQ(step.IncrementCount(), 10U) | EXPECT_EQ(step.MaximumIncrements(), 100U) | EXPECT_EQ(dofs.Value().PrescribedValues()[0], .25) | EXPECT_FALSE(Map(Deck(""*Static,direct\n"" + values)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,.5"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,-1"")).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.SamplesIndependentAmplitudeLoadsAtActualEndpoints Hex8Semantics.SamplesIndependentAmplitudeLoadsAtActualEndpoints; assertion 19개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.SamplesIndependentAmplitudeLoadsAtActualEndpoints 유지 원문 검사 body 및 assertion 동일. 450037b22e5b3e170d8813cdd95b4c635723a769f07f6513e8c7d59e8fef843d 450037b22e5b3e170d8813cdd95b4c635723a769f07f6513e8c7d59e8fef843d "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Amplitudes().size(), 2U) | EXPECT_EQ(amplitude.name_raw, ""A"") | EXPECT_EQ(amplitude.Evaluate(0), 0) | EXPECT_EQ(amplitude.Evaluate(.05), .5) | EXPECT_EQ(amplitude.Evaluate(.1), 1) | EXPECT_EQ(amplitude.Evaluate(20), 1) | EXPECT_FALSE(domain.Value().Dynamic()->nlgeom) | EXPECT_EQ(domain.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(loads[0].AmplitudeIndex(), std::optional{0U}) | EXPECT_EQ(loads[1].AmplitudeIndex(), std::optional{1U}) | EXPECT_EQ(loads[0].AmplitudeName(), ""a"") | EXPECT_GT(loads[0].AmplitudeLocation().line, 0U) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(load.HasValue()) | EXPECT_DOUBLE_EQ(load.Value()[3], amplitude.Evaluate(time) * 10 + domain.Value().Amplitudes()[1].Evaluate(time) * 3 + 5) | EXPECT_FALSE(Map(Replace(text, ""10,1,6"", ""10,1,3,1e-100"")).HasValue()) | EXPECT_FALSE( Map(Replace(text, ""amplitude=a"", ""amplitude=missing"")).HasValue()) | EXPECT_TRUE( Map(Replace(text, ""name=Solid,inc=100"", ""name=Solid,nlgeom=YES,inc=100"")) .HasValue())" "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Amplitudes().size(), 2U) | EXPECT_EQ(amplitude.name_raw, ""A"") | EXPECT_EQ(amplitude.Evaluate(0), 0) | EXPECT_EQ(amplitude.Evaluate(.05), .5) | EXPECT_EQ(amplitude.Evaluate(.1), 1) | EXPECT_EQ(amplitude.Evaluate(20), 1) | EXPECT_FALSE(domain.Value().Dynamic()->nlgeom) | EXPECT_EQ(domain.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(loads[0].AmplitudeIndex(), std::optional{0U}) | EXPECT_EQ(loads[1].AmplitudeIndex(), std::optional{1U}) | EXPECT_EQ(loads[0].AmplitudeName(), ""a"") | EXPECT_GT(loads[0].AmplitudeLocation().line, 0U) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(load.HasValue()) | EXPECT_DOUBLE_EQ(load.Value()[3], amplitude.Evaluate(time) * 10 + domain.Value().Amplitudes()[1].Evaluate(time) * 3 + 5) | EXPECT_FALSE(Map(Replace(text, ""10,1,6"", ""10,1,3,1e-100"")).HasValue()) | EXPECT_FALSE( Map(Replace(text, ""amplitude=a"", ""amplitude=missing"")).HasValue()) | EXPECT_TRUE( Map(Replace(text, ""name=Solid,inc=100"", ""name=Solid,nlgeom=YES,inc=100"")) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAmplitudeOptionsDataAndCrossFamilyUse Hex8Semantics.RejectsAmplitudeOptionsDataAndCrossFamilyUse; assertion 3개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAmplitudeOptionsDataAndCrossFamilyUse 유지 원문 검사 body 및 assertion 동일. dce2dd9b2fcfbf0c0ec5bf2a49db87a35c8c50379978a06ba8b90b04f3e5dc7f dce2dd9b2fcfbf0c0ec5bf2a49db87a35c8c50379978a06ba8b90b04f3e5dc7f "EXPECT_FALSE( Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"", prefix + amplitude)) .HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n"", ""*Amplitude,name=A\n0,0\n"")) .HasValue()) | EXPECT_FALSE(Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"")).HasValue())" "EXPECT_FALSE( Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"", prefix + amplitude)) .HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n"", ""*Amplitude,name=A\n0,0\n"")) .HasValue()) | EXPECT_FALSE(Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"")).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAliasesConnectivityThicknessAndMixedModels Hex8Semantics.RejectsAliasesConnectivityThicknessAndMixedModels; assertion 5개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAliasesConnectivityThicknessAndMixedModels 유지 원문 검사 body 및 assertion 동일. 74400cf0bcfb69af45f006c08c3c5f44a7f71d5f51c25e90b147b08e2a304858 74400cf0bcfb69af45f006c08c3c5f44a7f71d5f51c25e90b147b08e2a304858 "EXPECT_FALSE(Map(Replace(Deck(), ""type=C3D8"", ""type="" + type)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,70"")) .HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,999"")) .HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""material=M\n,"", ""material=M\n2"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*Solid Section"", ""*Element,type=S4\n100,10,20,30,40\n*Solid Section"")) .HasValue())" "EXPECT_FALSE(Map(Replace(Deck(), ""type=C3D8"", ""type="" + type)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,70"")) .HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,999"")) .HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""material=M\n,"", ""material=M\n2"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*Solid Section"", ""*Element,type=S4\n100,10,20,30,40\n*Solid Section"")) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShellSixComponentProfile Hex8Semantics.PreservesShellSixComponentProfile; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShellSixComponentProfile 유지 원문 검사 body 및 assertion 동일. 6253e1af06f92b7af50ff60f0745d70fe50db2b76b537570fe466dd15675d26b 6253e1af06f92b7af50ff60f0745d70fe50db2b76b537570fe466dd15675d26b ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().Profile(), fesa::DofProfile::kStructural) | EXPECT_EQ(dofs.Value().ComponentsPerNode(), 6U) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FullDof(1, fesa::DofComponent::kUrx), 9U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().Profile(), fesa::DofProfile::kStructural) | EXPECT_EQ(dofs.Value().ComponentsPerNode(), 6U) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FullDof(1, fesa::DofComponent::kUrx), 9U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsAllFiveUnmodifiedRequiredSourceDecks Hex8Semantics.MapsAllFiveUnmodifiedRequiredSourceDecks; assertion 8개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsAllFiveUnmodifiedRequiredSourceDecks 유지 원문 검사 body 및 assertion 동일. 27a85d7e4d9d00d5a84c4d3e28b2fd837ee20a9b812730de2b0b120f79639c4f 27a85d7e4d9d00d5a84c4d3e28b2fd837ee20a9b812730de2b0b120f79639c4f "ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().SolidElements().Size(), 300U) | EXPECT_EQ(domain.Value().Nodes().size(), 442U) | EXPECT_EQ(std::count_if(domain.Value().Warnings().begin(), domain.Value().Warnings().end(), [](const auto& warning) { return warning.code == ""inactive-solid-rotation-boundary""; }), 3) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 1326U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 51U)" "ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().SolidElements().Size(), 300U) | EXPECT_EQ(domain.Value().Nodes().size(), 442U) | EXPECT_EQ(std::count_if(domain.Value().Warnings().begin(), domain.Value().Warnings().end(), [](const auto& warning) { return warning.code == ""inactive-solid-rotation-boundary""; }), 3) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 1326U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 51U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AssemblesFullSymmetricSolidMatricesInStableSourceOrder Hex8Semantics.AssemblesFullSymmetricSolidMatricesInStableSourceOrder; assertion 11개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AssemblesFullSymmetricSolidMatricesInStableSourceOrder 유지 원문 검사 body 및 assertion 동일. cff1fc540c97c7325eb371cd49595d7c44b5235f01cb4f0340c8fe2515e8c437 cff1fc540c97c7325eb371cd49595d7c44b5235f01cb4f0340c8fe2515e8c437 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Rows(), 24U) | EXPECT_EQ(serial.Value().Columns(), 24U) | EXPECT_EQ(serial.Value().Values().size(), 576U) | EXPECT_EQ(value, 1.0) | EXPECT_EQ(serial.Value().RowOffsets(), parallel.Value().RowOffsets()) | EXPECT_EQ(serial.Value().ColumnIndices(), parallel.Value().ColumnIndices()) | EXPECT_EQ(serial.Value().Values(), parallel.Value().Values()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Rows(), 24U) | EXPECT_EQ(serial.Value().Columns(), 24U) | EXPECT_EQ(serial.Value().Values().size(), 576U) | EXPECT_EQ(value, 1.0) | EXPECT_EQ(serial.Value().RowOffsets(), parallel.Value().RowOffsets()) | EXPECT_EQ(serial.Value().ColumnIndices(), parallel.Value().ColumnIndices()) | EXPECT_EQ(serial.Value().Values(), parallel.Value().Values()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.ValidatesOutputNoOpsAndRejectsUnapprovedDynamicChildren Hex8Semantics.ValidatesOutputNoOpsAndRejectsUnapprovedDynamicChildren; assertion 5개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.ValidatesOutputNoOpsAndRejectsUnapprovedDynamicChildren 유지 원문 검사 body 및 assertion 동일. 5d0196abf7c53f0e92306554db8a1f9270f76db9aa614254d9d3a5f3e2d1a43e 5d0196abf7c53f0e92306554db8a1f9270f76db9aa614254d9d3a5f3e2d1a43e "EXPECT_TRUE( Map(Replace(Deck(), ""*End Step"", output + ""*End Step"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*End Step"", ""*Output,field,variable=OTHER\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( Deck(), ""*End Step"", ""*Output,field\n*Element Output,position=NODES\nS\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( dynamic, ""*End Step"", ""*Output,field,variable=PRESELECT\n*Node Output\nU\n*End Step"")) .HasValue()) | EXPECT_FALSE(Map(Replace(dynamic, ""*End Step"", ""*Restart,write,frequency=1\n*End Step"")) .HasValue())" "EXPECT_TRUE( Map(Replace(Deck(), ""*End Step"", output + ""*End Step"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*End Step"", ""*Output,field,variable=OTHER\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( Deck(), ""*End Step"", ""*Output,field\n*Element Output,position=NODES\nS\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( dynamic, ""*End Step"", ""*Output,field,variable=PRESELECT\n*Node Output\nU\n*End Step"")) .HasValue()) | EXPECT_FALSE(Map(Replace(dynamic, ""*End Step"", ""*Restart,write,frequency=1\n*End Step"")) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidProgrammaticSolidCandidates Hex8Semantics.RejectsInvalidProgrammaticSolidCandidates; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidProgrammaticSolidCandidates 유지 원문 검사 body 및 assertion 동일. 1065eea90059ac9e3e2b606d997c439efabbf2837254a53e0622a7b4ec81655f 1065eea90059ac9e3e2b606d997c439efabbf2837254a53e0622a7b4ec81655f EXPECT_TRUE(fesa::Domain::Create(SolidDefinition()).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(repeated)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(material)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(section)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(rotational)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(unused)).HasValue()) EXPECT_TRUE(fesa::Domain::Create(SolidDefinition()).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(repeated)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(material)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(section)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(rotational)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(unused)).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsSecondProcedureBeforeReadingItsOptionsOrData Hex8Semantics.RejectsSecondProcedureBeforeReadingItsOptionsOrData; assertion 8개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsSecondProcedureBeforeReadingItsOptionsOrData 유지 원문 검사 body 및 assertion 동일. 42d53fd47e4e29b2122ec0929fda515bd8a35ae386135240b8e3c19a168ac537 42d53fd47e4e29b2122ec0929fda515bd8a35ae386135240b8e3c19a168ac537 "ASSERT_TRUE(Map(Deck(first, """", ""*Density\n2\n"")).HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | ASSERT_FALSE(malformed.HasValue()) | ASSERT_FALSE(malformed.GetStatus().Diagnostics().empty()) | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].keyword, ""STATIC"")" "ASSERT_TRUE(Map(Deck(first, """", ""*Density\n2\n"")).HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | ASSERT_FALSE(malformed.HasValue()) | ASSERT_FALSE(malformed.GetStatus().Diagnostics().empty()) | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].keyword, ""STATIC"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsOnlyApprovedStaticRestartNoOp Hex8Semantics.AllowsOnlyApprovedStaticRestartNoOp; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsOnlyApprovedStaticRestartNoOp 유지 원문 검사 body 및 assertion 동일. 3a188909917d0d9026bab32708aace83386bda1c68423f466e1c6f849dfeea74 3a188909917d0d9026bab32708aace83386bda1c68423f466e1c6f849dfeea74 "ASSERT_TRUE(approved.HasValue()) | ASSERT_EQ(approved.Value().Warnings().size(), 1U) | EXPECT_EQ(approved.Value().Warnings()[0].keyword, ""RESTART"") | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""RESTART"")" "ASSERT_TRUE(approved.HasValue()) | ASSERT_EQ(approved.Value().Warnings().size(), 1U) | EXPECT_EQ(approved.Value().Warnings()[0].keyword, ""RESTART"") | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""RESTART"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShuffledSourceLabelsAndRejectsDuplicateIdentities Hex8Semantics.PreservesShuffledSourceLabelsAndRejectsDuplicateIdentities; assertion 15개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShuffledSourceLabelsAndRejectsDuplicateIdentities 유지 원문 검사 body 및 assertion 동일. 1e26934f523f95c12da4ba31131a30f25c52519a32368c6a7369490b4907882a 1e26934f523f95c12da4ba31131a30f25c52519a32368c6a7369490b4907882a "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(domain.Value().Nodes()[4].source_id.source_label, 10) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices(), (std::vector{4, 1, 6, 3, 7, 2, 5, 0})) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), (std::vector{12, 13, 14})) | EXPECT_FALSE(Map(Replace(deck, ""20,1,0,0"", ""80,1,0,0"")).HasValue()) | EXPECT_FALSE( Map(Replace(deck, ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,80\n99,10,20,30,40,50,60,70,80"")) .HasValue()) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(direct.Value().Nodes()[7].source_id.source_label, 10) | EXPECT_EQ(direct.Value().SolidElements()[0].node_indices, (std::array{7, 1, 2, 3, 4, 5, 6, 0})) | EXPECT_FALSE(fesa::Domain::Create(std::move(nodes)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(elements)).HasValue())" "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(domain.Value().Nodes()[4].source_id.source_label, 10) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices(), (std::vector{4, 1, 6, 3, 7, 2, 5, 0})) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), (std::vector{12, 13, 14})) | EXPECT_FALSE(Map(Replace(deck, ""20,1,0,0"", ""80,1,0,0"")).HasValue()) | EXPECT_FALSE( Map(Replace(deck, ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,80\n99,10,20,30,40,50,60,70,80"")) .HasValue()) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(direct.Value().Nodes()[7].source_id.source_label, 10) | EXPECT_EQ(direct.Value().SolidElements()[0].node_indices, (std::array{7, 1, 2, 3, 4, 5, 6, 0})) | EXPECT_FALSE(fesa::Domain::Create(std::move(nodes)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(elements)).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsUnknownSolidAssignmentTargets Hex8Semantics.RejectsUnknownSolidAssignmentTargets; assertion 3개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsUnknownSolidAssignmentTargets 유지 원문 검사 body 및 assertion 동일. 777502085d8347fa372148d730813468e8385f01894e6f1e32c0b7fb4831b84c 777502085d8347fa372148d730813468e8385f01894e6f1e32c0b7fb4831b84c "ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unresolved-solid-section"")" "ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unresolved-solid-section"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidSolidDynamicSchedulesAndIncrementLimits Hex8Semantics.RejectsInvalidSolidDynamicSchedulesAndIncrementLimits; assertion 3개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidSolidDynamicSchedulesAndIncrementLimits 유지 원문 검사 body 및 assertion 동일. fffbdbf00d02cff95f113d0f9a573ce71a4eb6e0c4b2f829f0fe45dd1d915e4a fffbdbf00d02cff95f113d0f9a573ce71a4eb6e0c4b2f829f0fe45dd1d915e4a "ASSERT_TRUE(Map(valid).HasValue()) | EXPECT_FALSE(Map(Replace(valid, "".1,1\n"", schedule + ""\n"")).HasValue()) | EXPECT_FALSE(Map(Replace(valid, ""inc=100"", ""inc="" + limit)).HasValue())" "ASSERT_TRUE(Map(valid).HasValue()) | EXPECT_FALSE(Map(Replace(valid, "".1,1\n"", schedule + ""\n"")).HasValue()) | EXPECT_FALSE(Map(Replace(valid, ""inc=100"", ""inc="" + limit)).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp support@1-45 helper/oracle/fixture/include/static assertion 구간: Deck, Map tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e25babf55d99011a53bf3707b7fa77dfd36ca9a650cd07f5ce287e7dfb184913 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp support@80-88 helper/oracle/fixture/include/static assertion 구간: Replace tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7712e67d7827babcfabd756496ca005cd2568399e78f7778748ae28ba5b8a649 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp support@309-345 helper/oracle/fixture/include/static assertion 구간: ConstantMatrixElement tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 25983d2e2d6c1749e19367eb109a0403c60bc3f0e79888448ea10c34e965976a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp support@400-430 helper/oracle/fixture/include/static assertion 구간: SolidDefinition tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8ef84c9fb537fb04031fa128b47e30de8105170c97ef73cb6b05fe993f3a20ff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hex8_semantics_test.cpp support@555-555 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e5a7cec78d6b44cfd120f3883d44964842e52ab1781c6a9c678b93c1768a893b e5a7cec78d6b44cfd120f3883d44964842e52ab1781c6a9c678b93c1768a893b 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsDirectScheduleDensityAndSourceOrder HhtDynamicDomainMapping.MapsDirectScheduleDensityAndSourceOrder; assertion 22개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsDirectScheduleDensityAndSourceOrder 유지 원문 검사 body 및 assertion 동일. 2fda780cc6cec49273e038031cef69a2064f0c4d1155f63e36511d518662a11f 2fda780cc6cec49273e038031cef69a2064f0c4d1155f63e36511d518662a11f "ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.Dynamic(), nullptr) | EXPECT_EQ(dynamic.source_step_name_raw, ""Dynamic-Load"") | EXPECT_EQ(dynamic.source_step_name_canonical, ""DYNAMIC-LOAD"") | EXPECT_DOUBLE_EQ(dynamic.initial_increment, 0.1) | EXPECT_DOUBLE_EQ(dynamic.time_period, 10.0) | EXPECT_EQ(dynamic.increment_count, 100U) | EXPECT_EQ(dynamic.maximum_increments, 1000U) | EXPECT_DOUBLE_EQ(dynamic.alpha, -0.05) | EXPECT_DOUBLE_EQ(dynamic.beta, 0.275625) | EXPECT_DOUBLE_EQ(dynamic.gamma, 0.55) | ASSERT_EQ(dynamic.boundaries.size(), 1U) | ASSERT_EQ(dynamic.loads.size(), 1U) | EXPECT_EQ(dynamic.loads[0U].dof, 1) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_DOUBLE_EQ(domain.Densities()[0U].rho, 2700.0) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsDynamic()) | EXPECT_FALSE(domain.Steps()[0U].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0U].Dynamic(), domain.Dynamic()) | ASSERT_EQ(domain.Warnings().size(), 4U) | EXPECT_EQ(warning.code, ""ignored-output-request"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.Dynamic(), nullptr) | EXPECT_EQ(dynamic.source_step_name_raw, ""Dynamic-Load"") | EXPECT_EQ(dynamic.source_step_name_canonical, ""DYNAMIC-LOAD"") | EXPECT_DOUBLE_EQ(dynamic.initial_increment, 0.1) | EXPECT_DOUBLE_EQ(dynamic.time_period, 10.0) | EXPECT_EQ(dynamic.increment_count, 100U) | EXPECT_EQ(dynamic.maximum_increments, 1000U) | EXPECT_DOUBLE_EQ(dynamic.alpha, -0.05) | EXPECT_DOUBLE_EQ(dynamic.beta, 0.275625) | EXPECT_DOUBLE_EQ(dynamic.gamma, 0.55) | ASSERT_EQ(dynamic.boundaries.size(), 1U) | ASSERT_EQ(dynamic.loads.size(), 1U) | EXPECT_EQ(dynamic.loads[0U].dof, 1) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_DOUBLE_EQ(domain.Densities()[0U].rho, 2700.0) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsDynamic()) | EXPECT_FALSE(domain.Steps()[0U].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0U].Dynamic(), domain.Dynamic()) | ASSERT_EQ(domain.Warnings().size(), 4U) | EXPECT_EQ(warning.code, ""ignored-output-request"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsOriginalReferenceDeckWithoutMutation HhtDynamicDomainMapping.MapsOriginalReferenceDeckWithoutMutation; assertion 6개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsOriginalReferenceDeckWithoutMutation 유지 원문 검사 body 및 assertion 동일. 8d0c382e2a5992cda6af2865bf5941c2dc847f1591b1625a9532dc881eee65a1 8d0c382e2a5992cda6af2865bf5941c2dc847f1591b1625a9532dc881eee65a1 ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_NE(result.Value().Dynamic(), nullptr) | EXPECT_EQ(result.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(result.Value().Dynamic()->maximum_increments, 1000U) | EXPECT_EQ(result.Value().Dynamic()->loads.size(), 3U) ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_NE(result.Value().Dynamic(), nullptr) | EXPECT_EQ(result.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(result.Value().Dynamic()->maximum_increments, 1000U) | EXPECT_EQ(result.Value().Dynamic()->loads.size(), 3U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.RejectsMalformedScheduleAndUnsupportedControls HhtDynamicDomainMapping.RejectsMalformedScheduleAndUnsupportedControls; assertion 2개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.RejectsMalformedScheduleAndUnsupportedControls 유지 원문 검사 body 및 assertion 동일. cb6b162159cef6b490fac3ec2e8af7fb2f8c4e72d672d14d6e515cd0fdb22b03 cb6b162159cef6b490fac3ec2e8af7fb2f8c4e72d672d14d6e515cd0fdb22b03 ASSERT_FALSE(result.HasValue()) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.diagnostic), nullptr) ASSERT_FALSE(result.HasValue()) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.diagnostic), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/hht_dynamic_domain_test.cpp support@1-117 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, FindDiagnostic, for, DynamicDeck, ReplaceOnce, RepositoryRoot tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 80674acfe820ddb866f7dab56ffa6515964956c116548bf4746d1064ece4a28c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/hht_dynamic_domain_test.cpp support@205-206 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/input_reader_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/io/abaqus/input_reader_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 30c6b51c5910fb07f94969370ced1e063bcbf212266e228e3c09ef5a4575ad96 30c6b51c5910fb07f94969370ced1e063bcbf212266e228e3c09ef5a4575ad96 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.RejectsMalformedOrOrphanData InpSyntax.RejectsMalformedOrOrphanData; assertion 14개 tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.RejectsMalformedOrOrphanData 유지 원문 검사 body 및 assertion 동일. ffaa0b04054bbe68b1a87482bbca2cf543c8cd34ea6f4e30fdca2d246bd7db08 ffaa0b04054bbe68b1a87482bbca2cf543c8cd34ea6f4e30fdca2d246bd7db08 "ASSERT_FALSE(unreadable.HasValue()) | EXPECT_EQ(unreadable.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(unreadable.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(unreadable.GetStatus().Diagnostics()[0].code, ""input-file-unreadable"") | ASSERT_FALSE(malformed_result.HasValue()) | EXPECT_EQ(malformed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(malformed_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].code, ""malformed-keyword"") | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].location.line, 1U) | ASSERT_FALSE(orphan_result.HasValue()) | EXPECT_EQ(orphan_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(orphan_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].code, ""orphan-data-line"") | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].location.line, 3U)" "ASSERT_FALSE(unreadable.HasValue()) | EXPECT_EQ(unreadable.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(unreadable.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(unreadable.GetStatus().Diagnostics()[0].code, ""input-file-unreadable"") | ASSERT_FALSE(malformed_result.HasValue()) | EXPECT_EQ(malformed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(malformed_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].code, ""malformed-keyword"") | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].location.line, 1U) | ASSERT_FALSE(orphan_result.HasValue()) | EXPECT_EQ(orphan_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(orphan_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].code, ""orphan-data-line"") | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].location.line, 3U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.ReadsLegacyCantileverWithoutMutation InpSyntax.ReadsLegacyCantileverWithoutMutation; assertion 15개 tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.ReadsLegacyCantileverWithoutMutation 유지 원문 검사 body 및 assertion 동일. f41d9011fdd529843fb8de0b5dd5f54bdadc4501908af1a3ccef423593ce0a04 f41d9011fdd529843fb8de0b5dd5f54bdadc4501908af1a3ccef423593ce0a04 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:04543464cc970405"") | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input_path).lexically_normal()) | ASSERT_EQ(result.Value().blocks.size(), 30U) | EXPECT_EQ(result.Value().blocks.front().canonical_name, ""HEADING"") | EXPECT_EQ(result.Value().blocks.front().location.line, 1U) | EXPECT_EQ(result.Value().blocks.back().canonical_name, ""END STEP"") | ASSERT_NE(element, result.Value().blocks.end()) | ASSERT_EQ(element->parameters.size(), 1U) | EXPECT_EQ(element->parameters[0].name, ""TYPE"") | ASSERT_TRUE(element->parameters[0].value.has_value()) | EXPECT_EQ(*element->parameters[0].value, ""B33"") | EXPECT_EQ(element->data.size(), 10U) | EXPECT_EQ(ReadExactBytes(input_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(input_path), timestamp_before)" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:04543464cc970405"") | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input_path).lexically_normal()) | ASSERT_EQ(result.Value().blocks.size(), 30U) | EXPECT_EQ(result.Value().blocks.front().canonical_name, ""HEADING"") | EXPECT_EQ(result.Value().blocks.front().location.line, 1U) | EXPECT_EQ(result.Value().blocks.back().canonical_name, ""END STEP"") | ASSERT_NE(element, result.Value().blocks.end()) | ASSERT_EQ(element->parameters.size(), 1U) | EXPECT_EQ(element->parameters[0].name, ""TYPE"") | ASSERT_TRUE(element->parameters[0].value.has_value()) | EXPECT_EQ(*element->parameters[0].value, ""B33"") | EXPECT_EQ(element->data.size(), 10U) | EXPECT_EQ(ReadExactBytes(input_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(input_path), timestamp_before)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines; assertion 14개 tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines 유지 원문 검사 body 및 assertion 동일. ce727a336d945591a1cc0ad97dee25ebfc241f2be137f3198e86eb7df2578ccf ce727a336d945591a1cc0ad97dee25ebfc241f2be137f3198e86eb7df2578ccf "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""SURFACE"") | EXPECT_EQ(block.original_line, ""*SuRfAcE, TYPE=ELEMENT,"") | EXPECT_EQ(block.physical_lines, (std::vector{""*SuRfAcE, TYPE=ELEMENT,"", "" NAME=Pressure_Surface""})) | ASSERT_EQ(block.parameters.size(), 2U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""ELEMENT"") | EXPECT_EQ(block.parameters[1].name, ""NAME"") | ASSERT_TRUE(block.parameters[1].value.has_value()) | EXPECT_EQ(*block.parameters[1].value, ""Pressure_Surface"") | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].location.line, 3U)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""SURFACE"") | EXPECT_EQ(block.original_line, ""*SuRfAcE, TYPE=ELEMENT,"") | EXPECT_EQ(block.physical_lines, (std::vector{""*SuRfAcE, TYPE=ELEMENT,"", "" NAME=Pressure_Surface""})) | ASSERT_EQ(block.parameters.size(), 2U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""ELEMENT"") | EXPECT_EQ(block.parameters[1].name, ""NAME"") | ASSERT_TRUE(block.parameters[1].value.has_value()) | EXPECT_EQ(*block.parameters[1].value, ""Pressure_Surface"") | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].location.line, 3U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/input_reader_test.cpp support@1-55 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, ReadExactBytes, RepositoryRoot tests/unit/io/abaqus/input_reader_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 09e22f6727e979f0117b382a1b8ac77c50f4103adebca5eb58b315c7b0636451 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/input_syntax_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/io/abaqus/input_syntax_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a0ecd5814f476c566f96a1e64d8e1b2757a0dfd70f17d3543519b1d6226a7b7 6a0ecd5814f476c566f96a1e64d8e1b2757a0dfd70f17d3543519b1d6226a7b7 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.CanonicalizesKeywordAndParameterNamesOnly InpSyntax.CanonicalizesKeywordAndParameterNamesOnly; assertion 14개 tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.CanonicalizesKeywordAndParameterNamesOnly 유지 원문 검사 body 및 assertion 동일. fa957b70a91ffba87d4e77baf9592ef3c6e8475adc7bf40ff3678c1929954f3b fa957b70a91ffba87d4e77baf9592ef3c6e8475adc7bf40ff3678c1929954f3b "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""ELEMENT"") | EXPECT_EQ(block.original_line, original_line) | EXPECT_EQ(block.location.line, 1U) | ASSERT_EQ(block.parameters.size(), 3U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""b33"") | EXPECT_EQ(block.parameters[1].name, ""GENERATE"") | EXPECT_FALSE(block.parameters[1].value.has_value()) | EXPECT_EQ(block.parameters[2].name, ""ELSET"") | ASSERT_TRUE(block.parameters[2].value.has_value()) | EXPECT_EQ(*block.parameters[2].value, ""Beam_Set"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""ELEMENT"") | EXPECT_EQ(block.original_line, original_line) | EXPECT_EQ(block.location.line, 1U) | ASSERT_EQ(block.parameters.size(), 3U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""b33"") | EXPECT_EQ(block.parameters[1].name, ""GENERATE"") | EXPECT_FALSE(block.parameters[1].value.has_value()) | EXPECT_EQ(block.parameters[2].name, ""ELSET"") | ASSERT_TRUE(block.parameters[2].value.has_value()) | EXPECT_EQ(*block.parameters[2].value, ""Beam_Set"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.PreservesDataAndSourceLocations InpSyntax.PreservesDataAndSourceLocations; assertion 12개 tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.PreservesDataAndSourceLocations 유지 원문 검사 body 및 assertion 동일. a1132a3f6c99199423c9f513fe5541b7c91e511e68e9f3d935d5bca9ba159733 a1132a3f6c99199423c9f513fe5541b7c91e511e68e9f3d935d5bca9ba159733 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input.Path()).lexically_normal()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:c120b6ed2445be46"") | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""NODE"") | EXPECT_EQ(block.original_line, ""*NoDe"") | EXPECT_EQ(block.location.file, result.Value().source_path) | EXPECT_EQ(block.location.line, 3U) | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].fields, (std::vector{""0007"", ""Label_A"", """", """"})) | EXPECT_EQ(block.data[0].location.file, result.Value().source_path) | EXPECT_EQ(block.data[0].location.line, 4U)" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input.Path()).lexically_normal()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:c120b6ed2445be46"") | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""NODE"") | EXPECT_EQ(block.original_line, ""*NoDe"") | EXPECT_EQ(block.location.file, result.Value().source_path) | EXPECT_EQ(block.location.line, 3U) | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].fields, (std::vector{""0007"", ""Label_A"", """", """"})) | EXPECT_EQ(block.data[0].location.file, result.Value().source_path) | EXPECT_EQ(block.data[0].location.line, 4U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/input_syntax_test.cpp support@1-37 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if tests/unit/io/abaqus/input_syntax_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5cd816979355e9dfa2384470d2d676ffac1a89dc2f4e6ccd91d0998e1d374b2d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 18개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f28acc507f7b42094ff105589aa020384ae0c3b6c6b4c67edb7d4e36f7928af6 f28acc507f7b42094ff105589aa020384ae0c3b6c6b4c67edb7d4e36f7928af6 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively; assertion 11개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively 유지 원문 검사 body 및 assertion 동일. 946490ad5c50c1cb8ba083ec3c6d6c42322e4575cbaffc7c063a4aceb1f4d586 946490ad5c50c1cb8ba083ec3c6d6c42322e4575cbaffc7c063a4aceb1f4d586 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(surface.surface_name_raw, ""Direct-Surface"") | EXPECT_EQ(surface.surface_name_canonical, ""DIRECT-SURFACE"") | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].source_element_label_raw, ""0010"") | EXPECT_EQ(surface.facets[0].source_element_type, ""S4"") | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].source_element_type, ""S4R"") | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg)" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(surface.surface_name_raw, ""Direct-Surface"") | EXPECT_EQ(surface.surface_name_canonical, ""DIRECT-SURFACE"") | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].source_element_label_raw, ""0010"") | EXPECT_EQ(surface.facets[0].source_element_type, ""S4"") | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].source_element_type, ""S4R"") | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter; assertion 7개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter 유지 원문 검사 body 및 assertion 동일. d6e14ec8263f733baba442390ee6f6a6f4b722f1f0edb1f7ba795e587f6c858c d6e14ec8263f733baba442390ee6f6a6f4b722f1f0edb1f7ba795e587f6c858c "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(facet.member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.elset_name_raw, ""flat-members"") | EXPECT_EQ(facet.elset_name_canonical, ""FLAT-MEMBERS"") | EXPECT_EQ(facet.instance_name_raw, ""Instance-A"") | EXPECT_EQ(facet.side, fesa::ShellSurfaceSide::kSpos)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(facet.member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.elset_name_raw, ""flat-members"") | EXPECT_EQ(facet.elset_name_canonical, ""FLAT-MEMBERS"") | EXPECT_EQ(facet.instance_name_raw, ""Instance-A"") | EXPECT_EQ(facet.side, fesa::ShellSurfaceSide::kSpos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder; assertion 21개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder 유지 원문 검사 body 및 assertion 동일. 8d33f673c3b416be94c015ec597fcf82637e32a1423ffa50887b3cec07778a4f 8d33f673c3b416be94c015ec597fcf82637e32a1423ffa50887b3cec07778a4f "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 4U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(surface.facets[0].first_member_ordinal, 2U) | EXPECT_EQ(surface.facets[1].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[1].source_element_label, 20) | EXPECT_EQ(surface.facets[1].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[1].first_member_ordinal, 1U) | EXPECT_EQ(surface.facets[2].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[2].source_element_label, 10) | EXPECT_EQ(surface.facets[2].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[2].first_member_ordinal, 3U) | EXPECT_EQ(surface.facets[3].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[3].source_element_label, 20) | EXPECT_EQ(surface.facets[3].member_kind, fesa::SurfaceMemberKind::kDirect) | EXPECT_EQ(surface.facets[3].first_member_ordinal, 0U) | EXPECT_EQ(facet.part_name_raw, ""Shell-Part"") | EXPECT_EQ(facet.part_name_canonical, ""SHELL-PART"") | EXPECT_EQ(facet.instance_name_canonical, facet.instance_name_raw == ""Instance-A"" ? ""INSTANCE-A"" : ""INSTANCE-B"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 4U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(surface.facets[0].first_member_ordinal, 2U) | EXPECT_EQ(surface.facets[1].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[1].source_element_label, 20) | EXPECT_EQ(surface.facets[1].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[1].first_member_ordinal, 1U) | EXPECT_EQ(surface.facets[2].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[2].source_element_label, 10) | EXPECT_EQ(surface.facets[2].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[2].first_member_ordinal, 3U) | EXPECT_EQ(surface.facets[3].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[3].source_element_label, 20) | EXPECT_EQ(surface.facets[3].member_kind, fesa::SurfaceMemberKind::kDirect) | EXPECT_EQ(surface.facets[3].first_member_ordinal, 0U) | EXPECT_EQ(facet.part_name_raw, ""Shell-Part"") | EXPECT_EQ(facet.part_name_canonical, ""SHELL-PART"") | EXPECT_EQ(facet.instance_name_canonical, facet.instance_name_raw == ""Instance-A"" ? ""INSTANCE-A"" : ""INSTANCE-B"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder; assertion 21개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder 유지 원문 검사 body 및 assertion 동일. 9c08d13e4d85213392e2e9a91bfd3c2da00f84da36f7a8748cf0356575d40a89 9c08d13e4d85213392e2e9a91bfd3c2da00f84da36f7a8748cf0356575d40a89 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].facet_ordinal, 0U) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].facet_ordinal, 1U) | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg) | ASSERT_EQ(step.SurfacePressureLoads().size(), 2U) | EXPECT_EQ(first.step_name_raw, ""Pressure-Step"") | EXPECT_EQ(first.step_name_canonical, ""PRESSURE-STEP"") | EXPECT_EQ(first.surface_name_raw, ""pressure-surface"") | EXPECT_EQ(first.surface_name_canonical, ""PRESSURE-SURFACE"") | EXPECT_EQ(first.load_type, ""P"") | EXPECT_DOUBLE_EQ(first.magnitude, 0.0) | EXPECT_EQ(first.magnitude_raw, ""-0.0"") | EXPECT_EQ(first.data_ordinal, 0U) | EXPECT_EQ(first.load_ordinal, 0U) | EXPECT_LT(first.keyword_location.line, first.data_location.line) | EXPECT_EQ(second.magnitude_raw, ""+2.50e+03"") | EXPECT_DOUBLE_EQ(second.magnitude, 2500.0) | EXPECT_EQ(second.data_ordinal, 1U) | EXPECT_EQ(second.load_ordinal, 1U)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].facet_ordinal, 0U) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].facet_ordinal, 1U) | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg) | ASSERT_EQ(step.SurfacePressureLoads().size(), 2U) | EXPECT_EQ(first.step_name_raw, ""Pressure-Step"") | EXPECT_EQ(first.step_name_canonical, ""PRESSURE-STEP"") | EXPECT_EQ(first.surface_name_raw, ""pressure-surface"") | EXPECT_EQ(first.surface_name_canonical, ""PRESSURE-SURFACE"") | EXPECT_EQ(first.load_type, ""P"") | EXPECT_DOUBLE_EQ(first.magnitude, 0.0) | EXPECT_EQ(first.magnitude_raw, ""-0.0"") | EXPECT_EQ(first.data_ordinal, 0U) | EXPECT_EQ(first.load_ordinal, 0U) | EXPECT_LT(first.keyword_location.line, first.data_location.line) | EXPECT_EQ(second.magnitude_raw, ""+2.50e+03"") | EXPECT_DOUBLE_EQ(second.magnitude, 2500.0) | EXPECT_EQ(second.data_ordinal, 1U) | EXPECT_EQ(second.load_ordinal, 1U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords; assertion 3개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords 유지 원문 검사 body 및 assertion 동일. 42e89d7898679456d451df49a6eec0e9e98cc775ba616c469f3ad6c9839f3a6b 42e89d7898679456d451df49a6eec0e9e98cc775ba616c469f3ad6c9839f3a6b ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_label, 10) | EXPECT_DOUBLE_EQ(domain.Steps()[0U].SurfacePressureLoads()[0].magnitude, 1.0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_label, 10) | EXPECT_DOUBLE_EQ(domain.Steps()[0U].SurfacePressureLoads()[0].magnitude, 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain; assertion 4개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain 유지 원문 검사 body 및 assertion 동일. 83c413cc8fb859ea110ee4895701e8637ebd25d495ccc13f88c4d67032a8394e 83c413cc8fb859ea110ee4895701e8637ebd25d495ccc13f88c4d67032a8394e ASSERT_TRUE(mapped.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_EQ(&model.Value().ActiveSurfacePressureLoads(), &mapped.Value().Steps()[0U].SurfacePressureLoads()) | EXPECT_EQ(model.Value().ActiveSurfacePressureLoads().size(), 1U) ASSERT_TRUE(mapped.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_EQ(&model.Value().ActiveSurfacePressureLoads(), &mapped.Value().Steps()[0U].SurfacePressureLoads()) | EXPECT_EQ(model.Value().ActiveSurfacePressureLoads().size(), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation; assertion 6개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation 유지 원문 검사 body 및 assertion 동일. 87b289b662f1e0f3698f77b333ddd4ccbf28081d4ecfdb62b8baedc1c663909b 87b289b662f1e0f3698f77b333ddd4ccbf28081d4ecfdb62b8baedc1c663909b "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].magnitude_raw, ""+0"") | EXPECT_DOUBLE_EQ(loads[0].magnitude, 0.0) | EXPECT_EQ(loads[1].magnitude_raw, ""-1.25E-3"") | EXPECT_DOUBLE_EQ(loads[1].magnitude, -0.00125)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].magnitude_raw, ""+0"") | EXPECT_DOUBLE_EQ(loads[0].magnitude, 0.0) | EXPECT_EQ(loads[1].magnitude_raw, ""-1.25E-3"") | EXPECT_DOUBLE_EQ(loads[1].magnitude, -0.00125)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation; assertion 10개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation 유지 원문 검사 body 및 assertion 동일. 1ce5f567f199255b591700b92f8ecc0c9f9484c5315310cc34228f91d1b5f7e3 1ce5f567f199255b591700b92f8ecc0c9f9484c5315310cc34228f91d1b5f7e3 "ASSERT_FALSE(non_ascii.HasValue()) | ASSERT_EQ(non_ascii.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().code, ""invalid-input-character"") | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().location.line, 2U) | ASSERT_FALSE(overlength.HasValue()) | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().code, ""input-line-too-long"") | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().location.line, 1U) | ASSERT_FALSE(continuation.HasValue()) | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().code, ""malformed-keyword"") | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().location.line, 2U)" "ASSERT_FALSE(non_ascii.HasValue()) | ASSERT_EQ(non_ascii.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().code, ""invalid-input-character"") | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().location.line, 2U) | ASSERT_FALSE(overlength.HasValue()) | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().code, ""input-line-too-long"") | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().location.line, 1U) | ASSERT_FALSE(continuation.HasValue()) | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().code, ""malformed-keyword"") | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().location.line, 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds 유지 원문 검사 body 및 assertion 동일. 68c16419be0faeb3e5c631b0e2c4d1e86e40ed448590aec8a56567e36f406ea7 68c16419be0faeb3e5c631b0e2c4d1e86e40ed448590aec8a56567e36f406ea7 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality 유지 원문 검사 body 및 assertion 동일. ce9916ba710c77e4eb855936e4e9b09baaa2f5362abb02621d469075a5c06faa ce9916ba710c77e4eb855936e4e9b09baaa2f5362abb02621d469075a5c06faa 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets 유지 원문 검사 body 및 assertion 동일. b989869b46405f081a67b42c2ac227713272b84c67b79337276cef65ce359cf4 b989869b46405f081a67b42c2ac227713272b84c67b79337276cef65ce359cf4 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets 유지 원문 검사 body 및 assertion 동일. 569ad93130ac52b9b57b42010b2150591c9f0125fb21d8c2469cc515e6917db5 569ad93130ac52b9b57b42010b2150591c9f0125fb21d8c2469cc515e6917db5 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning; assertion 8개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning 유지 원문 검사 body 및 assertion 동일. 6236b7eb61a4fd35e83e7ae25ddc5570a7cebd6db3eb16bf99f95c45470a5c72 6236b7eb61a4fd35e83e7ae25ddc5570a7cebd6db3eb16bf99f95c45470a5c72 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(OnlySurface(result.Value()).facets.size(), 1U) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(warning.code, ""duplicate-surface-member-normalized"") | EXPECT_EQ(warning.location.line, 29U) | EXPECT_EQ(warning.keyword, ""SURFACE"") | EXPECT_EQ(warning.entity_identity, ""Pressure-Surface"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(OnlySurface(result.Value()).facets.size(), 1U) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(warning.code, ""duplicate-surface-member-normalized"") | EXPECT_EQ(warning.location.line, 29U) | EXPECT_EQ(warning.keyword, ""SURFACE"") | EXPECT_EQ(warning.entity_identity, ""Pressure-Surface"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsConflictingSidesForOneElement ShellSurfacePressureInput.RejectsConflictingSidesForOneElement; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsConflictingSidesForOneElement 유지 원문 검사 body 및 assertion 동일. 315b661ced70d8d24863f470071109e53670f8da16a0b9bd3b967f8323ba5bea 315b661ced70d8d24863f470071109e53670f8da16a0b9bd3b967f8323ba5bea 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes 유지 원문 검사 body 및 assertion 동일. c59f0842555c4f634f8e5b90784578f9266a27d716f16648d27acb9709bee548 c59f0842555c4f634f8e5b90784578f9266a27d716f16648d27acb9709bee548 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication; assertion 7개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication 유지 원문 검사 body 및 assertion 동일. bf188f0db4fa94c007143db4457732b390ea10be44a09c4ac30e0498c4d7e2cf bf188f0db4fa94c007143db4457732b390ea10be44a09c4ac30e0498c4d7e2cf ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].load_ordinal, 0U) | EXPECT_EQ(loads[1].load_ordinal, 1U) | EXPECT_EQ(loads[0].data_ordinal, 0U) | EXPECT_EQ(loads[1].data_ordinal, 1U) | EXPECT_DOUBLE_EQ(loads[0].magnitude, loads[1].magnitude) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].load_ordinal, 0U) | EXPECT_EQ(loads[1].load_ordinal, 1U) | EXPECT_EQ(loads[0].data_ordinal, 0U) | EXPECT_EQ(loads[1].data_ordinal, 1U) | EXPECT_DOUBLE_EQ(loads[0].magnitude, loads[1].magnitude) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate; assertion 2개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate 유지 원문 검사 body 및 assertion 동일. 003fd75844ef98765cfaa6d972a17143273fdfee97b19ba5f6e778352bd86bf6 003fd75844ef98765cfaa6d972a17143273fdfee97b19ba5f6e778352bd86bf6 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""conflicting-surface-membership"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""conflicting-surface-membership"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns; assertion 11개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns 유지 원문 검사 body 및 assertion 동일. 7544df73d8202a307316ba7ec6a6f786d8eb7c4b585beceb4280997ebf5c5c8f 7544df73d8202a307316ba7ec6a6f786d8eb7c4b585beceb4280997ebf5c5c8f ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_EQ(first.Value().Warnings().size(), 1U) | ASSERT_EQ(second.Value().Warnings().size(), 1U) | EXPECT_EQ(left.severity, right.severity) | EXPECT_EQ(left.code, right.code) | EXPECT_EQ(left.location.file, right.location.file) | EXPECT_EQ(left.location.line, right.location.line) | EXPECT_EQ(left.keyword, right.keyword) | EXPECT_EQ(left.entity_identity, right.entity_identity) | EXPECT_EQ(left.message, right.message) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_EQ(first.Value().Warnings().size(), 1U) | ASSERT_EQ(second.Value().Warnings().size(), 1U) | EXPECT_EQ(left.severity, right.severity) | EXPECT_EQ(left.code, right.code) | EXPECT_EQ(left.location.file, right.location.file) | EXPECT_EQ(left.location.line, right.location.line) | EXPECT_EQ(left.keyword, right.keyword) | EXPECT_EQ(left.entity_identity, right.entity_identity) | EXPECT_EQ(left.message, right.message) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp support@1-126 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, ReadText, ReplaceOnce, ExpectSingleFailure, ShellDeck, OnlySurface tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d01dd887a99bccd610d4db4c59f83a92cdc73f44a8d962cd5349c44d36562723 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/thermal_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 32개 tests/unit/io/abaqus/thermal_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. efd4b1c00fa1db1fa4fe9ccd369c34f9bea4cc2665b5c00972792a0fd66d9483 efd4b1c00fa1db1fa4fe9ccd369c34f9bea4cc2665b5c00972792a0fd66d9483 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsDs4MaterialsTargetsAndAdditiveFluxes ThermalDomainMapping.MapsDs4MaterialsTargetsAndAdditiveFluxes; assertion 12개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsDs4MaterialsTargetsAndAdditiveFluxes 유지 원문 검사 body 및 assertion 동일. af2d22c04e46f6dd711a20088fbc473854263068c67a74e8f27049e4026c2a22 af2d22c04e46f6dd711a20088fbc473854263068c67a74e8f27049e4026c2a22 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.ThermalMaterials()[0U].Conductivity(), 54.0) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->maximum_increments, 100U) | EXPECT_EQ(domain.ThermalModelBoundaries().size(), 2U) | EXPECT_EQ(domain.ThermalStep()->Boundaries().size(), 2U) | ASSERT_EQ(domain.ThermalStep()->Loads().size(), 4U) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[0U].power, -2.0) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[3U].power, -3.0)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.ThermalMaterials()[0U].Conductivity(), 54.0) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->maximum_increments, 100U) | EXPECT_EQ(domain.ThermalModelBoundaries().size(), 2U) | EXPECT_EQ(domain.ThermalStep()->Boundaries().size(), 2U) | ASSERT_EQ(domain.ThermalStep()->Loads().size(), 4U) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[0U].power, -2.0) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[3U].power, -3.0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInteriorAndConflictingThermalBoundaries ThermalDomainMapping.RejectsInteriorAndConflictingThermalBoundaries; assertion 4개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInteriorAndConflictingThermalBoundaries 유지 원문 검사 body 및 assertion 동일. 7ec98df39941a00678cd5ef92a12a7f68a90cda117bae9baef2a0684c5f96b7d 7ec98df39941a00678cd5ef92a12a7f68a90cda117bae9baef2a0684c5f96b7d "ASSERT_FALSE(invalid_dof.HasValue()) | EXPECT_EQ(invalid_dof.GetStatus().Diagnostics()[0U].code, ""invalid-dof"") | ASSERT_FALSE(invalid_conflict.HasValue()) | EXPECT_EQ(invalid_conflict.GetStatus().Diagnostics()[0U].code, ""conflicting-boundary-condition"")" "ASSERT_FALSE(invalid_dof.HasValue()) | EXPECT_EQ(invalid_dof.GetStatus().Diagnostics()[0U].code, ""invalid-dof"") | ASSERT_FALSE(invalid_conflict.HasValue()) | EXPECT_EQ(invalid_conflict.GetStatus().Diagnostics()[0U].code, ""conflicting-boundary-condition"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AcceptsSectionPointSpellingsAndRejectsUnsupportedForms ThermalDomainMapping.AcceptsSectionPointSpellingsAndRejectsUnsupportedForms; assertion 1개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AcceptsSectionPointSpellingsAndRejectsUnsupportedForms 유지 원문 검사 body 및 assertion 동일. 0246d651e3e2c547182aa0793b1ede7ebad37bb947330710f83c05bc1899a641 0246d651e3e2c547182aa0793b1ede7ebad37bb947330710f83c05bc1899a641 EXPECT_EQ(MapText(deck).HasValue(), test_case.second) EXPECT_EQ(MapText(deck).HasValue(), test_case.second) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalMaterialAndControlForms ThermalDomainMapping.RejectsThermalMaterialAndControlForms; assertion 2개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalMaterialAndControlForms 유지 원문 검사 body 및 assertion 동일. aa52baa4e9489c8924eccd069573c18e9d91f3432343b409fd2e822e1c24177b aa52baa4e9489c8924eccd069573c18e9d91f3432343b409fd2e822e1c24177b ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalNoOpAndProcedureViolations ThermalDomainMapping.RejectsThermalNoOpAndProcedureViolations; assertion 2개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalNoOpAndProcedureViolations 유지 원문 검사 body 및 assertion 동일. 40e1583ca082fe70743b2bc1583336dfe4284fe520aa4d00ddaf5a2297c8df91 40e1583ca082fe70743b2bc1583336dfe4284fe520aa4d00ddaf5a2297c8df91 ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AppliesSameDofStepOverrideAndDefaultValues ThermalDomainMapping.AppliesSameDofStepOverrideAndDefaultValues; assertion 5개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AppliesSameDofStepOverrideAndDefaultValues 유지 원문 검사 body 및 assertion 동일. 5277085c94aa63d3671618cea4d01e147843cb61b11bcdd8ea01ced3610db2e3 5277085c94aa63d3671618cea4d01e147843cb61b11bcdd8ea01ced3610db2e3 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().ThermalModelBoundaries().size(), 2U) | ASSERT_EQ(result.Value().ThermalStep()->Boundaries().size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().ThermalModelBoundaries()[0U].value, 0.0) | EXPECT_DOUBLE_EQ(result.Value().ThermalStep()->Boundaries()[0U].value, 30.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().ThermalModelBoundaries().size(), 2U) | ASSERT_EQ(result.Value().ThermalStep()->Boundaries().size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().ThermalModelBoundaries()[0U].value, 0.0) | EXPECT_DOUBLE_EQ(result.Value().ThermalStep()->Boundaries()[0U].value, 30.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsApprovedShellThermalReference ThermalDomainMapping.MapsApprovedShellThermalReference; assertion 43개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsApprovedShellThermalReference 유지 원문 검사 body 및 assertion 동일. 55cab422db4e1520d96658c9b35707efad8d2f61960a1a9c91f2696e239f596f 55cab422db4e1520d96658c9b35707efad8d2f61960a1a9c91f2696e239f596f "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 729U) | ASSERT_EQ(domain.ThermalElements().Size(), 676U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(step.name, ""Step-1"") | EXPECT_EQ(step.maximum_increments, 100000U) | EXPECT_EQ(step.nominal_increment, 1.) | EXPECT_EQ(step.time_period, 100.) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 100U) | EXPECT_EQ(grid.Value().Time(37U), 37.) | EXPECT_EQ(domain.ThermalMaterials()[0].Name(), ""Material-1"") | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), 54.) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), 7850.) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), 460.) | EXPECT_EQ(domain.ThermalSections()[0].name, ""Set-1"") | EXPECT_EQ(domain.ThermalSections()[0].thickness, .5) | EXPECT_EQ(domain.ThermalSections()[0].location.file, path) | EXPECT_EQ(domain.ThermalSections()[0].location.line, 1421U) | EXPECT_EQ(domain.Nodes()[i].source_id.instance_name, ""Part-1-1"") | EXPECT_EQ(domain.Nodes()[i].source_id.source_label, static_cast(i + 1U)) | EXPECT_EQ(domain.ThermalElements()[i].SourceId().instance_name, ""Part-1-1"") | EXPECT_EQ(domain.ThermalElements()[i].SourceId().source_label, static_cast(i + 1U)) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), expected_boundary_labels.size()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), step.Boundaries().size()) | EXPECT_EQ(model_bc.node_index, step_bc.node_index) | EXPECT_EQ(domain.Nodes()[model_bc.node_index].source_id.source_label, expected_boundary_labels[i]) | EXPECT_EQ(model_bc.dof, 11) | EXPECT_EQ(step_bc.dof, 11) | EXPECT_EQ(model_bc.value, 0.) | EXPECT_EQ(step_bc.value, 1000.) | EXPECT_EQ(model_bc.location.file, path) | EXPECT_LT(model_bc.location.line, step_bc.location.line) | ASSERT_EQ(domain.ElementSurfaces().size(), 1U) | ASSERT_EQ(domain.ElementSurfaces()[0].facets.size(), 169U) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.front().source_element_label, 170) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.back().source_element_label, 338) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_type, ""DS4"") | ASSERT_EQ(domain.Warnings().size(), 6U) | EXPECT_EQ(std::count_if(domain.Warnings().begin(), domain.Warnings().end(), [&](const auto& warning) { return warning.location.file == path && warning.location.line == block.location.line && warning.keyword == block.canonical_name; }), 1)" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 729U) | ASSERT_EQ(domain.ThermalElements().Size(), 676U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(step.name, ""Step-1"") | EXPECT_EQ(step.maximum_increments, 100000U) | EXPECT_EQ(step.nominal_increment, 1.) | EXPECT_EQ(step.time_period, 100.) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 100U) | EXPECT_EQ(grid.Value().Time(37U), 37.) | EXPECT_EQ(domain.ThermalMaterials()[0].Name(), ""Material-1"") | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), 54.) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), 7850.) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), 460.) | EXPECT_EQ(domain.ThermalSections()[0].name, ""Set-1"") | EXPECT_EQ(domain.ThermalSections()[0].thickness, .5) | EXPECT_EQ(domain.ThermalSections()[0].location.file, path) | EXPECT_EQ(domain.ThermalSections()[0].location.line, 1421U) | EXPECT_EQ(domain.Nodes()[i].source_id.instance_name, ""Part-1-1"") | EXPECT_EQ(domain.Nodes()[i].source_id.source_label, static_cast(i + 1U)) | EXPECT_EQ(domain.ThermalElements()[i].SourceId().instance_name, ""Part-1-1"") | EXPECT_EQ(domain.ThermalElements()[i].SourceId().source_label, static_cast(i + 1U)) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), expected_boundary_labels.size()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), step.Boundaries().size()) | EXPECT_EQ(model_bc.node_index, step_bc.node_index) | EXPECT_EQ(domain.Nodes()[model_bc.node_index].source_id.source_label, expected_boundary_labels[i]) | EXPECT_EQ(model_bc.dof, 11) | EXPECT_EQ(step_bc.dof, 11) | EXPECT_EQ(model_bc.value, 0.) | EXPECT_EQ(step_bc.value, 1000.) | EXPECT_EQ(model_bc.location.file, path) | EXPECT_LT(model_bc.location.line, step_bc.location.line) | ASSERT_EQ(domain.ElementSurfaces().size(), 1U) | ASSERT_EQ(domain.ElementSurfaces()[0].facets.size(), 169U) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.front().source_element_label, 170) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.back().source_element_label, 338) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_type, ""DS4"") | ASSERT_EQ(domain.Warnings().size(), 6U) | EXPECT_EQ(std::count_if(domain.Warnings().begin(), domain.Warnings().end(), [&](const auto& warning) { return warning.location.file == path && warning.location.line == block.location.line && warning.keyword == block.canonical_name; }), 1)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.StrictOutputAndRestartNoOps ThermalDomainMapping.StrictOutputAndRestartNoOps; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.StrictOutputAndRestartNoOps 유지 원문 검사 body 및 assertion 동일. 51e37954cc1bd09a41977f48f6977a1889e509d285ae1bde007e30b5345078ef 51e37954cc1bd09a41977f48f6977a1889e509d285ae1bde007e30b5345078ef 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.EveryAcceptedNoOpHasExactlyOneSourceWarning ThermalDomainMapping.EveryAcceptedNoOpHasExactlyOneSourceWarning; assertion 5개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.EveryAcceptedNoOpHasExactlyOneSourceWarning 유지 원문 검사 body 및 assertion 동일. f320f56a6a51fb244decaea008d505f0b1b7d96d0ed1c36dc537572256e87b74 f320f56a6a51fb244decaea008d505f0b1b7d96d0ed1c36dc537572256e87b74 ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(warnings.size(), blocks.size()) | EXPECT_EQ(std::count_if(warnings.begin(), warnings.end(), [&](const auto& w) { return w.severity == fesa::Severity::kWarning && w.keyword == block.second && w.location.file == input.Path() && w.location.line == line; }), 1) | EXPECT_DOUBLE_EQ( result.Value().ThermalInitialConditions()[0].station_values[0], 20.) ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(warnings.size(), blocks.size()) | EXPECT_EQ(std::count_if(warnings.begin(), warnings.end(), [&](const auto& w) { return w.severity == fesa::Severity::kWarning && w.keyword == block.second && w.location.file == input.Path() && w.location.line == line; }), 1) | EXPECT_DOUBLE_EQ( result.Value().ThermalInitialConditions()[0].station_values[0], 20.) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SurfaceFacetsAreResolvedAndPreserved ThermalDomainMapping.SurfaceFacetsAreResolvedAndPreserved; assertion 11개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SurfaceFacetsAreResolvedAndPreserved 유지 원문 검사 body 및 assertion 동일. 1e33822a025e5c4a4e36a221f6e21dd2e83b6223c22d01f0f2bf0e2e4a150638 1e33822a025e5c4a4e36a221f6e21dd2e83b6223c22d01f0f2bf0e2e4a150638 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surfaces.size(), 2U) | ASSERT_EQ(surfaces[i].facets.size(), 1U) | EXPECT_EQ(facet.element_index, 0U) | EXPECT_EQ(facet.source_element_label, 1) | EXPECT_EQ(facet.instance_name_raw, ""I"") | EXPECT_EQ(facet.part_name_raw, ""P"") | EXPECT_EQ(facet.source_element_type, ""DS4"") | EXPECT_EQ(facet.side, side == ""SPOS"" ? fesa::ShellSurfaceSide::kSpos : fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(facet.member_kind, i == 0U ? fesa::SurfaceMemberKind::kDirect : fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.first_member_location.line, LineOf(deck, (i == 0U ? ""I.1, "" : ""Faces, "") + side))" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surfaces.size(), 2U) | ASSERT_EQ(surfaces[i].facets.size(), 1U) | EXPECT_EQ(facet.element_index, 0U) | EXPECT_EQ(facet.source_element_label, 1) | EXPECT_EQ(facet.instance_name_raw, ""I"") | EXPECT_EQ(facet.part_name_raw, ""P"") | EXPECT_EQ(facet.source_element_type, ""DS4"") | EXPECT_EQ(facet.side, side == ""SPOS"" ? fesa::ShellSurfaceSide::kSpos : fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(facet.member_kind, i == 0U ? fesa::SurfaceMemberKind::kDirect : fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.first_member_location.line, LineOf(deck, (i == 0U ? ""I.1, "" : ""Faces, "") + side))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsUnresolvedOrInvalidSurfaces ThermalDomainMapping.RejectsUnresolvedOrInvalidSurfaces; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsUnresolvedOrInvalidSurfaces 유지 원문 검사 body 및 assertion 동일. 678d79744318544126a5fab47e194fbb985efe58934d0728ef55b20156e7d91f 678d79744318544126a5fab47e194fbb985efe58934d0728ef55b20156e7d91f 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.PreprintAndPhysicalConstantsAreStrictAndSourceAware ThermalDomainMapping.PreprintAndPhysicalConstantsAreStrictAndSourceAware; assertion 3개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.PreprintAndPhysicalConstantsAreStrictAndSourceAware 유지 원문 검사 body 및 assertion 동일. 3b12f2919d0a6fdfa013a4ac38dbdce85622c99ad095e6f1f4c74ccef9eec6d2 3b12f2919d0a6fdfa013a4ac38dbdce85622c99ad095e6f1f4c74ccef9eec6d2 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""PHYSICAL CONSTANTS"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 1U)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""PHYSICAL CONSTANTS"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 1U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsChildOutputUnknownAndWrongNoOpScopes ThermalDomainMapping.RejectsChildOutputUnknownAndWrongNoOpScopes; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsChildOutputUnknownAndWrongNoOpScopes 유지 원문 검사 body 및 assertion 동일. 6b5c15e74febb98d3db79f8aef581dd44e658c4aa04714443914a23d5cba6117 6b5c15e74febb98d3db79f8aef581dd44e658c4aa04714443914a23d5cba6117 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MaterialConstantsAndSectionLinksAreStrict ThermalDomainMapping.MaterialConstantsAndSectionLinksAreStrict; assertion 1개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MaterialConstantsAndSectionLinksAreStrict 유지 원문 검사 body 및 assertion 동일. f4ccfe76b71133eea01edf7824c2b21d6e5d49bdad620c5d3f7bcc205c7d532f f4ccfe76b71133eea01edf7824c2b21d6e5d49bdad620c5d3f7bcc205c7d532f ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InitialTemperatureDefaultsAndOverlaps ThermalDomainMapping.InitialTemperatureDefaultsAndOverlaps; assertion 4개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InitialTemperatureDefaultsAndOverlaps 유지 원문 검사 body 및 assertion 동일. cff5684ec434d19c1c53df0be1764dad47e45d50bd4df30c490fb263894fbd0c cff5684ec434d19c1c53df0be1764dad47e45d50bd4df30c490fb263894fbd0c ASSERT_TRUE(unspecified.HasValue()) | EXPECT_TRUE(unspecified.Value().ThermalInitialConditions().empty()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(temperature, 20.) ASSERT_TRUE(unspecified.HasValue()) | EXPECT_TRUE(unspecified.Value().ThermalInitialConditions().empty()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(temperature, 20.) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InactiveTargetsFailWithOriginalKeywordAndIdentity ThermalDomainMapping.InactiveTargetsFailWithOriginalKeywordAndIdentity; assertion 8개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InactiveTargetsFailWithOriginalKeywordAndIdentity 유지 원문 검사 body 및 assertion 동일. 83f7f07fbb31e1317402934ace845532b895851b979987760d55f5d4cd771562 83f7f07fbb31e1317402934ace845532b895851b979987760d55f5d4cd771562 "ASSERT_TRUE(accepted.HasValue()) | EXPECT_EQ(accepted.Value().Nodes().size(), 5U) | ASSERT_TRUE(view.HasValue()) | EXPECT_EQ(view.Value().ActiveThermalNodes().size(), 4U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.entity_identity, ""99"") | EXPECT_EQ(diagnostic.location.line, LineOf(deck, replacement.second)) | EXPECT_NE(diagnostic.keyword, ""THERMAL"")" "ASSERT_TRUE(accepted.HasValue()) | EXPECT_EQ(accepted.Value().Nodes().size(), 5U) | ASSERT_TRUE(view.HasValue()) | EXPECT_EQ(view.Value().ActiveThermalNodes().size(), 4U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.entity_identity, ""99"") | EXPECT_EQ(diagnostic.location.line, LineOf(deck, replacement.second)) | EXPECT_NE(diagnostic.keyword, ""THERMAL"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ModelBoundaryInheritanceAndStepOverrideReachDofManager ThermalDomainMapping.ModelBoundaryInheritanceAndStepOverrideReachDofManager; assertion 9개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ModelBoundaryInheritanceAndStepOverrideReachDofManager 유지 원문 검사 body 및 assertion 동일. f7561b77de2a4c22260774a6681cea57b317458be3d0c6d27ebe1722d41297c0 f7561b77de2a4c22260774a6681cea57b317458be3d0c6d27ebe1722d41297c0 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), 4U) | ASSERT_EQ(domain.ThermalStep()->Boundaries().size(), 3U) | EXPECT_DOUBLE_EQ(domain.ThermalModelBoundaries()[0].value, 7.) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Boundaries()[0].value, -30.) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), expected_dofs) | EXPECT_DOUBLE_EQ(dofs.Value().PrescribedValues()[i], expected_values[i]) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), 4U) | ASSERT_EQ(domain.ThermalStep()->Boundaries().size(), 3U) | EXPECT_DOUBLE_EQ(domain.ThermalModelBoundaries()[0].value, 7.) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Boundaries()[0].value, -30.) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), expected_dofs) | EXPECT_DOUBLE_EQ(dofs.Value().PrescribedValues()[i], expected_values[i]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.BoundariesRejectConflictsAndUnsupportedRowsAtBothLevels ThermalDomainMapping.BoundariesRejectConflictsAndUnsupportedRowsAtBothLevels; assertion 1개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.BoundariesRejectConflictsAndUnsupportedRowsAtBothLevels 유지 원문 검사 body 및 assertion 동일. a8f827d53efc01de6f80689eaf293ddb96b5915e6b4ab8bcc73c1c1035a09da3 a8f827d53efc01de6f80689eaf293ddb96b5915e6b4ab8bcc73c1c1035a09da3 EXPECT_TRUE( MapText(Replace(ThermalDeck(), original, original + equal)).HasValue()) EXPECT_TRUE( MapText(Replace(ThermalDeck(), original, original + equal)).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SignedFluxRetainsRowOrderDuplicatesAndConstrainedTargets ThermalDomainMapping.SignedFluxRetainsRowOrderDuplicatesAndConstrainedTargets; assertion 8개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SignedFluxRetainsRowOrderDuplicatesAndConstrainedTargets 유지 원문 검사 body 및 assertion 동일. 67fcb68684488e6a52db58d6d9d5968ea92bbe01cc27a8d2a942a3f41444bec9 67fcb68684488e6a52db58d6d9d5968ea92bbe01cc27a8d2a942a3f41444bec9 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 5U) | EXPECT_EQ(loads[i].node_index, nodes[i]) | EXPECT_EQ(loads[i].dof, dofs[i]) | EXPECT_DOUBLE_EQ(loads[i].power, powers[i]) | EXPECT_EQ(loads[i].source_order, i) | EXPECT_EQ(loads[1].location.line, loads[2].location.line) | EXPECT_LT(loads[3].location.line, loads[4].location.line) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 5U) | EXPECT_EQ(loads[i].node_index, nodes[i]) | EXPECT_EQ(loads[i].dof, dofs[i]) | EXPECT_DOUBLE_EQ(loads[i].power, powers[i]) | EXPECT_EQ(loads[i].source_order, i) | EXPECT_EQ(loads[1].location.line, loads[2].location.line) | EXPECT_LT(loads[3].location.line, loads[4].location.line) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FluxRejectsOptionsRowsAndWrongScopes ThermalDomainMapping.FluxRejectsOptionsRowsAndWrongScopes; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FluxRejectsOptionsRowsAndWrongScopes 유지 원문 검사 body 및 assertion 동일. 81d3c024c63600240315286bb6e27e326334e1e331df08d355ae3a621a691140 81d3c024c63600240315286bb6e27e326334e1e331df08d355ae3a621a691140 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.TimeControlsUseSharedGridIncludingInputCellBoundaries ThermalDomainMapping.TimeControlsUseSharedGridIncludingInputCellBoundaries; assertion 12개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.TimeControlsUseSharedGridIncludingInputCellBoundaries 유지 원문 검사 body 및 assertion 동일. ef1ee468ae9c492f40c424c0c3deb777f280c6bb9adc1c2fff05a8f58203abb9 ef1ee468ae9c492f40c424c0c3deb777f280c6bb9adc1c2fff05a8f58203abb9 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(step.nominal_increment, item.increment) | EXPECT_EQ(step.time_period, item.period) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), item.count) | EXPECT_DOUBLE_EQ(grid.Value().Time(item.count), item.period) | EXPECT_EQ(grid.Value().Delta(item.count), item.last) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().ThermalStep()->maximum_increments, 4294967295U) | ASSERT_TRUE(defaults.HasValue()) | EXPECT_EQ(defaults.Value().ThermalStep()->maximum_increments, 100U) | EXPECT_TRUE(MapText(deck).HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(step.nominal_increment, item.increment) | EXPECT_EQ(step.time_period, item.period) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), item.count) | EXPECT_DOUBLE_EQ(grid.Value().Time(item.count), item.period) | EXPECT_EQ(grid.Value().Delta(item.count), item.last) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().ThermalStep()->maximum_increments, 4294967295U) | ASSERT_TRUE(defaults.HasValue()) | EXPECT_EQ(defaults.Value().ThermalStep()->maximum_increments, 100U) | EXPECT_TRUE(MapText(deck).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInvalidTimeAndMixedProceduresInEitherOrder ThermalDomainMapping.RejectsInvalidTimeAndMixedProceduresInEitherOrder; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInvalidTimeAndMixedProceduresInEitherOrder 유지 원문 검사 body 및 assertion 동일. 5b1320ef7da28a420e69f4a16c2ee726c95f57abeeb08cb2f1b5442cead6914c 5b1320ef7da28a420e69f4a16c2ee726c95f57abeeb08cb2f1b5442cead6914c 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalMaterialAndSourceProvenanceArePreserved ThermalDomainMapping.ThermalMaterialAndSourceProvenanceArePreserved; assertion 20개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalMaterialAndSourceProvenanceArePreserved 유지 원문 검사 body 및 assertion 동일. a83d5e4753e50f897bd60b99b3825dd7ac3d14d1af14ed384a814d45662478b6 a83d5e4753e50f897bd60b99b3825dd7ac3d14d1af14ed384a814d45662478b6 "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | EXPECT_EQ(section.material_index, 1U) | EXPECT_EQ(section.name, ""E"") | EXPECT_EQ(section.source_id.source_label_text, ""E"") | EXPECT_EQ(section.location.file, input.Path()) | EXPECT_EQ(section.location.line, LineOf(deck, ""*Shell Section"")) | EXPECT_DOUBLE_EQ(section.thickness, .5) | EXPECT_EQ(material.Name(), ""M"") | EXPECT_DOUBLE_EQ(material.Conductivity(), 54.) | EXPECT_DOUBLE_EQ(material.Density(), 7850.) | EXPECT_DOUBLE_EQ(material.SpecificHeat(), 460.) | EXPECT_EQ(material.Location().line, LineOf(deck, ""*Material, name=M"")) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().instance_name, ""I"") | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 1) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->location.file, input.Path()) | EXPECT_EQ(domain.ThermalStep()->location.line, LineOf(deck, ""*Step""))" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | EXPECT_EQ(section.material_index, 1U) | EXPECT_EQ(section.name, ""E"") | EXPECT_EQ(section.source_id.source_label_text, ""E"") | EXPECT_EQ(section.location.file, input.Path()) | EXPECT_EQ(section.location.line, LineOf(deck, ""*Shell Section"")) | EXPECT_DOUBLE_EQ(section.thickness, .5) | EXPECT_EQ(material.Name(), ""M"") | EXPECT_DOUBLE_EQ(material.Conductivity(), 54.) | EXPECT_DOUBLE_EQ(material.Density(), 7850.) | EXPECT_DOUBLE_EQ(material.SpecificHeat(), 460.) | EXPECT_EQ(material.Location().line, LineOf(deck, ""*Material, name=M"")) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().instance_name, ""I"") | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 1) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->location.file, input.Path()) | EXPECT_EQ(domain.ThermalStep()->location.line, LineOf(deck, ""*Step""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FiniteThermalScalarsPreserveSubnormalAndSignedValues ThermalDomainMapping.FiniteThermalScalarsPreserveSubnormalAndSignedValues; assertion 9개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FiniteThermalScalarsPreserveSubnormalAndSignedValues 유지 원문 검사 body 및 assertion 동일. 3a8d71661b54b80493cecf844c9354c0030c40b2616bd05a29aa13346381261d 3a8d71661b54b80493cecf844c9354c0030c40b2616bd05a29aa13346381261d ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), tiny) | EXPECT_EQ(domain.ThermalSections()[0].thickness, tiny) | EXPECT_EQ(domain.ThermalInitialConditions()[0].station_values[4], -tiny) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0].value, -tiny) | EXPECT_EQ(domain.ThermalStep()->Loads()[0].power, -tiny) | ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), tiny) | EXPECT_EQ(domain.ThermalSections()[0].thickness, tiny) | EXPECT_EQ(domain.ThermalInitialConditions()[0].station_values[4], -tiny) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0].value, -tiny) | EXPECT_EQ(domain.ThermalStep()->Loads()[0].power, -tiny) | ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalSetAndSurfaceDuplicatesExpandOnce ThermalDomainMapping.ThermalSetAndSurfaceDuplicatesExpandOnce; assertion 5개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalSetAndSurfaceDuplicatesExpandOnce 유지 원문 검사 body 및 assertion 동일. 70f6a3c60352f7322e1271a4458f03823deec7ac49e85cd7ff385d20de9f3c30 70f6a3c60352f7322e1271a4458f03823deec7ac49e85cd7ff385d20de9f3c30 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalElements().Size(), 1U) | ASSERT_EQ(result.Value().ElementSurfaces().size(), 1U) | EXPECT_EQ(result.Value().ElementSurfaces()[0].facets.size(), 1U) | EXPECT_EQ(result.Value().Warnings().size(), 1U) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalElements().Size(), 1U) | ASSERT_EQ(result.Value().ElementSurfaces().size(), 1U) | EXPECT_EQ(result.Value().ElementSurfaces()[0].facets.size(), 1U) | EXPECT_EQ(result.Value().Warnings().size(), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.DeferredFailuresRetainExactInputLocationAndIdentity ThermalDomainMapping.DeferredFailuresRetainExactInputLocationAndIdentity; assertion 9개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.DeferredFailuresRetainExactInputLocationAndIdentity 유지 원문 검사 body 및 assertion 동일. 01f444fd4378662acd9566174387017dd3939056ee5ec7901884183c67c6900a 01f444fd4378662acd9566174387017dd3939056ee5ec7901884183c67c6900a "ASSERT_TRUE(parsed.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.location.file, input.Path()) | EXPECT_EQ(diagnostic.location.line, LineOf(deck, ""1., 100."")) | EXPECT_EQ(diagnostic.keyword, ""HEAT TRANSFER"") | EXPECT_EQ(diagnostic.entity_identity, ""Heat"") | ASSERT_FALSE(missing_contact.HasValue()) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].location.line, 1U) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].keyword, ""PREPRINT"")" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.location.file, input.Path()) | EXPECT_EQ(diagnostic.location.line, LineOf(deck, ""1., 100."")) | EXPECT_EQ(diagnostic.keyword, ""HEAT TRANSFER"") | EXPECT_EQ(diagnostic.entity_identity, ""Heat"") | ASSERT_FALSE(missing_contact.HasValue()) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].location.line, 1U) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].keyword, ""PREPRINT"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMixedElementsAndWrongThermalMaterialScopes ThermalDomainMapping.RejectsMixedElementsAndWrongThermalMaterialScopes; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMixedElementsAndWrongThermalMaterialScopes 유지 원문 검사 body 및 assertion 동일. ff984f852aeb3c53c270694ea7e4eaa2015891728d1e0a86260abf39206b5c92 ff984f852aeb3c53c270694ea7e4eaa2015891728d1e0a86260abf39206b5c92 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetResolvesSectionCaseInsensitively ThermalDomainMapping.InlineElementSetResolvesSectionCaseInsensitively; assertion 12개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetResolvesSectionCaseInsensitively 유지 원문 검사 body 및 assertion 동일. 11a43f66380de877c7ff381c789e0b363e357811dff150b5bd5e0b5d0fa75644 11a43f66380de877c7ff381c789e0b363e357811dff150b5bd5e0b5d0fa75644 "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(set.name, ""inlineShells"") | EXPECT_EQ(set.instance_name, ""I"") | EXPECT_EQ(set.element_indices, std::vector{0U}) | EXPECT_EQ(set.location.file, input.Path()) | EXPECT_EQ(set.location.line, LineOf(deck, ""*Element"")) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalSections()[0].name, ""INLINESHELLS"") | EXPECT_EQ(domain.ThermalSections()[0].location.line, LineOf(deck, ""*Shell Section""))" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(set.name, ""inlineShells"") | EXPECT_EQ(set.instance_name, ""I"") | EXPECT_EQ(set.element_indices, std::vector{0U}) | EXPECT_EQ(set.location.file, input.Path()) | EXPECT_EQ(set.location.line, LineOf(deck, ""*Element"")) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalSections()[0].name, ""INLINESHELLS"") | EXPECT_EQ(domain.ThermalSections()[0].location.line, LineOf(deck, ""*Shell Section""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetPreservesElementRowOrder ThermalDomainMapping.InlineElementSetPreservesElementRowOrder; assertion 8개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetPreservesElementRowOrder 유지 원문 검사 body 및 assertion 동일. 3f5d500fe86f7405086319ff4905bc60894fb8d080af74f6df1f3c7a3b4aa299 3f5d500fe86f7405086319ff4905bc60894fb8d080af74f6df1f3c7a3b4aa299 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | ASSERT_EQ(domain.ElementSets()[0].element_indices.size(), 2U) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 7) | EXPECT_EQ(domain.ThermalElements()[1].SourceId().source_label, 3) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalElements()[1].ThermalSectionIndex(), 0U) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | ASSERT_EQ(domain.ElementSets()[0].element_indices.size(), 2U) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 7) | EXPECT_EQ(domain.ThermalElements()[1].SourceId().source_label, 3) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalElements()[1].ThermalSectionIndex(), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetRejectsInvalidAndDuplicateDefinitions ThermalDomainMapping.InlineElementSetRejectsInvalidAndDuplicateDefinitions; assertion 3개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetRejectsInvalidAndDuplicateDefinitions 유지 원문 검사 body 및 assertion 동일. 2b667a74ce81cfa3de66ebbe8049794f9416f01506fae6df68dc3d3e97ea91d1 2b667a74ce81cfa3de66ebbe8049794f9416f01506fae6df68dc3d3e97ea91d1 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""ELEMENT"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Element""))" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""ELEMENT"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Element""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsBeamSectionAndBeamOnlyChildrenAtTheirSource ThermalDomainMapping.RejectsBeamSectionAndBeamOnlyChildrenAtTheirSource; assertion 3개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsBeamSectionAndBeamOnlyChildrenAtTheirSource 유지 원문 검사 body 및 assertion 동일. d2f88d94560f7a9f695eebc3563b633cb0e076be17328f2fbc56c6793fb58c22 d2f88d94560f7a9f695eebc3563b633cb0e076be17328f2fbc56c6793fb58c22 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""BEAM GENERAL SECTION"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Beam General Section""))" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""BEAM GENERAL SECTION"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Beam General Section""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMalformedDs4ConnectivityAndElementOptions ThermalDomainMapping.RejectsMalformedDs4ConnectivityAndElementOptions; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMalformedDs4ConnectivityAndElementOptions 유지 원문 검사 body 및 assertion 동일. efab1ebde5819473f0bd8e7adcbdc08d2be96827dca23ef798d1a485c709d008 efab1ebde5819473f0bd8e7adcbdc08d2be96827dca23ef798d1a485c709d008 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/abaqus/thermal_domain_test.cpp support@1-146 helper/oracle/fixture/include/static assertion 구간: TemporaryInput, MapText, ThermalDeck, Replace, LineOf, ExpectRejected, Number tests/unit/io/abaqus/thermal_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9791c2574febe33443dffbd2e64441a7c8c962fccb165f678b39cc7d550b2a3e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/abaqus/thermal_domain_test.cpp support@1049-1050 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/thermal_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5d309a1b119015721f17821d48e950cf534158a32c914e89a799118380647c7f 55a2e65c40382b393210d36625666ce014008eaf3cbfbe9610a6dfaf0f840d11 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.RejectsDefaultStateBeforeCreatingOutput DynamicHdf5ResultsWriter.RejectsDefaultStateBeforeCreatingOutput; assertion 5개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.RejectsDefaultStateBeforeCreatingOutput 유지 원문 검사 body 및 assertion 동일. 2b67a7e7a070056ecb65aa9297b70593d65c453c4475315d2cff3fe0018e5846 2b67a7e7a070056ecb65aa9297b70593d65c453c4475315d2cff3fe0018e5846 "ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-output-schema"") | EXPECT_FALSE(std::filesystem::exists(output.Path()))" "ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-output-schema"") | EXPECT_FALSE(std::filesystem::exists(output.Path()))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.SeparatesReducedFilterCombinationFromLegacyDriver DynamicHdf5ResultsWriter.SeparatesReducedFilterCombinationFromLegacyDriver; assertion 8개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.SeparatesReducedFilterCombinationFromLegacyDriver 유지 원문 검사 body 및 assertion 동일. 6e1f7161506bb30dec1b6476fb08a144bf4ad5451198473973be60597f2e2740 6e1f7161506bb30dec1b6476fb08a144bf4ad5451198473973be60597f2e2740 "ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE(writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(metadata.Get(), ""time_integration_formulation""), ""reduced-coordinate-HHT-with-physical-rate-reconstruction"") | EXPECT_EQ(ReadAttribute(auxiliary.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(auxiliary.Get(), ""quantity_semantics""), ""full-chart-HHT-filter-combination-not-predictor-driver"") | EXPECT_EQ(ReadString(physical.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" "ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE(writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(metadata.Get(), ""time_integration_formulation""), ""reduced-coordinate-HHT-with-physical-rate-reconstruction"") | EXPECT_EQ(ReadAttribute(auxiliary.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(auxiliary.Get(), ""quantity_semantics""), ""full-chart-HHT-filter-combination-not-predictor-driver"") | EXPECT_EQ(ReadString(physical.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.WritesCompletePhysicalClampedHistoryAndSchema DynamicHdf5ResultsWriter.WritesCompletePhysicalClampedHistoryAndSchema; assertion 42개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.WritesCompletePhysicalClampedHistoryAndSchema 유지 원문 검사 body 및 assertion 동일. 15b4e67c491410f17a9b661b200e35a71e79de2db81b9007d037a8d82986bb60 15b4e67c491410f17a9b661b200e35a71e79de2db81b9007d037a8d82986bb60 "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadString(metadata.Get(), ""feature_id""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""analysis_procedure""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadString(metadata.Get(), ""mass_formulation""), ""nodal-lumped-kinetic"") | EXPECT_EQ(ReadString(metadata.Get(), ""acceleration_convention""), ""physical-endpoint-and-auxiliary-separated"") | EXPECT_EQ(ReadString(metadata.Get(), ""initial_state""), ""zero-q-v-step-load-0+"") | EXPECT_EQ(ReadString(metadata.Get(), ""unit_system_label""), ""consistent-input-units"") | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 1U) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""alpha"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), -0.05) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""beta"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.275625) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""gamma"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.55) | ASSERT_GE(H5Dread(density.Get(), density_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &density_row), 0) | EXPECT_EQ(density_row.id, 0U) | EXPECT_DOUBLE_EQ(density_row.rho, 2.0) | EXPECT_GT(H5Tequal(mask_type.Get(), H5T_STD_U8LE), 0) | ASSERT_GE(H5Dread(mask.Get(), H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, constraints.data()), 0) | EXPECT_EQ(value, 1U) | EXPECT_EQ(ReadDoubles(file.Get(), ""/model/prescribed_displacement"", {4U, 6U}), std::vector(24U, 0.0)) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_start"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_target"", H5P_DEFAULT), 0) | EXPECT_EQ(ReadString(dataset.Get(), ""component_names""), expected.components) | EXPECT_FALSE( ReadString(dataset.Get(), ""component_unit_dimensions"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""coordinate_system"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""location"").empty()) | EXPECT_EQ(ReadString(dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadString(dataset.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadAttribute(dataset.Get(), ""frame_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""increment_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""is_initial"", H5T_STD_U8LE, H5T_NATIVE_UINT8), index == 0U ? 1U : 0U) | EXPECT_DOUBLE_EQ(ReadAttribute(dataset.Get(), ""time"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), static_cast(index) * 0.25) | EXPECT_EQ(H5Aexists(dataset.Get(), ""load_factor""), 0) | EXPECT_DOUBLE_EQ( values[entry], entry % 9U == 0U || entry % 9U == 4U || entry % 9U == 8U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(values[entry], entry % 3U == 2U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ( values[entry], force ? (leaf == ""nodal/generalized_external_force"" ? 4.0 : -4.0) : 0.0) | EXPECT_EQ(ReadString(stress.Get(), ""source_element_type_dataset""), ""/model/elements.source_element_type"") | EXPECT_EQ(ReadString(stress.Get(), ""midsurface_location_dataset""), ""/model/shell/midsurface_locations"") | EXPECT_EQ(ReadString(stress.Get(), ""section_position_dataset""), ""/model/shell/section_positions"") | EXPECT_EQ(ReadString(stress.Get(), ""local_frame_dataset""), ""/steps/Step-1/frames/2/element/shell/local_frame"") | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_file""), 0) | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_line""), 0)" "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadString(metadata.Get(), ""feature_id""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""analysis_procedure""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadString(metadata.Get(), ""mass_formulation""), ""nodal-lumped-kinetic"") | EXPECT_EQ(ReadString(metadata.Get(), ""acceleration_convention""), ""physical-endpoint-and-auxiliary-separated"") | EXPECT_EQ(ReadString(metadata.Get(), ""initial_state""), ""zero-q-v-step-load-0+"") | EXPECT_EQ(ReadString(metadata.Get(), ""unit_system_label""), ""consistent-input-units"") | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 1U) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""alpha"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), -0.05) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""beta"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.275625) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""gamma"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.55) | ASSERT_GE(H5Dread(density.Get(), density_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &density_row), 0) | EXPECT_EQ(density_row.id, 0U) | EXPECT_DOUBLE_EQ(density_row.rho, 2.0) | EXPECT_GT(H5Tequal(mask_type.Get(), H5T_STD_U8LE), 0) | ASSERT_GE(H5Dread(mask.Get(), H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, constraints.data()), 0) | EXPECT_EQ(value, 1U) | EXPECT_EQ(ReadDoubles(file.Get(), ""/model/prescribed_displacement"", {4U, 6U}), std::vector(24U, 0.0)) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_start"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_target"", H5P_DEFAULT), 0) | EXPECT_EQ(ReadString(dataset.Get(), ""component_names""), expected.components) | EXPECT_FALSE( ReadString(dataset.Get(), ""component_unit_dimensions"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""coordinate_system"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""location"").empty()) | EXPECT_EQ(ReadString(dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadString(dataset.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadAttribute(dataset.Get(), ""frame_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""increment_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""is_initial"", H5T_STD_U8LE, H5T_NATIVE_UINT8), index == 0U ? 1U : 0U) | EXPECT_DOUBLE_EQ(ReadAttribute(dataset.Get(), ""time"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), static_cast(index) * 0.25) | EXPECT_EQ(H5Aexists(dataset.Get(), ""load_factor""), 0) | EXPECT_DOUBLE_EQ( values[entry], entry % 9U == 0U || entry % 9U == 4U || entry % 9U == 8U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(values[entry], entry % 3U == 2U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ( values[entry], force ? (leaf == ""nodal/generalized_external_force"" ? 4.0 : -4.0) : 0.0) | EXPECT_EQ(ReadString(stress.Get(), ""source_element_type_dataset""), ""/model/elements.source_element_type"") | EXPECT_EQ(ReadString(stress.Get(), ""midsurface_location_dataset""), ""/model/shell/midsurface_locations"") | EXPECT_EQ(ReadString(stress.Get(), ""section_position_dataset""), ""/model/shell/section_positions"") | EXPECT_EQ(ReadString(stress.Get(), ""local_frame_dataset""), ""/steps/Step-1/frames/2/element/shell/local_frame"") | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_file""), 0) | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_line""), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.PreservesSeparateSuppliedEndpointAndAuxiliaryEvidence DynamicHdf5ResultsWriter.PreservesSeparateSuppliedEndpointAndAuxiliaryEvidence; assertion 9개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.PreservesSeparateSuppliedEndpointAndAuxiliaryEvidence 유지 원문 검사 body 및 assertion 동일. 0e68645100a4807b87bd6d9a6dba22f0cdbdb588a65f032dfe2eac6c0c11487d 0e68645100a4807b87bd6d9a6dba22f0cdbdb588a65f032dfe2eac6c0c11487d "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/acceleration"", {4U, 6U})[0U], 2.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/algorithmic_acceleration"", {4U, 6U})[0U], 3.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/generalized_inertia_force"", {4U, 6U})[0U], 5.0) | EXPECT_EQ(ReadDoubles(file.Get(), root + ""global/energy"", {5U}), (std::vector{6.0, 7.0, 8.0, 9.0, 12.0})) | EXPECT_EQ(ReadString(acceleration.Get(), ""rotation_representation""), ""total-rotation-vector-chart"") | EXPECT_EQ(ReadString(acceleration.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/acceleration"", {4U, 6U})[0U], 2.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/algorithmic_acceleration"", {4U, 6U})[0U], 3.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/generalized_inertia_force"", {4U, 6U})[0U], 5.0) | EXPECT_EQ(ReadDoubles(file.Get(), root + ""global/energy"", {5U}), (std::vector{6.0, 7.0, 8.0, 9.0, 12.0})) | EXPECT_EQ(ReadString(acceleration.Get(), ""rotation_representation""), ""total-rotation-vector-chart"") | EXPECT_EQ(ReadString(acceleration.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction; assertion 9개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction 유지 원문 검사 body 및 assertion 동일. f825bce2933be89196cd7c0291501abd4ead25e31d9986f7762c497e92748702 f825bce2933be89196cd7c0291501abd4ead25e31d9986f7762c497e92748702 ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ(generalized[3U], 5.0) | EXPECT_DOUBLE_EQ(generalized[4U], 0.0) | EXPECT_DOUBLE_EQ(generalized[5U], 0.0) | EXPECT_NEAR(spatial[3U], 5.0 * (1.0 - coefficient * 0.13), 1.0e-14) | EXPECT_NEAR(spatial[4U], 0.75, 1.0e-14) | EXPECT_NEAR(spatial[5U], -0.5, 1.0e-14) ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ(generalized[3U], 5.0) | EXPECT_DOUBLE_EQ(generalized[4U], 0.0) | EXPECT_DOUBLE_EQ(generalized[5U], 0.0) | EXPECT_NEAR(spatial[3U], 5.0 * (1.0 - coefficient * 0.13), 1.0e-14) | EXPECT_NEAR(spatial[4U], 0.75, 1.0e-14) | EXPECT_NEAR(spatial[5U], -0.5, 1.0e-14) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.IncompleteOrMismatchedHistoryPreservesExistingFile DynamicHdf5ResultsWriter.IncompleteOrMismatchedHistoryPreservesExistingFile; assertion 9개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.IncompleteOrMismatchedHistoryPreservesExistingFile 유지 원문 검사 body 및 assertion 동일. ad2c45f94851936a7e87cfed7a14d272db0b75733b9f719eb64af3ce2b90d231 ad2c45f94851936a7e87cfed7a14d272db0b75733b9f719eb64af3ce2b90d231 "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, index)) .IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *other.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), valid_bytes)" "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, index)) .IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *other.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), valid_bytes)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.FailedAtomicReplacementPreservesPreviousBytes DynamicHdf5ResultsWriter.FailedAtomicReplacementPreservesPreviousBytes; assertion 6개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.FailedAtomicReplacementPreservesPreviousBytes 유지 원문 검사 body 및 assertion 동일. d850c859b3d1569738581059ef0ee47cc054602b036a96ec36581c643c103909 d850c859b3d1569738581059ef0ee47cc054602b036a96ec36581c643c103909 "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(CloseHandle(locked)) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output.Path()), ""locked-previous-result"")" "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(CloseHandle(locked)) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output.Path()), ""locked-previous-result"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp support@1-254 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, if, Fixture, MakeFixture, MakeFrame, TempFile, Path, CommitHistory, ReadBytes, ReadString, ReadAttribute, ReadDoubles, ExpectCompound tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 703c272cdd720ce3a45edcd79bbc0fc04178d27f236c2b72c3fea95c54ceaf1e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp support@671-672 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 249f07429c5bb0dd50db784f6be559e15db7c705baa3db44e0591c9c7914d9e3 249f07429c5bb0dd50db784f6be559e15db7c705baa3db44e0591c9c7914d9e3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp EigenHdf5ResultsWriter.WritesModalSchemaAndRejectsTamperedState EigenHdf5ResultsWriter.WritesModalSchemaAndRejectsTamperedState; assertion 27개 tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp EigenHdf5ResultsWriter.WritesModalSchemaAndRejectsTamperedState 유지 원문 검사 body 및 assertion 동일. 8ff5899d7d3dd0584e34a8b619ece2228a6520e3fee41e10e038d73c57656e93 8ff5899d7d3dd0584e34a8b619ece2228a6520e3fee41e10e038d73c57656e93 "ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(execution.HasValue()) | ASSERT_TRUE(writer.Write(path, domain, state, {}).IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | ASSERT_GE(controls, 0) | ASSERT_GE(H5Dread(controls, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, stored_controls.data()), 0) | EXPECT_EQ(stored_controls[5U], 0) | EXPECT_GE(H5Dclose(controls), 0) | EXPECT_GE(H5Fclose(file), 0) | EXPECT_FALSE(writer.Write(path, domain, candidate, {}).IsOk()) | EXPECT_TRUE(retained == original) | ASSERT_NE(lock, INVALID_HANDLE_VALUE) | EXPECT_NE(CloseHandle(lock), 0) | ASSERT_FALSE(locked_write.IsOk()) | ASSERT_FALSE(locked_write.Diagnostics().empty()) | EXPECT_EQ(locked_write.Diagnostics()[0].code, ""hdf5-finalization-failure"") | EXPECT_EQ(after_failure, original) | ASSERT_TRUE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk()) | ASSERT_GE(corrupt_file, 0) | ASSERT_GE(nodes, 0) | ASSERT_GE(H5Tinsert(id_type, ""internal_node_id"", 0U, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dwrite(nodes, id_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, duplicate_ids.data()), 0) | EXPECT_GE(H5Tclose(id_type), 0) | EXPECT_GE(H5Dclose(nodes), 0) | EXPECT_GE(H5Fclose(corrupt_file), 0) | EXPECT_FALSE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk())" "ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(execution.HasValue()) | ASSERT_TRUE(writer.Write(path, domain, state, {}).IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | ASSERT_GE(controls, 0) | ASSERT_GE(H5Dread(controls, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, stored_controls.data()), 0) | EXPECT_EQ(stored_controls[5U], 0) | EXPECT_GE(H5Dclose(controls), 0) | EXPECT_GE(H5Fclose(file), 0) | EXPECT_FALSE(writer.Write(path, domain, candidate, {}).IsOk()) | EXPECT_TRUE(retained == original) | ASSERT_NE(lock, INVALID_HANDLE_VALUE) | EXPECT_NE(CloseHandle(lock), 0) | ASSERT_FALSE(locked_write.IsOk()) | ASSERT_FALSE(locked_write.Diagnostics().empty()) | EXPECT_EQ(locked_write.Diagnostics()[0].code, ""hdf5-finalization-failure"") | EXPECT_EQ(after_failure, original) | ASSERT_TRUE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk()) | ASSERT_GE(corrupt_file, 0) | ASSERT_GE(nodes, 0) | ASSERT_GE(H5Tinsert(id_type, ""internal_node_id"", 0U, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dwrite(nodes, id_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, duplicate_ids.data()), 0) | EXPECT_GE(H5Tclose(id_type), 0) | EXPECT_GE(H5Dclose(nodes), 0) | EXPECT_GE(H5Fclose(corrupt_file), 0) | EXPECT_FALSE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp support@1-66 helper/oracle/fixture/include/static assertion 구간: Definition tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b3554f56791ac66395cfa9a19281f09965b9ad9dbf29a3e9976828778334b35b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp support@154-155 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dd680025af1f1e85cfd08e97d2dad7db8c857238d3b73cb23d824690670f58c3 dd680025af1f1e85cfd08e97d2dad7db8c857238d3b73cb23d824690670f58c3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity; assertion 60개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity 유지 원문 검사 body 및 assertion 동일. 8da4eeff5bd49a698da035e0516b426d30471db8c183ee6c78329f2a02879880 8da4eeff5bd49a698da035e0516b426d30471db8c183ee6c78329f2a02879880 "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-3d-euler-beam"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""solver_version""), std::string{fesa::SolverVersion()}) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""source_input_identity""), ""path="" + normalized_source + "";content_identity=fnv1a64:0123456789abcdef"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""unit_system_label""), ""user-consistent-unspecified"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; beam-local=(t,n1,t-cross-n1)"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""element_formulation""), ""B33-3D-Euler-Bernoulli"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""frame_index""), 0U) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodes""), std::vector({2U})) | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""units_label""), ""length"") | ASSERT_EQ(nodes.size(), 2U) | EXPECT_EQ(nodes[0U].internal_node_id, 0U) | EXPECT_STREQ(nodes[0U].instance_name, u8""Beam-\u03b1"") | EXPECT_STREQ(nodes[0U].source_label, ""101"") | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[0U], 3.0) | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[1U], 4.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements_dataset.Get(), ""formulation""), ""B33-3D-Euler-Bernoulli"") | ASSERT_EQ(displacement.size(), 12U) | EXPECT_DOUBLE_EQ(displacement.front(), 0.25) | EXPECT_DOUBLE_EQ(displacement.back(), 11.25) | ASSERT_EQ(reaction.size(), 12U) | EXPECT_DOUBLE_EQ(reaction.front(), 100.0) | EXPECT_DOUBLE_EQ(reaction.back(), 111.0) | ASSERT_EQ(end_force.size(), 12U) | EXPECT_DOUBLE_EQ(end_force.front(), 1.0) | EXPECT_DOUBLE_EQ(end_force.back(), 12.0) | ASSERT_EQ(section_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(section_resultant.front(), 11.0) | EXPECT_DOUBLE_EQ(section_resultant.back(), 18.0) | ASSERT_EQ(generalized_strain.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_strain.front(), 0.01) | EXPECT_DOUBLE_EQ(generalized_strain.back(), 0.08) | ASSERT_EQ(generalized_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_resultant.front(), 21.0) | EXPECT_DOUBLE_EQ(generalized_resultant.back(), 28.0) | EXPECT_EQ(DatasetDimensions(file.Get(), stress_path), std::vector({4U})) | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""component_names""), ""S11"") | EXPECT_EQ( ReadStringAttribute(stress_dataset.Get(), ""component_unit_dimensions""), ""force/length^2"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""coordinate_system""), ""beam-local"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""location""), ""section-point"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(stress_dataset.Get(), ""frame_index""), 0U) | ASSERT_EQ(stress_rows.size(), 4U) | EXPECT_EQ(stress_rows[0U].internal_element_id, 0U) | EXPECT_EQ(stress_rows[0U].gauss_point_index, 1U) | EXPECT_EQ(stress_rows[0U].section_point_index, 1U) | EXPECT_DOUBLE_EQ(stress_rows[0U].x1, -0.1) | EXPECT_DOUBLE_EQ(stress_rows[0U].x2, 0.2) | EXPECT_STREQ(stress_rows[0U].source, ""input"") | EXPECT_DOUBLE_EQ(stress_rows[3U].s11, 34.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({0U})) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/element/transverse_shear_stress"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-3d-euler-beam"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""solver_version""), std::string{fesa::SolverVersion()}) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""source_input_identity""), ""path="" + normalized_source + "";content_identity=fnv1a64:0123456789abcdef"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""unit_system_label""), ""user-consistent-unspecified"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; beam-local=(t,n1,t-cross-n1)"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""element_formulation""), ""B33-3D-Euler-Bernoulli"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""frame_index""), 0U) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodes""), std::vector({2U})) | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""units_label""), ""length"") | ASSERT_EQ(nodes.size(), 2U) | EXPECT_EQ(nodes[0U].internal_node_id, 0U) | EXPECT_STREQ(nodes[0U].instance_name, u8""Beam-\u03b1"") | EXPECT_STREQ(nodes[0U].source_label, ""101"") | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[0U], 3.0) | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[1U], 4.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements_dataset.Get(), ""formulation""), ""B33-3D-Euler-Bernoulli"") | ASSERT_EQ(displacement.size(), 12U) | EXPECT_DOUBLE_EQ(displacement.front(), 0.25) | EXPECT_DOUBLE_EQ(displacement.back(), 11.25) | ASSERT_EQ(reaction.size(), 12U) | EXPECT_DOUBLE_EQ(reaction.front(), 100.0) | EXPECT_DOUBLE_EQ(reaction.back(), 111.0) | ASSERT_EQ(end_force.size(), 12U) | EXPECT_DOUBLE_EQ(end_force.front(), 1.0) | EXPECT_DOUBLE_EQ(end_force.back(), 12.0) | ASSERT_EQ(section_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(section_resultant.front(), 11.0) | EXPECT_DOUBLE_EQ(section_resultant.back(), 18.0) | ASSERT_EQ(generalized_strain.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_strain.front(), 0.01) | EXPECT_DOUBLE_EQ(generalized_strain.back(), 0.08) | ASSERT_EQ(generalized_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_resultant.front(), 21.0) | EXPECT_DOUBLE_EQ(generalized_resultant.back(), 28.0) | EXPECT_EQ(DatasetDimensions(file.Get(), stress_path), std::vector({4U})) | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""component_names""), ""S11"") | EXPECT_EQ( ReadStringAttribute(stress_dataset.Get(), ""component_unit_dimensions""), ""force/length^2"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""coordinate_system""), ""beam-local"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""location""), ""section-point"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(stress_dataset.Get(), ""frame_index""), 0U) | ASSERT_EQ(stress_rows.size(), 4U) | EXPECT_EQ(stress_rows[0U].internal_element_id, 0U) | EXPECT_EQ(stress_rows[0U].gauss_point_index, 1U) | EXPECT_EQ(stress_rows[0U].section_point_index, 1U) | EXPECT_DOUBLE_EQ(stress_rows[0U].x1, -0.1) | EXPECT_DOUBLE_EQ(stress_rows[0U].x2, 0.2) | EXPECT_STREQ(stress_rows[0U].source, ""input"") | EXPECT_DOUBLE_EQ(stress_rows[3U].s11, 34.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({0U})) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/element/transverse_shear_stress"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests; assertion 3개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests 유지 원문 검사 body 및 assertion 동일. cd64b9e679f90b6dc4e5be4798c43fa4c11a4fb720cb281b1fe45e0207702f39 cd64b9e679f90b6dc4e5be4798c43fa4c11a4fb720cb281b1fe45e0207702f39 "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid; assertion 18개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid 유지 원문 검사 body 및 assertion 동일. cab1bac6c24b113ae4bf36c8870f5e9ed01bccb51403e05830a7287e63b2acbd cab1bac6c24b113ae4bf36c8870f5e9ed01bccb51403e05830a7287e63b2acbd "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(stress_rows.size(), 2U) | EXPECT_EQ(stress_rows[index].internal_element_id, 0U) | EXPECT_EQ(stress_rows[index].gauss_point_index, index + 1U) | EXPECT_EQ(stress_rows[index].section_point_index, 0U) | EXPECT_DOUBLE_EQ(stress_rows[index].x1, 0.0) | EXPECT_DOUBLE_EQ(stress_rows[index].x2, 0.0) | EXPECT_STREQ(stress_rows[index].source, ""fesa-default"") | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].severity, ""warning"") | EXPECT_STREQ(rows[0U].code, ""ignored-keyword"") | EXPECT_STREQ(rows[0U].file, std::filesystem::absolute(fixture.domain->SourcePath()) .lexically_normal() .generic_u8string() .c_str()) | EXPECT_EQ(rows[0U].line, 20U) | EXPECT_STREQ(rows[0U].keyword, ""*PREPRINT"") | EXPECT_STREQ(rows[0U].entity_identity, """") | EXPECT_STREQ(rows[0U].message, ""Ignored generator control."") | EXPECT_STREQ(rows[1U].code, ""ignored-output-request"") | EXPECT_EQ(rows[1U].line, 80U)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(stress_rows.size(), 2U) | EXPECT_EQ(stress_rows[index].internal_element_id, 0U) | EXPECT_EQ(stress_rows[index].gauss_point_index, index + 1U) | EXPECT_EQ(stress_rows[index].section_point_index, 0U) | EXPECT_DOUBLE_EQ(stress_rows[index].x1, 0.0) | EXPECT_DOUBLE_EQ(stress_rows[index].x2, 0.0) | EXPECT_STREQ(stress_rows[index].source, ""fesa-default"") | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].severity, ""warning"") | EXPECT_STREQ(rows[0U].code, ""ignored-keyword"") | EXPECT_STREQ(rows[0U].file, std::filesystem::absolute(fixture.domain->SourcePath()) .lexically_normal() .generic_u8string() .c_str()) | EXPECT_EQ(rows[0U].line, 20U) | EXPECT_STREQ(rows[0U].keyword, ""*PREPRINT"") | EXPECT_STREQ(rows[0U].entity_identity, """") | EXPECT_STREQ(rows[0U].message, ""Ignored generator control."") | EXPECT_STREQ(rows[1U].code, ""ignored-output-request"") | EXPECT_EQ(rows[1U].line, 80U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal; assertion 5개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal 유지 원문 검사 body 및 assertion 동일. 5ca48e4c84abdb788e3184610cced5edc5d94b89ed3b8a71a615cb730cf33714 5ca48e4c84abdb788e3184610cced5edc5d94b89ed3b8a71a615cb730cf33714 EXPECT_FALSE(std::filesystem::exists(invalid_output)) | EXPECT_EQ(EntryCount(directory.Path()), 0U) | ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) EXPECT_FALSE(std::filesystem::exists(invalid_output)) | EXPECT_EQ(EntryCount(directory.Path()), 0U) | ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal; assertion 5개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal 유지 원문 검사 body 및 assertion 동일. c2f57aee2946c919919c83b75b15b17dc5ddf8adc7d3ea8d634b0f2274fa53b8 c2f57aee2946c919919c83b75b15b17dc5ddf8adc7d3ea8d634b0f2274fa53b8 "ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | EXPECT_GT(H5Fis_hdf5(final.string().c_str()), 0) | EXPECT_EQ(EntryCount(directory.Path()), 1U) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U)" "ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | EXPECT_GT(H5Fis_hdf5(final.string().c_str()), 0) | EXPECT_EQ(EntryCount(directory.Path()), 1U) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity; assertion 30개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity 유지 원문 검사 body 및 assertion 동일. 6b486491444d4a79d8e2201511ac2a539fc98503320507074eef5e67e7aee5d6 6b486491444d4a79d8e2201511ac2a539fc98503320507074eef5e67e7aee5d6 "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-mitc4-shell"") | EXPECT_EQ( ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; shell-local=(e1,e2,e3); positive-thickness=+zeta"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements.Get(), ""formulation""), ""FESA-MITC4"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_director""), std::vector({4U, 3U})) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/nodal_director""), expected_directors) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_frame""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodal_constraint_mask""), std::vector({4U, 6U})) | ASSERT_EQ(mask.size(), 24U) | EXPECT_EQ(mask[0U], 1U) | EXPECT_EQ(mask[1U], 1U) | EXPECT_EQ(mask[2U], 1U) | EXPECT_EQ(mask[3U], 1U) | EXPECT_EQ(mask[4U], 0U) | EXPECT_EQ(mask[5U], 0U) | ASSERT_EQ(prescribed.size(), 24U) | EXPECT_DOUBLE_EQ(prescribed[0U], 0.0) | EXPECT_DOUBLE_EQ(prescribed[3U], 0.125) | EXPECT_DOUBLE_EQ(prescribed[4U], 0.0) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/section_positions""), std::vector({-1.0, 0.0, 1.0})) | ASSERT_EQ(locations.size(), 8U) | EXPECT_DOUBLE_EQ(locations[0U], -gauss) | EXPECT_DOUBLE_EQ(locations[1U], -gauss) | EXPECT_DOUBLE_EQ(locations[6U], -gauss) | EXPECT_DOUBLE_EQ(locations[7U], gauss)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-mitc4-shell"") | EXPECT_EQ( ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; shell-local=(e1,e2,e3); positive-thickness=+zeta"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements.Get(), ""formulation""), ""FESA-MITC4"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_director""), std::vector({4U, 3U})) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/nodal_director""), expected_directors) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_frame""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodal_constraint_mask""), std::vector({4U, 6U})) | ASSERT_EQ(mask.size(), 24U) | EXPECT_EQ(mask[0U], 1U) | EXPECT_EQ(mask[1U], 1U) | EXPECT_EQ(mask[2U], 1U) | EXPECT_EQ(mask[3U], 1U) | EXPECT_EQ(mask[4U], 0U) | EXPECT_EQ(mask[5U], 0U) | ASSERT_EQ(prescribed.size(), 24U) | EXPECT_DOUBLE_EQ(prescribed[0U], 0.0) | EXPECT_DOUBLE_EQ(prescribed[3U], 0.125) | EXPECT_DOUBLE_EQ(prescribed[4U], 0.0) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/section_positions""), std::vector({-1.0, 0.0, 1.0})) | ASSERT_EQ(locations.size(), 8U) | EXPECT_DOUBLE_EQ(locations[0U], -gauss) | EXPECT_DOUBLE_EQ(locations[1U], -gauss) | EXPECT_DOUBLE_EQ(locations[6U], -gauss) | EXPECT_DOUBLE_EQ(locations[7U], gauss)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory; assertion 9개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory 유지 원문 검사 body 및 assertion 동일. 110d9a70913902d4021933f838872fc49b23964f0923e76a82ff9ca38d147adc 110d9a70913902d4021933f838872fc49b23964f0923e76a82ff9ca38d147adc "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(strain.size(), 32U) | EXPECT_DOUBLE_EQ(strain.front(), 101.0) | EXPECT_DOUBLE_EQ(strain.back(), 408.0) | ASSERT_EQ(stress.size(), 36U) | EXPECT_DOUBLE_EQ(stress.front(), 121.0) | EXPECT_DOUBLE_EQ(stress.back(), 429.0) | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""metric_definition_ids""), ""free-residual-l2-over-max-free-force-l2,force-balance-l2-over-"" ""max-force-sum,moment-balance-l2-over-max-moment-sum"") | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""acceptance_thresholds""), ""1e-10,1e-10,1e-10"")" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(strain.size(), 32U) | EXPECT_DOUBLE_EQ(strain.front(), 101.0) | EXPECT_DOUBLE_EQ(strain.back(), 408.0) | ASSERT_EQ(stress.size(), 36U) | EXPECT_DOUBLE_EQ(stress.front(), 121.0) | EXPECT_DOUBLE_EQ(stress.back(), 429.0) | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""metric_definition_ids""), ""free-residual-l2-over-max-free-force-l2,force-balance-l2-over-"" ""max-force-sum,moment-balance-l2-over-max-moment-sum"") | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""acceptance_thresholds""), ""1e-10,1e-10,1e-10"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths; assertion 4개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths 유지 원문 검사 body 및 assertion 동일. 472f6fc3007fa9ce8532895a218e178e8b6861022881554d0f7b38f6e3eb1d28 472f6fc3007fa9ce8532895a218e178e8b6861022881554d0f7b38f6e3eb1d28 "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), forbidden, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), forbidden, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal; assertion 2개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal 유지 원문 검사 body 및 assertion 동일. 28be997b839d00367e036aef28d86d7b31d42f1f6d3b9af82fce26c23380ba3c 28be997b839d00367e036aef28d86d7b31d42f1f6d3b9af82fce26c23380ba3c EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal; assertion 6개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal 유지 원문 검사 body 및 assertion 동일. 3c25204bcd546b3fd1ee10dd44c2e215a6dc878502873b1fe0612cc1c92d82e0 3c25204bcd546b3fd1ee10dd44c2e215a6dc878502873b1fe0612cc1c92d82e0 ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(directors.size(), 12U) | EXPECT_TRUE(director.IsFinite()) | EXPECT_EQ(director, (fesa::Vector3{0.0, 0.0, 1.0})) | EXPECT_EQ(ReadBytes(final), valid_bytes) | EXPECT_EQ(EntryCount(directory.Path()), 1U) ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(directors.size(), 12U) | EXPECT_TRUE(director.IsFinite()) | EXPECT_EQ(director, (fesa::Vector3{0.0, 0.0, 1.0})) | EXPECT_EQ(ReadBytes(final), valid_bytes) | EXPECT_EQ(EntryCount(directory.Path()), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1-823 helper/oracle/fixture/include/static assertion 구간: Hdf5Handle, if, WinHandle, TempDirectory, WriterFixture, MakeDefinition, MakeFixture, MakeShellDefinition, MakeShellFixture, OpenFile, OpenDataset, DatasetDimensions, ReadDoubleDataset, for, ReadUint8Dataset, ReadStringAttribute, ReadUint64Attribute, ExpectPortableCompoundMember, ExpectCompoundMembers, ExpectCompoundMemberNames, ExpectNumericDataset, MakeUtf8StringType, NodeReadRow, ReadNodeRows, ReclaimNodeRows, ElementReadRow, ReadElementRows, StressReadRow, ReadStressRows, ReclaimStressRows, DiagnosticReadRow, ReadDiagnosticRows, ReclaimDiagnosticRows, ReadBytes, WriteBytes, EntryCount, ExpectOutputFailure tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4ab1135fc0949c1ef197678be93dda782dc8e2d8655cc928fd55eee0d8961e42 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1120-1121 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7d75f7fce7301b112d258ec1b3434016cbb00dc5186e10757a3d53485db1e852 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1203-1204 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a28c340e155ab8c275c3eb5afa3522b3c3b655448af487e689907f00da8b75a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1262-1263 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. de735dd985d5499ad7c73f83d71275d6f5a840dbae2b1672b0e2e4008f0d7560 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1301-1302 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e9bcb4f06a58b6240ab792f21d2791ef2d5cd6ed3540f5cbe243c87f41e10575 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1318-1319 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 778e854c4f2ce284558db14ad3b1ce65607a94482da05114089a6c8e96644227 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_writer_components_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cedde4c3b4576ff6568b8dabefbc0ad56bc54ef4d3adbf2c8eb74ad7f7f711e4 cedde4c3b4576ff6568b8dabefbc0ad56bc54ef4d3adbf2c8eb74ad7f7f711e4 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans; assertion 8개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans 유지 원문 검사 body 및 assertion 동일. 81b2f1f76a5dcf5bb467f6f4d53431f4e73401023067e1508e3550739a7becc4 81b2f1f76a5dcf5bb467f6f4d53431f4e73401023067e1508e3550739a7becc4 "ASSERT_TRUE(plan_result.HasValue()) | ASSERT_EQ(datasets.size(), 6U) | EXPECT_EQ(datasets[0U].path, ""/steps/Step-1/frames/0/nodal/displacement"") | EXPECT_EQ(datasets[0U].dimensions, std::vector({2U, 6U})) | EXPECT_EQ(datasets[2U].path, ""/steps/Step-1/frames/0/element/end_force_local"") | EXPECT_EQ(datasets[2U].dimensions, std::vector({1U, 2U, 6U})) | EXPECT_EQ(datasets[5U].path, ""/steps/Step-1/frames/0/element/generalized_resultant"") | EXPECT_TRUE(fesa::hdf5_internal::ValidateFiniteInventory(datasets).IsOk())" "ASSERT_TRUE(plan_result.HasValue()) | ASSERT_EQ(datasets.size(), 6U) | EXPECT_EQ(datasets[0U].path, ""/steps/Step-1/frames/0/nodal/displacement"") | EXPECT_EQ(datasets[0U].dimensions, std::vector({2U, 6U})) | EXPECT_EQ(datasets[2U].path, ""/steps/Step-1/frames/0/element/end_force_local"") | EXPECT_EQ(datasets[2U].dimensions, std::vector({1U, 2U, 6U})) | EXPECT_EQ(datasets[5U].path, ""/steps/Step-1/frames/0/element/generalized_resultant"") | EXPECT_TRUE(fesa::hdf5_internal::ValidateFiniteInventory(datasets).IsOk())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory; assertion 0개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory 유지 원문 검사 body 및 assertion 동일. 7ffe025ea38838a0b732cf1b6438b5f1ea52e2fa0831d04f9efb98060cb02795 7ffe025ea38838a0b732cf1b6438b5f1ea52e2fa0831d04f9efb98060cb02795 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam; assertion 4개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam 유지 원문 검사 body 및 assertion 동일. dfa562386df73584a0987a54a9b5f63293a8ffdc34ac4ffd53924c589ca578e3 dfa562386df73584a0987a54a9b5f63293a8ffdc34ac4ffd53924c589ca578e3 ASSERT_TRUE(std::filesystem::create_directory(directory)) | ASSERT_TRUE(plan_result.HasValue()) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_FALSE(std::filesystem::exists(candidate)) ASSERT_TRUE(std::filesystem::create_directory(directory)) | ASSERT_TRUE(plan_result.HasValue()) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_FALSE(std::filesystem::exists(candidate)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/hdf5_writer_components_test.cpp support@1-125 helper/oracle/fixture/include/static assertion 구간: WriterFixture, MakeDefinition, MakeFixture, if, ReadBytes, WriteBytes, ExpectOutputFailure tests/unit/io/hdf5/hdf5_writer_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d4c12780f611b8d0f3e096c57425f504de734e1f1fe5f4bb74eee73fce444d6d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ea65dd1a637d3517aba6239dd53b411bf465a04769ae57ffc2ca970247080a4a ea65dd1a637d3517aba6239dd53b411bf465a04769ae57ffc2ca970247080a4a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly; assertion 34개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly 유지 원문 검사 body 및 assertion 동일. 6e39a263af0c568c71a1825d1df1ab7caad034e32be32750eff35627846a02e8 6e39a263af0c568c71a1825d1df1ab7caad034e32be32750eff35627846a02e8 "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""analysis_procedure""), ""nonlinear-static-full-newton"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4-total-lagrangian"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""factor_zero_is_frame""), 0U) | EXPECT_DOUBLE_EQ(ReadDoubleAttribute(metadata.Get(), ""factor_zero_load_factor""), 0.0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/accepted_frames""), std::vector({2U})) | ASSERT_EQ(frames.size(), 2U) | EXPECT_EQ(frames[0U].frame_index, 0U) | EXPECT_EQ(frames[0U].increment_index, 1U) | EXPECT_DOUBLE_EQ(frames[0U].load_factor, 0.5) | EXPECT_EQ(frames[0U].is_factor_one, 0U) | EXPECT_EQ(frames[1U].frame_index, 1U) | EXPECT_EQ(frames[1U].increment_index, 2U) | EXPECT_DOUBLE_EQ(frames[1U].load_factor, 1.0) | EXPECT_EQ(frames[1U].is_factor_one, 1U) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/trial_history"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/displacement""), std::vector({4U, 6U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/triad""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/local_frame""), std::vector({1U, 4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/stress""), std::vector({1U, 4U, 3U, 3U})) | ASSERT_EQ(displacement.size(), 24U) | EXPECT_DOUBLE_EQ(displacement[0U], 1.0) | EXPECT_DOUBLE_EQ(displacement[1U], -1.0) | EXPECT_DOUBLE_EQ(displacement[2U], 0.5) | EXPECT_DOUBLE_EQ(displacement[5U], 0.1)" "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""analysis_procedure""), ""nonlinear-static-full-newton"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4-total-lagrangian"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""factor_zero_is_frame""), 0U) | EXPECT_DOUBLE_EQ(ReadDoubleAttribute(metadata.Get(), ""factor_zero_load_factor""), 0.0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/accepted_frames""), std::vector({2U})) | ASSERT_EQ(frames.size(), 2U) | EXPECT_EQ(frames[0U].frame_index, 0U) | EXPECT_EQ(frames[0U].increment_index, 1U) | EXPECT_DOUBLE_EQ(frames[0U].load_factor, 0.5) | EXPECT_EQ(frames[0U].is_factor_one, 0U) | EXPECT_EQ(frames[1U].frame_index, 1U) | EXPECT_EQ(frames[1U].increment_index, 2U) | EXPECT_DOUBLE_EQ(frames[1U].load_factor, 1.0) | EXPECT_EQ(frames[1U].is_factor_one, 1U) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/trial_history"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/displacement""), std::vector({4U, 6U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/triad""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/local_frame""), std::vector({1U, 4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/stress""), std::vector({1U, 4U, 3U, 3U})) | ASSERT_EQ(displacement.size(), 24U) | EXPECT_DOUBLE_EQ(displacement[0U], 1.0) | EXPECT_DOUBLE_EQ(displacement[1U], -1.0) | EXPECT_DOUBLE_EQ(displacement[2U], 0.5) | EXPECT_DOUBLE_EQ(displacement[5U], 0.1)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment 유지 원문 검사 body 및 assertion 동일. 1c90a2968f7f21a035b54b532d62081f4554455b2b91eae22cf861ca9fea1f9f 1c90a2968f7f21a035b54b532d62081f4554455b2b91eae22cf861ca9fea1f9f ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_EQ(reaction.size(), 24U) | EXPECT_NEAR(reaction[3U], (1.0 - quadratic * theta * theta) * 40.0 - 0.5 * theta * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[4U], 0.5 * theta * 40.0 + (1.0 - quadratic * theta * theta) * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[5U], 60.0, 1.0e-12) | EXPECT_GT(quadratic, 0.0) ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_EQ(reaction.size(), 24U) | EXPECT_NEAR(reaction[3U], (1.0 - quadratic * theta * theta) * 40.0 - 0.5 * theta * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[4U], 0.5 * theta * 40.0 + (1.0 - quadratic * theta * theta) * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[5U], 60.0, 1.0e-12) | EXPECT_GT(quadratic, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation 유지 원문 검사 body 및 assertion 동일. a001400599ab1442b5c7632e39ec02422a0e5cf4a4420a822d640291fc3bdbd9 a001400599ab1442b5c7632e39ec02422a0e5cf4a4420a822d640291fc3bdbd9 "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/frames/1/global/equilibrium""), std::vector({6U})) | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""component_names""), ""FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3"") | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""location""), ""global-balance-error"") | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/frames/1/global/equilibrium""), std::vector({6U})) | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""component_names""), ""FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3"") | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""location""), ""global-balance-error"") | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.StoresSortedDiagnosticsThroughBackendNeutralBoundary NonlinearHdf5ResultsWriter.StoresSortedDiagnosticsThroughBackendNeutralBoundary; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.StoresSortedDiagnosticsThroughBackendNeutralBoundary 유지 원문 검사 body 및 assertion 동일. 33864ae859f75ea2126a078c47ba665e8bb37b0dd807025395fa77b74be284bf 33864ae859f75ea2126a078c47ba665e8bb37b0dd807025395fa77b74be284bf "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].code, ""earlier"") | EXPECT_EQ(rows[0U].line, 10U) | EXPECT_STREQ(rows[1U].code, ""later"") | EXPECT_EQ(rows[1U].line, 20U)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].code, ""earlier"") | EXPECT_EQ(rows[0U].line, 10U) | EXPECT_STREQ(rows[1U].code, ""later"") | EXPECT_EQ(rows[1U].line, 20U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal 유지 원문 검사 body 및 assertion 동일. eb1576644b3e7a2bf28dd63899e0cccf1bd2a8568b4ab593940c67d510aa21c2 eb1576644b3e7a2bf28dd63899e0cccf1bd2a8568b4ab593940c67d510aa21c2 "ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output), sentinel)" "ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output), sentinel)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@1-429 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WinHandle, Fixture, AcceptedFrameRow, DiagnosticRow, MakeDefinition, MakeBaseline, MakeShellRow, MakeShellRows, MakeFrame, MakeFixture, OpenFile, OpenDataset, DatasetDimensions, ReadStringAttribute, ReadUint64Attribute, ReadDoubleAttribute, ReadDoubleDataset, for, AcceptedFrameMemoryType, ReadAcceptedFrames, DiagnosticMemoryType, ReadDiagnostics, ReclaimDiagnostics, ReadBytes, WriteBytes tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6c65598390ba6c2d70dbd49ab2e1b14b76803f926878fd1e6495864508bbc051 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@509-510 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8f00d12532be48bbd8d5776bf02cee4d6a243f6225365268e06f4dc268138fa4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@537-538 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e08a00bd74875e33bb07f7be527593f2d4349951e703f865eb04b1e9499e2bbd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@562-563 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a6d0aa9192bf7f01ce6aab9505a2149836668f2461c70984035f857a43eb68e6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@596-597 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cc12e7c3af34a0df4e68a34067bc8e98d4da457614c478a52170cc0c9151b3b6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 14개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6af9fa2932e01e6d814a73aa2368b5f5d7206f9c39004377d7d0ca5fbe11463d 0e288ede59628ee0256258206f78ba4830a13b65c68d9a42125b767bf15fed78 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AllFiveActualApiOutcomesHaveIndependentOfficialSchema SolidHdf5ResultsWriter.AllFiveActualApiOutcomesHaveIndependentOfficialSchema; assertion 21개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AllFiveActualApiOutcomesHaveIndependentOfficialSchema 유지 원문 검사 body 및 assertion 동일. ae7d81086077cec63255ebbb050d057332d3d2303be88998f8ff571d28237340 ae7d81086077cec63255ebbb050d057332d3d2303be88998f8ff571d28237340 "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(Attr(metadata.Get(), ""analysis_procedure""), solid_output_test::Procedure(p)) | EXPECT_EQ(Attr(metadata.Get(), ""feature_id""), ""hex8-structural-analysis"") | EXPECT_EQ(Attr(metadata.Get(), ""source_step_name""), ""RawSolid"") | EXPECT_EQ(Attr(metadata.Get(), ""element_formulation""), ""FESA-Hex8"") | EXPECT_EQ(Attr(metadata.Get(), ""integration_rule""), ""gauss-2x2x2"") | EXPECT_EQ(Attr(metadata.Get(), ""mass_formulation""), ""lumped-reference"") | EXPECT_EQ(Attr(metadata.Get(), ""component_order""), ""node-major; UX,UY,UZ"") | EXPECT_GT(H5Tequal(masktype.Get(), H5T_STD_U8LE), 0) | EXPECT_EQ(Attr(mask.Get(), ""component_names""), ""UX,UY,UZ"") | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_EQ(Attr(dataset.Get(), ""component_names""), std::get<1>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""unit_dimensions""), std::get<2>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""location""), ""global"") | EXPECT_EQ(Attr(dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(H5Aexists(dataset.Get(), ""frame_index""), 0) | EXPECT_EQ(H5Aexists(dataset.Get(), ""step_name""), 0) | ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_EQ( H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file.Get(), (root + ""/nodal/displacement_low"").c_str(), H5P_DEFAULT), 0)" "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(Attr(metadata.Get(), ""analysis_procedure""), solid_output_test::Procedure(p)) | EXPECT_EQ(Attr(metadata.Get(), ""feature_id""), ""hex8-structural-analysis"") | EXPECT_EQ(Attr(metadata.Get(), ""source_step_name""), ""RawSolid"") | EXPECT_EQ(Attr(metadata.Get(), ""element_formulation""), ""FESA-Hex8"") | EXPECT_EQ(Attr(metadata.Get(), ""integration_rule""), ""gauss-2x2x2"") | EXPECT_EQ(Attr(metadata.Get(), ""mass_formulation""), ""lumped-reference"") | EXPECT_EQ(Attr(metadata.Get(), ""component_order""), ""node-major; UX,UY,UZ"") | EXPECT_GT(H5Tequal(masktype.Get(), H5T_STD_U8LE), 0) | EXPECT_EQ(Attr(mask.Get(), ""component_names""), ""UX,UY,UZ"") | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_EQ(Attr(dataset.Get(), ""component_names""), std::get<1>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""unit_dimensions""), std::get<2>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""location""), ""global"") | EXPECT_EQ(Attr(dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(H5Aexists(dataset.Get(), ""frame_index""), 0) | EXPECT_EQ(H5Aexists(dataset.Get(), ""step_name""), 0) | ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_EQ( H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file.Get(), (root + ""/nodal/displacement_low"").c_str(), H5P_DEFAULT), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.EveryProcedurePreservesPreviousFinalAcrossLifecycleFailures SolidHdf5ResultsWriter.EveryProcedurePreservesPreviousFinalAcrossLifecycleFailures; assertion 3개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.EveryProcedurePreservesPreviousFinalAcrossLifecycleFailures 유지 원문 검사 body 및 assertion 동일. 54758e848f8b701836e7fb82b83cfd0959b5e4f36e413871563d59a6389f21ef 54758e848f8b701836e7fb82b83cfd0959b5e4f36e413871563d59a6389f21ef "EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_EQ(entry.path().filename().string().find(""candidate""), std::string::npos)" "EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_EQ(entry.path().filename().string().find(""candidate""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.MalformedWholePairsAndIdentityFailBeforeCandidateCreation SolidHdf5ResultsWriter.MalformedWholePairsAndIdentityFailBeforeCandidateCreation; assertion 5개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.MalformedWholePairsAndIdentityFailBeforeCandidateCreation 유지 원문 검사 body 및 assertion 동일. 3d420563bb51f0e354d37714b86fc487aa097ba8f142014c043488d8c4bf78d6 3d420563bb51f0e354d37714b86fc487aa097ba8f142014c043488d8c4bf78d6 EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalColumnsRemainZeroBasedAndRejectInvalidInventory SolidHdf5ResultsWriter.ModalColumnsRemainZeroBasedAndRejectInvalidInventory; assertion 4개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalColumnsRemainZeroBasedAndRejectInvalidInventory 유지 원문 검사 body 및 assertion 동일. 58160b675d06a1d926ce01fbdcd204944fd73fa1246838cb4245069a58346ec5 58160b675d06a1d926ce01fbdcd204944fd73fa1246838cb4245069a58346ec5 ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackRejectsMalformedTypesShapesValuesAndSourceIds SolidHdf5ResultsWriter.ReadbackRejectsMalformedTypesShapesValuesAndSourceIds; assertion 2개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackRejectsMalformedTypesShapesValuesAndSourceIds 유지 원문 검사 body 및 assertion 동일. 98f12927edcaf6e819ce0efdc429254416e9c0b6d37361830ab53bb7d6c1b9bb 98f12927edcaf6e819ce0efdc429254416e9c0b6d37361830ab53bb7d6c1b9bb EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackMatchesActualAcceptedValuesAndFullPairObservables SolidHdf5ResultsWriter.ReadbackMatchesActualAcceptedValuesAndFullPairObservables; assertion 6개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackMatchesActualAcceptedValuesAndFullPairObservables 유지 원문 검사 body 및 assertion 동일. 9489cb16f1d352cdb05ead2678289c28d3757ca8717121b5d49f4e4763c16427 9489cb16f1d352cdb05ead2678289c28d3757ca8717121b5d49f4e4763c16427 "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(dataset.Get(), 0) | ASSERT_GE(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values.data()), 0) | EXPECT_EQ(values, expected) | EXPECT_EQ(Attr(metadata.Get(), ""source_input_identity""), SourceInputIdentity(actual.input.domain)) | EXPECT_TRUE(nonzero_low)" "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(dataset.Get(), 0) | ASSERT_GE(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values.data()), 0) | EXPECT_EQ(values, expected) | EXPECT_EQ(Attr(metadata.Get(), ""source_input_identity""), SourceInputIdentity(actual.input.domain)) | EXPECT_TRUE(nonzero_low)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.FailureRecordsAreLoggedAndLogFailureTakesPrecedence SolidPreparedAnalysis.FailureRecordsAreLoggedAndLogFailureTakesPrecedence; assertion 9개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.FailureRecordsAreLoggedAndLogFailureTakesPrecedence 유지 원문 검사 body 및 assertion 동일. 86020491b9f15bef285a8c66ff73296c53f87c05bf88bde9e31ceae039b16613 86020491b9f15bef285a8c66ff73296c53f87c05bf88bde9e31ceae039b16613 "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), closed ? FailureCategory::kOutput : FailureCategory::kSolver) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_NE(text.find(""injected-tangent-failure""), std::string::npos) | EXPECT_EQ(text.find(""rotation""), std::string::npos) | EXPECT_NE(text.find(""stage=""), std::string::npos)" "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), closed ? FailureCategory::kOutput : FailureCategory::kSolver) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_NE(text.find(""injected-tangent-failure""), std::string::npos) | EXPECT_EQ(text.find(""rotation""), std::string::npos) | EXPECT_NE(text.find(""stage=""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingSolidAdapterFailsWithoutLegacyDispatch SolidPreparedAnalysis.MissingSolidAdapterFailsWithoutLegacyDispatch; assertion 6개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingSolidAdapterFailsWithoutLegacyDispatch 유지 원문 검사 body 및 assertion 동일. 49053fc528ba887b5f048281c18c912aa09ae411cabbb474074bbc2f15ab91c8 49053fc528ba887b5f048281c18c912aa09ae411cabbb474074bbc2f15ab91c8 "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""missing-solid-executor"") | EXPECT_TRUE(log.Close().IsOk())" "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""missing-solid-executor"") | EXPECT_TRUE(log.Close().IsOk())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnsupportedEnvironmentAfterCallbackCannotPublish SolidHdf5ResultsWriter.UnsupportedEnvironmentAfterCallbackCannotPublish; assertion 2개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnsupportedEnvironmentAfterCallbackCannotPublish 유지 원문 검사 body 및 assertion 동일. e451c9a755119b6d30517cfadffc36c7fefd922c053ce1aac059d333adc5e7f5 e451c9a755119b6d30517cfadffc36c7fefd922c053ce1aac059d333adc5e7f5 EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingWriterPreservesFinalForEveryTypedOutcome SolidPreparedAnalysis.MissingWriterPreservesFinalForEveryTypedOutcome; assertion 5개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingWriterPreservesFinalForEveryTypedOutcome 유지 원문 검사 body 및 assertion 동일. 7fe8c186182faf22af563656dd32beca34da0788bfe309672f51cb685820abf2 7fe8c186182faf22af563656dd32beca34da0788bfe309672f51cb685820abf2 "ASSERT_TRUE(paths.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-solid-writer"") | EXPECT_EQ(Bytes(files.output), previous)" "ASSERT_TRUE(paths.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-solid-writer"") | EXPECT_EQ(Bytes(files.output), previous)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidNewtonIterationLog.InvalidScalarEvidencePermanentlyFailsLogLifecycle SolidNewtonIterationLog.InvalidScalarEvidencePermanentlyFailsLogLifecycle; assertion 3개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidNewtonIterationLog.InvalidScalarEvidencePermanentlyFailsLogLifecycle 유지 원문 검사 body 및 assertion 동일. 98a859ab027cf906fe55ec13bd07e191939707a511ef7786e84dbd3040963b47 98a859ab027cf906fe55ec13bd07e191939707a511ef7786e84dbd3040963b47 ASSERT_TRUE(log.Open(files.log).IsOk()) | EXPECT_FALSE(log.Write(record).IsOk()) | EXPECT_FALSE(log.Close().IsOk()) ASSERT_TRUE(log.Open(files.log).IsOk()) | EXPECT_FALSE(log.Write(record).IsOk()) | EXPECT_FALSE(log.Close().IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AbsentStaticDensityIsAnExplicitPlaceholder SolidHdf5ResultsWriter.AbsentStaticDensityIsAnExplicitPlaceholder; assertion 5개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AbsentStaticDensityIsAnExplicitPlaceholder 유지 원문 검사 body 및 assertion 동일. eb6860aba8052654eaa827dfd208c58761976beb7d042b8529d9544036d904fe eb6860aba8052654eaa827dfd208c58761976beb7d042b8529d9544036d904fe ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE( H5Dread(dataset.Get(), type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &row), 0) | EXPECT_EQ(row.present, 0) | EXPECT_EQ(row.rho, 0) ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE( H5Dread(dataset.Get(), type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &row), 0) | EXPECT_EQ(row.present, 0) | EXPECT_EQ(row.rho, 0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalPhysicalTableAttributeCorruptionPreservesFinal SolidHdf5ResultsWriter.ModalPhysicalTableAttributeCorruptionPreservesFinal; assertion 2개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalPhysicalTableAttributeCorruptionPreservesFinal 유지 원문 검사 body 및 assertion 동일. 5ab99b0ef2a17dd81d8b67396fa3ad3fcaafcc82c55b1a90ba8ebc161b3c057a 5ab99b0ef2a17dd81d8b67396fa3ad3fcaafcc82c55b1a90ba8ebc161b3c057a EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnselectedBackendPairsCannotPublishInvalidSpectrumOrDimension SolidHdf5ResultsWriter.UnselectedBackendPairsCannotPublishInvalidSpectrumOrDimension; assertion 9개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnselectedBackendPairsCannotPublishInvalidSpectrumOrDimension 유지 원문 검사 body 및 assertion 동일. 1ebcf9e3ecd6d2f12eefd8b99060546b7a12f4b64c9542a7d7550aa384b095f7 1ebcf9e3ecd6d2f12eefd8b99060546b7a12f4b64c9542a7d7550aa384b095f7 "ASSERT_NE(position, std::string::npos) | ASSERT_EQ(state.modes.size(), 1u) | ASSERT_EQ(state.free_dof_count, 3u) | ASSERT_GT(state.eigenpair_checks.size(), state.modes.size()) | ASSERT_LE(state.eigenpair_checks.size(), state.free_dof_count) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(message.find(failure == 0 ? ""Significant negative"" : failure == 1 ? ""not sorted"" : ""inventory""), std::string::npos) | EXPECT_EQ(Bytes(files.output), previous)" "ASSERT_NE(position, std::string::npos) | ASSERT_EQ(state.modes.size(), 1u) | ASSERT_EQ(state.free_dof_count, 3u) | ASSERT_GT(state.eigenpair_checks.size(), state.modes.size()) | ASSERT_LE(state.eigenpair_checks.size(), state.free_dof_count) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(message.find(failure == 0 ? ""Significant negative"" : failure == 1 ? ""not sorted"" : ""inventory""), std::string::npos) | EXPECT_EQ(Bytes(files.output), previous)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp support@1-198 helper/oracle/fixture/include/static assertion 구간: fesa, Actual, Execute, View, Bytes, Existing, Attr, if, T, NumberAttr, DatasetContract tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3d8a03c21d39bdb525b3343fe9b1a43b739e09b146ce0fa12b7b941bdbee7123 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp support@618-632 helper/oracle/fixture/include/static assertion 구간: FailedTangent tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ad8ea87f0e4a9587417928c0cf809d07c3041883e55d95ad345315ff70ebd9a2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp support@871-871 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/solid_output_test_fixture.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/unit/io/hdf5/solid_output_test_fixture.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f55daaac80ffbb33f56431eb37931b48dc0202107b74e298254f9fcd2a2e5977 f55daaac80ffbb33f56431eb37931b48dc0202107b74e298254f9fcd2a2e5977 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/solid_output_test_fixture.h support@1-58 helper/oracle/fixture/include/static assertion 구간: solid_output_test, Deck, Files, Procedure tests/unit/io/hdf5/solid_output_test_fixture.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9e7195cd7096815c237160ff0315fabca314fe8068ef1ea88751543cac732307 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 13개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 576b253a222e41e7b8bd6643a47706eec1ed333eaf5a09c2206b89ef1bb06895 576b253a222e41e7b8bd6643a47706eec1ed333eaf5a09c2206b89ef1bb06895 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.WritesRawInitialAndCompletedZeroReactionHistory ThermalHdf5ResultsWriter.WritesRawInitialAndCompletedZeroReactionHistory; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.WritesRawInitialAndCompletedZeroReactionHistory 유지 원문 검사 body 및 assertion 동일. 038005b1d8bbe2f803b404dbb53962ec9300408b40327a0b0e90f5e4a3a7f679 038005b1d8bbe2f803b404dbb53962ec9300408b40327a0b0e90f5e4a3a7f679 "ASSERT_TRUE(result.IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/0/nodal/temperature"", H5P_DEFAULT), 0) | EXPECT_LE(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file, ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/3/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/3/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Fclose(file), -1)" "ASSERT_TRUE(result.IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/0/nodal/temperature"", H5P_DEFAULT), 0) | EXPECT_LE(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file, ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/3/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/3/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Fclose(file), -1)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.SectionMaterialUsesGlobalMaterialIdentity ThermalHdf5ResultsWriter.SectionMaterialUsesGlobalMaterialIdentity; assertion 11개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.SectionMaterialUsesGlobalMaterialIdentity 유지 원문 검사 body 및 assertion 동일. 96c91419cb1cd6966a695185c69a1c372da0516eb31c6a71f9db7f987dd767b9 96c91419cb1cd6966a695185c69a1c372da0516eb31c6a71f9db7f987dd767b9 "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Tinsert(t.Get(), ""material_internal_id"", 0, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dread(d.Get(), t.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &id), 0) | EXPECT_EQ(id, 1U) | ASSERT_GE(H5Tset_size(utf8.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(utf8.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(source_type.Get(), ""source_file"", 0, utf8.Get()), 0) | ASSERT_GE(H5Dread(d.Get(), source_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &source), 0) | ASSERT_NE(source, nullptr) | EXPECT_EQ(std::string{source}, std::filesystem::absolute(""thermal-writer.inp"") .lexically_normal() .generic_u8string()) | EXPECT_GE(H5free_memory(source), 0)" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Tinsert(t.Get(), ""material_internal_id"", 0, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dread(d.Get(), t.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &id), 0) | EXPECT_EQ(id, 1U) | ASSERT_GE(H5Tset_size(utf8.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(utf8.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(source_type.Get(), ""source_file"", 0, utf8.Get()), 0) | ASSERT_GE(H5Dread(d.Get(), source_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &source), 0) | ASSERT_NE(source, nullptr) | EXPECT_EQ(std::string{source}, std::filesystem::absolute(""thermal-writer.inp"") .lexically_normal() .generic_u8string()) | EXPECT_GE(H5free_memory(source), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsMissingMandatoryAttributesAndChangedValues ThermalHdf5ResultsWriter.RejectsMissingMandatoryAttributesAndChangedValues; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsMissingMandatoryAttributesAndChangedValues 유지 원문 검사 body 및 assertion 동일. 09fc93e87be7ffcef801a28fb026ccffcb2e9fef878c8141eba118171fdf4915 09fc93e87be7ffcef801a28fb026ccffcb2e9fef878c8141eba118171fdf4915 "EXPECT_GE(H5Adelete(m, ""source_input_identity""), 0) | EXPECT_GE(H5Adelete(d, ""units_label""), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, ids), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(f, 0) | ASSERT_GE(H5Fclose(f), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" "EXPECT_GE(H5Adelete(m, ""source_input_identity""), 0) | EXPECT_GE(H5Adelete(d, ""units_label""), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, ids), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(f, 0) | ASSERT_GE(H5Fclose(f), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryRequiredAttributeIsCheckedBeforePublication ThermalHdf5ResultsWriter.EveryRequiredAttributeIsCheckedBeforePublication; assertion 7개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryRequiredAttributeIsCheckedBeforePublication 유지 원문 검사 body 및 assertion 동일. e8670b807a13f32a42fc3bdf7c7ba29a13005b801faafdb48830765ba95cd051 e8670b807a13f32a42fc3bdf7c7ba29a13005b801faafdb48830765ba95cd051 ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(file, 0) | ASSERT_GE(object, 0) | ASSERT_GE(H5Adelete(object, attribute.second.c_str()), 0) | ASSERT_GE(H5Oclose(object), 0) | ASSERT_GE(H5Fclose(file), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk()) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(file, 0) | ASSERT_GE(object, 0) | ASSERT_GE(H5Adelete(object, attribute.second.c_str()), 0) | ASSERT_GE(H5Oclose(object), 0) | ASSERT_GE(H5Fclose(file), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryCompoundFieldAndEveryDatasetIsMandatory ThermalHdf5ResultsWriter.EveryCompoundFieldAndEveryDatasetIsMandatory; assertion 6개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryCompoundFieldAndEveryDatasetIsMandatory 유지 원문 검사 body 및 assertion 동일. 2714b07516265d2c61e37c02651ac605c52a2e430bf95d6a59a176e923b72fbe 2714b07516265d2c61e37c02651ac605c52a2e430bf95d6a59a176e923b72fbe "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""Missing compound field""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Ldelete(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""Missing compound field""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Ldelete(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.ReorderedPackedAdditiveCompoundsAndFixedUtf8AreAccepted ThermalHdf5ResultsWriter.ReorderedPackedAdditiveCompoundsAndFixedUtf8AreAccepted; assertion 4개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.ReorderedPackedAdditiveCompoundsAndFixedUtf8AreAccepted 유지 원문 검사 body 및 assertion 동일. eb907cbc4c5980b7b1d09251862c47f1c54fd4b68029219bbc6ee5341c15707e eb907cbc4c5980b7b1d09251862c47f1c54fd4b68029219bbc6ee5341c15707e ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Tset_size(fixed.Get(), 16), 0) | ASSERT_GE(H5Tset_cset(fixed.Get(), H5T_CSET_UTF8), 0) | EXPECT_TRUE(checked.IsOk()) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Tset_size(fixed.Get(), 16), 0) | ASSERT_GE(H5Tset_cset(fixed.Get(), H5T_CSET_UTF8), 0) | EXPECT_TRUE(checked.IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongTypesArrayExtentsNonscalarAndNonUtf8Attributes ThermalHdf5ResultsWriter.RejectsWrongTypesArrayExtentsNonscalarAndNonUtf8Attributes; assertion 7개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongTypesArrayExtentsNonscalarAndNonUtf8Attributes 유지 원문 검사 body 및 assertion 동일. deb7ac11d4f8259f50d5d43317c188e2c36960898610bebc7a492eb8c58e4866 deb7ac11d4f8259f50d5d43317c188e2c36960898610bebc7a492eb8c58e4866 "ASSERT_GE(H5Adelete(g.Get(), ""is_initial""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_UINT8, data), 0) | ASSERT_GE(H5Adelete(g.Get(), ""time_period""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_DOUBLE, data), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""type/extent""), std::string::npos)" "ASSERT_GE(H5Adelete(g.Get(), ""is_initial""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_UINT8, data), 0) | ASSERT_GE(H5Adelete(g.Get(), ""time_period""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_DOUBLE, data), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""type/extent""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongValuesFrameInventoriesNonfiniteAndDiagnostics ThermalHdf5ResultsWriter.RejectsWrongValuesFrameInventoriesNonfiniteAndDiagnostics; assertion 6개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongValuesFrameInventoriesNonfiniteAndDiagnostics 유지 원문 검사 body 및 assertion 동일. 32dc727108be7e7b965f1451c0142d9ebcb4671317da04f841ad33b9b57b2bcb 32dc727108be7e7b965f1451c0142d9ebcb4671317da04f841ad33b9b57b2bcb "ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ldelete(f, ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | ASSERT_GE( H5Lcreate_soft(""/missing"", f, ""/steps/Step-1/frames/0/element"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE(H5Dwrite(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" "ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ldelete(f, ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | ASSERT_GE( H5Lcreate_soft(""/missing"", f, ""/steps/Step-1/frames/0/element"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE(H5Dwrite(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RotatedFramesAndEndpointCloseScheduleRoundTripIndependently ThermalHdf5ResultsWriter.RotatedFramesAndEndpointCloseScheduleRoundTripIndependently; assertion 12개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RotatedFramesAndEndpointCloseScheduleRoundTripIndependently 유지 원문 검사 body 및 assertion 동일. 9b867d4ee386eecc3e31c6233f961cdd619a2c0736f7a11b7705cadeca1c0ccd 9b867d4ee386eecc3e31c6233f961cdd619a2c0736f7a11b7705cadeca1c0ccd ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Dread(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, frames.data()), 0) | EXPECT_DOUBLE_EQ(frames[i], expected[i % 9]) | ASSERT_GE(H5Aread(a.Get(), H5T_NATIVE_DOUBLE, &actual), 0) | EXPECT_EQ(actual, .3) | EXPECT_NE(actual, .9 - .6) | ASSERT_GE(H5Dread(initial.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, t), 0) | EXPECT_EQ(t[i], i < 5 ? -2 : 0) | ASSERT_GE( H5Dread(flux.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, q), 0) | EXPECT_EQ(q[3 * sample], static_cast(sample)) | EXPECT_EQ(q[3 * sample + 1], -static_cast(sample) - 3) | EXPECT_EQ(q[3 * sample + 2], 9) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Dread(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, frames.data()), 0) | EXPECT_DOUBLE_EQ(frames[i], expected[i % 9]) | ASSERT_GE(H5Aread(a.Get(), H5T_NATIVE_DOUBLE, &actual), 0) | EXPECT_EQ(actual, .3) | EXPECT_NE(actual, .9 - .6) | ASSERT_GE(H5Dread(initial.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, t), 0) | EXPECT_EQ(t[i], i < 5 ? -2 : 0) | ASSERT_GE( H5Dread(flux.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, q), 0) | EXPECT_EQ(q[3 * sample], static_cast(sample)) | EXPECT_EQ(q[3 * sample + 1], -static_cast(sample) - 3) | EXPECT_EQ(q[3 * sample + 2], 9) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryFailedLifecycleBoundaryPreservesOldFinalAndCleansCandidate ThermalHdf5ResultsWriter.EveryFailedLifecycleBoundaryPreservesOldFinalAndCleansCandidate; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryFailedLifecycleBoundaryPreservesOldFinalAndCleansCandidate 유지 원문 검사 body 및 assertion 동일. 411e24e5bc006ee97ce6e6c3e648e3fd63cf72585b2fef2347a8cab364de86ba 411e24e5bc006ee97ce6e6c3e648e3fd63cf72585b2fef2347a8cab364de86ba "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(d.Get(), 0) | ASSERT_GE(H5Adelete(m.Get(), ""schema_version""), 0) | EXPECT_TRUE(std::filesystem::remove(candidate)) | EXPECT_FALSE(fesa::hdf5_internal::WriteThermalFile(out.Path(), *x.domain, x.state, {}, failures[i]) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | EXPECT_EQ(entry.path(), out.Path()) | EXPECT_EQ(files, 1U)" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(d.Get(), 0) | ASSERT_GE(H5Adelete(m.Get(), ""schema_version""), 0) | EXPECT_TRUE(std::filesystem::remove(candidate)) | EXPECT_FALSE(fesa::hdf5_internal::WriteThermalFile(out.Path(), *x.domain, x.state, {}, failures[i]) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | EXPECT_EQ(entry.path(), out.Path()) | EXPECT_EQ(files, 1U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.DomainMismatchAndIncompleteHistoryCannotReplaceFinal ThermalHdf5ResultsWriter.DomainMismatchAndIncompleteHistoryCannotReplaceFinal; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.DomainMismatchAndIncompleteHistoryCannotReplaceFinal 유지 원문 검사 body 및 assertion 동일. 737aebeffb93534d9acc0a723361a72396790b4f57424f2410fa23ce0807f0cf 737aebeffb93534d9acc0a723361a72396790b4f57424f2410fa23ce0807f0cf ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_TRUE(different.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), different.Value(), x.state, {}) .IsOk()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *partial.domain, partial.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | ASSERT_TRUE(changed_g.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), changed_g.Value(), prescribed.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_TRUE(different.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), different.Value(), x.state, {}) .IsOk()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *partial.domain, partial.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | ASSERT_TRUE(changed_g.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), changed_g.Value(), prescribed.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryPrimitiveDatasetChecksShapeTypeAndValue ThermalHdf5ResultsWriter.EveryPrimitiveDatasetChecksShapeTypeAndValue; assertion 7개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryPrimitiveDatasetChecksShapeTypeAndValue 유지 원문 검사 body 및 assertion 동일. 94f20f584c491bbde83edeabb6d369a9358a4227a25e8a17f615b9aa2ff6e045 94f20f584c491bbde83edeabb6d369a9358a4227a25e8a17f615b9aa2ff6e045 "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos) | EXPECT_NE(Message(checked).find(""primitive type""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos)" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos) | EXPECT_NE(Message(checked).find(""primitive type""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.InitialRecoveryCannotBeFilledWithCompletedZeros ThermalHdf5ResultsWriter.InitialRecoveryCannotBeFilledWithCompletedZeros; assertion 5개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.InitialRecoveryCannotBeFilledWithCompletedZeros 유지 원문 검사 body 및 assertion 동일. 0f30c83325b2edbf6f637c4324d4c8b85cf15189fb03798a5c2fa52eac8ae6ea 0f30c83325b2edbf6f637c4324d4c8b85cf15189fb03798a5c2fa52eac8ae6ea "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/element/heat_flux"", f.Get(), ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE( H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/nodal/reaction_heat_rate"", f.Get(), ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT, H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/element/heat_flux"", f.Get(), ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE( H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/nodal/reaction_heat_rate"", f.Get(), ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT, H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp support@1-313 helper/oracle/fixture/include/static assertion 구간: Definition, Fixture, Make, Temp, Path, Message, Bytes, Diagnostics, CollectAttribute, CopyAttributes, for, RewriteCompound, if, T, WriteColumn, StringAttribute, ReplacePrimitive, ChangePrimitive tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f3c40b4b5f52a1a45372592be54b1b910b2f1d1d1f25c305049ab22e15768cd6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp support@810-815 helper/oracle/fixture/include/static assertion 구간: FailedClose tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 192b1bf23c67a96f66846de9e9b50e917d5a4347cd052fa681b3a34b2f05b181 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp support@993-993 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/loads/load_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/loads/load_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ce8c7aa7d0372bf0cd2f1627ed19cc2b1c603240d03517e959169eb746f8dd64 ce8c7aa7d0372bf0cd2f1627ed19cc2b1c603240d03517e959169eb746f8dd64 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadEmitsStableFullDofContributions Load.ConcentratedNodalLoadEmitsStableFullDofContributions; assertion 7개 tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadEmitsStableFullDofContributions 유지 원문 검사 body 및 assertion 동일. 2ccf11bb0f56a9bf2a474ee028662ee0d6d8c21e6c25c2fc9c3e3e24dc116eb3 2ccf11bb0f56a9bf2a474ee028662ee0d6d8c21e6c25c2fc9c3e3e24dc116eb3 ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 12U) | EXPECT_EQ(contribution.source_order, 7U) | EXPECT_EQ(contribution.full_dof_index, node * components.size() + component) | EXPECT_DOUBLE_EQ(contribution.value, components[component]) ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 12U) | EXPECT_EQ(contribution.source_order, 7U) | EXPECT_EQ(contribution.full_dof_index, node * components.size() + component) | EXPECT_DOUBLE_EQ(contribution.value, components[component]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions; assertion 2개 tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions 유지 원문 검사 body 및 assertion 동일. c3c7d3455b3f5352f0c13fbf53c73ff736c3a35d764cd20f952f5e34466609fa c3c7d3455b3f5352f0c13fbf53c73ff736c3a35d764cd20f952f5e34466609fa ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/load_test.cpp support@1-49 helper/oracle/fixture/include/static assertion 구간: MakeDomain, if, ExpectFailureCode tests/unit/loads/load_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e237ce80f9cbe95cd5979cd1db9a7989577e0dc5510ac16003d902aa2eafb08a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/loads/shell_surface_pressure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/loads/shell_surface_pressure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 094f2106b557380c45c24cf92d2f4b860ece37d53faea45b704bfd456be26945 094f2106b557380c45c24cf92d2f4b860ece37d53faea45b704bfd456be26945 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment 유지 원문 검사 body 및 assertion 동일. f6a885c1167ddcbc8e2baf4601ea82653d59f4f3b981f6d395081374e93b7413 f6a885c1167ddcbc8e2baf4601ea82653d59f4f3b981f6d395081374e93b7413 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude; assertion 4개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude 유지 원문 검사 body 및 assertion 동일. 87fe2f501765003b1a98bf624ccfb5d2d6678dfd6d3e073601f2e3d643229c13 87fe2f501765003b1a98bf624ccfb5d2d6678dfd6d3e073601f2e3d643229c13 EXPECT_DOUBLE_EQ(sneg.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(negative.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(sneg.external_tangent[index], -spos.external_tangent[index]) | EXPECT_DOUBLE_EQ(negative.external_tangent[index], -spos.external_tangent[index]) EXPECT_DOUBLE_EQ(sneg.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(negative.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(sneg.external_tangent[index], -spos.external_tangent[index]) | EXPECT_DOUBLE_EQ(negative.external_tangent[index], -spos.external_tangent[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent 유지 원문 검사 body 및 assertion 동일. 6df3b7fe71338797c8f6097a473832beafa3089671066636ca75e8bca3b987f7 6df3b7fe71338797c8f6097a473832beafa3089671066636ca75e8bca3b987f7 EXPECT_EQ(with_displacement.force, without_displacement.force) | EXPECT_EQ(value, 0.0) EXPECT_EQ(with_displacement.force, without_displacement.force) | EXPECT_EQ(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce 유지 원문 검사 body 및 assertion 동일. 742615c05c1bc269305f36ae87a6697fe65fd72435d10c586b6014847cd341ba 742615c05c1bc269305f36ae87a6697fe65fd72435d10c586b6014847cd341ba 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks 유지 원문 검사 body 및 assertion 동일. 8d1c94d3b2b280fcd624c066f984ebf716dce5a75b9eb50cbdfa7db3bf81b3f7 8d1c94d3b2b280fcd624c066f984ebf716dce5a75b9eb50cbdfa7db3bf81b3f7 EXPECT_EQ(contribution.force[row], 0.0) | EXPECT_EQ(contribution.external_tangent[row * kDofCount + column], 0.0) EXPECT_EQ(contribution.force[row], 0.0) | EXPECT_EQ(contribution.external_tangent[row * kDofCount + column], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective; assertion 1개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective 유지 원문 검사 body 및 assertion 동일. 05b4e1eacac15e74c7f5645bfbccd96c0ab08dca4dd74eb6fcbee49c16daaaa5 05b4e1eacac15e74c7f5645bfbccd96c0ab08dca4dd74eb6fcbee49c16daaaa5 EXPECT_NEAR(actual, expected, 1.0e-12) EXPECT_NEAR(actual, expected, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling 유지 원문 검사 body 및 assertion 동일. ca803fdcc621df980fbb68f74a2f58637161c96934d111e03221c7145bb576ba ca803fdcc621df980fbb68f74a2f58637161c96934d111e03221c7145bb576ba EXPECT_NEAR(relabeled.force[row], original.force[original_row], 1.0e-12) | EXPECT_NEAR(relabeled.external_tangent[row * kDofCount + column], original.external_tangent[original_row * kDofCount + original_column], 1.0e-12) EXPECT_NEAR(relabeled.force[row], original.force[original_row], 1.0e-12) | EXPECT_NEAR(relabeled.external_tangent[row * kDofCount + column], original.external_tangent[original_row * kDofCount + original_column], 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns 유지 원문 검사 body 및 assertion 동일. dd09d801d862e32fa0409aacff9a835233c61c4f4c7061387b26285589ddf9a0 dd09d801d862e32fa0409aacff9a835233c61c4f4c7061387b26285589ddf9a0 ASSERT_GT(direction_scale, 0.0) | ASSERT_GT(scale, 0.0) ASSERT_GT(direction_scale, 0.0) | ASSERT_GT(scale, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent; assertion 3개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent 유지 원문 검사 body 및 assertion 동일. 6ac36ad2369fd30335c8d818991d31c435ccfd968051fff43160f486090f9ffe 6ac36ad2369fd30335c8d818991d31c435ccfd968051fff43160f486090f9ffe EXPECT_NE(xz, 0.0) | EXPECT_NE(zx, 0.0) | EXPECT_DOUBLE_EQ(xz, -zx) EXPECT_NE(xz, 0.0) | EXPECT_NE(zx, 0.0) | EXPECT_DOUBLE_EQ(xz, -zx) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint 유지 원문 검사 body 및 assertion 동일. 24d345beb376e5620bf884b8ea0190d3c9e308e0e7b90bece6e143929fd3abdd 24d345beb376e5620bf884b8ea0190d3c9e308e0e7b90bece6e143929fd3abdd 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor 유지 원문 검사 body 및 assertion 동일. 09b7acaf930fe99ec2cef7ccfa01ef7928b9a54333feb71791e9a13c0d35de37 09b7acaf930fe99ec2cef7ccfa01ef7928b9a54333feb71791e9a13c0d35de37 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/loads/shell_surface_pressure_test.cpp support@1-215 helper/oracle/fixture/include/static assertion 구간: PlanarInput, DistortedCurrentInput, EvaluateOrThrow, if, ForceAt, SumForce, MomentAboutOrigin, Norm, for, ExpectVectorRelative, ExpectArraysRelative, TangentAction, ChordLength, Rotate, ProperRotation, RotateInput, ExpectFailure tests/unit/loads/shell_surface_pressure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 78431ddeb801a8e24b974e8f45471a809df750f50df392e341b26471f651c80f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/loads/shell_surface_pressure_test.cpp support@512-513 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/loads/shell_surface_pressure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/materials/material_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/materials/material_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0e4f0a0beafc60dfc9ed3a016a544ed2b93a305867f8b820dc6817ebe58d8b7d 0e4f0a0beafc60dfc9ed3a016a544ed2b93a305867f8b820dc6817ebe58d8b7d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/materials/material_test.cpp Material.OwnsIsotropicElasticityThroughVirtualBase Material.OwnsIsotropicElasticityThroughVirtualBase; assertion 9개 tests/unit/materials/material_test.cpp Material.OwnsIsotropicElasticityThroughVirtualBase 유지 원문 검사 body 및 assertion 동일. 4a8b6d7c9c0bad72f99959a9fb02d195686bbb2b555313912866b19b3601c0d9 4a8b6d7c9c0bad72f99959a9fb02d195686bbb2b555313912866b19b3601c0d9 "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(material->Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(material->SourceId().source_label, 7) | EXPECT_EQ(material->SourceId().source_label_text, ""Steel"") | EXPECT_EQ(isotropic.Name(), ""Steel"") | EXPECT_DOUBLE_EQ(isotropic.YoungsModulus(), 210.0e9) | EXPECT_DOUBLE_EQ(isotropic.PoissonsRatio(), 0.3) | EXPECT_EQ(isotropic.Location().file, ""models/material.inp"") | EXPECT_EQ(isotropic.Location().line, 30U)" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(material->Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(material->SourceId().source_label, 7) | EXPECT_EQ(material->SourceId().source_label_text, ""Steel"") | EXPECT_EQ(isotropic.Name(), ""Steel"") | EXPECT_DOUBLE_EQ(isotropic.YoungsModulus(), 210.0e9) | EXPECT_DOUBLE_EQ(isotropic.PoissonsRatio(), 0.3) | EXPECT_EQ(isotropic.Location().file, ""models/material.inp"") | EXPECT_EQ(isotropic.Location().line, 30U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/materials/material_test.cpp Material.RejectsInvalidCurrentElasticFields Material.RejectsInvalidCurrentElasticFields; assertion 5개 tests/unit/materials/material_test.cpp Material.RejectsInvalidCurrentElasticFields 유지 원문 검사 body 및 assertion 동일. b9022c41bd0e641beaa68206c8fc19d2396a5b41ccf8e8bfe1bbd9911b9dde81 b9022c41bd0e641beaa68206c8fc19d2396a5b41ccf8e8bfe1bbd9911b9dde81 ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].severity, fesa::Severity::kError) | EXPECT_TRUE(beam_compatible.HasValue()) ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].severity, fesa::Severity::kError) | EXPECT_TRUE(beam_compatible.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/materials/material_test.cpp support@1-18 helper/oracle/fixture/include/static assertion 구간: MaterialSourceId, MaterialLocation tests/unit/materials/material_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0bc44f8ab121b123fdba22e1b3d50215ac0446ace019d14397d3e8a69ff0ae3b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/math/dense_blas_internal_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 12개 tests/unit/math/dense_blas_internal_test.cpp file 이관 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. d63714753d2cb3dc08d74b1d95b437b2a44ecf84087888f8814d62f227623aeb 358c0fa2dac6cebb5ddc2cdac29661c7d82a8b99da881ce069275b4daf4aba3a 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.PolicyQueryPreservesDefaultPositiveAndNestedTls DenseBlasInternal.PolicyQueryPreservesDefaultPositiveAndNestedTls; assertion 12개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.PolicyQueryPreservesDefaultPositiveAndNestedTls 유지 원문 검사 body 및 assertion 동일. 442bb466388f94391ef541ae44881c239ab3ef9a21e3c1eeb4417de67793f596 442bb466388f94391ef541ae44881c239ab3ef9a21e3c1eeb4417de67793f596 EXPECT_EQ(policy.blas_max_threads, 1) | EXPECT_EQ(policy.dynamic, dynamic) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), global) | EXPECT_EQ(mkl_domain_get_max_threads(MKL_DOMAIN_BLAS), domain) | EXPECT_EQ(mkl_get_dynamic(), dynamic) | EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 2) | EXPECT_EQ(mkl_set_num_threads_local(2), 2) | EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 1) | EXPECT_EQ(mkl_set_num_threads_local(1), 1) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_dynamic(), dynamic) EXPECT_EQ(policy.blas_max_threads, 1) | EXPECT_EQ(policy.dynamic, dynamic) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), global) | EXPECT_EQ(mkl_domain_get_max_threads(MKL_DOMAIN_BLAS), domain) | EXPECT_EQ(mkl_get_dynamic(), dynamic) | EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 2) | EXPECT_EQ(mkl_set_num_threads_local(2), 2) | EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 1) | EXPECT_EQ(mkl_set_num_threads_local(1), 1) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_dynamic(), dynamic) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.OuterProductUsesRectangularStorageAndPreservesRejection DenseBlasInternal.OuterProductUsesRectangularStorageAndPreservesRejection; assertion 9개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.OuterProductUsesRectangularStorageAndPreservesRejection 유지 원문 검사 body 및 assertion 동일. 9e70933ff45ccb1c3f65ab23032652c110f80e96b0b87bf78c62fae2f05fbfd6 9e70933ff45ccb1c3f65ab23032652c110f80e96b0b87bf78c62fae2f05fbfd6 ASSERT_TRUE(OuterProduct(left.data(), left.size(), right.data(), right.size(), product.data())) | EXPECT_EQ(product, expected) | EXPECT_FALSE(OuterProduct(invalid.data(), invalid.size(), right.data(), right.size(), product.data())) | EXPECT_EQ(product, accepted) | EXPECT_TRUE(OuterProduct(nullptr, 0U, nullptr, 3U, nullptr)) | EXPECT_TRUE(OuterProduct(nullptr, 2U, nullptr, 0U, nullptr)) | EXPECT_THROW(OuterProduct(nullptr, 2U, right.data(), 3U, product.data()), std::invalid_argument) | EXPECT_THROW(OuterProduct(nullptr, too_large, nullptr, 1U, nullptr), std::length_error) | EXPECT_THROW(OuterProduct(nullptr, too_many_elements, nullptr, 1U, nullptr), std::length_error) ASSERT_TRUE(OuterProduct(left.data(), left.size(), right.data(), right.size(), product.data())) | EXPECT_EQ(product, expected) | EXPECT_FALSE(OuterProduct(invalid.data(), invalid.size(), right.data(), right.size(), product.data())) | EXPECT_EQ(product, accepted) | EXPECT_TRUE(OuterProduct(nullptr, 0U, nullptr, 3U, nullptr)) | EXPECT_TRUE(OuterProduct(nullptr, 2U, nullptr, 0U, nullptr)) | EXPECT_THROW(OuterProduct(nullptr, 2U, right.data(), 3U, product.data()), std::invalid_argument) | EXPECT_THROW(OuterProduct(nullptr, too_large, nullptr, 1U, nullptr), std::length_error) | EXPECT_THROW(OuterProduct(nullptr, too_many_elements, nullptr, 1U, nullptr), std::length_error) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.LocalDenseScopeRestoresTlsAfterProductsAndUnwind DenseBlasInternal.LocalDenseScopeRestoresTlsAfterProductsAndUnwind; assertion 9개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.LocalDenseScopeRestoresTlsAfterProductsAndUnwind 유지 원문 검사 body 및 assertion 동일. d355acc671f14fab39551cdd60c62282ed92a14bc5e377567fb3b737b12c9745 d355acc671f14fab39551cdd60c62282ed92a14bc5e377567fb3b737b12c9745 EXPECT_EQ(mkl_get_max_threads(), 1) | EXPECT_TRUE( OuterProduct(left.data(), 2U, right.data(), 2U, product.data())) | EXPECT_DOUBLE_EQ(product[0U], 0.0) | EXPECT_DOUBLE_EQ(product[3U], 8.0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), 3) | EXPECT_EQ(mkl_get_max_threads(), 3) EXPECT_EQ(mkl_get_max_threads(), 1) | EXPECT_TRUE( OuterProduct(left.data(), 2U, right.data(), 2U, product.data())) | EXPECT_DOUBLE_EQ(product[0U], 0.0) | EXPECT_DOUBLE_EQ(product[3U], 8.0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), 3) | EXPECT_EQ(mkl_get_max_threads(), 3) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.OuterProductLeavesFiniteInputOverflowForOwnerGate DenseBlasInternal.OuterProductLeavesFiniteInputOverflowForOwnerGate; assertion 2개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.OuterProductLeavesFiniteInputOverflowForOwnerGate 유지 원문 검사 body 및 assertion 동일. fd8b9e0ad33db117848f7fdf9e55c6ebb6bc52897eb7de99683f5346d189007a fd8b9e0ad33db117848f7fdf9e55c6ebb6bc52897eb7de99683f5346d189007a EXPECT_TRUE(OuterProduct(left.data(), 1U, right.data(), 1U, product.data())) | EXPECT_TRUE(std::isinf(product[0U])) EXPECT_TRUE(OuterProduct(left.data(), 1U, right.data(), 1U, product.data())) | EXPECT_TRUE(std::isinf(product[0U])) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeRightProductUsesInnerAndRectangularStrides DenseBlasInternal.TransposeRightProductUsesInnerAndRectangularStrides; assertion 6개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeRightProductUsesInnerAndRectangularStrides 유지 원문 검사 body 및 assertion 동일. 741c248210dff918dbe2f96dab0d450f3fe86576c2c02396edddb819ab431a90 741c248210dff918dbe2f96dab0d450f3fe86576c2c02396edddb819ab431a90 ASSERT_TRUE(MultiplyTransposeRight(left.data(), 2U, right.data(), 4U, 3U, product.data())) | EXPECT_EQ(product, expected) | EXPECT_TRUE( MultiplyTransposeRight(nullptr, 2U, nullptr, 4U, 0U, product.data())) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_FALSE(MultiplyTransposeRight(left.data(), 2U, nonfinite.data(), 4U, 3U, product.data())) | EXPECT_DOUBLE_EQ(value, 31.0) ASSERT_TRUE(MultiplyTransposeRight(left.data(), 2U, right.data(), 4U, 3U, product.data())) | EXPECT_EQ(product, expected) | EXPECT_TRUE( MultiplyTransposeRight(nullptr, 2U, nullptr, 4U, 0U, product.data())) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_FALSE(MultiplyTransposeRight(left.data(), 2U, nonfinite.data(), 4U, 3U, product.data())) | EXPECT_DOUBLE_EQ(value, 31.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths; assertion 6개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths 유지 원문 검사 body 및 assertion 동일. 7310c1121f67249879da772e16e1f0aed31290565d542780b71704dbe397cf82 7310c1121f67249879da772e16e1f0aed31290565d542780b71704dbe397cf82 ASSERT_TRUE(zero.HasValue()) | EXPECT_EQ(zero.Value(), 0) | ASSERT_TRUE(normal.HasValue()) | EXPECT_EQ(normal.Value(), 3) | EXPECT_FALSE(rejected.HasValue()) | EXPECT_FALSE(rejected.GetStatus().IsOk()) ASSERT_TRUE(zero.HasValue()) | EXPECT_EQ(zero.Value(), 0) | ASSERT_TRUE(normal.HasValue()) | EXPECT_EQ(normal.Value(), 3) | EXPECT_FALSE(rejected.HasValue()) | EXPECT_FALSE(rejected.GetStatus().IsOk()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues; assertion 2개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues 유지 원문 검사 body 및 assertion 동일. 6174848905a7f5e3b5af5b336c22d8d4ce3e9872c557e543d783f5b8e2970e36 6174848905a7f5e3b5af5b336c22d8d4ce3e9872c557e543d783f5b8e2970e36 EXPECT_NO_THROW(CopyValues(nullptr, 0U, nullptr)) | EXPECT_EQ(destination, source) EXPECT_NO_THROW(CopyValues(nullptr, 0U, nullptr)) | EXPECT_EQ(destination, source) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeProductChecksShapeAndKnownRectangularAction DenseBlasInternal.TransposeProductChecksShapeAndKnownRectangularAction; assertion 10개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeProductChecksShapeAndKnownRectangularAction 유지 원문 검사 body 및 assertion 동일. 894b7358e85d1e6dc03383c1d95461ce32e35eb5b870fcfe6e67306ed461ff92 894b7358e85d1e6dc03383c1d95461ce32e35eb5b870fcfe6e67306ed461ff92 ASSERT_EQ(product.Rows(), 2U) | ASSERT_EQ(product.Columns(), 1U) | EXPECT_DOUBLE_EQ(product(0U, 0U), 8.0) | EXPECT_DOUBLE_EQ(product(1U, 0U), 6.0) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, Matrix{2U, 1U})), std::invalid_argument) | EXPECT_EQ(empty.Rows(), 2U) | EXPECT_EQ(empty.Columns(), 3U) | EXPECT_DOUBLE_EQ(empty(1U, 2U), 0.0) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), std::invalid_argument) ASSERT_EQ(product.Rows(), 2U) | ASSERT_EQ(product.Columns(), 1U) | EXPECT_DOUBLE_EQ(product(0U, 0U), 8.0) | EXPECT_DOUBLE_EQ(product(1U, 0U), 6.0) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, Matrix{2U, 1U})), std::invalid_argument) | EXPECT_EQ(empty.Rows(), 2U) | EXPECT_EQ(empty.Columns(), 3U) | EXPECT_DOUBLE_EQ(empty(1U, 2U), 0.0) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.DiagonalProductKeepsEntrywiseCancellationAndChecks DenseBlasInternal.DiagonalProductKeepsEntrywiseCancellationAndChecks; assertion 5개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.DiagonalProductKeepsEntrywiseCancellationAndChecks 유지 원문 검사 body 및 assertion 동일. 2f29992019630faca0543ec9c69fd7545e6746318f3522eb279d93dd40c2c1a6 2f29992019630faca0543ec9c69fd7545e6746318f3522eb279d93dd40c2c1a6 EXPECT_DOUBLE_EQ(product[0U] + (product[1U] - product[2U]), 4) | EXPECT_EQ(MultiplyDiagonal(Vector{0U}, Vector{0U}).Size(), 0U) | EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, Vector{2U})), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), std::invalid_argument) EXPECT_DOUBLE_EQ(product[0U] + (product[1U] - product[2U]), 4) | EXPECT_EQ(MultiplyDiagonal(Vector{0U}, Vector{0U}).Size(), 0U) | EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, Vector{2U})), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CholeskyAndInverseMatchKnownFactorsAndKeepFailedOutput DenseBlasInternal.CholeskyAndInverseMatchKnownFactorsAndKeepFailedOutput; assertion 13개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CholeskyAndInverseMatchKnownFactorsAndKeepFailedOutput 이관 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. 96aeb1e9d3a464a709e382c3e467ce7214f57f8ba053a40cc47ec20b6b2ef1c3 46024ffb6450ef4d9171647e852794a623149e86c96c2c4f0dc79a1639b08b8b ASSERT_TRUE(CholeskyLowerAndInverse(matrix, lower, inverse)) | EXPECT_DOUBLE_EQ(lower(0U, 0U), 2) | EXPECT_DOUBLE_EQ(lower(1U, 0U), 1) | EXPECT_DOUBLE_EQ(lower(1U, 1U), 2) | EXPECT_DOUBLE_EQ(lower(0U, 1U), 0) | EXPECT_DOUBLE_EQ(inverse(0U, 0U), .5) | EXPECT_DOUBLE_EQ(inverse(1U, 0U), -.25) | EXPECT_DOUBLE_EQ(inverse(1U, 1U), .5) | EXPECT_FALSE(CholeskyLowerAndInverse(matrix, lower, inverse)) | EXPECT_DOUBLE_EQ(lower(1U, 1U), 2) | EXPECT_DOUBLE_EQ(inverse(1U, 1U), .5) | EXPECT_THROW(static_cast(CholeskyLowerAndInverse( Matrix{2U, 1U}, lower, inverse)), std::invalid_argument) | EXPECT_THROW(static_cast(CholeskyLowerAndInverse(matrix, lower, inverse)), std::invalid_argument) ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(lower.HasValue()) | ASSERT_TRUE(inverse.HasValue()) | EXPECT_DOUBLE_EQ(lower.Value()(0, 0), 2) | EXPECT_DOUBLE_EQ(lower.Value()(1, 0), 1) | EXPECT_DOUBLE_EQ(lower.Value()(1, 1), 2) | EXPECT_DOUBLE_EQ(lower.Value()(0, 1), 0) | EXPECT_DOUBLE_EQ(inverse.Value()(0, 0), .5) | EXPECT_DOUBLE_EQ(inverse.Value()(1, 0), -.25) | EXPECT_DOUBLE_EQ(inverse.Value()(1, 1), .5) | EXPECT_FALSE(DenseFactor::Cholesky(matrix).HasValue()) | EXPECT_DOUBLE_EQ(lower.Value()(1, 1), 2) | EXPECT_DOUBLE_EQ(inverse.Value()(1, 1), .5) | EXPECT_FALSE(DenseFactor::Cholesky(Matrix{2U, 1U}).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(matrix).HasValue()) | EXPECT_DOUBLE_EQ(factor.Value().SolveLower(identity).Value()(1, 1), .5) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CholeskyFailureReasonPreservesCandidatesAndResetsOnReuse DenseBlasInternal.CholeskyFailureReasonPreservesCandidatesAndResetsOnReuse; assertion 10개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CholeskyFailureReasonPreservesCandidatesAndResetsOnReuse 이관 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. 93985fb3800b1c4b43ba914f29d9f9fa12f1b78b99d8c51a53eaf9fb64d6f26c a65d2bc077527a818aa3e8f336f196880b3ca99bed84fe565e3172b8b92791d1 ASSERT_TRUE(CholeskyLowerAndInverse(matrix, lower, inverse, &reason)) | EXPECT_EQ(reason, CholeskyFailure::kNone) | EXPECT_FALSE(CholeskyLowerAndInverse(matrix, lower, inverse, &reason)) | EXPECT_EQ(reason, CholeskyFailure::kPivot) | EXPECT_DOUBLE_EQ(lower(1U, 1U), 3.0) | EXPECT_DOUBLE_EQ(inverse(1U, 1U), 1.0 / 3.0) | EXPECT_TRUE(CholeskyLowerAndInverse(matrix, lower, inverse, &reason)) | EXPECT_EQ(reason, CholeskyFailure::kNone) | EXPECT_THROW(CholeskyLowerAndInverse(Matrix{2U, 1U}, lower, inverse, &reason), std::invalid_argument) | EXPECT_EQ(reason, CholeskyFailure::kNone) "ASSERT_TRUE(accepted.HasValue()) | ASSERT_FALSE(failed.HasValue()) | ASSERT_FALSE(failed.GetStatus().Diagnostics().empty()) | EXPECT_EQ(failed.GetStatus().Diagnostics()[0].code, ""dense-factor-pivot"") | EXPECT_DOUBLE_EQ(accepted.Value().Lower().Value()(1, 1), 3) | EXPECT_DOUBLE_EQ(accepted.Value().SolveLower(identity).Value()(1, 1), 1.0 / 3.0) | EXPECT_TRUE(DenseFactor::Cholesky(matrix).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(Matrix{2U, 1U}).HasValue()) | EXPECT_TRUE(DenseFactor::Cholesky(matrix).HasValue())" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.SingleEquationScopeRestoresTlsAndRespectsOverrides DenseBlasInternal.SingleEquationScopeRestoresTlsAndRespectsOverrides; assertion 7개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.SingleEquationScopeRestoresTlsAndRespectsOverrides 유지 원문 검사 body 및 assertion 동일. 04f7da1581a7cb9e82ebf7541c0d2c650bead4a06ec89fc962587f7886f7f24c 04f7da1581a7cb9e82ebf7541c0d2c650bead4a06ec89fc962587f7886f7f24c EXPECT_EQ(mkl_get_max_threads(), 1) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), 3) | EXPECT_EQ(mkl_get_max_threads(), 3) EXPECT_EQ(mkl_get_max_threads(), 1) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | EXPECT_EQ(mkl_get_max_threads(), 3) | EXPECT_EQ(mkl_get_max_threads(), 3) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp support@1-13 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/dense_blas_internal_test.cpp file-support 이관 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. f569be3011275f4abfba749d996ad0a7c0cdfd7504805f62ec6de29351bfdd08 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/dense_blas_internal_test.cpp support@297-299 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/dense_blas_internal_test.cpp file-support 유지 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. 1d8d74ae5cf24c16f28e2d6163baba8a6c1f59dd34f7b385e4f9fd2fda14a56b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_original.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/unit/math/high_low_arithmetic_original.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e2d9911ce60d0b689c5ebe9fe46c089f5edd05068b62c2b940b37c7cbc1e0ead e2d9911ce60d0b689c5ebe9fe46c089f5edd05068b62c2b940b37c7cbc1e0ead 해당 없음 해당 없음 유지-독립oracle R-ORACLE test-cleanup-review.md#r-oracle +Dev tests/unit/math/high_low_arithmetic_original.h support@1-162 helper/oracle/fixture/include/static assertion 구간: fesa, ArithmeticEnvironmentSupported, HighLow, InvalidHighLow, IsFinite, TwoSum, IsNormalized, Rounded, Add, Negate, Subtract, LowestBitExponent, while, TwoProduct, Multiply, Compare, Abs, Divide tests/unit/math/high_low_arithmetic_original.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3c01c8a5c85ec696c3d39b4027401fe16d04fa0fbe3fc70f44336bb242e20339 최종 파일 SHA 참조 해당 없음 해당 없음 유지-독립oracle R-ORACLE test-cleanup-review.md#r-oracle +Dev tests/unit/math/high_low_arithmetic_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/math/high_low_arithmetic_test.cpp file 이관 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. bb3a73827650ecd71ab92015e1add5c2836c5e9bc6e712068823e228d7389f5f 6e7fafa845bdd0c3a648b846f2ed54bf2fd07d5ec492a7c84b164c93f6e6ecc4 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RetainsSubUlpAdditionsAndSignedCancellation HighLowArithmetic.RetainsSubUlpAdditionsAndSignedCancellation; assertion 15개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RetainsSubUlpAdditionsAndSignedCancellation 유지 원문 검사 body 및 assertion 동일. f2a492c6eb8068167a3979f743c32cbc73dfe847846d892e715ed7bfbc9e05ec f2a492c6eb8068167a3979f743c32cbc73dfe847846d892e715ed7bfbc9e05ec ASSERT_TRUE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(IsNormalized(HighLow{-0.0, -0.0})) | EXPECT_TRUE(IsNormalized(HighLow{-0.0})) | EXPECT_FALSE(std::signbit(HighLow{-0.0}.high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).low)) | EXPECT_EQ(positive.high, 1) | EXPECT_EQ(positive.low, tiny) | EXPECT_EQ(Rounded(positive), 1) | EXPECT_EQ(difference.high, tiny) | EXPECT_EQ(difference.low, 0) | EXPECT_EQ(Compare(positive, HighLow{1}), 1) | EXPECT_EQ(Compare(HighLow{1, -tiny}, HighLow{1}), -1) | EXPECT_EQ(Compare(Add(positive, Negate(positive)), HighLow{}), 0) | EXPECT_EQ(Abs(HighLow{-1, -tiny}).low, tiny) ASSERT_TRUE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(IsNormalized(HighLow{-0.0, -0.0})) | EXPECT_TRUE(IsNormalized(HighLow{-0.0})) | EXPECT_FALSE(std::signbit(HighLow{-0.0}.high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).low)) | EXPECT_EQ(positive.high, 1) | EXPECT_EQ(positive.low, tiny) | EXPECT_EQ(Rounded(positive), 1) | EXPECT_EQ(difference.high, tiny) | EXPECT_EQ(difference.low, 0) | EXPECT_EQ(Compare(positive, HighLow{1}), 1) | EXPECT_EQ(Compare(HighLow{1, -tiny}, HighLow{1}), -1) | EXPECT_EQ(Compare(Add(positive, Negate(positive)), HighLow{}), 0) | EXPECT_EQ(Abs(HighLow{-1, -tiny}).low, tiny) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.AllProductTermsAndDivisionResidualReachState HighLowArithmetic.AllProductTermsAndDivisionResidualReachState; assertion 6개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.AllProductTermsAndDivisionResidualReachState 유지 원문 검사 body 및 assertion 동일. 5d464b75e43ed56254ebd034fe40e7d2683352bbe913cd6eaf816614bd3582dd 5d464b75e43ed56254ebd034fe40e7d2683352bbe913cd6eaf816614bd3582dd EXPECT_EQ(product.high, 1) | EXPECT_EQ(product.low, -std::ldexp(1.0, -120)) | ASSERT_TRUE(IsNormalized(quotient)) | EXPECT_LE(std::abs(defect.high), std::ldexp(1.0, -104)) | EXPECT_EQ(cancellation.high, tiny / 2) | EXPECT_EQ(cancellation.low, 0) EXPECT_EQ(product.high, 1) | EXPECT_EQ(product.low, -std::ldexp(1.0, -120)) | ASSERT_TRUE(IsNormalized(quotient)) | EXPECT_LE(std::abs(defect.high), std::ldexp(1.0, -104)) | EXPECT_EQ(cancellation.high, tiny / 2) | EXPECT_EQ(cancellation.low, 0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.NormalizesTiesAndCrossesPowerOfTwoBoundary HighLowArithmetic.NormalizesTiesAndCrossesPowerOfTwoBoundary; assertion 6개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.NormalizesTiesAndCrossesPowerOfTwoBoundary 유지 원문 검사 body 및 assertion 동일. 4bbb8298c7a24ac9be9d05d58a013ed1d2e3ae9602815e911f9596f567694549 4bbb8298c7a24ac9be9d05d58a013ed1d2e3ae9602815e911f9596f567694549 EXPECT_TRUE(IsNormalized(HighLow{1, half_ulp})) | EXPECT_FALSE(IsNormalized(HighLow{std::nextafter(1.0, 2.0), -half_ulp})) | EXPECT_EQ(result.high, std::nextafter(1.0, 2.0)) | EXPECT_EQ(result.low, 0) | EXPECT_EQ(Add(minimum, minimum).high, 2 * minimum.high) | EXPECT_EQ(Multiply(minimum, HighLow{1}).high, minimum.high) EXPECT_TRUE(IsNormalized(HighLow{1, half_ulp})) | EXPECT_FALSE(IsNormalized(HighLow{std::nextafter(1.0, 2.0), -half_ulp})) | EXPECT_EQ(result.high, std::nextafter(1.0, 2.0)) | EXPECT_EQ(result.low, 0) | EXPECT_EQ(Add(minimum, minimum).high, 2 * minimum.high) | EXPECT_EQ(Multiply(minimum, HighLow{1}).high, minimum.high) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsUnsupportedDyadicTailAndNonfiniteResults HighLowArithmetic.RejectsUnsupportedDyadicTailAndNonfiniteResults; assertion 8개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsUnsupportedDyadicTailAndNonfiniteResults 유지 원문 검사 body 및 assertion 동일. e13007c60ef0ca2d8c8755035337fb55cecb64bcf7483cb7695ab98c1d5cfaa1 e13007c60ef0ca2d8c8755035337fb55cecb64bcf7483cb7695ab98c1d5cfaa1 EXPECT_FALSE(IsFinite(Multiply(minimum, HighLow{0.5}))) | EXPECT_FALSE(IsFinite(Multiply(HighLow{std::ldexp(1.0, -1022)}, HighLow{std::nextafter(0.5, 1.0)}))) | EXPECT_FALSE(IsFinite(Divide(minimum, HighLow{2}))) | EXPECT_FALSE(IsFinite(Divide(HighLow{1}, HighLow{}))) | EXPECT_FALSE(IsFinite(Add(HighLow{std::numeric_limits::max()}, HighLow{std::numeric_limits::max()}))) | EXPECT_EQ(Compare(InvalidHighLow(), HighLow{}), 2) | EXPECT_FALSE(IsNormalized(HighLow{1, 1})) | EXPECT_TRUE(std::isnan(Rounded(HighLow{1, 1}))) EXPECT_FALSE(IsFinite(Multiply(minimum, HighLow{0.5}))) | EXPECT_FALSE(IsFinite(Multiply(HighLow{std::ldexp(1.0, -1022)}, HighLow{std::nextafter(0.5, 1.0)}))) | EXPECT_FALSE(IsFinite(Divide(minimum, HighLow{2}))) | EXPECT_FALSE(IsFinite(Divide(HighLow{1}, HighLow{}))) | EXPECT_FALSE(IsFinite(Add(HighLow{std::numeric_limits::max()}, HighLow{std::numeric_limits::max()}))) | EXPECT_EQ(Compare(InvalidHighLow(), HighLow{}), 2) | EXPECT_FALSE(IsNormalized(HighLow{1, 1})) | EXPECT_TRUE(std::isnan(Rounded(HighLow{1, 1}))) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.ExactDyadicOracleBoundsDiscardedTailAndRefinement HighLowArithmetic.ExactDyadicOracleBoundsDiscardedTailAndRefinement; assertion 13개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.ExactDyadicOracleBoundsDiscardedTailAndRefinement 유지 원문 검사 body 및 assertion 동일. 231d3d1a2023a915af0befbf01924f42b59b43b192520841785ac05d571e9452 231d3d1a2023a915af0befbf01924f42b59b43b192520841785ac05d571e9452 EXPECT_EQ(sum.high, std::ldexp(0x1.0000000000001p+0, scale)) | EXPECT_EQ(sum.low, -std::ldexp(1.0, scale-54)) | EXPECT_EQ(square.high, std::ldexp(1.0, 2*scale)) | EXPECT_EQ(square.low, std::ldexp(1.0, 2*scale-53)) | EXPECT_EQ(third.high, 0x1.5555555555555p-2) | EXPECT_EQ(third.low, 0x1.5555555555555p-56) | EXPECT_EQ(third_residual.high, -std::ldexp(1.0, -108)) | EXPECT_EQ(third_residual.low, 0) | EXPECT_EQ(refined.high, 0x1.999999999999ap-1) | EXPECT_EQ(refined.low, -0x1.8e147ae147ae1p-55) | EXPECT_EQ(boundary.high, 0x1.0000000000002p-970) | EXPECT_EQ(boundary.low, std::numeric_limits::denorm_min()) | EXPECT_FALSE(IsFinite(TwoProduct(std::nextafter(1.0, 2.0), std::nextafter(std::numeric_limits::min(), 1.0)))) EXPECT_EQ(sum.high, std::ldexp(0x1.0000000000001p+0, scale)) | EXPECT_EQ(sum.low, -std::ldexp(1.0, scale-54)) | EXPECT_EQ(square.high, std::ldexp(1.0, 2*scale)) | EXPECT_EQ(square.low, std::ldexp(1.0, 2*scale-53)) | EXPECT_EQ(third.high, 0x1.5555555555555p-2) | EXPECT_EQ(third.low, 0x1.5555555555555p-56) | EXPECT_EQ(third_residual.high, -std::ldexp(1.0, -108)) | EXPECT_EQ(third_residual.low, 0) | EXPECT_EQ(refined.high, 0x1.999999999999ap-1) | EXPECT_EQ(refined.low, -0x1.8e147ae147ae1p-55) | EXPECT_EQ(boundary.high, 0x1.0000000000002p-970) | EXPECT_EQ(boundary.low, std::numeric_limits::denorm_min()) | EXPECT_FALSE(IsFinite(TwoProduct(std::nextafter(1.0, 2.0), std::nextafter(std::numeric_limits::min(), 1.0)))) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsChangedRoundingAndFlushToZeroEnvironment HighLowArithmetic.RejectsChangedRoundingAndFlushToZeroEnvironment; assertion 6개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsChangedRoundingAndFlushToZeroEnvironment 유지 원문 검사 body 및 assertion 동일. 356cfeef68419bd3c33a3abd04e7d67b2bc2ea0a1b4c4bb8e0888fda56c6bc48 356cfeef68419bd3c33a3abd04e7d67b2bc2ea0a1b4c4bb8e0888fda56c6bc48 ASSERT_TRUE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_TONEAREST), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) ASSERT_TRUE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_TONEAREST), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.FiniteClassificationMatchesBinary64Boundaries HighLowArithmetic.FiniteClassificationMatchesBinary64Boundaries; assertion 2개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.FiniteClassificationMatchesBinary64Boundaries 유지 원문 검사 body 및 assertion 동일. 809bcc24d04c18fe6257e3e6fc7f9e5f7da525fea89edcc83e404457e86c7476 809bcc24d04c18fe6257e3e6fc7f9e5f7da525fea89edcc83e404457e86c7476 EXPECT_EQ(IsFinite(HighLow{value, 0.0}), expected) | EXPECT_EQ(IsFinite(HighLow{1.0, value}), expected) EXPECT_EQ(IsFinite(HighLow{value, 0.0}), expected) | EXPECT_EQ(IsFinite(HighLow{1.0, value}), expected) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.BitExponentMatchesFrozenOracleAcrossEveryExponent HighLowArithmetic.BitExponentMatchesFrozenOracleAcrossEveryExponent; assertion 3개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.BitExponentMatchesFrozenOracleAcrossEveryExponent 유지 원문 검사 body 및 assertion 동일. e957ee50fe2731195a1ed42574146561f08c31ed5378594ecbc353cc9891bf3e e957ee50fe2731195a1ed42574146561f08c31ed5378594ecbc353cc9891bf3e ASSERT_TRUE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(LowestBitExponent(value), fesa::high_low_original::LowestBitExponent(value)) | EXPECT_EQ(LowestBitExponent(value), fesa::high_low_original::LowestBitExponent(value)) ASSERT_TRUE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(LowestBitExponent(value), fesa::high_low_original::LowestBitExponent(value)) | EXPECT_EQ(LowestBitExponent(value), fesa::high_low_original::LowestBitExponent(value)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.OptimizedArithmeticMatchesFrozenOriginalBits HighLowArithmetic.OptimizedArithmeticMatchesFrozenOriginalBits; assertion 3개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.OptimizedArithmeticMatchesFrozenOriginalBits 유지 원문 검사 body 및 assertion 동일. 9ed52541f1fcb93b23aee5f64a19cdafb8cb4597e38c3ffb499f2a403d196830 9ed52541f1fcb93b23aee5f64a19cdafb8cb4597e38c3ffb499f2a403d196830 ASSERT_TRUE(ArithmeticEnvironmentSupported()) | EXPECT_EQ(IsNormalized({high, low}), fesa::high_low_original::IsNormalized(original)) | EXPECT_EQ(IsNormalized({high, low}), fesa::high_low_original::IsNormalized({high, low})) ASSERT_TRUE(ArithmeticEnvironmentSupported()) | EXPECT_EQ(IsNormalized({high, low}), fesa::high_low_original::IsNormalized(original)) | EXPECT_EQ(IsNormalized({high, low}), fesa::high_low_original::IsNormalized({high, low})) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp support@1-16 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/high_low_arithmetic_test.cpp file-support 이관 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. 7ae170bf5c29e41cab744307b531ed7e8897a2e5a1439a03fdd0edf109ea355e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp support@134-146 helper/oracle/fixture/include/static assertion 구간: Bits, FromBits tests/unit/math/high_low_arithmetic_test.cpp file-support 유지 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. 87b474dadc9ddb92a1941fc7fd43b44b8cb619fbb239255f1bd2caeb85931886 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp support@163-169 helper/oracle/fixture/include/static assertion 구간: ExpectSamePair tests/unit/math/high_low_arithmetic_test.cpp file-support 유지 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. a9015eafc8fbad91188fc6a987d9a202613cbd3a5ecccc8dc8dc9d425a0c12d5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/high_low_arithmetic_test.cpp support@239-239 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/math/high_low_arithmetic_test.cpp file-support 유지 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/matrix_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/math/matrix_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 24d515a2397f12e2951d055c69e82e00f1cef93c2451520a5d180cc8ca02ccf0 e871743665669396e2ff3df6599a7020e1e9009ba325c1341493f4f940da9744 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/matrix_test.cpp DenseMath.RowMajorMatrixMatchesKnownGemvGemm DenseMath.RowMajorMatrixMatchesKnownGemvGemm; assertion 39개 tests/unit/math/matrix_test.cpp DenseMath.RowMajorMatrixMatchesKnownGemvGemm 유지 원문 검사 body 및 assertion 동일. 80766b5923a34f53328f9a728d5714d0e8fc8448721f558a25f8cc297cae5317 80766b5923a34f53328f9a728d5714d0e8fc8448721f558a25f8cc297cae5317 EXPECT_THROW(static_cast(Matrix{wraparound_rows, 2}), std::length_error) | EXPECT_EQ(zero_row_product.Size(), 0U) | ASSERT_EQ(zero_column_product.Size(), 2U) | EXPECT_DOUBLE_EQ(zero_column_product[0], 0.0) | EXPECT_DOUBLE_EQ(zero_column_product[1], 0.0) | EXPECT_EQ(zero_inner_product.Rows(), 2U) | EXPECT_EQ(zero_inner_product.Columns(), 3U) | EXPECT_DOUBLE_EQ(zero_inner_product(row, column), 0.0) | EXPECT_EQ(&left(0, 0) + 1, &left(0, 1)) | EXPECT_EQ(&left(0, 0) + 2, &left(0, 2)) | EXPECT_EQ(&left(0, 0) + 3, &left(1, 0)) | EXPECT_DOUBLE_EQ(const_left(1, 2), 6.0) | EXPECT_DOUBLE_EQ(left(0, 0), 1.0) | EXPECT_DOUBLE_EQ(left(1, 2), 6.0) | EXPECT_EQ(copied.Rows(), 0U) | EXPECT_EQ(copied.Columns(), 0U) | EXPECT_EQ(moved.Rows(), 2U) | EXPECT_EQ(moved.Columns(), 3U) | EXPECT_DOUBLE_EQ(moved(0, 0), 42.0) | EXPECT_NO_THROW(static_cast(copied.Multiply(Vector{0}))) | EXPECT_EQ(copy_assigned.Rows(), 0U) | EXPECT_EQ(copy_assigned.Columns(), 0U) | EXPECT_EQ(move_assigned.Rows(), 2U) | EXPECT_EQ(move_assigned.Columns(), 3U) | EXPECT_DOUBLE_EQ(move_assigned(1, 2), -7.0) | ASSERT_EQ(matrix_vector_product.Size(), 2U) | EXPECT_DOUBLE_EQ(matrix_vector_product[0], 50.0) | EXPECT_DOUBLE_EQ(matrix_vector_product[1], 122.0) | ASSERT_EQ(matrix_product.Rows(), 2U) | ASSERT_EQ(matrix_product.Columns(), 2U) | EXPECT_DOUBLE_EQ(matrix_product(0, 0), 58.0) | EXPECT_DOUBLE_EQ(matrix_product(0, 1), 64.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 0), 139.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 1), 154.0) | EXPECT_THROW(static_cast(left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left(0, 3)), std::out_of_range) | EXPECT_THROW(static_cast(const_left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left.Multiply(Vector{2})), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(Matrix{4, 1})), std::invalid_argument) EXPECT_THROW(static_cast(Matrix{wraparound_rows, 2}), std::length_error) | EXPECT_EQ(zero_row_product.Size(), 0U) | ASSERT_EQ(zero_column_product.Size(), 2U) | EXPECT_DOUBLE_EQ(zero_column_product[0], 0.0) | EXPECT_DOUBLE_EQ(zero_column_product[1], 0.0) | EXPECT_EQ(zero_inner_product.Rows(), 2U) | EXPECT_EQ(zero_inner_product.Columns(), 3U) | EXPECT_DOUBLE_EQ(zero_inner_product(row, column), 0.0) | EXPECT_EQ(&left(0, 0) + 1, &left(0, 1)) | EXPECT_EQ(&left(0, 0) + 2, &left(0, 2)) | EXPECT_EQ(&left(0, 0) + 3, &left(1, 0)) | EXPECT_DOUBLE_EQ(const_left(1, 2), 6.0) | EXPECT_DOUBLE_EQ(left(0, 0), 1.0) | EXPECT_DOUBLE_EQ(left(1, 2), 6.0) | EXPECT_EQ(copied.Rows(), 0U) | EXPECT_EQ(copied.Columns(), 0U) | EXPECT_EQ(moved.Rows(), 2U) | EXPECT_EQ(moved.Columns(), 3U) | EXPECT_DOUBLE_EQ(moved(0, 0), 42.0) | EXPECT_NO_THROW(static_cast(copied.Multiply(Vector{0}))) | EXPECT_EQ(copy_assigned.Rows(), 0U) | EXPECT_EQ(copy_assigned.Columns(), 0U) | EXPECT_EQ(move_assigned.Rows(), 2U) | EXPECT_EQ(move_assigned.Columns(), 3U) | EXPECT_DOUBLE_EQ(move_assigned(1, 2), -7.0) | ASSERT_EQ(matrix_vector_product.Size(), 2U) | EXPECT_DOUBLE_EQ(matrix_vector_product[0], 50.0) | EXPECT_DOUBLE_EQ(matrix_vector_product[1], 122.0) | ASSERT_EQ(matrix_product.Rows(), 2U) | ASSERT_EQ(matrix_product.Columns(), 2U) | EXPECT_DOUBLE_EQ(matrix_product(0, 0), 58.0) | EXPECT_DOUBLE_EQ(matrix_product(0, 1), 64.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 0), 139.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 1), 154.0) | EXPECT_THROW(static_cast(left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left(0, 3)), std::out_of_range) | EXPECT_THROW(static_cast(const_left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left.Multiply(Vector{2})), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(Matrix{4, 1})), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/matrix_test.cpp DenseMath.MatrixProductsRejectNonfiniteOperandsAndPreserveValidReuse DenseMath.MatrixProductsRejectNonfiniteOperandsAndPreserveValidReuse; assertion 6개 tests/unit/math/matrix_test.cpp DenseMath.MatrixProductsRejectNonfiniteOperandsAndPreserveValidReuse 유지 원문 검사 body 및 assertion 동일. d7633d3bb1c24ce50b386610f4288a8a597ea067123f4db22d80b7c6254f5d1c d7633d3bb1c24ce50b386610f4288a8a597ea067123f4db22d80b7c6254f5d1c EXPECT_THROW(static_cast(left.Multiply(rhs)), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(rhs)), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(right)), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(right)), std::invalid_argument) | EXPECT_DOUBLE_EQ(left.Multiply(rhs)[0U], 4.0) | EXPECT_DOUBLE_EQ(left.Multiply(right)(1U, 0U), 4.0) EXPECT_THROW(static_cast(left.Multiply(rhs)), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(rhs)), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(right)), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(right)), std::invalid_argument) | EXPECT_DOUBLE_EQ(left.Multiply(rhs)[0U], 4.0) | EXPECT_DOUBLE_EQ(left.Multiply(right)(1U, 0U), 4.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/matrix_test.cpp support@1-11 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/matrix_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e9e369e18cfae13e644c0002a8211b5a6de15cd88d38e91cf313ba994dbe2c5f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/matrix_test.cpp support@129-131 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/matrix_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/math/sparse_matrix_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ce2d95faaa89e5b4887d791745eee4b97e882482fa91e04b787dceaa268d663b ce2d95faaa89e5b4887d791745eee4b97e882482fa91e04b787dceaa268d663b 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ValidatesKnownCsrAndMultiply SparseAssembly.ValidatesKnownCsrAndMultiply; assertion 13개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ValidatesKnownCsrAndMultiply 유지 원문 검사 body 및 assertion 동일. 306be72faf3dbbf425d660063d3847f0d06a43498caa60943e847cc485a5d9c8 306be72faf3dbbf425d660063d3847f0d06a43498caa60943e847cc485a5d9c8 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(matrix.Rows(), 4U) | EXPECT_EQ(matrix.Columns(), 4U) | EXPECT_EQ(matrix.RowOffsets(), pattern.row_offsets) | EXPECT_EQ(matrix.ColumnIndices(), pattern.column_indices) | EXPECT_EQ(matrix.Values(), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0})) | EXPECT_TRUE(matrix.Validate().IsOk()) | ASSERT_EQ(product.Size(), 4U) | EXPECT_DOUBLE_EQ(product[0U], 7.0) | EXPECT_DOUBLE_EQ(product[1U], 0.0) | EXPECT_DOUBLE_EQ(product[2U], 22.0) | EXPECT_DOUBLE_EQ(product[3U], 20.0) | EXPECT_THROW(static_cast(matrix.Multiply(Vector{3U})), std::invalid_argument) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(matrix.Rows(), 4U) | EXPECT_EQ(matrix.Columns(), 4U) | EXPECT_EQ(matrix.RowOffsets(), pattern.row_offsets) | EXPECT_EQ(matrix.ColumnIndices(), pattern.column_indices) | EXPECT_EQ(matrix.Values(), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0})) | EXPECT_TRUE(matrix.Validate().IsOk()) | ASSERT_EQ(product.Size(), 4U) | EXPECT_DOUBLE_EQ(product[0U], 7.0) | EXPECT_DOUBLE_EQ(product[1U], 0.0) | EXPECT_DOUBLE_EQ(product[2U], 22.0) | EXPECT_DOUBLE_EQ(product[3U], 20.0) | EXPECT_THROW(static_cast(matrix.Multiply(Vector{3U})), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ReducesDuplicatesInFixedTupleOrder SparseAssembly.ReducesDuplicatesInFixedTupleOrder; assertion 7개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ReducesDuplicatesInFixedTupleOrder 유지 원문 검사 body 및 assertion 동일. 58ef40306d7a2794d3714329bae3ac32fcb28e31493f45d24c5817813cc07a36 58ef40306d7a2794d3714329bae3ac32fcb28e31493f45d24c5817813cc07a36 ASSERT_TRUE(first.HasValue()) | ASSERT_EQ(first.Value().Values().size(), 1U) | EXPECT_DOUBLE_EQ(first.Value().Values()[0U], 1.0) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().RowOffsets(), first.Value().RowOffsets()) | EXPECT_EQ(second.Value().ColumnIndices(), first.Value().ColumnIndices()) | EXPECT_EQ(second.Value().Values(), first.Value().Values()) ASSERT_TRUE(first.HasValue()) | ASSERT_EQ(first.Value().Values().size(), 1U) | EXPECT_DOUBLE_EQ(first.Value().Values()[0U], 1.0) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().RowOffsets(), first.Value().RowOffsets()) | EXPECT_EQ(second.Value().ColumnIndices(), first.Value().ColumnIndices()) | EXPECT_EQ(second.Value().Values(), first.Value().Values()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.RejectsInvalidIndexPatternAndShape SparseAssembly.RejectsInvalidIndexPatternAndShape; assertion 4개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.RejectsInvalidIndexPatternAndShape 유지 원문 검사 body 및 assertion 동일. 20889c0e8ab98ed0bbfbe684fcf8309c542a55123a6d5f0d7cd97d60cd25d104 20889c0e8ab98ed0bbfbe684fcf8309c542a55123a6d5f0d7cd97d60cd25d104 EXPECT_FALSE(result.HasValue()) | EXPECT_FALSE(result.GetStatus().IsOk()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(result.GetStatus().Diagnostics().empty()) EXPECT_FALSE(result.HasValue()) | EXPECT_FALSE(result.GetStatus().IsOk()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(result.GetStatus().Diagnostics().empty()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.PreservesExpectedStructuralZeros SparseAssembly.PreservesExpectedStructuralZeros; assertion 5개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.PreservesExpectedStructuralZeros 유지 원문 검사 body 및 assertion 동일. 8a7bf76b61f4852be9d64fe9358d648f2c8be768942738a0785c52ed047ffd27 8a7bf76b61f4852be9d64fe9358d648f2c8be768942738a0785c52ed047ffd27 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().RowOffsets(), pattern.row_offsets) | EXPECT_EQ(result.Value().ColumnIndices(), pattern.column_indices) | EXPECT_EQ(result.Value().Values(), (std::vector{2.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(std::count(result.Value().Values().begin(), result.Value().Values().end(), 0.0), 4) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().RowOffsets(), pattern.row_offsets) | EXPECT_EQ(result.Value().ColumnIndices(), pattern.column_indices) | EXPECT_EQ(result.Value().Values(), (std::vector{2.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(std::count(result.Value().Values().begin(), result.Value().Values().end(), 0.0), 4) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.MultipliesRectangularCopyMoveAndConcurrentConstCalls SparseAssembly.MultipliesRectangularCopyMoveAndConcurrentConstCalls; assertion 7개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.MultipliesRectangularCopyMoveAndConcurrentConstCalls 유지 원문 검사 body 및 assertion 동일. 9a21d95b055afbe45ddbca0e8ae2278bc04277601d44be74e7eb09a994134f97 9a21d95b055afbe45ddbca0e8ae2278bc04277601d44be74e7eb09a994134f97 ASSERT_TRUE(assembled.HasValue()) | EXPECT_TRUE(first.get()) | EXPECT_TRUE(second.get()) | EXPECT_TRUE(evaluate(original)) | ASSERT_TRUE(replacement.HasValue()) | EXPECT_DOUBLE_EQ(moved.Multiply(Vector{1U, 3.0})[0U], 21.0) | EXPECT_TRUE(evaluate(original)) ASSERT_TRUE(assembled.HasValue()) | EXPECT_TRUE(first.get()) | EXPECT_TRUE(second.get()) | EXPECT_TRUE(evaluate(original)) | ASSERT_TRUE(replacement.HasValue()) | EXPECT_DOUBLE_EQ(moved.Multiply(Vector{1U, 3.0})[0U], 21.0) | EXPECT_TRUE(evaluate(original)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.PreservesZeroShapesAndEmptyRows SparseAssembly.PreservesZeroShapesAndEmptyRows; assertion 8개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.PreservesZeroShapesAndEmptyRows 유지 원문 검사 body 및 assertion 동일. 4f9c2fd65e5d13ec7a449e38fedcd513e0aa6821add64484e873f020d338f8b0 4f9c2fd65e5d13ec7a449e38fedcd513e0aa6821add64484e873f020d338f8b0 ASSERT_TRUE(no_rows.HasValue()) | ASSERT_TRUE(no_columns.HasValue()) | ASSERT_TRUE(no_entries.HasValue()) | EXPECT_EQ(no_rows.Value().Multiply(Vector{3U}).Size(), 0U) | ASSERT_EQ(empty_columns.Size(), 2U) | ASSERT_EQ(empty_entries.Size(), 2U) | EXPECT_DOUBLE_EQ(empty_columns[row], 0.0) | EXPECT_DOUBLE_EQ(empty_entries[row], 0.0) ASSERT_TRUE(no_rows.HasValue()) | ASSERT_TRUE(no_columns.HasValue()) | ASSERT_TRUE(no_entries.HasValue()) | EXPECT_EQ(no_rows.Value().Multiply(Vector{3U}).Size(), 0U) | ASSERT_EQ(empty_columns.Size(), 2U) | ASSERT_EQ(empty_entries.Size(), 2U) | EXPECT_DOUBLE_EQ(empty_columns[row], 0.0) | EXPECT_DOUBLE_EQ(empty_entries[row], 0.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.RejectsNonfiniteRhsAndRecoversAfterFiniteOverflow SparseAssembly.RejectsNonfiniteRhsAndRecoversAfterFiniteOverflow; assertion 7개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.RejectsNonfiniteRhsAndRecoversAfterFiniteOverflow 유지 원문 검사 body 및 assertion 동일. 574f3cfbc416c6240854f801794be36d9ac765e66ac8d06059caff34ed4640c6 574f3cfbc416c6240854f801794be36d9ac765e66ac8d06059caff34ed4640c6 ASSERT_TRUE(matrix.HasValue()) | EXPECT_THROW(static_cast(matrix.Value().Multiply(rhs)), std::invalid_argument) | EXPECT_TRUE(std::isinf(matrix.Value().Multiply(rhs)[0U])) | EXPECT_THROW(static_cast(matrix.Value().Multiply(rhs)), std::invalid_argument) | EXPECT_THROW(static_cast(matrix.Value().Multiply(Vector{1U})), std::invalid_argument) | EXPECT_DOUBLE_EQ(finite[0U], 6.0) | EXPECT_DOUBLE_EQ(finite[1U], 0.0) ASSERT_TRUE(matrix.HasValue()) | EXPECT_THROW(static_cast(matrix.Value().Multiply(rhs)), std::invalid_argument) | EXPECT_TRUE(std::isinf(matrix.Value().Multiply(rhs)[0U])) | EXPECT_THROW(static_cast(matrix.Value().Multiply(rhs)), std::invalid_argument) | EXPECT_THROW(static_cast(matrix.Value().Multiply(Vector{1U})), std::invalid_argument) | EXPECT_DOUBLE_EQ(finite[0U], 6.0) | EXPECT_DOUBLE_EQ(finite[1U], 0.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp SparseAssembly.MatchesIndependentLongDoubleResidualOnUnevenRows SparseAssembly.MatchesIndependentLongDoubleResidualOnUnevenRows; assertion 2개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.MatchesIndependentLongDoubleResidualOnUnevenRows 유지 원문 검사 body 및 assertion 동일. 53983801555cf34c044b2b28586b54a10fe561855307d30b09ec52d3f01facac 53983801555cf34c044b2b28586b54a10fe561855307d30b09ec52d3f01facac ASSERT_TRUE(matrix.HasValue()) | EXPECT_NEAR(product[row], static_cast(expected), 2.0e-14) ASSERT_TRUE(matrix.HasValue()) | EXPECT_NEAR(product[row], static_cast(expected), 2.0e-14) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp support@1-26 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/math/sparse_matrix_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0a4b7e01533c4e8cf0f2da283db812646e50c73bd09c5a8a0a36c87546058462 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/sparse_matrix_test.cpp support@235-236 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/math/sparse_matrix_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/math/vector3_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 73d76da9064531db15cd5c7aaaafca04cffcc9853b56171055ed35789cf649ae 442331d7ccb19a8f989c48d0f71fdfb0f0a6473adf7af53e7a4b477f45b965a4 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.StoresComponentsWithExactArithmetic Vector3.StoresComponentsWithExactArithmetic; assertion 18개 tests/unit/math/vector3_test.cpp Vector3.StoresComponentsWithExactArithmetic 유지 원문 검사 body 및 assertion 동일. 9a048f9faafa466a70e10b035ee0fe67423b83781ad22e7d0f69c50168b6a353 9a048f9faafa466a70e10b035ee0fe67423b83781ad22e7d0f69c50168b6a353 EXPECT_DOUBLE_EQ(lhs.X(), 1.0) | EXPECT_DOUBLE_EQ(lhs.Y(), -2.0) | EXPECT_DOUBLE_EQ(lhs.Z(), 3.0) | EXPECT_DOUBLE_EQ(lhs[0], 1.0) | EXPECT_DOUBLE_EQ(lhs[1], -2.0) | EXPECT_DOUBLE_EQ(lhs[2], 3.0) | EXPECT_DOUBLE_EQ(sum[0], -3.0) | EXPECT_DOUBLE_EQ(sum[1], 3.0) | EXPECT_DOUBLE_EQ(sum[2], 9.0) | EXPECT_DOUBLE_EQ(difference[0], 5.0) | EXPECT_DOUBLE_EQ(difference[1], -7.0) | EXPECT_DOUBLE_EQ(difference[2], -3.0) | EXPECT_DOUBLE_EQ(scaled[0], -2.0) | EXPECT_DOUBLE_EQ(scaled[1], 4.0) | EXPECT_DOUBLE_EQ(scaled[2], -6.0) | EXPECT_DOUBLE_EQ(divided[0], -0.5) | EXPECT_DOUBLE_EQ(divided[1], 1.0) | EXPECT_DOUBLE_EQ(divided[2], -1.5) EXPECT_DOUBLE_EQ(lhs.X(), 1.0) | EXPECT_DOUBLE_EQ(lhs.Y(), -2.0) | EXPECT_DOUBLE_EQ(lhs.Z(), 3.0) | EXPECT_DOUBLE_EQ(lhs[0], 1.0) | EXPECT_DOUBLE_EQ(lhs[1], -2.0) | EXPECT_DOUBLE_EQ(lhs[2], 3.0) | EXPECT_DOUBLE_EQ(sum[0], -3.0) | EXPECT_DOUBLE_EQ(sum[1], 3.0) | EXPECT_DOUBLE_EQ(sum[2], 9.0) | EXPECT_DOUBLE_EQ(difference[0], 5.0) | EXPECT_DOUBLE_EQ(difference[1], -7.0) | EXPECT_DOUBLE_EQ(difference[2], -3.0) | EXPECT_DOUBLE_EQ(scaled[0], -2.0) | EXPECT_DOUBLE_EQ(scaled[1], 4.0) | EXPECT_DOUBLE_EQ(scaled[2], -6.0) | EXPECT_DOUBLE_EQ(divided[0], -0.5) | EXPECT_DOUBLE_EQ(divided[1], 1.0) | EXPECT_DOUBLE_EQ(divided[2], -1.5) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder; assertion 6개 tests/unit/math/vector3_test.cpp Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder 유지 원문 검사 body 및 assertion 동일. 1f659f46fd78ea02d6456c20cf865a637d8d3e4f2ac5d5fe89ba27741a28c058 1f659f46fd78ea02d6456c20cf865a637d8d3e4f2ac5d5fe89ba27741a28c058 EXPECT_TRUE(value == Vector3(1.25, -2.5, 5.0)) | EXPECT_FALSE(value == Vector3(1.25, -2.5, 4.0)) | EXPECT_EQ(value.Components(), kComponents) | EXPECT_DOUBLE_EQ(scaled.X(), -2.5) | EXPECT_DOUBLE_EQ(scaled.Y(), 5.0) | EXPECT_DOUBLE_EQ(scaled.Z(), -10.0) EXPECT_TRUE(value == Vector3(1.25, -2.5, 5.0)) | EXPECT_FALSE(value == Vector3(1.25, -2.5, 4.0)) | EXPECT_EQ(value.Components(), kComponents) | EXPECT_DOUBLE_EQ(scaled.X(), -2.5) | EXPECT_DOUBLE_EQ(scaled.Y(), 5.0) | EXPECT_DOUBLE_EQ(scaled.Z(), -10.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.ComputesDotProduct Vector3.ComputesDotProduct; assertion 1개 tests/unit/math/vector3_test.cpp Vector3.ComputesDotProduct 유지 원문 검사 body 및 assertion 동일. 6347f32d63b18e488dfb6a66c9bd3efc2c84beb950b8746efb888bbb580722d7 6347f32d63b18e488dfb6a66c9bd3efc2c84beb950b8746efb888bbb580722d7 EXPECT_DOUBLE_EQ(lhs.Dot(rhs), 12.0) EXPECT_DOUBLE_EQ(lhs.Dot(rhs), 12.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.UsesRightHandedCrossProductOrientation Vector3.UsesRightHandedCrossProductOrientation; assertion 6개 tests/unit/math/vector3_test.cpp Vector3.UsesRightHandedCrossProductOrientation 유지 원문 검사 body 및 assertion 동일. f179b78f12bc066ce442f293298397b5fcc9fe03fce8fbd348f33c5fcd13a24a f179b78f12bc066ce442f293298397b5fcc9fe03fce8fbd348f33c5fcd13a24a EXPECT_DOUBLE_EQ(positive_z.X(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Z(), 1.0) | EXPECT_DOUBLE_EQ(negative_z.X(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Z(), -1.0) EXPECT_DOUBLE_EQ(positive_z.X(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Z(), 1.0) | EXPECT_DOUBLE_EQ(negative_z.X(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Z(), -1.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.ComputesEuclideanNorm Vector3.ComputesEuclideanNorm; assertion 2개 tests/unit/math/vector3_test.cpp Vector3.ComputesEuclideanNorm 유지 원문 검사 body 및 assertion 동일. 2a865b62e7bd8940e5c9db652503bcd28230dfd4abb9f74a4a91282f0d917499 2a865b62e7bd8940e5c9db652503bcd28230dfd4abb9f74a4a91282f0d917499 EXPECT_DOUBLE_EQ(Vector3(2.0, -3.0, 6.0).Norm(), 7.0) | EXPECT_DOUBLE_EQ(Vector3(1.0e308, 1.0e308, 0.0).Norm(), expected) EXPECT_DOUBLE_EQ(Vector3(2.0, -3.0, 6.0).Norm(), 7.0) | EXPECT_DOUBLE_EQ(Vector3(1.0e308, 1.0e308, 0.0).Norm(), expected) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.NormalizesNonzeroVectors Vector3.NormalizesNonzeroVectors; assertion 4개 tests/unit/math/vector3_test.cpp Vector3.NormalizesNonzeroVectors 유지 원문 검사 body 및 assertion 동일. 6aeabf80f8c56ed0db4cfff4658f47caa3550cc1c042a295dd95dce791e6f329 6aeabf80f8c56ed0db4cfff4658f47caa3550cc1c042a295dd95dce791e6f329 ASSERT_TRUE(normalized.has_value()) | EXPECT_DOUBLE_EQ(normalized->X(), 0.6) | EXPECT_DOUBLE_EQ(normalized->Y(), 0.0) | EXPECT_DOUBLE_EQ(normalized->Z(), 0.8) ASSERT_TRUE(normalized.has_value()) | EXPECT_DOUBLE_EQ(normalized->X(), 0.6) | EXPECT_DOUBLE_EQ(normalized->Y(), 0.0) | EXPECT_DOUBLE_EQ(normalized->Z(), 0.8) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.ReportsFiniteComponents Vector3.ReportsFiniteComponents; assertion 3개 tests/unit/math/vector3_test.cpp Vector3.ReportsFiniteComponents 유지 원문 검사 body 및 assertion 동일. 5ff94e5120d1add8e2e3242698c75c0444e4c7d25ea530eb8adca0d48757cd96 5ff94e5120d1add8e2e3242698c75c0444e4c7d25ea530eb8adca0d48757cd96 EXPECT_TRUE(Vector3(1.0, -2.0, 3.0).IsFinite()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).IsFinite()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).IsFinite()) EXPECT_TRUE(Vector3(1.0, -2.0, 3.0).IsFinite()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).IsFinite()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).IsFinite()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp Vector3.RejectsZeroAndNonfiniteNormalization Vector3.RejectsZeroAndNonfiniteNormalization; assertion 3개 tests/unit/math/vector3_test.cpp Vector3.RejectsZeroAndNonfiniteNormalization 유지 원문 검사 body 및 assertion 동일. cf0551716b1fac7a6af4c3690316df8e7059b681ba04d6a3dbf376c44c8ab8bb cf0551716b1fac7a6af4c3690316df8e7059b681ba04d6a3dbf376c44c8ab8bb EXPECT_FALSE(Vector3().Normalized().has_value()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).Normalized().has_value()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).Normalized().has_value()) EXPECT_FALSE(Vector3().Normalized().has_value()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).Normalized().has_value()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).Normalized().has_value()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp support@1-12 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector3_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a62e51f185970f04141b3a9d4bb5cda154999b19e74598b53adc1365e34f422 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector3_test.cpp support@114-116 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector3_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/math/vector_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4b7cd27e186d0cc818854d87e9540d182e952dfc2c3a372f67a656f4d4d4b873 d1f3266cdc2f7f4c586e7512fe090580a641b270ebe8b0525660fa4e737c788c 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector_test.cpp DenseMath.VectorOwnsAndChecksContiguousStorage DenseMath.VectorOwnsAndChecksContiguousStorage; assertion 31개 tests/unit/math/vector_test.cpp DenseMath.VectorOwnsAndChecksContiguousStorage 유지 원문 검사 body 및 assertion 동일. 4633911f5df21402045699292987f7ed2cec457b562c80c628cfaaea6c7d73ca 4633911f5df21402045699292987f7ed2cec457b562c80c628cfaaea6c7d73ca EXPECT_EQ(empty.Size(), 0U) | EXPECT_DOUBLE_EQ(empty.Norm(), 0.0) | EXPECT_NO_THROW(empty.Scale(3.0)) | EXPECT_NO_THROW(empty.Axpy(-2.0, Vector{0})) | EXPECT_THROW(static_cast(empty[0]), std::out_of_range) | EXPECT_EQ(original.Data() + 1, &original[1]) | EXPECT_EQ(original.Data() + 2, &original[2]) | EXPECT_EQ(const_original.Data() + 2, &const_original[2]) | EXPECT_NE(copied.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[0], 1.0) | EXPECT_NE(copy_assigned.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[1], -2.0) | EXPECT_EQ(copied.Size(), 0U) | EXPECT_EQ(moved.Size(), 3U) | EXPECT_DOUBLE_EQ(moved[0], 99.0) | EXPECT_NO_THROW(copied.Scale(4.0)) | EXPECT_EQ(copy_assigned.Size(), 0U) | EXPECT_EQ(move_assigned.Size(), 3U) | EXPECT_DOUBLE_EQ(move_assigned[1], 17.0) | EXPECT_DOUBLE_EQ(original.Dot(rhs), -24.0) | EXPECT_NEAR(original.Norm(), std::sqrt(14.0), 1.0e-15) | EXPECT_DOUBLE_EQ(scaled[0], -0.5) | EXPECT_DOUBLE_EQ(scaled[1], 1.0) | EXPECT_DOUBLE_EQ(scaled[2], -1.5) | EXPECT_DOUBLE_EQ(accumulated[0], 9.0) | EXPECT_DOUBLE_EQ(accumulated[1], 0.0) | EXPECT_DOUBLE_EQ(accumulated[2], 4.0) | EXPECT_THROW(static_cast(original[3]), std::out_of_range) | EXPECT_THROW(static_cast(const_original[3]), std::out_of_range) | EXPECT_THROW(static_cast(original.Dot(Vector{2})), std::invalid_argument) | EXPECT_THROW(original.Axpy(1.0, Vector{2}), std::invalid_argument) EXPECT_EQ(empty.Size(), 0U) | EXPECT_DOUBLE_EQ(empty.Norm(), 0.0) | EXPECT_NO_THROW(empty.Scale(3.0)) | EXPECT_NO_THROW(empty.Axpy(-2.0, Vector{0})) | EXPECT_THROW(static_cast(empty[0]), std::out_of_range) | EXPECT_EQ(original.Data() + 1, &original[1]) | EXPECT_EQ(original.Data() + 2, &original[2]) | EXPECT_EQ(const_original.Data() + 2, &const_original[2]) | EXPECT_NE(copied.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[0], 1.0) | EXPECT_NE(copy_assigned.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[1], -2.0) | EXPECT_EQ(copied.Size(), 0U) | EXPECT_EQ(moved.Size(), 3U) | EXPECT_DOUBLE_EQ(moved[0], 99.0) | EXPECT_NO_THROW(copied.Scale(4.0)) | EXPECT_EQ(copy_assigned.Size(), 0U) | EXPECT_EQ(move_assigned.Size(), 3U) | EXPECT_DOUBLE_EQ(move_assigned[1], 17.0) | EXPECT_DOUBLE_EQ(original.Dot(rhs), -24.0) | EXPECT_NEAR(original.Norm(), std::sqrt(14.0), 1.0e-15) | EXPECT_DOUBLE_EQ(scaled[0], -0.5) | EXPECT_DOUBLE_EQ(scaled[1], 1.0) | EXPECT_DOUBLE_EQ(scaled[2], -1.5) | EXPECT_DOUBLE_EQ(accumulated[0], 9.0) | EXPECT_DOUBLE_EQ(accumulated[1], 0.0) | EXPECT_DOUBLE_EQ(accumulated[2], 4.0) | EXPECT_THROW(static_cast(original[3]), std::out_of_range) | EXPECT_THROW(static_cast(const_original[3]), std::out_of_range) | EXPECT_THROW(static_cast(original.Dot(Vector{2})), std::invalid_argument) | EXPECT_THROW(original.Axpy(1.0, Vector{2}), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector_test.cpp support@1-11 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 96aa1fb84a7742cdba9c1c10cb981ccf1f0ccbadc5dac79505807963fac75708 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/math/vector_test.cpp support@85-87 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/model/domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/model/domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fc0dd95c444cac746db6083b88376bc8365ccd7d26790dd0dd6d51c3f41d6f77 fc0dd95c444cac746db6083b88376bc8365ccd7d26790dd0dd6d51c3f41d6f77 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/domain_test.cpp ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder; assertion 26개 tests/unit/model/domain_test.cpp ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder 유지 원문 검사 body 및 assertion 동일. f00cd134923f2e7389d5f87d43f04e6608137532bb437bdcc0affa9cae01e560 f00cd134923f2e7389d5f87d43f04e6608137532bb437bdcc0affa9cae01e560 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Elements().Size(), 2U) | EXPECT_EQ(beam.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(beam.SourceId().source_label_text, ""0007"") | EXPECT_EQ(beam.SourceElementType(), ""B33"") | EXPECT_EQ(beam.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(beam.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(beam.PropertyIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(shell.SourceId().source_label_text, ""0009"") | EXPECT_EQ(shell.SourceElementType(), ""S4R"") | EXPECT_EQ(shell.NodeIndices(), (std::vector{2U, 3U, 4U, 5U})) | EXPECT_EQ(shell.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.PropertyIndex(), fesa::EntityIndex{1U}) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | ASSERT_EQ(domain.ShellElements().Size(), 1U) | EXPECT_EQ(&domain.BeamElements()[0U], &beam) | EXPECT_EQ(&domain.ShellElements()[0U], &shell) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(&domain.LinearElasticMaterials()[0U], &domain.Materials()[0U]) | ASSERT_EQ(domain.Properties().Size(), 2U) | EXPECT_EQ(domain.Properties()[0U].Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(domain.Properties()[1U].Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(&domain.Sections()[0U], &domain.Properties()[0U]) | EXPECT_EQ(&domain.ShellSections()[0U], &domain.Properties()[1U])" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Elements().Size(), 2U) | EXPECT_EQ(beam.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(beam.SourceId().source_label_text, ""0007"") | EXPECT_EQ(beam.SourceElementType(), ""B33"") | EXPECT_EQ(beam.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(beam.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(beam.PropertyIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(shell.SourceId().source_label_text, ""0009"") | EXPECT_EQ(shell.SourceElementType(), ""S4R"") | EXPECT_EQ(shell.NodeIndices(), (std::vector{2U, 3U, 4U, 5U})) | EXPECT_EQ(shell.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.PropertyIndex(), fesa::EntityIndex{1U}) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | ASSERT_EQ(domain.ShellElements().Size(), 1U) | EXPECT_EQ(&domain.BeamElements()[0U], &beam) | EXPECT_EQ(&domain.ShellElements()[0U], &shell) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(&domain.LinearElasticMaterials()[0U], &domain.Materials()[0U]) | ASSERT_EQ(domain.Properties().Size(), 2U) | EXPECT_EQ(domain.Properties()[0U].Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(domain.Properties()[1U].Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(&domain.Sections()[0U], &domain.Properties()[0U]) | EXPECT_EQ(&domain.ShellSections()[0U], &domain.Properties()[1U])" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/domain_test.cpp DomainModel.ImmutableOwnershipPreservesStableOrder DomainModel.ImmutableOwnershipPreservesStableOrder; assertion 33개 tests/unit/model/domain_test.cpp DomainModel.ImmutableOwnershipPreservesStableOrder 유지 원문 검사 body 및 assertion 동일. c6f7163bdaff86cf5fff21c3d9f5a0f5770dbdecd62f5af2fa64376558bc75b3 c6f7163bdaff86cf5fff21c3d9f5a0f5770dbdecd62f5af2fa64376558bc75b3 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.SourcePath(), std::filesystem::path{""models/owned.inp""}) | EXPECT_EQ(domain.SourceContentIdentity(), ""fnv1a64:fedcba9876543210"") | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0020"") | EXPECT_DOUBLE_EQ(domain.Nodes()[0].coordinates[0], 2.0) | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes().data(), first_node_address) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[1], 0U) | ASSERT_EQ(domain.Materials().Size(), 1U) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.Sections()[0].section_points[0][0], -0.1) | ASSERT_EQ(domain.NodeSets().size(), 1U) | EXPECT_EQ(domain.NodeSets()[0].node_indices[0], 0U) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(domain.ElementSets()[0].element_indices[0], 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(domain.Steps()[0].InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(domain.Steps()[0].TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MinimumIncrement(), 1.0e-5) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MaximumIncrement(), 1.0) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | ASSERT_EQ(domain.Steps()[0].BoundaryConditions().size(), 6U) | ASSERT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[2U], -1000.0) | ASSERT_EQ(domain.Warnings().size(), 1U) | EXPECT_EQ(domain.Warnings()[0].code, ""ignored-output-request"")" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.SourcePath(), std::filesystem::path{""models/owned.inp""}) | EXPECT_EQ(domain.SourceContentIdentity(), ""fnv1a64:fedcba9876543210"") | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0020"") | EXPECT_DOUBLE_EQ(domain.Nodes()[0].coordinates[0], 2.0) | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes().data(), first_node_address) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[1], 0U) | ASSERT_EQ(domain.Materials().Size(), 1U) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.Sections()[0].section_points[0][0], -0.1) | ASSERT_EQ(domain.NodeSets().size(), 1U) | EXPECT_EQ(domain.NodeSets()[0].node_indices[0], 0U) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(domain.ElementSets()[0].element_indices[0], 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(domain.Steps()[0].InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(domain.Steps()[0].TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MinimumIncrement(), 1.0e-5) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MaximumIncrement(), 1.0) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | ASSERT_EQ(domain.Steps()[0].BoundaryConditions().size(), 6U) | ASSERT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[2U], -1000.0) | ASSERT_EQ(domain.Warnings().size(), 1U) | EXPECT_EQ(domain.Warnings()[0].code, ""ignored-output-request"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/domain_test.cpp DomainModel.MultipleIdentityInstancesDoNotMerge DomainModel.MultipleIdentityInstancesDoNotMerge; assertion 14개 tests/unit/model/domain_test.cpp DomainModel.MultipleIdentityInstancesDoNotMerge 유지 원문 검사 body 및 assertion 동일. af47d90dfe03fde953119eb419e7f2dc83bbc9da3cab2a7a9a4bc70935e11dbb af47d90dfe03fde953119eb419e7f2dc83bbc9da3cab2a7a9a4bc70935e11dbb "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""1"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label_text, ""1"") | EXPECT_NE(domain.Nodes()[0].source_id.instance_name, domain.Nodes()[2].source_id.instance_name) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[1].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""Instance-A"") | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Instance-B"") | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 0U) | EXPECT_EQ(domain.BeamElements()[1].node_indices[0], 2U)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""1"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label_text, ""1"") | EXPECT_NE(domain.Nodes()[0].source_id.instance_name, domain.Nodes()[2].source_id.instance_name) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[1].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""Instance-A"") | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Instance-B"") | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 0U) | EXPECT_EQ(domain.BeamElements()[1].node_indices[0], 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/domain_test.cpp DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames; assertion 22개 tests/unit/model/domain_test.cpp DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames 유지 원문 검사 body 및 assertion 동일. 4809f2a671c479fb442749d6d34966a00045cb2fd1d23f849a78fde2982fb76a 4809f2a671c479fb442749d6d34966a00045cb2fd1d23f849a78fde2982fb76a "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ShellElements().Size(), 2U) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label, 20) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0020"") | EXPECT_EQ(domain.ShellElements()[1].source_id.source_label, 10) | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices[3], 7U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""Section-B"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.02) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""Section-A"") | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), 2U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 4U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_TRUE(no_frames_result.HasValue()) | EXPECT_TRUE(no_frames_result.Value().ShellNodeInitialFrames().empty())" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ShellElements().Size(), 2U) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label, 20) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0020"") | EXPECT_EQ(domain.ShellElements()[1].source_id.source_label, 10) | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices[3], 7U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""Section-B"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.02) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""Section-A"") | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), 2U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 4U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_TRUE(no_frames_result.HasValue()) | EXPECT_TRUE(no_frames_result.Value().ShellNodeInitialFrames().empty())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/domain_test.cpp support@1-70 helper/oracle/fixture/include/static assertion 구간: MakeOwnedDefinition tests/unit/model/domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7f7d1304d91efcd8a4c1dd7ba01764f329b43c89d1282657290910bb34a13014 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/domain_test.cpp support@294-295 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eb5700ab2d23b38315cc91249e1dafb93f72ad934048c13f25c663dc769e2529 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/model_types_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/model/model_types_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8e73c0944e4a0592a63c397fe368b2568b35f9b176af5cb8a5f7eb409dd4556c 8e73c0944e4a0592a63c397fe368b2568b35f9b176af5cb8a5f7eb409dd4556c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/model_types_test.cpp DomainModel.SourceAndInternalIdentityRemainDistinct DomainModel.SourceAndInternalIdentityRemainDistinct; assertion 18개 tests/unit/model/model_types_test.cpp DomainModel.SourceAndInternalIdentityRemainDistinct 유지 원문 검사 body 및 assertion 동일. 1a34a5d22cd39f263dbb8fd33c71d7018509fd118804b50f3f683e33c3b8614f 1a34a5d22cd39f263dbb8fd33c71d7018509fd118804b50f3f683e33c3b8614f "EXPECT_EQ( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(equal_identity.instance_name, equal_identity.source_label, equal_identity.source_label_text)) | EXPECT_LT( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(later_identity.instance_name, later_identity.source_label, later_identity.source_label_text)) | ASSERT_EQ(definition.nodes.size(), 1U) | EXPECT_EQ(definition.nodes[0].source_id.source_label_text, ""0007"") | EXPECT_EQ(definition.nodes[0].location.line, 11U) | ASSERT_EQ(definition.instances.size(), 1U) | EXPECT_EQ(definition.instances[0].part_name, ""BeamPart"") | EXPECT_EQ(definition.instances[0].node_mappings[0].source_label, 7) | EXPECT_EQ(definition.instances[0].node_mappings[0].internal_index, 5U) | EXPECT_EQ(definition.instances[0].element_mappings[0].internal_index, 4U) | EXPECT_EQ(definition.steps[0].initial_increment, 0.1) | EXPECT_EQ(definition.steps[0].time_period, 1.0) | EXPECT_EQ(definition.steps[0].minimum_increment, 1.0e-5) | EXPECT_EQ(definition.steps[0].maximum_increment, 1.0) | EXPECT_EQ(definition.steps[0].procedure_kind, fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(definition.steps[0].nlgeom) | ASSERT_EQ(definition.warnings.size(), 1U) | EXPECT_EQ(definition.warnings[0].location.line, 75U)" "EXPECT_EQ( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(equal_identity.instance_name, equal_identity.source_label, equal_identity.source_label_text)) | EXPECT_LT( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(later_identity.instance_name, later_identity.source_label, later_identity.source_label_text)) | ASSERT_EQ(definition.nodes.size(), 1U) | EXPECT_EQ(definition.nodes[0].source_id.source_label_text, ""0007"") | EXPECT_EQ(definition.nodes[0].location.line, 11U) | ASSERT_EQ(definition.instances.size(), 1U) | EXPECT_EQ(definition.instances[0].part_name, ""BeamPart"") | EXPECT_EQ(definition.instances[0].node_mappings[0].source_label, 7) | EXPECT_EQ(definition.instances[0].node_mappings[0].internal_index, 5U) | EXPECT_EQ(definition.instances[0].element_mappings[0].internal_index, 4U) | EXPECT_EQ(definition.steps[0].initial_increment, 0.1) | EXPECT_EQ(definition.steps[0].time_period, 1.0) | EXPECT_EQ(definition.steps[0].minimum_increment, 1.0e-5) | EXPECT_EQ(definition.steps[0].maximum_increment, 1.0) | EXPECT_EQ(definition.steps[0].procedure_kind, fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(definition.steps[0].nlgeom) | ASSERT_EQ(definition.warnings.size(), 1U) | EXPECT_EQ(definition.warnings[0].location.line, 75U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/model_types_test.cpp DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity; assertion 10개 tests/unit/model/model_types_test.cpp DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity 유지 원문 검사 body 및 assertion 동일. 3792a5dbf6bafaea0771dd6167e4dad3d5b97f16d4af9fea1beaad7163bd0757 3792a5dbf6bafaea0771dd6167e4dad3d5b97f16d4af9fea1beaad7163bd0757 "EXPECT_EQ(s4_element.source_id.instance_name, ""Shell-Instance"") | EXPECT_EQ(s4_element.source_id.source_label, 41) | EXPECT_EQ(s4_element.source_id.source_label_text, ""0041"") | EXPECT_EQ(s4_element.source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(s4r_element.source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_NE(s4_element.source_type, s4r_element.source_type) | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | EXPECT_EQ(s4_element.node_indices, (std::array{3U, 5U, 8U, 13U})) | EXPECT_EQ(s4_element.material_index, 2U) | EXPECT_EQ(s4_element.section_index, 7U)" "EXPECT_EQ(s4_element.source_id.instance_name, ""Shell-Instance"") | EXPECT_EQ(s4_element.source_id.source_label, 41) | EXPECT_EQ(s4_element.source_id.source_label_text, ""0041"") | EXPECT_EQ(s4_element.source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(s4r_element.source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_NE(s4_element.source_type, s4r_element.source_type) | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | EXPECT_EQ(s4_element.node_indices, (std::array{3U, 5U, 8U, 13U})) | EXPECT_EQ(s4_element.material_index, 2U) | EXPECT_EQ(s4_element.section_index, 7U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/model_types_test.cpp support@1-32 helper/oracle/fixture/include/static assertion 구간: T, HasEquationId, HasEquationIds tests/unit/model/model_types_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bd6932bd12576c905f4c5d95d7902dba5b9be6626cdbee2a8299ecb10b7238c7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/model_types_test.cpp support@133-134 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/model_types_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7dc636d3db680b7c9af260eae733472a8fbad5992eea8384efe301c7ff01862c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/shell_geometry_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/model/shell_geometry_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9fee2fde5365fea4144fc87591e88e48dfd45376f3dd0ead45f9b7246fff1b3f 3abea01e7cb6543d3f25106cfa97ad5f94c9166a91bf90fbd390a700401d6d9f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements; assertion 7개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements 유지 원문 검사 body 및 assertion 동일. 89a2ec45af8b97d1f42896e1d0107362659e83a893cf60d7d679786c36f20afe 89a2ec45af8b97d1f42896e1d0107362659e83a893cf60d7d679786c36f20afe ASSERT_TRUE(planar.HasValue()) | ASSERT_EQ(planar.Value().element_data.size(), 1U) | EXPECT_NEAR(planar.Value().element_data[0].surface_area_weight, 1.0, 1.0e-12) | ASSERT_EQ(planar.Value().nodal_frames.size(), 4U) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(warped.HasValue()) | EXPECT_GT(warped.Value().element_data[0].surface_area_weight, 2.0) ASSERT_TRUE(planar.HasValue()) | ASSERT_EQ(planar.Value().element_data.size(), 1U) | EXPECT_NEAR(planar.Value().element_data[0].surface_area_weight, 1.0, 1.0e-12) | ASSERT_EQ(planar.Value().nodal_frames.size(), 4U) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(warped.HasValue()) | EXPECT_GT(warped.Value().element_data[0].surface_area_weight, 2.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration; assertion 14개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration 유지 원문 검사 body 및 assertion 동일. c2020cdfcdb7453af2d1504928200ed4e401c22a150f8e0d0b043ef7f27bbdc6 c2020cdfcdb7453af2d1504928200ed4e401c22a150f8e0d0b043ef7f27bbdc6 ASSERT_TRUE(warped.HasValue()) | EXPECT_DOUBLE_EQ(normal.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(normal.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(normal.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(element.surface_area_weight, 0x1.021ebe8f40622p+1) | EXPECT_DOUBLE_EQ(director.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(director.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(director.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(tangent_a.X(), 0x1.ff5e152c2d2abp-1) | EXPECT_DOUBLE_EQ(tangent_a.Y(), -0x1.4408ec773d925p-8) | EXPECT_DOUBLE_EQ(tangent_a.Z(), 0x1.950b27950cf6dp-5) | EXPECT_DOUBLE_EQ(tangent_b.X(), 0.0) | EXPECT_DOUBLE_EQ(tangent_b.Y(), 0x1.fd7583bc82e28p-1) | EXPECT_DOUBLE_EQ(tangent_b.Z(), 0x1.9791363068b53p-4) ASSERT_TRUE(warped.HasValue()) | EXPECT_DOUBLE_EQ(normal.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(normal.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(normal.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(element.surface_area_weight, 0x1.021ebe8f40622p+1) | EXPECT_DOUBLE_EQ(director.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(director.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(director.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(tangent_a.X(), 0x1.ff5e152c2d2abp-1) | EXPECT_DOUBLE_EQ(tangent_a.Y(), -0x1.4408ec773d925p-8) | EXPECT_DOUBLE_EQ(tangent_a.Z(), 0x1.950b27950cf6dp-5) | EXPECT_DOUBLE_EQ(tangent_b.X(), 0.0) | EXPECT_DOUBLE_EQ(tangent_b.Y(), 0x1.fd7583bc82e28p-1) | EXPECT_DOUBLE_EQ(tangent_b.Z(), 0x1.9791363068b53p-4) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder; assertion 2개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder 유지 원문 검사 body 및 assertion 동일. c24fcef294b948a5b0cdbd9fa0822d7d6f18aa2e106569c357417a0f396e89fa c24fcef294b948a5b0cdbd9fa0822d7d6f18aa2e106569c357417a0f396e89fa ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases; assertion 0개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases 유지 원문 검사 body 및 assertion 동일. 78afdfd80554bc5d9c2e688f0a7ee1213acaa0be1ba804306d6973825b1447e0 78afdfd80554bc5d9c2e688f0a7ee1213acaa0be1ba804306d6973825b1447e0 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory; assertion 12개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory 유지 원문 검사 body 및 assertion 동일. 0de2e1387e20a29baff982dcaf0fba7b261415b3a5a39c9c635e20f1529aff05 0de2e1387e20a29baff982dcaf0fba7b261415b3a5a39c9c635e20f1529aff05 ASSERT_EQ(points.size(), 17U) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kCenter; }), 1) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kStiffness; }), 8) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kTying; }), 4) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kRecovery; }), 4) | EXPECT_EQ(points.front().natural_coordinates, (Vector3{0.0, 0.0, 0.0})) | EXPECT_EQ(points[1].natural_coordinates, (Vector3{-gauss, -gauss, -gauss})) | EXPECT_EQ(points[8].natural_coordinates, (Vector3{-gauss, gauss, gauss})) | EXPECT_EQ(points[9].natural_coordinates, (Vector3{0.0, -1.0, 0.0})) | EXPECT_EQ(points[12].natural_coordinates, (Vector3{1.0, 0.0, 0.0})) | EXPECT_EQ(points[13].natural_coordinates, (Vector3{-gauss, -gauss, 0.0})) | EXPECT_EQ(points[16].natural_coordinates, (Vector3{-gauss, gauss, 0.0})) ASSERT_EQ(points.size(), 17U) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kCenter; }), 1) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kStiffness; }), 8) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kTying; }), 4) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kRecovery; }), 4) | EXPECT_EQ(points.front().natural_coordinates, (Vector3{0.0, 0.0, 0.0})) | EXPECT_EQ(points[1].natural_coordinates, (Vector3{-gauss, -gauss, -gauss})) | EXPECT_EQ(points[8].natural_coordinates, (Vector3{-gauss, gauss, gauss})) | EXPECT_EQ(points[9].natural_coordinates, (Vector3{0.0, -1.0, 0.0})) | EXPECT_EQ(points[12].natural_coordinates, (Vector3{1.0, 0.0, 0.0})) | EXPECT_EQ(points[13].natural_coordinates, (Vector3{-gauss, -gauss, 0.0})) | EXPECT_EQ(points[16].natural_coordinates, (Vector3{-gauss, gauss, 0.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/shell_geometry_test.cpp support@1-91 helper/oracle/fixture/include/static assertion 구간: Node, Element, Sections, Dot, Cross, Norm, ExpectVectorNear, ExpectRightHandedFrame, FrameFor, find_if, ExpectFailureCode tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7fecde30f91624d167ea26a62c28b4f280b502b07cb5999ed2668cb5db8dcdc8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/shell_geometry_test.cpp support@166-167 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2511c5276f8f705a4d47ef40ba5103972050738b68fd8a2714f3fd319f718b5c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/shell_geometry_test.cpp support@193-194 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3cb49d9660c0150c0645878e98e94da458f371a63d9cf921dafed78d62b6a4a0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/shell_geometry_test.cpp support@247-248 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 05e26e807ccadaa099d4dc20c9590ec3fa57343328b240c1ed2d4dc9086c1321 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/source_target_resolver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/model/source_target_resolver_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0fd2a3f57be9e3dcc6a0710f23d07618b100d9f8fa6d46945bf7951063145ebb 5868bd88560af25dea83f385748c40d274712c9dc28a344fca03f3cab760f8d1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder; assertion 10개 tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder 유지 원문 검사 body 및 assertion 동일. 371f5279d1b122a9821fe2fa2e841a01f0c7f317f4824c7f1a10eb65bda481be 371f5279d1b122a9821fe2fa2e841a01f0c7f317f4824c7f1a10eb65bda481be "ASSERT_TRUE(nodes.HasValue()) | EXPECT_EQ(Indices(nodes.Value()), (std::vector{0U, 1U})) | EXPECT_EQ(nodes.Value()[0U].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(nodes.Value()[0U].source_id.source_label_text, ""0010"") | ASSERT_TRUE(elements.HasValue()) | EXPECT_EQ(Indices(elements.Value()), (std::vector{4U})) | ASSERT_TRUE(second_instance.HasValue()) | EXPECT_EQ(Indices(second_instance.Value()), (std::vector{2U})) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(Indices(direct.Value()), (std::vector{0U}))" "ASSERT_TRUE(nodes.HasValue()) | EXPECT_EQ(Indices(nodes.Value()), (std::vector{0U, 1U})) | EXPECT_EQ(nodes.Value()[0U].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(nodes.Value()[0U].source_id.source_label_text, ""0010"") | ASSERT_TRUE(elements.HasValue()) | EXPECT_EQ(Indices(elements.Value()), (std::vector{4U})) | ASSERT_TRUE(second_instance.HasValue()) | EXPECT_EQ(Indices(second_instance.Value()), (std::vector{2U})) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(Indices(direct.Value()), (std::vector{0U}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets; assertion 0개 tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets 유지 원문 검사 body 및 assertion 동일. 7a11d0e9feb5f2c40349b3fc51279e275ea27d6030de1e9489786952e1444aef 7a11d0e9feb5f2c40349b3fc51279e275ea27d6030de1e9489786952e1444aef 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder; assertion 7개 tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder 유지 원문 검사 body 및 assertion 동일. 8f72fa1e1fbb347fed00f0ae99086e57086d43ac80984243f2c5ee20bb141c29 8f72fa1e1fbb347fed00f0ae99086e57086d43ac80984243f2c5ee20bb141c29 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 2U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].message, ""Duplicate resolved source target 20."") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].message, ""Duplicate resolved source target 10."")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 2U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].message, ""Duplicate resolved source target 20."") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].message, ""Duplicate resolved source target 10."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/source_target_resolver_test.cpp support@1-52 helper/oracle/fixture/include/static assertion 구간: Entry, Indices, for, ExpectFailure tests/unit/model/source_target_resolver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cea5c6ff21dff6057da6621ea47cd0fcb5ec20f1f524551e8bae951791033aa8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/thermal_semantics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/model/thermal_semantics_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e35fdae0a9d314a157526b4ebd72ff54eef3f8123b3646fd8f5f3c50b39bbaea e35fdae0a9d314a157526b4ebd72ff54eef3f8123b3646fd8f5f3c50b39bbaea 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/thermal_semantics_test.cpp ThermalDomain.StructuralDefinitionHasNoThermalStep ThermalDomain.StructuralDefinitionHasNoThermalStep; assertion 2개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.StructuralDefinitionHasNoThermalStep 유지 원문 검사 body 및 assertion 동일. 5109e39fa2bd304e84323c45a63bff6d6948c4f8e385006533847d897edbb852 5109e39fa2bd304e84323c45a63bff6d6948c4f8e385006533847d897edbb852 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalStep(), nullptr) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalStep(), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp IsotropicThermalMaterial.RequiresFinitePositivePropertiesAndIdentity IsotropicThermalMaterial.RequiresFinitePositivePropertiesAndIdentity; assertion 9개 tests/unit/model/thermal_semantics_test.cpp IsotropicThermalMaterial.RequiresFinitePositivePropertiesAndIdentity 유지 원문 검사 body 및 assertion 동일. 3eec96a6aa43b48716c7ef05b78fc8e81f08777ca547164a676e7ba5b64987ee 3eec96a6aa43b48716c7ef05b78fc8e81f08777ca547164a676e7ba5b64987ee "ASSERT_TRUE(valid.HasValue()) | EXPECT_EQ(valid.Value().Kind(), fesa::MaterialKind::kIsotropicThermal) | EXPECT_DOUBLE_EQ(valid.Value().Conductivity(), 45.0) | EXPECT_DOUBLE_EQ(valid.Value().Density(), 7800.0) | EXPECT_DOUBLE_EQ(valid.Value().SpecificHeat(), 500.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create({"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 0.0, 500.0, Location()) .HasValue()) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create( {"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 7800.0, std::numeric_limits::quiet_NaN(), Location()) .HasValue())" "ASSERT_TRUE(valid.HasValue()) | EXPECT_EQ(valid.Value().Kind(), fesa::MaterialKind::kIsotropicThermal) | EXPECT_DOUBLE_EQ(valid.Value().Conductivity(), 45.0) | EXPECT_DOUBLE_EQ(valid.Value().Density(), 7800.0) | EXPECT_DOUBLE_EQ(valid.Value().SpecificHeat(), 500.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create({"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 0.0, 500.0, Location()) .HasValue()) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create( {"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 7800.0, std::numeric_limits::quiet_NaN(), Location()) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp ThermalDomain.OwnsFiveStationDefinitionsWithoutEquationState ThermalDomain.OwnsFiveStationDefinitionsWithoutEquationState; assertion 11개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.OwnsFiveStationDefinitionsWithoutEquationState 유지 원문 검사 body 및 assertion 동일. e6d226842e76067fc438dfd669bd073c05be7a9be7895ab909ad06d4ab8a0e72 e6d226842e76067fc438dfd669bd073c05be7a9be7895ab909ad06d4ab8a0e72 ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].Kind(), fesa::ElementDefinitionKind::kDs4Thermal) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | EXPECT_EQ(domain.ThermalElements()[0U].NodeIndices(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ThermalInitialConditions()[0U].station_values, (std::array{12.5, 12.5, 12.5, 12.5, 12.5})) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0U].value, 20.0) | EXPECT_EQ(domain.ThermalStep()->Loads()[0U].source_order, 0U) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kBottom), 11) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kTop), 15) ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].Kind(), fesa::ElementDefinitionKind::kDs4Thermal) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | EXPECT_EQ(domain.ThermalElements()[0U].NodeIndices(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ThermalInitialConditions()[0U].station_values, (std::array{12.5, 12.5, 12.5, 12.5, 12.5})) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0U].value, 20.0) | EXPECT_EQ(domain.ThermalStep()->Loads()[0U].source_order, 0U) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kBottom), 11) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kTop), 15) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInactiveTargetsConflictsAndMixedElements ThermalDomain.RejectsInactiveTargetsConflictsAndMixedElements; assertion 8개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInactiveTargetsConflictsAndMixedElements 유지 원문 검사 body 및 assertion 동일. 69b1b68b51176ef0a39d57b5c5899bc6c935fc3e6a82850b7634f13895ae26d6 69b1b68b51176ef0a39d57b5c5899bc6c935fc3e6a82850b7634f13895ae26d6 ASSERT_FALSE(inactive.HasValue()) | EXPECT_EQ(inactive.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(conflicting.HasValue()) | EXPECT_EQ(conflicting.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(mixed.HasValue()) | EXPECT_EQ(mixed.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(invalid_thickness.HasValue()) | EXPECT_EQ(invalid_thickness.GetStatus().Category(), fesa::FailureCategory::kModel) ASSERT_FALSE(inactive.HasValue()) | EXPECT_EQ(inactive.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(conflicting.HasValue()) | EXPECT_EQ(conflicting.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(mixed.HasValue()) | EXPECT_EQ(mixed.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(invalid_thickness.HasValue()) | EXPECT_EQ(invalid_thickness.GetStatus().Category(), fesa::FailureCategory::kModel) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp ThermalDomain.AllowsEqualInitialTargetsAndStepBoundaryOverride ThermalDomain.AllowsEqualInitialTargetsAndStepBoundaryOverride; assertion 4개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.AllowsEqualInitialTargetsAndStepBoundaryOverride 유지 원문 검사 body 및 assertion 동일. 7d2f88248ba8df15e130f352f1bcbce0886e513bfd575bcdf66862383f86ce12 7d2f88248ba8df15e130f352f1bcbce0886e513bfd575bcdf66862383f86ce12 EXPECT_TRUE(equal_initial.HasValue()) | ASSERT_FALSE(conflicting_initial.HasValue()) | EXPECT_EQ(conflicting_initial.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(overriding_step.HasValue()) EXPECT_TRUE(equal_initial.HasValue()) | ASSERT_FALSE(conflicting_initial.HasValue()) | EXPECT_EQ(conflicting_initial.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(overriding_step.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInteriorThermalDofsAndInactiveFluxTargets ThermalDomain.RejectsInteriorThermalDofsAndInactiveFluxTargets; assertion 4개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInteriorThermalDofsAndInactiveFluxTargets 유지 원문 검사 body 및 assertion 동일. 1e9cbd5b4303fc6d2706eda68d786d4bec26fe554c7043554f04b8588b7455f3 1e9cbd5b4303fc6d2706eda68d786d4bec26fe554c7043554f04b8588b7455f3 EXPECT_FALSE(boundary.HasValue()) | EXPECT_FALSE(flux.HasValue()) | EXPECT_FALSE(inactive_flux.HasValue()) | EXPECT_FALSE(inactive_boundary.HasValue()) EXPECT_FALSE(boundary.HasValue()) | EXPECT_FALSE(flux.HasValue()) | EXPECT_FALSE(inactive_flux.HasValue()) | EXPECT_FALSE(inactive_boundary.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp ThermalDomain.PreservesAdditiveFluxSourceOrder ThermalDomain.PreservesAdditiveFluxSourceOrder; assertion 6개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.PreservesAdditiveFluxSourceOrder 유지 원문 검사 body 및 assertion 동일. dd1914d0d09fc94c82e24118f005fc7d1ff4b5c31ceb318021508b6239a26a79 dd1914d0d09fc94c82e24118f005fc7d1ff4b5c31ceb318021508b6239a26a79 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0U].source_order, 0U) | EXPECT_EQ(loads[1U].source_order, 1U) | EXPECT_DOUBLE_EQ(loads[0U].power, -5.0) | EXPECT_DOUBLE_EQ(loads[1U].power, 3.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0U].source_order, 0U) | EXPECT_EQ(loads[1U].source_order, 1U) | EXPECT_DOUBLE_EQ(loads[0U].power, -5.0) | EXPECT_DOUBLE_EQ(loads[1U].power, 3.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.KeepsThermalSectionMaterialIndicesSeparateFromDomainMaterials ThermalAnalysisModel.KeepsThermalSectionMaterialIndicesSeparateFromDomainMaterials; assertion 12개 tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.KeepsThermalSectionMaterialIndicesSeparateFromDomainMaterials 유지 원문 검사 body 및 assertion 동일. 550c29842bdef0f9518150f2f263f6c2302ce2d0c108607913f3833bfbd9ace2 550c29842bdef0f9518150f2f263f6c2302ce2d0c108607913f3833bfbd9ace2 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_EQ(domain.Materials().Size(), 3U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 1U) | EXPECT_EQ(domain.ThermalSections()[1U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 2U) | EXPECT_EQ(domain.ThermalElements()[1U].MaterialIndex(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model_result.Value().ActiveThermalMaterials(), (std::vector{0U, 1U})) | EXPECT_EQ(model_result.Value().ActiveThermalSections(), (std::vector{0U, 1U})) | EXPECT_TRUE(model_result.Value().ActiveProperties().empty()) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_EQ(domain.Materials().Size(), 3U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 1U) | EXPECT_EQ(domain.ThermalSections()[1U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 2U) | EXPECT_EQ(domain.ThermalElements()[1U].MaterialIndex(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model_result.Value().ActiveThermalMaterials(), (std::vector{0U, 1U})) | EXPECT_EQ(model_result.Value().ActiveThermalSections(), (std::vector{0U, 1U})) | EXPECT_TRUE(model_result.Value().ActiveProperties().empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.ViewsConnectedDs4EntitiesWithoutOwningDomain ThermalAnalysisModel.ViewsConnectedDs4EntitiesWithoutOwningDomain; assertion 17개 tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.ViewsConnectedDs4EntitiesWithoutOwningDomain 유지 원문 검사 body 및 assertion 동일. 509fa86c25fb97bf5c46d2eb7dfe513ac53a0fbceef40979b47ed0a740fbac7c 509fa86c25fb97bf5c46d2eb7dfe513ac53a0fbceef40979b47ed0a740fbac7c ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_TRUE(model.IsThermal()) | EXPECT_EQ(model.ThermalStep(), domain.ThermalStep()) | EXPECT_THROW(model.Step(), std::logic_error) | EXPECT_EQ(model.ActiveThermalElements(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalNodes(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveThermalMaterials(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalSections(), (std::vector{0U})) | EXPECT_TRUE(model.ActiveProperties().empty()) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 0U) | EXPECT_EQ(&model.GetDomain(), &domain) | ASSERT_TRUE(moved_model.HasValue()) | EXPECT_EQ(&moved_model.Value().GetDomain(), &moved_domain) | EXPECT_DOUBLE_EQ(moved_domain.ThermalMaterials()[0U].Conductivity(), 45.0) | EXPECT_EQ(moved_domain.ThermalElements()[0U].SourceId().source_label, 8) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_TRUE(model.IsThermal()) | EXPECT_EQ(model.ThermalStep(), domain.ThermalStep()) | EXPECT_THROW(model.Step(), std::logic_error) | EXPECT_EQ(model.ActiveThermalElements(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalNodes(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveThermalMaterials(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalSections(), (std::vector{0U})) | EXPECT_TRUE(model.ActiveProperties().empty()) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 0U) | EXPECT_EQ(&model.GetDomain(), &domain) | ASSERT_TRUE(moved_model.HasValue()) | EXPECT_EQ(&moved_model.Value().GetDomain(), &moved_domain) | EXPECT_DOUBLE_EQ(moved_domain.ThermalMaterials()[0U].Conductivity(), 45.0) | EXPECT_EQ(moved_domain.ThermalElements()[0U].SourceId().source_label, 8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/model/thermal_semantics_test.cpp support@1-50 helper/oracle/fixture/include/static assertion 구간: Location, ValidDefinition tests/unit/model/thermal_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 34019d56ebed3f1fa39477e5c1846c9610f380a4cec751b860088f6e6ce221ba 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/thermal_shell_geometry_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/model/thermal_shell_geometry_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 754d05288c9ba4de3c7cba2153621be4af8489b5c7e0946e387ee86ffaa0776c 2011bdeb9d673496a31e6ee31317452fb401fbfefb928cd97d085c99406dd033 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.CertifiesAffineDistortedSaddleAndSlenderPatches ThermalShellGeometry.CertifiesAffineDistortedSaddleAndSlenderPatches; assertion 5개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.CertifiesAffineDistortedSaddleAndSlenderPatches 유지 원문 검사 body 및 assertion 동일. 48147bb1a29cb0d24551a12e8a96d748c81fa670f440912e1d99901118128f8c 48147bb1a29cb0d24551a12e8a96d748c81fa670f440912e1d99901118128f8c EXPECT_TRUE(Kernel(kSquare).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {3, 1, 0}, {1, 1, 0}}}).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {1.5, 1, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_TRUE(Kernel({{{0, 0, 0}, {1, 0, 0}, {1, std::ldexp(1., -40), 0}, {0, std::ldexp(1., -40), 0}}}) .HasValue()) | EXPECT_TRUE( Kernel({{{-1, -1, a}, {1, -1, -a}, {1, 1, a}, {-1, 1, -a}}}).HasValue()) EXPECT_TRUE(Kernel(kSquare).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {3, 1, 0}, {1, 1, 0}}}).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {1.5, 1, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_TRUE(Kernel({{{0, 0, 0}, {1, 0, 0}, {1, std::ldexp(1., -40), 0}, {0, std::ldexp(1., -40), 0}}}) .HasValue()) | EXPECT_TRUE( Kernel({{{-1, -1, a}, {1, -1, -a}, {1, 1, a}, {-1, 1, -a}}}).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.PowerOfTwoScalingTranslationAndRotation ThermalShellGeometry.PowerOfTwoScalingTranslationAndRotation; assertion 3개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.PowerOfTwoScalingTranslationAndRotation 유지 원문 검사 body 및 assertion 동일. 5a22e1006b798b2d4a9544a4ee6af30a969558a0bafaba3dfc98634d36b62ff8 5a22e1006b798b2d4a9544a4ee6af30a969558a0bafaba3dfc98634d36b62ff8 EXPECT_TRUE(Kernel(patch).HasValue()) | EXPECT_TRUE(Kernel(translated).HasValue()) | EXPECT_TRUE(Kernel(rotated).HasValue()) EXPECT_TRUE(Kernel(patch).HasValue()) | EXPECT_TRUE(Kernel(translated).HasValue()) | EXPECT_TRUE(Kernel(rotated).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsWholePatchSingularityDespiteNonzeroGaussPoints ThermalShellGeometry.RejectsWholePatchSingularityDespiteNonzeroGaussPoints; assertion 4개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsWholePatchSingularityDespiteNonzeroGaussPoints 유지 원문 검사 body 및 assertion 동일. d4f657f21765c36aeb85cb4ef44f7eb0da408aaa215d6264aa01ae008fe24134 d4f657f21765c36aeb85cb4ef44f7eb0da408aaa215d6264aa01ae008fe24134 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].entity_identity, ""part:0027"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 17U) | EXPECT_GT(std::abs(q - .25), 0.)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].entity_identity, ""part:0027"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 17U) | EXPECT_GT(std::abs(q - .25), 0.)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsInvalidAndDoesNotRepairUncertainGeometry ThermalShellGeometry.RejectsInvalidAndDoesNotRepairUncertainGeometry; assertion 6개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsInvalidAndDoesNotRepairUncertainGeometry 유지 원문 검사 body 및 assertion 동일. 8507137261c0e52029ab56b39af1e9434cf478fcf9870c9d474c8f61ffb75f0e 8507137261c0e52029ab56b39af1e9434cf478fcf9870c9d474c8f61ffb75f0e "EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 1, 0}, {1, 0, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 0, 0}, {2, 0, 0}, {3, 0, 0}}}).HasValue()) | EXPECT_FALSE(Kernel(repeated).HasValue()) | EXPECT_FALSE(Kernel(patch).HasValue()) | EXPECT_FALSE(duplicate.HasValue()) | EXPECT_EQ(uncertain.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-geometry"")" "EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 1, 0}, {1, 0, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 0, 0}, {2, 0, 0}, {3, 0, 0}}}).HasValue()) | EXPECT_FALSE(Kernel(repeated).HasValue()) | EXPECT_FALSE(Kernel(patch).HasValue()) | EXPECT_FALSE(duplicate.HasValue()) | EXPECT_EQ(uncertain.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-geometry"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainEnforcesOppositeEdgesAndOneVertexLink ThermalShellGeometry.DomainEnforcesOppositeEdgesAndOneVertexLink; assertion 5개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainEnforcesOppositeEdgesAndOneVertexLink 유지 원문 검사 body 및 assertion 동일. 960d6f8e2311e574bde5319cf21f80fd621f40068ceba6271b3341a91f01e523 960d6f8e2311e574bde5319cf21f80fd621f40068ceba6271b3341a91f01e523 EXPECT_TRUE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{2, 5, 4, 1}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{0, 1, 2, 3}}}))) | EXPECT_FALSE(Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {-1, -1, 0}, {0, -1, 0}, {-1, 0, 0}}, {{{0, 1, 2, 3}}, {{0, 6, 4, 5}}}))) | EXPECT_FALSE( Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {2, 0, 0}, {2, 1, 0}, {1, 0, 1}, {1, 1, 1}}, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}, {{1, 6, 7, 2}}}))) EXPECT_TRUE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{2, 5, 4, 1}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{0, 1, 2, 3}}}))) | EXPECT_FALSE(Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {-1, -1, 0}, {0, -1, 0}, {-1, 0, 0}}, {{{0, 1, 2, 3}}, {{0, 6, 4, 5}}}))) | EXPECT_FALSE( Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {2, 0, 0}, {2, 1, 0}, {1, 0, 1}, {1, 1, 1}}, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}, {{1, 6, 7, 2}}}))) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainAllowsFoldAndDisconnectedCoordinateContact ThermalShellGeometry.DomainAllowsFoldAndDisconnectedCoordinateContact; assertion 3개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainAllowsFoldAndDisconnectedCoordinateContact 유지 원문 검사 body 및 assertion 동일. 5249d8d88ee57a712425ba038be3bac4ade7db9c481b522d83c2caade689a80f 5249d8d88ee57a712425ba038be3bac4ade7db9c481b522d83c2caade689a80f EXPECT_TRUE(Accepted(std::move(folded))) | EXPECT_TRUE(Accepted(disconnected)) | EXPECT_TRUE(Accepted(disconnected)) EXPECT_TRUE(Accepted(std::move(folded))) | EXPECT_TRUE(Accepted(disconnected)) | EXPECT_TRUE(Accepted(disconnected)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainRejectsSourceSharingPartialEdgeWithoutGlobalScan ThermalShellGeometry.DomainRejectsSourceSharingPartialEdgeWithoutGlobalScan; assertion 3개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainRejectsSourceSharingPartialEdgeWithoutGlobalScan 유지 원문 검사 body 및 assertion 동일. 0c84d4620600808611f9c67496c87bba5ea2baddc6714c78facfcac24d1d4cfb 0c84d4620600808611f9c67496c87bba5ea2baddc6714c78facfcac24d1d4cfb "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-connection"") | EXPECT_FALSE(Accepted(invalid))" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-connection"") | EXPECT_FALSE(Accepted(invalid))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.SearchesSeparatingDirectionsBeyondCenterAndCorners ThermalShellGeometry.SearchesSeparatingDirectionsBeyondCenterAndCorners; assertion 2개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.SearchesSeparatingDirectionsBeyondCenterAndCorners 유지 원문 검사 body 및 assertion 동일. e9e9cca17d49ca10988a52883efca96de60507cb1cf1af5a467e096037879591 e9e9cca17d49ca10988a52883efca96de60507cb1cf1af5a467e096037879591 EXPECT_TRUE( Kernel({{{3, -9, -3}, {1, 3, -3}, {-1, 3, 3}, {-3, 3, 3}}}).HasValue()) | EXPECT_TRUE( Kernel({{{-1, 4, -4}, {-1, -2, 2}, {3, 2, 4}, {-1, -4, -2}}}).HasValue()) EXPECT_TRUE( Kernel({{{3, -9, -3}, {1, 3, -3}, {-1, 3, 3}, {-3, 3, 3}}}).HasValue()) | EXPECT_TRUE( Kernel({{{-1, 4, -4}, {-1, -2, 2}, {3, 2, 4}, {-1, -4, -2}}}).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsAliasedSourceIdentityAndAcceptsClosedVertexLink ThermalShellGeometry.RejectsAliasedSourceIdentityAndAcceptsClosedVertexLink; assertion 2개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsAliasedSourceIdentityAndAcceptsClosedVertexLink 유지 원문 검사 body 및 assertion 동일. 5fc28937a2442f6232fecc5edfa705ee8777c0a5e5a5395d16875e9e7613ea60 5fc28937a2442f6232fecc5edfa705ee8777c0a5e5a5395d16875e9e7613ea60 EXPECT_FALSE(Accepted(aliases)) | EXPECT_TRUE(Accepted( Mesh({{-1, -1, 0}, {0, -1, 0}, {1, -1, 0}, {-1, 0, 0}, {0, 0, 0}, {1, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {1, 1, 0}}, {{{0, 1, 4, 3}}, {{1, 2, 5, 4}}, {{3, 4, 7, 6}}, {{4, 5, 8, 7}}}))) EXPECT_FALSE(Accepted(aliases)) | EXPECT_TRUE(Accepted( Mesh({{-1, -1, 0}, {0, -1, 0}, {1, -1, 0}, {-1, 0, 0}, {0, 0, 0}, {1, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {1, 1, 0}}, {{{0, 1, 4, 3}}, {{1, 2, 5, 4}}, {{3, 4, 7, 6}}, {{4, 5, 8, 7}}}))) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/model/thermal_shell_geometry_test.cpp support@1-48 helper/oracle/fixture/include/static assertion 구간: Kernel, Mesh, Accepted tests/unit/model/thermal_shell_geometry_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7d176d82a5793eb18d82939f0cb8aefeb58f83c729b7a7c3bec269a1e90ecbf2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/properties/element_property_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/properties/element_property_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 37fe800c84baee1240c919337d93fdaf0b06540901fcf27c1de88b3cab07b049 37fe800c84baee1240c919337d93fdaf0b06540901fcf27c1de88b3cab07b049 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/properties/element_property_test.cpp ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase; assertion 13개 tests/unit/properties/element_property_test.cpp ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase 유지 원문 검사 body 및 assertion 동일. a82ebec7392b40890b5e5f520cf3384a81f765e1e258cd5c1062052283df0479 a82ebec7392b40890b5e5f520cf3384a81f765e1e258cd5c1062052283df0479 "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(property->SourceId().source_label, 4) | EXPECT_EQ(property->SourceId().source_label_text, ""BeamSection"") | EXPECT_EQ(section.Name(), ""BeamSection"") | EXPECT_DOUBLE_EQ(section.Area(), 0.02) | EXPECT_DOUBLE_EQ(section.I11(), 1.0e-5) | EXPECT_DOUBLE_EQ(section.I12(), 0.0) | EXPECT_DOUBLE_EQ(section.I22(), 2.0e-5) | EXPECT_DOUBLE_EQ(section.TorsionalConstant(), 5.0e-6) | EXPECT_EQ(section.FirstAxis(), (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.SectionPoints(), (std::vector>{{-0.1, 0.0}, {0.1, 0.0}})) | EXPECT_EQ(section.Location().line, 40U)" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(property->SourceId().source_label, 4) | EXPECT_EQ(property->SourceId().source_label_text, ""BeamSection"") | EXPECT_EQ(section.Name(), ""BeamSection"") | EXPECT_DOUBLE_EQ(section.Area(), 0.02) | EXPECT_DOUBLE_EQ(section.I11(), 1.0e-5) | EXPECT_DOUBLE_EQ(section.I12(), 0.0) | EXPECT_DOUBLE_EQ(section.I22(), 2.0e-5) | EXPECT_DOUBLE_EQ(section.TorsionalConstant(), 5.0e-6) | EXPECT_EQ(section.FirstAxis(), (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.SectionPoints(), (std::vector>{{-0.1, 0.0}, {0.1, 0.0}})) | EXPECT_EQ(section.Location().line, 40U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/properties/element_property_test.cpp ElementProperty.OwnsShellSectionThroughVirtualBase ElementProperty.OwnsShellSectionThroughVirtualBase; assertion 7개 tests/unit/properties/element_property_test.cpp ElementProperty.OwnsShellSectionThroughVirtualBase 유지 원문 검사 body 및 assertion 동일. f875a0e085b3368db099095f0bbce5ff999ecaaefc8f542b5f048a2cb965a65d f875a0e085b3368db099095f0bbce5ff999ecaaefc8f542b5f048a2cb965a65d "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(property->SourceId().source_label, 8) | EXPECT_EQ(section.Name(), ""ShellSection"") | EXPECT_DOUBLE_EQ(section.Thickness(), 0.01) | EXPECT_EQ(section.MaterialIndex(), fesa::EntityIndex{3}) | EXPECT_EQ(section.Location().file, ""models/property.inp"")" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(property->SourceId().source_label, 8) | EXPECT_EQ(section.Name(), ""ShellSection"") | EXPECT_DOUBLE_EQ(section.Thickness(), 0.01) | EXPECT_EQ(section.MaterialIndex(), fesa::EntityIndex{3}) | EXPECT_EQ(section.Location().file, ""models/property.inp"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/properties/element_property_test.cpp ElementProperty.PreservesEmptyOptionalSectionPointInventory ElementProperty.PreservesEmptyOptionalSectionPointInventory; assertion 2개 tests/unit/properties/element_property_test.cpp ElementProperty.PreservesEmptyOptionalSectionPointInventory 유지 원문 검사 body 및 assertion 동일. eb36af0169c99936f509a091e38bf8c4e4c7d8fb663887478c6b4453ce21a252 eb36af0169c99936f509a091e38bf8c4e4c7d8fb663887478c6b4453ce21a252 ASSERT_TRUE(section.HasValue()) | EXPECT_TRUE(section.Value().SectionPoints().empty()) ASSERT_TRUE(section.HasValue()) | EXPECT_TRUE(section.Value().SectionPoints().empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/properties/element_property_test.cpp ElementProperty.RejectsInvalidCurrentSectionFields ElementProperty.RejectsInvalidCurrentSectionFields; assertion 6개 tests/unit/properties/element_property_test.cpp ElementProperty.RejectsInvalidCurrentSectionFields 유지 원문 검사 body 및 assertion 동일. 0e388bbbd8142343bb098f7b6df8b4dc8079f90e5c73447c09e43c4dbce0f610 0e388bbbd8142343bb098f7b6df8b4dc8079f90e5c73447c09e43c4dbce0f610 ASSERT_FALSE(invalid_beam.HasValue()) | EXPECT_EQ(invalid_beam.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(coupled_beam.HasValue()) | EXPECT_FALSE(nonfinite_point.HasValue()) | ASSERT_FALSE(invalid_shell.HasValue()) | EXPECT_EQ(invalid_shell.GetStatus().Category(), fesa::FailureCategory::kModel) ASSERT_FALSE(invalid_beam.HasValue()) | EXPECT_EQ(invalid_beam.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(coupled_beam.HasValue()) | EXPECT_FALSE(nonfinite_point.HasValue()) | ASSERT_FALSE(invalid_shell.HasValue()) | EXPECT_EQ(invalid_shell.GetStatus().Category(), fesa::FailureCategory::kModel) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/properties/element_property_test.cpp support@1-19 helper/oracle/fixture/include/static assertion 구간: PropertyLocation tests/unit/properties/element_property_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 433c8d2313668bc7e4780f44dca84936eae188a3c75110af9182756aa419efad 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_records_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/results/result_records_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ee0513e6ac8e92851a82d5f5bc932f841483b2640413b105465b71bb77cb1ccb bb72829dd1c5a3b89f5fcca9ae669acf8bc90697a26a5aa0c4ad0cddd14ac83e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_records_test.cpp AnalysisState.PreservesStepFrameAndStableRowOrder AnalysisState.PreservesStepFrameAndStableRowOrder; assertion 25개 tests/unit/results/result_records_test.cpp AnalysisState.PreservesStepFrameAndStableRowOrder 유지 원문 검사 body 및 assertion 동일. 869b5c0c01c92f41cc3dd8a80fa5fe57725d2ce8581d61c8dcf3ac36ed0d8d8f 869b5c0c01c92f41cc3dd8a80fa5fe57725d2ce8581d61c8dcf3ac36ed0d8d8f "EXPECT_EQ(const_state.Identity().step_name, ""Step-1"") | EXPECT_EQ(const_state.Identity().frame_index, 0U) | ASSERT_EQ(const_state.EndpointResults().size(), 2U) | EXPECT_EQ(const_state.EndpointResults().data(), endpoint_storage) | EXPECT_EQ(const_state.EndpointResults()[0].element, 2U) | EXPECT_EQ(const_state.EndpointResults()[0].endpoint, -1) | EXPECT_EQ(const_state.EndpointResults()[0].node.instance_name, ""Beam-1"") | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label, 10) | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label_text, ""010"") | EXPECT_EQ(const_state.EndpointResults()[0].end_action, (std::array{1.0, 2.0, 3.0, 4.0, 5.0, 6.0})) | EXPECT_EQ(const_state.EndpointResults()[1].section_resultant, (std::array{17.0, 18.0, 19.0, 20.0})) | ASSERT_EQ(const_state.GaussResults().size(), 2U) | EXPECT_EQ(const_state.GaussResults().data(), gauss_storage) | EXPECT_EQ(const_state.GaussResults()[0].gauss_point, 1) | EXPECT_EQ(const_state.GaussResults()[1].gauss_point, 2) | EXPECT_EQ(const_state.GaussResults()[0].generalized_strain, (std::array{0.1, 0.2, 0.3, 0.4})) | EXPECT_EQ(const_state.GaussResults()[1].generalized_resultant, (std::array{1.5, 1.6, 1.7, 1.8})) | ASSERT_EQ(const_state.StressResults().size(), 2U) | EXPECT_EQ(const_state.StressResults().data(), stress_storage) | EXPECT_EQ(const_state.StressResults()[0].section_point, 1U) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x1, -0.25) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x2, 0.5) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].s11, 12.5) | EXPECT_EQ(const_state.StressResults()[0].source, ""input"") | EXPECT_EQ(const_state.StressResults()[1].section_point, 2U)" "EXPECT_EQ(const_state.Identity().step_name, ""Step-1"") | EXPECT_EQ(const_state.Identity().frame_index, 0U) | ASSERT_EQ(const_state.EndpointResults().size(), 2U) | EXPECT_EQ(const_state.EndpointResults().data(), endpoint_storage) | EXPECT_EQ(const_state.EndpointResults()[0].element, 2U) | EXPECT_EQ(const_state.EndpointResults()[0].endpoint, -1) | EXPECT_EQ(const_state.EndpointResults()[0].node.instance_name, ""Beam-1"") | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label, 10) | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label_text, ""010"") | EXPECT_EQ(const_state.EndpointResults()[0].end_action, (std::array{1.0, 2.0, 3.0, 4.0, 5.0, 6.0})) | EXPECT_EQ(const_state.EndpointResults()[1].section_resultant, (std::array{17.0, 18.0, 19.0, 20.0})) | ASSERT_EQ(const_state.GaussResults().size(), 2U) | EXPECT_EQ(const_state.GaussResults().data(), gauss_storage) | EXPECT_EQ(const_state.GaussResults()[0].gauss_point, 1) | EXPECT_EQ(const_state.GaussResults()[1].gauss_point, 2) | EXPECT_EQ(const_state.GaussResults()[0].generalized_strain, (std::array{0.1, 0.2, 0.3, 0.4})) | EXPECT_EQ(const_state.GaussResults()[1].generalized_resultant, (std::array{1.5, 1.6, 1.7, 1.8})) | ASSERT_EQ(const_state.StressResults().size(), 2U) | EXPECT_EQ(const_state.StressResults().data(), stress_storage) | EXPECT_EQ(const_state.StressResults()[0].section_point, 1U) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x1, -0.25) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x2, 0.5) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].s11, 12.5) | EXPECT_EQ(const_state.StressResults()[0].source, ""input"") | EXPECT_EQ(const_state.StressResults()[1].section_point, 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_records_test.cpp AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder; assertion 13개 tests/unit/results/result_records_test.cpp AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder 유지 원문 검사 body 및 assertion 동일. a0f71e39ab3e0d800b26636fca67c30c58ad846b26a9684454a311322065c4f1 a0f71e39ab3e0d800b26636fca67c30c58ad846b26a9684454a311322065c4f1 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(const_state.ShellResults().size(), 8U) | EXPECT_EQ(const_state.ShellResults()[0].element, 3U) | EXPECT_EQ(const_state.ShellResults()[0].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(const_state.ShellResults()[3].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(const_state.ShellResults()[4].element, 7U) | EXPECT_EQ(const_state.ShellResults()[4].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ( const_state.ShellResults()[0].natural_coordinates, (std::array{-1.0 / std::sqrt(3.0), -1.0 / std::sqrt(3.0)})) | EXPECT_EQ(const_state.ShellResults()[2].generalized_strain, (std::array{321.0, 322.0, 323.0, 324.0, 325.0, 326.0, 327.0, 328.0})) | EXPECT_EQ(const_state.ShellResults()[7].section_resultant, (std::array{741.0, 742.0, 743.0, 744.0, 745.0, 746.0, 747.0, 748.0})) | EXPECT_EQ(const_state.ShellResults()[7].stress[0].position, fesa::ShellSectionPosition::kBottom) | EXPECT_DOUBLE_EQ(const_state.ShellResults()[7].stress[0].zeta, -1.0) | EXPECT_EQ(const_state.ShellResults()[7].stress[2].components, (std::array{757.0, 758.0, 759.0})) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(const_state.ShellResults().size(), 8U) | EXPECT_EQ(const_state.ShellResults()[0].element, 3U) | EXPECT_EQ(const_state.ShellResults()[0].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(const_state.ShellResults()[3].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(const_state.ShellResults()[4].element, 7U) | EXPECT_EQ(const_state.ShellResults()[4].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ( const_state.ShellResults()[0].natural_coordinates, (std::array{-1.0 / std::sqrt(3.0), -1.0 / std::sqrt(3.0)})) | EXPECT_EQ(const_state.ShellResults()[2].generalized_strain, (std::array{321.0, 322.0, 323.0, 324.0, 325.0, 326.0, 327.0, 328.0})) | EXPECT_EQ(const_state.ShellResults()[7].section_resultant, (std::array{741.0, 742.0, 743.0, 744.0, 745.0, 746.0, 747.0, 748.0})) | EXPECT_EQ(const_state.ShellResults()[7].stress[0].position, fesa::ShellSectionPosition::kBottom) | EXPECT_DOUBLE_EQ(const_state.ShellResults()[7].stress[0].zeta, -1.0) | EXPECT_EQ(const_state.ShellResults()[7].stress[2].components, (std::array{757.0, 758.0, 759.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_records_test.cpp AnalysisState.CommitsFiniteShellGlobalEvidence AnalysisState.CommitsFiniteShellGlobalEvidence; assertion 4개 tests/unit/results/result_records_test.cpp AnalysisState.CommitsFiniteShellGlobalEvidence 유지 원문 검사 body 및 assertion 동일. 62ed08387eb7eff71c91920c4bebabfbed05791ab18a4fe8cbbf463396f7be15 62ed08387eb7eff71c91920c4bebabfbed05791ab18a4fe8cbbf463396f7be15 ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 35.5) | EXPECT_EQ(state.Equilibrium(), (std::array{1.0, -2.0, 3.0, -4.0, 5.0, -6.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{1.0e-11, 2.0e-11, 3.0e-11})) ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 35.5) | EXPECT_EQ(state.Equilibrium(), (std::array{1.0, -2.0, 3.0, -4.0, 5.0, -6.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{1.0e-11, 2.0e-11, 3.0e-11})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_records_test.cpp AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged; assertion 1개 tests/unit/results/result_records_test.cpp AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged 유지 원문 검사 body 및 assertion 동일. 707b9669e1d0cb266cfbba53e13210c339cea51e651d10b1b57991ece003a113 707b9669e1d0cb266cfbba53e13210c339cea51e651d10b1b57991ece003a113 ASSERT_TRUE(state.CommitShellResults(expected_elements, committed).IsOk()) ASSERT_TRUE(state.CommitShellResults(expected_elements, committed).IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_records_test.cpp support@1-125 helper/oracle/fixture/include/static assertion 구간: MakeEmptyDofs, MakeShellRow, MakeShellCandidate, for, ExpectShellStateEquals, ExpectShellCandidateRejectedWithoutMutation tests/unit/results/result_records_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9162214cc858ebe9d01e80e8166b2b73aae3991688b1fb9fa0f40f51298a59b6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_records_test.cpp support@192-193 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_records_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 99cfd7cc1cbfee5f6699e5f92a5190f79a531c7be18944fe4cda2e9e2579c67c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_records_test.cpp support@228-229 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_records_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8e9919be7709179a6da34b5355c75a2a62ae000d17bf61c217fc31533b110324 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_records_test.cpp support@245-246 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_records_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5553b473143aa6f5d1e0b9c4ab38b9d66e43c689916066d068f42b2635b92413 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_components_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/results/result_recovery_components_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e5f882061497e99d8210a474c7f662c17de029fc7542ae8b4c7334a2be162c6d e5f882061497e99d8210a474c7f662c17de029fc7542ae8b4c7334a2be162c6d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment; assertion 8개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment 유지 원문 검사 body 및 assertion 동일. 4b1d44d2f31879ee4c18e1f4cb5cdedafa0cb332e8c635b697fbcc02bef96a81 4b1d44d2f31879ee4c18e1f4cb5cdedafa0cb332e8c635b697fbcc02bef96a81 ASSERT_TRUE(centered_global.HasValue()) | ASSERT_TRUE(translated_global.HasValue()) | EXPECT_NEAR(centered_global.Value().residual[0U], -1.0e-9, 1.0e-14) | EXPECT_DOUBLE_EQ(centered_global.Value().reaction[0U], centered_global.Value().residual[0U]) | ASSERT_TRUE(centered_status.IsOk()) | ASSERT_TRUE(translated_status.IsOk()) | EXPECT_NEAR(translated_candidate.shell.equilibrium[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated_candidate.shell.equilibrium[3U + component] - centered_candidate.shell.equilibrium[3U + component], translated_moment_delta[component], 5.0e-12) ASSERT_TRUE(centered_global.HasValue()) | ASSERT_TRUE(translated_global.HasValue()) | EXPECT_NEAR(centered_global.Value().residual[0U], -1.0e-9, 1.0e-14) | EXPECT_DOUBLE_EQ(centered_global.Value().reaction[0U], centered_global.Value().residual[0U]) | ASSERT_TRUE(centered_status.IsOk()) | ASSERT_TRUE(translated_status.IsOk()) | EXPECT_NEAR(translated_candidate.shell.equilibrium[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated_candidate.shell.equilibrium[3U + component] - centered_candidate.shell.equilibrium[3U + component], translated_moment_delta[component], 5.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.PartitionedScaleKeepsCancelledInternalTerms ResultRecoveryComponents.PartitionedScaleKeepsCancelledInternalTerms; assertion 6개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.PartitionedScaleKeepsCancelledInternalTerms 유지 원문 검사 body 및 assertion 동일. a8b1656706d840fa532862cac33f4009cb7679d2b2bb01156ebace368402ec2c a8b1656706d840fa532862cac33f4009cb7679d2b2bb01156ebace368402ec2c ASSERT_TRUE(matrix.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().internal_force[1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().normalized_free_residual, 1.0e-12) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().reaction[1U], -1.0e-12) ASSERT_TRUE(matrix.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().internal_force[1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().normalized_free_residual, 1.0e-12) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().reaction[1U], -1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities; assertion 18개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities 유지 원문 검사 body 및 assertion 동일. 08f945a80aa1b49a9352f010897f1f0843eae7e8567334daf13602824dc12039 08f945a80aa1b49a9352f010897f1f0843eae7e8567334daf13602824dc12039 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(candidate.endpoint_rows.size(), 2U) | ASSERT_EQ(candidate.gauss_rows.size(), 2U) | ASSERT_EQ(candidate.stress_rows.size(), 2U) | EXPECT_TRUE(candidate.has_beam_results) | EXPECT_EQ(candidate.endpoint_rows[0U].endpoint, 0) | EXPECT_EQ(candidate.endpoint_rows[1U].endpoint, 1) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].end_action[0U], -2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].section_resultant[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].end_action[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].section_resultant[0U], 2.0) | EXPECT_EQ(candidate.gauss_rows[0U].gauss_point, 1) | EXPECT_EQ(candidate.gauss_rows[1U].gauss_point, 2) | EXPECT_EQ(candidate.stress_rows[0U].section_point, 0U) | EXPECT_EQ(candidate.stress_rows[1U].section_point, 1U) | EXPECT_TRUE(rejected.endpoint_rows.empty()) | EXPECT_TRUE(rejected.gauss_rows.empty()) | EXPECT_TRUE(rejected.stress_rows.empty()) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(candidate.endpoint_rows.size(), 2U) | ASSERT_EQ(candidate.gauss_rows.size(), 2U) | ASSERT_EQ(candidate.stress_rows.size(), 2U) | EXPECT_TRUE(candidate.has_beam_results) | EXPECT_EQ(candidate.endpoint_rows[0U].endpoint, 0) | EXPECT_EQ(candidate.endpoint_rows[1U].endpoint, 1) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].end_action[0U], -2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].section_resultant[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].end_action[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].section_resultant[0U], 2.0) | EXPECT_EQ(candidate.gauss_rows[0U].gauss_point, 1) | EXPECT_EQ(candidate.gauss_rows[1U].gauss_point, 2) | EXPECT_EQ(candidate.stress_rows[0U].section_point, 0U) | EXPECT_EQ(candidate.stress_rows[1U].section_point, 1U) | EXPECT_TRUE(rejected.endpoint_rows.empty()) | EXPECT_TRUE(rejected.gauss_rows.empty()) | EXPECT_TRUE(rejected.stress_rows.empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending; assertion 4개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending 유지 원문 검사 body 및 assertion 동일. 3f5b0c41e2ce77b59609c26e60409445ddd24bd89e0bf55f7f9c30736fdd5f35 3f5b0c41e2ce77b59609c26e60409445ddd24bd89e0bf55f7f9c30736fdd5f35 EXPECT_TRUE(candidate.endpoint_rows.empty()) | EXPECT_TRUE(candidate.gauss_rows.empty()) | EXPECT_TRUE(candidate.stress_rows.empty()) | EXPECT_FALSE(candidate.has_beam_results) EXPECT_TRUE(candidate.endpoint_rows.empty()) | EXPECT_TRUE(candidate.gauss_rows.empty()) | EXPECT_TRUE(candidate.stress_rows.empty()) | EXPECT_FALSE(candidate.has_beam_results) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy; assertion 13개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy 유지 원문 검사 body 및 assertion 동일. 6c9a8476d2005420d8bd58a3f3a3558cfadbd6c158bd213b0047e821bdd2d991 6c9a8476d2005420d8bd58a3f3a3558cfadbd6c158bd213b0047e821bdd2d991 ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(candidate.has_shell_results) | EXPECT_EQ(candidate.expected_shell_elements, (std::vector{element})) | ASSERT_EQ(candidate.shell.rows.size(), 4U) | EXPECT_EQ(candidate.shell.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(candidate.shell.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(candidate.shell.rows[0U].stress[0U].position, fesa::ShellSectionPosition::kBottom) | EXPECT_EQ(candidate.shell.rows[0U].stress[1U].position, fesa::ShellSectionPosition::kMiddle) | EXPECT_EQ(candidate.shell.rows[0U].stress[2U].position, fesa::ShellSectionPosition::kTop) | EXPECT_DOUBLE_EQ(candidate.shell.physical_strain_energy, 12.5) | EXPECT_TRUE(rejected.shell.rows.empty()) | EXPECT_TRUE(rejected.expected_shell_elements.empty()) | EXPECT_DOUBLE_EQ(rejected.shell.physical_strain_energy, 0.0) ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(candidate.has_shell_results) | EXPECT_EQ(candidate.expected_shell_elements, (std::vector{element})) | ASSERT_EQ(candidate.shell.rows.size(), 4U) | EXPECT_EQ(candidate.shell.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(candidate.shell.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(candidate.shell.rows[0U].stress[0U].position, fesa::ShellSectionPosition::kBottom) | EXPECT_EQ(candidate.shell.rows[0U].stress[1U].position, fesa::ShellSectionPosition::kMiddle) | EXPECT_EQ(candidate.shell.rows[0U].stress[2U].position, fesa::ShellSectionPosition::kTop) | EXPECT_DOUBLE_EQ(candidate.shell.physical_strain_energy, 12.5) | EXPECT_TRUE(rejected.shell.rows.empty()) | EXPECT_TRUE(rejected.expected_shell_elements.empty()) | EXPECT_DOUBLE_EQ(rejected.shell.physical_strain_energy, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle; assertion 9개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle 유지 원문 검사 body 및 assertion 동일. 55b6230e61eb0fc7cb6bdd7be3ad9832e2f1ec16cc1a95bf67ed1266f52d1cfe 55b6230e61eb0fc7cb6bdd7be3ad9832e2f1ec16cc1a95bf67ed1266f52d1cfe ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].location, prior.ShellResults()[0U].location) | EXPECT_EQ(state.ShellResults()[0U].section_resultant, prior.ShellResults()[0U].section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].location, prior.ShellResults()[0U].location) | EXPECT_EQ(state.ShellResults()[0U].section_resultant, prior.ShellResults()[0U].section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState; assertion 1개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState 유지 원문 검사 body 및 assertion 동일. 7fbd3ba0038bb7588dd981c89f1ebdb358900d942bf246d26295b1417082cf38 7fbd3ba0038bb7588dd981c89f1ebdb358900d942bf246d26295b1417082cf38 ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_components_test.cpp support@1-288 helper/oracle/fixture/include/static assertion 구간: ShellFixture, MakeSourceId, MakeBeamRows, MakeShellRows, MakeShellDefinition, MakeShellFixture, if, MakeShellPhysicalState, ExpectStatusCode, ExpectVectorEqual, ExpectAnalysisStateEqual tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 71c5386212b72927040f93cba4949f34f14d9fc36633ce2b7fe1bfbcec2ee692 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_components_test.cpp support@391-392 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_components_test.cpp support@430-431 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_components_test.cpp support@488-489 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_components_test.cpp support@524-525 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_components_test.cpp support@589-590 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 17개 tests/unit/results/result_recovery_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7b9358cc8459e3ec9c7fd6384982951ff5520dca7ee1b41eb671976c79c254e6 7b9358cc8459e3ec9c7fd6384982951ff5520dca7ee1b41eb671976c79c254e6 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder; assertion 25개 tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder 유지 원문 검사 body 및 assertion 동일. 61908298d8e691deb7066229f9dd58426ca57647ebabc07023e1a31ac0cda782 61908298d8e691deb7066229f9dd58426ca57647ebabc07023e1a31ac0cda782 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(first.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[0U], 0.1) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[6U], 0.3) | ASSERT_EQ(second.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[0U], 0.3) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[6U], 0.0) | ASSERT_EQ(state.EndpointResults().size(), 4U) | ASSERT_EQ(state.GaussResults().size(), 4U) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(negative_endpoint.element, element) | EXPECT_EQ(negative_endpoint.endpoint, 0) | EXPECT_DOUBLE_EQ(negative_endpoint.end_action[0U], -value) | EXPECT_DOUBLE_EQ(negative_endpoint.section_resultant[0U], value) | EXPECT_EQ(positive_endpoint.element, element) | EXPECT_EQ(positive_endpoint.endpoint, 1) | EXPECT_DOUBLE_EQ(positive_endpoint.end_action[0U], value) | EXPECT_DOUBLE_EQ(positive_endpoint.section_resultant[0U], value) | EXPECT_EQ(state.GaussResults()[2U * element].element, element) | EXPECT_EQ(state.GaussResults()[2U * element].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].element, element) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].gauss_point, 2) | EXPECT_EQ(state.StressResults()[2U * element].element, element) | EXPECT_EQ(state.StressResults()[2U * element + 1U].element, element) | EXPECT_TRUE(state.ShellResults().empty()) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(first.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[0U], 0.1) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[6U], 0.3) | ASSERT_EQ(second.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[0U], 0.3) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[6U], 0.0) | ASSERT_EQ(state.EndpointResults().size(), 4U) | ASSERT_EQ(state.GaussResults().size(), 4U) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(negative_endpoint.element, element) | EXPECT_EQ(negative_endpoint.endpoint, 0) | EXPECT_DOUBLE_EQ(negative_endpoint.end_action[0U], -value) | EXPECT_DOUBLE_EQ(negative_endpoint.section_resultant[0U], value) | EXPECT_EQ(positive_endpoint.element, element) | EXPECT_EQ(positive_endpoint.endpoint, 1) | EXPECT_DOUBLE_EQ(positive_endpoint.end_action[0U], value) | EXPECT_DOUBLE_EQ(positive_endpoint.section_resultant[0U], value) | EXPECT_EQ(state.GaussResults()[2U * element].element, element) | EXPECT_EQ(state.GaussResults()[2U * element].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].element, element) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].gauss_point, 2) | EXPECT_EQ(state.StressResults()[2U * element].element, element) | EXPECT_EQ(state.StressResults()[2U * element + 1U].element, element) | EXPECT_TRUE(state.ShellResults().empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy; assertion 10개 tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy 유지 원문 검사 body 및 assertion 동일. 6010abc24720e7277736bbd3f31bc425d908c7545447ce70f5d5c1dc45880d8e 6010abc24720e7277736bbd3f31bc425d908c7545447ce70f5d5c1dc45880d8e ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(state.EndpointResults().empty()) | EXPECT_TRUE(state.GaussResults().empty()) | EXPECT_TRUE(state.StressResults().empty()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(state.ShellResults()[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.ShellResults()[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_DOUBLE_EQ(state.ShellResults()[0U].generalized_strain[0U], 1.0) | EXPECT_DOUBLE_EQ(state.ShellResults()[3U].section_resultant[0U], 40.0) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), physical_energy) ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(state.EndpointResults().empty()) | EXPECT_TRUE(state.GaussResults().empty()) | EXPECT_TRUE(state.StressResults().empty()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(state.ShellResults()[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.ShellResults()[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_DOUBLE_EQ(state.ShellResults()[0U].generalized_strain[0U], 1.0) | EXPECT_DOUBLE_EQ(state.ShellResults()[3U].section_resultant[0U], 40.0) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), physical_energy) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.FailingFakeBundleRollsBackTheWholeState ResultRecovery.FailingFakeBundleRollsBackTheWholeState; assertion 15개 tests/unit/results/result_recovery_test.cpp ResultRecovery.FailingFakeBundleRollsBackTheWholeState 유지 원문 검사 body 및 assertion 동일. 39c57c8c046735efba89779244e8a951423224037d0d5e5798550b3a057aaa61 39c57c8c046735efba89779244e8a951423224037d0d5e5798550b3a057aaa61 ASSERT_TRUE( state.CommitShellResults({0U}, std::move(stale_shell_candidate)).IsOk()) | EXPECT_EQ(state.Identity().step_name, prior.Identity().step_name) | EXPECT_EQ(state.Identity().frame_index, prior.Identity().frame_index) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].element, prior.EndpointResults()[0U].element) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.GaussResults().size(), prior.GaussResults().size()) | EXPECT_EQ(state.GaussResults()[0U].generalized_resultant, prior.GaussResults()[0U].generalized_resultant) | ASSERT_EQ(state.StressResults().size(), prior.StressResults().size()) | EXPECT_DOUBLE_EQ(state.StressResults()[0U].s11, prior.StressResults()[0U].s11) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].generalized_strain, prior.ShellResults()[0U].generalized_strain) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) ASSERT_TRUE( state.CommitShellResults({0U}, std::move(stale_shell_candidate)).IsOk()) | EXPECT_EQ(state.Identity().step_name, prior.Identity().step_name) | EXPECT_EQ(state.Identity().frame_index, prior.Identity().frame_index) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].element, prior.EndpointResults()[0U].element) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.GaussResults().size(), prior.GaussResults().size()) | EXPECT_EQ(state.GaussResults()[0U].generalized_resultant, prior.GaussResults()[0U].generalized_resultant) | ASSERT_EQ(state.StressResults().size(), prior.StressResults().size()) | EXPECT_DOUBLE_EQ(state.StressResults()[0U].s11, prior.StressResults()[0U].s11) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].generalized_strain, prior.ShellResults()[0U].generalized_strain) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.ComputesResidualReactionForNonzeroPrescription ResultRecovery.ComputesResidualReactionForNonzeroPrescription; assertion 12개 tests/unit/results/result_recovery_test.cpp ResultRecovery.ComputesResidualReactionForNonzeroPrescription 유지 원문 검사 body 및 assertion 동일. 08216ddb5db36bbc534126bdf775ee7846b18b311b89da188e0e53b71af49608 08216ddb5db36bbc534126bdf775ee7846b18b311b89da188e0e53b71af49608 ASSERT_TRUE(state.CommitShellResults({}, stale_shell_evidence).IsOk()) | ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[6U], 20.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], 0.0) | EXPECT_TRUE(state.ShellResults().empty()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 0.0) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) ASSERT_TRUE(state.CommitShellResults({}, stale_shell_evidence).IsOk()) | ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[6U], 20.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], 0.0) | EXPECT_TRUE(state.ShellResults().empty()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 0.0) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.EnforcesNormalizedFreeResidual ResultRecovery.EnforcesNormalizedFreeResidual; assertion 9개 tests/unit/results/result_recovery_test.cpp ResultRecovery.EnforcesNormalizedFreeResidual 유지 원문 검사 body 및 assertion 동일. 1e96704cc4b176ba73193a9853cc81c56fd130dd92540b88fbc71bef07655032 1e96704cc4b176ba73193a9853cc81c56fd130dd92540b88fbc71bef07655032 EXPECT_DOUBLE_EQ(failed.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(failed.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[0U], 93.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[6U], 94.0) | EXPECT_EQ(failed.EndpointResults().size(), 1U) | ASSERT_TRUE(threshold_status.IsOk()) | EXPECT_NE(threshold_pass.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(threshold_pass.Reaction()[6U], threshold_pass.Residual()[6U]) | EXPECT_TRUE( fesa::ResultRecovery::Recover(*zero_fixture.model, *zero_fixture.dofs, *zero_fixture.stiffness, zero_equilibrium) .IsOk()) EXPECT_DOUBLE_EQ(failed.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(failed.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[0U], 93.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[6U], 94.0) | EXPECT_EQ(failed.EndpointResults().size(), 1U) | ASSERT_TRUE(threshold_status.IsOk()) | EXPECT_NE(threshold_pass.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(threshold_pass.Reaction()[6U], threshold_pass.Residual()[6U]) | EXPECT_TRUE( fesa::ResultRecovery::Recover(*zero_fixture.model, *zero_fixture.dofs, *zero_fixture.stiffness, zero_equilibrium) .IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct; assertion 10개 tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct 유지 원문 검사 body 및 assertion 동일. 8202381a9f03eaa3d8d5a513ff7109d219c64045aa63639c3d67d6a1a1990838 8202381a9f03eaa3d8d5a513ff7109d219c64045aa63639c3d67d6a1a1990838 ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.EndpointResults().size(), 2U) | ASSERT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.EndpointResults()[0U].endpoint, 0) | EXPECT_EQ(state.EndpointResults()[1U].endpoint, 1) | EXPECT_EQ(state.GaussResults()[0U].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[1U].gauss_point, 2) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0U].end_action[0U], -state.EndpointResults()[0U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.EndpointResults()[1U].end_action[0U], state.EndpointResults()[1U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.GaussResults()[0U].generalized_resultant[0U], state.EndpointResults()[0U].section_resultant[0U]) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.EndpointResults().size(), 2U) | ASSERT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.EndpointResults()[0U].endpoint, 0) | EXPECT_EQ(state.EndpointResults()[1U].endpoint, 1) | EXPECT_EQ(state.GaussResults()[0U].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[1U].gauss_point, 2) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0U].end_action[0U], -state.EndpointResults()[0U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.EndpointResults()[1U].end_action[0U], state.EndpointResults()[1U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.GaussResults()[0U].generalized_resultant[0U], state.EndpointResults()[0U].section_resultant[0U]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns; assertion 1개 tests/unit/results/result_recovery_test.cpp ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns 유지 원문 검사 body 및 assertion 동일. 180b227a99c3cf6f4fc40c9dafa7a98cafcc456ef146b083300d66db8187a98e 180b227a99c3cf6f4fc40c9dafa7a98cafcc456ef146b083300d66db8187a98e ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.OrdersStressPointsAndDefaultCentroid ResultRecovery.OrdersStressPointsAndDefaultCentroid; assertion 14개 tests/unit/results/result_recovery_test.cpp ResultRecovery.OrdersStressPointsAndDefaultCentroid 유지 원문 검사 body 및 assertion 동일. 27b9a3f6418687d3b2b4d657ae2c41df972cefae91ec474d642f4f8664dea77b 27b9a3f6418687d3b2b4d657ae2c41df972cefae91ec474d642f4f8664dea77b "ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(row.element, 0U) | EXPECT_EQ(row.gauss_point, static_cast(gauss + 1U)) | EXPECT_EQ(row.section_point, point + 1U) | EXPECT_DOUBLE_EQ(row.x1, section_points[point][0U]) | EXPECT_DOUBLE_EQ(row.x2, section_points[point][1U]) | EXPECT_EQ(row.source, ""input"") | ASSERT_TRUE(fesa::ResultRecovery::Recover( *default_fixture.model, *default_fixture.dofs, *default_fixture.stiffness, default_state) .IsOk()) | ASSERT_EQ(default_state.StressResults().size(), 2U) | EXPECT_EQ(row.section_point, 0U) | EXPECT_DOUBLE_EQ(row.x1, 0.0) | EXPECT_DOUBLE_EQ(row.x2, 0.0) | EXPECT_EQ(row.source, ""fesa-default"")" "ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(row.element, 0U) | EXPECT_EQ(row.gauss_point, static_cast(gauss + 1U)) | EXPECT_EQ(row.section_point, point + 1U) | EXPECT_DOUBLE_EQ(row.x1, section_points[point][0U]) | EXPECT_DOUBLE_EQ(row.x2, section_points[point][1U]) | EXPECT_EQ(row.source, ""input"") | ASSERT_TRUE(fesa::ResultRecovery::Recover( *default_fixture.model, *default_fixture.dofs, *default_fixture.stiffness, default_state) .IsOk()) | ASSERT_EQ(default_state.StressResults().size(), 2U) | EXPECT_EQ(row.section_point, 0U) | EXPECT_DOUBLE_EQ(row.x1, 0.0) | EXPECT_DOUBLE_EQ(row.x2, 0.0) | EXPECT_EQ(row.source, ""fesa-default"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging; assertion 10개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging 유지 원문 검사 body 및 assertion 동일. aa4603901819c039277bbba8fe36bfcecb9264320ae115f7e9e2d4e6d873a1b1 aa4603901819c039277bbba8fe36bfcecb9264320ae115f7e9e2d4e6d873a1b1 ASSERT_TRUE(normalized.HasValue()) | ASSERT_EQ(normalized.Value().size(), 3U) | EXPECT_EQ(normalized.Value()[1U].representative_element, 0U) | EXPECT_DOUBLE_EQ(normalized.Value()[1U].section_resultant[0U], 5.0) | ASSERT_FALSE(mismatch.HasValue()) | ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_FALSE(invalid_tolerance.HasValue()) | ASSERT_FALSE(loaded.HasValue()) | ASSERT_FALSE(reversed.HasValue()) | ASSERT_FALSE(jumped.HasValue()) ASSERT_TRUE(normalized.HasValue()) | ASSERT_EQ(normalized.Value().size(), 3U) | EXPECT_EQ(normalized.Value()[1U].representative_element, 0U) | EXPECT_DOUBLE_EQ(normalized.Value()[1U].section_resultant[0U], 5.0) | ASSERT_FALSE(mismatch.HasValue()) | ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_FALSE(invalid_tolerance.HasValue()) | ASSERT_FALSE(loaded.HasValue()) | ASSERT_FALSE(reversed.HasValue()) | ASSERT_FALSE(jumped.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversShellRowsInStableElementAndGpOrder ResultRecovery.RecoversShellRowsInStableElementAndGpOrder; assertion 8개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversShellRowsInStableElementAndGpOrder 유지 원문 검사 body 및 assertion 동일. 9b8de6c23bd1314478b477a76540282c66318f375a6ea2d344cdf3521ba57569 9b8de6c23bd1314478b477a76540282c66318f375a6ea2d344cdf3521ba57569 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(row.element, element) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates, coordinates[point]) | EXPECT_EQ(row.local_frame, expected_frame) | EXPECT_NEAR(row.generalized_strain[component], expected_strain[component], 1.0e-12) | EXPECT_NEAR(row.section_resultant[component], expected_resultant[component], 1.0e-12) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(row.element, element) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates, coordinates[point]) | EXPECT_EQ(row.local_frame, expected_frame) | EXPECT_NEAR(row.generalized_strain[component], expected_strain[component], 1.0e-12) | EXPECT_NEAR(row.section_resultant[component], expected_resultant[component], 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversDirectBottomMiddleTopShellStress ResultRecovery.RecoversDirectBottomMiddleTopShellStress; assertion 5개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversDirectBottomMiddleTopShellStress 유지 원문 검사 body 및 assertion 동일. b3e0100d6b0502831741ebd4ba7e572f405e0fa496e7a864df24df615e6a681a b3e0100d6b0502831741ebd4ba7e572f405e0fa496e7a864df24df615e6a681a ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(row.stress[position].position, positions[position]) | EXPECT_DOUBLE_EQ(row.stress[position].zeta, zeta[position]) | EXPECT_NEAR(row.stress[position].components[component], expected_stress[position][component], 1.0e-12) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(row.stress[position].position, positions[position]) | EXPECT_DOUBLE_EQ(row.stress[position].zeta, zeta[position]) | EXPECT_NEAR(row.stress[position].components[component], expected_stress[position][component], 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder; assertion 3개 tests/unit/results/result_recovery_test.cpp ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder 유지 원문 검사 body 및 assertion 동일. 00b5b24a4976ce98df0b3e5204d6c3e1295111aa571f737aa02b5c59d7b9c4d8 00b5b24a4976ce98df0b3e5204d6c3e1295111aa571f737aa02b5c59d7b9c4d8 ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | EXPECT_NEAR(state.PhysicalStrainEnergy(), 72.16, 1.0e-12) | EXPECT_GT(stabilized_energy, state.PhysicalStrainEnergy()) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | EXPECT_NEAR(state.PhysicalStrainEnergy(), 72.16, 1.0e-12) | EXPECT_GT(stabilized_energy, state.PhysicalStrainEnergy()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium; assertion 11개 tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium 유지 원문 검사 body 및 assertion 동일. 26ba2a3d96f0e02c4b251de544b76a99d82d3346023d01b17cf80133ca3c067e 26ba2a3d96f0e02c4b251de544b76a99d82d3346023d01b17cf80133ca3c067e ASSERT_TRUE(full_load.HasValue()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_DOUBLE_EQ(state.InternalForce()[full_dof], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[full_dof], -state.ExternalForce()[full_dof]) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], state.Residual()[full_dof]) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*free_fixture.model, *free_fixture.dofs, *free_fixture.stiffness, perturbed) .IsOk()) | EXPECT_GT(metric, 0.0) | EXPECT_LE(metric, 1.0e-10) ASSERT_TRUE(full_load.HasValue()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_DOUBLE_EQ(state.InternalForce()[full_dof], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[full_dof], -state.ExternalForce()[full_dof]) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], state.Residual()[full_dof]) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*free_fixture.model, *free_fixture.dofs, *free_fixture.stiffness, perturbed) .IsOk()) | EXPECT_GT(metric, 0.0) | EXPECT_LE(metric, 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesGlobalOriginForShellMomentBalance ResultRecovery.UsesGlobalOriginForShellMomentBalance; assertion 5개 tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesGlobalOriginForShellMomentBalance 유지 원문 검사 body 및 assertion 동일. 91bda66039ec2ad9dd1d554d2fec6de249e3b4327105a883b94dc64877e091b5 91bda66039ec2ad9dd1d554d2fec6de249e3b4327105a883b94dc64877e091b5 ASSERT_TRUE(fesa::ResultRecovery::Recover( *centered_fixture.model, *centered_fixture.dofs, *centered_fixture.stiffness, centered) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover( *translated_fixture.model, *translated_fixture.dofs, *translated_fixture.stiffness, translated) .IsOk()) | EXPECT_NEAR(translated.Equilibrium()[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated.Equilibrium()[3U + component] - centered.Equilibrium()[3U + component], translated_moment_delta[component], 5.0e-12) | EXPECT_GT(std::abs(translated_moment_delta[2U]), 1.0e-9) ASSERT_TRUE(fesa::ResultRecovery::Recover( *centered_fixture.model, *centered_fixture.dofs, *centered_fixture.stiffness, centered) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover( *translated_fixture.model, *translated_fixture.dofs, *translated_fixture.stiffness, translated) .IsOk()) | EXPECT_NEAR(translated.Equilibrium()[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated.Equilibrium()[3U + component] - centered.Equilibrium()[3U + component], translated_moment_delta[component], 5.0e-12) | EXPECT_GT(std::abs(translated_moment_delta[2U]), 1.0e-9) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess; assertion 6개 tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess 유지 원문 검사 body 및 assertion 동일. 1a8b5c99778239402aa2e0e22d9f40513451781fbc64d04853b30ab367af26a9 1a8b5c99778239402aa2e0e22d9f40513451781fbc64d04853b30ab367af26a9 ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, subunit) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, large) .IsOk()) | EXPECT_GT(subunit.VerificationMetrics()[metric], 0.0) | EXPECT_GT(large.VerificationMetrics()[metric], 0.0) | EXPECT_NEAR(subunit.VerificationMetrics()[metric], large.VerificationMetrics()[metric], 1.0e-13) | ASSERT_TRUE(unbalanced_stiffness.HasValue()) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, subunit) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, large) .IsOk()) | EXPECT_GT(subunit.VerificationMetrics()[metric], 0.0) | EXPECT_GT(large.VerificationMetrics()[metric], 0.0) | EXPECT_NEAR(subunit.VerificationMetrics()[metric], large.VerificationMetrics()[metric], 1.0e-13) | ASSERT_TRUE(unbalanced_stiffness.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged; assertion 15개 tests/unit/results/result_recovery_test.cpp ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged 유지 원문 검사 body 및 assertion 동일. cdc079f64476222e15342ee83a53f02ad11ba110191fcc7b334c22cccd03aaba cdc079f64476222e15342ee83a53f02ad11ba110191fcc7b334c22cccd03aaba ASSERT_TRUE(fesa::ResultRecovery::Recover(*valid_fixture.model, *valid_fixture.dofs, *valid_fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | ASSERT_TRUE(zero_stiffness.HasValue()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], 93.0) | EXPECT_EQ(state.EndpointResults().size(), 1U) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(state.ShellResults().front().element, prior_first_row.element) | EXPECT_EQ(state.ShellResults().front().location, prior_first_row.location) | EXPECT_EQ(state.ShellResults().front().generalized_strain, prior_first_row.generalized_strain) | EXPECT_EQ(state.ShellResults().front().section_resultant, prior_first_row.section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior_energy) | EXPECT_EQ(state.Equilibrium(), prior_equilibrium) | EXPECT_EQ(state.VerificationMetrics(), prior_metrics) ASSERT_TRUE(fesa::ResultRecovery::Recover(*valid_fixture.model, *valid_fixture.dofs, *valid_fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | ASSERT_TRUE(zero_stiffness.HasValue()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], 93.0) | EXPECT_EQ(state.EndpointResults().size(), 1U) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(state.ShellResults().front().element, prior_first_row.element) | EXPECT_EQ(state.ShellResults().front().location, prior_first_row.location) | EXPECT_EQ(state.ShellResults().front().generalized_strain, prior_first_row.generalized_strain) | EXPECT_EQ(state.ShellResults().front().section_resultant, prior_first_row.section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior_energy) | EXPECT_EQ(state.Equilibrium(), prior_equilibrium) | EXPECT_EQ(state.VerificationMetrics(), prior_metrics) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp ResultRecovery.RealSolidPayloadFailsClosedAndPreservesLegacyState ResultRecovery.RealSolidPayloadFailsClosedAndPreservesLegacyState; assertion 9개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RealSolidPayloadFailsClosedAndPreservesLegacyState 유지 원문 검사 body 및 assertion 동일. b141c6cecbdb1ae52c1c6d824f368ca38f6d56aef54f660dac80dd383e2dd22d b141c6cecbdb1ae52c1c6d824f368ca38f6d56aef54f660dac80dd383e2dd22d "ASSERT_TRUE(solid.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 37.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 19.0) | ASSERT_EQ(state.EndpointResults().size(), 2U) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0].section_resultant[0], 11.0) | EXPECT_EQ(state.Identity().step_name, ""prior-step"") | EXPECT_EQ(state.Identity().frame_index, 9U)" "ASSERT_TRUE(solid.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 37.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 19.0) | ASSERT_EQ(state.EndpointResults().size(), 2U) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0].section_resultant[0], 11.0) | EXPECT_EQ(state.Identity().step_name, ""prior-step"") | EXPECT_EQ(state.Identity().frame_index, 9U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Dev tests/unit/results/result_recovery_test.cpp support@1-486 helper/oracle/fixture/include/static assertion 구간: RecoveryFixture, ShellRecoveryFixture, FakeRecoveryElement, if, FullNodeComponents, MakeRuntimeLayout, MakeFakeBeamBundle, MakeFakeShellBundle, ExpectVectorEqual, MakeShellFixture, MakeShellPhysicalState, MakeAxialEquilibriumState, for, MakePatchState, ExpectStatusCode, ExpectScaledNear, MakeStationRows tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eb7cc3528f2f1b6ff89196b0aa6af7976ed75a3e979be52ea96ad2bdc358192a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@536-537 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 212a78df598b1f4fe28beea4828a6b61a489b64fdcab0d4dac8e166621522216 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@567-568 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 212a78df598b1f4fe28beea4828a6b61a489b64fdcab0d4dac8e166621522216 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@873-874 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. be9695a1dfd710a92ce4bd7a28b2ff4722998e936a18a40b7ad3b0924d6db21b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@922-923 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5b2f4ea71173df2f4c511be4321417651647b1f1d79e724c3bd99c3dc2ab8106 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@950-951 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 77d8fb9f45d9b90eb930d818340de8b1fd2f4478fc8093bfbdeb0303184ca57f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@970-971 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 685f08a7676bc65e1f3c60ee0bba4f30043ab66b05381db014971b3a9376382e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@1014-1015 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. edf7cabe953adfaded5d4481da649c54147c680bae27dfe27563b87d850789f0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@1058-1059 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 685f08a7676bc65e1f3c60ee0bba4f30043ab66b05381db014971b3a9376382e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/result_recovery_test.cpp support@1108-1109 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fa11ba7d5f866feb0c6e224aba5f382047c5f0c223ccedf90498730c1edf3fe8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/unit/results/results_writer_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dab162df80e0126149d6fd61a4d6a18b71935517fd6f4567da8ab998310ebdb2 afa4f1287a951645a1e9bd2c4cc5cb8603615670944362cf89f3780befd82dee 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/results/results_writer_test.cpp support@1-23 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/results_writer_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 33272c49028087f879e966999cc2bcc48bc7750881a4eee92a48d84618909e6c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 34개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eaebae0e4350e20ce66e07f762b7d2c867a06db4ad89afaac90c92bfc1d4ca61 eaebae0e4350e20ce66e07f762b7d2c867a06db4ad89afaac90c92bfc1d4ca61 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesN1AndRetainsBackendEvidence MklFeastEigenSolver.SolvesN1AndRetainsBackendEvidence; assertion 19개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesN1AndRetainsBackendEvidence 유지 원문 검사 body 및 assertion 동일. a5e6952b5e691cd318758a58e51cc8c0cadbf6992466d2919582d812f7efc0fa a5e6952b5e691cd318758a58e51cc8c0cadbf6992466d2919582d812f7efc0fa "EXPECT_EQ(result.Value().requested_modes, 1U) | ASSERT_EQ(result.Value().eigenvalues.size(), 1U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 4.0, 1.0e-10) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 4.0) | EXPECT_EQ(result.Value().eigenvectors.Rows(), 1U) | EXPECT_EQ(result.Value().eigenvectors.Columns(), 1U) | EXPECT_EQ(result.Value().thread_count, 1U) | ASSERT_EQ(result.Value().base_fpm.size(), 128U) | EXPECT_EQ(result.Value().base_fpm[5U], 0) | ASSERT_FALSE(result.Value().backend_calls.empty()) | EXPECT_EQ(result.Value().backend_calls.front().purpose, ""total-enclosure"") | EXPECT_EQ(result.Value().backend_calls.back().kind, ""solve"") | EXPECT_TRUE(result.Value().backend_calls.back().count_available) | EXPECT_EQ(result.Value().backend_calls.back().count, result.Value().eigenvalues.size()) | EXPECT_TRUE(result.Value().backend_calls.back().loop_available) | EXPECT_TRUE(result.Value().backend_calls.back().epsout_available) | EXPECT_EQ(result.Value().backend_calls.back().outcome, ""accepted"") | EXPECT_EQ(result.Value().backend_calls.back().decision_reason, ""accepted"") | EXPECT_FALSE(result.Value().upper_search_termination.empty())" "EXPECT_EQ(result.Value().requested_modes, 1U) | ASSERT_EQ(result.Value().eigenvalues.size(), 1U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 4.0, 1.0e-10) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 4.0) | EXPECT_EQ(result.Value().eigenvectors.Rows(), 1U) | EXPECT_EQ(result.Value().eigenvectors.Columns(), 1U) | EXPECT_EQ(result.Value().thread_count, 1U) | ASSERT_EQ(result.Value().base_fpm.size(), 128U) | EXPECT_EQ(result.Value().base_fpm[5U], 0) | ASSERT_FALSE(result.Value().backend_calls.empty()) | EXPECT_EQ(result.Value().backend_calls.front().purpose, ""total-enclosure"") | EXPECT_EQ(result.Value().backend_calls.back().kind, ""solve"") | EXPECT_TRUE(result.Value().backend_calls.back().count_available) | EXPECT_EQ(result.Value().backend_calls.back().count, result.Value().eigenvalues.size()) | EXPECT_TRUE(result.Value().backend_calls.back().loop_available) | EXPECT_TRUE(result.Value().backend_calls.back().epsout_available) | EXPECT_EQ(result.Value().backend_calls.back().outcome, ""accepted"") | EXPECT_EQ(result.Value().backend_calls.back().decision_reason, ""accepted"") | EXPECT_FALSE(result.Value().upper_search_termination.empty())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesAllZeroWithExplicitPhysicalScale MklFeastEigenSolver.SolvesAllZeroWithExplicitPhysicalScale; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesAllZeroWithExplicitPhysicalScale 유지 원문 검사 body 및 assertion 동일. 9132a899409f4f8bb3a08c9f5c18c3f0ff1a4857bf1f98571340163e4553f691 9132a899409f4f8bb3a08c9f5c18c3f0ff1a4857bf1f98571340163e4553f691 ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 7.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 7.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRepeatedMultiplicityAndStableOrder MklFeastEigenSolver.PreservesRepeatedMultiplicityAndStableOrder; assertion 8개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRepeatedMultiplicityAndStableOrder 유지 원문 검사 body 및 assertion 동일. 569416623ee5b90db9c898f92f589b8eb7bda065baaf7f777feb8245b14f19a8 569416623ee5b90db9c898f92f589b8eb7bda065baaf7f777feb8245b14f19a8 ASSERT_EQ(first.Value().eigenvalues.size(), 3U) | EXPECT_NEAR(first.Value().eigenvalues[0U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[1U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[2U], 5.0, 1.0e-10) | EXPECT_EQ(first.Value().column_ids, second.Value().column_ids) | EXPECT_EQ(first.Value().column_ids, third.Value().column_ids) | EXPECT_EQ(first.Value().eigenvalues, second.Value().eigenvalues) | EXPECT_EQ(first.Value().eigenvalues, third.Value().eigenvalues) ASSERT_EQ(first.Value().eigenvalues.size(), 3U) | EXPECT_NEAR(first.Value().eigenvalues[0U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[1U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[2U], 5.0, 1.0e-10) | EXPECT_EQ(first.Value().column_ids, second.Value().column_ids) | EXPECT_EQ(first.Value().column_ids, third.Value().column_ids) | EXPECT_EQ(first.Value().eigenvalues, second.Value().eigenvalues) | EXPECT_EQ(first.Value().eigenvalues, third.Value().eigenvalues) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesGuardedPrefixWithoutDroppingRepeatedCluster MklFeastEigenSolver.UsesGuardedPrefixWithoutDroppingRepeatedCluster; assertion 6개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesGuardedPrefixWithoutDroppingRepeatedCluster 유지 원문 검사 body 및 assertion 동일. 56315bd7fccef615e71cc32988f93ec30232ca90502bf20c0402180d597c0685 56315bd7fccef615e71cc32988f93ec30232ca90502bf20c0402180d597c0685 "EXPECT_GE(one_mode.Value().eigenvalues.size(), 40U) | EXPECT_GE(forty_first.Value().eigenvalues.size(), 41U) | EXPECT_NEAR(one_mode.Value().eigenvalues[index], 1.0, 1.0e-10) | EXPECT_NEAR(forty_first.Value().eigenvalues[40U], 2.0, 1.0e-10) | EXPECT_EQ(one_mode.Value().backend_calls.back().kind, ""solve"") | EXPECT_EQ(forty_first.Value().backend_calls.back().kind, ""solve"")" "EXPECT_GE(one_mode.Value().eigenvalues.size(), 40U) | EXPECT_GE(forty_first.Value().eigenvalues.size(), 41U) | EXPECT_NEAR(one_mode.Value().eigenvalues[index], 1.0, 1.0e-10) | EXPECT_NEAR(forty_first.Value().eigenvalues[40U], 2.0, 1.0e-10) | EXPECT_EQ(one_mode.Value().backend_calls.back().kind, ""solve"") | EXPECT_EQ(forty_first.Value().backend_calls.back().kind, ""solve"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsSignificantNegativeSpectrum MklFeastEigenSolver.RejectsSignificantNegativeSpectrum; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsSignificantNegativeSpectrum 유지 원문 검사 body 및 assertion 동일. 0c5373e53f768aa91e99580e4d48e737a8b3ed32c98f141d8c4d2faa02a523d6 0c5373e53f768aa91e99580e4d48e737a8b3ed32c98f141d8c4d2faa02a523d6 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""negative-eigenvalue-spectrum"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""negative-eigenvalue-spectrum"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.KeepsCloseDistinctModesSeparated MklFeastEigenSolver.KeepsCloseDistinctModesSeparated; assertion 5개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.KeepsCloseDistinctModesSeparated 유지 원문 검사 body 및 assertion 동일. 14aacceeae53faa7a062beccd27707e37541fd4a20e7ccd64ad38f6bbacf57f0 14aacceeae53faa7a062beccd27707e37541fd4a20e7ccd64ad38f6bbacf57f0 ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 1.0, 1.0e-10) | EXPECT_NEAR(result.Value().eigenvalues[1U], 1.001, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(0U, 0U)), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(1U, 1U)), 1.0, 1.0e-10) ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 1.0, 1.0e-10) | EXPECT_NEAR(result.Value().eigenvalues[1U], 1.001, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(0U, 0U)), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(1U, 1U)), 1.0, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RestoresCallingThreadLocalSetting MklFeastEigenSolver.RestoresCallingThreadLocalSetting; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RestoresCallingThreadLocalSetting 유지 원문 검사 body 및 assertion 동일. 83ad3e485cd51a75937fe2c31aa9ca90a33b7dddd67acdfeea5e2c8b21a3bb7f 83ad3e485cd51a75937fe2c31aa9ca90a33b7dddd67acdfeea5e2c8b21a3bb7f EXPECT_EQ(restored, 2) EXPECT_EQ(restored, 2) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsInvalidRequestAndZeroScale MklFeastEigenSolver.RejectsInvalidRequestAndZeroScale; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsInvalidRequestAndZeroScale 유지 원문 검사 body 및 assertion 동일. 8689fda7e7994805ac76572196bc34cf736664e5b643b71233cacc3e6a29d13b 8689fda7e7994805ac76572196bc34cf736664e5b643b71233cacc3e6a29d13b "ASSERT_FALSE(zero_request.HasValue()) | EXPECT_EQ(zero_request.GetStatus().Diagnostics()[0U].code, ""feast-invalid-dimension"") | ASSERT_FALSE(invalid_scale.HasValue()) | EXPECT_EQ(invalid_scale.GetStatus().Diagnostics()[0U].code, ""feast-invalid-zero-scale"")" "ASSERT_FALSE(zero_request.HasValue()) | EXPECT_EQ(zero_request.GetStatus().Diagnostics()[0U].code, ""feast-invalid-dimension"") | ASSERT_FALSE(invalid_scale.HasValue()) | EXPECT_EQ(invalid_scale.GetStatus().Diagnostics()[0U].code, ""feast-invalid-zero-scale"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesLowestPrefixForZeroAndPositiveSpectra MklFeastEigenSolver.PreservesLowestPrefixForZeroAndPositiveSpectra; assertion 3개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesLowestPrefixForZeroAndPositiveSpectra 유지 원문 검사 body 및 assertion 동일. aa89c5b6a3123bea8bd03219a4334166bf4f607ff70abfab02cb536b18768f5d aa89c5b6a3123bea8bd03219a4334166bf4f607ff70abfab02cb536b18768f5d ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), requested) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-10) ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), requested) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.ResolvesCloseDistinctSpectrumAfterGivensCongruence MklFeastEigenSolver.ResolvesCloseDistinctSpectrumAfterGivensCongruence; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.ResolvesCloseDistinctSpectrumAfterGivensCongruence 유지 원문 검사 body 및 assertion 동일. b173141930f9c7d787cee4d5715c4f4fcf346e6fe947e9e8b1fa60784764641d b173141930f9c7d787cee4d5715c4f4fcf346e6fe947e9e8b1fa60784764641d ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 4U) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-12) | EXPECT_GT(result.Value().eigenvalues[1U] - result.Value().eigenvalues[0U], 1e-9) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 4U) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-12) | EXPECT_GT(result.Value().eigenvalues[1U] - result.Value().eigenvalues[0U], 1e-9) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFatalCountStatusWithoutRetry MklFeastEigenSolver.RejectsFatalCountStatusWithoutRetry; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFatalCountStatusWithoutRetry 유지 원문 검사 body 및 assertion 동일. 23ef85953cd9408cae46249383f429500ae4234067387d6c8d0a3aa9eb5b96bf 23ef85953cd9408cae46249383f429500ae4234067387d6c8d0a3aa9eb5b96bf EXPECT_EQ(hook_calls, 1U) EXPECT_EQ(hook_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsCountCallsAndUpperSearchReservations MklFeastEigenSolver.BoundsCountCallsAndUpperSearchReservations; assertion 6개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsCountCallsAndUpperSearchReservations 유지 원문 검사 body 및 assertion 동일. 2e3d9cc28ce1c4d1909d0afc2950f88e8be5ba66d8f4344829561fe06601e8ca 2e3d9cc28ce1c4d1909d0afc2950f88e8be5ba66d8f4344829561fe06601e8ca EXPECT_TRUE(fesa::internal::CanCallFeast(511U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(512U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(kMaximum)) | EXPECT_TRUE(fesa::internal::CanStartUpperCandidate(363U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(364U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(kMaximum)) EXPECT_TRUE(fesa::internal::CanCallFeast(511U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(512U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(kMaximum)) | EXPECT_TRUE(fesa::internal::CanStartUpperCandidate(363U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(364U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(kMaximum)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsPrivateWorkspaceProductsBeforeAllocation MklFeastEigenSolver.BoundsPrivateWorkspaceProductsBeforeAllocation; assertion 7개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsPrivateWorkspaceProductsBeforeAllocation 유지 원문 검사 body 및 assertion 동일. 69110366294c0c4a271e8295fa2352576136369334a1db1c9346511d5496e742 69110366294c0c4a271e8295fa2352576136369334a1db1c9346511d5496e742 EXPECT_TRUE(fesa::internal::ProductFits(0U, kMaximum)) | EXPECT_TRUE(fesa::internal::ProductFits(1U, kMaximum)) | EXPECT_FALSE(fesa::internal::ProductFits(kMaximum, 2U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(0U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(storage_limit)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(kMaximum)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(storage_limit + 1U)) EXPECT_TRUE(fesa::internal::ProductFits(0U, kMaximum)) | EXPECT_TRUE(fesa::internal::ProductFits(1U, kMaximum)) | EXPECT_FALSE(fesa::internal::ProductFits(kMaximum, 2U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(0U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(storage_limit)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(kMaximum)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(storage_limit + 1U)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesCountWorkspaceAllocationFailure MklFeastEigenSolver.TranslatesCountWorkspaceAllocationFailure; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesCountWorkspaceAllocationFailure 유지 원문 검사 body 및 assertion 동일. 6653c1ccf3f12cf12023f4ed701c5a2dc2eac565ab6e4ab2da403e6f3a9dae65 6653c1ccf3f12cf12023f4ed701c5a2dc2eac565ab6e4ab2da403e6f3a9dae65 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesSolveWorkspaceAllocationFailure MklFeastEigenSolver.TranslatesSolveWorkspaceAllocationFailure; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesSolveWorkspaceAllocationFailure 유지 원문 검사 body 및 assertion 동일. e6817b904d15200de1dc8c70b40668142140bdc4adb47c239509b16c4f911842 e6817b904d15200de1dc8c70b40668142140bdc4adb47c239509b16c4f911842 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.StopsInitialInfoOneAfterThreeCountCalls MklFeastEigenSolver.StopsInitialInfoOneAfterThreeCountCalls; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.StopsInitialInfoOneAfterThreeCountCalls 유지 원문 검사 body 및 assertion 동일. 10672f977ec5bdc9692c2dfabec9acb4435e639b18d49cc197a2ccea7b53ff97 10672f977ec5bdc9692c2dfabec9acb4435e639b18d49cc197a2ccea7b53ff97 EXPECT_EQ(count_calls, 3U) EXPECT_EQ(count_calls, 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFinalCountHistoryMismatch MklFeastEigenSolver.RejectsFinalCountHistoryMismatch; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFinalCountHistoryMismatch 유지 원문 검사 body 및 assertion 동일. caea386d5db1999417f7d1140ee543ea3a5cd1398399815033afd2f1b45ebcd6 caea386d5db1999417f7d1140ee543ea3a5cd1398399815033afd2f1b45ebcd6 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsDecreasingCountAcrossDistinctUpperGuards MklFeastEigenSolver.RejectsDecreasingCountAcrossDistinctUpperGuards; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsDecreasingCountAcrossDistinctUpperGuards 유지 원문 검사 body 및 assertion 동일. 1c401c1682daa62d7105287575a7eac825c905e53825c3ea124477f3a823be7b 1c401c1682daa62d7105287575a7eac825c905e53825c3ea124477f3a823be7b 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRawNegativeBoundaryAndRejectsBelowIt MklFeastEigenSolver.PreservesRawNegativeBoundaryAndRejectsBelowIt; assertion 5개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRawNegativeBoundaryAndRejectsBelowIt 유지 원문 검사 body 및 assertion 동일. b6c6927ededce6c56a882de187bb35bbfa8c258b533098f90c7e54e6f0d5a324 b6c6927ededce6c56a882de187bb35bbfa8c258b533098f90c7e54e6f0d5a324 ASSERT_EQ(outputs.eigenvalues.size(), 3U) | ASSERT_EQ(result.Value().eigenvalues.size(), 3U) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], negative) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[2U], 1.0) ASSERT_EQ(outputs.eigenvalues.size(), 3U) | ASSERT_EQ(result.Value().eigenvalues.size(), 3U) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], negative) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[2U], 1.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.DoesNotRepeatUnchangedSolveAfterReturnedMismatch MklFeastEigenSolver.DoesNotRepeatUnchangedSolveAfterReturnedMismatch; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.DoesNotRepeatUnchangedSolveAfterReturnedMismatch 유지 원문 검사 body 및 assertion 동일. bdfe92002dfd17522f8dd7038fd290fbe28018d76ea65976ca086695a056b013 bdfe92002dfd17522f8dd7038fd290fbe28018d76ea65976ca086695a056b013 EXPECT_EQ(solve_calls, 1U) EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RetriesSolveInfoTwoOnlyWithLargerInterval MklFeastEigenSolver.RetriesSolveInfoTwoOnlyWithLargerInterval; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RetriesSolveInfoTwoOnlyWithLargerInterval 유지 원문 검사 body 및 assertion 동일. bdab428a83baf0a5524548d01ca60a6c4b4383aad9358a756131de3b356e0d5a bdab428a83baf0a5524548d01ca60a6c4b4383aad9358a756131de3b356e0d5a ASSERT_EQ(solve_uppers.size(), 2U) | EXPECT_LT(solve_uppers[0U], solve_uppers[1U]) ASSERT_EQ(solve_uppers.size(), 2U) | EXPECT_LT(solve_uppers[0U], solve_uppers[1U]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteSolveOutputWithoutRetry MklFeastEigenSolver.RejectsNonfiniteSolveOutputWithoutRetry; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteSolveOutputWithoutRetry 유지 원문 검사 body 및 assertion 동일. 53d5c4a3981593c4552579e14bee4aaf3fd5e74c49b9fc74df3191bd3be660ad 53d5c4a3981593c4552579e14bee4aaf3fd5e74c49b9fc74df3191bd3be660ad EXPECT_EQ(solve_calls, 1U) EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsResidualFailureWithoutSolveRetry MklFeastEigenSolver.RejectsResidualFailureWithoutSolveRetry; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsResidualFailureWithoutSolveRetry 유지 원문 검사 body 및 assertion 동일. 5a606ee1a05bafe19f30255199a3379d849a730c837ae9e2d5b53c4a26c4aa91 5a606ee1a05bafe19f30255199a3379d849a730c837ae9e2d5b53c4a26c4aa91 "EXPECT_NE(result.GetStatus().Diagnostics().front().message.find( ""Independent whitened residual exceeds""), std::string::npos) | EXPECT_EQ(solve_calls, 1U)" "EXPECT_NE(result.GetStatus().Diagnostics().front().message.find( ""Independent whitened residual exceeds""), std::string::npos) | EXPECT_EQ(solve_calls, 1U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteVectorAndEpsoutWithoutRetry MklFeastEigenSolver.RejectsNonfiniteVectorAndEpsoutWithoutRetry; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteVectorAndEpsoutWithoutRetry 유지 원문 검사 body 및 assertion 동일. 12662d8693c0d8389fc39fd1558d7d26688e89a1d30ccb5cd7ace90035fe7f3f 12662d8693c0d8389fc39fd1558d7d26688e89a1d30ccb5cd7ace90035fe7f3f EXPECT_EQ(solve_calls, 1U) EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsGramFailureWithoutSolveRetry MklFeastEigenSolver.RejectsGramFailureWithoutSolveRetry; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsGramFailureWithoutSolveRetry 유지 원문 검사 body 및 assertion 동일. 8e1f6270e69957b1ff42bd0c5c39722bbf98eb6392b7c4dea913ace4f900787a 8e1f6270e69957b1ff42bd0c5c39722bbf98eb6392b7c4dea913ace4f900787a ASSERT_EQ(outputs.vectors.size(), 4U) | EXPECT_EQ(solve_calls, 1U) ASSERT_EQ(outputs.vectors.size(), 4U) | EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesCertifiedEnclosureAfterOptionalInfoOne MklFeastEigenSolver.UsesCertifiedEnclosureAfterOptionalInfoOne; assertion 3개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesCertifiedEnclosureAfterOptionalInfoOne 유지 원문 검사 body 및 assertion 동일. 9cf4debc6123a3d0b3c8e8be2d275202c80cc9698fdc2583b3d3038995a98c3a 9cf4debc6123a3d0b3c8e8be2d275202c80cc9698fdc2583b3d3038995a98c3a "EXPECT_EQ(result.Value().upper_search_termination, ""optional-status"") | ASSERT_GE(result.Value().backend_calls.size(), 2U) | EXPECT_EQ(result.Value().backend_calls[1U].outcome, ""optional-abandoned"")" "EXPECT_EQ(result.Value().upper_search_termination, ""optional-status"") | ASSERT_GE(result.Value().backend_calls.size(), 2U) | EXPECT_EQ(result.Value().backend_calls[1U].outcome, ""optional-abandoned"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GenuineNonDiagonalMassPencil MklFeastGeneralized.GenuineNonDiagonalMassPencil; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GenuineNonDiagonalMassPencil 유지 원문 검사 body 및 assertion 동일. 72baededa1bfdef264afcc9f4314a0886488e2c44bfe259c7ca37bfdb7de2118 72baededa1bfdef264afcc9f4314a0886488e2c44bfe259c7ca37bfdb7de2118 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0], 8.0 / 3.0, 1e-11) | EXPECT_NEAR(result.Value().eigenvalues[1], 4.0, 1e-11) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0], 8.0 / 3.0, 1e-11) | EXPECT_NEAR(result.Value().eigenvalues[1], 4.0, 1e-11) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsIndefiniteMassAndInvalidBound MklFeastGeneralized.RejectsIndefiniteMassAndInvalidBound; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsIndefiniteMassAndInvalidBound 유지 원문 검사 body 및 assertion 동일. 5e8a9f7f9837fd0d117abee37fc9630d32c9c751a38c6163015a164f6b405ac3 5e8a9f7f9837fd0d117abee37fc9630d32c9c751a38c6163015a164f6b405ac3 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.ValidatesPairsBeyondRequestedPrefix MklFeastGeneralized.ValidatesPairsBeyondRequestedPrefix; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.ValidatesPairsBeyondRequestedPrefix 유지 원문 검사 body 및 assertion 동일. 7f4b3d16aa4060b46421f1418006fddc70e34df70fd0d5e6186a7ca38a9e0841 7f4b3d16aa4060b46421f1418006fddc70e34df70fd0d5e6186a7ca38a9e0841 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().eigenvalues.size(), 3U) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().eigenvalues.size(), 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsCorruptUnselectedDirectionAndFatalCount MklFeastGeneralized.RejectsCorruptUnselectedDirectionAndFatalCount; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsCorruptUnselectedDirectionAndFatalCount 유지 원문 검사 body 및 assertion 동일. eefa09383f9cc94be8f9bf448ec69929396275705094abb5fa2355aeb2251473 eefa09383f9cc94be8f9bf448ec69929396275705094abb5fa2355aeb2251473 "EXPECT_NE( result.GetStatus().Diagnostics()[0].message.find(""Backend calls=""), std::string::npos)" "EXPECT_NE( result.GetStatus().Diagnostics()[0].message.find(""Backend calls=""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowestPrefixPreservesRepeatedBoundary MklFeastGeneralized.LowestPrefixPreservesRepeatedBoundary; assertion 3개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowestPrefixPreservesRepeatedBoundary 유지 원문 검사 body 및 assertion 동일. 2019942540740122b91b048dbd378523a47a784cfe5f3b959078ebad7131af05 2019942540740122b91b048dbd378523a47a784cfe5f3b959078ebad7131af05 ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), 5U) | EXPECT_NEAR(result.Value().eigenvalues[i], 1.0, 1e-11) ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), 5U) | EXPECT_NEAR(result.Value().eigenvalues[i], 1.0, 1e-11) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.AllocationAndCountMismatchFailClosed MklFeastGeneralized.AllocationAndCountMismatchFailClosed; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.AllocationAndCountMismatchFailClosed 유지 원문 검사 body 및 assertion 동일. 1271827bfda37b6a706c22d62f642e48bdc6e3435a5bde4f99371889c0656158 1271827bfda37b6a706c22d62f642e48bdc6e3435a5bde4f99371889c0656158 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GeneralizedRetryRetainsCertifiedCountTrace MklFeastGeneralized.GeneralizedRetryRetainsCertifiedCountTrace; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GeneralizedRetryRetainsCertifiedCountTrace 유지 원문 검사 body 및 assertion 동일. 658084530e78efa037f951551979e1681c86fa168014db6a798207bfee031bcf 658084530e78efa037f951551979e1681c86fa168014db6a798207bfee031bcf ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(injected) | EXPECT_NEAR(result.Value().eigenvalues[0], 1.0, 1e-11) | EXPECT_TRUE(retried) ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(injected) | EXPECT_NEAR(result.Value().eigenvalues[0], 1.0, 1e-11) | EXPECT_TRUE(retried) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowerPrefixCountsProveNoOmittedModesAndRejectNegative MklFeastGeneralized.LowerPrefixCountsProveNoOmittedModesAndRejectNegative; assertion 8개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowerPrefixCountsProveNoOmittedModesAndRejectNegative 유지 원문 검사 body 및 assertion 동일. 8b1ef84c46097b604c26548141d8285b664a47537ed1df79c068f5623f7018f3 8b1ef84c46097b604c26548141d8285b664a47537ed1df79c068f5623f7018f3 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(call.info, 0) | EXPECT_TRUE(call.count_available) | EXPECT_EQ(call.count, 0U) | EXPECT_LT(call.upper, 0.0) | EXPECT_LT(call.lower, call.upper) | EXPECT_EQ(guards, 3U) | EXPECT_NEAR(result.Value().eigenvalues[0], 0.0, 1e-12) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(call.info, 0) | EXPECT_TRUE(call.count_available) | EXPECT_EQ(call.count, 0U) | EXPECT_LT(call.upper, 0.0) | EXPECT_LT(call.lower, call.upper) | EXPECT_EQ(guards, 3U) | EXPECT_NEAR(result.Value().eigenvalues[0], 0.0, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Dev tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp support@1-115 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, ExpectUnitGram, RequireSuccess, ExpectFailureCode, ExpectSameBackendCalls, ExpectSameProjector, ExpectThreadSettingRestored tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 91b74d929d69e24c9a0382a7498e011486ba87f933cd35ca4a433e1ceadb2a0c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Dev tests/unit/solvers/linear/linear_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/solvers/linear/linear_solver_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f8ac257d9699d9c10673fcf5d315a0be18b2a37c88a245a16683b2cdca2bf6b3 a5aa18ef7c3aedac56b92f87740e0fa5b59acdb8ccd714ae16cc54b732ddcee0 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/linear_solver_test.cpp MklPardisoSolver.RejectsInvalidCsrStateAndDimensions MklPardisoSolver.RejectsInvalidCsrStateAndDimensions; assertion 20개 tests/unit/solvers/linear/linear_solver_test.cpp MklPardisoSolver.RejectsInvalidCsrStateAndDimensions 유지 원문 검사 body 및 assertion 동일. 026abcfd859f19c844cf0c0ebd698138e53fb66f1846dae2c7bf8e387db960f1 026abcfd859f19c844cf0c0ebd698138e53fb66f1846dae2c7bf8e387db960f1 "EXPECT_EQ(before_factorize.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(untouched[0U], 17.0) | EXPECT_DOUBLE_EQ(untouched[1U], -4.0) | ASSERT_TRUE(solver.Factorize(empty).IsOk()) | EXPECT_TRUE(solver.Solve(fesa::Vector{0U}, empty_solution).IsOk()) | EXPECT_EQ(empty_solution.Size(), 0U) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 1.0}, solution).IsOk()) | EXPECT_NEAR(solution[0U], 2.0 / 11.0, 1.0e-14) | EXPECT_NEAR(solution[1U], 3.0 / 11.0, 1.0e-14) | EXPECT_DOUBLE_EQ(solution[0U], solved_first) | EXPECT_DOUBLE_EQ(solution[1U], solved_second) | EXPECT_DOUBLE_EQ(wrong_solution[0U], 41.0) | EXPECT_EQ(rectangular_status.Diagnostics().front().code, ""solver-matrix-not-square"") | EXPECT_FALSE(invalid_csr.HasValue()) | EXPECT_EQ(nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_FALSE(scaled_nonsymmetric_status.IsOk()) | EXPECT_EQ(scaled_nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_TRUE(no_diagonal.HasValue()) | EXPECT_EQ(no_diagonal_status.Diagnostics().front().code, ""solver-missing-diagonal"")" "EXPECT_EQ(before_factorize.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(untouched[0U], 17.0) | EXPECT_DOUBLE_EQ(untouched[1U], -4.0) | ASSERT_TRUE(solver.Factorize(empty).IsOk()) | EXPECT_TRUE(solver.Solve(fesa::Vector{0U}, empty_solution).IsOk()) | EXPECT_EQ(empty_solution.Size(), 0U) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 1.0}, solution).IsOk()) | EXPECT_NEAR(solution[0U], 2.0 / 11.0, 1.0e-14) | EXPECT_NEAR(solution[1U], 3.0 / 11.0, 1.0e-14) | EXPECT_DOUBLE_EQ(solution[0U], solved_first) | EXPECT_DOUBLE_EQ(solution[1U], solved_second) | EXPECT_DOUBLE_EQ(wrong_solution[0U], 41.0) | EXPECT_EQ(rectangular_status.Diagnostics().front().code, ""solver-matrix-not-square"") | EXPECT_FALSE(invalid_csr.HasValue()) | EXPECT_EQ(nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_FALSE(scaled_nonsymmetric_status.IsOk()) | EXPECT_EQ(scaled_nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_TRUE(no_diagonal.HasValue()) | EXPECT_EQ(no_diagonal_status.Diagnostics().front().code, ""solver-missing-diagonal"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/linear_solver_test.cpp support@1-47 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, ExpectSolverFailure tests/unit/solvers/linear/linear_solver_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ace53a49bc5a95e9e3410de2815ce48ac5f275a180da13873590ccdcd1bf2018 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b278df4853fd35b4a609df18ba48bf7d27eeba7a88d58b7ff00d759f5461ccff b278df4853fd35b4a609df18ba48bf7d27eeba7a88d58b7ff00d759f5461ccff 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual; assertion 4개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual 유지 원문 검사 body 및 assertion 동일. 0dd88a78ef239ae0d316f9fc4ecbfe7e6baba99a61eda7cc8f42e6616c09915c 0dd88a78ef239ae0d316f9fc4ecbfe7e6baba99a61eda7cc8f42e6616c09915c ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs; assertion 7개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs 유지 원문 검사 body 및 assertion 동일. 0d5dd1f6b920c6201997eef647077b4039020a9adaa93483733c395ce55ecaed 0d5dd1f6b920c6201997eef647077b4039020a9adaa93483733c395ce55ecaed ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_first, first).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_second, second).IsOk()) | EXPECT_LE(RelativeError(first, expected_first), 1.0e-9) | EXPECT_LE(RelativeError(second, expected_second), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, first, rhs_first), 1.0e-10) | EXPECT_LE(NormalizedResidual(matrix, second, rhs_second), 1.0e-10) ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_first, first).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_second, second).IsOk()) | EXPECT_LE(RelativeError(first, expected_first), 1.0e-9) | EXPECT_LE(RelativeError(second, expected_second), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, first, rhs_first), 1.0e-10) | EXPECT_LE(NormalizedResidual(matrix, second, rhs_second), 1.0e-10) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SingleEquationPolicyPreservesLifecycleAndConcurrentTls MklPardisoSolver.SingleEquationPolicyPreservesLifecycleAndConcurrentTls; assertion 2개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SingleEquationPolicyPreservesLifecycleAndConcurrentTls 유지 원문 검사 body 및 assertion 동일. 610428d0485f986f40ec3a364113402a796b3d858236de908e2542bf5ebcc35f 610428d0485f986f40ec3a364113402a796b3d858236de908e2542bf5ebcc35f EXPECT_TRUE(first.get()) | EXPECT_TRUE(second.get()) EXPECT_TRUE(first.get()) | EXPECT_TRUE(second.get()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.StillRejectsNonsymmetricPublicCsr MklPardisoSolver.StillRejectsNonsymmetricPublicCsr; assertion 1개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.StillRejectsNonsymmetricPublicCsr 유지 원문 검사 body 및 assertion 동일. 2d3aeaa63b4de4a45b8b553f51fe2223bb64e4c36e107c154ea333382d3ef052 2d3aeaa63b4de4a45b8b553f51fe2223bb64e4c36e107c154ea333382d3ef052 "EXPECT_EQ(status.Diagnostics()[0U].code, ""solver-matrix-not-symmetric"")" "EXPECT_EQ(status.Diagnostics()[0U].code, ""solver-matrix-not-symmetric"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.RefactorizesWithoutLeakingState MklPardisoSolver.RefactorizesWithoutLeakingState; assertion 7개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.RefactorizesWithoutLeakingState 유지 원문 검사 body 및 assertion 동일. 72be7b9a87610a6d9dcb1324dc15b4d400c837e097dee540c00dd3e510921f35 72be7b9a87610a6d9dcb1324dc15b4d400c837e097dee540c00dd3e510921f35 ASSERT_TRUE(solver.Factorize(first_matrix).IsOk()) | ASSERT_TRUE( solver.Solve(first_matrix.Multiply(first_expected), first_solution) .IsOk()) | EXPECT_LE(RelativeError(first_solution, first_expected), 1.0e-9) | ASSERT_TRUE(solver.Factorize(second_matrix).IsOk()) | ASSERT_TRUE(solver.Solve(second_rhs, second_solution).IsOk()) | EXPECT_LE(RelativeError(second_solution, second_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(second_matrix, second_solution, second_rhs), 1.0e-10) ASSERT_TRUE(solver.Factorize(first_matrix).IsOk()) | ASSERT_TRUE( solver.Solve(first_matrix.Multiply(first_expected), first_solution) .IsOk()) | EXPECT_LE(RelativeError(first_solution, first_expected), 1.0e-9) | ASSERT_TRUE(solver.Factorize(second_matrix).IsOk()) | ASSERT_TRUE(solver.Solve(second_rhs, second_solution).IsOk()) | EXPECT_LE(RelativeError(second_solution, second_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(second_matrix, second_solution, second_rhs), 1.0e-10) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SingleEquationScopeTransitionsBetweenRetainedSizes MklPardisoSolver.SingleEquationScopeTransitionsBetweenRetainedSizes; assertion 14개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SingleEquationScopeTransitionsBetweenRetainedSizes 유지 원문 검사 body 및 assertion 동일. 42f17887618436bdd6cead4d4cd14c2d887057a8571044d2a07b9d7e3c65abcb 42f17887618436bdd6cead4d4cd14c2d887057a8571044d2a07b9d7e3c65abcb ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, {2.0})).IsOk()) | ASSERT_TRUE(solver.Solve(MakeVector({4.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | ASSERT_TRUE(solver.Factorize(MakeDenseCsr(2U, {2, 0, 0, 3})).IsOk()) | ASSERT_TRUE(solver.Solve(MakeVector({4, 6}), pair).IsOk()) | EXPECT_NEAR(pair[0U], 2, 1e-14) | EXPECT_NEAR(pair[1U], 2, 1e-14) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, {4.0})).IsOk()) | ASSERT_TRUE(solver.Solve(MakeVector({8.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, {2.0})).IsOk()) | ASSERT_TRUE(solver.Solve(MakeVector({4.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | ASSERT_TRUE(solver.Factorize(MakeDenseCsr(2U, {2, 0, 0, 3})).IsOk()) | ASSERT_TRUE(solver.Solve(MakeVector({4, 6}), pair).IsOk()) | EXPECT_NEAR(pair[0U], 2, 1e-14) | EXPECT_NEAR(pair[1U], 2, 1e-14) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, {4.0})).IsOk()) | ASSERT_TRUE(solver.Solve(MakeVector({8.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures; assertion 10개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures 유지 원문 검사 body 및 assertion 동일. 007dec8a37d6956c242634b01f7e6f8f496f0e02082a94437a15dd3caaf89673 007dec8a37d6956c242634b01f7e6f8f496f0e02082a94437a15dd3caaf89673 "EXPECT_TRUE(singular_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || singular_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE( singular_status.Diagnostics()[0U].entity_identity.find(""phase=22,error=""), std::string::npos) | EXPECT_TRUE(indefinite_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || indefinite_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE(indefinite_status.Diagnostics()[0U].entity_identity.find( ""phase=22,error=""), std::string::npos) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | EXPECT_EQ(rhs_status.Diagnostics()[0U].code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(solution[0U], 23.0) | EXPECT_DOUBLE_EQ(solution[1U], -9.0) | EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics()[0U].code, ""nonfinite-sparse-value"")" "EXPECT_TRUE(singular_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || singular_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE( singular_status.Diagnostics()[0U].entity_identity.find(""phase=22,error=""), std::string::npos) | EXPECT_TRUE(indefinite_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || indefinite_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE(indefinite_status.Diagnostics()[0U].entity_identity.find( ""phase=22,error=""), std::string::npos) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | EXPECT_EQ(rhs_status.Diagnostics()[0U].code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(solution[0U], 23.0) | EXPECT_DOUBLE_EQ(solution[1U], -9.0) | EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics()[0U].code, ""nonfinite-sparse-value"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly; assertion 10개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly 유지 원문 검사 body 및 assertion 동일. 2e4b58fe2ef908b1c53f3dd40639f2423afb8429d5bdc7fdb80675b3efeceee2 2e4b58fe2ef908b1c53f3dd40639f2423afb8429d5bdc7fdb80675b3efeceee2 ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) | ASSERT_TRUE(resolved_solver.Factorize(resolved_matrix).IsOk()) | ASSERT_TRUE(resolved_solver.Solve(resolved_rhs, resolved_solution).IsOk()) | EXPECT_LE( NormalizedResidual(resolved_matrix, resolved_solution, resolved_rhs), 1.0e-10) | EXPECT_LE(RelativeError(resolved_solution, resolved_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) | ASSERT_TRUE(resolved_solver.Factorize(resolved_matrix).IsOk()) | ASSERT_TRUE(resolved_solver.Solve(resolved_rhs, resolved_solution).IsOk()) | EXPECT_LE( NormalizedResidual(resolved_matrix, resolved_solution, resolved_rhs), 1.0e-10) | EXPECT_LE(RelativeError(resolved_solution, resolved_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp support@1-91 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, MakeVector, for, NormalizedResidual, if, RelativeError, ExpectStructuredSolverFailure tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 241634dd09f31bc235ee1bee6826c8fb24128d7490f926a518d4f2b220c92164 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/solvers/linear/tangent_solver_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c457f80368b1e01bab7e7d177c0bda8283d0590e7150e064c270f86c9a95e858 c457f80368b1e01bab7e7d177c0bda8283d0590e7150e064c270f86c9a95e858 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesNonsymmetricKnownCorrection TangentSolver.SolvesNonsymmetricKnownCorrection; assertion 4개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesNonsymmetricKnownCorrection 유지 원문 검사 body 및 assertion 동일. 838690231b74c1b272bda475dea0234187495f7e8c045ee449f04ae3ac0d1233 838690231b74c1b272bda475dea0234187495f7e8c045ee449f04ae3ac0d1233 ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(rhs, correction).IsOk()) | EXPECT_NEAR(correction[0U], 1.0, 1.0e-14) | EXPECT_NEAR(correction[1U], 2.0, 1.0e-14) ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(rhs, correction).IsOk()) | EXPECT_NEAR(correction[0U], 1.0, 1.0e-14) | EXPECT_NEAR(correction[1U], 2.0, 1.0e-14) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesTrivialZeroEquationSystem TangentSolver.SolvesTrivialZeroEquationSystem; assertion 3개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesTrivialZeroEquationSystem 유지 원문 검사 body 및 assertion 동일. 271ea5671ba0adda4eab6af4646dda04cf09d9a77c2f0857c1a1216458a9d1d1 271ea5671ba0adda4eab6af4646dda04cf09d9a77c2f0857c1a1216458a9d1d1 ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | EXPECT_TRUE(solver.SolveCorrection(fesa::Vector{0U}, correction).IsOk()) | EXPECT_EQ(correction.Size(), 0U) ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | EXPECT_TRUE(solver.SolveCorrection(fesa::Vector{0U}, correction).IsOk()) | EXPECT_EQ(correction.Size(), 0U) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsNonfiniteInputsWithoutModifyingCorrection TangentSolver.RejectsNonfiniteInputsWithoutModifyingCorrection; assertion 6개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsNonfiniteInputsWithoutModifyingCorrection 유지 원문 검사 body 및 assertion 동일. 11e41d7e1b0f4715dfddd024f947c926155d20ba0b4fa3d6734756afe8603bd6 11e41d7e1b0f4715dfddd024f947c926155d20ba0b4fa3d6734756afe8603bd6 "EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics().front().code, ""nonfinite-sparse-value"") | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0})) .IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(correction[0U], 17.0) | EXPECT_DOUBLE_EQ(correction[1U], -4.0)" "EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics().front().code, ""nonfinite-sparse-value"") | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0})) .IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(correction[0U], 17.0) | EXPECT_DOUBLE_EQ(correction[1U], -4.0)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.ReportsSingularFactorizationDeterministically TangentSolver.ReportsSingularFactorizationDeterministically; assertion 3개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.ReportsSingularFactorizationDeterministically 유지 원문 검사 body 및 assertion 동일. 54a59242a6753c254e6f1e9b3b87783b30b47329241c5dda5d053a57eae851bc 54a59242a6753c254e6f1e9b3b87783b30b47329241c5dda5d053a57eae851bc "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-perturbed-pivot"") | EXPECT_EQ(status.Diagnostics().front().entity_identity, ""phase=22"")" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-perturbed-pivot"") | EXPECT_EQ(status.Diagnostics().front().entity_identity, ""phase=22"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsSolveBeforeSuccessfulFactorization TangentSolver.RejectsSolveBeforeSuccessfulFactorization; assertion 3개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsSolveBeforeSuccessfulFactorization 유지 원문 검사 body 및 assertion 동일. eb2b17bad95e253fe1e9c3a8aed6f6fbf92e2921643507f4a11862c36c28d0d7 eb2b17bad95e253fe1e9c3a8aed6f6fbf92e2921643507f4a11862c36c28d0d7 "EXPECT_EQ(status.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(correction[0U], 23.0) | EXPECT_DOUBLE_EQ(correction[1U], -9.0)" "EXPECT_EQ(status.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(correction[0U], 23.0) | EXPECT_DOUBLE_EQ(correction[1U], -9.0)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.ReusesRhsButFreshValuesAndFailureCannotReuseStaleState TangentSolver.ReusesRhsButFreshValuesAndFailureCannotReuseStaleState; assertion 24개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.ReusesRhsButFreshValuesAndFailureCannotReuseStaleState 유지 원문 검사 body 및 assertion 동일. 0620a93cebd9927d8dafb60fa155a868c1f7bda81def578bbe163deeca63327f 0620a93cebd9927d8dafb60fa155a868c1f7bda81def578bbe163deeca63327f "ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0})) .IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4.0 * scale, 6.0 * scale}), correction).IsOk()) | EXPECT_NEAR(correction[0U], scale, 1.0e-14) | EXPECT_NEAR(correction[1U], 2.0 * scale, 1.0e-14) | EXPECT_FALSE(solver.SolveCorrection(bad_rhs, correction).IsOk()) | EXPECT_DOUBLE_EQ(correction[0U], 17) | EXPECT_DOUBLE_EQ(correction[1U], -4) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4, 6}), correction).IsOk()) | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {4, 0, 1, 2})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4, 5}), correction).IsOk()) | EXPECT_NEAR(correction[0U], 1, 1.0e-14) | EXPECT_NEAR(correction[1U], 2, 1.0e-14) | ASSERT_TRUE(diagonal.HasValue()) | ASSERT_TRUE(solver.FactorizeFresh(diagonal.Value()).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({10, -7}), correction).IsOk()) | EXPECT_NEAR(correction[0U], 2, 1.0e-14) | EXPECT_NEAR(correction[1U], -1, 1.0e-14) | EXPECT_FALSE(solver.FactorizeFresh(MakeDenseCsr(2U, {0, 0, 0, 0})).IsOk()) | ASSERT_FALSE(stale.IsOk()) | EXPECT_EQ(stale.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(correction[0U], 19) | EXPECT_DOUBLE_EQ(correction[1U], -8) | ASSERT_TRUE(solver.FactorizeFresh(diagonal.Value()).IsOk()) | EXPECT_TRUE(solver.SolveCorrection(MakeVector({10, -7}), correction).IsOk())" "ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0})) .IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4.0 * scale, 6.0 * scale}), correction).IsOk()) | EXPECT_NEAR(correction[0U], scale, 1.0e-14) | EXPECT_NEAR(correction[1U], 2.0 * scale, 1.0e-14) | EXPECT_FALSE(solver.SolveCorrection(bad_rhs, correction).IsOk()) | EXPECT_DOUBLE_EQ(correction[0U], 17) | EXPECT_DOUBLE_EQ(correction[1U], -4) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4, 6}), correction).IsOk()) | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {4, 0, 1, 2})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4, 5}), correction).IsOk()) | EXPECT_NEAR(correction[0U], 1, 1.0e-14) | EXPECT_NEAR(correction[1U], 2, 1.0e-14) | ASSERT_TRUE(diagonal.HasValue()) | ASSERT_TRUE(solver.FactorizeFresh(diagonal.Value()).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({10, -7}), correction).IsOk()) | EXPECT_NEAR(correction[0U], 2, 1.0e-14) | EXPECT_NEAR(correction[1U], -1, 1.0e-14) | EXPECT_FALSE(solver.FactorizeFresh(MakeDenseCsr(2U, {0, 0, 0, 0})).IsOk()) | ASSERT_FALSE(stale.IsOk()) | EXPECT_EQ(stale.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(correction[0U], 19) | EXPECT_DOUBLE_EQ(correction[1U], -8) | ASSERT_TRUE(solver.FactorizeFresh(diagonal.Value()).IsOk()) | EXPECT_TRUE(solver.SolveCorrection(MakeVector({10, -7}), correction).IsOk())" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SingleEquationScopeRestoresTlsAcrossFreshFailureAndReuse TangentSolver.SingleEquationScopeRestoresTlsAcrossFreshFailureAndReuse; assertion 2개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SingleEquationScopeRestoresTlsAcrossFreshFailureAndReuse 유지 원문 검사 body 및 assertion 동일. ba2b6cb4441315add1a892267c7ebb3fef2cc4b57acd19c3f44a83e3901ff683 ba2b6cb4441315add1a892267c7ebb3fef2cc4b57acd19c3f44a83e3901ff683 EXPECT_TRUE(first.get()) | EXPECT_TRUE(second.get()) EXPECT_TRUE(first.get()) | EXPECT_TRUE(second.get()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SingleEquationScopeTransitionsBetweenRetainedSizes TangentSolver.SingleEquationScopeTransitionsBetweenRetainedSizes; assertion 14개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SingleEquationScopeTransitionsBetweenRetainedSizes 유지 원문 검사 body 및 assertion 동일. 019a17f836a3e89734270637cb77ef60079ed664964b391a6dbcaf67f8679d0d 019a17f836a3e89734270637cb77ef60079ed664964b391a6dbcaf67f8679d0d ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(1U, {2.0})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2, 1, 0, 3})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({6, 6}), pair).IsOk()) | EXPECT_NEAR(pair[0U], 2, 1e-14) | EXPECT_NEAR(pair[1U], 2, 1e-14) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(1U, {4.0})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({8.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(1U, {2.0})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({4.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2, 1, 0, 3})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({6, 6}), pair).IsOk()) | EXPECT_NEAR(pair[0U], 2, 1e-14) | EXPECT_NEAR(pair[1U], 2, 1e-14) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(1U, {4.0})).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(MakeVector({8.0}), single).IsOk()) | EXPECT_DOUBLE_EQ(single[0U], 2.0) | EXPECT_EQ(mkl_get_max_threads(), default_threads) | EXPECT_EQ(mkl_set_num_threads_local(0), 0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp support@1-59 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, MakeVector, for, ExpectSolverFailure tests/unit/solvers/linear/tangent_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b1a9077360df14d9d4b53850333227e49660e5d327b9e4d103c8dec17f7548f8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Dev tests/unit/solvers/linear/tangent_solver_test.cpp support@233-234 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/solvers/linear/tangent_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/AGENTS.md file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/AGENTS.md file 이관 Dev의 현재 검사 정책을 유지한다. Refactor의 과거 실행별 지시는 이번 승인 범위를 대체하지 않는다. afbc4a6eb7bfc01c099c4b15c5907a2782043a63a2de03e37a84159e5f4acdb0 c2413bbcde33dad56ffd227536b79b9b9c707a5eb4a7874f0bc840824c4abfd5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/AGENTS.md support@1-19 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/AGENTS.md file-support 이관 Dev의 현재 검사 정책을 유지한다. Refactor의 과거 실행별 지시는 이번 승인 범위를 대체하지 않는다. d370a6fb7284dde3c41c1d5b117abccf69dfb790823ef224b52c855307512bff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/CMakeLists.txt file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/CMakeLists.txt file 유지 Refactor capability source 등록을 유지한다. 실제 native/CMake source 목록이 세 target 모두 일치하므로 본문 복원에 따른 translation unit 추가는 없다. 8c8c0b8343ada0c1ea259c017a5332bfa0e0a313adbfaabe84406327bc9dc8c9 8c8c0b8343ada0c1ea259c017a5332bfa0e0a313adbfaabe84406327bc9dc8c9 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/CMakeLists.txt support@1-258 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/CMakeLists.txt file-support 유지 Refactor capability source 등록을 유지한다. 실제 native/CMake source 목록이 세 target 모두 일치하므로 본문 복원에 따른 translation unit 추가는 없다. 570b4fa84b4b84fa0460427565d6de7ac835cca29f1e98c10cc4566b838ce5b8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/integration/analysis/linear_frequency_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 73da42092ea16d533f8a1725f6e925338fb4d8ff6901c5a462004aef3cacc770 73da42092ea16d533f8a1725f6e925338fb4d8ff6901c5a462004aef3cacc770 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.RejectsDomainWithoutFrequencyStep LinearFrequencyProcedureExecutor.RejectsDomainWithoutFrequencyStep; assertion 5개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.RejectsDomainWithoutFrequencyStep 유지 원문 검사 body 및 assertion 동일. e35f98ccd120a34e369c9100a4b68bc5f2bd57a79f0516fe8aace490a6157623 e35f98ccd120a34e369c9100a4b68bc5f2bd57a79f0516fe8aace490a6157623 "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-frequency-procedure"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-frequency-procedure"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.MatchesPartialBoundaryPencilAndFullResidualCovariance LinearFrequencyProcedureExecutor.MatchesPartialBoundaryPencilAndFullResidualCovariance; assertion 25개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.MatchesPartialBoundaryPencilAndFullResidualCovariance 유지 원문 검사 body 및 assertion 동일. 8112af69b3ed3bf699174664e3f50bc7fe4927aa4d8a1e3841e3c840ed29bbbe 8112af69b3ed3bf699174664e3f50bc7fe4927aa4d8a1e3841e3c840ed29bbbe ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), 1U) | EXPECT_EQ(state.mass_null_dimension, 0U) | EXPECT_EQ(state.finite_dimension, 1U) | EXPECT_NEAR(state.modes[0].eigenvalue, 10369.0 / 450.0, 1e-10) | EXPECT_EQ(state.modes[0].classification, 1U) | EXPECT_EQ(state.vectors.Rows(), 1U) | EXPECT_EQ(state.vectors.Columns(), 24U) | EXPECT_NEAR(state.vectors(0U, 5U), std::sqrt(50.0 / 3.0), 1e-12) | EXPECT_EQ(state.vectors(0U, dof), 0.0) | ASSERT_EQ(state.eigenpair_checks.size(), 1U) | EXPECT_NEAR(state.eigenpair_checks[0].modal_mass, 1.0, 1e-12) | EXPECT_LE(state.eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].rho_b, 1e-10) | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | ASSERT_TRUE(static_domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_NEAR(kff, 10369.0 / 7500.0, 1e-12) | EXPECT_NEAR(displacement[5U], 7500.0 / 10369.0, 1e-12) | EXPECT_NEAR(residual[5U], 0.0, 1e-12) | EXPECT_NEAR(residual[i], expected, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), 1U) | EXPECT_EQ(state.mass_null_dimension, 0U) | EXPECT_EQ(state.finite_dimension, 1U) | EXPECT_NEAR(state.modes[0].eigenvalue, 10369.0 / 450.0, 1e-10) | EXPECT_EQ(state.modes[0].classification, 1U) | EXPECT_EQ(state.vectors.Rows(), 1U) | EXPECT_EQ(state.vectors.Columns(), 24U) | EXPECT_NEAR(state.vectors(0U, 5U), std::sqrt(50.0 / 3.0), 1e-12) | EXPECT_EQ(state.vectors(0U, dof), 0.0) | ASSERT_EQ(state.eigenpair_checks.size(), 1U) | EXPECT_NEAR(state.eigenpair_checks[0].modal_mass, 1.0, 1e-12) | EXPECT_LE(state.eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[0].rho_b, 1e-10) | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | ASSERT_TRUE(static_domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_NEAR(kff, 10369.0 / 7500.0, 1e-12) | EXPECT_NEAR(displacement[5U], 7500.0 / 10369.0, 1e-12) | EXPECT_NEAR(residual[5U], 0.0, 1e-12) | EXPECT_NEAR(residual[i], expected, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PartialBoundaryStaticRejectsUnbalancedDrillingMoment LinearFrequencyProcedureExecutor.PartialBoundaryStaticRejectsUnbalancedDrillingMoment; assertion 3개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PartialBoundaryStaticRejectsUnbalancedDrillingMoment 유지 원문 검사 body 및 assertion 동일. 3257ad730d16550e25ba4286cfa165f6b4e84d2a54d3cc6b5d8163feea05465d 3257ad730d16550e25ba4286cfa165f6b4e84d2a54d3cc6b5d8163feea05465d "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_NE(StatusText(result.GetStatus()) .find(""global-equilibrium-tolerance-failure""), std::string::npos)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_NE(StatusText(result.GetStatus()) .find(""global-equilibrium-tolerance-failure""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.FreePanelRetainsSixRigidModesAndAllComputedEvidence LinearFrequencyProcedureExecutor.FreePanelRetainsSixRigidModesAndAllComputedEvidence; assertion 15개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.FreePanelRetainsSixRigidModesAndAllComputedEvidence 유지 원문 검사 body 및 assertion 동일. 9606266d6f08472c9d911615beddbfed51886ef04a943c708901bb30e245a992 9606266d6f08472c9d911615beddbfed51886ef04a943c708901bb30e245a992 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(state.mass_null_dimension, 4U) | EXPECT_EQ(state.finite_dimension, 20U) | ASSERT_EQ(state.modes.size(), 6U) | EXPECT_GE(state.eigenpair_checks.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(mode.cluster_id, 1U) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_LE(state.eta_mz, 1e-12) | EXPECT_LE(state.eta_kz, 1e-12) | EXPECT_LE(check.eta_r, 1e-10) | EXPECT_LE(check.eta_norm, 1e-10) | EXPECT_LE(check.eta_energy, 1e-10) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(state.mass_null_dimension, 4U) | EXPECT_EQ(state.finite_dimension, 20U) | ASSERT_EQ(state.modes.size(), 6U) | EXPECT_GE(state.eigenpair_checks.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(mode.cluster_id, 1U) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_LE(state.eta_mz, 1e-12) | EXPECT_LE(state.eta_kz, 1e-12) | EXPECT_LE(check.eta_r, 1e-10) | EXPECT_LE(check.eta_norm, 1e-10) | EXPECT_LE(check.eta_energy, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.ExcessRequestedModesFailsWithSourceContext LinearFrequencyProcedureExecutor.ExcessRequestedModesFailsWithSourceContext; assertion 6개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.ExcessRequestedModesFailsWithSourceContext 유지 원문 검사 body 및 assertion 동일. a384ea179cd4b72a4bedea2b8a465ff0e824a37858da50dfe0702d96c91b6c55 a384ea179cd4b72a4bedea2b8a465ff0e824a37858da50dfe0702d96c91b6c55 "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""insufficient-finite-modes"") | EXPECT_GT(result.GetStatus().Diagnostics()[0].location.line, 0U)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""insufficient-finite-modes"") | EXPECT_GT(result.GetStatus().Diagnostics()[0].location.line, 0U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PreservesDensityAndPhysicalUnitScaling LinearFrequencyProcedureExecutor.PreservesDensityAndPhysicalUnitScaling; assertion 12개 tests/integration/analysis/linear_frequency_procedure_test.cpp LinearFrequencyProcedureExecutor.PreservesDensityAndPhysicalUnitScaling 유지 원문 검사 body 및 assertion 동일. 54d62ee92fd5f41120fda65ddaeb341ba1f3bd0390e7cdf03c81b5f13b9f4fcd 54d62ee92fd5f41120fda65ddaeb341ba1f3bd0390e7cdf03c81b5f13b9f4fcd ASSERT_TRUE(baseline_domain.HasValue()) | ASSERT_TRUE(dense_domain.HasValue()) | ASSERT_TRUE(units_domain.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(dense.HasValue()) | ASSERT_TRUE(units.HasValue()) | EXPECT_NEAR( dense.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 0.25, 1e-12) | EXPECT_NEAR(dense.Value().vectors(0U, 5U) / baseline.Value().vectors(0U, 5U), 0.5, 1e-12) | EXPECT_NEAR( units.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 1.0, 1e-12) | EXPECT_NEAR( units.Value().vectors(0U, 5U) * length / baseline.Value().vectors(0U, 5U), 1.0, 1e-12) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_energy, 1e-10) ASSERT_TRUE(baseline_domain.HasValue()) | ASSERT_TRUE(dense_domain.HasValue()) | ASSERT_TRUE(units_domain.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(dense.HasValue()) | ASSERT_TRUE(units.HasValue()) | EXPECT_NEAR( dense.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 0.25, 1e-12) | EXPECT_NEAR(dense.Value().vectors(0U, 5U) / baseline.Value().vectors(0U, 5U), 0.5, 1e-12) | EXPECT_NEAR( units.Value().modes[0].eigenvalue / baseline.Value().modes[0].eigenvalue, 1.0, 1e-12) | EXPECT_NEAR( units.Value().vectors(0U, 5U) * length / baseline.Value().vectors(0U, 5U), 1.0, 1e-12) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_r, 1e-10) | EXPECT_LE(units.Value().eigenpair_checks[0].eta_energy, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp support@1-25 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a51e24264f3ae36759924761dd98817a3de835465648e49acff3d7c0b74e8f7c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp support@42-124 helper/oracle/fixture/include/static assertion 구간: StatusText, PanelDomain, if tests/integration/analysis/linear_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d9beda2ab213d77168db3de7088b66badb8266554add0a1df0249a3f53e814b2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_frequency_procedure_test.cpp support@191-193 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d7ebb4e7a53ff4630e82b0c32bb66fd1bae66f119405d224a134d6256734b442 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_static_analysis_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/integration/analysis/linear_static_analysis_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c796815b0cdc8b655da47ddab48bb3df2ef5d7334d949c9ede355e046b12294b c796815b0cdc8b655da47ddab48bb3df2ef5d7334d949c9ede355e046b12294b 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization; assertion 5개 tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization 유지 원문 검사 body 및 assertion 동일. 6da58cc645e25d2814d2622f68d964c8320625f00110b2e16ba19e5b1522ccc2 6da58cc645e25d2814d2622f68d964c8320625f00110b2e16ba19e5b1522ccc2 "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad; assertion 8개 tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad 유지 원문 검사 body 및 assertion 동일. 65404a724a1ea299f6ceec1870dfa2b75eff091a7e83809aa589613be7e4e2fc 65404a724a1ea299f6ceec1870dfa2b75eff091a7e83809aa589613be7e4e2fc "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 0) | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize""}))" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 0) | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription; assertion 17개 tests/integration/analysis/linear_static_analysis_test.cpp LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription 유지 원문 검사 body 및 assertion 동일. 34f491015c713169674ef652f3e235e52cff78d9c55158b3dfa94614562c2a94 34f491015c713169674ef652f3e235e52cff78d9c55158b3dfa94614562c2a94 "ASSERT_TRUE(status.IsOk()) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 2U) | EXPECT_TRUE(writer.Diagnostics().empty()) | ASSERT_EQ(state.Displacement().Size(), 12U) | EXPECT_EQ(state.Identity().step_name, ""Step-1"") | EXPECT_EQ(state.Identity().frame_index, 0U) | EXPECT_NEAR(state.Displacement()[0U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[6U], 0.2, 2.0e-10) | EXPECT_NEAR(state.ExternalForce()[6U], 10.0, 1.0e-12) | EXPECT_NEAR(state.InternalForce()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.InternalForce()[6U], 10.0, 1.0e-9) | EXPECT_NEAR(state.Reaction()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.Residual()[6U], 0.0, 1.0e-9) | EXPECT_EQ(state.EndpointResults().size(), 2U) | EXPECT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.StressResults().size(), 2U)" "ASSERT_TRUE(status.IsOk()) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 2U) | EXPECT_TRUE(writer.Diagnostics().empty()) | ASSERT_EQ(state.Displacement().Size(), 12U) | EXPECT_EQ(state.Identity().step_name, ""Step-1"") | EXPECT_EQ(state.Identity().frame_index, 0U) | EXPECT_NEAR(state.Displacement()[0U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[6U], 0.2, 2.0e-10) | EXPECT_NEAR(state.ExternalForce()[6U], 10.0, 1.0e-12) | EXPECT_NEAR(state.InternalForce()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.InternalForce()[6U], 10.0, 1.0e-9) | EXPECT_NEAR(state.Reaction()[0U], -10.0, 1.0e-9) | EXPECT_NEAR(state.Residual()[6U], 0.0, 1.0e-9) | EXPECT_EQ(state.EndpointResults().size(), 2U) | EXPECT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.StressResults().size(), 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization; assertion 5개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization 유지 원문 검사 body 및 assertion 동일. 1dea412548e1077c66d10536f0f8640b34a5b0eadc19bb0cebbf47878b4c0b9b 1dea412548e1077c66d10536f0f8640b34a5b0eadc19bb0cebbf47878b4c0b9b "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" "ASSERT_TRUE(analysis->Run({input, output}).IsOk()) | EXPECT_EQ(solver.FactorizeCalls(), 1) | EXPECT_EQ(solver.SolveCalls(), 1) | EXPECT_EQ(writer.WriteCalls(), 1) | EXPECT_EQ(adapter_events, (std::vector{""solver-factorize"", ""solver-solve"", ""writer-write""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement; assertion 17개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement 유지 원문 검사 body 및 assertion 동일. 221c877473ceb9bc29a9ba1386ab2485083b7474572a5ba936ae3b9524c1e15a 221c877473ceb9bc29a9ba1386ab2485083b7474572a5ba936ae3b9524c1e15a EXPECT_TRUE(status.IsOk()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(solver.FactorizeCalls(), 1) | ASSERT_EQ(solver.SolveCalls(), 1) | ASSERT_EQ(solver.FactorizedDimension(), 1U) | ASSERT_EQ(solver.Rhs().size(), 1U) | EXPECT_NEAR(solver.ScalarStiffness(), 440.0 / 9.0, 1.0e-12) | EXPECT_NEAR(solver.Rhs()[0U], -4.0 / 9.0, 1.0e-12) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 4U) | EXPECT_EQ(writer.ShellElementCount(), 1U) | ASSERT_EQ(state.Displacement().Size(), 24U) | EXPECT_NEAR(state.Displacement()[6U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[12U], -1.0 / 110.0, 1.0e-12) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) | EXPECT_EQ(state.ShellResults().size(), 4U) | EXPECT_GT(state.PhysicalStrainEnergy(), 0.0) EXPECT_TRUE(status.IsOk()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(solver.FactorizeCalls(), 1) | ASSERT_EQ(solver.SolveCalls(), 1) | ASSERT_EQ(solver.FactorizedDimension(), 1U) | ASSERT_EQ(solver.Rhs().size(), 1U) | EXPECT_NEAR(solver.ScalarStiffness(), 440.0 / 9.0, 1.0e-12) | EXPECT_NEAR(solver.Rhs()[0U], -4.0 / 9.0, 1.0e-12) | EXPECT_EQ(writer.OutputPath(), output) | EXPECT_EQ(writer.NodeCount(), 4U) | EXPECT_EQ(writer.ShellElementCount(), 1U) | ASSERT_EQ(state.Displacement().Size(), 24U) | EXPECT_NEAR(state.Displacement()[6U], 0.1, 1.0e-12) | EXPECT_NEAR(state.Displacement()[12U], -1.0 / 110.0, 1.0e-12) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) | EXPECT_EQ(state.ShellResults().size(), 4U) | EXPECT_GT(state.PhysicalStrainEnergy(), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem; assertion 9개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem 유지 원문 검사 body 및 assertion 동일. 9bc841e0fc20cccf0cec07e025f03be672a5123d4c9fa5fcf23f9d0072fd34d6 9bc841e0fc20cccf0cec07e025f03be672a5123d4c9fa5fcf23f9d0072fd34d6 ASSERT_FALSE(singular.IsOk()) | EXPECT_EQ(singular.Category(), fesa::FailureCategory::kSolver) | EXPECT_EQ(singular_writer.WriteCalls(), 0) | ASSERT_TRUE(constrained.IsOk()) | EXPECT_EQ(constrained_solver.FactorizeCalls(), 1) | EXPECT_EQ(constrained_solver.FactorizedDimension(), 0U) | EXPECT_EQ(constrained_solver.SolveCalls(), 1) | EXPECT_TRUE(constrained_solver.Rhs().empty()) | EXPECT_EQ(constrained_writer.State().ShellResults().size(), 4U) ASSERT_FALSE(singular.IsOk()) | EXPECT_EQ(singular.Category(), fesa::FailureCategory::kSolver) | EXPECT_EQ(singular_writer.WriteCalls(), 0) | ASSERT_TRUE(constrained.IsOk()) | EXPECT_EQ(constrained_solver.FactorizeCalls(), 1) | EXPECT_EQ(constrained_solver.FactorizedDimension(), 0U) | EXPECT_EQ(constrained_solver.SolveCalls(), 1) | EXPECT_TRUE(constrained_solver.Rhs().empty()) | EXPECT_EQ(constrained_writer.State().ShellResults().size(), 4U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate; assertion 6개 tests/integration/analysis/linear_static_analysis_test.cpp Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate 유지 원문 검사 body 및 assertion 동일. 8c9ed32ac29d2ce92de257c1fe16ae692ff037e47ae1e267ceb47d2e14fb3999 8c9ed32ac29d2ce92de257c1fe16ae692ff037e47ae1e267ceb47d2e14fb3999 "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-recovery-value"") | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_TRUE(adapter_events.empty())" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-recovery-value"") | EXPECT_EQ(writer.WriteCalls(), 0) | EXPECT_TRUE(adapter_events.empty())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/linear_static_analysis_test.cpp support@1-306 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, AxialDeck, AllConstrainedShellDeck, PrescribedShellDeck, SpyLinearSolver, RecordingMklSolver, NonfiniteLinearSolver, SpyResultsWriter, CapturingResultsWriter, State tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 09f71dbb33b22661eb43b04ddd7730f00b09cf63202093cb5008f37fe51a59f2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_static_analysis_test.cpp support@388-389 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 36bbca6d939f00341c98ba573a4fdc3cfc85b6ef660852c5b0a862bfcfc0fd6c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_static_analysis_test.cpp support@411-412 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 58066e545facf79db27e598db7e91f24ed93b6771efa3ca779ecfe4df76a7344 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_static_analysis_test.cpp support@449-450 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dd0e363915792cde8bf2d8793ddaec5a8c40204888921d46f70f1f507387ac4a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/linear_static_analysis_test.cpp support@485-486 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/linear_static_analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 83bce9b68552044428c9e22ca488475bf399b515887403c179e0f49d9230a028 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/nonlinear_static_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/integration/analysis/nonlinear_static_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 88175e6ca8c6905e7706f40141e85676d7ce3c1763b49e2ebfb7beecd6d9feab 88175e6ca8c6905e7706f40141e85676d7ce3c1763b49e2ebfb7beecd6d9feab 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.AllConstrainedNlgeomRunWritesSchemaV1AfterAcceptedFrames NonlinearStaticProcedure.AllConstrainedNlgeomRunWritesSchemaV1AfterAcceptedFrames; assertion 6개 tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.AllConstrainedNlgeomRunWritesSchemaV1AfterAcceptedFrames 유지 원문 검사 body 및 assertion 동일. f26bd90fa30e1fa68296b58bf1a76cc5630c88cda15c0ef729d651d3395c74ec f26bd90fa30e1fa68296b58bf1a76cc5630c88cda15c0ef729d651d3395c74ec "ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(metadata, 0) | EXPECT_EQ(ReadStringAttribute(metadata, ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" "ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(metadata, 0) | EXPECT_EQ(ReadStringAttribute(metadata, ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance; assertion 4개 tests/integration/analysis/nonlinear_static_procedure_test.cpp NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance 유지 원문 검사 body 및 assertion 동일. 9ff42852bb00d02f437a4da95165fdf5d26e6b838001a0d5ab14a85a04317640 9ff42852bb00d02f437a4da95165fdf5d26e6b838001a0d5ab14a85a04317640 ASSERT_EQ(exit_code, 0) | ASSERT_GE(dataset, 0) | ASSERT_GE(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, actual.data()), 0) | EXPECT_NEAR(actual[component], expected[component], 1.0e-10) ASSERT_EQ(exit_code, 0) | ASSERT_GE(dataset, 0) | ASSERT_GE(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, actual.data()), 0) | EXPECT_NEAR(actual[component], expected[component], 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/nonlinear_static_procedure_test.cpp support@1-291 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, AllConstrainedNonlinearShellDeck, NonzeroPrescribedNonlinearShellDeck, Hdf5File, ReadStringAttribute, ReadNodalDataset, ReadConstraintMask, SpatialMoment, ReconstructGlobalBalance tests/integration/analysis/nonlinear_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eb91f236855802e13777ec66a775468f3b978d2a12cd33882b5eae574242a0ca 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/nonlinear_static_procedure_test.cpp support@315-316 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/nonlinear_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 185679e57938f51bc52ac8004de60266decc8599baf2c9e6aac91a3cec7811be 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/nonlinear_static_procedure_test.cpp support@344-345 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/nonlinear_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/shell_surface_pressure_linear_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f160a13c739276bb27b6b769f4b5d7fc53ab6bbe0e4917b1388aa171313f834e f160a13c739276bb27b6b769f4b5d7fc53ab6bbe0e4917b1388aa171313f834e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement; assertion 2개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement 유지 원문 검사 body 및 assertion 동일. e721439d9254d983e65489ab2bbc4fb02e07d31658fc561f5401bfbd83abaa10 e721439d9254d983e65489ab2bbc4fb02e07d31658fc561f5401bfbd83abaa10 EXPECT_DOUBLE_EQ(state.Displacement()[8U], 5.0) | EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) EXPECT_DOUBLE_EQ(state.Displacement()[8U], 5.0) | EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction; assertion 2개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction 유지 원문 검사 body 및 assertion 동일. ba222e9848a5e378bcf9c71a3c33243ac8771e3fac0c5822851e2102ed967c4d ba222e9848a5e378bcf9c71a3c33243ac8771e3fac0c5822851e2102ed967c4d EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) | EXPECT_EQ(SumTranslation(state.Reaction()), (std::array{0.0, 0.0, 4.0})) EXPECT_EQ(SumTranslation(state.ExternalForce()), (std::array{0.0, 0.0, -4.0})) | EXPECT_EQ(SumTranslation(state.Reaction()), (std::array{0.0, 0.0, 4.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment; assertion 2개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment 유지 원문 검사 body 및 assertion 동일. 171514cf20d839500b5919fd98671a3c0f805d8552929fcc111886400eb35cb3 171514cf20d839500b5919fd98671a3c0f805d8552929fcc111886400eb35cb3 EXPECT_NEAR(value, 0.0, 1.0e-8) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) EXPECT_NEAR(value, 0.0, 1.0e-8) | EXPECT_NEAR(state.VerificationMetrics()[0U], 0.0, 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance; assertion 6개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance 유지 원문 검사 body 및 assertion 동일. 1439f391357b0fe3f6dd44f5b7ce79f74d7ed2df71d6eb5a3b1f4c7081cf4237 1439f391357b0fe3f6dd44f5b7ce79f74d7ed2df71d6eb5a3b1f4c7081cf4237 ASSERT_EQ(s4.ExternalForce().Size(), s4r.ExternalForce().Size()) | ASSERT_EQ(s4.ExternalForce().Size(), cyclic.ExternalForce().Size()) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], s4r.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], cyclic.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], s4r.Reaction()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], cyclic.Reaction()[index]) ASSERT_EQ(s4.ExternalForce().Size(), s4r.ExternalForce().Size()) | ASSERT_EQ(s4.ExternalForce().Size(), cyclic.ExternalForce().Size()) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], s4r.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.ExternalForce()[index], cyclic.ExternalForce()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], s4r.Reaction()[index]) | EXPECT_DOUBLE_EQ(s4.Reaction()[index], cyclic.Reaction()[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset; assertion 12개 tests/integration/analysis/shell_surface_pressure_linear_test.cpp LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset 유지 원문 검사 body 및 assertion 동일. a1753dcd30b46c5386bcb0198661ae6982efcbbce8c4b8deb2ab12729c7cd5c0 a1753dcd30b46c5386bcb0198661ae6982efcbbce8c4b8deb2ab12729c7cd5c0 "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | ASSERT_GE(metadata, 0) | ASSERT_GE(schema, 0) | ASSERT_GE(H5Aread(schema, H5T_NATIVE_UINT64, &schema_version), 0) | EXPECT_EQ(schema_version, 0U) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Aclose(schema), 0) | EXPECT_GE(H5Gclose(metadata), 0) | EXPECT_GE(H5Fclose(file), 0)" "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | ASSERT_GE(metadata, 0) | ASSERT_GE(schema, 0) | ASSERT_GE(H5Aread(schema, H5T_NATIVE_UINT64, &schema_version), 0) | EXPECT_EQ(schema_version, 0U) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Aclose(schema), 0) | EXPECT_GE(H5Gclose(metadata), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_linear_test.cpp support@1-176 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, ShellDeck, CapturingResultsWriter, State, RunLinear, SumTranslation tests/integration/analysis/shell_surface_pressure_linear_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e57c8ba9f74968a8c7ca06c327d4bae2312eb212b552414c2365975b785c1ef3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 76f0d621c519f1ca1cb68fafd700bca52c94c69ac975a274eac995298ff77df3 76f0d621c519f1ca1cb68fafd700bca52c94c69ac975a274eac995298ff77df3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry; assertion 1개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry 유지 원문 검사 body 및 assertion 동일. 275b59b0a99ff5bcb4936eac0dd4373eb3fb04e88d56a47ff1aff8a27b2c86f9 275b59b0a99ff5bcb4936eac0dd4373eb3fb04e88d56a47ff1aff8a27b2c86f9 EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns 유지 원문 검사 body 및 assertion 동일. 0a6136e7ba03b60316d311f5f6b42f16252978acda71b7d0b56f16eb12b209ba 0a6136e7ba03b60316d311f5f6b42f16252978acda71b7d0b56f16eb12b209ba EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_NEAR(SumTranslation(residual, 2U), 6.0, 1.0e-12) EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_NEAR(SumTranslation(residual, 2U), 6.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce; assertion 1개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce 유지 원문 검사 body 및 assertion 동일. fd422711071867040b064e56df5df62d50a20128bb59e934095f3657cf85f95e fd422711071867040b064e56df5df62d50a20128bb59e934095f3657cf85f95e EXPECT_NEAR(SumTranslation(external, 2U), -0.42, 1.0e-12) EXPECT_NEAR(SumTranslation(external, 2U), -0.42, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath; assertion 7개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath 유지 원문 검사 body 및 assertion 동일. 63a34f032cb16dd83f579b4dd4b484e3c326615ba25fa1133eee16013843c11f 63a34f032cb16dd83f579b4dd4b484e3c326615ba25fa1133eee16013843c11f EXPECT_NE(SumTranslation(external, 2U), 0.0) | EXPECT_NE(SumTranslation(residual, 2U), 0.0) | ASSERT_TRUE(central.HasValue()) | ASSERT_TRUE(forward.HasValue()) | ASSERT_TRUE(backward.HasValue()) | EXPECT_NEAR(finite_difference, central.Value().external_tangent[row * 24U + 12U], 1.0e-8) | EXPECT_TRUE(has_antisymmetric_entry) EXPECT_NE(SumTranslation(external, 2U), 0.0) | EXPECT_NE(SumTranslation(residual, 2U), 0.0) | ASSERT_TRUE(central.HasValue()) | ASSERT_TRUE(forward.HasValue()) | ASSERT_TRUE(backward.HasValue()) | EXPECT_NEAR(finite_difference, central.Value().external_tangent[row * 24U + 12U], 1.0e-8) | EXPECT_TRUE(has_antisymmetric_entry) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence 유지 원문 검사 body 및 assertion 동일. 04b9fe95ba4947d608fc9a7ec79b1740e70ecfbbcd3a01e2e16606d5243818ae 04b9fe95ba4947d608fc9a7ec79b1740e70ecfbbcd3a01e2e16606d5243818ae "EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" "EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_GT(H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance; assertion 1개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance 유지 원문 검사 body 및 assertion 동일. 57b26b0b13a3b8aeb13983659e70fa74ee28ce08b9657ee48534d4357dec6986 57b26b0b13a3b8aeb13983659e70fa74ee28ce08b9657ee48534d4357dec6986 EXPECT_LE(MaximumAbs(equilibrium), 1.0e-8) EXPECT_LE(MaximumAbs(equilibrium), 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea; assertion 4개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea 유지 원문 검사 body 및 assertion 동일. bf38184a7460af3225ecdfb1d17c748cb2827953f7ab20cb0d09aa512b765102 bf38184a7460af3225ecdfb1d17c748cb2827953f7ab20cb0d09aa512b765102 ASSERT_TRUE(contribution.HasValue()) | EXPECT_NEAR(force_x, 0.0, 1.0e-12) | EXPECT_NEAR(force_y, 4.0, 1.0e-12) | EXPECT_NEAR(force_z, 0.0, 1.0e-12) ASSERT_TRUE(contribution.HasValue()) | EXPECT_NEAR(force_x, 0.0, 1.0e-12) | EXPECT_NEAR(force_y, 4.0, 1.0e-12) | EXPECT_NEAR(force_z, 0.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically 유지 원문 검사 body 및 assertion 동일. 7221071e8ff084a8b909b3820cf880025e76e8d17c003c07e58ce9bac6e812b5 7221071e8ff084a8b909b3820cf880025e76e8d17c003c07e58ce9bac6e812b5 EXPECT_EQ(first_force, second_force) | EXPECT_NE(SumTranslation(first_force, 2U), 0.0) EXPECT_EQ(first_force, second_force) | EXPECT_NE(SumTranslation(first_force, 2U), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput; assertion 2개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput 유지 원문 검사 body 및 assertion 동일. 36e810eaf381a43605bffdffe6997ad85e7b0ed2e01de1c00989cbbb49d0f80d 36e810eaf381a43605bffdffe6997ad85e7b0ed2e01de1c00989cbbb49d0f80d EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium; assertion 3개 tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium 유지 원문 검사 body 및 assertion 동일. 43eabc099c0167988e47483e5a56b5be6f7af1257dc4992ee64c812b925d6ad9 43eabc099c0167988e47483e5a56b5be6f7af1257dc4992ee64c812b925d6ad9 "EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0)" "EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_NEAR(SumTranslation(external, 2U), -6.0, 1.0e-12) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp support@1-224 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, Hdf5File, WriteText, ReadBytes, NonlinearPressureDeck, ReadFrameDataset, ReadEquilibrium, SumTranslation, MaximumAbs, for, CurrentPressureInput, RunNonlinearPressure tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ef95b2da7f58bff98fb85e60df3206dec9935f7f1af799fca4fade510af8a9aa 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_gauss_oracle.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/integration/analysis/thermal_gauss_oracle.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d788dbffcaedabfd16337b9683fd30803efb69cee2e64da08c09c4ccff29d12f d788dbffcaedabfd16337b9683fd30803efb69cee2e64da08c09c4ccff29d12f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_gauss_oracle.h support@1-70 helper/oracle/fixture/include/static assertion 구간: thermal_oracle, GaussPoint tests/integration/analysis/thermal_gauss_oracle.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eefed1217413733d2b6f2c59534a7501f9a2256dddd8140f1b6fc970af8bcec6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/integration/analysis/thermal_oracle_generator.py file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9c7d218fb43f93b77f0b84d158fcdc32033931a63f67b46e0e8adbac48b678dd 9c7d218fb43f93b77f0b84d158fcdc32033931a63f67b46e0e8adbac48b678dd 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py add fixture/oracle/helper add tests/integration/analysis/thermal_oracle_generator.py add 유지 원문 검사 body 및 assertion 동일. 23e1150085d3fe1a5d74d2299831c98dd48f86eb9930a91b18600fc30d590845 23e1150085d3fe1a5d74d2299831c98dd48f86eb9930a91b18600fc30d590845 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py neg fixture/oracle/helper neg tests/integration/analysis/thermal_oracle_generator.py neg 유지 원문 검사 body 및 assertion 동일. 7f7c8cb6ea41ea38bda49db120a6d2cd2848779150281160c8d32c61b566b46e 7f7c8cb6ea41ea38bda49db120a6d2cd2848779150281160c8d32c61b566b46e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py mul fixture/oracle/helper mul tests/integration/analysis/thermal_oracle_generator.py mul 유지 원문 검사 body 및 assertion 동일. 8be987139da7dda1626167aab28c0cff97553f2597f44e6e365ceab74df9bf11 8be987139da7dda1626167aab28c0cff97553f2597f44e6e365ceab74df9bf11 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py div fixture/oracle/helper div tests/integration/analysis/thermal_oracle_generator.py div 유지 원문 검사 body 및 assertion 동일. f88c22b7ecdac33d93b72af346a9809c1076dff336d7fe05e45a8ea0ce5cda98 f88c22b7ecdac33d93b72af346a9809c1076dff336d7fe05e45a8ea0ce5cda98 assert b[0] > 0 or b[1] < 0 assert b[0] > 0 or b[1] < 0 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py scale fixture/oracle/helper scale tests/integration/analysis/thermal_oracle_generator.py scale 유지 원문 검사 body 및 assertion 동일. b2d4e44e7198bea03d4b8e9aa478db99139a37e2df97553ad90c222e6c2d363e b2d4e44e7198bea03d4b8e9aa478db99139a37e2df97553ad90c222e6c2d363e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py legendre fixture/oracle/helper legendre tests/integration/analysis/thermal_oracle_generator.py legendre 유지 원문 검사 body 및 assertion 동일. ac998c8e064d80b57bf76d7a32e7414ee2a98bc41f5bf66df11460e2a866ded5 ac998c8e064d80b57bf76d7a32e7414ee2a98bc41f5bf66df11460e2a866ded5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py bracket fixture/oracle/helper bracket tests/integration/analysis/thermal_oracle_generator.py bracket 유지 원문 검사 body 및 assertion 동일. 6547b8bc55d38c8fc5108617a4b670ec13e1a35ff637dc4c2b49d4a89a27d47a 6547b8bc55d38c8fc5108617a4b670ec13e1a35ff637dc4c2b49d4a89a27d47a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py rule fixture/oracle/helper rule tests/integration/analysis/thermal_oracle_generator.py rule 유지 원문 검사 body 및 assertion 동일. 66e3896608075721c4941eace553b6bd6dfb46f4035079736663145c9fe97998 66e3896608075721c4941eace553b6bd6dfb46f4035079736663145c9fe97998 assert pl * ph < 0 | assert all(a[1] < b[0] for a, b in zip(result, result[1:])) | assert sum(F(r[2]) for r in result) < 2 < sum(F(r[3]) for r in result) assert pl * ph < 0 | assert all(a[1] < b[0] for a, b in zip(result, result[1:])) | assert sum(F(r[2]) for r in result) < 2 < sum(F(r[3]) for r in result) 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py slab_fixtures fixture/oracle/helper slab_fixtures tests/integration/analysis/thermal_oracle_generator.py slab_fixtures 유지 원문 검사 body 및 assertion 동일. 975f511ac674e3b180991c3f72b487234ce8712cb424a85094be969c99361561 975f511ac674e3b180991c3f72b487234ce8712cb424a85094be969c99361561 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py support@1-14 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/thermal_oracle_generator.py file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a3be554d66397807817915492b0f6e5d20acf5873a97c99032017cd6cc6d01a5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_oracle_generator.py support@215-244 helper/oracle/fixture/include/static assertion 구간: thermal_oracle, GaussPoint, Bracket, SlabCase tests/integration/analysis/thermal_oracle_generator.py file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5d91b01795d7cc5fbaa1b6c701fdd468978526c523b9a5d14136b3d82b5e9279 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_physics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/integration/analysis/thermal_physics_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fd272656d0a4bfda4a8cf075b0064a27ac6f493cb32d73c32f7e308844148c81 fd272656d0a4bfda4a8cf075b0064a27ac6f493cb32d73c32f7e308844148c81 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.InsulatedUniformAndZeroRetainAllFramesWithConservation ThermalPhysics.InsulatedUniformAndZeroRetainAllFramesWithConservation; assertion 5개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.InsulatedUniformAndZeroRetainAllFramesWithConservation 유지 원문 검사 body 및 assertion 동일. edf0f539db5122e88db306402c100c973d9367d15826ff41df5831b9874050c7 edf0f539db5122e88db306402c100c973d9367d15826ff41df5831b9874050c7 EXPECT_LE(std::abs(frame.temperature[i] - temperature), bound) | EXPECT_EQ(metrics.capacity_budget, 0) | EXPECT_EQ(metrics.energy_defect, 0) | EXPECT_EQ(metrics.dissipation_defect, 0) | EXPECT_EQ(metrics.flux_values, 8U * 4U * 72U) EXPECT_LE(std::abs(frame.temperature[i] - temperature), bound) | EXPECT_EQ(metrics.capacity_budget, 0) | EXPECT_EQ(metrics.energy_defect, 0) | EXPECT_EQ(metrics.dissipation_defect, 0) | EXPECT_EQ(metrics.flux_values, 8U * 4U * 72U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.DiscreteEigenmodeHasFirstOrderTimeConvergence ThermalPhysics.DiscreteEigenmodeHasFirstOrderTimeConvergence; assertion 4개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.DiscreteEigenmodeHasFirstOrderTimeConvergence 유지 원문 검사 body 및 assertion 동일. 1d52f524f76f2684bb44a8432cd192d154ee2cc3246fbea4cbe564c74132a60d 1d52f524f76f2684bb44a8432cd192d154ee2cc3246fbea4cbe564c74132a60d EXPECT_LE(agreement.hi, total_budget.hi) | EXPECT_LE((total_budget / mode_norm).hi, error_norm.lo / 1000) | EXPECT_GE(order, .97) | EXPECT_LE(order, 1.02) EXPECT_LE(agreement.hi, total_budget.hi) | EXPECT_LE((total_budget / mode_norm).hi, error_norm.lo / 1000) | EXPECT_GE(order, .97) | EXPECT_LE(order, 1.02) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.SignedOverlappingAndConstrainedPowerBalanceByComponent ThermalPhysics.SignedOverlappingAndConstrainedPowerBalanceByComponent; assertion 6개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.SignedOverlappingAndConstrainedPowerBalanceByComponent 유지 원문 검사 body 및 assertion 동일. 2d2c5cc010b1987f2ab8df39ea5a39746869dd7c226da2fdfe5f0337a2adbe16 2d2c5cc010b1987f2ab8df39ea5a39746869dd7c226da2fdfe5f0337a2adbe16 EXPECT_EQ(p.assembly.HeatInput()[20], 5) | EXPECT_EQ(p.assembly.HeatInput()[34], -5) | EXPECT_DOUBLE_EQ(frame.temperature[i], other_frame.temperature[i]) | EXPECT_LE(first.Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(energy[1].Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(reaction_shift.Abs(), subtraction.hi) EXPECT_EQ(p.assembly.HeatInput()[20], 5) | EXPECT_EQ(p.assembly.HeatInput()[34], -5) | EXPECT_DOUBLE_EQ(frame.temperature[i], other_frame.temperature[i]) | EXPECT_LE(first.Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(energy[1].Abs(), metrics.steps[step - 1].energy_bound) | EXPECT_LE(reaction_shift.Abs(), subtraction.hi) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateFullEndStripRespectsThicknessMaterialJumpAndFoldResistance ThermalPhysics.PrivateFullEndStripRespectsThicknessMaterialJumpAndFoldResistance; assertion 7개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateFullEndStripRespectsThicknessMaterialJumpAndFoldResistance 유지 원문 검사 body 및 assertion 동일. 98716955c3d594ac8083ae9a474374c5888912c98ba4d073f991296e2b65c1ae 98716955c3d594ac8083ae9a474374c5888912c98ba4d073f991296e2b65c1ae ASSERT_GT(denominator.lo, 0) | EXPECT_LE((I{result.temperature[i]} - mid).Abs(), bound.hi + (mid - I{mid.Mid()}).Abs()) | EXPECT_LE((right - mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + right).Abs(), result.evidence.energy_bound) | EXPECT_LE((I{q.X()} + mid).Abs(), 24 * bound.hi + Gamma(2048).hi * 24) | EXPECT_LE((I{component} + I{5} / I{3}).Abs(), 400 * bound.hi + Gamma(2048).hi * 400) ASSERT_GT(denominator.lo, 0) | EXPECT_LE((I{result.temperature[i]} - mid).Abs(), bound.hi + (mid - I{mid.Mid()}).Abs()) | EXPECT_LE((right - mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + mid).Abs(), reaction_budget.hi) | EXPECT_LE((left + right).Abs(), result.evidence.energy_bound) | EXPECT_LE((I{q.X()} + mid).Abs(), 24 * bound.hi + Gamma(2048).hi * 24) | EXPECT_LE((I{component} + I{5} / I{3}).Abs(), 400 * bound.hi + Gamma(2048).hi * 400) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateAffineFieldRotationNormalAndUnaveragedMidplaneTraces ThermalPhysics.PrivateAffineFieldRotationNormalAndUnaveragedMidplaneTraces; assertion 7개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.PrivateAffineFieldRotationNormalAndUnaveragedMidplaneTraces 유지 원문 검사 body 및 assertion 동일. 0149790ce0000a7f3bfa36e529afff49efc9d2cd79b3a2fa2038d5eaf5765773 0149790ce0000a7f3bfa36e529afff49efc9d2cd79b3a2fa2038d5eaf5765773 EXPECT_FALSE(cache.matrix.has_value()) | EXPECT_LE((dot - I{static_cast(a == b)}).Abs(), (Gamma(2048) * absolute).hi) | EXPECT_GT(r[0].Cross(r[1]).Dot(r[2]), 0) | EXPECT_LE(std::abs(q[c] - expected[c]), budget) | EXPECT_LE((actual_local - expected_local).Abs(), budget + Gamma(16).hi * k * (8 + 16 / h) * scale) | EXPECT_EQ(traces[0][6 * point + 2].Dot(normal), 0) | EXPECT_LE( std::abs(traces[0][6 * point + 3].Dot(normal) + 4 * k / h), (Gamma(2048) * I{2 * k * (8 + 16 / h)}).hi) EXPECT_FALSE(cache.matrix.has_value()) | EXPECT_LE((dot - I{static_cast(a == b)}).Abs(), (Gamma(2048) * absolute).hi) | EXPECT_GT(r[0].Cross(r[1]).Dot(r[2]), 0) | EXPECT_LE(std::abs(q[c] - expected[c]), budget) | EXPECT_LE((actual_local - expected_local).Abs(), budget + Gamma(16).hi * k * (8 + 16 / h) * scale) | EXPECT_EQ(traces[0][6 * point + 2].Dot(normal), 0) | EXPECT_LE( std::abs(traces[0][6 * point + 3].Dot(normal) + 4 * k / h), (Gamma(2048) * I{2 * k * (8 + 16 / h)}).hi) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.FullTwoDimensionalMeshesHaveSecondOrderTemperatureAndFirstOrderGradient ThermalPhysics.FullTwoDimensionalMeshesHaveSecondOrderTemperatureAndFirstOrderGradient; assertion 11개 tests/integration/analysis/thermal_physics_test.cpp ThermalPhysics.FullTwoDimensionalMeshesHaveSecondOrderTemperatureAndFirstOrderGradient 유지 원문 검사 body 및 assertion 동일. 0ceca38a5febc9b2b1dd637a6fdc3c6bade908c088a878422dd93f60377d48e4 0ceca38a5febc9b2b1dd637a6fdc3c6bade908c088a878422dd93f60377d48e4 EXPECT_LE((twelve.temperature - sixteen.temperature).Abs(), sixteen.temperature.lo * 1e-8) | EXPECT_LE((twelve.gradient - sixteen.gradient).Abs(), sixteen.gradient.lo * 1e-8) | EXPECT_LE(agreement.hi, forward.hi) | EXPECT_LE(forward.hi, sixteen.temperature.lo / 1000) | EXPECT_LE((Sqrt(I{24. * n * n + 1280}) * forward).hi, sixteen.gradient.lo / 1000) | EXPECT_LE(temporal.hi, spatial_error.temperature.lo / 32) | EXPECT_GE(temperature_order, 1.95) | EXPECT_LE(temperature_order, 2.05) | EXPECT_GE(gradient_order, .98) | EXPECT_LE(gradient_order, 1.03) | EXPECT_EQ(8 * (metrics.temperature_values + metrics.flux_values), 81074472U) EXPECT_LE((twelve.temperature - sixteen.temperature).Abs(), sixteen.temperature.lo * 1e-8) | EXPECT_LE((twelve.gradient - sixteen.gradient).Abs(), sixteen.gradient.lo * 1e-8) | EXPECT_LE(agreement.hi, forward.hi) | EXPECT_LE(forward.hi, sixteen.temperature.lo / 1000) | EXPECT_LE((Sqrt(I{24. * n * n + 1280}) * forward).hi, sixteen.gradient.lo / 1000) | EXPECT_LE(temporal.hi, spatial_error.temperature.lo / 32) | EXPECT_GE(temperature_order, 1.95) | EXPECT_LE(temperature_order, 2.05) | EXPECT_GE(gradient_order, .98) | EXPECT_LE(gradient_order, 1.03) | EXPECT_EQ(8 * (metrics.temperature_values + metrics.flux_values), 81074472U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/thermal_physics_test.cpp ThermalSlab.ActualMeshesMatchCertifiedP2AndSeparateFourierError ThermalSlab.ActualMeshesMatchCertifiedP2AndSeparateFourierError; assertion 10개 tests/integration/analysis/thermal_physics_test.cpp ThermalSlab.ActualMeshesMatchCertifiedP2AndSeparateFourierError 유지 원문 검사 body 및 assertion 동일. 35d85f768c1c0df7ccdf1dcfe80c2a8294bffdfc09fc9f32bef7e529eaa29491 35d85f768c1c0df7ccdf1dcfe80c2a8294bffdfc09fc9f32bef7e529eaa29491 EXPECT_EQ(p.state.CommittedState().temperature[row], 0) | ASSERT_GT(inverse_denominator.lo, 0) | EXPECT_LE(std::abs(element[sample][0]), flux_budget.hi) | EXPECT_LE(std::abs(element[sample][1]), flux_budget.hi) | EXPECT_LE((samples[quantity] - first_mesh[quantity]).Abs(), (I{first_budget[group]} + I{solver_budget[group]}).hi) | EXPECT_LE(roundoff.hi, oracle.space[group] / 1000) | EXPECT_LE(agreement[group], roundoff.hi) | EXPECT_LE(physical[group], (I{oracle.space[group]} + I{time_error[group]} + roundoff).hi) | EXPECT_LE((I{physical[group]} - I{space_error[group]}).Abs(), (I{time_error[group]} + roundoff).hi) | EXPECT_TRUE(plateau) EXPECT_EQ(p.state.CommittedState().temperature[row], 0) | ASSERT_GT(inverse_denominator.lo, 0) | EXPECT_LE(std::abs(element[sample][0]), flux_budget.hi) | EXPECT_LE(std::abs(element[sample][1]), flux_budget.hi) | EXPECT_LE((samples[quantity] - first_mesh[quantity]).Abs(), (I{first_budget[group]} + I{solver_budget[group]}).hi) | EXPECT_LE(roundoff.hi, oracle.space[group] / 1000) | EXPECT_LE(agreement[group], roundoff.hi) | EXPECT_LE(physical[group], (I{oracle.space[group]} + I{time_error[group]} + roundoff).hi) | EXPECT_LE((I{physical[group]} - I{space_error[group]}).Abs(), (I{time_error[group]} + roundoff).hi) | EXPECT_TRUE(plateau) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/analysis/thermal_physics_test.cpp support@1-337 helper/oracle/fixture/include/static assertion 구간: ti, Down, Up, I, Mid, Abs, Sqrt, Square, Gamma, Pi, Cos, if, ExpNegative, while, Power, T, Take, Checked, Mesh, Prepared, RunMetrics, Advance, for, Print, CapacityNorm tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ab404661df8fb79566243b654ea29e927bfecaa40967268a503305ab70dc37d9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_physics_test.cpp support@357-431 helper/oracle/fixture/include/static assertion 구간: VerifyDiscreteEigenmode tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 302213d4b2826eec0d855386a82aa934f7517ca58b5a648eee7d7312b379e6a7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_physics_test.cpp support@539-602 helper/oracle/fixture/include/static assertion 구간: ZeroLike, CertifiedInverse, if tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ed80a8f1fe0a8a5a570f4eee10c069f506b9a07b7e1187cae5bd9481521fb22a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_physics_test.cpp support@799-870 helper/oracle/fixture/include/static assertion 구간: ThicknessMass, ThicknessGradient, SpatialError, IntegrateSpatialError, for tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6fe84510f8e89a0b45ac65e8b403973d1a9f3333b13d9c73deaf7076f9ca12ee 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_physics_test.cpp support@959-961 helper/oracle/fixture/include/static assertion 구간: Bracket, ThermalSlab tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 132c3f6724f847d2eb1cb70298ba8cbba9a8d0a5f070b51734e71be7e07e0616 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_physics_test.cpp support@1133-1141 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/analysis/thermal_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e43aa8e23b2faf52e75adc8f5647bf291d27a232530b2c49b1bb17df2d2e329e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_slab_oracle.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/integration/analysis/thermal_slab_oracle.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2d4d4f58df2a9f08b25f850c59617100f2a8af10ba7bdebb7ee80e15b079ad27 2d4d4f58df2a9f08b25f850c59617100f2a8af10ba7bdebb7ee80e15b079ad27 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/analysis/thermal_slab_oracle.h support@1-359 helper/oracle/fixture/include/static assertion 구간: thermal_oracle, Bracket, SlabCase tests/integration/analysis/thermal_slab_oracle.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3dfe0819fc272857692d3de89c30080b4f509c425b6169550bba89114be56c1f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/eigen_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/integration/app/eigen_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7632397db2daf06eb0ff79a311f4f61832f415ebee4aebe334c8bf5d97e83772 7632397db2daf06eb0ff79a311f4f61832f415ebee4aebe334c8bf5d97e83772 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/eigen_application_test.cpp EigenApplicationTest.DispatchesFrequencyAndWritesModalSibling EigenApplicationTest.DispatchesFrequencyAndWritesModalSibling; assertion 9개 tests/integration/app/eigen_application_test.cpp EigenApplicationTest.DispatchesFrequencyAndWritesModalSibling 유지 원문 검사 body 및 assertion 동일. 68264a89e2eea378557e983ac8734ba58b464af83c2ac2b3628f1f1fafa70ee3 68264a89e2eea378557e983ac8734ba58b464af83c2ac2b3628f1f1fafa70ee3 "ASSERT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output_)) | ASSERT_TRUE(std::filesystem::exists(log_)) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/vectors"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" "ASSERT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output_)) | ASSERT_TRUE(std::filesystem::exists(log_)) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/vectors"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/eigen_application_test.cpp EigenApplicationTest.EmptyPencilPreservesPreviousFinalAndEmptyLog EigenApplicationTest.EmptyPencilPreservesPreviousFinalAndEmptyLog; assertion 3개 tests/integration/app/eigen_application_test.cpp EigenApplicationTest.EmptyPencilPreservesPreviousFinalAndEmptyLog 유지 원문 검사 body 및 assertion 동일. c919926a783cca5aacef016773b325fbad92557b269875233aa77feb5f4cf253 c919926a783cca5aacef016773b325fbad92557b269875233aa77feb5f4cf253 EXPECT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 4) | EXPECT_TRUE(std::string(std::istreambuf_iterator{previous}, {}) == original) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) EXPECT_EQ(fesa::FesaApplication{}.Run({input_.string()}), 4) | EXPECT_TRUE(std::string(std::istreambuf_iterator{previous}, {}) == original) | EXPECT_EQ(std::filesystem::file_size(log_), 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/eigen_application_test.cpp support@1-81 helper/oracle/fixture/include/static assertion 구간: EigenApplicationTest, WriteDeck tests/integration/app/eigen_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 34d85c877e290ff9094967418cedc08e2751fe6074e5f3007b0b1dd16a22e861 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/eigen_application_test.cpp support@110-111 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/eigen_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/fesa_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/integration/app/fesa_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 07d63eb93467254f069d6ae86e2af022287e1ff0dba8272dbb08e830709a9ff0 07d63eb93467254f069d6ae86e2af022287e1ff0dba8272dbb08e830709a9ff0 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/fesa_application_test.cpp LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName; assertion 2개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName 유지 원문 검사 body 및 assertion 동일. 32a254e96576eb69d5fa023125fa0bf941cf0d2a73be539df402feb8687b097f 32a254e96576eb69d5fa023125fa0bf941cf0d2a73be539df402feb8687b097f "ASSERT_EQ(result.exit_code, 0) | EXPECT_FALSE(std::filesystem::exists(directory.Path() / ""results.h5""))" "ASSERT_EQ(result.exit_code, 0) | EXPECT_FALSE(std::filesystem::exists(directory.Path() / ""results.h5""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/fesa_application_test.cpp FesaApplication.OpensDerivedLogBeforeInputMapping FesaApplication.OpensDerivedLogBeforeInputMapping; assertion 3개 tests/integration/app/fesa_application_test.cpp FesaApplication.OpensDerivedLogBeforeInputMapping 유지 원문 검사 body 및 assertion 동일. 0ff45e4e3ddc200c86c04a2c7aeafc773da2345f78afda2eadc06eddd4d6d006 0ff45e4e3ddc200c86c04a2c7aeafc773da2345f78afda2eadc06eddd4d6d006 EXPECT_EQ(result.exit_code, 3) | ASSERT_TRUE(std::filesystem::exists(log)) | EXPECT_EQ(std::filesystem::file_size(log), 0U) EXPECT_EQ(result.exit_code, 3) | ASSERT_TRUE(std::filesystem::exists(log)) | EXPECT_EQ(std::filesystem::file_size(log), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/fesa_application_test.cpp LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic; assertion 9개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic 유지 원문 검사 body 및 assertion 동일. 466456fe6183443de50011587199f89bcfe4345da298f5ffcb6fb3bf21b27f83 466456fe6183443de50011587199f89bcfe4345da298f5ffcb6fb3bf21b27f83 "EXPECT_EQ(success.exit_code, 0) | EXPECT_EQ(usage.exit_code, 2) | EXPECT_EQ(input.exit_code, 3) | EXPECT_EQ(model.exit_code, 4) | EXPECT_EQ(solver.exit_code, 5) | EXPECT_EQ(repeated_output.exit_code, 2) | EXPECT_NE(repeated_output.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(unknown_output_option.exit_code, 2) | EXPECT_NE(unknown_output_option.standard_error.find(""code=cli-usage""), std::string::npos)" "EXPECT_EQ(success.exit_code, 0) | EXPECT_EQ(usage.exit_code, 2) | EXPECT_EQ(input.exit_code, 3) | EXPECT_EQ(model.exit_code, 4) | EXPECT_EQ(solver.exit_code, 5) | EXPECT_EQ(repeated_output.exit_code, 2) | EXPECT_NE(repeated_output.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(unknown_output_option.exit_code, 2) | EXPECT_NE(unknown_output_option.standard_error.find(""code=cli-usage""), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged; assertion 7개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged 유지 원문 검사 body 및 assertion 동일. 15e900377c4aa714bb7d75ea9dcefa8e379107ec7b3aae46f27c39781c4d73e4 15e900377c4aa714bb7d75ea9dcefa8e379107ec7b3aae46f27c39781c4d73e4 "EXPECT_EQ(result.exit_code, 2) | EXPECT_EQ( std::count(result.standard_error.begin(), result.standard_error.end(), '\n'), 1U) | EXPECT_NE(result.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" "EXPECT_EQ(result.exit_code, 2) | EXPECT_EQ( std::count(result.standard_error.begin(), result.standard_error.end(), '\n'), 1U) | EXPECT_NE(result.standard_error.find(""code=cli-usage""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/fesa_application_test.cpp LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged; assertion 7개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged 유지 원문 검사 body 및 assertion 동일. 28fec91071cedec614407118354e3d04c18bccaf67210f5351846382380f4def 28fec91071cedec614407118354e3d04c18bccaf67210f5351846382380f4def "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(result.exit_code, 6) | EXPECT_NE(result.standard_error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(result.exit_code, 6) | EXPECT_NE(result.standard_error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents) | EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time) | EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents) | EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults; assertion 6개 tests/integration/app/fesa_application_test.cpp LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults 유지 원문 검사 body 및 assertion 동일. 36ab47846953b9f89467d79516155a88696bf76e752f34933d9dc6169a28f6a3 36ab47846953b9f89467d79516155a88696bf76e752f34933d9dc6169a28f6a3 "ASSERT_EQ(plain.exit_code, 0) | ASSERT_EQ(requested.exit_code, 0) | EXPECT_EQ(ReadDoubleDataset(requested_file.Get(), path), ReadDoubleDataset(plain_file.Get(), path)) | EXPECT_EQ(DatasetDimensions(plain_file.Get(), ""/diagnostics""), std::vector({0U})) | ASSERT_EQ(requested_diagnostics.size(), 1U) | EXPECT_GT(requested_diagnostics[0U], 0U)" "ASSERT_EQ(plain.exit_code, 0) | ASSERT_EQ(requested.exit_code, 0) | EXPECT_EQ(ReadDoubleDataset(requested_file.Get(), path), ReadDoubleDataset(plain_file.Get(), path)) | EXPECT_EQ(DatasetDimensions(plain_file.Get(), ""/diagnostics""), std::vector({0U})) | ASSERT_EQ(requested_diagnostics.size(), 1U) | EXPECT_GT(requested_diagnostics[0U], 0U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/fesa_application_test.cpp Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute; assertion 1개 tests/integration/app/fesa_application_test.cpp Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute 유지 원문 검사 body 및 assertion 동일. f437d9ab3ce6cc9db9242318e612bb8e0f5acdf70ce8ca47910c24a6e2fefbf9 f437d9ab3ce6cc9db9242318e612bb8e0f5acdf70ce8ca47910c24a6e2fefbf9 ASSERT_EQ(result.exit_code, 0) ASSERT_EQ(result.exit_code, 0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/fesa_application_test.cpp support@1-355 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, CurrentDirectoryGuard, Hdf5Handle, WriteText, AxialDeck, AllConstrainedShellDeck, OpenFile, OpenDataset, DatasetDimensions, ReadDoubleDataset, for, ReadStringAttribute, ExpectMandatoryInventory, ExpectFesaHdf5Identity, ExpectShellHdf5Identity, AppRun, RunApplication, catch, ExpectDiagnosticFieldOrder, FileSnapshot, SnapshotFile tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 86ad01a4a2d9c96621b43860360f5db1b874f41c64a92f5331a7d2c5f7a090b2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/fesa_application_test.cpp support@370-371 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0d9a57af3a9392fe92e3468c81957fece71dccadbc9c5c1d2ae25abcdcfcbf96 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/fesa_application_test.cpp support@424-426 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2e743f1bbe2074a4e496d4e18d5f0fb1d01581db88662ac2b7000cbbf3235f48 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/fesa_application_test.cpp support@454-456 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 485a5a091491fa984b66ae21431bff2ac7e5bd7b5981645f350c41c4c4d1ceff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/fesa_application_test.cpp support@517-518 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/fesa_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7210dc43217ee6c97222f26b3a7441a44ac19ae603a5360e08ac32b4c466f12d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/shell_surface_pressure_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/integration/app/shell_surface_pressure_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 369cc07b69791c67f80fefdfebd3b3986bdd7ec3ddae0fc20cc7f9f01f1e4d07 369cc07b69791c67f80fefdfebd3b3986bdd7ec3ddae0fc20cc7f9f01f1e4d07 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate; assertion 2개 tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate 유지 원문 검사 body 및 assertion 동일. 4352e654ee0cbb33ae714e1d066609c2a6e2daf28d16df65df2da019d8af4e50 4352e654ee0cbb33ae714e1d066609c2a6e2daf28d16df65df2da019d8af4e50 EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) EXPECT_NE(exit_code, 0) | EXPECT_EQ(ReadBytes(output), previous) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior; assertion 7개 tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior 유지 원문 검사 body 및 assertion 동일. 53128674e01206097130820f16e2df3d01c24e0961f07bad72972d923ed96683 53128674e01206097130820f16e2df3d01c24e0961f07bad72972d923ed96683 "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/displacement"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/displacement"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior; assertion 7개 tests/integration/app/shell_surface_pressure_application_test.cpp ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior 유지 원문 검사 body 및 assertion 동일. a92cd868028262e66a83bd771b9a654819e00285b03907d87f49c87ae6ceb5fe a92cd868028262e66a83bd771b9a654819e00285b03907d87f49c87ae6ceb5fe "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" "EXPECT_EQ(fesa::FesaApplication{}.Run({input.string()}), 0) | ASSERT_TRUE(std::filesystem::exists(output)) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file, ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GE(H5Fclose(file), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/shell_surface_pressure_application_test.cpp support@1-137 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WriteText, ReadBytes, ShellDeck, NonlinearShellDeck tests/integration/app/shell_surface_pressure_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 018b3c3f47b9ffbf3ee6fc438e63618a745aef6195e249c4b5acf8cbfd00ac04 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/solid_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/integration/app/solid_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4fe3fa020951bd776343af5d26def36392794dd74c5e19ca3d57427c489c6831 4fe3fa020951bd776343af5d26def36392794dd74c5e19ca3d57427c489c6831 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/solid_application_test.cpp SolidApplication.AllFiveActualProceduresWriteOfficialSolidSchema SolidApplication.AllFiveActualProceduresWriteOfficialSolidSchema; assertion 6개 tests/integration/app/solid_application_test.cpp SolidApplication.AllFiveActualProceduresWriteOfficialSolidSchema 유지 원문 검사 body 및 assertion 동일. 0cddac0e04be42a231c5f6677e088fd87072a425b750a23aab5690b0ed8c84bd 0cddac0e04be42a231c5f6677e088fd87072a425b750a23aab5690b0ed8c84bd ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_GE(f, 0) | ASSERT_GE(g, 0) | ASSERT_GE(a, 0) | ASSERT_GE(H5Aread(a, t, &value), 0) | EXPECT_STREQ(value, solid_output_test::Procedure(p)) ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_GE(f, 0) | ASSERT_GE(g, 0) | ASSERT_GE(a, 0) | ASSERT_GE(H5Aread(a, t, &value), 0) | EXPECT_STREQ(value, solid_output_test::Procedure(p)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/solid_application_test.cpp SolidApplication.NativeExecutableRunsAllFiveAndKeepsWarningsAndTypedLogs SolidApplication.NativeExecutableRunsAllFiveAndKeepsWarningsAndTypedLogs; assertion 20개 tests/integration/app/solid_application_test.cpp SolidApplication.NativeExecutableRunsAllFiveAndKeepsWarningsAndTypedLogs 유지 원문 검사 body 및 assertion 동일. 6fa687c0d3ddc09ca8dfdbe276e14156ffb4b98874acb4e66b2a3a815956eb96 6fa687c0d3ddc09ca8dfdbe276e14156ffb4b98874acb4e66b2a3a815956eb96 "ASSERT_GT(length, 0u) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | ASSERT_EQ(exit, 0u) | EXPECT_GT(H5Fis_hdf5(files.output.string().c_str()), 0) | EXPECT_EQ(NumericSnapshot(files.output, p), expected) | EXPECT_EQ(log.find(""correction_rotation""), std::string::npos) | EXPECT_EQ(log.find(""residual_moment""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-static-log-v1""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-hht-log-v1""), std::string::npos) | EXPECT_NE(log.find(""h2_physical_da_over_L=""), std::string::npos) | EXPECT_NE(log.find(""h2_algorithmic_dA_over_L=""), std::string::npos) | EXPECT_NE(log.find(""normalized-high-low-physical-state;RN64-observables""), std::string::npos) | ASSERT_GE(file, 0) | ASSERT_GE(diagnostics, 0) | EXPECT_GT(rows, 0u)" "ASSERT_GT(length, 0u) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_EQ(fesa::FesaApplication{}.Run({files.input.string()}), 0) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | ASSERT_EQ(exit, 0u) | EXPECT_GT(H5Fis_hdf5(files.output.string().c_str()), 0) | EXPECT_EQ(NumericSnapshot(files.output, p), expected) | EXPECT_EQ(log.find(""correction_rotation""), std::string::npos) | EXPECT_EQ(log.find(""residual_moment""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-static-log-v1""), std::string::npos) | EXPECT_NE(log.find(""schema=solid-hht-log-v1""), std::string::npos) | EXPECT_NE(log.find(""h2_physical_da_over_L=""), std::string::npos) | EXPECT_NE(log.find(""h2_algorithmic_dA_over_L=""), std::string::npos) | EXPECT_NE(log.find(""normalized-high-low-physical-state;RN64-observables""), std::string::npos) | ASSERT_GE(file, 0) | ASSERT_GE(diagnostics, 0) | EXPECT_GT(rows, 0u)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/solid_application_test.cpp SolidApplication.SuccessfulWarningsRetainSourceLocationAndTarget SolidApplication.SuccessfulWarningsRetainSourceLocationAndTarget; assertion 5개 tests/integration/app/solid_application_test.cpp SolidApplication.SuccessfulWarningsRetainSourceLocationAndTarget 유지 원문 검사 body 및 assertion 동일. cb7efd965f709cfc1e66b1751aaaf1c95e875fafa95a45ce6b96ab5f92a47918 cb7efd965f709cfc1e66b1751aaaf1c95e875fafa95a45ce6b96ab5f92a47918 "ASSERT_EQ(exit, 0) | EXPECT_NE(diagnostics.find(""code=inactive-solid-rotation-boundary""), std::string::npos) | EXPECT_NE(diagnostics.find(""entity_identity=Fixed""), std::string::npos) | EXPECT_NE(diagnostics.find(""line=30""), std::string::npos) | EXPECT_NE(diagnostics.find(files.input.generic_u8string()), std::string::npos)" "ASSERT_EQ(exit, 0) | EXPECT_NE(diagnostics.find(""code=inactive-solid-rotation-boundary""), std::string::npos) | EXPECT_NE(diagnostics.find(""entity_identity=Fixed""), std::string::npos) | EXPECT_NE(diagnostics.find(""line=30""), std::string::npos) | EXPECT_NE(diagnostics.find(files.input.generic_u8string()), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/integration/app/solid_application_test.cpp support@1-73 helper/oracle/fixture/include/static assertion 구간: NumericSnapshot, for, if tests/integration/app/solid_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fae87db4332db2d58466c577879e346b24a315f8b02442f98f89f063011d1cdf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/solid_application_test.cpp support@174-174 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/solid_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/thermal_application_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/integration/app/thermal_application_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 921d9686ce735dc7e44d0e9bd61580838f969ce08e3f858550a099c9fc98cbef 921d9686ce735dc7e44d0e9bd61580838f969ce08e3f858550a099c9fc98cbef 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExecutesThermalInputThroughAtomicOutput ThermalApplicationTest.ExecutesThermalInputThroughAtomicOutput; assertion 27개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExecutesThermalInputThroughAtomicOutput 유지 원문 검사 body 및 assertion 동일. f6df36c87719748f81960dad63fa6e838d8bc71a7814c36d0d7cb28449bed204 f6df36c87719748f81960dad63fa6e838d8bc71a7814c36d0d7cb28449bed204 "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""Heat.Model_results.h5"").string().c_str()), 0) | EXPECT_EQ(std::filesystem::file_size(Path(""Heat.Model_log.txt"")), 0U) | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_step_name""), ""Raw Heat"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""feature_id""), ""shell-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""analysis_procedure""), ""uncoupled-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_input_identity"") .find(""path="" + Path(""Heat.Model.INP"").generic_u8string() + "";content_identity=""), 0U) | ASSERT_EQ(frames.size(), 4U) | EXPECT_EQ(frame.frame_index, index) | EXPECT_EQ(frame.increment_index, index) | EXPECT_EQ(frame.is_initial, index == 0 ? 1 : 0) | EXPECT_DOUBLE_EQ(frame.time, index == 3 ? .7 : static_cast(index) * .3) | EXPECT_DOUBLE_EQ(frame.time_increment, index == 0 ? 0 : index == 3 ? std::fma(-2., .3, .7) : .3) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/temperature""), (std::vector{4, 5})) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_LT(value, 0.) | EXPECT_DOUBLE_EQ(value, -2.) | EXPECT_EQ( H5Lexists(file.Get(), (root + ""/nodal/reaction_heat_rate"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), (root + ""/element"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{0})) | EXPECT_EQ(Shape(file.Get(), root + ""/element/heat_flux""), (std::vector{1, 4, 6, 3})) | EXPECT_EQ(Shape(file.Get(), ""/diagnostics""), (std::vector{1})) | ASSERT_GE(H5Tset_size(string_type.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(string_type.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(row_type.Get(), ""code"", 0, string_type.Get()), 0) | ASSERT_GE(H5Dread(diagnostics.Get(), row_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &code), 0) | EXPECT_STREQ(code, ""ignored-input-keyword"")" "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""Heat.Model_results.h5"").string().c_str()), 0) | EXPECT_EQ(std::filesystem::file_size(Path(""Heat.Model_log.txt"")), 0U) | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_step_name""), ""Raw Heat"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""feature_id""), ""shell-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""analysis_procedure""), ""uncoupled-transient-heat-transfer"") | EXPECT_EQ(StringAttribute(metadata.Get(), ""source_input_identity"") .find(""path="" + Path(""Heat.Model.INP"").generic_u8string() + "";content_identity=""), 0U) | ASSERT_EQ(frames.size(), 4U) | EXPECT_EQ(frame.frame_index, index) | EXPECT_EQ(frame.increment_index, index) | EXPECT_EQ(frame.is_initial, index == 0 ? 1 : 0) | EXPECT_DOUBLE_EQ(frame.time, index == 3 ? .7 : static_cast(index) * .3) | EXPECT_DOUBLE_EQ(frame.time_increment, index == 0 ? 0 : index == 3 ? std::fma(-2., .3, .7) : .3) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/temperature""), (std::vector{4, 5})) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_LT(value, 0.) | EXPECT_DOUBLE_EQ(value, -2.) | EXPECT_EQ( H5Lexists(file.Get(), (root + ""/nodal/reaction_heat_rate"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), (root + ""/element"").c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{0})) | EXPECT_EQ(Shape(file.Get(), root + ""/element/heat_flux""), (std::vector{1, 4, 6, 3})) | EXPECT_EQ(Shape(file.Get(), ""/diagnostics""), (std::vector{1})) | ASSERT_GE(H5Tset_size(string_type.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(string_type.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(row_type.Get(), ""code"", 0, string_type.Get()), 0) | ASSERT_GE(H5Dread(diagnostics.Get(), row_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &code), 0) | EXPECT_STREQ(code, ""ignored-input-keyword"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.EndpointCloseUsesActualDeltaAndLargeIncrementUsesPeriod ThermalApplicationTest.EndpointCloseUsesActualDeltaAndLargeIncrementUsesPeriod; assertion 8개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.EndpointCloseUsesActualDeltaAndLargeIncrementUsesPeriod 유지 원문 검사 body 및 assertion 동일. ad5bd959038bf1bc1167ca2796d5badbb5ec663f87fe89df335c5b8acb760992 ad5bd959038bf1bc1167ca2796d5badbb5ec663f87fe89df335c5b8acb760992 ASSERT_EQ(run.exit_code, 0) | ASSERT_EQ(frames.size(), 4U) | EXPECT_DOUBLE_EQ(frames.back().time, .9) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .3) | EXPECT_NE(frames.back().time_increment, frames[3].time - frames[2].time) | ASSERT_EQ(frames.size(), 2U) | EXPECT_DOUBLE_EQ(frames.back().time, .7) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .7) ASSERT_EQ(run.exit_code, 0) | ASSERT_EQ(frames.size(), 4U) | EXPECT_DOUBLE_EQ(frames.back().time, .9) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .3) | EXPECT_NE(frames.back().time_increment, frames[3].time - frames[2].time) | ASSERT_EQ(frames.size(), 2U) | EXPECT_DOUBLE_EQ(frames.back().time, .7) | EXPECT_DOUBLE_EQ(frames.back().time_increment, .7) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RawInitialPrecedesPrescribedBoundaryProjection ThermalApplicationTest.RawInitialPrecedesPrescribedBoundaryProjection; assertion 5개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RawInitialPrecedesPrescribedBoundaryProjection 유지 원문 검사 body 및 assertion 동일. 28ecc20ef5539e10837bbd26888c6c4700394e032a556a72b3732e7322abaad7 28ecc20ef5539e10837bbd26888c6c4700394e032a556a72b3732e7322abaad7 "ASSERT_EQ(run.exit_code, 0) | EXPECT_DOUBLE_EQ(value, -2) | EXPECT_DOUBLE_EQ(temperature[5 * node], 1) | EXPECT_DOUBLE_EQ(temperature[5 * node + 4], 1) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{8}))" "ASSERT_EQ(run.exit_code, 0) | EXPECT_DOUBLE_EQ(value, -2) | EXPECT_DOUBLE_EQ(temperature[5 * node], 1) | EXPECT_DOUBLE_EQ(temperature[5 * node + 4], 1) | EXPECT_EQ(Shape(file.Get(), root + ""/nodal/reaction_heat_rate""), (std::vector{8}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.InputAndSolverFailuresPreservePreviousFinal ThermalApplicationTest.InputAndSolverFailuresPreservePreviousFinal; assertion 4개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.InputAndSolverFailuresPreservePreviousFinal 유지 원문 검사 body 및 assertion 동일. cfe5e9a34c0cbd33635c6d35935173a280c1378f0735dfc9e5a5777696c1bc7b cfe5e9a34c0cbd33635c6d35935173a280c1378f0735dfc9e5a5777696c1bc7b "EXPECT_EQ(run.exit_code, test.second) | EXPECT_FALSE(run.error.empty()) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), previous) | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U)" "EXPECT_EQ(run.exit_code, test.second) | EXPECT_FALSE(run.error.empty()) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), previous) | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.BusyLeasePrecedesParsingAndPreservesBothOutputs ThermalApplicationTest.BusyLeasePrecedesParsingAndPreservesBothOutputs; assertion 5개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.BusyLeasePrecedesParsingAndPreservesBothOutputs 유지 원문 검사 body 및 assertion 동일. be71949b43487d6eed86586a4994ed0d9fd08e1263cb47f5d13b7c995aaf01a0 be71949b43487d6eed86586a4994ed0d9fd08e1263cb47f5d13b7c995aaf01a0 "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(run.exit_code, 6) | EXPECT_NE(run.error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"") | EXPECT_EQ(ReadBytes(paths.log_path), ""previous log"")" "ASSERT_TRUE(lease.HasValue()) | EXPECT_EQ(run.exit_code, 6) | EXPECT_NE(run.error.find(""code=output-busy""), std::string::npos) | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"") | EXPECT_EQ(ReadBytes(paths.log_path), ""previous log"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RealFinalizeFailurePreservesFinalAndRemovesCandidate ThermalApplicationTest.RealFinalizeFailurePreservesFinalAndRemovesCandidate; assertion 6개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.RealFinalizeFailurePreservesFinalAndRemovesCandidate 유지 원문 검사 body 및 assertion 동일. 5f48d5b0464432fadf5f0f9522ae62bb204c588633cc77c86517b58a81667be0 5f48d5b0464432fadf5f0f9522ae62bb204c588633cc77c86517b58a81667be0 "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_TRUE(CloseHandle(locked)) | EXPECT_EQ(run.exit_code, 6) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), ""previous final"") | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U) | EXPECT_EQ(entry.path().filename().string().find("".tmp.""), std::string::npos)" "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_TRUE(CloseHandle(locked)) | EXPECT_EQ(run.exit_code, 6) | EXPECT_EQ(ReadBytes(Path(""model_results.h5"")), ""previous final"") | EXPECT_EQ(std::filesystem::file_size(Path(""model_log.txt"")), 0U) | EXPECT_EQ(entry.path().filename().string().find("".tmp.""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.MissingAdaptersHaveSpecificFailureCategories ThermalApplicationTest.MissingAdaptersHaveSpecificFailureCategories; assertion 14개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.MissingAdaptersHaveSpecificFailureCategories 유지 원문 검사 body 및 assertion 동일. 96329adf31d0773e0ed5ee9335cb9c21be7908e2179d2c8abb4a74f7a5ba71c1 96329adf31d0773e0ed5ee9335cb9c21be7908e2179d2c8abb4a74f7a5ba71c1 "ASSERT_TRUE(prepared.HasValue()) | ASSERT_EQ(prepared.Value().domain.Steps().Size(), 0U) | ASSERT_TRUE(log.Open(Path(""model_log.txt"")).IsOk()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""missing-thermal-executor"") | ASSERT_TRUE(outcome.HasValue()) | ASSERT_TRUE( std::holds_alternative(outcome.Value())) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-thermal-writer"") | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"")" "ASSERT_TRUE(prepared.HasValue()) | ASSERT_EQ(prepared.Value().domain.Steps().Size(), 0U) | ASSERT_TRUE(log.Open(Path(""model_log.txt"")).IsOk()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""missing-thermal-executor"") | ASSERT_TRUE(outcome.HasValue()) | ASSERT_TRUE( std::holds_alternative(outcome.Value())) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-thermal-writer"") | EXPECT_EQ(ReadBytes(paths.results_path), ""previous final"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExistingStructuralStaticNonlinearAndHhtRoutesRemainAvailable ThermalApplicationTest.ExistingStructuralStaticNonlinearAndHhtRoutesRemainAvailable; assertion 2개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.ExistingStructuralStaticNonlinearAndHhtRoutesRemainAvailable 유지 원문 검사 body 및 assertion 동일. b103892efb098072fe2035f37dbc8731fa5d2819279d54cc1cc3a7e0dfc3b29d b103892efb098072fe2035f37dbc8731fa5d2819279d54cc1cc3a7e0dfc3b29d "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""model_results.h5"").string().c_str()), 0)" "ASSERT_EQ(run.exit_code, 0) | EXPECT_GT(H5Fis_hdf5(Path(""model_results.h5"").string().c_str()), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.NativeExecutableAcceptsThermalInputAndRejectsInteriorBoundary ThermalApplicationTest.NativeExecutableAcceptsThermalInputAndRejectsInteriorBoundary; assertion 9개 tests/integration/app/thermal_application_test.cpp ThermalApplicationTest.NativeExecutableAcceptsThermalInputAndRejectsInteriorBoundary 유지 원문 검사 body 및 assertion 동일. 24830ff7dc3c76bc4465be558297597f8626d2f17796512e86b1853983bb48da 24830ff7dc3c76bc4465be558297597f8626d2f17796512e86b1853983bb48da "ASSERT_GT(length, 0U) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | EXPECT_EQ(exit, valid ? 0U : 3U) | EXPECT_GT(H5Fis_hdf5(Path(""native_results.h5"").string().c_str()), 0) | EXPECT_EQ(ReadBytes(Path(""native_results.h5"")), previous)" "ASSERT_GT(length, 0U) | ASSERT_LT(length, module.size()) | ASSERT_TRUE(std::filesystem::exists(executable)) | ASSERT_TRUE(CreateProcessW(executable.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &startup, &process)) | EXPECT_TRUE(GetExitCodeProcess(process.hProcess, &exit)) | ASSERT_EQ(wait, WAIT_OBJECT_0) | EXPECT_EQ(exit, valid ? 0U : 3U) | EXPECT_GT(H5Fis_hdf5(Path(""native_results.h5"").string().c_str()), 0) | EXPECT_EQ(ReadBytes(Path(""native_results.h5"")), previous)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/integration/app/thermal_application_test.cpp support@1-210 helper/oracle/fixture/include/static assertion 구간: HdfHandle, Get, Shape, Doubles, StringAttribute, FrameRow, Frames, ReadBytes, Replace, AppRun, RunApplication, ThermalApplicationTest, Path, Write, Deck tests/integration/app/thermal_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c9bedffeff261fb62a5b5b120bbf06fa4662699a430a6974de8875b45fd134ff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/integration/app/thermal_application_test.cpp support@492-493 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/integration/app/thermal_application_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/reference/b33_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/b33_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296 8de80a54713f644fb3f7e0d4a1f2d633cf05973b3fcb71ad23bb9e3b318b5296 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/b33_reference_comparison_test.cpp B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence; assertion 35개 tests/reference/b33_reference_comparison_test.cpp B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence 유지 원문 검사 body 및 assertion 동일. 082a94dba1c41737c5aad55d0f5f0c0e94a339a24de29e3dfba6d70ddf48f0ea 082a94dba1c41737c5aad55d0f5f0c0e94a339a24de29e3dfba6d70ddf48f0ea "ASSERT_TRUE(std::filesystem::create_directories(output_directory, error)) | ASSERT_FALSE(error) | ASSERT_EQ(reference_before.size(), 4U) | EXPECT_EQ(reference_before[0U].relative_path, std::filesystem::path{""cantilever beam displacements.csv""}) | EXPECT_EQ(reference_before[1U].relative_path, std::filesystem::path{""cantilever beam elemental forces.csv""}) | EXPECT_EQ(reference_before[2U].relative_path, std::filesystem::path{""cantilever beam reactions.csv""}) | EXPECT_EQ(reference_before[3U].relative_path, std::filesystem::path{""cantilever beam.inp""}) | ASSERT_TRUE(std::filesystem::copy_file(input, execution_input, error)) | ASSERT_FALSE(error) | ASSERT_EQ(application.Run({execution_input.string()}), 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_GT(H5Fis_hdf5(results.string().c_str()), 0) | EXPECT_GT(StressRowCount(results), 0U) | ASSERT_TRUE(comparison_result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), kExpectedRowCount) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed && std::isfinite(row.absolute_error) && std::isfinite(row.tolerance) && row.tolerance >= 0.0 && std::isfinite(row.reference_scale) && std::isfinite(row.near_zero_band) && std::isfinite(row.relative_error) && row.fesa.model_id == ""cantilever-beam-b33"" && row.reference.model_id == ""cantilever-beam-b33"" && row.fesa.step_name == ""Step-1"" && row.reference.step_name == ""Step-1"" && row.fesa.frame_index == 0U && row.reference.frame_index == 0U && row.fesa.instance_name == ""PART-1_1-1"" && row.reference.instance_name == ""PART-1_1-1"" && !row.fesa.hdf5_dataset_path.empty(); })) | EXPECT_TRUE( std::all_of(report.metrics.begin(), report.metrics.end(), [](const fesa::test::ComponentMetrics& metric) { return std::isfinite(metric.reference_scale) && std::isfinite(metric.near_zero_band) && std::isfinite(metric.maximum_absolute_error) && std::isfinite(metric.relative_rms) && metric.rms_passed && metric.passed && metric.row_count > 0U && !metric.components.empty(); })) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | EXPECT_TRUE(std::isfinite(report.physics_evidence.free_residual_norm)) | EXPECT_LE(report.physics_evidence.free_residual_norm, 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_force, report.physics_evidence.reaction_force)), 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_moment_about_origin, report.physics_evidence.reaction_moment_about_origin)), 1.0e-2) | ASSERT_TRUE(fesa::test::ReferenceComparison::WriteDeterministicJson( report, comparison) .IsOk()) | ASSERT_TRUE(std::filesystem::is_regular_file(comparison)) | EXPECT_NE(json.find(""\""stress_comparison_applicable\"":false""), std::string::npos) | EXPECT_NE(json.find(""\""physics_evidence\""""), std::string::npos) | EXPECT_NE(json.find(""\""source_element_label\""""), std::string::npos) | EXPECT_NE(json.find(""\""family_identity\""""), std::string::npos) | EXPECT_NE(json.find(""\""row_count\""""), std::string::npos) | EXPECT_EQ(generated_names, (std::vector{""cantilever beam.inp"", ""cantilever beam_log.txt"", ""cantilever beam_results.h5"", ""comparison.json""}))" "ASSERT_TRUE(std::filesystem::create_directories(output_directory, error)) | ASSERT_FALSE(error) | ASSERT_EQ(reference_before.size(), 4U) | EXPECT_EQ(reference_before[0U].relative_path, std::filesystem::path{""cantilever beam displacements.csv""}) | EXPECT_EQ(reference_before[1U].relative_path, std::filesystem::path{""cantilever beam elemental forces.csv""}) | EXPECT_EQ(reference_before[2U].relative_path, std::filesystem::path{""cantilever beam reactions.csv""}) | EXPECT_EQ(reference_before[3U].relative_path, std::filesystem::path{""cantilever beam.inp""}) | ASSERT_TRUE(std::filesystem::copy_file(input, execution_input, error)) | ASSERT_FALSE(error) | ASSERT_EQ(application.Run({execution_input.string()}), 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_GT(H5Fis_hdf5(results.string().c_str()), 0) | EXPECT_GT(StressRowCount(results), 0U) | ASSERT_TRUE(comparison_result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), kExpectedRowCount) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed && std::isfinite(row.absolute_error) && std::isfinite(row.tolerance) && row.tolerance >= 0.0 && std::isfinite(row.reference_scale) && std::isfinite(row.near_zero_band) && std::isfinite(row.relative_error) && row.fesa.model_id == ""cantilever-beam-b33"" && row.reference.model_id == ""cantilever-beam-b33"" && row.fesa.step_name == ""Step-1"" && row.reference.step_name == ""Step-1"" && row.fesa.frame_index == 0U && row.reference.frame_index == 0U && row.fesa.instance_name == ""PART-1_1-1"" && row.reference.instance_name == ""PART-1_1-1"" && !row.fesa.hdf5_dataset_path.empty(); })) | EXPECT_TRUE( std::all_of(report.metrics.begin(), report.metrics.end(), [](const fesa::test::ComponentMetrics& metric) { return std::isfinite(metric.reference_scale) && std::isfinite(metric.near_zero_band) && std::isfinite(metric.maximum_absolute_error) && std::isfinite(metric.relative_rms) && metric.rms_passed && metric.passed && metric.row_count > 0U && !metric.components.empty(); })) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | EXPECT_TRUE(std::isfinite(report.physics_evidence.free_residual_norm)) | EXPECT_LE(report.physics_evidence.free_residual_norm, 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_force, report.physics_evidence.reaction_force)), 1.0e-3) | EXPECT_LE(Norm(Sum(report.physics_evidence.applied_moment_about_origin, report.physics_evidence.reaction_moment_about_origin)), 1.0e-2) | ASSERT_TRUE(fesa::test::ReferenceComparison::WriteDeterministicJson( report, comparison) .IsOk()) | ASSERT_TRUE(std::filesystem::is_regular_file(comparison)) | EXPECT_NE(json.find(""\""stress_comparison_applicable\"":false""), std::string::npos) | EXPECT_NE(json.find(""\""physics_evidence\""""), std::string::npos) | EXPECT_NE(json.find(""\""source_element_label\""""), std::string::npos) | EXPECT_NE(json.find(""\""family_identity\""""), std::string::npos) | EXPECT_NE(json.find(""\""row_count\""""), std::string::npos) | EXPECT_EQ(generated_names, (std::vector{""cantilever beam.inp"", ""cantilever beam_log.txt"", ""cantilever beam_results.h5"", ""comparison.json""}))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/b33_reference_comparison_test.cpp support@1-147 helper/oracle/fixture/include/static assertion 구간: Hdf5Handle, if, ReferenceSnapshotEntry, ReadBytes, SnapshotTree, sort, ExpectTreeUnchanged, Norm, Sum, StressRowCount tests/reference/b33_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 08f0770f5aeb24b1560b8da3f35b583cbf85abfbf36dded9d21e96dfb54c38c3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/eigen_reference_cases_test.cpp file 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 modal identity·수치 기준은 유지한다. 4890fe18f1ff259890fbc9baf6f4f1c39fabd3bc0a42b8059581dfff7604aeb6 4890fe18f1ff259890fbc9baf6f4f1c39fabd3bc0a42b8059581dfff7604aeb6 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_cases_test.cpp EigenReference.RunsOriginalInputAndComparesAllModalFrameIdentities EigenReference.RunsOriginalInputAndComparesAllModalFrameIdentities; assertion 16개 tests/reference/eigen_reference_cases_test.cpp EigenReference.RunsOriginalInputAndComparesAllModalFrameIdentities 유지 원문 검사 body 및 assertion 동일. e4f451acf146ec42a498f137080e48e956b4c57c5dbbbaff1a880d95123d254c e4f451acf146ec42a498f137080e48e956b4c57c5dbbbaff1a880d95123d254c "EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before) | ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().passed) | EXPECT_EQ(comparison.Value().source_step_name, ""Step-2"") | EXPECT_EQ(comparison.Value().requested_mode_count, 10U) | ASSERT_EQ(comparison.Value().rows.size(), 10U) | ASSERT_EQ(comparison.Value().families.size(), 10U) | EXPECT_EQ(comparison.Value().rows[index].mode_id, index + 1U) | EXPECT_EQ(comparison.Value().rows[index].component, ""Value"") | EXPECT_EQ(comparison.Value().families[index].row_count, 1U) | EXPECT_TRUE(comparison.Value().families[index].passed) | EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before)" "EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before) | ASSERT_EQ(exit_code, 0) | ASSERT_TRUE(std::filesystem::is_regular_file(results)) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().passed) | EXPECT_EQ(comparison.Value().source_step_name, ""Step-2"") | EXPECT_EQ(comparison.Value().requested_mode_count, 10U) | ASSERT_EQ(comparison.Value().rows.size(), 10U) | ASSERT_EQ(comparison.Value().families.size(), 10U) | EXPECT_EQ(comparison.Value().rows[index].mode_id, index + 1U) | EXPECT_EQ(comparison.Value().rows[index].component, ""Value"") | EXPECT_EQ(comparison.Value().families[index].row_count, 1U) | EXPECT_TRUE(comparison.Value().families[index].passed) | EXPECT_EQ(ReadBytes(input), input_before) | EXPECT_EQ(ReadBytes(text), text_before)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/reference/eigen_reference_cases_test.cpp support@1-31 helper/oracle/fixture/include/static assertion 구간: ReadBytes, if tests/reference/eigen_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 modal identity·수치 기준은 유지한다. e6d5ed00a9bcbd734a958a0c92005773d61527a1f2fdad5e04571e08bb892da2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_cases_test.cpp support@78-79 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/eigen_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 modal identity·수치 기준은 유지한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/eigen_reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000 b46d4b18fcbf3bbcba3547c41cdecc3f206eb6ed6d2df44b7de4f3a8c2c86000 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison.cpp support@1-436 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonFailure, Fail, FailureStatus, Hdf5Handle, if, RequireId, RequireHdf, ReadUtf8Attribute, ReadUint64Attribute, Hdf5Mode, ReadModes, ParseFiniteNumber, data, RequireNumberSyntax, ReadReferenceText, while, Result, Compare, for, catch tests/reference/eigen_reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f8341d7432300658ef47c07672af81668f135597ea1bad54b73a9c9000e3c51b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/eigen_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15 96423b9a6c85e87752a28c38eed575c834c724caad6692122523f49888391a15 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison.h support@1-51 helper/oracle/fixture/include/static assertion 구간: fesa, EigenReferenceCase, EigenReferenceRowDecision, EigenReferenceComparisonReport, EigenReferenceComparison tests/reference/eigen_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c66c08bae4956e9e12aa43fd98fcb70678b043ac7046cd085f1662494f61f0e0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/eigen_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a f71ba9da827ff4740ce536149fef0f03dcd226f6c61f72a721973cae2b159e2a 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison_test.cpp EigenReferenceComparison.DirectSchemaFixtureAcceptsRepeatedReorderedModes EigenReferenceComparison.DirectSchemaFixtureAcceptsRepeatedReorderedModes; assertion 14개 tests/reference/eigen_reference_comparison_test.cpp EigenReferenceComparison.DirectSchemaFixtureAcceptsRepeatedReorderedModes 유지 원문 검사 body 및 assertion 동일. c756a589e4eb9b1be73380851a5bf8e12dae19900777b023aa6929938a0f7db5 c756a589e4eb9b1be73380851a5bf8e12dae19900777b023aa6929938a0f7db5 "ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(ok.HasValue()) | EXPECT_EQ(ok.Value().policy_id, ""mitc4-eigen-first-implementation"") | EXPECT_DOUBLE_EQ(ok.Value().relative_rms_tolerance, 0.05) | EXPECT_EQ(ok.Value().families.size(), 2U) | ASSERT_GE(H5Dwrite(ds, t, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_EQ(comparison.Value().passed, sample.second) | EXPECT_EQ(comparison.Value().families[0].rms_passed, sample.second) | EXPECT_TRUE(comparison.Value().families[1].passed) | ASSERT_FALSE(comparison.HasValue()) | ASSERT_EQ(comparison.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(comparison.GetStatus().Diagnostics()[0U].code, invalid_text.expected_code) | EXPECT_FALSE( fesa::test::EigenReferenceComparison::Compare(reference_case).HasValue())" "ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(ok.HasValue()) | EXPECT_EQ(ok.Value().policy_id, ""mitc4-eigen-first-implementation"") | EXPECT_DOUBLE_EQ(ok.Value().relative_rms_tolerance, 0.05) | EXPECT_EQ(ok.Value().families.size(), 2U) | ASSERT_GE(H5Dwrite(ds, t, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_EQ(comparison.Value().passed, sample.second) | EXPECT_EQ(comparison.Value().families[0].rms_passed, sample.second) | EXPECT_TRUE(comparison.Value().families[1].passed) | ASSERT_FALSE(comparison.HasValue()) | ASSERT_EQ(comparison.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(comparison.GetStatus().Diagnostics()[0U].code, invalid_text.expected_code) | EXPECT_FALSE( fesa::test::EigenReferenceComparison::Compare(reference_case).HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison_test.cpp support@1-54 helper/oracle/fixture/include/static assertion 구간: UniqueFixtureDirectory, Mode, Str, U tests/reference/eigen_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c8f66a74f9a84a0ee73ed94a47674bcef6637bcbda68daa9b9cac52cd0715989 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/eigen_reference_comparison_test.cpp support@193-193 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/eigen_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/reference/mitc4_reference_cases_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745 60c30a9f9b735df4571ef7bc262710fc3c1e84fb98b86b2d25611ff1406cb745 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata; assertion 0개 tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata 유지 원문 검사 body 및 assertion 동일. 0a439f95ff0f8ff6baf1784c2b8286af7c5e9abe4027f6ab711e7cfd274dd297 0a439f95ff0f8ff6baf1784c2b8286af7c5e9abe4027f6ab711e7cfd274dd297 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow; assertion 0개 tests/reference/mitc4_reference_cases_test.cpp Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow 유지 원문 검사 body 및 assertion 동일. 4305a332a97418a4548f580e4efd059145ba1f826292cc21d959bbeb55443add 4305a332a97418a4548f580e4efd059145ba1f826292cc21d959bbeb55443add 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_cases_test.cpp support@1-177 helper/oracle/fixture/include/static assertion 구간: ReadBytes, if, ArtifactSnapshot, Snapshot, ExpectUnchanged, CaseEvidence, RunCase, for, ExpectCommonMetadata, ExpectComparisonCoverage, count_if, EXPECT_TRUE, find_if tests/reference/mitc4_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 00c52267b127eef3d2cd68d7bf6171119e37f97b63bd848ff0448f70687590f3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_cases_test.cpp support@186-187 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 60b4486538263f1db4cc916d19cd7fe382e843507683db5da9f99168f7336722 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_cases_test.cpp support@197-198 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/mitc4_reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1e23f52e7a9ff7172bf67f5f9c3e460a05b86089b4df1f91566e502b3f7a3c69 1e23f52e7a9ff7172bf67f5f9c3e460a05b86089b4df1f91566e502b3f7a3c69 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison.cpp support@1-984 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonFailure, Fail, FailureStatus, Trim, find_if_not, SplitCsvLine, while, if, ParsePositiveLabel, ParseFiniteDouble, UppercaseAscii, transform, IdentityKey, WideRow, ReadReferenceCsv, Hdf5Handle, Hdf5ErrorSilencer, Hdf5VlenReclaimer, Reclaim, RequireId, RequireHdf, MakeUtf8StringType, OpenDataset, Dimensions, ReadStringAttribute, ReadUint64Attribute, RequireStringAttribute, RequireExactCompoundMembers, NodeReadRow, ReadNodes, ElementIdentityReadRow, RequireElementIdentity, for, ReadDisplacement, Hdf5Projection, ReadHdf5, RequireArtifacts, FiniteText, BranchName, switch, JsonEscape, WriteJsonStrings, Result, Compare, catch, WriteDeterministicJson tests/reference/mitc4_reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ba7f7e025e2dad0fa22b02dc44d600c2edb732f2bec5f89856fb2dab648b0958 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/mitc4_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 51c8b78b44583986eeb175a839fd72a11ca5f3405bf016432da9563878c8f1f6 51c8b78b44583986eeb175a839fd72a11ca5f3405bf016432da9563878c8f1f6 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison.h support@1-93 helper/oracle/fixture/include/static assertion 구간: fesa, Mitc4ReferenceCase, Mitc4RowDecision, Mitc4ComponentMetrics, Mitc4VectorMetrics, Mitc4Warning, Mitc4ComparisonReport, Mitc4ReferenceComparison tests/reference/mitc4_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 66926b7d72ccfcf4d1a0a42bfa456a43a8b71eac6b7dea8b91f381aff620cb5f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/reference/mitc4_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b886b3cf9a6d3569e73f6792ce8ff0a84052c81eb21d78a31245fc74033bf370 b886b3cf9a6d3569e73f6792ce8ff0a84052c81eb21d78a31245fc74033bf370 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity; assertion 11개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity 유지 원문 검사 body 및 assertion 동일. 44461d859079ddd35dd95bcca00277017ed16033e7164b9e62d27f9d98e54836 44461d859079ddd35dd95bcca00277017ed16033e7164b9e62d27f9d98e54836 "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), 12U) | EXPECT_EQ(report.rows[0U].source_node_label, 1) | EXPECT_EQ(report.rows[0U].component, ""U1"") | EXPECT_EQ(report.rows[5U].component, ""UR3"") | EXPECT_EQ(report.rows[6U].source_node_label, 2) | ASSERT_EQ(report.metrics.size(), 2U) | EXPECT_EQ(report.metrics[0U].row_count, 6U) | EXPECT_EQ(report.metrics[1U].row_count, 6U) | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.case_id == ""shell-contract"" && row.instance_name == kInstanceName && row.within_tolerance; }))" "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.rows.size(), 12U) | EXPECT_EQ(report.rows[0U].source_node_label, 1) | EXPECT_EQ(report.rows[0U].component, ""U1"") | EXPECT_EQ(report.rows[5U].component, ""UR3"") | EXPECT_EQ(report.rows[6U].source_node_label, 2) | ASSERT_EQ(report.metrics.size(), 2U) | EXPECT_EQ(report.metrics[0U].row_count, 6U) | EXPECT_EQ(report.metrics[1U].row_count, 6U) | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.case_id == ""shell-contract"" && row.instance_name == kInstanceName && row.within_tolerance; }))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison; assertion 1개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison 유지 원문 검사 body 및 assertion 동일. d4d1ef19df229bad1f14847b9c437910e324f55f638cb91dbec9ec9815681c09 d4d1ef19df229bad1f14847b9c437910e324f55f638cb91dbec9ec9815681c09 ASSERT_TRUE(std::filesystem::remove(fixture.Input())) ASSERT_TRUE(std::filesystem::remove(fixture.Input())) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches; assertion 19개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches 유지 원문 검사 body 및 assertion 동일. 3dbbc317c15107ab849cb8e39ca1a7f85c3a111c899a6074f98efcda9b6b5311 3dbbc317c15107ab849cb8e39ca1a7f85c3a111c899a6074f98efcda9b6b5311 "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | ASSERT_NE(u1_zero, nullptr) | ASSERT_NE(u1_scaled, nullptr) | ASSERT_NE(u2_near, nullptr) | ASSERT_NE(u2_over, nullptr) | EXPECT_DOUBLE_EQ(u1_zero->tolerance, 8.0e-2) | EXPECT_TRUE(u1_zero->within_tolerance) | EXPECT_FALSE(u1_zero->relative_error_applicable) | EXPECT_FALSE(u1_scaled->within_tolerance) | EXPECT_NEAR(u1_scaled->normalized_error, 0.05005, 1.0e-12) | EXPECT_DOUBLE_EQ(u2_near->tolerance, 8.0e-2) | EXPECT_TRUE(u2_near->within_tolerance) | EXPECT_FALSE(u2_near->relative_error_applicable) | EXPECT_FALSE(u2_over->within_tolerance) | EXPECT_DOUBLE_EQ(u2_over->tolerance, 8.0e-2) | ASSERT_NE(translation, nullptr) | EXPECT_DOUBLE_EQ(translation->reference_scale, 8.0) | EXPECT_EQ(translation->components, (std::vector{""U1"", ""U2"", ""U3""}))" "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | ASSERT_NE(u1_zero, nullptr) | ASSERT_NE(u1_scaled, nullptr) | ASSERT_NE(u2_near, nullptr) | ASSERT_NE(u2_over, nullptr) | EXPECT_DOUBLE_EQ(u1_zero->tolerance, 8.0e-2) | EXPECT_TRUE(u1_zero->within_tolerance) | EXPECT_FALSE(u1_zero->relative_error_applicable) | EXPECT_FALSE(u1_scaled->within_tolerance) | EXPECT_NEAR(u1_scaled->normalized_error, 0.05005, 1.0e-12) | EXPECT_DOUBLE_EQ(u2_near->tolerance, 8.0e-2) | EXPECT_TRUE(u2_near->within_tolerance) | EXPECT_FALSE(u2_near->relative_error_applicable) | EXPECT_FALSE(u2_over->within_tolerance) | EXPECT_DOUBLE_EQ(u2_over->tolerance, 8.0e-2) | ASSERT_NE(translation, nullptr) | EXPECT_DOUBLE_EQ(translation->reference_scale, 8.0) | EXPECT_EQ(translation->components, (std::vector{""U1"", ""U2"", ""U3""}))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict; assertion 11개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict 유지 원문 검사 body 및 assertion 동일. 0a685f2a0ea27dcdc95dc89c981067220e0418afd2c3cc242569d38d86212613 0a685f2a0ea27dcdc95dc89c981067220e0418afd2c3cc242569d38d86212613 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | ASSERT_NE(row, nullptr) | EXPECT_FALSE(row->blocking) | EXPECT_FALSE(row->within_tolerance) | EXPECT_EQ(report.warnings[0U].row, static_cast(row - report.rows.data())) | EXPECT_NE(report.warnings[0U].message.find(""shell-contract""), std::string::npos) | EXPECT_NE(report.warnings[0U].message.find(""UR1""), std::string::npos)" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | ASSERT_NE(row, nullptr) | EXPECT_FALSE(row->blocking) | EXPECT_FALSE(row->within_tolerance) | EXPECT_EQ(report.warnings[0U].row, static_cast(row - report.rows.data())) | EXPECT_NE(report.warnings[0U].message.find(""shell-contract""), std::string::npos) | EXPECT_NE(report.warnings[0U].message.find(""UR1""), std::string::npos)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses; assertion 5개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses 유지 원문 검사 body 및 assertion 동일. b300a3ed2c250fb7fe702e7abdc96b7f2d90a9231c2f09107719e9be524a4521 b300a3ed2c250fb7fe702e7abdc96b7f2d90a9231c2f09107719e9be524a4521 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 1U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-rms-exceedance"") | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.within_tolerance; }))" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 1U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-rms-exceedance"") | EXPECT_TRUE(std::all_of(report.rows.begin(), report.rows.end(), [](const fesa::test::Mitc4RowDecision& row) { return row.within_tolerance; }))" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings; assertion 7개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings 유지 원문 검사 body 및 assertion 동일. deca37dbcad9f79f872439a23d198ead553f7e589eddb78d69f9c74acd722c39 deca37dbcad9f79f872439a23d198ead553f7e589eddb78d69f9c74acd722c39 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | EXPECT_LT(report.warnings[0U].row, report.rows.size()) | EXPECT_LT(report.warnings[1U].row, report.rows.size())" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(report.passed) | ASSERT_EQ(report.warnings.size(), 2U) | EXPECT_EQ(report.warnings[0U].code, ""rotation-reference-exceedance"") | EXPECT_EQ(report.warnings[1U].code, ""rotation-reference-rms-exceedance"") | EXPECT_LT(report.warnings[0U].row, report.rows.size()) | EXPECT_LT(report.warnings[1U].row, report.rows.size())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically; assertion 18개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically 유지 원문 검사 body 및 assertion 동일. cff2c517222a6a1e2b7e9aba2c8336edfcb6740cb671e64b4a0ab0cb9c1172c6 cff2c517222a6a1e2b7e9aba2c8336edfcb6740cb671e64b4a0ab0cb9c1172c6 "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), 2U) | ASSERT_EQ(report.vector_metrics.size(), 2U) | EXPECT_NEAR(report.vector_metrics[0U].displacement_norm_error, std::sqrt(0.3125) * 1.0e-9, 1.0e-21) | EXPECT_DOUBLE_EQ(report.vector_metrics[0U].rotation_norm_error, 0.75e-9) | ASSERT_LT(report.worst_row, report.rows.size()) | EXPECT_EQ(report.rows[report.worst_row].component, ""UR1"") | EXPECT_TRUE(std::isfinite(metric.reference_scale)) | EXPECT_TRUE(std::isfinite(metric.near_zero_band)) | EXPECT_TRUE(std::isfinite(metric.maximum_absolute_error)) | EXPECT_TRUE(std::isfinite(metric.relative_rms)) | EXPECT_FALSE(metric.components.empty()) | EXPECT_LT(metric.worst_row, report.rows.size()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_a) .IsOk()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(key), std::string::npos)" "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), 2U) | ASSERT_EQ(report.vector_metrics.size(), 2U) | EXPECT_NEAR(report.vector_metrics[0U].displacement_norm_error, std::sqrt(0.3125) * 1.0e-9, 1.0e-21) | EXPECT_DOUBLE_EQ(report.vector_metrics[0U].rotation_norm_error, 0.75e-9) | ASSERT_LT(report.worst_row, report.rows.size()) | EXPECT_EQ(report.rows[report.worst_row].component, ""UR1"") | EXPECT_TRUE(std::isfinite(metric.reference_scale)) | EXPECT_TRUE(std::isfinite(metric.near_zero_band)) | EXPECT_TRUE(std::isfinite(metric.maximum_absolute_error)) | EXPECT_TRUE(std::isfinite(metric.relative_rms)) | EXPECT_FALSE(metric.components.empty()) | EXPECT_LT(metric.worst_row, report.rows.size()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_a) .IsOk()) | ASSERT_TRUE(fesa::test::Mitc4ReferenceComparison::WriteDeterministicJson( report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(key), std::string::npos)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5 Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5; assertion 3개 tests/reference/mitc4_reference_comparison_test.cpp Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5 유지 원문 검사 body 및 assertion 동일. 5e8e14898d5f4d7dc448a30743686c8627513240f85ab704fe3dc6e23c603a55 5e8e14898d5f4d7dc448a30743686c8627513240f85ab704fe3dc6e23c603a55 "EXPECT_EQ(names, (std::vector{""case.inp"", ""displacements.csv"", ""results.h5""})) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed)" "EXPECT_EQ(names, (std::vector{""case.inp"", ""displacements.csv"", ""results.h5""})) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp support@1-476 helper/oracle/fixture/include/static assertion 구간: Hdf5Handle, if, RequireId, RequireHdf, MakeUtf8StringType, WriteStringAttribute, WriteUint64Attribute, CreateGroup, ComparisonValueRow, DefaultRows, Hdf5Options, NodeWriteRow, ElementWriteRow, WriteNodes, for, WriteElements, WriteDisplacement, WriteCsv, ContractFixture, ReferenceCase, ExpectFailureCode, FindRow, find_if, FindMetric, ReadBytes tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 37402c89c01cf3d2cc2e8ab77859308b01ab38311dacae197ad4bc1c5b5ab9f9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp support@509-510 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0395266b04005731c3a8af3c854de2e8675b475916ea8b790258cd372ba59d80 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp support@591-592 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bbe05c4478ba04dae1068ff83f56d7e512486c768824cd8b6645449c28f0076c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp support@638-639 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ee84c2fb6946961d9421c461d0c0de38916103a6aa11929f0b95ecb0bae198a2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp support@706-707 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 54b3ad86c7b60c18d9bd032f8ba2e7e827c96c6da35e0194fb82dc04afcbae8e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp support@755-756 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b1f4e55b34b476926e1cf7fe2ada3941a66cdc5cd6e79bd7e94ad257167f6dcc 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/mitc4_reference_comparison_test.cpp support@772-773 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/mitc4_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/reference/nonlinear_static_reference_cases_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269 d50d0cc07497cb23b71c50e59b5eba6896d601f76c57a416cb5d8fe2f950b269 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsEveryDeclaredArtifactBeforeExecution NonlinearStaticReference.AuditsEveryDeclaredArtifactBeforeExecution; assertion 8개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsEveryDeclaredArtifactBeforeExecution 유지 원문 검사 body 및 assertion 동일. 188bdb8763fbe96d17021a85b71a95d57a69789bc2d7a07ca0d86dbceb1d6c70 188bdb8763fbe96d17021a85b71a95d57a69789bc2d7a07ca0d86dbceb1d6c70 "ASSERT_TRUE(nonlinear_artifacts.HasValue()) | ASSERT_EQ(nonlinear_artifacts.Value().size(), 4U) | EXPECT_EQ(nonlinear_artifacts.Value()[0U].sha256, ""4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2"") | EXPECT_EQ(nonlinear_artifacts.Value()[3U].sha256, ""5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F"") | ASSERT_TRUE(linear_artifacts.HasValue()) | ASSERT_EQ(linear_artifacts.Value().size(), 4U) | EXPECT_EQ(linear_artifacts.Value()[0U].sha256, ""4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"") | EXPECT_EQ(linear_artifacts.Value()[3U].sha256, ""2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7"")" "ASSERT_TRUE(nonlinear_artifacts.HasValue()) | ASSERT_EQ(nonlinear_artifacts.Value().size(), 4U) | EXPECT_EQ(nonlinear_artifacts.Value()[0U].sha256, ""4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2"") | EXPECT_EQ(nonlinear_artifacts.Value()[3U].sha256, ""5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F"") | ASSERT_TRUE(linear_artifacts.HasValue()) | ASSERT_EQ(linear_artifacts.Value().size(), 4U) | EXPECT_EQ(linear_artifacts.Value()[0U].sha256, ""4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"") | EXPECT_EQ(linear_artifacts.Value()[3U].sha256, ""2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory; assertion 16개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory 유지 원문 검사 body 및 assertion 동일. 2eede76606712cf98bc621846084840a3172005b4d3d556415eeb01cef3e286a 2eede76606712cf98bc621846084840a3172005b4d3d556415eeb01cef3e286a "ASSERT_TRUE(before.HasValue()) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | EXPECT_EQ(ReadBytes(copied.Value()), ReadBytes(reference_case.original_input_path)) | ASSERT_TRUE(generated.HasValue()) | EXPECT_EQ(generated.Value().copied_input_path, copied.Value()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | EXPECT_TRUE( std::filesystem::is_regular_file(generated.Value().generated_log_path)) | EXPECT_EQ(generated.Value().generated_results_hdf5.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_results.h5"" : ""shell_results.h5"") | EXPECT_EQ( generated.Value().generated_log_path.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_log.txt"" : ""shell_log.txt"") | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().blocking_passed) | EXPECT_EQ(comparison.Value().copied_input_path, copied.Value()) | EXPECT_EQ(comparison.Value().generated_log_path, generated.Value().generated_log_path) | EXPECT_EQ(FindFamily(comparison.Value(), ""RM3""), nullptr) | ASSERT_TRUE(after.HasValue())" "ASSERT_TRUE(before.HasValue()) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | EXPECT_EQ(ReadBytes(copied.Value()), ReadBytes(reference_case.original_input_path)) | ASSERT_TRUE(generated.HasValue()) | EXPECT_EQ(generated.Value().copied_input_path, copied.Value()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | EXPECT_TRUE( std::filesystem::is_regular_file(generated.Value().generated_log_path)) | EXPECT_EQ(generated.Value().generated_results_hdf5.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_results.h5"" : ""shell_results.h5"") | EXPECT_EQ( generated.Value().generated_log_path.filename(), case_id == ""shellnl-s4-final"" ? ""shellNL_log.txt"" : ""shell_log.txt"") | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().blocking_passed) | EXPECT_EQ(comparison.Value().copied_input_path, copied.Value()) | EXPECT_EQ(comparison.Value().generated_log_path, generated.Value().generated_log_path) | EXPECT_EQ(FindFamily(comparison.Value(), ""RM3""), nullptr) | ASSERT_TRUE(after.HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsInvalidHdf5BeforeToleranceAndKeepsWarningOnlyClassification NonlinearStaticReference.RejectsInvalidHdf5BeforeToleranceAndKeepsWarningOnlyClassification; assertion 4개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsInvalidHdf5BeforeToleranceAndKeepsWarningOnlyClassification 유지 원문 검사 body 및 assertion 동일. c212189f32ba963e3f1464a12d8527079d439ef8c08cf77fa6186ab4c701cf1d c212189f32ba963e3f1464a12d8527079d439ef8c08cf77fa6186ab4c701cf1d ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_FALSE( fesa::test::CompareHdf5ToReferenceCsv(reference_case, invalid_hdf5) .HasValue()) | EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_FALSE( fesa::test::CompareHdf5ToReferenceCsv(reference_case, invalid_hdf5) .HasValue()) | EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsRetainedStaticArtifacts NonlinearStaticReference.AuditsRetainedStaticArtifacts; assertion 7개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.AuditsRetainedStaticArtifacts 유지 원문 검사 body 및 assertion 동일. d8455237b6913bfc17eb366ce869732b1034a695dbc6da8104f52942fa5fa6fb d8455237b6913bfc17eb366ce869732b1034a695dbc6da8104f52942fa5fa6fb ASSERT_TRUE(before.HasValue()) | ASSERT_EQ(before.Value().size(), 4U) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | ASSERT_TRUE(after.HasValue()) ASSERT_TRUE(before.HasValue()) | ASSERT_EQ(before.Value().size(), 4U) | ASSERT_TRUE(copied.HasValue()) | EXPECT_NE(copied.Value().parent_path(), reference_case.original_input_path.parent_path()) | ASSERT_TRUE(generated.HasValue()) | EXPECT_TRUE(std::filesystem::is_regular_file( generated.Value().generated_results_hdf5)) | ASSERT_TRUE(after.HasValue()) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict; assertion 4개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict 유지 원문 검사 body 및 assertion 동일. 65b04d41c62639181a36905c13090411b957dc30b224c524136459e7b051deb4 65b04d41c62639181a36905c13090411b957dc30b224c524136459e7b051deb4 ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().external_blocking_passed) ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | EXPECT_TRUE(comparison.Value().external_blocking_passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual; assertion 7개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual 유지 원문 검사 body 및 assertion 동일. 007fcebce090b5bf09d568e58cd17470b556ad70894f09e2dc2703f4cec41e51 007fcebce090b5bf09d568e58cd17470b556ad70894f09e2dc2703f4cec41e51 ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | ASSERT_NE(found, comparison.Value().internal_equilibrium.end()) | EXPECT_TRUE(found->passed) | EXPECT_TRUE(comparison.Value().internal_blocking_passed) | EXPECT_NE(comparison.Value().constrained_reaction_resultant.force, zero_resultant) ASSERT_TRUE(copied.HasValue()) | ASSERT_TRUE(generated.HasValue()) | ASSERT_TRUE(comparison.HasValue()) | ASSERT_NE(found, comparison.Value().internal_equilibrium.end()) | EXPECT_TRUE(found->passed) | EXPECT_TRUE(comparison.Value().internal_blocking_passed) | EXPECT_NE(comparison.Value().constrained_reaction_resultant.force, zero_resultant) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings; assertion 3개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings 유지 원문 검사 body 및 assertion 동일. f98dddaed34ee9b825986ce96db9d50e870ce4a58ceaa9e262995c448f58d601 f98dddaed34ee9b825986ce96db9d50e870ce4a58ceaa9e262995c448f58d601 "EXPECT_EQ(fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kFailed) | EXPECT_EQ(report.precheck_findings[1U].diagnostic_code, ""duplicate-row"") | EXPECT_EQ(report.precheck_findings[2U].diagnostic_code, ""nonfinite-row"")" "EXPECT_EQ(fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kFailed) | EXPECT_EQ(report.precheck_findings[1U].diagnostic_code, ""duplicate-row"") | EXPECT_EQ(report.precheck_findings[2U].diagnostic_code, ""nonfinite-row"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate; assertion 9개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate 유지 원문 검사 body 및 assertion 동일. 37b6f0097c7fdc4525f9c98325a913cc1c66be9a852f7ec7ea8d6dbe8e973336 37b6f0097c7fdc4525f9c98325a913cc1c66be9a852f7ec7ea8d6dbe8e973336 EXPECT_TRUE(below.passed) | ASSERT_TRUE(below.normalized_metric.has_value()) | EXPECT_EQ(*below.normalized_metric, 5.0e-9) | EXPECT_TRUE(boundary.passed) | ASSERT_TRUE(boundary.normalized_metric.has_value()) | EXPECT_EQ(*boundary.normalized_metric, 1.0e-8) | EXPECT_FALSE(above.passed) | ASSERT_TRUE(above.normalized_metric.has_value()) | EXPECT_GT(*above.normalized_metric, 1.0e-8) EXPECT_TRUE(below.passed) | ASSERT_TRUE(below.normalized_metric.has_value()) | EXPECT_EQ(*below.normalized_metric, 5.0e-9) | EXPECT_TRUE(boundary.passed) | ASSERT_TRUE(boundary.normalized_metric.has_value()) | EXPECT_EQ(*boundary.normalized_metric, 1.0e-8) | EXPECT_FALSE(above.passed) | ASSERT_TRUE(above.normalized_metric.has_value()) | EXPECT_GT(*above.normalized_metric, 1.0e-8) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance; assertion 6개 tests/reference/nonlinear_static_reference_cases_test.cpp NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance 유지 원문 검사 body 및 assertion 동일. 04cc9d2dc3f468c5abd9317787db0c7dea8bb935021cf0bc51375c2e8a90d1bc 04cc9d2dc3f468c5abd9317787db0c7dea8bb935021cf0bc51375c2e8a90d1bc EXPECT_TRUE(exact_zero.passed) | EXPECT_EQ(exact_zero.scale, 0.0) | EXPECT_FALSE(exact_zero.normalized_metric.has_value()) | EXPECT_FALSE(nonzero.passed) | EXPECT_EQ(nonzero.scale, 0.0) | EXPECT_FALSE(nonzero.normalized_metric.has_value()) EXPECT_TRUE(exact_zero.passed) | EXPECT_EQ(exact_zero.scale, 0.0) | EXPECT_FALSE(exact_zero.normalized_metric.has_value()) | EXPECT_FALSE(nonzero.passed) | EXPECT_EQ(nonzero.scale, 0.0) | EXPECT_FALSE(nonzero.normalized_metric.has_value()) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@1-113 helper/oracle/fixture/include/static assertion 구간: ReadBytes, if, MakeCase, ExpectSnapshotsEqual, FindFamily, find_if, ExpectFamily, ExpectBlockingFamiliesPassed, for, ExpectInternalFamiliesPassed tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 287a99d8f479a4d4ed54bfe04a80c303dd3ef8d3b6dd67665ce65ec0404d6d3b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@134-135 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 90e14ecb07fccdcf231e83a52c8f744d9319ba16ae7f04c27256c406a6429dac 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@202-203 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 87ef91571b7fcd7d7161bb8b385c8e0bfdc90da3dc29f8a77c0e4592e5be6f83 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@246-247 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 75ed650921b2a719d01db3b9a8699b87ebb403589335c0dab3766f91a93dd189 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@273-274 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3989248f6a5e57cdd68d8ef2bf85830b385196f16f2e293b504208192705563c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@295-296 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f580803fc945d7c5cc37b9dcda1e262d1c4026b9a5b6544073525786b07f48be 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@338-339 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a7955cbfd2f91685d3d922391e61a1c415c6daed4cf7b2eddc4407e3fe715bc0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@366-367 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3e9b6724351d2c4044c018875a3878cef2b85ee06c40f3ad50c76fe5acc6c8fb 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_cases_test.cpp support@393-394 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/nonlinear_static_reference_cases_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d365ebad227c3cdf28bfb737c8976d06bc3484e90b5556e13a91605a5367aabe 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/nonlinear_static_reference_comparison.cpp file 유지 SpatialMoment helper는 production inverse API 제거에 따라 독립 closed-form oracle로 이관한다. 비교 family·global balance·RF/RM review-only·finite 사전 gate는 유지한다. 64d9fa7d7067830bedd7316e66d68c32839c7e701fa8f6a49421cbbcce3938a2 64d9fa7d7067830bedd7316e66d68c32839c7e701fa8f6a49421cbbcce3938a2 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_comparison.cpp support@1-1721 helper/oracle/fixture/include/static assertion 구간: fesa, CaseContract, ContractFor, if, ComparisonFailure, Fail, FailureStatus, Normalized, IsDescendantOf, GenericPath, Trim, find_if_not, UppercaseAscii, transform, ReadBytes, RotateRight, Sha256, for, while, Fnv1a64, DeclaredArtifact, DeclaredArtifacts, Snapshot, SplitCsv, ParsePositiveLabel, ParseFiniteDouble, CsvWideRow, ReadCsvWideRows, Hdf5Handle, Hdf5ErrorSilencer, Hdf5VlenReclaimer, Reclaim, RequireId, RequireHdf, OpenDataset, Dimensions, MakeUtf8StringType, ReadStringAttribute, ReadUint64Attribute, RequireStringAttribute, NodeReadRow, Hdf5Node, ReadNodes, AcceptedFrameReadRow, ReadFactorOneFrame, ReadNodalDataset, ReadConstraintMask, Hdf5Projection, CopiedInputPathFor, ReadGlobalBalance, ReadNonlinearHdf5, RequireExactNodeLabels, RequirePressureInstance, Key, IsSelected, ProjectCsv, ProjectHdf5, EvaluateFamily, AppendFamily, ExpectedConstrainedLabels, RequiredConstrainedLabels, VectorAt, SpatialMoment, MaskedResidual, InfinityNorm, FreeRowCount, AppendInternal, AppendFreeResidual, AppendGlobalBalance, AppendInternalEquilibrium, DerivedLogPath, DerivedResultsPath, MakeReport, CompareLinearCase, CompareNonlinearCase, ComparePressureCase, NonlinearInternalEquilibriumReport, EvaluateGlobalBalance, ArtifactCheck, catch, CopyInputToExecutionDirectory, RunFesaApplicationOnCopiedInput, CompareHdf5ToReferenceCsv, ClassifyReferenceComparison, any_of, BuildReferenceComparisonReport tests/reference/nonlinear_static_reference_comparison.cpp file-support 유지 SpatialMoment helper는 production inverse API 제거에 따라 독립 closed-form oracle로 이관한다. 비교 family·global balance·RF/RM review-only·finite 사전 gate는 유지한다. 97dfe70f99b977337fc72e71aec2c6097d686525bd022b595ba95f7343275488 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/nonlinear_static_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be 6f3832cec9b2ab5770948480045b2e454a5d0bc8fd2b6c38f0e134fbaf2983be 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/nonlinear_static_reference_comparison.h support@1-143 helper/oracle/fixture/include/static assertion 구간: fesa, NonlinearReferenceArtifactDisposition, NonlinearReferenceCase, ArtifactSnapshot, NonlinearReferenceDisposition, NonlinearReferenceRowKey, NonlinearReferenceFamilyReport, NonlinearReferencePrecheckFinding, NonlinearInternalEquilibriumReport, ConstrainedReactionResultantReport, GeneratedRunArtifacts, NonlinearReferenceComparisonReport, NonlinearReferenceClassification tests/reference/nonlinear_static_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e61520b0bf03ec971e428abd42887d86bd74ee157eb174f0da25be3ca00d20ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602 9680d6dd2deef156b5c8d000167cd6d3f6e29fe1b1fecc5a0f9cd6ebc0fa1602 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison.cpp support@1-1519 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonFailure, Fail, ComparisonFailureStatus, Trim, find_if_not, CollapseWhitespace, for, if, AsciiLower, transform, SplitCsvLine, while, ParsePositiveLabel, ParseFiniteDouble, WideReferenceRow, ReferenceTable, SectionReferenceRow, SectionReferenceTable, ReadReferenceCsv, find_if, ReadSectionReferenceCsv, RequireExactArtifactInventory, increment, ReadApprovedDomain, Hdf5Handle, Hdf5ErrorSilencer, Hdf5VlenReclaimer, RequireId, RequireHdf, OpenDataset, DatasetDimensions, ReadStringAttribute, ReadUint64Attribute, RequireStringAttribute, RequireResultAttributes, ReadDoubleDataset, RequireCompoundMembers, MakeVariableStringType, NodeMemoryRow, ElementMemoryRow, HdfNode, HdfElement, ReadNodeRows, ReadElementRows, RequireFiniteStress, StressValue, ExpectedLocalAxes, HdfProjection, ReadHdfProjection, OrderedRows, OrderedSectionRows, CanonicalRow, AppendNodalRows, AppendSectionRows, BranchName, switch, EvaluateFamily, MakePhysicsEvidence, QuantityName, WriteJsonString, WriteCanonicalRow, WriteArray, WriteStrings, FiniteReport, all_of, Result, Compare, catch, WriteDeterministicJson tests/reference/reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4f6eadb9f7705f35da852e0f4cf63f1af16a1f951faf90b6895841a4a7b12380 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0 1ca9383ffed095fdb372fe7d16ec3d9c6fbace46c7a103e94c27220fc99b56b0 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison.h support@1-102 helper/oracle/fixture/include/static assertion 구간: fesa, ComparisonQuantity, CanonicalComparisonRow, RowDecision, ComponentMetrics, PhysicsEvidence, ComparisonReport, ReferenceComparison tests/reference/reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1f39624e67c37926b656243337baed8a87b43b96547388e0d41dd6a25db0e37e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/reference/reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e39732a6cb8747725a43f7fc6341fd4688d04cd3f9f936ec33cbc79b232886af e39732a6cb8747725a43f7fc6341fd4688d04cd3f9f936ec33cbc79b232886af 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows; assertion 7개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows 유지 원문 검사 body 및 assertion 동일. 810238882b3a881527ffba11344288d641d606f3538f88d2f5e55adba4409905 810238882b3a881527ffba11344288d641d606f3538f88d2f5e55adba4409905 ASSERT_TRUE(std::filesystem::remove(fixture.Legacy() / kDisplacementName)) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_GT(lines.size(), 2U) ASSERT_TRUE(std::filesystem::remove(fixture.Legacy() / kDisplacementName)) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kNodeCount + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_GT(lines.size(), 2U) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate; assertion 28개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate 유지 원문 검사 body 및 assertion 동일. f6ca0c5aae73df95b70d24611a1948a63e24dc842bc9da29f03f7182f05ad9fd f6ca0c5aae73df95b70d24611a1948a63e24dc842bc9da29f03f7182f05ad9fd "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | EXPECT_EQ(report.rows.size(), kExpectedRowCount) | EXPECT_EQ(report.metrics.size(), kExpectedMetricCount) | ASSERT_NE(zero, nullptr) | ASSERT_NE(near_zero, nullptr) | ASSERT_NE(deliberate_failure, nullptr) | EXPECT_DOUBLE_EQ(zero->reference.value, 0.0) | EXPECT_DOUBLE_EQ(zero->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(zero->tolerance, near_zero_band) | EXPECT_TRUE(zero->passed) | EXPECT_TRUE(near_zero->passed) | EXPECT_FALSE(deliberate_failure->passed) | EXPECT_EQ(near_zero->tolerance_branch, ""near-zero"") | EXPECT_FALSE(near_zero->relative_error_applicable) | ASSERT_NE(my_metric, nullptr) | EXPECT_DOUBLE_EQ(my_metric->reference_scale, 1.0e7) | EXPECT_EQ(my_metric->components, (std::vector{""T"", ""My"", ""Mz""})) | ASSERT_NE(scaled, nullptr) | ASSERT_NE(residue, nullptr) | EXPECT_DOUBLE_EQ(scaled->tolerance, 5.0e5) | EXPECT_DOUBLE_EQ(scaled->absolute_error, 4.999e5) | EXPECT_TRUE(scaled->passed) | EXPECT_DOUBLE_EQ(residue->reference.value, -1.5625e-2) | EXPECT_DOUBLE_EQ(residue->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(residue->absolute_error, 1.5625e-2) | EXPECT_DOUBLE_EQ(residue->tolerance, 1.0e5) | EXPECT_TRUE(residue->passed)" "ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(report.passed) | EXPECT_EQ(report.rows.size(), kExpectedRowCount) | EXPECT_EQ(report.metrics.size(), kExpectedMetricCount) | ASSERT_NE(zero, nullptr) | ASSERT_NE(near_zero, nullptr) | ASSERT_NE(deliberate_failure, nullptr) | EXPECT_DOUBLE_EQ(zero->reference.value, 0.0) | EXPECT_DOUBLE_EQ(zero->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(zero->tolerance, near_zero_band) | EXPECT_TRUE(zero->passed) | EXPECT_TRUE(near_zero->passed) | EXPECT_FALSE(deliberate_failure->passed) | EXPECT_EQ(near_zero->tolerance_branch, ""near-zero"") | EXPECT_FALSE(near_zero->relative_error_applicable) | ASSERT_NE(my_metric, nullptr) | EXPECT_DOUBLE_EQ(my_metric->reference_scale, 1.0e7) | EXPECT_EQ(my_metric->components, (std::vector{""T"", ""My"", ""Mz""})) | ASSERT_NE(scaled, nullptr) | ASSERT_NE(residue, nullptr) | EXPECT_DOUBLE_EQ(scaled->tolerance, 5.0e5) | EXPECT_DOUBLE_EQ(scaled->absolute_error, 4.999e5) | EXPECT_TRUE(scaled->passed) | EXPECT_DOUBLE_EQ(residue->reference.value, -1.5625e-2) | EXPECT_DOUBLE_EQ(residue->fesa.value, 0.0) | EXPECT_DOUBLE_EQ(residue->absolute_error, 1.5625e-2) | EXPECT_DOUBLE_EQ(residue->tolerance, 1.0e5) | EXPECT_TRUE(residue->passed)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically; assertion 24개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically 유지 원문 검사 body 및 assertion 동일. 3aeb231f836acf51af5432b7c06df1e786278ff6fceeb3a53d50a9377653df3c 3aeb231f836acf51af5432b7c06df1e786278ff6fceeb3a53d50a9377653df3c "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed; })) | ASSERT_NE(metric, nullptr) | ASSERT_NE(worst, nullptr) | EXPECT_EQ(metric->row_count, kNodeCount * 3U) | EXPECT_DOUBLE_EQ(metric->reference_scale, 1.90476272e-2) | EXPECT_DOUBLE_EQ(metric->maximum_absolute_error, 1.0e-9) | EXPECT_NEAR(metric->relative_rms, std::sqrt(1.25 / static_cast(kNodeCount * 3U)) * 1.0e-9 / metric->reference_scale, 1.0e-21) | EXPECT_EQ(metric->worst_row, static_cast(worst - report.rows.data())) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_DOUBLE_EQ(report.physics_evidence.free_residual_norm, 0.0) | EXPECT_EQ(report.physics_evidence.applied_force, (std::array{0.0, 0.0, -1.0e6})) | EXPECT_EQ(report.physics_evidence.reaction_force, (std::array{0.0, 0.0, 1.0e6})) | EXPECT_EQ(report.physics_evidence.applied_moment_about_origin, (std::array{0.0, 1.0e7, 0.0})) | EXPECT_EQ(report.physics_evidence.reaction_moment_about_origin, (std::array{0.0, -1.0e7, 0.0})) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_a) .IsOk()) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(required), std::string::npos)" "ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_EQ(report.metrics.size(), kExpectedMetricCount) | EXPECT_TRUE(std::all_of( report.rows.begin(), report.rows.end(), [](const fesa::test::RowDecision& row) { return row.passed; })) | ASSERT_NE(metric, nullptr) | ASSERT_NE(worst, nullptr) | EXPECT_EQ(metric->row_count, kNodeCount * 3U) | EXPECT_DOUBLE_EQ(metric->reference_scale, 1.90476272e-2) | EXPECT_DOUBLE_EQ(metric->maximum_absolute_error, 1.0e-9) | EXPECT_NEAR(metric->relative_rms, std::sqrt(1.25 / static_cast(kNodeCount * 3U)) * 1.0e-9 / metric->reference_scale, 1.0e-21) | EXPECT_EQ(metric->worst_row, static_cast(worst - report.rows.data())) | EXPECT_FALSE(report.stress_comparison_applicable) | EXPECT_NE(report.stress_comparison_reason.find(""N/A""), std::string::npos) | EXPECT_NE(report.stress_comparison_reason.find(""HDF5""), std::string::npos) | EXPECT_DOUBLE_EQ(report.physics_evidence.free_residual_norm, 0.0) | EXPECT_EQ(report.physics_evidence.applied_force, (std::array{0.0, 0.0, -1.0e6})) | EXPECT_EQ(report.physics_evidence.reaction_force, (std::array{0.0, 0.0, 1.0e6})) | EXPECT_EQ(report.physics_evidence.applied_moment_about_origin, (std::array{0.0, 1.0e7, 0.0})) | EXPECT_EQ(report.physics_evidence.reaction_moment_about_origin, (std::array{0.0, -1.0e7, 0.0})) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_a) .IsOk()) | ASSERT_TRUE( fesa::test::ReferenceComparison::WriteDeterministicJson(report, json_b) .IsOk()) | EXPECT_EQ(first, ReadBytes(json_b)) | EXPECT_NE(first.find(required), std::string::npos)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization; assertion 10개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization 유지 원문 검사 body 및 assertion 동일. 35b078826866908199d78ce70bc394087ad8ad257cc7db971e29412a67ab19d2 35b078826866908199d78ce70bc394087ad8ad257cc7db971e29412a67ab19d2 ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_NE(interior, nullptr) | EXPECT_DOUBLE_EQ(interior->fesa.value, 9.0e6 - 5.0) | EXPECT_DOUBLE_EQ(interior->reference.value, 9.0e6) | EXPECT_DOUBLE_EQ(interior->absolute_error, 5.0) | ASSERT_NE(adjacent, nullptr) | EXPECT_DOUBLE_EQ(adjacent->fesa.value, 9.0e6) | EXPECT_DOUBLE_EQ(adjacent->reference.value, 9.0e6) ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | EXPECT_TRUE(report.physics_evidence.endpoint_consistency_passed) | ASSERT_NE(interior, nullptr) | EXPECT_DOUBLE_EQ(interior->fesa.value, 9.0e6 - 5.0) | EXPECT_DOUBLE_EQ(interior->reference.value, 9.0e6) | EXPECT_DOUBLE_EQ(interior->absolute_error, 5.0) | ASSERT_NE(adjacent, nullptr) | EXPECT_DOUBLE_EQ(adjacent->fesa.value, 9.0e6) | EXPECT_DOUBLE_EQ(adjacent->reference.value, 9.0e6) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant; assertion 15개 tests/reference/reference_comparison_test.cpp ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant 유지 원문 검사 body 및 assertion 동일. cb0ba7caae79f4c0d6d33c2fe7d29658710974c27d49edc9d208987cd21dcb73 cb0ba7caae79f4c0d6d33c2fe7d29658710974c27d49edc9d208987cd21dcb73 ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_NE(n, nullptr) | ASSERT_NE(t, nullptr) | ASSERT_NE(my, nullptr) | ASSERT_NE(mz, nullptr) | EXPECT_DOUBLE_EQ(n->reference.value, 11.0) | EXPECT_DOUBLE_EQ(t->reference.value, 22.0) | EXPECT_DOUBLE_EQ(my->reference.value, 33.0) | EXPECT_DOUBLE_EQ(mz->reference.value, 44.0) | EXPECT_DOUBLE_EQ(n->fesa.value, 11.0) | EXPECT_DOUBLE_EQ(t->fesa.value, 22.0) | EXPECT_DOUBLE_EQ(my->fesa.value, 33.0) | EXPECT_DOUBLE_EQ(mz->fesa.value, 44.0) ASSERT_EQ(lines.size(), kElementCount * 2U + 1U) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(report.passed) | ASSERT_NE(n, nullptr) | ASSERT_NE(t, nullptr) | ASSERT_NE(my, nullptr) | ASSERT_NE(mz, nullptr) | EXPECT_DOUBLE_EQ(n->reference.value, 11.0) | EXPECT_DOUBLE_EQ(t->reference.value, 22.0) | EXPECT_DOUBLE_EQ(my->reference.value, 33.0) | EXPECT_DOUBLE_EQ(mz->reference.value, 44.0) | EXPECT_DOUBLE_EQ(n->fesa.value, 11.0) | EXPECT_DOUBLE_EQ(t->fesa.value, 22.0) | EXPECT_DOUBLE_EQ(my->fesa.value, 33.0) | EXPECT_DOUBLE_EQ(mz->fesa.value, 44.0) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_comparison_test.cpp support@1-424 helper/oracle/fixture/include/static assertion 구간: ComparisonValues, SourceRoot, BinaryRoot, ReadBytes, if, WriteBytes, ReadLines, WriteLines, for, ReplaceFirst, ReferenceValues, MakeDefinition, WriteResultsFixture, ContractFixture, ExpectFailureCode, FindRow, find_if, FindMetric, FindSectionRow, ExpectExactRowInventory tests/reference/reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 26a9f2cdd31fc7384d94d10efdfe1ab22d82b8c620ee16874094069b4671958b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_tolerance_policy.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f b2e6065df0d673be20fb10fbf0ef58705fc04c1788b5e52d1faaf7ebda33274f 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy.cpp support@1-138 helper/oracle/fixture/include/static assertion 구간: fesa, IsFiniteFamily, if, all_of, EvaluateFamilies, for, ReferenceToleranceEvaluation, Evaluate, EvaluateMitc4EigenFirstImplementation tests/reference/reference_tolerance_policy.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 27b71db22073ee923ba13a8c32bff7ea14ab488d80c2ceefb7767747b68d52f0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/reference_tolerance_policy.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24 9918e9b43e9b777dae620fc552badccc5570bb246a6499756df83b1c207f9e24 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy.h support@1-80 helper/oracle/fixture/include/static assertion 구간: fesa, ReferenceToleranceBranch, ReferenceToleranceRow, ReferenceToleranceFamily, ReferenceToleranceRowDecision, ReferenceToleranceFamilyDecision, ReferenceToleranceEvaluation, ReferenceTolerancePolicy tests/reference/reference_tolerance_policy.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. de2c46296fb2b5947a46c739ae21ad66802622b97ee4845543d3cd2a50ba03ac 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/reference/reference_tolerance_policy_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f be4a8896f4847dec26c07578c91d97f23f132c8a97c2507e5614011f70aa600f 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries; assertion 19개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries 유지 원문 검사 body 및 assertion 동일. 0796acda78954b1bf9b52659b043f23a0435245c7198961ebd96d84b241c9265 0796acda78954b1bf9b52659b043f23a0435245c7198961ebd96d84b241c9265 ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 1U) | EXPECT_EQ(family.row_count, 4U) | EXPECT_DOUBLE_EQ(family.reference_scale, 100.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 1.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_FALSE(family.passed) | ASSERT_EQ(family.rows.size(), 4U) | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kRelative) | EXPECT_TRUE(family.rows[0U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[0U].relative_error, 0.05) | EXPECT_DOUBLE_EQ(family.rows[0U].threshold, 5.0) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_EQ(family.rows[2U].branch, ReferenceToleranceBranch::kNearZero) | EXPECT_FALSE(family.rows[2U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[2U].threshold, 1.0) | EXPECT_TRUE(family.rows[2U].passed) | EXPECT_FALSE(family.rows[3U].passed) ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 1U) | EXPECT_EQ(family.row_count, 4U) | EXPECT_DOUBLE_EQ(family.reference_scale, 100.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 1.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_FALSE(family.passed) | ASSERT_EQ(family.rows.size(), 4U) | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kRelative) | EXPECT_TRUE(family.rows[0U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[0U].relative_error, 0.05) | EXPECT_DOUBLE_EQ(family.rows[0U].threshold, 5.0) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_EQ(family.rows[2U].branch, ReferenceToleranceBranch::kNearZero) | EXPECT_FALSE(family.rows[2U].relative_error_applicable) | EXPECT_DOUBLE_EQ(family.rows[2U].threshold, 1.0) | EXPECT_TRUE(family.rows[2U].passed) | EXPECT_FALSE(family.rows[3U].passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent; assertion 7개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent 유지 원문 검사 body 및 assertion 동일. c92918fb5b5c06da814ac1213a2b80b8af1ffd52bd0f11339468ab1ff87eed5f c92918fb5b5c06da814ac1213a2b80b8af1ffd52bd0f11339468ab1ff87eed5f ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 4U) | EXPECT_TRUE(std::all_of(family.rows.begin(), family.rows.end(), [](const auto& row) { return row.passed; })) | EXPECT_NEAR(family.relative_rms, 0.011, 1.0e-15) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed) | EXPECT_FALSE(evaluation.passed) ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 4U) | EXPECT_TRUE(std::all_of(family.rows.begin(), family.rows.end(), [](const auto& row) { return row.passed; })) | EXPECT_NEAR(family.relative_rms, 0.011, 1.0e-15) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed) | EXPECT_FALSE(evaluation.passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics; assertion 14개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics 유지 원문 검사 body 및 assertion 동일. 38ca8bda67fdaa127b1694bc937e3ca56f701ea313ab767da299fc747b33c7de 38ca8bda67fdaa127b1694bc937e3ca56f701ea313ab767da299fc747b33c7de "ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 2U) | EXPECT_DOUBLE_EQ(family.reference_scale, 0.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 0.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_EQ(family.diagnostic_code, ""zero-reference-scale-nonzero-error"") | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kZeroScaleExact) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_FALSE(family.rows[1U].relative_error_applicable) | EXPECT_TRUE(std::isfinite(family.relative_rms)) | EXPECT_DOUBLE_EQ(family.relative_rms, 0.0) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed)" "ASSERT_TRUE(evaluation.valid) | EXPECT_EQ(family.row_count, 2U) | EXPECT_DOUBLE_EQ(family.reference_scale, 0.0) | EXPECT_DOUBLE_EQ(family.near_zero_band, 0.0) | EXPECT_EQ(family.near_zero_count, 2U) | EXPECT_EQ(family.diagnostic_code, ""zero-reference-scale-nonzero-error"") | EXPECT_EQ(family.rows[0U].branch, ReferenceToleranceBranch::kZeroScaleExact) | EXPECT_TRUE(family.rows[0U].passed) | EXPECT_FALSE(family.rows[1U].passed) | EXPECT_FALSE(family.rows[1U].relative_error_applicable) | EXPECT_TRUE(std::isfinite(family.relative_rms)) | EXPECT_DOUBLE_EQ(family.relative_rms, 0.0) | EXPECT_FALSE(family.rms_passed) | EXPECT_FALSE(family.passed)" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict; assertion 5개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict 유지 원문 검사 body 및 assertion 동일. ea07bf7d6def7cbd89bc911f979f710846ad558b1711613f3abcc97e14be0b8a ea07bf7d6def7cbd89bc911f979f710846ad558b1711613f3abcc97e14be0b8a ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 2U) | EXPECT_TRUE(evaluation.families[0U].passed) | EXPECT_FALSE(evaluation.families[1U].passed) | EXPECT_TRUE(evaluation.passed) ASSERT_TRUE(evaluation.valid) | ASSERT_EQ(evaluation.families.size(), 2U) | EXPECT_TRUE(evaluation.families[0U].passed) | EXPECT_FALSE(evaluation.families[1U].passed) | EXPECT_TRUE(evaluation.passed) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation; assertion 3개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation 유지 원문 검사 body 및 assertion 동일. 42628fe515d6debce07e8553911bb1a6b74e316265a0702267056258db827b45 42628fe515d6debce07e8553911bb1a6b74e316265a0702267056258db827b45 "EXPECT_FALSE(evaluation.valid) | EXPECT_EQ(evaluation.diagnostic_code, ""nonfinite-comparison-value"") | EXPECT_TRUE(evaluation.families.empty())" "EXPECT_FALSE(evaluation.valid) | EXPECT_EQ(evaluation.diagnostic_code, ""nonfinite-comparison-value"") | EXPECT_TRUE(evaluation.families.empty())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationDoesNotRelaxCommonPolicy ReferenceTolerancePolicy.EigenFirstImplementationDoesNotRelaxCommonPolicy; assertion 6개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationDoesNotRelaxCommonPolicy 유지 원문 검사 body 및 assertion 동일. d4090ddd26b57509606e7f1dfdbfd22996f95d19c5d761d6368b6c07a467aca2 d4090ddd26b57509606e7f1dfdbfd22996f95d19c5d761d6368b6c07a467aca2 ASSERT_TRUE(common.valid) | ASSERT_TRUE(eigen.valid) | EXPECT_FALSE(common.passed) | EXPECT_TRUE(eigen.passed) | EXPECT_DOUBLE_EQ(eigen.families[0].relative_rms, 0.05) | EXPECT_DOUBLE_EQ(common.families[0].relative_rms, eigen.families[0].relative_rms) ASSERT_TRUE(common.valid) | ASSERT_TRUE(eigen.valid) | EXPECT_FALSE(common.passed) | EXPECT_TRUE(eigen.passed) | EXPECT_DOUBLE_EQ(eigen.families[0].relative_rms, 0.05) | EXPECT_DOUBLE_EQ(common.families[0].relative_rms, eigen.families[0].relative_rms) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationPreservesZeroAndFiniteChecks ReferenceTolerancePolicy.EigenFirstImplementationPreservesZeroAndFiniteChecks; assertion 5개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationPreservesZeroAndFiniteChecks 유지 원문 검사 body 및 assertion 동일. 463cda2ec4b8c4b83cc64d2b655af56b24f310add1ee6bc486c3f319e6ad076a 463cda2ec4b8c4b83cc64d2b655af56b24f310add1ee6bc486c3f319e6ad076a "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | ASSERT_TRUE(result.valid) | EXPECT_EQ(result.passed, row.fesa_value == 0.0) | EXPECT_EQ(result.families[0].diagnostic_code, ""zero-reference-scale-nonzero-error"")" "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | ASSERT_TRUE(result.valid) | EXPECT_EQ(result.passed, row.fesa_value == 0.0) | EXPECT_EQ(result.families[0].diagnostic_code, ""zero-reference-scale-nonzero-error"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationRejectsNonmodalFamilies ReferenceTolerancePolicy.EigenFirstImplementationRejectsNonmodalFamilies; assertion 3개 tests/reference/reference_tolerance_policy_test.cpp ReferenceTolerancePolicy.EigenFirstImplementationRejectsNonmodalFamilies 유지 원문 검사 body 및 assertion 동일. cacd7f2e9c5bdc6c907786187817305395ce12155fa51e4e10ce01d364df2741 cacd7f2e9c5bdc6c907786187817305395ce12155fa51e4e10ce01d364df2741 "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | EXPECT_EQ(result.diagnostic_code, ""invalid-eigen-tolerance-family"")" "EXPECT_FALSE(result.valid) | EXPECT_FALSE(result.passed) | EXPECT_EQ(result.diagnostic_code, ""invalid-eigen-tolerance-family"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp support@1-26 helper/oracle/fixture/include/static assertion 구간: MakeFamily tests/reference/reference_tolerance_policy_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9c2d3b770c78989b0bbe4bf618d87e318a4ddd8322aa0debfffe7cc932d3f028 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/reference_tolerance_policy_test.cpp support@172-173 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/reference_tolerance_policy_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 804f89fc0ec98c9824183e795d3edd19e930f7bc471f9012aa3d503be2f8974b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/shell_surface_pressure_reference_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/shell_surface_pressure_reference_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d 45a004e6e7ab3dba315796d54e1347b54fca3e1cad3b637a2dda6884ab846d7d 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/shell_surface_pressure_reference_test.cpp ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly; assertion 1개 tests/reference/shell_surface_pressure_reference_test.cpp ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly 유지 원문 검사 body 및 assertion 동일. ed6f0cea1655c6b579fecd966c3c2b1b62812f1e69475b98610c093cd4229455 ed6f0cea1655c6b579fecd966c3c2b1b62812f1e69475b98610c093cd4229455 EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) EXPECT_EQ( fesa::test::ClassifyReferenceComparison(report), fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/shell_surface_pressure_reference_test.cpp support@1-12 helper/oracle/fixture/include/static assertion 구간: MakeTolerance tests/reference/shell_surface_pressure_reference_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8d9d1942187a363e8bc49004c4b7df1b110071843d5cdf55dccc741ee6066ea7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/shell_surface_pressure_reference_test.cpp support@31-32 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/shell_surface_pressure_reference_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_cases_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/reference/thermal_reference_cases_test.cpp file 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 기존 diagnostic/nonblocking 판정은 유지한다. 8b340c31cb028e1cf8e676f35869cb74d923c7e3f05d5ed8d3cc428722b4aed3 8b340c31cb028e1cf8e676f35869cb74d923c7e3f05d5ed8d3cc428722b4aed3 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_cases_test.cpp ThermalReference.OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic ThermalReference.OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic; assertion 16개 tests/reference/thermal_reference_cases_test.cpp ThermalReference.OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic 유지 원문 검사 body 및 assertion 동일. 86884d662acf255866202f5682b4e95db4785ee4a0da1ae2e83fc410f36a4290 86884d662acf255866202f5682b4e95db4785ee4a0da1ae2e83fc410f36a4290 ASSERT_FALSE(before_input.empty()) | ASSERT_FALSE(before_csv.empty()) | EXPECT_EQ(Bytes(input), before_input) | EXPECT_EQ(Bytes(csv), before_csv) | ASSERT_EQ(exit, 0) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(r.rows.size(), 729U) | ASSERT_TRUE(rows.good()) | EXPECT_EQ(r.family.reference_scale, 1000) | EXPECT_EQ(r.family.near_zero_band, 10) | EXPECT_FALSE(r.family.blocking) | EXPECT_FALSE(r.passed) | EXPECT_FALSE(r.family.rms_passed) | EXPECT_EQ(failed, 87U) | EXPECT_GT(r.family.relative_rms, fesa::test::ReferenceTolerancePolicy::kRelativeRmsTolerance) | EXPECT_GT(r.family.maximum_absolute_error, r.family.near_zero_band) ASSERT_FALSE(before_input.empty()) | ASSERT_FALSE(before_csv.empty()) | EXPECT_EQ(Bytes(input), before_input) | EXPECT_EQ(Bytes(csv), before_csv) | ASSERT_EQ(exit, 0) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(r.rows.size(), 729U) | ASSERT_TRUE(rows.good()) | EXPECT_EQ(r.family.reference_scale, 1000) | EXPECT_EQ(r.family.near_zero_band, 10) | EXPECT_FALSE(r.family.blocking) | EXPECT_FALSE(r.passed) | EXPECT_FALSE(r.family.rms_passed) | EXPECT_EQ(failed, 87U) | EXPECT_GT(r.family.relative_rms, fesa::test::ReferenceTolerancePolicy::kRelativeRmsTolerance) | EXPECT_GT(r.family.maximum_absolute_error, r.family.near_zero_band) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/reference/thermal_reference_cases_test.cpp support@1-15 helper/oracle/fixture/include/static assertion 구간: Bytes tests/reference/thermal_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 기존 diagnostic/nonblocking 판정은 유지한다. d748735499aeda58e97d6652289f5ba2fb3a8b1143f03a04e6159b38f93dbf0b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_cases_test.cpp support@75-75 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/thermal_reference_cases_test.cpp file-support 유지 실행 파일만 build scratch 복사본으로 연결한다. 원본은 읽기 전용이고 기존 diagnostic/nonblocking 판정은 유지한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/thermal_reference_comparison.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0 0cb4c1b8595a16219808d6fe661571b59f7b7f2e100749d83baf2506dc0a61a0 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison.cpp support@1-417 helper/oracle/fixture/include/static assertion 구간: fesa, Failure, Require, H, Id, Shape, Attr, if, T, Scalar, Primitive, Field, Label, Trim, Result, CompareThermalSnapshots, for, catch, ReadThermalReferenceCsv, while, ReadThermalReferenceHdf5, NodeRow, Frame, CompareThermalReferenceFiles tests/reference/thermal_reference_comparison.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 56b6cc4aad9b0122c1a0d266048c889280113757493d372501e163005bab9e1f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/reference/thermal_reference_comparison.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0 c0e30c7bdd6ef3fad7e0d69159888a15e35a096adbd77c8481913063d703a9e0 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison.h support@1-57 helper/oracle/fixture/include/static assertion 구간: fesa, ThermalReferenceRow, ThermalReferenceSnapshot, ThermalReferenceRowDecision, ThermalReferenceReport tests/reference/thermal_reference_comparison.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c1ecc31681e11d2a2b9a7f64773dc821acd8b3678d77c6063044b481a7f2409d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/reference/thermal_reference_comparison_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e d98e4228c027b4cedd45cc97c75fbd56694f91ecff32c875e32da384faa9a19e 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.HdfSchemaMappingRejectsMalformedStationFrameAndNodeData ThermalReferenceComparison.HdfSchemaMappingRejectsMalformedStationFrameAndNodeData; assertion 4개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.HdfSchemaMappingRejectsMalformedStationFrameAndNodeData 유지 원문 검사 body 및 assertion 동일. b5991ec2a055de6dd67134f1cbf7445a7cfe8618f7089e1fe9968a22b3df1aaa b5991ec2a055de6dd67134f1cbf7445a7cfe8618f7089e1fe9968a22b3df1aaa ASSERT_TRUE(read.HasValue()) | EXPECT_EQ(result.HasValue(), defect == 0) | EXPECT_TRUE(result.Value().passed) | EXPECT_FALSE(read.HasValue()) ASSERT_TRUE(read.HasValue()) | EXPECT_EQ(result.HasValue(), defect == 0) | EXPECT_TRUE(result.Value().passed) | EXPECT_FALSE(read.HasValue()) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.MapsSourceLabelsWithoutRowOrderAndPreservesSignedValues ThermalReferenceComparison.MapsSourceLabelsWithoutRowOrderAndPreservesSignedValues; assertion 9개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.MapsSourceLabelsWithoutRowOrderAndPreservesSignedValues 유지 원문 검사 body 및 assertion 동일. 9fbe3d06c90283b2e1b9473474b689354f9dbd1bd2eca8c120e10127bfc472b9 9fbe3d06c90283b2e1b9473474b689354f9dbd1bd2eca8c120e10127bfc472b9 ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed) | ASSERT_EQ(result.Value().rows.size(), 3U) | EXPECT_EQ(result.Value().rows[1].label, 7U) | EXPECT_EQ(result.Value().rows[1].reference, -15.5742216) | EXPECT_EQ(result.Value().rows[1].tolerance.branch, fesa::test::ReferenceToleranceBranch::kRelative) | EXPECT_EQ(result.Value().family.reference_scale, 1000) | EXPECT_EQ(result.Value().family.near_zero_band, 10) | EXPECT_FALSE(result.Value().family.blocking) ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().passed) | ASSERT_EQ(result.Value().rows.size(), 3U) | EXPECT_EQ(result.Value().rows[1].label, 7U) | EXPECT_EQ(result.Value().rows[1].reference, -15.5742216) | EXPECT_EQ(result.Value().rows[1].tolerance.branch, fesa::test::ReferenceToleranceBranch::kRelative) | EXPECT_EQ(result.Value().family.reference_scale, 1000) | EXPECT_EQ(result.Value().family.near_zero_band, 10) | EXPECT_FALSE(result.Value().family.blocking) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsMissingExtraDuplicateAndNonfiniteBeforeTolerance ThermalReferenceComparison.RejectsMissingExtraDuplicateAndNonfiniteBeforeTolerance; assertion 1개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsMissingExtraDuplicateAndNonfiniteBeforeTolerance 유지 원문 검사 body 및 assertion 동일. bb8b648993b9f4ae838901f9566db7ca32f22e6bdbd6018213d68e1ff48dfc46 bb8b648993b9f4ae838901f9566db7ca32f22e6bdbd6018213d68e1ff48dfc46 "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsWrongStepTimeIncrementInstanceAndStation ThermalReferenceComparison.RejectsWrongStepTimeIncrementInstanceAndStation; assertion 1개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.RejectsWrongStepTimeIncrementInstanceAndStation 유지 원문 검사 body 및 assertion 동일. e9b3d7890b38b8ac9d7124ef7b38cea8037bd5f2977145231c47928af3112462 e9b3d7890b38b8ac9d7124ef7b38cea8037bd5f2977145231c47928af3112462 "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" "EXPECT_FALSE(fesa::test::CompareThermalSnapshots(actual, reference, {3, 7, 20}, ""Part-1-1"") .HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.UsesUnmodifiedFivePercentOnePercentAndExactZeroPolicy ThermalReferenceComparison.UsesUnmodifiedFivePercentOnePercentAndExactZeroPolicy; assertion 5개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.UsesUnmodifiedFivePercentOnePercentAndExactZeroPolicy 유지 원문 검사 body 및 assertion 동일. 6fa4b28f03af7accaa46980c8de1e428a784bed83de862984ec5c1fed45ea9db 6fa4b28f03af7accaa46980c8de1e428a784bed83de862984ec5c1fed45ea9db ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | EXPECT_EQ(result.Value().family.reference_scale, 0) ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(result.Value().passed) | EXPECT_EQ(result.Value().family.reference_scale, 0) 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.CsvRequiresExactHeaderFrameFiniteValuesAndSoleInstance ThermalReferenceComparison.CsvRequiresExactHeaderFrameFiniteValuesAndSoleInstance; assertion 2개 tests/reference/thermal_reference_comparison_test.cpp ThermalReferenceComparison.CsvRequiresExactHeaderFrameFiniteValuesAndSoleInstance 유지 원문 검사 body 및 assertion 동일. 6a725850decb91c07895b0f8e6513e95e866004b4885a6f9cd0959b79b3d05f8 6a725850decb91c07895b0f8e6513e95e866004b4885a6f9cd0959b79b3d05f8 "EXPECT_EQ(result.HasValue(), text == header + valid) | EXPECT_FALSE(fesa::test::ReadThermalReferenceCsv(path, """").HasValue())" "EXPECT_EQ(result.HasValue(), text == header + valid) | EXPECT_FALSE(fesa::test::ReadThermalReferenceCsv(path, """").HasValue())" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp support@1-170 helper/oracle/fixture/include/static assertion 구간: TemporaryFolder, Handle, StringAttribute, T, ScalarAttribute, Dataset, comparator, Node, Frame tests/reference/thermal_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8fe742ff0a0ff661b374df3df48724fad479ad1702325197a6ff058cd08f3942 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp support@196-204 helper/oracle/fixture/include/static assertion 구간: Snapshot tests/reference/thermal_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 32bf1858c73c1cbf1f65ee1adc11e7230a993eb21b972a8b16916a5fe4eb2d21 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/reference/thermal_reference_comparison_test.cpp support@330-330 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/reference/thermal_reference_comparison_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 60개 tests/test_compare_hex8.py file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 48770f6e83f1b7c34a15e396fd7f21bc02c2c102f47f7bab520203d4ac4d872c 48770f6e83f1b7c34a15e396fd7f21bc02c2c102f47f7bab520203d4ac4d872c 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py family fixture/oracle/helper family tests/test_compare_hex8.py family 유지 원문 검사 body 및 assertion 동일. 470c4ffd359ca492fe0f676adef5096d760aa885da86bfea548cf66668911061 470c4ffd359ca492fe0f676adef5096d760aa885da86bfea548cf66668911061 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_zero_reference_scale_requires_exact_zero test_zero_reference_scale_requires_exact_zero; assertion 0개 tests/test_compare_hex8.py test_zero_reference_scale_requires_exact_zero 유지 원문 검사 body 및 assertion 동일. acffff10b5ecba2f553c11e2b6b170454e0622ae88c80e848c35e5a2657fb973 acffff10b5ecba2f553c11e2b6b170454e0622ae88c80e848c35e5a2657fb973 "assert not report[""passed""] | assert report[""diagnostic_code""] == ""zero-reference-scale-nonzero-error""" "assert not report[""passed""] | assert report[""diagnostic_code""] == ""zero-reference-scale-nonzero-error""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_row_pass_does_not_override_one_percent_rms test_row_pass_does_not_override_one_percent_rms; assertion 0개 tests/test_compare_hex8.py test_row_pass_does_not_override_one_percent_rms 유지 원문 검사 body 및 assertion 동일. 37a10f25ff36684717173aa3133bad3199da22251c4eede4c32926cb162248f1 37a10f25ff36684717173aa3133bad3199da22251c4eede4c32926cb162248f1 "assert report[""rows_passed""] | assert not report[""rms_passed""] | assert not report[""passed""]" "assert report[""rows_passed""] | assert not report[""rms_passed""] | assert not report[""passed""]" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_near_zero_band_uses_reference_scale_only test_near_zero_band_uses_reference_scale_only; assertion 0개 tests/test_compare_hex8.py test_near_zero_band_uses_reference_scale_only 유지 원문 검사 body 및 assertion 동일. 048405550e540c6604cc5f747bf2601f3a2ca7f18361f1a5b93c5e9ed2354674 048405550e540c6604cc5f747bf2601f3a2ca7f18361f1a5b93c5e9ed2354674 "assert report[""passed""] | assert report[""rows""][1][""branch""] == ""near-zero"" | assert not family([100.0, 1.0001], [100.0, 0.0])[""passed""]" "assert report[""passed""] | assert report[""rows""][1][""branch""] == ""near-zero"" | assert not family([100.0, 1.0001], [100.0, 0.0])[""passed""]" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_nonfinite_family_fails_before_tolerance test_nonfinite_family_fails_before_tolerance; assertion 0개 tests/test_compare_hex8.py test_nonfinite_family_fails_before_tolerance 유지 원문 검사 body 및 assertion 동일. d6a5a081bc6210e5bf9d8abf51bfb34dbc4216f72afaed67fcb2dd34bd0367de d6a5a081bc6210e5bf9d8abf51bfb34dbc4216f72afaed67fcb2dd34bd0367de 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_header_strip_collision_rejected_before_bad_numeric test_header_strip_collision_rejected_before_bad_numeric; assertion 0개 tests/test_compare_hex8.py test_header_strip_collision_rejected_before_bad_numeric 유지 원문 검사 body 및 assertion 동일. c563f3f16975c19d7cefff2d423156520212de85fc08c6efea140482cbf171a2 c563f3f16975c19d7cefff2d423156520212de85fc08c6efea140482cbf171a2 "assert error.value.code == ""duplicate-reference-header""" "assert error.value.code == ""duplicate-reference-header""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_quantity_and_units_are_explicit test_modal_quantity_and_units_are_explicit; assertion 0개 tests/test_compare_hex8.py test_modal_quantity_and_units_are_explicit 유지 원문 검사 body 및 assertion 동일. 69224345be705ed0e5ddc73a0097e2cbde7fe40ae0767c3e366285b855b6f0c5 69224345be705ed0e5ddc73a0097e2cbde7fe40ae0767c3e366285b855b6f0c5 "assert error.value.code == ""wrong-modal-quantity""" "assert error.value.code == ""wrong-modal-quantity""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_singletons_use_common_one_percent_rms test_modal_singletons_use_common_one_percent_rms; assertion 0개 tests/test_compare_hex8.py test_modal_singletons_use_common_one_percent_rms 유지 원문 검사 body 및 assertion 동일. 12414f36bfd7c2b85119a129cfadc5a621337125523d3e12f79239c235df245e 12414f36bfd7c2b85119a129cfadc5a621337125523d3e12f79239c235df245e "assert not report[""passed""] | assert len(report[""families""]) == 10 | assert all(row[""rows_passed""] and not row[""rms_passed""] for row in report[""families""])" "assert not report[""passed""] | assert len(report[""families""]) == 10 | assert all(row[""rows_passed""] and not row[""rms_passed""] for row in report[""families""])" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py write_strings fixture/oracle/helper write_strings tests/test_compare_hex8.py write_strings 유지 원문 검사 body 및 assertion 동일. 276c5761682166fbc7c118aec375743a4a95f58bc89d842e3115cd0f205c6192 276c5761682166fbc7c118aec375743a4a95f58bc89d842e3115cd0f205c6192 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py compound fixture/oracle/helper compound tests/test_compare_hex8.py compound 유지 원문 검사 body 및 assertion 동일. 24a2ff98b03ced8d9940d466b856caaa2aa4e4946964d331c183a39b97472f1c 24a2ff98b03ced8d9940d466b856caaa2aa4e4946964d331c183a39b97472f1c 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py source_models fixture/oracle/helper source_models tests/test_compare_hex8.py source_models 유지 원문 검사 body 및 assertion 동일. 49ff1623a3a5e4c6ae82fb11badea5f7c4a9c91c250effb7a622cd8b65a5de92 49ff1623a3a5e4c6ae82fb11badea5f7c4a9c91c250effb7a622cd8b65a5de92 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py source_rows fixture/oracle/helper source_rows tests/test_compare_hex8.py source_rows 유지 원문 검사 body 및 assertion 동일. a37f3e15cda5217583236cbba542b086d7167ec604698a3f920d9a8d4e89d570 a37f3e15cda5217583236cbba542b086d7167ec604698a3f920d9a8d4e89d570 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py make_result fixture/oracle/helper make_result tests/test_compare_hex8.py make_result 유지 원문 검사 body 및 assertion 동일. 331007a19dc4d4fe252e38c7aac4c31371b60f3e33dbe052ef1a6ed7ad41a8c6 331007a19dc4d4fe252e38c7aac4c31371b60f3e33dbe052ef1a6ed7ad41a8c6 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py result_fixtures fixture/oracle/helper result_fixtures tests/test_compare_hex8.py result_fixtures 유지 원문 검사 body 및 assertion 동일. 08b2a69b873b21100a21e05395ab04849091de70c7248b281c4bd803d067e0a6 08b2a69b873b21100a21e05395ab04849091de70c7248b281c4bd803d067e0a6 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py copy_result fixture/oracle/helper copy_result tests/test_compare_hex8.py copy_result 유지 원문 검사 body 및 assertion 동일. c050dd11768c91e970fbcc94d7c4dd2d83f5fb89df8b0c894446683f59be8e4c c050dd11768c91e970fbcc94d7c4dd2d83f5fb89df8b0c894446683f59be8e4c 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py compare_fixture fixture/oracle/helper compare_fixture tests/test_compare_hex8.py compare_fixture 유지 원문 검사 body 및 assertion 동일. 2c8a6c16b7f44b4ca2cf499b3564b53df1c0fdff6cb5470e192724ddf7267b65 2c8a6c16b7f44b4ca2cf499b3564b53df1c0fdff6cb5470e192724ddf7267b65 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py mutate_csv fixture/oracle/helper mutate_csv tests/test_compare_hex8.py mutate_csv 유지 원문 검사 body 및 assertion 동일. b240a6dce17c82736f4e531a9b7d741a44d9bfeac4aff82419842c5d2b0b4f24 b240a6dce17c82736f4e531a9b7d741a44d9bfeac4aff82419842c5d2b0b4f24 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_all_original_sized_schema_fixtures_compare_by_identity test_all_original_sized_schema_fixtures_compare_by_identity; assertion 0개 tests/test_compare_hex8.py test_all_original_sized_schema_fixtures_compare_by_identity 유지 원문 검사 body 및 assertion 동일. 25f539a154d3685491c6b4eebcdfbe580ef2fa1ab98b3cee67b29d8f8a2a667c 25f539a154d3685491c6b4eebcdfbe580ef2fa1ab98b3cee67b29d8f8a2a667c "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""passed"" | assert report[""execution""][""verified""] is False | assert len(report[""families""]) == (101 if case.startswith(""hexa_dyn"") else 3) | assert [family[""row_count""] for family in report[""families""]] == [1326, 51, 14400] | assert report[""precheck""][""reference_row_counts""][""RF""] == 442 | assert [family[""increment""] for family in report[""families""]] == list(range(101)) | assert all(family[""row_count""] == 1326 for family in report[""families""]) | assert report[""families""][0][""reference_scale""] == 0." "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""passed"" | assert report[""execution""][""verified""] is False | assert len(report[""families""]) == (101 if case.startswith(""hexa_dyn"") else 3) | assert [family[""row_count""] for family in report[""families""]] == [1326, 51, 14400] | assert report[""precheck""][""reference_row_counts""][""RF""] == 442 | assert [family[""increment""] for family in report[""families""]] == list(range(101)) | assert all(family[""row_count""] == 1326 for family in report[""families""]) | assert report[""families""][0][""reference_scale""] == 0." 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_static_final_factor_maps_to_increment10_not_storage_frame test_static_final_factor_maps_to_increment10_not_storage_frame; assertion 0개 tests/test_compare_hex8.py test_static_final_factor_maps_to_increment10_not_storage_frame 유지 원문 검사 body 및 assertion 동일. 7aa3392c943620fcf98de2866021d09008a01ba106f1d2c396d84e0cf2b747f7 7aa3392c943620fcf98de2866021d09008a01ba106f1d2c396d84e0cf2b747f7 "assert {family[""increment""] for family in report[""families""]} == {10} | assert all(family[""passed""] for family in report[""families""])" "assert {family[""increment""] for family in report[""families""]} == {10} | assert all(family[""passed""] for family in report[""families""])" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_csv_order_does_not_supply_identity test_csv_order_does_not_supply_identity; assertion 0개 tests/test_compare_hex8.py test_csv_order_does_not_supply_identity 유지 원문 검사 body 및 assertion 동일. 140999c1e06c6c5c0bd3b013af006f60671ccf6385c9f147f082d70d9ee27725 140999c1e06c6c5c0bd3b013af006f60671ccf6385c9f147f082d70d9ee27725 "assert COMPARE.reference_values(rows, quantity, source_models[""hexa_linearstatic""]) == COMPARE.reference_values(original, quantity, source_models[""hexa_linearstatic""])" "assert COMPARE.reference_values(rows, quantity, source_models[""hexa_linearstatic""]) == COMPARE.reference_values(original, quantity, source_models[""hexa_linearstatic""])" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_reference_identity_errors_precede_nonfinite test_reference_identity_errors_precede_nonfinite; assertion 0개 tests/test_compare_hex8.py test_reference_identity_errors_precede_nonfinite 유지 원문 검사 body 및 assertion 동일. 6cd9376817bc9787434e7936ae23d00acad81a8679b5a5f53db429eb3fd335b9 6cd9376817bc9787434e7936ae23d00acad81a8679b5a5f53db429eb3fd335b9 assert error.value.code == code assert error.value.code == code 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_rf_entire_inventory_precedes_constraint_projection test_rf_entire_inventory_precedes_constraint_projection; assertion 0개 tests/test_compare_hex8.py test_rf_entire_inventory_precedes_constraint_projection 유지 원문 검사 body 및 assertion 동일. 2a07dc3e967642c71bda95de58e1f31891d31d056b300fd6066499e045a79688 2a07dc3e967642c71bda95de58e1f31891d31d056b300fd6066499e045a79688 "assert int(rows[0][""Node Label""]) == 1 # A free node, absent from projected RF family. | assert error.value.code == ""reference-inventory""" "assert int(rows[0][""Node Label""]) == 1 # A free node, absent from projected RF family. | assert error.value.code == ""reference-inventory""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_duplicate_reference_identity_precedes_bad_numeric test_duplicate_reference_identity_precedes_bad_numeric; assertion 0개 tests/test_compare_hex8.py test_duplicate_reference_identity_precedes_bad_numeric 유지 원문 검사 body 및 assertion 동일. b8160b12d894a2c7aafcb8eb961995755fd8fb0dd739258a52252e56ccaceb71 b8160b12d894a2c7aafcb8eb961995755fd8fb0dd739258a52252e56ccaceb71 "assert error.value.code == ""duplicate-reference-identity""" "assert error.value.code == ""duplicate-reference-identity""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_invalid_stress_point_is_never_rematched test_invalid_stress_point_is_never_rematched; assertion 0개 tests/test_compare_hex8.py test_invalid_stress_point_is_never_rematched 유지 원문 검사 body 및 assertion 동일. d22612e0ce45e17242b4c97aa8d0d5d2adf7a7d3f712751b6d309f2cc4470a30 d22612e0ce45e17242b4c97aa8d0d5d2adf7a7d3f712751b6d309f2cc4470a30 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_stress_point_order_coordinates_are_auxiliary_not_identity test_stress_point_order_coordinates_are_auxiliary_not_identity; assertion 0개 tests/test_compare_hex8.py test_stress_point_order_coordinates_are_auxiliary_not_identity 유지 원문 검사 body 및 assertion 동일. 0b4282275b0eedfe1f8f2e20135d3f679b7ee5038d912776f9ce9e14e2884466 0b4282275b0eedfe1f8f2e20135d3f679b7ee5038d912776f9ce9e14e2884466 "assert error.value.code == ""reference-coordinate-convention""" "assert error.value.code == ""reference-coordinate-convention""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_wrong_component_columns_rejected test_wrong_component_columns_rejected; assertion 0개 tests/test_compare_hex8.py test_wrong_component_columns_rejected 유지 원문 검사 body 및 assertion 동일. f3c962f00fd73f46fb8ff3c38ad0c1cfc18b8eb1fd8788b069d17e58019eb126 f3c962f00fd73f46fb8ff3c38ad0c1cfc18b8eb1fd8788b069d17e58019eb126 "assert error.value.code == ""wrong-reference-columns""" "assert error.value.code == ""wrong-reference-columns""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_dynamic_decimal_time_requires_exact_integer_frame test_dynamic_decimal_time_requires_exact_integer_frame; assertion 0개 tests/test_compare_hex8.py test_dynamic_decimal_time_requires_exact_integer_frame 유지 원문 검사 body 및 assertion 동일. 06f5140c6a935a5342af4a214007ccf4bac66cf353827e55fe8485f5cefef15f 06f5140c6a935a5342af4a214007ccf4bac66cf353827e55fe8485f5cefef15f "assert error.value.code == ""wrong-reference-frame-time""" "assert error.value.code == ""wrong-reference-frame-time""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_nonfinite_free_reference_rf_is_not_discarded test_nonfinite_free_reference_rf_is_not_discarded; assertion 0개 tests/test_compare_hex8.py test_nonfinite_free_reference_rf_is_not_discarded 유지 원문 검사 body 및 assertion 동일. ad89da9e96e0415c98e715ab0a87b8c97e921b5bec4c545f8e24b5edceeb2dc8 ad89da9e96e0415c98e715ab0a87b8c97e921b5bec4c545f8e24b5edceeb2dc8 "assert error.value.code == ""nonfinite-reference-value""" "assert error.value.code == ""nonfinite-reference-value""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_inclusive_row_and_rms_boundaries_are_independent test_inclusive_row_and_rms_boundaries_are_independent; assertion 0개 tests/test_compare_hex8.py test_inclusive_row_and_rms_boundaries_are_independent 유지 원문 검사 body 및 assertion 동일. cc19b85a5d142f0c8f65b2b1ee9d5f6f14cdb4b0a071c0c70f92142de45d8e92 cc19b85a5d142f0c8f65b2b1ee9d5f6f14cdb4b0a071c0c70f92142de45d8e92 "assert report[""passed""] and report[""rows""][0][""relative_error""] == .05 | assert not family([21.00001] + [20.] * 99, [20.] * 100)[""rows_passed""] | assert family([101.], [100.])[""passed""] | assert not family([101.00001], [100.])[""rms_passed""] | assert family([100., 2.], [100., 1.])[""rows""][1][""branch""] == ""near-zero""" "assert report[""passed""] and report[""rows""][0][""relative_error""] == .05 | assert not family([21.00001] + [20.] * 99, [20.] * 100)[""rows_passed""] | assert family([101.], [100.])[""passed""] | assert not family([101.00001], [100.])[""rms_passed""] | assert family([100., 2.], [100., 1.])[""rows""][1][""branch""] == ""near-zero""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_overflow_cannot_create_passing_metric test_overflow_cannot_create_passing_metric; assertion 0개 tests/test_compare_hex8.py test_overflow_cannot_create_passing_metric 유지 원문 검사 body 및 assertion 동일. ea8571675e864411a18189b384b7fa253f49feba9e9d05585c1807eec00e535f ea8571675e864411a18189b384b7fa253f49feba9e9d05585c1807eec00e535f 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_wrong_result_node_beats_nonfinite_displacement test_wrong_result_node_beats_nonfinite_displacement; assertion 0개 tests/test_compare_hex8.py test_wrong_result_node_beats_nonfinite_displacement 유지 원문 검사 body 및 assertion 동일. 76c7756b8724d4c2364d64dcd7123768ba0c191288989e6a5111fbd805dedfc5 76c7756b8724d4c2364d64dcd7123768ba0c191288989e6a5111fbd805dedfc5 "assert report[""precheck""][""code""] == ""result-node-inventory"" | assert report[""families""] == []" "assert report[""precheck""][""code""] == ""result-node-inventory"" | assert report[""families""] == []" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_metadata_identity_rejects_other_model test_metadata_identity_rejects_other_model; assertion 0개 tests/test_compare_hex8.py test_metadata_identity_rejects_other_model 유지 원문 검사 body 및 assertion 동일. c40c79702d38d5f4ef675590d8b9b7ae40c1e41ce5e691cad6430866d583e1e4 c40c79702d38d5f4ef675590d8b9b7ae40c1e41ce5e691cad6430866d583e1e4 "assert compare_fixture(path)[""precheck""][""code""] == code" "assert compare_fixture(path)[""precheck""][""code""] == code" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_result_quantity_semantics_must_match test_result_quantity_semantics_must_match; assertion 0개 tests/test_compare_hex8.py test_result_quantity_semantics_must_match 유지 원문 검사 body 및 assertion 동일. e636737d8798f7c35df431feb03f9716b52bc784a175e9d4337b0f8757f18991 e636737d8798f7c35df431feb03f9716b52bc784a175e9d4337b0f8757f18991 "assert compare_fixture(path)[""precheck""][""code""] == ""wrong-result-attribute""" "assert compare_fixture(path)[""precheck""][""code""] == ""wrong-result-attribute""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_wrong_shape_or_dtype_is_not_sliced_into_supported_components test_wrong_shape_or_dtype_is_not_sliced_into_supported_components; assertion 0개 tests/test_compare_hex8.py test_wrong_shape_or_dtype_is_not_sliced_into_supported_components 유지 원문 검사 body 및 assertion 동일. 7bc82a71594a9faff7998ef731fd43085ff7bdb862796cc4709b73be5677bfb6 7bc82a71594a9faff7998ef731fd43085ff7bdb862796cc4709b73be5677bfb6 "assert compare_fixture(path)[""precheck""][""code""] == code" "assert compare_fixture(path)[""precheck""][""code""] == code" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_signed_ids_and_fixed_ascii_are_not_official_compound_schema test_signed_ids_and_fixed_ascii_are_not_official_compound_schema; assertion 0개 tests/test_compare_hex8.py test_signed_ids_and_fixed_ascii_are_not_official_compound_schema 유지 원문 검사 body 및 assertion 동일. 326c204371abb9ac125cf2d879a1e5e303f46584342a9b5332c26ab41d27d893 326c204371abb9ac125cf2d879a1e5e303f46584342a9b5332c26ab41d27d893 "assert compare_fixture(path)[""precheck""][""code""] == ""wrong-result-table-schema""" "assert compare_fixture(path)[""precheck""][""code""] == ""wrong-result-table-schema""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_dynamic_frame_inventory_is_exact test_dynamic_frame_inventory_is_exact; assertion 0개 tests/test_compare_hex8.py test_dynamic_frame_inventory_is_exact 유지 원문 검사 body 및 assertion 동일. 7d3cdb79af00089850401f5f3ffe9fb0b6ab71a67a876ef91141c7e65d07d3bc 7d3cdb79af00089850401f5f3ffe9fb0b6ab71a67a876ef91141c7e65d07d3bc "assert compare_fixture(path, ""hexa_dynlinear"")[""precheck""][""code""] == ""result-frame-inventory""" "assert compare_fixture(path, ""hexa_dynlinear"")[""precheck""][""code""] == ""result-frame-inventory""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_dynamic_binary_schedule_not_nearest_time test_dynamic_binary_schedule_not_nearest_time; assertion 0개 tests/test_compare_hex8.py test_dynamic_binary_schedule_not_nearest_time 유지 원문 검사 body 및 assertion 동일. 3368eac157758a820c6b4bb5bc95da45047e81e23d6bdf323683e77ee4b879f4 3368eac157758a820c6b4bb5bc95da45047e81e23d6bdf323683e77ee4b879f4 "assert compare_fixture(path, ""hexa_dynlinear"")[""precheck""][""code""] == ""wrong-result-frame-schedule""" "assert compare_fixture(path, ""hexa_dynlinear"")[""precheck""][""code""] == ""wrong-result-frame-schedule""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_result_point_id_mismatch_rejected_before_nan_stress test_result_point_id_mismatch_rejected_before_nan_stress; assertion 0개 tests/test_compare_hex8.py test_result_point_id_mismatch_rejected_before_nan_stress 유지 원문 검사 body 및 assertion 동일. 4e46b65fbed4063d375d07afc69d281201bddcd455b4313d31bb75fee88828ce 4e46b65fbed4063d375d07afc69d281201bddcd455b4313d31bb75fee88828ce "assert compare_fixture(path)[""precheck""][""code""] == ""wrong-result-point-identity""" "assert compare_fixture(path)[""precheck""][""code""] == ""wrong-result-point-identity""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_result_free_reaction_is_not_free_residual test_result_free_reaction_is_not_free_residual; assertion 0개 tests/test_compare_hex8.py test_result_free_reaction_is_not_free_residual 유지 원문 검사 body 및 assertion 동일. 96f0a2ad9860091e2b8f7f08e6a041166cf9da1ed854f0206b39bd0e8daa8379 96f0a2ad9860091e2b8f7f08e6a041166cf9da1ed854f0206b39bd0e8daa8379 "assert compare_fixture(path)[""verdict""] == ""passed"" | assert compare_fixture(path)[""precheck""][""code""] == ""nonzero-free-result-reaction""" "assert compare_fixture(path)[""verdict""] == ""passed"" | assert compare_fixture(path)[""precheck""][""code""] == ""nonzero-free-result-reaction""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_nonfinite_uncompared_quantity_is_schema_failure test_nonfinite_uncompared_quantity_is_schema_failure; assertion 0개 tests/test_compare_hex8.py test_nonfinite_uncompared_quantity_is_schema_failure 유지 원문 검사 body 및 assertion 동일. 7d8b2c00b5d320dc0383c2b280d291ee67e39b4f3d6800a9942efa71bf457acf 7d8b2c00b5d320dc0383c2b280d291ee67e39b4f3d6800a9942efa71bf457acf "assert compare_fixture(path)[""precheck""][""code""] == ""nonfinite-result-value""" "assert compare_fixture(path)[""precheck""][""code""] == ""nonfinite-result-value""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_source_copy_must_be_byte_identical test_source_copy_must_be_byte_identical; assertion 0개 tests/test_compare_hex8.py test_source_copy_must_be_byte_identical 유지 원문 검사 body 및 assertion 동일. ca309837ae5901ff7b9ed075ed34361571c2364f92b7f513b6a27ba70daf9a9d ca309837ae5901ff7b9ed075ed34361571c2364f92b7f513b6a27ba70daf9a9d "assert report[""precheck""][""code""] == ""source-input-hash-mismatch""" "assert report[""precheck""][""code""] == ""source-input-hash-mismatch""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_report_is_deterministic_and_keeps_family_boundaries test_report_is_deterministic_and_keeps_family_boundaries; assertion 0개 tests/test_compare_hex8.py test_report_is_deterministic_and_keeps_family_boundaries 유지 원문 검사 body 및 assertion 동일. 83672aa126a31dc439b6013d1c0243cacd84420a98288d151475336dee22a335 83672aa126a31dc439b6013d1c0243cacd84420a98288d151475336dee22a335 "assert json.dumps(first, sort_keys=True, allow_nan=False) == json.dumps(second, sort_keys=True, allow_nan=False) | assert [row[""quantity""] for row in first[""families""]] == [""U"", ""RF"", ""S""] | assert len({row[""reference_sha256""] for row in first[""families""]}) == 3" "assert json.dumps(first, sort_keys=True, allow_nan=False) == json.dumps(second, sort_keys=True, allow_nan=False) | assert [row[""quantity""] for row in first[""families""]] == [""U"", ""RF"", ""S""] | assert len({row[""reference_sha256""] for row in first[""families""]}) == 3" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_original_absence_is_not_pass test_modal_original_absence_is_not_pass; assertion 0개 tests/test_compare_hex8.py test_modal_original_absence_is_not_pass 유지 원문 검사 body 및 assertion 동일. 8f020cb160e1da7c98ea588a1ac9a18f661f2b3c8985d79da286d3a952e28676 8f020cb160e1da7c98ea588a1ac9a18f661f2b3c8985d79da286d3a952e28676 "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""not-run"" and not report[""blocking_passed""] | assert report[""families""] == []" "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""not-run"" and not report[""blocking_passed""] | assert report[""families""] == []" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_supplied_modal_values_are_compared_not_reported_missing test_supplied_modal_values_are_compared_not_reported_missing; assertion 0개 tests/test_compare_hex8.py test_supplied_modal_values_are_compared_not_reported_missing 유지 원문 검사 body 및 assertion 동일. a7a7696b247f603796274c8b69b4a9bcdc3812e23c5ee73d4d0be7ad8f35d364 a7a7696b247f603796274c8b69b4a9bcdc3812e23c5ee73d4d0be7ad8f35d364 "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""failed"" | assert len(report[""blocking_failures""]) == 10 | assert report[""precheck""][""reference_row_counts""][""Value""] == 10 | assert [f[""mode""] for f in report[""families""]] == list(range(1, 11)) | assert all(f[""quantity""] == ""eigenvalue"" for f in report[""families""])" "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""failed"" | assert len(report[""blocking_failures""]) == 10 | assert report[""precheck""][""reference_row_counts""][""Value""] == 10 | assert [f[""mode""] for f in report[""families""]] == list(range(1, 11)) | assert all(f[""quantity""] == ""eigenvalue"" for f in report[""families""])" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_eigenvalue_matches_pass_with_ten_independent_families test_modal_eigenvalue_matches_pass_with_ten_independent_families; assertion 0개 tests/test_compare_hex8.py test_modal_eigenvalue_matches_pass_with_ten_independent_families 유지 원문 검사 body 및 assertion 동일. 15c1cf8449841503ddd4ec0cea73280634781696ea2eb95fcdbed7ea21a9c11f 15c1cf8449841503ddd4ec0cea73280634781696ea2eb95fcdbed7ea21a9c11f "assert first[""verdict""] == ""passed"", first | assert first[""blocking_passed""] and first[""blocking_failures""] == [] | assert len({f[""identity""] for f in first[""families""]}) == 10 | assert all(f[""relative_rms""] == 0 and f[""row_count""] == 1 for f in first[""families""]) | assert first == compare_fixture(path, ""hexa_freq"")" "assert first[""verdict""] == ""passed"", first | assert first[""blocking_passed""] and first[""blocking_failures""] == [] | assert len({f[""identity""] for f in first[""families""]}) == 10 | assert all(f[""relative_rms""] == 0 and f[""row_count""] == 1 for f in first[""families""]) | assert first == compare_fixture(path, ""hexa_freq"")" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_text_reads_value_not_cycles_per_time test_modal_text_reads_value_not_cycles_per_time; assertion 0개 tests/test_compare_hex8.py test_modal_text_reads_value_not_cycles_per_time 유지 원문 검사 body 및 assertion 동일. f99481938f41cc81ea04e50441b26e6a48f2e3f0648e7d906ef1457296b8fbb7 f99481938f41cc81ea04e50441b26e6a48f2e3f0648e7d906ef1457296b8fbb7 "assert rows[0] == {""step"": ""Step-1"", ""mode"": 1, ""quantity"": ""eigenvalue"", | assert rows[-1][""value""] == 449260.0 | assert COMPARE.read_modal_reference(reversed_path) == rows" "assert rows[0] == {""step"": ""Step-1"", ""mode"": 1, ""quantity"": ""eigenvalue"", | assert rows[-1][""value""] == 449260.0 | assert COMPARE.read_modal_reference(reversed_path) == rows" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_text_rejects_invalid_source test_modal_text_rejects_invalid_source; assertion 0개 tests/test_compare_hex8.py test_modal_text_rejects_invalid_source 유지 원문 검사 body 및 assertion 동일. dacd9a4c8381da554f965861f1475cb12ba5219b061223fcc307eb43d779796b dacd9a4c8381da554f965861f1475cb12ba5219b061223fcc307eb43d779796b assert error.value.code == code assert error.value.code == code 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modified_modal_reference_is_precheck_failure test_modified_modal_reference_is_precheck_failure; assertion 0개 tests/test_compare_hex8.py test_modified_modal_reference_is_precheck_failure 유지 원문 검사 body 및 assertion 동일. 6b06ccce353b338e48690a346c912469d3e2647863855943bb8c472c71cd2a8a 6b06ccce353b338e48690a346c912469d3e2647863855943bb8c472c71cd2a8a "assert report[""verdict""] == ""failed"" | assert report[""precheck""][""code""] == ""reference-hash-mismatch""" "assert report[""verdict""] == ""failed"" | assert report[""precheck""][""code""] == ""reference-hash-mismatch""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_identity_before_nonfinite test_modal_identity_before_nonfinite; assertion 0개 tests/test_compare_hex8.py test_modal_identity_before_nonfinite 유지 원문 검사 body 및 assertion 동일. 893568688885b010fbd9a3be2c4d9627f481e17be01702926fb2732a43c2b115 893568688885b010fbd9a3be2c4d9627f481e17be01702926fb2732a43c2b115 assert error.value.code == code assert error.value.code == code 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_closed_execution_record_hashes_are_checked test_closed_execution_record_hashes_are_checked; assertion 0개 tests/test_compare_hex8.py test_closed_execution_record_hashes_are_checked 유지 원문 검사 body 및 assertion 동일. 306414b617f9e0617b63b3b788805ae7c77ea9069ab5120b5fad61f5f73d2f59 306414b617f9e0617b63b3b788805ae7c77ea9069ab5120b5fad61f5f73d2f59 "assert compare_fixture(path, execution=record)[""execution""][""verified""] | assert compare_fixture(path, execution=record)[""precheck""][""code""] == ""invalid-execution-evidence"" | assert compare_fixture(path, execution=record)[""precheck""][""code""] == ""invalid-execution-evidence""" "assert compare_fixture(path, execution=record)[""execution""][""verified""] | assert compare_fixture(path, execution=record)[""precheck""][""code""] == ""invalid-execution-evidence"" | assert compare_fixture(path, execution=record)[""precheck""][""code""] == ""invalid-execution-evidence""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_cli_protects_reference_and_has_deterministic_exit test_cli_protects_reference_and_has_deterministic_exit; assertion 0개 tests/test_compare_hex8.py test_cli_protects_reference_and_has_deterministic_exit 유지 원문 검사 body 및 assertion 동일. d9b7e54c8824ebd960062ee77e0f438c6ba8a67d9b212884748873bdfd001f95 d9b7e54c8824ebd960062ee77e0f438c6ba8a67d9b212884748873bdfd001f95 "assert denied.returncode == 2 | assert COMPARE.sha256(REFERENCE / ""hexa_linearstatic_U.csv"") == original_hash | assert completed.returncode == 0, completed.stderr | assert json.loads(report_path.read_text())[""verdict""] == ""passed""" "assert denied.returncode == 2 | assert COMPARE.sha256(REFERENCE / ""hexa_linearstatic_U.csv"") == original_hash | assert completed.returncode == 0, completed.stderr | assert json.loads(report_path.read_text())[""verdict""] == ""passed""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_result_projection_joins_source_identities_not_storage_order test_result_projection_joins_source_identities_not_storage_order; assertion 0개 tests/test_compare_hex8.py test_result_projection_joins_source_identities_not_storage_order 유지 원문 검사 body 및 assertion 동일. 11573010c8678557897930e563fa8f9074b8b07af5a5eba26b972696d968d8b7 11573010c8678557897930e563fa8f9074b8b07af5a5eba26b972696d968d8b7 "assert report[""verdict""] == ""passed"", report[""precheck""]" "assert report[""verdict""] == ""passed"", report[""precheck""]" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_model_geometry_and_properties_match_frozen_input test_model_geometry_and_properties_match_frozen_input; assertion 0개 tests/test_compare_hex8.py test_model_geometry_and_properties_match_frozen_input 유지 원문 검사 body 및 assertion 동일. 8bbc10c2dbf029c6223beee9f01e0c7155579348a5dc91a486f0e4c111354761 8bbc10c2dbf029c6223beee9f01e0c7155579348a5dc91a486f0e4c111354761 "assert compare_fixture(path)[""precheck""][""code""] == code" "assert compare_fixture(path)[""precheck""][""code""] == code" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_required_types_and_complete_dataset_inventory test_required_types_and_complete_dataset_inventory; assertion 0개 tests/test_compare_hex8.py test_required_types_and_complete_dataset_inventory 유지 원문 검사 body 및 assertion 동일. 114fead25988359420b99d9a58edd0514cb669077b0120c85604346ea2b9b479 114fead25988359420b99d9a58edd0514cb669077b0120c85604346ea2b9b479 "assert compare_fixture(path)[""precheck""][""code""] == code" "assert compare_fixture(path)[""precheck""][""code""] == code" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_reference_raw_hash_rejects_modified_original_copy test_reference_raw_hash_rejects_modified_original_copy; assertion 0개 tests/test_compare_hex8.py test_reference_raw_hash_rejects_modified_original_copy 유지 원문 검사 body 및 assertion 동일. a1a2f799343ed1504cac751a71ab566919a4a9007dbd9446a216f2ff6bef4d4e a1a2f799343ed1504cac751a71ab566919a4a9007dbd9446a216f2ff6bef4d4e "assert report[""precheck""][""code""] == ""reference-hash-mismatch""" "assert report[""precheck""][""code""] == ""reference-hash-mismatch""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_case_families_cannot_share_scale_or_cancel_sign_errors test_case_families_cannot_share_scale_or_cancel_sign_errors; assertion 0개 tests/test_compare_hex8.py test_case_families_cannot_share_scale_or_cancel_sign_errors 유지 원문 검사 body 및 assertion 동일. ecc0b0b8f4f8eefe0d2bc111db41930d0b621e835796926a00b55285521960d2 ecc0b0b8f4f8eefe0d2bc111db41930d0b621e835796926a00b55285521960d2 "assert family([100.], [100.])[""passed""] | assert not family([.001], [0.])[""passed""] | assert report[""rows_passed""] | assert report[""absolute_rms""] == 1. | assert report[""relative_rms""] == .05 | assert not report[""rms_passed""]" "assert family([100.], [100.])[""passed""] | assert not family([.001], [0.])[""passed""] | assert report[""rows_passed""] | assert report[""absolute_rms""] == 1. | assert report[""relative_rms""] == .05 | assert not report[""rms_passed""]" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_alternate_reference_directory_cannot_make_original_report_writable test_alternate_reference_directory_cannot_make_original_report_writable; assertion 0개 tests/test_compare_hex8.py test_alternate_reference_directory_cannot_make_original_report_writable 유지 원문 검사 body 및 assertion 동일. 88cf4804dc26e3b48b04fe37cd50db943db4128f1377f94d83617daf41233f07 88cf4804dc26e3b48b04fe37cd50db943db4128f1377f94d83617daf41233f07 assert error.value.code == 2 | assert COMPARE.sha256(original) == original_sha assert error.value.code == 2 | assert COMPARE.sha256(original) == original_sha 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_modal_pair_rank_errors_produce_failed_precheck test_modal_pair_rank_errors_produce_failed_precheck; assertion 0개 tests/test_compare_hex8.py test_modal_pair_rank_errors_produce_failed_precheck 유지 원문 검사 body 및 assertion 동일. a80e0ea9fcb695c665ee25e589e3c77e59ec6e2fc21f94f50b6c1723e450e622 a80e0ea9fcb695c665ee25e589e3c77e59ec6e2fc21f94f50b6c1723e450e622 "assert not report[""precheck""][""passed""] | assert report[""precheck""][""code""] == ""wrong-modal-pair-shape"" | assert report[""families""] == []" "assert not report[""precheck""][""passed""] | assert report[""precheck""][""code""] == ""wrong-modal-pair-shape"" | assert report[""families""] == []" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_hardlink_report_alias_cannot_overwrite_known_source test_hardlink_report_alias_cannot_overwrite_known_source; assertion 0개 tests/test_compare_hex8.py test_hardlink_report_alias_cannot_overwrite_known_source 유지 원문 검사 body 및 assertion 동일. 72307938889302e35f061b0f2cbd70a3aa780360f32b4d04deb6f6bb2c5ead36 72307938889302e35f061b0f2cbd70a3aa780360f32b4d04deb6f6bb2c5ead36 assert error.value.code == 2 | assert COMPARE.sha256(original) == original_sha assert error.value.code == 2 | assert COMPARE.sha256(original) == original_sha 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py test_lexically_equivalent_input_path_preserves_writer_identity test_lexically_equivalent_input_path_preserves_writer_identity; assertion 0개 tests/test_compare_hex8.py test_lexically_equivalent_input_path_preserves_writer_identity 유지 원문 검사 body 및 assertion 동일. b25f45a465c21132bb6f2972f0c4047e36fecfda3da5c400a7370479a0b9bc95 b25f45a465c21132bb6f2972f0c4047e36fecfda3da5c400a7370479a0b9bc95 "assert report[""verdict""] == ""passed"", report[""precheck""]" "assert report[""verdict""] == ""passed"", report[""precheck""]" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py support@1-25 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/test_compare_hex8.py file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1181192f9dce7bde37bbe1b2babf9a029df220d85ae832d623cfa7e8657231b4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hex8.py support@84-89 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/test_compare_hex8.py file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 19003de235fbe57439674b70bbb66a1b8b296722c91ede8ebe79e269db9e6a2e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 12개 tests/test_compare_hht_dynamic.py file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 717065b241e599f704598cf92f1fdab29dfea77ee0fc7ed8e6f95c215d0354c4 717065b241e599f704598cf92f1fdab29dfea77ee0fc7ed8e6f95c215d0354c4 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py artifacts fixture/oracle/helper artifacts tests/test_compare_hht_dynamic.py artifacts 유지 원문 검사 body 및 assertion 동일. c2f9c40bf1524935da18d0426e5a09e3f00ef7bd417c2e1be8b55a04b5e9397f c2f9c40bf1524935da18d0426e5a09e3f00ef7bd417c2e1be8b55a04b5e9397f 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py changed_result fixture/oracle/helper changed_result tests/test_compare_hht_dynamic.py changed_result 유지 원문 검사 body 및 assertion 동일. 4dd2b5dcd04aea78c3995ac0f1c8dc4bfd249311251b8d6969dc3b2c416369cd 4dd2b5dcd04aea78c3995ac0f1c8dc4bfd249311251b8d6969dc3b2c416369cd 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py reduced_result fixture/oracle/helper reduced_result tests/test_compare_hht_dynamic.py reduced_result 유지 원문 검사 body 및 assertion 동일. fb941274cf24a5f6fe4ef37b24f1d304b9ee1062fba979d32dd7eda5825b5273 fb941274cf24a5f6fe4ef37b24f1d304b9ee1062fba979d32dd7eda5825b5273 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_reduced_schema_preserves_displacement_comparison test_reduced_schema_preserves_displacement_comparison; assertion 0개 tests/test_compare_hht_dynamic.py test_reduced_schema_preserves_displacement_comparison 유지 원문 검사 body 및 assertion 동일. 8ae92fbafbac4a8d8b1427a1722af164d9e4ade93b5c5ad94369091ac42c1040 8ae92fbafbac4a8d8b1427a1722af164d9e4ade93b5c5ad94369091ac42c1040 "assert result[""precheck""][""passed""], result[""precheck""] | assert result[""verdict""] == ""passed""" "assert result[""precheck""][""passed""], result[""precheck""] | assert result[""verdict""] == ""passed""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_reduced_schema_rejects_inconsistent_auxiliary_history test_reduced_schema_rejects_inconsistent_auxiliary_history; assertion 0개 tests/test_compare_hht_dynamic.py test_reduced_schema_rejects_inconsistent_auxiliary_history 유지 원문 검사 body 및 assertion 동일. 5ad1dc6319074a157cf8df0e2817fe65b198aa8ab8121dbf1d250fc13a6bc7f5 5ad1dc6319074a157cf8df0e2817fe65b198aa8ab8121dbf1d250fc13a6bc7f5 "assert not result[""precheck""][""passed""] | assert result[""families""] == []" "assert not result[""precheck""][""passed""] | assert result[""families""] == []" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_original_csv_exact_matching_history_and_deterministic_report test_original_csv_exact_matching_history_and_deterministic_report; assertion 0개 tests/test_compare_hht_dynamic.py test_original_csv_exact_matching_history_and_deterministic_report 유지 원문 검사 body 및 assertion 동일. e55e00c524c66f78ec00f4f3bbbd16383ad322afde9e9d1e36b76dda1074c682 e55e00c524c66f78ec00f4f3bbbd16383ad322afde9e9d1e36b76dda1074c682 "assert first == second | assert first[""precheck""][""passed""], first[""precheck""] | assert first[""precheck""][""reference_row_count""] == 909 | assert first[""precheck""][""checked_result_scalars""] == 441774 | assert first[""verdict""] == ""passed"" | assert first[""warnings""] == [] | assert len(first[""families""]) == 202 | assert sum(family[""row_count""] for family in first[""families""]) == 5454 | assert [family[""quantity""] for family in first[""families""][:4]] == [""U"", ""UR"", ""U"", ""UR""] | assert all(family[""passed""] for family in first[""families""]) | assert first[""families""][0][""reference_scale""] == 0.0 | assert first[""families""][6][""hdf5_time""] == 3 * 0.1 | assert first[""families""][6][""reference_decimal_time""] == ""0.3"" | assert 3 * 0.1 != float(""0.3"") # Both legitimate representations were validated independently." "assert first == second | assert first[""precheck""][""passed""], first[""precheck""] | assert first[""precheck""][""reference_row_count""] == 909 | assert first[""precheck""][""checked_result_scalars""] == 441774 | assert first[""verdict""] == ""passed"" | assert first[""warnings""] == [] | assert len(first[""families""]) == 202 | assert sum(family[""row_count""] for family in first[""families""]) == 5454 | assert [family[""quantity""] for family in first[""families""][:4]] == [""U"", ""UR"", ""U"", ""UR""] | assert all(family[""passed""] for family in first[""families""]) | assert first[""families""][0][""reference_scale""] == 0.0 | assert first[""families""][6][""hdf5_time""] == 3 * 0.1 | assert first[""families""][6][""reference_decimal_time""] == ""0.3"" | assert 3 * 0.1 != float(""0.3"") # Both legitimate representations were validated independently." 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_hdf5_precheck_rejects_before_tolerance test_hdf5_precheck_rejects_before_tolerance; assertion 0개 tests/test_compare_hht_dynamic.py test_hdf5_precheck_rejects_before_tolerance 유지 원문 검사 body 및 assertion 동일. fda55efd6e0d44ea147b97e855a8c039b26d96b790a7b6f0a97930e45f2c19b5 fda55efd6e0d44ea147b97e855a8c039b26d96b790a7b6f0a97930e45f2c19b5 "assert report[""precheck""][""passed""] is False | assert report[""precheck""][""code""] == code, report[""precheck""] | assert report[""families""] == [] | assert report[""verdict""] == ""failed""" "assert report[""precheck""][""passed""] is False | assert report[""precheck""][""code""] == code, report[""precheck""] | assert report[""families""] == [] | assert report[""verdict""] == ""failed""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_reference_precheck_rejects_before_tolerance test_reference_precheck_rejects_before_tolerance; assertion 0개 tests/test_compare_hht_dynamic.py test_reference_precheck_rejects_before_tolerance 유지 원문 검사 body 및 assertion 동일. d243b045242334bc6b410f278e139b1f8f49f37f9c3d1b4c0562966c0893d344 d243b045242334bc6b410f278e139b1f8f49f37f9c3d1b4c0562966c0893d344 "assert not report[""precheck""][""passed""] | assert report[""precheck""][""code""] == code, report[""precheck""] | assert report[""families""] == []" "assert not report[""precheck""][""passed""] | assert report[""precheck""][""code""] == code, report[""precheck""] | assert report[""families""] == []" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_projection_joins_source_identity_and_csv_order_is_irrelevant test_projection_joins_source_identity_and_csv_order_is_irrelevant; assertion 0개 tests/test_compare_hht_dynamic.py test_projection_joins_source_identity_and_csv_order_is_irrelevant 유지 원문 검사 body 및 assertion 동일. 62ffbc38263b6589b55b4a28098b5150d949b590393e23f1de7f225836705742 62ffbc38263b6589b55b4a28098b5150d949b590393e23f1de7f225836705742 "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""passed""" "assert report[""precheck""][""passed""], report[""precheck""] | assert report[""verdict""] == ""passed""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_translation_blocks_rotation_warns test_translation_blocks_rotation_warns; assertion 0개 tests/test_compare_hht_dynamic.py test_translation_blocks_rotation_warns 유지 원문 검사 body 및 assertion 동일. aa638d6ff3d660e834fb941a5ab49c7dca6e131afe6531e0937c933b17c721c2 aa638d6ff3d660e834fb941a5ab49c7dca6e131afe6531e0937c933b17c721c2 "assert report[""precheck""][""passed""] | assert report[""blocking_passed""] is passed | assert len(report[""warnings""]) == (2 if passed else 0) | assert [warning[""code""] for warning in report[""warnings""]] == [""row-tolerance-failure"", ""relative-rms-failure""] | assert report[""blocking_failures""] == [""U-global:Step-1:increment-1""]" "assert report[""precheck""][""passed""] | assert report[""blocking_passed""] is passed | assert len(report[""warnings""]) == (2 if passed else 0) | assert [warning[""code""] for warning in report[""warnings""]] == [""row-tolerance-failure"", ""relative-rms-failure""] | assert report[""blocking_failures""] == [""U-global:Step-1:increment-1""]" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_common_policy_boundaries_and_zero_scale test_common_policy_boundaries_and_zero_scale; assertion 0개 tests/test_compare_hht_dynamic.py test_common_policy_boundaries_and_zero_scale 유지 원문 검사 body 및 assertion 동일. 626203451410090b9aff637c9d93892a57f99a387fa004f091a6f66044929ea5 626203451410090b9aff637c9d93892a57f99a387fa004f091a6f66044929ea5 "assert near[""passed""] | assert [row[""branch""] for row in near[""rows""]] == [""relative"", ""near-zero"", ""near-zero""] | assert relative[""rows_passed""] and not relative[""rms_passed""] | assert boundary[""passed""] | assert boundary[""relative_rms""] == 0.01 | assert outside[""rows_passed""] and not outside[""rms_passed""] | assert zero[""passed""] and zero[""relative_rms""] is None | assert not nonzero[""passed""] | assert nonzero[""diagnostic_code""] == ""zero-reference-scale-nonzero-error""" "assert near[""passed""] | assert [row[""branch""] for row in near[""rows""]] == [""relative"", ""near-zero"", ""near-zero""] | assert relative[""rows_passed""] and not relative[""rms_passed""] | assert boundary[""passed""] | assert boundary[""relative_rms""] == 0.01 | assert outside[""rows_passed""] and not outside[""rms_passed""] | assert zero[""passed""] and zero[""relative_rms""] is None | assert not nonzero[""passed""] | assert nonzero[""diagnostic_code""] == ""zero-reference-scale-nonzero-error""" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py test_cli_writes_json_and_exit_two_for_missing_results test_cli_writes_json_and_exit_two_for_missing_results; assertion 0개 tests/test_compare_hht_dynamic.py test_cli_writes_json_and_exit_two_for_missing_results 유지 원문 검사 body 및 assertion 동일. 7c7fb2cc6f1f7c6611d524de5342a2ad2ebbd4a7fab21595190d6373f16e91c8 7c7fb2cc6f1f7c6611d524de5342a2ad2ebbd4a7fab21595190d6373f16e91c8 "assert completed.returncode == 2, completed.stderr | assert not evidence[""precheck""][""passed""] | assert evidence[""families""] == []" "assert completed.returncode == 2, completed.stderr | assert not evidence[""precheck""][""passed""] | assert evidence[""families""] == []" 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/test_compare_hht_dynamic.py support@1-17 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/test_compare_hht_dynamic.py file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8915eca10fabc7d88e164dc7e9fe54e9f9485a879b4b05a29eed1b655a6695fd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-비교계약 R-COMPARISON test-cleanup-review.md#r-comparison +Refactor tests/unit/analysis/analysis_model_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/analysis/analysis_model_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 008c38d245f54595a9a057575e264b408f235df5e9ff4fad3ef342ab6ff4301a 008c38d245f54595a9a057575e264b408f235df5e9ff4fad3ef342ab6ff4301a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ClassifiesActiveEntitiesInStableOrder AnalysisModel.ClassifiesActiveEntitiesInStableOrder; assertion 9개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ClassifiesActiveEntitiesInStableOrder 유지 원문 검사 body 및 assertion 동일. a295d00387546de59b989c3ac1abc3835489a6a9cc331a2b564b4ab6f5b76497 a295d00387546de59b989c3ac1abc3835489a6a9cc331a2b564b4ab6f5b76497 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveSections(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveBoundaryConditions(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U})) | EXPECT_EQ(model.ActiveLoads(), (std::vector{0U, 1U, 2U})) | ASSERT_EQ(model.Step().Loads().size(), 3U) | EXPECT_EQ(&model.Step().Loads()[0U].get(), &domain_result.Value().Steps()[0U].Loads()[0U].get()) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveSections(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveBoundaryConditions(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U})) | EXPECT_EQ(model.ActiveLoads(), (std::vector{0U, 1U, 2U})) | ASSERT_EQ(model.Step().Loads().size(), 3U) | EXPECT_EQ(&model.Step().Loads()[0U].get(), &domain_result.Value().Steps()[0U].Loads()[0U].get()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain; assertion 12개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain 유지 원문 검사 body 및 assertion 동일. f48acbdd2020c7f7dcf6795c0bcb2efd01e531fca508a98469183cadaa6af312 f48acbdd2020c7f7dcf6795c0bcb2efd01e531fca508a98469183cadaa6af312 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(&model.Step(), &domain.Steps()[0]) | EXPECT_EQ(&model.GetDomain().Elements()[0U], element_address) | EXPECT_EQ(&model.GetDomain().Materials()[0U], material_address) | EXPECT_EQ(&model.GetDomain().Sections()[0U], section_address) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[1]], &domain.Elements()[1]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[2]], &domain.Materials()[2]) | EXPECT_EQ(&model.GetDomain().Sections()[model.ActiveSections()[1]], &domain.Sections()[1]) | EXPECT_EQ(domain.Steps()[0].Name(), step_name) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[0U], first_load_magnitude) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(&model.Step(), &domain.Steps()[0]) | EXPECT_EQ(&model.GetDomain().Elements()[0U], element_address) | EXPECT_EQ(&model.GetDomain().Materials()[0U], material_address) | EXPECT_EQ(&model.GetDomain().Sections()[0U], section_address) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[1]], &domain.Elements()[1]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[2]], &domain.Materials()[2]) | EXPECT_EQ(&model.GetDomain().Sections()[model.ActiveSections()[1]], &domain.Sections()[1]) | EXPECT_EQ(domain.Steps()[0].Name(), step_name) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[0U], first_load_magnitude) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_model_test.cpp AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices; assertion 9개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices 유지 원문 검사 body 및 assertion 동일. 36df6ff3f545836b79af2c8987b7bc0042b748e43cc1a2a8a83f2679904abb16 36df6ff3f545836b79af2c8987b7bc0042b748e43cc1a2a8a83f2679904abb16 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U, 4U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveProperties(), (std::vector{0U, 1U, 2U, 4U})) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[4U]], &domain.Elements()[4U]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[1U]], &domain.Materials()[1U]) | EXPECT_EQ(&model.GetDomain().Properties()[model.ActiveProperties()[3U]], &domain.Properties()[4U]) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(&model.GetDomain(), &domain) | EXPECT_EQ(model.ActiveElements(), (std::vector{0U, 1U, 2U, 3U, 4U})) | EXPECT_EQ(model.ActiveMaterials(), (std::vector{0U, 1U, 2U})) | EXPECT_EQ(model.ActiveProperties(), (std::vector{0U, 1U, 2U, 4U})) | EXPECT_EQ(&model.GetDomain().Elements()[model.ActiveElements()[4U]], &domain.Elements()[4U]) | EXPECT_EQ(&model.GetDomain().Materials()[model.ActiveMaterials()[1U]], &domain.Materials()[1U]) | EXPECT_EQ(&model.GetDomain().Properties()[model.ActiveProperties()[3U]], &domain.Properties()[4U]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_model_test.cpp AnalysisModel.RejectsMissingOrMultipleStep AnalysisModel.RejectsMissingOrMultipleStep; assertion 15개 tests/unit/analysis/analysis_model_test.cpp AnalysisModel.RejectsMissingOrMultipleStep 유지 원문 검사 body 및 assertion 동일. 0815824dc498c89c2c43b00880b4458ce2b620a55e337c0a65de481074bb5318 0815824dc498c89c2c43b00880b4458ce2b620a55e337c0a65de481074bb5318 "ASSERT_TRUE(missing_domain.HasValue()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""invalid-model-cardinality"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].entity_identity, ""0"") | ASSERT_TRUE(multiple_domain.HasValue()) | ASSERT_FALSE(multiple.HasValue()) | EXPECT_EQ(multiple.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(multiple.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].code, ""unsupported-multiple-step"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].entity_identity, ""Step-2"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].location.line, 60U)" "ASSERT_TRUE(missing_domain.HasValue()) | ASSERT_FALSE(missing.HasValue()) | EXPECT_EQ(missing.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(missing.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].code, ""invalid-model-cardinality"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(missing.GetStatus().Diagnostics()[0].entity_identity, ""0"") | ASSERT_TRUE(multiple_domain.HasValue()) | ASSERT_FALSE(multiple.HasValue()) | EXPECT_EQ(multiple.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(multiple.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].code, ""unsupported-multiple-step"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].keyword, ""STEP"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].entity_identity, ""Step-2"") | EXPECT_EQ(multiple.GetStatus().Diagnostics()[0].location.line, 60U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_model_test.cpp support@1-94 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, MakeMixedDefinition tests/unit/analysis/analysis_model_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 06aad822bf2ade2c6877393bd23043babd0680f2b0dd2fb85a7f4cda1d5a6287 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_model_test.cpp support@148-149 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/analysis_model_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c4948f64c25c201003b0122f19efe90f365b9e8c9e4aeb1f21a6cffa974d706a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/analysis/analysis_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cc752a188e4daa7862e6602271a728de64f67de407ab7e573e9f87380d2b5bbb cc752a188e4daa7862e6602271a728de64f67de407ab7e573e9f87380d2b5bbb 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_state_test.cpp AnalysisState.AllocatesOnlyV0FullVectors AnalysisState.AllocatesOnlyV0FullVectors; assertion 14개 tests/unit/analysis/analysis_state_test.cpp AnalysisState.AllocatesOnlyV0FullVectors 유지 원문 검사 body 및 assertion 동일. 42f5f3563e7bf05df3559cd1173b200e4625be35cbe6ebf91140bb4275cc7961 42f5f3563e7bf05df3559cd1173b200e4625be35cbe6ebf91140bb4275cc7961 ASSERT_EQ(dofs.FullDofCount(), 12U) | ASSERT_EQ(dofs.ConstrainedDofCount(), 6U) | EXPECT_EQ(vector->Size(), dofs.FullDofCount()) | EXPECT_NE(vectors[left]->Data(), vectors[right]->Data()) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 4.0) | EXPECT_DOUBLE_EQ(state.Reaction()[11], -9.0) | EXPECT_DOUBLE_EQ(state.ExternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[0], 0.0) | EXPECT_FALSE(HasVelocity::value) | EXPECT_FALSE(HasAcceleration::value) | EXPECT_FALSE(HasTemperature::value) | EXPECT_FALSE(HasIterationHistory::value) | EXPECT_FALSE(HasNonlinearState::value) ASSERT_EQ(dofs.FullDofCount(), 12U) | ASSERT_EQ(dofs.ConstrainedDofCount(), 6U) | EXPECT_EQ(vector->Size(), dofs.FullDofCount()) | EXPECT_NE(vectors[left]->Data(), vectors[right]->Data()) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 4.0) | EXPECT_DOUBLE_EQ(state.Reaction()[11], -9.0) | EXPECT_DOUBLE_EQ(state.ExternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[0], 0.0) | EXPECT_FALSE(HasVelocity::value) | EXPECT_FALSE(HasAcceleration::value) | EXPECT_FALSE(HasTemperature::value) | EXPECT_FALSE(HasIterationHistory::value) | EXPECT_FALSE(HasNonlinearState::value) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_state_test.cpp AnalysisState.CopiesOrMovesWithoutAliasing AnalysisState.CopiesOrMovesWithoutAliasing; assertion 17개 tests/unit/analysis/analysis_state_test.cpp AnalysisState.CopiesOrMovesWithoutAliasing 유지 원문 검사 body 및 assertion 동일. 20bcbe30286b42f64657a68599fd57793c882e3a0a1e6eab8a654ad6909dc75b 20bcbe30286b42f64657a68599fd57793c882e3a0a1e6eab8a654ad6909dc75b "EXPECT_NE(copied.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(copied.Reaction().Data(), original.Reaction().Data()) | EXPECT_NE(copied.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_NE(copied.GaussResults().data(), original.GaussResults().data()) | EXPECT_NE(copied.StressResults().data(), original.StressResults().data()) | EXPECT_DOUBLE_EQ(original.Displacement()[0], 3.0) | EXPECT_DOUBLE_EQ(original.EndpointResults()[0].end_action[0], 1.0) | EXPECT_EQ(moved.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(moved.Displacement()[0], 30.0) | EXPECT_DOUBLE_EQ(moved.EndpointResults()[0].end_action[0], 20.0) | EXPECT_NE(moved.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(moved.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_DOUBLE_EQ(original.Reaction()[11], -2.0) | EXPECT_EQ(copy_assigned.Identity().step_name, ""Step-1"") | EXPECT_EQ(move_assigned.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(move_assigned.Reaction()[11], -20.0) | EXPECT_NE(move_assigned.Reaction().Data(), original.Reaction().Data())" "EXPECT_NE(copied.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(copied.Reaction().Data(), original.Reaction().Data()) | EXPECT_NE(copied.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_NE(copied.GaussResults().data(), original.GaussResults().data()) | EXPECT_NE(copied.StressResults().data(), original.StressResults().data()) | EXPECT_DOUBLE_EQ(original.Displacement()[0], 3.0) | EXPECT_DOUBLE_EQ(original.EndpointResults()[0].end_action[0], 1.0) | EXPECT_EQ(moved.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(moved.Displacement()[0], 30.0) | EXPECT_DOUBLE_EQ(moved.EndpointResults()[0].end_action[0], 20.0) | EXPECT_NE(moved.Displacement().Data(), original.Displacement().Data()) | EXPECT_NE(moved.EndpointResults().data(), original.EndpointResults().data()) | EXPECT_DOUBLE_EQ(original.Reaction()[11], -2.0) | EXPECT_EQ(copy_assigned.Identity().step_name, ""Step-1"") | EXPECT_EQ(move_assigned.Identity().step_name, ""Step-1"") | EXPECT_DOUBLE_EQ(move_assigned.Reaction()[11], -20.0) | EXPECT_NE(move_assigned.Reaction().Data(), original.Reaction().Data())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_state_test.cpp support@1-86 helper/oracle/fixture/include/static assertion 구간: T, HasVelocity, HasAcceleration, HasTemperature, HasIterationHistory, HasNonlinearState, MakeDofs, ExpectAllZero tests/unit/analysis/analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 01765d678413b708d354a9af35eb64ecfc588a1ed7d472b484ac590a620701ff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/analysis/analysis_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7fa4c3708ec692f95b5c230c7d7c36f1ef665363228d1d26eea41fe5560eedfd 7fa4c3708ec692f95b5c230c7d7c36f1ef665363228d1d26eea41fe5560eedfd 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_test.cpp Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis; assertion 7개 tests/unit/analysis/analysis_test.cpp Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis 유지 원문 검사 body 및 assertion 동일. 946fa72dea150d4bb8404a904b626c9d3037ae9eb3b765a68e288560e7b21975 946fa72dea150d4bb8404a904b626c9d3037ae9eb3b765a68e288560e7b21975 "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""analysis-test-failure"") | EXPECT_EQ(concrete_observer->Request().input_path, request.input_path) | EXPECT_EQ(concrete_observer->Request().output_path, request.output_path) | EXPECT_TRUE(destroyed)" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""analysis-test-failure"") | EXPECT_EQ(concrete_observer->Request().input_path, request.input_path) | EXPECT_EQ(concrete_observer->Request().output_path, request.output_path) | EXPECT_TRUE(destroyed)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp AnalysisProcedure.PreparedConsumerPreservesDomainFailureAndLifetime AnalysisProcedure.PreparedConsumerPreservesDomainFailureAndLifetime; assertion 11개 tests/unit/analysis/analysis_test.cpp AnalysisProcedure.PreparedConsumerPreservesDomainFailureAndLifetime 유지 원문 검사 body 및 assertion 동일. 0835fdd74c95442a58be5105ad47ca39d84a8591a9fef11dc839820f2e02c01a 0835fdd74c95442a58be5105ad47ca39d84a8591a9fef11dc839820f2e02c01a "ASSERT_TRUE(domain_result.HasValue()) | EXPECT_EQ(observed, &domain) | ASSERT_FALSE(outcome.HasValue()) | EXPECT_EQ(outcome.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(outcome.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""procedure-original-failure"") | EXPECT_EQ(diagnostic.keyword, ""ORIGINAL"") | EXPECT_EQ(diagnostic.entity_identity, ""source-identity"") | EXPECT_EQ(diagnostic.message, ""Original failure message."") | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" "ASSERT_TRUE(domain_result.HasValue()) | EXPECT_EQ(observed, &domain) | ASSERT_FALSE(outcome.HasValue()) | EXPECT_EQ(outcome.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(outcome.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""procedure-original-failure"") | EXPECT_EQ(diagnostic.keyword, ""ORIGINAL"") | EXPECT_EQ(diagnostic.entity_identity, ""source-identity"") | EXPECT_EQ(diagnostic.message, ""Original failure message."") | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp EquilibriumAlgorithm.RetainsMoveOnlyCandidateUntilProcedureTakesIt EquilibriumAlgorithm.RetainsMoveOnlyCandidateUntilProcedureTakesIt; assertion 6개 tests/unit/analysis/analysis_test.cpp EquilibriumAlgorithm.RetainsMoveOnlyCandidateUntilProcedureTakesIt 유지 원문 검사 body 및 assertion 동일. cf0bd4a0f259033db8884adb1d02051869fff7d04d8d7f1049d54fcc0b5000f4 cf0bd4a0f259033db8884adb1d02051869fff7d04d8d7f1049d54fcc0b5000f4 EXPECT_FALSE(step.HasCandidate()) | ASSERT_TRUE(step.Solve(base).IsOk()) | EXPECT_EQ(observed, (std::vector{1U, 2U, 3U})) | ASSERT_TRUE(step.HasCandidate()) | ASSERT_NE(accepted, nullptr) | EXPECT_EQ(*accepted, 42) EXPECT_FALSE(step.HasCandidate()) | ASSERT_TRUE(step.Solve(base).IsOk()) | EXPECT_EQ(observed, (std::vector{1U, 2U, 3U})) | ASSERT_TRUE(step.HasCandidate()) | ASSERT_NE(accepted, nullptr) | EXPECT_EQ(*accepted, 42) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp EquilibriumAlgorithm.FirstFailedEvaluationLeavesNoAcceptedCandidate EquilibriumAlgorithm.FirstFailedEvaluationLeavesNoAcceptedCandidate; assertion 7개 tests/unit/analysis/analysis_test.cpp EquilibriumAlgorithm.FirstFailedEvaluationLeavesNoAcceptedCandidate 유지 원문 검사 body 및 assertion 동일. a9ea9287cab2c7c7d29f9c4f7a9fa4b157574c53b3ecf22937fe7194ecfbd0c8 a9ea9287cab2c7c7d29f9c4f7a9fa4b157574c53b3ecf22937fe7194ecfbd0c8 "EXPECT_EQ(observed, (std::vector{1U})) | EXPECT_FALSE(step.HasCandidate()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0].code, ""first-evaluation-failure"") | EXPECT_EQ(status.Diagnostics()[0].entity_identity, ""original-owner"") | EXPECT_EQ(status.Diagnostics()[0].message, ""Original evaluation failure."")" "EXPECT_EQ(observed, (std::vector{1U})) | EXPECT_FALSE(step.HasCandidate()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0].code, ""first-evaluation-failure"") | EXPECT_EQ(status.Diagnostics()[0].entity_identity, ""original-owner"") | EXPECT_EQ(status.Diagnostics()[0].message, ""Original evaluation failure."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp EquilibriumAlgorithm.InjectsAlternativeOrderAndPreservesTypedPendingOnFailure EquilibriumAlgorithm.InjectsAlternativeOrderAndPreservesTypedPendingOnFailure; assertion 11개 tests/unit/analysis/analysis_test.cpp EquilibriumAlgorithm.InjectsAlternativeOrderAndPreservesTypedPendingOnFailure 유지 원문 검사 body 및 assertion 동일. 0f11b4a60c58ba9d453161dc48b5fbdff6b859ac9328111c05b28a152a3b6de0 0f11b4a60c58ba9d453161dc48b5fbdff6b859ac9328111c05b28a152a3b6de0 ASSERT_TRUE(step.Solve(*policy).IsOk()) | EXPECT_EQ(observed, (std::vector{0U, 3U})) | EXPECT_EQ(observed, (std::vector{0U, 3U})) | ASSERT_TRUE(step.HasCandidate()) | EXPECT_EQ(*step.TakeCandidate(), 42) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed) | ASSERT_TRUE(zero_step.Solve(zero_algorithm).IsOk()) | EXPECT_EQ(zero_observed, (std::vector{0U, 1U, 2U})) | ASSERT_TRUE(zero_step.HasCandidate()) | EXPECT_EQ(zero_step.TakeCandidate(), 7) ASSERT_TRUE(step.Solve(*policy).IsOk()) | EXPECT_EQ(observed, (std::vector{0U, 3U})) | EXPECT_EQ(observed, (std::vector{0U, 3U})) | ASSERT_TRUE(step.HasCandidate()) | EXPECT_EQ(*step.TakeCandidate(), 42) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed) | ASSERT_TRUE(zero_step.Solve(zero_algorithm).IsOk()) | EXPECT_EQ(zero_observed, (std::vector{0U, 1U, 2U})) | ASSERT_TRUE(zero_step.HasCandidate()) | EXPECT_EQ(zero_step.TakeCandidate(), 7) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp ProcedureIntegratorInjection.ShellValuesUseProductionStepAndPreserveHistory ProcedureIntegratorInjection.ShellValuesUseProductionStepAndPreserveHistory; assertion 28개 tests/unit/analysis/analysis_test.cpp ProcedureIntegratorInjection.ShellValuesUseProductionStepAndPreserveHistory 유지 원문 검사 body 및 assertion 동일. a94f0fe856ad7d4058f5f31a03c1f0f08ef2ecc3d75114c505ff8d8bce4c820d a94f0fe856ad7d4058f5f31a03c1f0f08ef2ecc3d75114c505ff8d8bce4c820d "EXPECT_EQ(&history, &old) | EXPECT_EQ(&p, ¶meters) | EXPECT_DOUBLE_EQ(h, 17) | EXPECT_EQ(&request.history, &old) | EXPECT_EQ(&request.chart, &chart) | EXPECT_EQ(&request.trial_algorithmic, &algorithmic) | EXPECT_EQ(&request.retained_velocity, &retained_v) | EXPECT_EQ(&request.retained_acceleration, &retained_a) | EXPECT_EQ(&request.parameters, ¶meters) | EXPECT_DOUBLE_EQ(request.h, 17) | EXPECT_FALSE(request.copy_translation_rates) | EXPECT_NE(velocity.Data(), acceleration.Data()) | EXPECT_NE(velocity.Data(), request.vpp.Data()) | EXPECT_NE(acceleration.Data(), request.trial_algorithmic.Data()) | EXPECT_EQ(&c, &chart) | EXPECT_EQ(&r, &root) | EXPECT_EQ(&backend, &solver) | EXPECT_EQ(v_data, rates.velocity.Data()) | EXPECT_EQ(a_data, rates.acceleration.Data()) | ASSERT_TRUE(shell_value::RunReducedHhtStep(*integrator, old, 17, parameters, evaluate, commit).IsOk()) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""reconstruct"", ""commit""})) | ASSERT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""reconstruct""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""reconstruct"", ""commit""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" "EXPECT_EQ(&history, &old) | EXPECT_EQ(&p, ¶meters) | EXPECT_DOUBLE_EQ(h, 17) | EXPECT_EQ(&request.history, &old) | EXPECT_EQ(&request.chart, &chart) | EXPECT_EQ(&request.trial_algorithmic, &algorithmic) | EXPECT_EQ(&request.retained_velocity, &retained_v) | EXPECT_EQ(&request.retained_acceleration, &retained_a) | EXPECT_EQ(&request.parameters, ¶meters) | EXPECT_DOUBLE_EQ(request.h, 17) | EXPECT_FALSE(request.copy_translation_rates) | EXPECT_NE(velocity.Data(), acceleration.Data()) | EXPECT_NE(velocity.Data(), request.vpp.Data()) | EXPECT_NE(acceleration.Data(), request.trial_algorithmic.Data()) | EXPECT_EQ(&c, &chart) | EXPECT_EQ(&r, &root) | EXPECT_EQ(&backend, &solver) | EXPECT_EQ(v_data, rates.velocity.Data()) | EXPECT_EQ(a_data, rates.acceleration.Data()) | ASSERT_TRUE(shell_value::RunReducedHhtStep(*integrator, old, 17, parameters, evaluate, commit).IsOk()) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""reconstruct"", ""commit""})) | ASSERT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""reconstruct""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""reconstruct"", ""commit""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp ProcedureIntegratorInjection.SolidPairedValuesUseProductionStepAndPreserveHistory ProcedureIntegratorInjection.SolidPairedValuesUseProductionStepAndPreserveHistory; assertion 18개 tests/unit/analysis/analysis_test.cpp ProcedureIntegratorInjection.SolidPairedValuesUseProductionStepAndPreserveHistory 유지 원문 검사 body 및 assertion 동일. c1f6fefeb375372f008e812939ed19d2821d59b71d633de05ea6caded90255a5 c1f6fefeb375372f008e812939ed19d2821d59b71d633de05ea6caded90255a5 "EXPECT_EQ(&frame, &old) | EXPECT_EQ(&p, ¶meters) | EXPECT_DOUBLE_EQ(h, 17) | EXPECT_EQ(&old_a, &old.acceleration) | EXPECT_EQ(&old_a_low, &old.low.acceleration) | EXPECT_EQ(&p, ¶meters) | EXPECT_DOUBLE_EQ(h, 17) | ASSERT_TRUE(fesa::detail::RunSolidHhtStep(*integrator, old, 17, parameters, failure, evaluate, commit).IsOk()) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""commit""})) | ASSERT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""predict-failure""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""commit""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" "EXPECT_EQ(&frame, &old) | EXPECT_EQ(&p, ¶meters) | EXPECT_DOUBLE_EQ(h, 17) | EXPECT_EQ(&old_a, &old.acceleration) | EXPECT_EQ(&old_a_low, &old.low.acceleration) | EXPECT_EQ(&p, ¶meters) | EXPECT_DOUBLE_EQ(h, 17) | ASSERT_TRUE(fesa::detail::RunSolidHhtStep(*integrator, old, 17, parameters, failure, evaluate, commit).IsOk()) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""commit""})) | ASSERT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""predict-failure""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""predict"", ""rates"", ""commit""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp ProcedureIntegratorInjection.HeatValuesUseProductionRecoveryCommitAndPreserveHistory ProcedureIntegratorInjection.HeatValuesUseProductionRecoveryCommitAndPreserveHistory; assertion 44개 tests/unit/analysis/analysis_test.cpp ProcedureIntegratorInjection.HeatValuesUseProductionRecoveryCommitAndPreserveHistory 유지 원문 검사 body 및 assertion 동일. ca98008566955e437f9faaa1aabf54305988d72549a7440880ffbf244c57949a ca98008566955e437f9faaa1aabf54305988d72549a7440880ffbf244c57949a "ASSERT_TRUE(matrix.HasValue()) | EXPECT_EQ(&supplied, &system) | EXPECT_EQ(&p, &partition) | EXPECT_EQ(&previous, &old) | EXPECT_EQ(&backend, &solver) | EXPECT_EQ(&workspace, &cache) | EXPECT_DOUBLE_EQ(delta, 17) | EXPECT_EQ(&supplied.k, &k) | EXPECT_EQ(&supplied.c, &c) | EXPECT_EQ(&supplied.q, &q) | EXPECT_EQ(supplied.k_error, nullptr) | EXPECT_EQ(supplied.c_error, nullptr) | EXPECT_EQ(supplied.q_error, nullptr) | EXPECT_EQ(p.free, (std::vector{0, 1})) | EXPECT_TRUE(p.constrained.empty()) | EXPECT_EQ(p.prescribed.Size(), 0U) | EXPECT_DOUBLE_EQ(e.beta_cert, 31) | EXPECT_DOUBLE_EQ(e.beta_limit, 32) | EXPECT_DOUBLE_EQ(e.free_residual_cert, 33) | EXPECT_DOUBLE_EQ(e.full_free_residual_cert, 34) | EXPECT_DOUBLE_EQ(e.full_beta_cert, 35) | EXPECT_DOUBLE_EQ(e.operator_construction_error, 36) | EXPECT_DOUBLE_EQ(e.rhs_construction_error, 37) | EXPECT_DOUBLE_EQ(e.construction_identity_bound, 38) | EXPECT_DOUBLE_EQ(e.energy_change, 39) | EXPECT_DOUBLE_EQ(e.energy_defect, 40) | EXPECT_DOUBLE_EQ(e.energy_bound, 41) | EXPECT_TRUE(e.dissipation_checked) | EXPECT_DOUBLE_EQ(e.dissipation_defect, 42) | EXPECT_DOUBLE_EQ(e.dissipation_bound, 43) | EXPECT_EQ(flux.size(), 1U) | EXPECT_EQ(value.Components(), (std::array{51, 52, 53})) | ASSERT_TRUE(heat_value::RunThermalStep(*integrator, system, partition, old, 17, solver, cache, recovery, commit).IsOk()) | EXPECT_EQ(events, (std::vector{""solve"", ""recovery"", ""commit""})) | ASSERT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""solve""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""solve"", ""recovery""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""solve"", ""recovery"", ""commit""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_FALSE(cache.matrix.has_value()) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" "ASSERT_TRUE(matrix.HasValue()) | EXPECT_EQ(&supplied, &system) | EXPECT_EQ(&p, &partition) | EXPECT_EQ(&previous, &old) | EXPECT_EQ(&backend, &solver) | EXPECT_EQ(&workspace, &cache) | EXPECT_DOUBLE_EQ(delta, 17) | EXPECT_EQ(&supplied.k, &k) | EXPECT_EQ(&supplied.c, &c) | EXPECT_EQ(&supplied.q, &q) | EXPECT_EQ(supplied.k_error, nullptr) | EXPECT_EQ(supplied.c_error, nullptr) | EXPECT_EQ(supplied.q_error, nullptr) | EXPECT_EQ(p.free, (std::vector{0, 1})) | EXPECT_TRUE(p.constrained.empty()) | EXPECT_EQ(p.prescribed.Size(), 0U) | EXPECT_DOUBLE_EQ(e.beta_cert, 31) | EXPECT_DOUBLE_EQ(e.beta_limit, 32) | EXPECT_DOUBLE_EQ(e.free_residual_cert, 33) | EXPECT_DOUBLE_EQ(e.full_free_residual_cert, 34) | EXPECT_DOUBLE_EQ(e.full_beta_cert, 35) | EXPECT_DOUBLE_EQ(e.operator_construction_error, 36) | EXPECT_DOUBLE_EQ(e.rhs_construction_error, 37) | EXPECT_DOUBLE_EQ(e.construction_identity_bound, 38) | EXPECT_DOUBLE_EQ(e.energy_change, 39) | EXPECT_DOUBLE_EQ(e.energy_defect, 40) | EXPECT_DOUBLE_EQ(e.energy_bound, 41) | EXPECT_TRUE(e.dissipation_checked) | EXPECT_DOUBLE_EQ(e.dissipation_defect, 42) | EXPECT_DOUBLE_EQ(e.dissipation_bound, 43) | EXPECT_EQ(flux.size(), 1U) | EXPECT_EQ(value.Components(), (std::array{51, 52, 53})) | ASSERT_TRUE(heat_value::RunThermalStep(*integrator, system, partition, old, 17, solver, cache, recovery, commit).IsOk()) | EXPECT_EQ(events, (std::vector{""solve"", ""recovery"", ""commit""})) | ASSERT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""solve""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""solve"", ""recovery""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_EQ(events, (std::vector{""solve"", ""recovery"", ""commit""})) | EXPECT_EQ(history.size(), 1U) | EXPECT_FALSE(cache.matrix.has_value()) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/analysis_test.cpp support@1-51 helper/oracle/fixture/include/static assertion 구간: StatusAnalysis tests/unit/analysis/analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1f9bcf41d5b9d4c5c4dd1f5f6fc2f59e4256ec4061745837f86e04644e130450 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_test.cpp support@79-113 helper/oracle/fixture/include/static assertion 구간: ObservedProcedure tests/unit/analysis/analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4502cb928dc48ff07cc73fa7959747b8297a3f4cff51595860a4e2600f6a18a1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/analysis_test.cpp support@183-340 helper/oracle/fixture/include/static assertion 구간: InjectionFailure, ExpectInjectionFailure, ExpectValueVector, NeverCalledLinear, NeverCalledTangent, SelectedOrderAlgorithm, shell_value, ValueShellIntegrator, ValueSolidIntegrator, heat_value, ValueHeatIntegrator tests/unit/analysis/analysis_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8f3567a998f77ac0108671b3754e8bff34b3b5488709883977373db21caefd18 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/analysis/dynamic_analysis_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 25e30b540c37be5c7699132ddf7c5da319a4a1bf3fb8988b054c8e9941ca594f 25e30b540c37be5c7699132ddf7c5da319a4a1bf3fb8988b054c8e9941ca594f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsUnknownOrChangingIntegrationFormulation DynamicAnalysisState.RejectsUnknownOrChangingIntegrationFormulation; assertion 6개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsUnknownOrChangingIntegrationFormulation 유지 원문 검사 body 및 assertion 동일. b299952d9c0f3e19395a6d489944cf36625188d909376ec71022cdfc3c04478e b299952d9c0f3e19395a6d489944cf36625188d909376ec71022cdfc3c04478e EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(next).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_TRUE(fixture.state.CommitAcceptedFrame(next).IsOk()) EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(next).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_TRUE(fixture.state.CommitAcceptedFrame(next).IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.DefaultStateRejectsTrialAndCommit DynamicAnalysisState.DefaultStateRejectsTrialAndCommit; assertion 7개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.DefaultStateRejectsTrialAndCommit 유지 원문 검사 body 및 assertion 동일. b4737286e2144fd021d33353dc82bdd2e178140858c8f7abd06756e0ce44a186 b4737286e2144fd021d33353dc82bdd2e178140858c8f7abd06756e0ce44a186 "EXPECT_FALSE(state.IsInitialized()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_FALSE(state.BeginTrialFromCommitted().HasValue()) | EXPECT_THROW((void)state.CommittedState(), std::logic_error) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"")" "EXPECT_FALSE(state.IsInitialized()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_FALSE(state.BeginTrialFromCommitted().HasValue()) | EXPECT_THROW((void)state.CommittedState(), std::logic_error) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CommitsCompleteZeroCorrectionHistoryAndCopiesTrials DynamicAnalysisState.CommitsCompleteZeroCorrectionHistoryAndCopiesTrials; assertion 11개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CommitsCompleteZeroCorrectionHistoryAndCopiesTrials 유지 원문 검사 body 및 assertion 동일. 6724599255887b6bf6c6e95acb67cf1a050081f3bbb2af3617e3abd7d2c2f4be 6724599255887b6bf6c6e95acb67cf1a050081f3bbb2af3617e3abd7d2c2f4be EXPECT_TRUE(fixture.state.IsInitialized()) | EXPECT_FALSE(fixture.state.BeginTrialFromCommitted().HasValue()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), index + 1U) | ASSERT_TRUE(trial.HasValue()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().generalized_coordinates[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState() .shell_results[0U] .stress[0U] .components[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.5) | EXPECT_FALSE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 3U)).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 3U) EXPECT_TRUE(fixture.state.IsInitialized()) | EXPECT_FALSE(fixture.state.BeginTrialFromCommitted().HasValue()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), index + 1U) | ASSERT_TRUE(trial.HasValue()) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().generalized_coordinates[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState() .shell_results[0U] .stress[0U] .components[0U], 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.5) | EXPECT_FALSE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 3U)).IsOk()) | EXPECT_EQ(fixture.state.AcceptedFrames().size(), 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsMalformedInventoryScheduleAndPreservesEndpoint DynamicAnalysisState.RejectsMalformedInventoryScheduleAndPreservesEndpoint; assertion 8개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsMalformedInventoryScheduleAndPreservesEndpoint 유지 원문 검사 body 및 assertion 동일. ebf23f327fb58c09d0aa92da9d41f6059c31e1ff89f221511925e93e12b65922 ebf23f327fb58c09d0aa92da9d41f6059c31e1ff89f221511925e93e12b65922 "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"") | ASSERT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 1U)).IsOk())" "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-invalid-state"") | ASSERT_EQ(fixture.state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().time, 0.0) | EXPECT_DOUBLE_EQ(fixture.state.CommittedState().reaction[2U], -4.0) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 1U)).IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsInvalidInitialStateAndFreeReaction DynamicAnalysisState.RejectsInvalidInitialStateAndFreeReaction; assertion 6개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.RejectsInvalidInitialStateAndFreeReaction 유지 원문 검사 body 및 assertion 동일. 7651255fed1f126aeef752981e055c05207296c59c2ea57c8ece5b759bf5050e 7651255fed1f126aeef752981e055c05207296c59c2ea57c8ece5b759bf5050e EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_FALSE(fixture.state.CommitAcceptedFrame(initial).IsOk()) | EXPECT_TRUE(fixture.state.AcceptedFrames().empty()) | EXPECT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CreateRejectsInvalidScheduleAndNonzeroBoundary DynamicAnalysisState.CreateRejectsInvalidScheduleAndNonzeroBoundary; assertion 4개 tests/unit/analysis/dynamic_analysis_state_test.cpp DynamicAnalysisState.CreateRejectsInvalidScheduleAndNonzeroBoundary 유지 원문 검사 body 및 assertion 동일. bbfb29c502216154504e82bbab6dc0df768128bc6ce0543958c4637ea1f32ef6 bbfb29c502216154504e82bbab6dc0df768128bc6ce0543958c4637ea1f32ef6 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_FALSE( fesa::DynamicAnalysisState::Create(domain.Value(), dofs.Value()) .HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_FALSE( fesa::DynamicAnalysisState::Create(domain.Value(), dofs.Value()) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp support@1-142 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, if, Fixture, MakeFixture, MakeFrame tests/unit/analysis/dynamic_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7a11e3f45e7410305d59981204ce69f453199fac55bfeaf62d2a5c8e6c409fa2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/dynamic_analysis_state_test.cpp support@321-322 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/dynamic_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/eigen_mass_assembly_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/analysis/eigen_mass_assembly_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8489602024286b7c66c26750ecbf627d361b893fa9083c7d2dd97d34bbe3c25e 8489602024286b7c66c26750ecbf627d361b893fa9083c7d2dd97d34bbe3c25e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/eigen_mass_assembly_test.cpp EigenMassAssembly.ScattersHeterogeneousSharedNodeMassInSourceOrder EigenMassAssembly.ScattersHeterogeneousSharedNodeMassInSourceOrder; assertion 9개 tests/unit/analysis/eigen_mass_assembly_test.cpp EigenMassAssembly.ScattersHeterogeneousSharedNodeMassInSourceOrder 유지 원문 검사 body 및 assertion 동일. 6d9e4d731b921c8e3a160847675ebe72b28977b65f3abdee8fc959a4a183b62f 6d9e4d731b921c8e3a160847675ebe72b28977b65f3abdee8fc959a4a183b62f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_LE(std::abs(expected.Value().mass - analytic_shared_rotary_mass) / analytic_shared_rotary_mass, 1e-12) | ASSERT_TRUE(state.HasValue()) | ASSERT_EQ(state.Value().free_dof_count, 1U) | ASSERT_EQ(state.Value().modes.size(), 1U) | EXPECT_LE(std::abs(state.Value().modes[0U].eigenvalue - expected_eigenvalue) / (std::abs(state.Value().modes[0U].eigenvalue) + std::abs(expected_eigenvalue)), 1e-12) | EXPECT_LE(std::abs(amplitude * amplitude * analytic_shared_rotary_mass - 1.0), 1e-12) | EXPECT_NEAR(eigenvalues[0U], eigenvalues[1U], 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_LE(std::abs(expected.Value().mass - analytic_shared_rotary_mass) / analytic_shared_rotary_mass, 1e-12) | ASSERT_TRUE(state.HasValue()) | ASSERT_EQ(state.Value().free_dof_count, 1U) | ASSERT_EQ(state.Value().modes.size(), 1U) | EXPECT_LE(std::abs(state.Value().modes[0U].eigenvalue - expected_eigenvalue) / (std::abs(state.Value().modes[0U].eigenvalue) + std::abs(expected_eigenvalue)), 1e-12) | EXPECT_LE(std::abs(amplitude * amplitude * analytic_shared_rotary_mass - 1.0), 1e-12) | EXPECT_NEAR(eigenvalues[0U], eigenvalues[1U], 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_mass_assembly_test.cpp support@1-148 helper/oracle/fixture/include/static assertion 구간: StatusText, SharedNodeDomain, SharedDofPencil, DirectSharedDofPencil tests/unit/analysis/eigen_mass_assembly_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 53cc183efe17e5050e7ea520df0757fe7dfdc9eba5668b6a1a2bcb51ae107667 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/eigen_mass_assembly_test.cpp support@179-180 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/eigen_mass_assembly_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/eigen_reduction_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/analysis/eigen_reduction_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c6d306df8de16086aaa2c1b8135de697180ed6576dce01cbbc550c0147469c30 deeb284988187961964b2a213d19e3b2655f399294debdc175e43be75dada796 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil; assertion 6개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.KeepsPositivePartialGlobalRotationAndOriginalPencil 유지 원문 검사 body 및 assertion 동일. 399fa920a441080dca52e78288f339ef61c0a5a2ffd35eac3374a02d2732c42a 399fa920a441080dca52e78288f339ef61c0a5a2ffd35eac3374a02d2732c42a ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_NEAR(result.Value().whitened_operator.Values()[0], 10369.0 / 450.0, 1e-12) | EXPECT_DOUBLE_EQ(y[i], 0.0) | EXPECT_NEAR(y[5U] * y[5U] * (3.0 / 50.0), 1.0, 1e-12) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_NEAR(result.Value().whitened_operator.Values()[0], 10369.0 / 450.0, 1e-12) | EXPECT_DOUBLE_EQ(y[i], 0.0) | EXPECT_NEAR(y[5U] * y[5U] * (3.0 / 50.0), 1.0, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RemovesOnlyActualFreeDirectorNull EigenReduction.RemovesOnlyActualFreeDirectorNull; assertion 7개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RemovesOnlyActualFreeDirectorNull 유지 원문 검사 body 및 assertion 동일. 471fdf9ca8aeae5af42703e726987365971308fc83bc8104410a6a1840e1082a 471fdf9ca8aeae5af42703e726987365971308fc83bc8104410a6a1840e1082a ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().free_count, 6U) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_NEAR(action[i], 7.0, 1e-12) | EXPECT_LE(result.Value().eta_kz, 1e-12) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, std::vector(6U, 0U), {0.25}, 2.0) .HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().free_count, 6U) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_NEAR(action[i], 7.0, 1e-12) | EXPECT_LE(result.Value().eta_kz, 1e-12) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, std::vector(6U, 0U), {0.25}, 2.0) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs; assertion 2개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.RejectsPositiveButUnresolvableMassWithoutDeletingDofs 유지 원문 검사 body 및 assertion 동일. f6d11adf25938f2049286ead08de4b4714864ca4b1322e18bf3633bcf7854c31 f6d11adf25938f2049286ead08de4b4714864ca4b1322e18bf3633bcf7854c31 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""eigen-mass-conditioning"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""eigen-mass-conditioning"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.WhitensOffDiagonalMassAndRestoresOriginalPencil EigenReduction.WhitensOffDiagonalMassAndRestoresOriginalPencil; assertion 7개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.WhitensOffDiagonalMassAndRestoresOriginalPencil 유지 원문 검사 body 및 assertion 동일. b5a7c3d712f378cd6568ccd879c6c7390686b963b0528af91c9a20bf8353e277 b5a7c3d712f378cd6568ccd879c6c7390686b963b0528af91c9a20bf8353e277 ASSERT_TRUE(reduction.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_EQ(eigen.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(eigen.Value().eigenvalues[0], 2.0, 1e-12) | EXPECT_NEAR(eigen.Value().eigenvalues[1], 10.0 / 3.0, 1e-12) | EXPECT_NEAR(q.Dot(mq), 1.0, 1e-12) | EXPECT_LE(residual.Norm(), 1e-12) ASSERT_TRUE(reduction.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_EQ(eigen.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(eigen.Value().eigenvalues[0], 2.0, 1e-12) | EXPECT_NEAR(eigen.Value().eigenvalues[1], 10.0 / 3.0, 1e-12) | EXPECT_NEAR(q.Dot(mq), 1.0, 1e-12) | EXPECT_LE(residual.Norm(), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PreservesSmallResolvablePositivePartialRotationMass EigenReduction.PreservesSmallResolvablePositivePartialRotationMass; assertion 4개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PreservesSmallResolvablePositivePartialRotationMass 유지 원문 검사 body 및 assertion 동일. aff919e78c5664fb5231773c44978a9d7cbf02ee6f62c4a2a94d2abb33948434 aff919e78c5664fb5231773c44978a9d7cbf02ee6f62c4a2a94d2abb33948434 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_GE(result.Value().nodes[0].record.rcond_inf, 0x1p-32) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 0U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 5U) | EXPECT_GE(result.Value().nodes[0].record.rcond_inf, 0x1p-32) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace; assertion 7개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace 유지 원문 검사 body 및 assertion 동일. 9291ee1eebaa0910609397a4c53ac7f706ee44b9c19994ed2c1976a7c0e8befe 9291ee1eebaa0910609397a4c53ac7f706ee44b9c19994ed2c1976a7c0e8befe "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, mask, {0.25}, 1.0) .HasValue()) | ASSERT_FALSE(empty.HasValue()) | EXPECT_EQ(empty.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(empty.GetStatus().Diagnostics()[0].code, ""empty-eigenproblem"")" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().null_count, 1U) | EXPECT_EQ(result.Value().whitened_operator.Rows(), 1U) | EXPECT_FALSE(fesa::eigen_internal::BuildEigenReduction( Sparse(stiffness), {mass}, {frame}, mask, {0.25}, 1.0) .HasValue()) | ASSERT_FALSE(empty.HasValue()) | EXPECT_EQ(empty.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(empty.GetStatus().Diagnostics()[0].code, ""empty-eigenproblem"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PureMassWhiteningRetainsInclusiveInfinityConditionGate EigenReduction.PureMassWhiteningRetainsInclusiveInfinityConditionGate; assertion 5개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PureMassWhiteningRetainsInclusiveInfinityConditionGate 유지 원문 검사 body 및 assertion 동일. 8d5801bc22534356f71705e0e72244253b4a9c9aae2bd601ca8e86d65824f457 8d5801bc22534356f71705e0e72244253b4a9c9aae2bd601ca8e86d65824f457 "EXPECT_EQ(reduced.HasValue(), diagonal >= 0x1p-32) | EXPECT_DOUBLE_EQ(reduced.Value().nodes[0].record.rcond_inf, diagonal) | EXPECT_NEAR(applied[0], 3.0, 1e-12) | EXPECT_NEAR(applied[1], 3.0, 1e-12) | EXPECT_EQ(reduced.GetStatus().Diagnostics()[0].code, ""eigen-mass-conditioning"")" "EXPECT_EQ(reduced.HasValue(), diagonal >= 0x1p-32) | EXPECT_DOUBLE_EQ(reduced.Value().nodes[0].record.rcond_inf, diagonal) | EXPECT_NEAR(applied[0], 3.0, 1e-12) | EXPECT_NEAR(applied[1], 3.0, 1e-12) | EXPECT_EQ(reduced.GetStatus().Diagnostics()[0].code, ""eigen-mass-conditioning"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PureOffDiagonalWhiteningMatchesAnalyticGramAndPencil EigenReduction.PureOffDiagonalWhiteningMatchesAnalyticGramAndPencil; assertion 8개 tests/unit/analysis/eigen_reduction_test.cpp EigenReduction.PureOffDiagonalWhiteningMatchesAnalyticGramAndPencil 유지 원문 검사 body 및 assertion 동일. e1fd9603a07186b94bc73be8913ab26c440e3383f2dffa976e8de8454fd4e545 e1fd9603a07186b94bc73be8913ab26c440e3383f2dffa976e8de8454fd4e545 ASSERT_TRUE(reduced.HasValue()) | EXPECT_NEAR(physical[0][0], 1.0 / std::sqrt(2.0), 1e-12) | EXPECT_NEAR(physical[0][1], 0.0, 1e-12) | EXPECT_NEAR(physical[1][0], -1.0 / std::sqrt(6.0), 1e-12) | EXPECT_NEAR(physical[1][1], 2.0 / std::sqrt(6.0), 1e-12) | EXPECT_NEAR(physical[row].Dot(mq), row == column ? 1.0 : 0.0, 1e-12) | EXPECT_NEAR(action[row], expected[row][column], 1e-12) | EXPECT_NEAR(action[row], physical[row].Dot(kq), 1e-12) ASSERT_TRUE(reduced.HasValue()) | EXPECT_NEAR(physical[0][0], 1.0 / std::sqrt(2.0), 1e-12) | EXPECT_NEAR(physical[0][1], 0.0, 1e-12) | EXPECT_NEAR(physical[1][0], -1.0 / std::sqrt(6.0), 1e-12) | EXPECT_NEAR(physical[1][1], 2.0 / std::sqrt(6.0), 1e-12) | EXPECT_NEAR(physical[row].Dot(mq), row == column ? 1.0 : 0.0, 1e-12) | EXPECT_NEAR(action[row], expected[row][column], 1e-12) | EXPECT_NEAR(action[row], physical[row].Dot(kq), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/eigen_reduction_test.cpp support@1-50 helper/oracle/fixture/include/static assertion 구간: Sparse, NodalMass, TiltedFrame tests/unit/analysis/eigen_reduction_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ec071e4e6d7f4391202a3a9d93789568081129769ce79baf2093b17de991fbca 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 20개 tests/unit/analysis/hht_dynamic_algebra_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e926831b44741880a7a729c57266c668eeeccc9130be07eacdb97c5330338ad2 e926831b44741880a7a729c57266c668eeeccc9130be07eacdb97c5330338ad2 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidPredictorPreservesRatesFixedDofsAndOldState HhtNewtonStart.ValidPredictorPreservesRatesFixedDofsAndOldState; assertion 16개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidPredictorPreservesRatesFixedDofsAndOldState 유지 원문 검사 body 및 assertion 동일. 83ff51b06a72feea0d70aa1de3e1d8fa07f7128d4c4194861b5bb148ba8813f9 83ff51b06a72feea0d70aa1de3e1d8fa07f7128d4c4194861b5bb148ba8813f9 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_GT(frame.generalized_coordinates[2U], 0.0) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], predictor.coordinates[i]) | EXPECT_DOUBLE_EQ(frame.velocity[i], predictor.velocity[i]) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], parameters.alpha * old.acceleration[i] / (1.0 + parameters.alpha)) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(old.velocity[2U], 0.2) | EXPECT_DOUBLE_EQ(old.acceleration[2U], 0.3) | EXPECT_EQ(old.iteration_count, 7U) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_GT(frame.generalized_coordinates[2U], 0.0) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], predictor.coordinates[i]) | EXPECT_DOUBLE_EQ(frame.velocity[i], predictor.velocity[i]) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], parameters.alpha * old.acceleration[i] / (1.0 + parameters.alpha)) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0.0) | EXPECT_DOUBLE_EQ(old.velocity[2U], 0.2) | EXPECT_DOUBLE_EQ(old.acceleration[2U], 0.3) | EXPECT_EQ(old.iteration_count, 7U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.InvalidPredictorGeometryUsesUnchangedAcceptedCoordinates HhtNewtonStart.InvalidPredictorGeometryUsesUnchangedAcceptedCoordinates; assertion 6개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.InvalidPredictorGeometryUsesUnchangedAcceptedCoordinates 유지 원문 검사 body 및 assertion 동일. 7f1ecc04486786cb084db0832cdaf162e71ddcf7e8ad02c3193dbb36d5d195f3 7f1ecc04486786cb084db0832cdaf162e71ddcf7e8ad02c3193dbb36d5d195f3 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(start.Value().frame.algorithmic_acceleration[i], auxiliary) | EXPECT_DOUBLE_EQ(start.Value().frame.acceleration[i], auxiliary / (1.0 + parameters.alpha)) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(old.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(start.Value().frame.algorithmic_acceleration[i], auxiliary) | EXPECT_DOUBLE_EQ(start.Value().frame.acceleration[i], auxiliary / (1.0 + parameters.alpha)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidChartRateOverflowIsNotReplacedByAcceptedGeometry HhtNewtonStart.ValidChartRateOverflowIsNotReplacedByAcceptedGeometry; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidChartRateOverflowIsNotReplacedByAcceptedGeometry 유지 원문 검사 body 및 assertion 동일. 52556a58a35b9a39362efc3fd2fff266da52dea44cfdea0e89c4c1c288705fee 52556a58a35b9a39362efc3fd2fff266da52dea44cfdea0e89c4c1c288705fee "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.LaterOutsideChartNodeDoesNotHideEarlierRateOverflow HhtNewtonStart.LaterOutsideChartNodeDoesNotHideEarlierRateOverflow; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.LaterOutsideChartNodeDoesNotHideEarlierRateOverflow 유지 원문 검사 body 및 assertion 동일. 30d8bdf6512795f74fb1e1322a2a7266e83e2545f10f4cc95ecde8c83530594e 30d8bdf6512795f74fb1e1322a2a7266e83e2545f10f4cc95ecde8c83530594e "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-dynamic-rotation"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.UsesTheExistingPrincipalChartMarginForInitialSelection HhtNewtonStart.UsesTheExistingPrincipalChartMarginForInitialSelection; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.UsesTheExistingPrincipalChartMarginForInitialSelection 유지 원문 검사 body 및 assertion 동일. aad0befacc29ae3638004bedd9fcd0c4a0be3dcd89ec1c4a5f2b4ff45d505b57 aad0befacc29ae3638004bedd9fcd0c4a0be3dcd89ec1c4a5f2b4ff45d505b57 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], inside ? predictor.coordinates[5U] : 0.0) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], inside ? predictor.coordinates[5U] : 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.CommonEnergyScalingSelectsTheSmallerFreeResidual HhtNewtonStart.CommonEnergyScalingSelectsTheSmallerFreeResidual; assertion 5개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.CommonEnergyScalingSelectsTheSmallerFreeResidual 유지 원문 검사 body 및 assertion 동일. c81160bc3e25344f04144572f3efb18f086dfca03dab2442ab766da8e00fbb69 c81160bc3e25344f04144572f3efb18f086dfca03dab2442ab766da8e00fbb69 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_GT(drill_residual, 0.0) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_GT(drill_residual, 0.0) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ConstrainedReactionDoesNotChangeNontrivialFreeResidualTie HhtNewtonStart.ConstrainedReactionDoesNotChangeNontrivialFreeResidualTie; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ConstrainedReactionDoesNotChangeNontrivialFreeResidualTie 유지 원문 검사 body 및 assertion 동일. 82af7082c22c2e465b2b74e21b3fab82eebce0a797ce924fb0e62a7a6e4b8977 82af7082c22c2e465b2b74e21b3fab82eebce0a797ce924fb0e62a7a6e4b8977 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_TRUE(start.HasValue()) | EXPECT_DOUBLE_EQ(start.Value().frame.generalized_coordinates[5U], 0.25) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ScaledResidualOverflowRemainsAFailure HhtNewtonStart.ScaledResidualOverflowRemainsAFailure; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ScaledResidualOverflowRemainsAFailure 유지 원문 검사 body 및 assertion 동일. db53879667603238b22caad54b437d6e9355b60a01d62fcc5895c0ea29bd2206 db53879667603238b22caad54b437d6e9355b60a01d62fcc5895c0ea29bd2206 "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.AcceptedStartArithmeticFailureIsNotIgnoredDuringComparison HhtNewtonStart.AcceptedStartArithmeticFailureIsNotIgnoredDuringComparison; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.AcceptedStartArithmeticFailureIsNotIgnoredDuringComparison 유지 원문 검사 body 및 assertion 동일. ae45e703f39d5173207289f5bac55b10d4912d7faaeb7e31b0828c6c3d84bd59 ae45e703f39d5173207289f5bac55b10d4912d7faaeb7e31b0828c6c3d84bd59 "ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(valid_predictor.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(valid_predictor.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.RejectedPredictorDoesNotHideInvalidAcceptedStartRates HhtNewtonStart.RejectedPredictorDoesNotHideInvalidAcceptedStartRates; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.RejectedPredictorDoesNotHideInvalidAcceptedStartRates 유지 원문 검사 body 및 assertion 동일. 87af7acedf54a8bacd7dc709d4cf98bab2e8dd55c6033d7decfc9edf545cd69e 87af7acedf54a8bacd7dc709d4cf98bab2e8dd55c6033d7decfc9edf545cd69e "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"") | EXPECT_DOUBLE_EQ(old.generalized_coordinates[5U], 0.0)" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"") | EXPECT_DOUBLE_EQ(old.generalized_coordinates[5U], 0.0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidGeometryStressOverflowRemainsARecoveryFailure HhtNewtonStart.ValidGeometryStressOverflowRemainsARecoveryFailure; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtNewtonStart.ValidGeometryStressOverflowRemainsARecoveryFailure 유지 원문 검사 body 및 assertion 동일. 608c3757178a373edae163916eb616d060f80ed87e569f1a747ef533fba5e841 608c3757178a373edae163916eb616d060f80ed87e569f1a747ef533fba5e841 "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-nonlinear-shell-recovery"")" "ASSERT_TRUE(shells.HasValue()) | ASSERT_FALSE(start.HasValue()) | EXPECT_EQ(start.GetStatus().Diagnostics().front().code, ""invalid-nonlinear-shell-recovery"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.InitializesCoupledMasslessAccelerationFromHiddenEquation HhtDynamicAlgebra.InitializesCoupledMasslessAccelerationFromHiddenEquation; assertion 10개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.InitializesCoupledMasslessAccelerationFromHiddenEquation 유지 원문 검사 body 및 assertion 동일. dca81e4f5956f5fd2a869a3a5b03c9e15df863b98e40c9cf8489678b3d516a02 dca81e4f5956f5fd2a869a3a5b03c9e15df863b98e40c9cf8489678b3d516a02 ASSERT_TRUE(acceleration.HasValue()) | EXPECT_NEAR(acceleration.Value()[0], 1.0, 1.0e-12) | EXPECT_NEAR(acceleration.Value()[5], 0.7, 1.0e-12) | EXPECT_EQ(acceleration.Value()[full], 0.0) | ASSERT_EQ(nodes, std::vector{0U}) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, nodes, positive, tangent, &frame) .IsOk()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), 1U) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], 0.0, 1.0e-12) | EXPECT_GT(frame.hidden_acceleration_defect_scale[0], 0.0) | EXPECT_FALSE(pseudoinverse.IsOk()) ASSERT_TRUE(acceleration.HasValue()) | EXPECT_NEAR(acceleration.Value()[0], 1.0, 1.0e-12) | EXPECT_NEAR(acceleration.Value()[5], 0.7, 1.0e-12) | EXPECT_EQ(acceleration.Value()[full], 0.0) | ASSERT_EQ(nodes, std::vector{0U}) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, nodes, positive, tangent, &frame) .IsOk()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), 1U) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], 0.0, 1.0e-12) | EXPECT_GT(frame.hidden_acceleration_defect_scale[0], 0.0) | EXPECT_FALSE(pseudoinverse.IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsMissingCanonicalHiddenGradient HhtDynamicAlgebra.RejectsMissingCanonicalHiddenGradient; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsMissingCanonicalHiddenGradient 유지 원문 검사 body 및 assertion 동일. 74a7c54d874d6dc0045725cdb30a80de28ba7e3bfb9624462ed9234575436bbd 74a7c54d874d6dc0045725cdb30a80de28ba7e3bfb9624462ed9234575436bbd "ASSERT_FALSE(acceleration.HasValue()) | ASSERT_FALSE(acceleration.GetStatus().Diagnostics().empty()) | EXPECT_EQ(acceleration.GetStatus().Diagnostics().front().code, ""dynamic-algebraic-gradient"")" "ASSERT_FALSE(acceleration.HasValue()) | ASSERT_FALSE(acceleration.GetStatus().Diagnostics().empty()) | EXPECT_EQ(acceleration.GetStatus().Diagnostics().front().code, ""dynamic-algebraic-gradient"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.ChecksInitialConstraintAndVelocityWithoutRepair HhtDynamicAlgebra.ChecksInitialConstraintAndVelocityWithoutRepair; assertion 2개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.ChecksInitialConstraintAndVelocityWithoutRepair 유지 원문 검사 body 및 assertion 동일. 1f8d68dac0766ed6cfd75b6e55633612751022e7d9c6e8f77d67c06a694973a4 1f8d68dac0766ed6cfd75b6e55633612751022e7d9c6e8f77d67c06a694973a4 EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, inconsistent, 2.0, positive, tangent) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.KeepsAcceptedHiddenRateDefectsAsDiagnostics HhtDynamicAlgebra.KeepsAcceptedHiddenRateDefectsAsDiagnostics; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.KeepsAcceptedHiddenRateDefectsAsDiagnostics 유지 원문 검사 body 및 assertion 동일. b6656cadbd8eff4fe59cb6e649da8b73f332d6371a24e089e51a502fd701812a b6656cadbd8eff4fe59cb6e649da8b73f332d6371a24e089e51a502fd701812a ASSERT_TRUE(result.IsOk()) | EXPECT_NEAR(frame.hidden_velocity_defect[0], 0.3, 1.0e-12) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], -0.6, 1.0e-12) ASSERT_TRUE(result.IsOk()) | EXPECT_NEAR(frame.hidden_velocity_defect[0], 0.3, 1.0e-12) | EXPECT_NEAR(frame.hidden_acceleration_defect[0], -0.6, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsNegativePhysicalMassAndAlgebraicRankLoss HhtDynamicAlgebra.RejectsNegativePhysicalMassAndAlgebraicRankLoss; assertion 2개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsNegativePhysicalMassAndAlgebraicRankLoss 유지 원문 검사 body 및 assertion 동일. 78d8a27b28858536af53be59122d7afd794a448f30eee56de369e82b20ecb0a8 78d8a27b28858536af53be59122d7afd794a448f30eee56de369e82b20ecb0a8 EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, negative, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, singular, 2.0, positive, tangent) .HasValue()) EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, negative, 2.0, positive, tangent) .HasValue()) | EXPECT_FALSE( fesa::hht_internal::InitializeAcceleration( *fixture.domain, fixture.dofs, singular, 2.0, positive, tangent) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AppliesTheExactRegularityConditionBoundary HhtDynamicAlgebra.AppliesTheExactRegularityConditionBoundary; assertion 3개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AppliesTheExactRegularityConditionBoundary 유지 원문 검사 body 및 assertion 동일. 6c6023800e47f2dee4b1e70509312f6286db2bb011b24117d285dca77fb219e3 6c6023800e47f2dee4b1e70509312f6286db2bb011b24117d285dca77fb219e3 "EXPECT_EQ(result.HasValue(), exponent <= 32) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-algebraic-conditioning"")" "EXPECT_EQ(result.HasValue(), exponent <= 32) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-algebraic-conditioning"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AllFixedModelHasAnEmptyValidAccelerationSolve HhtDynamicAlgebra.AllFixedModelHasAnEmptyValidAccelerationSolve; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.AllFixedModelHasAnEmptyValidAccelerationSolve 유지 원문 검사 body 및 assertion 동일. b46d03f9802058ea1af7e6fb69903168a20526878111f1e1994389b609273c36 b46d03f9802058ea1af7e6fb69903168a20526878111f1e1994389b609273c36 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Norm(), 0.0) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, {}, positive, tangent, &frame) .IsOk()) | EXPECT_EQ(frame.hidden_constraint.Size(), 0U) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Norm(), 0.0) | EXPECT_TRUE(fesa::hht_internal::CompleteConstraintEvidence( *fixture.domain, fixture.dofs, assembly, 2.0, {}, positive, tangent, &frame) .IsOk()) | EXPECT_EQ(frame.hidden_constraint.Size(), 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.PartialBoundaryRetainsEveryNonzeroPhysicalDirection HhtDynamicAlgebra.PartialBoundaryRetainsEveryNonzeroPhysicalDirection; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.PartialBoundaryRetainsEveryNonzeroPhysicalDirection 유지 원문 검사 body 및 assertion 동일. 7d72f765cafbf817a9f26d9f8abd9d654664b17589b1824d0bdc885f35ffd953 7d72f765cafbf817a9f26d9f8abd9d654664b17589b1824d0bdc885f35ffd953 "EXPECT_EQ(nodes.size(), p == 0.0 ? 1U : 0U) | EXPECT_EQ(result.HasValue(), expected) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-positive-mass-conditioning"")" "EXPECT_EQ(nodes.size(), p == 0.0 ? 1U : 0U) | EXPECT_EQ(result.HasValue(), expected) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""dynamic-positive-mass-conditioning"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsAdmissibleNullRankChangeBeforeAcceptingFrame HhtDynamicAlgebra.RejectsAdmissibleNullRankChangeBeforeAcceptingFrame; assertion 4개 tests/unit/analysis/hht_dynamic_algebra_test.cpp HhtDynamicAlgebra.RejectsAdmissibleNullRankChangeBeforeAcceptingFrame 유지 원문 검사 body 및 assertion 동일. 614b49ef2166dc30907a57a85d9ecada764ca8a1864a6c55562c7e645b410611 614b49ef2166dc30907a57a85d9ecada764ca8a1864a6c55562c7e645b410611 "ASSERT_EQ(initial_nodes.size(), 1U) | ASSERT_FALSE(result.IsOk()) | EXPECT_EQ(result.Diagnostics()[0].code, ""dynamic-mass-null-rank-change"") | EXPECT_EQ(frame.hidden_constraint[0], 23.0)" "ASSERT_EQ(initial_nodes.size(), 1U) | ASSERT_FALSE(result.IsOk()) | EXPECT_EQ(result.Diagnostics()[0].code, ""dynamic-mass-null-rank-change"") | EXPECT_EQ(frame.hidden_constraint[0], 23.0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp support@1-161 helper/oracle/fixture/include/static assertion 구간: Fixture, MakeFixture, if, Sparse, Assembly, EmptyTrial tests/unit/analysis/hht_dynamic_algebra_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b54e2c2f814694abbd26a1b4accdd404cb99fbcdb05093dd7f89602ee20ba702 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_dynamic_algebra_test.cpp support@671-672 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_dynamic_algebra_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/analysis/hht_dynamic_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7b16fff8a3edd6482b56b0c6ac02cbac5b292aecb05c82d51ac460f691befd3a 7b16fff8a3edd6482b56b0c6ac02cbac5b292aecb05c82d51ac460f691befd3a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.ClampedStepLoadHasPhysicalReactionAndZeroMotion HhtDynamicProcedure.ClampedStepLoadHasPhysicalReactionAndZeroMotion; assertion 13개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.ClampedStepLoadHasPhysicalReactionAndZeroMotion 유지 원문 검사 body 및 assertion 동일. af10ef2634dd693ac1345389ffd20c559b5cab842c16135d6ee600f40b749c52 af10ef2634dd693ac1345389ffd20c559b5cab842c16135d6ee600f40b749c52 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.reaction[2U], -4.0) | EXPECT_DOUBLE_EQ(frame.external_force[2U], 4.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.reaction[2U], -4.0) | EXPECT_DOUBLE_EQ(frame.external_force[2U], 4.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(frame.generalized_coordinates[i], 0.0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UnloadedFreeChannelsRemainExactlyAtRest HhtDynamicProcedure.UnloadedFreeChannelsRemainExactlyAtRest; assertion 13개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UnloadedFreeChannelsRemainExactlyAtRest 유지 원문 검사 body 및 assertion 동일. 16d814c3946a314c5b19636f0dda7cbe9d6c7702feaf70a007d2e9546e81ab56 16d814c3946a314c5b19636f0dda7cbe9d6c7702feaf70a007d2e9546e81ab56 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ((*values)[i], 0.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.drilling_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(metric, 0.0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 3U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ((*values)[i], 0.0) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.drilling_energy, 0.0) | EXPECT_DOUBLE_EQ(frame.energy_defect, 0.0) | EXPECT_DOUBLE_EQ(metric, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry; assertion 10개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry 유지 원문 검사 body 및 assertion 동일. 03acc1280ba57f65c34c10dcee9d444861d413107a82328c271e8affa1349c9e 03acc1280ba57f65c34c10dcee9d444861d413107a82328c271e8affa1349c9e ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT( std::abs(result.Value().state.AcceptedFrames()[0U].acceleration[14U]), 1e5) | EXPECT_LT(result.Value().state.CommittedState().generalized_coordinates[14U], 0.0) | EXPECT_LE(metric, 1e-10) | EXPECT_GT(result.Value().state.CommittedState().iteration_count, 0U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[dof], (1.0 + alpha) * frame.acceleration[dof] - alpha * frames[frame_index - 1U].acceleration[dof]) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT( std::abs(result.Value().state.AcceptedFrames()[0U].acceleration[14U]), 1e5) | EXPECT_LT(result.Value().state.CommittedState().generalized_coordinates[14U], 0.0) | EXPECT_LE(metric, 1e-10) | EXPECT_GT(result.Value().state.CommittedState().iteration_count, 0U) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[dof], (1.0 + alpha) * frame.acceleration[dof] - alpha * frames[frame_index - 1U].acceleration[dof]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.PreservesBackendCauseAndAddsInitialFailureContext HhtDynamicProcedure.PreservesBackendCauseAndAddsInitialFailureContext; assertion 13개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.PreservesBackendCauseAndAddsInitialFailureContext 유지 원문 검사 body 및 assertion 동일. b869904675bfc24f3eff1a042534df660eca2c47b484a361461060c349de2e1f b869904675bfc24f3eff1a042534df660eca2c47b484a361461060c349de2e1f "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""injected-tangent-backend"") | ASSERT_NE(found, result.GetStatus().Diagnostics().end()) | EXPECT_EQ(found->location.file, std::filesystem::path{""dynamic-state.inp""}) | EXPECT_EQ(found->location.line, 13U) | EXPECT_EQ(found->entity_identity, ""Transient Load"") | EXPECT_NE(found->message.find(""stage=initial""), std::string::npos) | EXPECT_NE(found->message.find(""increment=0""), std::string::npos) | EXPECT_NE(found->message.find(""time=0""), std::string::npos)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(log.Open(path).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""injected-tangent-backend"") | ASSERT_NE(found, result.GetStatus().Diagnostics().end()) | EXPECT_EQ(found->location.file, std::filesystem::path{""dynamic-state.inp""}) | EXPECT_EQ(found->location.line, 13U) | EXPECT_EQ(found->entity_identity, ""Transient Load"") | EXPECT_NE(found->message.find(""stage=initial""), std::string::npos) | EXPECT_NE(found->message.find(""increment=0""), std::string::npos) | EXPECT_NE(found->message.find(""time=0""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions HhtDynamicProcedure.UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions; assertion 15개 tests/unit/analysis/hht_dynamic_procedure_test.cpp HhtDynamicProcedure.UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions 유지 원문 검사 body 및 assertion 동일. b0478c8b2a601459afa174f5b801ee5cfd08d11a8a971e979ef7ba8cde76dc28 b0478c8b2a601459afa174f5b801ee5cfd08d11a8a971e979ef7ba8cde76dc28 ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(partitioned.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(finite_rotation.HasValue()) | ASSERT_TRUE(rotated_finite_rotation.HasValue()) | ASSERT_EQ(frames.size(), 3U) | EXPECT_LE(std::abs(frame.physical_strain_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.drilling_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node] - frame.generalized_coordinates[0U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 1U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 2U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + rotation]), 1e-12) | EXPECT_GT(frames.back().generalized_coordinates[0U], 0.0) | EXPECT_GT(maximum_rotation, 0.0) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(partitioned.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(finite_rotation.HasValue()) | ASSERT_TRUE(rotated_finite_rotation.HasValue()) | ASSERT_EQ(frames.size(), 3U) | EXPECT_LE(std::abs(frame.physical_strain_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.drilling_energy) / kReferenceEnergy, 1e-10) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node] - frame.generalized_coordinates[0U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 1U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + 2U]) / kCoordinateScale, 1e-12) | EXPECT_LE(std::abs(frame.generalized_coordinates[6U * node + rotation]), 1e-12) | EXPECT_GT(frames.back().generalized_coordinates[0U], 0.0) | EXPECT_GT(maximum_rotation, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp support@1-330 helper/oracle/fixture/include/static assertion 구간: InjectedTangentFailure, FailingTangent, FailureText, for, MakeRigidTranslationDefinition, RotateGlobal, MakeRotatedRigidTranslationDefinition, MakeFiniteRotationDefinition, MakeRotatedFiniteRotationDefinition, RigidTranslationRun, ExpectSameSourceIds, RunRigidTranslation, ExpectSameDynamicHistory, ExpectRotatedDofVector, ExpectCovariantDynamicHistory, MakeDefinition, if tests/unit/analysis/hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 678fa0e4df0f56e62f9a30783ffbf7e564661fc06a0fbc9bbf69bd6e25c8123c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_dynamic_procedure_test.cpp support@570-571 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_energy_verification_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/analysis/hht_energy_verification_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9d0c672737a65b301b38b949aef26d0099451719a7fd98ffa7c5d1171e97a885 9d0c672737a65b301b38b949aef26d0099451719a7fd98ffa7c5d1171e97a885 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07AlphaZeroConservesLinearOscillatorEnergy HhtEnergyVerification.C07AlphaZeroConservesLinearOscillatorEnergy; assertion 2개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07AlphaZeroConservesLinearOscillatorEnergy 유지 원문 검사 body 및 assertion 동일. c212f946ce9196b35236724d344066dbfcb8d3df5910b001c265f1f5e8ef53b3 c212f946ce9196b35236724d344066dbfcb8d3df5910b001c265f1f5e8ef53b3 ASSERT_TRUE(parameters.HasValue()) | EXPECT_LE(maximum, 1.0e-10) ASSERT_TRUE(parameters.HasValue()) | EXPECT_LE(maximum, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07DefaultAlphaReportsEnergyAndPhaseChanges HhtEnergyVerification.C07DefaultAlphaReportsEnergyAndPhaseChanges; assertion 3개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07DefaultAlphaReportsEnergyAndPhaseChanges 유지 원문 검사 body 및 assertion 동일. 683b5ca010185dc76cd3ecf37078c479637fd0a00c07ed5a1a80a5a116c14933 683b5ca010185dc76cd3ecf37078c479637fd0a00c07ed5a1a80a5a116c14933 ASSERT_TRUE(parameters.HasValue()) | EXPECT_TRUE(std::isfinite(energy)) | EXPECT_LT(energy, 2.0) ASSERT_TRUE(parameters.HasValue()) | EXPECT_TRUE(std::isfinite(energy)) | EXPECT_LT(energy, 2.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07IndependentAmplificationHasThePrescribedSpectrum HhtEnergyVerification.C07IndependentAmplificationHasThePrescribedSpectrum; assertion 4개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07IndependentAmplificationHasThePrescribedSpectrum 유지 원문 검사 body 및 assertion 동일. a96cd1993dfff2d5f5c40fdaf6139af7e5f6aa82dfc5cc784de896f1df437bca a96cd1993dfff2d5f5c40fdaf6139af7e5f6aa82dfc5cc784de896f1df437bca EXPECT_NEAR(std::abs(roots[1]), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(roots[2]), 1.0, 1.0e-10) | EXPECT_LE(radius, 1.0 + 1.0e-10) | EXPECT_LT(error, previous_limit_error) EXPECT_NEAR(std::abs(roots[1]), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(roots[2]), 1.0, 1.0e-10) | EXPECT_LE(radius, 1.0 + 1.0e-10) | EXPECT_LT(error, previous_limit_error) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07SupportReactionUsesPhysicalAccelerationAndCoupling HhtEnergyVerification.C07SupportReactionUsesPhysicalAccelerationAndCoupling; assertion 4개 tests/unit/analysis/hht_energy_verification_test.cpp HhtEnergyVerification.C07SupportReactionUsesPhysicalAccelerationAndCoupling 유지 원문 검사 body 및 assertion 동일. 3462a480370c4e1ef1adba61c8cecbd490c5a188b1c0f71c8f381a648f7717f7 3462a480370c4e1ef1adba61c8cecbd490c5a188b1c0f71c8f381a648f7717f7 ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(reaction, 0.5 * state.a[0]) | EXPECT_LE(std::abs(balance) / scale, 1.0e-10) | EXPECT_GT(mutation_difference, 1.0e-6) ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(reaction, 0.5 * state.a[0]) | EXPECT_LE(std::abs(balance) / scale, 1.0e-10) | EXPECT_GT(mutation_difference, 1.0e-6) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_energy_verification_test.cpp support@1-119 helper/oracle/fixture/include/static assertion 구간: Oscillator, Advance, Amplification, Eigenvalues, if, for tests/unit/analysis/hht_energy_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 85df404875102d22dc4c86031757dd24174a652f4dc39cf7ce0f561c59a977b4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_energy_verification_test.cpp support@222-223 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_energy_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 19개 tests/unit/analysis/hht_reduced_shell_test.cpp file 이관 Dev trial cache·context 변경·copy/move 소유권·실패 우선순위·left-association 검사를 복원한다. 같은 trial의 독립 local 평가만 ShellTrialElement::EvaluateTrial 호출로 이관한다. d4ad83f9f7c7f4ba18942abb13ef3838edb8e39eea2d32a5cc2b8870a85f81d5 243fb1edd3dfd485e824cf11291087e0e6daf469a9c8d0f2ed04ce893e385129 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.SelectsCanonicalPivotAndLiftsCoordinates HhtReducedChart.SelectsCanonicalPivotAndLiftsCoordinates; assertion 7개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.SelectsCanonicalPivotAndLiftsCoordinates 유지 원문 검사 body 및 assertion 동일. 9be1e26c0f12a99552fa2c7e2a706eb69bf9829d16cea9fda53f6d60ed62dd86 9be1e26c0f12a99552fa2c7e2a706eb69bf9829d16cea9fda53f6d60ed62dd86 ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 4U) | EXPECT_EQ(chart.Value().pivot_components[node], 2U) | EXPECT_EQ(chart.Value().z_dofs[node], 6U * node + 5U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().p_dofs[i]], p[i]) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().z_dofs[i]], z[i]) ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 4U) | EXPECT_EQ(chart.Value().pivot_components[node], 2U) | EXPECT_EQ(chart.Value().z_dofs[node], 6U * node + 5U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().p_dofs[i]], p[i]) | EXPECT_DOUBLE_EQ(full.Value()[chart.Value().z_dofs[i]], z[i]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RetainsNodeWhenItsPartialBoundaryCutsTheNull HhtReducedChart.RetainsNodeWhenItsPartialBoundaryCutsTheNull; assertion 9개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RetainsNodeWhenItsPartialBoundaryCutsTheNull 유지 원문 검사 body 및 assertion 동일. 6233920d1de0cb982482e84f4acac2853c5d4b5f8b76431c4e52cc215134cc89 6233920d1de0cb982482e84f4acac2853c5d4b5f8b76431c4e52cc215134cc89 ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 3U) | EXPECT_TRUE(std::find(chart.Value().null_nodes.begin(), chart.Value().null_nodes.end(), 0U) == chart.Value().null_nodes.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 3U) != chart.Value().p_dofs.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 4U) != chart.Value().p_dofs.end()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_EQ(operators.Value().rows.size(), 3U) ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(chart.Value().null_nodes.size(), 3U) | EXPECT_TRUE(std::find(chart.Value().null_nodes.begin(), chart.Value().null_nodes.end(), 0U) == chart.Value().null_nodes.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 3U) != chart.Value().p_dofs.end()) | EXPECT_TRUE(std::find(chart.Value().p_dofs.begin(), chart.Value().p_dofs.end(), 4U) != chart.Value().p_dofs.end()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_EQ(operators.Value().rows.size(), 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.UsesActualFiniteInitialNullAndPreservesTransposeActions HhtReducedChart.UsesActualFiniteInitialNullAndPreservesTransposeActions; assertion 13개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.UsesActualFiniteInitialNullAndPreservesTransposeActions 유지 원문 검사 body 및 assertion 동일. 3a0cce3ce539ccc6181768741375eed175e179b4e875a97b2369e6bd7f6a4c2f 3a0cce3ce539ccc6181768741375eed175e179b4e875a97b2369e6bd7f6a4c2f ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(built.HasValue()) | EXPECT_EQ(chart.minimum_axes.front(), axis) | ASSERT_EQ(chart.z_columns.front().support.size(), 3U) | EXPECT_NEAR(column.support[i].value, raw[i] / norm, 1e-15) | EXPECT_TRUE(std::isfinite(column.support_radii[i])) | EXPECT_GE(column.support_radii[i], 0.0) | EXPECT_GT(std::abs(chart.z_columns.front().support[0U].value), 0.01) | ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(projected_p.HasValue()) | ASSERT_TRUE(projected_z.HasValue()) | EXPECT_NEAR(projected_p.Value()[i], p[i], 1e-15) | EXPECT_NEAR(projected_z.Value()[i], z[i], 1e-15) ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(built.HasValue()) | EXPECT_EQ(chart.minimum_axes.front(), axis) | ASSERT_EQ(chart.z_columns.front().support.size(), 3U) | EXPECT_NEAR(column.support[i].value, raw[i] / norm, 1e-15) | EXPECT_TRUE(std::isfinite(column.support_radii[i])) | EXPECT_GE(column.support_radii[i], 0.0) | EXPECT_GT(std::abs(chart.z_columns.front().support[0U].value), 0.01) | ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(projected_p.HasValue()) | ASSERT_TRUE(projected_z.HasValue()) | EXPECT_NEAR(projected_p.Value()[i], p[i], 1e-15) | EXPECT_NEAR(projected_z.Value()[i], z[i], 1e-15) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.MinimumAxisTieAndPartialBoundaryRetainExactZeros HhtReducedChart.MinimumAxisTieAndPartialBoundaryRetainExactZeros; assertion 5개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.MinimumAxisTieAndPartialBoundaryRetainExactZeros 유지 원문 검사 body 및 assertion 동일. 199055f0e67f5c20880dc18741e1294140016db419e6a95628c00e1cb1277f8b 199055f0e67f5c20880dc18741e1294140016db419e6a95628c00e1cb1277f8b ASSERT_TRUE(chart.HasValue()) | EXPECT_EQ(axis, 0U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[5U], 0.0) | EXPECT_FALSE(column.fixed_plane) ASSERT_TRUE(chart.HasValue()) | EXPECT_EQ(axis, 0U) | ASSERT_TRUE(full.HasValue()) | EXPECT_DOUBLE_EQ(full.Value()[5U], 0.0) | EXPECT_FALSE(column.fixed_plane) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.ProperRotationRelatesRetainedPlanesByConstantOrthogonalMap HhtReducedChart.ProperRotationRelatesRetainedPlanesByConstantOrthogonalMap; assertion 8개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.ProperRotationRelatesRetainedPlanesByConstantOrthogonalMap 유지 원문 검사 body 및 assertion 동일. 0a3d19b8bfc9be9ba9e6f6d45bf817a8cde05698c75a9ae3355fb4c74ac52e62 0a3d19b8bfc9be9ba9e6f6d45bf817a8cde05698c75a9ae3355fb4c74ac52e62 ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(source.HasValue()) | ASSERT_TRUE(target.HasValue()) | ASSERT_EQ(si, 2U) | ASSERT_EQ(ti, 2U) | EXPECT_NEAR(target_plane[0U][k] * t[0U][j] + target_plane[1U][k] * t[1U][j], rotated[k], 1e-14) | EXPECT_NEAR(t[0U][i] * t[0U][j] + t[1U][i] * t[1U][j], i == j ? 1.0 : 0.0, 1e-14) ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(source.HasValue()) | ASSERT_TRUE(target.HasValue()) | ASSERT_EQ(si, 2U) | ASSERT_EQ(ti, 2U) | EXPECT_NEAR(target_plane[0U][k] * t[0U][j] + target_plane[1U][k] * t[1U][j], rotated[k], 1e-14) | EXPECT_NEAR(t[0U][i] * t[0U][j] + t[1U][i] * t[1U][j], i == j ? 1.0 : 0.0, 1e-14) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RejectsSubnormalNormWithoutAValidCoefficientCertificate HhtReducedChart.RejectsSubnormalNormWithoutAValidCoefficientCertificate; assertion 1개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.RejectsSubnormalNormWithoutAValidCoefficientCertificate 유지 원문 검사 body 및 assertion 동일. c8389950eef75e9147da8658be67e71bb4c52c46db7991d0488a4937ac82c439 c8389950eef75e9147da8658be67e71bb4c52c46db7991d0488a4937ac82c439 EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, rotations).HasValue()) EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, rotations).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.NativeCoefficientRadiiExportFixedInputReplay HhtReducedChart.NativeCoefficientRadiiExportFixedInputReplay; assertion 7개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.NativeCoefficientRadiiExportFixedInputReplay 유지 원문 검사 body 및 assertion 동일. 9c220fc2bc4ffd53650d9c3af693560d6beeaf06b5631d766ae082ff5ec3e8fb 9c220fc2bc4ffd53650d9c3af693560d6beeaf06b5631d766ae082ff5ec3e8fb ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(column, 2U) | ASSERT_EQ(p->support.size(), 3U) | EXPECT_TRUE(std::isfinite(radius)) | EXPECT_GE(radius, 0.0) | EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, invalid).HasValue()) ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_EQ(column, 2U) | ASSERT_EQ(p->support.size(), 3U) | EXPECT_TRUE(std::isfinite(radius)) | EXPECT_GE(radius, 0.0) | EXPECT_FALSE(fesa::hht_reduced_internal::BuildFixedChart(fixture.dofs, invalid).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.InvertibleGraphDoesNotCertifySelectorTransversality HhtReducedChart.InvertibleGraphDoesNotCertifySelectorTransversality; assertion 6개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChart.InvertibleGraphDoesNotCertifySelectorTransversality 유지 원문 검사 body 및 assertion 동일. 23c5ac02ecae6f1ee4b38528c74d1fe93200138fd51a2ab0d23b694c7e04abbe 23c5ac02ecae6f1ee4b38528c74d1fe93200138fd51a2ab0d23b694c7e04abbe ASSERT_TRUE(chart.HasValue()) | EXPECT_TRUE(fesa::hht_reduced_internal::SolveGraphSystem( fesa::hht_reduced_internal::GraphJacobian(operators, chart.Value()), fesa::Vector(4U, 1.0), solver).HasValue()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) ASSERT_TRUE(chart.HasValue()) | EXPECT_TRUE(fesa::hht_reduced_internal::SolveGraphSystem( fesa::hht_reduced_internal::GraphJacobian(operators, chart.Value()), fesa::Vector(4U, 1.0), solver).HasValue()) | ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::CheckSelectorTransversality( assembly, chart.Value(), solver).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.ScatterShellDerivativesByConstraintRow HhtReducedOperators.ScatterShellDerivativesByConstraintRow; assertion 15개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedOperators.ScatterShellDerivativesByConstraintRow 유지 원문 검사 body 및 assertion 동일. b57a6ce0864234af355f619fb8be4a19898393df437f5b314c8f1e2ee79dc0bd b57a6ce0864234af355f619fb8be4a19898393df437f5b314c8f1e2ee79dc0bd ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(operators.HasValue()) | ASSERT_EQ(operators.Value().rows.size(), 4U) | ASSERT_TRUE(graph_condition.HasValue()) | EXPECT_GE(graph_condition.Value(), std::ldexp(1.0, -32)) | EXPECT_DOUBLE_EQ(row.value, 0.0) | EXPECT_DOUBLE_EQ(row.value_scale, expected_scale) | EXPECT_FALSE(row.gradient.empty()) | EXPECT_FALSE(row.hessian.empty()) | EXPECT_LT(row.gradient.size(), fixture.dofs.FullDofCount()) | EXPECT_LT(entry.row, fixture.dofs.FullDofCount()) | EXPECT_LT(entry.column, fixture.dofs.FullDofCount()) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(operators.HasValue()) | ASSERT_EQ(operators.Value().rows.size(), 4U) | ASSERT_TRUE(graph_condition.HasValue()) | EXPECT_GE(graph_condition.Value(), std::ldexp(1.0, -32)) | EXPECT_DOUBLE_EQ(row.value, 0.0) | EXPECT_DOUBLE_EQ(row.value_scale, expected_scale) | EXPECT_FALSE(row.gradient.empty()) | EXPECT_FALSE(row.hessian.empty()) | EXPECT_LT(row.gradient.size(), fixture.dofs.FullDofCount()) | EXPECT_LT(entry.row, fixture.dofs.FullDofCount()) | EXPECT_LT(entry.column, fixture.dofs.FullDofCount()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RejectsNonfiniteGraphResidualBeforeAcceptance HhtReducedEmbedding.RejectsNonfiniteGraphResidualBeforeAcceptance; assertion 4개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RejectsNonfiniteGraphResidualBeforeAcceptance 유지 원문 검사 body 및 assertion 동일. aba990268187a0cee9fe762ab5acefe258144c3a8bcaf27245174b8cc87d6ac6 aba990268187a0cee9fe762ab5acefe258144c3a8bcaf27245174b8cc87d6ac6 "ASSERT_TRUE(chart.HasValue()) | ASSERT_FALSE(root.HasValue()) | ASSERT_FALSE(root.GetStatus().Diagnostics().empty()) | EXPECT_EQ(root.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" "ASSERT_TRUE(chart.HasValue()) | ASSERT_FALSE(root.HasValue()) | ASSERT_FALSE(root.GetStatus().Diagnostics().empty()) | EXPECT_EQ(root.GetStatus().Diagnostics().front().code, ""dynamic-invalid-state"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsExactTwoCycleForFullHiddenCertification HhtReducedEmbedding.ReturnsExactTwoCycleForFullHiddenCertification; assertion 4개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsExactTwoCycleForFullHiddenCertification 유지 원문 검사 body 및 assertion 동일. 1c20656897f7812ce5cf1b2993fc07ba03b3b4c04bcc5d9b8111bffb775607ab 1c20656897f7812ce5cf1b2993fc07ba03b3b4c04bcc5d9b8111bffb775607ab ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().q[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, -2.0) ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().q[0U], -1.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, -2.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsEvaluatedTrialWhenLiftAbsorbsAChangedPrivateRoot HhtReducedEmbedding.ReturnsEvaluatedTrialWhenLiftAbsorbsAChangedPrivateRoot; assertion 12개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReturnsEvaluatedTrialWhenLiftAbsorbsAChangedPrivateRoot 유지 원문 검사 body 및 assertion 동일. 72f50cedc425b3beda1ad7a34363c76203e2792acbf3eff5bfdc4c3dee43c148 72f50cedc425b3beda1ad7a34363c76203e2792acbf3eff5bfdc4c3dee43c148 ASSERT_TRUE(built.HasValue()) | ASSERT_EQ(angular, 2U) | ASSERT_TRUE(original.HasValue()) | EXPECT_NE(changed[0U], seed[0U]) | ASSERT_TRUE(absorbed.HasValue()) | EXPECT_EQ(original.Value()[i], absorbed.Value()[i]) | ASSERT_TRUE(root.HasValue()) | EXPECT_EQ(root.Value().z[0U], seed[0U]) | EXPECT_NE(root.Value().operators.rows[0U].value, 0.0) | EXPECT_GT(root.Value().graph_residual_relative, 1e-10) | EXPECT_EQ(root.Value().graph_iteration_count, 0U) | EXPECT_EQ(root.Value().q[i], original.Value()[i]) ASSERT_TRUE(built.HasValue()) | ASSERT_EQ(angular, 2U) | ASSERT_TRUE(original.HasValue()) | EXPECT_NE(changed[0U], seed[0U]) | ASSERT_TRUE(absorbed.HasValue()) | EXPECT_EQ(original.Value()[i], absorbed.Value()[i]) | ASSERT_TRUE(root.HasValue()) | EXPECT_EQ(root.Value().z[0U], seed[0U]) | EXPECT_NE(root.Value().operators.rows[0U].value, 0.0) | EXPECT_GT(root.Value().graph_residual_relative, 1e-10) | EXPECT_EQ(root.Value().graph_iteration_count, 0U) | EXPECT_EQ(root.Value().q[i], original.Value()[i]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.StopsAtExistingScaledPositionCertificate HhtReducedEmbedding.StopsAtExistingScaledPositionCertificate; assertion 5개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.StopsAtExistingScaledPositionCertificate 유지 원문 검사 body 및 assertion 동일. 40399a56a3e5ee5dd124159d271c7c833a7fb9bf4de311a17d44b0752fe90716 40399a56a3e5ee5dd124159d271c7c833a7fb9bf4de311a17d44b0752fe90716 ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_infinity, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_relative, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_correction_infinity, 0.0) ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_infinity, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_residual_relative, 5.0e-11) | EXPECT_DOUBLE_EQ(root.Value().graph_correction_infinity, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RequiresExactZeroWhenPositionScaleIsZero HhtReducedEmbedding.RequiresExactZeroWhenPositionScaleIsZero; assertion 3개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.RequiresExactZeroWhenPositionScaleIsZero 유지 원문 검사 body 및 assertion 동일. 781274b693d154f790a5b856ea36ce7faf58048779d75a99636edfed40153d2d 781274b693d154f790a5b856ea36ce7faf58048779d75a99636edfed40153d2d ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, 0.0) ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().z[0U], 0.0) | EXPECT_DOUBLE_EQ(root.Value().operators.rows[0U].value, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsRatesAcrossSelectedPartitionCancellation HhtReducedEmbedding.ReconstructsRatesAcrossSelectedPartitionCancellation; assertion 11개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsRatesAcrossSelectedPartitionCancellation 유지 원문 검사 body 및 assertion 동일. 99f396cb603db35827fd7516d26285d29dfd1fc5149f7f1ae100caf12b3c027f 99f396cb603db35827fd7516d26285d29dfd1fc5149f7f1ae100caf12b3c027f EXPECT_DOUBLE_EQ(plain_velocity_rhs, 0.0) | EXPECT_DOUBLE_EQ(plain_acceleration_rhs, 0.0) | ASSERT_TRUE(rates.HasValue()) | EXPECT_DOUBLE_EQ(rates.Value().velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[1U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[0U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[1U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_acceleration[0U], 1.0) EXPECT_DOUBLE_EQ(plain_velocity_rhs, 0.0) | EXPECT_DOUBLE_EQ(plain_acceleration_rhs, 0.0) | ASSERT_TRUE(rates.HasValue()) | EXPECT_DOUBLE_EQ(rates.Value().velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[1U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().velocity[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[0U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[1U], 0.0) | EXPECT_DOUBLE_EQ(rates.Value().acceleration[2U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_velocity[0U], 1.0) | EXPECT_DOUBLE_EQ(rates.Value().z_acceleration[0U], 1.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsActualShellRatesWithMixedTimeLoad HhtReducedEmbedding.ReconstructsActualShellRatesWithMixedTimeLoad; assertion 53개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedEmbedding.ReconstructsActualShellRatesWithMixedTimeLoad 유지 원문 검사 body 및 assertion 동일. d7e9c115b48ed36f68722faa84b348585d6fd80567b49019bbac78cde25cd8b9 d7e9c115b48ed36f68722faa84b348585d6fd80567b49019bbac78cde25cd8b9 ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(initial.HasValue()) | ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().q[2U], 0.01) | ASSERT_TRUE(rates.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_NEAR(hidden[0U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[1U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[2U], 0.0, 1.0e-8) | EXPECT_TRUE(saw_time_term) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(reference_length.HasValue()) | ASSERT_TRUE(system.HasValue()) | ASSERT_EQ(system.Value().physical_count, chart.Value().p_dofs.size()) | ASSERT_EQ(system.Value().algebraic_count, chart.Value().z_dofs.size()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], cv * 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], ca * 0.004) | EXPECT_NEAR(mapped.Value().coordinate[entry.dof], -0.003 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().velocity[entry.dof], 0.002 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().acceleration[entry.dof], -0.001 * entry.value, 1e-17) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(projected_base.HasValue()) | EXPECT_NEAR(base.Value()[i], system.Value().row_scale[i] * projected_base.Value()[i], 1e-13 * system.Value().row_scale[i] * uncancelled) | ASSERT_GT(direction_norm, 0.0) | ASSERT_TRUE(mapped_direction.HasValue()) | ASSERT_GT(tangent_frobenius, 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_EQ(consecutive, expected_pass) | ASSERT_TRUE(no_force_actual.HasValue()) | ASSERT_TRUE(no_force_operators.HasValue()) | ASSERT_EQ(omitted_external_gradient.rows.size(), no_force_operators.Value().rows.size()) | ASSERT_EQ(omitted.size(), no_force.size()) | ASSERT_EQ(omitted[entry].dof, no_force[entry].dof) | ASSERT_TRUE(saw_external_position_gradient) | ASSERT_TRUE(omitted_external_gradient_system.HasValue()) | ASSERT_TRUE(ha_actual.HasValue()) | ASSERT_TRUE(ha_operators.HasValue()) | ASSERT_TRUE(ha_system.HasValue()) | ASSERT_TRUE(omitted_ha_system.HasValue()) | ASSERT_TRUE(hw_actual.HasValue()) | ASSERT_TRUE(hw_operators.HasValue()) | ASSERT_TRUE(hw_system.HasValue()) | ASSERT_TRUE(omitted_hw_system.HasValue()) | ASSERT_TRUE(third_system.HasValue()) | ASSERT_TRUE(mixed_time_system.HasValue()) | ASSERT_TRUE(omitted_second_time_rates.HasValue()) | EXPECT_GT(omitted_second_time_hidden, 1.0e-8) ASSERT_TRUE(shells.HasValue()) | ASSERT_TRUE(initial.HasValue()) | ASSERT_TRUE(finite.HasValue()) | ASSERT_TRUE(chart.HasValue()) | ASSERT_TRUE(root.HasValue()) | EXPECT_DOUBLE_EQ(root.Value().q[2U], 0.01) | ASSERT_TRUE(rates.HasValue()) | ASSERT_TRUE(actual.HasValue()) | ASSERT_TRUE(operators.HasValue()) | EXPECT_NEAR(hidden[0U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[1U], 0.0, 1.0e-9) | EXPECT_NEAR(hidden[2U], 0.0, 1.0e-8) | EXPECT_TRUE(saw_time_term) | ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(reference_length.HasValue()) | ASSERT_TRUE(system.HasValue()) | ASSERT_EQ(system.Value().physical_count, chart.Value().p_dofs.size()) | ASSERT_EQ(system.Value().algebraic_count, chart.Value().z_dofs.size()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], cv * 0.004) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], ca * 0.004) | EXPECT_NEAR(mapped.Value().coordinate[entry.dof], -0.003 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().velocity[entry.dof], 0.002 * entry.value, 1e-17) | EXPECT_NEAR(mapped.Value().acceleration[entry.dof], -0.001 * entry.value, 1e-17) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(projected_base.HasValue()) | EXPECT_NEAR(base.Value()[i], system.Value().row_scale[i] * projected_base.Value()[i], 1e-13 * system.Value().row_scale[i] * uncancelled) | ASSERT_GT(direction_norm, 0.0) | ASSERT_TRUE(mapped_direction.HasValue()) | ASSERT_GT(tangent_frobenius, 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_EQ(consecutive, expected_pass) | ASSERT_TRUE(no_force_actual.HasValue()) | ASSERT_TRUE(no_force_operators.HasValue()) | ASSERT_EQ(omitted_external_gradient.rows.size(), no_force_operators.Value().rows.size()) | ASSERT_EQ(omitted.size(), no_force.size()) | ASSERT_EQ(omitted[entry].dof, no_force[entry].dof) | ASSERT_TRUE(saw_external_position_gradient) | ASSERT_TRUE(omitted_external_gradient_system.HasValue()) | ASSERT_TRUE(ha_actual.HasValue()) | ASSERT_TRUE(ha_operators.HasValue()) | ASSERT_TRUE(ha_system.HasValue()) | ASSERT_TRUE(omitted_ha_system.HasValue()) | ASSERT_TRUE(hw_actual.HasValue()) | ASSERT_TRUE(hw_operators.HasValue()) | ASSERT_TRUE(hw_system.HasValue()) | ASSERT_TRUE(omitted_hw_system.HasValue()) | ASSERT_TRUE(third_system.HasValue()) | ASSERT_TRUE(mixed_time_system.HasValue()) | ASSERT_TRUE(omitted_second_time_rates.HasValue()) | EXPECT_GT(omitted_second_time_hidden, 1.0e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RequiresEveryTranslationGateAndThaws HhtReducedChannelNewton.RequiresEveryTranslationGateAndThaws; assertion 10개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RequiresEveryTranslationGateAndThaws 유지 원문 검사 body 및 assertion 동일. 635a7b5bdebdb547e60223694971085c31ae50c328a17ee943f24d0f968e86b3 635a7b5bdebdb547e60223694971085c31ae50c328a17ee943f24d0f968e86b3 EXPECT_TRUE(refine({1e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({2e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 1e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero, false)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({std::numeric_limits::infinity(), 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, std::numeric_limits::quiet_NaN()}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) EXPECT_TRUE(refine({1e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({2e-10, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 1e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero, false)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({0.0, 2e-10}, correction)) | EXPECT_FALSE(refine({std::numeric_limits::infinity(), 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, std::numeric_limits::quiet_NaN()}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) | EXPECT_FALSE(refine({0.0, 2e-10}, zero)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RetainsAllAuxiliaryBlocksAndFullModelDefect HhtReducedChannelNewton.RetainsAllAuxiliaryBlocksAndFullModelDefect; assertion 22개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RetainsAllAuxiliaryBlocksAndFullModelDefect 유지 원문 검사 body 및 assertion 동일. e1aa1e05ebaeb7f832033a6db8283163510c5d3266ee5a5863a445694b12e3d7 e1aa1e05ebaeb7f832033a6db8283163510c5d3266ee5a5863a445694b12e3d7 ASSERT_TRUE(tangent.HasValue()) | ASSERT_TRUE(selected.HasValue()) | EXPECT_EQ(selected.Value().full_indices, (std::vector{1U, 2U, 3U, 4U, 5U})) | ASSERT_TRUE(solver.FactorizeFresh(selected.Value().tangent).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(selected.Value().rhs, step).IsOk()) | EXPECT_TRUE(fesa::hht_internal::CheckLinearSolve( selected.Value().tangent, selected.Value().rhs, step).IsOk()) | ASSERT_TRUE(embedded.HasValue()) | EXPECT_DOUBLE_EQ(embedded.Value()[0U], 0.0) | EXPECT_NEAR(embedded.Value()[i], expected[i], 1e-14) | EXPECT_FALSE(fesa::hht_internal::CheckLinearSolve( full.tangent, full.rhs, embedded.Value()).IsOk()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], 0.0) | EXPECT_NEAR(mapped.Value().coordinate[5U], 0.4, 1e-14) | EXPECT_NEAR(mapped.Value().velocity[5U], 0.2, 1e-14) | EXPECT_NEAR(mapped.Value().acceleration[5U], -0.3, 1e-14) | ASSERT_TRUE(thawed.HasValue()) | EXPECT_EQ(thawed.Value().full_indices.size(), 6U) | EXPECT_DOUBLE_EQ(thawed.Value().rhs[0U], rhs[0U]) | EXPECT_FALSE(fesa::hht_reduced_internal::SelectAugmentedSolve( invalid, chart, true).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::EmbedAugmentedSolution( selected.Value(), step, 6U).HasValue()) ASSERT_TRUE(tangent.HasValue()) | ASSERT_TRUE(selected.HasValue()) | EXPECT_EQ(selected.Value().full_indices, (std::vector{1U, 2U, 3U, 4U, 5U})) | ASSERT_TRUE(solver.FactorizeFresh(selected.Value().tangent).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(selected.Value().rhs, step).IsOk()) | EXPECT_TRUE(fesa::hht_internal::CheckLinearSolve( selected.Value().tangent, selected.Value().rhs, step).IsOk()) | ASSERT_TRUE(embedded.HasValue()) | EXPECT_DOUBLE_EQ(embedded.Value()[0U], 0.0) | EXPECT_NEAR(embedded.Value()[i], expected[i], 1e-14) | EXPECT_FALSE(fesa::hht_internal::CheckLinearSolve( full.tangent, full.rhs, embedded.Value()).IsOk()) | ASSERT_TRUE(mapped.HasValue()) | EXPECT_DOUBLE_EQ(mapped.Value().coordinate[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().velocity[0U], 0.0) | EXPECT_DOUBLE_EQ(mapped.Value().acceleration[0U], 0.0) | EXPECT_NEAR(mapped.Value().coordinate[5U], 0.4, 1e-14) | EXPECT_NEAR(mapped.Value().velocity[5U], 0.2, 1e-14) | EXPECT_NEAR(mapped.Value().acceleration[5U], -0.3, 1e-14) | ASSERT_TRUE(thawed.HasValue()) | EXPECT_EQ(thawed.Value().full_indices.size(), 6U) | EXPECT_DOUBLE_EQ(thawed.Value().rhs[0U], rhs[0U]) | EXPECT_FALSE(fesa::hht_reduced_internal::SelectAugmentedSolve( invalid, chart, true).HasValue()) | EXPECT_FALSE(fesa::hht_reduced_internal::EmbedAugmentedSolution( selected.Value(), step, 6U).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RestrictedSingularityIsNotFullInvertibility HhtReducedChannelNewton.RestrictedSingularityIsNotFullInvertibility; assertion 4개 tests/unit/analysis/hht_reduced_shell_test.cpp HhtReducedChannelNewton.RestrictedSingularityIsNotFullInvertibility 유지 원문 검사 body 및 assertion 동일. 929b1e67526d7ea5095985c949c85d901e3f90db028afcd2bdd3826dba226d7b 929b1e67526d7ea5095985c949c85d901e3f90db028afcd2bdd3826dba226d7b ASSERT_TRUE(matrix.HasValue()) | ASSERT_TRUE(restricted.HasValue()) | ASSERT_TRUE(solver.FactorizeFresh(full.tangent).IsOk()) | EXPECT_FALSE(solver.FactorizeFresh(restricted.Value().tangent).IsOk()) ASSERT_TRUE(matrix.HasValue()) | ASSERT_TRUE(restricted.HasValue()) | ASSERT_TRUE(solver.FactorizeFresh(full.tangent).IsOk()) | EXPECT_FALSE(solver.FactorizeFresh(restricted.Value().tangent).IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp support@1-154 helper/oracle/fixture/include/static assertion 구간: Fixture, MakeFixture, if, Rotations, Assemble, SetComponentColumns, PIndex, Hidden, for tests/unit/analysis/hht_reduced_shell_test.cpp file-support 이관 Dev trial cache·context 변경·copy/move 소유권·실패 우선순위·left-association 검사를 복원한다. 같은 trial의 독립 local 평가만 ShellTrialElement::EvaluateTrial 호출로 이관한다. f4776f384d43392262250a14b547685114913e28225a2510142dd854f147b4ca 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_reduced_shell_test.cpp support@1143-1144 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_reduced_shell_test.cpp file-support 유지 Dev trial cache·context 변경·copy/move 소유권·실패 우선순위·left-association 검사를 복원한다. 같은 trial의 독립 local 평가만 ShellTrialElement::EvaluateTrial 호출로 이관한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 27개 tests/unit/analysis/hht_shell_physics_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 029bc0a2ece9780b1c904e966bf71a2a43741317000b7bd1ea3544c2d07968a1 029bc0a2ece9780b1c904e966bf71a2a43741317000b7bd1ea3544c2d07968a1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.NodalRigidForceRatesMatchIndependentTimeDifferences HhtShellPhysics.NodalRigidForceRatesMatchIndependentTimeDifferences; assertion 2개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.NodalRigidForceRatesMatchIndependentTimeDifferences 유지 원문 검사 body 및 assertion 동일. 8e7bbb65a70d3694839108bc430e01ae3292d6b4ab980922f7c9577af3185f6c 8e7bbb65a70d3694839108bc430e01ae3292d6b4ab980922f7c9577af3185f6c ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1.0e-6) ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1.0e-6) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ExternalDrillingHessianBalancesGradientAcceleration HhtShellPhysics.ExternalDrillingHessianBalancesGradientAcceleration; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ExternalDrillingHessianBalancesGradientAcceleration 유지 원문 검사 body 및 assertion 동일. 9456fd3f90ad9a3f30a93fd5e5d513eb2798f88ae63df197d1c0db7471c84a53 9456fd3f90ad9a3f30a93fd5e5d513eb2798f88ae63df197d1c0db7471c84a53 ASSERT_TRUE(external.HasValue()) | EXPECT_NEAR(external.Value().directional_second, -1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(gradient_acceleration, 1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(external.Value().directional_second + gradient_acceleration, 0.0, 1.0e-14) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(middle.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(finite_difference, external.Value().directional_second, 1.0e-8) ASSERT_TRUE(external.HasValue()) | EXPECT_NEAR(external.Value().directional_second, -1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(gradient_acceleration, 1.0 / 6.0, 1.0e-14) | EXPECT_NEAR(external.Value().directional_second + gradient_acceleration, 0.0, 1.0e-14) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(middle.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(finite_difference, external.Value().directional_second, 1.0e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ManufacturedHiddenCountsExternalHessianOnce HhtShellPhysics.ManufacturedHiddenCountsExternalHessianOnce; assertion 2개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ManufacturedHiddenCountsExternalHessianOnce 유지 원문 검사 body 및 assertion 동일. 66c7a72b17bea62b6f47d56a3ad1c08c66eec8169ebaaa0adcdc71e7b85a892c 66c7a72b17bea62b6f47d56a3ad1c08c66eec8169ebaaa0adcdc71e7b85a892c ASSERT_GT(scale, 0.0) | EXPECT_LE(std::abs(balance.hidden_acceleration_defect[node] - expected) / scale, 1.0e-12) ASSERT_GT(scale, 0.0) | EXPECT_LE(std::abs(balance.hidden_acceleration_defect[node] - expected) / scale, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum; assertion 14개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum 유지 원문 검사 body 및 assertion 동일. fcb752c10cea7eb76dfcbb5e2035bb3eb8392589fafa6e8673656dd5ecfe934f fcb752c10cea7eb76dfcbb5e2035bb3eb8392589fafa6e8673656dd5ecfe934f EXPECT_LE(difference.Norm() / oracle.force.Norm(), 1.0e-12) | EXPECT_LE(std::abs(assembly.frame.kinetic_energy - static_cast(oracle.kinetic)) / static_cast(oracle.kinetic), 1.0e-12) | EXPECT_LE(std::abs(oracle.force.Dot(exact.velocity) - static_cast(oracle.power)) / static_cast(oracle.power_scale), 1.0e-10) | EXPECT_LE(assembly.frame.physical_strain_energy / 800.0, 1.0e-10) | EXPECT_LE(assembly.frame.drilling_energy / 800.0, 1.0e-10) | EXPECT_DOUBLE_EQ(scaled_force.Norm(), 0.0) | EXPECT_LE(scaled_force.Norm() / force_scale, 1.0e-10) | EXPECT_LE(momentum_error / static_cast(oracle.momentum_scale), 1.0e-12) | EXPECT_LE( angular_error / static_cast(oracle.angular_momentum_scale), 1.0e-12) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_LE(value / scale, 1.0e-10) | EXPECT_TRUE(fesa::hht_internal::CompleteEquilibrium( *fixture.domain, fixture.dofs, assembly, &balance) .IsOk()) | EXPECT_LE(assembly.mass.Multiply(null).Norm() / mass_norm, 1.0e-12) | EXPECT_GT(maximum_rotation, 0.5) EXPECT_LE(difference.Norm() / oracle.force.Norm(), 1.0e-12) | EXPECT_LE(std::abs(assembly.frame.kinetic_energy - static_cast(oracle.kinetic)) / static_cast(oracle.kinetic), 1.0e-12) | EXPECT_LE(std::abs(oracle.force.Dot(exact.velocity) - static_cast(oracle.power)) / static_cast(oracle.power_scale), 1.0e-10) | EXPECT_LE(assembly.frame.physical_strain_energy / 800.0, 1.0e-10) | EXPECT_LE(assembly.frame.drilling_energy / 800.0, 1.0e-10) | EXPECT_DOUBLE_EQ(scaled_force.Norm(), 0.0) | EXPECT_LE(scaled_force.Norm() / force_scale, 1.0e-10) | EXPECT_LE(momentum_error / static_cast(oracle.momentum_scale), 1.0e-12) | EXPECT_LE( angular_error / static_cast(oracle.angular_momentum_scale), 1.0e-12) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_LE(value / scale, 1.0e-10) | EXPECT_TRUE(fesa::hht_internal::CompleteEquilibrium( *fixture.domain, fixture.dofs, assembly, &balance) .IsOk()) | EXPECT_LE(assembly.mass.Multiply(null).Norm() / mass_norm, 1.0e-12) | EXPECT_GT(maximum_rotation, 0.5) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisCoefficientRadiusSurvivesSparseProjectionAndLift HhtShellPhysics.BasisCoefficientRadiusSurvivesSparseProjectionAndLift; assertion 4개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisCoefficientRadiusSurvivesSparseProjectionAndLift 유지 원문 검사 body 및 assertion 동일. 28a447ddb306564c9364deaf08aacaeeb7189e3b604a6c594230eae915501a84 28a447ddb306564c9364deaf08aacaeeb7189e3b604a6c594230eae915501a84 EXPECT_GT(lifted[3U], 0.0) | EXPECT_GE(lifted[4U], 4.0 * 0x1p-53) | EXPECT_GE(lifted[5U], 4.0 * 0x1p-53) | EXPECT_GT(projected[0U], 2.0 * 0x1p-53) EXPECT_GT(lifted[3U], 0.0) | EXPECT_GE(lifted[4U], 4.0 * 0x1p-53) | EXPECT_GE(lifted[5U], 4.0 * 0x1p-53) | EXPECT_GT(projected[0U], 2.0 * 0x1p-53) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisRadiusReplayMatchesCompensatedProjectionAndCombinedLift HhtShellPhysics.BasisRadiusReplayMatchesCompensatedProjectionAndCombinedLift; assertion 11개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisRadiusReplayMatchesCompensatedProjectionAndCombinedLift 유지 원문 검사 body 및 assertion 동일. 31474d755fe7fa0af870a6fbb2bbba642858fd2250d3d8c7e01158e109379958 31474d755fe7fa0af870a6fbb2bbba642858fd2250d3d8c7e01158e109379958 EXPECT_DOUBLE_EQ(projected[0U], 1.0) | EXPECT_DOUBLE_EQ(projection_center[0U], projected[0U]) | EXPECT_GT(projection_radius[0U], 0.0) | EXPECT_DOUBLE_EQ(lifted[0U], 1.0) | EXPECT_DOUBLE_EQ(replay.center[0U], lifted[0U]) | EXPECT_DOUBLE_EQ(plain, 0.0) | EXPECT_GE(target_radius, 0.25) | EXPECT_DOUBLE_EQ(small_replay.center[0U], small_lifted[0U]) | EXPECT_DOUBLE_EQ(small_replay.center[0U], 1.0) | ASSERT_LT(small_replay.radius[0U], 0.25) | EXPECT_GE(small_target_radius, 0.25) EXPECT_DOUBLE_EQ(projected[0U], 1.0) | EXPECT_DOUBLE_EQ(projection_center[0U], projected[0U]) | EXPECT_GT(projection_radius[0U], 0.0) | EXPECT_DOUBLE_EQ(lifted[0U], 1.0) | EXPECT_DOUBLE_EQ(replay.center[0U], lifted[0U]) | EXPECT_DOUBLE_EQ(plain, 0.0) | EXPECT_GE(target_radius, 0.25) | EXPECT_DOUBLE_EQ(small_replay.center[0U], small_lifted[0U]) | EXPECT_DOUBLE_EQ(small_replay.center[0U], 1.0) | ASSERT_LT(small_replay.radius[0U], 0.25) | EXPECT_GE(small_target_radius, 0.25) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisLiftedAlgorithmicCorrectionUsesHhtFilterFactor HhtShellPhysics.BasisLiftedAlgorithmicCorrectionUsesHhtFilterFactor; assertion 3개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.BasisLiftedAlgorithmicCorrectionUsesHhtFilterFactor 유지 원문 검사 body 및 assertion 동일. 1135c210293ec3de4a84aed758353386e122ef4db703182ee03e2b48fca4340c 1135c210293ec3de4a84aed758353386e122ef4db703182ee03e2b48fca4340c EXPECT_NEAR(projected[0U], delta_ar, 1.0e-15) | ASSERT_GT(omission_scale, 0.0) | EXPECT_GT(std::abs(omitted[0U] - delta_ar) / omission_scale, 1.0e-12) EXPECT_NEAR(projected[0U], delta_ar, 1.0e-15) | ASSERT_GT(omission_scale, 0.0) | EXPECT_GT(std::abs(omitted[0U] - delta_ar) / omission_scale, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CarriedArRadiiIncludeAbsorbedUpdatesAndInputHistory HhtShellPhysics.CarriedArRadiiIncludeAbsorbedUpdatesAndInputHistory; assertion 10개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CarriedArRadiiIncludeAbsorbedUpdatesAndInputHistory 유지 원문 검사 body 및 assertion 동일. b6ca11dc0cf68db6fc9d0a966480453e8c85dff9d3588962557189cb91cf455b b6ca11dc0cf68db6fc9d0a966480453e8c85dff9d3588962557189cb91cf455b ASSERT_EQ(std::fegetround(), FE_TONEAREST) | ASSERT_DOUBLE_EQ(doubled, 2.0 * std::numeric_limits::denorm_min()) | ASSERT_DOUBLE_EQ(rounded, 1.0) | EXPECT_GE(first, tiny) | EXPECT_GT(second, first) | EXPECT_GE(second, 2.0 * tiny) | EXPECT_GE(ProductRadius(2.0, tiny, 4.0, tiny), 6.0 * tiny) | EXPECT_GE(QuotientRadius(1.0, tiny, 2.0, 0.0), 0.5 * tiny) | EXPECT_THROW(QuotientRadius(1.0, 0.0, 1.0, 1.0), std::runtime_error) | EXPECT_TRUE(std::isinf(AddRadius(std::numeric_limits::max(), std::numeric_limits::max(), 0.0))) ASSERT_EQ(std::fegetround(), FE_TONEAREST) | ASSERT_DOUBLE_EQ(doubled, 2.0 * std::numeric_limits::denorm_min()) | ASSERT_DOUBLE_EQ(rounded, 1.0) | EXPECT_GE(first, tiny) | EXPECT_GT(second, first) | EXPECT_GE(second, 2.0 * tiny) | EXPECT_GE(ProductRadius(2.0, tiny, 4.0, tiny), 6.0 * tiny) | EXPECT_GE(QuotientRadius(1.0, tiny, 2.0, 0.0), 0.5 * tiny) | EXPECT_THROW(QuotientRadius(1.0, 0.0, 1.0, 1.0), std::runtime_error) | EXPECT_TRUE(std::isinf(AddRadius(std::numeric_limits::max(), std::numeric_limits::max(), 0.0))) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PrimaryCoordinateRetainsCorrectionAbsorbedByCarriedAr HhtShellPhysics.PrimaryCoordinateRetainsCorrectionAbsorbedByCarriedAr; assertion 6개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PrimaryCoordinateRetainsCorrectionAbsorbedByCarriedAr 유지 원문 검사 body 및 assertion 동일. 4b84aaf12146380cfb61eeebe617e119bce3a1155aa3ea45d9c020bda2c1cb42 4b84aaf12146380cfb61eeebe617e119bce3a1155aa3ea45d9c020bda2c1cb42 EXPECT_DOUBLE_EQ(pp + factor * next_ar, initial_p) | EXPECT_GT(next_p, initial_p) | EXPECT_DOUBLE_EQ(next_p - initial_p, delta_p) | EXPECT_LE(std::abs(next_p - (pp + factor * next_ar)) / scale, 1.0e-12) | EXPECT_GT(first_radius, inherited_radius) | EXPECT_GT(AddRadius(next_p + delta_p, first_radius, 0.0), first_radius) EXPECT_DOUBLE_EQ(pp + factor * next_ar, initial_p) | EXPECT_GT(next_p, initial_p) | EXPECT_DOUBLE_EQ(next_p - initial_p, delta_p) | EXPECT_LE(std::abs(next_p - (pp + factor * next_ar)) / scale, 1.0e-12) | EXPECT_GT(first_radius, inherited_radius) | EXPECT_GT(AddRadius(next_p + delta_p, first_radius, 0.0), first_radius) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CompensatedCoordinateRetainsAbsorbedNewtonCorrections HhtShellPhysics.CompensatedCoordinateRetainsAbsorbedNewtonCorrections; assertion 12개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.CompensatedCoordinateRetainsAbsorbedNewtonCorrections 유지 원문 검사 body 및 assertion 동일. f9679eaf06ac657dba93fb8d8bcd5d4b9942deb7d677c1fe4ffe86fc6f7fd072 f9679eaf06ac657dba93fb8d8bcd5d4b9942deb7d677c1fe4ffe86fc6f7fd072 EXPECT_DOUBLE_EQ(high, 1.0) | EXPECT_DOUBLE_EQ(low, delta) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_GT(radius, inherited_radius) | EXPECT_GE(UpSum(radius, std::abs(low)), inherited_radius) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, -delta) | EXPECT_DOUBLE_EQ(high, 2.0 * std::numeric_limits::denorm_min()) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_FALSE(std::isfinite(high)) | EXPECT_FALSE(std::isfinite(radius)) EXPECT_DOUBLE_EQ(high, 1.0) | EXPECT_DOUBLE_EQ(low, delta) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_GT(radius, inherited_radius) | EXPECT_GE(UpSum(radius, std::abs(low)), inherited_radius) | EXPECT_DOUBLE_EQ(high, 1.0 + std::ldexp(1.0, -52)) | EXPECT_DOUBLE_EQ(low, -delta) | EXPECT_DOUBLE_EQ(high, 2.0 * std::numeric_limits::denorm_min()) | EXPECT_DOUBLE_EQ(low, 0.0) | EXPECT_FALSE(std::isfinite(high)) | EXPECT_FALSE(std::isfinite(radius)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.FrozenGraphIndicatorIncludesCoordinateAndRateCurvature HhtShellPhysics.FrozenGraphIndicatorIncludesCoordinateAndRateCurvature; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.FrozenGraphIndicatorIncludesCoordinateAndRateCurvature 유지 원문 검사 body 및 assertion 동일. 5f98ecd78623006a570c8acf4c252ad547abf5c9d490d0888e9ec4ccb39baa08 5f98ecd78623006a570c8acf4c252ad547abf5c9d490d0888e9ec4ccb39baa08 EXPECT_GE(indicator.coordinates[1U], 2.0e-6) | EXPECT_GE(indicator.velocity[1U], 2.0e-6 + 2.0e-7) | EXPECT_GE(indicator.acceleration[1U], 4.0e-6 + 4.0e-7 + 2.0e-8) | EXPECT_TRUE(std::isfinite(indicator.acceleration[1U])) | EXPECT_GE(indicator.algorithmic_acceleration[1U], (1.0 + parameters.alpha) * indicator.acceleration[1U]) | EXPECT_TRUE(std::isinf(unresolved.coordinates[1U])) | EXPECT_TRUE(std::isinf(unresolved.velocity[1U])) | EXPECT_TRUE(std::isinf(unresolved.acceleration[1U])) EXPECT_GE(indicator.coordinates[1U], 2.0e-6) | EXPECT_GE(indicator.velocity[1U], 2.0e-6 + 2.0e-7) | EXPECT_GE(indicator.acceleration[1U], 4.0e-6 + 4.0e-7 + 2.0e-8) | EXPECT_TRUE(std::isfinite(indicator.acceleration[1U])) | EXPECT_GE(indicator.algorithmic_acceleration[1U], (1.0 + parameters.alpha) * indicator.acceleration[1U]) | EXPECT_TRUE(std::isinf(unresolved.coordinates[1U])) | EXPECT_TRUE(std::isinf(unresolved.velocity[1U])) | EXPECT_TRUE(std::isinf(unresolved.acceleration[1U])) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.GraphBasisCertificateBoundsMatrixAndRhsPerturbations HhtShellPhysics.GraphBasisCertificateBoundsMatrixAndRhsPerturbations; assertion 13개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.GraphBasisCertificateBoundsMatrixAndRhsPerturbations 유지 원문 검사 body 및 assertion 동일. d620963924f330ab1f029380440d739230f3c3341475bcdbf97a3453f7fe5339 d620963924f330ab1f029380440d739230f3c3341475bcdbf97a3453f7fe5339 ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[0U] - center[0U]), bound[0U]) | EXPECT_GT(bound[0U], 0.0) | EXPECT_GE(centered[0U], std::ldexp(1.0, -30)) | EXPECT_EQ(UpProduct(0.0, std::numeric_limits::infinity()), 0.0) | EXPECT_TRUE(std::isinf(UpProduct(0.0, std::numeric_limits::quiet_NaN()))) | EXPECT_FALSE(CertifyGraphInverse(products, &solver).complete) | EXPECT_THROW(BoundGraphSolution(products, inverse, rhs, fesa::Vector(1U), center), std::runtime_error) | ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[i] - center[i]), bound[i]) | EXPECT_GT(bound[i], 9.0) | ASSERT_TRUE(invalid_inverse.complete) | EXPECT_THROW(BoundGraphSolution(products, invalid_inverse, rhs, fesa::Vector(4U), center), std::runtime_error) ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[0U] - center[0U]), bound[0U]) | EXPECT_GT(bound[0U], 0.0) | EXPECT_GE(centered[0U], std::ldexp(1.0, -30)) | EXPECT_EQ(UpProduct(0.0, std::numeric_limits::infinity()), 0.0) | EXPECT_TRUE(std::isinf(UpProduct(0.0, std::numeric_limits::quiet_NaN()))) | EXPECT_FALSE(CertifyGraphInverse(products, &solver).complete) | EXPECT_THROW(BoundGraphSolution(products, inverse, rhs, fesa::Vector(1U), center), std::runtime_error) | ASSERT_TRUE(inverse.complete) | EXPECT_LE(std::abs(actual[i] - center[i]), bound[i]) | EXPECT_GT(bound[i], 9.0) | ASSERT_TRUE(invalid_inverse.complete) | EXPECT_THROW(BoundGraphSolution(products, invalid_inverse, rhs, fesa::Vector(4U), center), std::runtime_error) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedLastSolvePreservesOmittedTranslationDefect HhtShellPhysics.RestrictedLastSolvePreservesOmittedTranslationDefect; assertion 10개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedLastSolvePreservesOmittedTranslationDefect 유지 원문 검사 body 및 assertion 동일. c779af538471833c822bd7697c9114c63dcca6dbaa3ba7953dd8abadf7c306f2 c779af538471833c822bd7697c9114c63dcca6dbaa3ba7953dd8abadf7c306f2 ASSERT_TRUE(reduced::ShouldRefineAngular(chart, {0.0, 1.0}, {0.0, 0.0, 0.0, 0.0}, true)) | ASSERT_TRUE(selected.angular_only) | ASSERT_EQ(selected.full_indices, std::vector({1U})) | EXPECT_EQ(embedded[0U], 0.0) | EXPECT_EQ(embedded[1U], 1.0) | EXPECT_EQ(selected_residual[0U] - selected.rhs[0U], 0.0) | EXPECT_EQ(full_defect[0U], -2.0) | EXPECT_EQ(full_defect[1U], 0.0) | EXPECT_GT(std::abs(full_model[0U]), 0.0) | EXPECT_GT(std::abs(full_model[1U]), 0.0) ASSERT_TRUE(reduced::ShouldRefineAngular(chart, {0.0, 1.0}, {0.0, 0.0, 0.0, 0.0}, true)) | ASSERT_TRUE(selected.angular_only) | ASSERT_EQ(selected.full_indices, std::vector({1U})) | EXPECT_EQ(embedded[0U], 0.0) | EXPECT_EQ(embedded[1U], 1.0) | EXPECT_EQ(selected_residual[0U] - selected.rhs[0U], 0.0) | EXPECT_EQ(full_defect[0U], -2.0) | EXPECT_EQ(full_defect[1U], 0.0) | EXPECT_GT(std::abs(full_model[0U]), 0.0) | EXPECT_GT(std::abs(full_model[1U]), 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedRecordNoiseIncludesFullModelOmittedUDefect HhtShellPhysics.RestrictedRecordNoiseIncludesFullModelOmittedUDefect; assertion 6개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.RestrictedRecordNoiseIncludesFullModelOmittedUDefect 유지 원문 검사 body 및 assertion 동일. 2deecf4d898da2c40d311b18173e7ae7a11f75f87024cc2f64e1cf63d0caedd1 2deecf4d898da2c40d311b18173e7ae7a11f75f87024cc2f64e1cf63d0caedd1 ASSERT_LT(u, chart.p_columns.size()) | ASSERT_LT(angular, chart.p_columns.size()) | ASSERT_EQ(restricted_selected.full_indices, baseline_selected.full_indices) | ASSERT_NE(full_defect[u], 0.0) | EXPECT_GT(mapped_model.coordinate.Norm(), 0.0) | EXPECT_GT(restricted_noise, baseline_noise) ASSERT_LT(u, chart.p_columns.size()) | ASSERT_LT(angular, chart.p_columns.size()) | ASSERT_EQ(restricted_selected.full_indices, baseline_selected.full_indices) | ASSERT_NE(full_defect[u], 0.0) | EXPECT_GT(mapped_model.coordinate.Norm(), 0.0) | EXPECT_GT(restricted_noise, baseline_noise) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit; assertion 16개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit 유지 원문 검사 body 및 assertion 동일. 9bc51b902d77a1dbb6f75c292ca75f05e1bf8beb71bc73aef1176005d73804fd 9bc51b902d77a1dbb6f75c292ca75f05e1bf8beb71bc73aef1176005d73804fd ASSERT_EQ(grid.history.size(), 65U) | EXPECT_DOUBLE_EQ(grid.history.front().generalized_coordinates[i], exact.generalized_coordinates[i]) | EXPECT_DOUBLE_EQ(grid.history.front().velocity[i], exact.velocity[i]) | EXPECT_DOUBLE_EQ(grid.history.front().acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(grid.history.front().algorithmic_acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(frame.time, static_cast(index) / 64.0) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.generalized_coordinates.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.velocity.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.acceleration.Size(), fixture.dofs.FullDofCount()) | EXPECT_TRUE(std::isfinite((*channel)[i])) | EXPECT_LE(residual, 1.0e-10) | EXPECT_TRUE(std::isfinite((*defect)[i])) | EXPECT_EQ(grid.history.back().time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(grid.history.back().time, 1.0) | EXPECT_GT(grid.maximum_rotation, 0.5) ASSERT_EQ(grid.history.size(), 65U) | EXPECT_DOUBLE_EQ(grid.history.front().generalized_coordinates[i], exact.generalized_coordinates[i]) | EXPECT_DOUBLE_EQ(grid.history.front().velocity[i], exact.velocity[i]) | EXPECT_DOUBLE_EQ(grid.history.front().acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(grid.history.front().algorithmic_acceleration[i], exact.acceleration[i]) | EXPECT_DOUBLE_EQ(frame.time, static_cast(index) / 64.0) | EXPECT_EQ(frame.time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_EQ(frame.generalized_coordinates.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.velocity.Size(), fixture.dofs.FullDofCount()) | EXPECT_EQ(frame.acceleration.Size(), fixture.dofs.FullDofCount()) | EXPECT_TRUE(std::isfinite((*channel)[i])) | EXPECT_LE(residual, 1.0e-10) | EXPECT_TRUE(std::isfinite((*defect)[i])) | EXPECT_EQ(grid.history.back().time_integration_formulation, fesa::DynamicTimeIntegrationFormulation::kReducedCoordinateHht) | EXPECT_DOUBLE_EQ(grid.history.back().time, 1.0) | EXPECT_GT(grid.maximum_rotation, 0.5) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence; assertion 15개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence 유지 원문 검사 body 및 assertion 동일. 19dc62f139091fea4190eb7e7034119c9b725c4e46570f8acb6af9d590471c22 19dc62f139091fea4190eb7e7034119c9b725c4e46570f8acb6af9d590471c22 EXPECT_GT(grid.maximum_rotation, 0.5) | ASSERT_EQ(frame.hidden_velocity_defect.Size(), fixture.domain->Nodes().size()) | ASSERT_EQ(frame.hidden_velocity_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_TRUE(std::isfinite(values.first)) | ASSERT_TRUE(std::isfinite(values.second)) | ASSERT_GE(values.second, 0.0) | EXPECT_DOUBLE_EQ(values.first, 0.0) | EXPECT_LE(std::abs(values.first) / values.second, 1.0e-10) | EXPECT_LE(errors.back()[channel], 1.0e-4) | ASSERT_GT(errors[grid][channel], 0.0) | ASSERT_GT(errors[grid + 1U][channel], 0.0) | EXPECT_GE(std::log2(errors[grid][channel] / errors[grid + 1U][channel]), 1.8) | EXPECT_GT(errors[grid][channel], 100.0 * std::max(grids[grid].solve_noise[channel], grids[grid].arithmetic_noise[channel])) EXPECT_GT(grid.maximum_rotation, 0.5) | ASSERT_EQ(frame.hidden_velocity_defect.Size(), fixture.domain->Nodes().size()) | ASSERT_EQ(frame.hidden_velocity_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_EQ(frame.hidden_acceleration_defect_scale.Size(), frame.hidden_velocity_defect.Size()) | ASSERT_TRUE(std::isfinite(values.first)) | ASSERT_TRUE(std::isfinite(values.second)) | ASSERT_GE(values.second, 0.0) | EXPECT_DOUBLE_EQ(values.first, 0.0) | EXPECT_LE(std::abs(values.first) / values.second, 1.0e-10) | EXPECT_LE(errors.back()[channel], 1.0e-4) | ASSERT_GT(errors[grid][channel], 0.0) | ASSERT_GT(errors[grid + 1U][channel], 0.0) | EXPECT_GE(std::log2(errors[grid][channel] / errors[grid + 1U][channel]), 1.8) | EXPECT_GT(errors[grid][channel], 100.0 * std::max(grids[grid].solve_noise[channel], grids[grid].arithmetic_noise[channel])) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bInitialPhysicalSpectrumProbe HhtShellPhysics.C08bInitialPhysicalSpectrumProbe; assertion 4개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bInitialPhysicalSpectrumProbe 유지 원문 검사 body 및 assertion 동일. 7673da377048ad5e617480ff75b5ef812d216306aa82ee6bd55e576582ea3551 7673da377048ad5e617480ff75b5ef812d216306aa82ee6bd55e576582ea3551 ASSERT_EQ(matrix.Rows(), 54U) | ASSERT_EQ(matrix.Columns(), 54U) | ASSERT_EQ(matrix.RowOffsets().size(), 55U) | ASSERT_LT(column, values.size()) ASSERT_EQ(matrix.Rows(), 54U) | ASSERT_EQ(matrix.Columns(), 54U) | ASSERT_EQ(matrix.RowOffsets().size(), 55U) | ASSERT_LT(column, values.size()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid; assertion 4개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid 유지 원문 검사 body 및 assertion 동일. 874c85b16464eb1986a4f6579949282d69aec903ef832d63d9212c6eb545d4f0 874c85b16464eb1986a4f6579949282d69aec903ef832d63d9212c6eb545d4f0 ASSERT_EQ(evidence.history.size(), 65U) | EXPECT_DOUBLE_EQ(evidence.history.back().time, kEndTime) | EXPECT_GE(evidence.maximum_rotation, 0.2) | EXPECT_LT(evidence.maximum_rotation, std::acos(-1.0)) ASSERT_EQ(evidence.history.size(), 65U) | EXPECT_DOUBLE_EQ(evidence.history.back().time, kEndTime) | EXPECT_GE(evidence.maximum_rotation, 0.2) | EXPECT_LT(evidence.maximum_rotation, std::acos(-1.0)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants; assertion 11개 tests/unit/analysis/hht_shell_physics_test.cpp HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants 유지 원문 검사 body 및 assertion 동일. 33dea1e6e2f44f6945fb386065b0319493f3658f049437474babe90c53736d20 33dea1e6e2f44f6945fb386065b0319493f3658f049437474babe90c53736d20 EXPECT_GE(grids.back().maximum_rotation, 0.2) | EXPECT_LE(differences.back()[channel], 1.0e-4) | ASSERT_GT(first, 0.0) | ASSERT_GT(second, 0.0) | EXPECT_GE(first / second, threshold) | EXPECT_GT(differences[pair][channel], 100.0 * noise) | EXPECT_LT(grids[final - 1U].*member, grids[final - 2U].*member) | EXPECT_LT(grids[final].*member, grids[final - 1U].*member) | EXPECT_LE(grids[final].*member, 0.6 * (grids[final - 1U].*member)) | EXPECT_LE(grids[final].*member, 1.0e-3) | EXPECT_LE(grids.back().momentum_error, 1.0e-3) EXPECT_GE(grids.back().maximum_rotation, 0.2) | EXPECT_LE(differences.back()[channel], 1.0e-4) | ASSERT_GT(first, 0.0) | ASSERT_GT(second, 0.0) | EXPECT_GE(first / second, threshold) | EXPECT_GT(differences[pair][channel], 100.0 * noise) | EXPECT_LT(grids[final - 1U].*member, grids[final - 2U].*member) | EXPECT_LT(grids[final].*member, grids[final - 1U].*member) | EXPECT_LE(grids[final].*member, 0.6 * (grids[final - 1U].*member)) | EXPECT_LE(grids[final].*member, 1.0e-3) | EXPECT_LE(grids.back().momentum_error, 1.0e-3) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.FrozenNearestCoordinatesPassPairArithmeticWithoutChangingHigh HhtReducedIncrement.FrozenNearestCoordinatesPassPairArithmeticWithoutChangingHigh; assertion 7개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.FrozenNearestCoordinatesPassPairArithmeticWithoutChangingHigh 유지 원문 검사 body 및 assertion 동일. ba5a3f724636ab75d38249cfc9c5583f72f8a08b3c0d67109c843892031a85d2 ba5a3f724636ab75d38249cfc9c5583f72f8a08b3c0d67109c843892031a85d2 EXPECT_TRUE(first.storage_pass) | EXPECT_TRUE(first.arithmetic_pass) | EXPECT_EQ(first.defect, 0.0) | EXPECT_TRUE(worst.storage_pass) | EXPECT_TRUE(worst.arithmetic_pass) | EXPECT_EQ(worst.defect, 0.0) | EXPECT_FALSE(missing_low.arithmetic_pass) EXPECT_TRUE(first.storage_pass) | EXPECT_TRUE(first.arithmetic_pass) | EXPECT_EQ(first.defect, 0.0) | EXPECT_TRUE(worst.storage_pass) | EXPECT_TRUE(worst.arithmetic_pass) | EXPECT_EQ(worst.defect, 0.0) | EXPECT_FALSE(missing_low.arithmetic_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.StorageRequiresNearestEvenIncludingBothMidpointDirections HhtReducedIncrement.StorageRequiresNearestEvenIncludingBothMidpointDirections; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.StorageRequiresNearestEvenIncludingBothMidpointDirections 유지 원문 검사 body 및 assertion 동일. 01ead07c8dcec86cc541b6c45ad646cb7c1d2dd4d9eef28ba89436d7082a2954 01ead07c8dcec86cc541b6c45ad646cb7c1d2dd4d9eef28ba89436d7082a2954 EXPECT_TRUE(reduced::CheckPairIncrement(1.0, half_upper_spacing, 1.0, {half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(1.0, -std::ldexp(1.0, -54), 1.0, {-std::ldexp(1.0, -54)}, std::ldexp(1.0, -54)).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(-1.0, -half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(odd_tie.arithmetic_pass) | EXPECT_FALSE(odd_tie.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(-odd, half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(misplaced_high.arithmetic_pass) | EXPECT_FALSE(misplaced_high.storage_pass) EXPECT_TRUE(reduced::CheckPairIncrement(1.0, half_upper_spacing, 1.0, {half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(1.0, -std::ldexp(1.0, -54), 1.0, {-std::ldexp(1.0, -54)}, std::ldexp(1.0, -54)).storage_pass) | EXPECT_TRUE(reduced::CheckPairIncrement(-1.0, -half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(odd_tie.arithmetic_pass) | EXPECT_FALSE(odd_tie.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(-odd, half_upper_spacing, -1.0, {-half_upper_spacing}, half_upper_spacing).storage_pass) | EXPECT_TRUE(misplaced_high.arithmetic_pass) | EXPECT_FALSE(misplaced_high.storage_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.WholeUpdateAndIndependentTraceRejectMissingCorrection HhtReducedIncrement.WholeUpdateAndIndependentTraceRejectMissingCorrection; assertion 5개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.WholeUpdateAndIndependentTraceRejectMissingCorrection 유지 원문 검사 body 및 assertion 동일. 262933302f3210cf4380812f75addf653e952d4ba8595c66d7d3b5772c59b6b5 262933302f3210cf4380812f75addf653e952d4ba8595c66d7d3b5772c59b6b5 EXPECT_TRUE(valid_whole.arithmetic_pass && valid_whole.storage_pass) | EXPECT_TRUE(valid_trace.arithmetic_pass && valid_trace.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {correction, 0.0, correction}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, -2.0 * correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) EXPECT_TRUE(valid_whole.arithmetic_pass && valid_whole.storage_pass) | EXPECT_TRUE(valid_trace.arithmetic_pass && valid_trace.storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {correction, 0.0, correction}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(1.0, -2.0 * correction, 1.0, {2.0 * correction, 0.0}, 2.0 * correction).arithmetic_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ExactThresholdRejectsTailHiddenByRoundedRatio HhtReducedIncrement.ExactThresholdRejectsTailHiddenByRoundedRatio; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ExactThresholdRejectsTailHiddenByRoundedRatio 유지 원문 검사 body 및 assertion 동일. a91408b59790f93c59b20fc737d66f81ae8f8cfe1e8502b13836b5ad0efbb24e a91408b59790f93c59b20fc737d66f81ae8f8cfe1e8502b13836b5ad0efbb24e EXPECT_TRUE(equality.arithmetic_pass) | EXPECT_EQ(above.ratio, threshold) | EXPECT_FALSE(above.arithmetic_pass) | EXPECT_EQ(above_decimal.ratio, threshold) | EXPECT_FALSE(above_decimal.arithmetic_pass) | EXPECT_TRUE(below.arithmetic_pass) | EXPECT_TRUE(maximum.arithmetic_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) EXPECT_TRUE(equality.arithmetic_pass) | EXPECT_EQ(above.ratio, threshold) | EXPECT_FALSE(above.arithmetic_pass) | EXPECT_EQ(above_decimal.ratio, threshold) | EXPECT_FALSE(above_decimal.arithmetic_pass) | EXPECT_TRUE(below.arithmetic_pass) | EXPECT_TRUE(maximum.arithmetic_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ZeroScaleAndSubnormalArithmeticRemainExact HhtReducedIncrement.ZeroScaleAndSubnormalArithmeticRemainExact; assertion 8개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.ZeroScaleAndSubnormalArithmeticRemainExact 유지 원문 검사 body 및 assertion 동일. 6c6c8a54ef0f513faca05e189ae080d712597fbe859edf9c0df7169058d7086d 6c6c8a54ef0f513faca05e189ae080d712597fbe859edf9c0df7169058d7086d EXPECT_TRUE(zero.arithmetic_pass && zero.storage_pass) | EXPECT_TRUE(fixed_zero.arithmetic_pass && fixed_zero.storage_pass) | EXPECT_TRUE(tiny_valid.arithmetic_pass && tiny_valid.storage_pass) | EXPECT_EQ(tiny_valid.defect, 0.0) | EXPECT_TRUE(tiny_nonzero.storage_pass) | EXPECT_FALSE(tiny_nonzero.arithmetic_pass) | EXPECT_EQ(tiny_nonzero.defect, tiny) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, tiny, 0.0, {tiny}, tiny).storage_pass) EXPECT_TRUE(zero.arithmetic_pass && zero.storage_pass) | EXPECT_TRUE(fixed_zero.arithmetic_pass && fixed_zero.storage_pass) | EXPECT_TRUE(tiny_valid.arithmetic_pass && tiny_valid.storage_pass) | EXPECT_EQ(tiny_valid.defect, 0.0) | EXPECT_TRUE(tiny_nonzero.storage_pass) | EXPECT_FALSE(tiny_nonzero.arithmetic_pass) | EXPECT_EQ(tiny_nonzero.defect, tiny) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, tiny, 0.0, {tiny}, tiny).storage_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.NonfiniteAndOverflowFailBeforeAcceptance HhtReducedIncrement.NonfiniteAndOverflowFailBeforeAcceptance; assertion 9개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedIncrement.NonfiniteAndOverflowFailBeforeAcceptance 유지 원문 검사 body 및 assertion 동일. fb5fe44c1510d94b22e68a48f545271af54787ba6f38e7d57105f584b02eda1f fb5fe44c1510d94b22e68a48f545271af54787ba6f38e7d57105f584b02eda1f EXPECT_FALSE(reduced::CheckPairIncrement(invalid, 0.0, 0.0, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, invalid, 0.0, {0.0}, 0.0).storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, invalid, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {invalid}, 1.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {0.0}, invalid).arithmetic_pass) | EXPECT_FALSE(overflow.arithmetic_pass) | EXPECT_FALSE(overflow.storage_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) | EXPECT_FALSE(unsupported.storage_pass) EXPECT_FALSE(reduced::CheckPairIncrement(invalid, 0.0, 0.0, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, invalid, 0.0, {0.0}, 0.0).storage_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, invalid, {0.0}, 0.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {invalid}, 1.0).arithmetic_pass) | EXPECT_FALSE(reduced::CheckPairIncrement(0.0, 0.0, 0.0, {0.0}, invalid).arithmetic_pass) | EXPECT_FALSE(overflow.arithmetic_pass) | EXPECT_FALSE(overflow.storage_pass) | EXPECT_FALSE(unsupported.arithmetic_pass) | EXPECT_FALSE(unsupported.storage_pass) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.AllowsEvaluationAfterCorrection100ButNeverCorrection101 HhtReducedLifecycle.AllowsEvaluationAfterCorrection100ButNeverCorrection101; assertion 7개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.AllowsEvaluationAfterCorrection100ButNeverCorrection101 유지 원문 검사 body 및 assertion 동일. 60a86b1cfb0b9cc5f37aec09bacc49496468028cdff28ddf5010a1f482add364 60a86b1cfb0b9cc5f37aec09bacc49496468028cdff28ddf5010a1f482add364 EXPECT_TRUE(CanApplyOuterCorrection(0U)) | EXPECT_TRUE(CanApplyOuterCorrection(99U)) | EXPECT_FALSE(CanApplyOuterCorrection(100U)) | EXPECT_FALSE(CanApplyOuterCorrection(101U)) | EXPECT_EQ(corrections, 100U) | EXPECT_EQ(last_evaluation, 100U) | EXPECT_EQ(accepted, accept_at_100) EXPECT_TRUE(CanApplyOuterCorrection(0U)) | EXPECT_TRUE(CanApplyOuterCorrection(99U)) | EXPECT_FALSE(CanApplyOuterCorrection(100U)) | EXPECT_FALSE(CanApplyOuterCorrection(101U)) | EXPECT_EQ(corrections, 100U) | EXPECT_EQ(last_evaluation, 100U) | EXPECT_EQ(accepted, accept_at_100) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.FailedExecutionDoesNotPublishCandidateOrContaminateRetry HhtReducedLifecycle.FailedExecutionDoesNotPublishCandidateOrContaminateRetry; assertion 18개 tests/unit/analysis/hht_shell_physics_test.cpp HhtReducedLifecycle.FailedExecutionDoesNotPublishCandidateOrContaminateRetry 유지 원문 검사 body 및 assertion 동일. 200703a9b2cc195cf471123955a0f052d0732809a02789d894ab9df46002879a 200703a9b2cc195cf471123955a0f052d0732809a02789d894ab9df46002879a "ASSERT_TRUE(baseline.HasValue()) | ASSERT_EQ(baseline.Value().state.AcceptedFrames().size(), 3U) | EXPECT_GT(baseline.Value().state.AcceptedFrames()[1U].generalized_coordinates[0U], 0.0) | ASSERT_FALSE(failed.HasValue()) | EXPECT_EQ(failing.failures, 1U) | EXPECT_EQ(failed.GetStatus().Diagnostics().front().code, ""c10-injected-backend"") | EXPECT_NE(partial_log.find(""\tincrement=2\t""), std::string::npos) | EXPECT_NE(partial_log.find(""\toutcome=failed""), std::string::npos) | EXPECT_NE(ReadLifecycleLog(baseline_path).find(line + '\n'), std::string::npos) | EXPECT_EQ(line.find(""\tincrement=2\t""), std::string::npos) | ASSERT_TRUE(retry.HasValue()) | ASSERT_EQ(actual.size(), expected.size()) | EXPECT_EQ(actual[frame].frame_index, expected[frame].frame_index) | EXPECT_EQ(actual[frame].iteration_count, expected[frame].iteration_count) | EXPECT_EQ(actual[frame].time, expected[frame].time) | ASSERT_EQ(left.Size(), right.Size()) | EXPECT_EQ(left[i], right[i]) | EXPECT_EQ(ReadLifecycleLog(retry_path), ReadLifecycleLog(baseline_path))" "ASSERT_TRUE(baseline.HasValue()) | ASSERT_EQ(baseline.Value().state.AcceptedFrames().size(), 3U) | EXPECT_GT(baseline.Value().state.AcceptedFrames()[1U].generalized_coordinates[0U], 0.0) | ASSERT_FALSE(failed.HasValue()) | EXPECT_EQ(failing.failures, 1U) | EXPECT_EQ(failed.GetStatus().Diagnostics().front().code, ""c10-injected-backend"") | EXPECT_NE(partial_log.find(""\tincrement=2\t""), std::string::npos) | EXPECT_NE(partial_log.find(""\toutcome=failed""), std::string::npos) | EXPECT_NE(ReadLifecycleLog(baseline_path).find(line + '\n'), std::string::npos) | EXPECT_EQ(line.find(""\tincrement=2\t""), std::string::npos) | ASSERT_TRUE(retry.HasValue()) | ASSERT_EQ(actual.size(), expected.size()) | EXPECT_EQ(actual[frame].frame_index, expected[frame].frame_index) | EXPECT_EQ(actual[frame].iteration_count, expected[frame].iteration_count) | EXPECT_EQ(actual[frame].time, expected[frame].time) | ASSERT_EQ(left.Size(), right.Size()) | EXPECT_EQ(left[i], right[i]) | EXPECT_EQ(ReadLifecycleLog(retry_path), ReadLifecycleLog(baseline_path))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@1-528 helper/oracle/fixture/include/static assertion 구간: Message, Require, Add, Scale, Cross, Dot, Norm, Triple, Coordinates, Store, Fixture, MakeFixture, if, EmptyFrame, Evaluate, VolumeOracle, Integrate, OrbitChart, RigidOrbit, OrbitPhysicalRates, RigidForceRates, SparseNorm, ManufacturedHidden, CompleteManufacturedConstraints tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bff094dc63055b397162f08ce704ce39f346436a57378522c8c80557b71d9529 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@734-983 helper/oracle/fixture/include/static assertion 구간: InitializeNullVelocity, GridEvidence, RecoveredAcceleration, ArithmeticRadii, Up, UpSum, UpProduct, RoundoffRadius, AddRadius, ProductRadius, RateSumRadius, Add, Value, Radius, QuotientRadius, reduced, ProjectBasisRadii, AccumulateLiftBasisRadii, BasisLiftReplay, ReplayLiftBasisRadii, LiftBasisRadii tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 13a1ff8e33d6400d5bdcf494a3a6abe02fdbf33582c3f5de2ef4f71bf5bd18d7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@1133-1153 helper/oracle/fixture/include/static assertion 구간: AdditionLowPart, AdvanceCoordinate tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 61ed0abe9524b8e3099608f9f117ed4ed88fb40aa98039f13024486c80f3d640 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@1185-1669 helper/oracle/fixture/include/static assertion 구간: HhtCoordinateFactorRadius, RadiusNorm, GraphBasisProducts, GraphInverseCertificate, ContractGraphBasis, for, SparseFromDense, UpperRowSum, FiniteMatrix, FiniteNonnegativeMatrix, FiniteVector, FiniteNonnegativeVector, HasInfiniteRadius, FillInfinite, CertifyGraphInverse, AddPhysicalContractionRadius, BoundGraphSolution, GraphArithmeticIndicator, if tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b2e045bbe0fa0615cde9321d1f050fb0e003242df9c3c54c8ad5fa110caf906a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@1795-1925 helper/oracle/fixture/include/static assertion 구간: LastSolve, RecordNoise, for tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6b9392a417c11f51d48a97f27a0dc0542c4f005b1063414cb4b9403d1550a5e3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@2055-3075 helper/oracle/fixture/include/static assertion 구간: RecoverAcceleration, if, CompleteOriginalConstraints, RunPlate, for, Require, Trial, UpdateTrace, Differences, FrameError, RecoveredFrameError, RecoveredDifferences, AccelerationSplit tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 82a60a9bab9a1165f469ca2106a81e8e004ec8c859ea5301ab896f1da9329e8e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@3561-3596 helper/oracle/fixture/include/static assertion 구간: ReadLifecycleLog, FailAfterAcceptedIncrement, while, if tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fdaacc9c5e36ed4d024ff28652880353526b01b1ea8bb6ab1fb4b1a86e0279f5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_shell_physics_test.cpp support@3665-3666 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_shell_physics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/analysis/hht_temporal_verification_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 03565773d95b6bad350d360bb1b2b2489c81b19c5877a5c7bcc6362c951fb013 03565773d95b6bad350d360bb1b2b2489c81b19c5877a5c7bcc6362c951fb013 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C01MatchesConstantMassRecurrenceAndSecondOrder HhtTemporalVerification.C01MatchesConstantMassRecurrenceAndSecondOrder; assertion 1개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C01MatchesConstantMassRecurrenceAndSecondOrder 유지 원문 검사 body 및 assertion 동일. 17fe998913063fd19bb6401c48b979bf998384569d88bb14e42ce753c13ca7e6 17fe998913063fd19bb6401c48b979bf998384569d88bb14e42ce753c13ca7e6 EXPECT_LE(error.constant_mass_recurrence_difference, 1.0e-12) EXPECT_LE(error.constant_mass_recurrence_difference, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C03VariableMassIsSecondOrderAndNaiveWeightingIsNot HhtTemporalVerification.C03VariableMassIsSecondOrderAndNaiveWeightingIsNot; assertion 2개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C03VariableMassIsSecondOrderAndNaiveWeightingIsNot 유지 원문 검사 body 및 assertion 동일. c1215c7361ecf522a71c80084595558d3433a6afa624d162f76e2d3535f641f7 c1215c7361ecf522a71c80084595558d3433a6afa624d162f76e2d3535f641f7 EXPECT_GT(errors.back().auxiliary_difference, 0.0) | EXPECT_LT(order, 1.5) EXPECT_GT(errors.back().auxiliary_difference, 0.0) | EXPECT_LT(order, 1.5) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aCoupledMasslessCoordinatesHaveSecondOrder HhtTemporalVerification.C04aCoupledMasslessCoordinatesHaveSecondOrder; assertion 2개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aCoupledMasslessCoordinatesHaveSecondOrder 유지 원문 검사 body 및 assertion 동일. 3b88debb5cff0df98f0085bd9f58e4fc847d99251be567cee3fb1e277d42e2c0 3b88debb5cff0df98f0085bd9f58e4fc847d99251be567cee3fb1e277d42e2c0 EXPECT_LE(errors[grid].constant_mass_recurrence_difference, 1.0e-12) | EXPECT_LE(errors[grid].reduced_difference, 1.0e-10) EXPECT_LE(errors[grid].constant_mass_recurrence_difference, 1.0e-12) | EXPECT_LE(errors[grid].reduced_difference, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved; assertion 1개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved 유지 원문 검사 body 및 assertion 동일. 29e3b4fcb4310f058433aebe1547c1b5df41000e2e29b6cae9506c8dc4960555 29e3b4fcb4310f058433aebe1547c1b5df41000e2e29b6cae9506c8dc4960555 EXPECT_LE(error.reduced_difference, 1.0e-10) EXPECT_LE(error.reduced_difference, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04bFullCartesianMovingNullConverges HhtTemporalVerification.C04bFullCartesianMovingNullConverges; assertion 5개 tests/unit/analysis/hht_temporal_verification_test.cpp HhtTemporalVerification.C04bFullCartesianMovingNullConverges 유지 원문 검사 body 및 assertion 동일. d6e5f3a57a0983661a209be99ff249fae0ce28d7343f1a2d0e74de29a2ccfc95 d6e5f3a57a0983661a209be99ff249fae0ce28d7343f1a2d0e74de29a2ccfc95 EXPECT_LE(error.position_constraint, 1.0e-10) | EXPECT_LT(errors[grid].hidden_velocity, errors[grid - 1U].hidden_velocity) | EXPECT_LT(errors[grid].hidden_acceleration, errors[grid - 1U].hidden_acceleration) | EXPECT_LE(errors.back().hidden_velocity, 1.0e-6) | EXPECT_LE(errors.back().hidden_acceleration, 1.0e-4) EXPECT_LE(error.position_constraint, 1.0e-10) | EXPECT_LT(errors[grid].hidden_velocity, errors[grid - 1U].hidden_velocity) | EXPECT_LT(errors[grid].hidden_acceleration, errors[grid - 1U].hidden_acceleration) | EXPECT_LE(errors.back().hidden_velocity, 1.0e-6) | EXPECT_LE(errors.back().hidden_acceleration, 1.0e-4) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp support@1-451 helper/oracle/fixture/include/static assertion 구간: Case, ExactState, Dimension, Exact, if, Amplitudes, Equation, Evaluate, Multiply, Solve, Effective, Errors, Integrate, Sweep tests/unit/analysis/hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c427466b945f2d0b9cbfec1a629323a8f2d81fd7574c29f611baa1e6c07860ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_temporal_verification_test.cpp support@506-507 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_time_integration_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/analysis/hht_time_integration_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 068a7d057ec10b7f70a883d56ad54bb12f20873028b3bd7c34a1eb5c29adce20 068a7d057ec10b7f70a883d56ad54bb12f20873028b3bd7c34a1eb5c29adce20 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.KeepsPhysicalAndAlgorithmicAccelerationDistinct HhtTimeIntegrationTest.KeepsPhysicalAndAlgorithmicAccelerationDistinct; assertion 6개 tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.KeepsPhysicalAndAlgorithmicAccelerationDistinct 유지 원문 검사 body 및 assertion 동일. bc5623fd45c2fb228f48298ee47d4f1c5a287a1d18591f8e4f618814f7ffd9b8 bc5623fd45c2fb228f48298ee47d4f1c5a287a1d18591f8e4f618814f7ffd9b8 ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_NEAR(rates.Value().algorithmic_acceleration[0U], 2.0, 1e-14) | EXPECT_NEAR(rates.Value().acceleration[0U], 1.95 / 0.95, 1e-14) | EXPECT_NEAR(rates.Value().velocity[0U], 0.155, 1e-14) ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_NEAR(rates.Value().algorithmic_acceleration[0U], 2.0, 1e-14) | EXPECT_NEAR(rates.Value().acceleration[0U], 1.95 / 0.95, 1e-14) | EXPECT_NEAR(rates.Value().velocity[0U], 0.155, 1e-14) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.RejectsInvalidParametersAndTime HhtTimeIntegrationTest.RejectsInvalidParametersAndTime; assertion 7개 tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.RejectsInvalidParametersAndTime 유지 원문 검사 body 및 assertion 동일. 8f052b7f1a3b8fb822dc564e2365883b6827c3e9f566e2fd07dc2a67c9246816 8f052b7f1a3b8fb822dc564e2365883b6827c3e9f566e2fd07dc2a67c9246816 EXPECT_FALSE(MakeHhtParameters(0.01).HasValue()) | EXPECT_FALSE(MakeHhtParameters(-0.34).HasValue()) | ASSERT_TRUE(MakeHhtParameters(-1.0 / 3.0).HasValue()) | ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(parameters.Value().beta, 0.25) | EXPECT_EQ(parameters.Value().gamma, 0.5) | EXPECT_FALSE(PredictHht(zero, zero, zero, 0.0, parameters.Value()).HasValue()) EXPECT_FALSE(MakeHhtParameters(0.01).HasValue()) | EXPECT_FALSE(MakeHhtParameters(-0.34).HasValue()) | ASSERT_TRUE(MakeHhtParameters(-1.0 / 3.0).HasValue()) | ASSERT_TRUE(parameters.HasValue()) | EXPECT_EQ(parameters.Value().beta, 0.25) | EXPECT_EQ(parameters.Value().gamma, 0.5) | EXPECT_FALSE(PredictHht(zero, zero, zero, 0.0, parameters.Value()).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.StepOscillatorHasSecondOrderMaximumError HhtTimeIntegrationTest.StepOscillatorHasSecondOrderMaximumError; assertion 9개 tests/unit/analysis/hht_time_integration_test.cpp HhtTimeIntegrationTest.StepOscillatorHasSecondOrderMaximumError 유지 원문 검사 body 및 assertion 동일. 75ff32c40233ae10ed77f6cd3ffb13361d13d1c6a0acb05720d450f0d5f4d053 75ff32c40233ae10ed77f6cd3ffb13361d13d1c6a0acb05720d450f0d5f4d053 ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_GE(std::log2(previous_q / error_q), 1.8) | EXPECT_GE(std::log2(previous_v / error_v), 1.8) | EXPECT_GE(std::log2(previous_a / error_a), 1.8) | EXPECT_LT(error_q, 1e-4) | EXPECT_LT(error_v, 1e-4) | EXPECT_LT(error_a, 1e-4) ASSERT_TRUE(parameters.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_GE(std::log2(previous_q / error_q), 1.8) | EXPECT_GE(std::log2(previous_v / error_v), 1.8) | EXPECT_GE(std::log2(previous_a / error_a), 1.8) | EXPECT_LT(error_q, 1e-4) | EXPECT_LT(error_v, 1e-4) | EXPECT_LT(error_a, 1e-4) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/hht_time_integration_test.cpp support@1-9 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/analysis/hht_time_integration_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ae92a1fab37e019e61be13e7179238f0a1920b5d84bd46e196d22971dc9f979d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_time_integration_test.cpp support@40-41 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/hht_time_integration_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5f00a39140d4b7cac4217349f6c92160b11694234e9665516332598cd78d2637 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/hht_time_integration_test.cpp support@95-97 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/analysis/hht_time_integration_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/analysis/newton_iteration_log_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d3101c094646165ee241aa223245bcbf7d58accb1a8f018d2c83fed3f484b9dc d3101c094646165ee241aa223245bcbf7d58accb1a8f018d2c83fed3f484b9dc 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.WritesOneLfTerminated39FieldRecordInApprovedOrder NewtonIterationLog.WritesOneLfTerminated39FieldRecordInApprovedOrder; assertion 4개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.WritesOneLfTerminated39FieldRecordInApprovedOrder 유지 원문 검사 body 및 assertion 동일. 478006c691de24dd68fd00fb670f08f3df30134ddab9b8d2c1300bcb3bbf9b9b 478006c691de24dd68fd00fb670f08f3df30134ddab9b8d2c1300bcb3bbf9b9b "ASSERT_EQ(fields.size(), labels.size()) | EXPECT_EQ(fields[index].substr(0U, fields[index].find('=')), labels[index]) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=nsnr-log-v1"")" "ASSERT_EQ(fields.size(), labels.size()) | EXPECT_EQ(fields[index].substr(0U, fields[index].find('=')), labels[index]) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=nsnr-log-v1"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.FormatsFiniteNumbersForLocaleIndependentRoundTrip NewtonIterationLog.FormatsFiniteNumbersForLocaleIndependentRoundTrip; assertion 5개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.FormatsFiniteNumbersForLocaleIndependentRoundTrip 유지 원문 검사 body 및 assertion 동일. af49c065bc4263fecd936356c425497319528bab0b5bbf04bcc82a252eac4ed0 af49c065bc4263fecd936356c425497319528bab0b5bbf04bcc82a252eac4ed0 EXPECT_EQ(result.ec, std::errc{}) | EXPECT_EQ(result.ptr, value.data() + value.size()) | EXPECT_DOUBLE_EQ(parsed, 0.12345678901234567) | EXPECT_NE(value.find('.'), std::string::npos) | EXPECT_EQ(value.find(','), std::string::npos) EXPECT_EQ(result.ec, std::errc{}) | EXPECT_EQ(result.ptr, value.data() + value.size()) | EXPECT_DOUBLE_EQ(parsed, 0.12345678901234567) | EXPECT_NE(value.find('.'), std::string::npos) | EXPECT_EQ(value.find(','), std::string::npos) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesChannelDecisionsAndExplicitOutcomeFields NewtonIterationLog.SerializesChannelDecisionsAndExplicitOutcomeFields; assertion 13개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesChannelDecisionsAndExplicitOutcomeFields 유지 원문 검사 body 및 assertion 동일. a72dbdfb59417fdad8806c162889401a17f516cfe5f527c4b08d6bfd1c12d076 a72dbdfb59417fdad8806c162889401a17f516cfe5f527c4b08d6bfd1c12d076 "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_channel""), std::string{prefix} + ""_channel="" + std::string{prefix}) | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0.0012345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=1.2345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=relative"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.01"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold_unit""), std::string{prefix} + ""_threshold_unit=1"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_pass""), std::string{prefix} + ""_pass=1"") | EXPECT_EQ(FieldValue(fields, ""last_completed_stage""), ""last_completed_stage=convergence-gates"") | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=none"") | EXPECT_EQ(FieldValue(fields, ""combined_pass""), ""combined_pass=1"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=accept"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=accepted"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=none"")" "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_channel""), std::string{prefix} + ""_channel="" + std::string{prefix}) | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0.0012345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=1.2345678901234567"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=relative"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.01"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold_unit""), std::string{prefix} + ""_threshold_unit=1"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_pass""), std::string{prefix} + ""_pass=1"") | EXPECT_EQ(FieldValue(fields, ""last_completed_stage""), ""last_completed_stage=convergence-gates"") | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=none"") | EXPECT_EQ(FieldValue(fields, ""combined_pass""), ""combined_pass=1"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=accept"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=accepted"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=none"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEmptyChannelsAsTypedZeroScaleDecisions NewtonIterationLog.SerializesEmptyChannelsAsTypedZeroScaleDecisions; assertion 8개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEmptyChannelsAsTypedZeroScaleDecisions 유지 원문 검사 body 및 assertion 동일. 52595116ab45dfc4a15efc3027ebda7ed94578e61ba5516a49952da4787b3aea 52595116ab45dfc4a15efc3027ebda7ed94578e61ba5516a49952da4787b3aea "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.001"") | EXPECT_EQ(FieldValue(fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | EXPECT_EQ(FieldValue(fields, ""correction_translation_threshold_unit""), ""correction_translation_threshold_unit=length"") | EXPECT_EQ(FieldValue(fields, ""correction_rotation_threshold_unit""), ""correction_rotation_threshold_unit=1"")" "EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_numerator_norm""), std::string{prefix} + ""_numerator_norm=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_denominator_scale""), std::string{prefix} + ""_denominator_scale=0"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_branch""), std::string{prefix} + ""_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, std::string{prefix} + ""_threshold""), std::string{prefix} + ""_threshold=0.001"") | EXPECT_EQ(FieldValue(fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | EXPECT_EQ(FieldValue(fields, ""correction_translation_threshold_unit""), ""correction_translation_threshold_unit=length"") | EXPECT_EQ(FieldValue(fields, ""correction_rotation_threshold_unit""), ""correction_rotation_threshold_unit=1"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.EscapesStringsAndOmitsUnevaluatedFailureFields NewtonIterationLog.EscapesStringsAndOmitsUnevaluatedFailureFields; assertion 5개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.EscapesStringsAndOmitsUnevaluatedFailureFields 유지 원문 검사 body 및 assertion 동일. 2f3470b4d8bf9aacf7f50890f7b53816dfe990193f8af3a6d0cc066b88f7037d 2f3470b4d8bf9aacf7f50890f7b53816dfe990193f8af3a6d0cc066b88f7037d "EXPECT_EQ(ValueAfterEquals(fields[index]), not_evaluated) | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=load-boundary"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=fail\\ttransition"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\nrecord"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=external\\\\load\\r\\0"")" "EXPECT_EQ(ValueAfterEquals(fields[index]), not_evaluated) | EXPECT_EQ(FieldValue(fields, ""failing_stage""), ""failing_stage=load-boundary"") | EXPECT_EQ(FieldValue(fields, ""transition""), ""transition=fail\\ttransition"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\nrecord"") | EXPECT_EQ(FieldValue(fields, ""diagnostic_code""), ""diagnostic_code=external\\\\load\\r\\0"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.ReportsWriteFlushAndCloseStateFailures NewtonIterationLog.ReportsWriteFlushAndCloseStateFailures; assertion 2개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.ReportsWriteFlushAndCloseStateFailures 유지 원문 검사 body 및 assertion 동일. af4d515b9dc0ca7b6af0fa1cfae5d26577b3efc5ab172f3ee816db7044509e96 af4d515b9dc0ca7b6af0fa1cfae5d26577b3efc5ab172f3ee816db7044509e96 ASSERT_TRUE(closed_writer.Open(path).IsOk()) | ASSERT_TRUE(closed_writer.Close().IsOk()) ASSERT_TRUE(closed_writer.Open(path).IsOk()) | ASSERT_TRUE(closed_writer.Close().IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.LeavesZeroByteLogForNonNewtonControlledFailurePath NewtonIterationLog.LeavesZeroByteLogForNonNewtonControlledFailurePath; assertion 4개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.LeavesZeroByteLogForNonNewtonControlledFailurePath 유지 원문 검사 body 및 assertion 동일. 6e9b83153024bcd0b3e29402a533faf17fa26d708db7bc574ee13b8a1ffa9902 6e9b83153024bcd0b3e29402a533faf17fa26d708db7bc574ee13b8a1ffa9902 ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_TRUE(std::filesystem::exists(path)) | EXPECT_EQ(std::filesystem::file_size(path), 0U) ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_TRUE(std::filesystem::exists(path)) | EXPECT_EQ(std::filesystem::file_size(path), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEvaluatorProducedExternalScaleResidualDecisions NewtonIterationLog.SerializesEvaluatorProducedExternalScaleResidualDecisions; assertion 19개 tests/unit/analysis/newton_iteration_log_test.cpp NewtonIterationLog.SerializesEvaluatorProducedExternalScaleResidualDecisions 유지 원문 검사 body 및 assertion 동일. 883a7d046a0275863ab3ba8717420a46120cd4730070a07ebf692cad2fdc6b1c 883a7d046a0275863ab3ba8717420a46120cd4730070a07ebf692cad2fdc6b1c "ASSERT_EQ(zero_fields.size(), 39U) | EXPECT_EQ(FieldValue(zero_fields, ""schema""), ""schema=nsnr-log-v1"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_branch""), ""residual_force_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_branch""), ""residual_moment_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold""), ""residual_force_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | ASSERT_EQ(relative_fields.size(), 39U) | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_branch""), ""residual_force_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_branch""), ""residual_moment_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold""), ""residual_force_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=1"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=1"")" "ASSERT_EQ(zero_fields.size(), 39U) | EXPECT_EQ(FieldValue(zero_fields, ""schema""), ""schema=nsnr-log-v1"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=0"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_branch""), ""residual_force_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_branch""), ""residual_moment_branch=zero-scale"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold""), ""residual_force_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.001"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=force"") | EXPECT_EQ(FieldValue(zero_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=force*length"") | ASSERT_EQ(relative_fields.size(), 39U) | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_denominator_scale""), ""residual_force_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_denominator_scale""), ""residual_moment_denominator_scale=2"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_branch""), ""residual_force_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_branch""), ""residual_moment_branch=relative"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold""), ""residual_force_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold""), ""residual_moment_threshold=0.01"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_force_threshold_unit""), ""residual_force_threshold_unit=1"") | EXPECT_EQ(FieldValue(relative_fields, ""residual_moment_threshold_unit""), ""residual_moment_threshold_unit=1"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.WritesTimeAndAllTwoChannelMetrics DynamicNewtonIterationLog.WritesTimeAndAllTwoChannelMetrics; assertion 24개 tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.WritesTimeAndAllTwoChannelMetrics 유지 원문 검사 body 및 assertion 동일. 21230f3c31871e11f03f9fb62d0be2dc01e29447bf22847af4e642acd48094d0 21230f3c31871e11f03f9fb62d0be2dc01e29447bf22847af4e642acd48094d0 "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | ASSERT_FALSE(bytes.empty()) | EXPECT_EQ(bytes.back(), '\n') | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(bytes.find('\r'), std::string::npos) | EXPECT_EQ(bytes.find(""target_factor""), std::string::npos) | EXPECT_EQ(bytes.find(""nsnr-log-v1""), std::string::npos) | EXPECT_EQ(fields.size(), 24U) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=dynamic-newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=hht-log-v1"") | EXPECT_EQ(FieldValue(fields, ""increment""), ""increment=2"") | EXPECT_EQ(FieldValue(fields, ""iteration""), ""iteration=3"") | EXPECT_EQ(FieldValue(fields, ""time""), ""time=0.25"") | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=convergence"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=relative"") | EXPECT_EQ(FieldValue(fields, ""residual_phi_branch""), ""residual_phi_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=1"") | EXPECT_EQ(FieldValue(fields, ""correction_pass""), ""correction_pass=1"") | EXPECT_EQ(parsed.ec, std::errc{}) | EXPECT_EQ(parsed.ptr, text.data() + text.size()) | EXPECT_DOUBLE_EQ(value, metric.second)" "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | ASSERT_FALSE(bytes.empty()) | EXPECT_EQ(bytes.back(), '\n') | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(bytes.find('\r'), std::string::npos) | EXPECT_EQ(bytes.find(""target_factor""), std::string::npos) | EXPECT_EQ(bytes.find(""nsnr-log-v1""), std::string::npos) | EXPECT_EQ(fields.size(), 24U) | EXPECT_EQ(FieldValue(fields, ""record""), ""record=dynamic-newton-iteration"") | EXPECT_EQ(FieldValue(fields, ""schema""), ""schema=hht-log-v1"") | EXPECT_EQ(FieldValue(fields, ""increment""), ""increment=2"") | EXPECT_EQ(FieldValue(fields, ""iteration""), ""iteration=3"") | EXPECT_EQ(FieldValue(fields, ""time""), ""time=0.25"") | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=convergence"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=relative"") | EXPECT_EQ(FieldValue(fields, ""residual_phi_branch""), ""residual_phi_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=1"") | EXPECT_EQ(FieldValue(fields, ""correction_pass""), ""correction_pass=1"") | EXPECT_EQ(parsed.ec, std::errc{}) | EXPECT_EQ(parsed.ptr, text.data() + text.size()) | EXPECT_DOUBLE_EQ(value, metric.second)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.EscapesFailureContextAndKeepsZeroScaleFailure DynamicNewtonIterationLog.EscapesFailureContextAndKeepsZeroScaleFailure; assertion 11개 tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.EscapesFailureContextAndKeepsZeroScaleFailure 유지 원문 검사 body 및 assertion 동일. 0f65cd37830b1416f99088775f625be1000782b62f4d62110c4c68d39859d164 0f65cd37830b1416f99088775f625be1000782b62f4d62110c4c68d39859d164 "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=mass\\tcheck"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\ntrial"") | EXPECT_EQ(FieldValue(fields, ""failure_code""), ""failure_code=dynamic\\\\mass\\rregularity"") | EXPECT_EQ(FieldValue(fields, ""residual_u_numerator""), ""residual_u_numerator=1"") | EXPECT_EQ(FieldValue(fields, ""residual_u_scale""), ""residual_u_scale=0"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=0"")" "ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(record).IsOk()) | ASSERT_TRUE(writer.Close().IsOk()) | EXPECT_EQ(std::count(bytes.begin(), bytes.end(), '\n'), 1) | EXPECT_EQ(FieldValue(fields, ""stage""), ""stage=mass\\tcheck"") | EXPECT_EQ(FieldValue(fields, ""outcome""), ""outcome=failed\\ntrial"") | EXPECT_EQ(FieldValue(fields, ""failure_code""), ""failure_code=dynamic\\\\mass\\rregularity"") | EXPECT_EQ(FieldValue(fields, ""residual_u_numerator""), ""residual_u_numerator=1"") | EXPECT_EQ(FieldValue(fields, ""residual_u_scale""), ""residual_u_scale=0"") | EXPECT_EQ(FieldValue(fields, ""residual_u_branch""), ""residual_u_branch=zero-scale"") | EXPECT_EQ(FieldValue(fields, ""residual_pass""), ""residual_pass=0"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.InvalidEvidencePreservesFlushedPrefixAndFailsLifecycle DynamicNewtonIterationLog.InvalidEvidencePreservesFlushedPrefixAndFailsLifecycle; assertion 4개 tests/unit/analysis/newton_iteration_log_test.cpp DynamicNewtonIterationLog.InvalidEvidencePreservesFlushedPrefixAndFailsLifecycle 유지 원문 검사 body 및 assertion 동일. 6b1f341aed7b1b9de8b7a2a0f6a8da67a51219a45b3cd7d50ed8535e224165bc 6b1f341aed7b1b9de8b7a2a0f6a8da67a51219a45b3cd7d50ed8535e224165bc ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(CompleteDynamicRecord()).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | EXPECT_EQ(ReadLogBytes(path), prefix) ASSERT_TRUE(writer.Open(path).IsOk()) | ASSERT_TRUE(writer.Write(CompleteDynamicRecord()).IsOk()) | ASSERT_TRUE(writer.Flush().IsOk()) | EXPECT_EQ(ReadLogBytes(path), prefix) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@1-148 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, ExpectLogOutputFailure, SplitTabs, while, FieldValue, for, ValueAfterEquals, VectorFrom, MakeDecision, CompleteRecord, WriteAndRead tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3f36093d9eeb5955577586d7074fcf8e441c479b923ff29b85d93f9fa0a014db 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@181-182 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 19386ea2961b53078a1506ac96caf435499c2ce389a6c4bc8b1d1334e3450291 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@198-199 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f968f62ecd764a93d0aebdeb90b34d4f95aea19862f1025a8f99eeaa0f513e90 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@233-234 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 66bb75d8fde94c7f7e4f4ae4f2d8b281f4bd149a8cda9b86613f7499da6a8973 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@275-276 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 71ce16e6c3d23ad2f7d4620ddc39c24e95471753e20be5b664c828f13cb2ebb1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@303-304 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2289d04b1dccb850b21a2112940a26b854cfb47de6032c0404ffd2a9a1257809 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@324-325 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ed7ec9f2fea8c0942706f056482e9ebbdd7f1c498b5b8ba0a274bdb7a0e1705b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@336-337 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 611c87e9e2a44fb7f16bfcb907f0ca1acf1ffc4101a78393551ee362850e63bf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@416-439 helper/oracle/fixture/include/static assertion 구간: CompleteDynamicRecord, ReadLogBytes tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9f652c12fbac5b067b0d88e3ec7dcfe31f9bb9bdad34b6a378d15c84ae567c39 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/newton_iteration_log_test.cpp support@564-565 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/newton_iteration_log_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/analysis/nonlinear_analysis_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 71de713d652861fd086471944762c2ce289442e6e2ba2e259db76fad20e63db1 71de713d652861fd086471944762c2ce289442e6e2ba2e259db76fad20e63db1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CreatesFactorZeroBaselineInStableIdentityOrder NonlinearAnalysisState.CreatesFactorZeroBaselineInStableIdentityOrder; assertion 10개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CreatesFactorZeroBaselineInStableIdentityOrder 유지 원문 검사 body 및 assertion 동일. e055bd3a2aa163dedf599de37840273eb34bd74e59a8a94225360994929673f3 e055bd3a2aa163dedf599de37840273eb34bd74e59a8a94225360994929673f3 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(committed.increment_index, 0U) | EXPECT_DOUBLE_EQ(committed.load_factor, 0.0) | EXPECT_TRUE(committed.is_factor_zero_baseline) | EXPECT_TRUE(result.Value().AcceptedFrames().empty()) | ASSERT_EQ(committed.nodal_internal_order.size(), fixture.domain->Nodes().size()) | ASSERT_EQ(committed.nodal_source_ids.size(), fixture.domain->Nodes().size()) | EXPECT_EQ(committed.nodal_internal_order[node], node) | ASSERT_EQ(vector->Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ((*vector)[index], 0.0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(committed.increment_index, 0U) | EXPECT_DOUBLE_EQ(committed.load_factor, 0.0) | EXPECT_TRUE(committed.is_factor_zero_baseline) | EXPECT_TRUE(result.Value().AcceptedFrames().empty()) | ASSERT_EQ(committed.nodal_internal_order.size(), fixture.domain->Nodes().size()) | ASSERT_EQ(committed.nodal_source_ids.size(), fixture.domain->Nodes().size()) | EXPECT_EQ(committed.nodal_internal_order[node], node) | ASSERT_EQ(vector->Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ((*vector)[index], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsInvalidBaselineInventoryBeforeStateCreation NonlinearAnalysisState.RejectsInvalidBaselineInventoryBeforeStateCreation; assertion 1개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsInvalidBaselineInventoryBeforeStateCreation 유지 원문 검사 body 및 assertion 동일. 4ec9496b06d3904c913dea2c3ce00de01fbb8f56585ffc969b4c3ef52fcd464d 4ec9496b06d3904c913dea2c3ce00de01fbb8f56585ffc969b4c3ef52fcd464d EXPECT_FALSE(result.HasValue()) EXPECT_FALSE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsNonfiniteBaselineAndDofMismatch NonlinearAnalysisState.RejectsNonfiniteBaselineAndDofMismatch; assertion 4개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.RejectsNonfiniteBaselineAndDofMismatch 유지 원문 검사 body 및 assertion 동일. 3ba1563177a1cb2640413807396826918fd0e25aa71517fdf1ec53fb5054735a 3ba1563177a1cb2640413807396826918fd0e25aa71517fdf1ec53fb5054735a EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_triad) .HasValue()) | EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_director) .HasValue()) | ASSERT_TRUE(empty_domain_result.HasValue()) | EXPECT_FALSE(dof_mismatch.HasValue()) EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_triad) .HasValue()) | EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( *fixture.domain, *fixture.dofs, nonfinite_director) .HasValue()) | ASSERT_TRUE(empty_domain_result.HasValue()) | EXPECT_FALSE(dof_mismatch.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.PreservesDuplicateLabelsWhenInstancesDiffer NonlinearAnalysisState.PreservesDuplicateLabelsWhenInstancesDiffer; assertion 7개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.PreservesDuplicateLabelsWhenInstancesDiffer 유지 원문 검사 body 및 assertion 동일. e5a32acb933b1e65d2b1efef48bdee5223bd4276460d245229bf10410bfbf59b e5a32acb933b1e65d2b1efef48bdee5223bd4276460d245229bf10410bfbf59b ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().CommittedState().nodal_source_ids.size(), 2U) | EXPECT_EQ(result.Value().CommittedState().nodal_source_ids[0U].source_label, result.Value().CommittedState().nodal_source_ids[1U].source_label) | EXPECT_NE(result.Value().CommittedState().nodal_source_ids[0U].instance_name, result.Value().CommittedState().nodal_source_ids[1U].instance_name) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().CommittedState().nodal_source_ids.size(), 2U) | EXPECT_EQ(result.Value().CommittedState().nodal_source_ids[0U].source_label, result.Value().CommittedState().nodal_source_ids[1U].source_label) | EXPECT_NE(result.Value().CommittedState().nodal_source_ids[0U].instance_name, result.Value().CommittedState().nodal_source_ids[1U].instance_name) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StartsIndependentTrialAndDiscardPreservesCommit NonlinearAnalysisState.StartsIndependentTrialAndDiscardPreservesCommit; assertion 3개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StartsIndependentTrialAndDiscardPreservesCommit 유지 원문 검사 body 및 assertion 동일. c8246ffc811a47dcc57b704918eb2f14188fef66dd65d0f63ce0892482986949 c8246ffc811a47dcc57b704918eb2f14188fef66dd65d0f63ce0892482986949 ASSERT_TRUE(trial.HasValue()) | EXPECT_NE(trial.Value().displacement.Data(), state.CommittedState().displacement.Data()) | EXPECT_DOUBLE_EQ(state.CommittedState().nodal_director[0U][2U], 1.0) ASSERT_TRUE(trial.HasValue()) | EXPECT_NE(trial.Value().displacement.Data(), state.CommittedState().displacement.Data()) | EXPECT_DOUBLE_EQ(state.CommittedState().nodal_director[0U][2U], 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CommitsOnlyStableCompleteAcceptedFrames NonlinearAnalysisState.CommitsOnlyStableCompleteAcceptedFrames; assertion 16개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.CommitsOnlyStableCompleteAcceptedFrames 유지 원문 검사 body 및 assertion 동일. c2c798a56a4a0a3e7e44c9a7208e608f5244ce3ba8f2e2204f03adf4dafdbac9 c2c798a56a4a0a3e7e44c9a7208e608f5244ce3ba8f2e2204f03adf4dafdbac9 ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(state.AcceptedFrames()[0U].frame_index, 0U) | EXPECT_EQ(state.AcceptedFrames()[0U].increment_index, 1U) | EXPECT_FALSE(state.AcceptedFrames()[0U].is_factor_one) | EXPECT_EQ(state.CommittedState().increment_index, 1U) | EXPECT_FALSE(state.CommittedState().is_factor_zero_baseline) | EXPECT_DOUBLE_EQ(state.CommittedState().residual[0U], 5.0) | EXPECT_DOUBLE_EQ(state.CommittedState().reaction[0U], 5.0) | ASSERT_EQ(state.CommittedState().shell_results.size(), 4U) | EXPECT_EQ(state.CommittedState().shell_results[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.CommittedState().shell_results[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | ASSERT_TRUE(state.CommitAcceptedFrame(final_frame).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 2U) | EXPECT_EQ(state.AcceptedFrames()[1U].frame_index, 1U) | EXPECT_TRUE(state.AcceptedFrames()[1U].is_factor_one) ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(state.AcceptedFrames()[0U].frame_index, 0U) | EXPECT_EQ(state.AcceptedFrames()[0U].increment_index, 1U) | EXPECT_FALSE(state.AcceptedFrames()[0U].is_factor_one) | EXPECT_EQ(state.CommittedState().increment_index, 1U) | EXPECT_FALSE(state.CommittedState().is_factor_zero_baseline) | EXPECT_DOUBLE_EQ(state.CommittedState().residual[0U], 5.0) | EXPECT_DOUBLE_EQ(state.CommittedState().reaction[0U], 5.0) | ASSERT_EQ(state.CommittedState().shell_results.size(), 4U) | EXPECT_EQ(state.CommittedState().shell_results[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.CommittedState().shell_results[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | ASSERT_TRUE(state.CommitAcceptedFrame(final_frame).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 2U) | EXPECT_EQ(state.AcceptedFrames()[1U].frame_index, 1U) | EXPECT_TRUE(state.AcceptedFrames()[1U].is_factor_one) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsMalformedAcceptedFrames NonlinearAnalysisState.AtomicallyRejectsMalformedAcceptedFrames; assertion 7개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsMalformedAcceptedFrames 유지 원문 검사 body 및 assertion 동일. c5236c5ae93e09ba72c3ae4a4deefec8eff58282d70ec1a3125f9895785189f5 c5236c5ae93e09ba72c3ae4a4deefec8eff58282d70ec1a3125f9895785189f5 "ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_EQ(state.AcceptedFrames().size(), frame_count) | EXPECT_EQ(state.CommittedState().increment_index, before.increment_index) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" "ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_EQ(state.AcceptedFrames().size(), frame_count) | EXPECT_EQ(state.CommittedState().increment_index, before.increment_index) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsNonfiniteAcceptedFrame NonlinearAnalysisState.AtomicallyRejectsNonfiniteAcceptedFrame; assertion 6개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.AtomicallyRejectsNonfiniteAcceptedFrame 유지 원문 검사 body 및 assertion 동일. cc5e4a6773c3318499122f00929c214489dbb84190929c6eb5997ced2860c51c cc5e4a6773c3318499122f00929c214489dbb84190929c6eb5997ced2860c51c "ASSERT_TRUE(state.CommitAcceptedFrame(valid).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" "ASSERT_TRUE(state.CommitAcceptedFrame(valid).IsOk()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-accepted-state"") | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StoresNoUnapprovedVerificationMetrics NonlinearAnalysisState.StoresNoUnapprovedVerificationMetrics; assertion 2개 tests/unit/analysis/nonlinear_analysis_state_test.cpp NonlinearAnalysisState.StoresNoUnapprovedVerificationMetrics 유지 원문 검사 body 및 assertion 동일. b69ab505986f7c4e96d680112f051eb4ad264b5a4b0d00534017599fbcec886d b69ab505986f7c4e96d680112f051eb4ad264b5a4b0d00534017599fbcec886d EXPECT_FALSE((HasVerificationMetrics::value)) | EXPECT_FALSE((HasVerificationMetrics::value)) EXPECT_FALSE((HasVerificationMetrics::value)) | EXPECT_FALSE((HasVerificationMetrics::value)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@1-184 helper/oracle/fixture/include/static assertion 구간: Fixture, MakeFixture, if, MakeBaseline, MakeState, MakeShellRow, MakeShellRows, MakeFrame, T, HasVerificationMetrics, ExpectSourceIdEqual, ExpectVectorEqual tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2e56a14c0097a3200d0e43093dd79e3af9fbde80419d3561620f97d79996642e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@215-216 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bd37a239145c5cebe3e142065918acfbe17a8b4a9038df01ef0c3dc0653dd7a6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@251-252 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8fe7a38902e0f0554e724e21bd6626055452ad1f94713ee1115cc0415d753fb2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@276-277 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 284e6386154a0d7de7b977bffbccc58a0cccdd9f7d48f388d64f6bedeab4288e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@318-319 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 00e2be860cc981a9ca4aa4ec18c34ff5e6071b8d9df6a4e02a2b41acdfb1cb7c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@336-338 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7926abaabd465ec5f2df8c1281d0d9f682d634e296091035784916bea8ca5ed0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@369-370 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 15735dfe66660b9315679d163a8e4573eb57893a4db8bf85e7542c4cf8cc664b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@431-432 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 44e172af12e1ad94ad0079a1ed7dcc3e57c9ad141594f6626542163024522747 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_analysis_state_test.cpp support@451-452 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5064d5792cabc37a1beb0d4085f57716fdb52851fdf8bff86383f061be0fd2ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 13개 tests/unit/analysis/nonlinear_static_control_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d12853400861a54e112f715d41be7470bf32caff38740282301f452c636a668c d12853400861a54e112f715d41be7470bf32caff38740282301f452c636a668c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.BuildsFixedFactorSequenceWithExactEndpoint NonlinearStaticControl.BuildsFixedFactorSequenceWithExactEndpoint; assertion 10개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.BuildsFixedFactorSequenceWithExactEndpoint 유지 원문 검사 body 및 assertion 동일. 03cf5328984955e5bd0957b26938892dbadee29219434b903c919e1c159bfc6f 03cf5328984955e5bd0957b26938892dbadee29219434b903c919e1c159bfc6f ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 10U) | EXPECT_EQ(increment.increment_index, static_cast(index + 1U)) | EXPECT_DOUBLE_EQ(increment.load_factor, static_cast(index + 1U) * 0.1) | EXPECT_EQ(increment.is_factor_one, index + 1U == result.Value().size()) | EXPECT_DOUBLE_EQ(result.Value().back().load_factor, 1.0) | ASSERT_TRUE(one_hundred_result.HasValue()) | ASSERT_EQ(one_hundred_result.Value().size(), 100U) | EXPECT_EQ(one_hundred_result.Value().back().increment_index, 100U) | EXPECT_TRUE(one_hundred_result.Value().back().is_factor_one) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 10U) | EXPECT_EQ(increment.increment_index, static_cast(index + 1U)) | EXPECT_DOUBLE_EQ(increment.load_factor, static_cast(index + 1U) * 0.1) | EXPECT_EQ(increment.is_factor_one, index + 1U == result.Value().size()) | EXPECT_DOUBLE_EQ(result.Value().back().load_factor, 1.0) | ASSERT_TRUE(one_hundred_result.HasValue()) | ASSERT_EQ(one_hundred_result.Value().size(), 100U) | EXPECT_EQ(one_hundred_result.Value().back().increment_index, 100U) | EXPECT_TRUE(one_hundred_result.Value().back().is_factor_one) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.IgnoresPositiveMinimumAndMaximumDuringStepping NonlinearStaticControl.IgnoresPositiveMinimumAndMaximumDuringStepping; assertion 5개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearStaticControl.IgnoresPositiveMinimumAndMaximumDuringStepping 유지 원문 검사 body 및 assertion 동일. 99470076262ba5d8b53bbdc942349594b403bf7b4c1ffbb01e172701fb11f882 99470076262ba5d8b53bbdc942349594b403bf7b4c1ffbb01e172701fb11f882 ASSERT_TRUE(first_result.HasValue()) | ASSERT_TRUE(second_result.HasValue()) | ASSERT_EQ(first_result.Value().size(), second_result.Value().size()) | EXPECT_DOUBLE_EQ(first_result.Value()[index].load_factor, second_result.Value()[index].load_factor) | EXPECT_EQ(first_result.Value()[index].increment_index, second_result.Value()[index].increment_index) ASSERT_TRUE(first_result.HasValue()) | ASSERT_TRUE(second_result.HasValue()) | ASSERT_EQ(first_result.Value().size(), second_result.Value().size()) | EXPECT_DOUBLE_EQ(first_result.Value()[index].load_factor, second_result.Value()[index].load_factor) | EXPECT_EQ(first_result.Value()[index].increment_index, second_result.Value()[index].increment_index) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AppliesAbsoluteBoundaryTargetsWithoutCorrection NonlinearLoadBoundary.AppliesAbsoluteBoundaryTargetsWithoutCorrection; assertion 5개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AppliesAbsoluteBoundaryTargetsWithoutCorrection 유지 원문 검사 body 및 assertion 동일. 5e3b97613fd46bce571853e5787057d6cae4c99e6b8114c00823878a5a43e764 5e3b97613fd46bce571853e5787057d6cae4c99e6b8114c00823878a5a43e764 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 2U) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(result.Value()[1U], -0.125) | EXPECT_EQ(TrialCoordinates(fixture)[constrained], 0.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 2U) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(result.Value()[1U], -0.125) | EXPECT_EQ(TrialCoordinates(fixture)[constrained], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AssemblesEverySharedNodeLoadOnceInFixedGlobalAxes NonlinearLoadBoundary.AssemblesEverySharedNodeLoadOnceInFixedGlobalAxes; assertion 7개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.AssemblesEverySharedNodeLoadOnceInFixedGlobalAxes 유지 원문 검사 body 및 assertion 동일. f9fd946c0c146cac052d1f2ce57c48e989e1700b61bc00e546bd78376a8707ba f9fd946c0c146cac052d1f2ce57c48e989e1700b61bc00e546bd78376a8707ba ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().generalized_external_force.Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[0U], 2.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[1U], -1.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[3U], 0.5) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[0U] .GlobalComponents()[0U], 8.0) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[2U] .GlobalComponents()[3U], 2.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().generalized_external_force.Size(), fixture.dofs->FullDofCount()) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[0U], 2.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[1U], -1.0) | EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[3U], 0.5) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[0U] .GlobalComponents()[0U], 8.0) | EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] .ConcentratedLoads()[2U] .GlobalComponents()[3U], 2.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.RejectsDirectorAlignedMomentAboveTheExactBand NonlinearLoadBoundary.RejectsDirectorAlignedMomentAboveTheExactBand; assertion 4개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.RejectsDirectorAlignedMomentAboveTheExactBand 유지 원문 검사 body 및 assertion 동일. 6fd8c584b65e4594d07dee3e89a681ebbf4990173da1ace05bde715753ca71f3 6fd8c584b65e4594d07dee3e89a681ebbf4990173da1ace05bde715753ca71f3 "EXPECT_TRUE( fesa::CheckMomentAdmissibility(director, {1.0, 0.0, 1.0e-12}).IsOk()) | EXPECT_FALSE(rejected.IsOk()) | ASSERT_EQ(rejected.Diagnostics().size(), 1U) | EXPECT_EQ(rejected.Diagnostics()[0U].code, ""unsupported-drilling-load"")" "EXPECT_TRUE( fesa::CheckMomentAdmissibility(director, {1.0, 0.0, 1.0e-12}).IsOk()) | EXPECT_FALSE(rejected.IsOk()) | ASSERT_EQ(rejected.Diagnostics().size(), 1U) | EXPECT_EQ(rejected.Diagnostics()[0U].code, ""unsupported-drilling-load"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.PreservesSourceOrderDuringGlobalAccumulation NonlinearLoadBoundary.PreservesSourceOrderDuringGlobalAccumulation; assertion 6개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.PreservesSourceOrderDuringGlobalAccumulation 유지 원문 검사 body 및 assertion 동일. c3bb30245b6f1676ea97c2d939256da763d500b601a670f86968efa43d87b75a c3bb30245b6f1676ea97c2d939256da763d500b601a670f86968efa43d87b75a ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().generalized_external_force[0U], 1.0) | EXPECT_EQ(first.Value().generalized_external_tangent.RowOffsets(), second.Value().generalized_external_tangent.RowOffsets()) | EXPECT_EQ(first.Value().generalized_external_tangent.ColumnIndices(), second.Value().generalized_external_tangent.ColumnIndices()) | EXPECT_EQ(first.Value().generalized_external_tangent.Values(), second.Value().generalized_external_tangent.Values()) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().generalized_external_force[0U], 1.0) | EXPECT_EQ(first.Value().generalized_external_tangent.RowOffsets(), second.Value().generalized_external_tangent.RowOffsets()) | EXPECT_EQ(first.Value().generalized_external_tangent.ColumnIndices(), second.Value().generalized_external_tangent.ColumnIndices()) | EXPECT_EQ(first.Value().generalized_external_tangent.Values(), second.Value().generalized_external_tangent.Values()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.DifferentiatesOneFixedSpatialMomentAndUsesSubtraction NonlinearLoadBoundary.DifferentiatesOneFixedSpatialMomentAndUsesSubtraction; assertion 6개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearLoadBoundary.DifferentiatesOneFixedSpatialMomentAndUsesSubtraction 유지 원문 검사 body 및 assertion 동일. e3040db107a7fc1174faf58c76c4c5915e3a021adbdc44927ec95bf2dbf7877b e3040db107a7fc1174faf58c76c4c5915e3a021adbdc44927ec95bf2dbf7877b ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE(MaximumAbsoluteDifference(derivative, tangent_action), 1.0e-8) | EXPECT_DOUBLE_EQ(residual[3U], 5.0 - result.Value().generalized_external_force[3U]) | EXPECT_DOUBLE_EQ( -tangent_action[3U], -result.Value().generalized_external_tangent.Multiply(direction)[3U]) ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE(MaximumAbsoluteDifference(derivative, tangent_action), 1.0e-8) | EXPECT_DOUBLE_EQ(residual[3U], 5.0 - result.Value().generalized_external_force[3U]) | EXPECT_DOUBLE_EQ( -tangent_action[3U], -result.Value().generalized_external_tangent.Multiply(direction)[3U]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesOwnedRelativeThresholdsForEveryChannel NonlinearConvergence.UsesOwnedRelativeThresholdsForEveryChannel; assertion 8개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesOwnedRelativeThresholdsForEveryChannel 유지 원문 검사 body 및 assertion 동일. 6cfe9ea574efccc73afb0318189186da892593dc1ca54dcecc940c9f96d4b6ae 6cfe9ea574efccc73afb0318189186da892593dc1ca54dcecc940c9f96d4b6ae EXPECT_TRUE(result.combined_passed) | EXPECT_FALSE(decision.identity.empty()) | EXPECT_DOUBLE_EQ(decision.numerator_norm, 1.0e-2) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 1.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) EXPECT_TRUE(result.combined_passed) | EXPECT_FALSE(decision.identity.empty()) | EXPECT_DOUBLE_EQ(decision.numerator_norm, 1.0e-2) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 1.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.AppliesTypedZeroScaleGatesToEmptyChannels NonlinearConvergence.AppliesTypedZeroScaleGatesToEmptyChannels; assertion 7개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.AppliesTypedZeroScaleGatesToEmptyChannels 유지 원문 검사 body 및 assertion 동일. 6dae4244b6d4b6af487b476312174ee8d379aae3416c77f5833eeb43b1ac0a2f 6dae4244b6d4b6af487b476312174ee8d379aae3416c77f5833eeb43b1ac0a2f EXPECT_TRUE(result.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].numerator_norm, 0.0) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) EXPECT_TRUE(result.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].numerator_norm, 0.0) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.SelectsTypedZeroScaleFromExactZeroExternalResidualChannels NonlinearConvergence.SelectsTypedZeroScaleFromExactZeroExternalResidualChannels; assertion 10개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.SelectsTypedZeroScaleFromExactZeroExternalResidualChannels 유지 원문 검사 body 및 assertion 동일. 83f1b0cae81f3d8f7b93fe76c1857758f18b6e9d9c97b091cb9e101fb23f1f3e 83f1b0cae81f3d8f7b93fe76c1857758f18b6e9d9c97b091cb9e101fb23f1f3e EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) | EXPECT_FALSE(force_rejected.force_residual.passed) | EXPECT_FALSE(force_rejected.combined_passed) | EXPECT_FALSE(moment_rejected.moment_residual.passed) | EXPECT_FALSE(moment_rejected.combined_passed) EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0) | EXPECT_EQ(decisions[index].branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(decisions[index].threshold, fesa::kNewtonZeroScaleThreshold) | EXPECT_EQ(decisions[index].threshold_unit, units[index]) | EXPECT_TRUE(decisions[index].passed) | EXPECT_FALSE(force_rejected.force_residual.passed) | EXPECT_FALSE(force_rejected.combined_passed) | EXPECT_FALSE(moment_rejected.moment_residual.passed) | EXPECT_FALSE(moment_rejected.combined_passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesRelativeResidualScaleOnlyWhenMatchingExternalScaleIsNonzero NonlinearConvergence.UsesRelativeResidualScaleOnlyWhenMatchingExternalScaleIsNonzero; assertion 10개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.UsesRelativeResidualScaleOnlyWhenMatchingExternalScaleIsNonzero 유지 원문 검사 body 및 assertion 동일. 6d42f6c27a543b480e86044b3b77d0943d8cb2d2482dd1aba56d30e16a39058c 6d42f6c27a543b480e86044b3b77d0943d8cb2d2482dd1aba56d30e16a39058c EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 2.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).force_residual.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).moment_residual.passed) | EXPECT_FALSE(relative_rejected.force_residual.passed) | EXPECT_FALSE(relative_rejected.combined_passed) EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(decision.denominator_scale, 2.0) | EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(decision.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).force_residual.passed) | EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).moment_residual.passed) | EXPECT_FALSE(relative_rejected.force_residual.passed) | EXPECT_FALSE(relative_rejected.combined_passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RejectsNonfiniteResidualInputsBeforeSelectingOrAcceptingAChannel NonlinearConvergence.RejectsNonfiniteResidualInputsBeforeSelectingOrAcceptingAChannel; assertion 7개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RejectsNonfiniteResidualInputsBeforeSelectingOrAcceptingAChannel 유지 원문 검사 body 및 assertion 동일. df264b5cae771cdeb5f4ea6aa1ca08c5353da8a51e88409b08509e598dd6e79e df264b5cae771cdeb5f4ea6aa1ca08c5353da8a51e88409b08509e598dd6e79e EXPECT_FALSE(decision.passed) | EXPECT_FALSE(result.combined_passed) | EXPECT_TRUE(relative.force_residual.passed) | EXPECT_DOUBLE_EQ(relative.force_residual.denominator_scale, smallest_external) | EXPECT_EQ(relative.force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(relative.force_residual.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(relative.force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) EXPECT_FALSE(decision.passed) | EXPECT_FALSE(result.combined_passed) | EXPECT_TRUE(relative.force_residual.passed) | EXPECT_DOUBLE_EQ(relative.force_residual.denominator_scale, smallest_external) | EXPECT_EQ(relative.force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_DOUBLE_EQ(relative.force_residual.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(relative.force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RequiresEveryResidualAndCorrectionChannelToPass NonlinearConvergence.RequiresEveryResidualAndCorrectionChannelToPass; assertion 8개 tests/unit/analysis/nonlinear_static_control_test.cpp NonlinearConvergence.RequiresEveryResidualAndCorrectionChannelToPass 유지 원문 검사 body 및 assertion 동일. a832011e0feb435ce0aa354c482a5af20cdcc12a5b3ee069a6805fa2760daa0f a832011e0feb435ce0aa354c482a5af20cdcc12a5b3ee069a6805fa2760daa0f EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(accepted.translation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.translation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(accepted.translation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_EQ(accepted.rotation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_FALSE(result.combined_passed) EXPECT_TRUE(accepted.combined_passed) | EXPECT_DOUBLE_EQ(accepted.translation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.denominator_scale, 1.0) | EXPECT_DOUBLE_EQ(accepted.translation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_DOUBLE_EQ(accepted.rotation_correction.threshold, fesa::kNewtonRelativeThreshold) | EXPECT_EQ(accepted.translation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_EQ(accepted.rotation_correction.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_FALSE(result.combined_passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@1-158 helper/oracle/fixture/include/static assertion 구간: VectorFrom, Fixture, if, TrialCoordinates, AddScaled, MaximumAbsoluteDifference, RelativeConvergenceInput, ExactZeroExternalResidualInput tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a0d6117066d7bc0244668abef8eff3eb3f09fefb66e56d8ff7dae4978b297e2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@184-185 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a728c5ddd282acb272a289129b2beaaf82361231a53854f9678579e963ca7bf5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@204-205 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5d5d51f179b49fab4320bca3fb1a67c9514c031c6eb4146cd06e0fd67d94e32b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@221-222 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b88abcc3396bee3d80864ac6e5b5d69fd7a65489104a60fee981bfb1f80dcf66 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@250-251 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6d84fb8f223d3d49be0a8b3f94cc76dc49eb532f98b45a89eaf3f6b7c0d9d928 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@262-263 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 891df0432d2d49bd73ab72565c58f1833e37588e6e1f011e9622f474b2164e52 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@285-286 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. de1e68c7ef81aa7e6db55005224ab3b7051d71f20a74f0a005cadc3d2950055f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@324-325 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 577d29344a758ac62f396a9e34591982aab171dd34082649c877701cf8834124 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@346-347 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 66b90623292bf823c4ec82313343514c4d6118d131a2112173300ffc87582cc6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@376-377 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0413b1a93aa4812b4c92ab8aeba36ae964d35ffceb3ae14bde002cc02b4a128a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@414-415 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c2e9bb7f999bfecdf11b504b8f331912407fc2aace0ed3334b7095b7686f5f8a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@454-455 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dc36777ce188869f3f1f91b7963b011739df7f02cac290f3dfac4efbe4bf15bf 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@500-501 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d661490b198257d4473dc5b81ce890e2389d53e281ec635145449812542abe98 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/nonlinear_static_control_test.cpp support@533-534 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/nonlinear_static_control_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 8개 tests/unit/analysis/solid_frequency_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. afb4cc6cb6b1b6913bcfd0d473260ab060c91b66835e5570073472e3bc7f3dd5 afb4cc6cb6b1b6913bcfd0d473260ab060c91b66835e5570073472e3bc7f3dd5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.FreeBrickRetainsSixRigidModes SolidFrequencyProcedure.FreeBrickRetainsSixRigidModes; assertion 6개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.FreeBrickRetainsSixRigidModes 유지 원문 검사 body 및 assertion 동일. cce9667bb3dd958f4277c3c2cea2cd1c9d7a29bbc73e03edfe674518cb099309 cce9667bb3dd958f4277c3c2cea2cd1c9d7a29bbc73e03edfe674518cb099309 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().modes.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(result.Value().vectors.Rows(), 6U) | EXPECT_EQ(result.Value().vectors.Columns(), 24U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().modes.size(), 6U) | EXPECT_EQ(mode.classification, 0U) | EXPECT_EQ(result.Value().vectors.Rows(), 6U) | EXPECT_EQ(result.Value().vectors.Columns(), 24U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RowSumLumpedPencilMatchesIndependentDenseOracle SolidFrequencyProcedure.RowSumLumpedPencilMatchesIndependentDenseOracle; assertion 22개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RowSumLumpedPencilMatchesIndependentDenseOracle 유지 원문 검사 body 및 assertion 동일. 4c97e6d2016b331fe2696c558e569c93fce6a5040249a4fa536634b8617ae5fb 4c97e6d2016b331fe2696c558e569c93fce6a5040249a4fa536634b8617ae5fb "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), oracle.size()) | ASSERT_EQ(state.eigenpair_checks.size(), oracle.size()) | EXPECT_NEAR(state.modes[c].eigenvalue, oracle[c], 1e-10 * state.classification_scale) | EXPECT_EQ(state.modes[c].mode_id, c + 1) | EXPECT_EQ(state.eigenpair_checks[c].sorted_rank, c + 1) | EXPECT_LE(state.eigenpair_checks[c].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_norm, 1e-10) | EXPECT_NEAR(state.eigenpair_checks[c].modal_mass, 1.0, 1e-10) | EXPECT_EQ(state.vectors(c, row), 0.0) | EXPECT_GT(state.vectors(c, pivot), 0.0) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_NEAR(state.mass_ideal_lower_bound, 12.0 / 27.0, 1e-13) | EXPECT_GT(state.mass_lower_bound, 0.0) | EXPECT_LT(state.mass_lower_bound, state.mass_ideal_lower_bound) | EXPECT_GT(state.mass_roundoff_guard, 0.0) | EXPECT_EQ(state.backend.integer_abi, ""ILP64"") | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | EXPECT_EQ(state.backend.backend_calls.front().kind, ""mass-spd"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(state.modes.size(), oracle.size()) | ASSERT_EQ(state.eigenpair_checks.size(), oracle.size()) | EXPECT_NEAR(state.modes[c].eigenvalue, oracle[c], 1e-10 * state.classification_scale) | EXPECT_EQ(state.modes[c].mode_id, c + 1) | EXPECT_EQ(state.eigenpair_checks[c].sorted_rank, c + 1) | EXPECT_LE(state.eigenpair_checks[c].eta_r, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_energy, 1e-10) | EXPECT_LE(state.eigenpair_checks[c].eta_norm, 1e-10) | EXPECT_NEAR(state.eigenpair_checks[c].modal_mass, 1.0, 1e-10) | EXPECT_EQ(state.vectors(c, row), 0.0) | EXPECT_GT(state.vectors(c, pivot), 0.0) | EXPECT_LE(state.eta_gram, 1e-10) | EXPECT_LE(state.max_eta_orth, 1e-10) | EXPECT_NEAR(state.mass_ideal_lower_bound, 12.0 / 27.0, 1e-13) | EXPECT_GT(state.mass_lower_bound, 0.0) | EXPECT_LT(state.mass_lower_bound, state.mass_ideal_lower_bound) | EXPECT_GT(state.mass_roundoff_guard, 0.0) | EXPECT_EQ(state.backend.integer_abi, ""ILP64"") | EXPECT_EQ(state.backend.eigenvectors.Rows(), 0U) | EXPECT_EQ(state.backend.backend_calls.front().kind, ""mass-spd"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.DensityLengthAndMaterialScaling SolidFrequencyProcedure.DensityLengthAndMaterialScaling; assertion 5개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.DensityLengthAndMaterialScaling 유지 원문 검사 body 및 assertion 동일. cdee8e33c911874556fd0de7f4206dabb00b6323ffc6dc258ea2775cd9d4203c cdee8e33c911874556fd0de7f4206dabb00b6323ffc6dc258ea2775cd9d4203c ASSERT_TRUE(base_domain.HasValue()) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[c].eigenvalue, base.Value().modes[c].eigenvalue * parameters[3], 1e-10 * result.Value().classification_scale) ASSERT_TRUE(base_domain.HasValue()) | ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[c].eigenvalue, base.Value().modes[c].eigenvalue * parameters[3], 1e-10 * result.Value().classification_scale) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.OneFreeDofAndAllConstrainedAndExcessRequest SolidFrequencyProcedure.OneFreeDofAndAllConstrainedAndExcessRequest; assertion 5개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.OneFreeDofAndAllConstrainedAndExcessRequest 유지 원문 검사 body 및 assertion 동일. c873c04a035270f6496bcb1e0d60a1558b2eccd3043729a891bc459cd0f18927 c873c04a035270f6496bcb1e0d60a1558b2eccd3043729a891bc459cd0f18927 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[0].eigenvalue, DenseOracle({2U})[0], 1e-11) | ASSERT_TRUE(invalid.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(invalid.Value()) .HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(result.Value().modes[0].eigenvalue, DenseOracle({2U})[0], 1e-11) | ASSERT_TRUE(invalid.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(invalid.Value()) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.MissingDensityAndFailedBackendPreservePriorCandidate SolidFrequencyProcedure.MissingDensityAndFailedBackendPreservePriorCandidate; assertion 7개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.MissingDensityAndFailedBackendPreservePriorCandidate 유지 원문 검사 body 및 assertion 동일. 3f418707dfaaffaae21da5242f50881cd3b4e2d1049377e14af02ad858f84b9c 3f418707dfaaffaae21da5242f50881cd3b4e2d1049377e14af02ad858f84b9c EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(missing.Value()) .HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(good.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(domain.Value()) .HasValue()) | EXPECT_EQ(good.Value().modes[0].eigenvalue, previous) | ASSERT_TRUE(again.HasValue()) | EXPECT_NEAR(again.Value().modes[0].eigenvalue, previous, 1e-12) EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(missing.Value()) .HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(good.HasValue()) | EXPECT_FALSE(fesa::SolidFrequencyProcedureExecutor{} .Execute(domain.Value()) .HasValue()) | EXPECT_EQ(good.Value().modes[0].eigenvalue, previous) | ASSERT_TRUE(again.HasValue()) | EXPECT_NEAR(again.Value().modes[0].eigenvalue, previous, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.NearZeroNegativeRemainsRawWithoutFrequency SolidFrequencyProcedure.NearZeroNegativeRemainsRawWithoutFrequency; assertion 6개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.NearZeroNegativeRemainsRawWithoutFrequency 유지 원문 검사 body 및 assertion 동일. 5c7466461ae588cfbd0a9a9bdd24664d5d7cf8f721ecf9fa68b53fa3041f35eb 5c7466461ae588cfbd0a9a9bdd24664d5d7cf8f721ecf9fa68b53fa3041f35eb ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_LT(result.Value().modes[0].eigenvalue, 0.0) | EXPECT_EQ(result.Value().modes[0].classification, 0U) | EXPECT_FALSE(result.Value().modes[0].frequency.has_value()) | EXPECT_EQ(mode.cluster_id, 1U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_LT(result.Value().modes[0].eigenvalue, 0.0) | EXPECT_EQ(result.Value().modes[0].classification, 0U) | EXPECT_FALSE(result.Value().modes[0].frequency.has_value()) | EXPECT_EQ(mode.cluster_id, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.SuppliedFrequencyInputHasIndependentNumericalEvidence SolidFrequencyProcedure.SuppliedFrequencyInputHasIndependentNumericalEvidence; assertion 10개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.SuppliedFrequencyInputHasIndependentNumericalEvidence 유지 원문 검사 body 및 assertion 동일. 0287bfd4fea7a6dcac7e9ad689ef6fde57e28ebbe300516a82f71d32366695b0 0287bfd4fea7a6dcac7e9ad689ef6fde57e28ebbe300516a82f71d32366695b0 ASSERT_FALSE(root.empty()) | ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().modes.size(), 10U) | EXPECT_EQ(result.Value().vectors.Columns(), 3U * 442U) | EXPECT_GE(result.Value().eigenpair_checks.size(), 10U) | EXPECT_GT(result.Value().mass_lower_bound, 0.0) | EXPECT_LE(result.Value().eta_gram, 1e-10) | EXPECT_LE(result.Value().max_eta_orth, 1e-10) ASSERT_FALSE(root.empty()) | ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().modes.size(), 10U) | EXPECT_EQ(result.Value().vectors.Columns(), 3U * 442U) | EXPECT_GE(result.Value().eigenpair_checks.size(), 10U) | EXPECT_GT(result.Value().mass_lower_bound, 0.0) | EXPECT_LE(result.Value().eta_gram, 1e-10) | EXPECT_LE(result.Value().max_eta_orth, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RejectsOverflowingOriginalPencilValidationScale SolidFrequencyProcedure.RejectsOverflowingOriginalPencilValidationScale; assertion 5개 tests/unit/analysis/solid_frequency_procedure_test.cpp SolidFrequencyProcedure.RejectsOverflowingOriginalPencilValidationScale 유지 원문 검사 body 및 assertion 동일. 23de9158e3984de0b4196abe914a4980b20b59e595d0f6de100b63c0608b4e5c 23de9158e3984de0b4196abe914a4980b20b59e595d0f6de100b63c0608b4e5c "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""solid-eigenpair-validation-failed"") | EXPECT_NE(result.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""solid-eigenpair-validation-failed"") | EXPECT_NE(result.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp support@1-64 helper/oracle/fixture/include/static assertion 구간: StatusText, Brick tests/unit/analysis/solid_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 338ba214915b6614a5178292ab8ca1c8409f79c52bfdae155360a152c9033cc2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_frequency_procedure_test.cpp support@77-136 helper/oracle/fixture/include/static assertion 구간: GradientIntegral, DenseOracle, FaceFree tests/unit/analysis/solid_frequency_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ce1a07c50cc327f05d6a67dcefec86324ec510e7189bc09589a7347b3ebac1a1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 30개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8d90de51b606957522feabd9c9e063a463a91ecf2065fc63a21c893aed45276d 8d90de51b606957522feabd9c9e063a463a91ecf2065fc63a21c893aed45276d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InitialLowPartsSurviveTrialCopyAndRejectedCommit SolidHhtPairedState.InitialLowPartsSurviveTrialCopyAndRejectedCommit; assertion 13개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InitialLowPartsSurviveTrialCopyAndRejectedCommit 유지 원문 검사 body 및 assertion 동일. 825c8f0dad20f8717e1ea0b6b8603fd2644a8f3994ac000270d5f9e4327983e2 825c8f0dad20f8717e1ea0b6b8603fd2644a8f3994ac000270d5f9e4327983e2 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(initial).IsOk()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_EQ(trial.Value().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(trial.Value().low.residual_scale[0], std::ldexp(1.0, -61)) | EXPECT_EQ(trial.Value().low.linear_momentum_rate[0], std::ldexp(1.0, -59)) | EXPECT_EQ(trial.Value().low.angular_momentum_rate[1], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.inertia_force[0], std::ldexp(1.0, -62)) | EXPECT_EQ(state.Value().CommittedState().low.angular_momentum_rate[2], -std::ldexp(1.0, -60)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(initial).IsOk()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_EQ(trial.Value().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(trial.Value().low.residual_scale[0], std::ldexp(1.0, -61)) | EXPECT_EQ(trial.Value().low.linear_momentum_rate[0], std::ldexp(1.0, -59)) | EXPECT_EQ(trial.Value().low.angular_momentum_rate[1], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().low.acceleration[0], std::ldexp(1.0, -60)) | EXPECT_EQ(state.Value().CommittedState().low.inertia_force[0], std::ldexp(1.0, -62)) | EXPECT_EQ(state.Value().CommittedState().low.angular_momentum_rate[2], -std::ldexp(1.0, -60)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InvalidLowShapeFiniteNormalizationAndIdentitiesFail SolidHhtPairedState.InvalidLowShapeFiniteNormalizationAndIdentitiesFail; assertion 4개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.InvalidLowShapeFiniteNormalizationAndIdentitiesFail 유지 원문 검사 body 및 assertion 동일. 2b78c719a88df0067bb2b21166b8c312c308d89d1c1983c1c771809eb499d299 2b78c719a88df0067bb2b21166b8c312c308d89d1c1983c1c771809eb499d299 ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.SubUlpPhysicalDisplacementRecoversNonzeroRates SolidHhtPairedKinematics.SubUlpPhysicalDisplacementRecoversNonzeroRates; assertion 13개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.SubUlpPhysicalDisplacementRecoversNonzeroRates 유지 원문 검사 body 및 assertion 동일. 1f4fe6c56fb73d89e0ad67e5ff0f7f140cbcf1ec8e26da6ea909fe446d6f19c3 1f4fe6c56fb73d89e0ad67e5ff0f7f140cbcf1ec8e26da6ea909fe446d6f19c3 ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | EXPECT_EQ(predictor.Value().displacement[0], 1) | EXPECT_EQ(predictor.Value().displacement_low[0], epsilon) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().velocity[0], 2 * epsilon) | EXPECT_EQ(rates.Value().algorithmic_acceleration_low[0], 0) | EXPECT_EQ(rates.Value().acceleration_low[0], 0) | EXPECT_EQ(rates.Value().velocity_low[0], 0) | ASSERT_TRUE(rounded_rates.HasValue()) | EXPECT_EQ(rounded_rates.Value().acceleration[0], 0) ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(predictor.HasValue()) | EXPECT_EQ(predictor.Value().displacement[0], 1) | EXPECT_EQ(predictor.Value().displacement_low[0], epsilon) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 4 * epsilon) | EXPECT_EQ(rates.Value().velocity[0], 2 * epsilon) | EXPECT_EQ(rates.Value().algorithmic_acceleration_low[0], 0) | EXPECT_EQ(rates.Value().acceleration_low[0], 0) | EXPECT_EQ(rates.Value().velocity_low[0], 0) | ASSERT_TRUE(rounded_rates.HasValue()) | EXPECT_EQ(rounded_rates.Value().acceleration[0], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.PhysicalAndAuxiliaryRatesKeepOldPhysicalTerm SolidHhtPairedKinematics.PhysicalAndAuxiliaryRatesKeepOldPhysicalTerm; assertion 5개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.PhysicalAndAuxiliaryRatesKeepOldPhysicalTerm 유지 원문 검사 body 및 assertion 동일. 50303350d2b5f81d3838936cc4b1c4aefb9d23acffa5f1db16b392d59eadbc49 50303350d2b5f81d3838936cc4b1c4aefb9d23acffa5f1db16b392d59eadbc49 ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 0) | EXPECT_EQ(rates.Value().velocity[0], 6 * epsilon) ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(rates.HasValue()) | EXPECT_EQ(rates.Value().algorithmic_acceleration[0], epsilon) | EXPECT_EQ(rates.Value().acceleration[0], 0) | EXPECT_EQ(rates.Value().velocity[0], 6 * epsilon) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.InvalidLowInputsFailWithoutChangingPredictor SolidHhtPairedKinematics.InvalidLowInputsFailWithoutChangingPredictor; assertion 6개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.InvalidLowInputsFailWithoutChangingPredictor 유지 원문 검사 body 및 assertion 동일. 42be154d7316bf84811c30432c01f348e2cd4964c15a9ca2a8542b3a4d099a72 42be154d7316bf84811c30432c01f348e2cd4964c15a9ca2a8542b3a4d099a72 ASSERT_TRUE(p.HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1, low), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_EQ(predictor.displacement[0], 1) | EXPECT_EQ(predictor.displacement_low[0], 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(0), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1), predictor, fesa::Vector(1), fesa::Vector(1), 1, invalid_parameters) .HasValue()) ASSERT_TRUE(p.HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1, low), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_EQ(predictor.displacement[0], 1) | EXPECT_EQ(predictor.displacement_low[0], 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(0), predictor, fesa::Vector(1), fesa::Vector(1), 1, p.Value()) .HasValue()) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtHighLowRates( fesa::Vector(1, 1), fesa::Vector(1), predictor, fesa::Vector(1), fesa::Vector(1), 1, invalid_parameters) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.MassMultiplyKeepsSubUlpActionAndCancellation SolidHhtPairedKinematics.MassMultiplyKeepsSubUlpActionAndCancellation; assertion 7개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.MassMultiplyKeepsSubUlpActionAndCancellation 유지 원문 검사 body 및 assertion 동일. ef6f15688746af81bfd5dd21af5158228a986336d03b3619f12ec626edb65ebb ef6f15688746af81bfd5dd21af5158228a986336d03b3619f12ec626edb65ebb ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().high[0], 3 * epsilon) | EXPECT_EQ(result.Value().low[0], 0) | EXPECT_EQ(result.Value().high[1], -3) | EXPECT_EQ(result.Value().low[1], 3 * epsilon) | EXPECT_EQ(mass.Value().Multiply(high)[0], 0) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().high[0], 3 * epsilon) | EXPECT_EQ(result.Value().low[0], 0) | EXPECT_EQ(result.Value().high[1], -3) | EXPECT_EQ(result.Value().low[1], 3 * epsilon) | EXPECT_EQ(mass.Value().Multiply(high)[0], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.WeightedIdentityPreservesNonzeroOldResidualLow SolidHhtPairedKinematics.WeightedIdentityPreservesNonzeroOldResidualLow; assertion 11개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedKinematics.WeightedIdentityPreservesNonzeroOldResidualLow 유지 원문 검사 body 및 assertion 동일. 7bbac5223481362748fa1ff73b62f4b7a0758b25cbf6c9128cf1eeb983846480 7bbac5223481362748fa1ff73b62f4b7a0758b25cbf6c9128cf1eeb983846480 ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.original.high, 3.25) | EXPECT_EQ(result.original.low, epsilon) | EXPECT_EQ(result.solved.high, 3.25) | EXPECT_EQ(result.solved.low, epsilon) | EXPECT_EQ(result.defect.high, 0) | EXPECT_EQ(result.metric.high, 0) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.solved.low, 0) | EXPECT_EQ(result.defect.high, epsilon) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.original.high, 3.25) | EXPECT_EQ(result.original.low, epsilon) | EXPECT_EQ(result.solved.high, 3.25) | EXPECT_EQ(result.solved.low, epsilon) | EXPECT_EQ(result.defect.high, 0) | EXPECT_EQ(result.metric.high, 0) | ASSERT_TRUE(fesa::detail::EvaluateSolidHhtHighLowForceIdentity( mass.Value(), 0, fesa::math_internal::HighLow(epsilon), next, old, -.25, &result)) | EXPECT_EQ(result.solved.low, 0) | EXPECT_EQ(result.defect.high, epsilon) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.BackendEnvironmentMutationFailsAndPreservesPairs SolidHhtPairedState.BackendEnvironmentMutationFailsAndPreservesPairs; assertion 14개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtPairedState.BackendEnvironmentMutationFailsAndPreservesPairs 유지 원문 검사 body 및 assertion 동일. 3f256cc73e3837028a0a56cde57bac0f445e407b546e0ec820c96be62645c8de 3f256cc73e3837028a0a56cde57bac0f445e407b546e0ec820c96be62645c8de "ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::math_internal::ArithmeticEnvironmentSupported()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""solid-dynamic-arithmetic-environment"") | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(actual.displacement[0], expected.displacement[0]) | EXPECT_EQ(actual.low.displacement[0], expected.low.displacement[0]) | EXPECT_EQ(actual.acceleration[0], expected.acceleration[0]) | EXPECT_EQ(actual.low.acceleration[0], expected.low.acceleration[0]) | EXPECT_EQ(actual.external_work, expected.external_work) | EXPECT_EQ(actual.low.external_work, expected.low.external_work)" "ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::math_internal::ArithmeticEnvironmentSupported()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics().front().code, ""solid-dynamic-arithmetic-environment"") | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(actual.displacement[0], expected.displacement[0]) | EXPECT_EQ(actual.low.displacement[0], expected.low.displacement[0]) | EXPECT_EQ(actual.acceleration[0], expected.acceleration[0]) | EXPECT_EQ(actual.low.acceleration[0], expected.low.acceleration[0]) | EXPECT_EQ(actual.external_work, expected.external_work) | EXPECT_EQ(actual.low.external_work, expected.low.external_work)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllConstrainedRetainsPhysicalReactionAndEightPoints SolidHhtDynamics.AllConstrainedRetainsPhysicalReactionAndEightPoints; assertion 9개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllConstrainedRetainsPhysicalReactionAndEightPoints 유지 원문 검사 body 및 assertion 동일. 9aae6cd617d88f7c8d407f069a1bb691963a5b920d9c6ade7953aac765a05542 9aae6cd617d88f7c8d407f069a1bb691963a5b920d9c6ade7953aac765a05542 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 21U) | EXPECT_EQ(f.displacement.Size(), 24U) | EXPECT_EQ(f.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(f.reaction[1], -7) | EXPECT_DOUBLE_EQ(f.acceleration[1], 0) | EXPECT_DOUBLE_EQ(f.external_work, 0) | EXPECT_EQ(f.iteration_count, 0U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 21U) | EXPECT_EQ(f.displacement.Size(), 24U) | EXPECT_EQ(f.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(f.reaction[1], -7) | EXPECT_DOUBLE_EQ(f.acceleration[1], 0) | EXPECT_DOUBLE_EQ(f.external_work, 0) | EXPECT_EQ(f.iteration_count, 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.ActualEndpointsUseDifferentCurvesKnotsInteriorsAndHolds SolidHhtDynamics.ActualEndpointsUseDifferentCurvesKnotsInteriorsAndHolds; assertion 5개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.ActualEndpointsUseDifferentCurvesKnotsInteriorsAndHolds 유지 원문 검사 body 및 assertion 동일. c5e559e653ca89a7bb7004a700e7f2eeff2550e6ceb1f76318567165f97bed7a c5e559e653ca89a7bb7004a700e7f2eeff2550e6ceb1f76318567165f97bed7a ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.external_force[0], 2 * a + 3 * b, 1e-14) | EXPECT_DOUBLE_EQ(f.reaction[0], -f.external_force[0]) | EXPECT_DOUBLE_EQ(f.external_force[5], 7) | EXPECT_DOUBLE_EQ(f.time, static_cast(f.increment_index) * .125) ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.external_force[0], 2 * a + 3 * b, 1e-14) | EXPECT_DOUBLE_EQ(f.reaction[0], -f.external_force[0]) | EXPECT_DOUBLE_EQ(f.external_force[5], 7) | EXPECT_DOUBLE_EQ(f.time, static_cast(f.increment_index) * .125) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RampStartsAtZeroAndAuxiliaryAccelerationIsDistinct SolidHhtDynamics.RampStartsAtZeroAndAuxiliaryAccelerationIsDistinct; assertion 10개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RampStartsAtZeroAndAuxiliaryAccelerationIsDistinct 유지 원문 검사 body 및 assertion 동일. 8806b0f8147101e938132724b2e9fdc8f4a536db7c7d0c03962e17393a021ec9 8806b0f8147101e938132724b2e9fdc8f4a536db7c7d0c03962e17393a021ec9 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frames.front().acceleration[0], 0) | EXPECT_GT(std::abs(frames[1].acceleration[0] - frames[1].algorithmic_acceleration[0]), 1e-5) | EXPECT_NEAR(f.algorithmic_acceleration[0], .95 * f.acceleration[0] + .05 * old.acceleration[0], 1e-14) | EXPECT_LT(f.iterations.back().update_metric, 1e-12) | EXPECT_LE(f.iterations.back().residual_metric, 1e-10) | EXPECT_DOUBLE_EQ(f.displacement[i], 0) | EXPECT_DOUBLE_EQ(f.velocity[i], 0) | EXPECT_DOUBLE_EQ(f.acceleration[i], 0) | EXPECT_DOUBLE_EQ(f.algorithmic_acceleration[i], 0) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frames.front().acceleration[0], 0) | EXPECT_GT(std::abs(frames[1].acceleration[0] - frames[1].algorithmic_acceleration[0]), 1e-5) | EXPECT_NEAR(f.algorithmic_acceleration[0], .95 * f.acceleration[0] + .05 * old.acceleration[0], 1e-14) | EXPECT_LT(f.iterations.back().update_metric, 1e-12) | EXPECT_LE(f.iterations.back().residual_metric, 1e-10) | EXPECT_DOUBLE_EQ(f.displacement[i], 0) | EXPECT_DOUBLE_EQ(f.velocity[i], 0) | EXPECT_DOUBLE_EQ(f.acceleration[i], 0) | EXPECT_DOUBLE_EQ(f.algorithmic_acceleration[i], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.OneFreeTranslationHasAnalyticLumpedInertialSupportReactions SolidHhtDynamics.OneFreeTranslationHasAnalyticLumpedInertialSupportReactions; assertion 4개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.OneFreeTranslationHasAnalyticLumpedInertialSupportReactions 유지 원문 검사 body 및 assertion 동일. 1c002e47b63b342b26d3651c49bb19e06ac80d6f2744f2f435c9190103f3d797 1c002e47b63b342b26d3651c49bb19e06ac80d6f2744f2f435c9190103f3d797 ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.reaction[3 * b + c], reaction, roundoff * scale) | EXPECT_NEAR(weighted, endpoint_identity, roundoff * scale) | EXPECT_NEAR(f.iterations.back().weighted_residual_numerator, std::abs(weighted), roundoff * scale) ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(f.reaction[3 * b + c], reaction, roundoff * scale) | EXPECT_NEAR(weighted, endpoint_identity, roundoff * scale) | EXPECT_NEAR(f.iterations.back().weighted_residual_numerator, std::abs(weighted), roundoff * scale) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.BackendNanNonconvergenceAndInversionPreserveAcceptedInitial SolidHhtDynamics.BackendNanNonconvergenceAndInversionPreserveAcceptedInitial; assertion 21개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.BackendNanNonconvergenceAndInversionPreserveAcceptedInitial 유지 원문 검사 body 및 assertion 동일. 994315fd5e36287233e88949fa06cdd1a82a3df567118949362421a330549049 994315fd5e36287233e88949fa06cdd1a82a3df567118949362421a330549049 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 0U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], 0) | EXPECT_NEAR(state.Value().CommittedState().acceleration[0], .01 / .25, 1e-14) | ASSERT_FALSE(state.Value().IterationRecords().empty()) | EXPECT_EQ(state.Value().IterationRecords().back().stage, ""failed"") | EXPECT_FALSE(state.Value().IterationRecords().back().failure_code.empty()) | EXPECT_EQ(failed.evidence.iteration_index, 100U) | EXPECT_EQ(failed.failure_code, ""solid-dynamic-nonconvergence"") | EXPECT_FALSE(failed.failure_force_sum.has_value()) | EXPECT_NEAR(failed.evidence.worst_force_terms[1], expected_inertia, 32 * std::numeric_limits::epsilon() * std::abs(expected_inertia)) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[2], 0) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[3], .01) | EXPECT_FALSE(failed.evidence.residual_pass) | EXPECT_TRUE(failed.evidence.update_pass) | EXPECT_TRUE(failed.evidence.correction_pass) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().low.displacement[i], 0)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 0U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], 0) | EXPECT_NEAR(state.Value().CommittedState().acceleration[0], .01 / .25, 1e-14) | ASSERT_FALSE(state.Value().IterationRecords().empty()) | EXPECT_EQ(state.Value().IterationRecords().back().stage, ""failed"") | EXPECT_FALSE(state.Value().IterationRecords().back().failure_code.empty()) | EXPECT_EQ(failed.evidence.iteration_index, 100U) | EXPECT_EQ(failed.failure_code, ""solid-dynamic-nonconvergence"") | EXPECT_FALSE(failed.failure_force_sum.has_value()) | EXPECT_NEAR(failed.evidence.worst_force_terms[1], expected_inertia, 32 * std::numeric_limits::epsilon() * std::abs(expected_inertia)) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[2], 0) | EXPECT_DOUBLE_EQ(failed.evidence.worst_force_terms[3], .01) | EXPECT_FALSE(failed.evidence.residual_pass) | EXPECT_TRUE(failed.evidence.update_pass) | EXPECT_TRUE(failed.evidence.correction_pass) | EXPECT_TRUE(std::isfinite(value)) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().low.displacement[i], 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.LateBackendFailurePreservesActualCommittedMotionAndHistory SolidHhtDynamics.LateBackendFailurePreservesActualCommittedMotionAndHistory; assertion 11개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.LateBackendFailurePreservesActualCommittedMotionAndHistory 유지 원문 검사 body 및 assertion 동일. 0e04bfa810734cd17fe3ed9b0ce99f803e24ecf3224cfee93f44df7f79d2f3b9 0e04bfa810734cd17fe3ed9b0ce99f803e24ecf3224cfee93f44df7f79d2f3b9 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 1U) | EXPECT_GT(state.Value().CommittedState().displacement[0], 0) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().strain_energy, committed.strain_energy) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().increment_index, 1U) | EXPECT_GT(state.Value().CommittedState().displacement[0], 0) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().strain_energy, committed.strain_energy) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.NonfiniteWeightedEvidenceCannotContaminateAcceptedHistory SolidHhtDynamics.NonfiniteWeightedEvidenceCannotContaminateAcceptedHistory; assertion 7개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.NonfiniteWeightedEvidenceCannotContaminateAcceptedHistory 유지 원문 검사 body 및 assertion 동일. 6e0271bb8ebda6f0a0c5a3a7a2287c385827fd8d17d18652b2208b204bf6ab8e 6e0271bb8ebda6f0a0c5a3a7a2287c385827fd8d17d18652b2208b204bf6ab8e ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::SolidHhtDynamicProcedureExecutor(parallel, mass, tangent) .ExecuteInto(domain.Value(), state.Value()) .IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(fesa::SolidHhtDynamicProcedureExecutor(parallel, mass, tangent) .ExecuteInto(domain.Value(), state.Value()) .IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_EQ(state.Value().CommittedState().solid_results[0].cauchy_stress, committed.solid_results[0].cauchy_stress) | EXPECT_DOUBLE_EQ(state.Value().CommittedState().displacement[0], committed.displacement[0]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AlphaZeroLinearUnforcedTailConservesEnergyAndTrapezoidWork SolidHhtDynamics.AlphaZeroLinearUnforcedTailConservesEnergyAndTrapezoidWork; assertion 6개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AlphaZeroLinearUnforcedTailConservesEnergyAndTrapezoidWork 유지 원문 검사 body 및 assertion 동일. dd866c138e709fdc9aa58b3b2e87b3781004ecb72d2991144c208d93d71b1ea8 dd866c138e709fdc9aa58b3b2e87b3781004ecb72d2991144c208d93d71b1ea8 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_GT(tail, 1e-7) | EXPECT_NEAR(frames[n].external_work, work, 1e-16) | EXPECT_NEAR(frames[n].energy_balance_error, 0, 2e-12 * tail) | EXPECT_NEAR(frames[n].kinetic_energy + frames[n].strain_energy, tail, 2e-12 * tail) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_GT(tail, 1e-7) | EXPECT_NEAR(frames[n].external_work, work, 1e-16) | EXPECT_NEAR(frames[n].energy_balance_error, 0, 2e-12 * tail) | EXPECT_NEAR(frames[n].kinetic_energy + frames[n].strain_energy, tail, 2e-12 * tail) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.InitialMassBackendFailuresPreserveEmptyHistory SolidHhtDynamics.InitialMassBackendFailuresPreserveEmptyHistory; assertion 12개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.InitialMassBackendFailuresPreserveEmptyHistory 유지 원문 검사 body 및 assertion 동일. e05bf94288c50cbcb48e82d010333756d3468e53ca60fd91f161a749ed0f1ffc e05bf94288c50cbcb48e82d010333756d3468e53ca60fd91f161a749ed0f1ffc "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) | ASSERT_EQ(records.size(), factorization ? 1U : 2U) | EXPECT_EQ(records.front().stage, ""initial-mass"") | EXPECT_EQ(records.front().outcome, ""residual-refinement"") | EXPECT_EQ(records.front().evidence.iteration_index, 0U) | EXPECT_FALSE(records.front().evidence.residual_pass) | EXPECT_EQ(records.back().stage, ""failed"") | EXPECT_EQ(records.back().failure_code, ""injected-backend"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue()) | ASSERT_EQ(records.size(), factorization ? 1U : 2U) | EXPECT_EQ(records.front().stage, ""initial-mass"") | EXPECT_EQ(records.front().outcome, ""residual-refinement"") | EXPECT_EQ(records.front().evidence.iteration_index, 0U) | EXPECT_FALSE(records.front().evidence.residual_pass) | EXPECT_EQ(records.back().stage, ""failed"") | EXPECT_EQ(records.back().failure_code, ""injected-backend"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllFreeNoForceIsExactlyAtRestForLinearAndTl SolidHhtDynamics.AllFreeNoForceIsExactlyAtRestForLinearAndTl; assertion 10개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.AllFreeNoForceIsExactlyAtRestForLinearAndTl 유지 원문 검사 body 및 assertion 동일. d09d84966fea765d732e231ff5dde9c2e8a649cbd91c3a946e2020274e398ddd d09d84966fea765d732e231ff5dde9c2e8a649cbd91c3a946e2020274e398ddd ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0) | EXPECT_DOUBLE_EQ(frame.strain_energy, 0) | EXPECT_DOUBLE_EQ(frame.displacement[i], 0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(frame.iteration_count, 0U) | EXPECT_DOUBLE_EQ(frame.kinetic_energy, 0) | EXPECT_DOUBLE_EQ(frame.strain_energy, 0) | EXPECT_DOUBLE_EQ(frame.displacement[i], 0) | EXPECT_DOUBLE_EQ(frame.velocity[i], 0) | EXPECT_DOUBLE_EQ(frame.acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.algorithmic_acceleration[i], 0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalLinearAcceptsAll101Endpoints SolidHhtSourceSmoke.ReadOnlyOriginalLinearAcceptsAll101Endpoints; assertion 0개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalLinearAcceptsAll101Endpoints 유지 원문 검사 body 및 assertion 동일. 5391fef4221914378a7f90aee66f4b5dfdce359f6f20a5206103e3df7bc40d95 5391fef4221914378a7f90aee66f4b5dfdce359f6f20a5206103e3df7bc40d95 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalNonlinearAcceptsAll101Endpoints SolidHhtSourceSmoke.ReadOnlyOriginalNonlinearAcceptsAll101Endpoints; assertion 0개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtSourceSmoke.ReadOnlyOriginalNonlinearAcceptsAll101Endpoints 유지 원문 검사 body 및 assertion 동일. 24b67b4ab019d0f53319e5523d3aa2893debf73e13edf2dab5f27889e9547dfd 24b67b4ab019d0f53319e5523d3aa2893debf73e13edf2dab5f27889e9547dfd 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRetainsNonzeroOldResidualAndEffectiveTangent SolidHhtDynamics.WeightedIdentityRetainsNonzeroOldResidualAndEffectiveTangent; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRetainsNonzeroOldResidualAndEffectiveTangent 유지 원문 검사 body 및 assertion 동일. f7634aeb2f9bf5b13387abd6ef3e10c9f2f0024741dbc34a156e27668892ce91 f7634aeb2f9bf5b13387abd6ef3e10c9f2f0024741dbc34a156e27668892ce91 ASSERT_TRUE(mass.HasValue()) | ASSERT_NE(old.residual[0], 0) | ASSERT_NE(old.residual[1], 0) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), i, MA[i], next, old, alpha, &identities[i])) | EXPECT_LE(identities[i].metric, 1e-12) | EXPECT_NEAR( identities[i].original, identities[i].solved, 512 * std::numeric_limits::epsilon() * identities[i].scale) | EXPECT_GT( std::abs(identities[i].solved - (1 + alpha) * next.residual[i]), .01) | EXPECT_NEAR((right[i].solved - left[i].solved) / (2 * epsilon), tangent_direction[i], 1e-9 * std::abs(tangent_direction[i])) ASSERT_TRUE(mass.HasValue()) | ASSERT_NE(old.residual[0], 0) | ASSERT_NE(old.residual[1], 0) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), i, MA[i], next, old, alpha, &identities[i])) | EXPECT_LE(identities[i].metric, 1e-12) | EXPECT_NEAR( identities[i].original, identities[i].solved, 512 * std::numeric_limits::epsilon() * identities[i].scale) | EXPECT_GT( std::abs(identities[i].solved - (1 + alpha) * next.residual[i]), .01) | EXPECT_NEAR((right[i].solved - left[i].solved) / (2 * epsilon), tangent_direction[i], 1e-9 * std::abs(tangent_direction[i])) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRejectsNonfiniteAndOverflowBeforeNormReduction SolidHhtDynamics.WeightedIdentityRejectsNonfiniteAndOverflowBeforeNormReduction; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.WeightedIdentityRejectsNonfiniteAndOverflowBeforeNormReduction 유지 원문 검사 body 및 assertion 동일. 21767e2f26a9783ef8b3ea4897f8543314f9353f4d55800634852db6ca5e9b2a 21767e2f26a9783ef8b3ea4897f8543314f9353f4d55800634852db6ca5e9b2a ASSERT_TRUE(mass.HasValue()) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_EQ(identity.scale, 0) | EXPECT_EQ(identity.metric, 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, invalid, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, bad, previous, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) ASSERT_TRUE(mass.HasValue()) | EXPECT_TRUE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_EQ(identity.scale, 0) | EXPECT_EQ(identity.metric, 0) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, invalid, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, bad, previous, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) | EXPECT_FALSE(fesa::detail::EvaluateSolidHhtForceIdentity( mass.Value(), 0, 0, next, old, -.05, &identity)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FullFreeNewtonRecoversAllComponentsAfterCoupledTrialPerturbation SolidHhtDynamics.FullFreeNewtonRecoversAllComponentsAfterCoupledTrialPerturbation; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FullFreeNewtonRecoversAllComponentsAfterCoupledTrialPerturbation 유지 원문 검사 body 및 assertion 동일. 9e1a1f350b3a8da815127d3678f269e8701013a5e689bab8a5a1c4dc5e965a41 9e1a1f350b3a8da815127d3678f269e8701013a5e689bab8a5a1c4dc5e965a41 ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(tangent.kicked) | EXPECT_TRUE(tangent.full_size_all_calls) | EXPECT_TRUE(tangent.solved_after_kick) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * n], .5 * frame.time * frame.time, roundoff * .5 * frame.time * frame.time) ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(tangent.kicked) | EXPECT_TRUE(tangent.full_size_all_calls) | EXPECT_TRUE(tangent.solved_after_kick) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * n], .5 * frame.time * frame.time, roundoff * .5 * frame.time * frame.time) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.RepresentableNeighborUsesHeldCouplingAndOriginalFullForceMetric SolidHhtFloat64History.RepresentableNeighborUsesHeldCouplingAndOriginalFullForceMetric; assertion 24개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.RepresentableNeighborUsesHeldCouplingAndOriginalFullForceMetric 유지 원문 검사 body 및 assertion 동일. edbbaae61828136237c20662167cca044b5992c324f9989e801d85b6ae72343a edbbaae61828136237c20662167cca044b5992c324f9989e801d85b6ae72343a ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | ASSERT_GT(initial, 1e-10) | ASSERT_EQ(frame.residual[1], 0) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected)) | ASSERT_TRUE(selected.found) | EXPECT_EQ(selected.full_dof, 1U) | EXPECT_EQ(selected.displacement, std::nextafter(.5, -std::numeric_limits::infinity())) | EXPECT_EQ(selected.delta, selected.displacement - frame.displacement[1]) | EXPECT_LT(selected.predicted_metric, initial) | EXPECT_LE(selected.predicted_metric, 1e-10) | EXPECT_EQ(selected.predicted_metric, exact_metric) | ASSERT_TRUE(alternative_tangent.HasValue()) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), alternative_tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected, &ranked)) | ASSERT_EQ(ranked.size(), 2U) | EXPECT_EQ(ranked[0].full_dof, 0U) | EXPECT_EQ(ranked[1].full_dof, 1U) | EXPECT_LT(ranked[0].predicted_metric, ranked[1].predicted_metric) | EXPECT_LT(ranked[1].predicted_metric, initial) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_TRUE(accepted.Value()) | EXPECT_EQ(tried, (std::vector{0, 1})) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(tried, (std::vector{0})) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | ASSERT_GT(initial, 1e-10) | ASSERT_EQ(frame.residual[1], 0) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected)) | ASSERT_TRUE(selected.found) | EXPECT_EQ(selected.full_dof, 1U) | EXPECT_EQ(selected.displacement, std::nextafter(.5, -std::numeric_limits::infinity())) | EXPECT_EQ(selected.delta, selected.displacement - frame.displacement[1]) | EXPECT_LT(selected.predicted_metric, initial) | EXPECT_LE(selected.predicted_metric, 1e-10) | EXPECT_EQ(selected.predicted_metric, exact_metric) | ASSERT_TRUE(alternative_tangent.HasValue()) | ASSERT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), alternative_tangent.Value(), {0, 1}, frame, 1, -.05, .275625, &selected, &ranked)) | ASSERT_EQ(ranked.size(), 2U) | EXPECT_EQ(ranked[0].full_dof, 0U) | EXPECT_EQ(ranked[1].full_dof, 1U) | EXPECT_LT(ranked[0].predicted_metric, ranked[1].predicted_metric) | EXPECT_LT(ranked[1].predicted_metric, initial) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_TRUE(accepted.Value()) | EXPECT_EQ(tried, (std::vector{0, 1})) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(tried, (std::vector{0})) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RepresentableNeighborKeepsExactZeroAndRejectsInvalidArithmetic SolidHhtDynamics.RepresentableNeighborKeepsExactZeroAndRejectsInvalidArithmetic; assertion 6개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.RepresentableNeighborKeepsExactZeroAndRejectsInvalidArithmetic 유지 원문 검사 body 및 assertion 동일. d9613a73dba9cc37e8a8f2190ca794fcacc17920cf0fba558508b576429d4d31 d9613a73dba9cc37e8a8f2190ca794fcacc17920cf0fba558508b576429d4d31 ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | EXPECT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, .1, -.05, .275625, &selected)) | EXPECT_FALSE(selected.found) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, bad, .1, -.05, .275625, &selected)) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, 0, -.05, .275625, &selected)) ASSERT_TRUE(mass.HasValue()) | ASSERT_TRUE(tangent.HasValue()) | EXPECT_TRUE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, .1, -.05, .275625, &selected)) | EXPECT_FALSE(selected.found) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, bad, .1, -.05, .275625, &selected)) | EXPECT_FALSE(fesa::detail::SelectSolidHhtRepresentableNeighbor( mass.Value(), tangent.Value(), {0}, frame, 0, -.05, .275625, &selected)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ActualNewtonStallAtLowHalfOfTwoCycleTriesFallback SolidHhtFloat64History.ActualNewtonStallAtLowHalfOfTwoCycleTriesFallback; assertion 10개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ActualNewtonStallAtLowHalfOfTwoCycleTriesFallback 유지 원문 검사 body 및 assertion 동일. 704d7a705643dd225528629f4b721162a3c853dd1a41efd579935737b8adeb80 704d7a705643dd225528629f4b721162a3c853dd1a41efd579935737b8adeb80 "ASSERT_LT(current_metric, previous_metric) | ASSERT_TRUE(history.Capture(previous, mask, metrics, 0, false)) | ASSERT_TRUE(history.Capture(current, mask, metrics, 1, false)) | EXPECT_TRUE(history.Match(previous, mask, metrics, false, &repeat)) | ASSERT_TRUE(selected.HasValue()) | EXPECT_TRUE(selected.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton"", ""actual-neighbor""})) | ASSERT_TRUE(productive.HasValue()) | EXPECT_FALSE(productive.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton""}))" "ASSERT_LT(current_metric, previous_metric) | ASSERT_TRUE(history.Capture(previous, mask, metrics, 0, false)) | ASSERT_TRUE(history.Capture(current, mask, metrics, 1, false)) | EXPECT_TRUE(history.Match(previous, mask, metrics, false, &repeat)) | ASSERT_TRUE(selected.HasValue()) | EXPECT_TRUE(selected.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton"", ""actual-neighbor""})) | ASSERT_TRUE(productive.HasValue()) | EXPECT_FALSE(productive.Value()) | EXPECT_EQ(evaluated, (std::vector{""complete-newton""}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ExactNewtonLoopHistoryDetectsThreeStateRecurrence SolidHhtFloat64History.ExactNewtonLoopHistoryDetectsThreeStateRecurrence; assertion 28개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.ExactNewtonLoopHistoryDetectsThreeStateRecurrence 유지 원문 검사 body 및 assertion 동일. 0d255c9f25e86d515bd140a91ed3a0af1f996156162df0c81c8e8cb340b2cd78 0d255c9f25e86d515bd140a91ed3a0af1f996156162df0c81c8e8cb340b2cd78 ASSERT_TRUE(history.Capture(first, first_mask, first_metrics, 4, false)) | ASSERT_TRUE(history.Capture(second, second_mask, second_metrics, 5, false)) | ASSERT_TRUE(history.Capture(third, first_mask, second_metrics, 6, false)) | EXPECT_EQ(history.Size(), 3U) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 4U) | EXPECT_EQ(e.history_entry_count, 3U) | EXPECT_EQ(e.changed_translations, 0U) | EXPECT_EQ(e.changed_holding_mask, 0U) | EXPECT_EQ(e.changed_correction_metrics, 0U) | ASSERT_TRUE(history.Match(first, second_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, different_metrics, false, &e)) | EXPECT_TRUE( e.repeat) | EXPECT_EQ(e.changed_correction_metrics, 1U) | ASSERT_TRUE(history.Match(first, first_mask, failing_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, true, &e)) | EXPECT_FALSE(e.repeat) | EXPECT_FALSE( history.Match(fesa::Vector(2), first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, {false}, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, first_metrics, 7, false)) | EXPECT_FALSE(history.Match(first, first_mask, bad_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, bad_metrics, 7, false)) ASSERT_TRUE(history.Capture(first, first_mask, first_metrics, 4, false)) | ASSERT_TRUE(history.Capture(second, second_mask, second_metrics, 5, false)) | ASSERT_TRUE(history.Capture(third, first_mask, second_metrics, 6, false)) | EXPECT_EQ(history.Size(), 3U) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 4U) | EXPECT_EQ(e.history_entry_count, 3U) | EXPECT_EQ(e.changed_translations, 0U) | EXPECT_EQ(e.changed_holding_mask, 0U) | EXPECT_EQ(e.changed_correction_metrics, 0U) | ASSERT_TRUE(history.Match(first, second_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, different_metrics, false, &e)) | EXPECT_TRUE( e.repeat) | EXPECT_EQ(e.changed_correction_metrics, 1U) | ASSERT_TRUE(history.Match(first, first_mask, failing_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(first, first_mask, first_metrics, true, &e)) | EXPECT_FALSE(e.repeat) | EXPECT_FALSE( history.Match(fesa::Vector(2), first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, {false}, first_metrics, false, &e)) | EXPECT_FALSE(history.Match(first, first_mask, first_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, first_metrics, 7, false)) | EXPECT_FALSE(history.Match(first, first_mask, bad_metrics, false, &e)) | EXPECT_FALSE(history.Capture(first, first_mask, bad_metrics, 7, false)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.EquivalentFailedNewtonEntrySurvivesRepresentableMove SolidHhtFloat64History.EquivalentFailedNewtonEntrySurvivesRepresentableMove; assertion 21개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtFloat64History.EquivalentFailedNewtonEntrySurvivesRepresentableMove 유지 원문 검사 body 및 assertion 동일. 6b2aeb48d13d507d18a5dd85677f1fbc3204be7f109d4237fb3cae32ca59e4e1 6b2aeb48d13d507d18a5dd85677f1fbc3204be7f109d4237fb3cae32ca59e4e1 "ASSERT_TRUE(history.Capture(failed, mask, correction, 23, true)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, large, 23, false)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, correction, 23, false)) | EXPECT_TRUE(history.Match(failed, mask, correction, false, &e)) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(first.Value()) | EXPECT_NE(actual[0], failed[0]) | EXPECT_TRUE(history.Match(failed, mask, new_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 23U) | ASSERT_TRUE(second.HasValue()) | EXPECT_TRUE(second.Value()) | EXPECT_EQ(applied, (std::vector{""accepted-ulp"", ""returning-newton-evaluated"", ""another-accepted-ulp""})) | ASSERT_TRUE(history.Match(fresh, mask, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, {true, false}, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, mask, new_metrics, true, &e)) | EXPECT_FALSE(e.repeat)" "ASSERT_TRUE(history.Capture(failed, mask, correction, 23, true)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, large, 23, false)) | EXPECT_EQ(history.Size(), 0U) | ASSERT_TRUE(history.Capture(failed, mask, correction, 23, false)) | EXPECT_TRUE(history.Match(failed, mask, correction, false, &e)) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(first.Value()) | EXPECT_NE(actual[0], failed[0]) | EXPECT_TRUE(history.Match(failed, mask, new_metrics, false, &e)) | EXPECT_TRUE(e.repeat) | EXPECT_EQ(e.matched_entry_iteration, 23U) | ASSERT_TRUE(second.HasValue()) | EXPECT_TRUE(second.Value()) | EXPECT_EQ(applied, (std::vector{""accepted-ulp"", ""returning-newton-evaluated"", ""another-accepted-ulp""})) | ASSERT_TRUE(history.Match(fresh, mask, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, {true, false}, new_metrics, false, &e)) | EXPECT_FALSE(e.repeat) | ASSERT_TRUE(history.Match(failed, mask, new_metrics, true, &e)) | EXPECT_FALSE(e.repeat)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.UnsupportedPairedProductsPreserveEmptyHistory SolidHhtDynamics.UnsupportedPairedProductsPreserveEmptyHistory; assertion 9개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.UnsupportedPairedProductsPreserveEmptyHistory 유지 원문 검사 body 및 assertion 동일. ee1b43798dba3932ce708b5da15e9939ca00a2600a213127e00db3b0a0fdfd03 ee1b43798dba3932ce708b5da15e9939ca00a2600a213127e00db3b0a0fdfd03 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(status.Diagnostics().front().message.find(""supported""), std::string::npos) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue())" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(status.Diagnostics().front().message.find(""supported""), std::string::npos) | EXPECT_TRUE(state.Value().AcceptedFrames().empty()) | EXPECT_FALSE(state.Value().BeginTrialFromCommitted().HasValue())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FailureShadowRecoversCancellationAndRejectsOverflow SolidHhtDynamics.FailureShadowRecoversCancellationAndRejectsOverflow; assertion 8개 tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp SolidHhtDynamics.FailureShadowRecoversCancellationAndRejectsOverflow 유지 원문 검사 body 및 assertion 동일. e0a5f34b9c1b33e66905824b7b4c1a4a0987200be7dc62c0e9f98a1ff767e22b e0a5f34b9c1b33e66905824b7b4c1a4a0987200be7dc62c0e9f98a1ff767e22b ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( term, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 0) | EXPECT_EQ(sum + correction, 1) | ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( 1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( -1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 1e308) | EXPECT_EQ(absolute_sum, 1e308) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( 0, std::numeric_limits::quiet_NaN(), &sum, &correction, &absolute_sum)) ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( term, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 0) | EXPECT_EQ(sum + correction, 1) | ASSERT_TRUE(fesa::detail::AccumulateSolidHhtForceShadow( 1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( -1e308, 0, &sum, &correction, &absolute_sum)) | EXPECT_EQ(sum, 1e308) | EXPECT_EQ(absolute_sum, 1e308) | EXPECT_FALSE(fesa::detail::AccumulateSolidHhtForceShadow( 0, std::numeric_limits::quiet_NaN(), &sum, &correction, &absolute_sum)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp support@1-153 helper/oracle/fixture/include/static assertion 구간: RunDynamics, Injected, ControlledTangent, FailedMass, OneFree, namespace, PairedUniformInitial tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 233de46ebb5bd11cb643df1a23a3dd168545dc31c41cb3f07b10e23592debb5e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp support@377-446 helper/oracle/fixture/include/static assertion 구간: RestoreArithmeticEnvironment, MutateArithmeticEnvironment, defined, EnvironmentMass, EnvironmentTangent tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b2d00fc08e11c3ce43e06b98f3dae891caf968c4b4fa6bd29a53bdab50fb2004 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp support@856-977 helper/oracle/fixture/include/static assertion 구간: CheckOriginalSourceDeck, if, for tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3246a745bf72b60f32cde913fdf1d843b9baa70e5c6d6a3887a9d41f9bbbdf45 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2973549ac31485ce1ab52ad5dc69ca0e8790f437361cf696f53e4bac0b9c627c 2973549ac31485ce1ab52ad5dc69ca0e8790f437361cf696f53e4bac0b9c627c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedSerialAndTbbPreserveEveryLowComponent SolidHhtTemporal.PairedSerialAndTbbPreserveEveryLowComponent; assertion 0개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedSerialAndTbbPreserveEveryLowComponent 유지 원문 검사 body 및 assertion 동일. 925f400f0ca59d4e2137357ae92f2a0dd2d7509f13b020d8976c51c5aca4650c 925f400f0ca59d4e2137357ae92f2a0dd2d7509f13b020d8976c51c5aca4650c 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FreeConstantForceHasAnalyticalInitialAcceleration SolidHhtTemporal.FreeConstantForceHasAnalyticalInitialAcceleration; assertion 4개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FreeConstantForceHasAnalyticalInitialAcceleration 유지 원문 검사 body 및 assertion 동일. cb0a64053e82c3ccc5536f4e9436ad00984a15283b69f2f32cad33eb3f89713f cb0a64053e82c3ccc5536f4e9436ad00984a15283b69f2f32cad33eb3f89713f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(initial.acceleration[3 * node], 1, 1e-13) | EXPECT_DOUBLE_EQ(initial.displacement[3 * node], 0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(initial.acceleration[3 * node], 1, 1e-13) | EXPECT_DOUBLE_EQ(initial.displacement[3 * node], 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.AllFreeUniformForceRetainsExactRigidTranslationBehavior SolidHhtTemporal.AllFreeUniformForceRetainsExactRigidTranslationBehavior; assertion 9개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.AllFreeUniformForceRetainsExactRigidTranslationBehavior 유지 원문 검사 body 및 assertion 동일. 8f852ae83f87b923ddb98e6b8def6326dadb54b8a8e7f239ca53f21cb5740be0 8f852ae83f87b923ddb98e6b8def6326dadb54b8a8e7f239ca53f21cb5740be0 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(std::any_of( state.Value().IterationRecords().begin(), state.Value().IterationRecords().end(), [](const auto& record) { return record.outcome == ""paired-candidate""; })) | EXPECT_NEAR(f.displacement[3 * n], .5 * f.time * f.time, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n], f.time, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n], 1, roundoff) | EXPECT_NEAR(f.displacement[3 * n + c], 0, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n + c], 0, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n + c], 0, roundoff)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(std::any_of( state.Value().IterationRecords().begin(), state.Value().IterationRecords().end(), [](const auto& record) { return record.outcome == ""paired-candidate""; })) | EXPECT_NEAR(f.displacement[3 * n], .5 * f.time * f.time, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n], f.time, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n], 1, roundoff) | EXPECT_NEAR(f.displacement[3 * n + c], 0, roundoff * .5 * f.time * f.time) | EXPECT_NEAR(f.velocity[3 * n + c], 0, roundoff * f.time) | EXPECT_NEAR(f.acceleration[3 * n + c], 0, roundoff)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedNewtonKeepsAllOriginalComponentsAcrossAxesAndScales SolidHhtTemporal.PairedNewtonKeepsAllOriginalComponentsAcrossAxesAndScales; assertion 10개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.PairedNewtonKeepsAllOriginalComponentsAcrossAxesAndScales 유지 원문 검사 body 및 assertion 동일. 7652c6a7c34e2a7cb0a270e47e8f0e15059187b39635ba1980ddbfac049e0764 7652c6a7c34e2a7cb0a270e47e8f0e15059187b39635ba1980ddbfac049e0764 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * node + c], .5 * a * frame.time * frame.time, roundoff * .5 * acceleration * frame.time * frame.time) | EXPECT_NEAR(frame.velocity[3 * node + c], a * frame.time, roundoff * acceleration * frame.time) | EXPECT_NEAR(frame.acceleration[3 * node + c], a, roundoff * acceleration) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | EXPECT_LE(frame.iterations.back().residual_metric, 1e-10) | EXPECT_LE(frame.iterations.back().update_metric, 1e-12) | EXPECT_NEAR(frame.displacement[3 * node + c], .5 * a * frame.time * frame.time, roundoff * .5 * acceleration * frame.time * frame.time) | EXPECT_NEAR(frame.velocity[3 * node + c], a * frame.time, roundoff * acceleration * frame.time) | EXPECT_NEAR(frame.acceleration[3 * node + c], a, roundoff * acceleration) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.ActualTwoBrickLinearAndRotatingSmallStrainTlAreSecondOrder SolidHhtTemporal.ActualTwoBrickLinearAndRotatingSmallStrainTlAreSecondOrder; assertion 4개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.ActualTwoBrickLinearAndRotatingSmallStrainTlAreSecondOrder 유지 원문 검사 body 및 assertion 동일. e27884c416eb70f27d47e3985209f13751955e5c30a689ad6d938474f41ca416 e27884c416eb70f27d47e3985209f13751955e5c30a689ad6d938474f41ca416 EXPECT_GT(fine[j], 1e-8) | EXPECT_LT(coarse[j], .1) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) EXPECT_GT(fine[j], 1e-8) | EXPECT_LT(coarse[j], .1) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentThreeDofBrickOscillatorHasSecondOrderUVA SolidHhtTemporal.IndependentThreeDofBrickOscillatorHasSecondOrderUVA; assertion 5개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentThreeDofBrickOscillatorHasSecondOrderUVA 유지 원문 검사 body 및 assertion 동일. a3cc00aa843d56fb0d6354682dccb6ddb98a61b624f57e2337a37499cc7e3efa a3cc00aa843d56fb0d6354682dccb6ddb98a61b624f57e2337a37499cc7e3efa ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-15) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-15) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentScalarBrickOscillatorHasSecondOrderUVA SolidHhtTemporal.IndependentScalarBrickOscillatorHasSecondOrderUVA; assertion 7개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.IndependentScalarBrickOscillatorHasSecondOrderUVA 유지 원문 검사 body 및 assertion 동일. 8cd02e0db682a2480cd82a7ce3bb9d235ada6080f491eb79a280b4fd3469633f 8cd02e0db682a2480cd82a7ce3bb9d235ada6080f491eb79a280b4fd3469633f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR( f.kinetic_energy, .5 * m * f.velocity[0] * f.velocity[0], 512 * std::numeric_limits::epsilon() * f.kinetic_energy) | EXPECT_NEAR(f.strain_energy, .5 * k * f.displacement[0] * f.displacement[0], 512 * std::numeric_limits::epsilon() * f.strain_energy) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-8) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR( f.kinetic_energy, .5 * m * f.velocity[0] * f.velocity[0], 512 * std::numeric_limits::epsilon() * f.kinetic_energy) | EXPECT_NEAR(f.strain_energy, .5 * k * f.displacement[0] * f.displacement[0], 512 * std::numeric_limits::epsilon() * f.strain_energy) | EXPECT_GE(p1, 1.8) | EXPECT_GE(p2, 1.8) | EXPECT_GT(errors[2][j], 1e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FixedThicknessBendingRetainsDiscreteBulkBias SolidHhtTemporal.FixedThicknessBendingRetainsDiscreteBulkBias; assertion 3개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.FixedThicknessBendingRetainsDiscreteBulkBias 유지 원문 검사 body 및 assertion 동일. e9210764d5fd451d439b84dfd39db8695cac0f2bb2e9aefc1913caaa132185f4 e9210764d5fd451d439b84dfd39db8695cac0f2bb2e9aefc1913caaa132185f4 EXPECT_NEAR(energy[0] / continuum, limit + parasitic, 2e-11) | EXPECT_NEAR(energy[2] / continuum, 0, 2e-13) | EXPECT_NEAR(previous_parasitic / parasitic, 4, 1e-13) EXPECT_NEAR(energy[0] / continuum, limit + parasitic, 2e-11) | EXPECT_NEAR(energy[2] / continuum, 0, 2e-13) | EXPECT_NEAR(previous_parasitic / parasitic, 4, 1e-13) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.BendingMeshRefinementQuantifiesFullIntegrationShearLocking SolidHhtTemporal.BendingMeshRefinementQuantifiesFullIntegrationShearLocking; assertion 4개 tests/unit/analysis/solid_hht_temporal_verification_test.cpp SolidHhtTemporal.BendingMeshRefinementQuantifiesFullIntegrationShearLocking 유지 원문 검사 body 및 assertion 동일. f2d9632408ddbfd1de879876b41c4dbed627801d1bc3b1454cedd7b77345ce1d f2d9632408ddbfd1de879876b41c4dbed627801d1bc3b1454cedd7b77345ce1d EXPECT_NEAR(error, shear - missing_bulk, 2e-11) | EXPECT_NEAR(energy[1] / continuum, 4 * mu / (3 * axial) + shear, 2e-11) | EXPECT_NEAR(energy[2] / continuum, bulk / axial - missing_bulk, 2e-11) | EXPECT_NEAR(previous_error / error, 4, 1e-10) EXPECT_NEAR(error, shear - missing_bulk, 2e-11) | EXPECT_NEAR(energy[1] / continuum, 4 * mu / (3 * axial) + shear, 2e-11) | EXPECT_NEAR(energy[2] / continuum, bulk / axial - missing_bulk, 2e-11) | EXPECT_NEAR(previous_error / error, 4, 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp support@1-332 helper/oracle/fixture/include/static assertion 구간: AffineMotion, Motion, if, Apply, TwoBricks, ExactForce, ExactMassProduct, AddCross, ManufacturedRun, for tests/unit/analysis/solid_hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4c8ee89aab5bd9798906f93ce66756ce94ef4d24fd91379106f91fb317702361 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_temporal_verification_test.cpp support@602-649 helper/oracle/fixture/include/static assertion 구간: BendingEnergy tests/unit/analysis/solid_hht_temporal_verification_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5ea1a45d3745809343ba4a3358aaafeb00f60c830f663189069687af8a684b7f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_test_fixture.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/unit/analysis/solid_hht_test_fixture.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2ffd1ec89405f926f038cb58fc612604ff8e17853c134caf7cb127c32685cefd 2ffd1ec89405f926f038cb58fc612604ff8e17853c134caf7cb127c32685cefd 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_hht_test_fixture.h support@1-52 helper/oracle/fixture/include/static assertion 구간: solid_hht_test, Brick, Message tests/unit/analysis/solid_hht_test_fixture.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e2621f72b12715391a06e51ec23a320063679e90af74443afd5237197194b962 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_static_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 23개 tests/unit/analysis/solid_static_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8253b2e91a4db4d52cc039a5084ddfb93f7b0ffd1d10b1680e0e79439eabcb04 8253b2e91a4db4d52cc039a5084ddfb93f7b0ffd1d10b1680e0e79439eabcb04 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LinearForceNonzeroSupportAndCompleteRecovery SolidStaticProcedure.LinearForceNonzeroSupportAndCompleteRecovery; assertion 17개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LinearForceNonzeroSupportAndCompleteRecovery 유지 원문 검사 body 및 assertion 동일. 0661804c27dc3d473e445fb06a9874f92a9e56b90ad2f77cafcd5eda24a801ed 0661804c27dc3d473e445fb06a9874f92a9e56b90ad2f77cafcd5eda24a801ed ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_EQ(frame.frame_index, 0U) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | ASSERT_EQ(frame.displacement.Size(), 24U) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_NEAR(frame.displacement[3 * a], 0.02 + 0.01 * kX[a][0], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 1], -0.0025 * kX[a][1], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 2], -0.0025 * kX[a][2], 1e-13) | EXPECT_DOUBLE_EQ(frame.reaction[3 * a], 0.0) | EXPECT_NEAR(frame.reaction[3 * a], -0.3, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 0.006, 1e-13) | EXPECT_NEAR(point.cauchy_stress[0], 1.2, 1e-12) | EXPECT_NEAR(point.cauchy_stress[1], 0.0, 1e-12) | EXPECT_NEAR(point.strain[0], 0.01, 1e-13) | EXPECT_NEAR(value, 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_EQ(frame.frame_index, 0U) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | ASSERT_EQ(frame.displacement.Size(), 24U) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_NEAR(frame.displacement[3 * a], 0.02 + 0.01 * kX[a][0], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 1], -0.0025 * kX[a][1], 1e-13) | EXPECT_NEAR(frame.displacement[3 * a + 2], -0.0025 * kX[a][2], 1e-13) | EXPECT_DOUBLE_EQ(frame.reaction[3 * a], 0.0) | EXPECT_NEAR(frame.reaction[3 * a], -0.3, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 0.006, 1e-13) | EXPECT_NEAR(point.cauchy_stress[0], 1.2, 1e-12) | EXPECT_NEAR(point.cauchy_stress[1], 0.0, 1e-12) | EXPECT_NEAR(point.strain[0], 0.01, 1e-13) | EXPECT_NEAR(value, 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.AllConstrainedShearHasTensorStrainAndLinearMomentEvidence SolidStaticProcedure.AllConstrainedShearHasTensorStrainAndLinearMomentEvidence; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.AllConstrainedShearHasTensorStrainAndLinearMomentEvidence 유지 원문 검사 body 및 assertion 동일. e2c2aaea106d7f59e5ac8f4e9b545fe99ced00b92c0113d4e36fd40d305a972b e2c2aaea106d7f59e5ac8f4e9b545fe99ced00b92c0113d4e36fd40d305a972b ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[3], 0.015, 1e-13) | EXPECT_NEAR(point.cauchy_stress[3], 1.44, 1e-12) | EXPECT_NEAR(frame.physical_strain_energy, 0.0504, 1e-13) | EXPECT_GT(std::abs(frame.balance.current_internal_moment[2]), 1e-5) | EXPECT_NEAR(frame.balance.current_internal_moment[2], frame.balance.linearization_moment[2], 1e-12) | EXPECT_NEAR(frame.balance.reference_internal_moment[2], 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[3], 0.015, 1e-13) | EXPECT_NEAR(point.cauchy_stress[3], 1.44, 1e-12) | EXPECT_NEAR(frame.physical_strain_energy, 0.0504, 1e-13) | EXPECT_GT(std::abs(frame.balance.current_internal_moment[2]), 1e-5) | EXPECT_NEAR(frame.balance.current_internal_moment[2], frame.balance.linearization_moment[2], 1e-12) | EXPECT_NEAR(frame.balance.reference_internal_moment[2], 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.NonlinearDirectScheduleScalesForceAndAbsoluteTargets SolidStaticProcedure.NonlinearDirectScheduleScalesForceAndAbsoluteTargets; assertion 13개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.NonlinearDirectScheduleScalesForceAndAbsoluteTargets 유지 원문 검사 body 및 assertion 동일. d9e5db680ab7cfefe0bb0adc600921ea6a1ce60566317367656d013931bfebf6 d9e5db680ab7cfefe0bb0adc600921ea6a1ce60566317367656d013931bfebf6 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_EQ(frame.frame_index, n) | EXPECT_EQ(frame.increment_index, n + 1U) | EXPECT_DOUBLE_EQ(frame.load_factor, 0.25 * (n + 1)) | EXPECT_DOUBLE_EQ(frame.displacement[0], 0.02 * frame.load_factor) | EXPECT_DOUBLE_EQ(frame.external_force[3], 0.3 * frame.load_factor) | EXPECT_GT(frame.iteration_count, 1U) | EXPECT_EQ(frame.is_factor_one, n == 3) | EXPECT_NEAR(value, 0.0, 1e-12) | ASSERT_FALSE(result.Value().state.IterationRecords().empty()) | EXPECT_TRUE(result.Value().state.IterationRecords().back().accepted) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_EQ(frame.frame_index, n) | EXPECT_EQ(frame.increment_index, n + 1U) | EXPECT_DOUBLE_EQ(frame.load_factor, 0.25 * (n + 1)) | EXPECT_DOUBLE_EQ(frame.displacement[0], 0.02 * frame.load_factor) | EXPECT_DOUBLE_EQ(frame.external_force[3], 0.3 * frame.load_factor) | EXPECT_GT(frame.iteration_count, 1U) | EXPECT_EQ(frame.is_factor_one, n == 3) | EXPECT_NEAR(value, 0.0, 1e-12) | ASSERT_FALSE(result.Value().state.IterationRecords().empty()) | EXPECT_TRUE(result.Value().state.IterationRecords().back().accepted) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PurePrescribedNonlinearAndSmallLoadLinearLimit SolidStaticProcedure.PurePrescribedNonlinearAndSmallLoadLinearLimit; assertion 9개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PurePrescribedNonlinearAndSmallLoadLinearLimit 유지 원문 검사 body 및 assertion 동일. 45b82b45c2f4ba29abb9e5f78b83dea26d453f512441f7bb2d79443d02ab4f92 45b82b45c2f4ba29abb9e5f78b83dea26d453f512441f7bb2d79443d02ab4f92 ASSERT_TRUE(pure.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(record.force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(record.force_residual.denominator_scale, 0.0) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_NEAR(l.Value().state.CommittedState().displacement[i], n.Value().state.CommittedState().displacement[i], 2e-13) ASSERT_TRUE(pure.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(record.force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(record.force_residual.denominator_scale, 0.0) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_NEAR(l.Value().state.CommittedState().displacement[i], n.Value().state.CommittedState().displacement[i], 2e-13) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StrainedThenRotatedTLCauchyAndEnergyOracle SolidStaticProcedure.StrainedThenRotatedTLCauchyAndEnergyOracle; assertion 7개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StrainedThenRotatedTLCauchyAndEnergyOracle 유지 원문 검사 body 및 assertion 동일. ae7f274dc580d801db003d380539c0153f30638e98a1aef9ddb9bed86a5cf421 ae7f274dc580d801db003d380539c0153f30638e98a1aef9ddb9bed86a5cf421 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[0], green, 1e-13) | EXPECT_NEAR( point.cauchy_stress[0], std::pow(std::cos(angle), 2) * s0 + std::pow(std::sin(angle), 2) * s1, 1e-11) | EXPECT_NEAR(point.cauchy_stress[3], std::sin(angle) * std::cos(angle) * (s0 - s1), 1e-11) | EXPECT_NEAR(frame.physical_strain_energy, 72 * green * green, 1e-12) | EXPECT_NEAR(value, 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(point.strain[0], green, 1e-13) | EXPECT_NEAR( point.cauchy_stress[0], std::pow(std::cos(angle), 2) * s0 + std::pow(std::sin(angle), 2) * s1, 1e-11) | EXPECT_NEAR(point.cauchy_stress[3], std::sin(angle) * std::cos(angle) * (s0 - s1), 1e-11) | EXPECT_NEAR(frame.physical_strain_energy, 72 * green * green, 1e-12) | EXPECT_NEAR(value, 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FailedBackendKeepsActualAcceptedHistory SolidStaticProcedure.FailedBackendKeepsActualAcceptedHistory; assertion 11개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FailedBackendKeepsActualAcceptedHistory 유지 원문 검사 body 및 assertion 동일. 8fcbb8d30b751700e685c57cf7f932779ef1105776f8c5cde20834df611a5075 8fcbb8d30b751700e685c57cf7f932779ef1105776f8c5cde20834df611a5075 "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25) | EXPECT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().diagnostic_code, ""injected-backend"") | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25) | EXPECT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().diagnostic_code, ""injected-backend"") | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | EXPECT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.25)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.GeometryIterationAndNonfiniteFailuresPreserveBaseline SolidStaticProcedure.GeometryIterationAndNonfiniteFailuresPreserveBaseline; assertion 10개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.GeometryIterationAndNonfiniteFailuresPreserveBaseline 유지 원문 검사 body 및 assertion 동일. d01826c155aeded9026db515baedaf45ea10080a9ac6c9e5604e3e8f05b46770 d01826c155aeded9026db515baedaf45ea10080a9ac6c9e5604e3e8f05b46770 ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.0) | ASSERT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(state.CommittedState().displacement[i], 0.0) | ASSERT_FALSE(state.IterationRecords().empty()) | EXPECT_FALSE(state.IterationRecords().back().accepted) | EXPECT_FALSE(state.IterationRecords().back().diagnostic_code.empty()) | EXPECT_EQ(state.IterationRecords().back().iteration, 100U) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.0) | ASSERT_EQ(state.CommittedState().displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(state.CommittedState().displacement[i], 0.0) | ASSERT_FALSE(state.IterationRecords().empty()) | EXPECT_FALSE(state.IterationRecords().back().accepted) | EXPECT_FALSE(state.IterationRecords().back().diagnostic_code.empty()) | EXPECT_EQ(state.IterationRecords().back().iteration, 100U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UnconstrainedSolidFailsWithoutRegularization SolidStaticProcedure.UnconstrainedSolidFailsWithoutRegularization; assertion 2개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UnconstrainedSolidFailsWithoutRegularization 유지 원문 검사 body 및 assertion 동일. 26a02bf428c8b4d8684b66f3b75d4fc83e96c18d6497d81dba18879b19b2c81f 26a02bf428c8b4d8684b66f3b75d4fc83e96c18d6497d81dba18879b19b2c81f ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.EightElementAffinePatchHasSolvedInteriorAndStableRows SolidStaticProcedure.EightElementAffinePatchHasSolvedInteriorAndStableRows; assertion 18개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.EightElementAffinePatchHasSolvedInteriorAndStableRows 유지 원문 검사 body 및 assertion 동일. db9abadb927e8b0a0bb434ae43107b27275e65355b74fbba89d72cfad8c88d91 db9abadb927e8b0a0bb434ae43107b27275e65355b74fbba89d72cfad8c88d91 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.solid_results.size(), 64U) | EXPECT_NEAR(frame.displacement[3 * 13], 0.05, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 2], 0.0, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 8 * 0.0504, 1e-12) | EXPECT_EQ(frame.solid_results[g].element, g / 8) | EXPECT_EQ(frame.solid_results[g].integration_point, static_cast(g % 8 + 1)) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[0], 2.88, 1e-12) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[3], 1.44, 1e-12) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_DOUBLE_EQ(parallel_frame.physical_strain_energy, frame.physical_strain_energy) | EXPECT_DOUBLE_EQ(parallel_frame.displacement[i], frame.displacement[i]) | EXPECT_DOUBLE_EQ(parallel_frame.internal_force[i], frame.internal_force[i]) | EXPECT_DOUBLE_EQ(parallel_frame.residual[i], frame.residual[i]) | EXPECT_EQ(parallel_frame.solid_results[g].cauchy_stress, frame.solid_results[g].cauchy_stress) | EXPECT_EQ(parallel_frame.solid_results[g].strain, frame.solid_results[g].strain) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.solid_results.size(), 64U) | EXPECT_NEAR(frame.displacement[3 * 13], 0.05, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.displacement[3 * 13 + 2], 0.0, 1e-13) | EXPECT_NEAR(frame.physical_strain_energy, 8 * 0.0504, 1e-12) | EXPECT_EQ(frame.solid_results[g].element, g / 8) | EXPECT_EQ(frame.solid_results[g].integration_point, static_cast(g % 8 + 1)) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[0], 2.88, 1e-12) | EXPECT_NEAR(frame.solid_results[g].cauchy_stress[3], 1.44, 1e-12) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_DOUBLE_EQ(parallel_frame.physical_strain_energy, frame.physical_strain_energy) | EXPECT_DOUBLE_EQ(parallel_frame.displacement[i], frame.displacement[i]) | EXPECT_DOUBLE_EQ(parallel_frame.internal_force[i], frame.internal_force[i]) | EXPECT_DOUBLE_EQ(parallel_frame.residual[i], frame.residual[i]) | EXPECT_EQ(parallel_frame.solid_results[g].cauchy_stress, frame.solid_results[g].cauchy_stress) | EXPECT_EQ(parallel_frame.solid_results[g].strain, frame.solid_results[g].strain) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterInvertedPrescribedTrialPreservesThreeAcceptedFrames SolidStaticProcedure.LaterInvertedPrescribedTrialPreservesThreeAcceptedFrames; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterInvertedPrescribedTrialPreservesThreeAcceptedFrames 유지 원문 검사 body 및 assertion 동일. aa4fc98ea93ac0cf4107c008482a044d58aa6fe24db7d22ac1f070603a8cd04c aa4fc98ea93ac0cf4107c008482a044d58aa6fe24db7d22ac1f070603a8cd04c ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 3U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.75) | EXPECT_NEAR(state.CommittedState().displacement[3], -0.9, 1e-15) | ASSERT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().increment_index, 4U) | EXPECT_FALSE(state.IterationRecords().back().accepted) ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 3U) | EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, 0.75) | EXPECT_NEAR(state.CommittedState().displacement[3], -0.9, 1e-15) | ASSERT_EQ(state.CommittedState().solid_results.size(), 8U) | EXPECT_EQ(state.IterationRecords().back().increment_index, 4U) | EXPECT_FALSE(state.IterationRecords().back().accepted) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PartiallySupportedRigidMechanismAlsoFailsUnloaded SolidStaticProcedure.PartiallySupportedRigidMechanismAlsoFailsUnloaded; assertion 3개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PartiallySupportedRigidMechanismAlsoFailsUnloaded 유지 원문 검사 body 및 assertion 동일. 7f3830b55f5ac74af77b283eb5c3bc1c1e747a146c92b19de6d45f417141e9c5 7f3830b55f5ac74af77b283eb5c3bc1c1e747a146c92b19de6d45f417141e9c5 ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.SerialAndTbbFramesAndFailureEvidenceAreIdentical SolidStaticProcedure.SerialAndTbbFramesAndFailureEvidenceAreIdentical; assertion 18개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.SerialAndTbbFramesAndFailureEvidenceAreIdentical 유지 원문 검사 body 및 assertion 동일. 2204b6d824ccabcf85805a5c154e72abfcd625aa56a832f3814e99a3e0e70a47 2204b6d824ccabcf85805a5c154e72abfcd625aa56a832f3814e99a3e0e70a47 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(a.HasValue()) | ASSERT_TRUE(b.HasValue()) | ASSERT_EQ(a.Value().state.AcceptedFrames().size(), b.Value().state.AcceptedFrames().size()) | EXPECT_DOUBLE_EQ(af.physical_strain_energy, bf.physical_strain_energy) | EXPECT_EQ(af.global_equilibrium, bf.global_equilibrium) | EXPECT_DOUBLE_EQ(af.displacement[i], bf.displacement[i]) | EXPECT_DOUBLE_EQ(af.residual[i], bf.residual[i]) | EXPECT_DOUBLE_EQ(af.reaction[i], bf.reaction[i]) | EXPECT_EQ(af.solid_results[g].cauchy_stress, bf.solid_results[g].cauchy_stress) | EXPECT_EQ(af.solid_results[g].strain, bf.solid_results[g].strain) | ASSERT_TRUE(invalid.HasValue()) | ASSERT_FALSE(as.IsOk()) | ASSERT_FALSE(bs.IsOk()) | EXPECT_EQ(as.Diagnostics()[0].code, bs.Diagnostics()[0].code) | EXPECT_EQ(sa.AcceptedFrames().size(), sb.AcceptedFrames().size()) | EXPECT_EQ(sa.IterationRecords().back().stage, sb.IterationRecords().back().stage) | EXPECT_DOUBLE_EQ(sa.CommittedState().physical_strain_energy, sb.CommittedState().physical_strain_energy) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(a.HasValue()) | ASSERT_TRUE(b.HasValue()) | ASSERT_EQ(a.Value().state.AcceptedFrames().size(), b.Value().state.AcceptedFrames().size()) | EXPECT_DOUBLE_EQ(af.physical_strain_energy, bf.physical_strain_energy) | EXPECT_EQ(af.global_equilibrium, bf.global_equilibrium) | EXPECT_DOUBLE_EQ(af.displacement[i], bf.displacement[i]) | EXPECT_DOUBLE_EQ(af.residual[i], bf.residual[i]) | EXPECT_DOUBLE_EQ(af.reaction[i], bf.reaction[i]) | EXPECT_EQ(af.solid_results[g].cauchy_stress, bf.solid_results[g].cauchy_stress) | EXPECT_EQ(af.solid_results[g].strain, bf.solid_results[g].strain) | ASSERT_TRUE(invalid.HasValue()) | ASSERT_FALSE(as.IsOk()) | ASSERT_FALSE(bs.IsOk()) | EXPECT_EQ(as.Diagnostics()[0].code, bs.Diagnostics()[0].code) | EXPECT_EQ(sa.AcceptedFrames().size(), sb.AcceptedFrames().size()) | EXPECT_EQ(sa.IterationRecords().back().stage, sb.IterationRecords().back().stage) | EXPECT_DOUBLE_EQ(sa.CommittedState().physical_strain_energy, sb.CommittedState().physical_strain_energy) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.InvalidRecoveryAndRepeatedExecutionKeepAcceptedFrame SolidStaticProcedure.InvalidRecoveryAndRepeatedExecutionKeepAcceptedFrame; assertion 9개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.InvalidRecoveryAndRepeatedExecutionKeepAcceptedFrame 유지 원문 검사 body 및 assertion 동일. c7dfc371a7b67a1c78981dc4d1deb65f7122dcff6108ae6c7ec65caf7448d811 c7dfc371a7b67a1c78981dc4d1deb65f7122dcff6108ae6c7ec65caf7448d811 ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().physical_strain_energy, valid.physical_strain_energy) | EXPECT_EQ(state.CommittedState().solid_results[0].cauchy_stress, valid.solid_results[0].cauchy_stress) | EXPECT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.CommitAcceptedFrame(bad).IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_DOUBLE_EQ(state.CommittedState().physical_strain_energy, valid.physical_strain_energy) | EXPECT_EQ(state.CommittedState().solid_results[0].cauchy_stress, valid.solid_results[0].cauchy_stress) | EXPECT_FALSE(fesa::SolidStaticProcedureExecutor(serial, linear, tangent) .ExecuteInto(domain.Value(), state) .IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StressedIndefiniteFreeTangentUsesCapableBackend SolidStaticProcedure.StressedIndefiniteFreeTangentUsesCapableBackend; assertion 6개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.StressedIndefiniteFreeTangentUsesCapableBackend 유지 원문 검사 body 및 assertion 동일. b812d55397294e1477756f267282142cdab4613da0d6ba78c49161e44a4bb757 b812d55397294e1477756f267282142cdab4613da0d6ba78c49161e44a4bb757 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(tangent.rayleigh_sum, -21.12, 1e-12) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_NEAR(frame.displacement[3 * a + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.solid_results[0].strain[0], -.48, 1e-13) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(tangent.rayleigh_sum, -21.12, 1e-12) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 1U) | EXPECT_NEAR(frame.displacement[3 * a + 1], 0.0, 1e-13) | EXPECT_NEAR(frame.solid_results[0].strain[0], -.48, 1e-13) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FullyConstrainedZeroDisplacementRetainsSupportLoadResidual SolidStaticProcedure.FullyConstrainedZeroDisplacementRetainsSupportLoadResidual; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.FullyConstrainedZeroDisplacementRetainsSupportLoadResidual 유지 원문 검사 body 및 assertion 동일. 956d6dd86eb3526eb262dd5e38e7b4245a5a0dda8fba51effed01c553a14f29f 956d6dd86eb3526eb262dd5e38e7b4245a5a0dda8fba51effed01c553a14f29f ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.internal_force[0], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[0], -7.0) | EXPECT_DOUBLE_EQ(frame.reaction[0], -7.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.internal_force[0], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[0], -7.0) | EXPECT_DOUBLE_EQ(frame.reaction[0], -7.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UniformPrescribedTranslationHasExactlyZeroRecovery SolidStaticProcedure.UniformPrescribedTranslationHasExactlyZeroRecovery; assertion 11개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.UniformPrescribedTranslationHasExactlyZeroRecovery 유지 원문 검사 body 및 assertion 동일. 283e16609b747830674f685910884882be83a270558850725c06370227b2ff47 283e16609b747830674f685910884882be83a270558850725c06370227b2ff47 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(frame.displacement[i], translation[i % 3U]) | EXPECT_DOUBLE_EQ(frame.internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0.0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(strain, 0.0) | EXPECT_DOUBLE_EQ(stress, 0.0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(frame.displacement.Size(), 24U) | EXPECT_DOUBLE_EQ(frame.displacement[i], translation[i % 3U]) | EXPECT_DOUBLE_EQ(frame.internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(frame.residual[i], 0.0) | EXPECT_DOUBLE_EQ(frame.reaction[i], 0.0) | EXPECT_DOUBLE_EQ(frame.physical_strain_energy, 0.0) | ASSERT_EQ(frame.solid_results.size(), 8U) | EXPECT_DOUBLE_EQ(strain, 0.0) | EXPECT_DOUBLE_EQ(stress, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.MixedStrainAndTranslationPreserveAnalyticRecovery SolidStaticProcedure.MixedStrainAndTranslationPreserveAnalyticRecovery; assertion 16개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.MixedStrainAndTranslationPreserveAnalyticRecovery 유지 원문 검사 body 및 assertion 동일. d39c4b7c1d12b2e0b05fc9b5df66b9d0a184eee9e1f297b5fb4ea583f8655f8d d39c4b7c1d12b2e0b05fc9b5df66b9d0a184eee9e1f297b5fb4ea583f8655f8d ASSERT_TRUE(original_domain.HasValue()) | ASSERT_TRUE(translated_domain.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_NEAR(frame->physical_strain_energy, 0.1640625, 1e-13) | EXPECT_NEAR(point.strain[0], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.strain[3], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.cauchy_stress[c], stress[c], 1e-13) | EXPECT_NEAR(frame->internal_force[3 * node + c], exact_force[c], 1e-13) | EXPECT_NEAR(frame->reaction[3 * node + c], exact_force[c], 1e-13) | EXPECT_DOUBLE_EQ(a.physical_strain_energy, b.physical_strain_energy) | EXPECT_DOUBLE_EQ(a.internal_force[i], b.internal_force[i]) | EXPECT_DOUBLE_EQ(a.reaction[i], b.reaction[i]) | EXPECT_DOUBLE_EQ(a.residual[i], b.residual[i]) | EXPECT_EQ(a.solid_results[g].strain, b.solid_results[g].strain) | EXPECT_EQ(a.solid_results[g].cauchy_stress, b.solid_results[g].cauchy_stress) ASSERT_TRUE(original_domain.HasValue()) | ASSERT_TRUE(translated_domain.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_NEAR(frame->physical_strain_energy, 0.1640625, 1e-13) | EXPECT_NEAR(point.strain[0], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.strain[3], 1.0 / 32, 1e-15) | EXPECT_NEAR(point.cauchy_stress[c], stress[c], 1e-13) | EXPECT_NEAR(frame->internal_force[3 * node + c], exact_force[c], 1e-13) | EXPECT_NEAR(frame->reaction[3 * node + c], exact_force[c], 1e-13) | EXPECT_DOUBLE_EQ(a.physical_strain_energy, b.physical_strain_energy) | EXPECT_DOUBLE_EQ(a.internal_force[i], b.internal_force[i]) | EXPECT_DOUBLE_EQ(a.reaction[i], b.reaction[i]) | EXPECT_DOUBLE_EQ(a.residual[i], b.residual[i]) | EXPECT_EQ(a.solid_results[g].strain, b.solid_results[g].strain) | EXPECT_EQ(a.solid_results[g].cauchy_stress, b.solid_results[g].cauchy_stress) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PureLargeRigidRotationEndsAtZeroStrainEnergy SolidStaticProcedure.PureLargeRigidRotationEndsAtZeroStrainEnergy; assertion 5개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.PureLargeRigidRotationEndsAtZeroStrainEnergy 유지 원문 검사 body 및 assertion 동일. 4fe6729cebd103240b949a646d1071d16c80aa9b748edec55cac4187a571090d 4fe6729cebd103240b949a646d1071d16c80aa9b748edec55cac4187a571090d ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(frame.physical_strain_energy, 0.0, 1e-25) | EXPECT_NEAR(value, 0.0, 1e-14) | EXPECT_NEAR(value, 0.0, 1e-12) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(frame.physical_strain_energy, 0.0, 1e-25) | EXPECT_NEAR(value, 0.0, 1e-14) | EXPECT_NEAR(value, 0.0, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.OrdinaryStaticKeepsExistingFinalShortFactorPath SolidStaticProcedure.OrdinaryStaticKeepsExistingFinalShortFactorPath; assertion 6개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.OrdinaryStaticKeepsExistingFinalShortFactorPath 유지 원문 검사 body 및 assertion 동일. f89b10887a1fc24fed122505ce929cd71894836076dc926635924d209419eb98 f89b10887a1fc24fed122505ce929cd71894836076dc926635924d209419eb98 ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_NEAR(result.Value().state.AcceptedFrames()[i].load_factor, factors[i], 1e-15) | EXPECT_DOUBLE_EQ(result.Value().state.CommittedState().load_factor, 1.0) ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().state.AcceptedFrames().size(), 4U) | EXPECT_NEAR(result.Value().state.AcceptedFrames()[i].load_factor, factors[i], 1e-15) | EXPECT_DOUBLE_EQ(result.Value().state.CommittedState().load_factor, 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.BoundedSpatialRefinementReportsFullIntegrationLocking SolidStaticProcedure.BoundedSpatialRefinementReportsFullIntegrationLocking; assertion 6개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.BoundedSpatialRefinementReportsFullIntegrationLocking 유지 원문 검사 body 및 assertion 동일. 0be527378cf6b99c5d21b37fae3756fcf90b3baf550974c57e04fc9f1f828875 0be527378cf6b99c5d21b37fae3756fcf90b3baf550974c57e04fc9f1f828875 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT(tip, previous[material]) | EXPECT_LT(tip, 1.05 * beam_limit) | EXPECT_LT(final[1], final[0]) | EXPECT_GT(std::abs(final[1] - beam_limit), std::abs(final[0] - beam_limit)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_GT(tip, previous[material]) | EXPECT_LT(tip, 1.05 * beam_limit) | EXPECT_LT(final[1], final[0]) | EXPECT_GT(std::abs(final[1] - beam_limit), std::abs(final[0] - beam_limit)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterIterationNonfiniteAndGeometryFailureKeepEveryAcceptedQuantity SolidStaticProcedure.LaterIterationNonfiniteAndGeometryFailureKeepEveryAcceptedQuantity; assertion 16개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.LaterIterationNonfiniteAndGeometryFailureKeepEveryAcceptedQuantity 유지 원문 검사 body 및 assertion 동일. d625f760d2aab29539cf34d792d6540f1c67c9e627fe2e17ec186ddc74df2f36 d625f760d2aab29539cf34d792d6540f1c67c9e627fe2e17ec186ddc74df2f36 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(successful.HasValue()) | ASSERT_EQ(expected.iteration_count, 2U) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(actual.global_equilibrium, expected.global_equilibrium) | EXPECT_DOUBLE_EQ(actual.physical_strain_energy, expected.physical_strain_energy) | EXPECT_DOUBLE_EQ(actual.displacement[i], expected.displacement[i]) | EXPECT_DOUBLE_EQ(actual.internal_force[i], expected.internal_force[i]) | EXPECT_DOUBLE_EQ(actual.external_force[i], expected.external_force[i]) | EXPECT_DOUBLE_EQ(actual.residual[i], expected.residual[i]) | EXPECT_DOUBLE_EQ(actual.reaction[i], expected.reaction[i]) | EXPECT_EQ(actual.solid_results[g].strain, expected.solid_results[g].strain) | EXPECT_EQ(actual.solid_results[g].cauchy_stress, expected.solid_results[g].cauchy_stress) | EXPECT_EQ(state.IterationRecords().back().increment_index, 2U) | EXPECT_FALSE(state.IterationRecords().back().accepted) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(successful.HasValue()) | ASSERT_EQ(expected.iteration_count, 2U) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(state.AcceptedFrames().size(), 1U) | EXPECT_EQ(actual.global_equilibrium, expected.global_equilibrium) | EXPECT_DOUBLE_EQ(actual.physical_strain_energy, expected.physical_strain_energy) | EXPECT_DOUBLE_EQ(actual.displacement[i], expected.displacement[i]) | EXPECT_DOUBLE_EQ(actual.internal_force[i], expected.internal_force[i]) | EXPECT_DOUBLE_EQ(actual.external_force[i], expected.external_force[i]) | EXPECT_DOUBLE_EQ(actual.residual[i], expected.residual[i]) | EXPECT_DOUBLE_EQ(actual.reaction[i], expected.reaction[i]) | EXPECT_EQ(actual.solid_results[g].strain, expected.solid_results[g].strain) | EXPECT_EQ(actual.solid_results[g].cauchy_stress, expected.solid_results[g].cauchy_stress) | EXPECT_EQ(state.IterationRecords().back().increment_index, 2U) | EXPECT_FALSE(state.IterationRecords().back().accepted) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.ExecutesBothUnmodifiedStaticSourceDecksThroughDirectApi SolidStaticProcedure.ExecutesBothUnmodifiedStaticSourceDecksThroughDirectApi; assertion 8개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.ExecutesBothUnmodifiedStaticSourceDecksThroughDirectApi 유지 원문 검사 body 및 assertion 동일. d3a90f93d9d9490f75afc00c665defc23cf55c13bfbca813fa2fed3140416ce3 d3a90f93d9d9490f75afc00c665defc23cf55c13bfbca813fa2fed3140416ce3 ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | EXPECT_EQ(frame.increment_index, 10U) | EXPECT_EQ(frame.displacement.Size(), 442U * 3U) | EXPECT_EQ(frame.solid_results.size(), 300U * 8U) | EXPECT_EQ(state.AcceptedFrames().size(), domain.Value().Steps()[0].IsNonlinearStatic() ? 10U : 1U) ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(frame.load_factor, 1.0) | EXPECT_EQ(frame.increment_index, 10U) | EXPECT_EQ(frame.displacement.Size(), 442U * 3U) | EXPECT_EQ(frame.solid_results.size(), 300U * 8U) | EXPECT_EQ(state.AcceptedFrames().size(), domain.Value().Steps()[0].IsNonlinearStatic() ? 10U : 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.InjectedAlgorithmFailurePreservesInitializedBaseline SolidStaticProcedure.InjectedAlgorithmFailurePreservesInitializedBaseline; assertion 41개 tests/unit/analysis/solid_static_procedure_test.cpp SolidStaticProcedure.InjectedAlgorithmFailurePreservesInitializedBaseline 유지 원문 검사 body 및 assertion 동일. 7b239ad36e7c1c8bd5af6ed8a694901e4d9a48d518d9d416a70db384ffcb476c 7b239ad36e7c1c8bd5af6ed8a694901e4d9a48d518d9d416a70db384ffcb476c "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""injected-static-algorithm"") | EXPECT_EQ(diagnostic.keyword, ""STATIC"") | EXPECT_EQ(diagnostic.entity_identity, ""original-owner"") | EXPECT_EQ(diagnostic.message, ""Original algorithm failure."") | EXPECT_EQ(selected->calls, 1) | EXPECT_EQ(solvers.calls, 0) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_TRUE(state.IterationRecords().empty()) | EXPECT_EQ(actual.frame_index, expected.frame_index) | EXPECT_EQ(actual.increment_index, expected.increment_index) | EXPECT_DOUBLE_EQ(actual.load_factor, expected.load_factor) | EXPECT_EQ(actual.iteration_count, expected.iteration_count) | EXPECT_EQ(actual.is_factor_one, expected.is_factor_one) | EXPECT_EQ(actual.nodal_internal_order, expected.nodal_internal_order) | ASSERT_EQ(actual.nodal_source_ids.size(), expected.nodal_source_ids.size()) | EXPECT_TRUE(fesa::SourceIdentityEquals(actual.nodal_source_ids[i], expected.nodal_source_ids[i])) | ASSERT_EQ(a.Size(), b.Size()) | EXPECT_DOUBLE_EQ(a[i], b[i]) | EXPECT_DOUBLE_EQ(actual.physical_strain_energy, expected.physical_strain_energy) | EXPECT_EQ(actual.global_equilibrium, expected.global_equilibrium) | EXPECT_EQ(actual.balance.internal_force_sum, expected.balance.internal_force_sum) | EXPECT_EQ(actual.balance.reference_internal_moment, expected.balance.reference_internal_moment) | EXPECT_EQ(actual.balance.current_internal_moment, expected.balance.current_internal_moment) | EXPECT_EQ(actual.balance.free_residual_moment, expected.balance.free_residual_moment) | EXPECT_EQ(actual.balance.linearization_moment, expected.balance.linearization_moment) | EXPECT_EQ(actual.balance.internal_force_scale, expected.balance.internal_force_scale) | EXPECT_EQ(actual.balance.reference_moment_scale, expected.balance.reference_moment_scale) | EXPECT_EQ(actual.balance.current_moment_scale, expected.balance.current_moment_scale) | ASSERT_EQ(actual.solid_results.size(), expected.solid_results.size()) | EXPECT_EQ(a.element, b.element) | EXPECT_EQ(a.integration_point, b.integration_point) | EXPECT_EQ(a.natural_coordinates, b.natural_coordinates) | EXPECT_EQ(a.reference_coordinates, b.reference_coordinates) | EXPECT_EQ(a.cauchy_stress, b.cauchy_stress) | EXPECT_EQ(a.strain, b.strain) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""injected-static-algorithm"") | EXPECT_EQ(diagnostic.keyword, ""STATIC"") | EXPECT_EQ(diagnostic.entity_identity, ""original-owner"") | EXPECT_EQ(diagnostic.message, ""Original algorithm failure."") | EXPECT_EQ(selected->calls, 1) | EXPECT_EQ(solvers.calls, 0) | EXPECT_TRUE(state.AcceptedFrames().empty()) | EXPECT_TRUE(state.IterationRecords().empty()) | EXPECT_EQ(actual.frame_index, expected.frame_index) | EXPECT_EQ(actual.increment_index, expected.increment_index) | EXPECT_DOUBLE_EQ(actual.load_factor, expected.load_factor) | EXPECT_EQ(actual.iteration_count, expected.iteration_count) | EXPECT_EQ(actual.is_factor_one, expected.is_factor_one) | EXPECT_EQ(actual.nodal_internal_order, expected.nodal_internal_order) | ASSERT_EQ(actual.nodal_source_ids.size(), expected.nodal_source_ids.size()) | EXPECT_TRUE(fesa::SourceIdentityEquals(actual.nodal_source_ids[i], expected.nodal_source_ids[i])) | ASSERT_EQ(a.Size(), b.Size()) | EXPECT_DOUBLE_EQ(a[i], b[i]) | EXPECT_DOUBLE_EQ(actual.physical_strain_energy, expected.physical_strain_energy) | EXPECT_EQ(actual.global_equilibrium, expected.global_equilibrium) | EXPECT_EQ(actual.balance.internal_force_sum, expected.balance.internal_force_sum) | EXPECT_EQ(actual.balance.reference_internal_moment, expected.balance.reference_internal_moment) | EXPECT_EQ(actual.balance.current_internal_moment, expected.balance.current_internal_moment) | EXPECT_EQ(actual.balance.free_residual_moment, expected.balance.free_residual_moment) | EXPECT_EQ(actual.balance.linearization_moment, expected.balance.linearization_moment) | EXPECT_EQ(actual.balance.internal_force_scale, expected.balance.internal_force_scale) | EXPECT_EQ(actual.balance.reference_moment_scale, expected.balance.reference_moment_scale) | EXPECT_EQ(actual.balance.current_moment_scale, expected.balance.current_moment_scale) | ASSERT_EQ(actual.solid_results.size(), expected.solid_results.size()) | EXPECT_EQ(a.element, b.element) | EXPECT_EQ(a.integration_point, b.integration_point) | EXPECT_EQ(a.natural_coordinates, b.natural_coordinates) | EXPECT_EQ(a.reference_coordinates, b.reference_coordinates) | EXPECT_EQ(a.cauchy_stress, b.cauchy_stress) | EXPECT_EQ(a.strain, b.strain) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_procedure_test.cpp support@1-155 helper/oracle/fixture/include/static assertion 구간: Deck, Map, Message, ExecuteSolid, Supports, Tension, AffineBoundary, FailedTangent, Mode, ObservedIndefiniteTangent tests/unit/analysis/solid_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d96f4777bff4fddc469f8b9f9db91e1109d474ad8ff6ef8d854d233c3fe56dd9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_static_procedure_test.cpp support@691-732 helper/oracle/fixture/include/static assertion 구간: Cantilever tests/unit/analysis/solid_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 18b6fff6c45d794f77ce9044335c69313a256236f3b9cee759f0d5d8a33ca76e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_static_procedure_test.cpp support@831-876 helper/oracle/fixture/include/static assertion 구간: StaticPolicyFailure, UnusedStaticSolvers, RefusingStaticAlgorithm tests/unit/analysis/solid_static_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b89a7e571f03accadb84ca3e127ac1529381da75155aec1cb29db9a8db61ac8f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_static_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/analysis/solid_static_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1693abc34bf1b4346ff3a17979cb8a763cb16950fee6b5a5471e402d4faf621d 1693abc34bf1b4346ff3a17979cb8a763cb16950fee6b5a5471e402d4faf621d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.PurePrescribedUsesAbsoluteForceAndOnlyTwoChannels SolidStaticControls.PurePrescribedUsesAbsoluteForceAndOnlyTwoChannels; assertion 8개 tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.PurePrescribedUsesAbsoluteForceAndOnlyTwoChannels 유지 원문 검사 body 및 assertion 동일. 64090bf859cad1c1f823058b375f44107bd69be3ea8a455abc6f1eb059ba2578 64090bf859cad1c1f823058b375f44107bd69be3ea8a455abc6f1eb059ba2578 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 0.0) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kForce) | EXPECT_EQ(result.Value().translation_correction.threshold_unit, fesa::NewtonChannelUnit::kLength) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence( residual, internal, external, correction, increment) .Value() .force_residual.passed) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kZeroScale) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 0.0) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kForce) | EXPECT_EQ(result.Value().translation_correction.threshold_unit, fesa::NewtonChannelUnit::kLength) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence( residual, internal, external, correction, increment) .Value() .force_residual.passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.RelativeLimitsRawNormsAndNonfiniteFailure SolidStaticControls.RelativeLimitsRawNormsAndNonfiniteFailure; assertion 10개 tests/unit/analysis/solid_static_state_test.cpp SolidStaticControls.RelativeLimitsRawNormsAndNonfiniteFailure 유지 원문 검사 body 및 assertion 동일. 9ced91c636ffa144e3fe1bd9748589a2a38f7afe41bd79eb1a71a7d0336144a8 9ced91c636ffa144e3fe1bd9748589a2a38f7afe41bd79eb1a71a7d0336144a8 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().force_residual.numerator_norm, 1.0) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 100.0) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u) .Value() .force_residual.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u).HasValue()) | EXPECT_FALSE( fesa::EvaluateSolidStaticConvergence(r, f, fesa::Vector{2U}, du, u) .HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().force_residual.numerator_norm, 1.0) | EXPECT_DOUBLE_EQ(result.Value().force_residual.denominator_scale, 100.0) | EXPECT_EQ(result.Value().force_residual.branch, fesa::NewtonConvergenceBranch::kRelative) | EXPECT_EQ(result.Value().force_residual.threshold_unit, fesa::NewtonChannelUnit::kDimensionless) | EXPECT_TRUE(result.Value().force_residual.passed) | EXPECT_TRUE(result.Value().translation_correction.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u) .Value() .force_residual.passed) | EXPECT_FALSE(fesa::EvaluateSolidStaticConvergence(r, f, p, du, u).HasValue()) | EXPECT_FALSE( fesa::EvaluateSolidStaticConvergence(r, f, fesa::Vector{2U}, du, u) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/analysis/solid_static_state_test.cpp support@1-6 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/solid_static_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e53402f8f5992b27b6c5a2443adf6251c74adbe566e295fba59e1621404883ca 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/thermal_analysis_state_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/analysis/thermal_analysis_state_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 505bda8adef4e2255a4ce1d76d08c96b5806da8652e397048a0b49e5fb364557 505bda8adef4e2255a4ce1d76d08c96b5806da8652e397048a0b49e5fb364557 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.OwnsRawInitialInventoryAfterDomainAndAssemblyDestruction ThermalAnalysisState.OwnsRawInitialInventoryAfterDomainAndAssemblyDestruction; assertion 24개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.OwnsRawInitialInventoryAfterDomainAndAssemblyDestruction 유지 원문 검사 body 및 assertion 동일. 29995b83f8751fc439725b0f3a266b7237c909a921280e02a60ef86b340ba760 29995b83f8751fc439725b0f3a266b7237c909a921280e02a60ef86b340ba760 "ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().NodeOrder(), (std::vector{1, 2, 3, 4})) | EXPECT_EQ(state.Value().NodeSourceIds()[0].source_label_text, ""0007"") | EXPECT_EQ(state.Value().ElementSourceIds()[0].source_label_text, ""0013"") | EXPECT_EQ(state.Value().ElementOrder(), (std::vector{0})) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_TRUE(initial.is_initial) | EXPECT_FALSE(initial.completed.has_value()) | EXPECT_EQ(initial.time, 0) | EXPECT_EQ(initial.time_increment, 0) | EXPECT_EQ(initial.temperature[a], -20.) | EXPECT_EQ(initial.temperature[5 + a], 0.) | EXPECT_EQ(initial.temperature[10 + a], 0.) | EXPECT_EQ(initial.temperature[15 + a], 7.125) | ASSERT_EQ(state.Value().ReactionDofs().size(), 2U) | EXPECT_EQ(state.Value().ReactionDofs()[0].node, 1U) | EXPECT_EQ(state.Value().ReactionDofs()[0].source_dof, 11) | EXPECT_EQ(state.Value().ReactionDofs()[1].node, 4U) | EXPECT_EQ(state.Value().ReactionDofs()[1].source_dof, 15) | EXPECT_EQ(state.Value().ConstraintMask()[row][a], ((row == 0 && a == 0) || (row == 3 && a == 4)) ? 1 : 0) | ASSERT_EQ(state.Value().FluxLocalFrames().size(), 1U) | EXPECT_EQ(frame[0], (fesa::Vector3{1, 0, 0})) | EXPECT_EQ(frame[1], (fesa::Vector3{0, 1, 0})) | EXPECT_EQ(frame[2], (fesa::Vector3{0, 0, 1}))" "ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().NodeOrder(), (std::vector{1, 2, 3, 4})) | EXPECT_EQ(state.Value().NodeSourceIds()[0].source_label_text, ""0007"") | EXPECT_EQ(state.Value().ElementSourceIds()[0].source_label_text, ""0013"") | EXPECT_EQ(state.Value().ElementOrder(), (std::vector{0})) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_TRUE(initial.is_initial) | EXPECT_FALSE(initial.completed.has_value()) | EXPECT_EQ(initial.time, 0) | EXPECT_EQ(initial.time_increment, 0) | EXPECT_EQ(initial.temperature[a], -20.) | EXPECT_EQ(initial.temperature[5 + a], 0.) | EXPECT_EQ(initial.temperature[10 + a], 0.) | EXPECT_EQ(initial.temperature[15 + a], 7.125) | ASSERT_EQ(state.Value().ReactionDofs().size(), 2U) | EXPECT_EQ(state.Value().ReactionDofs()[0].node, 1U) | EXPECT_EQ(state.Value().ReactionDofs()[0].source_dof, 11) | EXPECT_EQ(state.Value().ReactionDofs()[1].node, 4U) | EXPECT_EQ(state.Value().ReactionDofs()[1].source_dof, 15) | EXPECT_EQ(state.Value().ConstraintMask()[row][a], ((row == 0 && a == 0) || (row == 3 && a == 4)) ? 1 : 0) | ASSERT_EQ(state.Value().FluxLocalFrames().size(), 1U) | EXPECT_EQ(frame[0], (fesa::Vector3{1, 0, 0})) | EXPECT_EQ(frame[1], (fesa::Vector3{0, 1, 0})) | EXPECT_EQ(frame[2], (fesa::Vector3{0, 0, 1}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CompletedZeroReactionPayloadAndExactActualDelta ThermalAnalysisState.CompletedZeroReactionPayloadAndExactActualDelta; assertion 20개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CompletedZeroReactionPayloadAndExactActualDelta 유지 원문 검사 body 및 assertion 동일. faed8c798f105f506facfa91da0c77b9b7b74944851a63a32542901d8887197f faed8c798f105f506facfa91da0c77b9b7b74944851a63a32542901d8887197f ASSERT_TRUE(state.HasValue()) | EXPECT_TRUE(state.Value().ReactionDofs().empty()) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(frame.HasValue()) | ASSERT_TRUE(frame.Value().completed.has_value()) | EXPECT_EQ(frame.Value().completed->reaction_heat_rate.Size(), 0U) | EXPECT_EQ(frame.Value().time_increment, .3) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(frame.Value()).IsOk()) | EXPECT_TRUE(state.Value().IsComplete()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 4U) | EXPECT_EQ(state.Value().CommittedState().time, .9) | EXPECT_EQ(state.Value().CommittedState().time_increment, .3) | EXPECT_NE(state.Value().CommittedState().time - state.Value().AcceptedFrames()[2].time, .3) | EXPECT_EQ(state.Value().NominalTimeIncrement(), .3) | EXPECT_EQ(state.Value().TimePeriod(), .9) | EXPECT_FALSE( state.Value().CommitAcceptedFrame(state.Value().CommittedState()).IsOk()) | ASSERT_TRUE(short_state.HasValue()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().time, 10.) | EXPECT_EQ(last.Value().time_increment, 1.) ASSERT_TRUE(state.HasValue()) | EXPECT_TRUE(state.Value().ReactionDofs().empty()) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(frame.HasValue()) | ASSERT_TRUE(frame.Value().completed.has_value()) | EXPECT_EQ(frame.Value().completed->reaction_heat_rate.Size(), 0U) | EXPECT_EQ(frame.Value().time_increment, .3) | ASSERT_TRUE(state.Value().CommitAcceptedFrame(frame.Value()).IsOk()) | EXPECT_TRUE(state.Value().IsComplete()) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 4U) | EXPECT_EQ(state.Value().CommittedState().time, .9) | EXPECT_EQ(state.Value().CommittedState().time_increment, .3) | EXPECT_NE(state.Value().CommittedState().time - state.Value().AcceptedFrames()[2].time, .3) | EXPECT_EQ(state.Value().NominalTimeIncrement(), .3) | EXPECT_EQ(state.Value().TimePeriod(), .9) | EXPECT_FALSE( state.Value().CommitAcceptedFrame(state.Value().CommittedState()).IsOk()) | ASSERT_TRUE(short_state.HasValue()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().time, 10.) | EXPECT_EQ(last.Value().time_increment, 1.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.EveryRejectedCandidatePreservesEntireAcceptedHistory ThermalAnalysisState.EveryRejectedCandidatePreservesEntireAcceptedHistory; assertion 9개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.EveryRejectedCandidatePreservesEntireAcceptedHistory 유지 원문 검사 body 및 assertion 동일. aaa377193cb0575e53405ed69aeeb7cc32e7c97bc56c05922bce6edcc2b1e74c aaa377193cb0575e53405ed69aeeb7cc32e7c97bc56c05922bce6edcc2b1e74c ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(first.Value()).IsOk()) | ASSERT_TRUE(candidate.HasValue()) | EXPECT_FALSE(state.CommitAcceptedFrame(candidate.Value()).IsOk()) | EXPECT_EQ(Snapshot(state), snapshot) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(second.Value()).IsOk()) | EXPECT_NE(state.CommittedState().temperature[0], 900) ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(first.Value()).IsOk()) | ASSERT_TRUE(candidate.HasValue()) | EXPECT_FALSE(state.CommitAcceptedFrame(candidate.Value()).IsOk()) | EXPECT_EQ(Snapshot(state), snapshot) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(state.CommitAcceptedFrame(second.Value()).IsOk()) | EXPECT_NE(state.CommittedState().temperature[0], 900) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CheckedCandidateRejectsMissingDataAndHugeGridDoesNotPreallocateHistory ThermalAnalysisState.CheckedCandidateRejectsMissingDataAndHugeGridDoesNotPreallocateHistory; assertion 11개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.CheckedCandidateRejectsMissingDataAndHugeGridDoesNotPreallocateHistory 유지 원문 검사 body 및 assertion 동일. 5d135e0312f358eb833a0a1dfd014621f15196041711663bd84ceb65e3027aec 5d135e0312f358eb833a0a1dfd014621f15196041711663bd84ceb65e3027aec ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().TimeGrid().Count(), 4294967295U) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().frame_index, 4294967295ULL) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(last.Value()).IsOk()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(0, fesa::Vector{20}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{19}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{1}, {{}}) .HasValue()) | EXPECT_FALSE(state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{0}, {}) .HasValue()) ASSERT_TRUE(state.HasValue()) | EXPECT_EQ(state.Value().TimeGrid().Count(), 4294967295U) | EXPECT_EQ(state.Value().AcceptedFrames().size(), 1U) | EXPECT_FALSE(state.Value().IsComplete()) | ASSERT_TRUE(last.HasValue()) | EXPECT_EQ(last.Value().frame_index, 4294967295ULL) | EXPECT_FALSE(state.Value().CommitAcceptedFrame(last.Value()).IsOk()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(0, fesa::Vector{20}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{19}, fesa::Vector{0}, {{}}) .HasValue()) | EXPECT_FALSE( state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{1}, {{}}) .HasValue()) | EXPECT_FALSE(state.Value() .MakeCompletedFrame(1, fesa::Vector{20}, fesa::Vector{0}, {}) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.RejectsAssemblyFromAnotherDomainAndInvalidSchedule ThermalAnalysisState.RejectsAssemblyFromAnotherDomainAndInvalidSchedule; assertion 9개 tests/unit/analysis/thermal_analysis_state_test.cpp ThermalAnalysisState.RejectsAssemblyFromAnotherDomainAndInvalidSchedule 유지 원문 검사 body 및 assertion 동일. 6cf18a4e7b7be31455ff4b43a91438c2dd613d6d822d85a7ba34e30d330c4bfd 6cf18a4e7b7be31455ff4b43a91438c2dd613d6d822d85a7ba34e30d330c4bfd ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(fm.HasValue()) | ASSERT_TRUE(sm.HasValue()) | ASSERT_TRUE(fd.HasValue()) | ASSERT_TRUE(sd.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | EXPECT_FALSE(fesa::ThermalAnalysisState::Create(sm.Value(), sd.Value(), assembly.Value()) .HasValue()) | EXPECT_FALSE(State(false, 10, 3, 3).HasValue()) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_TRUE(fm.HasValue()) | ASSERT_TRUE(sm.HasValue()) | ASSERT_TRUE(fd.HasValue()) | ASSERT_TRUE(sd.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | EXPECT_FALSE(fesa::ThermalAnalysisState::Create(sm.Value(), sd.Value(), assembly.Value()) .HasValue()) | EXPECT_FALSE(State(false, 10, 3, 3).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_analysis_state_test.cpp support@1-117 helper/oracle/fixture/include/static assertion 구간: Definition, if, State, Candidate, Snapshot, for tests/unit/analysis/thermal_analysis_state_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7d5e5a315ff7f87c595a8854c5f8c267b900112d685f26afaea2a8b5510843e9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/thermal_time_grid_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/analysis/thermal_time_grid_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a2f5f4ff554e4c7d127640394d45cd41bba3df2adde92d39071f720af402ff3e a2f5f4ff554e4c7d127640394d45cd41bba3df2adde92d39071f720af402ff3e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.SingleStepUsesPeriodAsActualIncrement ThermalTimeGrid.SingleStepUsesPeriodAsActualIncrement; assertion 3개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.SingleStepUsesPeriodAsActualIncrement 유지 원문 검사 body 및 assertion 동일. df81cdf149e0a1f046502f072502b69775e5fded5a9aa972da75fc19d78c9157 df81cdf149e0a1f046502f072502b69775e5fded5a9aa972da75fc19d78c9157 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 1U) | EXPECT_EQ(grid.Value().Delta(1U), 2.0) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 1U) | EXPECT_EQ(grid.Value().Delta(1U), 2.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.PreservesGenuineRemainderOutsideInputCells ThermalTimeGrid.PreservesGenuineRemainderOutsideInputCells; assertion 3개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.PreservesGenuineRemainderOutsideInputCells 유지 원문 검사 body 및 assertion 동일. 1e5b5e3355eb2dd4f5bf7575918fd02b20d03764ecd41dad7b95bacae0ca4ee0 1e5b5e3355eb2dd4f5bf7575918fd02b20d03764ecd41dad7b95bacae0ca4ee0 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Delta(4U), 1.6653345369377348e-16) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Delta(4U), 1.6653345369377348e-16) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.OriginalSubnormalCellsRespectOpenAndClosedContact ThermalTimeGrid.OriginalSubnormalCellsRespectOpenAndClosedContact; assertion 5개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.OriginalSubnormalCellsRespectOpenAndClosedContact 유지 원문 검사 body 및 assertion 동일. b3750249efc6650ce8d7651338ad3bbd1a681960df204dc61df4047dbb7b7cec b3750249efc6650ce8d7651338ad3bbd1a681960df204dc61df4047dbb7b7cec ASSERT_TRUE(even.HasValue()) | ASSERT_TRUE(odd.HasValue()) | EXPECT_EQ(even.Value().Count(), 3U) | EXPECT_EQ(odd.Value().Count(), 4U) | EXPECT_EQ(odd.Value().Delta(4U), 2 * tiny) ASSERT_TRUE(even.HasValue()) | ASSERT_TRUE(odd.HasValue()) | EXPECT_EQ(even.Value().Count(), 3U) | EXPECT_EQ(odd.Value().Count(), 4U) | EXPECT_EQ(odd.Value().Delta(4U), 2 * tiny) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.DecimalCellsCounterexampleAndScale ThermalTimeGrid.DecimalCellsCounterexampleAndScale; assertion 8개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.DecimalCellsCounterexampleAndScale 유지 원문 검사 body 및 assertion 동일. 55542fd9e560e9916102520ef1a4955d9b86bf134c0bbc4d6010cee6fa01e746 55542fd9e560e9916102520ef1a4955d9b86bf134c0bbc4d6010cee6fa01e746 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), delta) | EXPECT_EQ(grid.Value().Time(3U), period) | ASSERT_TRUE(old_counterexample.HasValue()) | EXPECT_EQ(old_counterexample.Value().Count(), 31U) | EXPECT_EQ(old_counterexample.Value().Delta(31U), .17262758624947144) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(5.351455173733616, .17262758624947144, 30U) .HasValue()) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), delta) | EXPECT_EQ(grid.Value().Time(3U), period) | ASSERT_TRUE(old_counterexample.HasValue()) | EXPECT_EQ(old_counterexample.Value().Count(), 31U) | EXPECT_EQ(old_counterexample.Value().Delta(31U), .17262758624947144) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(5.351455173733616, .17262758624947144, 30U) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.BinadeLimitsAndMaximumFinitePreserveOriginalCells ThermalTimeGrid.BinadeLimitsAndMaximumFinitePreserveOriginalCells; assertion 8개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.BinadeLimitsAndMaximumFinitePreserveOriginalCells 유지 원문 검사 body 및 assertion 동일. 51807a8419bb57da7a52205af4bae20dd05265ee7bc2f446e396d861b9894232 51807a8419bb57da7a52205af4bae20dd05265ee7bc2f446e396d861b9894232 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), max / 3) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().Count(), 4294967295U) | EXPECT_TRUE(upper.Value().Frame(4294967295U).HasValue()) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(4294967296., 1., 4294967295U).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create( max, std::numeric_limits::denorm_min(), 4294967295U) .HasValue()) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 3U) | EXPECT_EQ(grid.Value().Delta(3U), max / 3) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().Count(), 4294967295U) | EXPECT_TRUE(upper.Value().Frame(4294967295U).HasValue()) | EXPECT_FALSE( fesa::ThermalTimeGrid::Create(4294967296., 1., 4294967295U).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create( max, std::numeric_limits::denorm_min(), 4294967295U) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.ShortenedIncrementAndCheckedFrames ThermalTimeGrid.ShortenedIncrementAndCheckedFrames; assertion 15개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.ShortenedIncrementAndCheckedFrames 유지 원문 검사 body 및 assertion 동일. 26a8db8885d7920f5ee954491b801daefb3c4ad8e88e8bca8ffc4a394f668c07 26a8db8885d7920f5ee954491b801daefb3c4ad8e88e8bca8ffc4a394f668c07 ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Time(0U), 0.) | ASSERT_TRUE(grid.Value().Frame(i).HasValue()) | EXPECT_EQ(grid.Value().Time(i), i == 4 ? 10. : 3. * i) | EXPECT_EQ(grid.Value().Delta(i), i == 4 ? 1. : 3.) | EXPECT_FALSE(grid.Value().Frame(0U).HasValue()) | EXPECT_FALSE(grid.Value().Frame(5U).HasValue()) | ASSERT_TRUE(decimals.HasValue()) | EXPECT_EQ(decimals.Value().Time(3U), .30000000000000004) | EXPECT_EQ(decimals.Value().Delta(10U), .1) | ASSERT_TRUE(close.HasValue()) | ASSERT_TRUE(short_last.HasValue()) | EXPECT_EQ(close.Value().Delta(3U), .3) | EXPECT_EQ(short_last.Value().Delta(3U), .2999999999999998) ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 4U) | EXPECT_EQ(grid.Value().Time(0U), 0.) | ASSERT_TRUE(grid.Value().Frame(i).HasValue()) | EXPECT_EQ(grid.Value().Time(i), i == 4 ? 10. : 3. * i) | EXPECT_EQ(grid.Value().Delta(i), i == 4 ? 1. : 3.) | EXPECT_FALSE(grid.Value().Frame(0U).HasValue()) | EXPECT_FALSE(grid.Value().Frame(5U).HasValue()) | ASSERT_TRUE(decimals.HasValue()) | EXPECT_EQ(decimals.Value().Time(3U), .30000000000000004) | EXPECT_EQ(decimals.Value().Delta(10U), .1) | ASSERT_TRUE(close.HasValue()) | ASSERT_TRUE(short_last.HasValue()) | EXPECT_EQ(close.Value().Delta(3U), .3) | EXPECT_EQ(short_last.Value().Delta(3U), .2999999999999998) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.RejectsInvalidControlsBeforeIntegerConversion ThermalTimeGrid.RejectsInvalidControlsBeforeIntegerConversion; assertion 5개 tests/unit/analysis/thermal_time_grid_test.cpp ThermalTimeGrid.RejectsInvalidControlsBeforeIntegerConversion 유지 원문 검사 body 및 assertion 동일. b7b300d2a27beb1ef71e1c4d21f574e4e5ae22ed3fe52417e940fbd4138cc5d4 b7b300d2a27beb1ef71e1c4d21f574e4e5ae22ed3fe52417e940fbd4138cc5d4 EXPECT_FALSE(fesa::ThermalTimeGrid::Create(bad, 1.).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., bad).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., 1., 0U).HasValue()) | ASSERT_TRUE(equal.HasValue()) | EXPECT_EQ(equal.Value().Delta(1U), 2.) EXPECT_FALSE(fesa::ThermalTimeGrid::Create(bad, 1.).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., bad).HasValue()) | EXPECT_FALSE(fesa::ThermalTimeGrid::Create(1., 1., 0U).HasValue()) | ASSERT_TRUE(equal.HasValue()) | EXPECT_EQ(equal.Value().Delta(1U), 2.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/thermal_time_grid_test.cpp support@1-7 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/analysis/thermal_time_grid_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4d7509a96a86780faf4709a37c3191b68a01d0bb865d28925558e8e69d405ef2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/unit/analysis/transient_heat_procedure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. efff26c6a7451be803515541313038b9555ee01362e280915dab4d272586bef6 efff26c6a7451be803515541313038b9555ee01362e280915dab4d272586bef6 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.RawConstrainedCapacityProducesSignedTwoDofJump TransientHeatProcedure.RawConstrainedCapacityProducesSignedTwoDofJump; assertion 8개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.RawConstrainedCapacityProducesSignedTwoDofJump 유지 원문 검사 body 및 assertion 동일. 980805fa102cb221909d1766e40746ce9cf7fae52ceea5e89b51cf424ad0b73f 980805fa102cb221909d1766e40746ce9cf7fae52ceea5e89b51cf424ad0b73f ASSERT_TRUE(first.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().temperature[0], -.2) | EXPECT_DOUBLE_EQ(first.Value().reaction[0], 4.8) | ASSERT_TRUE(second.HasValue()) | EXPECT_NEAR(second.Value().temperature[0], .04, 16 * std::numeric_limits::epsilon() * .04) | EXPECT_DOUBLE_EQ(second.Value().reaction[0], 1.44) | EXPECT_EQ(solver.factorizations, 1) | EXPECT_EQ(solver.solves, 2) ASSERT_TRUE(first.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().temperature[0], -.2) | EXPECT_DOUBLE_EQ(first.Value().reaction[0], 4.8) | ASSERT_TRUE(second.HasValue()) | EXPECT_NEAR(second.Value().temperature[0], .04, 16 * std::numeric_limits::epsilon() * .04) | EXPECT_DOUBLE_EQ(second.Value().reaction[0], 1.44) | EXPECT_EQ(solver.factorizations, 1) | EXPECT_EQ(solver.solves, 2) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.AllConstrainedBypassesZeroSizeFactorization TransientHeatProcedure.AllConstrainedBypassesZeroSizeFactorization; assertion 5개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.AllConstrainedBypassesZeroSizeFactorization 유지 원문 검사 body 및 assertion 동일. 202ca407a90853cb361a166c1a72d391cf1a085616e54ed9c39d5c3d5d13a566 202ca407a90853cb361a166c1a72d391cf1a085616e54ed9c39d5c3d5d13a566 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().reaction[0], 6) | EXPECT_EQ(result.Value().reaction[1], 6) | EXPECT_EQ(solver.factorizations, 0) | EXPECT_EQ(solver.solves, 0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().reaction[0], 6) | EXPECT_EQ(result.Value().reaction[1], 6) | EXPECT_EQ(solver.factorizations, 0) | EXPECT_EQ(solver.solves, 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.CancellationCannotUseFullSystemScaleToPassCertificate TransientHeatProcedure.CancellationCannotUseFullSystemScaleToPassCertificate; assertion 3개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.CancellationCannotUseFullSystemScaleToPassCertificate 유지 원문 검사 body 및 assertion 동일. 5e0a1ecdf9e220cf428d03065cb6e98777df3afbfa34e41ce945372420f3004e 5e0a1ecdf9e220cf428d03065cb6e98777df3afbfa34e41ce945372420f3004e ASSERT_TRUE(valid.HasValue()) | EXPECT_DOUBLE_EQ(valid.Value().temperature[0], .8) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, old, .5, solver, cache) .HasValue()) ASSERT_TRUE(valid.HasValue()) | EXPECT_DOUBLE_EQ(valid.Value().temperature[0], .8) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, old, .5, solver, cache) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ExactZeroAndUniformInsulatedStatesAndActualDeltaCache TransientHeatProcedure.ExactZeroAndUniformInsulatedStatesAndActualDeltaCache; assertion 12개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ExactZeroAndUniformInsulatedStatesAndActualDeltaCache 유지 원문 검사 body 및 assertion 동일. ac935c01b0c672b156e573888f2e14ff26dfd1ee8579b195b45a210b274f7b78 ac935c01b0c672b156e573888f2e14ff26dfd1ee8579b195b45a210b274f7b78 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(state.IsComplete()) | EXPECT_EQ(state.AcceptedFrames().size(), schedule.steps + 1) | EXPECT_EQ(state.CommittedState().time, schedule.period) | EXPECT_EQ(state.CommittedState().time_increment, schedule.last) | EXPECT_EQ(solver.factorizations, schedule.factors) | EXPECT_EQ(solver.solves, static_cast(schedule.steps)) | EXPECT_FALSE(state.AcceptedFrames()[0].completed.has_value()) | EXPECT_EQ(frame.temperature[i], 0) | EXPECT_NEAR(frame.temperature[i], initial, 4096 * 0x1p-53 * initial) | EXPECT_EQ(frame.completed->reaction_heat_rate.Size(), 0U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(state.IsComplete()) | EXPECT_EQ(state.AcceptedFrames().size(), schedule.steps + 1) | EXPECT_EQ(state.CommittedState().time, schedule.period) | EXPECT_EQ(state.CommittedState().time_increment, schedule.last) | EXPECT_EQ(solver.factorizations, schedule.factors) | EXPECT_EQ(solver.solves, static_cast(schedule.steps)) | EXPECT_FALSE(state.AcceptedFrames()[0].completed.has_value()) | EXPECT_EQ(frame.temperature[i], 0) | EXPECT_NEAR(frame.temperature[i], initial, 4096 * 0x1p-53 * initial) | EXPECT_EQ(frame.completed->reaction_heat_rate.Size(), 0U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.MklMatchesIndependentAffineDiscreteModeAndDissipation TransientHeatProcedure.MklMatchesIndependentAffineDiscreteModeAndDissipation; assertion 15개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.MklMatchesIndependentAffineDiscreteModeAndDissipation 유지 원문 검사 body 및 assertion 동일. 469b0381e9116d635764dd3052feeddf1df682d761cf3122988c87b66b6157ec 469b0381e9116d635764dd3052feeddf1df682d761cf3122988c87b66b6157ec ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(candidate.temperature[i], mode[i / 5] / 4, bound) | EXPECT_LE(candidate.evidence.beta_cert, candidate.evidence.beta_limit) | EXPECT_LE(candidate.evidence.energy_defect, candidate.evidence.energy_bound) | EXPECT_TRUE(candidate.evidence.dissipation_checked) | EXPECT_LE(candidate.evidence.dissipation_defect, candidate.evidence.dissipation_bound) | ASSERT_TRUE(flux.HasValue()) | EXPECT_NEAR(q.X(), .5, 16 * bound + 4096 * 0x1p-53 * .5) | EXPECT_NEAR(q.Y(), 0, 16 * bound) | EXPECT_NEAR(q.Z(), 0, 16 * bound) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_NEAR(candidate.temperature[i], mode[i / 5] / 4, bound) | EXPECT_LE(candidate.evidence.beta_cert, candidate.evidence.beta_limit) | EXPECT_LE(candidate.evidence.energy_defect, candidate.evidence.energy_bound) | EXPECT_TRUE(candidate.evidence.dissipation_checked) | EXPECT_LE(candidate.evidence.dissipation_defect, candidate.evidence.dissipation_bound) | ASSERT_TRUE(flux.HasValue()) | EXPECT_NEAR(q.X(), .5, 16 * bound + 4096 * 0x1p-53 * .5) | EXPECT_NEAR(q.Y(), 0, 16 * bound) | EXPECT_NEAR(q.Z(), 0, 16 * bound) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.LaterSolveRecoveryAndPayloadFailuresPreserveEveryAcceptedBit TransientHeatProcedure.LaterSolveRecoveryAndPayloadFailuresPreserveEveryAcceptedBit; assertion 13개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.LaterSolveRecoveryAndPayloadFailuresPreserveEveryAcceptedBit 유지 원문 검사 body 및 assertion 동일. 2f4ea89dc0b1fb735d45915b043a1f2de650e0a55a98df2b4d95ce7bad84c001 2f4ea89dc0b1fb735d45915b043a1f2de650e0a55a98df2b4d95ce7bad84c001 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().IsComplete()) | EXPECT_EQ(evidence.size(), 1U) | EXPECT_EQ(Snapshot(state.Value()), before) | EXPECT_EQ(state.Value().AcceptedFrames()[0].temperature[0], 2) | EXPECT_EQ(state.Value().CommittedState().temperature[0], 1) | EXPECT_EQ(solver.factorizations, 1) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(state.Value().AcceptedFrames().size(), 2U) | EXPECT_FALSE(state.Value().IsComplete()) | EXPECT_EQ(evidence.size(), 1U) | EXPECT_EQ(Snapshot(state.Value()), before) | EXPECT_EQ(state.Value().AcceptedFrames()[0].temperature[0], 2) | EXPECT_EQ(state.Value().CommittedState().temperature[0], 1) | EXPECT_EQ(solver.factorizations, 1) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SignedPowerConstrainedReactionAndDisconnectedComponentBalance TransientHeatProcedure.SignedPowerConstrainedReactionAndDisconnectedComponentBalance; assertion 14개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SignedPowerConstrainedReactionAndDisconnectedComponentBalance 유지 원문 검사 body 및 assertion 동일. c99828c6527db730f1bb8ec96e489a85090c34c5d3084fe0a1dc5fc3dd507e15 c99828c6527db730f1bb8ec96e489a85090c34c5d3084fe0a1dc5fc3dd507e15 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(evidence.size(), 2U) | EXPECT_NEAR(balance[0], .25 * reaction, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[0]) | EXPECT_NEAR(balance[1], 0, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[1]) | EXPECT_FALSE(evidence[step - 1].dissipation_checked) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other.HasValue()) | EXPECT_NEAR(first.temperature[i], second.temperature[i], 4096 * 0x1p-53 * std::abs(second.temperature[i])) | EXPECT_NEAR(first.completed->reaction_heat_rate[0] - second.completed->reaction_heat_rate[0], -3., 4096 * 0x1p-53 * 3) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembly.HasValue()) | ASSERT_TRUE(state.HasValue()) | ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(evidence.size(), 2U) | EXPECT_NEAR(balance[0], .25 * reaction, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[0]) | EXPECT_NEAR(balance[1], 0, evidence[step - 1].energy_bound + 4096 * 0x1p-53 * scale[1]) | EXPECT_FALSE(evidence[step - 1].dissipation_checked) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other.HasValue()) | EXPECT_NEAR(first.temperature[i], second.temperature[i], 4096 * 0x1p-53 * std::abs(second.temperature[i])) | EXPECT_NEAR(first.completed->reaction_heat_rate[0] - second.completed->reaction_heat_rate[0], -3., 4096 * 0x1p-53 * 3) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ConstructionEnclosuresRetainExactIdentitiesAndSubnormalLoss TransientHeatProcedure.ConstructionEnclosuresRetainExactIdentitiesAndSubnormalLoss; assertion 9개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.ConstructionEnclosuresRetainExactIdentitiesAndSubnormalLoss 유지 원문 검사 body 및 assertion 동일. 99c40aa53ebd7840c50827f7a7cba6e8c37e21c37797d984dfff01c81f812fb5 99c40aa53ebd7840c50827f7a7cba6e8c37e21c37797d984dfff01c81f812fb5 EXPECT_EQ(value.lower, expected) | EXPECT_EQ(value.upper, expected) | EXPECT_LE(midpoint.lower, 1) | EXPECT_GE(midpoint.upper, std::nextafter(1., 2.)) | EXPECT_LE(half.lower, 0) | EXPECT_GE(half.upper, tiny) | EXPECT_NE(half.lower, half.upper) | EXPECT_FALSE( b::Mul(b::I{std::numeric_limits::max()}, b::I{2}).IsFinite()) | EXPECT_GT(b::Roundoff(80, b::I{tiny}).upper, 0) EXPECT_EQ(value.lower, expected) | EXPECT_EQ(value.upper, expected) | EXPECT_LE(midpoint.lower, 1) | EXPECT_GE(midpoint.upper, std::nextafter(1., 2.)) | EXPECT_LE(half.lower, 0) | EXPECT_GE(half.upper, tiny) | EXPECT_NE(half.lower, half.upper) | EXPECT_FALSE( b::Mul(b::I{std::numeric_limits::max()}, b::I{2}).IsFinite()) | EXPECT_GT(b::Roundoff(80, b::I{tiny}).upper, 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.GenericAlgebraRejectsInvalidInputsAndUncertifiedSubnormalSolve TransientHeatProcedure.GenericAlgebraRejectsInvalidInputsAndUncertifiedSubnormalSolve; assertion 5개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.GenericAlgebraRejectsInvalidInputsAndUncertifiedSubnormalSolve 유지 원문 검사 body 및 assertion 동일. 521aae60d1b90ac0380baf56f738a93910d9d758dbc2a785fb80e0cc5548087b 521aae60d1b90ac0380baf56f738a93910d9d758dbc2a785fb80e0cc5548087b EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{2}, delta, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, {{0}, {0}, fesa::Vector{1, 1}}, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{1}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({invalid, c, q}, p, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, small, fesa::Vector{2}, .5, solver, cache) .HasValue()) EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{2}, delta, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, {{0}, {0}, fesa::Vector{1, 1}}, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, p, fesa::Vector{1}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({invalid, c, q}, p, fesa::Vector{2}, .5, solver, cache) .HasValue()) | EXPECT_FALSE(ti::SolveThermalIncrement({k, c, q}, small, fesa::Vector{2}, .5, solver, cache) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SerialAndTbbExecutionsHaveIdenticalAcceptedHistories TransientHeatProcedure.SerialAndTbbExecutionsHaveIdenticalAcceptedHistories; assertion 4개 tests/unit/analysis/transient_heat_procedure_test.cpp TransientHeatProcedure.SerialAndTbbExecutionsHaveIdenticalAcceptedHistories 유지 원문 검사 body 및 assertion 동일. d88a406c7cd08b89d4d7877bf387792819e771b3133dbf4ab7f248ecbd55cb22 d88a406c7cd08b89d4d7877bf387792819e771b3133dbf4ab7f248ecbd55cb22 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(left.HasValue()) | ASSERT_TRUE(right.HasValue()) | EXPECT_EQ(Snapshot(left.Value().state), Snapshot(right.Value().state)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(left.HasValue()) | ASSERT_TRUE(right.HasValue()) | EXPECT_EQ(Snapshot(left.Value().state), Snapshot(right.Value().state)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/analysis/transient_heat_procedure_test.cpp support@1-103 helper/oracle/fixture/include/static assertion 구간: ti, Messages, Plate, TwoMatrix, CountingSolver, Snapshot, for, if tests/unit/analysis/transient_heat_procedure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4ee5ea61dfb7fb7b623a25046b64a1e7bb04f1bc8fafe69970766d1634cb027c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/app/output_paths_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/app/output_paths_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 23aa6fa1dac950505061d2d64a2ad10abffb76bcabc0232cd0afef512c863107 23aa6fa1dac950505061d2d64a2ad10abffb76bcabc0232cd0afef512c863107 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/app/output_paths_test.cpp OutputPaths.RejectsFirstTokenContainingOutputSubstring OutputPaths.RejectsFirstTokenContainingOutputSubstring; assertion 2개 tests/unit/app/output_paths_test.cpp OutputPaths.RejectsFirstTokenContainingOutputSubstring 유지 원문 검사 body 및 assertion 동일. b5fcd67ff4f6a7eaa6e06e55668193dd70ba3822879887699b02d4baf7b419b1 b5fcd67ff4f6a7eaa6e06e55668193dd70ba3822879887699b02d4baf7b419b1 "ASSERT_FALSE(paths.HasValue()) | EXPECT_EQ(paths.GetStatus().Diagnostics().front().entity_identity, ""argument_index=0;argument=abc--outputdef"")" "ASSERT_FALSE(paths.HasValue()) | EXPECT_EQ(paths.GetStatus().Diagnostics().front().entity_identity, ""argument_index=0;argument=abc--outputdef"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/app/output_paths_test.cpp OutputPaths.RejectsEveryOutputSubstringVariant OutputPaths.RejectsEveryOutputSubstringVariant; assertion 1개 tests/unit/app/output_paths_test.cpp OutputPaths.RejectsEveryOutputSubstringVariant 유지 원문 검사 body 및 assertion 동일. 9ccaab67728c7c0a433b6ece05c14731aa50e6b5010d9de5e18eb258fe6b4d3d 9ccaab67728c7c0a433b6ece05c14731aa50e6b5010d9de5e18eb258fe6b4d3d ASSERT_FALSE(paths.HasValue()) ASSERT_FALSE(paths.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/app/output_paths_test.cpp OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput; assertion 4개 tests/unit/app/output_paths_test.cpp OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput 유지 원문 검사 body 및 assertion 동일. be83317f7274e5567210d53981799a741b7beb27bd40f47391f2417fac426bd0 be83317f7274e5567210d53981799a741b7beb27bd40f47391f2417fac426bd0 "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ( paths.Value().input_path, std::filesystem::path{""C:/invocation/current/models/Beam.Model.INP""}) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_log.txt""})" "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ( paths.Value().input_path, std::filesystem::path{""C:/invocation/current/models/Beam.Model.INP""}) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{ ""C:/invocation/current/models/Beam.Model_log.txt""})" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/app/output_paths_test.cpp OutputPaths.PreservesBasenameCaseAndPrecedingDots OutputPaths.PreservesBasenameCaseAndPrecedingDots; assertion 3개 tests/unit/app/output_paths_test.cpp OutputPaths.PreservesBasenameCaseAndPrecedingDots 유지 원문 검사 body 및 assertion 동일. 61885c6eea856194a2be897fc370b6aaaab094a608da558e7459b8e5798941a8 61885c6eea856194a2be897fc370b6aaaab094a608da558e7459b8e5798941a8 "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{""C:/models/.Beam.v2_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{""C:/models/.Beam.v2_log.txt""})" "ASSERT_TRUE(paths.HasValue()) | EXPECT_EQ(paths.Value().results_path, std::filesystem::path{""C:/models/.Beam.v2_results.h5""}) | EXPECT_EQ(paths.Value().log_path, std::filesystem::path{""C:/models/.Beam.v2_log.txt""})" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/app/output_paths_test.cpp OutputPaths.RejectsInputWithoutInpFinalExtension OutputPaths.RejectsInputWithoutInpFinalExtension; assertion 1개 tests/unit/app/output_paths_test.cpp OutputPaths.RejectsInputWithoutInpFinalExtension 유지 원문 검사 body 및 assertion 동일. 0014158f8fc76b488d78ce4409d51ef8f401c1f051f2cd0db5620a776c3b9953 0014158f8fc76b488d78ce4409d51ef8f401c1f051f2cd0db5620a776c3b9953 ASSERT_FALSE(paths.HasValue()) ASSERT_FALSE(paths.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/app/output_paths_test.cpp OutputPaths.LeaseCollisionPreservesPublicOutputPaths OutputPaths.LeaseCollisionPreservesPublicOutputPaths; assertion 6개 tests/unit/app/output_paths_test.cpp OutputPaths.LeaseCollisionPreservesPublicOutputPaths 유지 원문 검사 body 및 assertion 동일. b93c20d80194e4d6ef75b5cc9deeed307c666c32d1eb009a75058426755fa409 b93c20d80194e4d6ef75b5cc9deeed307c666c32d1eb009a75058426755fa409 ASSERT_TRUE(first.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) | ASSERT_FALSE(second.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) ASSERT_TRUE(first.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) | ASSERT_FALSE(second.HasValue()) | EXPECT_FALSE(std::filesystem::exists(paths.results_path)) | EXPECT_FALSE(std::filesystem::exists(paths.log_path)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/app/output_paths_test.cpp OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths; assertion 3개 tests/unit/app/output_paths_test.cpp OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths 유지 원문 검사 body 및 assertion 동일. c48fbc834105a6cd2380b9a77237a1f2990fd348e4c796cb5ba405a37b2d07b2 c48fbc834105a6cd2380b9a77237a1f2990fd348e4c796cb5ba405a37b2d07b2 "EXPECT_EQ(request.input_path, ""C:/models/model.inp"") | EXPECT_EQ(request.output_path, ""C:/models/model_results.h5"") | EXPECT_EQ(request.log_path, ""C:/models/model_log.txt"")" "EXPECT_EQ(request.input_path, ""C:/models/model.inp"") | EXPECT_EQ(request.output_path, ""C:/models/model_results.h5"") | EXPECT_EQ(request.log_path, ""C:/models/model_log.txt"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/app/output_paths_test.cpp support@1-49 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, ExpectFailureCode tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8dbf6924f3d67728bb5446141ed4ace5ac53a860966902e0e81cfe6dc39db3c4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/app/output_paths_test.cpp support@71-72 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b196b7affd091bd4430c558ecb836979300676f2db7a408c62e9271c62e40d71 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/app/output_paths_test.cpp support@89-90 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a5bd942724af8adb3d7c4b014a78f9a28247931c4ea15756008b12b39aeb68fd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/app/output_paths_test.cpp support@109-110 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. af57532578cc6d4bc6c633b7417372ef65a6b94c1efa40c6a66a0c0a47624792 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/app/output_paths_test.cpp support@128-129 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 30515567df68d6c58a8531445f79936aa9236b7440ac2d675f11334b4e1278b9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/app/output_paths_test.cpp support@140-141 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/app/output_paths_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/load_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/assembly/load_assembler_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 67464dfa75fd5a01a96d5757f20061cbbf936c4ac7f16b605314de94aabeeee3 34eb602efea7903941426ad18f10ba54bdabd46e4e262ba6efcb5ffabf2af2d3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder; assertion 3개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder 유지 원문 검사 body 및 assertion 동일. aff7361b21837067a746e74160c69e478361e53af3444bffe4d0e557a557c690 aff7361b21837067a746e74160c69e478361e53af3444bffe4d0e557a557c690 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[0U], -1.0) | EXPECT_DOUBLE_EQ(result.Value()[2U], -2.5) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[0U], -1.0) | EXPECT_DOUBLE_EQ(result.Value()[2U], -2.5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit; assertion 2개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit 유지 원문 검사 body 및 assertion 동일. 4516bacc631826833398902d64155fc5f6d7c6906375f9966010ff7e7691dc7e 4516bacc631826833398902d64155fc5f6d7c6906375f9966010ff7e7691dc7e ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(repeated.Value()[1U], 3.0) ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(repeated.Value()[1U], 3.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AssemblesNodeSetAndSixComponentLoads LoadAssembly.AssemblesNodeSetAndSixComponentLoads; assertion 5개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AssemblesNodeSetAndSixComponentLoads 유지 원문 검사 body 및 assertion 동일. 1bdb44b82711f7c6e58780cce70be76a8c21cd6eb2017a77241d7b4ed031b4d5 1bdb44b82711f7c6e58780cce70be76a8c21cd6eb2017a77241d7b4ed031b4d5 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 12U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 12U), (std::vector{1.0, 2.0, 0.0, -4.0, 5.0, 0.0, 1.0, 0.0, 3.0, 0.0, 5.0, 6.0})) | EXPECT_EQ(fixture.dofs->ConstrainedDofs(), (std::vector{0U})) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 12U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 12U), (std::vector{1.0, 2.0, 0.0, -4.0, 5.0, 0.0, 1.0, 0.0, 3.0, 0.0, 5.0, 6.0})) | EXPECT_EQ(fixture.dofs->ConstrainedDofs(), (std::vector{0U})) | EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesSignedLoadsInSourceOrder LoadAssembly.AccumulatesSignedLoadsInSourceOrder; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AccumulatesSignedLoadsInSourceOrder 유지 원문 검사 body 및 assertion 동일. 0e27baa9eedd061df41e6eb0ceaaf6ed5073343675c3d17412eb4bb33f7c055f 0e27baa9eedd061df41e6eb0ceaaf6ed5073343675c3d17412eb4bb33f7c055f ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(second.Value()[0U], 0.0) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value()[0U], 1.0) | EXPECT_DOUBLE_EQ(second.Value()[0U], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder; assertion 3개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder 유지 원문 검사 body 및 assertion 동일. 79cc99592d223bf47a84a2e6417bf67d9cd139106e217bba7ea034759ea36814 79cc99592d223bf47a84a2e6417bf67d9cd139106e217bba7ea034759ea36814 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 24U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 6U), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0, 0.0})) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Size(), 24U) | EXPECT_EQ( std::vector(result.Value().Data(), result.Value().Data() + 6U), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0, 0.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AcceptsExactlyZeroAggregateShellMoment LoadAssembly.AcceptsExactlyZeroAggregateShellMoment; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.AcceptsExactlyZeroAggregateShellMoment 유지 원문 검사 body 및 assertion 동일. 733bd45f5146ff23a07a82104b8331e28b49c335ddf6a0aec54ad75bf642a316 733bd45f5146ff23a07a82104b8331e28b49c335ddf6a0aec54ad75bf642a316 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[5U], 0.0) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value()[3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value()[5U], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold; assertion 7개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold 유지 원문 검사 body 및 assertion 동일. fea2c3252ba8945cb8611b9feb2879b6eeaa387e739a47709caf10ce8a447337 fea2c3252ba8945cb8611b9feb2879b6eeaa387e739a47709caf10ce8a447337 "ASSERT_TRUE(accepted.HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].keyword, ""CLOAD"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""10"")" "ASSERT_TRUE(accepted.HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].keyword, ""CLOAD"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""10"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed 유지 원문 검사 body 및 assertion 동일. 18508214d24d7672307273a6b6575be56d3d3e18b1890c1a5889d38969795375 18508214d24d7672307273a6b6575be56d3d3e18b1890c1a5889d38969795375 "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"")" "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""unsupported-drilling-load"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.FormsNonzeroPrescribedEffectiveRhs LoadAssembly.FormsNonzeroPrescribedEffectiveRhs; assertion 4개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.FormsNonzeroPrescribedEffectiveRhs 유지 원문 검사 body 및 assertion 동일. ec68ce4b41d1de543a53650df90bfd6ff69f294deb6e1ed1ccdf92e34e1a90b4 ec68ce4b41d1de543a53650df90bfd6ff69f294deb6e1ed1ccdf92e34e1a90b4 ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(rhs.HasValue()) | ASSERT_EQ(rhs.Value().Size(), 4U) | EXPECT_EQ(std::vector(rhs.Value().Data(), rhs.Value().Data() + 4U), (std::vector{10.0, 18.0, 39.0, 38.0})) ASSERT_TRUE(full.HasValue()) | ASSERT_TRUE(rhs.HasValue()) | ASSERT_EQ(rhs.Value().Size(), 4U) | EXPECT_EQ(std::vector(rhs.Value().Data(), rhs.Value().Data() + 4U), (std::vector{10.0, 18.0, 39.0, 38.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsNonfiniteOrDimensionMismatch LoadAssembly.RejectsNonfiniteOrDimensionMismatch; assertion 0개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.RejectsNonfiniteOrDimensionMismatch 유지 원문 검사 body 및 assertion 동일. 5cc4ddbbe4657de7260e4d3d06882ec35eddc096aaa2410c36fc7c0d1d8c2d87 5cc4ddbbe4657de7260e4d3d06882ec35eddc096aaa2410c36fc7c0d1d8c2d87 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp LoadAssembly.ZeroLoadsRemainZero LoadAssembly.ZeroLoadsRemainZero; assertion 8개 tests/unit/assembly/load_assembler_test.cpp LoadAssembly.ZeroLoadsRemainZero 유지 원문 검사 body 및 assertion 동일. 7635872252315cd7031e15d3dc4016b63f745528c55c7be84c6651c5f25dcf19 7635872252315cd7031e15d3dc4016b63f745528c55c7be84c6651c5f25dcf19 ASSERT_TRUE(full.HasValue()) | EXPECT_TRUE(std::all_of(full.Value().Data(), full.Value().Data() + full.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(free_rhs.HasValue()) | EXPECT_EQ(free_rhs.Value().Size(), 6U) | EXPECT_TRUE(std::all_of(free_rhs.Value().Data(), free_rhs.Value().Data() + free_rhs.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(constrained_full.HasValue()) | ASSERT_TRUE(constrained_rhs.HasValue()) | EXPECT_EQ(constrained_rhs.Value().Size(), 0U) ASSERT_TRUE(full.HasValue()) | EXPECT_TRUE(std::all_of(full.Value().Data(), full.Value().Data() + full.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(free_rhs.HasValue()) | EXPECT_EQ(free_rhs.Value().Size(), 6U) | EXPECT_TRUE(std::all_of(free_rhs.Value().Data(), free_rhs.Value().Data() + free_rhs.Value().Size(), [](const double value) { return value == 0.0; })) | ASSERT_TRUE(constrained_full.HasValue()) | ASSERT_TRUE(constrained_rhs.HasValue()) | EXPECT_EQ(constrained_rhs.Value().Size(), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/load_assembler_test.cpp support@1-189 helper/oracle/fixture/include/static assertion 구간: LoadFixture, MakeFixture, if, MakeShellFixture, MakeDenseSparse, ExpectFailureCode, FakeLoad tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 09f288a427937029f1c93b5bd10b79a1ce75968600aab87a6017627ab43bbb4d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/load_assembler_test.cpp support@276-277 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a0c3d2fdca7428b4606aecf54fc991ff71f42a6f8dfbf900da33db75c07db5e7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/load_assembler_test.cpp support@301-302 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e5f1c6b05c193f37b5f5903549e70c2637df4efaa741399afea556790fcdd57d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/load_assembler_test.cpp support@320-321 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6d8dccf1a14f246c0076046744d9f5f32eb359e499a133ad3f09fc9a287f59b3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/load_assembler_test.cpp support@343-344 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/load_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 27a372ac23810e34bb1331fb06ff49031906985bdadbc563bb9322e0c7b5e944 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/parallel_for_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/assembly/parallel_for_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c33eb3d92d7e4fd8c3ae369e223cc123437ab59d17653a4114fc4d80b1230314 c33eb3d92d7e4fd8c3ae369e223cc123437ab59d17653a4114fc4d80b1230314 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/parallel_for_test.cpp ParallelFor.ZeroOneManyExecuteExactlyOnce ParallelFor.ZeroOneManyExecuteExactlyOnce; assertion 2개 tests/unit/assembly/parallel_for_test.cpp ParallelFor.ZeroOneManyExecuteExactlyOnce 유지 원문 검사 body 및 assertion 동일. ae877ba853b9d44bca19a62c65606b8130804cfd09d020aed0c560e1bf25fbb3 ae877ba853b9d44bca19a62c65606b8130804cfd09d020aed0c560e1bf25fbb3 EXPECT_EQ(zero_visits.load(std::memory_order_relaxed), 0U) | EXPECT_EQ(visits[index].load(std::memory_order_relaxed), 1U) EXPECT_EQ(zero_visits.load(std::memory_order_relaxed), 0U) | EXPECT_EQ(visits[index].load(std::memory_order_relaxed), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/parallel_for_test.cpp ParallelFor.SerialAndTbbProduceStableIndexedOutput ParallelFor.SerialAndTbbProduceStableIndexedOutput; assertion 4개 tests/unit/assembly/parallel_for_test.cpp ParallelFor.SerialAndTbbProduceStableIndexedOutput 유지 원문 검사 body 및 assertion 동일. 2ab6268405c5255e272585cd37131ac4b46b20a59e68b8e4a151839a35ac727b 2ab6268405c5255e272585cd37131ac4b46b20a59e68b8e4a151839a35ac727b EXPECT_EQ(serial_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), serial_output[index].load(std::memory_order_relaxed)) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), value_for_index(index)) EXPECT_EQ(serial_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_visits[index].load(std::memory_order_relaxed), 1U) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), serial_output[index].load(std::memory_order_relaxed)) | EXPECT_EQ(tbb_output[index].load(std::memory_order_relaxed), value_for_index(index)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/parallel_for_test.cpp ParallelFor.PropagatesBodyExceptionByContract ParallelFor.PropagatesBodyExceptionByContract; assertion 1개 tests/unit/assembly/parallel_for_test.cpp ParallelFor.PropagatesBodyExceptionByContract 유지 원문 검사 body 및 assertion 동일. e3d433539fb80a97ab4be815cbe5d2cd45434502bb2566bf94ff67bc15d4ee84 e3d433539fb80a97ab4be815cbe5d2cd45434502bb2566bf94ff67bc15d4ee84 "EXPECT_EQ(std::string{error.what()}, ""parallel-for-body-failure"")" "EXPECT_EQ(std::string{error.what()}, ""parallel-for-body-failure"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/parallel_for_test.cpp support@1-25 helper/oracle/fixture/include/static assertion 구간: fesa, ParallelForBodyError, ParallelForBackends tests/unit/assembly/parallel_for_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9cd2b8b3b770e02c02d2fe88f4966177d86c949c6fc0904fdbcfbedc9994989a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/parallel_for_test.cpp support@112-114 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/assembly/parallel_for_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/sparse_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/assembly/sparse_assembler_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0a9627a0923db100df6ce2d8ca2fada0d5d86cd156d2f12ac1c979a6f8291215 0a9627a0923db100df6ce2d8ca2fada0d5d86cd156d2f12ac1c979a6f8291215 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr; assertion 14개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr 유지 원문 검사 body 및 assertion 동일. 12ccb35b0634063643caa859a19ad70b4c5ffdd9c844561cf80ee3c18ab716f0 12ccb35b0634063643caa859a19ad70b4c5ffdd9c844561cf80ee3c18ab716f0 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), elements.size()) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), (std::vector{0U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 6U, 6U, 9U, 9U, 9U, 12U})) | EXPECT_EQ(serial.Value().ColumnIndices(), (std::vector{0U, 12U, 0U, 12U, 14U, 17U, 12U, 14U, 17U, 12U, 14U, 17U})) | EXPECT_EQ(serial.Value().Values(), (std::vector{1.0, 2.0, 3.0, 9.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0})) | ASSERT_TRUE(repeated.HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), elements.size()) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), (std::vector{0U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 2U, 6U, 6U, 9U, 9U, 9U, 12U})) | EXPECT_EQ(serial.Value().ColumnIndices(), (std::vector{0U, 12U, 0U, 12U, 14U, 17U, 12U, 14U, 17U, 12U, 14U, 17U})) | EXPECT_EQ(serial.Value().Values(), (std::vector{1.0, 2.0, 3.0, 9.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0})) | ASSERT_TRUE(repeated.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical; assertion 20개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical 유지 원문 검사 body 및 assertion 동일. 5849dbe7757b88a61317b8233042ef8e96361c3df7ffc77c6e5f428e52989d1e 5849dbe7757b88a61317b8233042ef8e96361c3df7ffc77c6e5f428e52989d1e ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), dofs_result.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(serial.Value().ColumnIndices(), dofs_result.Value().GetSparsePattern().column_indices) | EXPECT_TRUE(serial.Value().Validate().IsOk()) | ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(Entry(serial.Value(), row, column), Entry(serial.Value(), column, row)) | EXPECT_NEAR(Entry(serial.Value(), 0U, 0U), 120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 0U, 6U), -120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 6U), 200.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 12U), -80.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 12U, 12U), 80.0, 1.0e-12) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | ASSERT_TRUE(dofs_result.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | EXPECT_EQ(serial.Value().Rows(), 18U) | EXPECT_EQ(serial.Value().Columns(), 18U) | EXPECT_EQ(serial.Value().RowOffsets(), dofs_result.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(serial.Value().ColumnIndices(), dofs_result.Value().GetSparsePattern().column_indices) | EXPECT_TRUE(serial.Value().Validate().IsOk()) | ASSERT_TRUE(repeated.HasValue()) | EXPECT_DOUBLE_EQ(Entry(serial.Value(), row, column), Entry(serial.Value(), column, row)) | EXPECT_NEAR(Entry(serial.Value(), 0U, 0U), 120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 0U, 6U), -120.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 6U), 200.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 6U, 12U), -80.0, 1.0e-12) | EXPECT_NEAR(Entry(serial.Value(), 12U, 12U), 80.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots; assertion 12개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots 유지 원문 검사 body 및 assertion 동일. 49e404af06df45dd33c41511e4b767b397f204af6dee8ddf123a19cc1159d489 49e404af06df45dd33c41511e4b767b397f204af6dee8ddf123a19cc1159d489 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_EQ(assembled.Value().Rows(), 24U) | EXPECT_EQ(assembled.Value().Columns(), 24U) | EXPECT_EQ(assembled.Value().Values().size(), 24U * 24U) | EXPECT_EQ(assembled.Value().RowOffsets(), dofs.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(assembled.Value().ColumnIndices(), dofs.Value().GetSparsePattern().column_indices) | EXPECT_NE(std::lower_bound(begin, end, row), end) | EXPECT_DOUBLE_EQ(Entry(assembled.Value(), row, column), expected.Value().stabilized_global24(row, column)) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_TRUE(expected.HasValue()) | EXPECT_EQ(assembled.Value().Rows(), 24U) | EXPECT_EQ(assembled.Value().Columns(), 24U) | EXPECT_EQ(assembled.Value().Values().size(), 24U * 24U) | EXPECT_EQ(assembled.Value().RowOffsets(), dofs.Value().GetSparsePattern().row_offsets) | EXPECT_EQ(assembled.Value().ColumnIndices(), dofs.Value().GetSparsePattern().column_indices) | EXPECT_NE(std::lower_bound(begin, end, row), end) | EXPECT_DOUBLE_EQ(Entry(assembled.Value(), row, column), expected.Value().stabilized_global24(row, column)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical; assertion 6개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical 유지 원문 검사 body 및 assertion 동일. 8a7b6de57d65db7469d0151373d4dc4642b7279f6e4e036f8cc76bb27e0db170 8a7b6de57d65db7469d0151373d4dc4642b7279f6e4e036f8cc76bb27e0db170 ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | ASSERT_TRUE(repeated.HasValue()) ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(tbb.HasValue()) | ASSERT_TRUE(reversed.HasValue()) | EXPECT_EQ(reverse_executor.Calls(), 1U) | EXPECT_EQ(reverse_executor.ObservedCount(), 2U) | ASSERT_TRUE(repeated.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness; assertion 3개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness 유지 원문 검사 body 및 assertion 동일. e5a06a15276973da6be56d1ee497a913c183e8fae82909c70d28845de7fd434c e5a06a15276973da6be56d1ee497a913c183e8fae82909c70d28845de7fd434c ASSERT_TRUE(s4.HasValue()) | ASSERT_TRUE(s4r.HasValue()) | EXPECT_TRUE(std::any_of(s4.Value().Values().begin(), s4.Value().Values().end(), [](const double value) { return value != 0.0; })) ASSERT_TRUE(s4.HasValue()) | ASSERT_TRUE(s4r.HasValue()) | EXPECT_TRUE(std::any_of(s4.Value().Values().begin(), s4.Value().Values().end(), [](const double value) { return value != 0.0; })) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.RejectsLayoutAndDimensionsInStableElementOrder SparseAssembly.RejectsLayoutAndDimensionsInStableElementOrder; assertion 17개 tests/unit/assembly/sparse_assembler_test.cpp SparseAssembly.RejectsLayoutAndDimensionsInStableElementOrder 유지 원문 검사 body 및 assertion 동일. ff4bfe491d0dfc3b93ef770dd1edde00232b272f6fc225e437e5b547881bf596 ff4bfe491d0dfc3b93ef770dd1edde00232b272f6fc225e437e5b547881bf596 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(candidate.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""invalid-assembly-layout"") | EXPECT_EQ(diagnostic.keyword, ""*ELEMENT"") | EXPECT_EQ(diagnostic.entity_identity, ""10"") | EXPECT_EQ(diagnostic.message, ""Element stiffness layout must match its declared runtime layout."") | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].code, ""invalid-assembly-dimensions"") | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].entity_identity, ""20"") | EXPECT_EQ(first.DofLayout().node_indices, first_layout.node_indices) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, original_pattern.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, original_pattern.column_indices) | EXPECT_TRUE(dofs.ValidateInvariants().IsOk())" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(candidate.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""invalid-assembly-layout"") | EXPECT_EQ(diagnostic.keyword, ""*ELEMENT"") | EXPECT_EQ(diagnostic.entity_identity, ""10"") | EXPECT_EQ(diagnostic.message, ""Element stiffness layout must match its declared runtime layout."") | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].code, ""invalid-assembly-dimensions"") | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].entity_identity, ""20"") | EXPECT_EQ(first.DofLayout().node_indices, first_layout.node_indices) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, original_pattern.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, original_pattern.column_indices) | EXPECT_TRUE(dofs.ValidateInvariants().IsOk())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/sparse_assembler_test.cpp support@1-234 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, MakeShellDefinition, if, DirectShellStiffness, AssembleShell, T, ByteIdentical, Entry, ReverseParallelFor, FakeStiffnessElement, ReturnLayout, MatrixFromRows, ExpectByteIdentical tests/unit/assembly/sparse_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 12c7014b00e0a996d4b63688b2f04f6fb4abb4e9816b9f607afa9e2219a057a0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/sparse_assembler_test.cpp support@477-478 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/assembly/sparse_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/surface_pressure_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/assembly/surface_pressure_assembler_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 65b0c1bd703fc7bafdbd8200cf61935a039da6b80295f0ddee35027d2cf2dc78 65b0c1bd703fc7bafdbd8200cf61935a039da6b80295f0ddee35027d2cf2dc78 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder; assertion 12개 tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder 유지 원문 검사 body 및 assertion 동일. 61ec658b973ff4f2a3c4dc06cd90c2b4dd2b5ac5d323c41996fcea64dd0375c7 61ec658b973ff4f2a3c4dc06cd90c2b4dd2b5ac5d323c41996fcea64dd0375c7 ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().diagnostics.empty()) | ASSERT_EQ(result.Value().full_external_force.Size(), 24U) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 2U], -0.5) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 5U], 0.0) | EXPECT_EQ(result.Value().full_external_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().full_external_tangent.Columns(), 24U) | EXPECT_EQ(value, 0.0) ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().diagnostics.empty()) | ASSERT_EQ(result.Value().full_external_force.Size(), 24U) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 2U], -0.5) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 3U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 4U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[offset + 5U], 0.0) | EXPECT_EQ(result.Value().full_external_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().full_external_tangent.Columns(), 24U) | EXPECT_EQ(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce; assertion 2개 tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce 유지 원문 검사 body 및 assertion 동일. 8fdc8dc50f731553ae45c3c08e921158c7ddc9dd639562d30ea5261e09ad46d8 8fdc8dc50f731553ae45c3c08e921158c7ddc9dd639562d30ea5261e09ad46d8 ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[node * 6U + 2U], -1.0) ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(result.Value().full_external_force[node * 6U + 2U], -1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation; assertion 8개 tests/unit/assembly/surface_pressure_assembler_test.cpp SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation 유지 원문 검사 body 및 assertion 동일. 48444c6f2917e44301611c69abf5fe3192dddea0f8bd5491faa6798a1b1ee682 48444c6f2917e44301611c69abf5fe3192dddea0f8bd5491faa6798a1b1ee682 ASSERT_TRUE(serial_result.HasValue()) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_EQ(Values(serial_result.Value().full_external_force), Values(parallel_result.Value().full_external_force)) | EXPECT_EQ(serial_result.Value().full_external_tangent.RowOffsets(), parallel_result.Value().full_external_tangent.RowOffsets()) | EXPECT_EQ(serial_result.Value().full_external_tangent.ColumnIndices(), parallel_result.Value().full_external_tangent.ColumnIndices()) | EXPECT_EQ(serial_result.Value().full_external_tangent.Values(), parallel_result.Value().full_external_tangent.Values()) | EXPECT_TRUE(serial_result.Value().diagnostics.empty()) | EXPECT_TRUE(parallel_result.Value().diagnostics.empty()) ASSERT_TRUE(serial_result.HasValue()) | ASSERT_TRUE(parallel_result.HasValue()) | EXPECT_EQ(Values(serial_result.Value().full_external_force), Values(parallel_result.Value().full_external_force)) | EXPECT_EQ(serial_result.Value().full_external_tangent.RowOffsets(), parallel_result.Value().full_external_tangent.RowOffsets()) | EXPECT_EQ(serial_result.Value().full_external_tangent.ColumnIndices(), parallel_result.Value().full_external_tangent.ColumnIndices()) | EXPECT_EQ(serial_result.Value().full_external_tangent.Values(), parallel_result.Value().full_external_tangent.Values()) | EXPECT_TRUE(serial_result.Value().diagnostics.empty()) | EXPECT_TRUE(parallel_result.Value().diagnostics.empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/assembly/surface_pressure_assembler_test.cpp support@1-122 helper/oracle/fixture/include/static assertion 구간: PressureFixture, MakeFixture, if, Values tests/unit/assembly/surface_pressure_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 212fb026f9860fa82917c9a2a8e06c719b1338a414784431d36b14ce79330338 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/thermal_assembler_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/assembly/thermal_assembler_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bcac60bb3167ad3e6ec2d45f9ee08c7535bb121f71cae21a7cac9053440ec25a bcac60bb3167ad3e6ec2d45f9ee08c7535bb121f71cae21a7cac9053440ec25a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.HandAssemblyPreservesSharedStationsMaterialOffsetAndThicknessJump ThermalAssembler.HandAssemblyPreservesSharedStationsMaterialOffsetAndThicknessJump; assertion 12개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.HandAssemblyPreservesSharedStationsMaterialOffsetAndThicknessJump 유지 원문 검사 body 및 assertion 동일. 2b58c82002dcecc533fba0030b665848e18c223902521a1e83fd2a87d742cb62 2b58c82002dcecc533fba0030b665848e18c223902521a1e83fd2a87d742cb62 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_EQ(assembled.Value().Conductivity().Rows(), 30U) | EXPECT_LE(std::abs(k(i, j) - expected.k(i, j)), ek(i, j) + gamma * expected.pk(i, j)) | EXPECT_LE(std::abs(c(i, j) - expected.c(i, j)), ec(i, j) + gamma * expected.pc(i, j)) | EXPECT_EQ(domain.Value().ThermalElements()[0].MaterialIndex(), 1U) | EXPECT_EQ(domain.Value().ThermalElements()[1].MaterialIndex(), 2U) | EXPECT_EQ(assembled.Value().ElementOrder(), (std::vector{0, 1})) | EXPECT_EQ(assembled.Value().Kernels()[0].SourceId().source_label_text, ""0009"") | EXPECT_EQ(assembled.Value().Scatters()[0][5 + a], assembled.Value().Scatters()[1][a])" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(assembled.HasValue()) | ASSERT_EQ(assembled.Value().Conductivity().Rows(), 30U) | EXPECT_LE(std::abs(k(i, j) - expected.k(i, j)), ek(i, j) + gamma * expected.pk(i, j)) | EXPECT_LE(std::abs(c(i, j) - expected.c(i, j)), ec(i, j) + gamma * expected.pc(i, j)) | EXPECT_EQ(domain.Value().ThermalElements()[0].MaterialIndex(), 1U) | EXPECT_EQ(domain.Value().ThermalElements()[1].MaterialIndex(), 2U) | EXPECT_EQ(assembled.Value().ElementOrder(), (std::vector{0, 1})) | EXPECT_EQ(assembled.Value().Kernels()[0].SourceId().source_label_text, ""0009"") | EXPECT_EQ(assembled.Value().Scatters()[0][5 + a], assembled.Value().Scatters()[1][a])" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SourceRowHeatInputRetainsPrescribedSignedDuplicateContributions ThermalAssembler.SourceRowHeatInputRetainsPrescribedSignedDuplicateContributions; assertion 15개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SourceRowHeatInputRetainsPrescribedSignedDuplicateContributions 유지 원문 검사 body 및 assertion 동일. 17db9c94e9a588ae74c5f1a31a66d769b4b99a42263a1a0e04de71a3a1d53b0a 17db9c94e9a588ae74c5f1a31a66d769b4b99a42263a1a0e04de71a3a1d53b0a ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.Value().FreeEquation(full).has_value()) | EXPECT_EQ(result.Value().HeatInput()[full], 5.) | EXPECT_EQ(result.Value().HeatInput()[4], -7.) | EXPECT_GE(result.Value().HeatInputError()[full], 1.) | EXPECT_EQ(result.Value().HeatInput()[i], 0.) | EXPECT_EQ(result.Value().HeatInputError()[i], 0.) | ASSERT_TRUE(second_domain.HasValue()) | ASSERT_TRUE(second_model.HasValue()) | ASSERT_TRUE(second_dofs.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().HeatInput()[full], 6.) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.Value().FreeEquation(full).has_value()) | EXPECT_EQ(result.Value().HeatInput()[full], 5.) | EXPECT_EQ(result.Value().HeatInput()[4], -7.) | EXPECT_GE(result.Value().HeatInputError()[full], 1.) | EXPECT_EQ(result.Value().HeatInput()[i], 0.) | EXPECT_EQ(result.Value().HeatInputError()[i], 0.) | ASSERT_TRUE(second_domain.HasValue()) | ASSERT_TRUE(second_model.HasValue()) | ASSERT_TRUE(second_dofs.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().HeatInput()[full], 6.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SerialAndActualTbbOperatorsBoundsAndFluxAreBitwiseEqual ThermalAssembler.SerialAndActualTbbOperatorsBoundsAndFluxAreBitwiseEqual; assertion 11개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.SerialAndActualTbbOperatorsBoundsAndFluxAreBitwiseEqual 유지 원문 검사 body 및 assertion 동일. 7083d3f901965e28ae9783d436dcef27b2622cb304a5b6631c6081a6656a27e3 7083d3f901965e28ae9783d436dcef27b2622cb304a5b6631c6081a6656a27e3 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Conductivity().RowOffsets(), parallel.Value().Conductivity().RowOffsets()) | EXPECT_EQ(serial.Value().Conductivity().ColumnIndices(), parallel.Value().Conductivity().ColumnIndices()) | EXPECT_EQ( std::memcmp(serial.Value().HeatInput().Data(), parallel.Value().HeatInput().Data(), 30 * sizeof(double)), 0) | ASSERT_TRUE(sf.HasValue()) | ASSERT_TRUE(pf.HasValue()) | EXPECT_EQ( std::memcmp(sf.Value()[e][r].Components().data(), pf.Value()[e][r].Components().data(), 3 * sizeof(double)), 0) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Conductivity().RowOffsets(), parallel.Value().Conductivity().RowOffsets()) | EXPECT_EQ(serial.Value().Conductivity().ColumnIndices(), parallel.Value().Conductivity().ColumnIndices()) | EXPECT_EQ( std::memcmp(serial.Value().HeatInput().Data(), parallel.Value().HeatInput().Data(), 30 * sizeof(double)), 0) | ASSERT_TRUE(sf.HasValue()) | ASSERT_TRUE(pf.HasValue()) | EXPECT_EQ( std::memcmp(sf.Value()[e][r].Components().data(), pf.Value()[e][r].Components().data(), 3 * sizeof(double)), 0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.DisconnectedComponentsHaveNoCrossBlockEntries ThermalAssembler.DisconnectedComponentsHaveNoCrossBlockEntries; assertion 6개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.DisconnectedComponentsHaveNoCrossBlockEntries 유지 원문 검사 body 및 assertion 동일. 18403e156469c7c5012f27a63e4d9f13d4a7cef5d14cf64fb3c66e8b2b461fd9 18403e156469c7c5012f27a63e4d9f13d4a7cef5d14cf64fb3c66e8b2b461fd9 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(matrix.Rows(), 40U) | EXPECT_EQ(row < 20, matrix.ColumnIndices()[p] < 20) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(matrix.Rows(), 40U) | EXPECT_EQ(row < 20, matrix.ColumnIndices()[p] < 20) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.RejectsWrongProfilesPartitionsAndNonfiniteAccumulation ThermalAssembler.RejectsWrongProfilesPartitionsAndNonfiniteAccumulation; assertion 11개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.RejectsWrongProfilesPartitionsAndNonfiniteAccumulation 유지 원문 검사 body 및 assertion 동일. 17b959b03e9990bb95823d4e571e8e027d95babe4d8e5f02400d920e12e24961 17b959b03e9990bb95823d4e571e8e027d95babe4d8e5f02400d920e12e24961 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), fesa::DofManager{}, fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other_model.HasValue()) | ASSERT_TRUE(other_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), other_dofs.Value(), fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(overflow_domain.HasValue()) | ASSERT_TRUE(overflow_model.HasValue()) | ASSERT_TRUE(overflow_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(overflow_model.Value(), overflow_dofs.Value(), fesa::TbbParallelFor{}) .HasValue()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), fesa::DofManager{}, fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(other_domain.HasValue()) | ASSERT_TRUE(other_model.HasValue()) | ASSERT_TRUE(other_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(model.Value(), other_dofs.Value(), fesa::SerialParallelFor{}) .HasValue()) | ASSERT_TRUE(overflow_domain.HasValue()) | ASSERT_TRUE(overflow_model.HasValue()) | ASSERT_TRUE(overflow_dofs.HasValue()) | EXPECT_FALSE(fesa::AssembleThermal(overflow_model.Value(), overflow_dofs.Value(), fesa::TbbParallelFor{}) .HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.ParallelKernelFailuresSelectStableSourceElement ThermalAssembler.ParallelKernelFailuresSelectStableSourceElement; assertion 7개 tests/unit/assembly/thermal_assembler_test.cpp ThermalAssembler.ParallelKernelFailuresSelectStableSourceElement 유지 원문 검사 body 및 assertion 동일. 705c5cdaa64861e8c3cdc7f638eb3bbc8d6d8bb25de3e78dec00674cb5bee2f4 705c5cdaa64861e8c3cdc7f638eb3bbc8d6d8bb25de3e78dec00674cb5bee2f4 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_FALSE(serial.HasValue()) | ASSERT_FALSE(parallel.HasValue()) | EXPECT_EQ(serial.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"") | EXPECT_EQ(parallel.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_FALSE(serial.HasValue()) | ASSERT_FALSE(parallel.HasValue()) | EXPECT_EQ(serial.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"") | EXPECT_EQ(parallel.GetStatus().Diagnostics()[0].entity_identity, ""plate:0009"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/assembly/thermal_assembler_test.cpp support@1-117 helper/oracle/fixture/include/static assertion 구간: Model, Dense, ExpectedMatrices, Expected, SameBits tests/unit/assembly/thermal_assembler_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b3e9525aaced1be323ec738ea9213a2323dd745f550425b6a612fa09fa176d50 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/build_info_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/build_info_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8bf9bfef45c45c9a09e0a0f98ee4cc38316e2550894c6e27ca599fdd650298b8 8bf9bfef45c45c9a09e0a0f98ee4cc38316e2550894c6e27ca599fdd650298b8 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/build_info_test.cpp BuildInfo.VersionIsStableAndNonEmpty BuildInfo.VersionIsStableAndNonEmpty; assertion 3개 tests/unit/build_info_test.cpp BuildInfo.VersionIsStableAndNonEmpty 유지 원문 검사 body 및 assertion 동일. 0cb8bda21730c82347550102836f3bade449b4c590aa77348381f5066c040bd0 0cb8bda21730c82347550102836f3bade449b4c590aa77348381f5066c040bd0 "EXPECT_FALSE(first.empty()) | EXPECT_EQ(first, second) | EXPECT_TRUE(std::regex_match(std::string(first), std::regex{R""(^[0-9]+\.[0-9]+\.[0-9]+$)""}))" "EXPECT_FALSE(first.empty()) | EXPECT_EQ(first, second) | EXPECT_TRUE(std::regex_match(std::string(first), std::regex{R""(^[0-9]+\.[0-9]+\.[0-9]+$)""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/build_info_test.cpp BuildInfo.PublicHeaderHasNoBackendDependency BuildInfo.PublicHeaderHasNoBackendDependency; assertion 0개 tests/unit/build_info_test.cpp BuildInfo.PublicHeaderHasNoBackendDependency 유지 원문 검사 body 및 assertion 동일. 918ff7cf6a6f923c243045921b33a38cf1e94cfc73a2247b7fac6ac76ecc09a8 918ff7cf6a6f923c243045921b33a38cf1e94cfc73a2247b7fac6ac76ecc09a8 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/build_info_test.cpp support@1-9 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/build_info_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c574474e8a7db434a18523c880adfe46ee608d4109b4dffa1ea623ef3c291ac5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/constraints/boundary_condition_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/constraints/boundary_condition_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b5ff07b5925aab743568eff705c8827f7186889ad15541e90d2ed9fe6998ce79 b5ff07b5925aab743568eff705c8827f7186889ad15541e90d2ed9fe6998ce79 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase; assertion 8개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase 유지 원문 검사 body 및 assertion 동일. 8a449e3e0a082370655dda3bce51393da93ba796aac899f07b22572bffcc239d 8a449e3e0a082370655dda3bce51393da93ba796aac899f07b22572bffcc239d ASSERT_TRUE(definitions.HasValue()) | ASSERT_EQ(definitions.Value().size(), 2U) | EXPECT_EQ(definitions.Value()[0U].source_order, 4U) | EXPECT_EQ(definitions.Value()[0U].full_dof_index, 8U) | EXPECT_DOUBLE_EQ(definitions.Value()[0U].prescribed_value, 2.5) | EXPECT_EQ(definitions.Value()[1U].source_order, 4U) | EXPECT_EQ(definitions.Value()[1U].full_dof_index, 2U) | EXPECT_DOUBLE_EQ(definitions.Value()[1U].prescribed_value, 2.5) ASSERT_TRUE(definitions.HasValue()) | ASSERT_EQ(definitions.Value().size(), 2U) | EXPECT_EQ(definitions.Value()[0U].source_order, 4U) | EXPECT_EQ(definitions.Value()[0U].full_dof_index, 8U) | EXPECT_DOUBLE_EQ(definitions.Value()[0U].prescribed_value, 2.5) | EXPECT_EQ(definitions.Value()[1U].source_order, 4U) | EXPECT_EQ(definitions.Value()[1U].full_dof_index, 2U) | EXPECT_DOUBLE_EQ(definitions.Value()[1U].prescribed_value, 2.5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably; assertion 10개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably 유지 원문 검사 body 및 assertion 동일. ccb7ed25f7f922616192d64201aa0dd2e02b20fc5f8c7e0b71b99921adff83f8 ccb7ed25f7f922616192d64201aa0dd2e02b20fc5f8c7e0b71b99921adff83f8 ASSERT_EQ(boundaries.size(), 2U) | EXPECT_EQ(fixture.model->ActiveBoundaryConditions(), (std::vector{0U, 1U})) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(first.Value()[0U].source_order, 0U) | EXPECT_EQ(first.Value()[0U].full_dof_index, 6U) | EXPECT_EQ(second.Value()[0U].source_order, 1U) | EXPECT_EQ(second.Value()[0U].full_dof_index, 7U) | EXPECT_DOUBLE_EQ(first.Value()[0U].prescribed_value, 1.25) | EXPECT_DOUBLE_EQ(second.Value()[0U].prescribed_value, 1.25) ASSERT_EQ(boundaries.size(), 2U) | EXPECT_EQ(fixture.model->ActiveBoundaryConditions(), (std::vector{0U, 1U})) | ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(first.Value()[0U].source_order, 0U) | EXPECT_EQ(first.Value()[0U].full_dof_index, 6U) | EXPECT_EQ(second.Value()[0U].source_order, 1U) | EXPECT_EQ(second.Value()[0U].full_dof_index, 7U) | EXPECT_DOUBLE_EQ(first.Value()[0U].prescribed_value, 1.25) | EXPECT_DOUBLE_EQ(second.Value()[0U].prescribed_value, 1.25) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit; assertion 1개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit 유지 원문 검사 body 및 assertion 동일. 0777dfa7d90a00f5b781ac55fbcd26140ce971f90872e5d827092036852f2a74 0777dfa7d90a00f5b781ac55fbcd26140ce971f90872e5d827092036852f2a74 ASSERT_TRUE( fixture.dofs->Build(*fixture.model, elements, {std::cref(initial)}) .IsOk()) ASSERT_TRUE( fixture.dofs->Build(*fixture.model, elements, {std::cref(initial)}) .IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions; assertion 1개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions 유지 원문 검사 body 및 assertion 동일. 55ca5cd284184aa80c4d75cdced2736d1dedf3ee376f11277ff7ce933d8b1ba7 55ca5cd284184aa80c4d75cdced2736d1dedf3ee376f11277ff7ce933d8b1ba7 ASSERT_TRUE(status.IsOk()) ASSERT_TRUE(status.IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue; assertion 3개 tests/unit/constraints/boundary_condition_test.cpp BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue 유지 원문 검사 body 및 assertion 동일. 365ded0ccec2ef519edcd4c018361f02600a7e9ad1cf3964445965e9828e3a4a 365ded0ccec2ef519edcd4c018361f02600a7e9ad1cf3964445965e9828e3a4a "ASSERT_FALSE(result.HasValue()) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""nonfinite-prescribed-value"")" "ASSERT_FALSE(result.HasValue()) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""nonfinite-prescribed-value"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/boundary_condition_test.cpp support@1-104 helper/oracle/fixture/include/static assertion 구간: BoundaryFixture, FakeBoundaryCondition, ExpectFailureCode, ExpectCandidate tests/unit/constraints/boundary_condition_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7f03c2fa0d373d6420b1c18029f29a429ed75303d12a175e71a3ce669882c48a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/constraints/essential_constraints_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/constraints/essential_constraints_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3bbaa9486249cbfa5978af50408dc25eab1164fe110ebec87ea7f60f2019353a 3bbaa9486249cbfa5978af50408dc25eab1164fe110ebec87ea7f60f2019353a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ExtractsHandComputedBlocksInStableOrder EssentialConstraints.ExtractsHandComputedBlocksInStableOrder; assertion 18개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ExtractsHandComputedBlocksInStableOrder 유지 원문 검사 body 및 assertion 동일. 674065ab604b3a41a09e73738260e57022bc1c90af16f0d1ff822a3fe000a923 674065ab604b3a41a09e73738260e57022bc1c90af16f0d1ff822a3fe000a923 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(blocks.k_ff.RowOffsets(), (std::vector{0U, 4U, 8U, 12U, 16U})) | EXPECT_EQ(blocks.k_ff.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_ff.Values(), (std::vector{1.0, 3.0, 4.0, 6.0, 21.0, 23.0, 24.0, 26.0, 31.0, 33.0, 34.0, 36.0, 51.0, 53.0, 54.0, 56.0})) | EXPECT_EQ(blocks.k_fc.RowOffsets(), (std::vector{0U, 2U, 4U, 6U, 8U})) | EXPECT_EQ(blocks.k_fc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U, 0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_fc.Values(), (std::vector{2.0, 5.0, 22.0, 0.0, 32.0, 35.0, 52.0, 55.0})) | EXPECT_EQ(blocks.k_cf.RowOffsets(), (std::vector{0U, 4U, 8U})) | EXPECT_EQ(blocks.k_cf.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_cf.Values(), (std::vector{11.0, 13.0, 14.0, 16.0, 41.0, 43.0, 44.0, 46.0})) | EXPECT_EQ(blocks.k_cc.RowOffsets(), (std::vector{0U, 2U, 4U})) | EXPECT_EQ(blocks.k_cc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_cc.Values(), (std::vector{12.0, 15.0, 42.0, 45.0})) | EXPECT_EQ(blocks.k_fc.Values()[3U], 0.0) | EXPECT_TRUE(blocks.k_ff.Validate().IsOk()) | EXPECT_TRUE(blocks.k_fc.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cf.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cc.Validate().IsOk()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(blocks.k_ff.RowOffsets(), (std::vector{0U, 4U, 8U, 12U, 16U})) | EXPECT_EQ(blocks.k_ff.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_ff.Values(), (std::vector{1.0, 3.0, 4.0, 6.0, 21.0, 23.0, 24.0, 26.0, 31.0, 33.0, 34.0, 36.0, 51.0, 53.0, 54.0, 56.0})) | EXPECT_EQ(blocks.k_fc.RowOffsets(), (std::vector{0U, 2U, 4U, 6U, 8U})) | EXPECT_EQ(blocks.k_fc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U, 0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_fc.Values(), (std::vector{2.0, 5.0, 22.0, 0.0, 32.0, 35.0, 52.0, 55.0})) | EXPECT_EQ(blocks.k_cf.RowOffsets(), (std::vector{0U, 4U, 8U})) | EXPECT_EQ(blocks.k_cf.ColumnIndices(), (std::vector{0U, 1U, 2U, 3U, 0U, 1U, 2U, 3U})) | EXPECT_EQ( blocks.k_cf.Values(), (std::vector{11.0, 13.0, 14.0, 16.0, 41.0, 43.0, 44.0, 46.0})) | EXPECT_EQ(blocks.k_cc.RowOffsets(), (std::vector{0U, 2U, 4U})) | EXPECT_EQ(blocks.k_cc.ColumnIndices(), (std::vector{0U, 1U, 0U, 1U})) | EXPECT_EQ(blocks.k_cc.Values(), (std::vector{12.0, 15.0, 42.0, 45.0})) | EXPECT_EQ(blocks.k_fc.Values()[3U], 0.0) | EXPECT_TRUE(blocks.k_ff.Validate().IsOk()) | EXPECT_TRUE(blocks.k_fc.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cf.Validate().IsOk()) | EXPECT_TRUE(blocks.k_cc.Validate().IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.HandlesNoAllAndMixedConstraints EssentialConstraints.HandlesNoAllAndMixedConstraints; assertion 10개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.HandlesNoAllAndMixedConstraints 유지 원문 검사 body 및 assertion 동일. 66201f4cf9837297e77488d6cb0babc1c5dd36934af64abe3b39cf85b4865cfd 66201f4cf9837297e77488d6cb0babc1c5dd36934af64abe3b39cf85b4865cfd ASSERT_TRUE(none.HasValue()) | EXPECT_EQ(none.Value().k_ff.Values(), full.Values()) | ASSERT_TRUE(all.HasValue()) | EXPECT_EQ(all.Value().k_cc.Values(), full.Values()) | ASSERT_TRUE(empty_rhs.HasValue()) | EXPECT_EQ(empty_rhs.Value().Size(), 0U) | ASSERT_TRUE(full_rhs.HasValue()) | EXPECT_EQ(full_rhs.Value()[i], static_cast(i) - 2.0) | EXPECT_EQ(full_load[i], static_cast(i) - 2.0) | ASSERT_TRUE(mixed.HasValue()) ASSERT_TRUE(none.HasValue()) | EXPECT_EQ(none.Value().k_ff.Values(), full.Values()) | ASSERT_TRUE(all.HasValue()) | EXPECT_EQ(all.Value().k_cc.Values(), full.Values()) | ASSERT_TRUE(empty_rhs.HasValue()) | EXPECT_EQ(empty_rhs.Value().Size(), 0U) | ASSERT_TRUE(full_rhs.HasValue()) | EXPECT_EQ(full_rhs.Value()[i], static_cast(i) - 2.0) | EXPECT_EQ(full_load[i], static_cast(i) - 2.0) | ASSERT_TRUE(mixed.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips; assertion 7개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips 유지 원문 검사 body 및 assertion 동일. c943e0be6dafdad411e9dc5b075259ff93ba3d6edad1aac44186128b70255f2f c943e0be6dafdad411e9dc5b075259ff93ba3d6edad1aac44186128b70255f2f ASSERT_TRUE(none.HasValue()) | ASSERT_TRUE(mixed.HasValue()) | ASSERT_EQ(mixed_reconstructed.Size(), mixed_full.Size()) | EXPECT_DOUBLE_EQ(mixed_reconstructed[index], mixed_full[index]) | ASSERT_TRUE(all.HasValue()) | ASSERT_EQ(all_reconstructed.Size(), 24U) | EXPECT_DOUBLE_EQ(all_reconstructed[node * 6U + component], node + 1.0) ASSERT_TRUE(none.HasValue()) | ASSERT_TRUE(mixed.HasValue()) | ASSERT_EQ(mixed_reconstructed.Size(), mixed_full.Size()) | EXPECT_DOUBLE_EQ(mixed_reconstructed[index], mixed_full[index]) | ASSERT_TRUE(all.HasValue()) | ASSERT_EQ(all_reconstructed.Size(), 24U) | EXPECT_DOUBLE_EQ(all_reconstructed[node * 6U + component], node + 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ReconstructsNonzeroPrescribedValues EssentialConstraints.ReconstructsNonzeroPrescribedValues; assertion 12개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.ReconstructsNonzeroPrescribedValues 유지 원문 검사 body 및 assertion 동일. 38aa54591420c254c738c4a4c26e333f8bfdf17f2f7e937f55b241729d5668fb 38aa54591420c254c738c4a4c26e333f8bfdf17f2f7e937f55b241729d5668fb EXPECT_EQ(free.Size(), 4U) | EXPECT_DOUBLE_EQ(free[0U], 10.0) | EXPECT_DOUBLE_EQ(free[1U], 20.0) | EXPECT_DOUBLE_EQ(free[2U], 30.0) | EXPECT_DOUBLE_EQ(free[3U], 40.0) | EXPECT_EQ(constrained.Size(), 2U) | EXPECT_DOUBLE_EQ(constrained[0U], 2.5) | EXPECT_DOUBLE_EQ(constrained[1U], -3.25) | EXPECT_EQ(constrained[0U], dofs.PrescribedValues()[0U]) | EXPECT_EQ(constrained[1U], dofs.PrescribedValues()[1U]) | ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) EXPECT_EQ(free.Size(), 4U) | EXPECT_DOUBLE_EQ(free[0U], 10.0) | EXPECT_DOUBLE_EQ(free[1U], 20.0) | EXPECT_DOUBLE_EQ(free[2U], 30.0) | EXPECT_DOUBLE_EQ(free[3U], 40.0) | EXPECT_EQ(constrained.Size(), 2U) | EXPECT_DOUBLE_EQ(constrained[0U], 2.5) | EXPECT_DOUBLE_EQ(constrained[1U], -3.25) | EXPECT_EQ(constrained[0U], dofs.PrescribedValues()[0U]) | EXPECT_EQ(constrained[1U], dofs.PrescribedValues()[1U]) | ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.RejectsDimensionOrOrderMismatch EssentialConstraints.RejectsDimensionOrOrderMismatch; assertion 9개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.RejectsDimensionOrOrderMismatch 유지 원문 검사 body 및 assertion 동일. fc0cc64c86498e9c8468b6ad373ac9e32ec0bca9361615ae3f974df070dab2cf fc0cc64c86498e9c8468b6ad373ac9e32ec0bca9361615ae3f974df070dab2cf "ASSERT_FALSE(wrong_dimension.HasValue()) | EXPECT_EQ(wrong_dimension.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(wrong_dimension.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(wrong_dimension.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | ASSERT_FALSE(wrong_order.HasValue()) | EXPECT_EQ(wrong_order.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | EXPECT_THROW(static_cast(policy.GatherFree(fesa::Vector{5U}, dofs)), std::invalid_argument) | EXPECT_THROW( static_cast(policy.GatherConstrained(fesa::Vector{7U}, dofs)), std::invalid_argument) | EXPECT_THROW(static_cast(policy.ReconstructFull( fesa::Vector{4U}, fesa::Vector{2U}, dofs)), std::invalid_argument)" "ASSERT_FALSE(wrong_dimension.HasValue()) | EXPECT_EQ(wrong_dimension.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(wrong_dimension.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(wrong_dimension.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | ASSERT_FALSE(wrong_order.HasValue()) | EXPECT_EQ(wrong_order.GetStatus().Diagnostics()[0U].code, ""invalid-constraint-dimensions"") | EXPECT_THROW(static_cast(policy.GatherFree(fesa::Vector{5U}, dofs)), std::invalid_argument) | EXPECT_THROW( static_cast(policy.GatherConstrained(fesa::Vector{7U}, dofs)), std::invalid_argument) | EXPECT_THROW(static_cast(policy.ReconstructFull( fesa::Vector{4U}, fesa::Vector{2U}, dofs)), std::invalid_argument)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.PreservesEliminationFailureOrderAndInputs EssentialConstraints.PreservesEliminationFailureOrderAndInputs; assertion 21개 tests/unit/constraints/essential_constraints_test.cpp EssentialConstraints.PreservesEliminationFailureOrderAndInputs 유지 원문 검사 body 및 assertion 동일. 2cd3ea3170fd9e953bf747f537da7b235dd883641fd23782365bd8b11c4a9b76 2cd3ea3170fd9e953bf747f537da7b235dd883641fd23782365bd8b11c4a9b76 "ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].code, ""invalid-load-dimensions"") | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].entity_identity, ""full-load:0"") | EXPECT_EQ(load[0U], std::numeric_limits::infinity()) | EXPECT_EQ(prescribed[0U], std::numeric_limits::infinity()) | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(candidate.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""nonfinite-load-accumulation"") | EXPECT_EQ(diagnostic.keyword, ""LOAD_ASSEMBLER"") | EXPECT_EQ(diagnostic.entity_identity, ""0"") | EXPECT_TRUE(diagnostic.location.file.empty()) | EXPECT_EQ(diagnostic.location.line, 0U) | EXPECT_EQ(diagnostic.message, ""Kfc times prescribed displacement produced a nonfinite row sum."") | EXPECT_EQ(load[0U], 7.0) | EXPECT_EQ(prescribed[0U], 2.0) | EXPECT_EQ(prescribed[1U], 1.0) | EXPECT_EQ(kfc.Values(), original_values) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, original_pattern.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, original_pattern.column_indices)" "ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].code, ""invalid-load-dimensions"") | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].entity_identity, ""full-load:0"") | EXPECT_EQ(load[0U], std::numeric_limits::infinity()) | EXPECT_EQ(prescribed[0U], std::numeric_limits::infinity()) | ASSERT_FALSE(candidate.HasValue()) | EXPECT_EQ(candidate.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(candidate.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""nonfinite-load-accumulation"") | EXPECT_EQ(diagnostic.keyword, ""LOAD_ASSEMBLER"") | EXPECT_EQ(diagnostic.entity_identity, ""0"") | EXPECT_TRUE(diagnostic.location.file.empty()) | EXPECT_EQ(diagnostic.location.line, 0U) | EXPECT_EQ(diagnostic.message, ""Kfc times prescribed displacement produced a nonfinite row sum."") | EXPECT_EQ(load[0U], 7.0) | EXPECT_EQ(prescribed[0U], 2.0) | EXPECT_EQ(prescribed[1U], 1.0) | EXPECT_EQ(kfc.Values(), original_values) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, original_pattern.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, original_pattern.column_indices)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/constraints/essential_constraints_test.cpp support@1-120 helper/oracle/fixture/include/static assertion 구간: MakeDofs, MakeShellSizedDofs, MakeMatrix, SequentialDense, ExpectShape tests/unit/constraints/essential_constraints_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2aa63d265a44ca55310a67dcb59609d01f78e09129c32e6b6803b57e69d43fd2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/constraints/essential_constraints_test.cpp support@215-216 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/constraints/essential_constraints_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f6c2b9c304b34fa866abe406a7be1ab65a57b15b93aee4428636ed4eaa067081 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/ascii_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/core/ascii_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 25872dbd7f04fbdb796adecf712db87424f628615095e50d25e86d7ff05d70f1 25872dbd7f04fbdb796adecf712db87424f628615095e50d25e86d7ff05d70f1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/ascii_test.cpp Ascii.LowercasesOnlyAsciiUppercaseBytes Ascii.LowercasesOnlyAsciiUppercaseBytes; assertion 5개 tests/unit/core/ascii_test.cpp Ascii.LowercasesOnlyAsciiUppercaseBytes 유지 원문 검사 body 및 assertion 동일. 909d024cf51f4c78bfbfbc0f844a4deb4d7995a1359e245bab03859c6a3f9dde 909d024cf51f4c78bfbfbc0f844a4deb4d7995a1359e245bab03859c6a3f9dde EXPECT_EQ(fesa::AsciiLower('A'), 'a') | EXPECT_EQ(fesa::AsciiLower('Z'), 'z') | EXPECT_EQ(fesa::AsciiLower('a'), 'a') | EXPECT_EQ(fesa::AsciiLower('0'), '0') | EXPECT_EQ(fesa::AsciiLower(non_ascii), non_ascii) EXPECT_EQ(fesa::AsciiLower('A'), 'a') | EXPECT_EQ(fesa::AsciiLower('Z'), 'z') | EXPECT_EQ(fesa::AsciiLower('a'), 'a') | EXPECT_EQ(fesa::AsciiLower('0'), '0') | EXPECT_EQ(fesa::AsciiLower(non_ascii), non_ascii) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/ascii_test.cpp Ascii.UppercaseCanonicalizationPreservesEveryOtherByteAndSourceText Ascii.UppercaseCanonicalizationPreservesEveryOtherByteAndSourceText; assertion 4개 tests/unit/core/ascii_test.cpp Ascii.UppercaseCanonicalizationPreservesEveryOtherByteAndSourceText 유지 원문 검사 body 및 assertion 동일. cdbafc80172cdd5acbf25b80444b88d1c4f7f6a62716326cee28890c42d7bab8 cdbafc80172cdd5acbf25b80444b88d1c4f7f6a62716326cee28890c42d7bab8 "EXPECT_EQ(fesa::AsciiUppercase(source), expected) | EXPECT_EQ(source, original) | EXPECT_TRUE(fesa::AsciiUppercase("""").empty()) | EXPECT_EQ(fesa::AsciiUppercase(""Shell-01""), ""SHELL-01"")" "EXPECT_EQ(fesa::AsciiUppercase(source), expected) | EXPECT_EQ(source, original) | EXPECT_TRUE(fesa::AsciiUppercase("""").empty()) | EXPECT_EQ(fesa::AsciiUppercase(""Shell-01""), ""SHELL-01"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/ascii_test.cpp Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding; assertion 3개 tests/unit/core/ascii_test.cpp Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding 유지 원문 검사 body 및 assertion 동일. 3db876d5e00670ef938aa3f78a4b4841b4aa9eb02bf470d659053719c7a47c27 3db876d5e00670ef938aa3f78a4b4841b4aa9eb02bf470d659053719c7a47c27 "EXPECT_TRUE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""bEaM-1"")) | EXPECT_FALSE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""Beam-10"")) | EXPECT_FALSE( fesa::AsciiCaseInsensitiveEquals(uppercase_byte, lowercase_byte))" "EXPECT_TRUE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""bEaM-1"")) | EXPECT_FALSE(fesa::AsciiCaseInsensitiveEquals(""Beam-1"", ""Beam-10"")) | EXPECT_FALSE( fesa::AsciiCaseInsensitiveEquals(uppercase_byte, lowercase_byte))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/ascii_test.cpp Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels; assertion 11개 tests/unit/core/ascii_test.cpp Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels 유지 원문 검사 body 및 assertion 동일. 5770a5761723357706fadea333c7cf6c288511a29681077cb3f914cb4a236bf4 5770a5761723357706fadea333c7cf6c288511a29681077cb3f914cb4a236bf4 "ASSERT_TRUE(one.HasValue()) | EXPECT_EQ(one.Value(), 1) | ASSERT_TRUE(leading_zeroes.HasValue()) | EXPECT_EQ(leading_zeroes.Value(), 42) | ASSERT_TRUE(maximum.HasValue()) | EXPECT_EQ(maximum.Value(), (std::numeric_limits::max)()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-source-label"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].entity_identity, invalid)" "ASSERT_TRUE(one.HasValue()) | EXPECT_EQ(one.Value(), 1) | ASSERT_TRUE(leading_zeroes.HasValue()) | EXPECT_EQ(leading_zeroes.Value(), 42) | ASSERT_TRUE(maximum.HasValue()) | EXPECT_EQ(maximum.Value(), (std::numeric_limits::max)()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-source-label"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].entity_identity, invalid)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/ascii_test.cpp support@1-9 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/core/ascii_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 92beb48f1d8771676e841d9c0e884cace86bb18b98dbe9a629f21fa1d9e0bc9e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/diagnostic_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/core/diagnostic_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 440becb7f8e8ffe6db9b32b757b08a56baea19da46808dc42c426e0f9edb14e5 440becb7f8e8ffe6db9b32b757b08a56baea19da46808dc42c426e0f9edb14e5 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/diagnostic_test.cpp CoreDiagnostics.DiagnosticsSortDeterministically CoreDiagnostics.DiagnosticsSortDeterministically; assertion 15개 tests/unit/core/diagnostic_test.cpp CoreDiagnostics.DiagnosticsSortDeterministically 유지 원문 검사 body 및 assertion 동일. 2f659a7cf12be1a5e3e0221806e86f389fb3992907f5bcb4d533d160bbeb90ab 2f659a7cf12be1a5e3e0221806e86f389fb3992907f5bcb4d533d160bbeb90ab "ASSERT_EQ(diagnostics.size(), 7U) | EXPECT_EQ(diagnostics[0].message, ""line"") | EXPECT_EQ(diagnostics[1].message, ""keyword"") | EXPECT_EQ(diagnostics[2].message, ""first-equal"") | EXPECT_EQ(diagnostics[3].message, ""second-equal"") | EXPECT_EQ(diagnostics[4].message, ""code-z"") | EXPECT_EQ(diagnostics[5].message, ""entity-2"") | EXPECT_EQ(diagnostics[6].message, ""file-b"") | EXPECT_EQ(exact.severity, fesa::Severity::kError) | EXPECT_EQ(exact.code, ""a"") | EXPECT_EQ(exact.location.file, std::filesystem::path{""a.inp""}) | EXPECT_EQ(exact.location.line, 3U) | EXPECT_EQ(exact.keyword, ""*NODE"") | EXPECT_EQ(exact.entity_identity, ""I.1"") | EXPECT_EQ(exact.message, ""first-equal"")" "ASSERT_EQ(diagnostics.size(), 7U) | EXPECT_EQ(diagnostics[0].message, ""line"") | EXPECT_EQ(diagnostics[1].message, ""keyword"") | EXPECT_EQ(diagnostics[2].message, ""first-equal"") | EXPECT_EQ(diagnostics[3].message, ""second-equal"") | EXPECT_EQ(diagnostics[4].message, ""code-z"") | EXPECT_EQ(diagnostics[5].message, ""entity-2"") | EXPECT_EQ(diagnostics[6].message, ""file-b"") | EXPECT_EQ(exact.severity, fesa::Severity::kError) | EXPECT_EQ(exact.code, ""a"") | EXPECT_EQ(exact.location.file, std::filesystem::path{""a.inp""}) | EXPECT_EQ(exact.location.line, 3U) | EXPECT_EQ(exact.keyword, ""*NODE"") | EXPECT_EQ(exact.entity_identity, ""I.1"") | EXPECT_EQ(exact.message, ""first-equal"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/diagnostic_test.cpp support@1-25 helper/oracle/fixture/include/static assertion 구간: MakeDiagnostic tests/unit/core/diagnostic_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ae3d439e5440487b75c91d95add36374b3f77363663cdc902e830a9174a669e9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/source_identity_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/core/source_identity_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a6ebba2d2f9e09be684e817e41b14b6572bcce0706d5114c8c8a88f6ac145746 a6ebba2d2f9e09be684e817e41b14b6572bcce0706d5114c8c8a88f6ac145746 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/source_identity_test.cpp CoreDiagnostics.SourceIdentityPreservesRawIdentity CoreDiagnostics.SourceIdentityPreservesRawIdentity; assertion 9개 tests/unit/core/source_identity_test.cpp CoreDiagnostics.SourceIdentityPreservesRawIdentity 유지 원문 검사 body 및 assertion 동일. f466209fca1d6d1f9aff769f37534515999cf4a71f1da756c95e007d1a1599c3 f466209fca1d6d1f9aff769f37534515999cf4a71f1da756c95e007d1a1599c3 "EXPECT_EQ(location.file, std::filesystem::path{""models/My Beam.inp""}) | EXPECT_EQ(location.line, 27U) | EXPECT_EQ(identity.instance_name, ""Beam-Instance_A"") | EXPECT_EQ(identity.source_label, 42) | EXPECT_EQ(identity.source_label_text, ""00042"") | EXPECT_TRUE(fesa::SourceIdentityEquals(identity, identity)) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""beam-instance_a"", std::int64_t{42}, ""00042""})) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""Beam-Instance_A"", std::int64_t{43}, ""00042""})) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""Beam-Instance_A"", std::int64_t{42}, ""42""}))" "EXPECT_EQ(location.file, std::filesystem::path{""models/My Beam.inp""}) | EXPECT_EQ(location.line, 27U) | EXPECT_EQ(identity.instance_name, ""Beam-Instance_A"") | EXPECT_EQ(identity.source_label, 42) | EXPECT_EQ(identity.source_label_text, ""00042"") | EXPECT_TRUE(fesa::SourceIdentityEquals(identity, identity)) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""beam-instance_a"", std::int64_t{42}, ""00042""})) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""Beam-Instance_A"", std::int64_t{43}, ""00042""})) | EXPECT_FALSE(fesa::SourceIdentityEquals( identity, {""Beam-Instance_A"", std::int64_t{42}, ""42""}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/source_identity_test.cpp support@1-8 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/core/source_identity_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d2c1c5608afd74a75014476a740b7734f890ded534eb9532ad90766dcc16b86a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/status_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/core/status_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3cae23bb04187b6d104c3575d24a87daee20f5c1779dfcfd762ef299105aea42 3cae23bb04187b6d104c3575d24a87daee20f5c1779dfcfd762ef299105aea42 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/core/status_test.cpp CoreDiagnostics.ResultOwnsCopyOnlyPayloadWithoutIntermediateCopy CoreDiagnostics.ResultOwnsCopyOnlyPayloadWithoutIntermediateCopy; assertion 6개 tests/unit/core/status_test.cpp CoreDiagnostics.ResultOwnsCopyOnlyPayloadWithoutIntermediateCopy 유지 원문 검사 body 및 assertion 동일. 4828a9334088aff80cefe803fbfa80e0e173be1980ffbf6a260696da95cf739c 4828a9334088aff80cefe803fbfa80e0e173be1980ffbf6a260696da95cf739c ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.GetStatus().IsOk()) | EXPECT_EQ(result.Value().value, 23) | EXPECT_EQ(result.Value().copies, 2) | EXPECT_EQ(source.value, 23) | EXPECT_EQ(source.copies, 0) ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.GetStatus().IsOk()) | EXPECT_EQ(result.Value().value, 23) | EXPECT_EQ(result.Value().copies, 2) | EXPECT_EQ(source.value, 23) | EXPECT_EQ(source.copies, 0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/status_test.cpp CoreDiagnostics.ResultTransfersOwnedPayloadDirectlyIntoValue CoreDiagnostics.ResultTransfersOwnedPayloadDirectlyIntoValue; assertion 12개 tests/unit/core/status_test.cpp CoreDiagnostics.ResultTransfersOwnedPayloadDirectlyIntoValue 유지 원문 검사 body 및 assertion 동일. d294568176ee9775e98fcb17136e14517d3e30ac69975c1655d3bf6e72237cd7 d294568176ee9775e98fcb17136e14517d3e30ac69975c1655d3bf6e72237cd7 EXPECT_EQ(source.value, 17) | EXPECT_EQ(source.copies, 0) | EXPECT_EQ(source.moves, 0) | EXPECT_EQ(from_lvalue.Value().value, 17) | EXPECT_EQ(from_lvalue.Value().copies, 1) | EXPECT_EQ(from_lvalue.Value().moves, 1) | EXPECT_EQ(from_temporary.Value().value, 29) | EXPECT_EQ(from_temporary.Value().copies, 0) | EXPECT_EQ(from_temporary.Value().moves, 1) | EXPECT_EQ(owned, nullptr) | ASSERT_NE(move_only.Value(), nullptr) | EXPECT_EQ(*move_only.Value(), 31) EXPECT_EQ(source.value, 17) | EXPECT_EQ(source.copies, 0) | EXPECT_EQ(source.moves, 0) | EXPECT_EQ(from_lvalue.Value().value, 17) | EXPECT_EQ(from_lvalue.Value().copies, 1) | EXPECT_EQ(from_lvalue.Value().moves, 1) | EXPECT_EQ(from_temporary.Value().value, 29) | EXPECT_EQ(from_temporary.Value().copies, 0) | EXPECT_EQ(from_temporary.Value().moves, 1) | EXPECT_EQ(owned, nullptr) | ASSERT_NE(move_only.Value(), nullptr) | EXPECT_EQ(*move_only.Value(), 31) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/status_test.cpp CoreDiagnostics.ResultEnforcesValueErrorExclusivity CoreDiagnostics.ResultEnforcesValueErrorExclusivity; assertion 21개 tests/unit/core/status_test.cpp CoreDiagnostics.ResultEnforcesValueErrorExclusivity 유지 원문 검사 body 및 assertion 동일. 9e7d9261f2c51e9a1cb0ef57442073618731b3a1867833debe5c3b9d0b064be2 9e7d9261f2c51e9a1cb0ef57442073618731b3a1867833debe5c3b9d0b064be2 "EXPECT_TRUE(ok.IsOk()) | EXPECT_FALSE(ok.Category().has_value()) | EXPECT_TRUE(ok.Diagnostics().empty()) | EXPECT_FALSE(uncategorized.IsOk()) | EXPECT_FALSE(uncategorized.Category().has_value()) | ASSERT_EQ(uncategorized.Diagnostics().size(), 1U) | EXPECT_EQ(uncategorized.Diagnostics()[0].code, ""invalid-beam-length"") | EXPECT_FALSE(categorized.IsOk()) | ASSERT_TRUE(categorized.Category().has_value()) | EXPECT_EQ(*categorized.Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(success.HasValue()) | EXPECT_TRUE(success.GetStatus().IsOk()) | EXPECT_EQ(success.Value(), ""solved"") | EXPECT_EQ(copied.Value(), ""solved"") | EXPECT_EQ(moved.Value(), ""solved"") | EXPECT_FALSE(failure.HasValue()) | EXPECT_FALSE(failure.GetStatus().IsOk()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_THROW(failure.Value(), std::logic_error) | EXPECT_THROW(const_failure.Value(), std::logic_error) | EXPECT_THROW((void)fesa::Result::Failure(fesa::Status::Ok()), std::invalid_argument)" "EXPECT_TRUE(ok.IsOk()) | EXPECT_FALSE(ok.Category().has_value()) | EXPECT_TRUE(ok.Diagnostics().empty()) | EXPECT_FALSE(uncategorized.IsOk()) | EXPECT_FALSE(uncategorized.Category().has_value()) | ASSERT_EQ(uncategorized.Diagnostics().size(), 1U) | EXPECT_EQ(uncategorized.Diagnostics()[0].code, ""invalid-beam-length"") | EXPECT_FALSE(categorized.IsOk()) | ASSERT_TRUE(categorized.Category().has_value()) | EXPECT_EQ(*categorized.Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(success.HasValue()) | EXPECT_TRUE(success.GetStatus().IsOk()) | EXPECT_EQ(success.Value(), ""solved"") | EXPECT_EQ(copied.Value(), ""solved"") | EXPECT_EQ(moved.Value(), ""solved"") | EXPECT_FALSE(failure.HasValue()) | EXPECT_FALSE(failure.GetStatus().IsOk()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_THROW(failure.Value(), std::logic_error) | EXPECT_THROW(const_failure.Value(), std::logic_error) | EXPECT_THROW((void)fesa::Result::Failure(fesa::Status::Ok()), std::invalid_argument)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/core/status_test.cpp support@1-47 helper/oracle/fixture/include/static assertion 구간: ModelDiagnostic, CopyOnlyPayload, TransferPayload tests/unit/core/status_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f8ab40e99b7478b5f7d94eb35ac9f7a8cf6b0b82a9b442d9c597948dd39ac634 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/element_capabilities_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/elements/element_capabilities_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bce1a8538bc2a53ac05e99e96e19e1d25a556eeea42285230ac6c5cbe7c9060f bce1a8538bc2a53ac05e99e96e19e1d25a556eeea42285230ac6c5cbe7c9060f 해당 없음 해당 없음 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ShellTrialPreservesCompleteDirectionalResponseAndFailure ElementCapabilities.ShellTrialPreservesCompleteDirectionalResponseAndFailure; assertion 8개 tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ShellTrialPreservesCompleteDirectionalResponseAndFailure 유지 원문 검사 body 및 assertion 동일. 5921a5f48213445eb066af193c1127df7c941a08b7a4c1d624da2c958eb39937 5921a5f48213445eb066af193c1127df7c941a08b7a4c1d624da2c958eb39937 ASSERT_TRUE(made.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | EXPECT_EQ(capability->DofLayout().node_indices, ShellLayout().node_indices) | EXPECT_EQ(capability->DofLayout().components_per_node, ShellLayout().components_per_node) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue()) | ASSERT_TRUE(again.HasValue()) ASSERT_TRUE(made.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | EXPECT_EQ(capability->DofLayout().node_indices, ShellLayout().node_indices) | EXPECT_EQ(capability->DofLayout().components_per_node, ShellLayout().components_per_node) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue()) | ASSERT_TRUE(again.HasValue()) 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ShellExternalConstraintRetainsEveryVariation ElementCapabilities.ShellExternalConstraintRetainsEveryVariation; assertion 5개 tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ShellExternalConstraintRetainsEveryVariation 유지 원문 검사 body 및 assertion 동일. 8eab8e48a1d16b1f03dc2500d08d79e3737c50fe9b388563300f16ffd68d4916 8eab8e48a1d16b1f03dc2500d08d79e3737c50fe9b388563300f16ffd68d4916 ASSERT_TRUE(kernel.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue()) ASSERT_TRUE(kernel.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue()) 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ShellInertiaRetainsCompletePhysicalResponse ElementCapabilities.ShellInertiaRetainsCompletePhysicalResponse; assertion 5개 tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ShellInertiaRetainsCompletePhysicalResponse 유지 원문 검사 body 및 assertion 동일. 893cd00cd718f011c281cd205b403e4b821033b94315a86fb0382a459c6ad4f4 893cd00cd718f011c281cd205b403e4b821033b94315a86fb0382a459c6ad4f4 ASSERT_TRUE(kernel.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue()) ASSERT_TRUE(kernel.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ThermalPreservesStationLayoutIntervalsAndAllTraces ElementCapabilities.ThermalPreservesStationLayoutIntervalsAndAllTraces; assertion 13개 tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.ThermalPreservesStationLayoutIntervalsAndAllTraces 유지 원문 검사 body 및 assertion 동일. 93d27fb3103b3a58f40ef9c04936942073b555855d614faebb71f70aabb4c8cd 93d27fb3103b3a58f40ef9c04936942073b555855d614faebb71f70aabb4c8cd "ASSERT_TRUE(kernel.HasValue()) | EXPECT_EQ(capability->DofLayout().source_id.source_label_text, ""0019"") | EXPECT_EQ(capability->DofLayout().node_indices, kernel.Value().NodeIndices()) | EXPECT_EQ(static_cast(capability->DofLayout().components[i]), 11 + i) | EXPECT_EQ(&capability->Conductivity(), &kernel.Value().Conductivity()) | EXPECT_EQ(&capability->Capacity(), &kernel.Value().Capacity()) | EXPECT_EQ(&capability->ConductivityError(), &kernel.Value().ConductivityError()) | EXPECT_EQ(&capability->CapacityError(), &kernel.Value().CapacityError()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | EXPECT_EQ(temperature, saved) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue())" "ASSERT_TRUE(kernel.HasValue()) | EXPECT_EQ(capability->DofLayout().source_id.source_label_text, ""0019"") | EXPECT_EQ(capability->DofLayout().node_indices, kernel.Value().NodeIndices()) | EXPECT_EQ(static_cast(capability->DofLayout().components[i]), 11 + i) | EXPECT_EQ(&capability->Conductivity(), &kernel.Value().Conductivity()) | EXPECT_EQ(&capability->Capacity(), &kernel.Value().Capacity()) | EXPECT_EQ(&capability->ConductivityError(), &kernel.Value().ConductivityError()) | EXPECT_EQ(&capability->CapacityError(), &kernel.Value().CapacityError()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | EXPECT_EQ(temperature, saved) | ASSERT_FALSE(failed_direct.HasValue()) | ASSERT_FALSE(failed_via.HasValue())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.SolidRetainsLinearNonlinearAndPairedResponses ElementCapabilities.SolidRetainsLinearNonlinearAndPairedResponses; assertion 23개 tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.SolidRetainsLinearNonlinearAndPairedResponses 유지 원문 검사 body 및 assertion 동일. c3e08c5ffe1005723278871e714cc780f31a1b301606286a68ba4845994f0d76 c3e08c5ffe1005723278871e714cc780f31a1b301606286a68ba4845994f0d76 "ASSERT_TRUE(made.HasValue()) | EXPECT_EQ(&base.DofLayout(), &kernel.DofLayout()) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(via_linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(via_nonlinear.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | ASSERT_TRUE(k.HasValue()) | ASSERT_TRUE(via_k.HasValue()) | ASSERT_TRUE(m.HasValue()) | ASSERT_TRUE(via_m.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_TRUE(direct_recovered.HasValue()) | EXPECT_EQ(recovered.Value().source_id.source_label_text, ""0042"") | ASSERT_EQ(rows.rows.size(), direct_rows.rows.size()) | EXPECT_EQ(rows.rows[i].element, direct_rows.rows[i].element) | EXPECT_EQ(rows.rows[i].integration_point, direct_rows.rows[i].integration_point) | ASSERT_FALSE(failed.HasValue()) | ASSERT_FALSE(direct_failed.HasValue()) | ASSERT_FALSE(paired_failed.HasValue()) | ASSERT_FALSE(direct_paired_failed.HasValue()) | ASSERT_TRUE(again.HasValue())" "ASSERT_TRUE(made.HasValue()) | EXPECT_EQ(&base.DofLayout(), &kernel.DofLayout()) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(via_linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(via_nonlinear.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(via.HasValue()) | ASSERT_TRUE(k.HasValue()) | ASSERT_TRUE(via_k.HasValue()) | ASSERT_TRUE(m.HasValue()) | ASSERT_TRUE(via_m.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_TRUE(direct_recovered.HasValue()) | EXPECT_EQ(recovered.Value().source_id.source_label_text, ""0042"") | ASSERT_EQ(rows.rows.size(), direct_rows.rows.size()) | EXPECT_EQ(rows.rows[i].element, direct_rows.rows[i].element) | EXPECT_EQ(rows.rows[i].integration_point, direct_rows.rows[i].integration_point) | ASSERT_FALSE(failed.HasValue()) | ASSERT_FALSE(direct_failed.HasValue()) | ASSERT_FALSE(paired_failed.HasValue()) | ASSERT_FALSE(direct_paired_failed.HasValue()) | ASSERT_TRUE(again.HasValue())" 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.BoundViewsSurviveOwnerVectorMovesAndRejectOtherFamilies ElementCapabilities.BoundViewsSurviveOwnerVectorMovesAndRejectOtherFamilies; assertion 13개 tests/unit/elements/element_capabilities_test.cpp ElementCapabilities.BoundViewsSurviveOwnerVectorMovesAndRejectOtherFamilies 유지 원문 검사 body 및 assertion 동일. 9de22e101a2f3c1630726b97a0fd914ab5df0069096fe89dc00e3c8941fc6f97 9de22e101a2f3c1630726b97a0fd914ab5df0069096fe89dc00e3c8941fc6f97 ASSERT_TRUE(made.HasValue()) | ASSERT_NE(capability, nullptr) | EXPECT_EQ(factory.BindShellReference(*original), nullptr) | EXPECT_EQ(transferred[0].get(), original) | EXPECT_EQ(&capability->DofLayout(), &original->DofLayout()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_TRUE(shell.HasValue()) | EXPECT_EQ(factory.BindSolidTrial(shell.Value()), nullptr) | ASSERT_NE(reference, nullptr) | EXPECT_EQ(&reference->DofLayout(), &shell.Value().DofLayout()) | ASSERT_TRUE(direct_k.HasValue()) | ASSERT_TRUE(via_k.HasValue()) ASSERT_TRUE(made.HasValue()) | ASSERT_NE(capability, nullptr) | EXPECT_EQ(factory.BindShellReference(*original), nullptr) | EXPECT_EQ(transferred[0].get(), original) | EXPECT_EQ(&capability->DofLayout(), &original->DofLayout()) | ASSERT_TRUE(evaluated.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_TRUE(shell.HasValue()) | EXPECT_EQ(factory.BindSolidTrial(shell.Value()), nullptr) | ASSERT_NE(reference, nullptr) | EXPECT_EQ(&reference->DofLayout(), &shell.Value().DofLayout()) | ASSERT_TRUE(direct_k.HasValue()) | ASSERT_TRUE(via_k.HasValue()) 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_capabilities_test.cpp support@1-106 helper/oracle/fixture/include/static assertion 구간: Same, ShellLayout, ShellInput, Pointers, Trial tests/unit/elements/element_capabilities_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 64cca7449df949df39d3843edb415e61ee0603867af7f27f6c376ccf8888b378 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_capabilities_test.cpp support@268-296 helper/oracle/fixture/include/static assertion 구간: Solid, Same tests/unit/elements/element_capabilities_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 959366a48c981e25617d2bfe8cfd588300b4c69b474fa3399a15613430e71d93 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_capabilities_test.cpp support@412-413 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/element_capabilities_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-CAPABILITY test-cleanup-review.md#r-capability +Refactor tests/unit/elements/element_factory_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/elements/element_factory_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 39cdff0a92b9a86f0efe54457c47f57bb8fa0a48887eae940198046c8f5249f0 39cdff0a92b9a86f0efe54457c47f57bb8fa0a48887eae940198046c8f5249f0 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery; assertion 21개 tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery 유지 원문 검사 body 및 assertion 동일. 6ea821d717c92f195c2f3d8cac87a3f58f9db2377459cd40674d113374366e34 6ea821d717c92f195c2f3d8cac87a3f58f9db2377459cd40674d113374366e34 "EXPECT_NE(probe, nullptr) | EXPECT_TRUE(destroyed) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(layout.source_id.source_label_text, ""7"") | EXPECT_EQ(layout.node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(layout.components_per_node, (std::vector{ fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz, fesa::DofComponent::kUrx, fesa::DofComponent::kUry, fesa::DofComponent::kUrz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().layout.node_indices, layout.node_indices) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_id.source_label_text, ""7"") | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.endpoint_rows.size(), 2U) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].end_action[0U], -10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[1U].end_action[0U], 10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].section_resultant[0U], 10.0) | EXPECT_EQ(rows.endpoint_rows[0U].node.source_label_text, ""1"") | EXPECT_EQ(rows.endpoint_rows[1U].node.source_label_text, ""2"") | EXPECT_EQ(rows.gauss_rows.size(), 2U) | EXPECT_EQ(rows.stress_rows.size(), 2U)" "EXPECT_NE(probe, nullptr) | EXPECT_TRUE(destroyed) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(layout.source_id.source_label_text, ""7"") | EXPECT_EQ(layout.node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(layout.components_per_node, (std::vector{ fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz, fesa::DofComponent::kUrx, fesa::DofComponent::kUry, fesa::DofComponent::kUrz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().layout.node_indices, layout.node_indices) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_id.source_label_text, ""7"") | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.endpoint_rows.size(), 2U) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].end_action[0U], -10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[1U].end_action[0U], 10.0) | EXPECT_DOUBLE_EQ(rows.endpoint_rows[0U].section_resultant[0U], 10.0) | EXPECT_EQ(rows.endpoint_rows[0U].node.source_label_text, ""1"") | EXPECT_EQ(rows.endpoint_rows[1U].node.source_label_text, ""2"") | EXPECT_EQ(rows.gauss_rows.size(), 2U) | EXPECT_EQ(rows.stress_rows.size(), 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery; assertion 15개 tests/unit/elements/element_factory_test.cpp ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery 유지 원문 검사 body 및 assertion 동일. 998ad7873f34e6ae9b95cc403602d8c995903164d6857c4952be354731aa6645 998ad7873f34e6ae9b95cc403602d8c995903164d6857c4952be354731aa6645 ASSERT_EQ(domain.Elements().Size(), 2U) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(element->DofLayout().node_indices, (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(element->DofLayout().components_per_node.size(), 6U) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(direct_stiffness.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.rows.size(), 4U) | EXPECT_DOUBLE_EQ(rows.physical_strain_energy, 0.0) | EXPECT_EQ(rows.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(rows.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(row.element, fesa::EntityIndex{1U}) ASSERT_EQ(domain.Elements().Size(), 2U) | ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(candidate.Value(), nullptr) | EXPECT_EQ(element->DofLayout().node_indices, (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(element->DofLayout().components_per_node.size(), 6U) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(direct.HasValue()) | ASSERT_TRUE(direct_stiffness.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_TRUE(std::holds_alternative( result.Value().payload)) | ASSERT_EQ(rows.rows.size(), 4U) | EXPECT_DOUBLE_EQ(rows.physical_strain_energy, 0.0) | EXPECT_EQ(rows.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(rows.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(row.element, fesa::EntityIndex{1U}) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/element_factory_test.cpp ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder; assertion 7개 tests/unit/elements/element_factory_test.cpp ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder 유지 원문 검사 body 및 assertion 동일. 11cc51a03beb75fe145b0865b12fb782a7bea43f352e46f4c198462f397e1196 11cc51a03beb75fe145b0865b12fb782a7bea43f352e46f4c198462f397e1196 "ASSERT_TRUE(beam.HasValue()) | ASSERT_TRUE(shell.HasValue()) | ASSERT_EQ(view.size(), 2U) | EXPECT_EQ(&view[0U].get(), owner[0U].get()) | EXPECT_EQ(&view[1U].get(), owner[1U].get()) | EXPECT_EQ(view[0U].get().DofLayout().source_id.source_label_text, ""7"") | EXPECT_EQ(view[1U].get().DofLayout().source_id.source_label_text, ""9"")" "ASSERT_TRUE(beam.HasValue()) | ASSERT_TRUE(shell.HasValue()) | ASSERT_EQ(view.size(), 2U) | EXPECT_EQ(&view[0U].get(), owner[0U].get()) | EXPECT_EQ(&view[1U].get(), owner[1U].get()) | EXPECT_EQ(view[0U].get().DofLayout().source_id.source_label_text, ""7"") | EXPECT_EQ(view[1U].get().DofLayout().source_id.source_label_text, ""9"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/element_factory_test.cpp ElementFactory.RejectsUnknownAndIncompatibleDefinitions ElementFactory.RejectsUnknownAndIncompatibleDefinitions; assertion 1개 tests/unit/elements/element_factory_test.cpp ElementFactory.RejectsUnknownAndIncompatibleDefinitions 유지 원문 검사 body 및 assertion 동일. 0e0b2765c7cebcbf59f6649a659226c9e963c37cf207db198ee2dd0a7a23f2c8 0e0b2765c7cebcbf59f6649a659226c9e963c37cf207db198ee2dd0a7a23f2c8 "EXPECT_EQ(missing_frame_result.GetStatus().Diagnostics()[0U].code, ""missing-shell-frame"")" "EXPECT_EQ(missing_frame_result.GetStatus().Diagnostics()[0U].code, ""missing-shell-frame"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingPreservesThreeComponentsAndReferenceMass ElementFactory.SolidBindingPreservesThreeComponentsAndReferenceMass; assertion 15개 tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingPreservesThreeComponentsAndReferenceMass 유지 원문 검사 body 및 assertion 동일. e0459ed0666964dd9f2f6f40d000d99842fe6e79acb14fe683fed56000f054f2 e0459ed0666964dd9f2f6f40d000d99842fe6e79acb14fe683fed56000f054f2 ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_EQ(solid->DofLayout().source_id.source_label, 99) | EXPECT_EQ(solid->DofLayout().components_per_node, (std::vector{fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().values.Rows(), 24U) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(mass.Value().values.Rows(), 24U) | ASSERT_EQ(mass.Value().values.Columns(), 24U) | EXPECT_NEAR(total_mass, 2.0, 1.0e-13) | EXPECT_NEAR(mass.Value().values(row, column), 0.25, 1.0e-15) | EXPECT_DOUBLE_EQ(mass.Value().values(row, column), 0.0) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().points[point].element, 0U) | EXPECT_EQ(response.Value().points[point].integration_point, point + 1U) ASSERT_TRUE(candidate.HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_EQ(solid->DofLayout().source_id.source_label, 99) | EXPECT_EQ(solid->DofLayout().components_per_node, (std::vector{fesa::DofComponent::kUx, fesa::DofComponent::kUy, fesa::DofComponent::kUz})) | ASSERT_TRUE(stiffness.HasValue()) | EXPECT_EQ(stiffness.Value().values.Rows(), 24U) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(mass.Value().values.Rows(), 24U) | ASSERT_EQ(mass.Value().values.Columns(), 24U) | EXPECT_NEAR(total_mass, 2.0, 1.0e-13) | EXPECT_NEAR(mass.Value().values(row, column), 0.25, 1.0e-15) | EXPECT_DOUBLE_EQ(mass.Value().values(row, column), 0.0) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().points[point].element, 0U) | EXPECT_EQ(response.Value().points[point].integration_point, point + 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/element_factory_test.cpp ElementFactory.SolidStaticBindingKeepsAbsentDensityAndRejectsForeignOwner ElementFactory.SolidStaticBindingKeepsAbsentDensityAndRejectsForeignOwner; assertion 6개 tests/unit/elements/element_factory_test.cpp ElementFactory.SolidStaticBindingKeepsAbsentDensityAndRejectsForeignOwner 유지 원문 검사 body 및 assertion 동일. 67e0aa39b78dbefe0e852900de54f14318d5ae806e09ab40348a8798d246bd3f 67e0aa39b78dbefe0e852900de54f14318d5ae806e09ab40348a8798d246bd3f "ASSERT_TRUE(candidate.HasValue()) | EXPECT_TRUE(candidate.Value()->ComputeStiffness().HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_FALSE(solid->ComputeMass().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""invalid-element-definition"")" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_TRUE(candidate.Value()->ComputeStiffness().HasValue()) | ASSERT_NE(solid, nullptr) | EXPECT_FALSE(solid->ComputeMass().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].code, ""invalid-element-definition"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingRejectsReferenceInversionWithSourceContext ElementFactory.SolidBindingRejectsReferenceInversionWithSourceContext; assertion 3개 tests/unit/elements/element_factory_test.cpp ElementFactory.SolidBindingRejectsReferenceInversionWithSourceContext 유지 원문 검사 body 및 assertion 동일. ae4abe144881d88e3568e44f6d0bd4559ad3f9fdb401f326a722bbce37b492e7 ae4abe144881d88e3568e44f6d0bd4559ad3f9fdb401f326a722bbce37b492e7 "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""Solid-1:99"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].location.line, 12U)" "ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].entity_identity, ""Solid-1:99"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0U].location.line, 12U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/element_factory_test.cpp support@1-203 helper/oracle/fixture/include/static assertion 구간: ShellDefinition, MakeDomain, if, SolidDefinition, ExpectSameMatrix, ExpectModelFailure, UnknownElementDefinition, DestructionProbeElement tests/unit/elements/element_factory_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5df55285ae0fae1c4f738f882bddf024296bcd204b785093108491fe34daed7d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/euler_beam_3d_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/elements/euler_beam_3d_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 36b1305028805eacc62bf2e85b8abdf3512eb322f1a41429062b810365d79c0f 36b1305028805eacc62bf2e85b8abdf3512eb322f1a41429062b810365d79c0f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns; assertion 8개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns 유지 원문 검사 body 및 assertion 동일. 72cf906f5dc17ad6e999e6805a6067f89c06a80fc3bb6982948a7ea36cfee95d 72cf906f5dc17ad6e999e6805a6067f89c06a80fc3bb6982948a7ea36cfee95d EXPECT_NEAR(recovery.gauss_generalized_strains[point][0U], axial_strain, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][1U], twist, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][2U], -curvature(w, x), 1.0e-13) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][3U], curvature(v, x), 1.0e-13) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][2U], material.youngs_modulus * section.i11 * -curvature(w, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][2U], material.youngs_modulus * section.i11 * -curvature(w, length), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][3U], material.youngs_modulus * section.i22 * curvature(v, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][3U], material.youngs_modulus * section.i22 * curvature(v, length), 1.0e-5) EXPECT_NEAR(recovery.gauss_generalized_strains[point][0U], axial_strain, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][1U], twist, 1.0e-14) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][2U], -curvature(w, x), 1.0e-13) | EXPECT_NEAR(recovery.gauss_generalized_strains[point][3U], curvature(v, x), 1.0e-13) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][2U], material.youngs_modulus * section.i11 * -curvature(w, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][2U], material.youngs_modulus * section.i11 * -curvature(w, length), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[0U][3U], material.youngs_modulus * section.i22 * curvature(v, 0.0), 1.0e-5) | EXPECT_NEAR(recovery.endpoint_section_resultants[1U][3U], material.youngs_modulus * section.i22 * curvature(v, length), 1.0e-5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.TwoPointGaussMatchesClosedStiffness EulerBeam3D.TwoPointGaussMatchesClosedStiffness; assertion 2개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.TwoPointGaussMatchesClosedStiffness 유지 원문 검사 body 및 assertion 동일. 5051a070e070c7eae4c852c1ea6f81abc26e94829ee91053d119f37018340643 5051a070e070c7eae4c852c1ea6f81abc26e94829ee91053d119f37018340643 EXPECT_LE(NormalizedMatrixError(actual, closed), kMatrixTolerance) | EXPECT_LE(NormalizedMatrixError(actual, transpose), kMatrixTolerance) EXPECT_LE(NormalizedMatrixError(actual, closed), kMatrixTolerance) | EXPECT_LE(NormalizedMatrixError(actual, transpose), kMatrixTolerance) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy; assertion 4개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy 유지 원문 검사 body 및 assertion 동일. 516ae9c2a58b6b19177233b4b31579a5096c950576c35ec6af2ad868dc41b63b 516ae9c2a58b6b19177233b4b31579a5096c950576c35ec6af2ad868dc41b63b EXPECT_LE(normalizedResidual, kRigidTolerance) | EXPECT_EQ(positive_count, 6) | EXPECT_GE(value, -kRigidTolerance * maximum_singular_value) | EXPECT_GT(QuadraticEnergy(stiffness, deformation), 0.0) EXPECT_LE(normalizedResidual, kRigidTolerance) | EXPECT_EQ(positive_count, 6) | EXPECT_GE(value, -kRigidTolerance * maximum_singular_value) | EXPECT_GT(QuadraticEnergy(stiffness, deformation), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RotatedTransformPreservesWorkAndEnergy EulerBeam3D.RotatedTransformPreservesWorkAndEnergy; assertion 4개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RotatedTransformPreservesWorkAndEnergy 유지 원문 검사 body 및 assertion 동일. bcead48fa3010457278ea1a7c367260ca6fb9d4e01d8f58374fcfeafbd0c653d bcead48fa3010457278ea1a7c367260ca6fb9d4e01d8f58374fcfeafbd0c653d EXPECT_NEAR(dot, row == column ? 1.0 : 0.0, 1.0e-14) | EXPECT_NEAR(Determinant(rotation), 1.0, 1.0e-14) | EXPECT_LE(NormalizedMatrixError(global, expected_global), kMatrixTolerance) | EXPECT_NEAR(recovery.gauss_generalized_strains[0U][0U], (local_displacement[6U] - local_displacement[0U]) / 3.0, 1.0e-14) EXPECT_NEAR(dot, row == column ? 1.0 : 0.0, 1.0e-14) | EXPECT_NEAR(Determinant(rotation), 1.0, 1.0e-14) | EXPECT_LE(NormalizedMatrixError(global, expected_global), kMatrixTolerance) | EXPECT_NEAR(recovery.gauss_generalized_strains[0U][0U], (local_displacement[6U] - local_displacement[0U]) / 3.0, 1.0e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration; assertion 11개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration 유지 원문 검사 body 및 assertion 동일. cf0127ac571a9fbf42f03f5ca9df5cb1211781ca31220dd266c7494bd465005b cf0127ac571a9fbf42f03f5ca9df5cb1211781ca31220dd266c7494bd465005b EXPECT_DOUBLE_EQ(delta.Norm(), 3.0) | EXPECT_DOUBLE_EQ(global(0U, 0U), 0x1.65f135da12f68p+28) | EXPECT_DOUBLE_EQ(global(0U, 1U), 0x1.6261c084bda12p+28) | EXPECT_DOUBLE_EQ(global(0U, 2U), 0x1.630ca684bda13p+27) | EXPECT_DOUBLE_EQ(global(4U, 4U), 0x1.068e359b59b58p+22) | EXPECT_DOUBLE_EQ(global(5U, 11U), 0x1.2d14a7ee7ee7bp+22) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][0U], 0x1.1111111111110p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][1U], 0x1.1111111111111p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][2U], -0x1.382425a7d2473p-6) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][3U], -0x1.a9389137b051dp-6) | EXPECT_DOUBLE_EQ(recovery.endpoint_section_resultants[1U][2U], 0x1.525c94a87359fp+17) EXPECT_DOUBLE_EQ(delta.Norm(), 3.0) | EXPECT_DOUBLE_EQ(global(0U, 0U), 0x1.65f135da12f68p+28) | EXPECT_DOUBLE_EQ(global(0U, 1U), 0x1.6261c084bda12p+28) | EXPECT_DOUBLE_EQ(global(0U, 2U), 0x1.630ca684bda13p+27) | EXPECT_DOUBLE_EQ(global(4U, 4U), 0x1.068e359b59b58p+22) | EXPECT_DOUBLE_EQ(global(5U, 11U), 0x1.2d14a7ee7ee7bp+22) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][0U], 0x1.1111111111110p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][1U], 0x1.1111111111111p-5) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][2U], -0x1.382425a7d2473p-6) | EXPECT_DOUBLE_EQ(recovery.gauss_generalized_strains[0U][3U], -0x1.a9389137b051dp-6) | EXPECT_DOUBLE_EQ(recovery.endpoint_section_resultants[1U][2U], 0x1.525c94a87359fp+17) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents; assertion 5개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents 유지 원문 검사 body 및 assertion 동일. 6d608896998acfb9e31d28e2a9700cc5bfa9f3f273b5de08f201f18d6358f4f5 6d608896998acfb9e31d28e2a9700cc5bfa9f3f273b5de08f201f18d6358f4f5 ASSERT_EQ(equivalent.Size(), expected.size()) | EXPECT_GT(relative_errors[0U], relative_errors[1U]) | EXPECT_GT(relative_errors[1U], relative_errors[2U]) | EXPECT_NEAR( std::log(relative_errors[0U] / relative_errors[1U]) / std::log(2.0), 4.0, 1.0e-8) | EXPECT_NEAR( std::log(relative_errors[1U] / relative_errors[2U]) / std::log(2.0), 4.0, 1.0e-8) ASSERT_EQ(equivalent.Size(), expected.size()) | EXPECT_GT(relative_errors[0U], relative_errors[1U]) | EXPECT_GT(relative_errors[1U], relative_errors[2U]) | EXPECT_NEAR( std::log(relative_errors[0U] / relative_errors[1U]) / std::log(2.0), 4.0, 1.0e-8) | EXPECT_NEAR( std::log(relative_errors[1U] / relative_errors[2U]) / std::log(2.0), 4.0, 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover; assertion 2개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover 유지 원문 검사 body 및 assertion 동일. ec321db32dec17dd4598bb2af11029172b73838ff38e434a120520c4c8a66136 ec321db32dec17dd4598bb2af11029172b73838ff38e434a120520c4c8a66136 EXPECT_NEAR(local_yrecovery.endpoint_section_resultants[1U][3U], 0.0, 1.0e-8) | EXPECT_NEAR(local_zrecovery.endpoint_section_resultants[1U][2U], 0.0, 1.0e-8) EXPECT_NEAR(local_yrecovery.endpoint_section_resultants[1U][3U], 0.0, 1.0e-8) | EXPECT_NEAR(local_zrecovery.endpoint_section_resultants[1U][2U], 0.0, 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RejectsInvalidGeometryAndProperties EulerBeam3D.RejectsInvalidGeometryAndProperties; assertion 5개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RejectsInvalidGeometryAndProperties 유지 원문 검사 body 및 assertion 동일. 84aca3252ee968479adb3ff42de486fae5c3eb0ecfc270ead2f5b7272471a512 84aca3252ee968479adb3ff42de486fae5c3eb0ecfc270ead2f5b7272471a512 EXPECT_EQ(result.GetStatus().Category(), FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, code) | EXPECT_TRUE(EulerBeam3D::Create(scaled_first, above_threshold, valid_section, valid_material) .HasValue()) | EXPECT_TRUE( EulerBeam3D::Create(origin, unit_x, guide_above_threshold, valid_material) .HasValue()) EXPECT_EQ(result.GetStatus().Category(), FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, code) | EXPECT_TRUE(EulerBeam3D::Create(scaled_first, above_threshold, valid_section, valid_material) .HasValue()) | EXPECT_TRUE( EulerBeam3D::Create(origin, unit_x, guide_above_threshold, valid_material) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11 EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11; assertion 11개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11 유지 원문 검사 body 및 assertion 동일. 22288ebdd3e81a891dc0f67b7ce14995403506506faa4cc045838d070fdd22d2 22288ebdd3e81a891dc0f67b7ce14995403506506faa4cc045838d070fdd22d2 "ASSERT_EQ(recovery.stress_points.size(), 4U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, point + 1U) | EXPECT_DOUBLE_EQ(stress.x1, x1) | EXPECT_DOUBLE_EQ(stress.x2, x2) | ASSERT_EQ(default_recovery.stress_points.size(), 2U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, 0U) | EXPECT_DOUBLE_EQ(stress.x1, 0.0) | EXPECT_DOUBLE_EQ(stress.x2, 0.0) | EXPECT_EQ(stress.source, ""fesa-default"")" "ASSERT_EQ(recovery.stress_points.size(), 4U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, point + 1U) | EXPECT_DOUBLE_EQ(stress.x1, x1) | EXPECT_DOUBLE_EQ(stress.x2, x2) | ASSERT_EQ(default_recovery.stress_points.size(), 2U) | EXPECT_EQ(stress.gauss_point, static_cast(gauss_point + 1U)) | EXPECT_EQ(stress.section_point, 0U) | EXPECT_DOUBLE_EQ(stress.x1, 0.0) | EXPECT_DOUBLE_EQ(stress.x2, 0.0) | EXPECT_EQ(stress.source, ""fesa-default"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches; assertion 4개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches 유지 원문 검사 body 및 assertion 동일. 4fa6d99d84b69f21604df5fa097dd5c21494f16445f261d75d87e8ebfbccd76e 4fa6d99d84b69f21604df5fa097dd5c21494f16445f261d75d87e8ebfbccd76e EXPECT_NEAR(recovery.equilibrium_end_actions[0U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[0U][2U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][2U], 0.0, 1.0e-8) EXPECT_NEAR(recovery.equilibrium_end_actions[0U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[0U][2U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][1U], 0.0, 1.0e-8) | EXPECT_NEAR(recovery.equilibrium_end_actions[1U][2U], 0.0, 1.0e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.OnePointNegativeControlHasRankFour EulerBeam3D.OnePointNegativeControlHasRankFour; assertion 2개 tests/unit/elements/euler_beam_3d_test.cpp EulerBeam3D.OnePointNegativeControlHasRankFour 유지 원문 검사 body 및 assertion 동일. 09b807bbb8c23f7aca5a27cdb8df60f75e866fec3d12dfce52a2c9271fec75da 09b807bbb8c23f7aca5a27cdb8df60f75e866fec3d12dfce52a2c9271fec75da EXPECT_EQ(SymmetricRank(one_point, kRigidTolerance), 4U) | EXPECT_EQ(SymmetricRank(production, kRigidTolerance), 6U) EXPECT_EQ(SymmetricRank(one_point, kRigidTolerance), 4U) | EXPECT_EQ(SymmetricRank(production, kRigidTolerance), 6U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/euler_beam_3d_test.cpp support@1-500 helper/oracle/fixture/include/static assertion 구간: fesa, MakeNode, MakeMaterial, RequireBeam, if, AlignedBeam, MaximumAbsoluteEntry, MatrixIsFinite, NormalizedMatrixError, VectorNorm, QuadraticEnergy, ExpectScaledNear, ExpectRelativeNear, ExpectedClosedStiffness, SymmetricEigenvalues, SymmetricRank, for, count_if, TestOnlyOnePointStiffness, SolveFixedFirstNode, SolveDenseSystem, SolveUniformTransverseCantilever, UniformLoadInteriorDisplacementError, TransformationFromKnownRows, TransposeMultiply, Determinant tests/unit/elements/euler_beam_3d_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8fe565c3a19d57cd6870d3739c431b99fc41c549a91faa396fd25baea0ebb604 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/euler_beam_3d_test.cpp support@1137-1139 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/elements/euler_beam_3d_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/finite_rotation_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/elements/finite_rotation_test.cpp file 이관 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. ab332c787f3b6a987180c4901cf8c713e08c640e2e197f1c7be52afb11e698a3 60399a9c2b20a3752b3f57a1b74807dbb4db0800c7aa8c5ce375375a1f93340f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/finite_rotation_test.cpp FiniteRotation.ZeroCoordinatePreservesInitialFrameAndDirector FiniteRotation.ZeroCoordinatePreservesInitialFrameAndDirector; assertion 2개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.ZeroCoordinatePreservesInitialFrameAndDirector 유지 원문 검사 body 및 assertion 동일. aad5b1d13028179488b58dd96eca0f52247abdd44548c24f6b2a5c67b6a12aa5 aad5b1d13028179488b58dd96eca0f52247abdd44548c24f6b2a5c67b6a12aa5 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().phi, Vector3{}) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().phi, Vector3{}) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/finite_rotation_test.cpp FiniteRotation.FiniteCoordinateBuildsProperTriadAndDirector FiniteRotation.FiniteCoordinateBuildsProperTriadAndDirector; assertion 1개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.FiniteCoordinateBuildsProperTriadAndDirector 유지 원문 검사 body 및 assertion 동일. 1013327e87dfbcfd8516fe145e8e8051a97b90d1f4321ff5bdc4f99dbe198e94 1013327e87dfbcfd8516fe145e8e8051a97b90d1f4321ff5bdc4f99dbe198e94 ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/finite_rotation_test.cpp FiniteRotation.GlobalIncrementRebuildsFixedReferenceOrientation FiniteRotation.GlobalIncrementRebuildsFixedReferenceOrientation; assertion 3개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.GlobalIncrementRebuildsFixedReferenceOrientation 유지 원문 검사 body 및 assertion 동일. 069a14c550efe63bd5178dae6e8c3ae73a67dbff8c75ee68d7af81582d3336dd 069a14c550efe63bd5178dae6e8c3ae73a67dbff8c75ee68d7af81582d3336dd ASSERT_TRUE(committed.HasValue()) | ASSERT_TRUE(updated.HasValue()) | EXPECT_EQ(updated.Value().phi, expected_phi) ASSERT_TRUE(committed.HasValue()) | ASSERT_TRUE(updated.HasValue()) | EXPECT_EQ(updated.Value().phi, expected_phi) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsCoordinatesInsidePrincipalBranchMargin FiniteRotation.RejectsCoordinatesInsidePrincipalBranchMargin; assertion 5개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsCoordinatesInsidePrincipalBranchMargin 유지 원문 검사 body 및 assertion 동일. 12de3e3e90b293e3c19a0cc9620342eab8bad27fd9185362bf6aefb4c3c4334d 12de3e3e90b293e3c19a0cc9620342eab8bad27fd9185362bf6aefb4c3c4334d "EXPECT_TRUE(MakeFiniteRotationState(Vector3{pi - 2.0 * margin, 0.0, 0.0}, initial_frame) .HasValue()) | ASSERT_FALSE(ambiguous.HasValue()) | ASSERT_FALSE(ambiguous.GetStatus().IsOk()) | ASSERT_EQ(ambiguous.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(ambiguous.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" "EXPECT_TRUE(MakeFiniteRotationState(Vector3{pi - 2.0 * margin, 0.0, 0.0}, initial_frame) .HasValue()) | ASSERT_FALSE(ambiguous.HasValue()) | ASSERT_FALSE(ambiguous.GetStatus().IsOk()) | ASSERT_EQ(ambiguous.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(ambiguous.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/finite_rotation_test.cpp FiniteRotation.SpatialMomentSolvePreservesKnownLoadAndVirtualWork FiniteRotation.SpatialMomentSolvePreservesKnownLoadAndVirtualWork; assertion 2개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.SpatialMomentSolvePreservesKnownLoadAndVirtualWork 유지 원문 검사 body 및 assertion 동일. 605952b5bb0e5427f1d027b62ef6b37b3b943b5372efbde1a6e8425453325844 605952b5bb0e5427f1d027b62ef6b37b3b943b5372efbde1a6e8425453325844 ASSERT_TRUE(solved.HasValue()) | EXPECT_NEAR(generalized.Dot(variation), solved.Value().Dot(spatial_variation), 1e-11) ASSERT_TRUE(solved.HasValue()) | EXPECT_NEAR(generalized.Dot(variation), solved.Value().Dot(spatial_variation), 1e-11) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/finite_rotation_test.cpp FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent; assertion 2개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.JacobiansAreFiniteInverseTransposeAndDerivativeConsistent 이관 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. 02ba014c6b54d4f6da74142b2d912a025de49d92ab2e0542ca7c10714797ba6f a39013f3e24d31e9ecb14e3117116d4f8be30cb57b65c734d2d81b560719432a EXPECT_TRUE(IsFinite(left_jacobian)) | ASSERT_TRUE(spatial.HasValue()) EXPECT_TRUE(IsFinite(left_jacobian)) | ASSERT_TRUE(solved.HasValue()) | EXPECT_TRUE(std::isfinite(solved.Value().X())) | EXPECT_TRUE(std::isfinite(solved.Value().Y())) | EXPECT_TRUE(std::isfinite(solved.Value().Z())) | EXPECT_NEAR(identity_column[row], row == column ? 1.0 : 0.0, 1.0e-11) | ASSERT_TRUE(spatial.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsNonfiniteCoordinatesAndInvalidInitialFrames FiniteRotation.RejectsNonfiniteCoordinatesAndInvalidInitialFrames; assertion 8개 tests/unit/elements/finite_rotation_test.cpp FiniteRotation.RejectsNonfiniteCoordinatesAndInvalidInitialFrames 유지 원문 검사 body 및 assertion 동일. 5da1952beb0840c9e5ab9fb79e02c5a2519d977763fb497904b3741c3d2a52d7 5da1952beb0840c9e5ab9fb79e02c5a2519d977763fb497904b3741c3d2a52d7 "ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_EQ(nonfinite.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(nonfinite.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_FALSE(MakeFiniteRotationState(Vector3{}, invalid_frame).HasValue()) | ASSERT_TRUE(committed.HasValue()) | ASSERT_FALSE(invalid_increment.HasValue()) | ASSERT_EQ(invalid_increment.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(invalid_increment.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" "ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_EQ(nonfinite.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(nonfinite.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"") | EXPECT_FALSE(MakeFiniteRotationState(Vector3{}, invalid_frame).HasValue()) | ASSERT_TRUE(committed.HasValue()) | ASSERT_FALSE(invalid_increment.HasValue()) | ASSERT_EQ(invalid_increment.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(invalid_increment.GetStatus().Diagnostics()[0U].code, ""invalid-accepted-state"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/finite_rotation_test.cpp support@1-97 helper/oracle/fixture/include/static assertion 구간: fesa, InitialFrame, Transpose, Multiply, Determinant, IsFinite, if, ExpectMatrixNear, ExpectVectorNear, ExpectProperOrthogonal tests/unit/elements/finite_rotation_test.cpp file-support 유지 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. 214fd606ec176af7e65bf83ad0dd1cdaf0a15c0de6afd34a6fc06b5596dfab88 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/finite_rotation_test.cpp support@244-246 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/elements/finite_rotation_test.cpp file-support 유지 원래 3-column inverse identity를 SpatialMomentSO3의 모든 unit-vector solve로 이관한다. 1e-11과 finite 검사를 유지하고 Refactor의 독립 z-axis virtual-work 검사를 함께 남긴다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/hex8_element_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 34개 tests/unit/elements/hex8_element_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 978acb597d8a388a003add362d3eff59ae3def1be2a2ec7db8f43a0b42e56aed a80b2714cc9ea75d6b97dead96c8ff8d443812c306278883e54a74d8b4515d40 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.ExactBrickStiffnessAndRowSumLumpedMass Hex8Element.ExactBrickStiffnessAndRowSumLumpedMass; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.ExactBrickStiffnessAndRowSumLumpedMass 유지 원문 검사 body 및 assertion 동일. 4958ab7f7854bb45aa79de051af75399166c78d31010d04061a611e3f1b0af57 4958ab7f7854bb45aa79de051af75399166c78d31010d04061a611e3f1b0af57 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(k.Rows(), 24U) | ASSERT_EQ(m.Columns(), 24U) | EXPECT_NEAR(k(3 * a + i, 3 * b + j), exact, 2e-12) | EXPECT_NEAR(m(3 * a + i, 3 * b + j), expected_mass, 2e-14) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(stiffness.HasValue()) | ASSERT_TRUE(mass.HasValue()) | ASSERT_EQ(k.Rows(), 24U) | ASSERT_EQ(m.Columns(), 24U) | EXPECT_NEAR(k(3 * a + i, 3 * b + j), exact, 2e-12) | EXPECT_NEAR(m(3 * a + i, 3 * b + j), expected_mass, 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.AffineTensorShearAndEightDistinctRecoveryPoints Hex8Element.AffineTensorShearAndEightDistinctRecoveryPoints; assertion 13개 tests/unit/elements/hex8_element_test.cpp Hex8Element.AffineTensorShearAndEightDistinctRecoveryPoints 유지 원문 검사 body 및 assertion 동일. 313b67ab5495cf7f93ddcbf2e7b5060057d3b60bbe619ea1a8bf18aa0c834287 313b67ab5495cf7f93ddcbf2e7b5060057d3b60bbe619ea1a8bf18aa0c834287 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 48.0 * 48.0 * 0.0002, 1e-12) | EXPECT_EQ(p.element, 7U) | EXPECT_EQ(p.integration_point, static_cast(g + 1)) | EXPECT_NEAR(p.strain[3], 0.01, 1e-16) | EXPECT_NEAR(p.cauchy_stress[3], 0.96, 1e-14) | EXPECT_DOUBLE_EQ(p.natural_coordinates[i], natural[i]) | EXPECT_NEAR(p.reference_coordinates[i], natural[i] * static_cast(i + 1U), 2e-15) | EXPECT_LT(r.Value().points[2].natural_coordinates[0], 0.0) | EXPECT_GT(r.Value().points[2].natural_coordinates[1], 0.0) | ASSERT_TRUE(recovered.HasValue()) | EXPECT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 48.0 * 48.0 * 0.0002, 1e-12) | EXPECT_EQ(p.element, 7U) | EXPECT_EQ(p.integration_point, static_cast(g + 1)) | EXPECT_NEAR(p.strain[3], 0.01, 1e-16) | EXPECT_NEAR(p.cauchy_stress[3], 0.96, 1e-14) | EXPECT_DOUBLE_EQ(p.natural_coordinates[i], natural[i]) | EXPECT_NEAR(p.reference_coordinates[i], natural[i] * static_cast(i + 1U), 2e-15) | EXPECT_LT(r.Value().points[2].natural_coordinates[0], 0.0) | EXPECT_GT(r.Value().points[2].natural_coordinates[1], 0.0) | ASSERT_TRUE(recovered.HasValue()) | EXPECT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.UniformTranslationHasExactlyZeroLinearForceAndEnergy Hex8Element.UniformTranslationHasExactlyZeroLinearForceAndEnergy; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.UniformTranslationHasExactlyZeroLinearForceAndEnergy 유지 원문 검사 body 및 assertion 동일. d26359e5ed35c184732756cded1c265d5d66185d9350490c6338e407985d9af7 d26359e5ed35c184732756cded1c265d5d66185d9350490c6338e407985d9af7 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().strain_energy, 0.0) | EXPECT_EQ(response.Value().internal_force[i], 0.0) | EXPECT_EQ(point.strain[i], 0.0) | EXPECT_EQ(point.cauchy_stress[i], 0.0) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_EQ(response.Value().strain_energy, 0.0) | EXPECT_EQ(response.Value().internal_force[i], 0.0) | EXPECT_EQ(point.strain[i], 0.0) | EXPECT_EQ(point.cauchy_stress[i], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearResponseIsUnchangedByExactlyRepresentableTranslation Hex8Element.LinearResponseIsUnchangedByExactlyRepresentableTranslation; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearResponseIsUnchangedByExactlyRepresentableTranslation 유지 원문 검사 body 및 assertion 동일. b6369e091941f9510897d937e44e5aea48b57bb6b78b0075ad1061ff7a9de3ab b6369e091941f9510897d937e44e5aea48b57bb6b78b0075ad1061ff7a9de3ab ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_EQ(translated.Value().strain_energy, original.Value().strain_energy) | EXPECT_EQ(translated.Value().internal_force[i], original.Value().internal_force[i]) | EXPECT_EQ(translated.Value().points[g].strain, original.Value().points[g].strain) | EXPECT_EQ(translated.Value().points[g].cauchy_stress, original.Value().points[g].cauchy_stress) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(translated.HasValue()) | EXPECT_EQ(translated.Value().strain_energy, original.Value().strain_energy) | EXPECT_EQ(translated.Value().internal_force[i], original.Value().internal_force[i]) | EXPECT_EQ(translated.Value().points[g].strain, original.Value().points[g].strain) | EXPECT_EQ(translated.Value().points[g].cauchy_stress, original.Value().points[g].cauchy_stress) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.TinySignedAffineStretchRetainsStvkStressForceAndEnergy Hex8Element.TinySignedAffineStretchRetainsStvkStressForceAndEnergy; assertion 8개 tests/unit/elements/hex8_element_test.cpp Hex8Element.TinySignedAffineStretchRetainsStvkStressForceAndEnergy 유지 원문 검사 body 및 assertion 동일. 78a9f3a03973517e375627e6db91c92f87055a4a578afaad01162ecd40bb8807 78a9f3a03973517e375627e6db91c92f87055a4a578afaad01162ecd40bb8807 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected_energy, 1e-12 * expected_energy) | EXPECT_NEAR(point.strain[0], green, 1e-12 * std::abs(green)) | EXPECT_NEAR(point.cauchy_stress[0], (1.0 + stretch) * sxx, 1e-12 * std::abs(sxx)) | EXPECT_NEAR(point.cauchy_stress[1], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(point.cauchy_stress[2], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(response.Value().internal_force[3U * a + i], expected[i], 1e-12 * std::abs(expected[i])) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected_energy, 1e-12 * expected_energy) | EXPECT_NEAR(point.strain[0], green, 1e-12 * std::abs(green)) | EXPECT_NEAR(point.cauchy_stress[0], (1.0 + stretch) * sxx, 1e-12 * std::abs(sxx)) | EXPECT_NEAR(point.cauchy_stress[1], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(point.cauchy_stress[2], syy / (1.0 + stretch), 1e-12 * std::abs(syy)) | EXPECT_NEAR(response.Value().internal_force[3U * a + i], expected[i], 1e-12 * std::abs(expected[i])) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteRigidRotationHasZeroGreenEnergyAndForce Hex8Element.FiniteRigidRotationHasZeroGreenEnergyAndForce; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteRigidRotationHasZeroGreenEnergyAndForce 유지 원문 검사 body 및 assertion 동일. e455a9ed32fdd0e8e47fc3c290a1b727a91e2fa4e8bdaf6fbdc1afcf350feff8 e455a9ed32fdd0e8e47fc3c290a1b727a91e2fa4e8bdaf6fbdc1afcf350feff8 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 0.0, 1e-25) | EXPECT_LT(r.Value().internal_force.Norm(), 1e-11) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(r.Value().strain_energy, 0.0, 1e-25) | EXPECT_LT(r.Value().internal_force.Norm(), 1e-11) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsCollapsedAndInvalidMaterial Hex8Element.RejectsCollapsedAndInvalidMaterial; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsCollapsedAndInvalidMaterial 유지 원문 검사 body 및 assertion 동일. f7a6d301ea33b5e96a07e058df286d6cd4862431368a3073a678fb7d25013412 f7a6d301ea33b5e96a07e058df286d6cd4862431368a3073a678fb7d25013412 EXPECT_FALSE(Make(x).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, 0.5).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, -1.0).HasValue()) EXPECT_FALSE(Make(x).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, 0.5).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, -1.0).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.CertifiesPositiveQuadraticAfterSubdivision Hex8Element.CertifiesPositiveQuadraticAfterSubdivision; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.CertifiesPositiveQuadraticAfterSubdivision 유지 원문 검사 body 및 assertion 동일. 95b193341de90670eec4e7255153d7dceed178a93f1f64c003a50b742b00a37d 95b193341de90670eec4e7255153d7dceed178a93f1f64c003a50b742b00a37d ASSERT_TRUE(r.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(total, 2.0 * 8.0 * (.1125 + 1.0 / 3.0), 2e-14) ASSERT_TRUE(r.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(total, 2.0 * 8.0 * (.1125 + 1.0 / 3.0), 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsInteriorFoldDespiteAll27SamplesAndGaussBeingPositive Hex8Element.RejectsInteriorFoldDespiteAll27SamplesAndGaussBeingPositive; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsInteriorFoldDespiteAll27SamplesAndGaussBeingPositive 유지 원문 검사 body 및 assertion 동일. bbc9326a1a8cd88f3825aed2389ec7e1ef842966741646d352f0832789f5d0c2 bbc9326a1a8cd88f3825aed2389ec7e1ef842966741646d352f0832789f5d0c2 "EXPECT_GT(xi * xi - .5 * xi + .0575, 0.0) | EXPECT_LT(.25 * .25 - .5 * .25 + .0575, 0.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""nonpositive""), std::string::npos) | ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) | EXPECT_FALSE(valid.Value().EvaluateLinear(u).HasValue())" "EXPECT_GT(xi * xi - .5 * xi + .0575, 0.0) | EXPECT_LT(.25 * .25 - .5 * .25 + .0575, 0.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""nonpositive""), std::string::npos) | ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) | EXPECT_FALSE(valid.Value().EvaluateLinear(u).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.UnresolvedZeroInteriorJacobianFailsClosed Hex8Element.UnresolvedZeroInteriorJacobianFailsClosed; assertion 2개 tests/unit/elements/hex8_element_test.cpp Hex8Element.UnresolvedZeroInteriorJacobianFailsClosed 유지 원문 검사 body 및 assertion 동일. 25134743bf7dbd34b8f67e84c1f7410aca7787da7e52867c5219e8fd69b5915a 25134743bf7dbd34b8f67e84c1f7410aca7787da7e52867c5219e8fd69b5915a "ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""unresolved""), std::string::npos)" "ASSERT_FALSE(invalid.HasValue()) | EXPECT_NE(invalid.GetStatus().Diagnostics()[0].message.find(""unresolved""), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.TinyUncertainCurrentAdditionCannotBeAccepted Hex8Element.TinyUncertainCurrentAdditionCannotBeAccepted; assertion 2개 tests/unit/elements/hex8_element_test.cpp Hex8Element.TinyUncertainCurrentAdditionCannotBeAccepted 유지 원문 검사 body 및 assertion 동일. 27e5e73c83e4d58b025bd6e1a66cee4ffbee4247950b398ed98dace4cc6cb471 27e5e73c83e4d58b025bd6e1a66cee4ffbee4247950b398ed98dace4cc6cb471 ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) ASSERT_TRUE(valid.HasValue()) | EXPECT_FALSE(valid.Value().EvaluateNonlinear(u).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.SixRigidModesAndZeroStateTangent Hex8Element.SixRigidModesAndZeroStateTangent; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.SixRigidModesAndZeroStateTangent 유지 원문 검사 body 및 assertion 동일. 981fc257d430c76b022b6abdc8164538b5b2b0ad71090c5ad34aa8687b2600f4 981fc257d430c76b022b6abdc8164538b5b2b0ad71090c5ad34aa8687b2600f4 ASSERT_TRUE(element.HasValue()) | EXPECT_LT(k.Multiply(u).Norm(), 2e-12) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().tangent(i, j), k(i, j), 2e-12) | EXPECT_DOUBLE_EQ(trial.Value().geometric_tangent(i, j), 0.0) | EXPECT_NEAR(k(i, j), k(j, i), 2e-12) ASSERT_TRUE(element.HasValue()) | EXPECT_LT(k.Multiply(u).Norm(), 2e-12) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().tangent(i, j), k(i, j), 2e-12) | EXPECT_DOUBLE_EQ(trial.Value().geometric_tangent(i, j), 0.0) | EXPECT_NEAR(k(i, j), k(j, i), 2e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.RowSumLumpedMassHasAll24PositiveDirectionsAndReferenceInvariance Hex8Element.RowSumLumpedMassHasAll24PositiveDirectionsAndReferenceInvariance; assertion 5개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RowSumLumpedMassHasAll24PositiveDirectionsAndReferenceInvariance 유지 원문 검사 body 및 assertion 동일. 83b4b4951ae0ceb3a1ebba1031cb1b93db157eb11ceafe07c0e9a6efaf526056 83b4b4951ae0ceb3a1ebba1031cb1b93db157eb11ceafe07c0e9a6efaf526056 ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(mv[a], eigenvalue * v[a], 3e-14) | EXPECT_GT(v.Dot(mv), 0.0) | ASSERT_TRUE(element.Value().EvaluateNonlinear(Affine(Brick(), f)).HasValue()) | EXPECT_DOUBLE_EQ(before(i, j), after(i, j)) ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(mv[a], eigenvalue * v[a], 3e-14) | EXPECT_GT(v.Dot(mv), 0.0) | ASSERT_TRUE(element.Value().EvaluateNonlinear(Affine(Brick(), f)).HasValue()) | EXPECT_DOUBLE_EQ(before(i, j), after(i, j)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.GeometryMaterialDensityScalingAndCoordinateCovariance Hex8Element.GeometryMaterialDensityScalingAndCoordinateCovariance; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.GeometryMaterialDensityScalingAndCoordinateCovariance 유지 원문 검사 body 및 assertion 동일. 4eb1091302e1a3fe888acb6e43f848406b05514f67e8e607ebebb448e2c3ae33 4eb1091302e1a3fe888acb6e43f848406b05514f67e8e607ebebb448e2c3ae33 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(rotated_element.HasValue()) | ASSERT_TRUE(scaled.HasValue()) | EXPECT_NEAR(kr(3 * a + i, 3 * b + j), oracle, 3e-12) | EXPECT_NEAR(mr(3 * a + i, 3 * b + j), m(3 * a + i, 3 * b + j), 3e-14) | EXPECT_NEAR(ks(3 * a + i, 3 * b + j), 7.5 * k(3 * a + i, 3 * b + j), 3e-11) | EXPECT_NEAR(ms(3 * a + i, 3 * b + j), 5.0 * 15.625 * m(3 * a + i, 3 * b + j), 3e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(rotated_element.HasValue()) | ASSERT_TRUE(scaled.HasValue()) | EXPECT_NEAR(kr(3 * a + i, 3 * b + j), oracle, 3e-12) | EXPECT_NEAR(mr(3 * a + i, 3 * b + j), m(3 * a + i, 3 * b + j), 3e-14) | EXPECT_NEAR(ks(3 * a + i, 3 * b + j), 7.5 * k(3 * a + i, 3 * b + j), 3e-11) | EXPECT_NEAR(ms(3 * a + i, 3 * b + j), 5.0 * 15.625 * m(3 * a + i, 3 * b + j), 3e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedAffinePatchHasExactEnergyAndGlobalCauchyGreenTensors Hex8Element.WarpedAffinePatchHasExactEnergyAndGlobalCauchyGreenTensors; assertion 7개 tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedAffinePatchHasExactEnergyAndGlobalCauchyGreenTensors 유지 원문 검사 body 및 assertion 동일. fe44f6f0a2891d1d47828642165b5b6797671cfe463b004bbb2fb282a442fd8d fe44f6f0a2891d1d47828642165b5b6797671cfe463b004bbb2fb282a442fd8d ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().strain_energy, volume * (24.0 * trace * trace + 48.0 * contraction), 2e-12) | EXPECT_NEAR(p.strain[c], green[i][j], 5e-16) | EXPECT_NEAR(p.cauchy_stress[c], sigma[i][j], 8e-14) | EXPECT_NEAR(force[i], 0.0, 5e-13) | EXPECT_NEAR(moment[i], 0.0, 2e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | EXPECT_NEAR(trial.Value().strain_energy, volume * (24.0 * trace * trace + 48.0 * contraction), 2e-12) | EXPECT_NEAR(p.strain[c], green[i][j], 5e-16) | EXPECT_NEAR(p.cauchy_stress[c], sigma[i][j], 8e-14) | EXPECT_NEAR(force[i], 0.0, 5e-13) | EXPECT_NEAR(moment[i], 0.0, 2e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.StrainedRigidRotationPreservesEnergyAndCovariantForceTangent Hex8Element.StrainedRigidRotationPreservesEnergyAndCovariantForceTangent; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.StrainedRigidRotationPreservesEnergyAndCovariantForceTangent 유지 원문 검사 body 및 assertion 동일. cdc4257cf115d6d2c10dbdfb298f45077d8821f024dcec44056b2a7a71c3589f cdc4257cf115d6d2c10dbdfb298f45077d8821f024dcec44056b2a7a71c3589f ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | EXPECT_NEAR(rotated.Value().strain_energy, baseline.Value().strain_energy, 3e-12) | EXPECT_NEAR(rotated.Value().internal_force[3 * a + i], expected[i], 3e-12) | EXPECT_NEAR(rotated.Value().tangent(3 * a + i, 3 * b + j), expected_k, 7e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | EXPECT_NEAR(rotated.Value().strain_energy, baseline.Value().strain_energy, 3e-12) | EXPECT_NEAR(rotated.Value().internal_force[3 * a + i], expected[i], 3e-12) | EXPECT_NEAR(rotated.Value().tangent(3 * a + i, 3 * b + j), expected_k, 7e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.EnergyForceAndForceTangentDirectionalStepSweep Hex8Element.EnergyForceAndForceTangentDirectionalStepSweep; assertion 11개 tests/unit/elements/hex8_element_test.cpp Hex8Element.EnergyForceAndForceTangentDirectionalStepSweep 유지 원문 검사 body 및 assertion 동일. c1ac1963af7f68ce46427d45877d677e804ed410b87c23a0a35910fb1386ff55 c1ac1963af7f68ce46427d45877d677e804ed410b87c23a0a35910fb1386ff55 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(energy_error[1], .02 * energy_error[0]) | EXPECT_LT(force_error[1], .02 * force_error[0]) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) | EXPECT_GT(energy_error.back(), *std::min_element(energy_error.begin(), energy_error.end())) | EXPECT_NEAR(trial.Value().tangent(i, j), trial.Value().tangent(j, i), MaxEntry(trial.Value().tangent) * 2e-14) | EXPECT_DOUBLE_EQ(trial.Value().tangent(i, j), trial.Value().material_tangent(i, j) + trial.Value().geometric_tangent(i, j)) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(energy_error[1], .02 * energy_error[0]) | EXPECT_LT(force_error[1], .02 * force_error[0]) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) | EXPECT_GT(energy_error.back(), *std::min_element(energy_error.begin(), energy_error.end())) | EXPECT_NEAR(trial.Value().tangent(i, j), trial.Value().tangent(j, i), MaxEntry(trial.Value().tangent) * 2e-14) | EXPECT_DOUBLE_EQ(trial.Value().tangent(i, j), trial.Value().material_tangent(i, j) + trial.Value().geometric_tangent(i, j)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.TranslatedWarpedLinearResponseRetainsEnergyAndTangentVariation Hex8Element.TranslatedWarpedLinearResponseRetainsEnergyAndTangentVariation; assertion 8개 tests/unit/elements/hex8_element_test.cpp Hex8Element.TranslatedWarpedLinearResponseRetainsEnergyAndTangentVariation 유지 원문 검사 body 및 assertion 동일. 3aee6e7ad64dc19c22977520ef31f2117eb4c6fd4f7fdf4c71fdbc351525e89c 3aee6e7ad64dc19c22977520ef31f2117eb4c6fd4f7fdf4c71fdbc351525e89c ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_NE(derivative, 0.0) | ASSERT_GT(tangent_direction.Norm(), 0.0) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(trial.HasValue()) | ASSERT_NE(derivative, 0.0) | ASSERT_GT(tangent_direction.Norm(), 0.0) | ASSERT_TRUE(rp.HasValue()) | ASSERT_TRUE(rm.HasValue()) | EXPECT_LT(*std::min_element(energy_error.begin(), energy_error.end()), 1e-7) | EXPECT_LT(*std::min_element(force_error.begin(), force_error.end()), 1e-7) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidInputsAndFailedTrialPreservePriorResponseAndReference Hex8Element.InvalidInputsAndFailedTrialPreservePriorResponseAndReference; assertion 23개 tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidInputsAndFailedTrialPreservePriorResponseAndReference 유지 원문 검사 body 및 assertion 동일. eafc89af7adfd7c0e8325f391adaccb0253f22989cd839d88e804ef1747ba172 eafc89af7adfd7c0e8325f391adaccb0253f22989cd839d88e804ef1747ba172 "EXPECT_FALSE(Make(Brick(), 0.0).HasValue()) | EXPECT_FALSE( Make(Brick(), std::numeric_limits::infinity()).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, std::numeric_limits::quiet_NaN()) .HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, 0.0).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, -1.0).HasValue()) | EXPECT_FALSE( Make(Brick(), 120.0, .25, std::numeric_limits::infinity()) .HasValue()) | EXPECT_FALSE(Make(nonfinite).HasValue()) | ASSERT_TRUE(no_density.HasValue()) | EXPECT_FALSE(no_density.Value().ComputeMass().HasValue()) | ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_FALSE(element.Value().EvaluateNonlinear(failed).HasValue()) | EXPECT_FALSE(element.Value().EvaluateLinear(fesa::Vector{23U}).HasValue()) | EXPECT_FALSE(Make(inverted).HasValue()) | ASSERT_TRUE(again.HasValue()) | EXPECT_DOUBLE_EQ(accepted.Value().strain_energy, again.Value().strain_energy) | EXPECT_DOUBLE_EQ(accepted.Value().internal_force[i], again.Value().internal_force[i]) | EXPECT_DOUBLE_EQ(accepted.Value().tangent(i, j), again.Value().tangent(i, j)) | ASSERT_FALSE(failure.HasValue()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(diagnostic.location.line, 4U) | EXPECT_EQ(diagnostic.keyword, ""C3D8"") | EXPECT_EQ(diagnostic.entity_identity, ""PART-1:42"")" "EXPECT_FALSE(Make(Brick(), 0.0).HasValue()) | EXPECT_FALSE( Make(Brick(), std::numeric_limits::infinity()).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, std::numeric_limits::quiet_NaN()) .HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, 0.0).HasValue()) | EXPECT_FALSE(Make(Brick(), 120.0, .25, -1.0).HasValue()) | EXPECT_FALSE( Make(Brick(), 120.0, .25, std::numeric_limits::infinity()) .HasValue()) | EXPECT_FALSE(Make(nonfinite).HasValue()) | ASSERT_TRUE(no_density.HasValue()) | EXPECT_FALSE(no_density.Value().ComputeMass().HasValue()) | ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(accepted.HasValue()) | EXPECT_FALSE(element.Value().EvaluateNonlinear(failed).HasValue()) | EXPECT_FALSE(element.Value().EvaluateLinear(fesa::Vector{23U}).HasValue()) | EXPECT_FALSE(Make(inverted).HasValue()) | ASSERT_TRUE(again.HasValue()) | EXPECT_DOUBLE_EQ(accepted.Value().strain_energy, again.Value().strain_energy) | EXPECT_DOUBLE_EQ(accepted.Value().internal_force[i], again.Value().internal_force[i]) | EXPECT_DOUBLE_EQ(accepted.Value().tangent(i, j), again.Value().tangent(i, j)) | ASSERT_FALSE(failure.HasValue()) | EXPECT_EQ(failure.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_EQ(diagnostic.location.line, 4U) | EXPECT_EQ(diagnostic.keyword, ""C3D8"") | EXPECT_EQ(diagnostic.entity_identity, ""PART-1:42"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidLayoutsAreRejectedBeforeNumericalWork Hex8Element.InvalidLayoutsAreRejectedBeforeNumericalWork; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.InvalidLayoutsAreRejectedBeforeNumericalWork 유지 원문 검사 body 및 assertion 동일. a7ca0be993c579446617dabcfc9a712b6f62501b3ac95ccceb134dd90997bee1 a7ca0be993c579446617dabcfc9a712b6f62501b3ac95ccceb134dd90997bee1 EXPECT_FALSE( fesa::Hex8Element::Create(7U, duplicate, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, missing, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, wrong_order, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, rotation, Brick(), material).HasValue()) EXPECT_FALSE( fesa::Hex8Element::Create(7U, duplicate, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, missing, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, wrong_order, Brick(), material).HasValue()) | EXPECT_FALSE( fesa::Hex8Element::Create(7U, rotation, Brick(), material).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearStiffnessHasOnlyTheSixRigidNullDirections Hex8Element.LinearStiffnessHasOnlyTheSixRigidNullDirections; assertion 2개 tests/unit/elements/hex8_element_test.cpp Hex8Element.LinearStiffnessHasOnlyTheSixRigidNullDirections 유지 원문 검사 body 및 assertion 동일. 87f05ea3e4d1a7ddcb6193da61ab7d81812977f0bb3598ad5b32781d868650f2 87f05ea3e4d1a7ddcb6193da61ab7d81812977f0bb3598ad5b32781d868650f2 ASSERT_TRUE(element.HasValue()) | ASSERT_GT(value, 0.0) ASSERT_TRUE(element.HasValue()) | ASSERT_GT(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.NonlinearSmallLoadApproachesLinearResponse Hex8Element.NonlinearSmallLoadApproachesLinearResponse; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.NonlinearSmallLoadApproachesLinearResponse 유지 원문 검사 body 및 assertion 동일. 3c2e1d6f5f5b8adf802500e646e7efca6aed2be1a4f2b685d98bc30f7927f326 3c2e1d6f5f5b8adf802500e646e7efca6aed2be1a4f2b685d98bc30f7927f326 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(linear.HasValue()) | EXPECT_NEAR(linear.Value().strain_energy, .5 * u.Dot(k.Multiply(u)), 1e-14) | EXPECT_LT(error[1], .12 * error[0]) | EXPECT_LT(error[2], .12 * error[1]) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(linear.HasValue()) | EXPECT_NEAR(linear.Value().strain_energy, .5 * u.Dot(k.Multiply(u)), 1e-14) | EXPECT_LT(error[1], .12 * error[0]) | EXPECT_LT(error[2], .12 * error[1]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsUnrepresentableShearAndMassInsteadOfReturningZeros Hex8Element.RejectsUnrepresentableShearAndMassInsteadOfReturningZeros; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsUnrepresentableShearAndMassInsteadOfReturningZeros 유지 원문 검사 body 및 assertion 동일. 030f54c1c851716efb795775685d456b6b30de54201b82b51707735e2ce8993e 030f54c1c851716efb795775685d456b6b30de54201b82b51707735e2ce8993e EXPECT_FALSE(Make(Brick(), tiny, .25).HasValue()) | ASSERT_TRUE(element.HasValue()) | EXPECT_FALSE(element.Value().ComputeMass().HasValue()) EXPECT_FALSE(Make(Brick(), tiny, .25).HasValue()) | ASSERT_TRUE(element.HasValue()) | EXPECT_FALSE(element.Value().ComputeMass().HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.DirectBulkSurvivesNearNegativePoissonBound Hex8Element.DirectBulkSurvivesNearNegativePoissonBound; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.DirectBulkSurvivesNearNegativePoissonBound 유지 원문 검사 body 및 assertion 동일. b409b61a9964e0974b9805bd990ef6c7ff26668ed043b3966161af7cd68927ce b409b61a9964e0974b9805bd990ef6c7ff26668ed043b3966161af7cd68927ce ASSERT_TRUE(element.HasValue()) | EXPECT_GT(1.0 / (3.0 * (1.0 - 2.0 * nu)), 0.0) | EXPECT_TRUE(element.Value().EvaluateLinear(zero).HasValue()) ASSERT_TRUE(element.HasValue()) | EXPECT_GT(1.0 / (3.0 * (1.0 - 2.0 * nu)), 0.0) | EXPECT_TRUE(element.Value().EvaluateLinear(zero).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.OrdinaryNegativePoissonRatioRetainsPositiveVolumetricEnergy Hex8Element.OrdinaryNegativePoissonRatioRetainsPositiveVolumetricEnergy; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.OrdinaryNegativePoissonRatioRetainsPositiveVolumetricEnergy 유지 원문 검사 body 및 assertion 동일. b73dc4b5fd199b08ca51058ccbaf627b1e6a18d8977180164595181c99323fb7 b73dc4b5fd199b08ca51058ccbaf627b1e6a18d8977180164595181c99323fb7 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, 48.0 * .5 * bulk * trace * trace, 2e-14) | EXPECT_NEAR(point.cauchy_stress[i], bulk * trace, 2e-14) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, 48.0 * .5 * bulk * trace * trace, 2e-14) | EXPECT_NEAR(point.cauchy_stress[i], bulk * trace, 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteInputsThatOverflowDerivedArithmeticFailClosed Hex8Element.FiniteInputsThatOverflowDerivedArithmeticFailClosed; assertion 10개 tests/unit/elements/hex8_element_test.cpp Hex8Element.FiniteInputsThatOverflowDerivedArithmeticFailClosed 유지 원문 검사 body 및 assertion 동일. 5e6ac7207369709d94127e8b67d20735dc11818d5ff0e03fe463d16a3c34300f 5e6ac7207369709d94127e8b67d20735dc11818d5ff0e03fe463d16a3c34300f "ASSERT_FALSE(bad_material.HasValue()) | EXPECT_NE(bad_material.GetStatus().Diagnostics()[0].message.find(""finite""), std::string::npos) | ASSERT_FALSE(bad_geometry.HasValue()) | EXPECT_NE(bad_geometry.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_TRUE(element.HasValue()) | ASSERT_FALSE(bad_mass.HasValue()) | EXPECT_NE(bad_mass.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_FALSE(bad_trial.HasValue()) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""trial""), std::string::npos) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" "ASSERT_FALSE(bad_material.HasValue()) | EXPECT_NE(bad_material.GetStatus().Diagnostics()[0].message.find(""finite""), std::string::npos) | ASSERT_FALSE(bad_geometry.HasValue()) | EXPECT_NE(bad_geometry.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_TRUE(element.HasValue()) | ASSERT_FALSE(bad_mass.HasValue()) | EXPECT_NE(bad_mass.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos) | ASSERT_FALSE(bad_trial.HasValue()) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""trial""), std::string::npos) | EXPECT_NE(bad_trial.GetStatus().Diagnostics()[0].message.find(""nonfinite""), std::string::npos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedRowSumMassMatchesIndependentNodalIntegralsAndNonuniformEnergy Hex8Element.WarpedRowSumMassMatchesIndependentNodalIntegralsAndNonuniformEnergy; assertion 6개 tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedRowSumMassMatchesIndependentNodalIntegralsAndNonuniformEnergy 유지 원문 검사 body 및 assertion 동일. bf8a73def3fe445aed1d34414e6487babf97967f7a2eee63f30dc54cc56e719b bf8a73def3fe445aed1d34414e6487babf97967f7a2eee63f30dc54cc56e719b ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(actual(3U * a + i, 3U * a + j), i == j ? expected[a] : 0.0, 3e-14) | EXPECT_GT(max_nodal - min_nodal, 1e-4) | EXPECT_NEAR(lumped_energy, independent_energy, 3e-14 * independent_energy) | EXPECT_GT(std::abs(lumped_energy - uniform_energy), 1e-4) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(actual(3U * a + i, 3U * a + j), i == j ? expected[a] : 0.0, 3e-14) | EXPECT_GT(max_nodal - min_nodal, 1e-4) | EXPECT_NEAR(lumped_energy, independent_energy, 3e-14 * independent_energy) | EXPECT_GT(std::abs(lumped_energy - uniform_energy), 1e-4) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedNonaffineQuadratureDifferenceIsQuantifiedAndRefines Hex8Element.WarpedNonaffineQuadratureDifferenceIsQuantifiedAndRefines; assertion 4개 tests/unit/elements/hex8_element_test.cpp Hex8Element.WarpedNonaffineQuadratureDifferenceIsQuantifiedAndRefines 유지 원문 검사 body 및 assertion 동일. 5d17d7efabd51400aebc4c48b3b6ce69588a7ceabc7181514c40a0fbc9b85a80 5d17d7efabd51400aebc4c48b3b6ce69588a7ceabc7181514c40a0fbc9b85a80 ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(.5 * u.Dot(k.Multiply(u)), q2[0], budget * q2[0]) | EXPECT_GT(stiffness_discrepancy, 1e-8) | EXPECT_LT(std::abs(q5[0] - q7[0]), .05 * std::abs(q3[0] - q7[0])) ASSERT_TRUE(element.HasValue()) | EXPECT_NEAR(.5 * u.Dot(k.Multiply(u)), q2[0], budget * q2[0]) | EXPECT_GT(stiffness_discrepancy, 1e-8) | EXPECT_LT(std::abs(q5[0] - q7[0]), .05 * std::abs(q3[0] - q7[0])) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeNonaffinePolynomialEnergyForceHessianAndActualStrain Hex8Element.MeanVolumeNonaffinePolynomialEnergyForceHessianAndActualStrain; assertion 14개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeNonaffinePolynomialEnergyForceHessianAndActualStrain 유지 원문 검사 body 및 assertion 동일. 57b07c678307c09776b4d21ca346b44d0c11e07901b38c8ded396f3d1b7a05e4 57b07c678307c09776b4d21ca346b44d0c11e07901b38c8ded396f3d1b7a05e4 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(r.strain_energy, energy, 2e-14) | EXPECT_NEAR(r.internal_force[6] + r.internal_force[18], force, 2e-13) | EXPECT_NEAR(r.tangent(6, 6) + r.tangent(6, 18) + r.tangent(18, 6) + r.tangent(18, 18), hessian, 2e-12) | EXPECT_NEAR(point.strain[0], exx, 2e-15) | EXPECT_NEAR(point.strain[1], eyy, 2e-15) | EXPECT_NEAR(point.strain[3], exy, 2e-15) | EXPECT_NEAR( point.cauchy_stress[0], nonlinear ? (t * t * sxx + 2 * t * c * px * sxy + c * c * px * px * syy) / t : sxx, 2e-13) | EXPECT_NEAR(point.cauchy_stress[1], nonlinear ? syy / t : syy, 2e-13) | EXPECT_NEAR(point.cauchy_stress[2], nonlinear ? szz / t : szz, 2e-13) | EXPECT_NEAR(point.cauchy_stress[3], nonlinear ? (t * sxy + c * px * syy) / t : sxy, 2e-13) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(r.strain_energy, energy, 2e-14) | EXPECT_NEAR(r.internal_force[6] + r.internal_force[18], force, 2e-13) | EXPECT_NEAR(r.tangent(6, 6) + r.tangent(6, 18) + r.tangent(18, 6) + r.tangent(18, 18), hessian, 2e-12) | EXPECT_NEAR(point.strain[0], exx, 2e-15) | EXPECT_NEAR(point.strain[1], eyy, 2e-15) | EXPECT_NEAR(point.strain[3], exy, 2e-15) | EXPECT_NEAR( point.cauchy_stress[0], nonlinear ? (t * t * sxx + 2 * t * c * px * sxy + c * c * px * px * syy) / t : sxx, 2e-13) | EXPECT_NEAR(point.cauchy_stress[1], nonlinear ? syy / t : syy, 2e-13) | EXPECT_NEAR(point.cauchy_stress[2], nonlinear ? szz / t : szz, 2e-13) | EXPECT_NEAR(point.cauchy_stress[3], nonlinear ? (t * sxy + c * px * syy) / t : sxy, 2e-13) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedStressUsesReferenceWeightedTrace Hex8Element.MeanVolumeWarpedStressUsesReferenceWeightedTrace; assertion 5개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedStressUsesReferenceWeightedTrace 유지 원문 검사 body 및 assertion 동일. 59532de38aa69f4c4457d06696198fcd7c2f3a8fa6ff9c031d5167d0997ff48f 59532de38aa69f4c4457d06696198fcd7c2f3a8fa6ff9c031d5167d0997ff48f ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_GT(std::abs(mean - arithmetic), 1e-8) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 80 * mean, 2e-13) | EXPECT_NEAR(response.Value().strain_energy, WarpedQuadratureEnergies(u, 2)[0], 2e-12) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_GT(std::abs(mean - arithmetic), 1e-8) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 80 * mean, 2e-13) | EXPECT_NEAR(response.Value().strain_energy, WarpedQuadratureEnergies(u, 2)[0], 2e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeDirectBulkSupportsBoundsWithoutLambdaOrThreeBulkGuard Hex8Element.MeanVolumeDirectBulkSupportsBoundsWithoutLambdaOrThreeBulkGuard; assertion 9개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeDirectBulkSupportsBoundsWithoutLambdaOrThreeBulkGuard 유지 원문 검사 body 및 assertion 동일. c28569a10dbd624762f2603dcbc1fde256d3cb97dba712040d799994fbf19f2f c28569a10dbd624762f2603dcbc1fde256d3cb97dba712040d799994fbf19f2f EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 12, std::nextafter(-1.0, 0.0)).HasValue()) | EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 1, std::nextafter(.5, 0.0)).HasValue()) | ASSERT_TRUE(huge.HasValue()) | ASSERT_TRUE(std::isfinite(direct_bulk)) | ASSERT_FALSE(std::isfinite(3 * direct_bulk)) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected, 1e-13 * expected) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), 1e308, .499).HasValue()) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), std::numeric_limits::denorm_min(), -.5) .HasValue()) EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 12, std::nextafter(-1.0, 0.0)).HasValue()) | EXPECT_TRUE( Make(MeanVolumeUnitBrick(), 1, std::nextafter(.5, 0.0)).HasValue()) | ASSERT_TRUE(huge.HasValue()) | ASSERT_TRUE(std::isfinite(direct_bulk)) | ASSERT_FALSE(std::isfinite(3 * direct_bulk)) | ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, expected, 1e-13 * expected) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), 1e308, .499).HasValue()) | EXPECT_FALSE(Make(MeanVolumeUnitBrick(), std::numeric_limits::denorm_min(), -.5) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedIndependentEnergyHasCoupledNodeZeroDerivatives Hex8Element.MeanVolumeWarpedIndependentEnergyHasCoupledNodeZeroDerivatives; assertion 9개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedIndependentEnergyHasCoupledNodeZeroDerivatives 유지 원문 검사 body 및 assertion 동일. 3b485161230c69549e449fb7f27b5a942570fa036874622b9d715638e65df1e2 3b485161230c69549e449fb7f27b5a942570fa036874622b9d715638e65df1e2 ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(paired.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, energy, 2e-12) | EXPECT_NEAR(paired.Value().high.strain_energy, energy, 2e-12) | EXPECT_NEAR(direction.Dot(response.Value().internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(paired.Value().high.internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(response.Value().tangent.Multiply(direction)), ddf, 2e-8) | EXPECT_NEAR(direction.Dot(paired.Value().high.tangent.Multiply(direction)), ddf, 2e-8) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(paired.HasValue()) | EXPECT_NEAR(response.Value().strain_energy, energy, 2e-12) | EXPECT_NEAR(paired.Value().high.strain_energy, energy, 2e-12) | EXPECT_NEAR(direction.Dot(response.Value().internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(paired.Value().high.internal_force), df, 2e-10) | EXPECT_NEAR(direction.Dot(response.Value().tangent.Multiply(direction)), ddf, 2e-8) | EXPECT_NEAR(direction.Dot(paired.Value().high.tangent.Multiply(direction)), ddf, 2e-8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedLowOnlyStateRetainsWeightedCubicEnergy Hex8Element.MeanVolumeWarpedLowOnlyStateRetainsWeightedCubicEnergy; assertion 8개 tests/unit/elements/hex8_element_test.cpp Hex8Element.MeanVolumeWarpedLowOnlyStateRetainsWeightedCubicEnergy 유지 원문 검사 body 및 assertion 동일. b232e31a9ebe5946b4d1192b8712f0debd77a8a716c425571f5e2c83529bf37b b232e31a9ebe5946b4d1192b8712f0debd77a8a716c425571f5e2c83529bf37b ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(linear.Value().high.strain_energy, quadratic * c * c, 1e-12 * c * c) | EXPECT_NEAR(actual_cubic.high, cubic * c * c * c, 1e-11 * c * c * c) | EXPECT_NE(actual_cubic.high, 0) ASSERT_TRUE(element.HasValue()) | ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(linear.Value().high.strain_energy, quadratic * c * c, 1e-12 * c * c) | EXPECT_NEAR(actual_cubic.high, cubic * c * c * c, 1e-11 * c * c * c) | EXPECT_NE(actual_cubic.high, 0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsNonfiniteCanonicalJacobianActionBeforeFiniteGradients Hex8Element.RejectsNonfiniteCanonicalJacobianActionBeforeFiniteGradients; assertion 3개 tests/unit/elements/hex8_element_test.cpp Hex8Element.RejectsNonfiniteCanonicalJacobianActionBeforeFiniteGradients 유지 원문 검사 body 및 assertion 동일. 80b5afadd859d166f5d9d8aa945ee6da72ffe74085fe940faab94f467cf827e4 80b5afadd859d166f5d9d8aa945ee6da72ffe74085fe940faab94f467cf827e4 "ASSERT_FALSE(rejected.HasValue()) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].message, ""Reference Jacobian inverse is nonfinite."")" "ASSERT_FALSE(rejected.HasValue()) | ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].message, ""Reference Jacobian inverse is nonfinite."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/hex8_element_test.cpp support@1-50 helper/oracle/fixture/include/static assertion 구간: Brick, Make, GradientProduct tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 839b075a0d0eda927ed3a1940c15bef4980783019187ede4daa63b2dd3a9a398 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/hex8_element_test.cpp support@228-268 helper/oracle/fixture/include/static assertion 구간: Rotate, Affine, Warped, QuadraticMap, MaxEntry tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 50c481031d1e74a0a358dee1dddea4c0acb477e97c84969072b8a1a3b50d27b2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/hex8_element_test.cpp support@813-931 helper/oracle/fixture/include/static assertion 구간: LegendreRule, WarpedLumpedMass3x3, for, Cross, WarpedQuadratureEnergies tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f67b10e521588921549e46a4ae49bde140f46022a0aff343b4ce97263808d386 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/hex8_element_test.cpp support@988-994 helper/oracle/fixture/include/static assertion 구간: MeanVolumeUnitBrick tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b1b4b6e8408b50361c87580a49c4b608c96d1d0120b7bdaeea6162789efd43d7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/hex8_element_test.cpp support@1183-1184 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/hex8_element_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c2bd7638f09d52cb034ed574f539304035fc6fab162bf8d5fa20a35d8c7288a1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/hex8_high_low_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 12개 tests/unit/elements/hex8_high_low_test.cpp file 이관 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. bd210e7159c44b5db38e38d37fc8f030f4f98048b973e9971a07e11f692fbc69 892dc78a07a9f7eba27df4cb71e9443359920da45fa7dc5795505d36edf0bc75 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LowOnlyAffineStrainSurvivesUniformHighTranslation Hex8HighLow.LowOnlyAffineStrainSurvivesUniformHighTranslation; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LowOnlyAffineStrainSurvivesUniformHighTranslation 유지 원문 검사 body 및 assertion 동일. 4462f0b7416fafcfad45c7261d11b2ac9efd9b84ecc8174f859764ab23039b7c 4462f0b7416fafcfad45c7261d11b2ac9efd9b84ecc8174f859764ab23039b7c ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().high.internal_force[3 * a], (positive ? 3 : -3) * strain, 1e-13 * strain) | EXPECT_NEAR(response.Value().high.strain_energy, 6 * strain * strain, 1e-13 * strain * strain) | EXPECT_NEAR(row.strain[0], strain, 1e-13 * strain) ASSERT_TRUE(response.HasValue()) | EXPECT_NEAR(response.Value().high.internal_force[3 * a], (positive ? 3 : -3) * strain, 1e-13 * strain) | EXPECT_NEAR(response.Value().high.strain_energy, 6 * strain * strain, 1e-13 * strain * strain) | EXPECT_NEAR(row.strain[0], strain, 1e-13 * strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NonlinearLowGradientProducesSecondOrderForce Hex8HighLow.NonlinearLowGradientProducesSecondOrderForce; assertion 3개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NonlinearLowGradientProducesSecondOrderForce 유지 원문 검사 body 및 assertion 동일. 979f0ef23c5f1008caa390d90e6009aa9a5d31c011169ea1b43a67f5f15da557 979f0ef23c5f1008caa390d90e6009aa9a5d31c011169ea1b43a67f5f15da557 ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(increment.high, 4.5 * strain * strain, 1e-12 * strain * strain) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(increment.high, 4.5 * strain * strain, 1e-12 * strain * strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.VolumetricAndTransverseTermsRetainLowStrain Hex8HighLow.VolumetricAndTransverseTermsRetainLowStrain; assertion 6개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.VolumetricAndTransverseTermsRetainLowStrain 유지 원문 검사 body 및 assertion 동일. 846ec5c0b418ef7ec32bb21ce63c53f4d186afbf40d8c37be769ff45ab8f108e 846ec5c0b418ef7ec32bb21ce63c53f4d186afbf40d8c37be769ff45ab8f108e ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(linear.Value().high.internal_force[3], 3.6*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.internal_force[7], 1.2*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.strain_energy, 7.2*strain*strain, 1e-13*strain*strain) | EXPECT_NEAR(quadratic.high, 5.4*strain*strain, 1e-12*strain*strain) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(linear.Value().high.internal_force[3], 3.6*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.internal_force[7], 1.2*strain, 1e-13*strain) | EXPECT_NEAR(linear.Value().high.strain_energy, 7.2*strain*strain, 1e-13*strain*strain) | EXPECT_NEAR(quadratic.high, 5.4*strain*strain, 1e-12*strain*strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.RejectsInvalidLowShapeAndOverlappingComponents Hex8HighLow.RejectsInvalidLowShapeAndOverlappingComponents; assertion 2개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.RejectsInvalidLowShapeAndOverlappingComponents 유지 원문 검사 body 및 assertion 동일. 7abccdcb75d007db4ef2421719b99cb7e5330d25e5d05d2da511b098a2428848 7abccdcb75d007db4ef2421719b99cb7e5330d25e5d05d2da511b098a2428848 EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | EXPECT_FALSE(brick.EvaluateNonlinearHighLow(high, low).HasValue()) EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | EXPECT_FALSE(brick.EvaluateNonlinearHighLow(high, low).HasValue()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LinearAndNonlinearZeroStateHaveSameFullHessian Hex8HighLow.LinearAndNonlinearZeroStateHaveSameFullHessian; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.LinearAndNonlinearZeroStateHaveSameFullHessian 유지 원문 검사 body 및 assertion 동일. e2079fe27aab893fafc1428c6fd97d975eddd067ca1131589425cc569ece3958 e2079fe27aab893fafc1428c6fd97d975eddd067ca1131589425cc569ece3958 ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_EQ(linear.Value().high.tangent(i, j), nonlinear.Value().high.tangent(i, j)) | EXPECT_EQ(linear.Value().tangent_low(i, j), nonlinear.Value().tangent_low(i, j)) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_EQ(linear.Value().high.tangent(i, j), nonlinear.Value().high.tangent(i, j)) | EXPECT_EQ(linear.Value().tangent_low(i, j), nonlinear.Value().tangent_low(i, j)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CachedLinearHessianIsIndependentOfTrialAndPriorFailure Hex8HighLow.CachedLinearHessianIsIndependentOfTrialAndPriorFailure; assertion 8개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CachedLinearHessianIsIndependentOfTrialAndPriorFailure 유지 원문 검사 body 및 assertion 동일. 046984e4a0f5d6ab548fdef7ea0980b866ff34cbeb603b918c9b1adb76ae7935 046984e4a0f5d6ab548fdef7ea0980b866ff34cbeb603b918c9b1adb76ae7935 ASSERT_TRUE(reference.HasValue()) | EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | ASSERT_TRUE(strained.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), strained.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), strained.Value().tangent_low(i,j)) | ASSERT_TRUE(nonlinear_zero.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), nonlinear_zero.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), nonlinear_zero.Value().tangent_low(i,j)) ASSERT_TRUE(reference.HasValue()) | EXPECT_FALSE(brick.EvaluateLinearHighLow(high, fesa::Vector(23)).HasValue()) | ASSERT_TRUE(strained.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), strained.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), strained.Value().tangent_low(i,j)) | ASSERT_TRUE(nonlinear_zero.HasValue()) | EXPECT_EQ(reference.Value().high.tangent(i,j), nonlinear_zero.Value().high.tangent(i,j)) | EXPECT_EQ(reference.Value().tangent_low(i,j), nonlinear_zero.Value().tangent_low(i,j)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CoupledBricksTransmitLowStrainAcrossSharedFace Hex8HighLow.CoupledBricksTransmitLowStrainAcrossSharedFace; assertion 4개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.CoupledBricksTransmitLowStrainAcrossSharedFace 유지 원문 검사 body 및 assertion 동일. 83ae6a75481955497b50ac6ac1eff98c37df884ba2ed66da2557210deefa72a2 83ae6a75481955497b50ac6ac1eff98c37df884ba2ed66da2557210deefa72a2 ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(assembled.high, 0, 1e-13 * strain) | EXPECT_NEAR(l.Value().high.strain_energy + r.Value().high.strain_energy, 12 * strain * strain, 1e-13 * strain * strain) ASSERT_TRUE(l.HasValue()) | ASSERT_TRUE(r.HasValue()) | EXPECT_NEAR(assembled.high, 0, 1e-13 * strain) | EXPECT_NEAR(l.Value().high.strain_energy + r.Value().high.strain_energy, 12 * strain * strain, 1e-13 * strain * strain) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NodeZeroSignedDirectionMatchesForceAndEnergyDerivatives Hex8HighLow.NodeZeroSignedDirectionMatchesForceAndEnergyDerivatives; assertion 5개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.NodeZeroSignedDirectionMatchesForceAndEnergyDerivatives 유지 원문 검사 body 및 assertion 동일. 8ca0e0b8462f489c123d6d5a32a0ae42c56b897b155459e2e7c55dfa8c030d0d 8ca0e0b8462f489c123d6d5a32a0ae42c56b897b155459e2e7c55dfa8c030d0d ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_LE(std::abs(error.high), 1e-25) | EXPECT_LE(std::abs(energy_error.high), 32 * step * step + 1e-44) ASSERT_TRUE(baseline.HasValue()) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_LE(std::abs(error.high), 1e-25) | EXPECT_LE(std::abs(energy_error.high), 32 * step * step + 1e-44) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryCertificateIncludesLowOnlyCurrentCellWidth Hex8HighLow.GeometryCertificateIncludesLowOnlyCurrentCellWidth; assertion 3개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.GeometryCertificateIncludesLowOnlyCurrentCellWidth 유지 원문 검사 body 및 assertion 동일. a99f71b85735e03d5245e265d4b95f2b624f4b5475c1f1ff15ea665e18c72c4d a99f71b85735e03d5245e265d4b95f2b624f4b5475c1f1ff15ea665e18c72c4d EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &positive_low), Certificate::kPositive) | EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &negative_low), Certificate::kNonpositive) | EXPECT_NE(fesa::hex8_internal::Certify(coordinates, &high), Certificate::kPositive) EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &positive_low), Certificate::kPositive) | EXPECT_EQ(fesa::hex8_internal::Certify(coordinates, &high, &negative_low), Certificate::kNonpositive) | EXPECT_NE(fesa::hex8_internal::Certify(coordinates, &high), Certificate::kPositive) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.SignedZeroMaterialCoefficientHasIdenticalResponse Hex8HighLow.SignedZeroMaterialCoefficientHasIdenticalResponse; assertion 8개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.SignedZeroMaterialCoefficientHasIdenticalResponse 유지 원문 검사 body 및 assertion 동일. 3972742ed5e27b3dd1f33a5c2fb9a603b32972c71c7ecb8dd341b9c76d18d3d3 3972742ed5e27b3dd1f33a5c2fb9a603b32972c71c7ecb8dd341b9c76d18d3d3 ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_EQ(p.Value().high.strain_energy, n.Value().high.strain_energy) | EXPECT_EQ(p.Value().strain_energy_low, n.Value().strain_energy_low) | EXPECT_EQ(p.Value().high.internal_force[i], n.Value().high.internal_force[i]) | EXPECT_EQ(p.Value().internal_force_low[i], n.Value().internal_force_low[i]) | EXPECT_EQ(p.Value().high.tangent(i,j), n.Value().high.tangent(i,j)) | EXPECT_EQ(p.Value().tangent_low(i,j), n.Value().tangent_low(i,j)) ASSERT_TRUE(p.HasValue()) | ASSERT_TRUE(n.HasValue()) | EXPECT_EQ(p.Value().high.strain_energy, n.Value().high.strain_energy) | EXPECT_EQ(p.Value().strain_energy_low, n.Value().strain_energy_low) | EXPECT_EQ(p.Value().high.internal_force[i], n.Value().high.internal_force[i]) | EXPECT_EQ(p.Value().internal_force_low[i], n.Value().internal_force_low[i]) | EXPECT_EQ(p.Value().high.tangent(i,j), n.Value().high.tangent(i,j)) | EXPECT_EQ(p.Value().tangent_low(i,j), n.Value().tangent_low(i,j)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FiniteRotationRetainsTinyShearForceCovariance Hex8HighLow.FiniteRotationRetainsTinyShearForceCovariance; assertion 7개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.FiniteRotationRetainsTinyShearForceCovariance 유지 원문 검사 body 및 assertion 동일. 397b230944498c7db14592dc4408d7fbdee0199b43be2c7b4d7e68dda9cb08e9 397b230944498c7db14592dc4408d7fbdee0199b43be2c7b4d7e68dda9cb08e9 ASSERT_TRUE(origin.HasValue()) | ASSERT_TRUE(deformed.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(turned_deformed.HasValue()) | EXPECT_LE(std::abs(Add(rotated[0], baseline[1]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[1], baseline[0]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[2], baseline[2]).high), 1e-13*gamma) ASSERT_TRUE(origin.HasValue()) | ASSERT_TRUE(deformed.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(turned_deformed.HasValue()) | EXPECT_LE(std::abs(Add(rotated[0], baseline[1]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[1], baseline[0]).high), 1e-13*gamma) | EXPECT_LE(std::abs(Subtract(rotated[2], baseline[2]).high), 1e-13*gamma) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.MeanVolumeLowOnlyNonuniformTraceRetainsMeanAndCrossPointHessian Hex8HighLow.MeanVolumeLowOnlyNonuniformTraceRetainsMeanAndCrossPointHessian; assertion 11개 tests/unit/elements/hex8_high_low_test.cpp Hex8HighLow.MeanVolumeLowOnlyNonuniformTraceRetainsMeanAndCrossPointHessian 유지 원문 검사 body 및 assertion 동일. 45ace4ab87c97eeeb71c680d4cd90bdc4d0b2438c4335b7539a7207529d171fb 45ace4ab87c97eeeb71c680d4cd90bdc4d0b2438c4335b7539a7207529d171fb ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(response.Value().high.strain_energy, coefficient * c * c, 1e-13 * c * c) | EXPECT_NEAR(response.Value().high.internal_force[6] + response.Value().high.internal_force[18], 2 * coefficient * c, 1e-13 * c) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 4 * c, 1e-13 * c) | EXPECT_NEAR(point.strain[0], c * point.reference_coordinates[1], 1e-13 * c) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(cubic_energy.high, (5 * 4.8 / 18 + 8.0 / 6) * c * c * c, 1e-12 * c * c * c) ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(high_only.HasValue()) | EXPECT_EQ(high_only.Value().high.strain_energy, 0) | EXPECT_NEAR(response.Value().high.strain_energy, coefficient * c * c, 1e-13 * c * c) | EXPECT_NEAR(response.Value().high.internal_force[6] + response.Value().high.internal_force[18], 2 * coefficient * c, 1e-13 * c) | EXPECT_NEAR((s[0] + s[1] + s[2]) / 3, 4 * c, 1e-13 * c) | EXPECT_NEAR(point.strain[0], c * point.reference_coordinates[1], 1e-13 * c) | EXPECT_NEAR(k(0, 0), 41.0 / 18, 2e-14) | EXPECT_NEAR(k(0, 1), 19.0 / 30, 2e-14) | ASSERT_TRUE(nonlinear.HasValue()) | EXPECT_NEAR(cubic_energy.high, (5 * 4.8 / 18 + 8.0 / 6) * c * c * c, 1e-12 * c * c * c) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp support@1-29 helper/oracle/fixture/include/static assertion 구간: UnitBrick tests/unit/elements/hex8_high_low_test.cpp file-support 이관 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. 947e889cccadb763476edd5c2ad4179bcce673943fcff78125da063ca8846bd0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/hex8_high_low_test.cpp support@334-334 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/hex8_high_low_test.cpp file-support 유지 독립 frozen oracle를 유지한다. AddPair/MultiplyPair 호출은 공통 math_internal owner로 이관한다. 두 bool 모드가 같은 original Add 값을 요구하던 ScalarPacketAdd는 단일 checked 호출로 연결한다. packet·geometry·특수 lane·동시 실행 검사를 복원한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 1fd73892c2678a5b3ad8fd34edd0292394836a3494c540f4ecc005b6e6a269d9 1fd73892c2678a5b3ad8fd34edd0292394836a3494c540f4ecc005b6e6a269d9 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.PreservesWarpedMomentsRowsAndFirstSpatialMoment Mitc4ShellMassContract.PreservesWarpedMomentsRowsAndFirstSpatialMoment; assertion 4개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.PreservesWarpedMomentsRowsAndFirstSpatialMoment 유지 원문 검사 body 및 assertion 동일. 76f7825ab0d079445fad2d14b91e7d6e835a997d5299706cb5cdc7c05a968c14 76f7825ab0d079445fad2d14b91e7d6e835a997d5299706cb5cdc7c05a968c14 ASSERT_TRUE(mass.HasValue()) | EXPECT_LE(std::abs(value.consistent_moments[moment](row, column) - expected[moment][row][column]) / scale, 1e-12) | EXPECT_LE(std::abs(value.nodal_moments[row][moment] - expected_row) / scale, 1e-12) | EXPECT_LE(difference / (element_mass * std::hypot(2.0, 0.3)), 1e-12) ASSERT_TRUE(mass.HasValue()) | EXPECT_LE(std::abs(value.consistent_moments[moment](row, column) - expected[moment][row][column]) / scale, 1e-12) | EXPECT_LE(std::abs(value.nodal_moments[row][moment] - expected_row) / scale, 1e-12) | EXPECT_LE(difference / (element_mass * std::hypot(2.0, 0.3)), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.RecomputesWarpedMassWithScaledCovariance Mitc4ShellMassContract.RecomputesWarpedMassWithScaledCovariance; assertion 4개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.RecomputesWarpedMassWithScaledCovariance 유지 원문 검사 body 및 assertion 동일. e3e985596112fdd2ba30d9c9f0721d183914e4c7e3e4bb4ae11cd9f32b820991 e3e985596112fdd2ba30d9c9f0721d183914e4c7e3e4bb4ae11cd9f32b820991 ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(transformed_mass.HasValue()) ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(transformed.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(transformed_mass.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.SatisfiesUniformAndJensenEnergyContracts Mitc4ShellMassContract.SatisfiesUniformAndJensenEnergyContracts; assertion 3개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.SatisfiesUniformAndJensenEnergyContracts 유지 원문 검사 body 및 assertion 동일. 4ca13bda8eeda1a740d91e0eca5b06c177bff1348c4c2aae9fb7cd28c36fa25b 4ca13bda8eeda1a740d91e0eca5b06c177bff1348c4c2aae9fb7cd28c36fa25b ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(Quadratic(mass.Value().consistent_global24, translation), Quadratic(mass.Value().lumped_global24, translation), 1e-12) | EXPECT_GE(Quadratic(mass.Value().lumped_global24, field) + 1e-12, Quadratic(mass.Value().consistent_global24, field)) ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(Quadratic(mass.Value().consistent_global24, translation), Quadratic(mass.Value().lumped_global24, translation), 1e-12) | EXPECT_GE(Quadratic(mass.Value().lumped_global24, field) + 1e-12, Quadratic(mass.Value().consistent_global24, field)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.MapsScalarMomentsIntoBothMassBlocks Mitc4ShellMassContract.MapsScalarMomentsIntoBothMassBlocks; assertion 6개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.MapsScalarMomentsIntoBothMassBlocks 유지 원문 검사 body 및 assertion 동일. c3f3d3fcbbb356610124a670ed3e56e053f742c3150650dc3d0690b8a081e44f c3f3d3fcbbb356610124a670ed3e56e053f742c3150650dc3d0690b8a081e44f ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(mass.Value().consistent_global24(row, column), expected_consistent(row, column), 1e-12) | EXPECT_NEAR(mass.Value().lumped_global24(row, column), expected_lumped(row, column), 1e-12) | EXPECT_LE(FrobeniusNorm(consistent_difference, length) / (FrobeniusNorm(mass.Value().consistent_global24, length) + FrobeniusNorm(expected_consistent, length)), 1e-12) | EXPECT_LE(FrobeniusNorm(lumped_difference, length) / (FrobeniusNorm(mass.Value().lumped_global24, length) + FrobeniusNorm(expected_lumped, length)), 1e-12) | EXPECT_LE(std::abs((lumped_work - consistent_work) - pairwise_work) / (lumped_work + consistent_work), 1e-12) ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(mass.Value().consistent_global24(row, column), expected_consistent(row, column), 1e-12) | EXPECT_NEAR(mass.Value().lumped_global24(row, column), expected_lumped(row, column), 1e-12) | EXPECT_LE(FrobeniusNorm(consistent_difference, length) / (FrobeniusNorm(mass.Value().consistent_global24, length) + FrobeniusNorm(expected_consistent, length)), 1e-12) | EXPECT_LE(FrobeniusNorm(lumped_difference, length) / (FrobeniusNorm(mass.Value().lumped_global24, length) + FrobeniusNorm(expected_lumped, length)), 1e-12) | EXPECT_LE(std::abs((lumped_work - consistent_work) - pairwise_work) / (lumped_work + consistent_work), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.ReproducesAffineSquareVelocityWork Mitc4ShellMassContract.ReproducesAffineSquareVelocityWork; assertion 4개 tests/unit/elements/mitc4_shell_mass_contract_test.cpp Mitc4ShellMassContract.ReproducesAffineSquareVelocityWork 유지 원문 검사 body 및 assertion 동일. 7f75a86e005eff60d026f8d15ee5cae2fa95e0ee4232fca201dcb8f8f81df18c 7f75a86e005eff60d026f8d15ee5cae2fa95e0ee4232fca201dcb8f8f81df18c ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(consistent_work, 4.0 / 3.0, 1e-12) | EXPECT_NEAR(lumped_work - consistent_work, 8.0 / (3.0 * mesh * mesh), 1e-12) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(mass.HasValue()) | EXPECT_NEAR(consistent_work, 4.0 / 3.0, 1e-12) | EXPECT_NEAR(lumped_work - consistent_work, 8.0 / (3.0 * mesh * mesh), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@1-130 helper/oracle/fixture/include/static assertion 구간: FrobeniusNorm, MaximumEdgeLength, Rotate, DirectorCross, Dot, RotateCongruently, ExpectScaledCovariance, Node, Pointers, WarpedShell, Quadratic tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 80222550f9438f2e2e97eef70b77702be0f22f69e5dfd86f3f5f19eea8635684 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@207-208 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 47dd2fa44f91e342b907e45fa1b98a8b620d5590812aea5a8d5b7ceda6534e82 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@244-246 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 82c1f775b61eb1c42b39d952b6856edb28d0334faf8544d19199125c6142efa5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@263-265 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 311a3ce7805d89cc36a6c5dc4f988aad66e9d65c53bd7fc5dae1c90f7731d0ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@399-400 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 86832b878d6de5792a69735ed18cbdf64bf5f90afdd3d773d77424b25242a7f6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_mass_contract_test.cpp support@435-436 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_mass_contract_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 21개 tests/unit/elements/mitc4_shell_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0099c4e8370d63a61cdf37604008ecc5ff2dc96461b678052febd0a2fa248aa8 0099c4e8370d63a61cdf37604008ecc5ff2dc96461b678052febd0a2fa248aa8 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities; assertion 5개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities 유지 원문 검사 body 및 assertion 동일. ce0d5d609ea4e2f0467991262a26eecb2e3dfe8f67b77325353db454953dfaf3 ce0d5d609ea4e2f0467991262a26eecb2e3dfe8f67b77325353db454953dfaf3 EXPECT_DOUBLE_EQ(shape.values[node_index], point == node_index ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(value_sum, 1.0) | EXPECT_DOUBLE_EQ(xi_derivative_sum, 0.0) | EXPECT_DOUBLE_EQ(eta_derivative_sum, 0.0) | EXPECT_EQ(shape.values, (std::array{0.28125, 0.46875, 0.15625, 0.09375})) EXPECT_DOUBLE_EQ(shape.values[node_index], point == node_index ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(value_sum, 1.0) | EXPECT_DOUBLE_EQ(xi_derivative_sum, 0.0) | EXPECT_DOUBLE_EQ(eta_derivative_sum, 0.0) | EXPECT_EQ(shape.values, (std::array{0.28125, 0.46875, 0.15625, 0.09375})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps; assertion 13개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps 유지 원문 검사 body 및 assertion 동일. a48c1e71779c07d794a93e7fb032fe851a7b6250798b500c11394d304eea2c51 a48c1e71779c07d794a93e7fb032fe851a7b6250798b500c11394d304eea2c51 ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(physical.Rows(), 20U) | ASSERT_EQ(physical.Columns(), 24U) | ASSERT_EQ(drilling.Rows(), 4U) | ASSERT_EQ(drilling.Columns(), 24U) | EXPECT_DOUBLE_EQ( physical(physical_offset + component, global_offset + component), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_offset + 4U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_offset + 5U), 1.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_offset + 3U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_dof), 0.0) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), invalid_directors, Section(), Material()) .HasValue()) ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(physical.Rows(), 20U) | ASSERT_EQ(physical.Columns(), 24U) | ASSERT_EQ(drilling.Rows(), 4U) | ASSERT_EQ(drilling.Columns(), 24U) | EXPECT_DOUBLE_EQ( physical(physical_offset + component, global_offset + component), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_offset + 4U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_offset + 5U), 1.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_offset + 3U), 1.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 3U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(physical(physical_offset + 4U, global_dof), 0.0) | EXPECT_DOUBLE_EQ(drilling(node_index, global_dof), 0.0) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), invalid_directors, Section(), Material()) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples; assertion 37개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples 유지 원문 검사 body 및 assertion 동일. 96cbc6952413ebb1639c3743d6825a4b80c52b4c450d79ccddd004e64fa816c6 96cbc6952413ebb1639c3743d6825a4b80c52b4c450d79ccddd004e64fa816c6 ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(direct.Rows(), 5U) | ASSERT_EQ(direct.Columns(), 20U) | EXPECT_DOUBLE_EQ(direct(0U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(0U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(1U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(1U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(3U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(3U, 4U), 0.25) | EXPECT_DOUBLE_EQ(direct(4U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(4U, 3U), -0.25) | ASSERT_EQ(samples.Rows(), 4U) | ASSERT_EQ(samples.Columns(), 20U) | EXPECT_DOUBLE_EQ(samples(0U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(0U, 4U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 7U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 9U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 14U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 17U), -0.25) | EXPECT_DOUBLE_EQ(samples(1U, 19U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 3U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 17U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 18U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 7U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 8U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(3U, 13U), -0.25) | EXPECT_EQ(weights.xi_zeta, (std::array{0.75, 0.25})) | EXPECT_EQ(weights.eta_zeta, (std::array{0.375, 0.625})) | EXPECT_DOUBLE_EQ(tied(3U, 4U), 2.0 * (0.5 * samples(0U, 4U) + 0.5 * samples(1U, 4U))) | EXPECT_DOUBLE_EQ(tied(4U, 3U), 2.0 * (0.5 * samples(2U, 3U) + 0.5 * samples(3U, 3U))) ASSERT_TRUE(candidate.HasValue()) | ASSERT_EQ(direct.Rows(), 5U) | ASSERT_EQ(direct.Columns(), 20U) | EXPECT_DOUBLE_EQ(direct(0U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(0U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(1U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(1U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 0U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 1U), -0.25) | EXPECT_DOUBLE_EQ(direct(2U, 3U), 0.125) | EXPECT_DOUBLE_EQ(direct(2U, 4U), -0.125) | EXPECT_DOUBLE_EQ(direct(3U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(3U, 4U), 0.25) | EXPECT_DOUBLE_EQ(direct(4U, 2U), -0.25) | EXPECT_DOUBLE_EQ(direct(4U, 3U), -0.25) | ASSERT_EQ(samples.Rows(), 4U) | ASSERT_EQ(samples.Columns(), 20U) | EXPECT_DOUBLE_EQ(samples(0U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(0U, 4U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 7U), 0.25) | EXPECT_DOUBLE_EQ(samples(0U, 9U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 14U), 0.25) | EXPECT_DOUBLE_EQ(samples(1U, 17U), -0.25) | EXPECT_DOUBLE_EQ(samples(1U, 19U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 2U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 3U), -0.25) | EXPECT_DOUBLE_EQ(samples(2U, 17U), 0.25) | EXPECT_DOUBLE_EQ(samples(2U, 18U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 7U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 8U), -0.25) | EXPECT_DOUBLE_EQ(samples(3U, 12U), 0.25) | EXPECT_DOUBLE_EQ(samples(3U, 13U), -0.25) | EXPECT_EQ(weights.xi_zeta, (std::array{0.75, 0.25})) | EXPECT_EQ(weights.eta_zeta, (std::array{0.375, 0.625})) | EXPECT_DOUBLE_EQ(tied(3U, 4U), 2.0 * (0.5 * samples(0U, 4U) + 0.5 * samples(1U, 4U))) | EXPECT_DOUBLE_EQ(tied(4U, 3U), 2.0 * (0.5 * samples(2U, 3U) + 0.5 * samples(3U, 3U))) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits; assertion 25개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits 유지 원문 검사 body 및 assertion 동일. cafb3bc50695fe76a6a088a21953389aedb24938d4af5236ad5e1907069eef70 cafb3bc50695fe76a6a088a21953389aedb24938d4af5236ad5e1907069eef70 ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(cps.Rows(), 3U) | EXPECT_EQ(cps.Columns(), 3U) | EXPECT_EQ(c5.Rows(), 5U) | EXPECT_EQ(c5.Columns(), 5U) | EXPECT_EQ(a.Rows(), 3U) | EXPECT_EQ(d.Rows(), 3U) | EXPECT_EQ(as.Rows(), 2U) | EXPECT_DOUBLE_EQ(cps(0U, 0U), 128.0) | EXPECT_DOUBLE_EQ(cps(0U, 1U), 32.0) | EXPECT_DOUBLE_EQ(cps(2U, 2U), 48.0) | EXPECT_DOUBLE_EQ(c5(3U, 3U), 40.0) | EXPECT_DOUBLE_EQ(c5(4U, 4U), 40.0) | EXPECT_DOUBLE_EQ(a(0U, 0U), 256.0) | EXPECT_NEAR(d(0U, 0U), 256.0 / 3.0, 1.0e-12) | EXPECT_DOUBLE_EQ(as(0U, 0U), 80.0) | EXPECT_TRUE(HasPositiveCholeskyPivots(cps)) | EXPECT_TRUE(HasPositiveCholeskyPivots(c5)) | EXPECT_TRUE(HasPositiveCholeskyPivots(a)) | EXPECT_TRUE(HasPositiveCholeskyPivots(d)) | EXPECT_TRUE(HasPositiveCholeskyPivots(as)) | ASSERT_TRUE(scaled_candidate.HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(0.0), Material()) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(0.0, 0.25)) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(120.0, 0.5)) .HasValue()) ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(cps.Rows(), 3U) | EXPECT_EQ(cps.Columns(), 3U) | EXPECT_EQ(c5.Rows(), 5U) | EXPECT_EQ(c5.Columns(), 5U) | EXPECT_EQ(a.Rows(), 3U) | EXPECT_EQ(d.Rows(), 3U) | EXPECT_EQ(as.Rows(), 2U) | EXPECT_DOUBLE_EQ(cps(0U, 0U), 128.0) | EXPECT_DOUBLE_EQ(cps(0U, 1U), 32.0) | EXPECT_DOUBLE_EQ(cps(2U, 2U), 48.0) | EXPECT_DOUBLE_EQ(c5(3U, 3U), 40.0) | EXPECT_DOUBLE_EQ(c5(4U, 4U), 40.0) | EXPECT_DOUBLE_EQ(a(0U, 0U), 256.0) | EXPECT_NEAR(d(0U, 0U), 256.0 / 3.0, 1.0e-12) | EXPECT_DOUBLE_EQ(as(0U, 0U), 80.0) | EXPECT_TRUE(HasPositiveCholeskyPivots(cps)) | EXPECT_TRUE(HasPositiveCholeskyPivots(c5)) | EXPECT_TRUE(HasPositiveCholeskyPivots(a)) | EXPECT_TRUE(HasPositiveCholeskyPivots(d)) | EXPECT_TRUE(HasPositiveCholeskyPivots(as)) | ASSERT_TRUE(scaled_candidate.HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(0.0), Material()) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(0.0, 0.25)) .HasValue()) | EXPECT_FALSE(fesa::Mitc4Shell::Create(NodePointers(nodes), Directors(), Section(), Material(120.0, 0.5)) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder; assertion 3개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder 유지 원문 검사 body 및 assertion 동일. 65e8535a920578bf82342d17de948fc260aa98d66b9a261545430700d7c0a54b 65e8535a920578bf82342d17de948fc260aa98d66b9a261545430700d7c0a54b ASSERT_EQ(points.size(), 8U) | EXPECT_EQ(points[point].natural_coordinates, expected[point]) | EXPECT_DOUBLE_EQ(points[point].weight, 1.0) ASSERT_EQ(points.size(), 8U) | EXPECT_EQ(points[point].natural_coordinates, expected[point]) | EXPECT_DOUBLE_EQ(points[point].weight, 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness; assertion 14개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness 유지 원문 검사 body 및 assertion 동일. e0c10c61702d95893fa0b05caff80fba991b5bc41ac9085dc477e5b1e1a37a07 e0c10c61702d95893fa0b05caff80fba991b5bc41ac9085dc477e5b1e1a37a07 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(stiffness.physical_local20.Rows(), 20U) | EXPECT_EQ(stiffness.physical_local20.Columns(), 20U) | EXPECT_EQ(stiffness.physical_global24.Rows(), 24U) | EXPECT_EQ(stiffness.drilling_global24.Rows(), 24U) | EXPECT_EQ(stiffness.stabilized_global24.Rows(), 24U) | EXPECT_TRUE(std::isfinite((*matrix)(row, column))) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_local20, 5U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.drilling_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.stabilized_global24, 6U, 2.0), 1.0e-12) | ASSERT_TRUE(repeated_candidate.HasValue()) | EXPECT_DOUBLE_EQ(repeated.drilling_stiffness, stiffness.drilling_stiffness) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(stiffness.physical_local20.Rows(), 20U) | EXPECT_EQ(stiffness.physical_local20.Columns(), 20U) | EXPECT_EQ(stiffness.physical_global24.Rows(), 24U) | EXPECT_EQ(stiffness.drilling_global24.Rows(), 24U) | EXPECT_EQ(stiffness.stabilized_global24.Rows(), 24U) | EXPECT_TRUE(std::isfinite((*matrix)(row, column))) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_local20, 5U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.physical_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.drilling_global24, 6U, 2.0), 1.0e-12) | EXPECT_LE(ScaledSymmetryError(stiffness.stabilized_global24, 6U, 2.0), 1.0e-12) | ASSERT_TRUE(repeated_candidate.HasValue()) | EXPECT_DOUBLE_EQ(repeated.drilling_stiffness, stiffness.drilling_stiffness) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration; assertion 13개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration 유지 원문 검사 body 및 assertion 동일. dd458622e798b9a301ec132ddda748c8225d2dbc21d2623561828c90551d37ce dd458622e798b9a301ec132ddda748c8225d2dbc21d2623561828c90551d37ce ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(frame_e3.X(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Y(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Z(), 1.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 0U), 0x1.d555555555554p+6) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 4U), 0.0) | EXPECT_DOUBLE_EQ(stiffness.physical_global24(2U, 2U), 0x1.aaaaaaaaaaaadp+5) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0x1.20a3d70a3d70bp+6) | EXPECT_EQ(recovery.points[0U].generalized_strain, kExpectedStrain) | EXPECT_DOUBLE_EQ(patch[0U], 0x1.9999999999999p-3) | EXPECT_DOUBLE_EQ(patch[component], 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(frame_e3.X(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Y(), 0.0) | EXPECT_DOUBLE_EQ(frame_e3.Z(), 1.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 0U), 0x1.d555555555554p+6) | EXPECT_DOUBLE_EQ(stiffness.physical_local20(0U, 4U), 0.0) | EXPECT_DOUBLE_EQ(stiffness.physical_global24(2U, 2U), 0x1.aaaaaaaaaaaadp+5) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0x1.20a3d70a3d70bp+6) | EXPECT_EQ(recovery.points[0U].generalized_strain, kExpectedStrain) | EXPECT_DOUBLE_EQ(patch[0U], 0x1.9999999999999p-3) | EXPECT_DOUBLE_EQ(patch[component], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence; assertion 5개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence 유지 원문 검사 body 및 assertion 동일. 2811e8ca758b586de936d283c2520a2cea673d1b676771c2bc74d718e98a74a1 2811e8ca758b586de936d283c2520a2cea673d1b676771c2bc74d718e98a74a1 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_NE(local_energy, 0.0) | ASSERT_NE(global_energy, 0.0) | EXPECT_LE(std::abs(global_energy - local_energy) / (std::abs(global_energy) + std::abs(local_energy)), 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_NE(local_energy, 0.0) | ASSERT_NE(global_energy, 0.0) | EXPECT_LE(std::abs(global_energy - local_energy) / (std::abs(global_energy) + std::abs(local_energy)), 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank; assertion 9개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank 유지 원문 검사 body 및 assertion 동일. f388cb98b5e4d023a89e149554f8288d9250847c7a5738a0657dcbddf4e5220d f388cb98b5e4d023a89e149554f8288d9250847c7a5738a0657dcbddf4e5220d ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(NumericalRank(scaled_physical20), 14U) | EXPECT_EQ(NumericalRank(scaled_stabilized24), 18U) | ASSERT_GT(physical_norm, 0.0) | ASSERT_GT(stabilized_norm, 0.0) | ASSERT_GT(modeNorm, 0.0) | EXPECT_LE(scaled_physical24.Multiply(scaledMode).Norm() / (physical_norm * modeNorm), 1.0e-10) | EXPECT_LE(scaled_stabilized24.Multiply(scaledMode).Norm() / (stabilized_norm * modeNorm), 1.0e-10) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_EQ(NumericalRank(scaled_physical20), 14U) | EXPECT_EQ(NumericalRank(scaled_stabilized24), 18U) | ASSERT_GT(physical_norm, 0.0) | ASSERT_GT(stabilized_norm, 0.0) | ASSERT_GT(modeNorm, 0.0) | EXPECT_LE(scaled_physical24.Multiply(scaledMode).Norm() / (physical_norm * modeNorm), 1.0e-10) | EXPECT_LE(scaled_stabilized24.Multiply(scaledMode).Norm() / (stabilized_norm * modeNorm), 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields; assertion 3개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields 유지 원문 검사 body 및 assertion 동일. 85d6d3543ba1e1a40665939da00f88617f4bc27a8cb54ee6ca6f26848d3abe12 85d6d3543ba1e1a40665939da00f88617f4bc27a8cb54ee6ca6f26848d3abe12 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(QuadraticEnergy(stiffness, field), 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(QuadraticEnergy(stiffness, field), 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.UsesAllPhysicalRotationDiagonalsAndFixedFactor Mitc4ShellDrilling.UsesAllPhysicalRotationDiagonalsAndFixedFactor; assertion 5개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.UsesAllPhysicalRotationDiagonalsAndFixedFactor 유지 원문 검사 body 및 assertion 동일. 8b0addafb6afb8018440c8784db44a56ead47ff68faa9389836024122e94a95f 8b0addafb6afb8018440c8784db44a56ead47ff68faa9389836024122e94a95f ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(std::isfinite(diagonal)) | ASSERT_GE(diagonal, 0.0) | EXPECT_DOUBLE_EQ(stiffness.drilling_stiffness, 1.0e-3 * expected_sum / 8.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(std::isfinite(diagonal)) | ASSERT_GE(diagonal, 0.0) | EXPECT_DOUBLE_EQ(stiffness.drilling_stiffness, 1.0e-3 * expected_sum / 8.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.IntegratesFlatConsistentAndScalarRowSumLumpedMass Mitc4ShellMass.IntegratesFlatConsistentAndScalarRowSumLumpedMass; assertion 10개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.IntegratesFlatConsistentAndScalarRowSumLumpedMass 유지 원문 검사 body 및 assertion 동일. 13d278e7f55aa0a671221d5a7335510907c58490fb3d02e8defde941b85ec16f 13d278e7f55aa0a671221d5a7335510907c58490fb3d02e8defde941b85ec16f ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.nodal_moments[row][0U], 6.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][1U], 0.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][2U], 2.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[0U](row, column), pattern[row][column] * (2.0 / 3.0), 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](row, column), 0.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](row, column), pattern[row][column] * (2.0 / 9.0), 1.0e-12) | EXPECT_NEAR( mass.lumped_global24(6U * row + component, 6U * row + component), 6.0, 1.0e-12) | EXPECT_NEAR(mass.lumped_global24(6U * row + 3U + component, 6U * row + 3U + component), component == 2U ? 0.0 : 2.0, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.nodal_moments[row][0U], 6.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][1U], 0.0, 1.0e-12) | EXPECT_NEAR(mass.nodal_moments[row][2U], 2.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[0U](row, column), pattern[row][column] * (2.0 / 3.0), 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](row, column), 0.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](row, column), pattern[row][column] * (2.0 / 9.0), 1.0e-12) | EXPECT_NEAR( mass.lumped_global24(6U * row + component, 6U * row + component), 6.0, 1.0e-12) | EXPECT_NEAR(mass.lumped_global24(6U * row + 3U + component, 6U * row + 3U + component), component == 2U ? 0.0 : 2.0, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RejectsNonpositiveAndNonfiniteDensity Mitc4ShellMass.RejectsNonpositiveAndNonfiniteDensity; assertion 4개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RejectsNonpositiveAndNonfiniteDensity 유지 원문 검사 body 및 assertion 동일. 85d0b08a8b413046a1dd64d263b9a847bb933dc7411f5f611651c1fe772f8220 85d0b08a8b413046a1dd64d263b9a847bb933dc7411f5f611651c1fe772f8220 "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_FALSE(mass.HasValue()) | ASSERT_EQ(mass.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(mass.GetStatus().Diagnostics()[0U].code, ""invalid-shell-mass"")" "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_FALSE(mass.HasValue()) | ASSERT_EQ(mass.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(mass.GetStatus().Diagnostics()[0U].code, ""invalid-shell-mass"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesFiniteNodalVarianceAcrossDensityScale Mitc4ShellMass.PreservesFiniteNodalVarianceAcrossDensityScale; assertion 6개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesFiniteNodalVarianceAcrossDensityScale 유지 원문 검사 body 및 assertion 동일. 35f70d35723a1a6a5ca19dbe73e587dc1c35ec4828f98616aa2dab17d4920e3e 35f70d35723a1a6a5ca19dbe73e587dc1c35ec4828f98616aa2dab17d4920e3e ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_TRUE(std::isfinite(moments[0U])) | EXPECT_TRUE(std::isfinite(moments[1U])) | EXPECT_TRUE(std::isfinite(moments[2U])) | EXPECT_GT(moments[2U] - moments[1U] * (moments[1U] / moments[0U]), 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_TRUE(std::isfinite(moments[0U])) | EXPECT_TRUE(std::isfinite(moments[1U])) | EXPECT_TRUE(std::isfinite(moments[2U])) | EXPECT_GT(moments[2U] - moments[1U] * (moments[1U] / moments[0U]), 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesIndependentWarpedMomentOracle Mitc4ShellMass.PreservesIndependentWarpedMomentOracle; assertion 8개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.PreservesIndependentWarpedMomentOracle 유지 원문 검사 body 및 assertion 동일. 643cacec125570c0bafe60064f994407b8a1491199f88ce3b0e9af13472d444d 643cacec125570c0bafe60064f994407b8a1491199f88ce3b0e9af13472d444d ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.consistent_moments[0U](0U, 0U), 17609.0 / 28800.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](0U, 0U), 11003.0 / 1440000.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](0U, 0U), 88177.0 / 6912000.0, 1.0e-12) | EXPECT_NEAR(total_mass, 7743.0 / 1600.0, 1.0e-12) | EXPECT_NEAR(total_first_moment, 739.0 / 12000.0, 1.0e-12) | EXPECT_NEAR(total_second_moment, 517.0 / 5120.0, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(mass.consistent_moments[0U](0U, 0U), 17609.0 / 28800.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[1U](0U, 0U), 11003.0 / 1440000.0, 1.0e-12) | EXPECT_NEAR(mass.consistent_moments[2U](0U, 0U), 88177.0 / 6912000.0, 1.0e-12) | EXPECT_NEAR(total_mass, 7743.0 / 1600.0, 1.0e-12) | EXPECT_NEAR(total_first_moment, 739.0 / 12000.0, 1.0e-12) | EXPECT_NEAR(total_second_moment, 517.0 / 5120.0, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.MeetsPartialBoundaryCompleteMatrixTargets Mitc4ShellMass.MeetsPartialBoundaryCompleteMatrixTargets; assertion 7개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.MeetsPartialBoundaryCompleteMatrixTargets 유지 원문 검사 body 및 assertion 동일. 7b4ca55c7d526b275a1ca19f3c65a04f168c1ca514a329671b9fc594f4f468a1 7b4ca55c7d526b275a1ca19f3c65a04f168c1ca514a329671b9fc594f4f468a1 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(stiffness_candidate.Value().drilling_stiffness, 19.0 / 4800.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness, 10369.0 / 7500.0, 1.0e-12) | EXPECT_NEAR(lumped_mass, 3.0 / 50.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness / lumped_mass, 10369.0 / 450.0, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | ASSERT_TRUE(mass_candidate.HasValue()) | EXPECT_NEAR(stiffness_candidate.Value().drilling_stiffness, 19.0 / 4800.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness, 10369.0 / 7500.0, 1.0e-12) | EXPECT_NEAR(lumped_mass, 3.0 / 50.0, 1.0e-12) | EXPECT_NEAR(complete_stiffness / lumped_mass, 10369.0 / 450.0, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RecomputesCompleteMassAndStiffnessCovariantly Mitc4ShellMass.RecomputesCompleteMassAndStiffnessCovariantly; assertion 6개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellMass.RecomputesCompleteMassAndStiffnessCovariantly 유지 원문 검사 body 및 assertion 동일. 1235757b19e3bdacbfc2226ca9a3b839417e1f295516a1d4de6259acb4d0be43 1235757b19e3bdacbfc2226ca9a3b839417e1f295516a1d4de6259acb4d0be43 ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(original_stiffness.HasValue()) | ASSERT_TRUE(rotated_stiffness.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(rotated_mass.HasValue()) ASSERT_TRUE(original.HasValue()) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(original_stiffness.HasValue()) | ASSERT_TRUE(rotated_stiffness.HasValue()) | ASSERT_TRUE(original_mass.HasValue()) | ASSERT_TRUE(rotated_mass.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate; assertion 13개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate 유지 원문 검사 body 및 assertion 동일. 0d2b529828fad74fc88ca1a545fe19d255f87c53d24275ec741bd114bbebe1ca 0d2b529828fad74fc88ca1a545fe19d255f87c53d24275ec741bd114bbebe1ca "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_global24.Multiply(pure_drill).Norm(), 0.0) | EXPECT_DOUBLE_EQ(drill_action[6U * node_index + 5U], stiffness.drilling_stiffness) | EXPECT_GT(QuadraticEnergy(stiffness.drilling_global24, pure_drill), 0.0) | ASSERT_TRUE(extreme_shell.HasValue()) | ASSERT_FALSE(failure.HasValue()) | ASSERT_EQ(failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(failure.GetStatus().Diagnostics()[0].code, ""invalid-shell-stiffness"") | ASSERT_FALSE(repeated_failure.HasValue()) | ASSERT_EQ(repeated_failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].code, failure.GetStatus().Diagnostics()[0].code) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].message, failure.GetStatus().Diagnostics()[0].message)" "ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_DOUBLE_EQ(stiffness.physical_global24.Multiply(pure_drill).Norm(), 0.0) | EXPECT_DOUBLE_EQ(drill_action[6U * node_index + 5U], stiffness.drilling_stiffness) | EXPECT_GT(QuadraticEnergy(stiffness.drilling_global24, pure_drill), 0.0) | ASSERT_TRUE(extreme_shell.HasValue()) | ASSERT_FALSE(failure.HasValue()) | ASSERT_EQ(failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(failure.GetStatus().Diagnostics()[0].code, ""invalid-shell-stiffness"") | ASSERT_FALSE(repeated_failure.HasValue()) | ASSERT_EQ(repeated_failure.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].code, failure.GetStatus().Diagnostics()[0].code) | EXPECT_EQ(repeated_failure.GetStatus().Diagnostics()[0].message, failure.GetStatus().Diagnostics()[0].message)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy; assertion 8개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy 유지 원문 검사 body 및 assertion 동일. 3dad0709f8a7d8746df1e04699e6777b558a71db23f22ac13f5c98ecbd6b084d 3dad0709f8a7d8746df1e04699e6777b558a71db23f22ac13f5c98ecbd6b084d ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(stiffness_candidate.Value() .stabilized_global24.Multiply(pure_drill) .Norm(), 0.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(stiffness_candidate.HasValue()) | EXPECT_GT(stiffness_candidate.Value() .stabilized_global24.Multiply(pure_drill) .Norm(), 0.0) | ASSERT_TRUE(recovery_candidate.HasValue()) | EXPECT_DOUBLE_EQ(recovery.strain_energy, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_DOUBLE_EQ(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions; assertion 8개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions 유지 원문 검사 body 및 assertion 동일. 2a4132bcc260b96aec7e5c144e1ccf92a65c7dec753c940e378fac3737f08d83 2a4132bcc260b96aec7e5c144e1ccf92a65c7dec753c940e378fac3737f08d83 ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(recovery_candidate.HasValue()) | ASSERT_EQ(recovery.points.size(), expected_coordinates.size()) | EXPECT_EQ(point.natural_coordinates, expected_coordinates[point_index]) | EXPECT_NEAR(point.generalized_strain[component], kGeneralized[component], 1.0e-12) | EXPECT_NEAR(point.section_resultant[component], kExpectedResultant[component], 1.0e-12) | EXPECT_NEAR(point.in_plane_stress[position][component], kExpectedStress[position][component], 1.0e-12) | EXPECT_NEAR(recovery.strain_energy, 72.16, 1.0e-12) ASSERT_TRUE(shell_candidate.HasValue()) | ASSERT_TRUE(recovery_candidate.HasValue()) | ASSERT_EQ(recovery.points.size(), expected_coordinates.size()) | EXPECT_EQ(point.natural_coordinates, expected_coordinates[point_index]) | EXPECT_NEAR(point.generalized_strain[component], kGeneralized[component], 1.0e-12) | EXPECT_NEAR(point.section_resultant[component], kExpectedResultant[component], 1.0e-12) | EXPECT_NEAR(point.in_plane_stress[position][component], kExpectedStress[position][component], 1.0e-12) | EXPECT_NEAR(recovery.strain_energy, 72.16, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.RetainsReciprocalDeterminantOverflowGateAtTinyScale Mitc4ShellKinematics.RetainsReciprocalDeterminantOverflowGateAtTinyScale; assertion 3개 tests/unit/elements/mitc4_shell_test.cpp Mitc4ShellKinematics.RetainsReciprocalDeterminantOverflowGateAtTinyScale 유지 원문 검사 body 및 assertion 동일. d77bd95ff7630046878cec5f6a7057232c68b58f31e82d465f5565113f3324e2 d77bd95ff7630046878cec5f6a7057232c68b58f31e82d465f5565113f3324e2 "EXPECT_TRUE(fesa::Mitc4Shell::Create( NodePointers(nodes), Directors(), Section(2e-99), Material()).HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""invalid-shell-jacobian"")" "EXPECT_TRUE(fesa::Mitc4Shell::Create( NodePointers(nodes), Directors(), Section(2e-99), Material()).HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""invalid-shell-jacobian"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/mitc4_shell_test.cpp support@1-314 helper/oracle/fixture/include/static assertion 구간: Node, NodePointers, Section, Material, Dot, Cross, RotateAboutGlobalZ, Norm, ExpectVectorNear, ExpectOrthonormalRightHanded, ExpectMatrixNear, ExpectSymmetric, HasPositiveCholeskyPivots, if, FrobeniusNorm, ScaledSymmetryError, ScaledStiffness, SymmetricEigenvalues, NumericalRank, for, count_if, SymmetricOperatorNorm, QuadraticEnergy, PhysicalField, ExpectStrain, PhysicalRigidMode, PlanarNodes tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 297d7d85ca88c30c2fcba28e5add8b21550acc876c07a4f72e58bd5671374614 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@345-346 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3871bd00e76dc57ff62fcabeb11b45bf1f6672a56529f21deb75b04370bafdcb 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@400-401 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2b2e2de4330e6f7b2a8bc958c220fa5074cae2a894fdec078de809b1494a88c0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@455-456 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0e9489db8c044b5eac22c751c63b47dd64307874cd16a718c86fe5d4d8183fd5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@540-541 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3c4055c21da1e40459430c329495ace7af1b4404b56501366394a6789c7fd255 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@555-556 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d78ec2164cda37dda980863249f1d1b8f01e17f082f71061e46180accb42a7b4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@656-657 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 297c797dbfa396881a360ce5e6061cad0ac811f3829247f77cbbe5c5d6ef704a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@685-686 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 832b8cc9cff26faa1e25dd5159b323b77839151eb7675edaaf4f6ff39d91a055 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@734-735 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6b0492533ad982e0ff4c2695c4236ab7345f4db760494bf6488680ce4ce90747 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@797-798 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 50f5a0316e8562dadd3155c301e30fc715e3dc4c735874d08f7567003cc894f3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@890-923 helper/oracle/fixture/include/static assertion 구간: ExpectGlobalZCovariance tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ee879d5be51cb0e71626e93a8224bba6a7ee8b8929d124939771c99853c476ae 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@1027-1028 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 87cbab04a4d00f30b6ca88389a388eaaee48f9eab162d6d6f1a1a33f1d1c4b41 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@1070-1071 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9445081d68e7ef72263ba262a8525bf8acd4c08d0212a48e0f87fa92b0d99c6b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/mitc4_shell_test.cpp support@1108-1109 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 31f30d2b75293b2d01a063d68a9dfdb4e607867386078578966eb04a63d4496a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 17개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. 7274bef28faa7c8a38da9436edf00d3d2356031a9ee82618a8b16226f99d687f 7274bef28faa7c8a38da9436edf00d3d2356031a9ee82618a8b16226f99d687f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IntegratesTheRectangleNodalLumpedMassAndNull NonlinearMitc4Inertia.IntegratesTheRectangleNodalLumpedMassAndNull; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IntegratesTheRectangleNodalLumpedMassAndNull 유지 원문 검사 body 및 assertion 동일. 717e3fc84d47b730a49e4677ba77a96fdeab3929b1e3b870c9fd73495ddf445e 717e3fc84d47b730a49e4677ba77a96fdeab3929b1e3b870c9fd73495ddf445e ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(mass(6U * row, 6U * column), row == column ? 0.2 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 3U, 6U * column + 3U), row == column ? 0.2 * 0.2 * 0.2 / 12.0 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 5U, 6U * row + 5U), 0.0, 1.0e-12) | EXPECT_LE(mass.Multiply(drilling_null).Norm(), 1.0e-12) ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(mass(6U * row, 6U * column), row == column ? 0.2 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 3U, 6U * column + 3U), row == column ? 0.2 * 0.2 * 0.2 / 12.0 : 0.0, 1.0e-12) | EXPECT_NEAR(mass(6U * row + 5U, 6U * row + 5U), 0.0, 1.0e-12) | EXPECT_LE(mass.Multiply(drilling_null).Norm(), 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UsesPhysicalAccelerationAndExactCurrentForce NonlinearMitc4Inertia.UsesPhysicalAccelerationAndExactCurrentForce; assertion 3개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UsesPhysicalAccelerationAndExactCurrentForce 유지 원문 검사 body 및 assertion 동일. ddce9716997e9842683e77402fbf5b3b865335261d285318138c471950069a35 ddce9716997e9842683e77402fbf5b3b865335261d285318138c471950069a35 ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(evaluation.Value().force[index], expected[index], 1.0e-11) | EXPECT_NEAR(evaluation.Value().convective_force[index], 0.0, 1.0e-11) ASSERT_TRUE(evaluation.HasValue()) | EXPECT_NEAR(evaluation.Value().force[index], expected[index], 1.0e-11) | EXPECT_NEAR(evaluation.Value().convective_force[index], 0.0, 1.0e-11) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PreservesTinyAngularAccelerationAlongsideRigidTranslationAcceleration NonlinearMitc4Inertia.PreservesTinyAngularAccelerationAlongsideRigidTranslationAcceleration; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PreservesTinyAngularAccelerationAlongsideRigidTranslationAcceleration 유지 원문 검사 body 및 assertion 동일. 9b2033a70c6b58db45bfc94101520b88db958b78ab526763fbe07eb9c2971b7f 9b2033a70c6b58db45bfc94101520b88db958b78ab526763fbe07eb9c2971b7f ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(actual.Value().convective_force[full], 0.0) | ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(actual.Value().convective_force[full], 0.0) | ASSERT_GT(scale, 0.0) | EXPECT_LE(error / scale, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MixedScaleRotationDerivativeAndAngularMomentum NonlinearMitc4Inertia.MixedScaleRotationDerivativeAndAngularMomentum; assertion 6개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MixedScaleRotationDerivativeAndAngularMomentum 유지 원문 검사 body 및 assertion 동일. 81949ff3504ddccc0cbef056e78d8596ee31b99ff69aae08a4dc6503e09bd230 81949ff3504ddccc0cbef056e78d8596ee31b99ff69aae08a4dc6503e09bd230 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE(derivative_error / (nodal_rotary_inertia * epsilon), 1e-12) | EXPECT_LE(rate_error / (nodal_rotary_inertia * epsilon), 1e-12) | ASSERT_TRUE(moving.HasValue()) | EXPECT_LE(momentum_error / (nodal_rotary_inertia * epsilon), 1e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE(derivative_error / (nodal_rotary_inertia * epsilon), 1e-12) | EXPECT_LE(rate_error / (nodal_rotary_inertia * epsilon), 1e-12) | ASSERT_TRUE(moving.HasValue()) | EXPECT_LE(momentum_error / (nodal_rotary_inertia * epsilon), 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.FlatRotatedLargeOffsetKeepsCenteredRotationalInertiaExactlyZero NonlinearMitc4Inertia.FlatRotatedLargeOffsetKeepsCenteredRotationalInertiaExactlyZero; assertion 4개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.FlatRotatedLargeOffsetKeepsCenteredRotationalInertiaExactlyZero 유지 원문 검사 body 및 assertion 동일. f5b834d0bbcf878284e79ee64f605b5d50f2671a207a226ab6226be2b1d242c8 f5b834d0bbcf878284e79ee64f605b5d50f2671a207a226ab6226be2b1d242c8 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_DOUBLE_EQ(value.Value().force[6U * node + 3U + component], 0.0) | EXPECT_DOUBLE_EQ(mass_times_acceleration[6U * node + 3U + component], 0.0) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_DOUBLE_EQ(value.Value().force[6U * node + 3U + component], 0.0) | EXPECT_DOUBLE_EQ(mass_times_acceleration[6U * node + 3U + component], 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.WarpedGeometryRetainsNonzeroFirstThicknessMoment NonlinearMitc4Inertia.WarpedGeometryRetainsNonzeroFirstThicknessMoment; assertion 3개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.WarpedGeometryRetainsNonzeroFirstThicknessMoment 유지 원문 검사 body 및 assertion 동일. 89f7e9f4b875516c794ec880dbf48d5a8e55b0402e9a1c3dfa1382b255cacf26 89f7e9f4b875516c794ec880dbf48d5a8e55b0402e9a1c3dfa1382b255cacf26 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_GT(coupling, 0.0) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_GT(coupling, 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.InverseIdentityAndCurrentAnalyticNullAtFiniteRotation DynamicRotation.InverseIdentityAndCurrentAnalyticNullAtFiniteRotation; assertion 10개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.InverseIdentityAndCurrentAnalyticNullAtFiniteRotation 유지 원문 검사 body 및 assertion 동일. a38ec8c66743c96d9852840c0a2a33e0c3a14f330dd00369fcaedf51b341f3ee a38ec8c66743c96d9852840c0a2a33e0c3a14f330dd00369fcaedf51b341f3ee ASSERT_TRUE(value.HasValue()) | EXPECT_GT(mapped[column], 0.0) | EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1e-12) | EXPECT_NEAR(mapped[row], 0.0, 1e-12) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_LE(mass.Multiply(n).Norm() / MatrixNorm(mass), 1.0e-12) | EXPECT_LE(std::abs(n.Dot(scaled_force)) / scaled_force.Norm(), 1.0e-10) | EXPECT_GT(mass.Multiply(fixed_drill).Norm() / MatrixNorm(mass), 1.0e-8) ASSERT_TRUE(value.HasValue()) | EXPECT_GT(mapped[column], 0.0) | EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1e-12) | EXPECT_NEAR(mapped[row], 0.0, 1e-12) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_LE(mass.Multiply(n).Norm() / MatrixNorm(mass), 1.0e-12) | EXPECT_LE(std::abs(n.Dot(scaled_force)) / scaled_force.Norm(), 1.0e-10) | EXPECT_GT(mass.Multiply(fixed_drill).Norm() / MatrixNorm(mass), 1.0e-8) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.RejectsIllConditionedPhysicalMassWithoutDeletingIt NonlinearMitc4Inertia.RejectsIllConditionedPhysicalMassWithoutDeletingIt; assertion 3개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.RejectsIllConditionedPhysicalMassWithoutDeletingIt 유지 원문 검사 body 및 assertion 동일. 5f0adf729846e876c90ddcd5db8123c9005a2541189d7a72ac1736116d411500 5f0adf729846e876c90ddcd5db8123c9005a2541189d7a72ac1736116d411500 "EXPECT_TRUE(normal.Create().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""ill-conditioned-nonlinear-inertia-positive-mass"")" "EXPECT_TRUE(normal.Create().HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""ill-conditioned-nonlinear-inertia-positive-mass"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.ConvectiveForceDoesNotLoseSmallValuesToAcceleration NonlinearMitc4Inertia.ConvectiveForceDoesNotLoseSmallValuesToAcceleration; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.ConvectiveForceDoesNotLoseSmallValuesToAcceleration 유지 원문 검사 body 및 assertion 동일. 25d5baa1b968f822aa4dd035d4e323310708e8e73f2ceaffcf3f657b99b2b86a 25d5baa1b968f822aa4dd035d4e323310708e8e73f2ceaffcf3f657b99b2b86a ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(ordinary.HasValue()) | ASSERT_TRUE(large.HasValue()) | EXPECT_GT(ordinary.Value().convective_force.Norm(), 0.0) | EXPECT_EQ(ordinary.Value().convective_force[i], large.Value().convective_force[i]) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(ordinary.HasValue()) | ASSERT_TRUE(large.HasValue()) | EXPECT_GT(ordinary.Value().convective_force.Norm(), 0.0) | EXPECT_EQ(ordinary.Value().convective_force[i], large.Value().convective_force[i]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PartialAndEffectiveTangentsPassTheScaledFixedSweep NonlinearMitc4Inertia.PartialAndEffectiveTangentsPassTheScaledFixedSweep; assertion 5개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.PartialAndEffectiveTangentsPassTheScaledFixedSweep 유지 원문 검사 body 및 assertion 동일. e5946458fbc3006710a0af48c556f989a6be04fde87c4c61c0e4bd18366c8315 e5946458fbc3006710a0af48c556f989a6be04fde87c4c61c0e4bd18366c8315 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(vp.HasValue()) | ASSERT_TRUE(vm.HasValue()) | EXPECT_TRUE(consecutive) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(vp.HasValue()) | ASSERT_TRUE(vm.HasValue()) | EXPECT_TRUE(consecutive) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MatchesIndependentWarpedNodalMomentsEnergyAndPower NonlinearMitc4Inertia.MatchesIndependentWarpedNodalMomentsEnergyAndPower; assertion 17개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.MatchesIndependentWarpedNodalMomentsEnergyAndPower 유지 원문 검사 body 및 assertion 동일. 259d4f9247683cf706cedd32eb2bf44ce9e33d0ed8119ef7a57f197466e3d8aa 259d4f9247683cf706cedd32eb2bf44ce9e33d0ed8119ef7a57f197466e3d8aa ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_LE(mass_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE(symmetry_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE( std::abs(value.Value().kinetic_energy - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(0.5 * state.v.Dot(value.Value().mass.Multiply(state.v)) - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(state.v.Dot(value.Value().force) - oracle.power) / std::abs(oracle.power), 1.0e-10) | EXPECT_LE(Difference(ApplyD(value.Value().force, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum - oracle.momentum).Norm() / oracle.momentum.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum - oracle.angular_momentum).Norm() / oracle.angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum_rate - oracle.momentum_rate).Norm() / oracle.momentum_rate.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum_rate - oracle.angular_momentum_rate) .Norm() / oracle.angular_momentum_rate.Norm(), 1.0e-12) | ASSERT_TRUE(bi.HasValue()) | ASSERT_TRUE(bj.HasValue()) | EXPECT_LE(std::abs(numerator[k] / denominator[k] - oracle.moments[k][i][j]) / scale, 1.0e-12) | ASSERT_TRUE(translation.HasValue()) | EXPECT_NEAR(translation.Value().kinetic_energy / oracle.total_mass, 0.25, 1.0e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | EXPECT_LE(mass_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE(symmetry_error / MatrixNorm(expected_mass), 1.0e-12) | EXPECT_LE( std::abs(value.Value().kinetic_energy - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(0.5 * state.v.Dot(value.Value().mass.Multiply(state.v)) - oracle.energy) / oracle.energy, 1.0e-12) | EXPECT_LE(std::abs(state.v.Dot(value.Value().force) - oracle.power) / std::abs(oracle.power), 1.0e-10) | EXPECT_LE(Difference(ApplyD(value.Value().force, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum - oracle.momentum).Norm() / oracle.momentum.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum - oracle.angular_momentum).Norm() / oracle.angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((value.Value().momentum_rate - oracle.momentum_rate).Norm() / oracle.momentum_rate.Norm(), 1.0e-12) | EXPECT_LE( (value.Value().angular_momentum_rate - oracle.angular_momentum_rate) .Norm() / oracle.angular_momentum_rate.Norm(), 1.0e-12) | ASSERT_TRUE(bi.HasValue()) | ASSERT_TRUE(bj.HasValue()) | EXPECT_LE(std::abs(numerator[k] / denominator[k] - oracle.moments[k][i][j]) / scale, 1.0e-12) | ASSERT_TRUE(translation.HasValue()) | EXPECT_NEAR(translation.Value().kinetic_energy / oracle.total_mass, 0.25, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.InitialMassMatchesEigenLumpingAndFiniteEnergyObeysJensen NonlinearMitc4Inertia.InitialMassMatchesEigenLumpingAndFiniteEnergyObeysJensen; assertion 8개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.InitialMassMatchesEigenLumpingAndFiniteEnergyObeysJensen 유지 원문 검사 body 및 assertion 동일. c9725cc3d16533a26647720f977a41ee8e1edcbfddf43560b3abf4a638464969 c9725cc3d16533a26647720f977a41ee8e1edcbfddf43560b3abf4a638464969 ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(initial.HasValue()) | EXPECT_NEAR(initial.Value().mass(i, j), eigen.Value().lumped_global24(i, j), 1.0e-12) | EXPECT_EQ(initial.Value().mass(i, j), 0.0) | EXPECT_GT(lumped.energy - consistent.energy, 0.0) | EXPECT_NEAR(lumped.total_mass, consistent.total_mass, 1.0e-12) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(eigen.HasValue()) | ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(initial.HasValue()) | EXPECT_NEAR(initial.Value().mass(i, j), eigen.Value().lumped_global24(i, j), 1.0e-12) | EXPECT_EQ(initial.Value().mass(i, j), 0.0) | EXPECT_GT(lumped.energy - consistent.energy, 0.0) | EXPECT_NEAR(lumped.total_mass, consistent.total_mass, 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep; assertion 6개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep 유지 원문 검사 body 및 assertion 동일. fed5b777e0226e78a7a852200777d80a3d9736b13300e6670b9d244bea2fe464 fed5b777e0226e78a7a852200777d80a3d9736b13300e6670b9d244bea2fe464 ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE((analytic - oracle).Norm(), 1.0e-12) | EXPECT_LE((analytic - Third(value.Value(), directions[t], directions[p], directions[r])) .Norm(), 1.0e-12) | EXPECT_TRUE(consecutive[r][t]) ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_LE((analytic - oracle).Norm(), 1.0e-12) | EXPECT_LE((analytic - Third(value.Value(), directions[t], directions[p], directions[r])) .Norm(), 1.0e-12) | EXPECT_TRUE(consecutive[r][t]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.NormalizedNullDerivativesIncludeNormalizationCurvature DynamicRotation.NormalizedNullDerivativesIncludeNormalizationCurvature; assertion 9개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.NormalizedNullDerivativesIncludeNormalizationCurvature 유지 원문 검사 body 및 assertion 동일. b1519383145d86730f51475376a73c825a7eb748c5e69bbe9a502bc32069efcd b1519383145d86730f51475376a73c825a7eb748c5e69bbe9a502bc32069efcd ASSERT_TRUE(value.HasValue()) | EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1.0e-12) | EXPECT_NEAR(value.Value().drill_null.Dot(first), 0.0, 1.0e-12) | EXPECT_NEAR( value.Value().drill_null.Dot(value.Value().null_directional_second), -first.Dot(first), 1.0e-12) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(consecutive) | EXPECT_FALSE(fesa::EvaluateDynamicRotation({}, {0, 0, 2}, {}, {}).HasValue()) | EXPECT_FALSE( fesa::EvaluateDynamicRotation( {std::numeric_limits::quiet_NaN(), 0, 0}, initial, {}, {}) .HasValue()) ASSERT_TRUE(value.HasValue()) | EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1.0e-12) | EXPECT_NEAR(value.Value().drill_null.Dot(first), 0.0, 1.0e-12) | EXPECT_NEAR( value.Value().drill_null.Dot(value.Value().null_directional_second), -first.Dot(first), 1.0e-12) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(consecutive) | EXPECT_FALSE(fesa::EvaluateDynamicRotation({}, {0, 0, 2}, {}, {}).HasValue()) | EXPECT_FALSE( fesa::EvaluateDynamicRotation( {std::numeric_limits::quiet_NaN(), 0, 0}, initial, {}, {}) .HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UnitAndGlobalFrameChangesPreservePhysicalMetrics NonlinearMitc4Inertia.UnitAndGlobalFrameChangesPreservePhysicalMetrics; assertion 14개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.UnitAndGlobalFrameChangesPreservePhysicalMetrics 유지 원문 검사 body 및 assertion 동일. d1d1d2152f232cee2453d1b80ac93c5759be9c4a35df8128bf14ddec28c2b2c8 d1d1d2152f232cee2453d1b80ac93c5759be9c4a35df8128bf14ddec28c2b2c8 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(converted_inertia.HasValue()) | ASSERT_TRUE(uv.HasValue()) | EXPECT_LE(std::abs(uv.Value().kinetic_energy / energy_scale - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE(error / MatrixNorm(original_scaled), 1.0e-12) | EXPECT_LE(Difference(original_force, converted_force, 1.0).Norm() / original_force.Norm(), 1.0e-10) | ASSERT_TRUE(frame_inertia.HasValue()) | ASSERT_TRUE(fv.HasValue()) | EXPECT_LE(std::abs(fv.Value().kinetic_energy - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE((fv.Value().momentum - rotate(value.Value().momentum)).Norm() / value.Value().momentum.Norm(), 1.0e-12) | EXPECT_LE( (fv.Value().angular_momentum - rotate(value.Value().angular_momentum)) .Norm() / value.Value().angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((actual - expected).Norm() / expected.Norm(), 1.0e-10) | EXPECT_LE(covariance_error / MatrixNorm(value.Value().mass), 1.0e-12) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(converted_inertia.HasValue()) | ASSERT_TRUE(uv.HasValue()) | EXPECT_LE(std::abs(uv.Value().kinetic_energy / energy_scale - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE(error / MatrixNorm(original_scaled), 1.0e-12) | EXPECT_LE(Difference(original_force, converted_force, 1.0).Norm() / original_force.Norm(), 1.0e-10) | ASSERT_TRUE(frame_inertia.HasValue()) | ASSERT_TRUE(fv.HasValue()) | EXPECT_LE(std::abs(fv.Value().kinetic_energy - value.Value().kinetic_energy) / value.Value().kinetic_energy, 1.0e-12) | EXPECT_LE((fv.Value().momentum - rotate(value.Value().momentum)).Norm() / value.Value().momentum.Norm(), 1.0e-12) | EXPECT_LE( (fv.Value().angular_momentum - rotate(value.Value().angular_momentum)) .Norm() / value.Value().angular_momentum.Norm(), 1.0e-12) | EXPECT_LE((actual - expected).Norm() / expected.Norm(), 1.0e-10) | EXPECT_LE(covariance_error / MatrixNorm(value.Value().mass), 1.0e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors; assertion 4개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors 유지 원문 검사 body 및 assertion 동일. afd5da8bcdde50b87721fb93bff8d47f1886f6b6812e83259d1208ec2b2dfb06 afd5da8bcdde50b87721fb93bff8d47f1886f6b6812e83259d1208ec2b2dfb06 ASSERT_TRUE(value.HasValue()) | EXPECT_LE((Third(value.Value(), e1, e1, e1) - expected[i][0]).Norm(), 1.0e-12) | EXPECT_LE((Third(value.Value(), e1, e2, e3) - expected[i][1]).Norm(), 1.0e-12) | EXPECT_LE( (Third(value.Value(), mixed, mixed, mixed) - expected[i][2]).Norm(), 1.0e-12) ASSERT_TRUE(value.HasValue()) | EXPECT_LE((Third(value.Value(), e1, e1, e1) - expected[i][0]).Norm(), 1.0e-12) | EXPECT_LE((Third(value.Value(), e1, e2, e3) - expected[i][1]).Norm(), 1.0e-12) | EXPECT_LE( (Third(value.Value(), mixed, mixed, mixed) - expected[i][2]).Norm(), 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IndependentOracleDetectsEachRequiredOmission NonlinearMitc4Inertia.IndependentOracleDetectsEachRequiredOmission; assertion 10개 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp NonlinearMitc4Inertia.IndependentOracleDetectsEachRequiredOmission 유지 원문 검사 body 및 assertion 동일. cd75fd015eb68d73365632968c883ff3e0361d16f81d4c93e4e1f28bb39fba01 cd75fd015eb68d73365632968c883ff3e0361d16f81d4c93e4e1f28bb39fba01 ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GT(Difference(mutant, fd, 1.0).Norm() / (mutant.Norm() + fd.Norm()), 1.0e-6) | EXPECT_GT(Difference(ApplyD(no_convective, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-6) | ASSERT_TRUE(vplus.HasValue()) | ASSERT_TRUE(vminus.HasValue()) | EXPECT_GT(vfd.Norm(), 0.0) | EXPECT_GT(Difference(missing_dv, vfd, 1.0).Norm() / vfd.Norm(), 1.0e-6) ASSERT_TRUE(inertia.HasValue()) | ASSERT_TRUE(value.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GT(Difference(mutant, fd, 1.0).Norm() / (mutant.Norm() + fd.Norm()), 1.0e-6) | EXPECT_GT(Difference(ApplyD(no_convective, fixture.Length()), ApplyD(oracle.force, fixture.Length()), 1.0) .Norm() / ApplyD(oracle.force, fixture.Length()).Norm(), 1.0e-6) | ASSERT_TRUE(vplus.HasValue()) | ASSERT_TRUE(vminus.HasValue()) | EXPECT_GT(vfd.Norm(), 0.0) | EXPECT_GT(Difference(missing_dv, vfd, 1.0).Norm() / vfd.Norm(), 1.0e-6) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@1-81 helper/oracle/fixture/include/static assertion 구간: Node, Nodes, Pointers, Frames, Inertia, AddRotation, Difference tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. d69ff9a4f48af8ab96bdc107989f8cb690b3bd03e7302f69630eb2aaf558871a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@177-180 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. 494a3ced593041a4d3ea62a53340f75d552373b567d3ec7ca404700ea0c42534 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@251-443 helper/oracle/fixture/include/static assertion 구간: Multiply, BlockExponentialDerivative, if, Second, Third, MatrixNorm, Fixture, Length, Create, Warped, WarpedNonuniformDirectors, RotateFrame, FlatRotatedLargeOffset, State, FiniteState, ApplyD tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. 222b0316695fd6559144c2fdfdaa9c8cac92e01ef32ad6685b7aff0384ebcc78 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@481-492 helper/oracle/fixture/include/static assertion 구간: ScaledMatrix tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. b069eba225770ec661e53431edf8f9c1df71af521445644b835793d185124063 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@647-771 helper/oracle/fixture/include/static assertion 구간: Integral, IntegrateFivePoints tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. af98d35bc14d69e1d57beb2df3c82bd29703cc630af22865fd95463987225795 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_inertia_test.cpp support@1297-1298 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_inertia_test.cpp file-support 유지 제거된 inverse API 대신 J*n의 off-axis=0, 양의 축방향, norm=1 조건으로 유일한 positive unit drill-null을 검사한다. 같은 1e-12 기준이며 원래 inverse-column 정규화·identity와 동등한 invariant이다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 16개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a2053f0d24af51ecdfe345ef14267b8a57a2530e994c46da68a5bb17f7250341 a2053f0d24af51ecdfe345ef14267b8a57a2530e994c46da68a5bb17f7250341 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.EvaluatesResidualTangentAndRecoveryAtOneTrial NonlinearMitc4Residual.EvaluatesResidualTangentAndRecoveryAtOneTrial; assertion 10개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.EvaluatesResidualTangentAndRecoveryAtOneTrial 유지 원문 검사 body 및 assertion 동일. 2bf5788132debdfcd7990b78d66be3ec5eb35b7039badcbff3737f49e5e0502a 2bf5788132debdfcd7990b78d66be3ec5eb35b7039badcbff3737f49e5e0502a ASSERT_TRUE(recovery.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().internal_residual.Size(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Columns(), 24U) | EXPECT_DOUBLE_EQ(result.Value().physical_strain_energy, result.Value().recovery.physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().recovery.physical_strain_energy, recovery.Value().physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().internal_residual[index], result.Value().internal_force[index]) | EXPECT_EQ(result.Value().recovery.gauss_points[point].generalized_strain, recovery.Value().gauss_points[point].generalized_strain) | EXPECT_EQ(result.Value().recovery.gauss_points[point].section_resultant, recovery.Value().gauss_points[point].section_resultant) ASSERT_TRUE(recovery.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().internal_residual.Size(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Rows(), 24U) | EXPECT_EQ(result.Value().internal_tangent.Columns(), 24U) | EXPECT_DOUBLE_EQ(result.Value().physical_strain_energy, result.Value().recovery.physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().recovery.physical_strain_energy, recovery.Value().physical_strain_energy) | EXPECT_DOUBLE_EQ(result.Value().internal_residual[index], result.Value().internal_force[index]) | EXPECT_EQ(result.Value().recovery.gauss_points[point].generalized_strain, recovery.Value().gauss_points[point].generalized_strain) | EXPECT_EQ(result.Value().recovery.gauss_points[point].section_resultant, recovery.Value().gauss_points[point].section_resultant) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.MatchesTheApprovedDirectionalSchedule NonlinearMitc4Tangent.MatchesTheApprovedDirectionalSchedule; assertion 9개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.MatchesTheApprovedDirectionalSchedule 유지 원문 검사 body 및 assertion 동일. 852d3d6bf5b1eb3a07504509b711d63cf08be10b7b4309a5668469b327b54991 852d3d6bf5b1eb3a07504509b711d63cf08be10b7b4309a5668469b327b54991 ASSERT_TRUE(equilibrium.HasValue()) | ASSERT_GT(ChannelNorm(analytical, true), 0.0) | ASSERT_GT(ChannelNorm(analytical, false), 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GE(force_order_count, 2U) | EXPECT_GE(moment_order_count, 2U) | EXPECT_LE(force_errors[3U], 1.0e-6) | EXPECT_LE(moment_errors[3U], 1.0e-6) ASSERT_TRUE(equilibrium.HasValue()) | ASSERT_GT(ChannelNorm(analytical, true), 0.0) | ASSERT_GT(ChannelNorm(analytical, false), 0.0) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_GE(force_order_count, 2U) | EXPECT_GE(moment_order_count, 2U) | EXPECT_LE(force_errors[3U], 1.0e-6) | EXPECT_LE(moment_errors[3U], 1.0e-6) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.PreservesRigidTranslationNullspaceAndSymmetry NonlinearMitc4Tangent.PreservesRigidTranslationNullspaceAndSymmetry; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Tangent.PreservesRigidTranslationNullspaceAndSymmetry 유지 원문 검사 body 및 assertion 동일. 0f79a384735c9e1976d518ca10d5c463a3d6fd669c1c995425c37c2c94e9f080 0f79a384735c9e1976d518ca10d5c463a3d6fd669c1c995425c37c2c94e9f080 ASSERT_TRUE(equilibrium.HasValue()) | EXPECT_LE(null_action.Norm(), 1.0e-10) | ASSERT_GT(FrobeniusNorm(scaled_tangent), 0.0) | EXPECT_LE(FrobeniusNorm(antisymmetric) / FrobeniusNorm(scaled_tangent), 1.0e-12) ASSERT_TRUE(equilibrium.HasValue()) | EXPECT_LE(null_action.Norm(), 1.0e-10) | ASSERT_GT(FrobeniusNorm(scaled_tangent), 0.0) | EXPECT_LE(FrobeniusNorm(antisymmetric) / FrobeniusNorm(scaled_tangent), 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.DoesNotAcceptExternalLoadShares NonlinearMitc4Residual.DoesNotAcceptExternalLoadShares; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.DoesNotAcceptExternalLoadShares 유지 원문 검사 body 및 assertion 동일. 826f6bda479841d9de0424ce957e015e087b41afa0149ca94cfe07d3699f1107 826f6bda479841d9de0424ce957e015e087b41afa0149ca94cfe07d3699f1107 ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().internal_residual[index], second.Value().internal_residual[index]) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | EXPECT_DOUBLE_EQ(first.Value().internal_residual[index], second.Value().internal_residual[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Objectivity.FiniteRigidMotionHasZeroInternalForce NonlinearMitc4Objectivity.FiniteRigidMotionHasZeroInternalForce; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Objectivity.FiniteRigidMotionHasZeroInternalForce 유지 원문 검사 body 및 assertion 동일. 2495a42787caa073516e20ed9797534fb25f3a8a4789d7c71231800206e8ce86 2495a42787caa073516e20ed9797534fb25f3a8a4789d7c71231800206e8ce86 ASSERT_TRUE(result.HasValue()) | EXPECT_LE(result.Value().internal_residual.Norm(), 1.0e-10) | EXPECT_LE(result.Value().physical_strain_energy, 1.0e-12) ASSERT_TRUE(result.HasValue()) | EXPECT_LE(result.Value().internal_residual.Norm(), 1.0e-10) | EXPECT_LE(result.Value().physical_strain_energy, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Patch.RetainsPhysicalRecoveryIdentities NonlinearMitc4Patch.RetainsPhysicalRecoveryIdentities; assertion 1개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Patch.RetainsPhysicalRecoveryIdentities 유지 원문 검사 body 및 assertion 동일. f1b5a3a3696e0af3f261839b80c1164a0c28944c41ad77b4256a31b55f5906b3 f1b5a3a3696e0af3f261839b80c1164a0c28944c41ad77b4256a31b55f5906b3 ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.RejectsNonfiniteTrialData NonlinearMitc4Residual.RejectsNonfiniteTrialData; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.RejectsNonfiniteTrialData 유지 원문 검사 body 및 assertion 동일. 3e2e0c59444ee3b19641d2b76ca17ee825160e1821798a88bb12d225f0823f29 3e2e0c59444ee3b19641d2b76ca17ee825160e1821798a88bb12d225f0823f29 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-trial"") | EXPECT_FALSE(overflow_result.HasValue())" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-trial"") | EXPECT_FALSE(overflow_result.HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ZeroTrialOnTranslatedDecimalMeshHasNoArtificialForce NonlinearMitc4Residual.ZeroTrialOnTranslatedDecimalMeshHasNoArtificialForce; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ZeroTrialOnTranslatedDecimalMeshHasNoArtificialForce 유지 원문 검사 body 및 assertion 동일. dbba37dc6b52df765552dc588e502f3d8435f43ff28832f9702bd655c905951e dbba37dc6b52df765552dc588e502f3d8435f43ff28832f9702bd655c905951e ASSERT_TRUE(evaluated.HasValue()) | EXPECT_DOUBLE_EQ(evaluated.Value().internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(evaluated.Value().drilling_energy, 0.0) ASSERT_TRUE(evaluated.HasValue()) | EXPECT_DOUBLE_EQ(evaluated.Value().internal_force[i], 0.0) | EXPECT_DOUBLE_EQ(evaluated.Value().drilling_energy, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDirectionalThirdGradientMatchesTangentSweep NonlinearMitc4Residual.ExactDirectionalThirdGradientMatchesTangentSweep; assertion 0개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDirectionalThirdGradientMatchesTangentSweep 유지 원문 검사 body 및 assertion 동일. 6d549b636640f56a6c955107a00503e9d58a2649a56aff87cdb9c2e688678c5c 6d549b636640f56a6c955107a00503e9d58a2649a56aff87cdb9c2e688678c5c 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.SmallRotationPhysicalForceRetainsDrillingNullIdentity NonlinearMitc4Residual.SmallRotationPhysicalForceRetainsDrillingNullIdentity; assertion 7개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.SmallRotationPhysicalForceRetainsDrillingNullIdentity 유지 원문 검사 body 및 assertion 동일. 614e3f70648e94b8a868a6e234984c0fc0c47cb9e02c17b202a3955faea48feb 614e3f70648e94b8a868a6e234984c0fc0c47cb9e02c17b202a3955faea48feb ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | ASSERT_GT(physical_scale, 0.0) | ASSERT_GT(total_scale, 0.0) | EXPECT_LE(std::abs(physical) / physical_scale, 1.0e-10) | EXPECT_LE(std::abs(projected - response.Value().drilling_constraint[node]) / total_scale, 1.0e-10) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(response.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | ASSERT_GT(physical_scale, 0.0) | ASSERT_GT(total_scale, 0.0) | EXPECT_LE(std::abs(physical) / physical_scale, 1.0e-10) | EXPECT_LE(std::abs(projected - response.Value().drilling_constraint[node]) / total_scale, 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ThirdGradientIsStableAcrossSmallAngleBranches NonlinearMitc4Residual.ThirdGradientIsStableAcrossSmallAngleBranches; assertion 0개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ThirdGradientIsStableAcrossSmallAngleBranches 유지 원문 검사 body 및 assertion 동일. af1fb78eb8d4496f5767606062cf3f28bcf27e5aed115ee79e830293a3479d40 af1fb78eb8d4496f5767606062cf3f28bcf27e5aed115ee79e830293a3479d40 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian; assertion 7개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian 유지 원문 검사 body 및 assertion 동일. a5e30f5af2df2749898ee64cb0c470bdfcf03e6750df0325a9f2a59855b486f6 a5e30f5af2df2749898ee64cb0c470bdfcf03e6750df0325a9f2a59855b486f6 ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_NEAR(exact.Value().drilling_constraint[node], psi, 1e-11) | EXPECT_NEAR(exact.Value().drilling_constraint_gradient(node, i), gradient, 1e-10) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(passed) ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(rotation.HasValue()) | EXPECT_NEAR(exact.Value().drilling_constraint[node], psi, 1e-11) | EXPECT_NEAR(exact.Value().drilling_constraint_gradient(node, i), gradient, 1e-10) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_TRUE(passed) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExposesExactDrillingConstraintThirdDirectionalGradient NonlinearMitc4Residual.ExposesExactDrillingConstraintThirdDirectionalGradient; assertion 5개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExposesExactDrillingConstraintThirdDirectionalGradient 유지 원문 검사 body 및 assertion 동일. 4a38b5b4ff71243f88af5dc3b4c43d5c10f8ae54ed6456715399299ab8653b88 4a38b5b4ff71243f88af5dc3b4c43d5c10f8ae54ed6456715399299ab8653b88 ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | ASSERT_EQ(exact.Value().drilling_constraint_third_directional_gradient[node] .Size(), 24U) | EXPECT_NEAR( exact.Value().drilling_constraint_third_directional_gradient[node] [row], finite_difference, 2.0e-5) ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | ASSERT_EQ(exact.Value().drilling_constraint_third_directional_gradient[node] .Size(), 24U) | EXPECT_NEAR( exact.Value().drilling_constraint_third_directional_gradient[node] [row], finite_difference, 2.0e-5) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintIncludesForceTimeAndCurvatureTerms NonlinearMitc4Residual.ExternalDrillingConstraintIncludesForceTimeAndCurvatureTerms; assertion 10개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintIncludesForceTimeAndCurvatureTerms 유지 원문 검사 body 및 assertion 동일. ae7d5f1cfc46795fbb1f8992fddd0ff8a72d6148c99d90735a68e0dd5da0bba1 ae7d5f1cfc46795fbb1f8992fddd0ff8a72d6148c99d90735a68e0dd5da0bba1 ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(exact.Value().directional_first, (plus.Value().value - minus.Value().value) / (2.0 * h), 2.0e-8) | EXPECT_NEAR(exact.Value().directional_second, (plus.Value().value - 2.0 * exact.Value().value + minus.Value().value) / (h * h), 3.0e-7) | EXPECT_NEAR(exact.Value().gradient_directional_first[row], (plus.Value().gradient[row] - minus.Value().gradient[row]) / (2.0 * h), 3.0e-8) | EXPECT_NEAR( exact.Value().gradient_directional_second[row], (plus.Value().gradient[row] - 2.0 * exact.Value().gradient[row] + minus.Value().gradient[row]) / (h * h), 4.0e-7) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_NEAR(exact.Value().hessian(row, column), (positive.Value().gradient[row] - negative.Value().gradient[row]) / (2.0 * h), 2.0e-7) ASSERT_TRUE(exact.HasValue()) | ASSERT_TRUE(plus.HasValue()) | ASSERT_TRUE(minus.HasValue()) | EXPECT_NEAR(exact.Value().directional_first, (plus.Value().value - minus.Value().value) / (2.0 * h), 2.0e-8) | EXPECT_NEAR(exact.Value().directional_second, (plus.Value().value - 2.0 * exact.Value().value + minus.Value().value) / (h * h), 3.0e-7) | EXPECT_NEAR(exact.Value().gradient_directional_first[row], (plus.Value().gradient[row] - minus.Value().gradient[row]) / (2.0 * h), 3.0e-8) | EXPECT_NEAR( exact.Value().gradient_directional_second[row], (plus.Value().gradient[row] - 2.0 * exact.Value().gradient[row] + minus.Value().gradient[row]) / (h * h), 4.0e-7) | ASSERT_TRUE(positive.HasValue()) | ASSERT_TRUE(negative.HasValue()) | EXPECT_NEAR(exact.Value().hessian(row, column), (positive.Value().gradient[row] - negative.Value().gradient[row]) / (2.0 * h), 2.0e-7) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintRejectsInvalidRotationAndHasZeroForceValue NonlinearMitc4Residual.ExternalDrillingConstraintRejectsInvalidRotationAndHasZeroForceValue; assertion 9개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.ExternalDrillingConstraintRejectsInvalidRotationAndHasZeroForceValue 유지 원문 검사 body 및 assertion 동일. c6774c3ef132d2277a95b92d7df0c1f0a2c9cae68cd1562a36ec07921aefc433 c6774c3ef132d2277a95b92d7df0c1f0a2c9cae68cd1562a36ec07921aefc433 "ASSERT_TRUE(zero.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().value, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_first, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_second, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_first[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_second[row], 0.0) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-rotation"")" "ASSERT_TRUE(zero.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().value, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_first, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().directional_second, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_first[row], 0.0) | EXPECT_DOUBLE_EQ(zero.Value().gradient_directional_second[row], 0.0) | EXPECT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-rotation"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.TinyRotationPreservesPhysicalForceAndRecoveryEnergy NonlinearMitc4Residual.TinyRotationPreservesPhysicalForceAndRecoveryEnergy; assertion 11개 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp NonlinearMitc4Residual.TinyRotationPreservesPhysicalForceAndRecoveryEnergy 유지 원문 검사 body 및 assertion 동일. d165f9780c2e6af21e2fd97f7ce8451f18ab885a26d92761617a13cae977696e d165f9780c2e6af21e2fd97f7ce8451f18ab885a26d92761617a13cae977696e ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(zero.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().physical_force[row], 0.0) | ASSERT_GT(scale, 0.0) | ASSERT_GT(quadratic_energy, 0.0) | EXPECT_LE(error / scale, 1e-12) | EXPECT_GT(actual.Value().physical_strain_energy, 0.0) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - quadratic_energy) / quadratic_energy, 1e-12) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - shear_energy) / shear_energy, 1e-12) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(zero.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_DOUBLE_EQ(zero.Value().physical_strain_energy, 0.0) | EXPECT_DOUBLE_EQ(zero.Value().physical_force[row], 0.0) | ASSERT_GT(scale, 0.0) | ASSERT_GT(quadratic_energy, 0.0) | EXPECT_LE(error / scale, 1e-12) | EXPECT_GT(actual.Value().physical_strain_energy, 0.0) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - quadratic_energy) / quadratic_energy, 1e-12) | EXPECT_LE(std::abs(actual.Value().physical_strain_energy - shear_energy) / shear_energy, 1e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@1-197 helper/oracle/fixture/include/static assertion 구간: Node, Nodes, NodePointers, Frames, Shell, if, Trial, AddScaled, Direction, ToVector, ReferenceLength, WorkConjugateDirection, WorkConjugate, ChannelNorm, FrobeniusNorm, WorkConjugateTangent, ExpectRelative tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 90ea99ff9b85b927825b8ae83597911a8c75a64fb655d2f0407528119a4fe7aa 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@226-227 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a5600c1fcbcc2b375d90f9a0b51fcb733f74bb959c86447c819b9a8f8c6bced8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@290-291 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 138ed0391b2a8c8081bcdd75fe8ff2c89800a73301b761308a5607407eac6b85 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@321-322 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 80a26bf8dd830eafbfa37a987c6ca13ed7f75849c83da7f86476be70612b7b5a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@336-337 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 808b628cf835f37ca1165035141cf55c77f1b82ba64e5e88837d89c12aa5edc4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@362-363 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b43457f2efa97906a6ef783cd74e022646ee67c2ef526f6a96855ce0af4d2471 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@401-402 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f2cfb81414bf1e8f81009769c5476d4bfb83a9e564ab1c3851411dfc077ad757 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@420-480 helper/oracle/fixture/include/static assertion 구간: CheckThirdSweep, if tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d3556f4001a86aab0161a4dc5f94d4903c713cd3a2e71db2c68fc845b7929abd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp support@837-838 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0436d99db81007fd4713cbcfd2850b351089fc3c05ab34e291a90e1e7621d07d 0436d99db81007fd4713cbcfd2850b351089fc3c05ab34e291a90e1e7621d07d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UndeformedStateHasZeroPhysicalRecovery NonlinearMitc4Shell.UndeformedStateHasZeroPhysicalRecovery; assertion 1개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UndeformedStateHasZeroPhysicalRecovery 유지 원문 검사 body 및 assertion 동일. f3b34af9d811fbfa8302ccb17c75561b3d2674fee61705e5476681bfe4fd4489 f3b34af9d811fbfa8302ccb17c75561b3d2674fee61705e5476681bfe4fd4489 ASSERT_TRUE(recovery.HasValue()) ASSERT_TRUE(recovery.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.BendingResultantsMatchStressThicknessMoments NonlinearMitc4Recovery.BendingResultantsMatchStressThicknessMoments; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.BendingResultantsMatchStressThicknessMoments 유지 원문 검사 body 및 assertion 동일. 34fd7f143c5939eb6db783e82cb725a6ffab1e0bd5e788a2215805ba0232fdcb 34fd7f143c5939eb6db783e82cb725a6ffab1e0bd5e788a2215805ba0232fdcb ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | ASSERT_GT(std::abs(moment), 0.0) | EXPECT_NEAR(point.section_resultant[3U + component], moment, 1.0e-12 * std::abs(moment)) ASSERT_TRUE(shell.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | ASSERT_GT(std::abs(moment), 0.0) | EXPECT_NEAR(point.section_resultant[3U + component], moment, 1.0e-12 * std::abs(moment)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsInvalidNodeAndInitialFrameContracts NonlinearMitc4Shell.RejectsInvalidNodeAndInitialFrameContracts; assertion 6개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsInvalidNodeAndInitialFrameContracts 유지 원문 검사 body 및 assertion 동일. 09059c92e764720f2295f7dd9557530496e4f458cb2eae0317a64daccaae6ac3 09059c92e764720f2295f7dd9557530496e4f458cb2eae0317a64daccaae6ac3 "ASSERT_FALSE(null_node.HasValue()) | EXPECT_EQ(null_node.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-geometry"") | ASSERT_FALSE(duplicate_frame.HasValue()) | EXPECT_EQ(duplicate_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"") | ASSERT_FALSE(invalid_frame.HasValue()) | EXPECT_EQ(invalid_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"")" "ASSERT_FALSE(null_node.HasValue()) | EXPECT_EQ(null_node.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-geometry"") | ASSERT_FALSE(duplicate_frame.HasValue()) | EXPECT_EQ(duplicate_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"") | ASSERT_FALSE(invalid_frame.HasValue()) | EXPECT_EQ(invalid_frame.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-frame"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UsesFixedInitialReferenceGeometry NonlinearMitc4Shell.UsesFixedInitialReferenceGeometry; assertion 1개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.UsesFixedInitialReferenceGeometry 유지 원문 검사 body 및 assertion 동일. 54a10626cf3848a02f009f15114e4ee270eddc556033d856cbde1a6232e2dd50 54a10626cf3848a02f009f15114e4ee270eddc556033d856cbde1a6232e2dd50 ASSERT_TRUE(recovery.HasValue()) ASSERT_TRUE(recovery.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.PreservesUnnormalizedInterpolatedDirector NonlinearMitc4Shell.PreservesUnnormalizedInterpolatedDirector; assertion 3개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.PreservesUnnormalizedInterpolatedDirector 유지 원문 검사 body 및 assertion 동일. acae08ee38b9b527574ad3d03d4dc5ded4224d8d4c298c4166d587dfe2d2f1c5 acae08ee38b9b527574ad3d03d4dc5ded4224d8d4c298c4166d587dfe2d2f1c5 ASSERT_TRUE(recovery.HasValue()) | EXPECT_GT(recovery.Value().physical_strain_energy, 0.0) | EXPECT_NEAR(recovery.Value().gauss_points[0U].generalized_strain[0U], expected_membrane, 1.0e-12) ASSERT_TRUE(recovery.HasValue()) | EXPECT_GT(recovery.Value().physical_strain_energy, 0.0) | EXPECT_NEAR(recovery.Value().gauss_points[0U].generalized_strain[0U], expected_membrane, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsOpposedOrDegenerateCurrentDirectors NonlinearMitc4Shell.RejectsOpposedOrDegenerateCurrentDirectors; assertion 2개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.RejectsOpposedOrDegenerateCurrentDirectors 유지 원문 검사 body 및 assertion 동일. 022372a03ed1384ea9018c527e60a8bb2e92a34abcabf2a3114b60516a9b39bc 022372a03ed1384ea9018c527e60a8bb2e92a34abcabf2a3114b60516a9b39bc "ASSERT_FALSE(recovery.HasValue()) | EXPECT_EQ(recovery.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-director"")" "ASSERT_FALSE(recovery.HasValue()) | EXPECT_EQ(recovery.GetStatus().Diagnostics()[0U].code, ""invalid-nonlinear-shell-director"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.MatchesLinearMitc4RecoveryInSmallRotationLimit NonlinearMitc4Shell.MatchesLinearMitc4RecoveryInSmallRotationLimit; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.MatchesLinearMitc4RecoveryInSmallRotationLimit 유지 원문 검사 body 및 assertion 동일. fd4b13f2fcc4938b50ae86d5f55795e3a40d899b81407fca14f78e5a9d6becd0 fd4b13f2fcc4938b50ae86d5f55795e3a40d899b81407fca14f78e5a9d6becd0 ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear_recovery.HasValue()) | ASSERT_TRUE(linear_recovery.HasValue()) | EXPECT_NEAR(nonlinear_recovery.Value().gauss_points[point] .generalized_strain[component], linear_recovery.Value().points[point] .generalized_strain[component], 1.0e-11) ASSERT_TRUE(linear.HasValue()) | ASSERT_TRUE(nonlinear_recovery.HasValue()) | ASSERT_TRUE(linear_recovery.HasValue()) | EXPECT_NEAR(nonlinear_recovery.Value().gauss_points[point] .generalized_strain[component], linear_recovery.Value().points[point] .generalized_strain[component], 1.0e-11) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.FiniteRigidMotionIsObjective NonlinearMitc4Shell.FiniteRigidMotionIsObjective; assertion 4개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Shell.FiniteRigidMotionIsObjective 유지 원문 검사 body 및 assertion 동일. d31c4760ff39f940a70cb95e45b595095d334feafcc4f498f930764011944a71 d31c4760ff39f940a70cb95e45b595095d334feafcc4f498f930764011944a71 ASSERT_TRUE(recovery.HasValue()) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(recovery.Value().physical_strain_energy, 0.0, 1.0e-12) ASSERT_TRUE(recovery.HasValue()) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(value, 0.0, 1.0e-12) | EXPECT_NEAR(recovery.Value().physical_strain_energy, 0.0, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.EmitsOnlyFixedPhysicalGaussAndStressRows NonlinearMitc4Recovery.EmitsOnlyFixedPhysicalGaussAndStressRows; assertion 7개 tests/unit/elements/nonlinear_mitc4_shell_test.cpp NonlinearMitc4Recovery.EmitsOnlyFixedPhysicalGaussAndStressRows 유지 원문 검사 body 및 assertion 동일. 0008b0829c8e00bd25ac54d72bd223db1acd69f836b6804b78b3557549fac911 0008b0829c8e00bd25ac54d72bd223db1acd69f836b6804b78b3557549fac911 ASSERT_TRUE(recovery.HasValue()) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates[0U], point == 0U || point == 3U ? -gauss : gauss) | EXPECT_EQ(row.natural_coordinates[1U], point < 2U ? -gauss : gauss) | EXPECT_EQ(row.stress[stress].position, positions[stress]) | EXPECT_EQ(row.stress[stress].zeta, zeta[stress]) | EXPECT_EQ(row.stress[stress].components.size(), 3U) ASSERT_TRUE(recovery.HasValue()) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates[0U], point == 0U || point == 3U ? -gauss : gauss) | EXPECT_EQ(row.natural_coordinates[1U], point < 2U ? -gauss : gauss) | EXPECT_EQ(row.stress[stress].position, positions[stress]) | EXPECT_EQ(row.stress[stress].zeta, zeta[stress]) | EXPECT_EQ(row.stress[stress].components.size(), 3U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@1-85 helper/oracle/fixture/include/static assertion 구간: Node, Nodes, NodePointers, Frames, Section, Material, ZeroTrial, Multiply, ExpectZeroRecovery, for, Shell tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a6879fd0fa6466d6fb021e12f76588f690a846dd854355d61c5bfd6fbe0de63b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@124-125 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8dee679c89e7fcd7d139da1813c32774ca38d795655c80ce8208b3ab09423c5d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@152-153 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ff3e2239c30471e94bbc18e563e41bb3744f9395c5d81311174b05782fb6ebc8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@165-166 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 51ced39c2cbb72399c0b49dc9722cc1329c34f357f19be7280ef1e77b2b3e145 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@183-184 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2c8cd1d1980cb0d96addfd4b8037f4d929026a5ac7d0a6ec8856069b5ea0c9d0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@196-197 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 97be9107d040c13bb40f904c4c01ca1d474fce4260203ac57dfa81b0e1c90824 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@235-236 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9b570c15351976fab371b347ec27443d3155262b9585a574bef6a511922d035c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@264-265 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cd67c16794266a7614069ddb2948a60455ba1fa76721f5c3df9ff598aa83e25f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/nonlinear_mitc4_shell_test.cpp support@293-294 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/elements/nonlinear_mitc4_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/thermal_shell_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/unit/elements/thermal_shell_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 70b2d6efab8783f723e6abf838fd6c50a1ea25a436480271f0ad9d9234b062db 70b2d6efab8783f723e6abf838fd6c50a1ea25a436480271f0ad9d9234b062db 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.RationalMatricesSymmetryAndConstantModeUseFixedBudgets ThermalShell.RationalMatricesSymmetryAndConstantModeUseFixedBudgets; assertion 9개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.RationalMatricesSymmetryAndConstantModeUseFixedBudgets 유지 원문 검사 body 및 assertion 동일. b77746063cee453fa1b02d7e825896772f68eda7c436d562a9f120ee00254067 b77746063cee453fa1b02d7e825896772f68eda7c436d562a9f120ee00254067 "ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), exact.c), ec) | EXPECT_LE(Difference(kernel.Conductivity(), exact.k), ek) | EXPECT_LE(cs, 2 * ec) | EXPECT_LE(ks, 2 * ek) | EXPECT_LE(null, std::sqrt(20.) * ek) | EXPECT_LE(std::abs(total - 2), 20 * ec) | EXPECT_EQ(kernel.SourceId().source_label_text, ""0019"") | EXPECT_EQ(kernel.NodeIndices(), (std::array{{7, 2, 9, 4}}))" "ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), exact.c), ec) | EXPECT_LE(Difference(kernel.Conductivity(), exact.k), ek) | EXPECT_LE(cs, 2 * ec) | EXPECT_LE(ks, 2 * ek) | EXPECT_LE(null, std::sqrt(20.) * ek) | EXPECT_LE(std::abs(total - 2), 20 * ec) | EXPECT_EQ(kernel.SourceId().source_label_text, ""0019"") | EXPECT_EQ(kernel.NodeIndices(), (std::array{{7, 2, 9, 4}}))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.CapacityIsPositiveAndConductionHasExactlyOneNullMode ThermalShell.CapacityIsPositiveAndConductionHasExactlyOneNullMode; assertion 4개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.CapacityIsPositiveAndConductionHasExactlyOneNullMode 유지 원문 검사 body 및 assertion 동일. ebcd38fd5f93e481370605596eae5bfee78bd230ee37b0a15d07f1eeead80087 ebcd38fd5f93e481370605596eae5bfee78bd230ee37b0a15d07f1eeead80087 ASSERT_TRUE(created.HasValue()) | EXPECT_GT(capacity.first, Gamma(4096) * Norm(exact.pc) + backward) | EXPECT_LE(std::abs(conduction.first), Gamma(4096) * Norm(exact.pk) + backward) | EXPECT_GT(positive.first, Gamma(4096) * Norm(exact.pk) + backward + projection_budget) ASSERT_TRUE(created.HasValue()) | EXPECT_GT(capacity.first, Gamma(4096) * Norm(exact.pc) + backward) | EXPECT_LE(std::abs(conduction.first), Gamma(4096) * Norm(exact.pk) + backward) | EXPECT_GT(positive.first, Gamma(4096) * Norm(exact.pk) + backward + projection_budget) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.Direct54MatchesSeparatedOperatorsOnActualThreeDimensionalPatches ThermalShell.Direct54MatchesSeparatedOperatorsOnActualThreeDimensionalPatches; assertion 3개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.Direct54MatchesSeparatedOperatorsOnActualThreeDimensionalPatches 유지 원문 검사 body 및 assertion 동일. fcd2050a389cecd6349305c4f881f5347bda524a64af04cf7b5e1e6228aea544 fcd2050a389cecd6349305c4f881f5347bda524a64af04cf7b5e1e6228aea544 ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), direct.c), Norm(kernel.CapacityError()) + Gamma(8192) * Norm(direct.pc)) | EXPECT_LE(Difference(kernel.Conductivity(), direct.k), Norm(kernel.ConductivityError()) + Gamma(8192) * Norm(direct.pk)) ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(kernel.Capacity(), direct.c), Norm(kernel.CapacityError()) + Gamma(8192) * Norm(direct.pc)) | EXPECT_LE(Difference(kernel.Conductivity(), direct.k), Norm(kernel.ConductivityError()) + Gamma(8192) * Norm(direct.pk)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.ThicknessScalingPreservesBothConductionTermsAndCapacity ThermalShell.ThicknessScalingPreservesBothConductionTermsAndCapacity; assertion 3개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.ThicknessScalingPreservesBothConductionTermsAndCapacity 유지 원문 검사 body 및 assertion 동일. 4af2e5d6dba4e15c7ef44c0f8aefc95988294ee8693ef71d0e3ef0f398507b61 4af2e5d6dba4e15c7ef44c0f8aefc95988294ee8693ef71d0e3ef0f398507b61 ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), exact.c), Gamma(4096) * Norm(exact.pc)) | EXPECT_LE(Difference(created.Value().Conductivity(), exact.k), Gamma(4096) * Norm(exact.pk)) ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), exact.c), Gamma(4096) * Norm(exact.pc)) | EXPECT_LE(Difference(created.Value().Conductivity(), exact.k), Gamma(4096) * Norm(exact.pk)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.AffineLinearFluxFramesAndSeparateMidsurfaceTraces ThermalShell.AffineLinearFluxFramesAndSeparateMidsurfaceTraces; assertion 10개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.AffineLinearFluxFramesAndSeparateMidsurfaceTraces 유지 원문 검사 body 및 assertion 동일. 00b41e05c43005233fd41fe3065da06b97e3a43af290bea482c61bdf1875eaaf 00b41e05c43005233fd41fe3065da06b97e3a43af290bea482c61bdf1875eaaf ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | EXPECT_LE( (recovery.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (linear_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_NEAR(frame[i].Dot(frame[j]), i == j ? 1. : 0., Gamma(2048)) | EXPECT_NEAR(frame[0].Cross(frame[1]).Dot(frame[2]), 1., Gamma(2048)) | ASSERT_TRUE(traces.HasValue()) | EXPECT_EQ(traces.Value().global_flux[6 * ip + 2].Z(), 0.) | EXPECT_NEAR(traces.Value().global_flux[6 * ip + 3].Z(), -2., Gamma(2048) * 2) | ASSERT_TRUE(constant.HasValue()) | EXPECT_LE(constant.Value().global_flux[row].Norm(), Gamma(2048) * constant_scale.scale[row]) ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(recovery.HasValue()) | EXPECT_LE( (recovery.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (linear_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_NEAR(frame[i].Dot(frame[j]), i == j ? 1. : 0., Gamma(2048)) | EXPECT_NEAR(frame[0].Cross(frame[1]).Dot(frame[2]), 1., Gamma(2048)) | ASSERT_TRUE(traces.HasValue()) | EXPECT_EQ(traces.Value().global_flux[6 * ip + 2].Z(), 0.) | EXPECT_NEAR(traces.Value().global_flux[6 * ip + 3].Z(), -2., Gamma(2048) * 2) | ASSERT_TRUE(constant.HasValue()) | EXPECT_LE(constant.Value().global_flux[row].Norm(), Gamma(2048) * constant_scale.scale[row]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.TranslationRotationAndReversedNormalPreservePhysicalFlux ThermalShell.TranslationRotationAndReversedNormalPreservePhysicalFlux; assertion 10개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.TranslationRotationAndReversedNormalPreservePhysicalFlux 유지 원문 검사 body 및 assertion 동일. d3b3148c1533aa48c401f4b4d92418d4c57abdb89b589de242b5394ac13349b0 d3b3148c1533aa48c401f4b4d92418d4c57abdb89b589de242b5394ac13349b0 ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(moved.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(flipped.HasValue()) | EXPECT_LE( Difference(base.Value().Capacity(), moved.Value().Capacity()), Norm(base.Value().CapacityError()) + Norm(moved.Value().CapacityError())) | EXPECT_LE( Difference(base.Value().Conductivity(), turned.Value().Conductivity()), Norm(base.Value().ConductivityError()) + Norm(turned.Value().ConductivityError())) | ASSERT_TRUE(flux.HasValue()) | ASSERT_TRUE(reverse.HasValue()) | EXPECT_LE((flux.Value().global_flux[row] - rotate({-3, 2, -4})).Norm(), Gamma(2048) * (turn_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_LE( (reverse.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (reverse_scale.scale[row] + Vector3{3, -2, 4}.Norm())) ASSERT_TRUE(base.HasValue()) | ASSERT_TRUE(moved.HasValue()) | ASSERT_TRUE(turned.HasValue()) | ASSERT_TRUE(flipped.HasValue()) | EXPECT_LE( Difference(base.Value().Capacity(), moved.Value().Capacity()), Norm(base.Value().CapacityError()) + Norm(moved.Value().CapacityError())) | EXPECT_LE( Difference(base.Value().Conductivity(), turned.Value().Conductivity()), Norm(base.Value().ConductivityError()) + Norm(turned.Value().ConductivityError())) | ASSERT_TRUE(flux.HasValue()) | ASSERT_TRUE(reverse.HasValue()) | EXPECT_LE((flux.Value().global_flux[row] - rotate({-3, 2, -4})).Norm(), Gamma(2048) * (turn_scale.scale[row] + Vector3{3, -2, 4}.Norm())) | EXPECT_LE( (reverse.Value().global_flux[row] - Vector3{-3, 2, -4}).Norm(), Gamma(2048) * (reverse_scale.scale[row] + Vector3{3, -2, 4}.Norm())) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.CheckedCreationAndRecoveryRetainSourceAndRejectNonfinite ThermalShell.CheckedCreationAndRecoveryRetainSourceAndRejectNonfinite; assertion 7개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.CheckedCreationAndRecoveryRetainSourceAndRejectNonfinite 유지 원문 검사 body 및 assertion 동일. fa5ae9a4a6c78eb6502fe375b86097724b5484608a38dc580d02729c1662512e fa5ae9a4a6c78eb6502fe375b86097724b5484608a38dc580d02729c1662512e "EXPECT_FALSE(Kernel(kSquare, bad).HasValue()) | EXPECT_FALSE(Kernel(kSquare, 2, bad).HasValue()) | ASSERT_TRUE(created.HasValue()) | ASSERT_FALSE(bad.HasValue()) | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].entity_identity, ""patch:0019"") | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].location.line, 42U) | EXPECT_FALSE(created.Value().Recover(temperature).HasValue())" "EXPECT_FALSE(Kernel(kSquare, bad).HasValue()) | EXPECT_FALSE(Kernel(kSquare, 2, bad).HasValue()) | ASSERT_TRUE(created.HasValue()) | ASSERT_FALSE(bad.HasValue()) | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].entity_identity, ""patch:0019"") | EXPECT_EQ(bad.GetStatus().Diagnostics()[0].location.line, 42U) | EXPECT_FALSE(created.Value().Recover(temperature).HasValue())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.GeneralWarpedFluxUsesActualReciprocalTangentsAndTraceOrder ThermalShell.GeneralWarpedFluxUsesActualReciprocalTangentsAndTraceOrder; assertion 4개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.GeneralWarpedFluxUsesActualReciprocalTangentsAndTraceOrder 유지 원문 검사 body 및 assertion 동일. d8ac116acd93e87e33b2b21c1880b4f4b554f07a2d11fcaba6c3031151e9b780 d8ac116acd93e87e33b2b21c1880b4f4b554f07a2d11fcaba6c3031151e9b780 ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE((actual.Value().global_flux[row] - expected.value[row]).Norm(), 2 * Gamma(2048) * expected.scale[row]) | EXPECT_GT((actual.Value().frames[0][2] - actual.Value().frames[1][2]).Norm(), 1.) ASSERT_TRUE(created.HasValue()) | ASSERT_TRUE(actual.HasValue()) | EXPECT_LE((actual.Value().global_flux[row] - expected.value[row]).Norm(), 2 * Gamma(2048) * expected.scale[row]) | EXPECT_GT((actual.Value().frames[0][2] - actual.Value().frames[1][2]).Norm(), 1.) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.PowerOfTwoCoordinateScalingPreservesDimensionedOperators ThermalShell.PowerOfTwoCoordinateScalingPreservesDimensionedOperators; assertion 3개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.PowerOfTwoCoordinateScalingPreservesDimensionedOperators 유지 원문 검사 body 및 assertion 동일. c09333202e2a4f5cf6a42a31c1e5cd786979db0b59663bca37fc8bd4e508762d c09333202e2a4f5cf6a42a31c1e5cd786979db0b59663bca37fc8bd4e508762d ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), c), Norm(created.Value().CapacityError()) + Gamma(4096) * Norm(c)) | EXPECT_LE( Difference(created.Value().Conductivity(), k), Norm(created.Value().ConductivityError()) + Gamma(4096) * Norm(k)) ASSERT_TRUE(created.HasValue()) | EXPECT_LE(Difference(created.Value().Capacity(), c), Norm(created.Value().CapacityError()) + Gamma(4096) * Norm(c)) | EXPECT_LE( Difference(created.Value().Conductivity(), k), Norm(created.Value().ConductivityError()) + Gamma(4096) * Norm(k)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp ThermalShell.RejectsUnrepresentablePositivePropertiesWithoutClamping ThermalShell.RejectsUnrepresentablePositivePropertiesWithoutClamping; assertion 2개 tests/unit/elements/thermal_shell_test.cpp ThermalShell.RejectsUnrepresentablePositivePropertiesWithoutClamping 유지 원문 검사 body 및 assertion 동일. ce5c3d9a306fa53f5457ea5db0a9d002d806423381a139cd329f8c6b42bae98b ce5c3d9a306fa53f5457ea5db0a9d002d806423381a139cd329f8c6b42bae98b EXPECT_FALSE(underflow.HasValue()) | EXPECT_FALSE(overflow.HasValue()) EXPECT_FALSE(underflow.HasValue()) | EXPECT_FALSE(overflow.HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/elements/thermal_shell_test.cpp support@1-245 helper/oracle/fixture/include/static assertion 구간: Gamma, Norm, Difference, Kernel, Oracle, Rational, Direct54, FluxOracle, Flux, EigenExtrema, if tests/unit/elements/thermal_shell_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4b36e387f8082d0a918209d0e72ac417a3b4be25b0bcd07da65f3c169413c725 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/fem/dof_manager_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 12개 tests/unit/fem/dof_manager_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bd0972cde135770050c66143519332b17cb62a5c17b81530927fb27ef017c844 bd0972cde135770050c66143519332b17cb62a5c17b81530927fb27ef017c844 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder; assertion 17개 tests/unit/fem/dof_manager_test.cpp DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder 유지 원문 검사 body 및 assertion 동일. 41f2338c870fdbb3eff99743a0ef8112756b63092f3525a035a3755eb09882b1 41f2338c870fdbb3eff99743a0ef8112756b63092f3525a035a3755eb09882b1 "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(dofs.ValidateInvariants().IsOk()) | ASSERT_TRUE(first_scatter.HasValue()) | ASSERT_TRUE(second_scatter.HasValue()) | EXPECT_EQ(first_scatter.Value(), (std::vector{14U, 12U, 2U, 0U})) | EXPECT_EQ(second_scatter.Value(), (std::vector{11U, 7U, 9U})) | EXPECT_EQ(RowColumns(pattern, 14U), (std::vector{0U, 2U, 12U, 14U})) | EXPECT_EQ(RowColumns(pattern, 7U), (std::vector{7U, 9U, 11U})) | ASSERT_FALSE(reversed_status.IsOk()) | ASSERT_EQ(reversed_status.Diagnostics().size(), 1U) | EXPECT_EQ(reversed_status.Diagnostics()[0U].code, ""invalid-element-layout-order"") | EXPECT_EQ(dofs.FreeDofs(), expected_free_dofs) | EXPECT_EQ(dofs.ConstrainedDofs(), expected_constrained_dofs) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, expected_row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, expected_columns)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(dofs.ValidateInvariants().IsOk()) | ASSERT_TRUE(first_scatter.HasValue()) | ASSERT_TRUE(second_scatter.HasValue()) | EXPECT_EQ(first_scatter.Value(), (std::vector{14U, 12U, 2U, 0U})) | EXPECT_EQ(second_scatter.Value(), (std::vector{11U, 7U, 9U})) | EXPECT_EQ(RowColumns(pattern, 14U), (std::vector{0U, 2U, 12U, 14U})) | EXPECT_EQ(RowColumns(pattern, 7U), (std::vector{7U, 9U, 11U})) | ASSERT_FALSE(reversed_status.IsOk()) | ASSERT_EQ(reversed_status.Diagnostics().size(), 1U) | EXPECT_EQ(reversed_status.Diagnostics()[0U].code, ""invalid-element-layout-order"") | EXPECT_EQ(dofs.FreeDofs(), expected_free_dofs) | EXPECT_EQ(dofs.ConstrainedDofs(), expected_constrained_dofs) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, expected_row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, expected_columns)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.RejectsEveryCorruptedOwnerMappingInvariant DofManager.RejectsEveryCorruptedOwnerMappingInvariant; assertion 0개 tests/unit/fem/dof_manager_test.cpp DofManager.RejectsEveryCorruptedOwnerMappingInvariant 유지 원문 검사 body 및 assertion 동일. f3a2d0c1bdbc2bfcc10e6a27711d07586fe8076fb87c957f8448b0edef5ff5f0 f3a2d0c1bdbc2bfcc10e6a27711d07586fe8076fb87c957f8448b0edef5ff5f0 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.NumbersSixDofsAndFreeEquationsStably DofManager.NumbersSixDofsAndFreeEquationsStably; assertion 13개 tests/unit/fem/dof_manager_test.cpp DofManager.NumbersSixDofsAndFreeEquationsStably 유지 원문 검사 body 및 assertion 동일. 164a3c027dad0f2949360355d4e84d64180d8478dc812815c46df9d2e9de63fa 164a3c027dad0f2949360355d4e84d64180d8478dc812815c46df9d2e9de63fa EXPECT_EQ(dofs.FullDofCount(), 18U) | EXPECT_EQ(dofs.FreeDofCount(), 13U) | EXPECT_EQ(dofs.ConstrainedDofCount(), 5U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUx), 0U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUrz), 5U) | EXPECT_EQ(dofs.FullDof(1U, fesa::DofComponent::kUx), 6U) | EXPECT_EQ(dofs.FullDof(2U, fesa::DofComponent::kUrz), 17U) | EXPECT_EQ(dofs.FreeDofs(), (std::vector{3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 12U, 13U, 15U, 16U, 17U})) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 1U, 2U, 11U, 14U})) | EXPECT_EQ(dofs.FreeEquation(0U), std::nullopt) | EXPECT_EQ(dofs.FreeEquation(3U), std::optional{0U}) | EXPECT_EQ(dofs.FreeEquation(10U), std::optional{7U}) | EXPECT_EQ(dofs.FreeEquation(17U), std::optional{12U}) EXPECT_EQ(dofs.FullDofCount(), 18U) | EXPECT_EQ(dofs.FreeDofCount(), 13U) | EXPECT_EQ(dofs.ConstrainedDofCount(), 5U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUx), 0U) | EXPECT_EQ(dofs.FullDof(0U, fesa::DofComponent::kUrz), 5U) | EXPECT_EQ(dofs.FullDof(1U, fesa::DofComponent::kUx), 6U) | EXPECT_EQ(dofs.FullDof(2U, fesa::DofComponent::kUrz), 17U) | EXPECT_EQ(dofs.FreeDofs(), (std::vector{3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 12U, 13U, 15U, 16U, 17U})) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 1U, 2U, 11U, 14U})) | EXPECT_EQ(dofs.FreeEquation(0U), std::nullopt) | EXPECT_EQ(dofs.FreeEquation(3U), std::optional{0U}) | EXPECT_EQ(dofs.FreeEquation(10U), std::optional{7U}) | EXPECT_EQ(dofs.FreeEquation(17U), std::optional{12U}) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.ExpandsAndValidatesPrescribedValues DofManager.ExpandsAndValidatesPrescribedValues; assertion 16개 tests/unit/fem/dof_manager_test.cpp DofManager.ExpandsAndValidatesPrescribedValues 유지 원문 검사 body 및 assertion 동일. 6cf0e5ec3dec89d94ff24af258558bcf13c72a823748c36a839c4a4d5daf9b1c 6cf0e5ec3dec89d94ff24af258558bcf13c72a823748c36a839c4a4d5daf9b1c "ASSERT_EQ(values.Size(), 5U) | EXPECT_DOUBLE_EQ(values[0], 0.0) | EXPECT_DOUBLE_EQ(values[1], 0.0) | EXPECT_DOUBLE_EQ(values[2], 0.25) | EXPECT_DOUBLE_EQ(values[3], -0.5) | EXPECT_DOUBLE_EQ(values[4], 0.25) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(conflict.HasValue()) | EXPECT_EQ(conflict.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(conflict.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""conflicting-boundary-condition"") | EXPECT_EQ(diagnostic.keyword, ""BOUNDARY"") | EXPECT_EQ(diagnostic.entity_identity, ""root"") | EXPECT_EQ(diagnostic.location.file, std::filesystem::path{""models/dof-manager.inp""}) | EXPECT_EQ(diagnostic.location.line, 77U)" "ASSERT_EQ(values.Size(), 5U) | EXPECT_DOUBLE_EQ(values[0], 0.0) | EXPECT_DOUBLE_EQ(values[1], 0.0) | EXPECT_DOUBLE_EQ(values[2], 0.25) | EXPECT_DOUBLE_EQ(values[3], -0.5) | EXPECT_DOUBLE_EQ(values[4], 0.25) | ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(conflict.HasValue()) | EXPECT_EQ(conflict.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(conflict.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(diagnostic.code, ""conflicting-boundary-condition"") | EXPECT_EQ(diagnostic.keyword, ""BOUNDARY"") | EXPECT_EQ(diagnostic.entity_identity, ""root"") | EXPECT_EQ(diagnostic.location.file, std::filesystem::path{""models/dof-manager.inp""}) | EXPECT_EQ(diagnostic.location.line, 77U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.BuildsTwelveDofScatterAndSortedUniquePattern DofManager.BuildsTwelveDofScatterAndSortedUniquePattern; assertion 8개 tests/unit/fem/dof_manager_test.cpp DofManager.BuildsTwelveDofScatterAndSortedUniquePattern 유지 원문 검사 body 및 assertion 동일. 777cf0c0c96c7791e264fff4c6af066a696eb2afd008d54cdbf4ccd1d84f11bb 777cf0c0c96c7791e264fff4c6af066a696eb2afd008d54cdbf4ccd1d84f11bb EXPECT_EQ(dofs.ElementScatter(0U), (std::array{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U})) | EXPECT_EQ(dofs.ElementScatter(1U), (std::array{6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U})) | EXPECT_EQ(pattern.row_offsets, (std::vector{0U, 12U, 24U, 36U, 48U, 60U, 72U, 90U, 108U, 126U, 144U, 162U, 180U, 192U, 204U, 216U, 228U, 240U, 252U})) | EXPECT_EQ(RowColumns(pattern, 0U), first_block) | EXPECT_EQ(RowColumns(pattern, 7U), shared_block) | EXPECT_EQ(RowColumns(pattern, 17U), last_block) | EXPECT_TRUE(std::is_sorted(columns.begin(), columns.end())) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) EXPECT_EQ(dofs.ElementScatter(0U), (std::array{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U})) | EXPECT_EQ(dofs.ElementScatter(1U), (std::array{6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U})) | EXPECT_EQ(pattern.row_offsets, (std::vector{0U, 12U, 24U, 36U, 48U, 60U, 72U, 90U, 108U, 126U, 144U, 162U, 180U, 192U, 204U, 216U, 228U, 240U, 252U})) | EXPECT_EQ(RowColumns(pattern, 0U), first_block) | EXPECT_EQ(RowColumns(pattern, 7U), shared_block) | EXPECT_EQ(RowColumns(pattern, 17U), last_block) | EXPECT_TRUE(std::is_sorted(columns.begin(), columns.end())) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.BuildsShellScatterInSourceNodeAndComponentOrder DofManager.BuildsShellScatterInSourceNodeAndComponentOrder; assertion 2개 tests/unit/fem/dof_manager_test.cpp DofManager.BuildsShellScatterInSourceNodeAndComponentOrder 유지 원문 검사 body 및 assertion 동일. 8e1b5e8d8a5b5b681055207235c9565bd84ba56615922df7dbe69f84482a7911 8e1b5e8d8a5b5b681055207235c9565bd84ba56615922df7dbe69f84482a7911 EXPECT_EQ(dofs.FullDofCount(), 24U) | EXPECT_EQ(dofs.ShellElementScatter(0U), (std::array{ 12U, 13U, 14U, 15U, 16U, 17U, 0U, 1U, 2U, 3U, 4U, 5U, 18U, 19U, 20U, 21U, 22U, 23U, 6U, 7U, 8U, 9U, 10U, 11U})) EXPECT_EQ(dofs.FullDofCount(), 24U) | EXPECT_EQ(dofs.ShellElementScatter(0U), (std::array{ 12U, 13U, 14U, 15U, 16U, 17U, 0U, 1U, 2U, 3U, 4U, 5U, 18U, 19U, 20U, 21U, 22U, 23U, 6U, 7U, 8U, 9U, 10U, 11U})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern; assertion 8개 tests/unit/fem/dof_manager_test.cpp DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern 유지 원문 검사 body 및 assertion 동일. 92c8de2bfcae8aace6b388803d0a64c9ac18f2d175a866e225089b21c4a623c8 92c8de2bfcae8aace6b388803d0a64c9ac18f2d175a866e225089b21c4a623c8 ASSERT_EQ(pattern.row_offsets.size(), 25U) | ASSERT_EQ(pattern.column_indices.size(), 24U * 24U) | EXPECT_EQ(pattern.row_offsets[row], row * 24U) | EXPECT_EQ(pattern.row_offsets[row + 1U], (row + 1U) * 24U) | ASSERT_EQ(columns.size(), 24U) | EXPECT_EQ(columns[column], column) | EXPECT_TRUE(std::binary_search(columns.begin(), columns.end(), row)) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) ASSERT_EQ(pattern.row_offsets.size(), 25U) | ASSERT_EQ(pattern.column_indices.size(), 24U * 24U) | EXPECT_EQ(pattern.row_offsets[row], row * 24U) | EXPECT_EQ(pattern.row_offsets[row + 1U], (row + 1U) * 24U) | ASSERT_EQ(columns.size(), 24U) | EXPECT_EQ(columns[column], column) | EXPECT_TRUE(std::binary_search(columns.begin(), columns.end(), row)) | EXPECT_EQ(std::adjacent_find(columns.begin(), columns.end()), columns.end()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp DofManager.ReconstructsFullReducedRoundTrip DofManager.ReconstructsFullReducedRoundTrip; assertion 2개 tests/unit/fem/dof_manager_test.cpp DofManager.ReconstructsFullReducedRoundTrip 유지 원문 검사 body 및 assertion 동일. bcaf1e9c9f316b66734a1487522db16345e115f41d6580164af239c16aef76e0 bcaf1e9c9f316b66734a1487522db16345e115f41d6580164af239c16aef76e0 ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) ASSERT_EQ(reconstructed.Size(), full.Size()) | EXPECT_DOUBLE_EQ(reconstructed[index], full[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp ThermalDofManager.MapsOnlyConnectedNodesAndOverridesModelBoundary ThermalDofManager.MapsOnlyConnectedNodesAndOverridesModelBoundary; assertion 42개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.MapsOnlyConnectedNodesAndOverridesModelBoundary 유지 원문 검사 body 및 assertion 동일. 14c6b2472e4b37fd66fa0c929e96926cb3dbd44664ac0b9917708049cc8ae79b 14c6b2472e4b37fd66fa0c929e96926cb3dbd44664ac0b9917708049cc8ae79b "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(dofs.Profile(), fesa::DofProfile::kThermal) | EXPECT_EQ(dofs.FullDofCount(), 30U) | EXPECT_THROW(dofs.FullDof(0U, fesa::DofComponent::kUx), std::logic_error) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 9U})) | ASSERT_EQ(dofs.PrescribedValues().Size(), 2U) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[0U], 3.0) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[1U], 2.0) | EXPECT_EQ(dofs.FullThermalDof(6U, fesa::ThermalDofComponent::kTop), 29U) | EXPECT_THROW(dofs.FullThermalDof(3U, fesa::ThermalDofComponent::kBottom), std::out_of_range) | EXPECT_THROW( dofs.FullThermalDof( 0U, static_cast( (std::numeric_limits::min)())), std::out_of_range) | ASSERT_TRUE(first.HasValue()) | EXPECT_EQ(first.Value(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(std::vector(second.Value().begin(), second.Value().begin() + 5U), (std::vector{5U, 6U, 7U, 8U, 9U})) | EXPECT_EQ(std::vector(second.Value().end() - 5U, second.Value().end()), (std::vector{10U, 11U, 12U, 13U, 14U})) | EXPECT_FALSE(dofs.ElementScatter(structural_layout).HasValue()) | ASSERT_FALSE(repeated.HasValue()) | EXPECT_EQ(repeated.GetStatus().Diagnostics()[0U].code, ""duplicate-element-dof"") | ASSERT_FALSE(reordered.HasValue()) | ASSERT_FALSE(invalid_component.HasValue()) | EXPECT_EQ(RowColumns(dofs.GetSparsePattern(), 0U), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(scatter_before.HasValue()) | ASSERT_FALSE(invalid.IsOk()) | EXPECT_EQ(invalid.Diagnostics()[0U].code, ""invalid-thermal-element-layout"") | EXPECT_EQ(dofs.Profile(), profile_before) | EXPECT_EQ(dofs.FullDofCount(), full_count_before) | EXPECT_EQ(dofs.FreeDofCount(), free_count_before) | EXPECT_EQ(dofs.ConstrainedDofCount(), constrained_count_before) | EXPECT_EQ(dofs.FreeDofs(), free_before) | EXPECT_EQ(dofs.ConstrainedDofs(), constrained_before) | ASSERT_EQ(dofs.PrescribedValues().Size(), prescribed_before.Size()) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[index], prescribed_before[index]) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, pattern_before.column_indices) | ASSERT_TRUE(scatter_after.HasValue()) | EXPECT_EQ(scatter_after.Value(), scatter_before.Value()) | ASSERT_FALSE(structural_misuse.IsOk()) | EXPECT_EQ(structural_misuse.Diagnostics()[0U].code, ""invalid-dof-profile"") | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(dofs.Profile(), fesa::DofProfile::kThermal) | EXPECT_EQ(dofs.FullDofCount(), 30U) | EXPECT_THROW(dofs.FullDof(0U, fesa::DofComponent::kUx), std::logic_error) | EXPECT_EQ(dofs.ConstrainedDofs(), (std::vector{0U, 9U})) | ASSERT_EQ(dofs.PrescribedValues().Size(), 2U) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[0U], 3.0) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[1U], 2.0) | EXPECT_EQ(dofs.FullThermalDof(6U, fesa::ThermalDofComponent::kTop), 29U) | EXPECT_THROW(dofs.FullThermalDof(3U, fesa::ThermalDofComponent::kBottom), std::out_of_range) | EXPECT_THROW( dofs.FullThermalDof( 0U, static_cast( (std::numeric_limits::min)())), std::out_of_range) | ASSERT_TRUE(first.HasValue()) | EXPECT_EQ(first.Value(), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(std::vector(second.Value().begin(), second.Value().begin() + 5U), (std::vector{5U, 6U, 7U, 8U, 9U})) | EXPECT_EQ(std::vector(second.Value().end() - 5U, second.Value().end()), (std::vector{10U, 11U, 12U, 13U, 14U})) | EXPECT_FALSE(dofs.ElementScatter(structural_layout).HasValue()) | ASSERT_FALSE(repeated.HasValue()) | EXPECT_EQ(repeated.GetStatus().Diagnostics()[0U].code, ""duplicate-element-dof"") | ASSERT_FALSE(reordered.HasValue()) | ASSERT_FALSE(invalid_component.HasValue()) | EXPECT_EQ(RowColumns(dofs.GetSparsePattern(), 0U), (std::vector{0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 16U, 17U, 18U, 19U})) | ASSERT_TRUE(scatter_before.HasValue()) | ASSERT_FALSE(invalid.IsOk()) | EXPECT_EQ(invalid.Diagnostics()[0U].code, ""invalid-thermal-element-layout"") | EXPECT_EQ(dofs.Profile(), profile_before) | EXPECT_EQ(dofs.FullDofCount(), full_count_before) | EXPECT_EQ(dofs.FreeDofCount(), free_count_before) | EXPECT_EQ(dofs.ConstrainedDofCount(), constrained_count_before) | EXPECT_EQ(dofs.FreeDofs(), free_before) | EXPECT_EQ(dofs.ConstrainedDofs(), constrained_before) | ASSERT_EQ(dofs.PrescribedValues().Size(), prescribed_before.Size()) | EXPECT_DOUBLE_EQ(dofs.PrescribedValues()[index], prescribed_before[index]) | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets) | EXPECT_EQ(dofs.GetSparsePattern().column_indices, pattern_before.column_indices) | ASSERT_TRUE(scatter_after.HasValue()) | EXPECT_EQ(scatter_after.Value(), scatter_before.Value()) | ASSERT_FALSE(structural_misuse.IsOk()) | EXPECT_EQ(structural_misuse.Diagnostics()[0U].code, ""invalid-dof-profile"") | EXPECT_EQ(dofs.GetSparsePattern().row_offsets, pattern_before.row_offsets)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsChangedThermalLayoutInventory ThermalDofManager.RejectsChangedThermalLayoutInventory; assertion 6개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsChangedThermalLayoutInventory 유지 원문 검사 body 및 assertion 동일. 24dfec1451d61871c9de4765e12b026aec9b6b1285976d60b47e34c047330d85 24dfec1451d61871c9de4765e12b026aec9b6b1285976d60b47e34c047330d85 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_identity).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_order).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_nodes).IsOk()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_identity).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_order).IsOk()) | EXPECT_FALSE(dofs.BuildThermal(model.Value(), changed_nodes).IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp ThermalDofManager.KeepsDisconnectedThermalComponentsInSeparateCsrBlocks ThermalDofManager.KeepsDisconnectedThermalComponentsInSeparateCsrBlocks; assertion 6개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.KeepsDisconnectedThermalComponentsInSeparateCsrBlocks 유지 원문 검사 body 및 assertion 동일. 3c945c7278e08616de4858fb363c62549e22c8e97d0f6742280b2f61f0a218af 3c945c7278e08616de4858fb363c62549e22c8e97d0f6742280b2f61f0a218af ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().FullDofCount(), 40U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 0U).size(), 20U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 20U).front(), 20U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().FullDofCount(), 40U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 0U).size(), 20U) | EXPECT_EQ(RowColumns(result.Value().GetSparsePattern(), 20U).front(), 20U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsThermalLayoutsForStructuralModels ThermalDofManager.RejectsThermalLayoutsForStructuralModels; assertion 6개 tests/unit/fem/dof_manager_test.cpp ThermalDofManager.RejectsThermalLayoutsForStructuralModels 유지 원문 검사 body 및 assertion 동일. 87aec2f1aa1dcfc017a94fb57393f0d486489a38edebfa67898ef75e8b1cd2fc 87aec2f1aa1dcfc017a94fb57393f0d486489a38edebfa67898ef75e8b1cd2fc "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-dof-profile"") | ASSERT_FALSE(thermal_create.HasValue()) | EXPECT_EQ(thermal_create.GetStatus().Diagnostics()[0U].code, ""invalid-dof-profile"")" "ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(model.HasValue()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics()[0U].code, ""invalid-dof-profile"") | ASSERT_FALSE(thermal_create.HasValue()) | EXPECT_EQ(thermal_create.GetStatus().Diagnostics()[0U].code, ""invalid-dof-profile"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/fem/dof_manager_test.cpp support@1-207 helper/oracle/fixture/include/static assertion 구간: fesa, DofManagerTestAccess, DuplicateOwnership, RemoveFullMapping, ReverseFreeMapping, ReverseConstrainedMapping, CorruptEquationMapping, RemoveSparsePatternEntry, AddSparsePatternEntry, GenericLayoutElement, MakeDefinition, MakeShellDefinition, MakeThermalDefinition, DofFixture, MakeDofFixture, RowColumns, ExpectInvariantFailure tests/unit/fem/dof_manager_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ffdf3f61885836b4d08db6391e44d3993b391b5861abaf01a81f80f6c03e85fb 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/fem/dof_manager_test.cpp support@378-379 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/fem/dof_manager_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. edda67d5ae3e698f84e25f71acc0ab095496b8f704006cd9bd5d64597a7e94e3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/fem/dof_manager_test.cpp support@390-391 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/fem/dof_manager_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 639575113829ba3af23c869e39aa0c68dfba327851149b3234d6c75f83aaa755 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 15개 tests/unit/io/abaqus/domain_mapper_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cdc14b4c935734140f44849672a8a15b2137233b1a5853a685577d3eb16dc728 cdc14b4c935734140f44849672a8a15b2137233b1a5853a685577d3eb16dc728 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck; assertion 54개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck 유지 원문 검사 body 및 assertion 동일. 8f78580d37874c8e4e673f2ddf25cc61801dbcae17fb3ed4731609edd952f3d3 8f78580d37874c8e4e673f2ddf25cc61801dbcae17fb3ed4731609edd952f3d3 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0001"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label_text, ""0002"") | EXPECT_DOUBLE_EQ(domain.Nodes()[1].coordinates[0], 2.0) | ASSERT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(element.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(element.SourceId().source_label_text, ""0007"") | EXPECT_EQ(element.SourceElementType(), ""B33"") | EXPECT_EQ(element.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(&element, &domain.BeamElements()[0U]) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(domain.LinearElasticMaterials()[0U].name, ""Steel"") | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].youngs_modulus, 210000.0) | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].poisson_ratio, 0.75) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(section.area, 2.0) | EXPECT_DOUBLE_EQ(section.i11, 3.0) | EXPECT_DOUBLE_EQ(section.i12, 0.0) | EXPECT_DOUBLE_EQ(section.i22, 4.0) | EXPECT_DOUBLE_EQ(section.torsional_constant, 5.0) | EXPECT_EQ(section.first_axis, (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.section_points, (std::vector>{{-0.5, 0.25}, {0.5, -0.25}})) | EXPECT_EQ(domain.BeamElements()[0U].material_index, 0U) | EXPECT_EQ(domain.BeamElements()[0U].section_index, 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.25) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.5) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.01) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 1.5) | ASSERT_EQ(step.PrescribedDisplacements().Size(), 2U) | EXPECT_EQ(step.PrescribedDisplacements()[0U].Target().target_name_or_label, ""rootassembly"") | EXPECT_EQ(step.PrescribedDisplacements()[0U].Component(), fesa::DofComponent::kUx) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[0U].PrescribedValue(), 0.125) | EXPECT_EQ(step.PrescribedDisplacements()[1U].Component(), fesa::DofComponent::kUy) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[1U].PrescribedValue(), 0.0) | ASSERT_EQ(step.ConcentratedLoads().Size(), 1U) | EXPECT_EQ(step.ConcentratedLoads()[0U].Target().target_name_or_label, ""RootAssembly"") | EXPECT_DOUBLE_EQ(step.ConcentratedLoads()[0U].GlobalComponents()[5U], -12.5) | EXPECT_EQ(domain.Warnings().size(), 8U) | ASSERT_TRUE(parsed_legacy.HasValue()) | ASSERT_TRUE(legacy.HasValue()) | EXPECT_EQ(legacy.Value().Nodes().size(), 11U) | EXPECT_EQ(legacy.Value().Elements().Size(), 10U) | EXPECT_EQ(legacy.Value().Materials().Size(), 1U) | EXPECT_EQ(legacy.Value().Sections().Size(), 1U) | EXPECT_EQ(legacy.Value().Steps().Size(), 1U) | EXPECT_EQ(legacy.Value().Warnings().size(), 7U) | EXPECT_EQ(ReadExactBytes(legacy_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(legacy_path), timestamp_before)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0001"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label_text, ""0002"") | EXPECT_DOUBLE_EQ(domain.Nodes()[1].coordinates[0], 2.0) | ASSERT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(element.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(element.SourceId().source_label_text, ""0007"") | EXPECT_EQ(element.SourceElementType(), ""B33"") | EXPECT_EQ(element.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(&element, &domain.BeamElements()[0U]) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(domain.LinearElasticMaterials()[0U].name, ""Steel"") | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].youngs_modulus, 210000.0) | EXPECT_DOUBLE_EQ(domain.LinearElasticMaterials()[0U].poisson_ratio, 0.75) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(section.area, 2.0) | EXPECT_DOUBLE_EQ(section.i11, 3.0) | EXPECT_DOUBLE_EQ(section.i12, 0.0) | EXPECT_DOUBLE_EQ(section.i22, 4.0) | EXPECT_DOUBLE_EQ(section.torsional_constant, 5.0) | EXPECT_EQ(section.first_axis, (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.section_points, (std::vector>{{-0.5, 0.25}, {0.5, -0.25}})) | EXPECT_EQ(domain.BeamElements()[0U].material_index, 0U) | EXPECT_EQ(domain.BeamElements()[0U].section_index, 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.25) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.5) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.01) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 1.5) | ASSERT_EQ(step.PrescribedDisplacements().Size(), 2U) | EXPECT_EQ(step.PrescribedDisplacements()[0U].Target().target_name_or_label, ""rootassembly"") | EXPECT_EQ(step.PrescribedDisplacements()[0U].Component(), fesa::DofComponent::kUx) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[0U].PrescribedValue(), 0.125) | EXPECT_EQ(step.PrescribedDisplacements()[1U].Component(), fesa::DofComponent::kUy) | EXPECT_DOUBLE_EQ(step.PrescribedDisplacements()[1U].PrescribedValue(), 0.0) | ASSERT_EQ(step.ConcentratedLoads().Size(), 1U) | EXPECT_EQ(step.ConcentratedLoads()[0U].Target().target_name_or_label, ""RootAssembly"") | EXPECT_DOUBLE_EQ(step.ConcentratedLoads()[0U].GlobalComponents()[5U], -12.5) | EXPECT_EQ(domain.Warnings().size(), 8U) | ASSERT_TRUE(parsed_legacy.HasValue()) | ASSERT_TRUE(legacy.HasValue()) | EXPECT_EQ(legacy.Value().Nodes().size(), 11U) | EXPECT_EQ(legacy.Value().Elements().Size(), 10U) | EXPECT_EQ(legacy.Value().Materials().Size(), 1U) | EXPECT_EQ(legacy.Value().Sections().Size(), 1U) | EXPECT_EQ(legacy.Value().Steps().Size(), 1U) | EXPECT_EQ(legacy.Value().Warnings().size(), 7U) | EXPECT_EQ(ReadExactBytes(legacy_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(legacy_path), timestamp_before)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically; assertion 44개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically 유지 원문 검사 body 및 assertion 동일. bf2734852f2ee6378dde74ca60a0a11d717385260626eff82987b59932ab65a4 bf2734852f2ee6378dde74ca60a0a11d717385260626eff82987b59932ab65a4 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[3].source_id.source_label, 20) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.BeamElements()[0].node_indices, (std::array{0U, 1U})) | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.BeamElements()[1].node_indices, (std::array{2U, 3U})) | ASSERT_EQ(domain.NodeSets().size(), 3U) | EXPECT_EQ(domain.NodeSets()[0].name, ""Ends"") | EXPECT_EQ(domain.NodeSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.NodeSets()[0].node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.NodeSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.NodeSets()[1].node_indices, (std::vector{2U, 3U})) | EXPECT_EQ(domain.NodeSets()[2].name, ""OnlySecond"") | EXPECT_EQ(domain.NodeSets()[2].node_indices, (std::vector{3U})) | ASSERT_EQ(domain.ElementSets().size(), 3U) | EXPECT_EQ(domain.ElementSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U})) | EXPECT_EQ(domain.ElementSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.ElementSets()[1].element_indices, (std::vector{1U})) | EXPECT_EQ(domain.ElementSets()[2].name, ""OnlySecondBeam"") | EXPECT_EQ(domain.ElementSets()[2].element_indices, (std::vector{1U})) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""OnlySecond"") | EXPECT_EQ( domain.Steps()[0].ConcentratedLoads()[0U].Target().target_name_or_label, ""OnlySecond"") | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value() .Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""1"") | EXPECT_EQ(direct.Value() .Steps()[0] .ConcentratedLoads()[0U] .Target() .target_name_or_label, ""2"") | ASSERT_TRUE(above_thresholds.HasValue()) | ASSERT_TRUE(large_finite.HasValue()) | ASSERT_EQ(large_domain.Nodes().size(), 2U) | EXPECT_TRUE(large_delta.IsFinite()) | EXPECT_TRUE(std::isfinite(large_delta.Norm())) | EXPECT_DOUBLE_EQ(large_delta.Y(), 1.0e297) | EXPECT_TRUE(large_guide.IsFinite()) | EXPECT_TRUE(std::isfinite(large_guide.Norm()))" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.Nodes()[3].source_id.source_label, 20) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.BeamElements()[0].node_indices, (std::array{0U, 1U})) | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.BeamElements()[1].node_indices, (std::array{2U, 3U})) | ASSERT_EQ(domain.NodeSets().size(), 3U) | EXPECT_EQ(domain.NodeSets()[0].name, ""Ends"") | EXPECT_EQ(domain.NodeSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.NodeSets()[0].node_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.NodeSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.NodeSets()[1].node_indices, (std::vector{2U, 3U})) | EXPECT_EQ(domain.NodeSets()[2].name, ""OnlySecond"") | EXPECT_EQ(domain.NodeSets()[2].node_indices, (std::vector{3U})) | ASSERT_EQ(domain.ElementSets().size(), 3U) | EXPECT_EQ(domain.ElementSets()[0].instance_name, std::optional{""First""}) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U})) | EXPECT_EQ(domain.ElementSets()[1].instance_name, std::optional{""Second""}) | EXPECT_EQ(domain.ElementSets()[1].element_indices, (std::vector{1U})) | EXPECT_EQ(domain.ElementSets()[2].name, ""OnlySecondBeam"") | EXPECT_EQ(domain.ElementSets()[2].element_indices, (std::vector{1U})) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""OnlySecond"") | EXPECT_EQ( domain.Steps()[0].ConcentratedLoads()[0U].Target().target_name_or_label, ""OnlySecond"") | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value() .Steps()[0] .PrescribedDisplacements()[0U] .Target() .target_name_or_label, ""1"") | EXPECT_EQ(direct.Value() .Steps()[0] .ConcentratedLoads()[0U] .Target() .target_name_or_label, ""2"") | ASSERT_TRUE(above_thresholds.HasValue()) | ASSERT_TRUE(large_finite.HasValue()) | ASSERT_EQ(large_domain.Nodes().size(), 2U) | EXPECT_TRUE(large_delta.IsFinite()) | EXPECT_TRUE(std::isfinite(large_delta.Norm())) | EXPECT_DOUBLE_EQ(large_delta.Y(), 1.0e297) | EXPECT_TRUE(large_guide.IsFinite()) | EXPECT_TRUE(std::isfinite(large_guide.Norm()))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces; assertion 12개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces 유지 원문 검사 body 및 assertion 동일. 2aba9a9e28b849050f1881692d962a2144d083d109388698a14e43a9c5c8b3fa 2aba9a9e28b849050f1881692d962a2144d083d109388698a14e43a9c5c8b3fa "ASSERT_TRUE(shared_name.HasValue()) | EXPECT_TRUE(std::any_of( domain.NodeSets().begin(), domain.NodeSets().end(), [](const fesa::NodeSet& set) { return set.name == ""ShellS4""; })) | EXPECT_TRUE(std::any_of( domain.ElementSets().begin(), domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""ShellS4""; })) | ASSERT_FALSE(duplicate_node_set.HasValue()) | EXPECT_NE(FindDiagnostic(duplicate_node_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_FALSE(duplicate_element_set.HasValue()) | EXPECT_NE( FindDiagnostic(duplicate_element_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_TRUE(assembly_shared_name.HasValue()) | EXPECT_EQ(root_node_set_count, 1) | ASSERT_NE(root_node_set, assembly_domain.NodeSets().end()) | EXPECT_EQ(root_node_set->node_indices, (std::vector{0U})) | EXPECT_EQ(std::count_if( assembly_domain.ElementSets().begin(), assembly_domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""Root""; }), 1)" "ASSERT_TRUE(shared_name.HasValue()) | EXPECT_TRUE(std::any_of( domain.NodeSets().begin(), domain.NodeSets().end(), [](const fesa::NodeSet& set) { return set.name == ""ShellS4""; })) | EXPECT_TRUE(std::any_of( domain.ElementSets().begin(), domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""ShellS4""; })) | ASSERT_FALSE(duplicate_node_set.HasValue()) | EXPECT_NE(FindDiagnostic(duplicate_node_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_FALSE(duplicate_element_set.HasValue()) | EXPECT_NE( FindDiagnostic(duplicate_element_set.GetStatus(), ""duplicate-entity""), nullptr) | ASSERT_TRUE(assembly_shared_name.HasValue()) | EXPECT_EQ(root_node_set_count, 1) | ASSERT_NE(root_node_set, assembly_domain.NodeSets().end()) | EXPECT_EQ(root_node_set->node_indices, (std::vector{0U})) | EXPECT_EQ(std::count_if( assembly_domain.ElementSets().begin(), assembly_domain.ElementSets().end(), [](const fesa::ElementSet& set) { return set.name == ""Root""; }), 1)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect; assertion 23개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect 유지 원문 검사 body 및 assertion 동일. 9556663b9437fa4d24f82ae5e96bbab4bc6f0cb6dc06ec796f94eafbe3bcb829 9556663b9437fa4d24f82ae5e96bbab4bc6f0cb6dc06ec796f94eafbe3bcb829 "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(with_no_ops.HasValue()) | EXPECT_TRUE(plain.Value().Warnings().empty()) | ASSERT_EQ(with_no_ops.Value().Warnings().size(), 8U) | EXPECT_EQ(with_no_ops.Value().Warnings()[0].code, ""ignored-input-keyword"") | EXPECT_EQ(with_no_ops.Value().Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[1].keyword, ""TRANSVERSE SHEAR STIFFNESS"") | EXPECT_EQ(with_no_ops.Value().Warnings()[2].keyword, ""RESTART"") | EXPECT_EQ(with_no_ops.Value().Warnings()[3].keyword, ""OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[4].keyword, ""NODE OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[5].keyword, ""ELEMENT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[6].keyword, ""CONTACT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[7].keyword, ""OUTPUT"") | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(with_no_ops.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(with_no_ops.Value().Elements().Size(), plain.Value().Elements().Size()) | EXPECT_EQ(with_no_ops.Value().Materials().Size(), plain.Value().Materials().Size()) | EXPECT_EQ(with_no_ops.Value().Sections().Size(), plain.Value().Sections().Size()) | EXPECT_EQ(with_no_ops.Value().NodeSets().size(), plain.Value().NodeSets().size()) | EXPECT_EQ(with_no_ops.Value().ElementSets().size(), plain.Value().ElementSets().size()) | EXPECT_EQ(with_no_ops.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].BoundaryConditions().size(), plain.Value().Steps()[0].BoundaryConditions().size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].Loads().size(), plain.Value().Steps()[0].Loads().size())" "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(with_no_ops.HasValue()) | EXPECT_TRUE(plain.Value().Warnings().empty()) | ASSERT_EQ(with_no_ops.Value().Warnings().size(), 8U) | EXPECT_EQ(with_no_ops.Value().Warnings()[0].code, ""ignored-input-keyword"") | EXPECT_EQ(with_no_ops.Value().Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[1].keyword, ""TRANSVERSE SHEAR STIFFNESS"") | EXPECT_EQ(with_no_ops.Value().Warnings()[2].keyword, ""RESTART"") | EXPECT_EQ(with_no_ops.Value().Warnings()[3].keyword, ""OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[4].keyword, ""NODE OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[5].keyword, ""ELEMENT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[6].keyword, ""CONTACT OUTPUT"") | EXPECT_EQ(with_no_ops.Value().Warnings()[7].keyword, ""OUTPUT"") | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(with_no_ops.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(with_no_ops.Value().Elements().Size(), plain.Value().Elements().Size()) | EXPECT_EQ(with_no_ops.Value().Materials().Size(), plain.Value().Materials().Size()) | EXPECT_EQ(with_no_ops.Value().Sections().Size(), plain.Value().Sections().Size()) | EXPECT_EQ(with_no_ops.Value().NodeSets().size(), plain.Value().NodeSets().size()) | EXPECT_EQ(with_no_ops.Value().ElementSets().size(), plain.Value().ElementSets().size()) | EXPECT_EQ(with_no_ops.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].BoundaryConditions().size(), plain.Value().Steps()[0].BoundaryConditions().size()) | EXPECT_EQ(with_no_ops.Value().Steps()[0].Loads().size(), plain.Value().Steps()[0].Loads().size())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsNonlinearStaticShellProcedureAndRawControls InpDomainMapping.MapsNonlinearStaticShellProcedureAndRawControls; assertion 12개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsNonlinearStaticShellProcedureAndRawControls 유지 원문 검사 body 및 assertion 동일. 2e73d6a87d1ffc3aec44a5df50e01816e4fdf726356ea95f337dbf60a1e4d902 2e73d6a87d1ffc3aec44a5df50e01816e4fdf726356ea95f337dbf60a1e4d902 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.ProcedureKind(), fesa::StaticProcedureKind::kNonlinearFullNewton) | EXPECT_TRUE(step.IsNonlinearStatic()) | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.001) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 0.1) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0U].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[1U].source_type, fesa::ShellSourceElementType::kS4r) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(step.ProcedureKind(), fesa::StaticProcedureKind::kNonlinearFullNewton) | EXPECT_TRUE(step.IsNonlinearStatic()) | EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.001) | EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 0.1) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0U].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[1U].source_type, fesa::ShellSourceElementType::kS4r) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsExplicitAndImplicitLinearStaticProcedures InpDomainMapping.KeepsExplicitAndImplicitLinearStaticProcedures; assertion 4개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.KeepsExplicitAndImplicitLinearStaticProcedures 유지 원문 검사 body 및 assertion 동일. 645611caad1634687946216c661df3ce027c77b5ea68d779fac476741753a12b 645611caad1634687946216c661df3ce027c77b5ea68d779fac476741753a12b ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Steps().Size(), 1U) | EXPECT_EQ(result.Value().Steps()[0U].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(result.Value().Steps()[0U].IsNonlinearStatic()) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().Steps().Size(), 1U) | EXPECT_EQ(result.Value().Steps()[0U].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(result.Value().Steps()[0U].IsNonlinearStatic()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidNonlinearStaticControlValues InpDomainMapping.RejectsInvalidNonlinearStaticControlValues; assertion 3개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidNonlinearStaticControlValues 유지 원문 검사 body 및 assertion 동일. 4833f2bb3b01123f8994ec47b375d524c9247177bb8f2e8318fbde641ce2fd45 4833f2bb3b01123f8994ec47b375d524c9247177bb8f2e8318fbde641ce2fd45 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-nonlinear-static-data""), nullptr)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-nonlinear-static-data""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedNonlinearProceduresAndMixedModels InpDomainMapping.RejectsUnsupportedNonlinearProceduresAndMixedModels; assertion 6개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedNonlinearProceduresAndMixedModels 유지 원문 검사 body 및 assertion 동일. ecf6c6c09f3477f2db467ff9106e3b19c1553237de80831fdd99cc22dca3e390 ecf6c6c09f3477f2db467ff9106e3b19c1553237de80831fdd99cc22dca3e390 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.first == ""dynamic"" ? ""invalid-dynamic-data"" : ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_EQ(mixed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-mixed-element-model""), nullptr)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.first == ""dynamic"" ? ""invalid-dynamic-data"" : ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_EQ(mixed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-mixed-element-model""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.AcceptsOnlyNonlinearPreselectOutputNoOps InpDomainMapping.AcceptsOnlyNonlinearPreselectOutputNoOps; assertion 11개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.AcceptsOnlyNonlinearPreselectOutputNoOps 유지 원문 검사 body 및 assertion 동일. 0bb0af8b7d98b402f61fa466169286371cf638754a75cfdcd433f5066d8c1fee 0bb0af8b7d98b402f61fa466169286371cf638754a75cfdcd433f5066d8c1fee "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(result.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(result.Value().Steps()[0U].BoundaryConditions().size(), plain.Value().Steps()[0U].BoundaryConditions().size()) | EXPECT_EQ(result.Value().Steps()[0U].Loads().size(), plain.Value().Steps()[0U].Loads().size()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0U].keyword, ""OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-keyword-parameter""), nullptr)" "ASSERT_TRUE(plain.HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().Nodes().size(), plain.Value().Nodes().size()) | EXPECT_EQ(result.Value().Steps().Size(), plain.Value().Steps().Size()) | EXPECT_EQ(result.Value().Steps()[0U].BoundaryConditions().size(), plain.Value().Steps()[0U].BoundaryConditions().size()) | EXPECT_EQ(result.Value().Steps()[0U].Loads().size(), plain.Value().Steps()[0U].Loads().size()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0U].keyword, ""OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), ""invalid-keyword-parameter""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity; assertion 40개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity 유지 원문 검사 body 및 assertion 동일. 73516cc1de335e84ad43308d44db8ab9748911b9df15b569a3db4a78b3694a71 73516cc1de335e84ad43308d44db8ab9748911b9df15b569a3db4a78b3694a71 "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.Elements().Size(), 4U) | EXPECT_EQ(domain.Elements()[0U].Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(domain.Elements()[0U].SourceElementType(), ""S4"") | EXPECT_EQ(domain.Elements()[1U].SourceElementType(), ""S4R"") | EXPECT_EQ(&domain.Elements()[0U], &domain.ShellElements()[0U]) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0010"") | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices, (std::array{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].node_indices, (std::array{1U, 4U, 5U, 2U})) | EXPECT_EQ(domain.ShellElements()[1].section_index, 1U) | EXPECT_EQ(domain.ShellElements()[1].material_index, 1U) | EXPECT_EQ(domain.ShellElements()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.ShellElements()[2].node_indices, (std::array{6U, 7U, 8U, 9U})) | EXPECT_EQ(domain.ShellElements()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""ShellS4"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.1) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""ShellS4R"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[1].thickness, 0.2) | EXPECT_EQ(domain.ShellSections()[1].material_index, 1U) | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), domain.Nodes().size()) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 0U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_EQ(domain.Steps().Size(), 1U) | ASSERT_EQ(domain.Steps()[0].PrescribedDisplacements().Size(), 6U) | EXPECT_EQ(domain.Steps()[0].PrescribedDisplacements()[5U].Component(), fesa::DofComponent::kUrz) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[5U], 1.0)" "ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(domain.BeamElements().Empty()) | ASSERT_EQ(domain.Elements().Size(), 4U) | EXPECT_EQ(domain.Elements()[0U].Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(domain.Elements()[0U].SourceElementType(), ""S4"") | EXPECT_EQ(domain.Elements()[1U].SourceElementType(), ""S4R"") | EXPECT_EQ(&domain.Elements()[0U], &domain.ShellElements()[0U]) | ASSERT_EQ(domain.ShellElements().Size(), 4U) | EXPECT_EQ(domain.ShellElements()[0].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0010"") | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices, (std::array{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[1].source_id.instance_name, ""First"") | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].node_indices, (std::array{1U, 4U, 5U, 2U})) | EXPECT_EQ(domain.ShellElements()[1].section_index, 1U) | EXPECT_EQ(domain.ShellElements()[1].material_index, 1U) | EXPECT_EQ(domain.ShellElements()[2].source_id.instance_name, ""Second"") | EXPECT_EQ(domain.ShellElements()[2].node_indices, (std::array{6U, 7U, 8U, 9U})) | EXPECT_EQ(domain.ShellElements()[3].source_id.instance_name, ""Second"") | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""ShellS4"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.1) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""ShellS4R"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[1].thickness, 0.2) | EXPECT_EQ(domain.ShellSections()[1].material_index, 1U) | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), domain.Nodes().size()) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 0U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_EQ(domain.Steps().Size(), 1U) | ASSERT_EQ(domain.Steps()[0].PrescribedDisplacements().Size(), 6U) | EXPECT_EQ(domain.Steps()[0].PrescribedDisplacements()[5U].Component(), fesa::DofComponent::kUrz) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[5U], 1.0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties; assertion 3개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties 유지 원문 검사 body 및 assertion 동일. 785c82079cd94789aa85628e9ec1e3529ac1ca34099e3eb76d1e740bc3de5cb8 785c82079cd94789aa85628e9ec1e3529ac1ca34099e3eb76d1e740bc3de5cb8 ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels; assertion 3개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels 유지 원문 검사 body 및 assertion 동일. 1156d85feb44cb57821111e3498517c200f57a2a20825d5ee20c89de67879b15 1156d85feb44cb57821111e3498517c200f57a2a20825d5ee20c89de67879b15 ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells; assertion 8개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells 유지 원문 검사 body 및 assertion 동일. 7dad7b84e339df37b9157bcf3dbb1d1899586060ffd077353911cde6901f8aae 7dad7b84e339df37b9157bcf3dbb1d1899586060ffd077353911cde6901f8aae "ASSERT_TRUE(valid.HasValue()) | ASSERT_EQ(valid.Value().Warnings().size(), 3U) | EXPECT_EQ(valid.Value().Warnings()[0].keyword, ""OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[1].keyword, ""NODE OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[2].keyword, ""ELEMENT OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr)" "ASSERT_TRUE(valid.HasValue()) | ASSERT_EQ(valid.Value().Warnings().size(), 3U) | EXPECT_EQ(valid.Value().Warnings()[0].keyword, ""OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[1].keyword, ""NODE OUTPUT"") | EXPECT_EQ(valid.Value().Warnings()[2].keyword, ""ELEMENT OUTPUT"") | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.expected_code), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio; assertion 14개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio 유지 원문 검사 body 및 assertion 동일. 33dae7daee6b5f3283f0dc0c01c58157947c30d91394f6804227b17e827a84ad 33dae7daee6b5f3283f0dc0c01c58157947c30d91394f6804227b17e827a84ad "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_FALSE(diagnostic->location.file.empty()) | EXPECT_GT(diagnostic->location.line, 0U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_EQ(diagnostic->keyword, test_case.expected_keyword) | EXPECT_EQ(diagnostic->entity_identity, ""1"") | EXPECT_EQ(diagnostic->location.line, test_case.expected_line) | EXPECT_EQ(diagnostic->location.file.filename().string(), ""fesa-domain-mapper-same-token-"" + test_case.name + "".inp"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), test_case.category) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_FALSE(diagnostic->location.file.empty()) | EXPECT_GT(diagnostic->location.line, 0U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->severity, fesa::Severity::kError) | EXPECT_EQ(diagnostic->keyword, test_case.expected_keyword) | EXPECT_EQ(diagnostic->entity_identity, ""1"") | EXPECT_EQ(diagnostic->location.line, test_case.expected_line) | EXPECT_EQ(diagnostic->location.file.filename().string(), ""fesa-domain-mapper-same-token-"" + test_case.name + "".inp"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsDloadWithoutDistributedLoadObject InpDomainMapping.RejectsDloadWithoutDistributedLoadObject; assertion 4개 tests/unit/io/abaqus/domain_mapper_test.cpp InpDomainMapping.RejectsDloadWithoutDistributedLoadObject 유지 원문 검사 body 및 assertion 동일. e3e84f2ef580a2306947632bf01bb5fbe250460b5c86095164b54fb00f2ebea9 e3e84f2ef580a2306947632bf01bb5fbe250460b5c86095164b54fb00f2ebea9 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->keyword, ""DLOAD"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_NE(diagnostic, nullptr) | EXPECT_EQ(diagnostic->keyword, ""DLOAD"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@1-253 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, ReadExactBytes, RepositoryRoot, FindDiagnostic, find_if, ReplaceOnce, MinimalDeck, ShellDeck, NonlinearShellDeck, SupportedInventoryDeck tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d4a3cb30beb5a5732a40fb39fe5981aa1156d1ea97812454c30bf93fbbff733e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@578-579 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a17d35bc26ea1a9c371b82c2b0318318ea0f138663e240361e4f36b6b36e28a3 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@601-602 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d3465cabe35b62c482d5bfbc700278989749bc95ced8528c179fabf2e46b1e9d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@618-619 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2dda137dd997f072d5e1721f3fef902ee6eba433d87b0cc65c0ec3bcc92449aa 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@643-644 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9d6708ab0855db443bd63e7f30d47944821695395efba5b5687f458ad88232ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@680-681 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 48cc0be2d1c45cc611d13733472689fca4e37d761ae0374cc74fa3e4f1e83bac 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@717-719 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5fd581bec64057435da242b600880b7876a63ab7f90c83629f761adb523253b9 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@781-782 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f887854314ac3472576dbefddf88818cb395844ceb68f8e943b64a304cae6a92 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@824-825 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fad76b68876263d3277eb79c04e1ae0ce1719f94a92fdd3b1765729c0e1790b0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapper_test.cpp support@863-864 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/domain_mapper_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3b8e0519340ad1aa555a27d246833b7379abb093fe25d9f4bc115c04a15f18f1 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapping_components_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/io/abaqus/domain_mapping_components_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a515704fe97d521d11a2b7c95e41e0f7ec6557f3ee7e4dd5017a8c9757358f9a a515704fe97d521d11a2b7c95e41e0f7ec6557f3ee7e4dd5017a8c9757358f9a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit; assertion 32개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit 유지 원문 검사 body 및 assertion 동일. 5d6ea9aacc764e212a94ecc20d15d795679922368c9c6404c6375192ba222df7 5d6ea9aacc764e212a94ecc20d15d795679922368c9c6404c6375192ba222df7 "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | EXPECT_EQ(summary.part_count, 1U) | EXPECT_EQ(summary.node_count, 2U) | EXPECT_EQ(summary.element_count, 1U) | EXPECT_EQ(summary.instance_count, 1U) | EXPECT_EQ(summary.node_set_count, 3U) | EXPECT_EQ(summary.element_set_count, 1U) | EXPECT_EQ(summary.material_count, 1U) | EXPECT_EQ(summary.beam_section_count, 1U) | EXPECT_EQ(summary.shell_section_count, 0U) | EXPECT_EQ(summary.model_boundary_count, 1U) | EXPECT_EQ(summary.step_boundary_count, 1U) | EXPECT_EQ(summary.step_load_count, 1U) | EXPECT_TRUE(summary.has_static_step) | ASSERT_TRUE(material_property_mapper.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_TRUE(step_definition_mapper.Map(context).IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Properties().Size(), 1U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0].BoundaryConditions().size(), 7U) | EXPECT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Warnings().size(), 3U) | EXPECT_EQ(domain.Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ( domain.Warnings()[0].message, ""The allowlisted Abaqus keyword is ignored without semantic effect."") | EXPECT_EQ(domain.Warnings()[1].keyword, ""OUTPUT"") | EXPECT_EQ(domain.Warnings()[2].keyword, ""NODE OUTPUT"")" "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | EXPECT_EQ(summary.part_count, 1U) | EXPECT_EQ(summary.node_count, 2U) | EXPECT_EQ(summary.element_count, 1U) | EXPECT_EQ(summary.instance_count, 1U) | EXPECT_EQ(summary.node_set_count, 3U) | EXPECT_EQ(summary.element_set_count, 1U) | EXPECT_EQ(summary.material_count, 1U) | EXPECT_EQ(summary.beam_section_count, 1U) | EXPECT_EQ(summary.shell_section_count, 0U) | EXPECT_EQ(summary.model_boundary_count, 1U) | EXPECT_EQ(summary.step_boundary_count, 1U) | EXPECT_EQ(summary.step_load_count, 1U) | EXPECT_TRUE(summary.has_static_step) | ASSERT_TRUE(material_property_mapper.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_TRUE(step_definition_mapper.Map(context).IsOk()) | ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Elements().Size(), 1U) | EXPECT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Properties().Size(), 1U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0].BoundaryConditions().size(), 7U) | EXPECT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Warnings().size(), 3U) | EXPECT_EQ(domain.Warnings()[0].keyword, ""PREPRINT"") | EXPECT_EQ( domain.Warnings()[0].message, ""The allowlisted Abaqus keyword is ignored without semantic effect."") | EXPECT_EQ(domain.Warnings()[1].keyword, ""OUTPUT"") | EXPECT_EQ(domain.Warnings()[2].keyword, ""NODE OUTPUT"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade; assertion 12개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade 유지 원문 검사 body 및 assertion 동일. 77d7cab182b4b08c392cd8698050105755faa3d1fbfef4c56fdd4d02bca34624 77d7cab182b4b08c392cd8698050105755faa3d1fbfef4c56fdd4d02bca34624 "ASSERT_FALSE(component_status.IsOk()) | ASSERT_EQ(component_status.Diagnostics().size(), 1U) | EXPECT_EQ(component_status.Category(), FailureCategory::kInput) | EXPECT_EQ(component_diagnostic.severity, Severity::kError) | EXPECT_EQ(component_diagnostic.code, ""unsupported-keyword"") | EXPECT_EQ(component_diagnostic.location.line, 1U) | EXPECT_EQ(component_diagnostic.keyword, ""NODE"") | EXPECT_TRUE(component_diagnostic.entity_identity.empty()) | EXPECT_EQ(component_diagnostic.message, ""The keyword is outside the approved Abaqus subset."") | ASSERT_FALSE(facade_result.HasValue()) | ASSERT_EQ(facade_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(facade_result.GetStatus().Category(), component_status.Category())" "ASSERT_FALSE(component_status.IsOk()) | ASSERT_EQ(component_status.Diagnostics().size(), 1U) | EXPECT_EQ(component_status.Category(), FailureCategory::kInput) | EXPECT_EQ(component_diagnostic.severity, Severity::kError) | EXPECT_EQ(component_diagnostic.code, ""unsupported-keyword"") | EXPECT_EQ(component_diagnostic.location.line, 1U) | EXPECT_EQ(component_diagnostic.keyword, ""NODE"") | EXPECT_TRUE(component_diagnostic.entity_identity.empty()) | EXPECT_EQ(component_diagnostic.message, ""The keyword is outside the approved Abaqus subset."") | ASSERT_FALSE(facade_result.HasValue()) | ASSERT_EQ(facade_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(facade_result.GetStatus().Category(), component_status.Category())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent; assertion 9개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent 유지 원문 검사 body 및 assertion 동일. ace412f6dba5699c19fff85961b58458545b93fc1e7be9ec005053d32d7acf22 ace412f6dba5699c19fff85961b58458545b93fc1e7be9ec005053d32d7acf22 "ASSERT_TRUE(TopologyMapper{}.Map(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kModel) | EXPECT_EQ(diagnostic.code, ""invalid-beam-property"") | EXPECT_EQ(diagnostic.location.line, 26U) | EXPECT_EQ(diagnostic.keyword, ""ELASTIC"") | EXPECT_EQ(diagnostic.entity_identity, ""Steel"") | EXPECT_EQ(diagnostic.message, ""E and the derived G=E/(2*(1+nu)) must be positive."")" "ASSERT_TRUE(TopologyMapper{}.Map(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kModel) | EXPECT_EQ(diagnostic.code, ""invalid-beam-property"") | EXPECT_EQ(diagnostic.location.line, 26U) | EXPECT_EQ(diagnostic.keyword, ""ELASTIC"") | EXPECT_EQ(diagnostic.entity_identity, ""Steel"") | EXPECT_EQ(diagnostic.message, ""E and the derived G=E/(2*(1+nu)) must be positive."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent; assertion 11개 tests/unit/io/abaqus/domain_mapping_components_test.cpp DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent 유지 원문 검사 body 및 assertion 동일. 22839ffd4c1c68b4f200226079345550d9e13e7c212d27881edf14d3bea5ae3a 22839ffd4c1c68b4f200226079345550d9e13e7c212d27881edf14d3bea5ae3a "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | ASSERT_TRUE(MaterialPropertyMapper{}.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kInput) | EXPECT_EQ(diagnostic.code, ""unresolved-reference"") | EXPECT_EQ(diagnostic.location.line, 35U) | EXPECT_EQ(diagnostic.keyword, ""CLOAD"") | EXPECT_EQ(diagnostic.entity_identity, ""Missing"") | EXPECT_EQ(diagnostic.message, ""The boundary or load target must resolve unambiguously to one "" ""node or one node set."")" "ASSERT_TRUE(topology_mapper.Map(context).IsOk()) | ASSERT_TRUE(MaterialPropertyMapper{}.Map(context).IsOk()) | ASSERT_TRUE(topology_mapper.Finalize(context).IsOk()) | ASSERT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Category(), FailureCategory::kInput) | EXPECT_EQ(diagnostic.code, ""unresolved-reference"") | EXPECT_EQ(diagnostic.location.line, 35U) | EXPECT_EQ(diagnostic.keyword, ""CLOAD"") | EXPECT_EQ(diagnostic.entity_identity, ""Missing"") | EXPECT_EQ(diagnostic.message, ""The boundary or load target must resolve unambiguously to one "" ""node or one node set."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/domain_mapping_components_test.cpp support@1-116 helper/oracle/fixture/include/static assertion 구간: fesa, TemporaryComponentInput, if, ParseComponentInput, ValidComponentDeck, ReplaceOnce, ExpectSameDiagnostic tests/unit/io/abaqus/domain_mapping_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eafbafda80ba9658302f8c6c61d966863cd6dcaf43f376b99f8eafae256f165b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/domain_mapping_components_test.cpp support@240-242 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/io/abaqus/domain_mapping_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8aeadfd7d5a45c48cf01367ce365d0afada064b00686836fc0fc603596c9df16 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/io/abaqus/eigen_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 092b4127f43e6ba27485ad4043ba8b2d80b310299cdf66858fbc239342faa746 092b4127f43e6ba27485ad4043ba8b2d80b310299cdf66858fbc239342faa746 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.PreservesFrequencyDensityAndSourceStepIdentity EigenDomainMapping.PreservesFrequencyDensityAndSourceStepIdentity; assertion 16개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.PreservesFrequencyDensityAndSourceStepIdentity 유지 원문 검사 body 및 assertion 동일. 0e1fbd3de3417171d6a1a291aeafd0b174bc5cd44701267198cf8826ca5bf074 0e1fbd3de3417171d6a1a291aeafd0b174bc5cd44701267198cf8826ca5bf074 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_EQ(domain.Densities()[0].material_index, fesa::EntityIndex{0U}) | EXPECT_DOUBLE_EQ(domain.Densities()[0].rho, 2700.0) | ASSERT_NE(domain.Frequency(), nullptr) | EXPECT_EQ(domain.Frequency()->source_step_name_raw, ""Step-2"") | EXPECT_EQ(domain.Frequency()->source_step_name_canonical, ""STEP-2"") | EXPECT_EQ(domain.Frequency()->requested_mode_count, 10) | EXPECT_TRUE(domain.Frequency()->perturbation_explicit) | EXPECT_TRUE(domain.Frequency()->sim_explicit) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsFrequency()) | EXPECT_EQ(domain.Steps()[0U].Frequency(), domain.Frequency()) | EXPECT_EQ(domain.Steps()[0U].Name(), ""Step-2"") | ASSERT_EQ(domain.Steps()[0U].BoundaryConditions().size(), 6U) | EXPECT_TRUE(domain.Steps()[0U].Loads().empty())" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_EQ(domain.Densities()[0].material_index, fesa::EntityIndex{0U}) | EXPECT_DOUBLE_EQ(domain.Densities()[0].rho, 2700.0) | ASSERT_NE(domain.Frequency(), nullptr) | EXPECT_EQ(domain.Frequency()->source_step_name_raw, ""Step-2"") | EXPECT_EQ(domain.Frequency()->source_step_name_canonical, ""STEP-2"") | EXPECT_EQ(domain.Frequency()->requested_mode_count, 10) | EXPECT_TRUE(domain.Frequency()->perturbation_explicit) | EXPECT_TRUE(domain.Frequency()->sim_explicit) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsFrequency()) | EXPECT_EQ(domain.Steps()[0U].Frequency(), domain.Frequency()) | EXPECT_EQ(domain.Steps()[0U].Name(), ""Step-2"") | ASSERT_EQ(domain.Steps()[0U].BoundaryConditions().size(), 6U) | EXPECT_TRUE(domain.Steps()[0U].Loads().empty())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidDensityAndFrequencySlots EigenDomainMapping.RejectsInvalidDensityAndFrequencySlots; assertion 4개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidDensityAndFrequencySlots 유지 원문 검사 body 및 assertion 동일. 92b68d2ac096a03a02bfacd600af2432bfd869eedeeeeb2f06aa6d4d156e4797 92b68d2ac096a03a02bfacd600af2432bfd869eedeeeeb2f06aa6d4d156e4797 "ASSERT_FALSE(density.HasValue()) | EXPECT_NE(FindDiagnostic(density.GetStatus(), ""invalid-density-data""), nullptr) | ASSERT_FALSE(slots.HasValue()) | EXPECT_NE(FindDiagnostic(slots.GetStatus(), ""invalid-frequency-data""), nullptr)" "ASSERT_FALSE(density.HasValue()) | EXPECT_NE(FindDiagnostic(density.GetStatus(), ""invalid-density-data""), nullptr) | ASSERT_FALSE(slots.HasValue()) | EXPECT_NE(FindDiagnostic(slots.GetStatus(), ""invalid-frequency-data""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMissingActiveDensityAndNonzeroBoundary EigenDomainMapping.RejectsMissingActiveDensityAndNonzeroBoundary; assertion 6개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMissingActiveDensityAndNonzeroBoundary 유지 원문 검사 body 및 assertion 동일. 0b9cfbdd813264e533fb5963dcf276adbd874f0777af515e8fb4aac85015b873 0b9cfbdd813264e533fb5963dcf276adbd874f0777af515e8fb4aac85015b873 "ASSERT_NE(density_location, std::string::npos) | ASSERT_FALSE(missing.HasValue()) | EXPECT_NE(FindDiagnostic(missing.GetStatus(), ""missing-material-density""), nullptr) | ASSERT_NE(location, std::string::npos) | ASSERT_FALSE(boundary.HasValue()) | EXPECT_NE(FindDiagnostic(boundary.GetStatus(), ""unsupported-eigen-boundary""), nullptr)" "ASSERT_NE(density_location, std::string::npos) | ASSERT_FALSE(missing.HasValue()) | EXPECT_NE(FindDiagnostic(missing.GetStatus(), ""missing-material-density""), nullptr) | ASSERT_NE(location, std::string::npos) | ASSERT_FALSE(boundary.HasValue()) | EXPECT_NE(FindDiagnostic(boundary.GetStatus(), ""unsupported-eigen-boundary""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMixedProceduresInvalidOutputAndSurface EigenDomainMapping.RejectsMixedProceduresInvalidOutputAndSurface; assertion 5개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsMixedProceduresInvalidOutputAndSurface 유지 원문 검사 body 및 assertion 동일. 435331124510d6cb20b7a86e468786ff0faa434d408e82d0534542553d875f92 435331124510d6cb20b7a86e468786ff0faa434d408e82d0534542553d875f92 "ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(wrong_output.HasValue()) | EXPECT_NE(FindDiagnostic(wrong_output.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(surface_result.HasValue())" "ASSERT_FALSE(mixed_result.HasValue()) | EXPECT_NE(FindDiagnostic(mixed_result.GetStatus(), ""unsupported-analysis-procedure""), nullptr) | ASSERT_FALSE(wrong_output.HasValue()) | EXPECT_NE(FindDiagnostic(wrong_output.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(surface_result.HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidPreprintAndAcceptsStrictNoOp EigenDomainMapping.RejectsInvalidPreprintAndAcceptsStrictNoOp; assertion 7개 tests/unit/io/abaqus/eigen_domain_test.cpp EigenDomainMapping.RejectsInvalidPreprintAndAcceptsStrictNoOp 유지 원문 검사 body 및 assertion 동일. 8c7a14159391fe657f7760127eb8ab1901d5a25a41c138256a5d83cce9c427ee 8c7a14159391fe657f7760127eb8ab1901d5a25a41c138256a5d83cce9c427ee "ASSERT_TRUE(accepted.HasValue()) | ASSERT_NE(warning, accepted.Value().Warnings().end()) | EXPECT_EQ(warning->message, ""mandatory-eigen-output-unchanged"") | ASSERT_FALSE(rejected.HasValue()) | EXPECT_NE(FindDiagnostic(rejected.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(missing_parameters.HasValue()) | EXPECT_NE( FindDiagnostic(missing_parameters.GetStatus(), ""unsupported-keyword""), nullptr)" "ASSERT_TRUE(accepted.HasValue()) | ASSERT_NE(warning, accepted.Value().Warnings().end()) | EXPECT_EQ(warning->message, ""mandatory-eigen-output-unchanged"") | ASSERT_FALSE(rejected.HasValue()) | EXPECT_NE(FindDiagnostic(rejected.GetStatus(), ""unsupported-keyword""), nullptr) | ASSERT_FALSE(missing_parameters.HasValue()) | EXPECT_NE( FindDiagnostic(missing_parameters.GetStatus(), ""unsupported-keyword""), nullptr)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp support@1-98 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, EigenDeck, FindDiagnostic, for tests/unit/io/abaqus/eigen_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6c0ec5ff9d6242012df3aba6a1f123cd5503d7d8e747d530582db2a7f767719c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/eigen_domain_test.cpp support@206-207 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/eigen_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 20개 tests/unit/io/abaqus/hex8_semantics_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0804a9ef5cb15fdee5c06d4f3ba05b626ebcae6952360bb769271d457bc9530c 0804a9ef5cb15fdee5c06d4f3ba05b626ebcae6952360bb769271d457bc9530c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsEightSourceNodesAndExactlyThreePhysicalDofs Hex8Semantics.MapsEightSourceNodesAndExactlyThreePhysicalDofs; assertion 9개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsEightSourceNodesAndExactlyThreePhysicalDofs 유지 원문 검사 body 및 assertion 동일. c75e22a597ed7445ed43c51b03fb254b6373984026f78f773a97d32687cb7272 c75e22a597ed7445ed43c51b03fb254b6373984026f78f773a97d32687cb7272 "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Elements().Size(), 1U) | EXPECT_EQ(domain.Value().Elements()[0].SourceElementType(), ""C3D8"") | EXPECT_EQ(domain.Value().Elements()[0].SourceId().source_label, 99) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices().size(), 8U) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 3U)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Elements().Size(), 1U) | EXPECT_EQ(domain.Value().Elements()[0].SourceElementType(), ""C3D8"") | EXPECT_EQ(domain.Value().Elements()[0].SourceId().source_label, 99) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices().size(), 8U) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 3U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.InactiveZeroRotationsWarnAndDoNotCreateConstraints Hex8Semantics.InactiveZeroRotationsWarnAndDoNotCreateConstraints; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.InactiveZeroRotationsWarnAndDoNotCreateConstraints 유지 원문 검사 body 및 assertion 동일. 4e9c9d68352626fe0b450e289080ee34f84a54c33b71e1520c4b57a389fe61cb 4e9c9d68352626fe0b450e289080ee34f84a54c33b71e1520c4b57a389fe61cb "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Steps()[0].BoundaryConditions().size(), 3U) | ASSERT_FALSE(domain.Value().Warnings().empty()) | EXPECT_EQ(domain.Value().Warnings().back().keyword, ""BOUNDARY"") | EXPECT_EQ(domain.Value().Warnings().back().entity_identity, ""10"") | EXPECT_GT(domain.Value().Warnings().back().location.line, 0U)" "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Steps()[0].BoundaryConditions().size(), 3U) | ASSERT_FALSE(domain.Value().Warnings().empty()) | EXPECT_EQ(domain.Value().Warnings().back().keyword, ""BOUNDARY"") | EXPECT_EQ(domain.Value().Warnings().back().entity_identity, ""10"") | EXPECT_GT(domain.Value().Warnings().back().location.line, 0U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsNonzeroRotationsAndAllRotationalLoads Hex8Semantics.RejectsNonzeroRotationsAndAllRotationalLoads; assertion 2개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsNonzeroRotationsAndAllRotationalLoads 유지 원문 검사 body 및 assertion 동일. a6d35c2ca679aa7f1b383ead3d9f703d1fa2c74effec04ea46aa3d85e197d622 a6d35c2ca679aa7f1b383ead3d9f703d1fa2c74effec04ea46aa3d85e197d622 "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", ""10,4,4,1\n"")).HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n*Cload\n20,4,0\n"")).HasValue())" "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", ""10,4,4,1\n"")).HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n*Cload\n20,4,0\n"")).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RotationNoOpPreservesPhysicalMapAndLoads Hex8Semantics.RotationNoOpPreservesPhysicalMapAndLoads; assertion 17개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RotationNoOpPreservesPhysicalMapAndLoads 유지 원문 검사 body 및 assertion 동일. 3df0931a844f2efcc21ddebf1505036c8f9a55af7163f978f456efad1136cbdc 3df0931a844f2efcc21ddebf1505036c8f9a55af7163f978f456efad1136cbdc ASSERT_TRUE(physical.HasValue()) | ASSERT_TRUE(extra.HasValue()) | ASSERT_TRUE(pd.HasValue()) | ASSERT_TRUE(ed.HasValue()) | EXPECT_EQ(pd.Value().FreeDofs(), ed.Value().FreeDofs()) | EXPECT_EQ(pd.Value().ConstrainedDofs(), ed.Value().ConstrainedDofs()) | EXPECT_EQ(pd.Value().GetSparsePattern().column_indices, ed.Value().GetSparsePattern().column_indices) | EXPECT_EQ(ed.Value().Profile(), fesa::DofProfile::kSolidStructural) | EXPECT_EQ(ed.Value().ComponentsPerNode(), 3U) | EXPECT_THROW(ed.Value().FullDof(0, fesa::DofComponent::kUrx), std::out_of_range) | ASSERT_TRUE(scatter.HasValue()) | EXPECT_EQ(scatter.Value().size(), 24U) | EXPECT_EQ(scatter.Value().front(), 0U) | EXPECT_EQ(scatter.Value().back(), 23U) | ASSERT_TRUE(pf.HasValue()) | ASSERT_TRUE(ef.HasValue()) | EXPECT_EQ(pf.Value()[i], ef.Value()[i]) ASSERT_TRUE(physical.HasValue()) | ASSERT_TRUE(extra.HasValue()) | ASSERT_TRUE(pd.HasValue()) | ASSERT_TRUE(ed.HasValue()) | EXPECT_EQ(pd.Value().FreeDofs(), ed.Value().FreeDofs()) | EXPECT_EQ(pd.Value().ConstrainedDofs(), ed.Value().ConstrainedDofs()) | EXPECT_EQ(pd.Value().GetSparsePattern().column_indices, ed.Value().GetSparsePattern().column_indices) | EXPECT_EQ(ed.Value().Profile(), fesa::DofProfile::kSolidStructural) | EXPECT_EQ(ed.Value().ComponentsPerNode(), 3U) | EXPECT_THROW(ed.Value().FullDof(0, fesa::DofComponent::kUrx), std::out_of_range) | ASSERT_TRUE(scatter.HasValue()) | EXPECT_EQ(scatter.Value().size(), 24U) | EXPECT_EQ(scatter.Value().front(), 0U) | EXPECT_EQ(scatter.Value().back(), 23U) | ASSERT_TRUE(pf.HasValue()) | ASSERT_TRUE(ef.HasValue()) | EXPECT_EQ(pf.Value()[i], ef.Value()[i]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsTinyRotationBadTargetsOptionsAndDofRanges Hex8Semantics.RejectsTinyRotationBadTargetsOptionsAndDofRanges; assertion 7개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsTinyRotationBadTargetsOptionsAndDofRanges 유지 원문 검사 body 및 assertion 동일. fbaffb1fa7018c85cecd369894293b24dc2a62bf82f918cbd99dbb3c17a70589 fbaffb1fa7018c85cecd369894293b24dc2a62bf82f918cbd99dbb3c17a70589 "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", row)).HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""*Boundary"", ""*Boundary,"" + option)).HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().Steps()[0].BoundaryConditions().empty()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0].code, ""inactive-solid-rotation-boundary"") | EXPECT_EQ(result.Value().Warnings()[0].severity, fesa::Severity::kWarning)" "EXPECT_FALSE(Map(Deck(""*Static\n1,1,1,1\n"", row)).HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""*Boundary"", ""*Boundary,"" + option)).HasValue()) | ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(result.Value().Steps()[0].BoundaryConditions().empty()) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(result.Value().Warnings()[0].code, ""inactive-solid-rotation-boundary"") | EXPECT_EQ(result.Value().Warnings()[0].severity, fesa::Severity::kWarning)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsEmptyFreeAndNoBoundaryModels Hex8Semantics.AllowsEmptyFreeAndNoBoundaryModels; assertion 4개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsEmptyFreeAndNoBoundaryModels 유지 원문 검사 body 및 assertion 동일. b57d0718c1ed58f9fc97136333cada362aeee8c776148cd4cd14bf251fdbb27b b57d0718c1ed58f9fc97136333cada362aeee8c776148cd4cd14bf251fdbb27b ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FreeDofCount(), boundaries.empty() ? 24U : 0U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FreeDofCount(), boundaries.empty() ? 24U : 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RetainsStaticDensityTargetsAndDirectSchedule Hex8Semantics.RetainsStaticDensityTargetsAndDirectSchedule; assertion 13개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RetainsStaticDensityTargetsAndDirectSchedule 유지 원문 검사 body 및 assertion 동일. ecc27dfd2d6e7370b729c72942f53b8a8cd0bf76a40ce684aeaeb88e64fa2c40 ecc27dfd2d6e7370b729c72942f53b8a8cd0bf76a40ce684aeaeb88e64fa2c40 "ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(domain.Value().IsSolid()) | ASSERT_EQ(domain.Value().SolidSections().Size(), 1U) | EXPECT_EQ(domain.Value().SolidSections()[0].MaterialIndex(), 0U) | EXPECT_EQ(domain.Value().Densities()[0].rho, 2.0) | EXPECT_EQ(step.Name(), ""Solid"") | EXPECT_TRUE(step.IsDirectStatic()) | EXPECT_EQ(step.IncrementCount(), 10U) | EXPECT_EQ(step.MaximumIncrements(), 100U) | EXPECT_EQ(dofs.Value().PrescribedValues()[0], .25) | EXPECT_FALSE(Map(Deck(""*Static,direct\n"" + values)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,.5"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,-1"")).HasValue())" "ASSERT_TRUE(domain.HasValue()) | EXPECT_TRUE(domain.Value().IsSolid()) | ASSERT_EQ(domain.Value().SolidSections().Size(), 1U) | EXPECT_EQ(domain.Value().SolidSections()[0].MaterialIndex(), 0U) | EXPECT_EQ(domain.Value().Densities()[0].rho, 2.0) | EXPECT_EQ(step.Name(), ""Solid"") | EXPECT_TRUE(step.IsDirectStatic()) | EXPECT_EQ(step.IncrementCount(), 10U) | EXPECT_EQ(step.MaximumIncrements(), 100U) | EXPECT_EQ(dofs.Value().PrescribedValues()[0], .25) | EXPECT_FALSE(Map(Deck(""*Static,direct\n"" + values)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,.5"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""1000,.3"", ""1000,-1"")).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.SamplesIndependentAmplitudeLoadsAtActualEndpoints Hex8Semantics.SamplesIndependentAmplitudeLoadsAtActualEndpoints; assertion 19개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.SamplesIndependentAmplitudeLoadsAtActualEndpoints 유지 원문 검사 body 및 assertion 동일. 450037b22e5b3e170d8813cdd95b4c635723a769f07f6513e8c7d59e8fef843d 450037b22e5b3e170d8813cdd95b4c635723a769f07f6513e8c7d59e8fef843d "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Amplitudes().size(), 2U) | EXPECT_EQ(amplitude.name_raw, ""A"") | EXPECT_EQ(amplitude.Evaluate(0), 0) | EXPECT_EQ(amplitude.Evaluate(.05), .5) | EXPECT_EQ(amplitude.Evaluate(.1), 1) | EXPECT_EQ(amplitude.Evaluate(20), 1) | EXPECT_FALSE(domain.Value().Dynamic()->nlgeom) | EXPECT_EQ(domain.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(loads[0].AmplitudeIndex(), std::optional{0U}) | EXPECT_EQ(loads[1].AmplitudeIndex(), std::optional{1U}) | EXPECT_EQ(loads[0].AmplitudeName(), ""a"") | EXPECT_GT(loads[0].AmplitudeLocation().line, 0U) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(load.HasValue()) | EXPECT_DOUBLE_EQ(load.Value()[3], amplitude.Evaluate(time) * 10 + domain.Value().Amplitudes()[1].Evaluate(time) * 3 + 5) | EXPECT_FALSE(Map(Replace(text, ""10,1,6"", ""10,1,3,1e-100"")).HasValue()) | EXPECT_FALSE( Map(Replace(text, ""amplitude=a"", ""amplitude=missing"")).HasValue()) | EXPECT_TRUE( Map(Replace(text, ""name=Solid,inc=100"", ""name=Solid,nlgeom=YES,inc=100"")) .HasValue())" "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(domain.Value().Amplitudes().size(), 2U) | EXPECT_EQ(amplitude.name_raw, ""A"") | EXPECT_EQ(amplitude.Evaluate(0), 0) | EXPECT_EQ(amplitude.Evaluate(.05), .5) | EXPECT_EQ(amplitude.Evaluate(.1), 1) | EXPECT_EQ(amplitude.Evaluate(20), 1) | EXPECT_FALSE(domain.Value().Dynamic()->nlgeom) | EXPECT_EQ(domain.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(loads[0].AmplitudeIndex(), std::optional{0U}) | EXPECT_EQ(loads[1].AmplitudeIndex(), std::optional{1U}) | EXPECT_EQ(loads[0].AmplitudeName(), ""a"") | EXPECT_GT(loads[0].AmplitudeLocation().line, 0U) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(load.HasValue()) | EXPECT_DOUBLE_EQ(load.Value()[3], amplitude.Evaluate(time) * 10 + domain.Value().Amplitudes()[1].Evaluate(time) * 3 + 5) | EXPECT_FALSE(Map(Replace(text, ""10,1,6"", ""10,1,3,1e-100"")).HasValue()) | EXPECT_FALSE( Map(Replace(text, ""amplitude=a"", ""amplitude=missing"")).HasValue()) | EXPECT_TRUE( Map(Replace(text, ""name=Solid,inc=100"", ""name=Solid,nlgeom=YES,inc=100"")) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAmplitudeOptionsDataAndCrossFamilyUse Hex8Semantics.RejectsAmplitudeOptionsDataAndCrossFamilyUse; assertion 3개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAmplitudeOptionsDataAndCrossFamilyUse 유지 원문 검사 body 및 assertion 동일. dce2dd9b2fcfbf0c0ec5bf2a49db87a35c8c50379978a06ba8b90b04f3e5dc7f dce2dd9b2fcfbf0c0ec5bf2a49db87a35c8c50379978a06ba8b90b04f3e5dc7f "EXPECT_FALSE( Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"", prefix + amplitude)) .HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n"", ""*Amplitude,name=A\n0,0\n"")) .HasValue()) | EXPECT_FALSE(Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"")).HasValue())" "EXPECT_FALSE( Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"", prefix + amplitude)) .HasValue()) | EXPECT_FALSE( Map(Deck(""*Static\n1,1,1,1\n"", ""10,1,3\n"", ""*Amplitude,name=A\n0,0\n"")) .HasValue()) | EXPECT_FALSE(Map(Deck(""*Dynamic,direct\n.1,1\n"", ""10,1,3\n"")).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAliasesConnectivityThicknessAndMixedModels Hex8Semantics.RejectsAliasesConnectivityThicknessAndMixedModels; assertion 5개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsAliasesConnectivityThicknessAndMixedModels 유지 원문 검사 body 및 assertion 동일. 74400cf0bcfb69af45f006c08c3c5f44a7f71d5f51c25e90b147b08e2a304858 74400cf0bcfb69af45f006c08c3c5f44a7f71d5f51c25e90b147b08e2a304858 "EXPECT_FALSE(Map(Replace(Deck(), ""type=C3D8"", ""type="" + type)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,70"")) .HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,999"")) .HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""material=M\n,"", ""material=M\n2"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*Solid Section"", ""*Element,type=S4\n100,10,20,30,40\n*Solid Section"")) .HasValue())" "EXPECT_FALSE(Map(Replace(Deck(), ""type=C3D8"", ""type="" + type)).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,70"")) .HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,999"")) .HasValue()) | EXPECT_FALSE( Map(Replace(Deck(), ""material=M\n,"", ""material=M\n2"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*Solid Section"", ""*Element,type=S4\n100,10,20,30,40\n*Solid Section"")) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShellSixComponentProfile Hex8Semantics.PreservesShellSixComponentProfile; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShellSixComponentProfile 유지 원문 검사 body 및 assertion 동일. 6253e1af06f92b7af50ff60f0745d70fe50db2b76b537570fe466dd15675d26b 6253e1af06f92b7af50ff60f0745d70fe50db2b76b537570fe466dd15675d26b ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().Profile(), fesa::DofProfile::kStructural) | EXPECT_EQ(dofs.Value().ComponentsPerNode(), 6U) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FullDof(1, fesa::DofComponent::kUrx), 9U) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().Profile(), fesa::DofProfile::kStructural) | EXPECT_EQ(dofs.Value().ComponentsPerNode(), 6U) | EXPECT_EQ(dofs.Value().FullDofCount(), 24U) | EXPECT_EQ(dofs.Value().FullDof(1, fesa::DofComponent::kUrx), 9U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsAllFiveUnmodifiedRequiredSourceDecks Hex8Semantics.MapsAllFiveUnmodifiedRequiredSourceDecks; assertion 8개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.MapsAllFiveUnmodifiedRequiredSourceDecks 유지 원문 검사 body 및 assertion 동일. 27a85d7e4d9d00d5a84c4d3e28b2fd837ee20a9b812730de2b0b120f79639c4f 27a85d7e4d9d00d5a84c4d3e28b2fd837ee20a9b812730de2b0b120f79639c4f "ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().SolidElements().Size(), 300U) | EXPECT_EQ(domain.Value().Nodes().size(), 442U) | EXPECT_EQ(std::count_if(domain.Value().Warnings().begin(), domain.Value().Warnings().end(), [](const auto& warning) { return warning.code == ""inactive-solid-rotation-boundary""; }), 3) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 1326U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 51U)" "ASSERT_TRUE(syntax.HasValue()) | ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().SolidElements().Size(), 300U) | EXPECT_EQ(domain.Value().Nodes().size(), 442U) | EXPECT_EQ(std::count_if(domain.Value().Warnings().begin(), domain.Value().Warnings().end(), [](const auto& warning) { return warning.code == ""inactive-solid-rotation-boundary""; }), 3) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().FullDofCount(), 1326U) | EXPECT_EQ(dofs.Value().ConstrainedDofCount(), 51U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AssemblesFullSymmetricSolidMatricesInStableSourceOrder Hex8Semantics.AssemblesFullSymmetricSolidMatricesInStableSourceOrder; assertion 11개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AssemblesFullSymmetricSolidMatricesInStableSourceOrder 유지 원문 검사 body 및 assertion 동일. cff1fc540c97c7325eb371cd49595d7c44b5235f01cb4f0340c8fe2515e8c437 cff1fc540c97c7325eb371cd49595d7c44b5235f01cb4f0340c8fe2515e8c437 ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Rows(), 24U) | EXPECT_EQ(serial.Value().Columns(), 24U) | EXPECT_EQ(serial.Value().Values().size(), 576U) | EXPECT_EQ(value, 1.0) | EXPECT_EQ(serial.Value().RowOffsets(), parallel.Value().RowOffsets()) | EXPECT_EQ(serial.Value().ColumnIndices(), parallel.Value().ColumnIndices()) | EXPECT_EQ(serial.Value().Values(), parallel.Value().Values()) ASSERT_TRUE(domain.HasValue()) | ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()) | ASSERT_TRUE(serial.HasValue()) | ASSERT_TRUE(parallel.HasValue()) | EXPECT_EQ(serial.Value().Rows(), 24U) | EXPECT_EQ(serial.Value().Columns(), 24U) | EXPECT_EQ(serial.Value().Values().size(), 576U) | EXPECT_EQ(value, 1.0) | EXPECT_EQ(serial.Value().RowOffsets(), parallel.Value().RowOffsets()) | EXPECT_EQ(serial.Value().ColumnIndices(), parallel.Value().ColumnIndices()) | EXPECT_EQ(serial.Value().Values(), parallel.Value().Values()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.ValidatesOutputNoOpsAndRejectsUnapprovedDynamicChildren Hex8Semantics.ValidatesOutputNoOpsAndRejectsUnapprovedDynamicChildren; assertion 5개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.ValidatesOutputNoOpsAndRejectsUnapprovedDynamicChildren 유지 원문 검사 body 및 assertion 동일. 5d0196abf7c53f0e92306554db8a1f9270f76db9aa614254d9d3a5f3e2d1a43e 5d0196abf7c53f0e92306554db8a1f9270f76db9aa614254d9d3a5f3e2d1a43e "EXPECT_TRUE( Map(Replace(Deck(), ""*End Step"", output + ""*End Step"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*End Step"", ""*Output,field,variable=OTHER\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( Deck(), ""*End Step"", ""*Output,field\n*Element Output,position=NODES\nS\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( dynamic, ""*End Step"", ""*Output,field,variable=PRESELECT\n*Node Output\nU\n*End Step"")) .HasValue()) | EXPECT_FALSE(Map(Replace(dynamic, ""*End Step"", ""*Restart,write,frequency=1\n*End Step"")) .HasValue())" "EXPECT_TRUE( Map(Replace(Deck(), ""*End Step"", output + ""*End Step"")).HasValue()) | EXPECT_FALSE(Map(Replace(Deck(), ""*End Step"", ""*Output,field,variable=OTHER\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( Deck(), ""*End Step"", ""*Output,field\n*Element Output,position=NODES\nS\n*End Step"")) .HasValue()) | EXPECT_FALSE( Map(Replace( dynamic, ""*End Step"", ""*Output,field,variable=PRESELECT\n*Node Output\nU\n*End Step"")) .HasValue()) | EXPECT_FALSE(Map(Replace(dynamic, ""*End Step"", ""*Restart,write,frequency=1\n*End Step"")) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidProgrammaticSolidCandidates Hex8Semantics.RejectsInvalidProgrammaticSolidCandidates; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidProgrammaticSolidCandidates 유지 원문 검사 body 및 assertion 동일. 1065eea90059ac9e3e2b606d997c439efabbf2837254a53e0622a7b4ec81655f 1065eea90059ac9e3e2b606d997c439efabbf2837254a53e0622a7b4ec81655f EXPECT_TRUE(fesa::Domain::Create(SolidDefinition()).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(repeated)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(material)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(section)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(rotational)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(unused)).HasValue()) EXPECT_TRUE(fesa::Domain::Create(SolidDefinition()).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(repeated)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(material)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(section)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(rotational)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(unused)).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsSecondProcedureBeforeReadingItsOptionsOrData Hex8Semantics.RejectsSecondProcedureBeforeReadingItsOptionsOrData; assertion 8개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsSecondProcedureBeforeReadingItsOptionsOrData 유지 원문 검사 body 및 assertion 동일. 42d53fd47e4e29b2122ec0929fda515bd8a35ae386135240b8e3c19a168ac537 42d53fd47e4e29b2122ec0929fda515bd8a35ae386135240b8e3c19a168ac537 "ASSERT_TRUE(Map(Deck(first, """", ""*Density\n2\n"")).HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | ASSERT_FALSE(malformed.HasValue()) | ASSERT_FALSE(malformed.GetStatus().Diagnostics().empty()) | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].keyword, ""STATIC"")" "ASSERT_TRUE(Map(Deck(first, """", ""*Density\n2\n"")).HasValue()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | ASSERT_FALSE(malformed.HasValue()) | ASSERT_FALSE(malformed.GetStatus().Diagnostics().empty()) | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].code, ""unsupported-analysis-procedure"") | EXPECT_EQ(malformed.GetStatus().Diagnostics()[0].keyword, ""STATIC"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsOnlyApprovedStaticRestartNoOp Hex8Semantics.AllowsOnlyApprovedStaticRestartNoOp; assertion 6개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.AllowsOnlyApprovedStaticRestartNoOp 유지 원문 검사 body 및 assertion 동일. 3a188909917d0d9026bab32708aace83386bda1c68423f466e1c6f849dfeea74 3a188909917d0d9026bab32708aace83386bda1c68423f466e1c6f849dfeea74 "ASSERT_TRUE(approved.HasValue()) | ASSERT_EQ(approved.Value().Warnings().size(), 1U) | EXPECT_EQ(approved.Value().Warnings()[0].keyword, ""RESTART"") | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""RESTART"")" "ASSERT_TRUE(approved.HasValue()) | ASSERT_EQ(approved.Value().Warnings().size(), 1U) | EXPECT_EQ(approved.Value().Warnings()[0].keyword, ""RESTART"") | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""RESTART"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShuffledSourceLabelsAndRejectsDuplicateIdentities Hex8Semantics.PreservesShuffledSourceLabelsAndRejectsDuplicateIdentities; assertion 15개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.PreservesShuffledSourceLabelsAndRejectsDuplicateIdentities 유지 원문 검사 body 및 assertion 동일. 1e26934f523f95c12da4ba31131a30f25c52519a32368c6a7369490b4907882a 1e26934f523f95c12da4ba31131a30f25c52519a32368c6a7369490b4907882a "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(domain.Value().Nodes()[4].source_id.source_label, 10) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices(), (std::vector{4, 1, 6, 3, 7, 2, 5, 0})) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), (std::vector{12, 13, 14})) | EXPECT_FALSE(Map(Replace(deck, ""20,1,0,0"", ""80,1,0,0"")).HasValue()) | EXPECT_FALSE( Map(Replace(deck, ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,80\n99,10,20,30,40,50,60,70,80"")) .HasValue()) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(direct.Value().Nodes()[7].source_id.source_label, 10) | EXPECT_EQ(direct.Value().SolidElements()[0].node_indices, (std::array{7, 1, 2, 3, 4, 5, 6, 0})) | EXPECT_FALSE(fesa::Domain::Create(std::move(nodes)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(elements)).HasValue())" "ASSERT_TRUE(domain.HasValue()) | EXPECT_EQ(domain.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(domain.Value().Nodes()[4].source_id.source_label, 10) | EXPECT_EQ(domain.Value().Elements()[0].NodeIndices(), (std::vector{4, 1, 6, 3, 7, 2, 5, 0})) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), (std::vector{12, 13, 14})) | EXPECT_FALSE(Map(Replace(deck, ""20,1,0,0"", ""80,1,0,0"")).HasValue()) | EXPECT_FALSE( Map(Replace(deck, ""99,10,20,30,40,50,60,70,80"", ""99,10,20,30,40,50,60,70,80\n99,10,20,30,40,50,60,70,80"")) .HasValue()) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(direct.Value().Nodes()[0].source_id.source_label, 80) | EXPECT_EQ(direct.Value().Nodes()[7].source_id.source_label, 10) | EXPECT_EQ(direct.Value().SolidElements()[0].node_indices, (std::array{7, 1, 2, 3, 4, 5, 6, 0})) | EXPECT_FALSE(fesa::Domain::Create(std::move(nodes)).HasValue()) | EXPECT_FALSE(fesa::Domain::Create(std::move(elements)).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsUnknownSolidAssignmentTargets Hex8Semantics.RejectsUnknownSolidAssignmentTargets; assertion 3개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsUnknownSolidAssignmentTargets 유지 원문 검사 body 및 assertion 동일. 777502085d8347fa372148d730813468e8385f01894e6f1e32c0b7fb4831b84c 777502085d8347fa372148d730813468e8385f01894e6f1e32c0b7fb4831b84c "ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unresolved-solid-section"")" "ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""unresolved-solid-section"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidSolidDynamicSchedulesAndIncrementLimits Hex8Semantics.RejectsInvalidSolidDynamicSchedulesAndIncrementLimits; assertion 3개 tests/unit/io/abaqus/hex8_semantics_test.cpp Hex8Semantics.RejectsInvalidSolidDynamicSchedulesAndIncrementLimits 유지 원문 검사 body 및 assertion 동일. fffbdbf00d02cff95f113d0f9a573ce71a4eb6e0c4b2f829f0fe45dd1d915e4a fffbdbf00d02cff95f113d0f9a573ce71a4eb6e0c4b2f829f0fe45dd1d915e4a "ASSERT_TRUE(Map(valid).HasValue()) | EXPECT_FALSE(Map(Replace(valid, "".1,1\n"", schedule + ""\n"")).HasValue()) | EXPECT_FALSE(Map(Replace(valid, ""inc=100"", ""inc="" + limit)).HasValue())" "ASSERT_TRUE(Map(valid).HasValue()) | EXPECT_FALSE(Map(Replace(valid, "".1,1\n"", schedule + ""\n"")).HasValue()) | EXPECT_FALSE(Map(Replace(valid, ""inc=100"", ""inc="" + limit)).HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp support@1-45 helper/oracle/fixture/include/static assertion 구간: Deck, Map tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e25babf55d99011a53bf3707b7fa77dfd36ca9a650cd07f5ce287e7dfb184913 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp support@80-88 helper/oracle/fixture/include/static assertion 구간: Replace tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7712e67d7827babcfabd756496ca005cd2568399e78f7778748ae28ba5b8a649 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp support@309-345 helper/oracle/fixture/include/static assertion 구간: ConstantMatrixElement tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 25983d2e2d6c1749e19367eb109a0403c60bc3f0e79888448ea10c34e965976a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp support@400-430 helper/oracle/fixture/include/static assertion 구간: SolidDefinition tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8ef84c9fb537fb04031fa128b47e30de8105170c97ef73cb6b05fe993f3a20ff 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hex8_semantics_test.cpp support@555-555 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/hex8_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e5a7cec78d6b44cfd120f3883d44964842e52ab1781c6a9c678b93c1768a893b e5a7cec78d6b44cfd120f3883d44964842e52ab1781c6a9c678b93c1768a893b 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsDirectScheduleDensityAndSourceOrder HhtDynamicDomainMapping.MapsDirectScheduleDensityAndSourceOrder; assertion 22개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsDirectScheduleDensityAndSourceOrder 유지 원문 검사 body 및 assertion 동일. 2fda780cc6cec49273e038031cef69a2064f0c4d1155f63e36511d518662a11f 2fda780cc6cec49273e038031cef69a2064f0c4d1155f63e36511d518662a11f "ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.Dynamic(), nullptr) | EXPECT_EQ(dynamic.source_step_name_raw, ""Dynamic-Load"") | EXPECT_EQ(dynamic.source_step_name_canonical, ""DYNAMIC-LOAD"") | EXPECT_DOUBLE_EQ(dynamic.initial_increment, 0.1) | EXPECT_DOUBLE_EQ(dynamic.time_period, 10.0) | EXPECT_EQ(dynamic.increment_count, 100U) | EXPECT_EQ(dynamic.maximum_increments, 1000U) | EXPECT_DOUBLE_EQ(dynamic.alpha, -0.05) | EXPECT_DOUBLE_EQ(dynamic.beta, 0.275625) | EXPECT_DOUBLE_EQ(dynamic.gamma, 0.55) | ASSERT_EQ(dynamic.boundaries.size(), 1U) | ASSERT_EQ(dynamic.loads.size(), 1U) | EXPECT_EQ(dynamic.loads[0U].dof, 1) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_DOUBLE_EQ(domain.Densities()[0U].rho, 2700.0) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsDynamic()) | EXPECT_FALSE(domain.Steps()[0U].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0U].Dynamic(), domain.Dynamic()) | ASSERT_EQ(domain.Warnings().size(), 4U) | EXPECT_EQ(warning.code, ""ignored-output-request"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.Dynamic(), nullptr) | EXPECT_EQ(dynamic.source_step_name_raw, ""Dynamic-Load"") | EXPECT_EQ(dynamic.source_step_name_canonical, ""DYNAMIC-LOAD"") | EXPECT_DOUBLE_EQ(dynamic.initial_increment, 0.1) | EXPECT_DOUBLE_EQ(dynamic.time_period, 10.0) | EXPECT_EQ(dynamic.increment_count, 100U) | EXPECT_EQ(dynamic.maximum_increments, 1000U) | EXPECT_DOUBLE_EQ(dynamic.alpha, -0.05) | EXPECT_DOUBLE_EQ(dynamic.beta, 0.275625) | EXPECT_DOUBLE_EQ(dynamic.gamma, 0.55) | ASSERT_EQ(dynamic.boundaries.size(), 1U) | ASSERT_EQ(dynamic.loads.size(), 1U) | EXPECT_EQ(dynamic.loads[0U].dof, 1) | ASSERT_EQ(domain.Densities().size(), 1U) | EXPECT_DOUBLE_EQ(domain.Densities()[0U].rho, 2700.0) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_TRUE(domain.Steps()[0U].IsDynamic()) | EXPECT_FALSE(domain.Steps()[0U].IsNonlinearStatic()) | EXPECT_EQ(domain.Steps()[0U].Dynamic(), domain.Dynamic()) | ASSERT_EQ(domain.Warnings().size(), 4U) | EXPECT_EQ(warning.code, ""ignored-output-request"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsOriginalReferenceDeckWithoutMutation HhtDynamicDomainMapping.MapsOriginalReferenceDeckWithoutMutation; assertion 6개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.MapsOriginalReferenceDeckWithoutMutation 유지 원문 검사 body 및 assertion 동일. 8d0c382e2a5992cda6af2865bf5941c2dc847f1591b1625a9532dc881eee65a1 8d0c382e2a5992cda6af2865bf5941c2dc847f1591b1625a9532dc881eee65a1 ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_NE(result.Value().Dynamic(), nullptr) | EXPECT_EQ(result.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(result.Value().Dynamic()->maximum_increments, 1000U) | EXPECT_EQ(result.Value().Dynamic()->loads.size(), 3U) ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_NE(result.Value().Dynamic(), nullptr) | EXPECT_EQ(result.Value().Dynamic()->increment_count, 100U) | EXPECT_EQ(result.Value().Dynamic()->maximum_increments, 1000U) | EXPECT_EQ(result.Value().Dynamic()->loads.size(), 3U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.RejectsMalformedScheduleAndUnsupportedControls HhtDynamicDomainMapping.RejectsMalformedScheduleAndUnsupportedControls; assertion 2개 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp HhtDynamicDomainMapping.RejectsMalformedScheduleAndUnsupportedControls 유지 원문 검사 body 및 assertion 동일. cb6b162159cef6b490fac3ec2e8af7fb2f8c4e72d672d14d6e515cd0fdb22b03 cb6b162159cef6b490fac3ec2e8af7fb2f8c4e72d672d14d6e515cd0fdb22b03 ASSERT_FALSE(result.HasValue()) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.diagnostic), nullptr) ASSERT_FALSE(result.HasValue()) | ASSERT_NE(FindDiagnostic(result.GetStatus(), test_case.diagnostic), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/hht_dynamic_domain_test.cpp support@1-117 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, FindDiagnostic, for, DynamicDeck, ReplaceOnce, RepositoryRoot tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 80674acfe820ddb866f7dab56ffa6515964956c116548bf4746d1064ece4a28c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/hht_dynamic_domain_test.cpp support@205-206 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/hht_dynamic_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/input_reader_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/io/abaqus/input_reader_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 30c6b51c5910fb07f94969370ced1e063bcbf212266e228e3c09ef5a4575ad96 30c6b51c5910fb07f94969370ced1e063bcbf212266e228e3c09ef5a4575ad96 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.RejectsMalformedOrOrphanData InpSyntax.RejectsMalformedOrOrphanData; assertion 14개 tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.RejectsMalformedOrOrphanData 유지 원문 검사 body 및 assertion 동일. ffaa0b04054bbe68b1a87482bbca2cf543c8cd34ea6f4e30fdca2d246bd7db08 ffaa0b04054bbe68b1a87482bbca2cf543c8cd34ea6f4e30fdca2d246bd7db08 "ASSERT_FALSE(unreadable.HasValue()) | EXPECT_EQ(unreadable.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(unreadable.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(unreadable.GetStatus().Diagnostics()[0].code, ""input-file-unreadable"") | ASSERT_FALSE(malformed_result.HasValue()) | EXPECT_EQ(malformed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(malformed_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].code, ""malformed-keyword"") | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].location.line, 1U) | ASSERT_FALSE(orphan_result.HasValue()) | EXPECT_EQ(orphan_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(orphan_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].code, ""orphan-data-line"") | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].location.line, 3U)" "ASSERT_FALSE(unreadable.HasValue()) | EXPECT_EQ(unreadable.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(unreadable.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(unreadable.GetStatus().Diagnostics()[0].code, ""input-file-unreadable"") | ASSERT_FALSE(malformed_result.HasValue()) | EXPECT_EQ(malformed_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(malformed_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].code, ""malformed-keyword"") | EXPECT_EQ(malformed_result.GetStatus().Diagnostics()[0].location.line, 1U) | ASSERT_FALSE(orphan_result.HasValue()) | EXPECT_EQ(orphan_result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(orphan_result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].code, ""orphan-data-line"") | EXPECT_EQ(orphan_result.GetStatus().Diagnostics()[0].location.line, 3U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.ReadsLegacyCantileverWithoutMutation InpSyntax.ReadsLegacyCantileverWithoutMutation; assertion 15개 tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.ReadsLegacyCantileverWithoutMutation 유지 원문 검사 body 및 assertion 동일. f41d9011fdd529843fb8de0b5dd5f54bdadc4501908af1a3ccef423593ce0a04 f41d9011fdd529843fb8de0b5dd5f54bdadc4501908af1a3ccef423593ce0a04 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:04543464cc970405"") | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input_path).lexically_normal()) | ASSERT_EQ(result.Value().blocks.size(), 30U) | EXPECT_EQ(result.Value().blocks.front().canonical_name, ""HEADING"") | EXPECT_EQ(result.Value().blocks.front().location.line, 1U) | EXPECT_EQ(result.Value().blocks.back().canonical_name, ""END STEP"") | ASSERT_NE(element, result.Value().blocks.end()) | ASSERT_EQ(element->parameters.size(), 1U) | EXPECT_EQ(element->parameters[0].name, ""TYPE"") | ASSERT_TRUE(element->parameters[0].value.has_value()) | EXPECT_EQ(*element->parameters[0].value, ""B33"") | EXPECT_EQ(element->data.size(), 10U) | EXPECT_EQ(ReadExactBytes(input_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(input_path), timestamp_before)" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:04543464cc970405"") | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input_path).lexically_normal()) | ASSERT_EQ(result.Value().blocks.size(), 30U) | EXPECT_EQ(result.Value().blocks.front().canonical_name, ""HEADING"") | EXPECT_EQ(result.Value().blocks.front().location.line, 1U) | EXPECT_EQ(result.Value().blocks.back().canonical_name, ""END STEP"") | ASSERT_NE(element, result.Value().blocks.end()) | ASSERT_EQ(element->parameters.size(), 1U) | EXPECT_EQ(element->parameters[0].name, ""TYPE"") | ASSERT_TRUE(element->parameters[0].value.has_value()) | EXPECT_EQ(*element->parameters[0].value, ""B33"") | EXPECT_EQ(element->data.size(), 10U) | EXPECT_EQ(ReadExactBytes(input_path), bytes_before) | EXPECT_EQ(std::filesystem::last_write_time(input_path), timestamp_before)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines; assertion 14개 tests/unit/io/abaqus/input_reader_test.cpp InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines 유지 원문 검사 body 및 assertion 동일. ce727a336d945591a1cc0ad97dee25ebfc241f2be137f3198e86eb7df2578ccf ce727a336d945591a1cc0ad97dee25ebfc241f2be137f3198e86eb7df2578ccf "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""SURFACE"") | EXPECT_EQ(block.original_line, ""*SuRfAcE, TYPE=ELEMENT,"") | EXPECT_EQ(block.physical_lines, (std::vector{""*SuRfAcE, TYPE=ELEMENT,"", "" NAME=Pressure_Surface""})) | ASSERT_EQ(block.parameters.size(), 2U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""ELEMENT"") | EXPECT_EQ(block.parameters[1].name, ""NAME"") | ASSERT_TRUE(block.parameters[1].value.has_value()) | EXPECT_EQ(*block.parameters[1].value, ""Pressure_Surface"") | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].location.line, 3U)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""SURFACE"") | EXPECT_EQ(block.original_line, ""*SuRfAcE, TYPE=ELEMENT,"") | EXPECT_EQ(block.physical_lines, (std::vector{""*SuRfAcE, TYPE=ELEMENT,"", "" NAME=Pressure_Surface""})) | ASSERT_EQ(block.parameters.size(), 2U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""ELEMENT"") | EXPECT_EQ(block.parameters[1].name, ""NAME"") | ASSERT_TRUE(block.parameters[1].value.has_value()) | EXPECT_EQ(*block.parameters[1].value, ""Pressure_Surface"") | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].location.line, 3U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/input_reader_test.cpp support@1-55 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, ReadExactBytes, RepositoryRoot tests/unit/io/abaqus/input_reader_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 09e22f6727e979f0117b382a1b8ac77c50f4103adebca5eb58b315c7b0636451 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/input_syntax_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/io/abaqus/input_syntax_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a0ecd5814f476c566f96a1e64d8e1b2757a0dfd70f17d3543519b1d6226a7b7 6a0ecd5814f476c566f96a1e64d8e1b2757a0dfd70f17d3543519b1d6226a7b7 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.CanonicalizesKeywordAndParameterNamesOnly InpSyntax.CanonicalizesKeywordAndParameterNamesOnly; assertion 14개 tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.CanonicalizesKeywordAndParameterNamesOnly 유지 원문 검사 body 및 assertion 동일. fa957b70a91ffba87d4e77baf9592ef3c6e8475adc7bf40ff3678c1929954f3b fa957b70a91ffba87d4e77baf9592ef3c6e8475adc7bf40ff3678c1929954f3b "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""ELEMENT"") | EXPECT_EQ(block.original_line, original_line) | EXPECT_EQ(block.location.line, 1U) | ASSERT_EQ(block.parameters.size(), 3U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""b33"") | EXPECT_EQ(block.parameters[1].name, ""GENERATE"") | EXPECT_FALSE(block.parameters[1].value.has_value()) | EXPECT_EQ(block.parameters[2].name, ""ELSET"") | ASSERT_TRUE(block.parameters[2].value.has_value()) | EXPECT_EQ(*block.parameters[2].value, ""Beam_Set"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""ELEMENT"") | EXPECT_EQ(block.original_line, original_line) | EXPECT_EQ(block.location.line, 1U) | ASSERT_EQ(block.parameters.size(), 3U) | EXPECT_EQ(block.parameters[0].name, ""TYPE"") | ASSERT_TRUE(block.parameters[0].value.has_value()) | EXPECT_EQ(*block.parameters[0].value, ""b33"") | EXPECT_EQ(block.parameters[1].name, ""GENERATE"") | EXPECT_FALSE(block.parameters[1].value.has_value()) | EXPECT_EQ(block.parameters[2].name, ""ELSET"") | ASSERT_TRUE(block.parameters[2].value.has_value()) | EXPECT_EQ(*block.parameters[2].value, ""Beam_Set"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.PreservesDataAndSourceLocations InpSyntax.PreservesDataAndSourceLocations; assertion 12개 tests/unit/io/abaqus/input_syntax_test.cpp InpSyntax.PreservesDataAndSourceLocations 유지 원문 검사 body 및 assertion 동일. a1132a3f6c99199423c9f513fe5541b7c91e511e68e9f3d935d5bca9ba159733 a1132a3f6c99199423c9f513fe5541b7c91e511e68e9f3d935d5bca9ba159733 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input.Path()).lexically_normal()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:c120b6ed2445be46"") | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""NODE"") | EXPECT_EQ(block.original_line, ""*NoDe"") | EXPECT_EQ(block.location.file, result.Value().source_path) | EXPECT_EQ(block.location.line, 3U) | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].fields, (std::vector{""0007"", ""Label_A"", """", """"})) | EXPECT_EQ(block.data[0].location.file, result.Value().source_path) | EXPECT_EQ(block.data[0].location.line, 4U)" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().source_path, std::filesystem::absolute(input.Path()).lexically_normal()) | EXPECT_EQ(result.Value().source_content_identity, ""fnv1a64:c120b6ed2445be46"") | ASSERT_EQ(result.Value().blocks.size(), 1U) | EXPECT_EQ(block.canonical_name, ""NODE"") | EXPECT_EQ(block.original_line, ""*NoDe"") | EXPECT_EQ(block.location.file, result.Value().source_path) | EXPECT_EQ(block.location.line, 3U) | ASSERT_EQ(block.data.size(), 1U) | EXPECT_EQ(block.data[0].fields, (std::vector{""0007"", ""Label_A"", """", """"})) | EXPECT_EQ(block.data[0].location.file, result.Value().source_path) | EXPECT_EQ(block.data[0].location.line, 4U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/input_syntax_test.cpp support@1-37 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if tests/unit/io/abaqus/input_syntax_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5cd816979355e9dfa2384470d2d676ffac1a89dc2f4e6ccd91d0998e1d374b2d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 18개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f28acc507f7b42094ff105589aa020384ae0c3b6c6b4c67edb7d4e36f7928af6 f28acc507f7b42094ff105589aa020384ae0c3b6c6b4c67edb7d4e36f7928af6 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively; assertion 11개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively 유지 원문 검사 body 및 assertion 동일. 946490ad5c50c1cb8ba083ec3c6d6c42322e4575cbaffc7c063a4aceb1f4d586 946490ad5c50c1cb8ba083ec3c6d6c42322e4575cbaffc7c063a4aceb1f4d586 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(surface.surface_name_raw, ""Direct-Surface"") | EXPECT_EQ(surface.surface_name_canonical, ""DIRECT-SURFACE"") | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].source_element_label_raw, ""0010"") | EXPECT_EQ(surface.facets[0].source_element_type, ""S4"") | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].source_element_type, ""S4R"") | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg)" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(surface.surface_name_raw, ""Direct-Surface"") | EXPECT_EQ(surface.surface_name_canonical, ""DIRECT-SURFACE"") | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].source_element_label_raw, ""0010"") | EXPECT_EQ(surface.facets[0].source_element_type, ""S4"") | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].source_element_type, ""S4R"") | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter; assertion 7개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter 유지 원문 검사 body 및 assertion 동일. d6e14ec8263f733baba442390ee6f6a6f4b722f1f0edb1f7ba795e587f6c858c d6e14ec8263f733baba442390ee6f6a6f4b722f1f0edb1f7ba795e587f6c858c "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(facet.member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.elset_name_raw, ""flat-members"") | EXPECT_EQ(facet.elset_name_canonical, ""FLAT-MEMBERS"") | EXPECT_EQ(facet.instance_name_raw, ""Instance-A"") | EXPECT_EQ(facet.side, fesa::ShellSurfaceSide::kSpos)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(facet.member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.elset_name_raw, ""flat-members"") | EXPECT_EQ(facet.elset_name_canonical, ""FLAT-MEMBERS"") | EXPECT_EQ(facet.instance_name_raw, ""Instance-A"") | EXPECT_EQ(facet.side, fesa::ShellSurfaceSide::kSpos)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder; assertion 21개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder 유지 원문 검사 body 및 assertion 동일. 8d33f673c3b416be94c015ec597fcf82637e32a1423ffa50887b3cec07778a4f 8d33f673c3b416be94c015ec597fcf82637e32a1423ffa50887b3cec07778a4f "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 4U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(surface.facets[0].first_member_ordinal, 2U) | EXPECT_EQ(surface.facets[1].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[1].source_element_label, 20) | EXPECT_EQ(surface.facets[1].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[1].first_member_ordinal, 1U) | EXPECT_EQ(surface.facets[2].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[2].source_element_label, 10) | EXPECT_EQ(surface.facets[2].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[2].first_member_ordinal, 3U) | EXPECT_EQ(surface.facets[3].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[3].source_element_label, 20) | EXPECT_EQ(surface.facets[3].member_kind, fesa::SurfaceMemberKind::kDirect) | EXPECT_EQ(surface.facets[3].first_member_ordinal, 0U) | EXPECT_EQ(facet.part_name_raw, ""Shell-Part"") | EXPECT_EQ(facet.part_name_canonical, ""SHELL-PART"") | EXPECT_EQ(facet.instance_name_canonical, facet.instance_name_raw == ""Instance-A"" ? ""INSTANCE-A"" : ""INSTANCE-B"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 4U) | EXPECT_EQ(surface.facets[0].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[0].source_element_label, 10) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(surface.facets[0].first_member_ordinal, 2U) | EXPECT_EQ(surface.facets[1].instance_name_raw, ""Instance-B"") | EXPECT_EQ(surface.facets[1].source_element_label, 20) | EXPECT_EQ(surface.facets[1].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[1].first_member_ordinal, 1U) | EXPECT_EQ(surface.facets[2].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[2].source_element_label, 10) | EXPECT_EQ(surface.facets[2].member_kind, fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(surface.facets[2].first_member_ordinal, 3U) | EXPECT_EQ(surface.facets[3].instance_name_raw, ""Instance-A"") | EXPECT_EQ(surface.facets[3].source_element_label, 20) | EXPECT_EQ(surface.facets[3].member_kind, fesa::SurfaceMemberKind::kDirect) | EXPECT_EQ(surface.facets[3].first_member_ordinal, 0U) | EXPECT_EQ(facet.part_name_raw, ""Shell-Part"") | EXPECT_EQ(facet.part_name_canonical, ""SHELL-PART"") | EXPECT_EQ(facet.instance_name_canonical, facet.instance_name_raw == ""Instance-A"" ? ""INSTANCE-A"" : ""INSTANCE-B"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder; assertion 21개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder 유지 원문 검사 body 및 assertion 동일. 9c08d13e4d85213392e2e9a91bfd3c2da00f84da36f7a8748cf0356575d40a89 9c08d13e4d85213392e2e9a91bfd3c2da00f84da36f7a8748cf0356575d40a89 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].facet_ordinal, 0U) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].facet_ordinal, 1U) | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg) | ASSERT_EQ(step.SurfacePressureLoads().size(), 2U) | EXPECT_EQ(first.step_name_raw, ""Pressure-Step"") | EXPECT_EQ(first.step_name_canonical, ""PRESSURE-STEP"") | EXPECT_EQ(first.surface_name_raw, ""pressure-surface"") | EXPECT_EQ(first.surface_name_canonical, ""PRESSURE-SURFACE"") | EXPECT_EQ(first.load_type, ""P"") | EXPECT_DOUBLE_EQ(first.magnitude, 0.0) | EXPECT_EQ(first.magnitude_raw, ""-0.0"") | EXPECT_EQ(first.data_ordinal, 0U) | EXPECT_EQ(first.load_ordinal, 0U) | EXPECT_LT(first.keyword_location.line, first.data_location.line) | EXPECT_EQ(second.magnitude_raw, ""+2.50e+03"") | EXPECT_DOUBLE_EQ(second.magnitude, 2500.0) | EXPECT_EQ(second.data_ordinal, 1U) | EXPECT_EQ(second.load_ordinal, 1U)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surface.facets.size(), 2U) | EXPECT_EQ(surface.facets[0].facet_ordinal, 0U) | EXPECT_EQ(surface.facets[0].side, fesa::ShellSurfaceSide::kSpos) | EXPECT_EQ(surface.facets[1].facet_ordinal, 1U) | EXPECT_EQ(surface.facets[1].side, fesa::ShellSurfaceSide::kSneg) | ASSERT_EQ(step.SurfacePressureLoads().size(), 2U) | EXPECT_EQ(first.step_name_raw, ""Pressure-Step"") | EXPECT_EQ(first.step_name_canonical, ""PRESSURE-STEP"") | EXPECT_EQ(first.surface_name_raw, ""pressure-surface"") | EXPECT_EQ(first.surface_name_canonical, ""PRESSURE-SURFACE"") | EXPECT_EQ(first.load_type, ""P"") | EXPECT_DOUBLE_EQ(first.magnitude, 0.0) | EXPECT_EQ(first.magnitude_raw, ""-0.0"") | EXPECT_EQ(first.data_ordinal, 0U) | EXPECT_EQ(first.load_ordinal, 0U) | EXPECT_LT(first.keyword_location.line, first.data_location.line) | EXPECT_EQ(second.magnitude_raw, ""+2.50e+03"") | EXPECT_DOUBLE_EQ(second.magnitude, 2500.0) | EXPECT_EQ(second.data_ordinal, 1U) | EXPECT_EQ(second.load_ordinal, 1U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords; assertion 3개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords 유지 원문 검사 body 및 assertion 동일. 42e89d7898679456d451df49a6eec0e9e98cc775ba616c469f3ad6c9839f3a6b 42e89d7898679456d451df49a6eec0e9e98cc775ba616c469f3ad6c9839f3a6b ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_label, 10) | EXPECT_DOUBLE_EQ(domain.Steps()[0U].SurfacePressureLoads()[0].magnitude, 1.0) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_label, 10) | EXPECT_DOUBLE_EQ(domain.Steps()[0U].SurfacePressureLoads()[0].magnitude, 1.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain; assertion 4개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain 유지 원문 검사 body 및 assertion 동일. 83c413cc8fb859ea110ee4895701e8637ebd25d495ccc13f88c4d67032a8394e 83c413cc8fb859ea110ee4895701e8637ebd25d495ccc13f88c4d67032a8394e ASSERT_TRUE(mapped.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_EQ(&model.Value().ActiveSurfacePressureLoads(), &mapped.Value().Steps()[0U].SurfacePressureLoads()) | EXPECT_EQ(model.Value().ActiveSurfacePressureLoads().size(), 1U) ASSERT_TRUE(mapped.HasValue()) | ASSERT_TRUE(model.HasValue()) | EXPECT_EQ(&model.Value().ActiveSurfacePressureLoads(), &mapped.Value().Steps()[0U].SurfacePressureLoads()) | EXPECT_EQ(model.Value().ActiveSurfacePressureLoads().size(), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation; assertion 6개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation 유지 원문 검사 body 및 assertion 동일. 87b289b662f1e0f3698f77b333ddd4ccbf28081d4ecfdb62b8baedc1c663909b 87b289b662f1e0f3698f77b333ddd4ccbf28081d4ecfdb62b8baedc1c663909b "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].magnitude_raw, ""+0"") | EXPECT_DOUBLE_EQ(loads[0].magnitude, 0.0) | EXPECT_EQ(loads[1].magnitude_raw, ""-1.25E-3"") | EXPECT_DOUBLE_EQ(loads[1].magnitude, -0.00125)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].magnitude_raw, ""+0"") | EXPECT_DOUBLE_EQ(loads[0].magnitude, 0.0) | EXPECT_EQ(loads[1].magnitude_raw, ""-1.25E-3"") | EXPECT_DOUBLE_EQ(loads[1].magnitude, -0.00125)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation; assertion 10개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation 유지 원문 검사 body 및 assertion 동일. 1ce5f567f199255b591700b92f8ecc0c9f9484c5315310cc34228f91d1b5f7e3 1ce5f567f199255b591700b92f8ecc0c9f9484c5315310cc34228f91d1b5f7e3 "ASSERT_FALSE(non_ascii.HasValue()) | ASSERT_EQ(non_ascii.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().code, ""invalid-input-character"") | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().location.line, 2U) | ASSERT_FALSE(overlength.HasValue()) | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().code, ""input-line-too-long"") | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().location.line, 1U) | ASSERT_FALSE(continuation.HasValue()) | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().code, ""malformed-keyword"") | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().location.line, 2U)" "ASSERT_FALSE(non_ascii.HasValue()) | ASSERT_EQ(non_ascii.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().code, ""invalid-input-character"") | EXPECT_EQ(non_ascii.GetStatus().Diagnostics().front().location.line, 2U) | ASSERT_FALSE(overlength.HasValue()) | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().code, ""input-line-too-long"") | EXPECT_EQ(overlength.GetStatus().Diagnostics().front().location.line, 1U) | ASSERT_FALSE(continuation.HasValue()) | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().code, ""malformed-keyword"") | EXPECT_EQ(continuation.GetStatus().Diagnostics().front().location.line, 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds 유지 원문 검사 body 및 assertion 동일. 68c16419be0faeb3e5c631b0e2c4d1e86e40ed448590aec8a56567e36f406ea7 68c16419be0faeb3e5c631b0e2c4d1e86e40ed448590aec8a56567e36f406ea7 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality 유지 원문 검사 body 및 assertion 동일. ce9916ba710c77e4eb855936e4e9b09baaa2f5362abb02621d469075a5c06faa ce9916ba710c77e4eb855936e4e9b09baaa2f5362abb02621d469075a5c06faa 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets 유지 원문 검사 body 및 assertion 동일. b989869b46405f081a67b42c2ac227713272b84c67b79337276cef65ce359cf4 b989869b46405f081a67b42c2ac227713272b84c67b79337276cef65ce359cf4 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets 유지 원문 검사 body 및 assertion 동일. 569ad93130ac52b9b57b42010b2150591c9f0125fb21d8c2469cc515e6917db5 569ad93130ac52b9b57b42010b2150591c9f0125fb21d8c2469cc515e6917db5 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning; assertion 8개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning 유지 원문 검사 body 및 assertion 동일. 6236b7eb61a4fd35e83e7ae25ddc5570a7cebd6db3eb16bf99f95c45470a5c72 6236b7eb61a4fd35e83e7ae25ddc5570a7cebd6db3eb16bf99f95c45470a5c72 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(OnlySurface(result.Value()).facets.size(), 1U) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(warning.code, ""duplicate-surface-member-normalized"") | EXPECT_EQ(warning.location.line, 29U) | EXPECT_EQ(warning.keyword, ""SURFACE"") | EXPECT_EQ(warning.entity_identity, ""Pressure-Surface"")" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(OnlySurface(result.Value()).facets.size(), 1U) | ASSERT_EQ(result.Value().Warnings().size(), 1U) | EXPECT_EQ(warning.severity, fesa::Severity::kWarning) | EXPECT_EQ(warning.code, ""duplicate-surface-member-normalized"") | EXPECT_EQ(warning.location.line, 29U) | EXPECT_EQ(warning.keyword, ""SURFACE"") | EXPECT_EQ(warning.entity_identity, ""Pressure-Surface"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsConflictingSidesForOneElement ShellSurfacePressureInput.RejectsConflictingSidesForOneElement; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsConflictingSidesForOneElement 유지 원문 검사 body 및 assertion 동일. 315b661ced70d8d24863f470071109e53670f8da16a0b9bd3b967f8323ba5bea 315b661ced70d8d24863f470071109e53670f8da16a0b9bd3b967f8323ba5bea 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes; assertion 0개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes 유지 원문 검사 body 및 assertion 동일. c59f0842555c4f634f8e5b90784578f9266a27d716f16648d27acb9709bee548 c59f0842555c4f634f8e5b90784578f9266a27d716f16648d27acb9709bee548 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication; assertion 7개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication 유지 원문 검사 body 및 assertion 동일. bf188f0db4fa94c007143db4457732b390ea10be44a09c4ac30e0498c4d7e2cf bf188f0db4fa94c007143db4457732b390ea10be44a09c4ac30e0498c4d7e2cf ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].load_ordinal, 0U) | EXPECT_EQ(loads[1].load_ordinal, 1U) | EXPECT_EQ(loads[0].data_ordinal, 0U) | EXPECT_EQ(loads[1].data_ordinal, 1U) | EXPECT_DOUBLE_EQ(loads[0].magnitude, loads[1].magnitude) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0].load_ordinal, 0U) | EXPECT_EQ(loads[1].load_ordinal, 1U) | EXPECT_EQ(loads[0].data_ordinal, 0U) | EXPECT_EQ(loads[1].data_ordinal, 1U) | EXPECT_DOUBLE_EQ(loads[0].magnitude, loads[1].magnitude) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate; assertion 2개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate 유지 원문 검사 body 및 assertion 동일. 003fd75844ef98765cfaa6d972a17143273fdfee97b19ba5f6e778352bd86bf6 003fd75844ef98765cfaa6d972a17143273fdfee97b19ba5f6e778352bd86bf6 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""conflicting-surface-membership"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics().front().code, ""conflicting-surface-membership"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns; assertion 11개 tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns 유지 원문 검사 body 및 assertion 동일. 7544df73d8202a307316ba7ec6a6f786d8eb7c4b585beceb4280997ebf5c5c8f 7544df73d8202a307316ba7ec6a6f786d8eb7c4b585beceb4280997ebf5c5c8f ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_EQ(first.Value().Warnings().size(), 1U) | ASSERT_EQ(second.Value().Warnings().size(), 1U) | EXPECT_EQ(left.severity, right.severity) | EXPECT_EQ(left.code, right.code) | EXPECT_EQ(left.location.file, right.location.file) | EXPECT_EQ(left.location.line, right.location.line) | EXPECT_EQ(left.keyword, right.keyword) | EXPECT_EQ(left.entity_identity, right.entity_identity) | EXPECT_EQ(left.message, right.message) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) | ASSERT_EQ(first.Value().Warnings().size(), 1U) | ASSERT_EQ(second.Value().Warnings().size(), 1U) | EXPECT_EQ(left.severity, right.severity) | EXPECT_EQ(left.code, right.code) | EXPECT_EQ(left.location.file, right.location.file) | EXPECT_EQ(left.location.line, right.location.line) | EXPECT_EQ(left.keyword, right.keyword) | EXPECT_EQ(left.entity_identity, right.entity_identity) | EXPECT_EQ(left.message, right.message) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp support@1-126 helper/oracle/fixture/include/static assertion 구간: TemporaryInputFile, if, MapText, ReadText, ReplaceOnce, ExpectSingleFailure, ShellDeck, OnlySurface tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d01dd887a99bccd610d4db4c59f83a92cdc73f44a8d962cd5349c44d36562723 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 32개 tests/unit/io/abaqus/thermal_domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. efd4b1c00fa1db1fa4fe9ccd369c34f9bea4cc2665b5c00972792a0fd66d9483 efd4b1c00fa1db1fa4fe9ccd369c34f9bea4cc2665b5c00972792a0fd66d9483 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsDs4MaterialsTargetsAndAdditiveFluxes ThermalDomainMapping.MapsDs4MaterialsTargetsAndAdditiveFluxes; assertion 12개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsDs4MaterialsTargetsAndAdditiveFluxes 유지 원문 검사 body 및 assertion 동일. af2d22c04e46f6dd711a20088fbc473854263068c67a74e8f27049e4026c2a22 af2d22c04e46f6dd711a20088fbc473854263068c67a74e8f27049e4026c2a22 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.ThermalMaterials()[0U].Conductivity(), 54.0) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->maximum_increments, 100U) | EXPECT_EQ(domain.ThermalModelBoundaries().size(), 2U) | EXPECT_EQ(domain.ThermalStep()->Boundaries().size(), 2U) | ASSERT_EQ(domain.ThermalStep()->Loads().size(), 4U) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[0U].power, -2.0) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[3U].power, -3.0)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.ThermalMaterials()[0U].Conductivity(), 54.0) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->maximum_increments, 100U) | EXPECT_EQ(domain.ThermalModelBoundaries().size(), 2U) | EXPECT_EQ(domain.ThermalStep()->Boundaries().size(), 2U) | ASSERT_EQ(domain.ThermalStep()->Loads().size(), 4U) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[0U].power, -2.0) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Loads()[3U].power, -3.0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInteriorAndConflictingThermalBoundaries ThermalDomainMapping.RejectsInteriorAndConflictingThermalBoundaries; assertion 4개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInteriorAndConflictingThermalBoundaries 유지 원문 검사 body 및 assertion 동일. 7ec98df39941a00678cd5ef92a12a7f68a90cda117bae9baef2a0684c5f96b7d 7ec98df39941a00678cd5ef92a12a7f68a90cda117bae9baef2a0684c5f96b7d "ASSERT_FALSE(invalid_dof.HasValue()) | EXPECT_EQ(invalid_dof.GetStatus().Diagnostics()[0U].code, ""invalid-dof"") | ASSERT_FALSE(invalid_conflict.HasValue()) | EXPECT_EQ(invalid_conflict.GetStatus().Diagnostics()[0U].code, ""conflicting-boundary-condition"")" "ASSERT_FALSE(invalid_dof.HasValue()) | EXPECT_EQ(invalid_dof.GetStatus().Diagnostics()[0U].code, ""invalid-dof"") | ASSERT_FALSE(invalid_conflict.HasValue()) | EXPECT_EQ(invalid_conflict.GetStatus().Diagnostics()[0U].code, ""conflicting-boundary-condition"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AcceptsSectionPointSpellingsAndRejectsUnsupportedForms ThermalDomainMapping.AcceptsSectionPointSpellingsAndRejectsUnsupportedForms; assertion 1개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AcceptsSectionPointSpellingsAndRejectsUnsupportedForms 유지 원문 검사 body 및 assertion 동일. 0246d651e3e2c547182aa0793b1ede7ebad37bb947330710f83c05bc1899a641 0246d651e3e2c547182aa0793b1ede7ebad37bb947330710f83c05bc1899a641 EXPECT_EQ(MapText(deck).HasValue(), test_case.second) EXPECT_EQ(MapText(deck).HasValue(), test_case.second) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalMaterialAndControlForms ThermalDomainMapping.RejectsThermalMaterialAndControlForms; assertion 2개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalMaterialAndControlForms 유지 원문 검사 body 및 assertion 동일. aa52baa4e9489c8924eccd069573c18e9d91f3432343b409fd2e822e1c24177b aa52baa4e9489c8924eccd069573c18e9d91f3432343b409fd2e822e1c24177b ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalNoOpAndProcedureViolations ThermalDomainMapping.RejectsThermalNoOpAndProcedureViolations; assertion 2개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsThermalNoOpAndProcedureViolations 유지 원문 검사 body 및 assertion 동일. 40e1583ca082fe70743b2bc1583336dfe4284fe520aa4d00ddaf5a2297c8df91 40e1583ca082fe70743b2bc1583336dfe4284fe520aa4d00ddaf5a2297c8df91 ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) ASSERT_NE(position, std::string::npos) | EXPECT_FALSE(MapText(deck).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AppliesSameDofStepOverrideAndDefaultValues ThermalDomainMapping.AppliesSameDofStepOverrideAndDefaultValues; assertion 5개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.AppliesSameDofStepOverrideAndDefaultValues 유지 원문 검사 body 및 assertion 동일. 5277085c94aa63d3671618cea4d01e147843cb61b11bcdd8ea01ced3610db2e3 5277085c94aa63d3671618cea4d01e147843cb61b11bcdd8ea01ced3610db2e3 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().ThermalModelBoundaries().size(), 2U) | ASSERT_EQ(result.Value().ThermalStep()->Boundaries().size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().ThermalModelBoundaries()[0U].value, 0.0) | EXPECT_DOUBLE_EQ(result.Value().ThermalStep()->Boundaries()[0U].value, 30.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().ThermalModelBoundaries().size(), 2U) | ASSERT_EQ(result.Value().ThermalStep()->Boundaries().size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().ThermalModelBoundaries()[0U].value, 0.0) | EXPECT_DOUBLE_EQ(result.Value().ThermalStep()->Boundaries()[0U].value, 30.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsApprovedShellThermalReference ThermalDomainMapping.MapsApprovedShellThermalReference; assertion 43개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MapsApprovedShellThermalReference 유지 원문 검사 body 및 assertion 동일. 55cab422db4e1520d96658c9b35707efad8d2f61960a1a9c91f2696e239f596f 55cab422db4e1520d96658c9b35707efad8d2f61960a1a9c91f2696e239f596f "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 729U) | ASSERT_EQ(domain.ThermalElements().Size(), 676U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(step.name, ""Step-1"") | EXPECT_EQ(step.maximum_increments, 100000U) | EXPECT_EQ(step.nominal_increment, 1.) | EXPECT_EQ(step.time_period, 100.) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 100U) | EXPECT_EQ(grid.Value().Time(37U), 37.) | EXPECT_EQ(domain.ThermalMaterials()[0].Name(), ""Material-1"") | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), 54.) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), 7850.) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), 460.) | EXPECT_EQ(domain.ThermalSections()[0].name, ""Set-1"") | EXPECT_EQ(domain.ThermalSections()[0].thickness, .5) | EXPECT_EQ(domain.ThermalSections()[0].location.file, path) | EXPECT_EQ(domain.ThermalSections()[0].location.line, 1421U) | EXPECT_EQ(domain.Nodes()[i].source_id.instance_name, ""Part-1-1"") | EXPECT_EQ(domain.Nodes()[i].source_id.source_label, static_cast(i + 1U)) | EXPECT_EQ(domain.ThermalElements()[i].SourceId().instance_name, ""Part-1-1"") | EXPECT_EQ(domain.ThermalElements()[i].SourceId().source_label, static_cast(i + 1U)) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), expected_boundary_labels.size()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), step.Boundaries().size()) | EXPECT_EQ(model_bc.node_index, step_bc.node_index) | EXPECT_EQ(domain.Nodes()[model_bc.node_index].source_id.source_label, expected_boundary_labels[i]) | EXPECT_EQ(model_bc.dof, 11) | EXPECT_EQ(step_bc.dof, 11) | EXPECT_EQ(model_bc.value, 0.) | EXPECT_EQ(step_bc.value, 1000.) | EXPECT_EQ(model_bc.location.file, path) | EXPECT_LT(model_bc.location.line, step_bc.location.line) | ASSERT_EQ(domain.ElementSurfaces().size(), 1U) | ASSERT_EQ(domain.ElementSurfaces()[0].facets.size(), 169U) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.front().source_element_label, 170) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.back().source_element_label, 338) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_type, ""DS4"") | ASSERT_EQ(domain.Warnings().size(), 6U) | EXPECT_EQ(std::count_if(domain.Warnings().begin(), domain.Warnings().end(), [&](const auto& warning) { return warning.location.file == path && warning.location.line == block.location.line && warning.keyword == block.canonical_name; }), 1)" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 729U) | ASSERT_EQ(domain.ThermalElements().Size(), 676U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 1U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(step.name, ""Step-1"") | EXPECT_EQ(step.maximum_increments, 100000U) | EXPECT_EQ(step.nominal_increment, 1.) | EXPECT_EQ(step.time_period, 100.) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), 100U) | EXPECT_EQ(grid.Value().Time(37U), 37.) | EXPECT_EQ(domain.ThermalMaterials()[0].Name(), ""Material-1"") | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), 54.) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), 7850.) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), 460.) | EXPECT_EQ(domain.ThermalSections()[0].name, ""Set-1"") | EXPECT_EQ(domain.ThermalSections()[0].thickness, .5) | EXPECT_EQ(domain.ThermalSections()[0].location.file, path) | EXPECT_EQ(domain.ThermalSections()[0].location.line, 1421U) | EXPECT_EQ(domain.Nodes()[i].source_id.instance_name, ""Part-1-1"") | EXPECT_EQ(domain.Nodes()[i].source_id.source_label, static_cast(i + 1U)) | EXPECT_EQ(domain.ThermalElements()[i].SourceId().instance_name, ""Part-1-1"") | EXPECT_EQ(domain.ThermalElements()[i].SourceId().source_label, static_cast(i + 1U)) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), expected_boundary_labels.size()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), step.Boundaries().size()) | EXPECT_EQ(model_bc.node_index, step_bc.node_index) | EXPECT_EQ(domain.Nodes()[model_bc.node_index].source_id.source_label, expected_boundary_labels[i]) | EXPECT_EQ(model_bc.dof, 11) | EXPECT_EQ(step_bc.dof, 11) | EXPECT_EQ(model_bc.value, 0.) | EXPECT_EQ(step_bc.value, 1000.) | EXPECT_EQ(model_bc.location.file, path) | EXPECT_LT(model_bc.location.line, step_bc.location.line) | ASSERT_EQ(domain.ElementSurfaces().size(), 1U) | ASSERT_EQ(domain.ElementSurfaces()[0].facets.size(), 169U) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.front().source_element_label, 170) | EXPECT_EQ(domain.ElementSurfaces()[0].facets.back().source_element_label, 338) | EXPECT_EQ(domain.ElementSurfaces()[0].facets[0].source_element_type, ""DS4"") | ASSERT_EQ(domain.Warnings().size(), 6U) | EXPECT_EQ(std::count_if(domain.Warnings().begin(), domain.Warnings().end(), [&](const auto& warning) { return warning.location.file == path && warning.location.line == block.location.line && warning.keyword == block.canonical_name; }), 1)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.StrictOutputAndRestartNoOps ThermalDomainMapping.StrictOutputAndRestartNoOps; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.StrictOutputAndRestartNoOps 유지 원문 검사 body 및 assertion 동일. 51e37954cc1bd09a41977f48f6977a1889e509d285ae1bde007e30b5345078ef 51e37954cc1bd09a41977f48f6977a1889e509d285ae1bde007e30b5345078ef 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.EveryAcceptedNoOpHasExactlyOneSourceWarning ThermalDomainMapping.EveryAcceptedNoOpHasExactlyOneSourceWarning; assertion 5개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.EveryAcceptedNoOpHasExactlyOneSourceWarning 유지 원문 검사 body 및 assertion 동일. f320f56a6a51fb244decaea008d505f0b1b7d96d0ed1c36dc537572256e87b74 f320f56a6a51fb244decaea008d505f0b1b7d96d0ed1c36dc537572256e87b74 ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(warnings.size(), blocks.size()) | EXPECT_EQ(std::count_if(warnings.begin(), warnings.end(), [&](const auto& w) { return w.severity == fesa::Severity::kWarning && w.keyword == block.second && w.location.file == input.Path() && w.location.line == line; }), 1) | EXPECT_DOUBLE_EQ( result.Value().ThermalInitialConditions()[0].station_values[0], 20.) ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(warnings.size(), blocks.size()) | EXPECT_EQ(std::count_if(warnings.begin(), warnings.end(), [&](const auto& w) { return w.severity == fesa::Severity::kWarning && w.keyword == block.second && w.location.file == input.Path() && w.location.line == line; }), 1) | EXPECT_DOUBLE_EQ( result.Value().ThermalInitialConditions()[0].station_values[0], 20.) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SurfaceFacetsAreResolvedAndPreserved ThermalDomainMapping.SurfaceFacetsAreResolvedAndPreserved; assertion 11개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SurfaceFacetsAreResolvedAndPreserved 유지 원문 검사 body 및 assertion 동일. 1e33822a025e5c4a4e36a221f6e21dd2e83b6223c22d01f0f2bf0e2e4a150638 1e33822a025e5c4a4e36a221f6e21dd2e83b6223c22d01f0f2bf0e2e4a150638 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surfaces.size(), 2U) | ASSERT_EQ(surfaces[i].facets.size(), 1U) | EXPECT_EQ(facet.element_index, 0U) | EXPECT_EQ(facet.source_element_label, 1) | EXPECT_EQ(facet.instance_name_raw, ""I"") | EXPECT_EQ(facet.part_name_raw, ""P"") | EXPECT_EQ(facet.source_element_type, ""DS4"") | EXPECT_EQ(facet.side, side == ""SPOS"" ? fesa::ShellSurfaceSide::kSpos : fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(facet.member_kind, i == 0U ? fesa::SurfaceMemberKind::kDirect : fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.first_member_location.line, LineOf(deck, (i == 0U ? ""I.1, "" : ""Faces, "") + side))" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(surfaces.size(), 2U) | ASSERT_EQ(surfaces[i].facets.size(), 1U) | EXPECT_EQ(facet.element_index, 0U) | EXPECT_EQ(facet.source_element_label, 1) | EXPECT_EQ(facet.instance_name_raw, ""I"") | EXPECT_EQ(facet.part_name_raw, ""P"") | EXPECT_EQ(facet.source_element_type, ""DS4"") | EXPECT_EQ(facet.side, side == ""SPOS"" ? fesa::ShellSurfaceSide::kSpos : fesa::ShellSurfaceSide::kSneg) | EXPECT_EQ(facet.member_kind, i == 0U ? fesa::SurfaceMemberKind::kDirect : fesa::SurfaceMemberKind::kElset) | EXPECT_EQ(facet.first_member_location.line, LineOf(deck, (i == 0U ? ""I.1, "" : ""Faces, "") + side))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsUnresolvedOrInvalidSurfaces ThermalDomainMapping.RejectsUnresolvedOrInvalidSurfaces; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsUnresolvedOrInvalidSurfaces 유지 원문 검사 body 및 assertion 동일. 678d79744318544126a5fab47e194fbb985efe58934d0728ef55b20156e7d91f 678d79744318544126a5fab47e194fbb985efe58934d0728ef55b20156e7d91f 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.PreprintAndPhysicalConstantsAreStrictAndSourceAware ThermalDomainMapping.PreprintAndPhysicalConstantsAreStrictAndSourceAware; assertion 3개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.PreprintAndPhysicalConstantsAreStrictAndSourceAware 유지 원문 검사 body 및 assertion 동일. 3b12f2919d0a6fdfa013a4ac38dbdce85622c99ad095e6f1f4c74ccef9eec6d2 3b12f2919d0a6fdfa013a4ac38dbdce85622c99ad095e6f1f4c74ccef9eec6d2 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""PHYSICAL CONSTANTS"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 1U)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""PHYSICAL CONSTANTS"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 1U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsChildOutputUnknownAndWrongNoOpScopes ThermalDomainMapping.RejectsChildOutputUnknownAndWrongNoOpScopes; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsChildOutputUnknownAndWrongNoOpScopes 유지 원문 검사 body 및 assertion 동일. 6b5c15e74febb98d3db79f8aef581dd44e658c4aa04714443914a23d5cba6117 6b5c15e74febb98d3db79f8aef581dd44e658c4aa04714443914a23d5cba6117 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MaterialConstantsAndSectionLinksAreStrict ThermalDomainMapping.MaterialConstantsAndSectionLinksAreStrict; assertion 1개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.MaterialConstantsAndSectionLinksAreStrict 유지 원문 검사 body 및 assertion 동일. f4ccfe76b71133eea01edf7824c2b21d6e5d49bdad620c5d3f7bcc205c7d532f f4ccfe76b71133eea01edf7824c2b21d6e5d49bdad620c5d3f7bcc205c7d532f ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InitialTemperatureDefaultsAndOverlaps ThermalDomainMapping.InitialTemperatureDefaultsAndOverlaps; assertion 4개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InitialTemperatureDefaultsAndOverlaps 유지 원문 검사 body 및 assertion 동일. cff5684ec434d19c1c53df0be1764dad47e45d50bd4df30c490fb263894fbd0c cff5684ec434d19c1c53df0be1764dad47e45d50bd4df30c490fb263894fbd0c ASSERT_TRUE(unspecified.HasValue()) | EXPECT_TRUE(unspecified.Value().ThermalInitialConditions().empty()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(temperature, 20.) ASSERT_TRUE(unspecified.HasValue()) | EXPECT_TRUE(unspecified.Value().ThermalInitialConditions().empty()) | ASSERT_TRUE(result.HasValue()) | EXPECT_DOUBLE_EQ(temperature, 20.) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InactiveTargetsFailWithOriginalKeywordAndIdentity ThermalDomainMapping.InactiveTargetsFailWithOriginalKeywordAndIdentity; assertion 8개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InactiveTargetsFailWithOriginalKeywordAndIdentity 유지 원문 검사 body 및 assertion 동일. 83f7f07fbb31e1317402934ace845532b895851b979987760d55f5d4cd771562 83f7f07fbb31e1317402934ace845532b895851b979987760d55f5d4cd771562 "ASSERT_TRUE(accepted.HasValue()) | EXPECT_EQ(accepted.Value().Nodes().size(), 5U) | ASSERT_TRUE(view.HasValue()) | EXPECT_EQ(view.Value().ActiveThermalNodes().size(), 4U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.entity_identity, ""99"") | EXPECT_EQ(diagnostic.location.line, LineOf(deck, replacement.second)) | EXPECT_NE(diagnostic.keyword, ""THERMAL"")" "ASSERT_TRUE(accepted.HasValue()) | EXPECT_EQ(accepted.Value().Nodes().size(), 5U) | ASSERT_TRUE(view.HasValue()) | EXPECT_EQ(view.Value().ActiveThermalNodes().size(), 4U) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.entity_identity, ""99"") | EXPECT_EQ(diagnostic.location.line, LineOf(deck, replacement.second)) | EXPECT_NE(diagnostic.keyword, ""THERMAL"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ModelBoundaryInheritanceAndStepOverrideReachDofManager ThermalDomainMapping.ModelBoundaryInheritanceAndStepOverrideReachDofManager; assertion 9개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ModelBoundaryInheritanceAndStepOverrideReachDofManager 유지 원문 검사 body 및 assertion 동일. f7561b77de2a4c22260774a6681cea57b317458be3d0c6d27ebe1722d41297c0 f7561b77de2a4c22260774a6681cea57b317458be3d0c6d27ebe1722d41297c0 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), 4U) | ASSERT_EQ(domain.ThermalStep()->Boundaries().size(), 3U) | EXPECT_DOUBLE_EQ(domain.ThermalModelBoundaries()[0].value, 7.) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Boundaries()[0].value, -30.) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), expected_dofs) | EXPECT_DOUBLE_EQ(dofs.Value().PrescribedValues()[i], expected_values[i]) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalModelBoundaries().size(), 4U) | ASSERT_EQ(domain.ThermalStep()->Boundaries().size(), 3U) | EXPECT_DOUBLE_EQ(domain.ThermalModelBoundaries()[0].value, 7.) | EXPECT_DOUBLE_EQ(domain.ThermalStep()->Boundaries()[0].value, -30.) | ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | EXPECT_EQ(dofs.Value().ConstrainedDofs(), expected_dofs) | EXPECT_DOUBLE_EQ(dofs.Value().PrescribedValues()[i], expected_values[i]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.BoundariesRejectConflictsAndUnsupportedRowsAtBothLevels ThermalDomainMapping.BoundariesRejectConflictsAndUnsupportedRowsAtBothLevels; assertion 1개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.BoundariesRejectConflictsAndUnsupportedRowsAtBothLevels 유지 원문 검사 body 및 assertion 동일. a8f827d53efc01de6f80689eaf293ddb96b5915e6b4ab8bcc73c1c1035a09da3 a8f827d53efc01de6f80689eaf293ddb96b5915e6b4ab8bcc73c1c1035a09da3 EXPECT_TRUE( MapText(Replace(ThermalDeck(), original, original + equal)).HasValue()) EXPECT_TRUE( MapText(Replace(ThermalDeck(), original, original + equal)).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SignedFluxRetainsRowOrderDuplicatesAndConstrainedTargets ThermalDomainMapping.SignedFluxRetainsRowOrderDuplicatesAndConstrainedTargets; assertion 8개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.SignedFluxRetainsRowOrderDuplicatesAndConstrainedTargets 유지 원문 검사 body 및 assertion 동일. 67fcb68684488e6a52db58d6d9d5968ea92bbe01cc27a8d2a942a3f41444bec9 67fcb68684488e6a52db58d6d9d5968ea92bbe01cc27a8d2a942a3f41444bec9 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 5U) | EXPECT_EQ(loads[i].node_index, nodes[i]) | EXPECT_EQ(loads[i].dof, dofs[i]) | EXPECT_DOUBLE_EQ(loads[i].power, powers[i]) | EXPECT_EQ(loads[i].source_order, i) | EXPECT_EQ(loads[1].location.line, loads[2].location.line) | EXPECT_LT(loads[3].location.line, loads[4].location.line) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 5U) | EXPECT_EQ(loads[i].node_index, nodes[i]) | EXPECT_EQ(loads[i].dof, dofs[i]) | EXPECT_DOUBLE_EQ(loads[i].power, powers[i]) | EXPECT_EQ(loads[i].source_order, i) | EXPECT_EQ(loads[1].location.line, loads[2].location.line) | EXPECT_LT(loads[3].location.line, loads[4].location.line) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FluxRejectsOptionsRowsAndWrongScopes ThermalDomainMapping.FluxRejectsOptionsRowsAndWrongScopes; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FluxRejectsOptionsRowsAndWrongScopes 유지 원문 검사 body 및 assertion 동일. 81d3c024c63600240315286bb6e27e326334e1e331df08d355ae3a621a691140 81d3c024c63600240315286bb6e27e326334e1e331df08d355ae3a621a691140 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.TimeControlsUseSharedGridIncludingInputCellBoundaries ThermalDomainMapping.TimeControlsUseSharedGridIncludingInputCellBoundaries; assertion 12개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.TimeControlsUseSharedGridIncludingInputCellBoundaries 유지 원문 검사 body 및 assertion 동일. ef1ee468ae9c492f40c424c0c3deb777f280c6bb9adc1c2fff05a8f58203abb9 ef1ee468ae9c492f40c424c0c3deb777f280c6bb9adc1c2fff05a8f58203abb9 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(step.nominal_increment, item.increment) | EXPECT_EQ(step.time_period, item.period) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), item.count) | EXPECT_DOUBLE_EQ(grid.Value().Time(item.count), item.period) | EXPECT_EQ(grid.Value().Delta(item.count), item.last) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().ThermalStep()->maximum_increments, 4294967295U) | ASSERT_TRUE(defaults.HasValue()) | EXPECT_EQ(defaults.Value().ThermalStep()->maximum_increments, 100U) | EXPECT_TRUE(MapText(deck).HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(step.nominal_increment, item.increment) | EXPECT_EQ(step.time_period, item.period) | ASSERT_TRUE(grid.HasValue()) | EXPECT_EQ(grid.Value().Count(), item.count) | EXPECT_DOUBLE_EQ(grid.Value().Time(item.count), item.period) | EXPECT_EQ(grid.Value().Delta(item.count), item.last) | ASSERT_TRUE(upper.HasValue()) | EXPECT_EQ(upper.Value().ThermalStep()->maximum_increments, 4294967295U) | ASSERT_TRUE(defaults.HasValue()) | EXPECT_EQ(defaults.Value().ThermalStep()->maximum_increments, 100U) | EXPECT_TRUE(MapText(deck).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInvalidTimeAndMixedProceduresInEitherOrder ThermalDomainMapping.RejectsInvalidTimeAndMixedProceduresInEitherOrder; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsInvalidTimeAndMixedProceduresInEitherOrder 유지 원문 검사 body 및 assertion 동일. 5b1320ef7da28a420e69f4a16c2ee726c95f57abeeb08cb2f1b5442cead6914c 5b1320ef7da28a420e69f4a16c2ee726c95f57abeeb08cb2f1b5442cead6914c 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalMaterialAndSourceProvenanceArePreserved ThermalDomainMapping.ThermalMaterialAndSourceProvenanceArePreserved; assertion 20개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalMaterialAndSourceProvenanceArePreserved 유지 원문 검사 body 및 assertion 동일. a83d5e4753e50f897bd60b99b3825dd7ac3d14d1af14ed384a814d45662478b6 a83d5e4753e50f897bd60b99b3825dd7ac3d14d1af14ed384a814d45662478b6 "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | EXPECT_EQ(section.material_index, 1U) | EXPECT_EQ(section.name, ""E"") | EXPECT_EQ(section.source_id.source_label_text, ""E"") | EXPECT_EQ(section.location.file, input.Path()) | EXPECT_EQ(section.location.line, LineOf(deck, ""*Shell Section"")) | EXPECT_DOUBLE_EQ(section.thickness, .5) | EXPECT_EQ(material.Name(), ""M"") | EXPECT_DOUBLE_EQ(material.Conductivity(), 54.) | EXPECT_DOUBLE_EQ(material.Density(), 7850.) | EXPECT_DOUBLE_EQ(material.SpecificHeat(), 460.) | EXPECT_EQ(material.Location().line, LineOf(deck, ""*Material, name=M"")) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().instance_name, ""I"") | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 1) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->location.file, input.Path()) | EXPECT_EQ(domain.ThermalStep()->location.line, LineOf(deck, ""*Step""))" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | ASSERT_EQ(domain.ThermalSections().size(), 1U) | EXPECT_EQ(section.material_index, 1U) | EXPECT_EQ(section.name, ""E"") | EXPECT_EQ(section.source_id.source_label_text, ""E"") | EXPECT_EQ(section.location.file, input.Path()) | EXPECT_EQ(section.location.line, LineOf(deck, ""*Shell Section"")) | EXPECT_DOUBLE_EQ(section.thickness, .5) | EXPECT_EQ(material.Name(), ""M"") | EXPECT_DOUBLE_EQ(material.Conductivity(), 54.) | EXPECT_DOUBLE_EQ(material.Density(), 7850.) | EXPECT_DOUBLE_EQ(material.SpecificHeat(), 460.) | EXPECT_EQ(material.Location().line, LineOf(deck, ""*Material, name=M"")) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().instance_name, ""I"") | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 1) | EXPECT_EQ(domain.ThermalStep()->name, ""Heat"") | EXPECT_EQ(domain.ThermalStep()->location.file, input.Path()) | EXPECT_EQ(domain.ThermalStep()->location.line, LineOf(deck, ""*Step""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FiniteThermalScalarsPreserveSubnormalAndSignedValues ThermalDomainMapping.FiniteThermalScalarsPreserveSubnormalAndSignedValues; assertion 9개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.FiniteThermalScalarsPreserveSubnormalAndSignedValues 유지 원문 검사 body 및 assertion 동일. 3a8d71661b54b80493cecf844c9354c0030c40b2616bd05a29aa13346381261d 3a8d71661b54b80493cecf844c9354c0030c40b2616bd05a29aa13346381261d ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), tiny) | EXPECT_EQ(domain.ThermalSections()[0].thickness, tiny) | EXPECT_EQ(domain.ThermalInitialConditions()[0].station_values[4], -tiny) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0].value, -tiny) | EXPECT_EQ(domain.ThermalStep()->Loads()[0].power, -tiny) | ASSERT_TRUE(result.HasValue()) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.ThermalMaterials()[0].Conductivity(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].Density(), tiny) | EXPECT_EQ(domain.ThermalMaterials()[0].SpecificHeat(), tiny) | EXPECT_EQ(domain.ThermalSections()[0].thickness, tiny) | EXPECT_EQ(domain.ThermalInitialConditions()[0].station_values[4], -tiny) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0].value, -tiny) | EXPECT_EQ(domain.ThermalStep()->Loads()[0].power, -tiny) | ASSERT_TRUE(result.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalSetAndSurfaceDuplicatesExpandOnce ThermalDomainMapping.ThermalSetAndSurfaceDuplicatesExpandOnce; assertion 5개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.ThermalSetAndSurfaceDuplicatesExpandOnce 유지 원문 검사 body 및 assertion 동일. 70f6a3c60352f7322e1271a4458f03823deec7ac49e85cd7ff385d20de9f3c30 70f6a3c60352f7322e1271a4458f03823deec7ac49e85cd7ff385d20de9f3c30 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalElements().Size(), 1U) | ASSERT_EQ(result.Value().ElementSurfaces().size(), 1U) | EXPECT_EQ(result.Value().ElementSurfaces()[0].facets.size(), 1U) | EXPECT_EQ(result.Value().Warnings().size(), 1U) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalElements().Size(), 1U) | ASSERT_EQ(result.Value().ElementSurfaces().size(), 1U) | EXPECT_EQ(result.Value().ElementSurfaces()[0].facets.size(), 1U) | EXPECT_EQ(result.Value().Warnings().size(), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.DeferredFailuresRetainExactInputLocationAndIdentity ThermalDomainMapping.DeferredFailuresRetainExactInputLocationAndIdentity; assertion 9개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.DeferredFailuresRetainExactInputLocationAndIdentity 유지 원문 검사 body 및 assertion 동일. 01f444fd4378662acd9566174387017dd3939056ee5ec7901884183c67c6900a 01f444fd4378662acd9566174387017dd3939056ee5ec7901884183c67c6900a "ASSERT_TRUE(parsed.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.location.file, input.Path()) | EXPECT_EQ(diagnostic.location.line, LineOf(deck, ""1., 100."")) | EXPECT_EQ(diagnostic.keyword, ""HEAT TRANSFER"") | EXPECT_EQ(diagnostic.entity_identity, ""Heat"") | ASSERT_FALSE(missing_contact.HasValue()) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].location.line, 1U) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].keyword, ""PREPRINT"")" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(diagnostic.location.file, input.Path()) | EXPECT_EQ(diagnostic.location.line, LineOf(deck, ""1., 100."")) | EXPECT_EQ(diagnostic.keyword, ""HEAT TRANSFER"") | EXPECT_EQ(diagnostic.entity_identity, ""Heat"") | ASSERT_FALSE(missing_contact.HasValue()) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].location.line, 1U) | EXPECT_EQ(missing_contact.GetStatus().Diagnostics()[0].keyword, ""PREPRINT"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMixedElementsAndWrongThermalMaterialScopes ThermalDomainMapping.RejectsMixedElementsAndWrongThermalMaterialScopes; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMixedElementsAndWrongThermalMaterialScopes 유지 원문 검사 body 및 assertion 동일. ff984f852aeb3c53c270694ea7e4eaa2015891728d1e0a86260abf39206b5c92 ff984f852aeb3c53c270694ea7e4eaa2015891728d1e0a86260abf39206b5c92 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetResolvesSectionCaseInsensitively ThermalDomainMapping.InlineElementSetResolvesSectionCaseInsensitively; assertion 12개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetResolvesSectionCaseInsensitively 유지 원문 검사 body 및 assertion 동일. 11a43f66380de877c7ff381c789e0b363e357811dff150b5bd5e0b5d0fa75644 11a43f66380de877c7ff381c789e0b363e357811dff150b5bd5e0b5d0fa75644 "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(set.name, ""inlineShells"") | EXPECT_EQ(set.instance_name, ""I"") | EXPECT_EQ(set.element_indices, std::vector{0U}) | EXPECT_EQ(set.location.file, input.Path()) | EXPECT_EQ(set.location.line, LineOf(deck, ""*Element"")) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalSections()[0].name, ""INLINESHELLS"") | EXPECT_EQ(domain.ThermalSections()[0].location.line, LineOf(deck, ""*Shell Section""))" "ASSERT_TRUE(parsed.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(set.name, ""inlineShells"") | EXPECT_EQ(set.instance_name, ""I"") | EXPECT_EQ(set.element_indices, std::vector{0U}) | EXPECT_EQ(set.location.file, input.Path()) | EXPECT_EQ(set.location.line, LineOf(deck, ""*Element"")) | ASSERT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalSections()[0].name, ""INLINESHELLS"") | EXPECT_EQ(domain.ThermalSections()[0].location.line, LineOf(deck, ""*Shell Section""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetPreservesElementRowOrder ThermalDomainMapping.InlineElementSetPreservesElementRowOrder; assertion 8개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetPreservesElementRowOrder 유지 원문 검사 body 및 assertion 동일. 3f5d500fe86f7405086319ff4905bc60894fb8d080af74f6df1f3c7a3b4aa299 3f5d500fe86f7405086319ff4905bc60894fb8d080af74f6df1f3c7a3b4aa299 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | ASSERT_EQ(domain.ElementSets()[0].element_indices.size(), 2U) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 7) | EXPECT_EQ(domain.ThermalElements()[1].SourceId().source_label, 3) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalElements()[1].ThermalSectionIndex(), 0U) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ElementSets().size(), 1U) | ASSERT_EQ(domain.ElementSets()[0].element_indices.size(), 2U) | EXPECT_EQ(domain.ElementSets()[0].element_indices, (std::vector{0U, 1U})) | EXPECT_EQ(domain.ThermalElements()[0].SourceId().source_label, 7) | EXPECT_EQ(domain.ThermalElements()[1].SourceId().source_label, 3) | EXPECT_EQ(domain.ThermalElements()[0].ThermalSectionIndex(), 0U) | EXPECT_EQ(domain.ThermalElements()[1].ThermalSectionIndex(), 0U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetRejectsInvalidAndDuplicateDefinitions ThermalDomainMapping.InlineElementSetRejectsInvalidAndDuplicateDefinitions; assertion 3개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.InlineElementSetRejectsInvalidAndDuplicateDefinitions 유지 원문 검사 body 및 assertion 동일. 2b667a74ce81cfa3de66ebbe8049794f9416f01506fae6df68dc3d3e97ea91d1 2b667a74ce81cfa3de66ebbe8049794f9416f01506fae6df68dc3d3e97ea91d1 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""ELEMENT"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Element""))" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""ELEMENT"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Element""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsBeamSectionAndBeamOnlyChildrenAtTheirSource ThermalDomainMapping.RejectsBeamSectionAndBeamOnlyChildrenAtTheirSource; assertion 3개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsBeamSectionAndBeamOnlyChildrenAtTheirSource 유지 원문 검사 body 및 assertion 동일. d2f88d94560f7a9f695eebc3563b633cb0e076be17328f2fbc56c6793fb58c22 d2f88d94560f7a9f695eebc3563b633cb0e076be17328f2fbc56c6793fb58c22 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""BEAM GENERAL SECTION"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Beam General Section""))" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].keyword, ""BEAM GENERAL SECTION"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, LineOf(deck, ""*Beam General Section""))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMalformedDs4ConnectivityAndElementOptions ThermalDomainMapping.RejectsMalformedDs4ConnectivityAndElementOptions; assertion 0개 tests/unit/io/abaqus/thermal_domain_test.cpp ThermalDomainMapping.RejectsMalformedDs4ConnectivityAndElementOptions 유지 원문 검사 body 및 assertion 동일. efab1ebde5819473f0bd8e7adcbdc08d2be96827dca23ef798d1a485c709d008 efab1ebde5819473f0bd8e7adcbdc08d2be96827dca23ef798d1a485c709d008 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp support@1-146 helper/oracle/fixture/include/static assertion 구간: TemporaryInput, MapText, ThermalDeck, Replace, LineOf, ExpectRejected, Number tests/unit/io/abaqus/thermal_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9791c2574febe33443dffbd2e64441a7c8c962fccb165f678b39cc7d550b2a3e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/abaqus/thermal_domain_test.cpp support@1049-1050 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/abaqus/thermal_domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 55a2e65c40382b393210d36625666ce014008eaf3cbfbe9610a6dfaf0f840d11 55a2e65c40382b393210d36625666ce014008eaf3cbfbe9610a6dfaf0f840d11 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.RejectsDefaultStateBeforeCreatingOutput DynamicHdf5ResultsWriter.RejectsDefaultStateBeforeCreatingOutput; assertion 5개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.RejectsDefaultStateBeforeCreatingOutput 유지 원문 검사 body 및 assertion 동일. 2b67a7e7a070056ecb65aa9297b70593d65c453c4475315d2cff3fe0018e5846 2b67a7e7a070056ecb65aa9297b70593d65c453c4475315d2cff3fe0018e5846 "ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-output-schema"") | EXPECT_FALSE(std::filesystem::exists(output.Path()))" "ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""dynamic-output-schema"") | EXPECT_FALSE(std::filesystem::exists(output.Path()))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.SeparatesReducedFilterCombinationFromLegacyDriver DynamicHdf5ResultsWriter.SeparatesReducedFilterCombinationFromLegacyDriver; assertion 8개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.SeparatesReducedFilterCombinationFromLegacyDriver 유지 원문 검사 body 및 assertion 동일. 6e1f7161506bb30dec1b6476fb08a144bf4ad5451198473973be60597f2e2740 6e1f7161506bb30dec1b6476fb08a144bf4ad5451198473973be60597f2e2740 "ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE(writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(metadata.Get(), ""time_integration_formulation""), ""reduced-coordinate-HHT-with-physical-rate-reconstruction"") | EXPECT_EQ(ReadAttribute(auxiliary.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(auxiliary.Get(), ""quantity_semantics""), ""full-chart-HHT-filter-combination-not-predictor-driver"") | EXPECT_EQ(ReadString(physical.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" "ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE(writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(metadata.Get(), ""time_integration_formulation""), ""reduced-coordinate-HHT-with-physical-rate-reconstruction"") | EXPECT_EQ(ReadAttribute(auxiliary.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 2U) | EXPECT_EQ(ReadString(auxiliary.Get(), ""quantity_semantics""), ""full-chart-HHT-filter-combination-not-predictor-driver"") | EXPECT_EQ(ReadString(physical.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.WritesCompletePhysicalClampedHistoryAndSchema DynamicHdf5ResultsWriter.WritesCompletePhysicalClampedHistoryAndSchema; assertion 42개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.WritesCompletePhysicalClampedHistoryAndSchema 유지 원문 검사 body 및 assertion 동일. 15b4e67c491410f17a9b661b200e35a71e79de2db81b9007d037a8d82986bb60 15b4e67c491410f17a9b661b200e35a71e79de2db81b9007d037a8d82986bb60 "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadString(metadata.Get(), ""feature_id""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""analysis_procedure""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadString(metadata.Get(), ""mass_formulation""), ""nodal-lumped-kinetic"") | EXPECT_EQ(ReadString(metadata.Get(), ""acceleration_convention""), ""physical-endpoint-and-auxiliary-separated"") | EXPECT_EQ(ReadString(metadata.Get(), ""initial_state""), ""zero-q-v-step-load-0+"") | EXPECT_EQ(ReadString(metadata.Get(), ""unit_system_label""), ""consistent-input-units"") | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 1U) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""alpha"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), -0.05) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""beta"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.275625) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""gamma"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.55) | ASSERT_GE(H5Dread(density.Get(), density_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &density_row), 0) | EXPECT_EQ(density_row.id, 0U) | EXPECT_DOUBLE_EQ(density_row.rho, 2.0) | EXPECT_GT(H5Tequal(mask_type.Get(), H5T_STD_U8LE), 0) | ASSERT_GE(H5Dread(mask.Get(), H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, constraints.data()), 0) | EXPECT_EQ(value, 1U) | EXPECT_EQ(ReadDoubles(file.Get(), ""/model/prescribed_displacement"", {4U, 6U}), std::vector(24U, 0.0)) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_start"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_target"", H5P_DEFAULT), 0) | EXPECT_EQ(ReadString(dataset.Get(), ""component_names""), expected.components) | EXPECT_FALSE( ReadString(dataset.Get(), ""component_unit_dimensions"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""coordinate_system"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""location"").empty()) | EXPECT_EQ(ReadString(dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadString(dataset.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadAttribute(dataset.Get(), ""frame_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""increment_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""is_initial"", H5T_STD_U8LE, H5T_NATIVE_UINT8), index == 0U ? 1U : 0U) | EXPECT_DOUBLE_EQ(ReadAttribute(dataset.Get(), ""time"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), static_cast(index) * 0.25) | EXPECT_EQ(H5Aexists(dataset.Get(), ""load_factor""), 0) | EXPECT_DOUBLE_EQ( values[entry], entry % 9U == 0U || entry % 9U == 4U || entry % 9U == 8U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(values[entry], entry % 3U == 2U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ( values[entry], force ? (leaf == ""nodal/generalized_external_force"" ? 4.0 : -4.0) : 0.0) | EXPECT_EQ(ReadString(stress.Get(), ""source_element_type_dataset""), ""/model/elements.source_element_type"") | EXPECT_EQ(ReadString(stress.Get(), ""midsurface_location_dataset""), ""/model/shell/midsurface_locations"") | EXPECT_EQ(ReadString(stress.Get(), ""section_position_dataset""), ""/model/shell/section_positions"") | EXPECT_EQ(ReadString(stress.Get(), ""local_frame_dataset""), ""/steps/Step-1/frames/2/element/shell/local_frame"") | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_file""), 0) | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_line""), 0)" "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(ReadString(metadata.Get(), ""feature_id""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""analysis_procedure""), ""hht-implicit-dynamics"") | EXPECT_EQ(ReadString(metadata.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadString(metadata.Get(), ""mass_formulation""), ""nodal-lumped-kinetic"") | EXPECT_EQ(ReadString(metadata.Get(), ""acceleration_convention""), ""physical-endpoint-and-auxiliary-separated"") | EXPECT_EQ(ReadString(metadata.Get(), ""initial_state""), ""zero-q-v-step-load-0+"") | EXPECT_EQ(ReadString(metadata.Get(), ""unit_system_label""), ""consistent-input-units"") | EXPECT_EQ(ReadAttribute(metadata.Get(), ""schema_version"", H5T_STD_U64LE, H5T_NATIVE_UINT64), 1U) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""alpha"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), -0.05) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""beta"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.275625) | EXPECT_DOUBLE_EQ(ReadAttribute(metadata.Get(), ""gamma"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), 0.55) | ASSERT_GE(H5Dread(density.Get(), density_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &density_row), 0) | EXPECT_EQ(density_row.id, 0U) | EXPECT_DOUBLE_EQ(density_row.rho, 2.0) | EXPECT_GT(H5Tequal(mask_type.Get(), H5T_STD_U8LE), 0) | ASSERT_GE(H5Dread(mask.Get(), H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, constraints.data()), 0) | EXPECT_EQ(value, 1U) | EXPECT_EQ(ReadDoubles(file.Get(), ""/model/prescribed_displacement"", {4U, 6U}), std::vector(24U, 0.0)) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_start"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/model/prescribed_displacement_target"", H5P_DEFAULT), 0) | EXPECT_EQ(ReadString(dataset.Get(), ""component_names""), expected.components) | EXPECT_FALSE( ReadString(dataset.Get(), ""component_unit_dimensions"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""coordinate_system"").empty()) | EXPECT_FALSE(ReadString(dataset.Get(), ""location"").empty()) | EXPECT_EQ(ReadString(dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadString(dataset.Get(), ""source_step_name""), ""Transient Load"") | EXPECT_EQ(ReadAttribute(dataset.Get(), ""frame_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""increment_index"", H5T_STD_U64LE, H5T_NATIVE_UINT64), index) | EXPECT_EQ(ReadAttribute(dataset.Get(), ""is_initial"", H5T_STD_U8LE, H5T_NATIVE_UINT8), index == 0U ? 1U : 0U) | EXPECT_DOUBLE_EQ(ReadAttribute(dataset.Get(), ""time"", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE), static_cast(index) * 0.25) | EXPECT_EQ(H5Aexists(dataset.Get(), ""load_factor""), 0) | EXPECT_DOUBLE_EQ( values[entry], entry % 9U == 0U || entry % 9U == 4U || entry % 9U == 8U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ(values[entry], entry % 3U == 2U ? 1.0 : 0.0) | EXPECT_DOUBLE_EQ( values[entry], force ? (leaf == ""nodal/generalized_external_force"" ? 4.0 : -4.0) : 0.0) | EXPECT_EQ(ReadString(stress.Get(), ""source_element_type_dataset""), ""/model/elements.source_element_type"") | EXPECT_EQ(ReadString(stress.Get(), ""midsurface_location_dataset""), ""/model/shell/midsurface_locations"") | EXPECT_EQ(ReadString(stress.Get(), ""section_position_dataset""), ""/model/shell/section_positions"") | EXPECT_EQ(ReadString(stress.Get(), ""local_frame_dataset""), ""/steps/Step-1/frames/2/element/shell/local_frame"") | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_file""), 0) | EXPECT_GE(H5Tget_member_index(diagnostic_type.Get(), ""source_line""), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.PreservesSeparateSuppliedEndpointAndAuxiliaryEvidence DynamicHdf5ResultsWriter.PreservesSeparateSuppliedEndpointAndAuxiliaryEvidence; assertion 9개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.PreservesSeparateSuppliedEndpointAndAuxiliaryEvidence 유지 원문 검사 body 및 assertion 동일. 0e68645100a4807b87bd6d9a6dba22f0cdbdb588a65f032dfe2eac6c0c11487d 0e68645100a4807b87bd6d9a6dba22f0cdbdb588a65f032dfe2eac6c0c11487d "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/acceleration"", {4U, 6U})[0U], 2.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/algorithmic_acceleration"", {4U, 6U})[0U], 3.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/generalized_inertia_force"", {4U, 6U})[0U], 5.0) | EXPECT_EQ(ReadDoubles(file.Get(), root + ""global/energy"", {5U}), (std::vector{6.0, 7.0, 8.0, 9.0, 12.0})) | EXPECT_EQ(ReadString(acceleration.Get(), ""rotation_representation""), ""total-rotation-vector-chart"") | EXPECT_EQ(ReadString(acceleration.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/acceleration"", {4U, 6U})[0U], 2.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/algorithmic_acceleration"", {4U, 6U})[0U], 3.0) | EXPECT_DOUBLE_EQ( ReadDoubles(file.Get(), root + ""nodal/generalized_inertia_force"", {4U, 6U})[0U], 5.0) | EXPECT_EQ(ReadDoubles(file.Get(), root + ""global/energy"", {5U}), (std::vector{6.0, 7.0, 8.0, 9.0, 12.0})) | EXPECT_EQ(ReadString(acceleration.Get(), ""rotation_representation""), ""total-rotation-vector-chart"") | EXPECT_EQ(ReadString(acceleration.Get(), ""quantity_semantics""), ""physical-endpoint-chart-acceleration"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction; assertion 9개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.ConvertsPartialConstraintMomentToSpatialReaction 유지 원문 검사 body 및 assertion 동일. f825bce2933be89196cd7c0291501abd4ead25e31d9986f7762c497e92748702 f825bce2933be89196cd7c0291501abd4ead25e31d9986f7762c497e92748702 ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ(generalized[3U], 5.0) | EXPECT_DOUBLE_EQ(generalized[4U], 0.0) | EXPECT_DOUBLE_EQ(generalized[5U], 0.0) | EXPECT_NEAR(spatial[3U], 5.0 * (1.0 - coefficient * 0.13), 1.0e-14) | EXPECT_NEAR(spatial[4U], 0.75, 1.0e-14) | EXPECT_NEAR(spatial[5U], -0.5, 1.0e-14) ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | ASSERT_TRUE(fixture.state.CommitAcceptedFrame(frame).IsOk()) | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_DOUBLE_EQ(generalized[3U], 5.0) | EXPECT_DOUBLE_EQ(generalized[4U], 0.0) | EXPECT_DOUBLE_EQ(generalized[5U], 0.0) | EXPECT_NEAR(spatial[3U], 5.0 * (1.0 - coefficient * 0.13), 1.0e-14) | EXPECT_NEAR(spatial[4U], 0.75, 1.0e-14) | EXPECT_NEAR(spatial[5U], -0.5, 1.0e-14) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.IncompleteOrMismatchedHistoryPreservesExistingFile DynamicHdf5ResultsWriter.IncompleteOrMismatchedHistoryPreservesExistingFile; assertion 9개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.IncompleteOrMismatchedHistoryPreservesExistingFile 유지 원문 검사 body 및 assertion 동일. ad2c45f94851936a7e87cfed7a14d272db0b75733b9f719eb64af3ce2b90d231 ad2c45f94851936a7e87cfed7a14d272db0b75733b9f719eb64af3ce2b90d231 "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, index)) .IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *other.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), valid_bytes)" "ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, 0U)).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( fixture.state.CommitAcceptedFrame(MakeFrame(*fixture.domain, index)) .IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *other.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), ""previous-result"") | ASSERT_TRUE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_FALSE( writer.Write(output.Path(), *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(ReadBytes(output.Path()), valid_bytes)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.FailedAtomicReplacementPreservesPreviousBytes DynamicHdf5ResultsWriter.FailedAtomicReplacementPreservesPreviousBytes; assertion 6개 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp DynamicHdf5ResultsWriter.FailedAtomicReplacementPreservesPreviousBytes 유지 원문 검사 body 및 assertion 동일. d850c859b3d1569738581059ef0ee47cc054602b036a96ec36581c643c103909 d850c859b3d1569738581059ef0ee47cc054602b036a96ec36581c643c103909 "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(CloseHandle(locked)) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output.Path()), ""locked-previous-result"")" "ASSERT_NE(locked, INVALID_HANDLE_VALUE) | EXPECT_FALSE(status.IsOk()) | EXPECT_TRUE(CloseHandle(locked)) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output.Path()), ""locked-previous-result"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp support@1-254 helper/oracle/fixture/include/static assertion 구간: MakeDefinition, if, Fixture, MakeFixture, MakeFrame, TempFile, Path, CommitHistory, ReadBytes, ReadString, ReadAttribute, ReadDoubles, ExpectCompound tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 703c272cdd720ce3a45edcd79bbc0fc04178d27f236c2b72c3fea95c54ceaf1e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp support@671-672 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/dynamic_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 1개 tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 249f07429c5bb0dd50db784f6be559e15db7c705baa3db44e0591c9c7914d9e3 249f07429c5bb0dd50db784f6be559e15db7c705baa3db44e0591c9c7914d9e3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp EigenHdf5ResultsWriter.WritesModalSchemaAndRejectsTamperedState EigenHdf5ResultsWriter.WritesModalSchemaAndRejectsTamperedState; assertion 27개 tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp EigenHdf5ResultsWriter.WritesModalSchemaAndRejectsTamperedState 유지 원문 검사 body 및 assertion 동일. 8ff5899d7d3dd0584e34a8b619ece2228a6520e3fee41e10e038d73c57656e93 8ff5899d7d3dd0584e34a8b619ece2228a6520e3fee41e10e038d73c57656e93 "ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(execution.HasValue()) | ASSERT_TRUE(writer.Write(path, domain, state, {}).IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | ASSERT_GE(controls, 0) | ASSERT_GE(H5Dread(controls, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, stored_controls.data()), 0) | EXPECT_EQ(stored_controls[5U], 0) | EXPECT_GE(H5Dclose(controls), 0) | EXPECT_GE(H5Fclose(file), 0) | EXPECT_FALSE(writer.Write(path, domain, candidate, {}).IsOk()) | EXPECT_TRUE(retained == original) | ASSERT_NE(lock, INVALID_HANDLE_VALUE) | EXPECT_NE(CloseHandle(lock), 0) | ASSERT_FALSE(locked_write.IsOk()) | ASSERT_FALSE(locked_write.Diagnostics().empty()) | EXPECT_EQ(locked_write.Diagnostics()[0].code, ""hdf5-finalization-failure"") | EXPECT_EQ(after_failure, original) | ASSERT_TRUE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk()) | ASSERT_GE(corrupt_file, 0) | ASSERT_GE(nodes, 0) | ASSERT_GE(H5Tinsert(id_type, ""internal_node_id"", 0U, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dwrite(nodes, id_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, duplicate_ids.data()), 0) | EXPECT_GE(H5Tclose(id_type), 0) | EXPECT_GE(H5Dclose(nodes), 0) | EXPECT_GE(H5Fclose(corrupt_file), 0) | EXPECT_FALSE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk())" "ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(execution.HasValue()) | ASSERT_TRUE(writer.Write(path, domain, state, {}).IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/eigen/modes"", H5P_DEFAULT), 0) | ASSERT_GE(controls, 0) | ASSERT_GE(H5Dread(controls, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, stored_controls.data()), 0) | EXPECT_EQ(stored_controls[5U], 0) | EXPECT_GE(H5Dclose(controls), 0) | EXPECT_GE(H5Fclose(file), 0) | EXPECT_FALSE(writer.Write(path, domain, candidate, {}).IsOk()) | EXPECT_TRUE(retained == original) | ASSERT_NE(lock, INVALID_HANDLE_VALUE) | EXPECT_NE(CloseHandle(lock), 0) | ASSERT_FALSE(locked_write.IsOk()) | ASSERT_FALSE(locked_write.Diagnostics().empty()) | EXPECT_EQ(locked_write.Diagnostics()[0].code, ""hdf5-finalization-failure"") | EXPECT_EQ(after_failure, original) | ASSERT_TRUE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk()) | ASSERT_GE(corrupt_file, 0) | ASSERT_GE(nodes, 0) | ASSERT_GE(H5Tinsert(id_type, ""internal_node_id"", 0U, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dwrite(nodes, id_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, duplicate_ids.data()), 0) | EXPECT_GE(H5Tclose(id_type), 0) | EXPECT_GE(H5Dclose(nodes), 0) | EXPECT_GE(H5Fclose(corrupt_file), 0) | EXPECT_FALSE( fesa::hdf5_internal::SelfCheckEigenFile(path, domain, state, {}).IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp support@1-66 helper/oracle/fixture/include/static assertion 구간: Definition tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b3554f56791ac66395cfa9a19281f09965b9ad9dbf29a3e9976828778334b35b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp support@154-155 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/eigen_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 10개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dd680025af1f1e85cfd08e97d2dad7db8c857238d3b73cb23d824690670f58c3 dd680025af1f1e85cfd08e97d2dad7db8c857238d3b73cb23d824690670f58c3 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity; assertion 60개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity 유지 원문 검사 body 및 assertion 동일. 8da4eeff5bd49a698da035e0516b426d30471db8c183ee6c78329f2a02879880 8da4eeff5bd49a698da035e0516b426d30471db8c183ee6c78329f2a02879880 "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-3d-euler-beam"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""solver_version""), std::string{fesa::SolverVersion()}) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""source_input_identity""), ""path="" + normalized_source + "";content_identity=fnv1a64:0123456789abcdef"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""unit_system_label""), ""user-consistent-unspecified"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; beam-local=(t,n1,t-cross-n1)"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""element_formulation""), ""B33-3D-Euler-Bernoulli"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""frame_index""), 0U) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodes""), std::vector({2U})) | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""units_label""), ""length"") | ASSERT_EQ(nodes.size(), 2U) | EXPECT_EQ(nodes[0U].internal_node_id, 0U) | EXPECT_STREQ(nodes[0U].instance_name, u8""Beam-\u03b1"") | EXPECT_STREQ(nodes[0U].source_label, ""101"") | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[0U], 3.0) | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[1U], 4.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements_dataset.Get(), ""formulation""), ""B33-3D-Euler-Bernoulli"") | ASSERT_EQ(displacement.size(), 12U) | EXPECT_DOUBLE_EQ(displacement.front(), 0.25) | EXPECT_DOUBLE_EQ(displacement.back(), 11.25) | ASSERT_EQ(reaction.size(), 12U) | EXPECT_DOUBLE_EQ(reaction.front(), 100.0) | EXPECT_DOUBLE_EQ(reaction.back(), 111.0) | ASSERT_EQ(end_force.size(), 12U) | EXPECT_DOUBLE_EQ(end_force.front(), 1.0) | EXPECT_DOUBLE_EQ(end_force.back(), 12.0) | ASSERT_EQ(section_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(section_resultant.front(), 11.0) | EXPECT_DOUBLE_EQ(section_resultant.back(), 18.0) | ASSERT_EQ(generalized_strain.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_strain.front(), 0.01) | EXPECT_DOUBLE_EQ(generalized_strain.back(), 0.08) | ASSERT_EQ(generalized_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_resultant.front(), 21.0) | EXPECT_DOUBLE_EQ(generalized_resultant.back(), 28.0) | EXPECT_EQ(DatasetDimensions(file.Get(), stress_path), std::vector({4U})) | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""component_names""), ""S11"") | EXPECT_EQ( ReadStringAttribute(stress_dataset.Get(), ""component_unit_dimensions""), ""force/length^2"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""coordinate_system""), ""beam-local"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""location""), ""section-point"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(stress_dataset.Get(), ""frame_index""), 0U) | ASSERT_EQ(stress_rows.size(), 4U) | EXPECT_EQ(stress_rows[0U].internal_element_id, 0U) | EXPECT_EQ(stress_rows[0U].gauss_point_index, 1U) | EXPECT_EQ(stress_rows[0U].section_point_index, 1U) | EXPECT_DOUBLE_EQ(stress_rows[0U].x1, -0.1) | EXPECT_DOUBLE_EQ(stress_rows[0U].x2, 0.2) | EXPECT_STREQ(stress_rows[0U].source, ""input"") | EXPECT_DOUBLE_EQ(stress_rows[3U].s11, 34.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({0U})) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/element/transverse_shear_stress"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-3d-euler-beam"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""solver_version""), std::string{fesa::SolverVersion()}) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""source_input_identity""), ""path="" + normalized_source + "";content_identity=fnv1a64:0123456789abcdef"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""unit_system_label""), ""user-consistent-unspecified"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; beam-local=(t,n1,t-cross-n1)"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""element_formulation""), ""B33-3D-Euler-Bernoulli"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""frame_index""), 0U) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodes""), std::vector({2U})) | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(ReadStringAttribute(nodes_dataset.Get(), ""units_label""), ""length"") | ASSERT_EQ(nodes.size(), 2U) | EXPECT_EQ(nodes[0U].internal_node_id, 0U) | EXPECT_STREQ(nodes[0U].instance_name, u8""Beam-\u03b1"") | EXPECT_STREQ(nodes[0U].source_label, ""101"") | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[0U], 3.0) | EXPECT_DOUBLE_EQ(nodes[1U].coordinates[1U], 4.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements_dataset.Get(), ""formulation""), ""B33-3D-Euler-Bernoulli"") | ASSERT_EQ(displacement.size(), 12U) | EXPECT_DOUBLE_EQ(displacement.front(), 0.25) | EXPECT_DOUBLE_EQ(displacement.back(), 11.25) | ASSERT_EQ(reaction.size(), 12U) | EXPECT_DOUBLE_EQ(reaction.front(), 100.0) | EXPECT_DOUBLE_EQ(reaction.back(), 111.0) | ASSERT_EQ(end_force.size(), 12U) | EXPECT_DOUBLE_EQ(end_force.front(), 1.0) | EXPECT_DOUBLE_EQ(end_force.back(), 12.0) | ASSERT_EQ(section_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(section_resultant.front(), 11.0) | EXPECT_DOUBLE_EQ(section_resultant.back(), 18.0) | ASSERT_EQ(generalized_strain.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_strain.front(), 0.01) | EXPECT_DOUBLE_EQ(generalized_strain.back(), 0.08) | ASSERT_EQ(generalized_resultant.size(), 8U) | EXPECT_DOUBLE_EQ(generalized_resultant.front(), 21.0) | EXPECT_DOUBLE_EQ(generalized_resultant.back(), 28.0) | EXPECT_EQ(DatasetDimensions(file.Get(), stress_path), std::vector({4U})) | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""component_names""), ""S11"") | EXPECT_EQ( ReadStringAttribute(stress_dataset.Get(), ""component_unit_dimensions""), ""force/length^2"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""coordinate_system""), ""beam-local"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""location""), ""section-point"") | EXPECT_EQ(ReadStringAttribute(stress_dataset.Get(), ""step_name""), ""Step-1"") | EXPECT_EQ(ReadUint64Attribute(stress_dataset.Get(), ""frame_index""), 0U) | ASSERT_EQ(stress_rows.size(), 4U) | EXPECT_EQ(stress_rows[0U].internal_element_id, 0U) | EXPECT_EQ(stress_rows[0U].gauss_point_index, 1U) | EXPECT_EQ(stress_rows[0U].section_point_index, 1U) | EXPECT_DOUBLE_EQ(stress_rows[0U].x1, -0.1) | EXPECT_DOUBLE_EQ(stress_rows[0U].x2, 0.2) | EXPECT_STREQ(stress_rows[0U].source, ""input"") | EXPECT_DOUBLE_EQ(stress_rows[3U].s11, 34.0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({0U})) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/element/transverse_shear_stress"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/0/surface_pressure"", H5P_DEFAULT), 0)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests; assertion 3개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests 유지 원문 검사 body 및 assertion 동일. cd64b9e679f90b6dc4e5be4798c43fa4c11a4fb720cb281b1fe45e0207702f39 cd64b9e679f90b6dc4e5be4798c43fa4c11a4fb720cb281b1fe45e0207702f39 "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid; assertion 18개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid 유지 원문 검사 body 및 assertion 동일. cab1bac6c24b113ae4bf36c8870f5e9ed01bccb51403e05830a7287e63b2acbd cab1bac6c24b113ae4bf36c8870f5e9ed01bccb51403e05830a7287e63b2acbd "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(stress_rows.size(), 2U) | EXPECT_EQ(stress_rows[index].internal_element_id, 0U) | EXPECT_EQ(stress_rows[index].gauss_point_index, index + 1U) | EXPECT_EQ(stress_rows[index].section_point_index, 0U) | EXPECT_DOUBLE_EQ(stress_rows[index].x1, 0.0) | EXPECT_DOUBLE_EQ(stress_rows[index].x2, 0.0) | EXPECT_STREQ(stress_rows[index].source, ""fesa-default"") | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].severity, ""warning"") | EXPECT_STREQ(rows[0U].code, ""ignored-keyword"") | EXPECT_STREQ(rows[0U].file, std::filesystem::absolute(fixture.domain->SourcePath()) .lexically_normal() .generic_u8string() .c_str()) | EXPECT_EQ(rows[0U].line, 20U) | EXPECT_STREQ(rows[0U].keyword, ""*PREPRINT"") | EXPECT_STREQ(rows[0U].entity_identity, """") | EXPECT_STREQ(rows[0U].message, ""Ignored generator control."") | EXPECT_STREQ(rows[1U].code, ""ignored-output-request"") | EXPECT_EQ(rows[1U].line, 80U)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(stress_rows.size(), 2U) | EXPECT_EQ(stress_rows[index].internal_element_id, 0U) | EXPECT_EQ(stress_rows[index].gauss_point_index, index + 1U) | EXPECT_EQ(stress_rows[index].section_point_index, 0U) | EXPECT_DOUBLE_EQ(stress_rows[index].x1, 0.0) | EXPECT_DOUBLE_EQ(stress_rows[index].x2, 0.0) | EXPECT_STREQ(stress_rows[index].source, ""fesa-default"") | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].severity, ""warning"") | EXPECT_STREQ(rows[0U].code, ""ignored-keyword"") | EXPECT_STREQ(rows[0U].file, std::filesystem::absolute(fixture.domain->SourcePath()) .lexically_normal() .generic_u8string() .c_str()) | EXPECT_EQ(rows[0U].line, 20U) | EXPECT_STREQ(rows[0U].keyword, ""*PREPRINT"") | EXPECT_STREQ(rows[0U].entity_identity, """") | EXPECT_STREQ(rows[0U].message, ""Ignored generator control."") | EXPECT_STREQ(rows[1U].code, ""ignored-output-request"") | EXPECT_EQ(rows[1U].line, 80U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal; assertion 5개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal 유지 원문 검사 body 및 assertion 동일. 5ca48e4c84abdb788e3184610cced5edc5d94b89ed3b8a71a615cb730cf33714 5ca48e4c84abdb788e3184610cced5edc5d94b89ed3b8a71a615cb730cf33714 EXPECT_FALSE(std::filesystem::exists(invalid_output)) | EXPECT_EQ(EntryCount(directory.Path()), 0U) | ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) EXPECT_FALSE(std::filesystem::exists(invalid_output)) | EXPECT_EQ(EntryCount(directory.Path()), 0U) | ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal; assertion 5개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal 유지 원문 검사 body 및 assertion 동일. c2f57aee2946c919919c83b75b15b17dc5ddf8adc7d3ea8d634b0f2274fa53b8 c2f57aee2946c919919c83b75b15b17dc5ddf8adc7d3ea8d634b0f2274fa53b8 "ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | EXPECT_GT(H5Fis_hdf5(final.string().c_str()), 0) | EXPECT_EQ(EntryCount(directory.Path()), 1U) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U)" "ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | EXPECT_GT(H5Fis_hdf5(final.string().c_str()), 0) | EXPECT_EQ(EntryCount(directory.Path()), 1U) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity; assertion 30개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity 유지 원문 검사 body 및 assertion 동일. 6b486491444d4a79d8e2201511ac2a539fc98503320507074eef5e67e7aee5d6 6b486491444d4a79d8e2201511ac2a539fc98503320507074eef5e67e7aee5d6 "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-mitc4-shell"") | EXPECT_EQ( ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; shell-local=(e1,e2,e3); positive-thickness=+zeta"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements.Get(), ""formulation""), ""FESA-MITC4"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_director""), std::vector({4U, 3U})) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/nodal_director""), expected_directors) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_frame""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodal_constraint_mask""), std::vector({4U, 6U})) | ASSERT_EQ(mask.size(), 24U) | EXPECT_EQ(mask[0U], 1U) | EXPECT_EQ(mask[1U], 1U) | EXPECT_EQ(mask[2U], 1U) | EXPECT_EQ(mask[3U], 1U) | EXPECT_EQ(mask[4U], 0U) | EXPECT_EQ(mask[5U], 0U) | ASSERT_EQ(prescribed.size(), 24U) | EXPECT_DOUBLE_EQ(prescribed[0U], 0.0) | EXPECT_DOUBLE_EQ(prescribed[3U], 0.125) | EXPECT_DOUBLE_EQ(prescribed[4U], 0.0) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/section_positions""), std::vector({-1.0, 0.0, 1.0})) | ASSERT_EQ(locations.size(), 8U) | EXPECT_DOUBLE_EQ(locations[0U], -gauss) | EXPECT_DOUBLE_EQ(locations[1U], -gauss) | EXPECT_DOUBLE_EQ(locations[6U], -gauss) | EXPECT_DOUBLE_EQ(locations[7U], gauss)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 0U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""linear-static-mitc4-shell"") | EXPECT_EQ( ReadStringAttribute(metadata.Get(), ""coordinate_convention""), ""global-cartesian; shell-local=(e1,e2,e3); positive-thickness=+zeta"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/elements""), std::vector({1U})) | EXPECT_EQ(ReadStringAttribute(elements.Get(), ""formulation""), ""FESA-MITC4"") | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_director""), std::vector({4U, 3U})) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/nodal_director""), expected_directors) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/shell/nodal_frame""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/model/nodal_constraint_mask""), std::vector({4U, 6U})) | ASSERT_EQ(mask.size(), 24U) | EXPECT_EQ(mask[0U], 1U) | EXPECT_EQ(mask[1U], 1U) | EXPECT_EQ(mask[2U], 1U) | EXPECT_EQ(mask[3U], 1U) | EXPECT_EQ(mask[4U], 0U) | EXPECT_EQ(mask[5U], 0U) | ASSERT_EQ(prescribed.size(), 24U) | EXPECT_DOUBLE_EQ(prescribed[0U], 0.0) | EXPECT_DOUBLE_EQ(prescribed[3U], 0.125) | EXPECT_DOUBLE_EQ(prescribed[4U], 0.0) | EXPECT_EQ(ReadDoubleDataset(file.Get(), ""/model/shell/section_positions""), std::vector({-1.0, 0.0, 1.0})) | ASSERT_EQ(locations.size(), 8U) | EXPECT_DOUBLE_EQ(locations[0U], -gauss) | EXPECT_DOUBLE_EQ(locations[1U], -gauss) | EXPECT_DOUBLE_EQ(locations[6U], -gauss) | EXPECT_DOUBLE_EQ(locations[7U], gauss)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory; assertion 9개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory 유지 원문 검사 body 및 assertion 동일. 110d9a70913902d4021933f838872fc49b23964f0923e76a82ff9ca38d147adc 110d9a70913902d4021933f838872fc49b23964f0923e76a82ff9ca38d147adc "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(strain.size(), 32U) | EXPECT_DOUBLE_EQ(strain.front(), 101.0) | EXPECT_DOUBLE_EQ(strain.back(), 408.0) | ASSERT_EQ(stress.size(), 36U) | EXPECT_DOUBLE_EQ(stress.front(), 121.0) | EXPECT_DOUBLE_EQ(stress.back(), 429.0) | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""metric_definition_ids""), ""free-residual-l2-over-max-free-force-l2,force-balance-l2-over-"" ""max-force-sum,moment-balance-l2-over-max-moment-sum"") | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""acceptance_thresholds""), ""1e-10,1e-10,1e-10"")" "ASSERT_TRUE(writer.Write(output, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(strain.size(), 32U) | EXPECT_DOUBLE_EQ(strain.front(), 101.0) | EXPECT_DOUBLE_EQ(strain.back(), 408.0) | ASSERT_EQ(stress.size(), 36U) | EXPECT_DOUBLE_EQ(stress.front(), 121.0) | EXPECT_DOUBLE_EQ(stress.back(), 429.0) | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""metric_definition_ids""), ""free-residual-l2-over-max-free-force-l2,force-balance-l2-over-"" ""max-force-sum,moment-balance-l2-over-max-moment-sum"") | EXPECT_EQ(ReadStringAttribute(metrics.Get(), ""acceptance_thresholds""), ""1e-10,1e-10,1e-10"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths; assertion 4개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths 유지 원문 검사 body 및 assertion 동일. 472f6fc3007fa9ce8532895a218e178e8b6861022881554d0f7b38f6e3eb1d28 472f6fc3007fa9ce8532895a218e178e8b6861022881554d0f7b38f6e3eb1d28 "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), forbidden, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" "ASSERT_TRUE( writer.Write(output, *fixture.domain, *fixture.state, {ignored_request}) .IsOk()) | EXPECT_GT(H5Lexists(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), forbidden, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/diagnostics""), std::vector({1U}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal; assertion 2개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal 유지 원문 검사 body 및 assertion 동일. 28be997b839d00367e036aef28d86d7b31d42f1f6d3b9af82fce26c23380ba3c 28be997b839d00367e036aef28d86d7b31d42f1f6d3b9af82fce26c23380ba3c EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_EQ(EntryCount(directory.Path()), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal; assertion 6개 tests/unit/io/hdf5/hdf5_results_writer_test.cpp Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal 유지 원문 검사 body 및 assertion 동일. 3c25204bcd546b3fd1ee10dd44c2e215a6dc878502873b1fe0612cc1c92d82e0 3c25204bcd546b3fd1ee10dd44c2e215a6dc878502873b1fe0612cc1c92d82e0 ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(directors.size(), 12U) | EXPECT_TRUE(director.IsFinite()) | EXPECT_EQ(director, (fesa::Vector3{0.0, 0.0, 1.0})) | EXPECT_EQ(ReadBytes(final), valid_bytes) | EXPECT_EQ(EntryCount(directory.Path()), 1U) ASSERT_TRUE(writer.Write(final, *fixture.domain, *fixture.state, {}).IsOk()) | ASSERT_EQ(directors.size(), 12U) | EXPECT_TRUE(director.IsFinite()) | EXPECT_EQ(director, (fesa::Vector3{0.0, 0.0, 1.0})) | EXPECT_EQ(ReadBytes(final), valid_bytes) | EXPECT_EQ(EntryCount(directory.Path()), 1U) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1-823 helper/oracle/fixture/include/static assertion 구간: Hdf5Handle, if, WinHandle, TempDirectory, WriterFixture, MakeDefinition, MakeFixture, MakeShellDefinition, MakeShellFixture, OpenFile, OpenDataset, DatasetDimensions, ReadDoubleDataset, for, ReadUint8Dataset, ReadStringAttribute, ReadUint64Attribute, ExpectPortableCompoundMember, ExpectCompoundMembers, ExpectCompoundMemberNames, ExpectNumericDataset, MakeUtf8StringType, NodeReadRow, ReadNodeRows, ReclaimNodeRows, ElementReadRow, ReadElementRows, StressReadRow, ReadStressRows, ReclaimStressRows, DiagnosticReadRow, ReadDiagnosticRows, ReclaimDiagnosticRows, ReadBytes, WriteBytes, EntryCount, ExpectOutputFailure tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 4ab1135fc0949c1ef197678be93dda782dc8e2d8655cc928fd55eee0d8961e42 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1120-1121 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7d75f7fce7301b112d258ec1b3434016cbb00dc5186e10757a3d53485db1e852 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1203-1204 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a28c340e155ab8c275c3eb5afa3522b3c3b655448af487e689907f00da8b75a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1262-1263 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. de735dd985d5499ad7c73f83d71275d6f5a840dbae2b1672b0e2e4008f0d7560 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1301-1302 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e9bcb4f06a58b6240ab792f21d2791ef2d5cd6ed3540f5cbe243c87f41e10575 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_results_writer_test.cpp support@1318-1319 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 778e854c4f2ce284558db14ad3b1ce65607a94482da05114089a6c8e96644227 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_writer_components_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 3개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cedde4c3b4576ff6568b8dabefbc0ad56bc54ef4d3adbf2c8eb74ad7f7f711e4 cedde4c3b4576ff6568b8dabefbc0ad56bc54ef4d3adbf2c8eb74ad7f7f711e4 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans; assertion 8개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans 유지 원문 검사 body 및 assertion 동일. 81b2f1f76a5dcf5bb467f6f4d53431f4e73401023067e1508e3550739a7becc4 81b2f1f76a5dcf5bb467f6f4d53431f4e73401023067e1508e3550739a7becc4 "ASSERT_TRUE(plan_result.HasValue()) | ASSERT_EQ(datasets.size(), 6U) | EXPECT_EQ(datasets[0U].path, ""/steps/Step-1/frames/0/nodal/displacement"") | EXPECT_EQ(datasets[0U].dimensions, std::vector({2U, 6U})) | EXPECT_EQ(datasets[2U].path, ""/steps/Step-1/frames/0/element/end_force_local"") | EXPECT_EQ(datasets[2U].dimensions, std::vector({1U, 2U, 6U})) | EXPECT_EQ(datasets[5U].path, ""/steps/Step-1/frames/0/element/generalized_resultant"") | EXPECT_TRUE(fesa::hdf5_internal::ValidateFiniteInventory(datasets).IsOk())" "ASSERT_TRUE(plan_result.HasValue()) | ASSERT_EQ(datasets.size(), 6U) | EXPECT_EQ(datasets[0U].path, ""/steps/Step-1/frames/0/nodal/displacement"") | EXPECT_EQ(datasets[0U].dimensions, std::vector({2U, 6U})) | EXPECT_EQ(datasets[2U].path, ""/steps/Step-1/frames/0/element/end_force_local"") | EXPECT_EQ(datasets[2U].dimensions, std::vector({1U, 2U, 6U})) | EXPECT_EQ(datasets[5U].path, ""/steps/Step-1/frames/0/element/generalized_resultant"") | EXPECT_TRUE(fesa::hdf5_internal::ValidateFiniteInventory(datasets).IsOk())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory; assertion 0개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory 유지 원문 검사 body 및 assertion 동일. 7ffe025ea38838a0b732cf1b6438b5f1ea52e2fa0831d04f9efb98060cb02795 7ffe025ea38838a0b732cf1b6438b5f1ea52e2fa0831d04f9efb98060cb02795 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam; assertion 4개 tests/unit/io/hdf5/hdf5_writer_components_test.cpp Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam 유지 원문 검사 body 및 assertion 동일. dfa562386df73584a0987a54a9b5f63293a8ffdc34ac4ffd53924c589ca578e3 dfa562386df73584a0987a54a9b5f63293a8ffdc34ac4ffd53924c589ca578e3 ASSERT_TRUE(std::filesystem::create_directory(directory)) | ASSERT_TRUE(plan_result.HasValue()) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_FALSE(std::filesystem::exists(candidate)) ASSERT_TRUE(std::filesystem::create_directory(directory)) | ASSERT_TRUE(plan_result.HasValue()) | EXPECT_EQ(ReadBytes(final), sentinel) | EXPECT_FALSE(std::filesystem::exists(candidate)) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/hdf5_writer_components_test.cpp support@1-125 helper/oracle/fixture/include/static assertion 구간: WriterFixture, MakeDefinition, MakeFixture, if, ReadBytes, WriteBytes, ExpectOutputFailure tests/unit/io/hdf5/hdf5_writer_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d4c12780f611b8d0f3e096c57425f504de734e1f1fe5f4bb74eee73fce444d6d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ea65dd1a637d3517aba6239dd53b411bf465a04769ae57ffc2ca970247080a4a ea65dd1a637d3517aba6239dd53b411bf465a04769ae57ffc2ca970247080a4a 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly; assertion 34개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1ModelAndCommittedAcceptedFramesOnly 유지 원문 검사 body 및 assertion 동일. 6e39a263af0c568c71a1825d1df1ab7caad034e32be32750eff35627846a02e8 6e39a263af0c568c71a1825d1df1ab7caad034e32be32750eff35627846a02e8 "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""analysis_procedure""), ""nonlinear-static-full-newton"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4-total-lagrangian"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""factor_zero_is_frame""), 0U) | EXPECT_DOUBLE_EQ(ReadDoubleAttribute(metadata.Get(), ""factor_zero_load_factor""), 0.0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/accepted_frames""), std::vector({2U})) | ASSERT_EQ(frames.size(), 2U) | EXPECT_EQ(frames[0U].frame_index, 0U) | EXPECT_EQ(frames[0U].increment_index, 1U) | EXPECT_DOUBLE_EQ(frames[0U].load_factor, 0.5) | EXPECT_EQ(frames[0U].is_factor_one, 0U) | EXPECT_EQ(frames[1U].frame_index, 1U) | EXPECT_EQ(frames[1U].increment_index, 2U) | EXPECT_DOUBLE_EQ(frames[1U].load_factor, 1.0) | EXPECT_EQ(frames[1U].is_factor_one, 1U) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/trial_history"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/displacement""), std::vector({4U, 6U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/triad""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/local_frame""), std::vector({1U, 4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/stress""), std::vector({1U, 4U, 3U, 3U})) | ASSERT_EQ(displacement.size(), 24U) | EXPECT_DOUBLE_EQ(displacement[0U], 1.0) | EXPECT_DOUBLE_EQ(displacement[1U], -1.0) | EXPECT_DOUBLE_EQ(displacement[2U], 0.5) | EXPECT_DOUBLE_EQ(displacement[5U], 0.1)" "ASSERT_TRUE(status.IsOk()) | ASSERT_GE(file.Get(), 0) | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U) | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""feature_id""), ""nonlinear-static-newton-raphson"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""analysis_procedure""), ""nonlinear-static-full-newton"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""internal_formulation""), ""FESA-MITC4-total-lagrangian"") | EXPECT_EQ(ReadStringAttribute(metadata.Get(), ""integration_rule""), ""2x2x2-gauss; mitc4-edge-midpoint-shear"") | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""factor_zero_is_frame""), 0U) | EXPECT_DOUBLE_EQ(ReadDoubleAttribute(metadata.Get(), ""factor_zero_load_factor""), 0.0) | EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/accepted_frames""), std::vector({2U})) | ASSERT_EQ(frames.size(), 2U) | EXPECT_EQ(frames[0U].frame_index, 0U) | EXPECT_EQ(frames[0U].increment_index, 1U) | EXPECT_DOUBLE_EQ(frames[0U].load_factor, 0.5) | EXPECT_EQ(frames[0U].is_factor_one, 0U) | EXPECT_EQ(frames[1U].frame_index, 1U) | EXPECT_EQ(frames[1U].increment_index, 2U) | EXPECT_DOUBLE_EQ(frames[1U].load_factor, 1.0) | EXPECT_EQ(frames[1U].is_factor_one, 1U) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/trial_history"", H5P_DEFAULT), 0) | EXPECT_EQ(H5Lexists(file.Get(), ""/surface_pressure"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/displacement""), std::vector({4U, 6U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/nodal/triad""), std::vector({4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/local_frame""), std::vector({1U, 4U, 3U, 3U})) | EXPECT_EQ(DatasetDimensions(file.Get(), root + ""/element/shell/stress""), std::vector({1U, 4U, 3U, 3U})) | ASSERT_EQ(displacement.size(), 24U) | EXPECT_DOUBLE_EQ(displacement[0U], 1.0) | EXPECT_DOUBLE_EQ(displacement[1U], -1.0) | EXPECT_DOUBLE_EQ(displacement[2U], 0.5) | EXPECT_DOUBLE_EQ(displacement[5U], 0.1)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.ProjectsRotationalReactionToSpatialMoment 유지 원문 검사 body 및 assertion 동일. 1c90a2968f7f21a035b54b532d62081f4554455b2b91eae22cf861ca9fea1f9f 1c90a2968f7f21a035b54b532d62081f4554455b2b91eae22cf861ca9fea1f9f ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_EQ(reaction.size(), 24U) | EXPECT_NEAR(reaction[3U], (1.0 - quadratic * theta * theta) * 40.0 - 0.5 * theta * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[4U], 0.5 * theta * 40.0 + (1.0 - quadratic * theta * theta) * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[5U], 60.0, 1.0e-12) | EXPECT_GT(quadratic, 0.0) ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | ASSERT_EQ(reaction.size(), 24U) | EXPECT_NEAR(reaction[3U], (1.0 - quadratic * theta * theta) * 40.0 - 0.5 * theta * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[4U], 0.5 * theta * 40.0 + (1.0 - quadratic * theta * theta) * 50.0, 1.0e-12) | EXPECT_NEAR(reaction[5U], 60.0, 1.0e-12) | EXPECT_GT(quadratic, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation 유지 원문 검사 body 및 assertion 동일. a001400599ab1442b5c7632e39ec02422a0e5cf4a4420a822d640291fc3bdbd9 a001400599ab1442b5c7632e39ec02422a0e5cf4a4420a822d640291fc3bdbd9 "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/frames/1/global/equilibrium""), std::vector({6U})) | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""component_names""), ""FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3"") | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""location""), ""global-balance-error"") | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()) | EXPECT_EQ(DatasetDimensions(file.Get(), ""/steps/Step-1/frames/1/global/equilibrium""), std::vector({6U})) | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""component_names""), ""FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3"") | EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), ""location""), ""global-balance-error"") | ASSERT_GE(metadata.Get(), 0) | EXPECT_EQ(ReadUint64Attribute(metadata.Get(), ""schema_version""), 1U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.StoresSortedDiagnosticsThroughBackendNeutralBoundary NonlinearHdf5ResultsWriter.StoresSortedDiagnosticsThroughBackendNeutralBoundary; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.StoresSortedDiagnosticsThroughBackendNeutralBoundary 유지 원문 검사 body 및 assertion 동일. 33864ae859f75ea2126a078c47ba665e8bb37b0dd807025395fa77b74be284bf 33864ae859f75ea2126a078c47ba665e8bb37b0dd807025395fa77b74be284bf "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].code, ""earlier"") | EXPECT_EQ(rows[0U].line, 10U) | EXPECT_STREQ(rows[1U].code, ""later"") | EXPECT_EQ(rows[1U].line, 20U)" "ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, diagnostics) .IsOk()) | ASSERT_EQ(rows.size(), 2U) | EXPECT_STREQ(rows[0U].code, ""earlier"") | EXPECT_EQ(rows[0U].line, 10U) | EXPECT_STREQ(rows[1U].code, ""later"") | EXPECT_EQ(rows[1U].line, 20U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal; assertion 6개 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp NonlinearHdf5ResultsWriter.CandidateFinalizationFailurePreservesPriorFinal 유지 원문 검사 body 및 assertion 동일. eb1576644b3e7a2bf28dd63899e0cccf1bd2a8568b4ab593940c67d510aa21c2 eb1576644b3e7a2bf28dd63899e0cccf1bd2a8568b4ab593940c67d510aa21c2 "ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output), sentinel)" "ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""hdf5-finalization-failure"") | EXPECT_EQ(ReadBytes(output), sentinel)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@1-429 helper/oracle/fixture/include/static assertion 구간: TempDirectory, if, WinHandle, Fixture, AcceptedFrameRow, DiagnosticRow, MakeDefinition, MakeBaseline, MakeShellRow, MakeShellRows, MakeFrame, MakeFixture, OpenFile, OpenDataset, DatasetDimensions, ReadStringAttribute, ReadUint64Attribute, ReadDoubleAttribute, ReadDoubleDataset, for, AcceptedFrameMemoryType, ReadAcceptedFrames, DiagnosticMemoryType, ReadDiagnostics, ReclaimDiagnostics, ReadBytes, WriteBytes tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6c65598390ba6c2d70dbd49ab2e1b14b76803f926878fd1e6495864508bbc051 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@509-510 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8f00d12532be48bbd8d5776bf02cee4d6a243f6225365268e06f4dc268138fa4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@537-538 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e08a00bd74875e33bb07f7be527593f2d4349951e703f865eb04b1e9499e2bbd 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@562-563 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a6d0aa9192bf7f01ce6aab9505a2149836668f2461c70984035f857a43eb68e6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp support@596-597 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cc12e7c3af34a0df4e68a34067bc8e98d4da457614c478a52170cc0c9151b3b6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 14개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0e288ede59628ee0256258206f78ba4830a13b65c68d9a42125b767bf15fed78 0e288ede59628ee0256258206f78ba4830a13b65c68d9a42125b767bf15fed78 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AllFiveActualApiOutcomesHaveIndependentOfficialSchema SolidHdf5ResultsWriter.AllFiveActualApiOutcomesHaveIndependentOfficialSchema; assertion 21개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AllFiveActualApiOutcomesHaveIndependentOfficialSchema 유지 원문 검사 body 및 assertion 동일. ae7d81086077cec63255ebbb050d057332d3d2303be88998f8ff571d28237340 ae7d81086077cec63255ebbb050d057332d3d2303be88998f8ff571d28237340 "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(Attr(metadata.Get(), ""analysis_procedure""), solid_output_test::Procedure(p)) | EXPECT_EQ(Attr(metadata.Get(), ""feature_id""), ""hex8-structural-analysis"") | EXPECT_EQ(Attr(metadata.Get(), ""source_step_name""), ""RawSolid"") | EXPECT_EQ(Attr(metadata.Get(), ""element_formulation""), ""FESA-Hex8"") | EXPECT_EQ(Attr(metadata.Get(), ""integration_rule""), ""gauss-2x2x2"") | EXPECT_EQ(Attr(metadata.Get(), ""mass_formulation""), ""lumped-reference"") | EXPECT_EQ(Attr(metadata.Get(), ""component_order""), ""node-major; UX,UY,UZ"") | EXPECT_GT(H5Tequal(masktype.Get(), H5T_STD_U8LE), 0) | EXPECT_EQ(Attr(mask.Get(), ""component_names""), ""UX,UY,UZ"") | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_EQ(Attr(dataset.Get(), ""component_names""), std::get<1>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""unit_dimensions""), std::get<2>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""location""), ""global"") | EXPECT_EQ(Attr(dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(H5Aexists(dataset.Get(), ""frame_index""), 0) | EXPECT_EQ(H5Aexists(dataset.Get(), ""step_name""), 0) | ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_EQ( H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file.Get(), (root + ""/nodal/displacement_low"").c_str(), H5P_DEFAULT), 0)" "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(file.Get(), 0) | EXPECT_EQ(Attr(metadata.Get(), ""analysis_procedure""), solid_output_test::Procedure(p)) | EXPECT_EQ(Attr(metadata.Get(), ""feature_id""), ""hex8-structural-analysis"") | EXPECT_EQ(Attr(metadata.Get(), ""source_step_name""), ""RawSolid"") | EXPECT_EQ(Attr(metadata.Get(), ""element_formulation""), ""FESA-Hex8"") | EXPECT_EQ(Attr(metadata.Get(), ""integration_rule""), ""gauss-2x2x2"") | EXPECT_EQ(Attr(metadata.Get(), ""mass_formulation""), ""lumped-reference"") | EXPECT_EQ(Attr(metadata.Get(), ""component_order""), ""node-major; UX,UY,UZ"") | EXPECT_GT(H5Tequal(masktype.Get(), H5T_STD_U8LE), 0) | EXPECT_EQ(Attr(mask.Get(), ""component_names""), ""UX,UY,UZ"") | EXPECT_EQ(H5Lexists(file.Get(), ""/steps/Step-1/frames"", H5P_DEFAULT), 0) | EXPECT_EQ(Attr(dataset.Get(), ""component_names""), std::get<1>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""unit_dimensions""), std::get<2>(quantity)) | EXPECT_EQ(Attr(dataset.Get(), ""location""), ""global"") | EXPECT_EQ(Attr(dataset.Get(), ""coordinate_system""), ""global-cartesian"") | EXPECT_EQ(H5Aexists(dataset.Get(), ""frame_index""), 0) | EXPECT_EQ(H5Aexists(dataset.Get(), ""step_name""), 0) | ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_EQ( H5Lexists(file.Get(), ""/steps/Step-1/accepted_frames"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file.Get(), (root + ""/nodal/displacement_low"").c_str(), H5P_DEFAULT), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.EveryProcedurePreservesPreviousFinalAcrossLifecycleFailures SolidHdf5ResultsWriter.EveryProcedurePreservesPreviousFinalAcrossLifecycleFailures; assertion 3개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.EveryProcedurePreservesPreviousFinalAcrossLifecycleFailures 유지 원문 검사 body 및 assertion 동일. 54758e848f8b701836e7fb82b83cfd0959b5e4f36e413871563d59a6389f21ef 54758e848f8b701836e7fb82b83cfd0959b5e4f36e413871563d59a6389f21ef "EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_EQ(entry.path().filename().string().find(""candidate""), std::string::npos)" "EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_EQ(entry.path().filename().string().find(""candidate""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.MalformedWholePairsAndIdentityFailBeforeCandidateCreation SolidHdf5ResultsWriter.MalformedWholePairsAndIdentityFailBeforeCandidateCreation; assertion 5개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.MalformedWholePairsAndIdentityFailBeforeCandidateCreation 유지 원문 검사 body 및 assertion 동일. 3d420563bb51f0e354d37714b86fc487aa097ba8f142014c043488d8c4bf78d6 3d420563bb51f0e354d37714b86fc487aa097ba8f142014c043488d8c4bf78d6 EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalColumnsRemainZeroBasedAndRejectInvalidInventory SolidHdf5ResultsWriter.ModalColumnsRemainZeroBasedAndRejectInvalidInventory; assertion 4개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalColumnsRemainZeroBasedAndRejectInvalidInventory 유지 원문 검사 body 및 assertion 동일. 58160b675d06a1d926ce01fbdcd204944fd73fa1246838cb4245069a58346ec5 58160b675d06a1d926ce01fbdcd204944fd73fa1246838cb4245069a58346ec5 ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) ASSERT_EQ(state.eigenpair_checks[0].solver_column, 0u) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) | EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackRejectsMalformedTypesShapesValuesAndSourceIds SolidHdf5ResultsWriter.ReadbackRejectsMalformedTypesShapesValuesAndSourceIds; assertion 2개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackRejectsMalformedTypesShapesValuesAndSourceIds 유지 원문 검사 body 및 assertion 동일. 98f12927edcaf6e819ce0efdc429254416e9c0b6d37361830ab53bb7d6c1b9bb 98f12927edcaf6e819ce0efdc429254416e9c0b6d37361830ab53bb7d6c1b9bb EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackMatchesActualAcceptedValuesAndFullPairObservables SolidHdf5ResultsWriter.ReadbackMatchesActualAcceptedValuesAndFullPairObservables; assertion 6개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ReadbackMatchesActualAcceptedValuesAndFullPairObservables 유지 원문 검사 body 및 assertion 동일. 9489cb16f1d352cdb05ead2678289c28d3757ca8717121b5d49f4e4763c16427 9489cb16f1d352cdb05ead2678289c28d3757ca8717121b5d49f4e4763c16427 "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(dataset.Get(), 0) | ASSERT_GE(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values.data()), 0) | EXPECT_EQ(values, expected) | EXPECT_EQ(Attr(metadata.Get(), ""source_input_identity""), SourceInputIdentity(actual.input.domain)) | EXPECT_TRUE(nonzero_low)" "ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE(dataset.Get(), 0) | ASSERT_GE(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values.data()), 0) | EXPECT_EQ(values, expected) | EXPECT_EQ(Attr(metadata.Get(), ""source_input_identity""), SourceInputIdentity(actual.input.domain)) | EXPECT_TRUE(nonzero_low)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.FailureRecordsAreLoggedAndLogFailureTakesPrecedence SolidPreparedAnalysis.FailureRecordsAreLoggedAndLogFailureTakesPrecedence; assertion 9개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.FailureRecordsAreLoggedAndLogFailureTakesPrecedence 유지 원문 검사 body 및 assertion 동일. 86020491b9f15bef285a8c66ff73296c53f87c05bf88bde9e31ceae039b16613 86020491b9f15bef285a8c66ff73296c53f87c05bf88bde9e31ceae039b16613 "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), closed ? FailureCategory::kOutput : FailureCategory::kSolver) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_NE(text.find(""injected-tangent-failure""), std::string::npos) | EXPECT_EQ(text.find(""rotation""), std::string::npos) | EXPECT_NE(text.find(""stage=""), std::string::npos)" "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_TRUE(log.Close().IsOk()) | ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), closed ? FailureCategory::kOutput : FailureCategory::kSolver) | ASSERT_TRUE(log.Close().IsOk()) | EXPECT_NE(text.find(""injected-tangent-failure""), std::string::npos) | EXPECT_EQ(text.find(""rotation""), std::string::npos) | EXPECT_NE(text.find(""stage=""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingSolidAdapterFailsWithoutLegacyDispatch SolidPreparedAnalysis.MissingSolidAdapterFailsWithoutLegacyDispatch; assertion 6개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingSolidAdapterFailsWithoutLegacyDispatch 유지 원문 검사 body 및 assertion 동일. 49053fc528ba887b5f048281c18c912aa09ae411cabbb474074bbc2f15ab91c8 49053fc528ba887b5f048281c18c912aa09ae411cabbb474074bbc2f15ab91c8 "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""missing-solid-executor"") | EXPECT_TRUE(log.Close().IsOk())" "ASSERT_TRUE(input.HasValue()) | ASSERT_TRUE(log.Open(files.log).IsOk()) | ASSERT_FALSE(result.HasValue()) | ASSERT_FALSE(result.GetStatus().Diagnostics().empty()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""missing-solid-executor"") | EXPECT_TRUE(log.Close().IsOk())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnsupportedEnvironmentAfterCallbackCannotPublish SolidHdf5ResultsWriter.UnsupportedEnvironmentAfterCallbackCannotPublish; assertion 2개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnsupportedEnvironmentAfterCallbackCannotPublish 유지 원문 검사 body 및 assertion 동일. e451c9a755119b6d30517cfadffc36c7fefd922c053ce1aac059d333adc5e7f5 e451c9a755119b6d30517cfadffc36c7fefd922c053ce1aac059d333adc5e7f5 EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingWriterPreservesFinalForEveryTypedOutcome SolidPreparedAnalysis.MissingWriterPreservesFinalForEveryTypedOutcome; assertion 5개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidPreparedAnalysis.MissingWriterPreservesFinalForEveryTypedOutcome 유지 원문 검사 body 및 assertion 동일. 7fe8c186182faf22af563656dd32beca34da0788bfe309672f51cb685820abf2 7fe8c186182faf22af563656dd32beca34da0788bfe309672f51cb685820abf2 "ASSERT_TRUE(paths.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-solid-writer"") | EXPECT_EQ(Bytes(files.output), previous)" "ASSERT_TRUE(paths.HasValue()) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_EQ(status.Diagnostics()[0].code, ""missing-solid-writer"") | EXPECT_EQ(Bytes(files.output), previous)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidNewtonIterationLog.InvalidScalarEvidencePermanentlyFailsLogLifecycle SolidNewtonIterationLog.InvalidScalarEvidencePermanentlyFailsLogLifecycle; assertion 3개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidNewtonIterationLog.InvalidScalarEvidencePermanentlyFailsLogLifecycle 유지 원문 검사 body 및 assertion 동일. 98a859ab027cf906fe55ec13bd07e191939707a511ef7786e84dbd3040963b47 98a859ab027cf906fe55ec13bd07e191939707a511ef7786e84dbd3040963b47 ASSERT_TRUE(log.Open(files.log).IsOk()) | EXPECT_FALSE(log.Write(record).IsOk()) | EXPECT_FALSE(log.Close().IsOk()) ASSERT_TRUE(log.Open(files.log).IsOk()) | EXPECT_FALSE(log.Write(record).IsOk()) | EXPECT_FALSE(log.Close().IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AbsentStaticDensityIsAnExplicitPlaceholder SolidHdf5ResultsWriter.AbsentStaticDensityIsAnExplicitPlaceholder; assertion 5개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.AbsentStaticDensityIsAnExplicitPlaceholder 유지 원문 검사 body 및 assertion 동일. eb6860aba8052654eaa827dfd208c58761976beb7d042b8529d9544036d904fe eb6860aba8052654eaa827dfd208c58761976beb7d042b8529d9544036d904fe ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE( H5Dread(dataset.Get(), type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &row), 0) | EXPECT_EQ(row.present, 0) | EXPECT_EQ(row.rho, 0) ASSERT_NE(position, std::string::npos) | ASSERT_TRUE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics) .IsOk()) | ASSERT_GE( H5Dread(dataset.Get(), type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &row), 0) | EXPECT_EQ(row.present, 0) | EXPECT_EQ(row.rho, 0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalPhysicalTableAttributeCorruptionPreservesFinal SolidHdf5ResultsWriter.ModalPhysicalTableAttributeCorruptionPreservesFinal; assertion 2개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.ModalPhysicalTableAttributeCorruptionPreservesFinal 유지 원문 검사 body 및 assertion 동일. 5ab99b0ef2a17dd81d8b67396fa3ad3fcaafcc82c55b1a90ba8ebc161b3c057a 5ab99b0ef2a17dd81d8b67396fa3ad3fcaafcc82c55b1a90ba8ebc161b3c057a EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) EXPECT_FALSE(WriteSolidFile(files.output, actual.input.domain, View(actual), actual.input.diagnostics, hooks) .IsOk()) | EXPECT_EQ(Bytes(files.output), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnselectedBackendPairsCannotPublishInvalidSpectrumOrDimension SolidHdf5ResultsWriter.UnselectedBackendPairsCannotPublishInvalidSpectrumOrDimension; assertion 9개 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp SolidHdf5ResultsWriter.UnselectedBackendPairsCannotPublishInvalidSpectrumOrDimension 유지 원문 검사 body 및 assertion 동일. 1ebcf9e3ecd6d2f12eefd8b99060546b7a12f4b64c9542a7d7550aa384b095f7 1ebcf9e3ecd6d2f12eefd8b99060546b7a12f4b64c9542a7d7550aa384b095f7 "ASSERT_NE(position, std::string::npos) | ASSERT_EQ(state.modes.size(), 1u) | ASSERT_EQ(state.free_dof_count, 3u) | ASSERT_GT(state.eigenpair_checks.size(), state.modes.size()) | ASSERT_LE(state.eigenpair_checks.size(), state.free_dof_count) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(message.find(failure == 0 ? ""Significant negative"" : failure == 1 ? ""not sorted"" : ""inventory""), std::string::npos) | EXPECT_EQ(Bytes(files.output), previous)" "ASSERT_NE(position, std::string::npos) | ASSERT_EQ(state.modes.size(), 1u) | ASSERT_EQ(state.free_dof_count, 3u) | ASSERT_GT(state.eigenpair_checks.size(), state.modes.size()) | ASSERT_LE(state.eigenpair_checks.size(), state.free_dof_count) | ASSERT_FALSE(status.IsOk()) | ASSERT_FALSE(status.Diagnostics().empty()) | EXPECT_NE(message.find(failure == 0 ? ""Significant negative"" : failure == 1 ? ""not sorted"" : ""inventory""), std::string::npos) | EXPECT_EQ(Bytes(files.output), previous)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp support@1-201 helper/oracle/fixture/include/static assertion 구간: fesa, Actual, Execute, View, Bytes, Existing, Attr, if, T, NumberAttr, DatasetContract tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 30faf6dcced8c34ede79a8a792a5a29b740098278d5aeb4cb11c773b900aa404 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp support@621-635 helper/oracle/fixture/include/static assertion 구간: FailedTangent tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ad8ea87f0e4a9587417928c0cf809d07c3041883e55d95ad345315ff70ebd9a2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp support@874-874 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/solid_output_test_fixture.h file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 0개 tests/unit/io/hdf5/solid_output_test_fixture.h file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f55daaac80ffbb33f56431eb37931b48dc0202107b74e298254f9fcd2a2e5977 f55daaac80ffbb33f56431eb37931b48dc0202107b74e298254f9fcd2a2e5977 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/solid_output_test_fixture.h support@1-58 helper/oracle/fixture/include/static assertion 구간: solid_output_test, Deck, Files, Procedure tests/unit/io/hdf5/solid_output_test_fixture.h file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 9e7195cd7096815c237160ff0315fabca314fe8068ef1ea88751543cac732307 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 13개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 576b253a222e41e7b8bd6643a47706eec1ed333eaf5a09c2206b89ef1bb06895 576b253a222e41e7b8bd6643a47706eec1ed333eaf5a09c2206b89ef1bb06895 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.WritesRawInitialAndCompletedZeroReactionHistory ThermalHdf5ResultsWriter.WritesRawInitialAndCompletedZeroReactionHistory; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.WritesRawInitialAndCompletedZeroReactionHistory 유지 원문 검사 body 및 assertion 동일. 038005b1d8bbe2f803b404dbb53962ec9300408b40327a0b0e90f5e4a3a7f679 038005b1d8bbe2f803b404dbb53962ec9300408b40327a0b0e90f5e4a3a7f679 "ASSERT_TRUE(result.IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/0/nodal/temperature"", H5P_DEFAULT), 0) | EXPECT_LE(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file, ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/3/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/3/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Fclose(file), -1)" "ASSERT_TRUE(result.IsOk()) | ASSERT_GE(file, 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/0/nodal/temperature"", H5P_DEFAULT), 0) | EXPECT_LE(H5Lexists(file, ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_LE( H5Lexists(file, ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Lexists(file, ""/steps/Step-1/frames/3/nodal/reaction_heat_rate"", H5P_DEFAULT), 0) | EXPECT_GT( H5Lexists(file, ""/steps/Step-1/frames/3/element/heat_flux"", H5P_DEFAULT), 0) | EXPECT_GT(H5Fclose(file), -1)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.SectionMaterialUsesGlobalMaterialIdentity ThermalHdf5ResultsWriter.SectionMaterialUsesGlobalMaterialIdentity; assertion 11개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.SectionMaterialUsesGlobalMaterialIdentity 유지 원문 검사 body 및 assertion 동일. 96c91419cb1cd6966a695185c69a1c372da0516eb31c6a71f9db7f987dd767b9 96c91419cb1cd6966a695185c69a1c372da0516eb31c6a71f9db7f987dd767b9 "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Tinsert(t.Get(), ""material_internal_id"", 0, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dread(d.Get(), t.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &id), 0) | EXPECT_EQ(id, 1U) | ASSERT_GE(H5Tset_size(utf8.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(utf8.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(source_type.Get(), ""source_file"", 0, utf8.Get()), 0) | ASSERT_GE(H5Dread(d.Get(), source_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &source), 0) | ASSERT_NE(source, nullptr) | EXPECT_EQ(std::string{source}, std::filesystem::absolute(""thermal-writer.inp"") .lexically_normal() .generic_u8string()) | EXPECT_GE(H5free_memory(source), 0)" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Tinsert(t.Get(), ""material_internal_id"", 0, H5T_NATIVE_UINT64), 0) | ASSERT_GE(H5Dread(d.Get(), t.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &id), 0) | EXPECT_EQ(id, 1U) | ASSERT_GE(H5Tset_size(utf8.Get(), H5T_VARIABLE), 0) | ASSERT_GE(H5Tset_cset(utf8.Get(), H5T_CSET_UTF8), 0) | ASSERT_GE(H5Tinsert(source_type.Get(), ""source_file"", 0, utf8.Get()), 0) | ASSERT_GE(H5Dread(d.Get(), source_type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, &source), 0) | ASSERT_NE(source, nullptr) | EXPECT_EQ(std::string{source}, std::filesystem::absolute(""thermal-writer.inp"") .lexically_normal() .generic_u8string()) | EXPECT_GE(H5free_memory(source), 0)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsMissingMandatoryAttributesAndChangedValues ThermalHdf5ResultsWriter.RejectsMissingMandatoryAttributesAndChangedValues; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsMissingMandatoryAttributesAndChangedValues 유지 원문 검사 body 및 assertion 동일. 09fc93e87be7ffcef801a28fb026ccffcb2e9fef878c8141eba118171fdf4915 09fc93e87be7ffcef801a28fb026ccffcb2e9fef878c8141eba118171fdf4915 "EXPECT_GE(H5Adelete(m, ""source_input_identity""), 0) | EXPECT_GE(H5Adelete(d, ""units_label""), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, ids), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(f, 0) | ASSERT_GE(H5Fclose(f), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" "EXPECT_GE(H5Adelete(m, ""source_input_identity""), 0) | EXPECT_GE(H5Adelete(d, ""units_label""), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_UINT64, H5S_ALL, H5S_ALL, H5P_DEFAULT, ids), 0) | EXPECT_GE(H5Dwrite(d, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(f, 0) | ASSERT_GE(H5Fclose(f), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryRequiredAttributeIsCheckedBeforePublication ThermalHdf5ResultsWriter.EveryRequiredAttributeIsCheckedBeforePublication; assertion 7개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryRequiredAttributeIsCheckedBeforePublication 유지 원문 검사 body 및 assertion 동일. e8670b807a13f32a42fc3bdf7c7ba29a13005b801faafdb48830765ba95cd051 e8670b807a13f32a42fc3bdf7c7ba29a13005b801faafdb48830765ba95cd051 ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(file, 0) | ASSERT_GE(object, 0) | ASSERT_GE(H5Adelete(object, attribute.second.c_str()), 0) | ASSERT_GE(H5Oclose(object), 0) | ASSERT_GE(H5Fclose(file), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk()) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(file, 0) | ASSERT_GE(object, 0) | ASSERT_GE(H5Adelete(object, attribute.second.c_str()), 0) | ASSERT_GE(H5Oclose(object), 0) | ASSERT_GE(H5Fclose(file), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryCompoundFieldAndEveryDatasetIsMandatory ThermalHdf5ResultsWriter.EveryCompoundFieldAndEveryDatasetIsMandatory; assertion 6개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryCompoundFieldAndEveryDatasetIsMandatory 유지 원문 검사 body 및 assertion 동일. 2714b07516265d2c61e37c02651ac605c52a2e430bf95d6a59a176e923b72fbe 2714b07516265d2c61e37c02651ac605c52a2e430bf95d6a59a176e923b72fbe "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""Missing compound field""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Ldelete(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""Missing compound field""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Ldelete(file.Get(), path.c_str(), H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.ReorderedPackedAdditiveCompoundsAndFixedUtf8AreAccepted ThermalHdf5ResultsWriter.ReorderedPackedAdditiveCompoundsAndFixedUtf8AreAccepted; assertion 4개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.ReorderedPackedAdditiveCompoundsAndFixedUtf8AreAccepted 유지 원문 검사 body 및 assertion 동일. eb907cbc4c5980b7b1d09251862c47f1c54fd4b68029219bbc6ee5341c15707e eb907cbc4c5980b7b1d09251862c47f1c54fd4b68029219bbc6ee5341c15707e ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Tset_size(fixed.Get(), 16), 0) | ASSERT_GE(H5Tset_cset(fixed.Get(), H5T_CSET_UTF8), 0) | EXPECT_TRUE(checked.IsOk()) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | ASSERT_GE(H5Tset_size(fixed.Get(), 16), 0) | ASSERT_GE(H5Tset_cset(fixed.Get(), H5T_CSET_UTF8), 0) | EXPECT_TRUE(checked.IsOk()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongTypesArrayExtentsNonscalarAndNonUtf8Attributes ThermalHdf5ResultsWriter.RejectsWrongTypesArrayExtentsNonscalarAndNonUtf8Attributes; assertion 7개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongTypesArrayExtentsNonscalarAndNonUtf8Attributes 유지 원문 검사 body 및 assertion 동일. deb7ac11d4f8259f50d5d43317c188e2c36960898610bebc7a492eb8c58e4866 deb7ac11d4f8259f50d5d43317c188e2c36960898610bebc7a492eb8c58e4866 "ASSERT_GE(H5Adelete(g.Get(), ""is_initial""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_UINT8, data), 0) | ASSERT_GE(H5Adelete(g.Get(), ""time_period""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_DOUBLE, data), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""type/extent""), std::string::npos)" "ASSERT_GE(H5Adelete(g.Get(), ""is_initial""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_UINT8, data), 0) | ASSERT_GE(H5Adelete(g.Get(), ""time_period""), 0) | ASSERT_GE(H5Awrite(a.Get(), H5T_NATIVE_DOUBLE, data), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""type/extent""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongValuesFrameInventoriesNonfiniteAndDiagnostics ThermalHdf5ResultsWriter.RejectsWrongValuesFrameInventoriesNonfiniteAndDiagnostics; assertion 6개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RejectsWrongValuesFrameInventoriesNonfiniteAndDiagnostics 유지 원문 검사 body 및 assertion 동일. 32dc727108be7e7b965f1451c0142d9ebcb4671317da04f841ad33b9b57b2bcb 32dc727108be7e7b965f1451c0142d9ebcb4671317da04f841ad33b9b57b2bcb "ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ldelete(f, ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | ASSERT_GE( H5Lcreate_soft(""/missing"", f, ""/steps/Step-1/frames/0/element"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE(H5Dwrite(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" "ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ldelete(f, ""/steps/Step-1/frames/2"", H5P_DEFAULT), 0) | ASSERT_GE( H5Lcreate_soft(""/missing"", f, ""/steps/Step-1/frames/0/element"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE(H5Dwrite(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, values), 0) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, diagnostics) .IsOk()) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, diagnostics) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RotatedFramesAndEndpointCloseScheduleRoundTripIndependently ThermalHdf5ResultsWriter.RotatedFramesAndEndpointCloseScheduleRoundTripIndependently; assertion 12개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.RotatedFramesAndEndpointCloseScheduleRoundTripIndependently 유지 원문 검사 body 및 assertion 동일. 9b867d4ee386eecc3e31c6233f961cdd619a2c0736f7a11b7705cadeca1c0ccd 9b867d4ee386eecc3e31c6233f961cdd619a2c0736f7a11b7705cadeca1c0ccd ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Dread(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, frames.data()), 0) | EXPECT_DOUBLE_EQ(frames[i], expected[i % 9]) | ASSERT_GE(H5Aread(a.Get(), H5T_NATIVE_DOUBLE, &actual), 0) | EXPECT_EQ(actual, .3) | EXPECT_NE(actual, .9 - .6) | ASSERT_GE(H5Dread(initial.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, t), 0) | EXPECT_EQ(t[i], i < 5 ? -2 : 0) | ASSERT_GE( H5Dread(flux.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, q), 0) | EXPECT_EQ(q[3 * sample], static_cast(sample)) | EXPECT_EQ(q[3 * sample + 1], -static_cast(sample) - 3) | EXPECT_EQ(q[3 * sample + 2], 9) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(H5Dread(d.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, frames.data()), 0) | EXPECT_DOUBLE_EQ(frames[i], expected[i % 9]) | ASSERT_GE(H5Aread(a.Get(), H5T_NATIVE_DOUBLE, &actual), 0) | EXPECT_EQ(actual, .3) | EXPECT_NE(actual, .9 - .6) | ASSERT_GE(H5Dread(initial.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, t), 0) | EXPECT_EQ(t[i], i < 5 ? -2 : 0) | ASSERT_GE( H5Dread(flux.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, q), 0) | EXPECT_EQ(q[3 * sample], static_cast(sample)) | EXPECT_EQ(q[3 * sample + 1], -static_cast(sample) - 3) | EXPECT_EQ(q[3 * sample + 2], 9) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryFailedLifecycleBoundaryPreservesOldFinalAndCleansCandidate ThermalHdf5ResultsWriter.EveryFailedLifecycleBoundaryPreservesOldFinalAndCleansCandidate; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryFailedLifecycleBoundaryPreservesOldFinalAndCleansCandidate 유지 원문 검사 body 및 assertion 동일. 411e24e5bc006ee97ce6e6c3e648e3fd63cf72585b2fef2347a8cab364de86ba 411e24e5bc006ee97ce6e6c3e648e3fd63cf72585b2fef2347a8cab364de86ba "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(d.Get(), 0) | ASSERT_GE(H5Adelete(m.Get(), ""schema_version""), 0) | EXPECT_TRUE(std::filesystem::remove(candidate)) | EXPECT_FALSE(fesa::hdf5_internal::WriteThermalFile(out.Path(), *x.domain, x.state, {}, failures[i]) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | EXPECT_EQ(entry.path(), out.Path()) | EXPECT_EQ(files, 1U)" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(d.Get(), 0) | ASSERT_GE(H5Adelete(m.Get(), ""schema_version""), 0) | EXPECT_TRUE(std::filesystem::remove(candidate)) | EXPECT_FALSE(fesa::hdf5_internal::WriteThermalFile(out.Path(), *x.domain, x.state, {}, failures[i]) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | EXPECT_EQ(entry.path(), out.Path()) | EXPECT_EQ(files, 1U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.DomainMismatchAndIncompleteHistoryCannotReplaceFinal ThermalHdf5ResultsWriter.DomainMismatchAndIncompleteHistoryCannotReplaceFinal; assertion 8개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.DomainMismatchAndIncompleteHistoryCannotReplaceFinal 유지 원문 검사 body 및 assertion 동일. 737aebeffb93534d9acc0a723361a72396790b4f57424f2410fa23ce0807f0cf 737aebeffb93534d9acc0a723361a72396790b4f57424f2410fa23ce0807f0cf ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_TRUE(different.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), different.Value(), x.state, {}) .IsOk()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *partial.domain, partial.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | ASSERT_TRUE(changed_g.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), changed_g.Value(), prescribed.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_TRUE(different.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), different.Value(), x.state, {}) .IsOk()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *partial.domain, partial.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) | ASSERT_TRUE(changed_g.HasValue()) | EXPECT_FALSE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), changed_g.Value(), prescribed.state, {}) .IsOk()) | EXPECT_EQ(Bytes(out.Path()), previous) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryPrimitiveDatasetChecksShapeTypeAndValue ThermalHdf5ResultsWriter.EveryPrimitiveDatasetChecksShapeTypeAndValue; assertion 7개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.EveryPrimitiveDatasetChecksShapeTypeAndValue 유지 원문 검사 body 및 assertion 동일. 94f20f584c491bbde83edeabb6d369a9358a4227a25e8a17f615b9aa2ff6e045 94f20f584c491bbde83edeabb6d369a9358a4227a25e8a17f615b9aa2ff6e045 "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos) | EXPECT_NE(Message(checked).find(""primitive type""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos)" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos) | EXPECT_NE(Message(checked).find(""primitive type""), std::string::npos) | ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | EXPECT_FALSE(checked.IsOk()) | EXPECT_NE(Message(checked).find(""extent""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.InitialRecoveryCannotBeFilledWithCompletedZeros ThermalHdf5ResultsWriter.InitialRecoveryCannotBeFilledWithCompletedZeros; assertion 5개 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp ThermalHdf5ResultsWriter.InitialRecoveryCannotBeFilledWithCompletedZeros 유지 원문 검사 body 및 assertion 동일. 0f30c83325b2edbf6f637c4324d4c8b85cf15189fb03798a5c2fa52eac8ae6ea 0f30c83325b2edbf6f637c4324d4c8b85cf15189fb03798a5c2fa52eac8ae6ea "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/element/heat_flux"", f.Get(), ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE( H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/nodal/reaction_heat_rate"", f.Get(), ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT, H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" "ASSERT_TRUE(fesa::ThermalHdf5ResultsWriter{} .Write(out.Path(), *x.domain, x.state, {}) .IsOk()) | ASSERT_GE(g.Get(), 0) | ASSERT_GE(H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/element/heat_flux"", f.Get(), ""/steps/Step-1/frames/0/element/heat_flux"", H5P_DEFAULT, H5P_DEFAULT), 0) | ASSERT_GE( H5Ocopy(f.Get(), ""/steps/Step-1/frames/1/nodal/reaction_heat_rate"", f.Get(), ""/steps/Step-1/frames/0/nodal/reaction_heat_rate"", H5P_DEFAULT, H5P_DEFAULT), 0) | EXPECT_FALSE(fesa::hdf5_internal::SelfCheckThermalFile( out.Path(), *x.domain, x.state, {}) .IsOk())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp support@1-313 helper/oracle/fixture/include/static assertion 구간: Definition, Fixture, Make, Temp, Path, Message, Bytes, Diagnostics, CollectAttribute, CopyAttributes, for, RewriteCompound, if, T, WriteColumn, StringAttribute, ReplacePrimitive, ChangePrimitive tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f3c40b4b5f52a1a45372592be54b1b910b2f1d1d1f25c305049ab22e15768cd6 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp support@810-815 helper/oracle/fixture/include/static assertion 구간: FailedClose tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 192b1bf23c67a96f66846de9e9b50e917d5a4347cd052fa681b3a34b2f05b181 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp support@993-993 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/loads/load_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/loads/load_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. ce8c7aa7d0372bf0cd2f1627ed19cc2b1c603240d03517e959169eb746f8dd64 ce8c7aa7d0372bf0cd2f1627ed19cc2b1c603240d03517e959169eb746f8dd64 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadEmitsStableFullDofContributions Load.ConcentratedNodalLoadEmitsStableFullDofContributions; assertion 7개 tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadEmitsStableFullDofContributions 유지 원문 검사 body 및 assertion 동일. 2ccf11bb0f56a9bf2a474ee028662ee0d6d8c21e6c25c2fc9c3e3e24dc116eb3 2ccf11bb0f56a9bf2a474ee028662ee0d6d8c21e6c25c2fc9c3e3e24dc116eb3 ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 12U) | EXPECT_EQ(contribution.source_order, 7U) | EXPECT_EQ(contribution.full_dof_index, node * components.size() + component) | EXPECT_DOUBLE_EQ(contribution.value, components[component]) ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) | ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().size(), 12U) | EXPECT_EQ(contribution.source_order, 7U) | EXPECT_EQ(contribution.full_dof_index, node * components.size() + component) | EXPECT_DOUBLE_EQ(contribution.value, components[component]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions; assertion 2개 tests/unit/loads/load_test.cpp Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions 유지 원문 검사 body 및 assertion 동일. c3c7d3455b3f5352f0c13fbf53c73ff736c3a35d764cd20f952f5e34466609fa c3c7d3455b3f5352f0c13fbf53c73ff736c3a35d764cd20f952f5e34466609fa ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) ASSERT_TRUE(model.HasValue()) | ASSERT_TRUE(dofs.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/load_test.cpp support@1-49 helper/oracle/fixture/include/static assertion 구간: MakeDomain, if, ExpectFailureCode tests/unit/loads/load_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e237ce80f9cbe95cd5979cd1db9a7989577e0dc5510ac16003d902aa2eafb08a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/loads/shell_surface_pressure_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/loads/shell_surface_pressure_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 094f2106b557380c45c24cf92d2f4b860ece37d53faea45b704bfd456be26945 094f2106b557380c45c24cf92d2f4b860ece37d53faea45b704bfd456be26945 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment 유지 원문 검사 body 및 assertion 동일. f6a885c1167ddcbc8e2baf4601ea82653d59f4f3b981f6d395081374e93b7413 f6a885c1167ddcbc8e2baf4601ea82653d59f4f3b981f6d395081374e93b7413 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude; assertion 4개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude 유지 원문 검사 body 및 assertion 동일. 87fe2f501765003b1a98bf624ccfb5d2d6678dfd6d3e073601f2e3d643229c13 87fe2f501765003b1a98bf624ccfb5d2d6678dfd6d3e073601f2e3d643229c13 EXPECT_DOUBLE_EQ(sneg.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(negative.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(sneg.external_tangent[index], -spos.external_tangent[index]) | EXPECT_DOUBLE_EQ(negative.external_tangent[index], -spos.external_tangent[index]) EXPECT_DOUBLE_EQ(sneg.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(negative.force[index], -spos.force[index]) | EXPECT_DOUBLE_EQ(sneg.external_tangent[index], -spos.external_tangent[index]) | EXPECT_DOUBLE_EQ(negative.external_tangent[index], -spos.external_tangent[index]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent 유지 원문 검사 body 및 assertion 동일. 6df3b7fe71338797c8f6097a473832beafa3089671066636ca75e8bca3b987f7 6df3b7fe71338797c8f6097a473832beafa3089671066636ca75e8bca3b987f7 EXPECT_EQ(with_displacement.force, without_displacement.force) | EXPECT_EQ(value, 0.0) EXPECT_EQ(with_displacement.force, without_displacement.force) | EXPECT_EQ(value, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce 유지 원문 검사 body 및 assertion 동일. 742615c05c1bc269305f36ae87a6697fe65fd72435d10c586b6014847cd341ba 742615c05c1bc269305f36ae87a6697fe65fd72435d10c586b6014847cd341ba 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks 유지 원문 검사 body 및 assertion 동일. 8d1c94d3b2b280fcd624c066f984ebf716dce5a75b9eb50cbdfa7db3bf81b3f7 8d1c94d3b2b280fcd624c066f984ebf716dce5a75b9eb50cbdfa7db3bf81b3f7 EXPECT_EQ(contribution.force[row], 0.0) | EXPECT_EQ(contribution.external_tangent[row * kDofCount + column], 0.0) EXPECT_EQ(contribution.force[row], 0.0) | EXPECT_EQ(contribution.external_tangent[row * kDofCount + column], 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective; assertion 1개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective 유지 원문 검사 body 및 assertion 동일. 05b4e1eacac15e74c7f5645bfbccd96c0ab08dca4dd74eb6fcbee49c16daaaa5 05b4e1eacac15e74c7f5645bfbccd96c0ab08dca4dd74eb6fcbee49c16daaaa5 EXPECT_NEAR(actual, expected, 1.0e-12) EXPECT_NEAR(actual, expected, 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling 유지 원문 검사 body 및 assertion 동일. ca803fdcc621df980fbb68f74a2f58637161c96934d111e03221c7145bb576ba ca803fdcc621df980fbb68f74a2f58637161c96934d111e03221c7145bb576ba EXPECT_NEAR(relabeled.force[row], original.force[original_row], 1.0e-12) | EXPECT_NEAR(relabeled.external_tangent[row * kDofCount + column], original.external_tangent[original_row * kDofCount + original_column], 1.0e-12) EXPECT_NEAR(relabeled.force[row], original.force[original_row], 1.0e-12) | EXPECT_NEAR(relabeled.external_tangent[row * kDofCount + column], original.external_tangent[original_row * kDofCount + original_column], 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns; assertion 2개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns 유지 원문 검사 body 및 assertion 동일. dd09d801d862e32fa0409aacff9a835233c61c4f4c7061387b26285589ddf9a0 dd09d801d862e32fa0409aacff9a835233c61c4f4c7061387b26285589ddf9a0 ASSERT_GT(direction_scale, 0.0) | ASSERT_GT(scale, 0.0) ASSERT_GT(direction_scale, 0.0) | ASSERT_GT(scale, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent; assertion 3개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent 유지 원문 검사 body 및 assertion 동일. 6ac36ad2369fd30335c8d818991d31c435ccfd968051fff43160f486090f9ffe 6ac36ad2369fd30335c8d818991d31c435ccfd968051fff43160f486090f9ffe EXPECT_NE(xz, 0.0) | EXPECT_NE(zx, 0.0) | EXPECT_DOUBLE_EQ(xz, -zx) EXPECT_NE(xz, 0.0) | EXPECT_NE(zx, 0.0) | EXPECT_DOUBLE_EQ(xz, -zx) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint 유지 원문 검사 body 및 assertion 동일. 24d345beb376e5620bf884b8ea0190d3c9e308e0e7b90bece6e143929fd3abdd 24d345beb376e5620bf884b8ea0190d3c9e308e0e7b90bece6e143929fd3abdd 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor; assertion 0개 tests/unit/loads/shell_surface_pressure_test.cpp ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor 유지 원문 검사 body 및 assertion 동일. 09b7acaf930fe99ec2cef7ccfa01ef7928b9a54333feb71791e9a13c0d35de37 09b7acaf930fe99ec2cef7ccfa01ef7928b9a54333feb71791e9a13c0d35de37 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/loads/shell_surface_pressure_test.cpp support@1-215 helper/oracle/fixture/include/static assertion 구간: PlanarInput, DistortedCurrentInput, EvaluateOrThrow, if, ForceAt, SumForce, MomentAboutOrigin, Norm, for, ExpectVectorRelative, ExpectArraysRelative, TangentAction, ChordLength, Rotate, ProperRotation, RotateInput, ExpectFailure tests/unit/loads/shell_surface_pressure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 78431ddeb801a8e24b974e8f45471a809df750f50df392e341b26471f651c80f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/loads/shell_surface_pressure_test.cpp support@512-513 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/loads/shell_surface_pressure_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/materials/material_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/materials/material_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0e4f0a0beafc60dfc9ed3a016a544ed2b93a305867f8b820dc6817ebe58d8b7d 0e4f0a0beafc60dfc9ed3a016a544ed2b93a305867f8b820dc6817ebe58d8b7d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/materials/material_test.cpp Material.OwnsIsotropicElasticityThroughVirtualBase Material.OwnsIsotropicElasticityThroughVirtualBase; assertion 9개 tests/unit/materials/material_test.cpp Material.OwnsIsotropicElasticityThroughVirtualBase 유지 원문 검사 body 및 assertion 동일. 4a8b6d7c9c0bad72f99959a9fb02d195686bbb2b555313912866b19b3601c0d9 4a8b6d7c9c0bad72f99959a9fb02d195686bbb2b555313912866b19b3601c0d9 "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(material->Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(material->SourceId().source_label, 7) | EXPECT_EQ(material->SourceId().source_label_text, ""Steel"") | EXPECT_EQ(isotropic.Name(), ""Steel"") | EXPECT_DOUBLE_EQ(isotropic.YoungsModulus(), 210.0e9) | EXPECT_DOUBLE_EQ(isotropic.PoissonsRatio(), 0.3) | EXPECT_EQ(isotropic.Location().file, ""models/material.inp"") | EXPECT_EQ(isotropic.Location().line, 30U)" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(material->Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(material->SourceId().source_label, 7) | EXPECT_EQ(material->SourceId().source_label_text, ""Steel"") | EXPECT_EQ(isotropic.Name(), ""Steel"") | EXPECT_DOUBLE_EQ(isotropic.YoungsModulus(), 210.0e9) | EXPECT_DOUBLE_EQ(isotropic.PoissonsRatio(), 0.3) | EXPECT_EQ(isotropic.Location().file, ""models/material.inp"") | EXPECT_EQ(isotropic.Location().line, 30U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/materials/material_test.cpp Material.RejectsInvalidCurrentElasticFields Material.RejectsInvalidCurrentElasticFields; assertion 5개 tests/unit/materials/material_test.cpp Material.RejectsInvalidCurrentElasticFields 유지 원문 검사 body 및 assertion 동일. b9022c41bd0e641beaa68206c8fc19d2396a5b41ccf8e8bfe1bbd9911b9dde81 b9022c41bd0e641beaa68206c8fc19d2396a5b41ccf8e8bfe1bbd9911b9dde81 ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].severity, fesa::Severity::kError) | EXPECT_TRUE(beam_compatible.HasValue()) ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].severity, fesa::Severity::kError) | EXPECT_TRUE(beam_compatible.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/materials/material_test.cpp support@1-18 helper/oracle/fixture/include/static assertion 구간: MaterialSourceId, MaterialLocation tests/unit/materials/material_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0bc44f8ab121b123fdba22e1b3d50215ac0446ace019d14397d3e8a69ff0ae3b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/math/dense_blas_internal_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 14개 tests/unit/math/dense_blas_internal_test.cpp file 이관 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. 92b3b3a482f320eb9e0206baf3190e6c96f110b5c3e63a27cfc038cb6dc5bf5e 358c0fa2dac6cebb5ddc2cdac29661c7d82a8b99da881ce069275b4daf4aba3a 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseFactor.LuSolvesRectangularRhsOnBothSidesAndTransposes DenseFactor.LuSolvesRectangularRhsOnBothSidesAndTransposes; assertion 3개 tests/unit/math/dense_blas_internal_test.cpp DenseFactor.LuSolvesRectangularRhsOnBothSidesAndTransposes 유지 원문 검사 body 및 assertion 동일. 8ee576cfac5011bf3db4491f2722297eb334e52e620a6da187fa10a0725032c3 8ee576cfac5011bf3db4491f2722297eb334e52e620a6da187fa10a0725032c3 ASSERT_TRUE(factor.HasValue()) | EXPECT_DOUBLE_EQ(factor.Value().Determinant(), -4.0) | ASSERT_TRUE(solved.HasValue()) ASSERT_TRUE(factor.HasValue()) | EXPECT_DOUBLE_EQ(factor.Value().Determinant(), -4.0) | ASSERT_TRUE(solved.HasValue()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseFactor.CholeskySolvesAndWhiteningRetainsScaleAndOrientation DenseFactor.CholeskySolvesAndWhiteningRetainsScaleAndOrientation; assertion 11개 tests/unit/math/dense_blas_internal_test.cpp DenseFactor.CholeskySolvesAndWhiteningRetainsScaleAndOrientation 유지 원문 검사 body 및 assertion 동일. c4763e27ab0b305c36731c7445ad6b9e38aa464d71e56a07e9997f7038904f89 c4763e27ab0b305c36731c7445ad6b9e38aa464d71e56a07e9997f7038904f89 ASSERT_TRUE(factor.HasValue()) | EXPECT_DOUBLE_EQ(factor.Value().Determinant(), 16.0) | ASSERT_TRUE(lower.HasValue()) | EXPECT_DOUBLE_EQ(lower.Value()(0, 0), 2.0) | EXPECT_DOUBLE_EQ(lower.Value()(0, 1), 0.0) | EXPECT_DOUBLE_EQ(lower.Value()(1, 0), 1.0) | EXPECT_DOUBLE_EQ(lower.Value()(1, 1), 2.0) | ASSERT_TRUE(solved.HasValue()) | ASSERT_TRUE(triangular.HasValue()) | ASSERT_TRUE(w.HasValue()) | EXPECT_DOUBLE_EQ(gram, i == j ? 1.0 : 0.0) ASSERT_TRUE(factor.HasValue()) | EXPECT_DOUBLE_EQ(factor.Value().Determinant(), 16.0) | ASSERT_TRUE(lower.HasValue()) | EXPECT_DOUBLE_EQ(lower.Value()(0, 0), 2.0) | EXPECT_DOUBLE_EQ(lower.Value()(0, 1), 0.0) | EXPECT_DOUBLE_EQ(lower.Value()(1, 0), 1.0) | EXPECT_DOUBLE_EQ(lower.Value()(1, 1), 2.0) | ASSERT_TRUE(solved.HasValue()) | ASSERT_TRUE(triangular.HasValue()) | ASSERT_TRUE(w.HasValue()) | EXPECT_DOUBLE_EQ(gram, i == j ? 1.0 : 0.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseFactor.OwnsSnapshotAndFailedCandidatesPreserveReusableFactor DenseFactor.OwnsSnapshotAndFailedCandidatesPreserveReusableFactor; assertion 20개 tests/unit/math/dense_blas_internal_test.cpp DenseFactor.OwnsSnapshotAndFailedCandidatesPreserveReusableFactor 유지 원문 검사 body 및 assertion 동일. 885e2764eedb21b7dcfdb8b6f4abc01784b7ccd5ddf4d6ba8c5372ce07be1769 885e2764eedb21b7dcfdb8b6f4abc01784b7ccd5ddf4d6ba8c5372ce07be1769 ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(changed.HasValue()) | ASSERT_TRUE(old_solution.HasValue()) | EXPECT_DOUBLE_EQ(old_solution.Value()(0, 0), 4) | EXPECT_DOUBLE_EQ(changed.Value().Solve(rhs).Value()(0, 0), 1) | EXPECT_FALSE(DenseFactor::Lu(Matrix{2U, 2U}).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(Matrix{2U, 2U}).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(a).HasValue()) | EXPECT_FALSE(DenseFactor::Lu(Matrix{2U, 3U}).HasValue()) | EXPECT_FALSE(DenseFactor::Lu(a).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(a).HasValue()) | EXPECT_FALSE(factor.Value().Solve(Matrix{3U, 1U}).HasValue()) | EXPECT_FALSE(factor.Value().SolveRight(Matrix{1U, 3U}).HasValue()) | EXPECT_FALSE(factor.Value().SolveLower(rhs).HasValue()) | EXPECT_FALSE(factor.Value().Solve(rhs).HasValue()) | EXPECT_DOUBLE_EQ(old_solution.Value()(0, 0), 4) | EXPECT_DOUBLE_EQ(factor.Value().Solve(rhs).Value()(0, 0), 4) | ASSERT_TRUE(tiny_factor.HasValue()) | EXPECT_FALSE(tiny_factor.Value() .Solve(Matrix{1U, 1U, (std::numeric_limits::max)()}) .HasValue()) | EXPECT_DOUBLE_EQ(tiny_factor.Value().Solve(tiny).Value()(0, 0), 1) ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(changed.HasValue()) | ASSERT_TRUE(old_solution.HasValue()) | EXPECT_DOUBLE_EQ(old_solution.Value()(0, 0), 4) | EXPECT_DOUBLE_EQ(changed.Value().Solve(rhs).Value()(0, 0), 1) | EXPECT_FALSE(DenseFactor::Lu(Matrix{2U, 2U}).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(Matrix{2U, 2U}).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(a).HasValue()) | EXPECT_FALSE(DenseFactor::Lu(Matrix{2U, 3U}).HasValue()) | EXPECT_FALSE(DenseFactor::Lu(a).HasValue()) | EXPECT_FALSE(DenseFactor::Cholesky(a).HasValue()) | EXPECT_FALSE(factor.Value().Solve(Matrix{3U, 1U}).HasValue()) | EXPECT_FALSE(factor.Value().SolveRight(Matrix{1U, 3U}).HasValue()) | EXPECT_FALSE(factor.Value().SolveLower(rhs).HasValue()) | EXPECT_FALSE(factor.Value().Solve(rhs).HasValue()) | EXPECT_DOUBLE_EQ(old_solution.Value()(0, 0), 4) | EXPECT_DOUBLE_EQ(factor.Value().Solve(rhs).Value()(0, 0), 4) | ASSERT_TRUE(tiny_factor.HasValue()) | EXPECT_FALSE(tiny_factor.Value() .Solve(Matrix{1U, 1U, (std::numeric_limits::max)()}) .HasValue()) | EXPECT_DOUBLE_EQ(tiny_factor.Value().Solve(tiny).Value()(0, 0), 1) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseFactor.EmptyAndInfinityConditionBoundaryAreExplicit DenseFactor.EmptyAndInfinityConditionBoundaryAreExplicit; assertion 12개 tests/unit/math/dense_blas_internal_test.cpp DenseFactor.EmptyAndInfinityConditionBoundaryAreExplicit 유지 원문 검사 body 및 assertion 동일. ea146f605bef37ea46d6a0c268b5d6c5524ba1f62f893140896acf4e489498f0 ea146f605bef37ea46d6a0c268b5d6c5524ba1f62f893140896acf4e489498f0 ASSERT_TRUE(empty.HasValue()) | ASSERT_TRUE(left.HasValue()) | EXPECT_EQ(left.Value().Columns(), 3U) | ASSERT_TRUE(right.HasValue()) | EXPECT_EQ(right.Value().Rows(), 4U) | EXPECT_FALSE(empty.Value().ReciprocalConditionInfinity().HasValue()) | ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(rcond.HasValue()) | EXPECT_DOUBLE_EQ(rcond.Value(), diagonal) | EXPECT_EQ(rcond.Value() >= 0x1p-32, diagonal >= 0x1p-32) | EXPECT_EQ(factor.Value().Solve(Matrix{2U, 0U}).Value().Columns(), 0U) | EXPECT_EQ(factor.Value().SolveRight(Matrix{0U, 2U}).Value().Rows(), 0U) ASSERT_TRUE(empty.HasValue()) | ASSERT_TRUE(left.HasValue()) | EXPECT_EQ(left.Value().Columns(), 3U) | ASSERT_TRUE(right.HasValue()) | EXPECT_EQ(right.Value().Rows(), 4U) | EXPECT_FALSE(empty.Value().ReciprocalConditionInfinity().HasValue()) | ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(rcond.HasValue()) | EXPECT_DOUBLE_EQ(rcond.Value(), diagonal) | EXPECT_EQ(rcond.Value() >= 0x1p-32, diagonal >= 0x1p-32) | EXPECT_EQ(factor.Value().Solve(Matrix{2U, 0U}).Value().Columns(), 0U) | EXPECT_EQ(factor.Value().SolveRight(Matrix{0U, 2U}).Value().Rows(), 0U) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseFactor.GeneralDimensionAndNonDiagonalConditionUseFullCoefficient DenseFactor.GeneralDimensionAndNonDiagonalConditionUseFullCoefficient; assertion 6개 tests/unit/math/dense_blas_internal_test.cpp DenseFactor.GeneralDimensionAndNonDiagonalConditionUseFullCoefficient 유지 원문 검사 body 및 assertion 동일. dbd223f1cc316c3320525fee225834b093270d83b8f9ea98560c7ad11364726e dbd223f1cc316c3320525fee225834b093270d83b8f9ea98560c7ad11364726e ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(solved.HasValue()) | ASSERT_TRUE(lu.HasValue()) | EXPECT_DOUBLE_EQ(lu.Value().ReciprocalConditionInfinity().Value(), 1.0 / 3.0) | EXPECT_FALSE(lu.Value().Lower().HasValue()) | EXPECT_FALSE(DenseFactor::Lu(overflow).HasValue()) ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(solved.HasValue()) | ASSERT_TRUE(lu.HasValue()) | EXPECT_DOUBLE_EQ(lu.Value().ReciprocalConditionInfinity().Value(), 1.0 / 3.0) | EXPECT_FALSE(lu.Value().Lower().HasValue()) | EXPECT_FALSE(DenseFactor::Lu(overflow).HasValue()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths; assertion 6개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths 유지 원문 검사 body 및 assertion 동일. 7310c1121f67249879da772e16e1f0aed31290565d542780b71704dbe397cf82 7310c1121f67249879da772e16e1f0aed31290565d542780b71704dbe397cf82 ASSERT_TRUE(zero.HasValue()) | EXPECT_EQ(zero.Value(), 0) | ASSERT_TRUE(normal.HasValue()) | EXPECT_EQ(normal.Value(), 3) | EXPECT_FALSE(rejected.HasValue()) | EXPECT_FALSE(rejected.GetStatus().IsOk()) ASSERT_TRUE(zero.HasValue()) | EXPECT_EQ(zero.Value(), 0) | ASSERT_TRUE(normal.HasValue()) | EXPECT_EQ(normal.Value(), 3) | EXPECT_FALSE(rejected.HasValue()) | EXPECT_FALSE(rejected.GetStatus().IsOk()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues; assertion 2개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues 유지 원문 검사 body 및 assertion 동일. 6174848905a7f5e3b5af5b336c22d8d4ce3e9872c557e543d783f5b8e2970e36 6174848905a7f5e3b5af5b336c22d8d4ce3e9872c557e543d783f5b8e2970e36 EXPECT_NO_THROW(CopyValues(nullptr, 0U, nullptr)) | EXPECT_EQ(destination, source) EXPECT_NO_THROW(CopyValues(nullptr, 0U, nullptr)) | EXPECT_EQ(destination, source) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeLeftMatchesIndependentRectangularProduct DenseBlasInternal.TransposeLeftMatchesIndependentRectangularProduct; assertion 6개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeLeftMatchesIndependentRectangularProduct 유지 원문 검사 body 및 assertion 동일. 2f128333a889ea4bd05bf8dba9fd53164ac5cfa096b4c16a4ebb8d68e134bc01 2f128333a889ea4bd05bf8dba9fd53164ac5cfa096b4c16a4ebb8d68e134bc01 ASSERT_EQ(product.Rows(), 2U) | ASSERT_EQ(product.Columns(), 4U) | EXPECT_DOUBLE_EQ(product(row, column), expected) | EXPECT_DOUBLE_EQ(gram(0U, 0U), 35.0) | EXPECT_DOUBLE_EQ(gram(0U, 1U), 44.0) | EXPECT_DOUBLE_EQ(gram(1U, 1U), 56.0) ASSERT_EQ(product.Rows(), 2U) | ASSERT_EQ(product.Columns(), 4U) | EXPECT_DOUBLE_EQ(product(row, column), expected) | EXPECT_DOUBLE_EQ(gram(0U, 0U), 35.0) | EXPECT_DOUBLE_EQ(gram(0U, 1U), 44.0) | EXPECT_DOUBLE_EQ(gram(1U, 1U), 56.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeLeftRetainsEmptyAndFailureContracts DenseBlasInternal.TransposeLeftRetainsEmptyAndFailureContracts; assertion 7개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.TransposeLeftRetainsEmptyAndFailureContracts 유지 원문 검사 body 및 assertion 동일. b0f121f2d20673a3ca8fb37991c77f5f1282119ad4bfdb2f8ebbf8a62f11b727 b0f121f2d20673a3ca8fb37991c77f5f1282119ad4bfdb2f8ebbf8a62f11b727 ASSERT_EQ(zeros.Rows(), 2U) | ASSERT_EQ(zeros.Columns(), 3U) | EXPECT_DOUBLE_EQ(zeros(1U, 2U), 0.0) | EXPECT_EQ(empty.Rows(), 0U) | EXPECT_EQ(empty.Columns(), 0U) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(Matrix{1U, 2U}, Matrix{2U, 1U})), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyTransposeLeft( Matrix{1U, 0U}, Matrix{1U, 1U, (std::numeric_limits::quiet_NaN)()})), std::invalid_argument) ASSERT_EQ(zeros.Rows(), 2U) | ASSERT_EQ(zeros.Columns(), 3U) | EXPECT_DOUBLE_EQ(zeros(1U, 2U), 0.0) | EXPECT_EQ(empty.Rows(), 0U) | EXPECT_EQ(empty.Columns(), 0U) | EXPECT_THROW(static_cast(MultiplyTransposeLeft(Matrix{1U, 2U}, Matrix{2U, 1U})), std::invalid_argument) | EXPECT_THROW(static_cast(MultiplyTransposeLeft( Matrix{1U, 0U}, Matrix{1U, 1U, (std::numeric_limits::quiet_NaN)()})), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.RawProductsPreserveDestinationOnNonfiniteInput DenseBlasInternal.RawProductsPreserveDestinationOnNonfiniteInput; assertion 7개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.RawProductsPreserveDestinationOnNonfiniteInput 유지 원문 검사 body 및 assertion 동일. 4a41cf9c6954d5a62bab71682bbc7bb7418678a454a00182c543ae3094d74d62 4a41cf9c6954d5a62bab71682bbc7bb7418678a454a00182c543ae3094d74d62 ASSERT_TRUE(MultiplyTransposeRight(left, 2U, right, 3U, 2U, destination.data())) | EXPECT_EQ(destination, (std::array{-7.0, 23.0, 11.0, -39.0, 11.0, 67.0})) | EXPECT_FALSE(MultiplyTransposeRight(invalid, 1U, right, 3U, 2U, destination.data())) | EXPECT_FALSE(OuterProduct(left, 2U, invalid, 2U, destination.data())) | EXPECT_DOUBLE_EQ(value, 42.0) | ASSERT_TRUE(OuterProduct(left, 2U, right, 3U, destination.data())) | EXPECT_EQ(destination, (std::array{5.0, -6.0, 7.0, 10.0, -12.0, 14.0})) ASSERT_TRUE(MultiplyTransposeRight(left, 2U, right, 3U, 2U, destination.data())) | EXPECT_EQ(destination, (std::array{-7.0, 23.0, 11.0, -39.0, 11.0, 67.0})) | EXPECT_FALSE(MultiplyTransposeRight(invalid, 1U, right, 3U, 2U, destination.data())) | EXPECT_FALSE(OuterProduct(left, 2U, invalid, 2U, destination.data())) | EXPECT_DOUBLE_EQ(value, 42.0) | ASSERT_TRUE(OuterProduct(left, 2U, right, 3U, destination.data())) | EXPECT_EQ(destination, (std::array{5.0, -6.0, 7.0, 10.0, -12.0, 14.0})) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.RawProductZeroDimensionsAndOverflowAreExplicit DenseBlasInternal.RawProductZeroDimensionsAndOverflowAreExplicit; assertion 8개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.RawProductZeroDimensionsAndOverflowAreExplicit 유지 원문 검사 body 및 assertion 동일. 984e62302170c08919b0063009bba2b65a90ada4fb11785eb01836c63d202836 984e62302170c08919b0063009bba2b65a90ada4fb11785eb01836c63d202836 EXPECT_TRUE(OuterProduct(nullptr, 0U, nullptr, 3U, nullptr)) | EXPECT_TRUE(MultiplyTransposeRight(nullptr, 2U, nullptr, 0U, 3U, nullptr)) | ASSERT_TRUE(MultiplyTransposeRight(nullptr, 2U, nullptr, 3U, 0U, zeros.data())) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_THROW(MultiplyTransposeRight(nullptr, 1U, nullptr, 1U, 1U, nullptr), std::invalid_argument) | EXPECT_THROW(MultiplyTransposeRight(nullptr, overflow, nullptr, 0U, 0U, nullptr), std::length_error) | EXPECT_THROW(CopyValues(&unchanged, overflow, &unchanged), std::length_error) | EXPECT_DOUBLE_EQ(unchanged, 42.0) EXPECT_TRUE(OuterProduct(nullptr, 0U, nullptr, 3U, nullptr)) | EXPECT_TRUE(MultiplyTransposeRight(nullptr, 2U, nullptr, 0U, 3U, nullptr)) | ASSERT_TRUE(MultiplyTransposeRight(nullptr, 2U, nullptr, 3U, 0U, zeros.data())) | EXPECT_DOUBLE_EQ(value, 0.0) | EXPECT_THROW(MultiplyTransposeRight(nullptr, 1U, nullptr, 1U, 1U, nullptr), std::invalid_argument) | EXPECT_THROW(MultiplyTransposeRight(nullptr, overflow, nullptr, 0U, 0U, nullptr), std::length_error) | EXPECT_THROW(CopyValues(&unchanged, overflow, &unchanged), std::length_error) | EXPECT_DOUBLE_EQ(unchanged, 42.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.ContiguousPrimitivesCheckEmptyAndOverflowBeforeUse DenseBlasInternal.ContiguousPrimitivesCheckEmptyAndOverflowBeforeUse; assertion 9개 tests/unit/math/dense_blas_internal_test.cpp DenseBlasInternal.ContiguousPrimitivesCheckEmptyAndOverflowBeforeUse 유지 원문 검사 body 및 assertion 동일. 2ed41da5963f5cd8c8f1883a7bf7e6400ec02830e89b87c96d2272d5040a25dc 2ed41da5963f5cd8c8f1883a7bf7e6400ec02830e89b87c96d2272d5040a25dc EXPECT_DOUBLE_EQ(DotValues(nullptr, 0U, nullptr), 0.0) | EXPECT_DOUBLE_EQ(NormValues(nullptr, 0U), 0.0) | EXPECT_NO_THROW(ScaleValues(2.0, nullptr, 0U)) | EXPECT_NO_THROW(AxpyValues(2.0, nullptr, 0U, nullptr)) | EXPECT_THROW(DotValues(nullptr, overflow, nullptr), std::length_error) | EXPECT_THROW(NormValues(nullptr, overflow), std::length_error) | EXPECT_THROW(ScaleValues(2.0, &unchanged, overflow), std::length_error) | EXPECT_THROW(AxpyValues(2.0, nullptr, overflow, &unchanged), std::length_error) | EXPECT_DOUBLE_EQ(unchanged, 42.0) EXPECT_DOUBLE_EQ(DotValues(nullptr, 0U, nullptr), 0.0) | EXPECT_DOUBLE_EQ(NormValues(nullptr, 0U), 0.0) | EXPECT_NO_THROW(ScaleValues(2.0, nullptr, 0U)) | EXPECT_NO_THROW(AxpyValues(2.0, nullptr, 0U, nullptr)) | EXPECT_THROW(DotValues(nullptr, overflow, nullptr), std::length_error) | EXPECT_THROW(NormValues(nullptr, overflow), std::length_error) | EXPECT_THROW(ScaleValues(2.0, &unchanged, overflow), std::length_error) | EXPECT_THROW(AxpyValues(2.0, nullptr, overflow, &unchanged), std::length_error) | EXPECT_DOUBLE_EQ(unchanged, 42.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp JetLinearSolve.RecoversMixedCubicCoefficientsWithOnePrimalFactor JetLinearSolve.RecoversMixedCubicCoefficientsWithOnePrimalFactor; assertion 3개 tests/unit/math/dense_blas_internal_test.cpp JetLinearSolve.RecoversMixedCubicCoefficientsWithOnePrimalFactor 유지 원문 검사 body 및 assertion 동일. a4023af7275d952ed8a1919ec83d546e161d40a68ab5306657ccf97b5b8c9b18 a4023af7275d952ed8a1919ec83d546e161d40a68ab5306657ccf97b5b8c9b18 ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(SolveJetAction(a, rhs, factor.Value(), {1,2,3,4}, PolynomialConstant, PolynomialRead, PolynomialWrite, solved)) | EXPECT_NEAR(solved[row].c[i][j], expected[row].c[i][j], 2e-14) ASSERT_TRUE(factor.HasValue()) | ASSERT_TRUE(SolveJetAction(a, rhs, factor.Value(), {1,2,3,4}, PolynomialConstant, PolynomialRead, PolynomialWrite, solved)) | EXPECT_NEAR(solved[row].c[i][j], expected[row].c[i][j], 2e-14) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp JetLinearSolve.FailedChannelSolvePreservesCandidateAndInputs JetLinearSolve.FailedChannelSolvePreservesCandidateAndInputs; assertion 5개 tests/unit/math/dense_blas_internal_test.cpp JetLinearSolve.FailedChannelSolvePreservesCandidateAndInputs 유지 원문 검사 body 및 assertion 동일. 30ae0ad962f0faf0e9eef5fa39985aeff2df2aaed4869a43378baf0769b30388 30ae0ad962f0faf0e9eef5fa39985aeff2df2aaed4869a43378baf0769b30388 ASSERT_TRUE(factor.HasValue()) | EXPECT_FALSE(SolveJetAction(a, rhs, factor.Value(), {1,2,3,4}, PolynomialConstant, PolynomialRead, PolynomialWrite, solved)) | EXPECT_EQ(solved[0].c[0][0], 17) | EXPECT_EQ(a[1][1].c[0][0], 1) | EXPECT_EQ(rhs[1].c[1][0], std::numeric_limits::infinity()) ASSERT_TRUE(factor.HasValue()) | EXPECT_FALSE(SolveJetAction(a, rhs, factor.Value(), {1,2,3,4}, PolynomialConstant, PolynomialRead, PolynomialWrite, solved)) | EXPECT_EQ(solved[0].c[0][0], 17) | EXPECT_EQ(a[1][1].c[0][0], 1) | EXPECT_EQ(rhs[1].c[1][0], std::numeric_limits::infinity()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp support@1-38 helper/oracle/fixture/include/static assertion 구간: fesa, FactorRhs, ExpectFactorSolution tests/unit/math/dense_blas_internal_test.cpp file-support 이관 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. 8f13d3e6bf671a0c1d0a2130c4d1fb92818b0639a0f3a8f17ebd5a701e126838 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp support@329-366 helper/oracle/fixture/include/static assertion 구간: fesa, Polynomial, PolynomialConstant, PolynomialRead, PolynomialWrite tests/unit/math/dense_blas_internal_test.cpp file-support 유지 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. 6d6e95a56f8e52a8509a0cd10d7a3ff86f0a0c886ebbb746be7b3b212792dfc4 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/dense_blas_internal_test.cpp support@427-428 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/dense_blas_internal_test.cpp file-support 유지 raw primitive·TLS 복원 검사를 복원하고 Refactor factor/jet 검사를 유지한다. Cholesky lower·inverse 값은 DenseFactor::Lower와 SolveLower(identity)로 검사한다. 실패한 out-parameter 보존은 이전 owned factor/result 보존으로 검사한다. 옛 mutable reason enum·throw 구조는 typed Result의 shape/nonfinite/pivot 실패와 성공 후 재사용으로 이관한다. 0c7b9a2d7d4c2814fe4dfea8e7034b85ea93318c441c7b770362b4e9a9dadcb5 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 7개 tests/unit/math/high_low_arithmetic_test.cpp file 이관 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. 9a7cff8145fef7279b78dae9839d85d69d4b85de012ff89c943efc9e3aa02e6f 6e7fafa845bdd0c3a648b846f2ed54bf2fd07d5ec492a7c84b164c93f6e6ecc4 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RetainsSubUlpAdditionsAndSignedCancellation HighLowArithmetic.RetainsSubUlpAdditionsAndSignedCancellation; assertion 15개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RetainsSubUlpAdditionsAndSignedCancellation 유지 원문 검사 body 및 assertion 동일. f2a492c6eb8068167a3979f743c32cbc73dfe847846d892e715ed7bfbc9e05ec f2a492c6eb8068167a3979f743c32cbc73dfe847846d892e715ed7bfbc9e05ec ASSERT_TRUE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(IsNormalized(HighLow{-0.0, -0.0})) | EXPECT_TRUE(IsNormalized(HighLow{-0.0})) | EXPECT_FALSE(std::signbit(HighLow{-0.0}.high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).low)) | EXPECT_EQ(positive.high, 1) | EXPECT_EQ(positive.low, tiny) | EXPECT_EQ(Rounded(positive), 1) | EXPECT_EQ(difference.high, tiny) | EXPECT_EQ(difference.low, 0) | EXPECT_EQ(Compare(positive, HighLow{1}), 1) | EXPECT_EQ(Compare(HighLow{1, -tiny}, HighLow{1}), -1) | EXPECT_EQ(Compare(Add(positive, Negate(positive)), HighLow{}), 0) | EXPECT_EQ(Abs(HighLow{-1, -tiny}).low, tiny) ASSERT_TRUE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(IsNormalized(HighLow{-0.0, -0.0})) | EXPECT_TRUE(IsNormalized(HighLow{-0.0})) | EXPECT_FALSE(std::signbit(HighLow{-0.0}.high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).high)) | EXPECT_FALSE(std::signbit(Negate(HighLow{}).low)) | EXPECT_EQ(positive.high, 1) | EXPECT_EQ(positive.low, tiny) | EXPECT_EQ(Rounded(positive), 1) | EXPECT_EQ(difference.high, tiny) | EXPECT_EQ(difference.low, 0) | EXPECT_EQ(Compare(positive, HighLow{1}), 1) | EXPECT_EQ(Compare(HighLow{1, -tiny}, HighLow{1}), -1) | EXPECT_EQ(Compare(Add(positive, Negate(positive)), HighLow{}), 0) | EXPECT_EQ(Abs(HighLow{-1, -tiny}).low, tiny) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.AllProductTermsAndDivisionResidualReachState HighLowArithmetic.AllProductTermsAndDivisionResidualReachState; assertion 6개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.AllProductTermsAndDivisionResidualReachState 유지 원문 검사 body 및 assertion 동일. 5d464b75e43ed56254ebd034fe40e7d2683352bbe913cd6eaf816614bd3582dd 5d464b75e43ed56254ebd034fe40e7d2683352bbe913cd6eaf816614bd3582dd EXPECT_EQ(product.high, 1) | EXPECT_EQ(product.low, -std::ldexp(1.0, -120)) | ASSERT_TRUE(IsNormalized(quotient)) | EXPECT_LE(std::abs(defect.high), std::ldexp(1.0, -104)) | EXPECT_EQ(cancellation.high, tiny / 2) | EXPECT_EQ(cancellation.low, 0) EXPECT_EQ(product.high, 1) | EXPECT_EQ(product.low, -std::ldexp(1.0, -120)) | ASSERT_TRUE(IsNormalized(quotient)) | EXPECT_LE(std::abs(defect.high), std::ldexp(1.0, -104)) | EXPECT_EQ(cancellation.high, tiny / 2) | EXPECT_EQ(cancellation.low, 0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.NormalizesTiesAndCrossesPowerOfTwoBoundary HighLowArithmetic.NormalizesTiesAndCrossesPowerOfTwoBoundary; assertion 6개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.NormalizesTiesAndCrossesPowerOfTwoBoundary 유지 원문 검사 body 및 assertion 동일. 4bbb8298c7a24ac9be9d05d58a013ed1d2e3ae9602815e911f9596f567694549 4bbb8298c7a24ac9be9d05d58a013ed1d2e3ae9602815e911f9596f567694549 EXPECT_TRUE(IsNormalized(HighLow{1, half_ulp})) | EXPECT_FALSE(IsNormalized(HighLow{std::nextafter(1.0, 2.0), -half_ulp})) | EXPECT_EQ(result.high, std::nextafter(1.0, 2.0)) | EXPECT_EQ(result.low, 0) | EXPECT_EQ(Add(minimum, minimum).high, 2 * minimum.high) | EXPECT_EQ(Multiply(minimum, HighLow{1}).high, minimum.high) EXPECT_TRUE(IsNormalized(HighLow{1, half_ulp})) | EXPECT_FALSE(IsNormalized(HighLow{std::nextafter(1.0, 2.0), -half_ulp})) | EXPECT_EQ(result.high, std::nextafter(1.0, 2.0)) | EXPECT_EQ(result.low, 0) | EXPECT_EQ(Add(minimum, minimum).high, 2 * minimum.high) | EXPECT_EQ(Multiply(minimum, HighLow{1}).high, minimum.high) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsUnsupportedDyadicTailAndNonfiniteResults HighLowArithmetic.RejectsUnsupportedDyadicTailAndNonfiniteResults; assertion 8개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsUnsupportedDyadicTailAndNonfiniteResults 유지 원문 검사 body 및 assertion 동일. e13007c60ef0ca2d8c8755035337fb55cecb64bcf7483cb7695ab98c1d5cfaa1 e13007c60ef0ca2d8c8755035337fb55cecb64bcf7483cb7695ab98c1d5cfaa1 EXPECT_FALSE(IsFinite(Multiply(minimum, HighLow{0.5}))) | EXPECT_FALSE(IsFinite(Multiply(HighLow{std::ldexp(1.0, -1022)}, HighLow{std::nextafter(0.5, 1.0)}))) | EXPECT_FALSE(IsFinite(Divide(minimum, HighLow{2}))) | EXPECT_FALSE(IsFinite(Divide(HighLow{1}, HighLow{}))) | EXPECT_FALSE(IsFinite(Add(HighLow{std::numeric_limits::max()}, HighLow{std::numeric_limits::max()}))) | EXPECT_EQ(Compare(InvalidHighLow(), HighLow{}), 2) | EXPECT_FALSE(IsNormalized(HighLow{1, 1})) | EXPECT_TRUE(std::isnan(Rounded(HighLow{1, 1}))) EXPECT_FALSE(IsFinite(Multiply(minimum, HighLow{0.5}))) | EXPECT_FALSE(IsFinite(Multiply(HighLow{std::ldexp(1.0, -1022)}, HighLow{std::nextafter(0.5, 1.0)}))) | EXPECT_FALSE(IsFinite(Divide(minimum, HighLow{2}))) | EXPECT_FALSE(IsFinite(Divide(HighLow{1}, HighLow{}))) | EXPECT_FALSE(IsFinite(Add(HighLow{std::numeric_limits::max()}, HighLow{std::numeric_limits::max()}))) | EXPECT_EQ(Compare(InvalidHighLow(), HighLow{}), 2) | EXPECT_FALSE(IsNormalized(HighLow{1, 1})) | EXPECT_TRUE(std::isnan(Rounded(HighLow{1, 1}))) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.ExactDyadicOracleBoundsDiscardedTailAndRefinement HighLowArithmetic.ExactDyadicOracleBoundsDiscardedTailAndRefinement; assertion 13개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.ExactDyadicOracleBoundsDiscardedTailAndRefinement 유지 원문 검사 body 및 assertion 동일. 231d3d1a2023a915af0befbf01924f42b59b43b192520841785ac05d571e9452 231d3d1a2023a915af0befbf01924f42b59b43b192520841785ac05d571e9452 EXPECT_EQ(sum.high, std::ldexp(0x1.0000000000001p+0, scale)) | EXPECT_EQ(sum.low, -std::ldexp(1.0, scale-54)) | EXPECT_EQ(square.high, std::ldexp(1.0, 2*scale)) | EXPECT_EQ(square.low, std::ldexp(1.0, 2*scale-53)) | EXPECT_EQ(third.high, 0x1.5555555555555p-2) | EXPECT_EQ(third.low, 0x1.5555555555555p-56) | EXPECT_EQ(third_residual.high, -std::ldexp(1.0, -108)) | EXPECT_EQ(third_residual.low, 0) | EXPECT_EQ(refined.high, 0x1.999999999999ap-1) | EXPECT_EQ(refined.low, -0x1.8e147ae147ae1p-55) | EXPECT_EQ(boundary.high, 0x1.0000000000002p-970) | EXPECT_EQ(boundary.low, std::numeric_limits::denorm_min()) | EXPECT_FALSE(IsFinite(TwoProduct(std::nextafter(1.0, 2.0), std::nextafter(std::numeric_limits::min(), 1.0)))) EXPECT_EQ(sum.high, std::ldexp(0x1.0000000000001p+0, scale)) | EXPECT_EQ(sum.low, -std::ldexp(1.0, scale-54)) | EXPECT_EQ(square.high, std::ldexp(1.0, 2*scale)) | EXPECT_EQ(square.low, std::ldexp(1.0, 2*scale-53)) | EXPECT_EQ(third.high, 0x1.5555555555555p-2) | EXPECT_EQ(third.low, 0x1.5555555555555p-56) | EXPECT_EQ(third_residual.high, -std::ldexp(1.0, -108)) | EXPECT_EQ(third_residual.low, 0) | EXPECT_EQ(refined.high, 0x1.999999999999ap-1) | EXPECT_EQ(refined.low, -0x1.8e147ae147ae1p-55) | EXPECT_EQ(boundary.high, 0x1.0000000000002p-970) | EXPECT_EQ(boundary.low, std::numeric_limits::denorm_min()) | EXPECT_FALSE(IsFinite(TwoProduct(std::nextafter(1.0, 2.0), std::nextafter(std::numeric_limits::min(), 1.0)))) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsChangedRoundingAndFlushToZeroEnvironment HighLowArithmetic.RejectsChangedRoundingAndFlushToZeroEnvironment; assertion 6개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.RejectsChangedRoundingAndFlushToZeroEnvironment 유지 원문 검사 body 및 assertion 동일. 356cfeef68419bd3c33a3abd04e7d67b2bc2ea0a1b4c4bb8e0888fda56c6bc48 356cfeef68419bd3c33a3abd04e7d67b2bc2ea0a1b4c4bb8e0888fda56c6bc48 ASSERT_TRUE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_TONEAREST), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) ASSERT_TRUE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_DOWNWARD), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | ASSERT_EQ(std::fesetround(FE_TONEAREST), 0) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) | EXPECT_FALSE(ArithmeticEnvironmentSupported()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.PacketDispatchRetainsComponentsAndInstructionGates HighLowArithmetic.PacketDispatchRetainsComponentsAndInstructionGates; assertion 14개 tests/unit/math/high_low_arithmetic_test.cpp HighLowArithmetic.PacketDispatchRetainsComponentsAndInstructionGates 유지 원문 검사 body 및 assertion 동일. cb8d79fd8eafc1efca1f29e6f4532ceed3288186124b2f3398242beda1c04a41 cb8d79fd8eafc1efca1f29e6f4532ceed3288186124b2f3398242beda1c04a41 EXPECT_TRUE(SupportsMaterialPacketInstructions(leaf1, 6, leaf7)) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1 & ~(1U << bit),6,leaf7)) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,6,leaf7 & ~(1U << bit))) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,2,leaf7)) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,4,leaf7)) | EXPECT_TRUE(std::isnan(actual.values[lane].high)) | EXPECT_DOUBLE_EQ(actual.values[lane].high, expected.values[lane].high) | EXPECT_DOUBLE_EQ(actual.values[lane].low, expected.values[lane].low) | EXPECT_EQ(std::signbit(actual.values[lane].low), std::signbit(expected.values[lane].low)) | EXPECT_GT(finite_pairs, 0U) | EXPECT_GT(retained_low_pairs, 0U) | EXPECT_GT(invalid_pairs, 0U) | EXPECT_EQ(SelectMaterialPacketEvaluator(), EvaluateMaterialPacketScalar) | EXPECT_EQ(SelectMaterialPacketEvaluator(), selected) EXPECT_TRUE(SupportsMaterialPacketInstructions(leaf1, 6, leaf7)) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1 & ~(1U << bit),6,leaf7)) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,6,leaf7 & ~(1U << bit))) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,2,leaf7)) | EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,4,leaf7)) | EXPECT_TRUE(std::isnan(actual.values[lane].high)) | EXPECT_DOUBLE_EQ(actual.values[lane].high, expected.values[lane].high) | EXPECT_DOUBLE_EQ(actual.values[lane].low, expected.values[lane].low) | EXPECT_EQ(std::signbit(actual.values[lane].low), std::signbit(expected.values[lane].low)) | EXPECT_GT(finite_pairs, 0U) | EXPECT_GT(retained_low_pairs, 0U) | EXPECT_GT(invalid_pairs, 0U) | EXPECT_EQ(SelectMaterialPacketEvaluator(), EvaluateMaterialPacketScalar) | EXPECT_EQ(SelectMaterialPacketEvaluator(), selected) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp support@1-11 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/high_low_arithmetic_test.cpp file-support 이관 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. 87384a6fff2c8b0685ad5d32ad03255990ae389c329b23ccc57040fae22cc877 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp support@129-131 helper/oracle/fixture/include/static assertion 구간: namespace tests/unit/math/high_low_arithmetic_test.cpp file-support 이관 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. 3f7f376cbb4f7652496e0731de24fd5ba882bbbc64b6fdb2700f236135db934e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/high_low_arithmetic_test.cpp support@206-206 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/math/high_low_arithmetic_test.cpp file-support 유지 Dev frozen oracle helper 원문을 유지한다. 모든 exponent·finite 분류·raw-bit 검사를 복원하고 Refactor packet dispatch 검사를 함께 남긴다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/matrix_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/math/matrix_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2c6513a08239b1a3280aba9945c43da4f1dc34c3dd8e2c6b31232436e9481854 e871743665669396e2ff3df6599a7020e1e9009ba325c1341493f4f940da9744 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/matrix_test.cpp DenseMath.RowMajorMatrixMatchesKnownGemvGemm DenseMath.RowMajorMatrixMatchesKnownGemvGemm; assertion 39개 tests/unit/math/matrix_test.cpp DenseMath.RowMajorMatrixMatchesKnownGemvGemm 유지 원문 검사 body 및 assertion 동일. 80766b5923a34f53328f9a728d5714d0e8fc8448721f558a25f8cc297cae5317 80766b5923a34f53328f9a728d5714d0e8fc8448721f558a25f8cc297cae5317 EXPECT_THROW(static_cast(Matrix{wraparound_rows, 2}), std::length_error) | EXPECT_EQ(zero_row_product.Size(), 0U) | ASSERT_EQ(zero_column_product.Size(), 2U) | EXPECT_DOUBLE_EQ(zero_column_product[0], 0.0) | EXPECT_DOUBLE_EQ(zero_column_product[1], 0.0) | EXPECT_EQ(zero_inner_product.Rows(), 2U) | EXPECT_EQ(zero_inner_product.Columns(), 3U) | EXPECT_DOUBLE_EQ(zero_inner_product(row, column), 0.0) | EXPECT_EQ(&left(0, 0) + 1, &left(0, 1)) | EXPECT_EQ(&left(0, 0) + 2, &left(0, 2)) | EXPECT_EQ(&left(0, 0) + 3, &left(1, 0)) | EXPECT_DOUBLE_EQ(const_left(1, 2), 6.0) | EXPECT_DOUBLE_EQ(left(0, 0), 1.0) | EXPECT_DOUBLE_EQ(left(1, 2), 6.0) | EXPECT_EQ(copied.Rows(), 0U) | EXPECT_EQ(copied.Columns(), 0U) | EXPECT_EQ(moved.Rows(), 2U) | EXPECT_EQ(moved.Columns(), 3U) | EXPECT_DOUBLE_EQ(moved(0, 0), 42.0) | EXPECT_NO_THROW(static_cast(copied.Multiply(Vector{0}))) | EXPECT_EQ(copy_assigned.Rows(), 0U) | EXPECT_EQ(copy_assigned.Columns(), 0U) | EXPECT_EQ(move_assigned.Rows(), 2U) | EXPECT_EQ(move_assigned.Columns(), 3U) | EXPECT_DOUBLE_EQ(move_assigned(1, 2), -7.0) | ASSERT_EQ(matrix_vector_product.Size(), 2U) | EXPECT_DOUBLE_EQ(matrix_vector_product[0], 50.0) | EXPECT_DOUBLE_EQ(matrix_vector_product[1], 122.0) | ASSERT_EQ(matrix_product.Rows(), 2U) | ASSERT_EQ(matrix_product.Columns(), 2U) | EXPECT_DOUBLE_EQ(matrix_product(0, 0), 58.0) | EXPECT_DOUBLE_EQ(matrix_product(0, 1), 64.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 0), 139.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 1), 154.0) | EXPECT_THROW(static_cast(left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left(0, 3)), std::out_of_range) | EXPECT_THROW(static_cast(const_left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left.Multiply(Vector{2})), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(Matrix{4, 1})), std::invalid_argument) EXPECT_THROW(static_cast(Matrix{wraparound_rows, 2}), std::length_error) | EXPECT_EQ(zero_row_product.Size(), 0U) | ASSERT_EQ(zero_column_product.Size(), 2U) | EXPECT_DOUBLE_EQ(zero_column_product[0], 0.0) | EXPECT_DOUBLE_EQ(zero_column_product[1], 0.0) | EXPECT_EQ(zero_inner_product.Rows(), 2U) | EXPECT_EQ(zero_inner_product.Columns(), 3U) | EXPECT_DOUBLE_EQ(zero_inner_product(row, column), 0.0) | EXPECT_EQ(&left(0, 0) + 1, &left(0, 1)) | EXPECT_EQ(&left(0, 0) + 2, &left(0, 2)) | EXPECT_EQ(&left(0, 0) + 3, &left(1, 0)) | EXPECT_DOUBLE_EQ(const_left(1, 2), 6.0) | EXPECT_DOUBLE_EQ(left(0, 0), 1.0) | EXPECT_DOUBLE_EQ(left(1, 2), 6.0) | EXPECT_EQ(copied.Rows(), 0U) | EXPECT_EQ(copied.Columns(), 0U) | EXPECT_EQ(moved.Rows(), 2U) | EXPECT_EQ(moved.Columns(), 3U) | EXPECT_DOUBLE_EQ(moved(0, 0), 42.0) | EXPECT_NO_THROW(static_cast(copied.Multiply(Vector{0}))) | EXPECT_EQ(copy_assigned.Rows(), 0U) | EXPECT_EQ(copy_assigned.Columns(), 0U) | EXPECT_EQ(move_assigned.Rows(), 2U) | EXPECT_EQ(move_assigned.Columns(), 3U) | EXPECT_DOUBLE_EQ(move_assigned(1, 2), -7.0) | ASSERT_EQ(matrix_vector_product.Size(), 2U) | EXPECT_DOUBLE_EQ(matrix_vector_product[0], 50.0) | EXPECT_DOUBLE_EQ(matrix_vector_product[1], 122.0) | ASSERT_EQ(matrix_product.Rows(), 2U) | ASSERT_EQ(matrix_product.Columns(), 2U) | EXPECT_DOUBLE_EQ(matrix_product(0, 0), 58.0) | EXPECT_DOUBLE_EQ(matrix_product(0, 1), 64.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 0), 139.0) | EXPECT_DOUBLE_EQ(matrix_product(1, 1), 154.0) | EXPECT_THROW(static_cast(left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left(0, 3)), std::out_of_range) | EXPECT_THROW(static_cast(const_left(2, 0)), std::out_of_range) | EXPECT_THROW(static_cast(left.Multiply(Vector{2})), std::invalid_argument) | EXPECT_THROW(static_cast(left.Multiply(Matrix{4, 1})), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/matrix_test.cpp DenseMath.MatrixContiguousScaleAndRobustNorm DenseMath.MatrixContiguousScaleAndRobustNorm; assertion 8개 tests/unit/math/matrix_test.cpp DenseMath.MatrixContiguousScaleAndRobustNorm 유지 원문 검사 body 및 assertion 동일. b432feff567c13942d7764fbf2866bdf46cd320be7f71254eea8b20782a18492 b432feff567c13942d7764fbf2866bdf46cd320be7f71254eea8b20782a18492 EXPECT_EQ(immutable.Data() + 3, &immutable(1U, 0U)) | EXPECT_NEAR(matrix.Norm(), std::sqrt(91.0), 2.0e-15) | EXPECT_DOUBLE_EQ(matrix.Data()[i], -2.0 * entries[i]) | EXPECT_DOUBLE_EQ(immutable(1U, 2U), 12.0) | EXPECT_NEAR(huge.Norm() / 1.0e308, std::sqrt(2.0), 4.0e-16) | EXPECT_NEAR(tiny.Norm() / 1.0e-300, std::sqrt(2.0), 4.0e-16) | EXPECT_DOUBLE_EQ(empty.Norm(), 0.0) | EXPECT_NO_THROW(empty.Scale(3.0)) EXPECT_EQ(immutable.Data() + 3, &immutable(1U, 0U)) | EXPECT_NEAR(matrix.Norm(), std::sqrt(91.0), 2.0e-15) | EXPECT_DOUBLE_EQ(matrix.Data()[i], -2.0 * entries[i]) | EXPECT_DOUBLE_EQ(immutable(1U, 2U), 12.0) | EXPECT_NEAR(huge.Norm() / 1.0e308, std::sqrt(2.0), 4.0e-16) | EXPECT_NEAR(tiny.Norm() / 1.0e-300, std::sqrt(2.0), 4.0e-16) | EXPECT_DOUBLE_EQ(empty.Norm(), 0.0) | EXPECT_NO_THROW(empty.Scale(3.0)) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/matrix_test.cpp DenseMath.MatrixProductKeepsShapeAndFiniteValidationOrder DenseMath.MatrixProductKeepsShapeAndFiniteValidationOrder; assertion 6개 tests/unit/math/matrix_test.cpp DenseMath.MatrixProductKeepsShapeAndFiniteValidationOrder 유지 원문 검사 body 및 assertion 동일. 6a7fa3f0dadbb47c435375f9fbc9bccf297241d83387c4c17e195840106b3799 6a7fa3f0dadbb47c435375f9fbc9bccf297241d83387c4c17e195840106b3799 "EXPECT_STREQ(failure.what(), ""Matrix-vector multiplication has incompatible dimensions."") | EXPECT_THROW(static_cast(matrix.Multiply(Vector{2U})), std::invalid_argument) | EXPECT_THROW(static_cast(matrix.Multiply(Matrix{2U, 0U})), std::invalid_argument) | EXPECT_THROW(static_cast(Matrix{0U, 2U}.Multiply(Vector{2U, nan})), std::invalid_argument) | EXPECT_DOUBLE_EQ(square(0U, 0U), 18.0) | EXPECT_DOUBLE_EQ(finite(0U, 0U), 3.0)" "EXPECT_STREQ(failure.what(), ""Matrix-vector multiplication has incompatible dimensions."") | EXPECT_THROW(static_cast(matrix.Multiply(Vector{2U})), std::invalid_argument) | EXPECT_THROW(static_cast(matrix.Multiply(Matrix{2U, 0U})), std::invalid_argument) | EXPECT_THROW(static_cast(Matrix{0U, 2U}.Multiply(Vector{2U, nan})), std::invalid_argument) | EXPECT_DOUBLE_EQ(square(0U, 0U), 18.0) | EXPECT_DOUBLE_EQ(finite(0U, 0U), 3.0)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/matrix_test.cpp DenseMath.MatrixSelfAssignmentPreservesShapeAndStorage DenseMath.MatrixSelfAssignmentPreservesShapeAndStorage; assertion 5개 tests/unit/math/matrix_test.cpp DenseMath.MatrixSelfAssignmentPreservesShapeAndStorage 유지 원문 검사 body 및 assertion 동일. 9aab3255ebd10378558667f8795f35a8af6b9f8142933866d3012457bdb9afab 9aab3255ebd10378558667f8795f35a8af6b9f8142933866d3012457bdb9afab EXPECT_EQ(matrix.Rows(), 2U) | EXPECT_EQ(matrix.Columns(), 1U) | EXPECT_DOUBLE_EQ(matrix(1U, 0U), 7.0) | EXPECT_EQ(matrix.Rows(), 2U) | EXPECT_DOUBLE_EQ(matrix(1U, 0U), 7.0) EXPECT_EQ(matrix.Rows(), 2U) | EXPECT_EQ(matrix.Columns(), 1U) | EXPECT_DOUBLE_EQ(matrix(1U, 0U), 7.0) | EXPECT_EQ(matrix.Rows(), 2U) | EXPECT_DOUBLE_EQ(matrix(1U, 0U), 7.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/matrix_test.cpp support@1-12 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/matrix_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 85adcb7d83136d0f31a1cb98ca6c83135504641a803971b78e9d9a0ecb0723f7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/matrix_test.cpp support@168-170 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/matrix_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/sparse_matrix_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/math/sparse_matrix_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2d60a8b6821d8cf61c56f088cf73ad4324638979db7776a27f68113740e14ad7 ce2d95faaa89e5b4887d791745eee4b97e882482fa91e04b787dceaa268d663b 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ValidatesKnownCsrAndMultiply SparseAssembly.ValidatesKnownCsrAndMultiply; assertion 13개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ValidatesKnownCsrAndMultiply 유지 원문 검사 body 및 assertion 동일. 306be72faf3dbbf425d660063d3847f0d06a43498caa60943e847cc485a5d9c8 306be72faf3dbbf425d660063d3847f0d06a43498caa60943e847cc485a5d9c8 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(matrix.Rows(), 4U) | EXPECT_EQ(matrix.Columns(), 4U) | EXPECT_EQ(matrix.RowOffsets(), pattern.row_offsets) | EXPECT_EQ(matrix.ColumnIndices(), pattern.column_indices) | EXPECT_EQ(matrix.Values(), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0})) | EXPECT_TRUE(matrix.Validate().IsOk()) | ASSERT_EQ(product.Size(), 4U) | EXPECT_DOUBLE_EQ(product[0U], 7.0) | EXPECT_DOUBLE_EQ(product[1U], 0.0) | EXPECT_DOUBLE_EQ(product[2U], 22.0) | EXPECT_DOUBLE_EQ(product[3U], 20.0) | EXPECT_THROW(static_cast(matrix.Multiply(Vector{3U})), std::invalid_argument) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(matrix.Rows(), 4U) | EXPECT_EQ(matrix.Columns(), 4U) | EXPECT_EQ(matrix.RowOffsets(), pattern.row_offsets) | EXPECT_EQ(matrix.ColumnIndices(), pattern.column_indices) | EXPECT_EQ(matrix.Values(), (std::vector{1.0, 2.0, 3.0, 4.0, 5.0})) | EXPECT_TRUE(matrix.Validate().IsOk()) | ASSERT_EQ(product.Size(), 4U) | EXPECT_DOUBLE_EQ(product[0U], 7.0) | EXPECT_DOUBLE_EQ(product[1U], 0.0) | EXPECT_DOUBLE_EQ(product[2U], 22.0) | EXPECT_DOUBLE_EQ(product[3U], 20.0) | EXPECT_THROW(static_cast(matrix.Multiply(Vector{3U})), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ReducesDuplicatesInFixedTupleOrder SparseAssembly.ReducesDuplicatesInFixedTupleOrder; assertion 7개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.ReducesDuplicatesInFixedTupleOrder 유지 원문 검사 body 및 assertion 동일. 58ef40306d7a2794d3714329bae3ac32fcb28e31493f45d24c5817813cc07a36 58ef40306d7a2794d3714329bae3ac32fcb28e31493f45d24c5817813cc07a36 ASSERT_TRUE(first.HasValue()) | ASSERT_EQ(first.Value().Values().size(), 1U) | EXPECT_DOUBLE_EQ(first.Value().Values()[0U], 1.0) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().RowOffsets(), first.Value().RowOffsets()) | EXPECT_EQ(second.Value().ColumnIndices(), first.Value().ColumnIndices()) | EXPECT_EQ(second.Value().Values(), first.Value().Values()) ASSERT_TRUE(first.HasValue()) | ASSERT_EQ(first.Value().Values().size(), 1U) | EXPECT_DOUBLE_EQ(first.Value().Values()[0U], 1.0) | ASSERT_TRUE(second.HasValue()) | EXPECT_EQ(second.Value().RowOffsets(), first.Value().RowOffsets()) | EXPECT_EQ(second.Value().ColumnIndices(), first.Value().ColumnIndices()) | EXPECT_EQ(second.Value().Values(), first.Value().Values()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/sparse_matrix_test.cpp SparseAssembly.RejectsInvalidIndexPatternAndShape SparseAssembly.RejectsInvalidIndexPatternAndShape; assertion 4개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.RejectsInvalidIndexPatternAndShape 유지 원문 검사 body 및 assertion 동일. 20889c0e8ab98ed0bbfbe684fcf8309c542a55123a6d5f0d7cd97d60cd25d104 20889c0e8ab98ed0bbfbe684fcf8309c542a55123a6d5f0d7cd97d60cd25d104 EXPECT_FALSE(result.HasValue()) | EXPECT_FALSE(result.GetStatus().IsOk()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(result.GetStatus().Diagnostics().empty()) EXPECT_FALSE(result.HasValue()) | EXPECT_FALSE(result.GetStatus().IsOk()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(result.GetStatus().Diagnostics().empty()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/sparse_matrix_test.cpp SparseAssembly.PreservesExpectedStructuralZeros SparseAssembly.PreservesExpectedStructuralZeros; assertion 5개 tests/unit/math/sparse_matrix_test.cpp SparseAssembly.PreservesExpectedStructuralZeros 유지 원문 검사 body 및 assertion 동일. 8a7bf76b61f4852be9d64fe9358d648f2c8be768942738a0785c52ed047ffd27 8a7bf76b61f4852be9d64fe9358d648f2c8be768942738a0785c52ed047ffd27 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().RowOffsets(), pattern.row_offsets) | EXPECT_EQ(result.Value().ColumnIndices(), pattern.column_indices) | EXPECT_EQ(result.Value().Values(), (std::vector{2.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(std::count(result.Value().Values().begin(), result.Value().Values().end(), 0.0), 4) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().RowOffsets(), pattern.row_offsets) | EXPECT_EQ(result.Value().ColumnIndices(), pattern.column_indices) | EXPECT_EQ(result.Value().Values(), (std::vector{2.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(std::count(result.Value().Values().begin(), result.Value().Values().end(), 0.0), 4) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/sparse_matrix_test.cpp support@1-24 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/math/sparse_matrix_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 23c3df79753c201d7b02a8de310b9d238cdef8208af1e40f475ff3d65ccc99b2 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/sparse_matrix_test.cpp support@133-134 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/math/sparse_matrix_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/math/vector3_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 442331d7ccb19a8f989c48d0f71fdfb0f0a6473adf7af53e7a4b477f45b965a4 442331d7ccb19a8f989c48d0f71fdfb0f0a6473adf7af53e7a4b477f45b965a4 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.StoresComponentsWithExactArithmetic Vector3.StoresComponentsWithExactArithmetic; assertion 18개 tests/unit/math/vector3_test.cpp Vector3.StoresComponentsWithExactArithmetic 유지 원문 검사 body 및 assertion 동일. 9a048f9faafa466a70e10b035ee0fe67423b83781ad22e7d0f69c50168b6a353 9a048f9faafa466a70e10b035ee0fe67423b83781ad22e7d0f69c50168b6a353 EXPECT_DOUBLE_EQ(lhs.X(), 1.0) | EXPECT_DOUBLE_EQ(lhs.Y(), -2.0) | EXPECT_DOUBLE_EQ(lhs.Z(), 3.0) | EXPECT_DOUBLE_EQ(lhs[0], 1.0) | EXPECT_DOUBLE_EQ(lhs[1], -2.0) | EXPECT_DOUBLE_EQ(lhs[2], 3.0) | EXPECT_DOUBLE_EQ(sum[0], -3.0) | EXPECT_DOUBLE_EQ(sum[1], 3.0) | EXPECT_DOUBLE_EQ(sum[2], 9.0) | EXPECT_DOUBLE_EQ(difference[0], 5.0) | EXPECT_DOUBLE_EQ(difference[1], -7.0) | EXPECT_DOUBLE_EQ(difference[2], -3.0) | EXPECT_DOUBLE_EQ(scaled[0], -2.0) | EXPECT_DOUBLE_EQ(scaled[1], 4.0) | EXPECT_DOUBLE_EQ(scaled[2], -6.0) | EXPECT_DOUBLE_EQ(divided[0], -0.5) | EXPECT_DOUBLE_EQ(divided[1], 1.0) | EXPECT_DOUBLE_EQ(divided[2], -1.5) EXPECT_DOUBLE_EQ(lhs.X(), 1.0) | EXPECT_DOUBLE_EQ(lhs.Y(), -2.0) | EXPECT_DOUBLE_EQ(lhs.Z(), 3.0) | EXPECT_DOUBLE_EQ(lhs[0], 1.0) | EXPECT_DOUBLE_EQ(lhs[1], -2.0) | EXPECT_DOUBLE_EQ(lhs[2], 3.0) | EXPECT_DOUBLE_EQ(sum[0], -3.0) | EXPECT_DOUBLE_EQ(sum[1], 3.0) | EXPECT_DOUBLE_EQ(sum[2], 9.0) | EXPECT_DOUBLE_EQ(difference[0], 5.0) | EXPECT_DOUBLE_EQ(difference[1], -7.0) | EXPECT_DOUBLE_EQ(difference[2], -3.0) | EXPECT_DOUBLE_EQ(scaled[0], -2.0) | EXPECT_DOUBLE_EQ(scaled[1], 4.0) | EXPECT_DOUBLE_EQ(scaled[2], -6.0) | EXPECT_DOUBLE_EQ(divided[0], -0.5) | EXPECT_DOUBLE_EQ(divided[1], 1.0) | EXPECT_DOUBLE_EQ(divided[2], -1.5) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder; assertion 6개 tests/unit/math/vector3_test.cpp Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder 유지 원문 검사 body 및 assertion 동일. 1f659f46fd78ea02d6456c20cf865a637d8d3e4f2ac5d5fe89ba27741a28c058 1f659f46fd78ea02d6456c20cf865a637d8d3e4f2ac5d5fe89ba27741a28c058 EXPECT_TRUE(value == Vector3(1.25, -2.5, 5.0)) | EXPECT_FALSE(value == Vector3(1.25, -2.5, 4.0)) | EXPECT_EQ(value.Components(), kComponents) | EXPECT_DOUBLE_EQ(scaled.X(), -2.5) | EXPECT_DOUBLE_EQ(scaled.Y(), 5.0) | EXPECT_DOUBLE_EQ(scaled.Z(), -10.0) EXPECT_TRUE(value == Vector3(1.25, -2.5, 5.0)) | EXPECT_FALSE(value == Vector3(1.25, -2.5, 4.0)) | EXPECT_EQ(value.Components(), kComponents) | EXPECT_DOUBLE_EQ(scaled.X(), -2.5) | EXPECT_DOUBLE_EQ(scaled.Y(), 5.0) | EXPECT_DOUBLE_EQ(scaled.Z(), -10.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.ComputesDotProduct Vector3.ComputesDotProduct; assertion 1개 tests/unit/math/vector3_test.cpp Vector3.ComputesDotProduct 유지 원문 검사 body 및 assertion 동일. 6347f32d63b18e488dfb6a66c9bd3efc2c84beb950b8746efb888bbb580722d7 6347f32d63b18e488dfb6a66c9bd3efc2c84beb950b8746efb888bbb580722d7 EXPECT_DOUBLE_EQ(lhs.Dot(rhs), 12.0) EXPECT_DOUBLE_EQ(lhs.Dot(rhs), 12.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.UsesRightHandedCrossProductOrientation Vector3.UsesRightHandedCrossProductOrientation; assertion 6개 tests/unit/math/vector3_test.cpp Vector3.UsesRightHandedCrossProductOrientation 유지 원문 검사 body 및 assertion 동일. f179b78f12bc066ce442f293298397b5fcc9fe03fce8fbd348f33c5fcd13a24a f179b78f12bc066ce442f293298397b5fcc9fe03fce8fbd348f33c5fcd13a24a EXPECT_DOUBLE_EQ(positive_z.X(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Z(), 1.0) | EXPECT_DOUBLE_EQ(negative_z.X(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Z(), -1.0) EXPECT_DOUBLE_EQ(positive_z.X(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(positive_z.Z(), 1.0) | EXPECT_DOUBLE_EQ(negative_z.X(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Y(), 0.0) | EXPECT_DOUBLE_EQ(negative_z.Z(), -1.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.ComputesEuclideanNorm Vector3.ComputesEuclideanNorm; assertion 2개 tests/unit/math/vector3_test.cpp Vector3.ComputesEuclideanNorm 유지 원문 검사 body 및 assertion 동일. 2a865b62e7bd8940e5c9db652503bcd28230dfd4abb9f74a4a91282f0d917499 2a865b62e7bd8940e5c9db652503bcd28230dfd4abb9f74a4a91282f0d917499 EXPECT_DOUBLE_EQ(Vector3(2.0, -3.0, 6.0).Norm(), 7.0) | EXPECT_DOUBLE_EQ(Vector3(1.0e308, 1.0e308, 0.0).Norm(), expected) EXPECT_DOUBLE_EQ(Vector3(2.0, -3.0, 6.0).Norm(), 7.0) | EXPECT_DOUBLE_EQ(Vector3(1.0e308, 1.0e308, 0.0).Norm(), expected) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.NormalizesNonzeroVectors Vector3.NormalizesNonzeroVectors; assertion 4개 tests/unit/math/vector3_test.cpp Vector3.NormalizesNonzeroVectors 유지 원문 검사 body 및 assertion 동일. 6aeabf80f8c56ed0db4cfff4658f47caa3550cc1c042a295dd95dce791e6f329 6aeabf80f8c56ed0db4cfff4658f47caa3550cc1c042a295dd95dce791e6f329 ASSERT_TRUE(normalized.has_value()) | EXPECT_DOUBLE_EQ(normalized->X(), 0.6) | EXPECT_DOUBLE_EQ(normalized->Y(), 0.0) | EXPECT_DOUBLE_EQ(normalized->Z(), 0.8) ASSERT_TRUE(normalized.has_value()) | EXPECT_DOUBLE_EQ(normalized->X(), 0.6) | EXPECT_DOUBLE_EQ(normalized->Y(), 0.0) | EXPECT_DOUBLE_EQ(normalized->Z(), 0.8) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.ReportsFiniteComponents Vector3.ReportsFiniteComponents; assertion 3개 tests/unit/math/vector3_test.cpp Vector3.ReportsFiniteComponents 유지 원문 검사 body 및 assertion 동일. 5ff94e5120d1add8e2e3242698c75c0444e4c7d25ea530eb8adca0d48757cd96 5ff94e5120d1add8e2e3242698c75c0444e4c7d25ea530eb8adca0d48757cd96 EXPECT_TRUE(Vector3(1.0, -2.0, 3.0).IsFinite()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).IsFinite()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).IsFinite()) EXPECT_TRUE(Vector3(1.0, -2.0, 3.0).IsFinite()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).IsFinite()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).IsFinite()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.RejectsZeroAndNonfiniteNormalization Vector3.RejectsZeroAndNonfiniteNormalization; assertion 3개 tests/unit/math/vector3_test.cpp Vector3.RejectsZeroAndNonfiniteNormalization 유지 원문 검사 body 및 assertion 동일. cf0551716b1fac7a6af4c3690316df8e7059b681ba04d6a3dbf376c44c8ab8bb cf0551716b1fac7a6af4c3690316df8e7059b681ba04d6a3dbf376c44c8ab8bb EXPECT_FALSE(Vector3().Normalized().has_value()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).Normalized().has_value()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).Normalized().has_value()) EXPECT_FALSE(Vector3().Normalized().has_value()) | EXPECT_FALSE(Vector3(infinity, 0.0, 0.0).Normalized().has_value()) | EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).Normalized().has_value()) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp Vector3.RightHandedFrameMatchesIndependentCoordinateTransform Vector3.RightHandedFrameMatchesIndependentCoordinateTransform; assertion 5개 tests/unit/math/vector3_test.cpp Vector3.RightHandedFrameMatchesIndependentCoordinateTransform 유지 원문 검사 body 및 assertion 동일. 101b35cfb655b7e66cdabe52c9dce6ba826f420bde08461b676c96f9d1ff3686 101b35cfb655b7e66cdabe52c9dce6ba826f420bde08461b676c96f9d1ff3686 EXPECT_DOUBLE_EQ(x_axis.Dot(global), -3.0) | EXPECT_DOUBLE_EQ(y_axis.Dot(global), 4.0) | EXPECT_DOUBLE_EQ(z_axis.Dot(global), 2.0) | EXPECT_TRUE(recovered == global) | EXPECT_DOUBLE_EQ(x_axis.Dot(y_axis.Cross(z_axis)), 1.0) EXPECT_DOUBLE_EQ(x_axis.Dot(global), -3.0) | EXPECT_DOUBLE_EQ(y_axis.Dot(global), 4.0) | EXPECT_DOUBLE_EQ(z_axis.Dot(global), 2.0) | EXPECT_TRUE(recovered == global) | EXPECT_DOUBLE_EQ(x_axis.Dot(y_axis.Cross(z_axis)), 1.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp support@1-12 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector3_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 6a62e51f185970f04141b3a9d4bb5cda154999b19e74598b53adc1365e34f422 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector3_test.cpp support@128-130 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector3_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/math/vector_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. d1f3266cdc2f7f4c586e7512fe090580a641b270ebe8b0525660fa4e737c788c d1f3266cdc2f7f4c586e7512fe090580a641b270ebe8b0525660fa4e737c788c 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector_test.cpp DenseMath.VectorOwnsAndChecksContiguousStorage DenseMath.VectorOwnsAndChecksContiguousStorage; assertion 31개 tests/unit/math/vector_test.cpp DenseMath.VectorOwnsAndChecksContiguousStorage 유지 원문 검사 body 및 assertion 동일. 4633911f5df21402045699292987f7ed2cec457b562c80c628cfaaea6c7d73ca 4633911f5df21402045699292987f7ed2cec457b562c80c628cfaaea6c7d73ca EXPECT_EQ(empty.Size(), 0U) | EXPECT_DOUBLE_EQ(empty.Norm(), 0.0) | EXPECT_NO_THROW(empty.Scale(3.0)) | EXPECT_NO_THROW(empty.Axpy(-2.0, Vector{0})) | EXPECT_THROW(static_cast(empty[0]), std::out_of_range) | EXPECT_EQ(original.Data() + 1, &original[1]) | EXPECT_EQ(original.Data() + 2, &original[2]) | EXPECT_EQ(const_original.Data() + 2, &const_original[2]) | EXPECT_NE(copied.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[0], 1.0) | EXPECT_NE(copy_assigned.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[1], -2.0) | EXPECT_EQ(copied.Size(), 0U) | EXPECT_EQ(moved.Size(), 3U) | EXPECT_DOUBLE_EQ(moved[0], 99.0) | EXPECT_NO_THROW(copied.Scale(4.0)) | EXPECT_EQ(copy_assigned.Size(), 0U) | EXPECT_EQ(move_assigned.Size(), 3U) | EXPECT_DOUBLE_EQ(move_assigned[1], 17.0) | EXPECT_DOUBLE_EQ(original.Dot(rhs), -24.0) | EXPECT_NEAR(original.Norm(), std::sqrt(14.0), 1.0e-15) | EXPECT_DOUBLE_EQ(scaled[0], -0.5) | EXPECT_DOUBLE_EQ(scaled[1], 1.0) | EXPECT_DOUBLE_EQ(scaled[2], -1.5) | EXPECT_DOUBLE_EQ(accumulated[0], 9.0) | EXPECT_DOUBLE_EQ(accumulated[1], 0.0) | EXPECT_DOUBLE_EQ(accumulated[2], 4.0) | EXPECT_THROW(static_cast(original[3]), std::out_of_range) | EXPECT_THROW(static_cast(const_original[3]), std::out_of_range) | EXPECT_THROW(static_cast(original.Dot(Vector{2})), std::invalid_argument) | EXPECT_THROW(original.Axpy(1.0, Vector{2}), std::invalid_argument) EXPECT_EQ(empty.Size(), 0U) | EXPECT_DOUBLE_EQ(empty.Norm(), 0.0) | EXPECT_NO_THROW(empty.Scale(3.0)) | EXPECT_NO_THROW(empty.Axpy(-2.0, Vector{0})) | EXPECT_THROW(static_cast(empty[0]), std::out_of_range) | EXPECT_EQ(original.Data() + 1, &original[1]) | EXPECT_EQ(original.Data() + 2, &original[2]) | EXPECT_EQ(const_original.Data() + 2, &const_original[2]) | EXPECT_NE(copied.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[0], 1.0) | EXPECT_NE(copy_assigned.Data(), original.Data()) | EXPECT_DOUBLE_EQ(original[1], -2.0) | EXPECT_EQ(copied.Size(), 0U) | EXPECT_EQ(moved.Size(), 3U) | EXPECT_DOUBLE_EQ(moved[0], 99.0) | EXPECT_NO_THROW(copied.Scale(4.0)) | EXPECT_EQ(copy_assigned.Size(), 0U) | EXPECT_EQ(move_assigned.Size(), 3U) | EXPECT_DOUBLE_EQ(move_assigned[1], 17.0) | EXPECT_DOUBLE_EQ(original.Dot(rhs), -24.0) | EXPECT_NEAR(original.Norm(), std::sqrt(14.0), 1.0e-15) | EXPECT_DOUBLE_EQ(scaled[0], -0.5) | EXPECT_DOUBLE_EQ(scaled[1], 1.0) | EXPECT_DOUBLE_EQ(scaled[2], -1.5) | EXPECT_DOUBLE_EQ(accumulated[0], 9.0) | EXPECT_DOUBLE_EQ(accumulated[1], 0.0) | EXPECT_DOUBLE_EQ(accumulated[2], 4.0) | EXPECT_THROW(static_cast(original[3]), std::out_of_range) | EXPECT_THROW(static_cast(const_original[3]), std::out_of_range) | EXPECT_THROW(static_cast(original.Dot(Vector{2})), std::invalid_argument) | EXPECT_THROW(original.Axpy(1.0, Vector{2}), std::invalid_argument) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector_test.cpp DenseMath.VectorRobustNormSelfAliasAndNonfinitePropagation DenseMath.VectorRobustNormSelfAliasAndNonfinitePropagation; assertion 11개 tests/unit/math/vector_test.cpp DenseMath.VectorRobustNormSelfAliasAndNonfinitePropagation 유지 원문 검사 body 및 assertion 동일. 3fa0567d761cc2f34b42ad4d56d197c3c0c3381a063b029dc18c99788a537a37 3fa0567d761cc2f34b42ad4d56d197c3c0c3381a063b029dc18c99788a537a37 EXPECT_NEAR(large.Norm() / 1.0e308, std::sqrt(2.0), 4.0e-16) | EXPECT_NEAR(tiny.Norm() / 1.0e-300, std::sqrt(2.0), 4.0e-16) | EXPECT_DOUBLE_EQ(values[0], -2.0) | EXPECT_DOUBLE_EQ(values[1], 3.0) | EXPECT_DOUBLE_EQ(values.Dot(values), 13.0) | EXPECT_TRUE(std::isnan(nonfinite.Dot(Vector{1U, 1.0}))) | EXPECT_TRUE(std::isnan(nonfinite.Norm())) | EXPECT_NO_THROW(nonfinite.Scale(2.0)) | EXPECT_NO_THROW(nonfinite.Axpy(1.0, Vector{1U, 1.0})) | EXPECT_TRUE(std::isnan(nonfinite[0])) | EXPECT_DOUBLE_EQ(Vector{0U}.Dot(Vector{0U}), 0.0) EXPECT_NEAR(large.Norm() / 1.0e308, std::sqrt(2.0), 4.0e-16) | EXPECT_NEAR(tiny.Norm() / 1.0e-300, std::sqrt(2.0), 4.0e-16) | EXPECT_DOUBLE_EQ(values[0], -2.0) | EXPECT_DOUBLE_EQ(values[1], 3.0) | EXPECT_DOUBLE_EQ(values.Dot(values), 13.0) | EXPECT_TRUE(std::isnan(nonfinite.Dot(Vector{1U, 1.0}))) | EXPECT_TRUE(std::isnan(nonfinite.Norm())) | EXPECT_NO_THROW(nonfinite.Scale(2.0)) | EXPECT_NO_THROW(nonfinite.Axpy(1.0, Vector{1U, 1.0})) | EXPECT_TRUE(std::isnan(nonfinite[0])) | EXPECT_DOUBLE_EQ(Vector{0U}.Dot(Vector{0U}), 0.0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector_test.cpp support@1-12 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. dd78aab9abb37ed986923048995a97daafd7eecb62218be73308b5921c5931c8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/math/vector_test.cpp support@112-114 helper/oracle/fixture/include/static assertion 구간: fesa tests/unit/math/vector_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5e932549438c99fffd1c10c083dc6578d1fc1468e40b446f2d026d6de4c4061d 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/model/domain_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/model/domain_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fc0dd95c444cac746db6083b88376bc8365ccd7d26790dd0dd6d51c3f41d6f77 fc0dd95c444cac746db6083b88376bc8365ccd7d26790dd0dd6d51c3f41d6f77 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/domain_test.cpp ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder; assertion 26개 tests/unit/model/domain_test.cpp ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder 유지 원문 검사 body 및 assertion 동일. f00cd134923f2e7389d5f87d43f04e6608137532bb437bdcc0affa9cae01e560 f00cd134923f2e7389d5f87d43f04e6608137532bb437bdcc0affa9cae01e560 "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Elements().Size(), 2U) | EXPECT_EQ(beam.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(beam.SourceId().source_label_text, ""0007"") | EXPECT_EQ(beam.SourceElementType(), ""B33"") | EXPECT_EQ(beam.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(beam.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(beam.PropertyIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(shell.SourceId().source_label_text, ""0009"") | EXPECT_EQ(shell.SourceElementType(), ""S4R"") | EXPECT_EQ(shell.NodeIndices(), (std::vector{2U, 3U, 4U, 5U})) | EXPECT_EQ(shell.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.PropertyIndex(), fesa::EntityIndex{1U}) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | ASSERT_EQ(domain.ShellElements().Size(), 1U) | EXPECT_EQ(&domain.BeamElements()[0U], &beam) | EXPECT_EQ(&domain.ShellElements()[0U], &shell) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(&domain.LinearElasticMaterials()[0U], &domain.Materials()[0U]) | ASSERT_EQ(domain.Properties().Size(), 2U) | EXPECT_EQ(domain.Properties()[0U].Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(domain.Properties()[1U].Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(&domain.Sections()[0U], &domain.Properties()[0U]) | EXPECT_EQ(&domain.ShellSections()[0U], &domain.Properties()[1U])" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Elements().Size(), 2U) | EXPECT_EQ(beam.Kind(), fesa::ElementDefinitionKind::kEulerBeam3D) | EXPECT_EQ(beam.SourceId().source_label_text, ""0007"") | EXPECT_EQ(beam.SourceElementType(), ""B33"") | EXPECT_EQ(beam.NodeIndices(), (std::vector{0U, 1U})) | EXPECT_EQ(beam.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(beam.PropertyIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.Kind(), fesa::ElementDefinitionKind::kMitc4Shell) | EXPECT_EQ(shell.SourceId().source_label_text, ""0009"") | EXPECT_EQ(shell.SourceElementType(), ""S4R"") | EXPECT_EQ(shell.NodeIndices(), (std::vector{2U, 3U, 4U, 5U})) | EXPECT_EQ(shell.MaterialIndex(), fesa::EntityIndex{0U}) | EXPECT_EQ(shell.PropertyIndex(), fesa::EntityIndex{1U}) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | ASSERT_EQ(domain.ShellElements().Size(), 1U) | EXPECT_EQ(&domain.BeamElements()[0U], &beam) | EXPECT_EQ(&domain.ShellElements()[0U], &shell) | ASSERT_EQ(domain.Materials().Size(), 1U) | EXPECT_EQ(domain.Materials()[0U].Kind(), fesa::MaterialKind::kIsotropicLinearElastic) | EXPECT_EQ(&domain.LinearElasticMaterials()[0U], &domain.Materials()[0U]) | ASSERT_EQ(domain.Properties().Size(), 2U) | EXPECT_EQ(domain.Properties()[0U].Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(domain.Properties()[1U].Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(&domain.Sections()[0U], &domain.Properties()[0U]) | EXPECT_EQ(&domain.ShellSections()[0U], &domain.Properties()[1U])" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/domain_test.cpp DomainModel.ImmutableOwnershipPreservesStableOrder DomainModel.ImmutableOwnershipPreservesStableOrder; assertion 33개 tests/unit/model/domain_test.cpp DomainModel.ImmutableOwnershipPreservesStableOrder 유지 원문 검사 body 및 assertion 동일. c6f7163bdaff86cf5fff21c3d9f5a0f5770dbdecd62f5af2fa64376558bc75b3 c6f7163bdaff86cf5fff21c3d9f5a0f5770dbdecd62f5af2fa64376558bc75b3 "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.SourcePath(), std::filesystem::path{""models/owned.inp""}) | EXPECT_EQ(domain.SourceContentIdentity(), ""fnv1a64:fedcba9876543210"") | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0020"") | EXPECT_DOUBLE_EQ(domain.Nodes()[0].coordinates[0], 2.0) | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes().data(), first_node_address) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[1], 0U) | ASSERT_EQ(domain.Materials().Size(), 1U) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.Sections()[0].section_points[0][0], -0.1) | ASSERT_EQ(domain.NodeSets().size(), 1U) | EXPECT_EQ(domain.NodeSets()[0].node_indices[0], 0U) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(domain.ElementSets()[0].element_indices[0], 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(domain.Steps()[0].InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(domain.Steps()[0].TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MinimumIncrement(), 1.0e-5) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MaximumIncrement(), 1.0) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | ASSERT_EQ(domain.Steps()[0].BoundaryConditions().size(), 6U) | ASSERT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[2U], -1000.0) | ASSERT_EQ(domain.Warnings().size(), 1U) | EXPECT_EQ(domain.Warnings()[0].code, ""ignored-output-request"")" "ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(domain.SourcePath(), std::filesystem::path{""models/owned.inp""}) | EXPECT_EQ(domain.SourceContentIdentity(), ""fnv1a64:fedcba9876543210"") | ASSERT_EQ(domain.Nodes().size(), 2U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 20) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""0020"") | EXPECT_DOUBLE_EQ(domain.Nodes()[0].coordinates[0], 2.0) | EXPECT_EQ(domain.Nodes()[1].source_id.source_label, 10) | EXPECT_EQ(domain.Nodes().data(), first_node_address) | ASSERT_EQ(domain.BeamElements().Size(), 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 1U) | EXPECT_EQ(domain.BeamElements()[0].node_indices[1], 0U) | ASSERT_EQ(domain.Materials().Size(), 1U) | ASSERT_EQ(domain.Sections().Size(), 1U) | EXPECT_DOUBLE_EQ(domain.Sections()[0].section_points[0][0], -0.1) | ASSERT_EQ(domain.NodeSets().size(), 1U) | EXPECT_EQ(domain.NodeSets()[0].node_indices[0], 0U) | ASSERT_EQ(domain.ElementSets().size(), 1U) | EXPECT_EQ(domain.ElementSets()[0].element_indices[0], 0U) | ASSERT_EQ(domain.Steps().Size(), 1U) | EXPECT_EQ(domain.Steps()[0].Name(), ""Step-1"") | EXPECT_DOUBLE_EQ(domain.Steps()[0].InitialIncrement(), 0.1) | EXPECT_DOUBLE_EQ(domain.Steps()[0].TimePeriod(), 1.0) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MinimumIncrement(), 1.0e-5) | EXPECT_DOUBLE_EQ(domain.Steps()[0].MaximumIncrement(), 1.0) | EXPECT_EQ(domain.Steps()[0].ProcedureKind(), fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()) | ASSERT_EQ(domain.Steps()[0].BoundaryConditions().size(), 6U) | ASSERT_EQ(domain.Steps()[0].Loads().size(), 1U) | ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U) | EXPECT_DOUBLE_EQ( domain.Steps()[0].ConcentratedLoads()[0U].GlobalComponents()[2U], -1000.0) | ASSERT_EQ(domain.Warnings().size(), 1U) | EXPECT_EQ(domain.Warnings()[0].code, ""ignored-output-request"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/domain_test.cpp DomainModel.MultipleIdentityInstancesDoNotMerge DomainModel.MultipleIdentityInstancesDoNotMerge; assertion 14개 tests/unit/model/domain_test.cpp DomainModel.MultipleIdentityInstancesDoNotMerge 유지 원문 검사 body 및 assertion 동일. af47d90dfe03fde953119eb419e7f2dc83bbc9da3cab2a7a9a4bc70935e11dbb af47d90dfe03fde953119eb419e7f2dc83bbc9da3cab2a7a9a4bc70935e11dbb "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""1"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label_text, ""1"") | EXPECT_NE(domain.Nodes()[0].source_id.instance_name, domain.Nodes()[2].source_id.instance_name) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[1].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""Instance-A"") | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Instance-B"") | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 0U) | EXPECT_EQ(domain.BeamElements()[1].node_indices[0], 2U)" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.Nodes().size(), 4U) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[2].source_id.source_label, 1) | EXPECT_EQ(domain.Nodes()[0].source_id.source_label_text, ""1"") | EXPECT_EQ(domain.Nodes()[2].source_id.source_label_text, ""1"") | EXPECT_NE(domain.Nodes()[0].source_id.instance_name, domain.Nodes()[2].source_id.instance_name) | ASSERT_EQ(domain.BeamElements().Size(), 2U) | EXPECT_EQ(domain.BeamElements()[0].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[1].source_id.source_label, 1) | EXPECT_EQ(domain.BeamElements()[0].source_id.instance_name, ""Instance-A"") | EXPECT_EQ(domain.BeamElements()[1].source_id.instance_name, ""Instance-B"") | EXPECT_EQ(domain.BeamElements()[0].node_indices[0], 0U) | EXPECT_EQ(domain.BeamElements()[1].node_indices[0], 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/domain_test.cpp DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames; assertion 22개 tests/unit/model/domain_test.cpp DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames 유지 원문 검사 body 및 assertion 동일. 4809f2a671c479fb442749d6d34966a00045cb2fd1d23f849a78fde2982fb76a 4809f2a671c479fb442749d6d34966a00045cb2fd1d23f849a78fde2982fb76a "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ShellElements().Size(), 2U) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label, 20) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0020"") | EXPECT_EQ(domain.ShellElements()[1].source_id.source_label, 10) | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices[3], 7U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""Section-B"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.02) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""Section-A"") | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), 2U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 4U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_TRUE(no_frames_result.HasValue()) | EXPECT_TRUE(no_frames_result.Value().ShellNodeInitialFrames().empty())" "ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(domain.ShellElements().Size(), 2U) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label, 20) | EXPECT_EQ(domain.ShellElements()[0].source_id.source_label_text, ""0020"") | EXPECT_EQ(domain.ShellElements()[1].source_id.source_label, 10) | EXPECT_EQ(domain.ShellElements()[0].source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_EQ(domain.ShellElements()[1].source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(domain.ShellElements()[0].node_indices[3], 7U) | EXPECT_EQ(domain.ShellElements()[0].material_index, 0U) | EXPECT_EQ(domain.ShellElements()[0].section_index, 0U) | ASSERT_EQ(domain.ShellSections().Size(), 2U) | EXPECT_EQ(domain.ShellSections()[0].name, ""Section-B"") | EXPECT_DOUBLE_EQ(domain.ShellSections()[0].thickness, 0.02) | EXPECT_EQ(domain.ShellSections()[0].material_index, 0U) | EXPECT_EQ(domain.ShellSections()[1].name, ""Section-A"") | ASSERT_EQ(domain.ShellNodeInitialFrames().size(), 2U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].node_index, 4U) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].director, (std::array{0.0, 0.0, 1.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_a, (std::array{1.0, 0.0, 0.0})) | EXPECT_EQ(domain.ShellNodeInitialFrames()[0].tangent_b, (std::array{0.0, 1.0, 0.0})) | ASSERT_TRUE(no_frames_result.HasValue()) | EXPECT_TRUE(no_frames_result.Value().ShellNodeInitialFrames().empty())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/domain_test.cpp support@1-70 helper/oracle/fixture/include/static assertion 구간: MakeOwnedDefinition tests/unit/model/domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7f7d1304d91efcd8a4c1dd7ba01764f329b43c89d1282657290910bb34a13014 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/domain_test.cpp support@294-295 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/domain_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eb5700ab2d23b38315cc91249e1dafb93f72ad934048c13f25c663dc769e2529 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/model_types_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/model/model_types_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8e73c0944e4a0592a63c397fe368b2568b35f9b176af5cb8a5f7eb409dd4556c 8e73c0944e4a0592a63c397fe368b2568b35f9b176af5cb8a5f7eb409dd4556c 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/model_types_test.cpp DomainModel.SourceAndInternalIdentityRemainDistinct DomainModel.SourceAndInternalIdentityRemainDistinct; assertion 18개 tests/unit/model/model_types_test.cpp DomainModel.SourceAndInternalIdentityRemainDistinct 유지 원문 검사 body 및 assertion 동일. 1a34a5d22cd39f263dbb8fd33c71d7018509fd118804b50f3f683e33c3b8614f 1a34a5d22cd39f263dbb8fd33c71d7018509fd118804b50f3f683e33c3b8614f "EXPECT_EQ( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(equal_identity.instance_name, equal_identity.source_label, equal_identity.source_label_text)) | EXPECT_LT( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(later_identity.instance_name, later_identity.source_label, later_identity.source_label_text)) | ASSERT_EQ(definition.nodes.size(), 1U) | EXPECT_EQ(definition.nodes[0].source_id.source_label_text, ""0007"") | EXPECT_EQ(definition.nodes[0].location.line, 11U) | ASSERT_EQ(definition.instances.size(), 1U) | EXPECT_EQ(definition.instances[0].part_name, ""BeamPart"") | EXPECT_EQ(definition.instances[0].node_mappings[0].source_label, 7) | EXPECT_EQ(definition.instances[0].node_mappings[0].internal_index, 5U) | EXPECT_EQ(definition.instances[0].element_mappings[0].internal_index, 4U) | EXPECT_EQ(definition.steps[0].initial_increment, 0.1) | EXPECT_EQ(definition.steps[0].time_period, 1.0) | EXPECT_EQ(definition.steps[0].minimum_increment, 1.0e-5) | EXPECT_EQ(definition.steps[0].maximum_increment, 1.0) | EXPECT_EQ(definition.steps[0].procedure_kind, fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(definition.steps[0].nlgeom) | ASSERT_EQ(definition.warnings.size(), 1U) | EXPECT_EQ(definition.warnings[0].location.line, 75U)" "EXPECT_EQ( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(equal_identity.instance_name, equal_identity.source_label, equal_identity.source_label_text)) | EXPECT_LT( std::make_tuple(first_identity.instance_name, first_identity.source_label, first_identity.source_label_text), std::make_tuple(later_identity.instance_name, later_identity.source_label, later_identity.source_label_text)) | ASSERT_EQ(definition.nodes.size(), 1U) | EXPECT_EQ(definition.nodes[0].source_id.source_label_text, ""0007"") | EXPECT_EQ(definition.nodes[0].location.line, 11U) | ASSERT_EQ(definition.instances.size(), 1U) | EXPECT_EQ(definition.instances[0].part_name, ""BeamPart"") | EXPECT_EQ(definition.instances[0].node_mappings[0].source_label, 7) | EXPECT_EQ(definition.instances[0].node_mappings[0].internal_index, 5U) | EXPECT_EQ(definition.instances[0].element_mappings[0].internal_index, 4U) | EXPECT_EQ(definition.steps[0].initial_increment, 0.1) | EXPECT_EQ(definition.steps[0].time_period, 1.0) | EXPECT_EQ(definition.steps[0].minimum_increment, 1.0e-5) | EXPECT_EQ(definition.steps[0].maximum_increment, 1.0) | EXPECT_EQ(definition.steps[0].procedure_kind, fesa::StaticProcedureKind::kLinearSmallDisplacement) | EXPECT_FALSE(definition.steps[0].nlgeom) | ASSERT_EQ(definition.warnings.size(), 1U) | EXPECT_EQ(definition.warnings[0].location.line, 75U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/model_types_test.cpp DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity; assertion 10개 tests/unit/model/model_types_test.cpp DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity 유지 원문 검사 body 및 assertion 동일. 3792a5dbf6bafaea0771dd6167e4dad3d5b97f16d4af9fea1beaad7163bd0757 3792a5dbf6bafaea0771dd6167e4dad3d5b97f16d4af9fea1beaad7163bd0757 "EXPECT_EQ(s4_element.source_id.instance_name, ""Shell-Instance"") | EXPECT_EQ(s4_element.source_id.source_label, 41) | EXPECT_EQ(s4_element.source_id.source_label_text, ""0041"") | EXPECT_EQ(s4_element.source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(s4r_element.source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_NE(s4_element.source_type, s4r_element.source_type) | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | EXPECT_EQ(s4_element.node_indices, (std::array{3U, 5U, 8U, 13U})) | EXPECT_EQ(s4_element.material_index, 2U) | EXPECT_EQ(s4_element.section_index, 7U)" "EXPECT_EQ(s4_element.source_id.instance_name, ""Shell-Instance"") | EXPECT_EQ(s4_element.source_id.source_label, 41) | EXPECT_EQ(s4_element.source_id.source_label_text, ""0041"") | EXPECT_EQ(s4_element.source_type, fesa::ShellSourceElementType::kS4) | EXPECT_EQ(s4r_element.source_type, fesa::ShellSourceElementType::kS4r) | EXPECT_NE(s4_element.source_type, s4r_element.source_type) | EXPECT_EQ(fesa::kMitc4InternalFormulation, std::string_view{""FESA-MITC4""}) | EXPECT_EQ(s4_element.node_indices, (std::array{3U, 5U, 8U, 13U})) | EXPECT_EQ(s4_element.material_index, 2U) | EXPECT_EQ(s4_element.section_index, 7U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/model_types_test.cpp support@1-32 helper/oracle/fixture/include/static assertion 구간: T, HasEquationId, HasEquationIds tests/unit/model/model_types_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bd6932bd12576c905f4c5d95d7902dba5b9be6626cdbee2a8299ecb10b7238c7 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/model_types_test.cpp support@133-134 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/model_types_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7dc636d3db680b7c9af260eae733472a8fbad5992eea8384efe301c7ff01862c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/shell_geometry_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/model/shell_geometry_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3abea01e7cb6543d3f25106cfa97ad5f94c9166a91bf90fbd390a700401d6d9f 3abea01e7cb6543d3f25106cfa97ad5f94c9166a91bf90fbd390a700401d6d9f 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements; assertion 7개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements 유지 원문 검사 body 및 assertion 동일. 89a2ec45af8b97d1f42896e1d0107362659e83a893cf60d7d679786c36f20afe 89a2ec45af8b97d1f42896e1d0107362659e83a893cf60d7d679786c36f20afe ASSERT_TRUE(planar.HasValue()) | ASSERT_EQ(planar.Value().element_data.size(), 1U) | EXPECT_NEAR(planar.Value().element_data[0].surface_area_weight, 1.0, 1.0e-12) | ASSERT_EQ(planar.Value().nodal_frames.size(), 4U) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(warped.HasValue()) | EXPECT_GT(warped.Value().element_data[0].surface_area_weight, 2.0) ASSERT_TRUE(planar.HasValue()) | ASSERT_EQ(planar.Value().element_data.size(), 1U) | EXPECT_NEAR(planar.Value().element_data[0].surface_area_weight, 1.0, 1.0e-12) | ASSERT_EQ(planar.Value().nodal_frames.size(), 4U) | ASSERT_TRUE(rotated.HasValue()) | ASSERT_TRUE(warped.HasValue()) | EXPECT_GT(warped.Value().element_data[0].surface_area_weight, 2.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration; assertion 14개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration 유지 원문 검사 body 및 assertion 동일. c2020cdfcdb7453af2d1504928200ed4e401c22a150f8e0d0b043ef7f27bbdc6 c2020cdfcdb7453af2d1504928200ed4e401c22a150f8e0d0b043ef7f27bbdc6 ASSERT_TRUE(warped.HasValue()) | EXPECT_DOUBLE_EQ(normal.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(normal.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(normal.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(element.surface_area_weight, 0x1.021ebe8f40622p+1) | EXPECT_DOUBLE_EQ(director.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(director.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(director.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(tangent_a.X(), 0x1.ff5e152c2d2abp-1) | EXPECT_DOUBLE_EQ(tangent_a.Y(), -0x1.4408ec773d925p-8) | EXPECT_DOUBLE_EQ(tangent_a.Z(), 0x1.950b27950cf6dp-5) | EXPECT_DOUBLE_EQ(tangent_b.X(), 0.0) | EXPECT_DOUBLE_EQ(tangent_b.Y(), 0x1.fd7583bc82e28p-1) | EXPECT_DOUBLE_EQ(tangent_b.Z(), 0x1.9791363068b53p-4) ASSERT_TRUE(warped.HasValue()) | EXPECT_DOUBLE_EQ(normal.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(normal.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(normal.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(element.surface_area_weight, 0x1.021ebe8f40622p+1) | EXPECT_DOUBLE_EQ(director.X(), -0x1.97105218e28c2p-5) | EXPECT_DOUBLE_EQ(director.Y(), -0x1.97105218e28c2p-4) | EXPECT_DOUBLE_EQ(director.Z(), 0x1.fcd4669f1b2f2p-1) | EXPECT_DOUBLE_EQ(tangent_a.X(), 0x1.ff5e152c2d2abp-1) | EXPECT_DOUBLE_EQ(tangent_a.Y(), -0x1.4408ec773d925p-8) | EXPECT_DOUBLE_EQ(tangent_a.Z(), 0x1.950b27950cf6dp-5) | EXPECT_DOUBLE_EQ(tangent_b.X(), 0.0) | EXPECT_DOUBLE_EQ(tangent_b.Y(), 0x1.fd7583bc82e28p-1) | EXPECT_DOUBLE_EQ(tangent_b.Z(), 0x1.9791363068b53p-4) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder; assertion 2개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder 유지 원문 검사 body 및 assertion 동일. c24fcef294b948a5b0cdbd9fa0822d7d6f18aa2e106569c357417a0f396e89fa c24fcef294b948a5b0cdbd9fa0822d7d6f18aa2e106569c357417a0f396e89fa ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) ASSERT_TRUE(first.HasValue()) | ASSERT_TRUE(second.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases; assertion 0개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases 유지 원문 검사 body 및 assertion 동일. 78afdfd80554bc5d9c2e688f0a7ee1213acaa0be1ba804306d6973825b1447e0 78afdfd80554bc5d9c2e688f0a7ee1213acaa0be1ba804306d6973825b1447e0 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory; assertion 12개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory 유지 원문 검사 body 및 assertion 동일. 0de2e1387e20a29baff982dcaf0fba7b261415b3a5a39c9c635e20f1529aff05 0de2e1387e20a29baff982dcaf0fba7b261415b3a5a39c9c635e20f1529aff05 ASSERT_EQ(points.size(), 17U) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kCenter; }), 1) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kStiffness; }), 8) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kTying; }), 4) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kRecovery; }), 4) | EXPECT_EQ(points.front().natural_coordinates, (Vector3{0.0, 0.0, 0.0})) | EXPECT_EQ(points[1].natural_coordinates, (Vector3{-gauss, -gauss, -gauss})) | EXPECT_EQ(points[8].natural_coordinates, (Vector3{-gauss, gauss, gauss})) | EXPECT_EQ(points[9].natural_coordinates, (Vector3{0.0, -1.0, 0.0})) | EXPECT_EQ(points[12].natural_coordinates, (Vector3{1.0, 0.0, 0.0})) | EXPECT_EQ(points[13].natural_coordinates, (Vector3{-gauss, -gauss, 0.0})) | EXPECT_EQ(points[16].natural_coordinates, (Vector3{-gauss, gauss, 0.0})) ASSERT_EQ(points.size(), 17U) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kCenter; }), 1) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kStiffness; }), 8) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kTying; }), 4) | EXPECT_EQ(std::count_if(points.begin(), points.end(), [](const auto& point) { return point.kind == fesa::ShellGeometryPointKind::kRecovery; }), 4) | EXPECT_EQ(points.front().natural_coordinates, (Vector3{0.0, 0.0, 0.0})) | EXPECT_EQ(points[1].natural_coordinates, (Vector3{-gauss, -gauss, -gauss})) | EXPECT_EQ(points[8].natural_coordinates, (Vector3{-gauss, gauss, gauss})) | EXPECT_EQ(points[9].natural_coordinates, (Vector3{0.0, -1.0, 0.0})) | EXPECT_EQ(points[12].natural_coordinates, (Vector3{1.0, 0.0, 0.0})) | EXPECT_EQ(points[13].natural_coordinates, (Vector3{-gauss, -gauss, 0.0})) | EXPECT_EQ(points[16].natural_coordinates, (Vector3{-gauss, gauss, 0.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.RetainsReciprocalDeterminantOverflowGateAtTinyScale Mitc4Geometry.RetainsReciprocalDeterminantOverflowGateAtTinyScale; assertion 1개 tests/unit/model/shell_geometry_test.cpp Mitc4Geometry.RetainsReciprocalDeterminantOverflowGateAtTinyScale 유지 원문 검사 body 및 assertion 동일. 36cb5ccf5f9110d50f87a34fe24a938659214c715959824e1003d4093e98bcf4 36cb5ccf5f9110d50f87a34fe24a938659214c715959824e1003d4093e98bcf4 EXPECT_TRUE(fesa::PreprocessShellGeometry( nodes, {Element(10U, {0U, 1U, 2U, 3U})}, Sections(2e-99)).HasValue()) EXPECT_TRUE(fesa::PreprocessShellGeometry( nodes, {Element(10U, {0U, 1U, 2U, 3U})}, Sections(2e-99)).HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/shell_geometry_test.cpp support@1-91 helper/oracle/fixture/include/static assertion 구간: Node, Element, Sections, Dot, Cross, Norm, ExpectVectorNear, ExpectRightHandedFrame, FrameFor, find_if, ExpectFailureCode tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7fecde30f91624d167ea26a62c28b4f280b502b07cb5999ed2668cb5db8dcdc8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/shell_geometry_test.cpp support@166-167 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2511c5276f8f705a4d47ef40ba5103972050738b68fd8a2714f3fd319f718b5c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/shell_geometry_test.cpp support@193-194 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 3cb49d9660c0150c0645878e98e94da458f371a63d9cf921dafed78d62b6a4a0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/shell_geometry_test.cpp support@247-248 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 05e26e807ccadaa099d4dc20c9590ec3fa57343328b240c1ed2d4dc9086c1321 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/source_target_resolver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/model/source_target_resolver_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5868bd88560af25dea83f385748c40d274712c9dc28a344fca03f3cab760f8d1 5868bd88560af25dea83f385748c40d274712c9dc28a344fca03f3cab760f8d1 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder; assertion 10개 tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder 유지 원문 검사 body 및 assertion 동일. 371f5279d1b122a9821fe2fa2e841a01f0c7f317f4824c7f1a10eb65bda481be 371f5279d1b122a9821fe2fa2e841a01f0c7f317f4824c7f1a10eb65bda481be "ASSERT_TRUE(nodes.HasValue()) | EXPECT_EQ(Indices(nodes.Value()), (std::vector{0U, 1U})) | EXPECT_EQ(nodes.Value()[0U].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(nodes.Value()[0U].source_id.source_label_text, ""0010"") | ASSERT_TRUE(elements.HasValue()) | EXPECT_EQ(Indices(elements.Value()), (std::vector{4U})) | ASSERT_TRUE(second_instance.HasValue()) | EXPECT_EQ(Indices(second_instance.Value()), (std::vector{2U})) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(Indices(direct.Value()), (std::vector{0U}))" "ASSERT_TRUE(nodes.HasValue()) | EXPECT_EQ(Indices(nodes.Value()), (std::vector{0U, 1U})) | EXPECT_EQ(nodes.Value()[0U].source_id.instance_name, ""Beam-1"") | EXPECT_EQ(nodes.Value()[0U].source_id.source_label_text, ""0010"") | ASSERT_TRUE(elements.HasValue()) | EXPECT_EQ(Indices(elements.Value()), (std::vector{4U})) | ASSERT_TRUE(second_instance.HasValue()) | EXPECT_EQ(Indices(second_instance.Value()), (std::vector{2U})) | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(Indices(direct.Value()), (std::vector{0U}))" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets; assertion 0개 tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets 유지 원문 검사 body 및 assertion 동일. 7a11d0e9feb5f2c40349b3fc51279e275ea27d6030de1e9489786952e1444aef 7a11d0e9feb5f2c40349b3fc51279e275ea27d6030de1e9489786952e1444aef 해당 없음 해당 없음 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder; assertion 7개 tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder 유지 원문 검사 body 및 assertion 동일. 8f72fa1e1fbb347fed00f0ae99086e57086d43ac80984243f2c5ee20bb141c29 8f72fa1e1fbb347fed00f0ae99086e57086d43ac80984243f2c5ee20bb141c29 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 2U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].message, ""Duplicate resolved source target 20."") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].message, ""Duplicate resolved source target 10."")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 2U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].message, ""Duplicate resolved source target 20."") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].code, ""duplicate-source-target"") | EXPECT_EQ(result.GetStatus().Diagnostics()[1U].message, ""Duplicate resolved source target 10."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.OwnsNodeCandidateIndexBeforeDomainCommit SourceTargetResolver.OwnsNodeCandidateIndexBeforeDomainCommit; assertion 10개 tests/unit/model/source_target_resolver_test.cpp SourceTargetResolver.OwnsNodeCandidateIndexBeforeDomainCommit 유지 원문 검사 body 및 assertion 동일. 9d4031c4c481dd1976681735a372eca73ebff8a010443fe0a0097a098182c864 9d4031c4c481dd1976681735a372eca73ebff8a010443fe0a0097a098182c864 "ASSERT_TRUE(ends.HasValue()) | EXPECT_EQ(Indices(ends.Value()), (std::vector{1U, 0U})) | EXPECT_EQ(ends.Value()[0U].source_id.source_label_text, ""0010"") | EXPECT_EQ(ends.Value()[1U].source_id.source_label_text, ""0020"") | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(Indices(direct.Value()), (std::vector{2U})) | ASSERT_FALSE(repeated.HasValue()) | ASSERT_EQ(repeated.GetStatus().Diagnostics().size(), 2U) | EXPECT_EQ(repeated.GetStatus().Diagnostics()[0U].message, ""Duplicate resolved source target 0020."") | EXPECT_EQ(repeated.GetStatus().Diagnostics()[1U].message, ""Duplicate resolved source target 0010."")" "ASSERT_TRUE(ends.HasValue()) | EXPECT_EQ(Indices(ends.Value()), (std::vector{1U, 0U})) | EXPECT_EQ(ends.Value()[0U].source_id.source_label_text, ""0010"") | EXPECT_EQ(ends.Value()[1U].source_id.source_label_text, ""0020"") | ASSERT_TRUE(direct.HasValue()) | EXPECT_EQ(Indices(direct.Value()), (std::vector{2U})) | ASSERT_FALSE(repeated.HasValue()) | ASSERT_EQ(repeated.GetStatus().Diagnostics().size(), 2U) | EXPECT_EQ(repeated.GetStatus().Diagnostics()[0U].message, ""Duplicate resolved source target 0020."") | EXPECT_EQ(repeated.GetStatus().Diagnostics()[1U].message, ""Duplicate resolved source target 0010."")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/source_target_resolver_test.cpp support@1-52 helper/oracle/fixture/include/static assertion 구간: Entry, Indices, for, ExpectFailure tests/unit/model/source_target_resolver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. cea5c6ff21dff6057da6621ea47cd0fcb5ec20f1f524551e8bae951791033aa8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/thermal_semantics_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/model/thermal_semantics_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e35fdae0a9d314a157526b4ebd72ff54eef3f8123b3646fd8f5f3c50b39bbaea e35fdae0a9d314a157526b4ebd72ff54eef3f8123b3646fd8f5f3c50b39bbaea 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalDomain.StructuralDefinitionHasNoThermalStep ThermalDomain.StructuralDefinitionHasNoThermalStep; assertion 2개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.StructuralDefinitionHasNoThermalStep 유지 원문 검사 body 및 assertion 동일. 5109e39fa2bd304e84323c45a63bff6d6948c4f8e385006533847d897edbb852 5109e39fa2bd304e84323c45a63bff6d6948c4f8e385006533847d897edbb852 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalStep(), nullptr) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().ThermalStep(), nullptr) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp IsotropicThermalMaterial.RequiresFinitePositivePropertiesAndIdentity IsotropicThermalMaterial.RequiresFinitePositivePropertiesAndIdentity; assertion 9개 tests/unit/model/thermal_semantics_test.cpp IsotropicThermalMaterial.RequiresFinitePositivePropertiesAndIdentity 유지 원문 검사 body 및 assertion 동일. 3eec96a6aa43b48716c7ef05b78fc8e81f08777ca547164a676e7ba5b64987ee 3eec96a6aa43b48716c7ef05b78fc8e81f08777ca547164a676e7ba5b64987ee "ASSERT_TRUE(valid.HasValue()) | EXPECT_EQ(valid.Value().Kind(), fesa::MaterialKind::kIsotropicThermal) | EXPECT_DOUBLE_EQ(valid.Value().Conductivity(), 45.0) | EXPECT_DOUBLE_EQ(valid.Value().Density(), 7800.0) | EXPECT_DOUBLE_EQ(valid.Value().SpecificHeat(), 500.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create({"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 0.0, 500.0, Location()) .HasValue()) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create( {"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 7800.0, std::numeric_limits::quiet_NaN(), Location()) .HasValue())" "ASSERT_TRUE(valid.HasValue()) | EXPECT_EQ(valid.Value().Kind(), fesa::MaterialKind::kIsotropicThermal) | EXPECT_DOUBLE_EQ(valid.Value().Conductivity(), 45.0) | EXPECT_DOUBLE_EQ(valid.Value().Density(), 7800.0) | EXPECT_DOUBLE_EQ(valid.Value().SpecificHeat(), 500.0) | ASSERT_FALSE(invalid.HasValue()) | EXPECT_EQ(invalid.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create({"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 0.0, 500.0, Location()) .HasValue()) | EXPECT_FALSE(fesa::IsotropicThermalMaterial::Create( {"""", 7, ""Thermal-Steel""}, ""Thermal-Steel"", 45.0, 7800.0, std::numeric_limits::quiet_NaN(), Location()) .HasValue())" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalDomain.OwnsFiveStationDefinitionsWithoutEquationState ThermalDomain.OwnsFiveStationDefinitionsWithoutEquationState; assertion 11개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.OwnsFiveStationDefinitionsWithoutEquationState 유지 원문 검사 body 및 assertion 동일. e6d226842e76067fc438dfd669bd073c05be7a9be7895ab909ad06d4ab8a0e72 e6d226842e76067fc438dfd669bd073c05be7a9be7895ab909ad06d4ab8a0e72 ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].Kind(), fesa::ElementDefinitionKind::kDs4Thermal) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | EXPECT_EQ(domain.ThermalElements()[0U].NodeIndices(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ThermalInitialConditions()[0U].station_values, (std::array{12.5, 12.5, 12.5, 12.5, 12.5})) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0U].value, 20.0) | EXPECT_EQ(domain.ThermalStep()->Loads()[0U].source_order, 0U) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kBottom), 11) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kTop), 15) ASSERT_TRUE(result.HasValue()) | ASSERT_NE(domain.ThermalStep(), nullptr) | EXPECT_EQ(domain.ThermalElements().Size(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].Kind(), fesa::ElementDefinitionKind::kDs4Thermal) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | EXPECT_EQ(domain.ThermalElements()[0U].NodeIndices(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(domain.ThermalInitialConditions()[0U].station_values, (std::array{12.5, 12.5, 12.5, 12.5, 12.5})) | EXPECT_EQ(domain.ThermalStep()->Boundaries()[0U].value, 20.0) | EXPECT_EQ(domain.ThermalStep()->Loads()[0U].source_order, 0U) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kBottom), 11) | EXPECT_EQ(static_cast(fesa::ThermalDofComponent::kTop), 15) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInactiveTargetsConflictsAndMixedElements ThermalDomain.RejectsInactiveTargetsConflictsAndMixedElements; assertion 8개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInactiveTargetsConflictsAndMixedElements 유지 원문 검사 body 및 assertion 동일. 69b1b68b51176ef0a39d57b5c5899bc6c935fc3e6a82850b7634f13895ae26d6 69b1b68b51176ef0a39d57b5c5899bc6c935fc3e6a82850b7634f13895ae26d6 ASSERT_FALSE(inactive.HasValue()) | EXPECT_EQ(inactive.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(conflicting.HasValue()) | EXPECT_EQ(conflicting.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(mixed.HasValue()) | EXPECT_EQ(mixed.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(invalid_thickness.HasValue()) | EXPECT_EQ(invalid_thickness.GetStatus().Category(), fesa::FailureCategory::kModel) ASSERT_FALSE(inactive.HasValue()) | EXPECT_EQ(inactive.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(conflicting.HasValue()) | EXPECT_EQ(conflicting.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(mixed.HasValue()) | EXPECT_EQ(mixed.GetStatus().Category(), fesa::FailureCategory::kModel) | ASSERT_FALSE(invalid_thickness.HasValue()) | EXPECT_EQ(invalid_thickness.GetStatus().Category(), fesa::FailureCategory::kModel) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalDomain.AllowsEqualInitialTargetsAndStepBoundaryOverride ThermalDomain.AllowsEqualInitialTargetsAndStepBoundaryOverride; assertion 4개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.AllowsEqualInitialTargetsAndStepBoundaryOverride 유지 원문 검사 body 및 assertion 동일. 7d2f88248ba8df15e130f352f1bcbce0886e513bfd575bcdf66862383f86ce12 7d2f88248ba8df15e130f352f1bcbce0886e513bfd575bcdf66862383f86ce12 EXPECT_TRUE(equal_initial.HasValue()) | ASSERT_FALSE(conflicting_initial.HasValue()) | EXPECT_EQ(conflicting_initial.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(overriding_step.HasValue()) EXPECT_TRUE(equal_initial.HasValue()) | ASSERT_FALSE(conflicting_initial.HasValue()) | EXPECT_EQ(conflicting_initial.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_TRUE(overriding_step.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInteriorThermalDofsAndInactiveFluxTargets ThermalDomain.RejectsInteriorThermalDofsAndInactiveFluxTargets; assertion 4개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.RejectsInteriorThermalDofsAndInactiveFluxTargets 유지 원문 검사 body 및 assertion 동일. 1e9cbd5b4303fc6d2706eda68d786d4bec26fe554c7043554f04b8588b7455f3 1e9cbd5b4303fc6d2706eda68d786d4bec26fe554c7043554f04b8588b7455f3 EXPECT_FALSE(boundary.HasValue()) | EXPECT_FALSE(flux.HasValue()) | EXPECT_FALSE(inactive_flux.HasValue()) | EXPECT_FALSE(inactive_boundary.HasValue()) EXPECT_FALSE(boundary.HasValue()) | EXPECT_FALSE(flux.HasValue()) | EXPECT_FALSE(inactive_flux.HasValue()) | EXPECT_FALSE(inactive_boundary.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalDomain.PreservesAdditiveFluxSourceOrder ThermalDomain.PreservesAdditiveFluxSourceOrder; assertion 6개 tests/unit/model/thermal_semantics_test.cpp ThermalDomain.PreservesAdditiveFluxSourceOrder 유지 원문 검사 body 및 assertion 동일. dd1914d0d09fc94c82e24118f005fc7d1ff4b5c31ceb318021508b6239a26a79 dd1914d0d09fc94c82e24118f005fc7d1ff4b5c31ceb318021508b6239a26a79 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0U].source_order, 0U) | EXPECT_EQ(loads[1U].source_order, 1U) | EXPECT_DOUBLE_EQ(loads[0U].power, -5.0) | EXPECT_DOUBLE_EQ(loads[1U].power, 3.0) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(loads.size(), 2U) | EXPECT_EQ(loads[0U].source_order, 0U) | EXPECT_EQ(loads[1U].source_order, 1U) | EXPECT_DOUBLE_EQ(loads[0U].power, -5.0) | EXPECT_DOUBLE_EQ(loads[1U].power, 3.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.KeepsThermalSectionMaterialIndicesSeparateFromDomainMaterials ThermalAnalysisModel.KeepsThermalSectionMaterialIndicesSeparateFromDomainMaterials; assertion 12개 tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.KeepsThermalSectionMaterialIndicesSeparateFromDomainMaterials 유지 원문 검사 body 및 assertion 동일. 550c29842bdef0f9518150f2f263f6c2302ce2d0c108607913f3833bfbd9ace2 550c29842bdef0f9518150f2f263f6c2302ce2d0c108607913f3833bfbd9ace2 ASSERT_TRUE(domain_result.HasValue()) | ASSERT_EQ(domain.Materials().Size(), 3U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 1U) | EXPECT_EQ(domain.ThermalSections()[1U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 2U) | EXPECT_EQ(domain.ThermalElements()[1U].MaterialIndex(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model_result.Value().ActiveThermalMaterials(), (std::vector{0U, 1U})) | EXPECT_EQ(model_result.Value().ActiveThermalSections(), (std::vector{0U, 1U})) | EXPECT_TRUE(model_result.Value().ActiveProperties().empty()) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_EQ(domain.Materials().Size(), 3U) | ASSERT_EQ(domain.ThermalMaterials().Size(), 2U) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 1U) | EXPECT_EQ(domain.ThermalSections()[1U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 2U) | EXPECT_EQ(domain.ThermalElements()[1U].MaterialIndex(), 1U) | EXPECT_EQ(domain.ThermalElements()[0U].PropertyIndex(), fesa::Ds4ThermalDefinition::kNoPropertyIndex) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_EQ(model_result.Value().ActiveThermalMaterials(), (std::vector{0U, 1U})) | EXPECT_EQ(model_result.Value().ActiveThermalSections(), (std::vector{0U, 1U})) | EXPECT_TRUE(model_result.Value().ActiveProperties().empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.ViewsConnectedDs4EntitiesWithoutOwningDomain ThermalAnalysisModel.ViewsConnectedDs4EntitiesWithoutOwningDomain; assertion 17개 tests/unit/model/thermal_semantics_test.cpp ThermalAnalysisModel.ViewsConnectedDs4EntitiesWithoutOwningDomain 유지 원문 검사 body 및 assertion 동일. 509fa86c25fb97bf5c46d2eb7dfe513ac53a0fbceef40979b47ed0a740fbac7c 509fa86c25fb97bf5c46d2eb7dfe513ac53a0fbceef40979b47ed0a740fbac7c ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_TRUE(model.IsThermal()) | EXPECT_EQ(model.ThermalStep(), domain.ThermalStep()) | EXPECT_THROW(model.Step(), std::logic_error) | EXPECT_EQ(model.ActiveThermalElements(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalNodes(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveThermalMaterials(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalSections(), (std::vector{0U})) | EXPECT_TRUE(model.ActiveProperties().empty()) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 0U) | EXPECT_EQ(&model.GetDomain(), &domain) | ASSERT_TRUE(moved_model.HasValue()) | EXPECT_EQ(&moved_model.Value().GetDomain(), &moved_domain) | EXPECT_DOUBLE_EQ(moved_domain.ThermalMaterials()[0U].Conductivity(), 45.0) | EXPECT_EQ(moved_domain.ThermalElements()[0U].SourceId().source_label, 8) ASSERT_TRUE(domain_result.HasValue()) | ASSERT_TRUE(model_result.HasValue()) | EXPECT_TRUE(model.IsThermal()) | EXPECT_EQ(model.ThermalStep(), domain.ThermalStep()) | EXPECT_THROW(model.Step(), std::logic_error) | EXPECT_EQ(model.ActiveThermalElements(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalNodes(), (std::vector{0U, 1U, 2U, 3U})) | EXPECT_EQ(model.ActiveThermalMaterials(), (std::vector{0U})) | EXPECT_EQ(model.ActiveThermalSections(), (std::vector{0U})) | EXPECT_TRUE(model.ActiveProperties().empty()) | EXPECT_EQ(domain.ThermalSections()[0U].material_index, 0U) | EXPECT_EQ(domain.ThermalElements()[0U].MaterialIndex(), 0U) | EXPECT_EQ(&model.GetDomain(), &domain) | ASSERT_TRUE(moved_model.HasValue()) | EXPECT_EQ(&moved_model.Value().GetDomain(), &moved_domain) | EXPECT_DOUBLE_EQ(moved_domain.ThermalMaterials()[0U].Conductivity(), 45.0) | EXPECT_EQ(moved_domain.ThermalElements()[0U].SourceId().source_label, 8) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/model/thermal_semantics_test.cpp support@1-50 helper/oracle/fixture/include/static assertion 구간: Location, ValidDefinition tests/unit/model/thermal_semantics_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 34019d56ebed3f1fa39477e5c1846c9610f380a4cec751b860088f6e6ce221ba 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/thermal_shell_geometry_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 11개 tests/unit/model/thermal_shell_geometry_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 2011bdeb9d673496a31e6ee31317452fb401fbfefb928cd97d085c99406dd033 2011bdeb9d673496a31e6ee31317452fb401fbfefb928cd97d085c99406dd033 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.CertifiesAffineDistortedSaddleAndSlenderPatches ThermalShellGeometry.CertifiesAffineDistortedSaddleAndSlenderPatches; assertion 5개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.CertifiesAffineDistortedSaddleAndSlenderPatches 유지 원문 검사 body 및 assertion 동일. 48147bb1a29cb0d24551a12e8a96d748c81fa670f440912e1d99901118128f8c 48147bb1a29cb0d24551a12e8a96d748c81fa670f440912e1d99901118128f8c EXPECT_TRUE(Kernel(kSquare).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {3, 1, 0}, {1, 1, 0}}}).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {1.5, 1, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_TRUE(Kernel({{{0, 0, 0}, {1, 0, 0}, {1, std::ldexp(1., -40), 0}, {0, std::ldexp(1., -40), 0}}}) .HasValue()) | EXPECT_TRUE( Kernel({{{-1, -1, a}, {1, -1, -a}, {1, 1, a}, {-1, 1, -a}}}).HasValue()) EXPECT_TRUE(Kernel(kSquare).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {3, 1, 0}, {1, 1, 0}}}).HasValue()) | EXPECT_TRUE( Kernel({{{0, 0, 0}, {2, 0, 0}, {1.5, 1, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_TRUE(Kernel({{{0, 0, 0}, {1, 0, 0}, {1, std::ldexp(1., -40), 0}, {0, std::ldexp(1., -40), 0}}}) .HasValue()) | EXPECT_TRUE( Kernel({{{-1, -1, a}, {1, -1, -a}, {1, 1, a}, {-1, 1, -a}}}).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.PowerOfTwoScalingTranslationAndRotation ThermalShellGeometry.PowerOfTwoScalingTranslationAndRotation; assertion 3개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.PowerOfTwoScalingTranslationAndRotation 유지 원문 검사 body 및 assertion 동일. 5a22e1006b798b2d4a9544a4ee6af30a969558a0bafaba3dfc98634d36b62ff8 5a22e1006b798b2d4a9544a4ee6af30a969558a0bafaba3dfc98634d36b62ff8 EXPECT_TRUE(Kernel(patch).HasValue()) | EXPECT_TRUE(Kernel(translated).HasValue()) | EXPECT_TRUE(Kernel(rotated).HasValue()) EXPECT_TRUE(Kernel(patch).HasValue()) | EXPECT_TRUE(Kernel(translated).HasValue()) | EXPECT_TRUE(Kernel(rotated).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsWholePatchSingularityDespiteNonzeroGaussPoints ThermalShellGeometry.RejectsWholePatchSingularityDespiteNonzeroGaussPoints; assertion 4개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsWholePatchSingularityDespiteNonzeroGaussPoints 유지 원문 검사 body 및 assertion 동일. d4f657f21765c36aeb85cb4ef44f7eb0da408aaa215d6264aa01ae008fe24134 d4f657f21765c36aeb85cb4ef44f7eb0da408aaa215d6264aa01ae008fe24134 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].entity_identity, ""part:0027"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 17U) | EXPECT_GT(std::abs(q - .25), 0.)" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].entity_identity, ""part:0027"") | EXPECT_EQ(result.GetStatus().Diagnostics()[0].location.line, 17U) | EXPECT_GT(std::abs(q - .25), 0.)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsInvalidAndDoesNotRepairUncertainGeometry ThermalShellGeometry.RejectsInvalidAndDoesNotRepairUncertainGeometry; assertion 6개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsInvalidAndDoesNotRepairUncertainGeometry 유지 원문 검사 body 및 assertion 동일. 8507137261c0e52029ab56b39af1e9434cf478fcf9870c9d474c8f61ffb75f0e 8507137261c0e52029ab56b39af1e9434cf478fcf9870c9d474c8f61ffb75f0e "EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 1, 0}, {1, 0, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 0, 0}, {2, 0, 0}, {3, 0, 0}}}).HasValue()) | EXPECT_FALSE(Kernel(repeated).HasValue()) | EXPECT_FALSE(Kernel(patch).HasValue()) | EXPECT_FALSE(duplicate.HasValue()) | EXPECT_EQ(uncertain.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-geometry"")" "EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 1, 0}, {1, 0, 0}, {0, 1, 0}}}).HasValue()) | EXPECT_FALSE( Kernel({{{0, 0, 0}, {1, 0, 0}, {2, 0, 0}, {3, 0, 0}}}).HasValue()) | EXPECT_FALSE(Kernel(repeated).HasValue()) | EXPECT_FALSE(Kernel(patch).HasValue()) | EXPECT_FALSE(duplicate.HasValue()) | EXPECT_EQ(uncertain.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-geometry"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainEnforcesOppositeEdgesAndOneVertexLink ThermalShellGeometry.DomainEnforcesOppositeEdgesAndOneVertexLink; assertion 5개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainEnforcesOppositeEdgesAndOneVertexLink 유지 원문 검사 body 및 assertion 동일. 960d6f8e2311e574bde5319cf21f80fd621f40068ceba6271b3341a91f01e523 960d6f8e2311e574bde5319cf21f80fd621f40068ceba6271b3341a91f01e523 EXPECT_TRUE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{2, 5, 4, 1}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{0, 1, 2, 3}}}))) | EXPECT_FALSE(Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {-1, -1, 0}, {0, -1, 0}, {-1, 0, 0}}, {{{0, 1, 2, 3}}, {{0, 6, 4, 5}}}))) | EXPECT_FALSE( Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {2, 0, 0}, {2, 1, 0}, {1, 0, 1}, {1, 1, 1}}, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}, {{1, 6, 7, 2}}}))) EXPECT_TRUE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{2, 5, 4, 1}}}))) | EXPECT_FALSE(Accepted(Mesh(nodes, {{{0, 1, 2, 3}}, {{0, 1, 2, 3}}}))) | EXPECT_FALSE(Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {-1, -1, 0}, {0, -1, 0}, {-1, 0, 0}}, {{{0, 1, 2, 3}}, {{0, 6, 4, 5}}}))) | EXPECT_FALSE( Accepted(Mesh({{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {2, 0, 0}, {2, 1, 0}, {1, 0, 1}, {1, 1, 1}}, {{{0, 1, 2, 3}}, {{1, 4, 5, 2}}, {{1, 6, 7, 2}}}))) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainAllowsFoldAndDisconnectedCoordinateContact ThermalShellGeometry.DomainAllowsFoldAndDisconnectedCoordinateContact; assertion 3개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainAllowsFoldAndDisconnectedCoordinateContact 유지 원문 검사 body 및 assertion 동일. 5249d8d88ee57a712425ba038be3bac4ade7db9c481b522d83c2caade689a80f 5249d8d88ee57a712425ba038be3bac4ade7db9c481b522d83c2caade689a80f EXPECT_TRUE(Accepted(std::move(folded))) | EXPECT_TRUE(Accepted(disconnected)) | EXPECT_TRUE(Accepted(disconnected)) EXPECT_TRUE(Accepted(std::move(folded))) | EXPECT_TRUE(Accepted(disconnected)) | EXPECT_TRUE(Accepted(disconnected)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainRejectsSourceSharingPartialEdgeWithoutGlobalScan ThermalShellGeometry.DomainRejectsSourceSharingPartialEdgeWithoutGlobalScan; assertion 3개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.DomainRejectsSourceSharingPartialEdgeWithoutGlobalScan 유지 원문 검사 body 및 assertion 동일. 0c84d4620600808611f9c67496c87bba5ea2baddc6714c78facfcac24d1d4cfb 0c84d4620600808611f9c67496c87bba5ea2baddc6714c78facfcac24d1d4cfb "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-connection"") | EXPECT_FALSE(Accepted(invalid))" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-connection"") | EXPECT_FALSE(Accepted(invalid))" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.SearchesSeparatingDirectionsBeyondCenterAndCorners ThermalShellGeometry.SearchesSeparatingDirectionsBeyondCenterAndCorners; assertion 2개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.SearchesSeparatingDirectionsBeyondCenterAndCorners 유지 원문 검사 body 및 assertion 동일. e9e9cca17d49ca10988a52883efca96de60507cb1cf1af5a467e096037879591 e9e9cca17d49ca10988a52883efca96de60507cb1cf1af5a467e096037879591 EXPECT_TRUE( Kernel({{{3, -9, -3}, {1, 3, -3}, {-1, 3, 3}, {-3, 3, 3}}}).HasValue()) | EXPECT_TRUE( Kernel({{{-1, 4, -4}, {-1, -2, 2}, {3, 2, 4}, {-1, -4, -2}}}).HasValue()) EXPECT_TRUE( Kernel({{{3, -9, -3}, {1, 3, -3}, {-1, 3, 3}, {-3, 3, 3}}}).HasValue()) | EXPECT_TRUE( Kernel({{{-1, 4, -4}, {-1, -2, 2}, {3, 2, 4}, {-1, -4, -2}}}).HasValue()) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsAliasedSourceIdentityAndAcceptsClosedVertexLink ThermalShellGeometry.RejectsAliasedSourceIdentityAndAcceptsClosedVertexLink; assertion 2개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalShellGeometry.RejectsAliasedSourceIdentityAndAcceptsClosedVertexLink 유지 원문 검사 body 및 assertion 동일. 5fc28937a2442f6232fecc5edfa705ee8777c0a5e5a5395d16875e9e7613ea60 5fc28937a2442f6232fecc5edfa705ee8777c0a5e5a5395d16875e9e7613ea60 EXPECT_FALSE(Accepted(aliases)) | EXPECT_TRUE(Accepted( Mesh({{-1, -1, 0}, {0, -1, 0}, {1, -1, 0}, {-1, 0, 0}, {0, 0, 0}, {1, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {1, 1, 0}}, {{{0, 1, 4, 3}}, {{1, 2, 5, 4}}, {{3, 4, 7, 6}}, {{4, 5, 8, 7}}}))) EXPECT_FALSE(Accepted(aliases)) | EXPECT_TRUE(Accepted( Mesh({{-1, -1, 0}, {0, -1, 0}, {1, -1, 0}, {-1, 0, 0}, {0, 0, 0}, {1, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {1, 1, 0}}, {{{0, 1, 4, 3}}, {{1, 2, 5, 4}}, {{3, 4, 7, 6}}, {{4, 5, 8, 7}}}))) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalGeometryAction.EnclosesIndependentDyadicTangentialConstraints ThermalGeometryAction.EnclosesIndependentDyadicTangentialConstraints; assertion 4개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalGeometryAction.EnclosesIndependentDyadicTangentialConstraints 유지 원문 검사 body 및 assertion 동일. 5db2ebc49bd654247d3660c7e89544f1609d6dd7bdbabe45cb56fede676e90c3 5db2ebc49bd654247d3660c7e89544f1609d6dd7bdbabe45cb56fede676e90c3 ASSERT_TRUE(evaluated.HasValue()) | EXPECT_DOUBLE_EQ(evaluated.Value().gradient[i][j],oracle[j]) | EXPECT_LE(interval.lower,oracle[j]) | EXPECT_GE(interval.upper,oracle[j]) ASSERT_TRUE(evaluated.HasValue()) | EXPECT_DOUBLE_EQ(evaluated.Value().gradient[i][j],oracle[j]) | EXPECT_LE(interval.lower,oracle[j]) | EXPECT_GE(interval.upper,oracle[j]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp ThermalGeometryAction.PreservesWholePatchAndScaledFiniteRejections ThermalGeometryAction.PreservesWholePatchAndScaledFiniteRejections; assertion 8개 tests/unit/model/thermal_shell_geometry_test.cpp ThermalGeometryAction.PreservesWholePatchAndScaledFiniteRejections 유지 원문 검사 body 및 assertion 동일. acd1faa4c8b61cf0b3d4048793883560afd74d5bbd7296d069f05e8d66084ca6 acd1faa4c8b61cf0b3d4048793883560afd74d5bbd7296d069f05e8d66084ca6 "ASSERT_TRUE(geometry.HasValue()) | EXPECT_TRUE(EvaluateSurface(geometry.Value(),xi,eta, Interval{Down(xi),Up(xi)},Interval{Down(eta),Up(eta)},{},{}).HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-geometry"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].entity_identity,""part:0027"") | ASSERT_FALSE(scaled.HasValue()) | EXPECT_EQ(scaled.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-metric"") | EXPECT_EQ(scaled.GetStatus().Diagnostics()[0].message, ""Metric inverse enclosure is not finite or excludes no zero divisor."")" "ASSERT_TRUE(geometry.HasValue()) | EXPECT_TRUE(EvaluateSurface(geometry.Value(),xi,eta, Interval{Down(xi),Up(xi)},Interval{Down(eta),Up(eta)},{},{}).HasValue()) | ASSERT_FALSE(rejected.HasValue()) | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-geometry"") | EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].entity_identity,""part:0027"") | ASSERT_FALSE(scaled.HasValue()) | EXPECT_EQ(scaled.GetStatus().Diagnostics()[0].code, ""uncertain-thermal-shell-metric"") | EXPECT_EQ(scaled.GetStatus().Diagnostics()[0].message, ""Metric inverse enclosure is not finite or excludes no zero divisor."")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/model/thermal_shell_geometry_test.cpp support@1-49 helper/oracle/fixture/include/static assertion 구간: Kernel, Mesh, Accepted tests/unit/model/thermal_shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 0820f520a641142881a56e7077bafb01de08e918672b8c044c696f5d739ae5fe 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/thermal_shell_geometry_test.cpp support@214-215 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/thermal_shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. f4f8121dd2388b30f27a1454c1f3bd3ed0db6b42a9f01bb0e4cc53e5a048e339 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/model/thermal_shell_geometry_test.cpp support@278-278 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/model/thermal_shell_geometry_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c7bfe2f3de133d78a2bc8bb1c4a08450563986ee8254facee698e1dcc57e8162 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/properties/element_property_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/properties/element_property_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 37fe800c84baee1240c919337d93fdaf0b06540901fcf27c1de88b3cab07b049 37fe800c84baee1240c919337d93fdaf0b06540901fcf27c1de88b3cab07b049 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/properties/element_property_test.cpp ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase; assertion 13개 tests/unit/properties/element_property_test.cpp ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase 유지 원문 검사 body 및 assertion 동일. a82ebec7392b40890b5e5f520cf3384a81f765e1e258cd5c1062052283df0479 a82ebec7392b40890b5e5f520cf3384a81f765e1e258cd5c1062052283df0479 "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(property->SourceId().source_label, 4) | EXPECT_EQ(property->SourceId().source_label_text, ""BeamSection"") | EXPECT_EQ(section.Name(), ""BeamSection"") | EXPECT_DOUBLE_EQ(section.Area(), 0.02) | EXPECT_DOUBLE_EQ(section.I11(), 1.0e-5) | EXPECT_DOUBLE_EQ(section.I12(), 0.0) | EXPECT_DOUBLE_EQ(section.I22(), 2.0e-5) | EXPECT_DOUBLE_EQ(section.TorsionalConstant(), 5.0e-6) | EXPECT_EQ(section.FirstAxis(), (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.SectionPoints(), (std::vector>{{-0.1, 0.0}, {0.1, 0.0}})) | EXPECT_EQ(section.Location().line, 40U)" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kGeneralBeamSection) | EXPECT_EQ(property->SourceId().source_label, 4) | EXPECT_EQ(property->SourceId().source_label_text, ""BeamSection"") | EXPECT_EQ(section.Name(), ""BeamSection"") | EXPECT_DOUBLE_EQ(section.Area(), 0.02) | EXPECT_DOUBLE_EQ(section.I11(), 1.0e-5) | EXPECT_DOUBLE_EQ(section.I12(), 0.0) | EXPECT_DOUBLE_EQ(section.I22(), 2.0e-5) | EXPECT_DOUBLE_EQ(section.TorsionalConstant(), 5.0e-6) | EXPECT_EQ(section.FirstAxis(), (std::array{0.0, 1.0, 0.0})) | EXPECT_EQ(section.SectionPoints(), (std::vector>{{-0.1, 0.0}, {0.1, 0.0}})) | EXPECT_EQ(section.Location().line, 40U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/properties/element_property_test.cpp ElementProperty.OwnsShellSectionThroughVirtualBase ElementProperty.OwnsShellSectionThroughVirtualBase; assertion 7개 tests/unit/properties/element_property_test.cpp ElementProperty.OwnsShellSectionThroughVirtualBase 유지 원문 검사 body 및 assertion 동일. f875a0e085b3368db099095f0bbce5ff999ecaaefc8f542b5f048a2cb965a65d f875a0e085b3368db099095f0bbce5ff999ecaaefc8f542b5f048a2cb965a65d "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(property->SourceId().source_label, 8) | EXPECT_EQ(section.Name(), ""ShellSection"") | EXPECT_DOUBLE_EQ(section.Thickness(), 0.01) | EXPECT_EQ(section.MaterialIndex(), fesa::EntityIndex{3}) | EXPECT_EQ(section.Location().file, ""models/property.inp"")" "ASSERT_TRUE(candidate.HasValue()) | EXPECT_EQ(property->Kind(), fesa::ElementPropertyKind::kShellSection) | EXPECT_EQ(property->SourceId().source_label, 8) | EXPECT_EQ(section.Name(), ""ShellSection"") | EXPECT_DOUBLE_EQ(section.Thickness(), 0.01) | EXPECT_EQ(section.MaterialIndex(), fesa::EntityIndex{3}) | EXPECT_EQ(section.Location().file, ""models/property.inp"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/properties/element_property_test.cpp ElementProperty.PreservesEmptyOptionalSectionPointInventory ElementProperty.PreservesEmptyOptionalSectionPointInventory; assertion 2개 tests/unit/properties/element_property_test.cpp ElementProperty.PreservesEmptyOptionalSectionPointInventory 유지 원문 검사 body 및 assertion 동일. eb36af0169c99936f509a091e38bf8c4e4c7d8fb663887478c6b4453ce21a252 eb36af0169c99936f509a091e38bf8c4e4c7d8fb663887478c6b4453ce21a252 ASSERT_TRUE(section.HasValue()) | EXPECT_TRUE(section.Value().SectionPoints().empty()) ASSERT_TRUE(section.HasValue()) | EXPECT_TRUE(section.Value().SectionPoints().empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/properties/element_property_test.cpp ElementProperty.RejectsInvalidCurrentSectionFields ElementProperty.RejectsInvalidCurrentSectionFields; assertion 6개 tests/unit/properties/element_property_test.cpp ElementProperty.RejectsInvalidCurrentSectionFields 유지 원문 검사 body 및 assertion 동일. 0e388bbbd8142343bb098f7b6df8b4dc8079f90e5c73447c09e43c4dbce0f610 0e388bbbd8142343bb098f7b6df8b4dc8079f90e5c73447c09e43c4dbce0f610 ASSERT_FALSE(invalid_beam.HasValue()) | EXPECT_EQ(invalid_beam.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(coupled_beam.HasValue()) | EXPECT_FALSE(nonfinite_point.HasValue()) | ASSERT_FALSE(invalid_shell.HasValue()) | EXPECT_EQ(invalid_shell.GetStatus().Category(), fesa::FailureCategory::kModel) ASSERT_FALSE(invalid_beam.HasValue()) | EXPECT_EQ(invalid_beam.GetStatus().Category(), fesa::FailureCategory::kModel) | EXPECT_FALSE(coupled_beam.HasValue()) | EXPECT_FALSE(nonfinite_point.HasValue()) | ASSERT_FALSE(invalid_shell.HasValue()) | EXPECT_EQ(invalid_shell.GetStatus().Category(), fesa::FailureCategory::kModel) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/properties/element_property_test.cpp support@1-19 helper/oracle/fixture/include/static assertion 구간: PropertyLocation tests/unit/properties/element_property_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 433c8d2313668bc7e4780f44dca84936eae188a3c75110af9182756aa419efad 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_records_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 4개 tests/unit/results/result_records_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. bb72829dd1c5a3b89f5fcca9ae669acf8bc90697a26a5aa0c4ad0cddd14ac83e bb72829dd1c5a3b89f5fcca9ae669acf8bc90697a26a5aa0c4ad0cddd14ac83e 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_records_test.cpp AnalysisState.PreservesStepFrameAndStableRowOrder AnalysisState.PreservesStepFrameAndStableRowOrder; assertion 25개 tests/unit/results/result_records_test.cpp AnalysisState.PreservesStepFrameAndStableRowOrder 유지 원문 검사 body 및 assertion 동일. 869b5c0c01c92f41cc3dd8a80fa5fe57725d2ce8581d61c8dcf3ac36ed0d8d8f 869b5c0c01c92f41cc3dd8a80fa5fe57725d2ce8581d61c8dcf3ac36ed0d8d8f "EXPECT_EQ(const_state.Identity().step_name, ""Step-1"") | EXPECT_EQ(const_state.Identity().frame_index, 0U) | ASSERT_EQ(const_state.EndpointResults().size(), 2U) | EXPECT_EQ(const_state.EndpointResults().data(), endpoint_storage) | EXPECT_EQ(const_state.EndpointResults()[0].element, 2U) | EXPECT_EQ(const_state.EndpointResults()[0].endpoint, -1) | EXPECT_EQ(const_state.EndpointResults()[0].node.instance_name, ""Beam-1"") | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label, 10) | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label_text, ""010"") | EXPECT_EQ(const_state.EndpointResults()[0].end_action, (std::array{1.0, 2.0, 3.0, 4.0, 5.0, 6.0})) | EXPECT_EQ(const_state.EndpointResults()[1].section_resultant, (std::array{17.0, 18.0, 19.0, 20.0})) | ASSERT_EQ(const_state.GaussResults().size(), 2U) | EXPECT_EQ(const_state.GaussResults().data(), gauss_storage) | EXPECT_EQ(const_state.GaussResults()[0].gauss_point, 1) | EXPECT_EQ(const_state.GaussResults()[1].gauss_point, 2) | EXPECT_EQ(const_state.GaussResults()[0].generalized_strain, (std::array{0.1, 0.2, 0.3, 0.4})) | EXPECT_EQ(const_state.GaussResults()[1].generalized_resultant, (std::array{1.5, 1.6, 1.7, 1.8})) | ASSERT_EQ(const_state.StressResults().size(), 2U) | EXPECT_EQ(const_state.StressResults().data(), stress_storage) | EXPECT_EQ(const_state.StressResults()[0].section_point, 1U) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x1, -0.25) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x2, 0.5) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].s11, 12.5) | EXPECT_EQ(const_state.StressResults()[0].source, ""input"") | EXPECT_EQ(const_state.StressResults()[1].section_point, 2U)" "EXPECT_EQ(const_state.Identity().step_name, ""Step-1"") | EXPECT_EQ(const_state.Identity().frame_index, 0U) | ASSERT_EQ(const_state.EndpointResults().size(), 2U) | EXPECT_EQ(const_state.EndpointResults().data(), endpoint_storage) | EXPECT_EQ(const_state.EndpointResults()[0].element, 2U) | EXPECT_EQ(const_state.EndpointResults()[0].endpoint, -1) | EXPECT_EQ(const_state.EndpointResults()[0].node.instance_name, ""Beam-1"") | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label, 10) | EXPECT_EQ(const_state.EndpointResults()[0].node.source_label_text, ""010"") | EXPECT_EQ(const_state.EndpointResults()[0].end_action, (std::array{1.0, 2.0, 3.0, 4.0, 5.0, 6.0})) | EXPECT_EQ(const_state.EndpointResults()[1].section_resultant, (std::array{17.0, 18.0, 19.0, 20.0})) | ASSERT_EQ(const_state.GaussResults().size(), 2U) | EXPECT_EQ(const_state.GaussResults().data(), gauss_storage) | EXPECT_EQ(const_state.GaussResults()[0].gauss_point, 1) | EXPECT_EQ(const_state.GaussResults()[1].gauss_point, 2) | EXPECT_EQ(const_state.GaussResults()[0].generalized_strain, (std::array{0.1, 0.2, 0.3, 0.4})) | EXPECT_EQ(const_state.GaussResults()[1].generalized_resultant, (std::array{1.5, 1.6, 1.7, 1.8})) | ASSERT_EQ(const_state.StressResults().size(), 2U) | EXPECT_EQ(const_state.StressResults().data(), stress_storage) | EXPECT_EQ(const_state.StressResults()[0].section_point, 1U) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x1, -0.25) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].x2, 0.5) | EXPECT_DOUBLE_EQ(const_state.StressResults()[0].s11, 12.5) | EXPECT_EQ(const_state.StressResults()[0].source, ""input"") | EXPECT_EQ(const_state.StressResults()[1].section_point, 2U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_records_test.cpp AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder; assertion 13개 tests/unit/results/result_records_test.cpp AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder 유지 원문 검사 body 및 assertion 동일. a0f71e39ab3e0d800b26636fca67c30c58ad846b26a9684454a311322065c4f1 a0f71e39ab3e0d800b26636fca67c30c58ad846b26a9684454a311322065c4f1 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(const_state.ShellResults().size(), 8U) | EXPECT_EQ(const_state.ShellResults()[0].element, 3U) | EXPECT_EQ(const_state.ShellResults()[0].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(const_state.ShellResults()[3].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(const_state.ShellResults()[4].element, 7U) | EXPECT_EQ(const_state.ShellResults()[4].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ( const_state.ShellResults()[0].natural_coordinates, (std::array{-1.0 / std::sqrt(3.0), -1.0 / std::sqrt(3.0)})) | EXPECT_EQ(const_state.ShellResults()[2].generalized_strain, (std::array{321.0, 322.0, 323.0, 324.0, 325.0, 326.0, 327.0, 328.0})) | EXPECT_EQ(const_state.ShellResults()[7].section_resultant, (std::array{741.0, 742.0, 743.0, 744.0, 745.0, 746.0, 747.0, 748.0})) | EXPECT_EQ(const_state.ShellResults()[7].stress[0].position, fesa::ShellSectionPosition::kBottom) | EXPECT_DOUBLE_EQ(const_state.ShellResults()[7].stress[0].zeta, -1.0) | EXPECT_EQ(const_state.ShellResults()[7].stress[2].components, (std::array{757.0, 758.0, 759.0})) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(const_state.ShellResults().size(), 8U) | EXPECT_EQ(const_state.ShellResults()[0].element, 3U) | EXPECT_EQ(const_state.ShellResults()[0].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(const_state.ShellResults()[3].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(const_state.ShellResults()[4].element, 7U) | EXPECT_EQ(const_state.ShellResults()[4].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ( const_state.ShellResults()[0].natural_coordinates, (std::array{-1.0 / std::sqrt(3.0), -1.0 / std::sqrt(3.0)})) | EXPECT_EQ(const_state.ShellResults()[2].generalized_strain, (std::array{321.0, 322.0, 323.0, 324.0, 325.0, 326.0, 327.0, 328.0})) | EXPECT_EQ(const_state.ShellResults()[7].section_resultant, (std::array{741.0, 742.0, 743.0, 744.0, 745.0, 746.0, 747.0, 748.0})) | EXPECT_EQ(const_state.ShellResults()[7].stress[0].position, fesa::ShellSectionPosition::kBottom) | EXPECT_DOUBLE_EQ(const_state.ShellResults()[7].stress[0].zeta, -1.0) | EXPECT_EQ(const_state.ShellResults()[7].stress[2].components, (std::array{757.0, 758.0, 759.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_records_test.cpp AnalysisState.CommitsFiniteShellGlobalEvidence AnalysisState.CommitsFiniteShellGlobalEvidence; assertion 4개 tests/unit/results/result_records_test.cpp AnalysisState.CommitsFiniteShellGlobalEvidence 유지 원문 검사 body 및 assertion 동일. 62ed08387eb7eff71c91920c4bebabfbed05791ab18a4fe8cbbf463396f7be15 62ed08387eb7eff71c91920c4bebabfbed05791ab18a4fe8cbbf463396f7be15 ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 35.5) | EXPECT_EQ(state.Equilibrium(), (std::array{1.0, -2.0, 3.0, -4.0, 5.0, -6.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{1.0e-11, 2.0e-11, 3.0e-11})) ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 35.5) | EXPECT_EQ(state.Equilibrium(), (std::array{1.0, -2.0, 3.0, -4.0, 5.0, -6.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{1.0e-11, 2.0e-11, 3.0e-11})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_records_test.cpp AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged; assertion 1개 tests/unit/results/result_records_test.cpp AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged 유지 원문 검사 body 및 assertion 동일. 707b9669e1d0cb266cfbba53e13210c339cea51e651d10b1b57991ece003a113 707b9669e1d0cb266cfbba53e13210c339cea51e651d10b1b57991ece003a113 ASSERT_TRUE(state.CommitShellResults(expected_elements, committed).IsOk()) ASSERT_TRUE(state.CommitShellResults(expected_elements, committed).IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_records_test.cpp support@1-128 helper/oracle/fixture/include/static assertion 구간: MakeEmptyDofs, MakeShellRow, MakeShellCandidate, for, ExpectShellStateEquals, ExpectShellCandidateRejectedWithoutMutation tests/unit/results/result_records_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. c3b1b99dba6177733aa2470d3dda8537c58aef89a290a4f6b3959dcd158bbbc0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_records_test.cpp support@195-196 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_records_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 99cfd7cc1cbfee5f6699e5f92a5190f79a531c7be18944fe4cda2e9e2579c67c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_records_test.cpp support@231-232 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_records_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 8e9919be7709179a6da34b5355c75a2a62ae000d17bf61c217fc31533b110324 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_records_test.cpp support@248-249 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_records_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5553b473143aa6f5d1e0b9c4ab38b9d66e43c689916066d068f42b2635b92413 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_components_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/results/result_recovery_components_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 558db157e75e1cfb16f157c2ea2f181be03075ec5447d369c24eb0bc17047476 e5f882061497e99d8210a474c7f662c17de029fc7542ae8b4c7334a2be162c6d 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment; assertion 8개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment 유지 원문 검사 body 및 assertion 동일. 4b1d44d2f31879ee4c18e1f4cb5cdedafa0cb332e8c635b697fbcc02bef96a81 4b1d44d2f31879ee4c18e1f4cb5cdedafa0cb332e8c635b697fbcc02bef96a81 ASSERT_TRUE(centered_global.HasValue()) | ASSERT_TRUE(translated_global.HasValue()) | EXPECT_NEAR(centered_global.Value().residual[0U], -1.0e-9, 1.0e-14) | EXPECT_DOUBLE_EQ(centered_global.Value().reaction[0U], centered_global.Value().residual[0U]) | ASSERT_TRUE(centered_status.IsOk()) | ASSERT_TRUE(translated_status.IsOk()) | EXPECT_NEAR(translated_candidate.shell.equilibrium[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated_candidate.shell.equilibrium[3U + component] - centered_candidate.shell.equilibrium[3U + component], translated_moment_delta[component], 5.0e-12) ASSERT_TRUE(centered_global.HasValue()) | ASSERT_TRUE(translated_global.HasValue()) | EXPECT_NEAR(centered_global.Value().residual[0U], -1.0e-9, 1.0e-14) | EXPECT_DOUBLE_EQ(centered_global.Value().reaction[0U], centered_global.Value().residual[0U]) | ASSERT_TRUE(centered_status.IsOk()) | ASSERT_TRUE(translated_status.IsOk()) | EXPECT_NEAR(translated_candidate.shell.equilibrium[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated_candidate.shell.equilibrium[3U + component] - centered_candidate.shell.equilibrium[3U + component], translated_moment_delta[component], 5.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities; assertion 18개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities 유지 원문 검사 body 및 assertion 동일. 08f945a80aa1b49a9352f010897f1f0843eae7e8567334daf13602824dc12039 08f945a80aa1b49a9352f010897f1f0843eae7e8567334daf13602824dc12039 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(candidate.endpoint_rows.size(), 2U) | ASSERT_EQ(candidate.gauss_rows.size(), 2U) | ASSERT_EQ(candidate.stress_rows.size(), 2U) | EXPECT_TRUE(candidate.has_beam_results) | EXPECT_EQ(candidate.endpoint_rows[0U].endpoint, 0) | EXPECT_EQ(candidate.endpoint_rows[1U].endpoint, 1) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].end_action[0U], -2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].section_resultant[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].end_action[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].section_resultant[0U], 2.0) | EXPECT_EQ(candidate.gauss_rows[0U].gauss_point, 1) | EXPECT_EQ(candidate.gauss_rows[1U].gauss_point, 2) | EXPECT_EQ(candidate.stress_rows[0U].section_point, 0U) | EXPECT_EQ(candidate.stress_rows[1U].section_point, 1U) | EXPECT_TRUE(rejected.endpoint_rows.empty()) | EXPECT_TRUE(rejected.gauss_rows.empty()) | EXPECT_TRUE(rejected.stress_rows.empty()) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(candidate.endpoint_rows.size(), 2U) | ASSERT_EQ(candidate.gauss_rows.size(), 2U) | ASSERT_EQ(candidate.stress_rows.size(), 2U) | EXPECT_TRUE(candidate.has_beam_results) | EXPECT_EQ(candidate.endpoint_rows[0U].endpoint, 0) | EXPECT_EQ(candidate.endpoint_rows[1U].endpoint, 1) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].end_action[0U], -2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[0U].section_resultant[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].end_action[0U], 2.0) | EXPECT_DOUBLE_EQ(candidate.endpoint_rows[1U].section_resultant[0U], 2.0) | EXPECT_EQ(candidate.gauss_rows[0U].gauss_point, 1) | EXPECT_EQ(candidate.gauss_rows[1U].gauss_point, 2) | EXPECT_EQ(candidate.stress_rows[0U].section_point, 0U) | EXPECT_EQ(candidate.stress_rows[1U].section_point, 1U) | EXPECT_TRUE(rejected.endpoint_rows.empty()) | EXPECT_TRUE(rejected.gauss_rows.empty()) | EXPECT_TRUE(rejected.stress_rows.empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending; assertion 4개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending 유지 원문 검사 body 및 assertion 동일. 3f5b0c41e2ce77b59609c26e60409445ddd24bd89e0bf55f7f9c30736fdd5f35 3f5b0c41e2ce77b59609c26e60409445ddd24bd89e0bf55f7f9c30736fdd5f35 EXPECT_TRUE(candidate.endpoint_rows.empty()) | EXPECT_TRUE(candidate.gauss_rows.empty()) | EXPECT_TRUE(candidate.stress_rows.empty()) | EXPECT_FALSE(candidate.has_beam_results) EXPECT_TRUE(candidate.endpoint_rows.empty()) | EXPECT_TRUE(candidate.gauss_rows.empty()) | EXPECT_TRUE(candidate.stress_rows.empty()) | EXPECT_FALSE(candidate.has_beam_results) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy; assertion 13개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy 유지 원문 검사 body 및 assertion 동일. 6c9a8476d2005420d8bd58a3f3a3558cfadbd6c158bd213b0047e821bdd2d991 6c9a8476d2005420d8bd58a3f3a3558cfadbd6c158bd213b0047e821bdd2d991 ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(candidate.has_shell_results) | EXPECT_EQ(candidate.expected_shell_elements, (std::vector{element})) | ASSERT_EQ(candidate.shell.rows.size(), 4U) | EXPECT_EQ(candidate.shell.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(candidate.shell.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(candidate.shell.rows[0U].stress[0U].position, fesa::ShellSectionPosition::kBottom) | EXPECT_EQ(candidate.shell.rows[0U].stress[1U].position, fesa::ShellSectionPosition::kMiddle) | EXPECT_EQ(candidate.shell.rows[0U].stress[2U].position, fesa::ShellSectionPosition::kTop) | EXPECT_DOUBLE_EQ(candidate.shell.physical_strain_energy, 12.5) | EXPECT_TRUE(rejected.shell.rows.empty()) | EXPECT_TRUE(rejected.expected_shell_elements.empty()) | EXPECT_DOUBLE_EQ(rejected.shell.physical_strain_energy, 0.0) ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(candidate.has_shell_results) | EXPECT_EQ(candidate.expected_shell_elements, (std::vector{element})) | ASSERT_EQ(candidate.shell.rows.size(), 4U) | EXPECT_EQ(candidate.shell.rows[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(candidate.shell.rows[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_EQ(candidate.shell.rows[0U].stress[0U].position, fesa::ShellSectionPosition::kBottom) | EXPECT_EQ(candidate.shell.rows[0U].stress[1U].position, fesa::ShellSectionPosition::kMiddle) | EXPECT_EQ(candidate.shell.rows[0U].stress[2U].position, fesa::ShellSectionPosition::kTop) | EXPECT_DOUBLE_EQ(candidate.shell.physical_strain_energy, 12.5) | EXPECT_TRUE(rejected.shell.rows.empty()) | EXPECT_TRUE(rejected.expected_shell_elements.empty()) | EXPECT_DOUBLE_EQ(rejected.shell.physical_strain_energy, 0.0) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle; assertion 9개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle 유지 원문 검사 body 및 assertion 동일. 55b6230e61eb0fc7cb6bdd7be3ad9832e2f1ec16cc1a95bf67ed1266f52d1cfe 55b6230e61eb0fc7cb6bdd7be3ad9832e2f1ec16cc1a95bf67ed1266f52d1cfe ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].location, prior.ShellResults()[0U].location) | EXPECT_EQ(state.ShellResults()[0U].section_resultant, prior.ShellResults()[0U].section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].location, prior.ShellResults()[0U].location) | EXPECT_EQ(state.ShellResults()[0U].section_resultant, prior.ShellResults()[0U].section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState; assertion 1개 tests/unit/results/result_recovery_components_test.cpp ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState 유지 원문 검사 body 및 assertion 동일. 7fbd3ba0038bb7588dd981c89f1ebdb358900d942bf246d26295b1417082cf38 7fbd3ba0038bb7588dd981c89f1ebdb358900d942bf246d26295b1417082cf38 ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) ASSERT_TRUE(state.CommitShellResults({0U}, std::move(prior_shell)).IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_components_test.cpp support@1-287 helper/oracle/fixture/include/static assertion 구간: ShellFixture, MakeSourceId, MakeBeamRows, MakeShellRows, MakeShellDefinition, MakeShellFixture, if, MakeShellPhysicalState, ExpectStatusCode, ExpectVectorEqual, ExpectAnalysisStateEqual tests/unit/results/result_recovery_components_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5c11d9bc4abf9701433cc401daa10ba8c47b67215a1ae623e36a81515e48de37 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_components_test.cpp support@355-356 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_components_test.cpp support@394-395 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_components_test.cpp support@452-453 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_components_test.cpp support@488-489 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_components_test.cpp support@553-554 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_components_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 84e6d9367513adf07b62324adc589f360532892eb863dd167e0cf83cdda8477b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 17개 tests/unit/results/result_recovery_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 7b9358cc8459e3ec9c7fd6384982951ff5520dca7ee1b41eb671976c79c254e6 7b9358cc8459e3ec9c7fd6384982951ff5520dca7ee1b41eb671976c79c254e6 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder; assertion 25개 tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder 유지 원문 검사 body 및 assertion 동일. 61908298d8e691deb7066229f9dd58426ca57647ebabc07023e1a31ac0cda782 61908298d8e691deb7066229f9dd58426ca57647ebabc07023e1a31ac0cda782 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(first.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[0U], 0.1) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[6U], 0.3) | ASSERT_EQ(second.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[0U], 0.3) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[6U], 0.0) | ASSERT_EQ(state.EndpointResults().size(), 4U) | ASSERT_EQ(state.GaussResults().size(), 4U) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(negative_endpoint.element, element) | EXPECT_EQ(negative_endpoint.endpoint, 0) | EXPECT_DOUBLE_EQ(negative_endpoint.end_action[0U], -value) | EXPECT_DOUBLE_EQ(negative_endpoint.section_resultant[0U], value) | EXPECT_EQ(positive_endpoint.element, element) | EXPECT_EQ(positive_endpoint.endpoint, 1) | EXPECT_DOUBLE_EQ(positive_endpoint.end_action[0U], value) | EXPECT_DOUBLE_EQ(positive_endpoint.section_resultant[0U], value) | EXPECT_EQ(state.GaussResults()[2U * element].element, element) | EXPECT_EQ(state.GaussResults()[2U * element].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].element, element) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].gauss_point, 2) | EXPECT_EQ(state.StressResults()[2U * element].element, element) | EXPECT_EQ(state.StressResults()[2U * element + 1U].element, element) | EXPECT_TRUE(state.ShellResults().empty()) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(first.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[0U], 0.1) | EXPECT_DOUBLE_EQ(first.ObservedDisplacement()[6U], 0.3) | ASSERT_EQ(second.ObservedDisplacement().Size(), 12U) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[0U], 0.3) | EXPECT_DOUBLE_EQ(second.ObservedDisplacement()[6U], 0.0) | ASSERT_EQ(state.EndpointResults().size(), 4U) | ASSERT_EQ(state.GaussResults().size(), 4U) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(negative_endpoint.element, element) | EXPECT_EQ(negative_endpoint.endpoint, 0) | EXPECT_DOUBLE_EQ(negative_endpoint.end_action[0U], -value) | EXPECT_DOUBLE_EQ(negative_endpoint.section_resultant[0U], value) | EXPECT_EQ(positive_endpoint.element, element) | EXPECT_EQ(positive_endpoint.endpoint, 1) | EXPECT_DOUBLE_EQ(positive_endpoint.end_action[0U], value) | EXPECT_DOUBLE_EQ(positive_endpoint.section_resultant[0U], value) | EXPECT_EQ(state.GaussResults()[2U * element].element, element) | EXPECT_EQ(state.GaussResults()[2U * element].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].element, element) | EXPECT_EQ(state.GaussResults()[2U * element + 1U].gauss_point, 2) | EXPECT_EQ(state.StressResults()[2U * element].element, element) | EXPECT_EQ(state.StressResults()[2U * element + 1U].element, element) | EXPECT_TRUE(state.ShellResults().empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy; assertion 10개 tests/unit/results/result_recovery_test.cpp ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy 유지 원문 검사 body 및 assertion 동일. 6010abc24720e7277736bbd3f31bc425d908c7545447ce70f5d5c1dc45880d8e 6010abc24720e7277736bbd3f31bc425d908c7545447ce70f5d5c1dc45880d8e ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(state.EndpointResults().empty()) | EXPECT_TRUE(state.GaussResults().empty()) | EXPECT_TRUE(state.StressResults().empty()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(state.ShellResults()[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.ShellResults()[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_DOUBLE_EQ(state.ShellResults()[0U].generalized_strain[0U], 1.0) | EXPECT_DOUBLE_EQ(state.ShellResults()[3U].section_resultant[0U], 40.0) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), physical_energy) ASSERT_TRUE(status.IsOk()) | EXPECT_TRUE(state.EndpointResults().empty()) | EXPECT_TRUE(state.GaussResults().empty()) | EXPECT_TRUE(state.StressResults().empty()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(state.ShellResults()[0U].location, fesa::ShellMidsurfaceLocation::kGp1) | EXPECT_EQ(state.ShellResults()[3U].location, fesa::ShellMidsurfaceLocation::kGp4) | EXPECT_DOUBLE_EQ(state.ShellResults()[0U].generalized_strain[0U], 1.0) | EXPECT_DOUBLE_EQ(state.ShellResults()[3U].section_resultant[0U], 40.0) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), physical_energy) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.FailingFakeBundleRollsBackTheWholeState ResultRecovery.FailingFakeBundleRollsBackTheWholeState; assertion 15개 tests/unit/results/result_recovery_test.cpp ResultRecovery.FailingFakeBundleRollsBackTheWholeState 유지 원문 검사 body 및 assertion 동일. 39c57c8c046735efba89779244e8a951423224037d0d5e5798550b3a057aaa61 39c57c8c046735efba89779244e8a951423224037d0d5e5798550b3a057aaa61 ASSERT_TRUE( state.CommitShellResults({0U}, std::move(stale_shell_candidate)).IsOk()) | EXPECT_EQ(state.Identity().step_name, prior.Identity().step_name) | EXPECT_EQ(state.Identity().frame_index, prior.Identity().frame_index) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].element, prior.EndpointResults()[0U].element) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.GaussResults().size(), prior.GaussResults().size()) | EXPECT_EQ(state.GaussResults()[0U].generalized_resultant, prior.GaussResults()[0U].generalized_resultant) | ASSERT_EQ(state.StressResults().size(), prior.StressResults().size()) | EXPECT_DOUBLE_EQ(state.StressResults()[0U].s11, prior.StressResults()[0U].s11) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].generalized_strain, prior.ShellResults()[0U].generalized_strain) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) ASSERT_TRUE( state.CommitShellResults({0U}, std::move(stale_shell_candidate)).IsOk()) | EXPECT_EQ(state.Identity().step_name, prior.Identity().step_name) | EXPECT_EQ(state.Identity().frame_index, prior.Identity().frame_index) | ASSERT_EQ(state.EndpointResults().size(), prior.EndpointResults().size()) | EXPECT_EQ(state.EndpointResults()[0U].element, prior.EndpointResults()[0U].element) | EXPECT_EQ(state.EndpointResults()[0U].end_action, prior.EndpointResults()[0U].end_action) | ASSERT_EQ(state.GaussResults().size(), prior.GaussResults().size()) | EXPECT_EQ(state.GaussResults()[0U].generalized_resultant, prior.GaussResults()[0U].generalized_resultant) | ASSERT_EQ(state.StressResults().size(), prior.StressResults().size()) | EXPECT_DOUBLE_EQ(state.StressResults()[0U].s11, prior.StressResults()[0U].s11) | ASSERT_EQ(state.ShellResults().size(), prior.ShellResults().size()) | EXPECT_EQ(state.ShellResults()[0U].generalized_strain, prior.ShellResults()[0U].generalized_strain) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior.PhysicalStrainEnergy()) | EXPECT_EQ(state.Equilibrium(), prior.Equilibrium()) | EXPECT_EQ(state.VerificationMetrics(), prior.VerificationMetrics()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.ComputesResidualReactionForNonzeroPrescription ResultRecovery.ComputesResidualReactionForNonzeroPrescription; assertion 12개 tests/unit/results/result_recovery_test.cpp ResultRecovery.ComputesResidualReactionForNonzeroPrescription 유지 원문 검사 body 및 assertion 동일. 08216ddb5db36bbc534126bdf775ee7846b18b311b89da188e0e53b71af49608 08216ddb5db36bbc534126bdf775ee7846b18b311b89da188e0e53b71af49608 ASSERT_TRUE(state.CommitShellResults({}, stale_shell_evidence).IsOk()) | ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[6U], 20.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], 0.0) | EXPECT_TRUE(state.ShellResults().empty()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 0.0) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) ASSERT_TRUE(state.CommitShellResults({}, stale_shell_evidence).IsOk()) | ASSERT_TRUE(status.IsOk()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[6U], 20.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], -20.0) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], 0.0) | EXPECT_TRUE(state.ShellResults().empty()) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), 0.0) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.EnforcesNormalizedFreeResidual ResultRecovery.EnforcesNormalizedFreeResidual; assertion 9개 tests/unit/results/result_recovery_test.cpp ResultRecovery.EnforcesNormalizedFreeResidual 유지 원문 검사 body 및 assertion 동일. 1e96704cc4b176ba73193a9853cc81c56fd130dd92540b88fbc71bef07655032 1e96704cc4b176ba73193a9853cc81c56fd130dd92540b88fbc71bef07655032 EXPECT_DOUBLE_EQ(failed.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(failed.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[0U], 93.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[6U], 94.0) | EXPECT_EQ(failed.EndpointResults().size(), 1U) | ASSERT_TRUE(threshold_status.IsOk()) | EXPECT_NE(threshold_pass.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(threshold_pass.Reaction()[6U], threshold_pass.Residual()[6U]) | EXPECT_TRUE( fesa::ResultRecovery::Recover(*zero_fixture.model, *zero_fixture.dofs, *zero_fixture.stiffness, zero_equilibrium) .IsOk()) EXPECT_DOUBLE_EQ(failed.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(failed.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[0U], 93.0) | EXPECT_DOUBLE_EQ(failed.Reaction()[6U], 94.0) | EXPECT_EQ(failed.EndpointResults().size(), 1U) | ASSERT_TRUE(threshold_status.IsOk()) | EXPECT_NE(threshold_pass.Residual()[6U], 0.0) | EXPECT_DOUBLE_EQ(threshold_pass.Reaction()[6U], threshold_pass.Residual()[6U]) | EXPECT_TRUE( fesa::ResultRecovery::Recover(*zero_fixture.model, *zero_fixture.dofs, *zero_fixture.stiffness, zero_equilibrium) .IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct; assertion 10개 tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct 유지 원문 검사 body 및 assertion 동일. 8202381a9f03eaa3d8d5a513ff7109d219c64045aa63639c3d67d6a1a1990838 8202381a9f03eaa3d8d5a513ff7109d219c64045aa63639c3d67d6a1a1990838 ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.EndpointResults().size(), 2U) | ASSERT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.EndpointResults()[0U].endpoint, 0) | EXPECT_EQ(state.EndpointResults()[1U].endpoint, 1) | EXPECT_EQ(state.GaussResults()[0U].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[1U].gauss_point, 2) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0U].end_action[0U], -state.EndpointResults()[0U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.EndpointResults()[1U].end_action[0U], state.EndpointResults()[1U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.GaussResults()[0U].generalized_resultant[0U], state.EndpointResults()[0U].section_resultant[0U]) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.EndpointResults().size(), 2U) | ASSERT_EQ(state.GaussResults().size(), 2U) | EXPECT_EQ(state.EndpointResults()[0U].endpoint, 0) | EXPECT_EQ(state.EndpointResults()[1U].endpoint, 1) | EXPECT_EQ(state.GaussResults()[0U].gauss_point, 1) | EXPECT_EQ(state.GaussResults()[1U].gauss_point, 2) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0U].end_action[0U], -state.EndpointResults()[0U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.EndpointResults()[1U].end_action[0U], state.EndpointResults()[1U].section_resultant[0U]) | EXPECT_DOUBLE_EQ(state.GaussResults()[0U].generalized_resultant[0U], state.EndpointResults()[0U].section_resultant[0U]) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns; assertion 1개 tests/unit/results/result_recovery_test.cpp ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns 유지 원문 검사 body 및 assertion 동일. 180b227a99c3cf6f4fc40c9dafa7a98cafcc456ef146b083300d66db8187a98e 180b227a99c3cf6f4fc40c9dafa7a98cafcc456ef146b083300d66db8187a98e ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.OrdersStressPointsAndDefaultCentroid ResultRecovery.OrdersStressPointsAndDefaultCentroid; assertion 14개 tests/unit/results/result_recovery_test.cpp ResultRecovery.OrdersStressPointsAndDefaultCentroid 유지 원문 검사 body 및 assertion 동일. 27b9a3f6418687d3b2b4d657ae2c41df972cefae91ec474d642f4f8664dea77b 27b9a3f6418687d3b2b4d657ae2c41df972cefae91ec474d642f4f8664dea77b "ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(row.element, 0U) | EXPECT_EQ(row.gauss_point, static_cast(gauss + 1U)) | EXPECT_EQ(row.section_point, point + 1U) | EXPECT_DOUBLE_EQ(row.x1, section_points[point][0U]) | EXPECT_DOUBLE_EQ(row.x2, section_points[point][1U]) | EXPECT_EQ(row.source, ""input"") | ASSERT_TRUE(fesa::ResultRecovery::Recover( *default_fixture.model, *default_fixture.dofs, *default_fixture.stiffness, default_state) .IsOk()) | ASSERT_EQ(default_state.StressResults().size(), 2U) | EXPECT_EQ(row.section_point, 0U) | EXPECT_DOUBLE_EQ(row.x1, 0.0) | EXPECT_DOUBLE_EQ(row.x2, 0.0) | EXPECT_EQ(row.source, ""fesa-default"")" "ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.StressResults().size(), 4U) | EXPECT_EQ(row.element, 0U) | EXPECT_EQ(row.gauss_point, static_cast(gauss + 1U)) | EXPECT_EQ(row.section_point, point + 1U) | EXPECT_DOUBLE_EQ(row.x1, section_points[point][0U]) | EXPECT_DOUBLE_EQ(row.x2, section_points[point][1U]) | EXPECT_EQ(row.source, ""input"") | ASSERT_TRUE(fesa::ResultRecovery::Recover( *default_fixture.model, *default_fixture.dofs, *default_fixture.stiffness, default_state) .IsOk()) | ASSERT_EQ(default_state.StressResults().size(), 2U) | EXPECT_EQ(row.section_point, 0U) | EXPECT_DOUBLE_EQ(row.x1, 0.0) | EXPECT_DOUBLE_EQ(row.x2, 0.0) | EXPECT_EQ(row.source, ""fesa-default"")" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging; assertion 10개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging 유지 원문 검사 body 및 assertion 동일. aa4603901819c039277bbba8fe36bfcecb9264320ae115f7e9e2d4e6d873a1b1 aa4603901819c039277bbba8fe36bfcecb9264320ae115f7e9e2d4e6d873a1b1 ASSERT_TRUE(normalized.HasValue()) | ASSERT_EQ(normalized.Value().size(), 3U) | EXPECT_EQ(normalized.Value()[1U].representative_element, 0U) | EXPECT_DOUBLE_EQ(normalized.Value()[1U].section_resultant[0U], 5.0) | ASSERT_FALSE(mismatch.HasValue()) | ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_FALSE(invalid_tolerance.HasValue()) | ASSERT_FALSE(loaded.HasValue()) | ASSERT_FALSE(reversed.HasValue()) | ASSERT_FALSE(jumped.HasValue()) ASSERT_TRUE(normalized.HasValue()) | ASSERT_EQ(normalized.Value().size(), 3U) | EXPECT_EQ(normalized.Value()[1U].representative_element, 0U) | EXPECT_DOUBLE_EQ(normalized.Value()[1U].section_resultant[0U], 5.0) | ASSERT_FALSE(mismatch.HasValue()) | ASSERT_FALSE(nonfinite.HasValue()) | ASSERT_FALSE(invalid_tolerance.HasValue()) | ASSERT_FALSE(loaded.HasValue()) | ASSERT_FALSE(reversed.HasValue()) | ASSERT_FALSE(jumped.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversShellRowsInStableElementAndGpOrder ResultRecovery.RecoversShellRowsInStableElementAndGpOrder; assertion 8개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversShellRowsInStableElementAndGpOrder 유지 원문 검사 body 및 assertion 동일. 9b8de6c23bd1314478b477a76540282c66318f375a6ea2d344cdf3521ba57569 9b8de6c23bd1314478b477a76540282c66318f375a6ea2d344cdf3521ba57569 ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(row.element, element) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates, coordinates[point]) | EXPECT_EQ(row.local_frame, expected_frame) | EXPECT_NEAR(row.generalized_strain[component], expected_strain[component], 1.0e-12) | EXPECT_NEAR(row.section_resultant[component], expected_resultant[component], 1.0e-12) ASSERT_TRUE(status.IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(row.element, element) | EXPECT_EQ(row.location, locations[point]) | EXPECT_EQ(row.natural_coordinates, coordinates[point]) | EXPECT_EQ(row.local_frame, expected_frame) | EXPECT_NEAR(row.generalized_strain[component], expected_strain[component], 1.0e-12) | EXPECT_NEAR(row.section_resultant[component], expected_resultant[component], 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversDirectBottomMiddleTopShellStress ResultRecovery.RecoversDirectBottomMiddleTopShellStress; assertion 5개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RecoversDirectBottomMiddleTopShellStress 유지 원문 검사 body 및 assertion 동일. b3e0100d6b0502831741ebd4ba7e572f405e0fa496e7a864df24df615e6a681a b3e0100d6b0502831741ebd4ba7e572f405e0fa496e7a864df24df615e6a681a ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(row.stress[position].position, positions[position]) | EXPECT_DOUBLE_EQ(row.stress[position].zeta, zeta[position]) | EXPECT_NEAR(row.stress[position].components[component], expected_stress[position][component], 1.0e-12) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_EQ(row.stress[position].position, positions[position]) | EXPECT_DOUBLE_EQ(row.stress[position].zeta, zeta[position]) | EXPECT_NEAR(row.stress[position].components[component], expected_stress[position][component], 1.0e-12) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder; assertion 3개 tests/unit/results/result_recovery_test.cpp ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder 유지 원문 검사 body 및 assertion 동일. 00b5b24a4976ce98df0b3e5204d6c3e1295111aa571f737aa02b5c59d7b9c4d8 00b5b24a4976ce98df0b3e5204d6c3e1295111aa571f737aa02b5c59d7b9c4d8 ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | EXPECT_NEAR(state.PhysicalStrainEnergy(), 72.16, 1.0e-12) | EXPECT_GT(stabilized_energy, state.PhysicalStrainEnergy()) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | EXPECT_NEAR(state.PhysicalStrainEnergy(), 72.16, 1.0e-12) | EXPECT_GT(stabilized_energy, state.PhysicalStrainEnergy()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium; assertion 11개 tests/unit/results/result_recovery_test.cpp ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium 유지 원문 검사 body 및 assertion 동일. 26ba2a3d96f0e02c4b251de544b76a99d82d3346023d01b17cf80133ca3c067e 26ba2a3d96f0e02c4b251de544b76a99d82d3346023d01b17cf80133ca3c067e ASSERT_TRUE(full_load.HasValue()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_DOUBLE_EQ(state.InternalForce()[full_dof], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[full_dof], -state.ExternalForce()[full_dof]) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], state.Residual()[full_dof]) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*free_fixture.model, *free_fixture.dofs, *free_fixture.stiffness, perturbed) .IsOk()) | EXPECT_GT(metric, 0.0) | EXPECT_LE(metric, 1.0e-10) ASSERT_TRUE(full_load.HasValue()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 4U) | EXPECT_DOUBLE_EQ(state.InternalForce()[full_dof], 0.0) | EXPECT_DOUBLE_EQ(state.Residual()[full_dof], -state.ExternalForce()[full_dof]) | EXPECT_DOUBLE_EQ(state.Reaction()[full_dof], state.Residual()[full_dof]) | EXPECT_EQ(state.Equilibrium(), (std::array{0.0, 0.0, 0.0, 0.0, 0.0, 0.0})) | EXPECT_EQ(state.VerificationMetrics(), (std::array{0.0, 0.0, 0.0})) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*free_fixture.model, *free_fixture.dofs, *free_fixture.stiffness, perturbed) .IsOk()) | EXPECT_GT(metric, 0.0) | EXPECT_LE(metric, 1.0e-10) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesGlobalOriginForShellMomentBalance ResultRecovery.UsesGlobalOriginForShellMomentBalance; assertion 5개 tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesGlobalOriginForShellMomentBalance 유지 원문 검사 body 및 assertion 동일. 91bda66039ec2ad9dd1d554d2fec6de249e3b4327105a883b94dc64877e091b5 91bda66039ec2ad9dd1d554d2fec6de249e3b4327105a883b94dc64877e091b5 ASSERT_TRUE(fesa::ResultRecovery::Recover( *centered_fixture.model, *centered_fixture.dofs, *centered_fixture.stiffness, centered) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover( *translated_fixture.model, *translated_fixture.dofs, *translated_fixture.stiffness, translated) .IsOk()) | EXPECT_NEAR(translated.Equilibrium()[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated.Equilibrium()[3U + component] - centered.Equilibrium()[3U + component], translated_moment_delta[component], 5.0e-12) | EXPECT_GT(std::abs(translated_moment_delta[2U]), 1.0e-9) ASSERT_TRUE(fesa::ResultRecovery::Recover( *centered_fixture.model, *centered_fixture.dofs, *centered_fixture.stiffness, centered) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover( *translated_fixture.model, *translated_fixture.dofs, *translated_fixture.stiffness, translated) .IsOk()) | EXPECT_NEAR(translated.Equilibrium()[component], centered_force[component], 1.0e-12) | EXPECT_NEAR(translated.Equilibrium()[3U + component] - centered.Equilibrium()[3U + component], translated_moment_delta[component], 5.0e-12) | EXPECT_GT(std::abs(translated_moment_delta[2U]), 1.0e-9) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess; assertion 6개 tests/unit/results/result_recovery_test.cpp ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess 유지 원문 검사 body 및 assertion 동일. 1a8b5c99778239402aa2e0e22d9f40513451781fbc64d04853b30ab367af26a9 1a8b5c99778239402aa2e0e22d9f40513451781fbc64d04853b30ab367af26a9 ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, subunit) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, large) .IsOk()) | EXPECT_GT(subunit.VerificationMetrics()[metric], 0.0) | EXPECT_GT(large.VerificationMetrics()[metric], 0.0) | EXPECT_NEAR(subunit.VerificationMetrics()[metric], large.VerificationMetrics()[metric], 1.0e-13) | ASSERT_TRUE(unbalanced_stiffness.HasValue()) ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, subunit) .IsOk()) | ASSERT_TRUE(fesa::ResultRecovery::Recover(*fixture.model, *fixture.dofs, *fixture.stiffness, large) .IsOk()) | EXPECT_GT(subunit.VerificationMetrics()[metric], 0.0) | EXPECT_GT(large.VerificationMetrics()[metric], 0.0) | EXPECT_NEAR(subunit.VerificationMetrics()[metric], large.VerificationMetrics()[metric], 1.0e-13) | ASSERT_TRUE(unbalanced_stiffness.HasValue()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged; assertion 15개 tests/unit/results/result_recovery_test.cpp ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged 유지 원문 검사 body 및 assertion 동일. cdc079f64476222e15342ee83a53f02ad11ba110191fcc7b334c22cccd03aaba cdc079f64476222e15342ee83a53f02ad11ba110191fcc7b334c22cccd03aaba ASSERT_TRUE(fesa::ResultRecovery::Recover(*valid_fixture.model, *valid_fixture.dofs, *valid_fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | ASSERT_TRUE(zero_stiffness.HasValue()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], 93.0) | EXPECT_EQ(state.EndpointResults().size(), 1U) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(state.ShellResults().front().element, prior_first_row.element) | EXPECT_EQ(state.ShellResults().front().location, prior_first_row.location) | EXPECT_EQ(state.ShellResults().front().generalized_strain, prior_first_row.generalized_strain) | EXPECT_EQ(state.ShellResults().front().section_resultant, prior_first_row.section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior_energy) | EXPECT_EQ(state.Equilibrium(), prior_equilibrium) | EXPECT_EQ(state.VerificationMetrics(), prior_metrics) ASSERT_TRUE(fesa::ResultRecovery::Recover(*valid_fixture.model, *valid_fixture.dofs, *valid_fixture.stiffness, state) .IsOk()) | ASSERT_EQ(state.ShellResults().size(), 8U) | ASSERT_TRUE(zero_stiffness.HasValue()) | EXPECT_DOUBLE_EQ(state.InternalForce()[0U], 91.0) | EXPECT_DOUBLE_EQ(state.Residual()[0U], 92.0) | EXPECT_DOUBLE_EQ(state.Reaction()[0U], 93.0) | EXPECT_EQ(state.EndpointResults().size(), 1U) | ASSERT_EQ(state.ShellResults().size(), 8U) | EXPECT_EQ(state.ShellResults().front().element, prior_first_row.element) | EXPECT_EQ(state.ShellResults().front().location, prior_first_row.location) | EXPECT_EQ(state.ShellResults().front().generalized_strain, prior_first_row.generalized_strain) | EXPECT_EQ(state.ShellResults().front().section_resultant, prior_first_row.section_resultant) | EXPECT_DOUBLE_EQ(state.PhysicalStrainEnergy(), prior_energy) | EXPECT_EQ(state.Equilibrium(), prior_equilibrium) | EXPECT_EQ(state.VerificationMetrics(), prior_metrics) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp ResultRecovery.RealSolidPayloadFailsClosedAndPreservesLegacyState ResultRecovery.RealSolidPayloadFailsClosedAndPreservesLegacyState; assertion 9개 tests/unit/results/result_recovery_test.cpp ResultRecovery.RealSolidPayloadFailsClosedAndPreservesLegacyState 유지 원문 검사 body 및 assertion 동일. b141c6cecbdb1ae52c1c6d824f368ca38f6d56aef54f660dac80dd383e2dd22d b141c6cecbdb1ae52c1c6d824f368ca38f6d56aef54f660dac80dd383e2dd22d "ASSERT_TRUE(solid.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 37.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 19.0) | ASSERT_EQ(state.EndpointResults().size(), 2U) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0].section_resultant[0], 11.0) | EXPECT_EQ(state.Identity().step_name, ""prior-step"") | EXPECT_EQ(state.Identity().frame_index, 9U)" "ASSERT_TRUE(solid.HasValue()) | ASSERT_TRUE(recovered.HasValue()) | ASSERT_EQ(std::get(recovered.Value().payload) .rows.size(), 8U) | EXPECT_DOUBLE_EQ(state.Displacement()[0], 37.0) | EXPECT_DOUBLE_EQ(state.InternalForce()[0], 19.0) | ASSERT_EQ(state.EndpointResults().size(), 2U) | EXPECT_DOUBLE_EQ(state.EndpointResults()[0].section_resultant[0], 11.0) | EXPECT_EQ(state.Identity().step_name, ""prior-step"") | EXPECT_EQ(state.Identity().frame_index, 9U)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/result_recovery_test.cpp support@1-486 helper/oracle/fixture/include/static assertion 구간: RecoveryFixture, ShellRecoveryFixture, FakeRecoveryElement, if, FullNodeComponents, MakeRuntimeLayout, MakeFakeBeamBundle, MakeFakeShellBundle, ExpectVectorEqual, MakeShellFixture, MakeShellPhysicalState, MakeAxialEquilibriumState, for, MakePatchState, ExpectStatusCode, ExpectScaledNear, MakeStationRows tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eb7cc3528f2f1b6ff89196b0aa6af7976ed75a3e979be52ea96ad2bdc358192a 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@536-537 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 212a78df598b1f4fe28beea4828a6b61a489b64fdcab0d4dac8e166621522216 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@567-568 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 212a78df598b1f4fe28beea4828a6b61a489b64fdcab0d4dac8e166621522216 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@873-874 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. be9695a1dfd710a92ce4bd7a28b2ff4722998e936a18a40b7ad3b0924d6db21b 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@922-923 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 5b2f4ea71173df2f4c511be4321417651647b1f1d79e724c3bd99c3dc2ab8106 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@950-951 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 77d8fb9f45d9b90eb930d818340de8b1fd2f4478fc8093bfbdeb0303184ca57f 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@970-971 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 685f08a7676bc65e1f3c60ee0bba4f30043ab66b05381db014971b3a9376382e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@1014-1015 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. edf7cabe953adfaded5d4481da649c54147c680bae27dfe27563b87d850789f0 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@1058-1059 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 685f08a7676bc65e1f3c60ee0bba4f30043ab66b05381db014971b3a9376382e 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/result_recovery_test.cpp support@1108-1109 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/results/result_recovery_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. fa11ba7d5f866feb0c6e224aba5f382047c5f0c223ccedf90498730c1edf3fe8 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/results_writer_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 2개 tests/unit/results/results_writer_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. afa4f1287a951645a1e9bd2c4cc5cb8603615670944362cf89f3780befd82dee afa4f1287a951645a1e9bd2c4cc5cb8603615670944362cf89f3780befd82dee 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/results/results_writer_test.cpp PreparedResultsWriter.RoutesValueOutcomesAndPreservesWriterFailure PreparedResultsWriter.RoutesValueOutcomesAndPreservesWriterFailure; assertion 23개 tests/unit/results/results_writer_test.cpp PreparedResultsWriter.RoutesValueOutcomesAndPreservesWriterFailure 유지 원문 검사 body 및 assertion 동일. dc1caacf100a0b5668cc768a1f63a959e0b005e04c2b3a66d5dd0e103e355fa8 dc1caacf100a0b5668cc768a1f63a959e0b005e04c2b3a66d5dd0e103e355fa8 "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(outcomes.size(), families.size()) | ASSERT_EQ(calls.families.size(), index + 1U) | EXPECT_EQ(calls.families.back(), families[index]) | EXPECT_EQ(calls.paths.back(), &output) | EXPECT_EQ(calls.domains.back(), &domain.Value()) | EXPECT_EQ(calls.diagnostics.back(), &diagnostics) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""candidate-close-failure"") | EXPECT_EQ(status.Diagnostics()[0U].location.file, ""source.inp"") | EXPECT_EQ(status.Diagnostics()[0U].location.line, 7U) | EXPECT_EQ(status.Diagnostics()[0U].keyword, ""WRITER"") | EXPECT_EQ(status.Diagnostics()[0U].entity_identity, ""0007"") | EXPECT_EQ(status.Diagnostics()[0U].message, ""Preserved writer failure."") | EXPECT_EQ(linear.received, &std::get(outcomes[0U]).state) | EXPECT_EQ(nonlinear.received, &std::get(outcomes[1U]).state) | EXPECT_EQ(eigen.received, &std::get(outcomes[2U])) | EXPECT_EQ(dynamic.received, &std::get(outcomes[3U]).state) | EXPECT_EQ(thermal.received, nullptr) | EXPECT_EQ(solid.static_state, &std::get(outcomes[4U]).state) | EXPECT_EQ(solid.frequency_state, &std::get(outcomes[5U])) | EXPECT_EQ(solid.dynamic_state, &std::get(outcomes[6U]).state)" "ASSERT_TRUE(domain.HasValue()) | ASSERT_EQ(outcomes.size(), families.size()) | ASSERT_EQ(calls.families.size(), index + 1U) | EXPECT_EQ(calls.families.back(), families[index]) | EXPECT_EQ(calls.paths.back(), &output) | EXPECT_EQ(calls.domains.back(), &domain.Value()) | EXPECT_EQ(calls.diagnostics.back(), &diagnostics) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, ""candidate-close-failure"") | EXPECT_EQ(status.Diagnostics()[0U].location.file, ""source.inp"") | EXPECT_EQ(status.Diagnostics()[0U].location.line, 7U) | EXPECT_EQ(status.Diagnostics()[0U].keyword, ""WRITER"") | EXPECT_EQ(status.Diagnostics()[0U].entity_identity, ""0007"") | EXPECT_EQ(status.Diagnostics()[0U].message, ""Preserved writer failure."") | EXPECT_EQ(linear.received, &std::get(outcomes[0U]).state) | EXPECT_EQ(nonlinear.received, &std::get(outcomes[1U]).state) | EXPECT_EQ(eigen.received, &std::get(outcomes[2U])) | EXPECT_EQ(dynamic.received, &std::get(outcomes[3U]).state) | EXPECT_EQ(thermal.received, nullptr) | EXPECT_EQ(solid.static_state, &std::get(outcomes[4U]).state) | EXPECT_EQ(solid.frequency_state, &std::get(outcomes[5U])) | EXPECT_EQ(solid.dynamic_state, &std::get(outcomes[6U]).state)" 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/results_writer_test.cpp PreparedResultsWriter.MissingOptionalAdapterInvokesNoOtherWriter PreparedResultsWriter.MissingOptionalAdapterInvokesNoOtherWriter; assertion 7개 tests/unit/results/results_writer_test.cpp PreparedResultsWriter.MissingOptionalAdapterInvokesNoOtherWriter 유지 원문 검사 body 및 assertion 동일. b58ff6083f8ee297078a9bfbb93213d9d3cae595f93137da6141e772c5b5f537 b58ff6083f8ee297078a9bfbb93213d9d3cae595f93137da6141e772c5b5f537 ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, codes[index - 3U]) | EXPECT_EQ(status.Diagnostics()[0U].keyword, keywords[index - 3U]) | EXPECT_TRUE(calls.families.empty()) ASSERT_TRUE(domain.HasValue()) | EXPECT_FALSE(status.IsOk()) | EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput) | ASSERT_EQ(status.Diagnostics().size(), 1U) | EXPECT_EQ(status.Diagnostics()[0U].code, codes[index - 3U]) | EXPECT_EQ(status.Diagnostics()[0U].keyword, keywords[index - 3U]) | EXPECT_TRUE(calls.families.empty()) 유지-대체동등성미입증 R-STATIC test-cleanup-review.md#r-static +Refactor tests/unit/results/results_writer_test.cpp support@1-133 helper/oracle/fixture/include/static assertion 구간: namespace, WriterCalls, Record, Writer, State, RecordingWriter, RecordingSolidWriter, EmptyOutcomes tests/unit/results/results_writer_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. e1cd9f67666ffb3a9e533fc56adbe649df4861080460e9cd8208f22c8891a4fb 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 34개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. eaebae0e4350e20ce66e07f762b7d2c867a06db4ad89afaac90c92bfc1d4ca61 eaebae0e4350e20ce66e07f762b7d2c867a06db4ad89afaac90c92bfc1d4ca61 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesN1AndRetainsBackendEvidence MklFeastEigenSolver.SolvesN1AndRetainsBackendEvidence; assertion 19개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesN1AndRetainsBackendEvidence 유지 원문 검사 body 및 assertion 동일. a5e6952b5e691cd318758a58e51cc8c0cadbf6992466d2919582d812f7efc0fa a5e6952b5e691cd318758a58e51cc8c0cadbf6992466d2919582d812f7efc0fa "EXPECT_EQ(result.Value().requested_modes, 1U) | ASSERT_EQ(result.Value().eigenvalues.size(), 1U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 4.0, 1.0e-10) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 4.0) | EXPECT_EQ(result.Value().eigenvectors.Rows(), 1U) | EXPECT_EQ(result.Value().eigenvectors.Columns(), 1U) | EXPECT_EQ(result.Value().thread_count, 1U) | ASSERT_EQ(result.Value().base_fpm.size(), 128U) | EXPECT_EQ(result.Value().base_fpm[5U], 0) | ASSERT_FALSE(result.Value().backend_calls.empty()) | EXPECT_EQ(result.Value().backend_calls.front().purpose, ""total-enclosure"") | EXPECT_EQ(result.Value().backend_calls.back().kind, ""solve"") | EXPECT_TRUE(result.Value().backend_calls.back().count_available) | EXPECT_EQ(result.Value().backend_calls.back().count, result.Value().eigenvalues.size()) | EXPECT_TRUE(result.Value().backend_calls.back().loop_available) | EXPECT_TRUE(result.Value().backend_calls.back().epsout_available) | EXPECT_EQ(result.Value().backend_calls.back().outcome, ""accepted"") | EXPECT_EQ(result.Value().backend_calls.back().decision_reason, ""accepted"") | EXPECT_FALSE(result.Value().upper_search_termination.empty())" "EXPECT_EQ(result.Value().requested_modes, 1U) | ASSERT_EQ(result.Value().eigenvalues.size(), 1U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 4.0, 1.0e-10) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 4.0) | EXPECT_EQ(result.Value().eigenvectors.Rows(), 1U) | EXPECT_EQ(result.Value().eigenvectors.Columns(), 1U) | EXPECT_EQ(result.Value().thread_count, 1U) | ASSERT_EQ(result.Value().base_fpm.size(), 128U) | EXPECT_EQ(result.Value().base_fpm[5U], 0) | ASSERT_FALSE(result.Value().backend_calls.empty()) | EXPECT_EQ(result.Value().backend_calls.front().purpose, ""total-enclosure"") | EXPECT_EQ(result.Value().backend_calls.back().kind, ""solve"") | EXPECT_TRUE(result.Value().backend_calls.back().count_available) | EXPECT_EQ(result.Value().backend_calls.back().count, result.Value().eigenvalues.size()) | EXPECT_TRUE(result.Value().backend_calls.back().loop_available) | EXPECT_TRUE(result.Value().backend_calls.back().epsout_available) | EXPECT_EQ(result.Value().backend_calls.back().outcome, ""accepted"") | EXPECT_EQ(result.Value().backend_calls.back().decision_reason, ""accepted"") | EXPECT_FALSE(result.Value().upper_search_termination.empty())" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesAllZeroWithExplicitPhysicalScale MklFeastEigenSolver.SolvesAllZeroWithExplicitPhysicalScale; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.SolvesAllZeroWithExplicitPhysicalScale 유지 원문 검사 body 및 assertion 동일. 9132a899409f4f8bb3a08c9f5c18c3f0ff1a4857bf1f98571340163e4553f691 9132a899409f4f8bb3a08c9f5c18c3f0ff1a4857bf1f98571340163e4553f691 ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 7.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_DOUBLE_EQ(result.Value().operator_scale, 7.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRepeatedMultiplicityAndStableOrder MklFeastEigenSolver.PreservesRepeatedMultiplicityAndStableOrder; assertion 8개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRepeatedMultiplicityAndStableOrder 유지 원문 검사 body 및 assertion 동일. 569416623ee5b90db9c898f92f589b8eb7bda065baaf7f777feb8245b14f19a8 569416623ee5b90db9c898f92f589b8eb7bda065baaf7f777feb8245b14f19a8 ASSERT_EQ(first.Value().eigenvalues.size(), 3U) | EXPECT_NEAR(first.Value().eigenvalues[0U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[1U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[2U], 5.0, 1.0e-10) | EXPECT_EQ(first.Value().column_ids, second.Value().column_ids) | EXPECT_EQ(first.Value().column_ids, third.Value().column_ids) | EXPECT_EQ(first.Value().eigenvalues, second.Value().eigenvalues) | EXPECT_EQ(first.Value().eigenvalues, third.Value().eigenvalues) ASSERT_EQ(first.Value().eigenvalues.size(), 3U) | EXPECT_NEAR(first.Value().eigenvalues[0U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[1U], 2.0, 1.0e-10) | EXPECT_NEAR(first.Value().eigenvalues[2U], 5.0, 1.0e-10) | EXPECT_EQ(first.Value().column_ids, second.Value().column_ids) | EXPECT_EQ(first.Value().column_ids, third.Value().column_ids) | EXPECT_EQ(first.Value().eigenvalues, second.Value().eigenvalues) | EXPECT_EQ(first.Value().eigenvalues, third.Value().eigenvalues) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesGuardedPrefixWithoutDroppingRepeatedCluster MklFeastEigenSolver.UsesGuardedPrefixWithoutDroppingRepeatedCluster; assertion 6개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesGuardedPrefixWithoutDroppingRepeatedCluster 유지 원문 검사 body 및 assertion 동일. 56315bd7fccef615e71cc32988f93ec30232ca90502bf20c0402180d597c0685 56315bd7fccef615e71cc32988f93ec30232ca90502bf20c0402180d597c0685 "EXPECT_GE(one_mode.Value().eigenvalues.size(), 40U) | EXPECT_GE(forty_first.Value().eigenvalues.size(), 41U) | EXPECT_NEAR(one_mode.Value().eigenvalues[index], 1.0, 1.0e-10) | EXPECT_NEAR(forty_first.Value().eigenvalues[40U], 2.0, 1.0e-10) | EXPECT_EQ(one_mode.Value().backend_calls.back().kind, ""solve"") | EXPECT_EQ(forty_first.Value().backend_calls.back().kind, ""solve"")" "EXPECT_GE(one_mode.Value().eigenvalues.size(), 40U) | EXPECT_GE(forty_first.Value().eigenvalues.size(), 41U) | EXPECT_NEAR(one_mode.Value().eigenvalues[index], 1.0, 1.0e-10) | EXPECT_NEAR(forty_first.Value().eigenvalues[40U], 2.0, 1.0e-10) | EXPECT_EQ(one_mode.Value().backend_calls.back().kind, ""solve"") | EXPECT_EQ(forty_first.Value().backend_calls.back().kind, ""solve"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsSignificantNegativeSpectrum MklFeastEigenSolver.RejectsSignificantNegativeSpectrum; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsSignificantNegativeSpectrum 유지 원문 검사 body 및 assertion 동일. 0c5373e53f768aa91e99580e4d48e737a8b3ed32c98f141d8c4d2faa02a523d6 0c5373e53f768aa91e99580e4d48e737a8b3ed32c98f141d8c4d2faa02a523d6 "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""negative-eigenvalue-spectrum"")" "ASSERT_FALSE(result.HasValue()) | EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kSolver) | ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U) | EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, ""negative-eigenvalue-spectrum"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.KeepsCloseDistinctModesSeparated MklFeastEigenSolver.KeepsCloseDistinctModesSeparated; assertion 5개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.KeepsCloseDistinctModesSeparated 유지 원문 검사 body 및 assertion 동일. 14aacceeae53faa7a062beccd27707e37541fd4a20e7ccd64ad38f6bbacf57f0 14aacceeae53faa7a062beccd27707e37541fd4a20e7ccd64ad38f6bbacf57f0 ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 1.0, 1.0e-10) | EXPECT_NEAR(result.Value().eigenvalues[1U], 1.001, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(0U, 0U)), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(1U, 1U)), 1.0, 1.0e-10) ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0U], 1.0, 1.0e-10) | EXPECT_NEAR(result.Value().eigenvalues[1U], 1.001, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(0U, 0U)), 1.0, 1.0e-10) | EXPECT_NEAR(std::abs(result.Value().eigenvectors(1U, 1U)), 1.0, 1.0e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RestoresCallingThreadLocalSetting MklFeastEigenSolver.RestoresCallingThreadLocalSetting; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RestoresCallingThreadLocalSetting 유지 원문 검사 body 및 assertion 동일. 83ad3e485cd51a75937fe2c31aa9ca90a33b7dddd67acdfeea5e2c8b21a3bb7f 83ad3e485cd51a75937fe2c31aa9ca90a33b7dddd67acdfeea5e2c8b21a3bb7f EXPECT_EQ(restored, 2) EXPECT_EQ(restored, 2) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsInvalidRequestAndZeroScale MklFeastEigenSolver.RejectsInvalidRequestAndZeroScale; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsInvalidRequestAndZeroScale 유지 원문 검사 body 및 assertion 동일. 8689fda7e7994805ac76572196bc34cf736664e5b643b71233cacc3e6a29d13b 8689fda7e7994805ac76572196bc34cf736664e5b643b71233cacc3e6a29d13b "ASSERT_FALSE(zero_request.HasValue()) | EXPECT_EQ(zero_request.GetStatus().Diagnostics()[0U].code, ""feast-invalid-dimension"") | ASSERT_FALSE(invalid_scale.HasValue()) | EXPECT_EQ(invalid_scale.GetStatus().Diagnostics()[0U].code, ""feast-invalid-zero-scale"")" "ASSERT_FALSE(zero_request.HasValue()) | EXPECT_EQ(zero_request.GetStatus().Diagnostics()[0U].code, ""feast-invalid-dimension"") | ASSERT_FALSE(invalid_scale.HasValue()) | EXPECT_EQ(invalid_scale.GetStatus().Diagnostics()[0U].code, ""feast-invalid-zero-scale"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesLowestPrefixForZeroAndPositiveSpectra MklFeastEigenSolver.PreservesLowestPrefixForZeroAndPositiveSpectra; assertion 3개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesLowestPrefixForZeroAndPositiveSpectra 유지 원문 검사 body 및 assertion 동일. aa89c5b6a3123bea8bd03219a4334166bf4f607ff70abfab02cb536b18768f5d aa89c5b6a3123bea8bd03219a4334166bf4f607ff70abfab02cb536b18768f5d ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), requested) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-10) ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), requested) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-10) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.ResolvesCloseDistinctSpectrumAfterGivensCongruence MklFeastEigenSolver.ResolvesCloseDistinctSpectrumAfterGivensCongruence; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.ResolvesCloseDistinctSpectrumAfterGivensCongruence 유지 원문 검사 body 및 assertion 동일. b173141930f9c7d787cee4d5715c4f4fcf346e6fe947e9e8b1fa60784764641d b173141930f9c7d787cee4d5715c4f4fcf346e6fe947e9e8b1fa60784764641d ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 4U) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-12) | EXPECT_GT(result.Value().eigenvalues[1U] - result.Value().eigenvalues[0U], 1e-9) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 4U) | EXPECT_NEAR(result.Value().eigenvalues[i], spectrum[i], 1e-12) | EXPECT_GT(result.Value().eigenvalues[1U] - result.Value().eigenvalues[0U], 1e-9) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFatalCountStatusWithoutRetry MklFeastEigenSolver.RejectsFatalCountStatusWithoutRetry; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFatalCountStatusWithoutRetry 유지 원문 검사 body 및 assertion 동일. 23ef85953cd9408cae46249383f429500ae4234067387d6c8d0a3aa9eb5b96bf 23ef85953cd9408cae46249383f429500ae4234067387d6c8d0a3aa9eb5b96bf EXPECT_EQ(hook_calls, 1U) EXPECT_EQ(hook_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsCountCallsAndUpperSearchReservations MklFeastEigenSolver.BoundsCountCallsAndUpperSearchReservations; assertion 6개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsCountCallsAndUpperSearchReservations 유지 원문 검사 body 및 assertion 동일. 2e3d9cc28ce1c4d1909d0afc2950f88e8be5ba66d8f4344829561fe06601e8ca 2e3d9cc28ce1c4d1909d0afc2950f88e8be5ba66d8f4344829561fe06601e8ca EXPECT_TRUE(fesa::internal::CanCallFeast(511U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(512U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(kMaximum)) | EXPECT_TRUE(fesa::internal::CanStartUpperCandidate(363U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(364U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(kMaximum)) EXPECT_TRUE(fesa::internal::CanCallFeast(511U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(512U)) | EXPECT_FALSE(fesa::internal::CanCallFeast(kMaximum)) | EXPECT_TRUE(fesa::internal::CanStartUpperCandidate(363U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(364U)) | EXPECT_FALSE(fesa::internal::CanStartUpperCandidate(kMaximum)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsPrivateWorkspaceProductsBeforeAllocation MklFeastEigenSolver.BoundsPrivateWorkspaceProductsBeforeAllocation; assertion 7개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.BoundsPrivateWorkspaceProductsBeforeAllocation 유지 원문 검사 body 및 assertion 동일. 69110366294c0c4a271e8295fa2352576136369334a1db1c9346511d5496e742 69110366294c0c4a271e8295fa2352576136369334a1db1c9346511d5496e742 EXPECT_TRUE(fesa::internal::ProductFits(0U, kMaximum)) | EXPECT_TRUE(fesa::internal::ProductFits(1U, kMaximum)) | EXPECT_FALSE(fesa::internal::ProductFits(kMaximum, 2U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(0U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(storage_limit)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(kMaximum)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(storage_limit + 1U)) EXPECT_TRUE(fesa::internal::ProductFits(0U, kMaximum)) | EXPECT_TRUE(fesa::internal::ProductFits(1U, kMaximum)) | EXPECT_FALSE(fesa::internal::ProductFits(kMaximum, 2U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(0U)) | EXPECT_TRUE(fesa::internal::FitsDoubleStorage(storage_limit)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(kMaximum)) | EXPECT_FALSE(fesa::internal::FitsDoubleStorage(storage_limit + 1U)) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesCountWorkspaceAllocationFailure MklFeastEigenSolver.TranslatesCountWorkspaceAllocationFailure; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesCountWorkspaceAllocationFailure 유지 원문 검사 body 및 assertion 동일. 6653c1ccf3f12cf12023f4ed701c5a2dc2eac565ab6e4ab2da403e6f3a9dae65 6653c1ccf3f12cf12023f4ed701c5a2dc2eac565ab6e4ab2da403e6f3a9dae65 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesSolveWorkspaceAllocationFailure MklFeastEigenSolver.TranslatesSolveWorkspaceAllocationFailure; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.TranslatesSolveWorkspaceAllocationFailure 유지 원문 검사 body 및 assertion 동일. e6817b904d15200de1dc8c70b40668142140bdc4adb47c239509b16c4f911842 e6817b904d15200de1dc8c70b40668142140bdc4adb47c239509b16c4f911842 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.StopsInitialInfoOneAfterThreeCountCalls MklFeastEigenSolver.StopsInitialInfoOneAfterThreeCountCalls; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.StopsInitialInfoOneAfterThreeCountCalls 유지 원문 검사 body 및 assertion 동일. 10672f977ec5bdc9692c2dfabec9acb4435e639b18d49cc197a2ccea7b53ff97 10672f977ec5bdc9692c2dfabec9acb4435e639b18d49cc197a2ccea7b53ff97 EXPECT_EQ(count_calls, 3U) EXPECT_EQ(count_calls, 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFinalCountHistoryMismatch MklFeastEigenSolver.RejectsFinalCountHistoryMismatch; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsFinalCountHistoryMismatch 유지 원문 검사 body 및 assertion 동일. caea386d5db1999417f7d1140ee543ea3a5cd1398399815033afd2f1b45ebcd6 caea386d5db1999417f7d1140ee543ea3a5cd1398399815033afd2f1b45ebcd6 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsDecreasingCountAcrossDistinctUpperGuards MklFeastEigenSolver.RejectsDecreasingCountAcrossDistinctUpperGuards; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsDecreasingCountAcrossDistinctUpperGuards 유지 원문 검사 body 및 assertion 동일. 1c401c1682daa62d7105287575a7eac825c905e53825c3ea124477f3a823be7b 1c401c1682daa62d7105287575a7eac825c905e53825c3ea124477f3a823be7b 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRawNegativeBoundaryAndRejectsBelowIt MklFeastEigenSolver.PreservesRawNegativeBoundaryAndRejectsBelowIt; assertion 5개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.PreservesRawNegativeBoundaryAndRejectsBelowIt 유지 원문 검사 body 및 assertion 동일. b6c6927ededce6c56a882de187bb35bbfa8c258b533098f90c7e54e6f0d5a324 b6c6927ededce6c56a882de187bb35bbfa8c258b533098f90c7e54e6f0d5a324 ASSERT_EQ(outputs.eigenvalues.size(), 3U) | ASSERT_EQ(result.Value().eigenvalues.size(), 3U) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], negative) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[2U], 1.0) ASSERT_EQ(outputs.eigenvalues.size(), 3U) | ASSERT_EQ(result.Value().eigenvalues.size(), 3U) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[0U], negative) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[1U], 0.0) | EXPECT_DOUBLE_EQ(result.Value().eigenvalues[2U], 1.0) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.DoesNotRepeatUnchangedSolveAfterReturnedMismatch MklFeastEigenSolver.DoesNotRepeatUnchangedSolveAfterReturnedMismatch; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.DoesNotRepeatUnchangedSolveAfterReturnedMismatch 유지 원문 검사 body 및 assertion 동일. bdfe92002dfd17522f8dd7038fd290fbe28018d76ea65976ca086695a056b013 bdfe92002dfd17522f8dd7038fd290fbe28018d76ea65976ca086695a056b013 EXPECT_EQ(solve_calls, 1U) EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RetriesSolveInfoTwoOnlyWithLargerInterval MklFeastEigenSolver.RetriesSolveInfoTwoOnlyWithLargerInterval; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RetriesSolveInfoTwoOnlyWithLargerInterval 유지 원문 검사 body 및 assertion 동일. bdab428a83baf0a5524548d01ca60a6c4b4383aad9358a756131de3b356e0d5a bdab428a83baf0a5524548d01ca60a6c4b4383aad9358a756131de3b356e0d5a ASSERT_EQ(solve_uppers.size(), 2U) | EXPECT_LT(solve_uppers[0U], solve_uppers[1U]) ASSERT_EQ(solve_uppers.size(), 2U) | EXPECT_LT(solve_uppers[0U], solve_uppers[1U]) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteSolveOutputWithoutRetry MklFeastEigenSolver.RejectsNonfiniteSolveOutputWithoutRetry; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteSolveOutputWithoutRetry 유지 원문 검사 body 및 assertion 동일. 53d5c4a3981593c4552579e14bee4aaf3fd5e74c49b9fc74df3191bd3be660ad 53d5c4a3981593c4552579e14bee4aaf3fd5e74c49b9fc74df3191bd3be660ad EXPECT_EQ(solve_calls, 1U) EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsResidualFailureWithoutSolveRetry MklFeastEigenSolver.RejectsResidualFailureWithoutSolveRetry; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsResidualFailureWithoutSolveRetry 유지 원문 검사 body 및 assertion 동일. 5a606ee1a05bafe19f30255199a3379d849a730c837ae9e2d5b53c4a26c4aa91 5a606ee1a05bafe19f30255199a3379d849a730c837ae9e2d5b53c4a26c4aa91 "EXPECT_NE(result.GetStatus().Diagnostics().front().message.find( ""Independent whitened residual exceeds""), std::string::npos) | EXPECT_EQ(solve_calls, 1U)" "EXPECT_NE(result.GetStatus().Diagnostics().front().message.find( ""Independent whitened residual exceeds""), std::string::npos) | EXPECT_EQ(solve_calls, 1U)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteVectorAndEpsoutWithoutRetry MklFeastEigenSolver.RejectsNonfiniteVectorAndEpsoutWithoutRetry; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsNonfiniteVectorAndEpsoutWithoutRetry 유지 원문 검사 body 및 assertion 동일. 12662d8693c0d8389fc39fd1558d7d26688e89a1d30ccb5cd7ace90035fe7f3f 12662d8693c0d8389fc39fd1558d7d26688e89a1d30ccb5cd7ace90035fe7f3f EXPECT_EQ(solve_calls, 1U) EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsGramFailureWithoutSolveRetry MklFeastEigenSolver.RejectsGramFailureWithoutSolveRetry; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.RejectsGramFailureWithoutSolveRetry 유지 원문 검사 body 및 assertion 동일. 8e1f6270e69957b1ff42bd0c5c39722bbf98eb6392b7c4dea913ace4f900787a 8e1f6270e69957b1ff42bd0c5c39722bbf98eb6392b7c4dea913ace4f900787a ASSERT_EQ(outputs.vectors.size(), 4U) | EXPECT_EQ(solve_calls, 1U) ASSERT_EQ(outputs.vectors.size(), 4U) | EXPECT_EQ(solve_calls, 1U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesCertifiedEnclosureAfterOptionalInfoOne MklFeastEigenSolver.UsesCertifiedEnclosureAfterOptionalInfoOne; assertion 3개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastEigenSolver.UsesCertifiedEnclosureAfterOptionalInfoOne 유지 원문 검사 body 및 assertion 동일. 9cf4debc6123a3d0b3c8e8be2d275202c80cc9698fdc2583b3d3038995a98c3a 9cf4debc6123a3d0b3c8e8be2d275202c80cc9698fdc2583b3d3038995a98c3a "EXPECT_EQ(result.Value().upper_search_termination, ""optional-status"") | ASSERT_GE(result.Value().backend_calls.size(), 2U) | EXPECT_EQ(result.Value().backend_calls[1U].outcome, ""optional-abandoned"")" "EXPECT_EQ(result.Value().upper_search_termination, ""optional-status"") | ASSERT_GE(result.Value().backend_calls.size(), 2U) | EXPECT_EQ(result.Value().backend_calls[1U].outcome, ""optional-abandoned"")" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GenuineNonDiagonalMassPencil MklFeastGeneralized.GenuineNonDiagonalMassPencil; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GenuineNonDiagonalMassPencil 유지 원문 검사 body 및 assertion 동일. 72baededa1bfdef264afcc9f4314a0886488e2c44bfe259c7ca37bfdb7de2118 72baededa1bfdef264afcc9f4314a0886488e2c44bfe259c7ca37bfdb7de2118 ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0], 8.0 / 3.0, 1e-11) | EXPECT_NEAR(result.Value().eigenvalues[1], 4.0, 1e-11) ASSERT_TRUE(result.HasValue()) | ASSERT_EQ(result.Value().eigenvalues.size(), 2U) | EXPECT_NEAR(result.Value().eigenvalues[0], 8.0 / 3.0, 1e-11) | EXPECT_NEAR(result.Value().eigenvalues[1], 4.0, 1e-11) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsIndefiniteMassAndInvalidBound MklFeastGeneralized.RejectsIndefiniteMassAndInvalidBound; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsIndefiniteMassAndInvalidBound 유지 원문 검사 body 및 assertion 동일. 5e8a9f7f9837fd0d117abee37fc9630d32c9c751a38c6163015a164f6b405ac3 5e8a9f7f9837fd0d117abee37fc9630d32c9c751a38c6163015a164f6b405ac3 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.ValidatesPairsBeyondRequestedPrefix MklFeastGeneralized.ValidatesPairsBeyondRequestedPrefix; assertion 2개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.ValidatesPairsBeyondRequestedPrefix 유지 원문 검사 body 및 assertion 동일. 7f4b3d16aa4060b46421f1418006fddc70e34df70fd0d5e6186a7ca38a9e0841 7f4b3d16aa4060b46421f1418006fddc70e34df70fd0d5e6186a7ca38a9e0841 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().eigenvalues.size(), 3U) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(result.Value().eigenvalues.size(), 3U) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsCorruptUnselectedDirectionAndFatalCount MklFeastGeneralized.RejectsCorruptUnselectedDirectionAndFatalCount; assertion 1개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.RejectsCorruptUnselectedDirectionAndFatalCount 유지 원문 검사 body 및 assertion 동일. eefa09383f9cc94be8f9bf448ec69929396275705094abb5fa2355aeb2251473 eefa09383f9cc94be8f9bf448ec69929396275705094abb5fa2355aeb2251473 "EXPECT_NE( result.GetStatus().Diagnostics()[0].message.find(""Backend calls=""), std::string::npos)" "EXPECT_NE( result.GetStatus().Diagnostics()[0].message.find(""Backend calls=""), std::string::npos)" 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowestPrefixPreservesRepeatedBoundary MklFeastGeneralized.LowestPrefixPreservesRepeatedBoundary; assertion 3개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowestPrefixPreservesRepeatedBoundary 유지 원문 검사 body 및 assertion 동일. 2019942540740122b91b048dbd378523a47a784cfe5f3b959078ebad7131af05 2019942540740122b91b048dbd378523a47a784cfe5f3b959078ebad7131af05 ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), 5U) | EXPECT_NEAR(result.Value().eigenvalues[i], 1.0, 1e-11) ASSERT_TRUE(result.HasValue()) | ASSERT_GE(result.Value().eigenvalues.size(), 5U) | EXPECT_NEAR(result.Value().eigenvalues[i], 1.0, 1e-11) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.AllocationAndCountMismatchFailClosed MklFeastGeneralized.AllocationAndCountMismatchFailClosed; assertion 0개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.AllocationAndCountMismatchFailClosed 유지 원문 검사 body 및 assertion 동일. 1271827bfda37b6a706c22d62f642e48bdc6e3435a5bde4f99371889c0656158 1271827bfda37b6a706c22d62f642e48bdc6e3435a5bde4f99371889c0656158 해당 없음 해당 없음 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GeneralizedRetryRetainsCertifiedCountTrace MklFeastGeneralized.GeneralizedRetryRetainsCertifiedCountTrace; assertion 4개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.GeneralizedRetryRetainsCertifiedCountTrace 유지 원문 검사 body 및 assertion 동일. 658084530e78efa037f951551979e1681c86fa168014db6a798207bfee031bcf 658084530e78efa037f951551979e1681c86fa168014db6a798207bfee031bcf ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(injected) | EXPECT_NEAR(result.Value().eigenvalues[0], 1.0, 1e-11) | EXPECT_TRUE(retried) ASSERT_TRUE(result.HasValue()) | EXPECT_TRUE(injected) | EXPECT_NEAR(result.Value().eigenvalues[0], 1.0, 1e-11) | EXPECT_TRUE(retried) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowerPrefixCountsProveNoOmittedModesAndRejectNegative MklFeastGeneralized.LowerPrefixCountsProveNoOmittedModesAndRejectNegative; assertion 8개 tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp MklFeastGeneralized.LowerPrefixCountsProveNoOmittedModesAndRejectNegative 유지 원문 검사 body 및 assertion 동일. 8b1ef84c46097b604c26548141d8285b664a47537ed1df79c068f5623f7018f3 8b1ef84c46097b604c26548141d8285b664a47537ed1df79c068f5623f7018f3 ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(call.info, 0) | EXPECT_TRUE(call.count_available) | EXPECT_EQ(call.count, 0U) | EXPECT_LT(call.upper, 0.0) | EXPECT_LT(call.lower, call.upper) | EXPECT_EQ(guards, 3U) | EXPECT_NEAR(result.Value().eigenvalues[0], 0.0, 1e-12) ASSERT_TRUE(result.HasValue()) | EXPECT_EQ(call.info, 0) | EXPECT_TRUE(call.count_available) | EXPECT_EQ(call.count, 0U) | EXPECT_LT(call.upper, 0.0) | EXPECT_LT(call.lower, call.upper) | EXPECT_EQ(guards, 3U) | EXPECT_NEAR(result.Value().eigenvalues[0], 0.0, 1e-12) 유지-비정적유예 R-DEFER test-cleanup-review.md#r-defer +Refactor tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp support@1-115 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, ExpectUnitGram, RequireSuccess, ExpectFailureCode, ExpectSameBackendCalls, ExpectSameProjector, ExpectThreadSettingRestored tests/unit/solvers/eigen/mkl_feast_eigen_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 91b74d929d69e24c9a0382a7498e011486ba87f933cd35ca4a433e1ceadb2a0c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-파일/helper보존 R-SUPPORT test-cleanup-review.md#r-support +Refactor tests/unit/solvers/linear/linear_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 9개 tests/unit/solvers/linear/linear_solver_test.cpp file 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. a5aa18ef7c3aedac56b92f87740e0fa5b59acdb8ccd714ae16cc54b732ddcee0 a5aa18ef7c3aedac56b92f87740e0fa5b59acdb8ccd714ae16cc54b732ddcee0 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp MklPardisoSolver.RejectsInvalidCsrStateAndDimensions MklPardisoSolver.RejectsInvalidCsrStateAndDimensions; assertion 20개 tests/unit/solvers/linear/linear_solver_test.cpp MklPardisoSolver.RejectsInvalidCsrStateAndDimensions 유지 원문 검사 body 및 assertion 동일. 026abcfd859f19c844cf0c0ebd698138e53fb66f1846dae2c7bf8e387db960f1 026abcfd859f19c844cf0c0ebd698138e53fb66f1846dae2c7bf8e387db960f1 "EXPECT_EQ(before_factorize.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(untouched[0U], 17.0) | EXPECT_DOUBLE_EQ(untouched[1U], -4.0) | ASSERT_TRUE(solver.Factorize(empty).IsOk()) | EXPECT_TRUE(solver.Solve(fesa::Vector{0U}, empty_solution).IsOk()) | EXPECT_EQ(empty_solution.Size(), 0U) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 1.0}, solution).IsOk()) | EXPECT_NEAR(solution[0U], 2.0 / 11.0, 1.0e-14) | EXPECT_NEAR(solution[1U], 3.0 / 11.0, 1.0e-14) | EXPECT_DOUBLE_EQ(solution[0U], solved_first) | EXPECT_DOUBLE_EQ(solution[1U], solved_second) | EXPECT_DOUBLE_EQ(wrong_solution[0U], 41.0) | EXPECT_EQ(rectangular_status.Diagnostics().front().code, ""solver-matrix-not-square"") | EXPECT_FALSE(invalid_csr.HasValue()) | EXPECT_EQ(nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_FALSE(scaled_nonsymmetric_status.IsOk()) | EXPECT_EQ(scaled_nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_TRUE(no_diagonal.HasValue()) | EXPECT_EQ(no_diagonal_status.Diagnostics().front().code, ""solver-missing-diagonal"")" "EXPECT_EQ(before_factorize.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(untouched[0U], 17.0) | EXPECT_DOUBLE_EQ(untouched[1U], -4.0) | ASSERT_TRUE(solver.Factorize(empty).IsOk()) | EXPECT_TRUE(solver.Solve(fesa::Vector{0U}, empty_solution).IsOk()) | EXPECT_EQ(empty_solution.Size(), 0U) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 1.0}, solution).IsOk()) | EXPECT_NEAR(solution[0U], 2.0 / 11.0, 1.0e-14) | EXPECT_NEAR(solution[1U], 3.0 / 11.0, 1.0e-14) | EXPECT_DOUBLE_EQ(solution[0U], solved_first) | EXPECT_DOUBLE_EQ(solution[1U], solved_second) | EXPECT_DOUBLE_EQ(wrong_solution[0U], 41.0) | EXPECT_EQ(rectangular_status.Diagnostics().front().code, ""solver-matrix-not-square"") | EXPECT_FALSE(invalid_csr.HasValue()) | EXPECT_EQ(nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_FALSE(scaled_nonsymmetric_status.IsOk()) | EXPECT_EQ(scaled_nonsymmetric_status.Diagnostics().front().code, ""solver-matrix-not-symmetric"") | ASSERT_TRUE(no_diagonal.HasValue()) | EXPECT_EQ(no_diagonal_status.Diagnostics().front().code, ""solver-missing-diagonal"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp EigenSolverContract.DispatchesBothPencilsAndDestroysThroughBase EigenSolverContract.DispatchesBothPencilsAndDestroysThroughBase; assertion 6개 tests/unit/solvers/linear/linear_solver_test.cpp EigenSolverContract.DispatchesBothPencilsAndDestroysThroughBase 유지 원문 검사 body 및 assertion 동일. 5d2764884b4c48c90b274024e9194123702a2f752ab7662af1fd9b3f154c7c4c 5d2764884b4c48c90b274024e9194123702a2f752ab7662af1fd9b3f154c7c4c EXPECT_FALSE(contract.Solve(empty, 3U, 7.0).HasValue()) | EXPECT_FALSE(contract.SolveGeneralized(empty, empty, 4U, 2.0, 11.0) .HasValue()) | EXPECT_EQ(observations->standard_calls, 1) | EXPECT_EQ(observations->generalized_calls, 1) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed) EXPECT_FALSE(contract.Solve(empty, 3U, 7.0).HasValue()) | EXPECT_FALSE(contract.SolveGeneralized(empty, empty, 4U, 2.0, 11.0) .HasValue()) | EXPECT_EQ(observations->standard_calls, 1) | EXPECT_EQ(observations->generalized_calls, 1) | EXPECT_FALSE(destroyed) | EXPECT_TRUE(destroyed) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.RetainsDistinctStoragePoliciesAndFreshPhaseOrder PardisoSession.RetainsDistinctStoragePoliciesAndFreshPhaseOrder; assertion 21개 tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.RetainsDistinctStoragePoliciesAndFreshPhaseOrder 유지 원문 검사 body 및 assertion 동일. 0ac2763eb1e27f837ff6d32babfcccfbff042230d13c9855a6a56767b6ebccf0 0ac2763eb1e27f837ff6d32babfcccfbff042230d13c9855a6a56767b6ebccf0 EXPECT_EQ(call.equation_count, 2) | EXPECT_EQ(call.row_offsets[2], 3) | EXPECT_EQ(call.column_indices[0], 0) | EXPECT_EQ(call.column_indices[1], 1) | EXPECT_EQ(call.column_indices[2], 1) | EXPECT_EQ(call.matrix_type, 11) | EXPECT_EQ(call.row_offsets[2], 4) | EXPECT_DOUBLE_EQ(call.values[2], 0.0) | ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 1.0}, solution).IsOk()) | EXPECT_NEAR(solution[0], 2.0 / 11.0, 1e-14) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 2.0}, solution).IsOk()) | EXPECT_NEAR(solution[1], 6.0 / 11.0, 1e-14) | ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | EXPECT_EQ(phases, (std::vector{11, 22, 33, 33, -1, 11, 22, -1})) | ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction).IsOk()) | EXPECT_NEAR(correction[0], 2.0, 1e-14) | EXPECT_NEAR(correction[1], 2.0, 1e-14) | ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | EXPECT_EQ(phases, (std::vector{11, 22, 33, -1, 11, 22, -1})) EXPECT_EQ(call.equation_count, 2) | EXPECT_EQ(call.row_offsets[2], 3) | EXPECT_EQ(call.column_indices[0], 0) | EXPECT_EQ(call.column_indices[1], 1) | EXPECT_EQ(call.column_indices[2], 1) | EXPECT_EQ(call.matrix_type, 11) | EXPECT_EQ(call.row_offsets[2], 4) | EXPECT_DOUBLE_EQ(call.values[2], 0.0) | ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 1.0}, solution).IsOk()) | EXPECT_NEAR(solution[0], 2.0 / 11.0, 1e-14) | ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 2.0}, solution).IsOk()) | EXPECT_NEAR(solution[1], 6.0 / 11.0, 1e-14) | ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | EXPECT_EQ(phases, (std::vector{11, 22, 33, 33, -1, 11, 22, -1})) | ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction).IsOk()) | EXPECT_NEAR(correction[0], 2.0, 1e-14) | EXPECT_NEAR(correction[1], 2.0, 1e-14) | ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | EXPECT_EQ(phases, (std::vector{11, 22, 33, -1, 11, 22, -1})) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.FailedSolvePreservesOutputAndRetainedFactorization PardisoSession.FailedSolvePreservesOutputAndRetainedFactorization; assertion 9개 tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.FailedSolvePreservesOutputAndRetainedFactorization 유지 원문 검사 body 및 assertion 동일. d37fa6bfe33b1eabef4e408595013d01839f01a015d6446cb16e5c59f260ee38 d37fa6bfe33b1eabef4e408595013d01839f01a015d6446cb16e5c59f260ee38 "ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, 1U, {2.0})).IsOk()) | ASSERT_FALSE(failed.IsOk()) | EXPECT_EQ(failed.Diagnostics().front().code, ""pardiso-solve-failed"") | EXPECT_DOUBLE_EQ(solution[0], 17.0) | ASSERT_FALSE(nonfinite.IsOk()) | EXPECT_EQ(nonfinite.Diagnostics().front().code, ""nonfinite-solver-solution"") | EXPECT_DOUBLE_EQ(solution[0], 17.0) | ASSERT_TRUE(solver.Solve(fesa::Vector{1U, 6.0}, solution).IsOk()) | EXPECT_DOUBLE_EQ(solution[0], 3.0)" "ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, 1U, {2.0})).IsOk()) | ASSERT_FALSE(failed.IsOk()) | EXPECT_EQ(failed.Diagnostics().front().code, ""pardiso-solve-failed"") | EXPECT_DOUBLE_EQ(solution[0], 17.0) | ASSERT_FALSE(nonfinite.IsOk()) | EXPECT_EQ(nonfinite.Diagnostics().front().code, ""nonfinite-solver-solution"") | EXPECT_DOUBLE_EQ(solution[0], 17.0) | ASSERT_TRUE(solver.Solve(fesa::Vector{1U, 6.0}, solution).IsOk()) | EXPECT_DOUBLE_EQ(solution[0], 3.0)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.ReleaseFailurePrecedesNewValidationAndInvalidatesState PardisoSession.ReleaseFailurePrecedesNewValidationAndInvalidatesState; assertion 7개 tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.ReleaseFailurePrecedesNewValidationAndInvalidatesState 유지 원문 검사 body 및 assertion 동일. 65bcca48a4bc8eade3056e8134a5b7707ac993b018a0ac4bb87bc4fbb1ef1aa9 65bcca48a4bc8eade3056e8134a5b7707ac993b018a0ac4bb87bc4fbb1ef1aa9 "ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, 1U, {2.0})).IsOk()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-release-failed"") | ASSERT_FALSE(unavailable.IsOk()) | EXPECT_EQ(unavailable.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(output[0], 19.0) | EXPECT_EQ(releases, 1)" "ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, 1U, {2.0})).IsOk()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-release-failed"") | ASSERT_FALSE(unavailable.IsOk()) | EXPECT_EQ(unavailable.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(output[0], 19.0) | EXPECT_EQ(releases, 1)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.FactorizationFailuresAndExceptionsReleaseExactlyOnce PardisoSession.FactorizationFailuresAndExceptionsReleaseExactlyOnce; assertion 8개 tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.FactorizationFailuresAndExceptionsReleaseExactlyOnce 유지 원문 검사 body 및 assertion 동일. 86cdb4d887b0a38874787ffaaff4020fba82fa97ae6b09c6e170bffcb0b19c6b 86cdb4d887b0a38874787ffaaff4020fba82fa97ae6b09c6e170bffcb0b19c6b "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-integer-overflow"") | EXPECT_FALSE(solver.Solve(fesa::Vector{1U, 1.0}, output).IsOk()) | EXPECT_DOUBLE_EQ(output[0], 29.0) | EXPECT_EQ(phases, failing_phase == 11 ? (std::vector{11, -1}) : (std::vector{11, 22, -1})) | EXPECT_THROW(solver.FactorizeFresh(matrix), std::runtime_error) | EXPECT_EQ(phases, (std::vector{11, -1})) | EXPECT_EQ(phases, (std::vector{11, -1}))" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-integer-overflow"") | EXPECT_FALSE(solver.Solve(fesa::Vector{1U, 1.0}, output).IsOk()) | EXPECT_DOUBLE_EQ(output[0], 29.0) | EXPECT_EQ(phases, failing_phase == 11 ? (std::vector{11, -1}) : (std::vector{11, 22, -1})) | EXPECT_THROW(solver.FactorizeFresh(matrix), std::runtime_error) | EXPECT_EQ(phases, (std::vector{11, -1})) | EXPECT_EQ(phases, (std::vector{11, -1}))" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.FailedTangentSolveRetainsStateButFailedFreshInvalidatesIt PardisoSession.FailedTangentSolveRetainsStateButFailedFreshInvalidatesIt; assertion 14개 tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.FailedTangentSolveRetainsStateButFailedFreshInvalidatesIt 유지 원문 검사 body 및 assertion 동일. c9ebef4503d7e7c96bae841dc2739dccc431699a65b4842c8366977b3eb3675c c9ebef4503d7e7c96bae841dc2739dccc431699a65b4842c8366977b3eb3675c "ASSERT_TRUE(solver.FactorizeFresh( MakeDenseCsr(2U, 2U, {2.0, 1.0, 0.0, 3.0})).IsOk()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-solve-failed"") | EXPECT_DOUBLE_EQ(correction[0], 31.0) | EXPECT_DOUBLE_EQ(correction[1], 31.0) | ASSERT_TRUE(solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction).IsOk()) | EXPECT_NEAR(correction[0], 2.0, 1e-14) | EXPECT_NEAR(correction[1], 2.0, 1e-14) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""solver-matrix-not-square"") | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_NEAR(correction[0], 2.0, 1e-14) | EXPECT_NEAR(correction[1], 2.0, 1e-14)" "ASSERT_TRUE(solver.FactorizeFresh( MakeDenseCsr(2U, 2U, {2.0, 1.0, 0.0, 3.0})).IsOk()) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-solve-failed"") | EXPECT_DOUBLE_EQ(correction[0], 31.0) | EXPECT_DOUBLE_EQ(correction[1], 31.0) | ASSERT_TRUE(solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction).IsOk()) | EXPECT_NEAR(correction[0], 2.0, 1e-14) | EXPECT_NEAR(correction[1], 2.0, 1e-14) | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""solver-matrix-not-square"") | ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_NEAR(correction[0], 2.0, 1e-14) | EXPECT_NEAR(correction[1], 2.0, 1e-14)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.EmptyLifecycleNeverInvokesBackend PardisoSession.EmptyLifecycleNeverInvokesBackend; assertion 7개 tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.EmptyLifecycleNeverInvokesBackend 유지 원문 검사 body 및 assertion 동일. c689a24fcc5fe8bcd502deaa8e11343b665059523de896d1b58190f59ddb44e3 c689a24fcc5fe8bcd502deaa8e11343b665059523de896d1b58190f59ddb44e3 ASSERT_TRUE(solver.Factorize(empty).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{0U}, solution).IsOk()) | ASSERT_TRUE(solver.Factorize(empty).IsOk()) | ASSERT_TRUE(tangent.FactorizeFresh(empty).IsOk()) | ASSERT_TRUE(tangent.SolveCorrection(fesa::Vector{0U}, solution).IsOk()) | ASSERT_TRUE(tangent.FactorizeFresh(empty).IsOk()) | EXPECT_EQ(calls, 0) ASSERT_TRUE(solver.Factorize(empty).IsOk()) | ASSERT_TRUE(solver.Solve(fesa::Vector{0U}, solution).IsOk()) | ASSERT_TRUE(solver.Factorize(empty).IsOk()) | ASSERT_TRUE(tangent.FactorizeFresh(empty).IsOk()) | ASSERT_TRUE(tangent.SolveCorrection(fesa::Vector{0U}, solution).IsOk()) | ASSERT_TRUE(tangent.FactorizeFresh(empty).IsOk()) | EXPECT_EQ(calls, 0) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.RestoresDefaultThreadPolicyAndPreservesCallerOverride PardisoSession.RestoresDefaultThreadPolicyAndPreservesCallerOverride; assertion 5개 tests/unit/solvers/linear/linear_solver_test.cpp PardisoSession.RestoresDefaultThreadPolicyAndPreservesCallerOverride 유지 원문 검사 body 및 assertion 동일. afe5e61f02fd49e178975e1320c2c6bd5b385e8d3d351c1e2d8ddf8da54be01a afe5e61f02fd49e178975e1320c2c6bd5b385e8d3d351c1e2d8ddf8da54be01a EXPECT_EQ(mkl_get_max_threads(), caller_threads == 0 ? 1 : 2) | EXPECT_FALSE(solver.Factorize(matrix).IsOk()) | EXPECT_EQ(mkl_set_num_threads_local(caller_threads), caller_threads) | EXPECT_EQ(release_calls, 1) | EXPECT_EQ(mkl_set_num_threads_local(caller_threads), caller_threads) EXPECT_EQ(mkl_get_max_threads(), caller_threads == 0 ? 1 : 2) | EXPECT_FALSE(solver.Factorize(matrix).IsOk()) | EXPECT_EQ(mkl_set_num_threads_local(caller_threads), caller_threads) | EXPECT_EQ(release_calls, 1) | EXPECT_EQ(mkl_set_num_threads_local(caller_threads), caller_threads) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp support@1-56 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, ExpectSolverFailure tests/unit/solvers/linear/linear_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 78a8b579a04f3c3dc7c959d45f7ef9271489b3e7638a0b34de24c3ff8421e23c 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/linear_solver_test.cpp support@137-178 helper/oracle/fixture/include/static assertion 구간: RecordingEigenSolver tests/unit/solvers/linear/linear_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b31e1a103b5d1e9f151dbb822bc2e9fda76b81520a3577098db488c967841767 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 6개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 27c0608a66a44ffba73d2d081a5689bece07002b272a0cc5443ce4457e35a8ae b278df4853fd35b4a609df18ba48bf7d27eeba7a88d58b7ff00d759f5461ccff 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual; assertion 4개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual 유지 원문 검사 body 및 assertion 동일. 0dd88a78ef239ae0d316f9fc4ecbfe7e6baba99a61eda7cc8f42e6616c09915c 0dd88a78ef239ae0d316f9fc4ecbfe7e6baba99a61eda7cc8f42e6616c09915c ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs; assertion 7개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs 유지 원문 검사 body 및 assertion 동일. 0d5dd1f6b920c6201997eef647077b4039020a9adaa93483733c395ce55ecaed 0d5dd1f6b920c6201997eef647077b4039020a9adaa93483733c395ce55ecaed ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_first, first).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_second, second).IsOk()) | EXPECT_LE(RelativeError(first, expected_first), 1.0e-9) | EXPECT_LE(RelativeError(second, expected_second), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, first, rhs_first), 1.0e-10) | EXPECT_LE(NormalizedResidual(matrix, second, rhs_second), 1.0e-10) ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_first, first).IsOk()) | ASSERT_TRUE(solver.Solve(rhs_second, second).IsOk()) | EXPECT_LE(RelativeError(first, expected_first), 1.0e-9) | EXPECT_LE(RelativeError(second, expected_second), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, first, rhs_first), 1.0e-10) | EXPECT_LE(NormalizedResidual(matrix, second, rhs_second), 1.0e-10) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.StillRejectsNonsymmetricPublicCsr MklPardisoSolver.StillRejectsNonsymmetricPublicCsr; assertion 1개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.StillRejectsNonsymmetricPublicCsr 유지 원문 검사 body 및 assertion 동일. 2d3aeaa63b4de4a45b8b553f51fe2223bb64e4c36e107c154ea333382d3ef052 2d3aeaa63b4de4a45b8b553f51fe2223bb64e4c36e107c154ea333382d3ef052 "EXPECT_EQ(status.Diagnostics()[0U].code, ""solver-matrix-not-symmetric"")" "EXPECT_EQ(status.Diagnostics()[0U].code, ""solver-matrix-not-symmetric"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.RefactorizesWithoutLeakingState MklPardisoSolver.RefactorizesWithoutLeakingState; assertion 7개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.RefactorizesWithoutLeakingState 유지 원문 검사 body 및 assertion 동일. 72be7b9a87610a6d9dcb1324dc15b4d400c837e097dee540c00dd3e510921f35 72be7b9a87610a6d9dcb1324dc15b4d400c837e097dee540c00dd3e510921f35 ASSERT_TRUE(solver.Factorize(first_matrix).IsOk()) | ASSERT_TRUE( solver.Solve(first_matrix.Multiply(first_expected), first_solution) .IsOk()) | EXPECT_LE(RelativeError(first_solution, first_expected), 1.0e-9) | ASSERT_TRUE(solver.Factorize(second_matrix).IsOk()) | ASSERT_TRUE(solver.Solve(second_rhs, second_solution).IsOk()) | EXPECT_LE(RelativeError(second_solution, second_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(second_matrix, second_solution, second_rhs), 1.0e-10) ASSERT_TRUE(solver.Factorize(first_matrix).IsOk()) | ASSERT_TRUE( solver.Solve(first_matrix.Multiply(first_expected), first_solution) .IsOk()) | EXPECT_LE(RelativeError(first_solution, first_expected), 1.0e-9) | ASSERT_TRUE(solver.Factorize(second_matrix).IsOk()) | ASSERT_TRUE(solver.Solve(second_rhs, second_solution).IsOk()) | EXPECT_LE(RelativeError(second_solution, second_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(second_matrix, second_solution, second_rhs), 1.0e-10) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures; assertion 10개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures 유지 원문 검사 body 및 assertion 동일. 007dec8a37d6956c242634b01f7e6f8f496f0e02082a94437a15dd3caaf89673 007dec8a37d6956c242634b01f7e6f8f496f0e02082a94437a15dd3caaf89673 "EXPECT_TRUE(singular_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || singular_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE( singular_status.Diagnostics()[0U].entity_identity.find(""phase=22,error=""), std::string::npos) | EXPECT_TRUE(indefinite_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || indefinite_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE(indefinite_status.Diagnostics()[0U].entity_identity.find( ""phase=22,error=""), std::string::npos) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | EXPECT_EQ(rhs_status.Diagnostics()[0U].code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(solution[0U], 23.0) | EXPECT_DOUBLE_EQ(solution[1U], -9.0) | EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics()[0U].code, ""nonfinite-sparse-value"")" "EXPECT_TRUE(singular_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || singular_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE( singular_status.Diagnostics()[0U].entity_identity.find(""phase=22,error=""), std::string::npos) | EXPECT_TRUE(indefinite_status.Diagnostics()[0U].code == ""pardiso-zero-or-negative-pivot"" || indefinite_status.Diagnostics()[0U].code == ""pardiso-singular-diagonal"") | EXPECT_NE(indefinite_status.Diagnostics()[0U].entity_identity.find( ""phase=22,error=""), std::string::npos) | ASSERT_TRUE(solver.Factorize(spd).IsOk()) | EXPECT_EQ(rhs_status.Diagnostics()[0U].code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(solution[0U], 23.0) | EXPECT_DOUBLE_EQ(solution[1U], -9.0) | EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics()[0U].code, ""nonfinite-sparse-value"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly; assertion 10개 tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly 유지 원문 검사 body 및 assertion 동일. 2e4b58fe2ef908b1c53f3dd40639f2423afb8429d5bdc7fdb80675b3efeceee2 2e4b58fe2ef908b1c53f3dd40639f2423afb8429d5bdc7fdb80675b3efeceee2 ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) | ASSERT_TRUE(resolved_solver.Factorize(resolved_matrix).IsOk()) | ASSERT_TRUE(resolved_solver.Solve(resolved_rhs, resolved_solution).IsOk()) | EXPECT_LE( NormalizedResidual(resolved_matrix, resolved_solution, resolved_rhs), 1.0e-10) | EXPECT_LE(RelativeError(resolved_solution, resolved_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) ASSERT_TRUE(solver.Factorize(matrix).IsOk()) | ASSERT_TRUE(solver.Solve(rhs, solution).IsOk()) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) | ASSERT_TRUE(resolved_solver.Factorize(resolved_matrix).IsOk()) | ASSERT_TRUE(resolved_solver.Solve(resolved_rhs, resolved_solution).IsOk()) | EXPECT_LE( NormalizedResidual(resolved_matrix, resolved_solution, resolved_rhs), 1.0e-10) | EXPECT_LE(RelativeError(resolved_solution, resolved_expected), 1.0e-9) | EXPECT_LE(NormalizedResidual(matrix, solution, rhs), 1.0e-10) | EXPECT_LE(RelativeError(solution, expected), 1.0e-9) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp support@1-89 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, MakeVector, for, NormalizedResidual, if, RelativeError, ExpectStructuredSolverFailure tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. be39de09554cc190405a0bd1595f71c1c153921de7478644704b3d5caab279ca 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp file 전체 파일 및 모든 helper 구간; 명명된 검사/helper 5개 tests/unit/solvers/linear/tangent_solver_test.cpp file 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. b6c7c50cbf6f3b4472f9058ed517905a66a3dea42255867c451d0c308aba7507 c457f80368b1e01bab7e7d177c0bda8283d0590e7150e064c270f86c9a95e858 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesNonsymmetricKnownCorrection TangentSolver.SolvesNonsymmetricKnownCorrection; assertion 4개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesNonsymmetricKnownCorrection 유지 원문 검사 body 및 assertion 동일. 838690231b74c1b272bda475dea0234187495f7e8c045ee449f04ae3ac0d1233 838690231b74c1b272bda475dea0234187495f7e8c045ee449f04ae3ac0d1233 ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(rhs, correction).IsOk()) | EXPECT_NEAR(correction[0U], 1.0, 1.0e-14) | EXPECT_NEAR(correction[1U], 2.0, 1.0e-14) ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | ASSERT_TRUE(solver.SolveCorrection(rhs, correction).IsOk()) | EXPECT_NEAR(correction[0U], 1.0, 1.0e-14) | EXPECT_NEAR(correction[1U], 2.0, 1.0e-14) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesTrivialZeroEquationSystem TangentSolver.SolvesTrivialZeroEquationSystem; assertion 3개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.SolvesTrivialZeroEquationSystem 유지 원문 검사 body 및 assertion 동일. 271ea5671ba0adda4eab6af4646dda04cf09d9a77c2f0857c1a1216458a9d1d1 271ea5671ba0adda4eab6af4646dda04cf09d9a77c2f0857c1a1216458a9d1d1 ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | EXPECT_TRUE(solver.SolveCorrection(fesa::Vector{0U}, correction).IsOk()) | EXPECT_EQ(correction.Size(), 0U) ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()) | EXPECT_TRUE(solver.SolveCorrection(fesa::Vector{0U}, correction).IsOk()) | EXPECT_EQ(correction.Size(), 0U) 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsNonfiniteInputsWithoutModifyingCorrection TangentSolver.RejectsNonfiniteInputsWithoutModifyingCorrection; assertion 6개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsNonfiniteInputsWithoutModifyingCorrection 유지 원문 검사 body 및 assertion 동일. 11e41d7e1b0f4715dfddd024f947c926155d20ba0b4fa3d6734756afe8603bd6 11e41d7e1b0f4715dfddd024f947c926155d20ba0b4fa3d6734756afe8603bd6 "EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics().front().code, ""nonfinite-sparse-value"") | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0})) .IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(correction[0U], 17.0) | EXPECT_DOUBLE_EQ(correction[1U], -4.0)" "EXPECT_FALSE(nonfinite_matrix.HasValue()) | EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics().front().code, ""nonfinite-sparse-value"") | ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0})) .IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""nonfinite-solver-rhs"") | EXPECT_DOUBLE_EQ(correction[0U], 17.0) | EXPECT_DOUBLE_EQ(correction[1U], -4.0)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.ReportsSingularFactorizationDeterministically TangentSolver.ReportsSingularFactorizationDeterministically; assertion 3개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.ReportsSingularFactorizationDeterministically 유지 원문 검사 body 및 assertion 동일. 54a59242a6753c254e6f1e9b3b87783b30b47329241c5dda5d053a57eae851bc 54a59242a6753c254e6f1e9b3b87783b30b47329241c5dda5d053a57eae851bc "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-perturbed-pivot"") | EXPECT_EQ(status.Diagnostics().front().entity_identity, ""phase=22"")" "ASSERT_FALSE(status.IsOk()) | EXPECT_EQ(status.Diagnostics().front().code, ""pardiso-perturbed-pivot"") | EXPECT_EQ(status.Diagnostics().front().entity_identity, ""phase=22"")" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsSolveBeforeSuccessfulFactorization TangentSolver.RejectsSolveBeforeSuccessfulFactorization; assertion 3개 tests/unit/solvers/linear/tangent_solver_test.cpp TangentSolver.RejectsSolveBeforeSuccessfulFactorization 유지 원문 검사 body 및 assertion 동일. eb2b17bad95e253fe1e9c3a8aed6f6fbf92e2921643507f4a11862c36c28d0d7 eb2b17bad95e253fe1e9c3a8aed6f6fbf92e2921643507f4a11862c36c28d0d7 "EXPECT_EQ(status.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(correction[0U], 23.0) | EXPECT_DOUBLE_EQ(correction[1U], -9.0)" "EXPECT_EQ(status.Diagnostics().front().code, ""solver-not-factorized"") | EXPECT_DOUBLE_EQ(correction[0U], 23.0) | EXPECT_DOUBLE_EQ(correction[1U], -9.0)" 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp support@1-57 helper/oracle/fixture/include/static assertion 구간: MakeDenseCsr, MakeVector, for, ExpectSolverFailure tests/unit/solvers/linear/tangent_solver_test.cpp file-support 이관 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 437aff9aeafd5c7aad5083cfce86a40114d04c4a326e4968e57fc84802f77710 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric +Refactor tests/unit/solvers/linear/tangent_solver_test.cpp support@131-132 helper/oracle/fixture/include/static assertion 구간: module 선언·상수·자료 tests/unit/solvers/linear/tangent_solver_test.cpp file-support 유지 원문과 최종의 개별 검사 identity 및 assertion은 아래 행과 assertion 열로 대응한다. helper/include 변경은 같은 최종 파일에서 소비한다. 89fe293cbdd849071ed62550d3589122044f6f9a80b0b0bc121731da330966ea 최종 파일 SHA 참조 해당 없음 해당 없음 유지-대체동등성미입증 R-NUMERIC test-cleanup-review.md#r-numeric diff --git a/docs/hex8-structural-analysis/README.md b/docs/hex8-structural-analysis/README.md index 21c9106..0d3be94 100644 --- a/docs/hex8-structural-analysis/README.md +++ b/docs/hex8-structural-analysis/README.md @@ -120,3 +120,11 @@ Reduced/hybrid/incompatible/20절점, plasticity/contact, mixed shell-solid, pre warped stability·남은 bending shear locking, 임의 큰 변형/mesh/시간간격은 일반 보증 범위 밖이다. 원본 U 일치만으로 physical a·장시간 에너지·전체 시간수렴을 검증했다고 주장하지 않는다. 최적화 후 최종 source의 전체 MSVC Debug build/CTest·필수 원본·독립 물리 확인이 남는다. + +## 통합된 local 경계 + +[SolidTrialElement/Hex8TrialAdapter](../../include/fesa/elements/element_capabilities.h)가 같은 +stable-address immutable Hex8 kernel의 stiffness·reference mass·paired response를 빌린다. +Adapter에 equation·trial history를 옮기지 않으며 원래 paired 산술·실패 경계를 유지한다. +공통 procedure·typed pending과 결과 dispatch는 [모듈화 요약](../cpp-object-oriented-modular-refactoring/README.md)을 따른다. +Frequency 비교는 `reference/hexa/hexa_freq.txt`의 modal Value를 직접 사용한다. diff --git a/docs/hht-implicit-dynamics/README.md b/docs/hht-implicit-dynamics/README.md index 16fd28e..dc9949a 100644 --- a/docs/hht-implicit-dynamics/README.md +++ b/docs/hht-implicit-dynamics/README.md @@ -126,4 +126,21 @@ C08b finer-grid·최신 최적화 source의 원본 HDF5 비교·전체 회귀· | --- | --- | | [2026-10-04 본식](formulation-historical-docs-cleanup-20261004.md), [관성 원본](formulation-inertia-historical-docs-cleanup-20261004.md) | 당시 consistent 정책의 수식·검토 이력이다. 현재 lumped/reduced/fixed-null 정책이 우선한다. | | [C08b Newton 연구](formulation-c08b-newton-research-20261012.md), [DAE 연구](formulation-dae-research-20261012.md) | 원인·후보 조사이며 모든 Newton/DAE 후보의 채택을 뜻하지 않는다. | -| [운동량 연구](formulation-momentum-research-20261012.md), [graph certificate 초안](formulation-graph-certificate-draft-20261012.md) | 불변량·controller/certificate 연구의 원본이다. 현재 acceptance나 엄밀한 전역 오차 보증을 자동 대체하지 않는다. | \ No newline at end of file +| [운동량 연구](formulation-momentum-research-20261012.md), [graph certificate 초안](formulation-graph-certificate-draft-20261012.md) | 불변량·controller/certificate 연구의 원본이다. 현재 acceptance나 엄밀한 전역 오차 보증을 자동 대체하지 않는다. | + +## 통합된 실행 경계 + +공통 [AnalysisProcedure](../../include/fesa/analysis/analysis_procedure.h) 선택 뒤 reduced 절차를 실행한다. +[ShellHhtIntegrator](../../src/fesa/analysis/hht_reduced_integrator.h)는 predictor/rate 복원을, +[EquilibriumStep](../../src/fesa/analysis/equilibrium_algorithm.h)은0부터 시작하는 correction과 +typed pending을 분리한다. History는 procedure가 소유하고 동일 acceptance 뒤 commit한다. +빌드·선별 검사 결과는 [통합 현황](../cpp-object-oriented-modular-refactoring/README.md)을 따르며, +과거 interrupted run·finest binary64 noise의 미판정을 새 전체 통과로 바꾸지 않는다. + +## 이번 병합 검증의 사용자 변경 + +2026-10-18 사용자가 장시간 HHT 검증을 중단하고 정적해석만 검증해 다음 단계로 +진행하도록 변경했다. Native 전체 실행의 부분 stdout·기존 결과는 보존하되 현재 HHT +전체 PASS나 수치 FAIL로 계산하지 않는다. 비정적 테스트는 삭제하지 않는다. 완료된 개별 +검사와 중단된 C08b의 범위·근거는 [병합 현황](../cpp-object-oriented-modular-refactoring/README.md)에 +구분한다. 이 실행 범위 변경은 정식화·허용치·시간수렴 요구 자체의 변경이 아니다. diff --git a/docs/nonlinear-static-newton-raphson/README.md b/docs/nonlinear-static-newton-raphson/README.md index 4ee0a56..493ea18 100644 --- a/docs/nonlinear-static-newton-raphson/README.md +++ b/docs/nonlinear-static-newton-raphson/README.md @@ -48,7 +48,10 @@ Fine optional stress의 malformed node label `ss`는 비차단 inventory 문제 Family의 reference-only `S=max(abs(ref))`에 대해 near-zero `abs(ref)<=0.01*S`는 error `<=0.01*S`, 나머지는 relative error `<=5%`, family RMS/S `<=1%`를 함께 검사한다. Zero-scale은 exact zero다. Blocking·warning·review의 수치와 판정 영향을 구분한다. -내부 accepted free residual·force/moment 평형의 normalized 기준은 `1e-10`이다. +Accepted free residual은 matching external scale이 nonzero이면 infinity-norm relative `<=1e-2`, +exact-zero이면 typed absolute `<=1e-3` force 또는 force-length다. Factor-one 전역 force/moment +balance는 각각 normalized `<=1e-8`이다. 이는 기존 comparator의 승인 계약이며 두 양을 +하나의 `1e-10` 기준으로 요약하지 않는다. Linear 정적·HHT·eigen의 별도 gate는 바꾸지 않는다. ## 구현과 상태 수명 @@ -70,3 +73,13 @@ Reaction은 단일 global 합만 맞춰 local reaction 정확성을 대체할 큰 자세 변화와 원점 이동에서 spatial moment balance를 함께 확인해야 한다. 외부 U 통과는 warning UR 또는 review RF/RM의 수치 일치를 뜻하지 않는다. 현재 prescribed path와 단일재료 shell 사례가 arbitrary nonlinear 모델의 수렴을 보장하지 않는다. + +## 통합 시 자료와 API 상태 + +Procedure는 공통 [AnalysisProcedure](../../include/fesa/analysis/analysis_procedure.h)로 선택되고 +local trial은 [ShellTrialElement](../../include/fesa/elements/element_capabilities.h)를 통해 계산한다. +Kernel은 immutable·stable-address borrowed object이고 accepted candidate는 procedure 소유다. +Full Newton의 typed pending·iteration 순서는 [모듈화 요약](../cpp-object-oriented-modular-refactoring/README.md)을 따른다. +정식 `reference/shellNL-meshfine/`와 `reference/shellNL-meshfine_02/` 자료가 없어 해당 비교는 미완료다. +2026-10-18 사용자 지시에 따라 `reference/temp`로 대체하지 않는다. 정식 자료가 확보되어야 +hash·source identity·comparator 지원을 확인하고 실제 비교를 재개할 수 있다. diff --git a/docs/shell-surface-pressure-load/README.md b/docs/shell-surface-pressure-load/README.md index 6f12a0d..f589571 100644 --- a/docs/shell-surface-pressure-load/README.md +++ b/docs/shell-surface-pressure-load/README.md @@ -53,7 +53,9 @@ CSV의 frame·instance·source node와 component를 HDF5 nodal row에 직접 대 Shared row/schema/finite precheck는 tolerance 이전 조건이며 warning family에도 적용한다. Reference-only `S=max(abs(ref))`에 대해 `abs(ref)<=0.01*S`는 error `<=0.01*S`, 나머지는 relative error `<=5%`, family RMS/S `<=1%`를 요구한다. `S=0`은 exact zero다. -내부 free residual·전역 force/moment balance는 normalized `1e-10`을 사용한다. +Nonlinear accepted free residual은 [비선형 정적 기준](../nonlinear-static-newton-raphson/README.md)을 +따르고, factor-one 전역 force/moment balance는 각각 normalized `<=1e-8`이다. +이는 [기존 pressure 정식화](formulation.md)의 승인 범위이며 linear 정적 기준과 구분한다. ## 구현과 수명 @@ -75,3 +77,10 @@ DSLOAD와 DLOAD의 부호 규칙을 섞거나 reference area로 follower load를 같은 trial의 force/tangent를 함께 써야 Newton 일관성을 유지한다. 외부 displacement 일치만으로 압력 tangent나 local reaction 정확성을 추론하지 않는다. 한 개의 지정 shell pressure bundle은 arbitrary closed surface·offset face·contact pressure 검증이 아니다. + +## 통합 시 기준자료 상태 + +정식 `reference/shellNL-meshfine-pressure/` 자료가 없어 실제 pressure bundle 비교는 미완료다. +2026-10-18 사용자 지시에 따라 `reference/temp`는 검증에 사용하지 않으며 임시 묶음을 승격하지 않는다. +Kernel·synthetic comparator 검사가 실제 pressure reference 통과를 대신하지 않는다. +정식 자료 확보 후 원본 hash·source/frame 대응을 확인하고 작업 복사본으로 재검증해야 한다. diff --git a/docs/shell-transient-heat-transfer/README.md b/docs/shell-transient-heat-transfer/README.md index e297cf1..0b3c0db 100644 --- a/docs/shell-transient-heat-transfer/README.md +++ b/docs/shell-transient-heat-transfer/README.md @@ -131,3 +131,11 @@ hash-checked 입력의 유일 instance와 결합하며 node source identity로 b 접합부는 검증 한계다. 단일 NT11 시점으로 다른 station·flux·반력·전체 시간 정확도를 검증했다고 주장하지 않는다. Dev 통합 승인은 새 필수 reference 통과 승인이 아니다. + +## 통합된 kernel 경계 + +[ThermalElement/Ds4ThermalAdapter](../../include/fesa/elements/element_capabilities.h)는 immutable +DS4 kernel을 빌리고 DOF11–15 layout·K/C와 interval·복구를 typed로 제공한다. +Kernel의 주소·수명은 adapter보다 안정적이어야 한다. Thermal state·잔차 인증·accepted history와 +writer 실패 경계는 그대로 procedure/state/writer에 남는다. 전체 검증 대상에 과도 열해석도 포함하며, +새 필수 reference 미확보와 기존 NT11 diagnostic 불일치를 통과로 바꾸지 않는다. diff --git a/docs/solver-core/README.md b/docs/solver-core/README.md index eccb3b6..eaf35b0 100644 --- a/docs/solver-core/README.md +++ b/docs/solver-core/README.md @@ -1,6 +1,6 @@ # 솔버 공통 구조와 계약 -FESA는 C++17 이상·Windows MSVC x64 Debug·CMake/CTest를 기준으로 하는 개인 연구용 솔버다. 승인된 Abaqus 입력 subset을 독립 모델로 해석하고 HDF5를 쓴다. Source spelling의 수용은 Abaqus 내부 요소·적분·알고리즘과의 동등성을 뜻하지 않는다. 외부 배포 형태·지원 환경·dependency 재배포 조건은 아직 정해지지 않았다. +FESA는 C++17 이상·Windows MSVC x64 Debug·직접 MSBuild와 CMake/CTest를 기준으로 하는 개인 연구용 솔버다. 승인된 Abaqus 입력 subset을 독립 모델로 해석하고 HDF5를 쓴다. Source spelling의 수용은 Abaqus 내부 요소·적분·알고리즘과의 동등성을 뜻하지 않는다. 외부 배포 형태·지원 환경·dependency 재배포 조건은 아직 정해지지 않았다. ## 책임과 수명 @@ -49,23 +49,61 @@ Configure/build/test의 compiler·구성·build tree를 함께 맞추고 discove ## 빌드와 직접 검사 -MSVC x64 Developer PowerShell에서 저장소 root를 작업 디렉터리로 사용한다. CMake3.25 이상, -Ninja, 로컬 GoogleTest source checkout과 MKL·TBB·HDF5 개발 package가 필요하다. -`FESA_GTEST_SOURCE_DIR`은 GoogleTest의 CMakeLists.txt가 있는 source root이고, -`MKL_DIR`·`TBB_DIR`·`HDF5_DIR`은 각각 package config 파일이 있는 디렉터리다. -환경 변수에 로컬 경로를 지정한 뒤 [CMake presets](../../CMakePresets.json)의 직접 명령을 사용한다. +직접 관리하는 [FESA.sln](../../FESA.sln)과 [msvc 지침](../../msvc/AGENTS.md)이 주 개발 빌드다. +VS x64 개발 환경에서 저장소 root를 작업 디렉터리로 사용한다. v145 toolset과 로컬 +GoogleTest source checkout, MKL ILP64/dynamic/Intel threading·TBB·HDF5·OpenMP가 필요하다. +`FESA_GTEST_SOURCE_DIR`, `FESA_MKL_ROOT`, `FESA_TBB_ROOT`, `FESA_HDF5_ROOT`, +`FESA_OMP_ROOT`에 설치 root를 지정하거나 ignored `msvc/Fesa.Local.props`로 주입한다. +개인 설치 경로를 추적 파일에 고정하거나 dependency를 자동 다운로드하지 않는다. -```powershell -cmake --preset windows-msvc-ninja-debug -cmake --build --preset windows-msvc-ninja-debug -ctest --preset windows-msvc-ninja-debug --show-only=json-v1 -ctest --preset windows-msvc-ninja-debug --output-on-failure +```bat +MSBuild FESA.sln /m:2 /p:Configuration=Debug /p:Platform=x64 +.build\native\Debug\tests\fesa_unit_tests.exe +.build\native\Debug\tests\fesa_integration_tests.exe +.build\native\Debug\tests\fesa_reference_tests.exe ``` -Debug build tree는 `build/windows-msvc-ninja-debug`, 별도 Release는 -`build/windows-msvc-ninja-release`이며 configure/build preset 이름도 각각 대응한다. -Debug와 Release의 binary·test inventory·evidence를 섞지 않는다. CTest discovery와 실제 -종료 코드를 함께 확인한다. Python 검사가 필요하면 해당 suite를 별도로 실행하며 CTest에 -포함됐다고 추론하지 않는다. [CMake](../../CMakeLists.txt)의 `fesa_docs` target은 Doxygen을 -찾았을 때만 생성되므로 선택적 API 문서 산출물이다. CLI executable은 각 build tree의 -`src/fesa/fesa.exe`이며 dependency runtime DLL을 함께 준비한다. +Native CLI는 `.build/native/Debug/src/fesa/fesa.exe`이며 테스트 executable은 +`.build/native/Debug/tests/`에 있다. Release는 같은 구조의 `Release` 디렉터리다. +직접 MSBuild에 CMake·Ninja·Doxygen을 선행 조건으로 추가하지 않는다. + +보조 경로는 CMake3.25 이상·Ninja·동일 MSVC 환경을 사용한다. `MKL_DIR`·`TBB_DIR`· +`HDF5_DIR`은 각각 config package 디렉터리다. 한국어 MSVC의 include 추적을 위해 +configure/build 모두 code page 65001을 사용한다. + +```bat +chcp 65001 +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug --parallel 2 +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure -j 1 +python -m pytest tests -q +``` + +[Presets](../../CMakePresets.json)의 Debug tree는 `.build/cmake-debug`, Release는 +`.build/cmake-release`다. CMake CLI도 각 tree의 `src/fesa/fesa.exe`에 있다. +Debug/Release의 binary·DLL·검사 목록·실행 근거를 섞지 않는다. AVX2는 전용 Hex8 +source에만 적용하며 CRT·정밀도·source·link·runtime DLL과 검사 identity를 두 경로에서 대조한다. +`fesa_docs`는 Doxygen을 찾았을 때만 생기는 선택적 target이다. + +이번 통합 검증은 2026-10-18 사용자 변경에 따라 정적해석·공통 계약 검사로 한정한다. +전체 등록 identity를 대조하되 실제 선택/제외 목록과 이유를 기록하고, 새로 이관한 정적 검사도 +포함한다. 위 명령은 일반 전체 실행 예시이며 이번에는 명시적 정적 선택 목록을 사용한다. +정식 정적5모델(beam·linear/nonlinear shell·linear/nonlinear Hex8)을 새 기준 실행물과 +Native/CMake에서 비교한다. Python 정책·합성 비교기는 실제 비정적 solver를 실행하는지 +확인해 별도로 검사한다. HHT·solid dynamic·eigen/frequency·transient thermal 실행은 제외하고 +미검증으로 남긴다. 과거 정적 PASS도 현재 실행으로 승계하지 않는다. Native/CTest는 +서로 다른 실행 전용 TMP/TEMP와 raw 출력 경로를 사용해 직렬 실행한다. 상속된 필터·sharding을 +제거하고 실제 identity·수·exit·XML/log를 discovery와 대조한다. Skip·0건·자료 누락은 PASS가 아니다. +모델은 hash가 확인된 새 작업 복사본에서만 실행한다. `reference/temp`는 검증에 사용하지 않는다. +현재 진행 결과와 미완료 비교는 [병합 현황](../cpp-object-oriented-modular-refactoring/README.md)에 기록한다. + +## 공통 procedure와 결과 경계 + +[PrepareAnalysisInput/CreateAnalysisProcedure](../../include/fesa/analysis/prepared_analysis.h)는 +한 번 mapping한 Domain에서 한 family를 선택한다. `AnalysisProcedure::Execute`는 +[typed outcome](../../include/fesa/analysis/prepared_analysis_outcome.h)을 반환하며 파일을 열지 않는다. +Domain과 주입된 solver·parallel·log adapter는 실행 동안 살아 있고 이동하지 않아야 한다. +App이 로그 close 성공을 확인한 뒤 `FinalizePreparedAnalysisResult`가 +[WritePreparedAnalysisResult](../../include/fesa/results/prepared_results_writer.h)로 연결한다. +필요한 writer 부재는 output failure이며 다른 결과 family로 위장하지 않는다. diff --git a/include/fesa/AGENTS.md b/include/fesa/AGENTS.md index 3eb3600..f7cdb98 100644 --- a/include/fesa/AGENTS.md +++ b/include/fesa/AGENTS.md @@ -13,3 +13,9 @@ optional state·virtual method를 공통 base에 추가하지 않는다. - Interface 변경은 consumer compile, 소유권·수명, invalid combination과 현재 결과의 보존을 검증한다. 선언만 추가하고 parser나 CLI 지원까지 완료됐다고 보고하지 않는다. + +- AnalysisProcedure는 파일을 열지 않고 typed completed outcome을 반환한다. Factory에 빌려준 + Domain·solver·parallel·log adapter는 실행 동안 이동하지 않는다. Element capability adapter가 + 빌린 immutable kernel도 adapter보다 오래 살고 같은 주소를 유지해야 한다. +- Prepared 결과 dispatch의 writer 부재는 output failure다. 잘못된 family로 변환하거나 + 로그 close 이전에 최종 HDF5를 공개하지 않는다. diff --git a/include/fesa/analysis/analysis_procedure.h b/include/fesa/analysis/analysis_procedure.h new file mode 100644 index 0000000..f4571cc --- /dev/null +++ b/include/fesa/analysis/analysis_procedure.h @@ -0,0 +1,23 @@ +#ifndef FESA_ANALYSIS_ANALYSIS_PROCEDURE_H_ +#define FESA_ANALYSIS_ANALYSIS_PROCEDURE_H_ + +#include "fesa/analysis/prepared_analysis_outcome.h" +#include "fesa/core/status.h" + +namespace fesa { + +class Domain; + +/// @brief Executes one prepared Domain without opening result files. +/// @note The Domain and injected adapters outlive Execute. Accepted histories +/// remain procedure-specific and are returned only after validation. +class AnalysisProcedure { + public: + virtual ~AnalysisProcedure() = default; + /// @brief Returns the original typed completed payload or first failure. + virtual Result Execute(const Domain& domain) = 0; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_ANALYSIS_PROCEDURE_H_ diff --git a/include/fesa/analysis/analysis_state.h b/include/fesa/analysis/analysis_state.h index d6d4031..0222ae2 100644 --- a/include/fesa/analysis/analysis_state.h +++ b/include/fesa/analysis/analysis_state.h @@ -6,12 +6,13 @@ #include #include "fesa/core/status.h" -#include "fesa/fem/dof_manager.h" #include "fesa/math/vector.h" #include "fesa/results/result_records.h" namespace fesa { +class DofManager; + /// @brief Owns mutable quantities required by the V0 linear-static frame. class AnalysisState { public: diff --git a/include/fesa/analysis/dynamic_execution_result.h b/include/fesa/analysis/dynamic_execution_result.h new file mode 100644 index 0000000..650a588 --- /dev/null +++ b/include/fesa/analysis/dynamic_execution_result.h @@ -0,0 +1,19 @@ +#ifndef FESA_ANALYSIS_DYNAMIC_EXECUTION_RESULT_H_ +#define FESA_ANALYSIS_DYNAMIC_EXECUTION_RESULT_H_ + +#include + +#include "fesa/analysis/dynamic_analysis_state.h" +#include "fesa/core/diagnostic.h" + +namespace fesa { + +/// @brief Stores a complete HHT history before atomic result finalization. +struct DynamicExecutionResult { + DynamicAnalysisState state; + std::vector diagnostics; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_DYNAMIC_EXECUTION_RESULT_H_ diff --git a/include/fesa/analysis/eigen_analysis_state.h b/include/fesa/analysis/eigen_analysis_state.h index 9229144..d5aecd0 100644 --- a/include/fesa/analysis/eigen_analysis_state.h +++ b/include/fesa/analysis/eigen_analysis_state.h @@ -8,7 +8,7 @@ #include #include "fesa/math/matrix.h" -#include "fesa/solvers/eigen/mkl_feast_eigen_solver.h" +#include "fesa/solvers/eigen/eigen_solver.h" namespace fesa { diff --git a/include/fesa/analysis/hht_dynamic_procedure.h b/include/fesa/analysis/hht_dynamic_procedure.h index c10404f..082f474 100644 --- a/include/fesa/analysis/hht_dynamic_procedure.h +++ b/include/fesa/analysis/hht_dynamic_procedure.h @@ -1,10 +1,14 @@ #ifndef FESA_ANALYSIS_HHT_DYNAMIC_PROCEDURE_H_ #define FESA_ANALYSIS_HHT_DYNAMIC_PROCEDURE_H_ -#include "fesa/analysis/prepared_analysis.h" +#include "fesa/analysis/dynamic_execution_result.h" +#include "fesa/core/status.h" namespace fesa { + +class Domain; class LinearSolver; +class NewtonIterationLogWriter; class ParallelFor; class TangentSolver; diff --git a/include/fesa/analysis/linear_frequency_procedure.h b/include/fesa/analysis/linear_frequency_procedure.h index a6039b6..58cf1ad 100644 --- a/include/fesa/analysis/linear_frequency_procedure.h +++ b/include/fesa/analysis/linear_frequency_procedure.h @@ -6,13 +6,23 @@ namespace fesa { class Domain; +class EigenSolver; /// @brief Executes the supported linear MITC4 frequency procedure. class LinearFrequencyProcedureExecutor final { public: + /// @brief Preserves default FEAST construction for existing callers. + LinearFrequencyProcedureExecutor() = default; + + /// @brief Borrows a solver that must outlive this executor and its calls. + explicit LinearFrequencyProcedureExecutor(const EigenSolver& solver) : solver_(&solver) {} + /// @brief Builds, solves, and validates one frequency modal candidate. /// @return Requested physical modes plus all-c validation evidence. Result Execute(const Domain& domain) const; + + private: + const EigenSolver* solver_{nullptr}; }; } // namespace fesa diff --git a/include/fesa/analysis/linear_static_execution_result.h b/include/fesa/analysis/linear_static_execution_result.h new file mode 100644 index 0000000..c94adef --- /dev/null +++ b/include/fesa/analysis/linear_static_execution_result.h @@ -0,0 +1,19 @@ +#ifndef FESA_ANALYSIS_LINEAR_STATIC_EXECUTION_RESULT_H_ +#define FESA_ANALYSIS_LINEAR_STATIC_EXECUTION_RESULT_H_ + +#include + +#include "fesa/analysis/analysis_state.h" +#include "fesa/core/diagnostic.h" + +namespace fesa { + +/// @brief Stores a completed linear-static calculation before result writing. +struct LinearStaticExecutionResult { + AnalysisState state; + std::vector diagnostics; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_LINEAR_STATIC_EXECUTION_RESULT_H_ diff --git a/include/fesa/analysis/linear_static_procedure.h b/include/fesa/analysis/linear_static_procedure.h index fe02c04..3347d8b 100644 --- a/include/fesa/analysis/linear_static_procedure.h +++ b/include/fesa/analysis/linear_static_procedure.h @@ -1,10 +1,13 @@ #ifndef FESA_ANALYSIS_LINEAR_STATIC_PROCEDURE_H_ #define FESA_ANALYSIS_LINEAR_STATIC_PROCEDURE_H_ -#include "fesa/analysis/prepared_analysis.h" +#include "fesa/analysis/linear_static_execution_result.h" +#include "fesa/core/status.h" namespace fesa { +class Domain; + class LinearSolver; class ParallelFor; diff --git a/include/fesa/analysis/nonlinear_static_execution_result.h b/include/fesa/analysis/nonlinear_static_execution_result.h new file mode 100644 index 0000000..82ff946 --- /dev/null +++ b/include/fesa/analysis/nonlinear_static_execution_result.h @@ -0,0 +1,20 @@ +#ifndef FESA_ANALYSIS_NONLINEAR_STATIC_EXECUTION_RESULT_H_ +#define FESA_ANALYSIS_NONLINEAR_STATIC_EXECUTION_RESULT_H_ + +#include + +#include "fesa/analysis/nonlinear_analysis_state.h" +#include "fesa/core/diagnostic.h" + +namespace fesa { + +/// @brief Stores a completed nonlinear-static calculation before result +/// writing. +struct NonlinearStaticExecutionResult { + NonlinearAnalysisState state; + std::vector diagnostics; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_NONLINEAR_STATIC_EXECUTION_RESULT_H_ diff --git a/include/fesa/analysis/nonlinear_static_procedure.h b/include/fesa/analysis/nonlinear_static_procedure.h index ba12a38..2380679 100644 --- a/include/fesa/analysis/nonlinear_static_procedure.h +++ b/include/fesa/analysis/nonlinear_static_procedure.h @@ -1,10 +1,13 @@ #ifndef FESA_ANALYSIS_NONLINEAR_STATIC_PROCEDURE_H_ #define FESA_ANALYSIS_NONLINEAR_STATIC_PROCEDURE_H_ -#include "fesa/analysis/prepared_analysis.h" +#include "fesa/analysis/nonlinear_static_execution_result.h" +#include "fesa/core/status.h" namespace fesa { +class Domain; + class NewtonIterationLogWriter; class ParallelFor; class TangentSolver; diff --git a/include/fesa/analysis/prepared_analysis.h b/include/fesa/analysis/prepared_analysis.h index becbd3d..6398484 100644 --- a/include/fesa/analysis/prepared_analysis.h +++ b/include/fesa/analysis/prepared_analysis.h @@ -2,23 +2,21 @@ #define FESA_ANALYSIS_PREPARED_ANALYSIS_H_ #include -#include +#include #include -#include "fesa/analysis/analysis_state.h" -#include "fesa/analysis/dynamic_analysis_state.h" -#include "fesa/analysis/eigen_analysis_state.h" -#include "fesa/analysis/nonlinear_analysis_state.h" -#include "fesa/analysis/solid_frequency_state.h" -#include "fesa/analysis/solid_hht_dynamic_procedure.h" -#include "fesa/analysis/solid_static_procedure.h" -#include "fesa/analysis/transient_heat_procedure.h" +#include "fesa/analysis/analysis_procedure.h" +#include "fesa/analysis/prepared_analysis_outcome.h" #include "fesa/core/diagnostic.h" #include "fesa/core/status.h" #include "fesa/model/domain.h" namespace fesa { +class ParallelFor; +class LinearSolver; +class TangentSolver; +class EigenSolver; class LinearStaticProcedureExecutor; class LinearFrequencyProcedureExecutor; class EigenResultsWriter; @@ -31,6 +29,9 @@ class DynamicResultsWriter; class ThermalResultsWriter; class SolidResultsWriter; class SolidFrequencyProcedureExecutor; +class SolidStaticProcedureExecutor; +class SolidHhtDynamicProcedureExecutor; +class TransientHeatProcedureExecutor; struct DerivedOutputPaths; /// @brief Owns one parsed and semantically mapped analysis input. @@ -46,30 +47,16 @@ struct PreparedAnalysisInput { Result PrepareAnalysisInput( const std::filesystem::path& input_path); -/// @brief Stores a completed linear-static calculation before result writing. -struct LinearStaticExecutionResult { - AnalysisState state; - std::vector diagnostics; -}; +/// @brief Creates exactly one selected family with caller-owned adapters. +/// @note Domain and adapters remain alive and unmoved throughout execution. +Result> CreateAnalysisProcedure( + const Domain &domain, const ParallelFor ¶llel_for, + LinearSolver &linear_solver, TangentSolver &tangent_solver, + const EigenSolver &eigen_solver, NewtonIterationLogWriter &log); -/// @brief Stores a completed nonlinear-static calculation before result -/// writing. -struct NonlinearStaticExecutionResult { - NonlinearAnalysisState state; - std::vector diagnostics; -}; - -/// @brief Stores a complete HHT history before atomic result finalization. -struct DynamicExecutionResult { - DynamicAnalysisState state; - std::vector diagnostics; -}; - -using PreparedAnalysisOutcome = - std::variant; +/// @brief Executes a caller-selected procedure through the common interface. +Result +ExecutePreparedAnalysis(const Domain &domain, AnalysisProcedure &procedure); /// @brief Selects the approved procedure from a prepared Domain. /// @pre The executors and log outlive this call. diff --git a/include/fesa/analysis/prepared_analysis_outcome.h b/include/fesa/analysis/prepared_analysis_outcome.h new file mode 100644 index 0000000..1a9934b --- /dev/null +++ b/include/fesa/analysis/prepared_analysis_outcome.h @@ -0,0 +1,26 @@ +#ifndef FESA_ANALYSIS_PREPARED_ANALYSIS_OUTCOME_H_ +#define FESA_ANALYSIS_PREPARED_ANALYSIS_OUTCOME_H_ + +#include + +#include "fesa/analysis/dynamic_execution_result.h" +#include "fesa/analysis/eigen_analysis_state.h" +#include "fesa/analysis/linear_static_execution_result.h" +#include "fesa/analysis/nonlinear_static_execution_result.h" +#include "fesa/analysis/solid_dynamic_execution_result.h" +#include "fesa/analysis/solid_frequency_state.h" +#include "fesa/analysis/solid_static_execution_result.h" +#include "fesa/analysis/thermal_execution_result.h" + +namespace fesa { + +/// @brief Owns a completed procedure result before result-file finalization. +using PreparedAnalysisOutcome = + std::variant; + +} // namespace fesa + +#endif // FESA_ANALYSIS_PREPARED_ANALYSIS_OUTCOME_H_ diff --git a/include/fesa/analysis/solid_dynamic_execution_result.h b/include/fesa/analysis/solid_dynamic_execution_result.h new file mode 100644 index 0000000..3d78e86 --- /dev/null +++ b/include/fesa/analysis/solid_dynamic_execution_result.h @@ -0,0 +1,17 @@ +#ifndef FESA_ANALYSIS_SOLID_DYNAMIC_EXECUTION_RESULT_H_ +#define FESA_ANALYSIS_SOLID_DYNAMIC_EXECUTION_RESULT_H_ + +#include "fesa/analysis/solid_dynamic_analysis_state.h" +#include "fesa/fem/dof_manager.h" + +namespace fesa { + +/// @brief Owns the validated 3N dynamic result independently of serialization. +struct SolidDynamicExecutionResult { + DofManager dofs; + SolidDynamicAnalysisState state; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_SOLID_DYNAMIC_EXECUTION_RESULT_H_ diff --git a/include/fesa/analysis/solid_frequency_procedure.h b/include/fesa/analysis/solid_frequency_procedure.h index d779ace..b284c2c 100644 --- a/include/fesa/analysis/solid_frequency_procedure.h +++ b/include/fesa/analysis/solid_frequency_procedure.h @@ -5,14 +5,24 @@ namespace fesa { class Domain; +class EigenSolver; /// @brief Executes unloaded reference-state C3D8 generalized frequency /// analysis. class SolidFrequencyProcedureExecutor final { public: + /// @brief Preserves default FEAST construction for existing callers. + SolidFrequencyProcedureExecutor() = default; + + /// @brief Borrows a solver that must outlive this executor and its calls. + explicit SolidFrequencyProcedureExecutor(const EigenSolver& solver) : solver_(&solver) {} + /// @brief Returns lowest requested modes after validating every returned /// pair. /// @note Domain is immutable and must remain alive during execution. Result Execute(const Domain& domain) const; + + private: + const EigenSolver* solver_{nullptr}; }; } // namespace fesa #endif // FESA_ANALYSIS_SOLID_FREQUENCY_PROCEDURE_H_ diff --git a/include/fesa/analysis/solid_frequency_state.h b/include/fesa/analysis/solid_frequency_state.h index 51eb5a7..d4f1655 100644 --- a/include/fesa/analysis/solid_frequency_state.h +++ b/include/fesa/analysis/solid_frequency_state.h @@ -8,7 +8,7 @@ #include #include "fesa/math/matrix.h" -#include "fesa/solvers/eigen/mkl_feast_eigen_solver.h" +#include "fesa/solvers/eigen/eigen_solver.h" namespace fesa { /// @brief Identifies a source-ordered physical Solid eigenmode. diff --git a/include/fesa/analysis/solid_hht_dynamic_procedure.h b/include/fesa/analysis/solid_hht_dynamic_procedure.h index b4a5e56..564839a 100644 --- a/include/fesa/analysis/solid_hht_dynamic_procedure.h +++ b/include/fesa/analysis/solid_hht_dynamic_procedure.h @@ -1,19 +1,13 @@ #ifndef FESA_ANALYSIS_SOLID_HHT_DYNAMIC_PROCEDURE_H_ #define FESA_ANALYSIS_SOLID_HHT_DYNAMIC_PROCEDURE_H_ -#include "fesa/analysis/solid_dynamic_analysis_state.h" +#include "fesa/analysis/solid_dynamic_execution_result.h" namespace fesa { class LinearSolver; class ParallelFor; class TangentSolver; -/// @brief Owns the validated 3N dynamic result independently of serialization. -struct SolidDynamicExecutionResult { - DofManager dofs; - SolidDynamicAnalysisState state; -}; - /// @brief Integrates linear or TL Solid mechanics with constant consistent /// mass. class SolidHhtDynamicProcedureExecutor { diff --git a/include/fesa/analysis/solid_static_execution_result.h b/include/fesa/analysis/solid_static_execution_result.h new file mode 100644 index 0000000..a86c3f7 --- /dev/null +++ b/include/fesa/analysis/solid_static_execution_result.h @@ -0,0 +1,19 @@ +#ifndef FESA_ANALYSIS_SOLID_STATIC_EXECUTION_RESULT_H_ +#define FESA_ANALYSIS_SOLID_STATIC_EXECUTION_RESULT_H_ + +#include + +#include "fesa/analysis/solid_static_state.h" +#include "fesa/core/diagnostic.h" + +namespace fesa { + +/// @brief Owns successful static frames and sorted model diagnostics. +struct SolidStaticExecutionResult { + SolidStaticState state; + std::vector diagnostics; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_SOLID_STATIC_EXECUTION_RESULT_H_ diff --git a/include/fesa/analysis/solid_static_procedure.h b/include/fesa/analysis/solid_static_procedure.h index d36b418..9e67ed3 100644 --- a/include/fesa/analysis/solid_static_procedure.h +++ b/include/fesa/analysis/solid_static_procedure.h @@ -1,19 +1,13 @@ #ifndef FESA_ANALYSIS_SOLID_STATIC_PROCEDURE_H_ #define FESA_ANALYSIS_SOLID_STATIC_PROCEDURE_H_ -#include "fesa/analysis/solid_static_state.h" +#include "fesa/analysis/solid_static_execution_result.h" namespace fesa { class LinearSolver; class ParallelFor; class TangentSolver; -/// @brief Owns successful static frames and sorted model diagnostics. -struct SolidStaticExecutionResult { - SolidStaticState state; - std::vector diagnostics; -}; - /// @brief Executes linear K0 or fixed-factor TL StVK static analysis. class SolidStaticProcedureExecutor { public: diff --git a/include/fesa/analysis/solid_static_state.h b/include/fesa/analysis/solid_static_state.h index d45eae2..d487045 100644 --- a/include/fesa/analysis/solid_static_state.h +++ b/include/fesa/analysis/solid_static_state.h @@ -99,7 +99,7 @@ class SolidStaticState { const noexcept; private: - friend class SolidStaticProcedureExecutor; + friend class SolidStaticCore; bool initialized_{false}; bool nonlinear_{false}; std::vector reference_points_; diff --git a/include/fesa/analysis/thermal_analysis_state.h b/include/fesa/analysis/thermal_analysis_state.h index 1114de7..08f2948 100644 --- a/include/fesa/analysis/thermal_analysis_state.h +++ b/include/fesa/analysis/thermal_analysis_state.h @@ -6,11 +6,15 @@ #include #include "fesa/analysis/thermal_time_grid.h" -#include "fesa/assembly/thermal_assembler.h" +#include "fesa/core/status.h" #include "fesa/results/thermal_result_records.h" namespace fesa { +class AnalysisModel; +class DofManager; +class ThermalAssembly; + /// @brief Owns the immutable thermal result inventory and accepted history. /// @note No Domain/model/assembly references survive Create; state may outlive /// them. Numerical equilibrium and energy checks belong to the procedure before diff --git a/include/fesa/analysis/thermal_execution_result.h b/include/fesa/analysis/thermal_execution_result.h new file mode 100644 index 0000000..190fa8d --- /dev/null +++ b/include/fesa/analysis/thermal_execution_result.h @@ -0,0 +1,19 @@ +#ifndef FESA_ANALYSIS_THERMAL_EXECUTION_RESULT_H_ +#define FESA_ANALYSIS_THERMAL_EXECUTION_RESULT_H_ + +#include + +#include "fesa/analysis/thermal_analysis_state.h" +#include "fesa/core/diagnostic.h" + +namespace fesa { + +/// @brief Owns complete thermal history before any result output is opened. +struct ThermalExecutionResult { + ThermalAnalysisState state; + std::vector diagnostics; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_THERMAL_EXECUTION_RESULT_H_ diff --git a/include/fesa/analysis/transient_heat_procedure.h b/include/fesa/analysis/transient_heat_procedure.h index 59f7a1d..4c697d0 100644 --- a/include/fesa/analysis/transient_heat_procedure.h +++ b/include/fesa/analysis/transient_heat_procedure.h @@ -1,21 +1,14 @@ #ifndef FESA_ANALYSIS_TRANSIENT_HEAT_PROCEDURE_H_ #define FESA_ANALYSIS_TRANSIENT_HEAT_PROCEDURE_H_ -#include - -#include "fesa/analysis/thermal_analysis_state.h" +#include "fesa/analysis/thermal_execution_result.h" #include "fesa/core/status.h" namespace fesa { +class Domain; class LinearSolver; class ParallelFor; -/// @brief Owns complete thermal history before any result output is opened. -struct ThermalExecutionResult { - ThermalAnalysisState state; - std::vector diagnostics; -}; - /// @brief Executes fixed-increment backward Euler with checked thermal /// recovery. class TransientHeatProcedureExecutor final { diff --git a/include/fesa/assembly/load_assembler.h b/include/fesa/assembly/load_assembler.h index de4802f..53f4c48 100644 --- a/include/fesa/assembly/load_assembler.h +++ b/include/fesa/assembly/load_assembler.h @@ -30,7 +30,8 @@ class LoadAssembler { double step_time = 0.0); /// @brief Forms Ff-Kfc*dc in stable free/constrained order. - /// @note This operation neither factorizes nor invokes a solver. + /// @note Compatibility facade delegates to EssentialConstraintPolicy; this + /// operation neither factorizes nor invokes a solver. static Result EffectiveFreeRhs(const Vector& full_load, const SparseMatrix& kfc, const Vector& prescribed_values, diff --git a/include/fesa/assembly/thermal_assembler.h b/include/fesa/assembly/thermal_assembler.h index 2075987..443f5e6 100644 --- a/include/fesa/assembly/thermal_assembler.h +++ b/include/fesa/assembly/thermal_assembler.h @@ -2,10 +2,12 @@ #define FESA_ASSEMBLY_THERMAL_ASSEMBLER_H_ #include +#include #include #include "fesa/analysis/analysis_model.h" #include "fesa/assembly/parallel_for.h" +#include "fesa/elements/element_capabilities.h" #include "fesa/elements/thermal_shell.h" #include "fesa/fem/dof_manager.h" #include "fesa/math/sparse_matrix.h" @@ -50,6 +52,8 @@ class ThermalAssembly final { const std::vector& ElementOrder() const noexcept; /// @brief Returns checked kernels in stable active element order. const std::vector& Kernels() const noexcept; + /// @brief Returns typed views bound after the final kernel buffer is placed. + const std::vector>& Elements() const noexcept; /// @brief Returns node-major twenty-entry full DOF scatters in kernel order. const std::vector>& Scatters() const noexcept; /// @brief Checks source Domain identity and the complete supplied equation @@ -79,7 +83,10 @@ class ThermalAssembly final { SparseMatrix capacity_error_; Vector input_error_; std::vector element_order_; + // Never resized after construction. Moving the owning vector transfers its + // buffer, so bound references survive ThermalAssembly moves. std::vector kernels_; + std::vector> elements_; std::vector> scatters_; }; diff --git a/include/fesa/constraints/essential_constraint_policy.h b/include/fesa/constraints/essential_constraint_policy.h index a947f50..1659c8d 100644 --- a/include/fesa/constraints/essential_constraint_policy.h +++ b/include/fesa/constraints/essential_constraint_policy.h @@ -24,6 +24,16 @@ class EssentialConstraintPolicy { Result Partition(const SparseMatrix& full_stiffness, const DofManager& dof_manager) const; + /// @brief Forms Ff-Kfc*dc in stable free/constrained order. + /// @return A finite RHS candidate or the established load diagnostic. + /// @note Preserves independent CSR products and ordered row reductions; + /// no factorization or solver operation is performed. Inputs are borrowed + /// only for this call and remain unchanged on failure. + Result EffectiveFreeRhs(const Vector& full_load, + const SparseMatrix& kfc, + const Vector& prescribed_values, + const DofManager& dofs) const; + /// @brief Gathers a full vector in stable free-equation order. Vector GatherFree(const Vector& full_values, const DofManager& dof_manager) const; diff --git a/include/fesa/constraints/prescribed_displacement.h b/include/fesa/constraints/prescribed_displacement.h index e8995ce..58a4006 100644 --- a/include/fesa/constraints/prescribed_displacement.h +++ b/include/fesa/constraints/prescribed_displacement.h @@ -5,7 +5,7 @@ #include "fesa/constraints/boundary_condition.h" #include "fesa/core/diagnostic.h" -#include "fesa/elements/element.h" +#include "fesa/elements/element_dof_layout.h" #include "fesa/model/source_target_resolver.h" namespace fesa { diff --git a/include/fesa/core/ascii.h b/include/fesa/core/ascii.h index 3fcb7ea..2072c05 100644 --- a/include/fesa/core/ascii.h +++ b/include/fesa/core/ascii.h @@ -2,6 +2,7 @@ #define FESA_CORE_ASCII_H_ #include +#include #include #include "fesa/core/status.h" @@ -12,6 +13,11 @@ namespace fesa { /// @return The lowercase ASCII byte, or the input byte when it is not A-Z. char AsciiLower(char value) noexcept; +/// @brief Returns an uppercase ASCII copy without changing other source bytes. +/// @note Embedded nulls and non-ASCII bytes are preserved without locale +/// folding. +std::string AsciiUppercase(std::string value); + /// @brief Compares two byte strings with ASCII-only case folding. /// @return True when the strings have equal length and equal ASCII-folded /// bytes. diff --git a/include/fesa/core/source_identity.h b/include/fesa/core/source_identity.h index 3890d79..876e8a8 100644 --- a/include/fesa/core/source_identity.h +++ b/include/fesa/core/source_identity.h @@ -24,6 +24,14 @@ struct SourceEntityId { std::string source_label_text; }; +/// @brief Compares all preserved source fields without canonicalizing spelling. +inline bool SourceIdentityEquals(const SourceEntityId& left, + const SourceEntityId& right) noexcept { + return left.instance_name == right.instance_name && + left.source_label == right.source_label && + left.source_label_text == right.source_label_text; +} + } // namespace fesa #endif // FESA_CORE_SOURCE_IDENTITY_H_ diff --git a/include/fesa/core/status.h b/include/fesa/core/status.h index 8476cc5..b74e7d3 100644 --- a/include/fesa/core/status.h +++ b/include/fesa/core/status.h @@ -98,11 +98,11 @@ class Result { struct FailureTag {}; /// @brief Constructs the successful value alternative. - Result(SuccessTag, T value) + Result(SuccessTag, T&& value) : value_{std::move(value)}, status_{Status::Ok()} {} /// @brief Constructs the failed status alternative. - Result(FailureTag, Status status) + Result(FailureTag, Status&& status) : value_{std::nullopt}, status_{std::move(status)} {} std::optional value_; diff --git a/include/fesa/elements/element.h b/include/fesa/elements/element.h index c0a02d7..5430172 100644 --- a/include/fesa/elements/element.h +++ b/include/fesa/elements/element.h @@ -1,13 +1,11 @@ #ifndef FESA_ELEMENTS_ELEMENT_H_ #define FESA_ELEMENTS_ELEMENT_H_ -#include -#include #include #include -#include "fesa/core/source_identity.h" #include "fesa/core/status.h" +#include "fesa/elements/element_dof_layout.h" #include "fesa/math/matrix.h" #include "fesa/math/vector.h" #include "fesa/results/result_records.h" @@ -15,23 +13,6 @@ namespace fesa { -/// @brief Identifies one component in the stable six-DOF node layout. -enum class DofComponent : std::uint8_t { - kUx, - kUy, - kUz, - kUrx, - kUry, - kUrz, -}; - -/// @brief Describes one runtime element's stable node and component order. -struct ElementDofLayout { - SourceEntityId source_id; - std::vector node_indices; - std::vector components_per_node; -}; - /// @brief Carries one element-local stiffness in its declared DOF order. struct ElementStiffnessContribution { ElementDofLayout layout; @@ -78,10 +59,6 @@ class Element { const Vector& element_displacement) const = 0; }; -/// @brief Provides non-owning runtime elements in stable owner order. -/// @note Every referenced element must outlive this view. -using ElementView = std::vector>; - } // namespace fesa #endif // FESA_ELEMENTS_ELEMENT_H_ diff --git a/include/fesa/elements/element_capabilities.h b/include/fesa/elements/element_capabilities.h new file mode 100644 index 0000000..d6c610d --- /dev/null +++ b/include/fesa/elements/element_capabilities.h @@ -0,0 +1,200 @@ +#ifndef FESA_ELEMENTS_ELEMENT_CAPABILITIES_H_ +#define FESA_ELEMENTS_ELEMENT_CAPABILITIES_H_ + +#include +#include + +#include "fesa/elements/element.h" +#include "fesa/elements/thermal_element_layout.h" +#include "fesa/math/vector3.h" + +namespace fesa { + +class Hex8Element; +class Mitc4Shell; +class NonlinearMitc4Shell; +class NonlinearMitc4Inertia; +class ThermalShell; +struct Hex8Response; +struct Hex8HighLowResponse; +struct Mitc4Stiffness; +struct Mitc4Mass; +struct NonlinearMitc4TrialDofs; +struct NonlinearMitc4InternalEquilibrium; +struct NonlinearMitc4ExternalDrillingConstraint; +struct NonlinearMitc4InertiaEvaluation; +struct ThermalShellRecovery; + +/// @brief Evaluates immutable shell trials; accepted history belongs to the procedure. +class ShellTrialElement { + public: + virtual ~ShellTrialElement() = default; + /// @brief Returns stable source-local node/component order, never equations. + virtual const ElementDofLayout& DofLayout() const noexcept = 0; + /// @brief Returns the complete force/tangent/recovery at a fixed-global trial. + /// @param coordinate_direction Optional 24-vector for D2(f_int)[v,v]. + /// @note Failure preserves the kernel, caller inputs and earlier responses. + virtual Result EvaluateTrial( + const NonlinearMitc4TrialDofs& trial, + const Vector* coordinate_direction = nullptr) const = 0; + /// @copydoc NonlinearMitc4Shell::EvaluateExternalDrillingConstraint + virtual Result + EvaluateExternalDrillingConstraint( + std::size_t node, const Vector3& phi, const Vector3& phi_dot, + const Vector3& force, const Vector3& force_rate, + const Vector3& force_acceleration) const = 0; +}; + +/// @brief Borrows the same immutable shell kernel for every trial operation. +/// @note The kernel must outlive this adapter and remain at its bound address. +class Mitc4TrialAdapter final : public ShellTrialElement { + public: + Mitc4TrialAdapter(ElementDofLayout layout, const NonlinearMitc4Shell& kernel); + const ElementDofLayout& DofLayout() const noexcept override; + Result EvaluateTrial( + const NonlinearMitc4TrialDofs& trial, + const Vector* coordinate_direction = nullptr) const override; + Result + EvaluateExternalDrillingConstraint( + std::size_t node, const Vector3& phi, const Vector3& phi_dot, + const Vector3& force, const Vector3& force_rate, + const Vector3& force_acceleration) const override; + + private: + ElementDofLayout layout_; + const NonlinearMitc4Shell& kernel_; +}; + +/// @brief Keeps complete paired solid responses and reference mass typed. +class SolidTrialElement : public Element { + public: + ~SolidTrialElement() override = default; + /// @copydoc Hex8Element::EvaluateLinear + virtual Result EvaluateLinear(const Vector& u) const = 0; + /// @copydoc Hex8Element::EvaluateNonlinear + virtual Result EvaluateNonlinear(const Vector& u) const = 0; + /// @copydoc Hex8Element::EvaluateLinearHighLow + virtual Result EvaluateLinearHighLow( + const Vector& high, const Vector& low) const = 0; + /// @copydoc Hex8Element::EvaluateNonlinearHighLow + virtual Result EvaluateNonlinearHighLow( + const Vector& high, const Vector& low) const = 0; + /// @copydoc Hex8Element::ComputeMass + virtual Result ComputeMass() const = 0; + /// @brief Returns fixed Gauss weights used by the frequency mass bound. + virtual std::array ReferenceWeights() const noexcept = 0; +}; + +/// @brief Borrows one stable Hex8 kernel shared by all local operations. +/// @note The kernel must outlive this adapter and remain at its bound address. +class Hex8TrialAdapter final : public SolidTrialElement { + public: + explicit Hex8TrialAdapter(const Hex8Element& kernel); + const ElementDofLayout& DofLayout() const noexcept override; + Result ComputeStiffness() const override; + Result Recover(const Vector& u) const override; + Result EvaluateLinear(const Vector& u) const override; + Result EvaluateNonlinear(const Vector& u) const override; + Result EvaluateLinearHighLow( + const Vector& high, const Vector& low) const override; + Result EvaluateNonlinearHighLow( + const Vector& high, const Vector& low) const override; + Result ComputeMass() const override; + std::array ReferenceWeights() const noexcept override; + + private: + const Hex8Element& kernel_; +}; + +/// @brief Returns the complete physical inertia response in fixed chart DOFs. +class ShellInertiaElement { + public: + virtual ~ShellInertiaElement() = default; + virtual const ElementDofLayout& DofLayout() const noexcept = 0; + /// @copydoc NonlinearMitc4Inertia::Evaluate + virtual Result Evaluate( + const NonlinearMitc4TrialDofs& trial, const Vector& velocity24, + const Vector& physical_acceleration24) const = 0; +}; + +/// @brief Borrows immutable inertia geometry, never shared mutable scratch. +/// @note The kernel must outlive this adapter and remain at its bound address. +class Mitc4InertiaAdapter final : public ShellInertiaElement { + public: + Mitc4InertiaAdapter(ElementDofLayout layout, + const NonlinearMitc4Inertia& kernel); + const ElementDofLayout& DofLayout() const noexcept override; + Result Evaluate( + const NonlinearMitc4TrialDofs& trial, const Vector& velocity24, + const Vector& physical_acceleration24) const override; + + private: + ElementDofLayout layout_; + const NonlinearMitc4Inertia& kernel_; +}; + +/// @brief Keeps DS4 DOFs 11-15 and all four-by-six flux traces independent. +class ThermalElement { + public: + virtual ~ThermalElement() = default; + /// @brief Returns node-major stations 11-15 and original source identity. + virtual const ThermalElementDofLayout& DofLayout() const noexcept = 0; + /// @copydoc ThermalShell::Conductivity + virtual const Matrix& Conductivity() const noexcept = 0; + /// @copydoc ThermalShell::Capacity + virtual const Matrix& Capacity() const noexcept = 0; + /// @copydoc ThermalShell::ConductivityError + virtual const Matrix& ConductivityError() const noexcept = 0; + /// @copydoc ThermalShell::CapacityError + virtual const Matrix& CapacityError() const noexcept = 0; + /// @copydoc ThermalShell::Recover + virtual Result Recover( + const std::array& temperature) const = 0; +}; + +/// @brief Borrows the same DS4 kernel for matrices, intervals and recovery. +/// @note The kernel must outlive this adapter and remain at its bound address. +class Ds4ThermalAdapter final : public ThermalElement { + public: + explicit Ds4ThermalAdapter(const ThermalShell& kernel); + const ThermalElementDofLayout& DofLayout() const noexcept override; + const Matrix& Conductivity() const noexcept override; + const Matrix& Capacity() const noexcept override; + const Matrix& ConductivityError() const noexcept override; + const Matrix& CapacityError() const noexcept override; + Result Recover( + const std::array& temperature) const override; + + private: + ThermalElementDofLayout layout_; + const ThermalShell& kernel_; +}; + +/// @brief Supplies shell frequency operators with their distinct mass contract. +class ShellReferenceElement : public Element { + public: + ~ShellReferenceElement() override = default; + /// @copydoc Mitc4Shell::Stiffness + virtual Result Stiffness() const = 0; + /// @copydoc Mitc4Shell::Mass + virtual Result Mass(double density) const = 0; +}; + +/// @brief Borrows the same linear MITC4 kernel for stiffness and recovery. +/// @note The kernel must outlive this adapter and remain at its bound address. +class Mitc4ReferenceAdapter final : public ShellReferenceElement { + public: + explicit Mitc4ReferenceAdapter(const Mitc4Shell& kernel); + const ElementDofLayout& DofLayout() const noexcept override; + Result ComputeStiffness() const override; + Result Recover(const Vector& u) const override; + Result Stiffness() const override; + Result Mass(double density) const override; + + private: + const Mitc4Shell& kernel_; +}; + +} // namespace fesa + +#endif // FESA_ELEMENTS_ELEMENT_CAPABILITIES_H_ diff --git a/include/fesa/elements/element_dof_layout.h b/include/fesa/elements/element_dof_layout.h new file mode 100644 index 0000000..15f8d9d --- /dev/null +++ b/include/fesa/elements/element_dof_layout.h @@ -0,0 +1,38 @@ +#ifndef FESA_ELEMENTS_ELEMENT_DOF_LAYOUT_H_ +#define FESA_ELEMENTS_ELEMENT_DOF_LAYOUT_H_ + +#include +#include +#include + +#include "fesa/core/source_identity.h" + +namespace fesa { + +/// @brief Identifies one component in the stable six-DOF node layout. +enum class DofComponent : std::uint8_t { + kUx, + kUy, + kUz, + kUrx, + kUry, + kUrz, +}; + +/// @brief Describes one runtime element's stable node and component order. +struct ElementDofLayout { + SourceEntityId source_id; + std::vector node_indices; + std::vector components_per_node; +}; + +class Element; + +/// @brief Provides non-owning runtime elements in stable owner order. +/// @note Every referenced element must outlive this view. +using ElementView = std::vector>; + + +} // namespace fesa + +#endif // FESA_ELEMENTS_ELEMENT_DOF_LAYOUT_H_ diff --git a/include/fesa/elements/element_factory.h b/include/fesa/elements/element_factory.h index c33a308..45867f3 100644 --- a/include/fesa/elements/element_factory.h +++ b/include/fesa/elements/element_factory.h @@ -5,6 +5,7 @@ #include "fesa/core/status.h" #include "fesa/elements/element.h" +#include "fesa/elements/element_capabilities.h" namespace fesa { @@ -21,6 +22,14 @@ class ElementFactory { Result> Create(const ElementDefinition& definition, const Domain& domain) const; + /// @brief Binds a typed view of an existing stable runtime kernel. + /// @note Returns null for a different family. The kernel must outlive the + /// returned adapter and remain at its address; no second kernel is created. + std::unique_ptr BindSolidTrial(const Element& kernel) const; + /// @copydoc BindSolidTrial + std::unique_ptr BindShellReference( + const Element& kernel) const; + private: /// @brief Creates one checked B33 runtime candidate. Result> CreateBeam( diff --git a/include/fesa/elements/euler_beam_3d.h b/include/fesa/elements/euler_beam_3d.h index cf917f6..3d61ad1 100644 --- a/include/fesa/elements/euler_beam_3d.h +++ b/include/fesa/elements/euler_beam_3d.h @@ -4,12 +4,11 @@ #include #include #include -#include #include #include "fesa/core/status.h" #include "fesa/elements/element.h" -#include "fesa/elements/element_definition.h" +#include "fesa/elements/euler_beam_3d_definition.h" #include "fesa/materials/isotropic_linear_elastic_material.h" #include "fesa/math/matrix.h" #include "fesa/math/vector.h" @@ -17,40 +16,8 @@ namespace fesa { -class Domain; struct Node; -/// @brief Defines one two-node B33 semantic element. -class EulerBeam3DDefinition final : public ElementDefinition { - public: - /// @brief Constructs a parser-validated semantic definition. - EulerBeam3DDefinition(SourceEntityId source_id, - std::array node_indices, - EntityIndex material_index, EntityIndex section_index, - SourceLocation location); - - ElementDefinitionKind Kind() const noexcept override; - const SourceEntityId& SourceId() const noexcept override; - std::string_view SourceElementType() const noexcept override; - const std::vector& NodeIndices() const noexcept override; - EntityIndex MaterialIndex() const noexcept override; - EntityIndex PropertyIndex() const noexcept override; - - SourceEntityId source_id; - std::array node_indices; - EntityIndex material_index; - EntityIndex section_index; - SourceLocation location; - - private: - friend class Domain; - - /// @brief Synchronizes the base view after parser-candidate construction. - void SynchronizeNodeIndices(); - - std::vector node_indices_view_; -}; - /// @brief Stores constant line-load components in the beam local frame. struct ConstantLocalLineLoad { double px; diff --git a/include/fesa/elements/euler_beam_3d_definition.h b/include/fesa/elements/euler_beam_3d_definition.h new file mode 100644 index 0000000..b2391ec --- /dev/null +++ b/include/fesa/elements/euler_beam_3d_definition.h @@ -0,0 +1,48 @@ +#ifndef FESA_ELEMENTS_EULER_BEAM_3D_DEFINITION_H_ +#define FESA_ELEMENTS_EULER_BEAM_3D_DEFINITION_H_ + +#include +#include +#include + +#include "fesa/elements/element_definition.h" + +namespace fesa { + +class Domain; + +/// @brief Defines one two-node B33 semantic element. +class EulerBeam3DDefinition final : public ElementDefinition { + public: + /// @brief Constructs a parser-validated semantic definition. + EulerBeam3DDefinition(SourceEntityId source_id, + std::array node_indices, + EntityIndex material_index, EntityIndex section_index, + SourceLocation location); + + ElementDefinitionKind Kind() const noexcept override; + const SourceEntityId& SourceId() const noexcept override; + std::string_view SourceElementType() const noexcept override; + const std::vector& NodeIndices() const noexcept override; + EntityIndex MaterialIndex() const noexcept override; + EntityIndex PropertyIndex() const noexcept override; + + SourceEntityId source_id; + std::array node_indices; + EntityIndex material_index; + EntityIndex section_index; + SourceLocation location; + + private: + friend class Domain; + + /// @brief Synchronizes the base view after parser-candidate construction. + void SynchronizeNodeIndices(); + + std::vector node_indices_view_; +}; + + +} // namespace fesa + +#endif // FESA_ELEMENTS_EULER_BEAM_3D_DEFINITION_H_ diff --git a/include/fesa/elements/finite_rotation.h b/include/fesa/elements/finite_rotation.h index 29513b5..19032c7 100644 --- a/include/fesa/elements/finite_rotation.h +++ b/include/fesa/elements/finite_rotation.h @@ -33,11 +33,13 @@ Matrix ExpSkew(const Vector3& phi); /// @pre phi is finite and lies inside the approved principal chart. Matrix LeftJacobianSO3(const Vector3& phi); -/// @brief Computes the inverse transpose of the SO(3) left Jacobian. -/// @param phi Fixed-global rotation coordinate in radians. -/// @return The 3-by-3 inverse-transpose left Jacobian. +/// @brief Solves J(phi)^T * moment = generalized for a spatial moment. +/// @param phi Fixed-global principal-chart rotation coordinate in radians. +/// @param generalized Work-conjugate moment in fixed-global chart coordinates. +/// @return A finite spatial moment in the same force-length units, or failure. /// @pre phi is finite and lies inside the approved principal chart. -Matrix InverseTransposeLeftJacobianSO3(const Vector3& phi); +/// @note Inputs remain unchanged; no inverse Jacobian is constructed. +Result SpatialMomentSO3(const Vector3& phi, const Vector3& generalized); /// @brief Builds a checked finite-rotation state from its reference frame. /// @param phi Fixed-global principal-chart rotation coordinate in radians. diff --git a/include/fesa/elements/mitc4_shell.h b/include/fesa/elements/mitc4_shell.h index ec16e5e..36e954d 100644 --- a/include/fesa/elements/mitc4_shell.h +++ b/include/fesa/elements/mitc4_shell.h @@ -3,12 +3,11 @@ #include #include -#include #include #include "fesa/core/status.h" #include "fesa/elements/element.h" -#include "fesa/elements/element_definition.h" +#include "fesa/elements/mitc4_shell_definition.h" #include "fesa/materials/isotropic_linear_elastic_material.h" #include "fesa/math/matrix.h" #include "fesa/math/vector.h" @@ -17,52 +16,8 @@ namespace fesa { -class Domain; struct Node; -/// @brief Preserves the source shell type independently of formulation. -enum class ShellSourceElementType { kS4, kS4r }; - -/// @brief Names the internal shell formulation selected by S4 and S4R. -inline constexpr std::string_view kMitc4InternalFormulation{"FESA-MITC4"}; - -/// @brief Defines one four-node S4/S4R semantic element. -class Mitc4ShellDefinition final : public ElementDefinition { - public: - /// @brief Constructs a parser-validated semantic definition. - Mitc4ShellDefinition(SourceEntityId source_id, - ShellSourceElementType source_type, - std::array node_indices, - EntityIndex material_index, EntityIndex section_index, - SourceLocation location); - - ElementDefinitionKind Kind() const noexcept override; - const SourceEntityId& SourceId() const noexcept override; - std::string_view SourceElementType() const noexcept override; - const std::vector& NodeIndices() const noexcept override; - EntityIndex MaterialIndex() const noexcept override; - EntityIndex PropertyIndex() const noexcept override; - - SourceEntityId source_id; - ShellSourceElementType source_type; - std::array node_indices; - EntityIndex material_index; - EntityIndex section_index; - SourceLocation location; - - private: - friend class Domain; - - /// @brief Rebinds a shell-local section index to the unified property view. - void SetPropertyIndex(EntityIndex property_index) noexcept; - - /// @brief Synchronizes the base view after parser-candidate construction. - void SynchronizeNodeIndices(); - - EntityIndex property_index_; - std::vector node_indices_view_; -}; - /// @brief Stores bilinear shape values and natural-coordinate derivatives. struct Mitc4ShapeFunctions { std::array values; @@ -213,11 +168,10 @@ class Mitc4Shell final : public Element { void BindRuntime(ElementDofLayout layout, EntityIndex element_index, SourceLocation location); - /// @brief Stores covariant, reciprocal, frame, and Jacobian data at one + /// @brief Stores covariant, frame, and Jacobian data at one /// point. struct GeometryData { std::array covariant; - std::array reciprocal; Mitc4LocalFrame frame; double jacobian; }; diff --git a/include/fesa/elements/mitc4_shell_definition.h b/include/fesa/elements/mitc4_shell_definition.h new file mode 100644 index 0000000..f7a352f --- /dev/null +++ b/include/fesa/elements/mitc4_shell_definition.h @@ -0,0 +1,60 @@ +#ifndef FESA_ELEMENTS_MITC4_SHELL_DEFINITION_H_ +#define FESA_ELEMENTS_MITC4_SHELL_DEFINITION_H_ + +#include +#include +#include + +#include "fesa/elements/element_definition.h" + +namespace fesa { + +class Domain; + +/// @brief Preserves the source shell type independently of formulation. +enum class ShellSourceElementType { kS4, kS4r }; + +/// @brief Names the internal shell formulation selected by S4 and S4R. +inline constexpr std::string_view kMitc4InternalFormulation{"FESA-MITC4"}; + +/// @brief Defines one four-node S4/S4R semantic element. +class Mitc4ShellDefinition final : public ElementDefinition { + public: + /// @brief Constructs a parser-validated semantic definition. + Mitc4ShellDefinition(SourceEntityId source_id, + ShellSourceElementType source_type, + std::array node_indices, + EntityIndex material_index, EntityIndex section_index, + SourceLocation location); + + ElementDefinitionKind Kind() const noexcept override; + const SourceEntityId& SourceId() const noexcept override; + std::string_view SourceElementType() const noexcept override; + const std::vector& NodeIndices() const noexcept override; + EntityIndex MaterialIndex() const noexcept override; + EntityIndex PropertyIndex() const noexcept override; + + SourceEntityId source_id; + ShellSourceElementType source_type; + std::array node_indices; + EntityIndex material_index; + EntityIndex section_index; + SourceLocation location; + + private: + friend class Domain; + + /// @brief Rebinds a shell-local section index to the unified property view. + void SetPropertyIndex(EntityIndex property_index) noexcept; + + /// @brief Synchronizes the base view after parser-candidate construction. + void SynchronizeNodeIndices(); + + EntityIndex property_index_; + std::vector node_indices_view_; +}; + + +} // namespace fesa + +#endif // FESA_ELEMENTS_MITC4_SHELL_DEFINITION_H_ diff --git a/include/fesa/elements/thermal_dof_component.h b/include/fesa/elements/thermal_dof_component.h new file mode 100644 index 0000000..0d25898 --- /dev/null +++ b/include/fesa/elements/thermal_dof_component.h @@ -0,0 +1,20 @@ +#ifndef FESA_ELEMENTS_THERMAL_DOF_COMPONENT_H_ +#define FESA_ELEMENTS_THERMAL_DOF_COMPONENT_H_ + + +namespace fesa { + +/// @brief Identifies the fixed bottom-to-top thermal station source DOFs. +/// @note This is separate from the six-component structural DofComponent. +enum class ThermalDofComponent : int { + kBottom = 11, + kLower = 12, + kMiddle = 13, + kUpper = 14, + kTop = 15 +}; + + +} // namespace fesa + +#endif // FESA_ELEMENTS_THERMAL_DOF_COMPONENT_H_ diff --git a/include/fesa/elements/thermal_element_layout.h b/include/fesa/elements/thermal_element_layout.h index d92b03e..4c3ce57 100644 --- a/include/fesa/elements/thermal_element_layout.h +++ b/include/fesa/elements/thermal_element_layout.h @@ -3,7 +3,8 @@ #include -#include "fesa/model/model_types.h" +#include "fesa/core/source_identity.h" +#include "fesa/elements/thermal_dof_component.h" namespace fesa { diff --git a/include/fesa/fem/dof_manager.h b/include/fesa/fem/dof_manager.h index afb3703..bfc56f1 100644 --- a/include/fesa/fem/dof_manager.h +++ b/include/fesa/fem/dof_manager.h @@ -6,25 +6,20 @@ #include #include -#include "fesa/analysis/analysis_model.h" #include "fesa/constraints/boundary_condition.h" -#include "fesa/elements/element.h" +#include "fesa/elements/element_dof_layout.h" #include "fesa/elements/thermal_element_layout.h" +#include "fesa/math/sparse_pattern.h" #include "fesa/math/vector.h" namespace fesa { +class AnalysisModel; class DofManagerTestAccess; /// @brief Distinguishes six-component, Solid translation, and thermal maps. enum class DofProfile { kStructural, kThermal, kSolidStructural }; -/// @brief Stores the stable full-space CSR pattern. -struct SparsePattern { - std::vector row_offsets; - std::vector column_indices; -}; - /// @brief Owns full/free/constrained numbering, scatter maps, and CSR pattern. class DofManager { public: diff --git a/include/fesa/math/matrix.h b/include/fesa/math/matrix.h index af51673..da79076 100644 --- a/include/fesa/math/matrix.h +++ b/include/fesa/math/matrix.h @@ -32,6 +32,26 @@ class Matrix { /// @brief Returns the column count. std::size_t Columns() const noexcept; + /// @brief Returns mutable row-major contiguous storage. + /// @note Borrows Rows()*Columns() entries until storage is moved, assigned + /// or destroyed. + double* Data() noexcept; + + /// @brief Returns immutable row-major contiguous storage. + /// @note Borrows Rows()*Columns() entries until storage is moved, assigned + /// or destroyed. + const double* Data() const noexcept; + + /// @brief Computes the robust Frobenius norm through the dense backend. + /// @note Empty storage has zero norm; nonfinite values propagate as in Vector. + /// @throws std::length_error if storage exceeds the backend integer range. + double Norm() const; + + /// @brief Scales every entry by alpha through the dense backend. + /// @note Empty storage is unchanged; nonfinite values follow BLAS semantics. + /// @throws std::length_error if storage exceeds the backend integer range. + void Scale(double alpha); + /// @brief Returns a bounds-checked mutable entry. /// @throws std::out_of_range if the index is outside the matrix. double& operator()(std::size_t row, std::size_t column); diff --git a/include/fesa/math/sparse_matrix.h b/include/fesa/math/sparse_matrix.h index 1aabf21..b3cbdd9 100644 --- a/include/fesa/math/sparse_matrix.h +++ b/include/fesa/math/sparse_matrix.h @@ -5,12 +5,11 @@ #include #include "fesa/core/status.h" +#include "fesa/math/sparse_pattern.h" #include "fesa/math/vector.h" namespace fesa { -struct SparsePattern; - /// @brief Carries one deterministic element-local COO contribution. struct CooContribution { std::size_t row; diff --git a/include/fesa/math/sparse_pattern.h b/include/fesa/math/sparse_pattern.h new file mode 100644 index 0000000..b2e9774 --- /dev/null +++ b/include/fesa/math/sparse_pattern.h @@ -0,0 +1,18 @@ +#ifndef FESA_MATH_SPARSE_PATTERN_H_ +#define FESA_MATH_SPARSE_PATTERN_H_ + +#include +#include + +namespace fesa { + +/// @brief Stores the stable full-space CSR pattern. +struct SparsePattern { + std::vector row_offsets; + std::vector column_indices; +}; + + +} // namespace fesa + +#endif // FESA_MATH_SPARSE_PATTERN_H_ diff --git a/include/fesa/model/domain.h b/include/fesa/model/domain.h index 43f8a85..54c8136 100644 --- a/include/fesa/model/domain.h +++ b/include/fesa/model/domain.h @@ -11,6 +11,8 @@ #include "fesa/constraints/boundary_condition.h" #include "fesa/constraints/prescribed_displacement.h" #include "fesa/core/status.h" +#include "fesa/elements/ds4_thermal.h" +#include "fesa/materials/isotropic_thermal_material.h" #include "fesa/loads/concentrated_nodal_load.h" #include "fesa/loads/load.h" #include "fesa/model/model_types.h" diff --git a/include/fesa/model/model_types.h b/include/fesa/model/model_types.h index 84e4bb9..88e8f7b 100644 --- a/include/fesa/model/model_types.h +++ b/include/fesa/model/model_types.h @@ -13,12 +13,11 @@ #include "fesa/core/diagnostic.h" #include "fesa/core/source_identity.h" -#include "fesa/elements/ds4_thermal.h" -#include "fesa/elements/euler_beam_3d.h" +#include "fesa/elements/euler_beam_3d_definition.h" #include "fesa/elements/hex8_definition.h" -#include "fesa/elements/mitc4_shell.h" +#include "fesa/elements/mitc4_shell_definition.h" +#include "fesa/elements/thermal_dof_component.h" #include "fesa/materials/isotropic_linear_elastic_material.h" -#include "fesa/materials/isotropic_thermal_material.h" #include "fesa/properties/general_beam_section.h" #include "fesa/properties/shell_section.h" #include "fesa/properties/solid_section.h" @@ -302,16 +301,6 @@ struct ThermalInitialConditionDefinition { SourceLocation location; }; -/// @brief Identifies the fixed bottom-to-top thermal station source DOFs. -/// @note This is separate from the six-component structural DofComponent. -enum class ThermalDofComponent : int { - kBottom = 11, - kLower = 12, - kMiddle = 13, - kUpper = 14, - kTop = 15 -}; - /// @brief Stores one prescribed thermal source DOF value. struct ThermalBoundaryConditionDefinition { EntityIndex node_index; diff --git a/include/fesa/model/source_target_resolver.h b/include/fesa/model/source_target_resolver.h index 197dbb1..697e2e3 100644 --- a/include/fesa/model/source_target_resolver.h +++ b/include/fesa/model/source_target_resolver.h @@ -38,6 +38,14 @@ class SourceTargetIndex { /// @return An owning index that preserves Domain declaration order. static SourceTargetIndex FromDomain(const Domain& domain); + /// @brief Copies node and set identities before Domain ownership begins. + /// @param nodes Semantic nodes in stable expanded declaration order. + /// @param node_sets Node memberships in stable source order. + /// @return An owning node-only index preserving raw spelling and scope. + /// @note The returned index outlives its inputs; no Domain is constructed. + static SourceTargetIndex FromNodeDefinitions( + const std::vector& nodes, const std::vector& node_sets); + /// @brief Returns owned entries without exposing mutable index state. const std::vector& Entries() const noexcept; diff --git a/include/fesa/results/prepared_results_writer.h b/include/fesa/results/prepared_results_writer.h new file mode 100644 index 0000000..6f49568 --- /dev/null +++ b/include/fesa/results/prepared_results_writer.h @@ -0,0 +1,39 @@ +#ifndef FESA_RESULTS_PREPARED_RESULTS_WRITER_H_ +#define FESA_RESULTS_PREPARED_RESULTS_WRITER_H_ + +#include +#include + +#include "fesa/analysis/prepared_analysis_outcome.h" +#include "fesa/core/diagnostic.h" +#include "fesa/core/status.h" + +namespace fesa { + +class Domain; +class ResultsWriter; +class NonlinearResultsWriter; +class EigenResultsWriter; +class DynamicResultsWriter; +class ThermalResultsWriter; +class SolidResultsWriter; + +/// @brief Routes one completed typed outcome to its authoritative writer. +/// @pre Domain, outcome, diagnostics, and adapters remain alive for this call. +/// The caller has closed its analysis log successfully before publication. +/// @param results_path Explicit output path, retaining each writer's contract. +/// @note Optional adapters are required only for their matching outcome family. +/// @return The selected writer's Status after candidate validation/finalization, +/// or the existing missing-adapter output failure without invoking a writer. +Status WritePreparedAnalysisResult( + const std::filesystem::path& results_path, const Domain& domain, + const PreparedAnalysisOutcome& outcome, + const std::vector& diagnostics, ResultsWriter& linear_writer, + NonlinearResultsWriter& nonlinear_writer, EigenResultsWriter& eigen_writer, + DynamicResultsWriter* dynamic_writer = nullptr, + ThermalResultsWriter* thermal_writer = nullptr, + SolidResultsWriter* solid_writer = nullptr); + +} // namespace fesa + +#endif // FESA_RESULTS_PREPARED_RESULTS_WRITER_H_ diff --git a/include/fesa/solvers/eigen/eigen_solver.h b/include/fesa/solvers/eigen/eigen_solver.h new file mode 100644 index 0000000..ecfb8e7 --- /dev/null +++ b/include/fesa/solvers/eigen/eigen_solver.h @@ -0,0 +1,99 @@ +#ifndef FESA_SOLVERS_EIGEN_EIGEN_SOLVER_H_ +#define FESA_SOLVERS_EIGEN_EIGEN_SOLVER_H_ + +#include +#include +#include +#include + +#include "fesa/core/status.h" +#include "fesa/math/matrix.h" + +namespace fesa { + +class SparseMatrix; + +/// @brief Records one deterministic private-backend invocation. +struct FeastBackendCall { + std::size_t ordinal; + std::string kind; + std::string purpose; + double lower; + double upper; + std::size_t allocated_m0; + int info; + bool count_available; + std::size_t count; + bool loop_available; + int loop; + bool epsout_available; + double epsout; + std::string outcome; + std::string decision_reason; +}; + +/// @brief Owns the complete validated FEAST interval result before public N +/// selection. +struct FeastEigenResult { + std::size_t requested_modes; + std::vector eigenvalues; + Matrix eigenvectors; + double operator_scale; + std::vector column_ids; + std::vector backend_res_available; + std::vector backend_res; + std::vector normalized_eigenvalues; + std::vector whitened_residuals; + double gram_error; + std::vector backend_calls; + std::vector base_fpm; + std::string runtime_version; + std::string integer_abi; + std::size_t thread_count; + std::uint64_t seed; + double enclosure_lower; + double enclosure_upper; + double solve_lower; + double solve_upper; + std::string upper_search_termination; +}; + +/// @brief Solves symmetric standard or definite generalized eigenproblems. +/// @note Inputs remain caller-owned and are borrowed only for each call. +class EigenSolver { + public: + /// @brief Destroys a backend-neutral eigen solver. + virtual ~EigenSolver() = default; + + /// @brief Computes all validated interval pairs for a requested lowest-mode + /// prefix. + /// @param whitened_operator Symmetric physical-lambda operator after + /// whitening. + /// @param requested_modes Number of lowest modes eventually exposed by the + /// caller. + /// @param zero_operator_scale Positive physical scale used only when A is + /// exactly zero. + /// @return Sorted all-c eigenpairs in physical lambda units or a solver + /// failure. + virtual Result Solve( + const SparseMatrix& whitened_operator, std::size_t requested_modes, + double zero_operator_scale) const = 0; + + /// @brief Solves the original sparse symmetric definite K/M pencil. + /// @param mass_lower_bound Certified positive lower spectral bound of M, + /// including floating-point assembly uncertainty; never a diagonal estimate. + /// @param classification_scale Positive max |Kii|/Mii in physical units. + /// @note Eigenvectors are mass-normalized. For this API the historical + /// whitened_residuals field contains original-pencil eta_r; no whitening + /// is performed. Intervals/eigenvalues in normalized backend evidence use + /// classification_scale, while eigenvalues are returned in physical units. + virtual Result SolveGeneralized( + const SparseMatrix& stiffness, const SparseMatrix& mass, + std::size_t requested_modes, double mass_lower_bound, + double classification_scale) const = 0; + +}; + +} // namespace fesa + +#endif // FESA_SOLVERS_EIGEN_EIGEN_SOLVER_H_ diff --git a/include/fesa/solvers/eigen/mkl_feast_eigen_solver.h b/include/fesa/solvers/eigen/mkl_feast_eigen_solver.h index 3e13447..029bc5f 100644 --- a/include/fesa/solvers/eigen/mkl_feast_eigen_solver.h +++ b/include/fesa/solvers/eigen/mkl_feast_eigen_solver.h @@ -1,65 +1,12 @@ #ifndef FESA_SOLVERS_EIGEN_MKL_FEAST_EIGEN_SOLVER_H_ #define FESA_SOLVERS_EIGEN_MKL_FEAST_EIGEN_SOLVER_H_ -#include -#include -#include -#include - -#include "fesa/core/status.h" -#include "fesa/math/matrix.h" +#include "fesa/solvers/eigen/eigen_solver.h" namespace fesa { -class SparseMatrix; - -/// @brief Records one deterministic private-backend invocation. -struct FeastBackendCall { - std::size_t ordinal; - std::string kind; - std::string purpose; - double lower; - double upper; - std::size_t allocated_m0; - int info; - bool count_available; - std::size_t count; - bool loop_available; - int loop; - bool epsout_available; - double epsout; - std::string outcome; - std::string decision_reason; -}; - -/// @brief Owns the complete validated FEAST interval result before public N -/// selection. -struct FeastEigenResult { - std::size_t requested_modes; - std::vector eigenvalues; - Matrix eigenvectors; - double operator_scale; - std::vector column_ids; - std::vector backend_res_available; - std::vector backend_res; - std::vector normalized_eigenvalues; - std::vector whitened_residuals; - double gram_error; - std::vector backend_calls; - std::vector base_fpm; - std::string runtime_version; - std::string integer_abi; - std::size_t thread_count; - std::uint64_t seed; - double enclosure_lower; - double enclosure_upper; - double solve_lower; - double solve_upper; - std::string upper_search_termination; -}; - /// @brief Adapts standard and symmetric-definite sparse pencils to FEAST. -class MklFeastEigenSolver final { +class MklFeastEigenSolver final : public EigenSolver { public: /// @brief Computes all validated interval pairs for a requested lowest-mode /// prefix. @@ -74,8 +21,8 @@ class MklFeastEigenSolver final { /// @note The implementation fixes oneMKL local thread count to one during /// every call. Result Solve(const SparseMatrix& whitened_operator, - std::size_t requested_modes, - double zero_operator_scale) const; + std::size_t requested_modes, + double zero_operator_scale) const override; /// @brief Solves the original sparse symmetric definite K/M pencil. /// @param mass_lower_bound Certified positive lower spectral bound of M, /// including floating-point assembly uncertainty; never a diagonal estimate. @@ -86,16 +33,16 @@ class MklFeastEigenSolver final { /// classification_scale, while eigenvalues are returned in physical units. Result SolveGeneralized(const SparseMatrix& stiffness, const SparseMatrix& mass, - std::size_t requested_modes, + std::size_t requested_modes, double mass_lower_bound, - double classification_scale) const; + double classification_scale) const override; private: /// @brief Shares deterministic count/search controls without changing /// pencils. Result SolveImpl(const SparseMatrix& stiffness, const SparseMatrix* mass, - std::size_t requested_modes, + std::size_t requested_modes, double physical_scale, double mass_lower_bound) const; }; diff --git a/msvc/AGENTS.md b/msvc/AGENTS.md new file mode 100644 index 0000000..a7f49eb --- /dev/null +++ b/msvc/AGENTS.md @@ -0,0 +1,17 @@ +# 직접 유지하는 MSVC 빌드 + +이 영역은 FESA 솔루션의 solver library·CLI·별도 테스트 프로젝트와 공통 옵션·DLL 준비를 +소유한다. CMake가 생성한 프로젝트로 교체하거나 빌드 전에 CMake를 숨겨서 호출하지 않는다. +요소 수식·검사 본문·기준 데이터는 이 영역의 소유가 아니다. + +- Source 추가·이동·제거는 대응하는 CMake target 목록과 같은 변경 단위로 처리한다. + 한 owner가 두 목록을 대조하며 solver와 검사 본문을 빌드 경로별로 복제하지 않는다. +- `Fesa.Common.props`와 `Fesa.Runtime.targets`의 CRT·산술·define·link·runtime staging을 + 함께 확인한다. 개인 설치 경로는 환경변수 또는 ignored `Fesa.Local.props`로 주입한다. +- AVX2 옵션은 전용 Hex8 source에만 둔다. Dispatch source와 나머지 target으로 확장하지 않는다. + 외부 GoogleTest source에 FESA 제품의 `/W4 /WX` 정책을 강제하지 않는다. +- `MSBuild FESA.sln /m:2 /p:Configuration=Debug /p:Platform=x64`는 저장소 root의 + VS x64 개발 환경에서 실행한다. 별도 테스트 executable이 같은 solver library를 연결하고 + 실행 파일 곁의 configuration별 DLL도 준비됐는지 확인한다. 빌드 성공은 검사 통과가 아니다. +- 빌드 설정을 바꾸면 CMake와 실제 source·옵션·link·DLL 및 발견한 검사 identity를 대조한다. + 기존 실행 로그와 바이너리를 덮어쓰지 말고 변경 전후 근거를 구분한다. diff --git a/msvc/Fesa.Common.props b/msvc/Fesa.Common.props new file mode 100644 index 0000000..d8e4e27 --- /dev/null +++ b/msvc/Fesa.Common.props @@ -0,0 +1,75 @@ + + + + + + $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\')) + $(FesaRoot).build\native\$(Configuration)\ + $(FesaRoot.Replace('\','/').TrimEnd('/')) + $(FesaBuildRoot.Replace('\','/').TrimEnd('/')) + $(FesaBuildRoot)tests\ + $(FesaBuildRoot)src\fesa\ + $(FesaBuildRoot)lib\ + $(FesaBuildRoot)obj\$(MSBuildProjectName)\ + fesa + _debug + + + /external:I"$(FESA_MKL_ROOT)\include" /external:I"$(FESA_TBB_ROOT)\include" /external:I"$(FESA_HDF5_ROOT)\include" /external:W0 + /external:I"$(FESA_HDF5_ROOT)\include" /external:I"$(FESA_GTEST_SOURCE_DIR)\googletest\include" /external:I"$(FESA_GTEST_SOURCE_DIR)\googletest" /external:W0 + $(FesaExternalOptions) /external:I"$(FESA_MKL_ROOT)\include" + + + + stdcpp17 + false + Sync + Level3 + false + Level4 + true + MultiThreadedDebugDLL + MultiThreadedDLL + Disabled + Disabled + EnableFastChecks + MaxSpeed + AnySuitable + ProgramDatabase + ProgramDatabase + Precise + WIN32;_WINDOWS;%(PreprocessorDefinitions) + NDEBUG;WIN32;_WINDOWS;%(PreprocessorDefinitions) + $(FesaRoot)include;%(AdditionalIncludeDirectories) + $(FesaRoot)include;$(FesaRoot)src\fesa;%(AdditionalIncludeDirectories) + $(FesaExternalOptions) /MP2 %(AdditionalOptions) + TurnOffAllWarnings + + + MachineX64 + Console + true + true + true + true + $(FESA_MKL_ROOT)\lib;$(FESA_OMP_ROOT)\lib;$(FESA_TBB_ROOT)\lib;$(FESA_HDF5_ROOT)\lib;%(AdditionalLibraryDirectories) + mkl_intel_ilp64_dll.lib;mkl_intel_thread_dll.lib;mkl_core_dll.lib;libiomp5md.lib;tbb12$(TbbSuffix).lib;hdf5.lib;shlwapi.lib;%(AdditionalDependencies) + + + + MKL_ILP64;H5_BUILT_AS_DYNAMIC_LIB;__TBB_NO_IMPLICIT_LINKAGE=1;%(PreprocessorDefinitions) + + + MKL_ILP64;%(PreprocessorDefinitions) + + + H5_BUILT_AS_DYNAMIC_LIB;%(PreprocessorDefinitions) + + + + $(FESA_GTEST_SOURCE_DIR)\googletest\include;$(FESA_GTEST_SOURCE_DIR)\googletest + /utf-8 /J %(AdditionalOptions) + GTEST_HAS_PTHREAD=0;_HAS_EXCEPTIONS=1;%(PreprocessorDefinitions) + + + diff --git a/msvc/Fesa.Runtime.targets b/msvc/Fesa.Runtime.targets new file mode 100644 index 0000000..f4b18f1 --- /dev/null +++ b/msvc/Fesa.Runtime.targets @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/fesa_cli.vcxproj b/msvc/fesa_cli.vcxproj new file mode 100644 index 0000000..09cca27 --- /dev/null +++ b/msvc/fesa_cli.vcxproj @@ -0,0 +1,18 @@ + + + Debugx64Releasex64 + {6DE2CFFA-D9B3-5E14-BEBD-5DFAB2B5290B}Win32Proj10.0 + + Applicationv145true + + + + + + + + {3AEC39D9-4641-5161-9107-265EB50CA882}true + + + + diff --git a/msvc/fesa_integration_tests.vcxproj b/msvc/fesa_integration_tests.vcxproj new file mode 100644 index 0000000..94cbc55 --- /dev/null +++ b/msvc/fesa_integration_tests.vcxproj @@ -0,0 +1,30 @@ + + + Debugx64Releasex64 + {7770C26B-DBFE-505D-8788-8B7EFD9A5A70}Win32Proj10.0 + + Applicationv145true + + + + + + + + + + + + + + + + + + {3AEC39D9-4641-5161-9107-265EB50CA882}true + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}true + {6DE2CFFA-D9B3-5E14-BEBD-5DFAB2B5290B}false + + + + diff --git a/msvc/fesa_reference_tests.vcxproj b/msvc/fesa_reference_tests.vcxproj new file mode 100644 index 0000000..d44fefb --- /dev/null +++ b/msvc/fesa_reference_tests.vcxproj @@ -0,0 +1,35 @@ + + + Debugx64Releasex64 + {330D2DFB-E57D-517D-A795-F1EA620B69F0}Win32Proj10.0 + + Applicationv145true + + + FESA_TEST_SOURCE_DIR="$(FesaRootForward)";FESA_TEST_BINARY_DIR="$(FesaBuildRootForward)";%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + {3AEC39D9-4641-5161-9107-265EB50CA882}true + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}true + + + + diff --git a/msvc/fesa_solver.vcxproj b/msvc/fesa_solver.vcxproj new file mode 100644 index 0000000..897f7f5 --- /dev/null +++ b/msvc/fesa_solver.vcxproj @@ -0,0 +1,118 @@ + + + Debugx64Releasex64 + {3AEC39D9-4641-5161-9107-265EB50CA882}Win32Proj10.0 + + StaticLibraryv145true + + + FESA_HEX8_PAIR_AVX2=1;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AdvancedVectorExtensions2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/fesa_unit_tests.vcxproj b/msvc/fesa_unit_tests.vcxproj new file mode 100644 index 0000000..d0826de --- /dev/null +++ b/msvc/fesa_unit_tests.vcxproj @@ -0,0 +1,108 @@ + + + Debugx64Releasex64 + {42558F77-73F2-5CA7-8E3C-BB0E1646CD45}Win32Proj10.0 + + Applicationv145true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {3AEC39D9-4641-5161-9107-265EB50CA882}true + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}true + + + + diff --git a/msvc/gtest.vcxproj b/msvc/gtest.vcxproj new file mode 100644 index 0000000..508e64c --- /dev/null +++ b/msvc/gtest.vcxproj @@ -0,0 +1,19 @@ + + + Debugx64Releasex64 + {03194BA4-3F3B-5399-BCAF-FB4FA47300CE}Win32Proj10.0 + + StaticLibraryv145true + + + + + + + + + + + + + diff --git a/scripts/AGENTS.md b/scripts/AGENTS.md new file mode 100644 index 0000000..70e2802 --- /dev/null +++ b/scripts/AGENTS.md @@ -0,0 +1,11 @@ +# 비교 보조 도구 + +`verification/compare_hex8.py`와 `compare_hht_dynamic.py`는 입력·reference·결과를 +읽고 요청한 JSON report만 기록한다. Solver를 실행하지 않는다. + +- 실행 전에 argv, 의존성, report 경로와 덮어쓰기 방지 검사를 확인한다. +- 원본 입력·CSV·TXT·결과 bytes와 frozen hash를 변경하지 않는다. 자료 부재나 + hash 충돌은 실패 또는 미실행으로 보고하며 원본 보정으로 해결하지 않는다. +- identity·schema·finite 사전 gate와 승인된 family별 판정 영향을 유지한다. + Synthetic HDF5 fixture의 comparator 통과를 실제 solver의 물리 검증으로 보고하지 않는다. +- 실행 근거는 고유한 작업 directory에 남기고 기존 report와 로그를 덮어쓰지 않는다. diff --git a/scripts/verification/compare_hex8.py b/scripts/verification/compare_hex8.py new file mode 100644 index 0000000..0bbc294 --- /dev/null +++ b/scripts/verification/compare_hex8.py @@ -0,0 +1,807 @@ +"""Compare original Hex8 CSV/TXT results with Solid HDF5; never launch a solver. + +This entry point is intentionally restricted to reference/hexa's fixed original +models. Identity/schema checks precede finite checks and the common tolerance. +Rounded HDF5 observables are compared; internal high+low solver gates are not +recomputed from them. Missing original modal Value data remain NOT RUN. +""" + +import argparse +import csv +from decimal import Decimal, InvalidOperation +import hashlib +import json +import math +import os +from pathlib import Path +import re +from typing import Any + +import h5py +import numpy as np + + +ROOT = Path(__file__).resolve().parents[2] +REFERENCE_DIRECTORY = ROOT / "reference/hexa" +STEP = "Step-1" +INSTANCE = "PART-1-1" +NODE_COUNT = 442 +ELEMENT_COUNT = 300 +POLICY = {"relative_tolerance": 0.05, "relative_rms_tolerance": 0.01, + "near_zero_ratio": 0.01, "zero_scale": "exact-zero"} +CASES = { + "hexa_linearstatic": "linear-static", + "hexa_nonlinearstatic": "nonlinear-static-full-newton", + "hexa_dynlinear": "hht-linear-dynamics", + "hexa_dynnonlinear": "hht-nonlinear-dynamics", + "hexa_freq": "linear-frequency", +} +# Working-tree bytes (Windows CRLF), not Git's normalized LF blobs. +SOURCE_SHA256 = { + "hexa_dynlinear.inp": "f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e", + "hexa_dynlinear_U.csv": "623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5", + "hexa_dynnonlinear.inp": "1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9", + "hexa_dynnonlinear_U.csv": "f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226", + "hexa_freq.inp": "42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347", + "hexa_freq.txt": "3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370", + "hexa_linearstatic.inp": "67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647", + "hexa_linearstatic_RF.csv": "3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b", + "hexa_linearstatic_S.csv": "8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8", + "hexa_linearstatic_U.csv": "1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f", + "hexa_nonlinearstatic.inp": "7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb", + "hexa_nonlinearstatic_RF.csv": "3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b", + "hexa_nonlinearstatic_S.csv": "a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba", + "hexa_nonlinearstatic_U.csv": "bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6", +} +BASE_COLUMNS = ["ODB Name", "Step", "Frame", "Part Instance Name"] +TAIL_COLUMNS = ["X", "Y", "Z", "Section Name", "Material Name", "Section Point"] +COMPONENTS = {"U": ["U1", "U2", "U3"], "RF": ["RF1", "RF2", "RF3"], + "S": ["S11", "S22", "S33", "S12", "S13", "S23"]} +STRESS_DERIVED = ["Mises", "Max. Principal", "Max. Principal (Abs)", + "Mid. Principal", "Min. Principal", "Tresca", "Pressure", "Third Invariant"] +NATURAL_NODES = np.array([[-1, -1, -1], [1, -1, -1], [1, 1, -1], [-1, 1, -1], + [-1, -1, 1], [1, -1, 1], [1, 1, 1], [-1, 1, 1]]) +NATURAL_POINTS = np.array([[-1, -1, -1], [1, -1, -1], [-1, 1, -1], [1, 1, -1], + [-1, -1, 1], [1, -1, 1], [-1, 1, 1], [1, 1, 1]]) / math.sqrt(3.0) +FRAME_PATTERN = re.compile( + r"Increment\s+(\d+):\s*Step Time\s*=\s*([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)" +) + + +class ComparisonError(ValueError): + def __init__(self, code: str, message: str): + super().__init__(message) + self.code = code + + +def require(condition: bool, code: str, message: str): + if not condition: + raise ComparisonError(code, message) + + +def canonical(value: str) -> str: + """Abaqus ASCII case folding only; distinct instances never coalesce.""" + return value.translate(str.maketrans("abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")) + + +def label(value: str) -> int: + require(re.fullmatch(r"[0-9]+", value) is not None, "invalid-source-label", value) + number = int(value) + require(0 < number <= 2**63 - 1, "invalid-source-label", value) + return number + + +def lexical_absolute(path: Path) -> str: + """Match C++ absolute.lexically_normal without resolving physical aliases.""" + return Path(os.path.abspath(path)).as_posix() + + +def sha256(path: Path) -> str: + with path.open("rb") as stream: + return hashlib.file_digest(stream, "sha256").hexdigest() + + +def fnv1a64(raw: bytes) -> str: + value = 14695981039346656037 + for byte in raw: + value = ((value ^ byte) * 1099511628211) & (2**64 - 1) + return f"fnv1a64:{value:016x}" + + +def input_inventory(path: Path, case: str) -> dict[str, Any]: + """Read only the frozen single-part identity-instance original subset.""" + require(case in CASES, "unknown-source-case", case) + require(sha256(path) == SOURCE_SHA256[f"{case}.inp"], "source-input-hash-mismatch", str(path)) + nodes, elements, sets, boundaries = {}, {}, {}, [] + keyword, options, in_assembly = "", {}, False + model = {"case": case, "nodes": nodes, "elements": elements, "node_sets": sets, + "section_line": None, "source_path": lexical_absolute(path), + "content_identity": fnv1a64(path.read_bytes())} + for line_number, raw in enumerate(path.read_text(encoding="utf-8-sig").splitlines(), 1): + line = raw.strip() + if not line or line.startswith("**"): + continue + if line.startswith("*"): + tokens = [token.strip() for token in line[1:].split(",")] + keyword = canonical(tokens[0]) + options = {canonical(token.split("=", 1)[0]): token.split("=", 1)[1].strip() + for token in tokens[1:] if "=" in token} + if keyword == "ASSEMBLY": + in_assembly = True + elif keyword == "END ASSEMBLY": + in_assembly = False + elif keyword == "INSTANCE": + require(canonical(options["NAME"]) == INSTANCE and len(tokens) == 3, + "unsupported-source-instance", line) + elif keyword == "SOLID SECTION": + model["section_line"] = line_number + model["section_elset"] = options["ELSET"] + model["material"] = options["MATERIAL"] + elif keyword == "STEP": + require(options["NAME"] == STEP, "wrong-source-step", line) + continue + tokens = [token.strip() for token in line.split(",") if token.strip()] + if keyword == "NODE": + node = label(tokens[0]) + require(node not in nodes and len(tokens) == 4, "source-node-inventory", line) + nodes[node] = tuple(float(value) for value in tokens[1:]) + elif keyword == "ELEMENT": + element = label(tokens[0]) + require(element not in elements and len(tokens) == 9 and options["TYPE"] == "C3D8", + "source-element-inventory", line) + elements[element] = tuple(label(value) for value in tokens[1:]) + elif keyword == "NSET" and in_assembly: + name = canonical(options["NSET"]) + require(canonical(options["INSTANCE"]) == INSTANCE, "wrong-source-instance", line) + sets.setdefault(name, []).extend(label(value) for value in tokens) + elif keyword == "BOUNDARY": + first, last = int(tokens[1]), int(tokens[2]) + require(len(tokens) == 3 or float(tokens[3]) == 0.0, "unsupported-source-boundary", line) + boundaries.append((canonical(tokens[0]), first, last)) + elif keyword == "DENSITY": + model["density"] = float(tokens[0]) + elif keyword == "ELASTIC": + model["elastic"] = tuple(float(value) for value in tokens) + require(set(nodes) == set(range(1, NODE_COUNT + 1)) + and set(elements) == set(range(1, ELEMENT_COUNT + 1)), + "source-model-inventory", "Expected original 442 nodes and 300 elements.") + constrained = set() + for name, first, last in boundaries: + require(name in sets and 1 <= first <= last <= 6, "source-boundary-identity", name) + constrained.update((node, component) for node in sets[name] + for component in range(first, min(last, 3) + 1)) + model["constrained"] = constrained + return model + + +def point_coordinates(model, element: int, point: int): + xi = NATURAL_POINTS[point - 1] + shape = np.prod(1.0 + NATURAL_NODES * xi, axis=1) / 8.0 + coordinates = np.array([model["nodes"][node] for node in model["elements"][element]]) + terms = shape[:, None] * coordinates + return np.sum(terms, axis=0), np.sum(np.abs(terms), axis=0) + + +def read_reference(path: Path, case: str, quantity: str, model): + """Validate all row identities before converting any physical values.""" + require(quantity in COMPONENTS, "unknown-quantity", quantity) + dynamic = case.startswith("hexa_dyn") + require(not dynamic or quantity == "U", "wrong-reference-quantity", quantity) + extra = (["Element Label", "IntPt"] if quantity == "S" else ["Node Label"]) + suffix = ([f"S-{name}" for name in STRESS_DERIVED] if quantity == "S" + else [f"{quantity}-Magnitude"]) + headers = BASE_COLUMNS + extra + TAIL_COLUMNS + suffix + [f"{quantity}-{c}" for c in COMPONENTS[quantity]] + records = {} + with path.open(newline="", encoding="utf-8-sig") as stream: + reader = csv.reader(stream) + fields = [field.strip() for field in next(reader, [])] + require(len(fields) == len(set(fields)), "duplicate-reference-header", str(path)) + require(set(fields) == set(headers), "wrong-reference-columns", str(fields)) + for row_number, values in enumerate(reader, 2): + require(len(values) == len(fields), "wrong-reference-row-width", str(row_number)) + row = dict(zip(fields, [value.strip() for value in values])) + require(row["ODB Name"].replace("\\", "/").rsplit("/", 1)[-1] == f"{case}.odb", + "wrong-reference-case", str(row_number)) + require(row["Step"] == STEP, "wrong-reference-step", str(row_number)) + require(canonical(row["Part Instance Name"]) == INSTANCE, + "wrong-reference-instance", str(row_number)) + match = FRAME_PATTERN.fullmatch(row["Frame"]) + require(match is not None, "invalid-reference-frame", str(row_number)) + increment = int(match[1]) + time = Decimal(match[2]) + require(time.is_finite() and increment in (range(101) if dynamic else (10,)) + and time == (Decimal(increment) / 10 if dynamic else Decimal(1)), + "wrong-reference-frame-time", str(row_number)) + entity = label(row["Element Label" if quantity == "S" else "Node Label"]) + point = label(row["IntPt"]) if quantity == "S" else 0 + require(entity in model["elements" if quantity == "S" else "nodes"], + "extra-reference-entity", str(row_number)) + require(quantity != "S" or 1 <= point <= 8, "wrong-reference-point", str(row_number)) + require(row["Section Point"] == "" + and canonical(row["Material Name"]) == ("MATERIAL-1" if quantity == "S" else "NA") + and canonical(row["Section Name"]) == ("ASSEMBLY_PART-1-1_SET-1" if quantity == "S" else "NA"), + "wrong-reference-section", str(row_number)) + key = (increment, entity, point) + require(key not in records, "duplicate-reference-identity", str(key)) + records[key] = row + entities = model["elements" if quantity == "S" else "nodes"] + expected = {(n, entity, p) for n in (range(101) if dynamic else (10,)) + for entity in entities for p in (range(1, 9) if quantity == "S" else (0,))} + require(records.keys() == expected, "reference-inventory", "Missing reference identities.") + return records + + +def reference_values(records, quantity, model): + result = {} + for key in sorted(records): + row = records[key] + values = [float(row[f"{quantity}-{component}"]) for component in COMPONENTS[quantity]] + coordinates = np.array([float(row[axis]) for axis in ("X", "Y", "Z")]) + # Every exported numeric column is checked, including unused derived values. + derived = STRESS_DERIVED if quantity == "S" else ["Magnitude"] + other = [float(row[f"{quantity}-{name}"]) for name in derived] + require(all(math.isfinite(value) for value in values + other) and np.isfinite(coordinates).all(), + "nonfinite-reference-value", str(key)) + if quantity == "S": + expected, scale = point_coordinates(model, key[1], key[2]) + else: + expected = np.array(model["nodes"][key[1]]) + scale = np.abs(expected) + budget = 16.0 * np.finfo(np.float32).eps * scale + require((np.abs(coordinates - expected) <= budget).all(), + "reference-coordinate-convention", str(key)) + result[key] = values + return result + + +def evaluate_family(identity, result, reference): + require(len(result) == len(reference) == len(identity["rows"]) and len(result) > 0, + "scalar-inventory", identity["quantity"]) + require(all(math.isfinite(value) for value in (*result, *reference)), + "nonfinite-comparison-value", "Comparison values must be finite.") + scale = max(abs(value) for value in reference) + band = POLICY["near_zero_ratio"] * scale + rows, error_norm = [], 0.0 + for key, actual, expected in zip(identity["rows"], result, reference): + error = abs(actual - expected) + require(math.isfinite(error), "nonfinite-comparison-value", str(key)) + error_norm = math.hypot(error_norm, error) + require(math.isfinite(error_norm), "nonfinite-comparison-value", str(key)) + relative = None + if scale == 0.0: + branch, threshold, passed = "zero-scale-exact", 0.0, error == 0.0 + elif abs(expected) <= band: + branch, threshold, passed = "near-zero", band, error <= band + else: + branch, threshold = "relative", POLICY["relative_tolerance"] * abs(expected) + relative = error / abs(expected) + require(math.isfinite(relative), "nonfinite-comparison-value", str(key)) + passed = relative <= POLICY["relative_tolerance"] + rows.append({**key, "fesa_value": actual, "reference_value": expected, + "absolute_error": error, "relative_error": relative, "branch": branch, + "threshold": threshold, "passed": passed}) + rows_passed = all(row["passed"] for row in rows) + absolute_rms = error_norm / math.sqrt(len(rows)) + relative_rms = absolute_rms / scale if scale else None + require(relative_rms is None or math.isfinite(relative_rms), "nonfinite-comparison-value", "RMS") + rms_passed = rows_passed if not scale else relative_rms <= POLICY["relative_rms_tolerance"] + return {**{k: v for k, v in identity.items() if k != "rows"}, "impact": "blocking", + "row_count": len(rows), "reference_scale": scale, "near_zero_band": band, + "maximum_absolute_error": max(row["absolute_error"] for row in rows), + "absolute_rms": absolute_rms, "relative_rms": relative_rms, + "policy": dict(POLICY), "rows": rows, "rows_passed": rows_passed, + "rms_passed": rms_passed, "passed": rows_passed and rms_passed, + "diagnostic_code": "zero-reference-scale-nonzero-error" if not scale and not rows_passed else None} + + +def read_modal_reference(path: Path): + """Read the supplied hexa_freq.txt Value=lambda, Freq=cycles/time format. + + This artifact has no step field: its fixed case is bound to the sole Step-1 + of the hash-checked hexa_freq.inp. Freq is finite auxiliary data; comparison + uses the printed Value directly, without frequency conversion or rounding. + """ + mapping = {} + for line in path.read_text(encoding="utf-8-sig").splitlines(): + if not line.strip(): + continue + match = re.fullmatch( + r"\s*Mode\s+([0-9]+):\s+Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)\s+\(cycles/time\)\s*", line) + require(match is not None, "wrong-modal-reference-format", line) + mode = int(match[1]) + require(mode in range(1, 11), "wrong-modal-mode", str(mode)) + require(mode not in mapping, "duplicate-modal-mode", str(mode)) + mapping[mode] = (match[2], match[3]) + require(set(mapping) == set(range(1, 11)), "modal-mode-inventory", "Lowest ten modes required.") + rows = [] + for mode in range(1, 11): + value, frequency = (float(token) for token in mapping[mode]) + require(math.isfinite(value) and math.isfinite(frequency), "nonfinite-modal-reference", str(mode)) + require(value >= 0 and frequency >= 0, "invalid-modal-reference-value", str(mode)) + rows.append({"step": STEP, "mode": mode, "quantity": "eigenvalue", + "unit_dimensions": "1/time^2", "value": value}) + require(all(a["value"] <= b["value"] for a, b in zip(rows, rows[1:])), + "wrong-modal-order", str(path)) + return rows + + +def compare_modal(reference, result, quantity: str, unit: str): + """Compare explicitly typed modal rows using the common tolerance. + + Each row explicitly supplies step, mode, quantity, unit_dimensions and value. + Callers must obtain those semantics from a genuine supplied artifact first. + Eigenvalues and frequencies are never silently converted into one another. + """ + units = {"eigenvalue": "1/time^2", "frequency": "1/time"} + require(quantity in units and unit == units[quantity], "wrong-modal-unit", unit) + inventories = [] + for rows in (reference, result): + mapping = {} + for row in rows: + require(row["quantity"] == quantity, "wrong-modal-quantity", str(row["mode"])) + require(row["unit_dimensions"] == unit, "wrong-modal-unit", str(row["mode"])) + require(row["step"] == STEP, "wrong-modal-step", str(row["mode"])) + mode = row["mode"] + require(type(mode) is int and mode in range(1, 11), "wrong-modal-mode", str(mode)) + require(mode not in mapping, "duplicate-modal-mode", str(mode)) + mapping[mode] = row["value"] + require(set(mapping) == set(range(1, 11)), "modal-mode-inventory", "Lowest ten modes required.") + inventories.append(mapping) + families = [evaluate_family( + {"identity": f"hexa_freq:{STEP}:mode-{mode}:{quantity}", + "case": "hexa_freq", "step": STEP, "mode": mode, "quantity": quantity, + "unit_dimensions": unit, "rows": [{"mode": mode, "component": quantity}]}, + [inventories[1][mode]], [inventories[0][mode]]) for mode in range(1, 11)] + return {"families": families, "passed": all(family["passed"] for family in families)} + + +def text(value) -> str: + return value.decode("utf-8", errors="strict") if isinstance(value, bytes) else str(value) + + +def string_attribute(obj, name, expected=None): + require(name in obj.attrs, "missing-result-attribute", f"{obj.name}:{name}") + attr = obj.attrs.get_id(name) + string = h5py.check_string_dtype(attr.dtype) + require(attr.shape == () and string is not None and string.length is None + and string.encoding == "utf-8", "wrong-result-attribute-type", f"{obj.name}:{name}") + value = text(obj.attrs[name]) + require(bool(value) and (expected is None or value == expected), + "wrong-result-attribute", f"{obj.name}:{name}={value}") + return value + + +def numeric_attribute(obj, name, dtype, expected): + require(name in obj.attrs, "missing-result-attribute", f"{obj.name}:{name}") + attr = obj.attrs.get_id(name) + require(attr.shape == () and attr.dtype == np.dtype(dtype), + "wrong-result-attribute-type", f"{obj.name}:{name}") + require(obj.attrs[name] == expected, "wrong-result-attribute", f"{obj.name}:{name}") + + +def dataset(file, path, shape): + require(path in file and isinstance(file[path], h5py.Dataset), "missing-result-dataset", path) + value = file[path] + require(value.shape == shape and value.chunks is None and value.compression is None, + "wrong-result-shape", path) + return value + + +def table(file, path, count, fields): + value = dataset(file, path, (count,)) + require(value.dtype.names == tuple(name for name, _ in fields), "wrong-result-table-schema", path) + for name, dtype in fields: + actual = value.dtype[name] + if dtype == "string": + info = h5py.check_string_dtype(actual) + valid = info is not None and info.length is None and info.encoding == "utf-8" + else: + valid = actual == np.dtype(dtype) + require(valid, "wrong-result-table-schema", f"{path}:{name}") + return value[:] + + +def read_results(path: Path, model): + """Read complete official schema/identities; defer physical finite checks.""" + case = model["case"] + dynamic, nonlinear = case.startswith("hexa_dyn"), "nonlinear" in case + frequency = case == "hexa_freq" + arrays, frames, modal = [], {}, {} + with h5py.File(path, "r") as file: + require("metadata" in file and isinstance(file["metadata"], h5py.Group), + "missing-result-metadata", str(path)) + metadata = file["metadata"] + numeric_attribute(metadata, "schema_version", "= 0 for row in modes), + [("mode_id", "= 0], + "wrong-modal-frequency-inventory", root) + vectors = physical_dataset(file, root + "/vectors", (10, NODE_COUNT, 3), + "UX,UY,UZ", "mass-normalized", "nodal", + extra={"normalization": "phi^T*M*phi=1"}) + verification = root + "/verification" + require(set(file[verification]) == {"pairs", "eta_gram", "max_eta_orth"}, + "wrong-modal-verification-inventory", verification) + pair_object = file[verification + "/pairs"] + require(isinstance(pair_object, h5py.Dataset) and len(pair_object.shape) == 1, + "wrong-modal-pair-shape", verification + "/pairs") + pair_count = pair_object.shape[0] + require(10 <= pair_count <= free_count, "wrong-modal-pair-count", str(pair_count)) + pairs = table(file, verification + "/pairs", pair_count, [ + ("sorted_rank", "= 0).all() and (np.diff(pairs["eigenvalue"]) >= 0).all(), + "wrong-modal-order", model["case"]) + for row in frequencies: + expected = math.sqrt(modes[row["mode_id"] - 1]["eigenvalue"]) / (2 * math.pi) + require(row["frequency"] == expected, "wrong-modal-frequency", str(row["mode_id"])) + + +def compare(case: str, input_path: Path, results_path: Path, reference_directory: Path = REFERENCE_DIRECTORY, + execution_record: Path | None = None): + report = {"schema": "hex8-reference-comparison-v1", "case": case, "policy": dict(POLICY), + "identities": {}, "precheck": {"passed": False}, "families": [], + "blocking_failures": [], "blocking_passed": False, "verdict": "failed"} + try: + require(case in CASES, "unknown-source-case", case) + quantities = ["U"] if case.startswith("hexa_dyn") else (["U", "RF", "S"] if case != "hexa_freq" else []) + paths = {"input": input_path, "results": results_path} + paths.update({quantity: reference_directory / f"{case}_{quantity}.csv" for quantity in quantities}) + modal_path = reference_directory / "hexa_freq.txt" + if case == "hexa_freq" and modal_path.exists(): + paths["Value"] = modal_path + for name, path in paths.items(): + report["identities"][name] = {"path": lexical_absolute(path), "sha256": sha256(path)} + model = input_inventory(input_path, case) + report["input_copy_matches_approved_bytes"] = True + report["approved_input_sha256"] = SOURCE_SHA256[f"{case}.inp"] + report["execution"] = {"verified": False, "scope": "file comparison only; execution record not supplied"} + if execution_record is not None: + execution = json.loads(execution_record.read_text(encoding="utf-8-sig")) + command = execution.get("command") + require(execution.get("case") == case and execution.get("native_exit") == 0 + and type(execution.get("native_exit")) is int + and execution.get("original_sha256") == report["identities"]["input"]["sha256"] + and execution.get("scratch_sha256") == report["identities"]["input"]["sha256"] + and execution.get("result_sha256") == report["identities"]["results"]["sha256"] + and execution.get("source_unchanged") is True + and execution.get("scratch_unchanged") is True + and execution.get("result_exists") is True + and isinstance(command, list) and len(command) == 2 + and all(isinstance(item, str) for item in command) + and Path(lexical_absolute(Path(command[1]))) == Path(lexical_absolute(input_path)), + "invalid-execution-evidence", str(execution_record)) + report["execution"] = {"verified": True, "native_exit": 0, "command": command, + "record_path": lexical_absolute(execution_record), + "record_sha256": sha256(execution_record)} + records = {} + modal_reference = None + if "Value" in paths: + require(report["identities"]["Value"]["sha256"] == SOURCE_SHA256["hexa_freq.txt"], + "reference-hash-mismatch", str(modal_path)) + modal_reference = read_modal_reference(modal_path) + for quantity in quantities: + require(report["identities"][quantity]["sha256"] == SOURCE_SHA256[f"{case}_{quantity}.csv"], + "reference-hash-mismatch", str(paths[quantity])) + records[quantity] = read_reference(paths[quantity], case, quantity, model) + result = read_results(results_path, model) + references = {quantity: reference_values(rows, quantity, model) for quantity, rows in records.items()} + check_result_values(result, model) + report["precheck"] = {"passed": True, **result["evidence"], + "reference_row_counts": {q: len(rows) for q, rows in records.items()}, + "coordinate_check": "auxiliary; fixed identity; 16*float32-eps uncancelled source-coordinate budget"} + # Internal maps are useful to validation but unnecessary in the public report. + del report["precheck"]["result_node_map"], report["precheck"]["result_element_map"] + if case == "hexa_freq": + if modal_reference is None: + report["verdict"] = "not-run" + report["reason"] = "Original modal Value reference is absent; no format/quantity/unit assumption made." + return report + actual = [{"step": STEP, "mode": int(row["mode_id"]), "quantity": "eigenvalue", + "unit_dimensions": "1/time^2", "value": float(row["eigenvalue"])} + for row in result["modal"]["modes"]] + modal = compare_modal(modal_reference, actual, "eigenvalue", "1/time^2") + report["precheck"]["reference_row_counts"]["Value"] = len(modal_reference) + report["modal_reference"] = {"format": "Mode n: Value = lambda Freq = f (cycles/time)", + "step_binding": "sole Step-1 of approved hexa_freq.inp", + "quantity": "eigenvalue", "unit_dimensions": "1/time^2", + "frequency_role": "finite auxiliary; no conversion"} + report["families"] = modal["families"] + for family in report["families"]: + family["reference_sha256"] = report["identities"]["Value"]["sha256"] + report["blocking_failures"] = [f["identity"] for f in modal["families"] if not f["passed"]] + report["blocking_passed"] = modal["passed"] + report["verdict"] = "passed" if modal["passed"] else "failed" + return report + families = [] + for increment in sorted(result["frames"]): + if not case.startswith("hexa_dyn") and increment != 10: + continue + values = result["frames"][increment] + for quantity in quantities: + actual, expected, identities = [], [], [] + for key in sorted(references[quantity]): + if key[0] != increment: + continue + _, entity, point = key + index = result["evidence"]["result_element_map" if quantity == "S" else "result_node_map"][entity] + row = values[{"U": "nodal/displacement", "RF": "nodal/reaction", "S": "solid/stress"}[quantity]][index] + if quantity == "S": + row = row[point - 1] + for c, component in enumerate(COMPONENTS[quantity]): + if quantity == "RF" and (entity, c + 1) not in model["constrained"]: + continue + identities.append({"instance": INSTANCE, "component": component, + "element_label" if quantity == "S" else "node_label": entity, + **({"integration_point": point} if quantity == "S" else {})}) + actual.append(float(row[c])) + expected.append(references[quantity][key][c]) + identity = {"identity": f"{case}:{STEP}:increment-{increment}:{quantity}-global", + "case": case, "step": STEP, "increment": increment, "quantity": quantity, + "unit_dimensions": {"U": "length", "RF": "force", "S": "force/length^2"}[quantity], + "coordinate_system": "global-cartesian", "rows": identities, + "reference_sha256": report["identities"][quantity]["sha256"]} + if case.startswith("hexa_dyn"): + identity.update({"hdf5_time": increment * 0.1, + "reference_decimal_time": str(Decimal(increment) / 10)}) + families.append(evaluate_family(identity, actual, expected)) + report["families"] = families + report["blocking_failures"] = [f["identity"] for f in families if not f["passed"]] + report["blocking_passed"] = not report["blocking_failures"] + report["verdict"] = "passed" if report["blocking_passed"] else "failed" + except (ComparisonError, OSError, ValueError, InvalidOperation, UnicodeError, KeyError, TypeError) as error: + report["precheck"] = {"passed": False, "code": getattr(error, "code", "invalid-comparison-input"), + "message": str(error)} + return report + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--case", choices=CASES, required=True) + parser.add_argument("--input", type=Path, required=True, help="Actual byte-identical scratch input read by the solver.") + parser.add_argument("--results", type=Path, required=True) + parser.add_argument("--references", type=Path, default=REFERENCE_DIRECTORY) + parser.add_argument("--execution-record", type=Path, help="Closed native CLI record with input/result hashes; never executed here.") + parser.add_argument("--report", type=Path, required=True) + args = parser.parse_args() + protected = {args.input.resolve(), args.results.resolve()} + if args.execution_record is not None: + protected.add(args.execution_record.resolve()) + protected.update(path.resolve() for path in args.references.glob("*")) + protected.update(path.resolve() for path in REFERENCE_DIRECTORY.glob("*")) + report_path = args.report.resolve() + hardlink_alias = args.report.exists() and any( + path.exists() and args.report.samefile(path) for path in protected) + if report_path in protected or hardlink_alias: + parser.error("The report path must not overwrite an input, reference or result.") + report = compare(args.case, args.input, args.results, args.references, args.execution_record) + args.report.parent.mkdir(parents=True, exist_ok=True) + args.report.write_text(json.dumps(report, sort_keys=True, indent=2, allow_nan=False) + "\n", encoding="utf-8") + print(json.dumps({"case": args.case, "verdict": report["verdict"], "precheck": report["precheck"], + "blocking_failure_count": len(report["blocking_failures"]), "report": str(args.report)}, allow_nan=False)) + return 2 if not report["precheck"]["passed"] or report["verdict"] == "not-run" else (0 if report["blocking_passed"] else 1) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/verification/compare_hht_dynamic.py b/scripts/verification/compare_hht_dynamic.py new file mode 100644 index 0000000..074830a --- /dev/null +++ b/scripts/verification/compare_hht_dynamic.py @@ -0,0 +1,436 @@ +"""Compare the approved 101-frame HHT reference without modifying artifacts. + +Run with ``uv run --with h5py python -B scripts/verification/compare_hht_dynamic.py``. +Only the documented displacement/rotation reference quantities are compared; +this is not an independent validation of inertia, energy, or convergence. +""" + +from __future__ import annotations + +import argparse +import csv +from decimal import Decimal, InvalidOperation +import hashlib +import json +import math +from pathlib import Path +import re +from typing import Any + +import h5py +import numpy as np + +ROOT = Path(__file__).resolve().parents[2] +CASE = "shellNL-dyn-meshfine" +REFERENCE_DIRECTORY = ROOT / "reference" / CASE +NODE_LABELS = (2, 21, 22, 69, 70, 165, 309, 442, 586) +INSTANCE = "PART-1-1" +STEP = "Step-1" +NODE_COUNT = 729 +FRAME_COUNT = 101 +INCREMENT = 0.1 +COMPONENTS = ("U-U1", "U-U2", "U-U3", "UR-UR1", "UR-UR2", "UR-UR3") +CSV_COLUMNS = ("Frame", "Part Instance Name", "Node Label", *COMPONENTS) +FRAME_PATTERN = re.compile( + r"Increment\s+(\d+):\s*Step Time\s*=\s*" + r"([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)" +) +POLICY = { + "policy_id": "common-reference-tolerance", + "near_zero_ratio": 0.01, + "relative_tolerance": 0.05, + "relative_rms_tolerance": 0.01, +} + + +class ComparisonError(ValueError): + """An identity/schema/finite failure that must precede tolerance evaluation.""" + + def __init__(self, code: str, message: str): + super().__init__(message) + self.code = code + + +def require(condition: bool, code: str, message: str) -> None: + if not condition: + raise ComparisonError(code, message) + + +def positive_label(text: str) -> int: + require(bool(re.fullmatch(r"\d+", text)), "invalid-node-label", repr(text)) + label = int(text) + require(0 < label <= 2**63 - 1, "invalid-node-label", repr(text)) + return label + + +def canonical_instance(text: str) -> str: + return text.translate(str.maketrans("abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")) + + +def input_inventory(path: Path) -> tuple[dict[int, tuple[float, ...]], str]: + """Read identity and schedule authority from this specific approved INP.""" + raw = path.read_bytes() + nodes: dict[int, tuple[float, ...]] = {} + parts: list[str] = [] + instances: list[tuple[str, str]] = [] + steps: list[dict[str, str]] = [] + dynamic_rows: list[tuple[float, float]] = [] + keyword = "" + in_part = False + for line_number, line in enumerate(raw.decode("utf-8-sig").splitlines(), 1): + text = line.strip() + if not text or text.startswith("**"): + continue + fields = [field.strip() for field in text.split(",")] + if text.startswith("*"): + keyword = fields[0].upper() + parameters = dict( + (name.upper(), value.strip()) + for field in fields[1:] if "=" in field + for name, value in [field.split("=", 1)] + ) + if keyword == "*PART": + in_part = True + parts.append(canonical_instance(parameters.get("NAME", ""))) + elif keyword == "*END PART": + in_part = False + elif keyword == "*INSTANCE": + instances.append((canonical_instance(parameters.get("NAME", "")), + canonical_instance(parameters.get("PART", "")))) + elif keyword == "*STEP": + steps.append(parameters) + elif keyword == "*DYNAMIC": + require([field.upper() for field in fields] == ["*DYNAMIC", "DIRECT"], + "wrong-input-procedure", f"line {line_number}") + continue + if keyword == "*NODE": + require(in_part and len(fields) == 4, "invalid-input-node", f"line {line_number}") + label = positive_label(fields[0]) + require(label not in nodes, "duplicate-input-node", str(label)) + coordinates = tuple(float(value) for value in fields[1:]) + require(all(math.isfinite(value) for value in coordinates), + "nonfinite-input-node", str(label)) + nodes[label] = coordinates + elif keyword == "*DYNAMIC": + if fields[-1] == "": + fields.pop() + require(len(fields) == 2, "wrong-input-schedule", f"line {line_number}") + dynamic_rows.append((float(fields[0]), float(fields[1]))) + require(parts == ["PART-1"] and instances == [(INSTANCE, "PART-1")], + "wrong-input-instance", "Expected the original single identity instance.") + require(len(nodes) == NODE_COUNT and set(NODE_LABELS) <= nodes.keys(), + "wrong-input-node-inventory", f"Expected {NODE_COUNT} source nodes.") + require(len(steps) == 1 and steps[0].get("NAME") == STEP + and steps[0].get("NLGEOM", "").upper() == "YES" + and steps[0].get("INC") == "1000", "wrong-input-step", str(steps)) + require(dynamic_rows == [(INCREMENT, 10.0)], "wrong-input-schedule", str(dynamic_rows)) + value = 14695981039346656037 + for byte in raw: + value = ((value ^ byte) * 1099511628211) & (2**64 - 1) + return nodes, f"fnv1a64:{value:016x}" + + +def read_reference(path: Path) -> dict[tuple[int, int], tuple[float, ...]]: + rows: dict[tuple[int, int], tuple[float, ...]] = {} + with path.open(encoding="utf-8-sig", newline="") as stream: + reader = csv.reader(stream) + header = [field.strip() for field in next(reader, [])] + require(len(header) == len(set(header)), "duplicate-reference-column", str(header)) + require(set(CSV_COLUMNS) <= set(header), "missing-reference-column", str(header)) + for line_number, fields in enumerate(reader, 2): + if not fields or all(not field.strip() for field in fields): + continue + require(len(fields) == len(header), "invalid-reference-row", f"line {line_number}") + row = dict(zip(header, (field.strip() for field in fields))) + match = FRAME_PATTERN.fullmatch(row["Frame"]) + require(match is not None, "invalid-reference-frame", f"line {line_number}") + increment = int(match.group(1)) + time = Decimal(match.group(2)) + require(time.is_finite() and time == Decimal(increment) / Decimal(10), + "wrong-reference-time", f"line {line_number}: {row['Frame']}") + require(canonical_instance(row["Part Instance Name"]) == INSTANCE, + "wrong-reference-instance", f"line {line_number}") + label = positive_label(row["Node Label"]) + key = (increment, label) + require(key not in rows, "duplicate-reference-row", str(key)) + values = tuple(float(row[component]) for component in COMPONENTS) + require(all(math.isfinite(value) for value in values), + "nonfinite-reference-value", str(key)) + rows[key] = values + expected = {(frame, label) for frame in range(FRAME_COUNT) for label in NODE_LABELS} + require(rows.keys() == expected, "reference-row-inventory", + f"missing={sorted(expected - rows.keys())}; extra={sorted(rows.keys() - expected)}") + return rows + + +def text_value(value: Any) -> str: + return value.decode("utf-8") if isinstance(value, bytes) else str(value) + + +def string_attribute(obj: Any, name: str, expected: str | None = None) -> str: + require(name in obj.attrs, "missing-hdf5-attribute", f"{obj.name}@{name}") + attribute = obj.attrs.get_id(name) + string = h5py.check_string_dtype(attribute.dtype) + require(attribute.shape == () and string is not None and string.length is None + and string.encoding == "utf-8", "wrong-hdf5-attribute-type", f"{obj.name}@{name}") + value = text_value(obj.attrs[name]) + require(bool(value) and (expected is None or value == expected), + "wrong-hdf5-attribute-value", f"{obj.name}@{name}: {value!r}") + return value + + +def numeric_attribute(obj: Any, name: str, dtype: str, expected: int | float) -> None: + require(name in obj.attrs, "missing-hdf5-attribute", f"{obj.name}@{name}") + attribute = obj.attrs.get_id(name) + require(attribute.shape == () and attribute.dtype == np.dtype(dtype), + "wrong-hdf5-attribute-type", f"{obj.name}@{name}") + value = obj.attrs[name] + require(math.isfinite(value) and value == expected, "wrong-hdf5-attribute-value", + f"{obj.name}@{name}: {value!r}") + + +def dataset(file: h5py.File, path: str, shape: tuple[int, ...]) -> h5py.Dataset: + require(path in file and isinstance(file[path], h5py.Dataset), "missing-hdf5-dataset", path) + result = file[path] + require(result.shape == shape and result.chunks is None and result.compression is None, + "wrong-hdf5-dataset-layout", path) + return result + + +def read_results(path: Path, nodes: dict[int, tuple[float, ...]], + content_identity: str) -> tuple[list[np.ndarray], dict[str, Any]]: + """Precheck every result node/frame/component, then project by source key.""" + projected: list[np.ndarray] = [] + with h5py.File(path, "r") as file: + require("metadata" in file and isinstance(file["metadata"], h5py.Group), + "missing-hdf5-metadata", "/metadata") + metadata = file["metadata"] + for name, expected in { + "feature_id": "hht-implicit-dynamics", "analysis_procedure": "hht-implicit-dynamics", + "mass_formulation": "nodal-lumped-kinetic", "internal_formulation": "FESA-MITC4-total-lagrangian", + "initial_state": "zero-q-v-step-load-0+", + "acceleration_convention": "physical-endpoint-and-auxiliary-separated", + "source_step_name": STEP, "step_name": STEP, "unit_system_label": "consistent-input-units", + }.items(): + string_attribute(metadata, name, expected) + string_attribute(metadata, "solver_version") + source_identity = string_attribute(metadata, "source_input_identity") + require(source_identity.endswith(";content_identity=" + content_identity), + "wrong-input-content-identity", source_identity) + require("schema_version" in metadata.attrs, "missing-hdf5-attribute", "/metadata@schema_version") + version_attribute = metadata.attrs.get_id("schema_version") + require(version_attribute.shape == () and version_attribute.dtype == np.dtype(" dict[str, Any]: + """Apply the common policy exactly, including zero-scale and family RMS.""" + require(len(result) == len(reference) and len(result) > 0, "scalar-inventory", quantity) + require(all(math.isfinite(value) for value in (*result, *reference)), + "nonfinite-comparison-value", quantity) + scale = max(abs(value) for value in reference) + band = POLICY["near_zero_ratio"] * scale + rows = [] + error_norm = 0.0 + for index, (actual, expected) in enumerate(zip(result, reference)): + error = abs(actual - expected) + require(math.isfinite(error), "nonfinite-comparison-value", quantity) + error_norm = math.hypot(error_norm, error) + require(math.isfinite(error_norm), "nonfinite-comparison-value", quantity) + relative_error = None + if scale == 0.0: + branch, threshold, passed = "zero-scale-exact", 0.0, error == 0.0 + elif abs(expected) <= band: + branch, threshold, passed = "near-zero", band, error <= band + else: + branch = "relative" + threshold = POLICY["relative_tolerance"] * abs(expected) + relative_error = error / abs(expected) + require(math.isfinite(relative_error), "nonfinite-comparison-value", quantity) + passed = relative_error <= POLICY["relative_tolerance"] + rows.append({"instance": INSTANCE, "node_label": NODE_LABELS[index // 3], + "component": f"{quantity}{index % 3 + 1}", "fesa_value": actual, + "reference_value": expected, "absolute_error": error, + "relative_error": relative_error, "branch": branch, + "threshold": threshold, "passed": passed}) + rows_passed = all(row["passed"] for row in rows) + rms = error_norm / math.sqrt(len(rows)) / scale if scale else None + require(rms is None or math.isfinite(rms), "nonfinite-comparison-value", quantity) + rms_passed = rows_passed if scale == 0.0 else rms <= POLICY["relative_rms_tolerance"] + return {"identity": f"{quantity}-global:{STEP}:increment-{increment}", "case": CASE, + "step": STEP, "increment": increment, "hdf5_time": float(increment) * INCREMENT, + "reference_decimal_time": str(Decimal(increment) / Decimal(10)), + "quantity": quantity, "components": [f"{quantity}{i}" for i in (1, 2, 3)], + "unit_dimension": "length" if quantity == "U" else "rad", + "coordinate_system": "global-cartesian" if quantity == "U" else "fixed-initial-global-total-rotation-vector", + "impact": "blocking" if quantity == "U" else "warning-only", "row_count": len(rows), + "reference_scale": scale, "near_zero_band": band, "rows": rows, + "rows_passed": rows_passed, "relative_rms": rms, "rms_passed": rms_passed, + "diagnostic_code": "zero-reference-scale-nonzero-error" if scale == 0.0 and not rows_passed else None, + "passed": rows_passed and rms_passed} + + +def compare(input_path: Path, reference_path: Path, results_path: Path) -> dict[str, Any]: + report: dict[str, Any] = { + "schema": "hht-reference-comparison-v1", "case": CASE, "policy": dict(POLICY), + "identities": {}, "precheck": {"passed": False}, "families": [], + "blocking_failures": [], "warnings": [], "blocking_passed": False, "verdict": "failed", + } + try: + for name, path in (("input", input_path), ("reference", reference_path), ("results", results_path)): + report["identities"][name] = {"path": str(path.absolute())} + with path.open("rb") as stream: + report["identities"][name]["sha256"] = hashlib.file_digest(stream, "sha256").hexdigest() + nodes, content_identity = input_inventory(input_path) + reference = read_reference(reference_path) + result, evidence = read_results(results_path, nodes, content_identity) + families = [] + for frame in range(FRAME_COUNT): + for quantity, first in (("U", 0), ("UR", 3)): + actual = [float(value) for row in result[frame] for value in row[first:first + 3]] + expected = [value for label in NODE_LABELS for value in reference[(frame, label)][first:first + 3]] + families.append(evaluate_family(frame, quantity, actual, expected)) + report["precheck"] = {"passed": True, "reference_row_count": len(reference), + "reference_frame_count": FRAME_COUNT, **evidence} + report["families"] = families + for family in families: + if family["passed"]: + continue + if family["impact"] == "blocking": + report["blocking_failures"].append(family["identity"]) + else: + if not family["rows_passed"]: + report["warnings"].append({"family": family["identity"], "code": "row-tolerance-failure"}) + if not family["rms_passed"]: + report["warnings"].append({"family": family["identity"], "code": "relative-rms-failure"}) + report["blocking_passed"] = not report["blocking_failures"] + report["verdict"] = "passed" if report["blocking_passed"] else "failed" + except (ComparisonError, OSError, ValueError, InvalidOperation, UnicodeError) as error: + report["precheck"] = {"passed": False, "code": getattr(error, "code", "invalid-comparison-input"), + "message": str(error)} + return report + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--input", type=Path, default=REFERENCE_DIRECTORY / f"{CASE}.inp") + parser.add_argument("--reference", type=Path, default=REFERENCE_DIRECTORY / f"{CASE} displacements.csv") + parser.add_argument("--results", type=Path) + parser.add_argument("--report", type=Path, required=True) + args = parser.parse_args() + results = args.results or args.input.with_name(args.input.stem + "_results.h5") + if args.report.resolve() in {args.input.resolve(), args.reference.resolve(), results.resolve()}: + parser.error("The report path must not overwrite an input, reference, or solver result.") + report = compare(args.input, args.reference, results) + args.report.parent.mkdir(parents=True, exist_ok=True) + args.report.write_text(json.dumps(report, indent=2, sort_keys=True, allow_nan=False) + "\n", encoding="utf-8") + print(json.dumps({"verdict": report["verdict"], "precheck": report["precheck"], + "blocking_failure_count": len(report["blocking_failures"]), + "warning_count": len(report["warnings"]), "report": str(args.report)}, allow_nan=False)) + return 2 if not report["precheck"]["passed"] else (0 if report["blocking_passed"] else 1) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/fesa/AGENTS.md b/src/fesa/AGENTS.md index 9ec337b..a7de096 100644 --- a/src/fesa/AGENTS.md +++ b/src/fesa/AGENTS.md @@ -3,7 +3,7 @@ 이 영역은 fesa_solver와 fesa_cli의 production 구현을 소유한다. Public interface와 vendor resource 사이의 구현 책임을 유지하며 테스트 실행기나 문서 workflow를 solver에 연결하지 않는다. -- CMake target에 새 source와 필요한 private dependency를 명시한다. Link 성공뿐 아니라 +- 직접 MSVC 프로젝트와 대응 CMake target에 같은 source와 필요한 private dependency를 명시한다. Link 성공뿐 아니라 Windows runtime staging의 영향을 확인한다. - Public consumer가 implementation header를 include하도록 경로를 공개하지 않는다. MKL·TBB·HDF5·Win32는 private adapter 뒤에 둔다. diff --git a/src/fesa/CMakeLists.txt b/src/fesa/CMakeLists.txt index 7677679..475748b 100644 --- a/src/fesa/CMakeLists.txt +++ b/src/fesa/CMakeLists.txt @@ -41,6 +41,7 @@ add_library( core/ascii.cpp core/diagnostic.cpp core/status.cpp + elements/element_capabilities.cpp elements/element_factory.cpp elements/hex8_element.cpp elements/hex8_high_low.cpp @@ -93,12 +94,14 @@ add_library( results/analysis_state_commit.cpp results/beam_result_recovery.cpp results/global_equilibrium_recovery.cpp + results/prepared_results_writer.cpp results/recovery_candidate.cpp results/result_recovery.cpp results/shell_result_recovery.cpp solvers/eigen/mkl_feast_eigen_solver.cpp solvers/linear/mkl_pardiso_solver.cpp solvers/linear/mkl_pardiso_tangent_solver.cpp + solvers/linear/pardiso_session.cpp ) target_include_directories( diff --git a/src/fesa/analysis/AGENTS.md b/src/fesa/analysis/AGENTS.md index 729e026..1135e0b 100644 --- a/src/fesa/analysis/AGENTS.md +++ b/src/fesa/analysis/AGENTS.md @@ -14,3 +14,9 @@ Analysis는 준비된 Domain을 procedure별로 실행하고 equation·backend· - Frequency reduction은 null/finite 공간과 공개 mode 수·내부 검증 수를 구분한다. - 초기화, nonzero BC, all-constrained, 증분·반복 종료 경계, 실패 보존, temporal convergence, 반복 결정론과 backend failure를 검증한다. 한 reference의 U 일치로 모든 physics를 통과시키지 않는다. + +- 공통 AnalysisProcedure 선택과 family별 typed outcome을 유지한다. EquilibriumAlgorithm은 + iteration만 조정하고 typed candidate는 procedure-local EquilibriumStep이 소유한다. + Static1/HHT0 시작·inclusive endpoint와 실패 보존을 유지한다. +- ShellHhtIntegrator는 predictor/rate 복원만 담당한다. Chart/root/solver/callback은 borrowed + call view이며 출력 rate buffer는 입력·서로와 alias하지 않는다. Accepted history는 소유하지 않는다. diff --git a/src/fesa/analysis/analysis_procedures.h b/src/fesa/analysis/analysis_procedures.h new file mode 100644 index 0000000..96f075e --- /dev/null +++ b/src/fesa/analysis/analysis_procedures.h @@ -0,0 +1,170 @@ +#ifndef FESA_ANALYSIS_ANALYSIS_PROCEDURES_H_ +#define FESA_ANALYSIS_ANALYSIS_PROCEDURES_H_ + +#include "fesa/analysis/analysis_procedure.h" +#include "fesa/analysis/hht_dynamic_procedure.h" +#include "fesa/analysis/linear_frequency_procedure.h" +#include "fesa/analysis/linear_static_procedure.h" +#include "fesa/analysis/nonlinear_static_procedure.h" +#include "fesa/analysis/prepared_analysis_outcome.h" +#include "fesa/analysis/solid_frequency_procedure.h" +#include "fesa/analysis/solid_hht_dynamic_procedure.h" +#include "fesa/analysis/solid_static_procedure.h" +#include "fesa/analysis/transient_heat_procedure.h" + +namespace fesa { + +class EigenSolver; + +/// @brief Adapts the LinearStatic lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class LinearStaticProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + LinearStaticProcedure(const ParallelFor& parallel_for, + LinearSolver& linear_solver) + : executor_(parallel_for, linear_solver) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit LinearStaticProcedure(LinearStaticProcedureExecutor executor) + : executor_(executor) {} + Result Execute(const Domain& domain) override; + + private: + LinearStaticProcedureExecutor executor_; +}; + +/// @brief Adapts the NonlinearStatic lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class NonlinearStaticProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + NonlinearStaticProcedure(const ParallelFor& parallel_for, + TangentSolver& tangent_solver, + NewtonIterationLogWriter& log) + : executor_(parallel_for, tangent_solver), log_(log) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit NonlinearStaticProcedure(NonlinearStaticProcedureExecutor executor, + NewtonIterationLogWriter& log) + : executor_(executor), log_(log) {} + Result Execute(const Domain& domain) override; + + private: + NonlinearStaticProcedureExecutor executor_; + NewtonIterationLogWriter& log_; +}; + +/// @brief Adapts the LinearFrequency lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class LinearFrequencyProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + LinearFrequencyProcedure(const EigenSolver& eigen_solver) + : executor_(eigen_solver) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit LinearFrequencyProcedure(LinearFrequencyProcedureExecutor executor) + : executor_(executor) {} + Result Execute(const Domain& domain) override; + + private: + LinearFrequencyProcedureExecutor executor_; +}; + +/// @brief Adapts the HhtDynamic lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class HhtDynamicProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + HhtDynamicProcedure(const ParallelFor& parallel_for, + LinearSolver& positive_solver, + TangentSolver& tangent_solver, + NewtonIterationLogWriter& log) + : executor_(parallel_for, positive_solver, tangent_solver), log_(log) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit HhtDynamicProcedure(HhtDynamicProcedureExecutor executor, + NewtonIterationLogWriter& log) + : executor_(executor), log_(log) {} + Result Execute(const Domain& domain) override; + + private: + HhtDynamicProcedureExecutor executor_; + NewtonIterationLogWriter& log_; +}; + +/// @brief Adapts the SolidStatic lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class SolidStaticProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + SolidStaticProcedure(const ParallelFor& parallel_for, + LinearSolver& linear_solver, + TangentSolver& tangent_solver, + NewtonIterationLogWriter& log) + : executor_(parallel_for, linear_solver, tangent_solver), log_(log) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit SolidStaticProcedure(SolidStaticProcedureExecutor executor, + NewtonIterationLogWriter& log) + : executor_(executor), log_(log) {} + Result Execute(const Domain& domain) override; + + private: + SolidStaticProcedureExecutor executor_; + NewtonIterationLogWriter& log_; +}; + +/// @brief Adapts the SolidFrequency lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class SolidFrequencyProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + SolidFrequencyProcedure(const EigenSolver& eigen_solver) + : executor_(eigen_solver) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit SolidFrequencyProcedure(SolidFrequencyProcedureExecutor executor) + : executor_(executor) {} + Result Execute(const Domain& domain) override; + + private: + SolidFrequencyProcedureExecutor executor_; +}; + +/// @brief Adapts the SolidHhtDynamic lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class SolidHhtDynamicProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + SolidHhtDynamicProcedure(const ParallelFor& parallel_for, + LinearSolver& positive_solver, + TangentSolver& tangent_solver, + NewtonIterationLogWriter& log) + : executor_(parallel_for, positive_solver, tangent_solver), log_(log) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit SolidHhtDynamicProcedure(SolidHhtDynamicProcedureExecutor executor, + NewtonIterationLogWriter& log) + : executor_(executor), log_(log) {} + Result Execute(const Domain& domain) override; + + private: + SolidHhtDynamicProcedureExecutor executor_; + NewtonIterationLogWriter& log_; +}; + +/// @brief Adapts the TransientHeat lifecycle to prepared execution. +/// @note Referenced backend and log adapters must outlive this procedure. +class TransientHeatProcedure final : public AnalysisProcedure { + public: + /// @brief Injects only the adapters required by this family. + TransientHeatProcedure(const ParallelFor& parallel_for, + LinearSolver& linear_solver) + : executor_(parallel_for, linear_solver) {} + /// @brief Retains compatibility with an already configured typed executor. + explicit TransientHeatProcedure(TransientHeatProcedureExecutor executor) + : executor_(executor) {} + Result Execute(const Domain& domain) override; + + private: + TransientHeatProcedureExecutor executor_; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_ANALYSIS_PROCEDURES_H_ diff --git a/src/fesa/analysis/analysis_state.cpp b/src/fesa/analysis/analysis_state.cpp index eb82384..786be82 100644 --- a/src/fesa/analysis/analysis_state.cpp +++ b/src/fesa/analysis/analysis_state.cpp @@ -7,9 +7,15 @@ #include #include +#include "fesa/fem/dof_manager.h" +#include "math/finite_values.h" +#include "results/shell_result_recovery.h" + namespace fesa { namespace { +using math_internal::IsFinite; + constexpr std::size_t kShellLocationsPerElement = 4U; /// @brief Creates a structured failure without mutating existing state. @@ -21,31 +27,6 @@ Status ShellCandidateFailure(const std::string& code, {{Severity::kError, code, {}, "ANALYSIS_STATE", identity, message}}); } -template -/// @brief Tests one fixed-size candidate component array for finite values. -bool IsFinite(const std::array& values) { - return std::all_of(values.begin(), values.end(), - [](const double value) { return std::isfinite(value); }); -} - -/// @brief Tests every physical shell row component for finite values. -bool IsFinite(const ShellResultRow& row) { - if (!IsFinite(row.natural_coordinates) || !IsFinite(row.generalized_strain) || - !IsFinite(row.section_resultant)) { - return false; - } - for (const auto& axis : row.local_frame) { - if (!IsFinite(axis)) { - return false; - } - } - return std::all_of(row.stress.begin(), row.stress.end(), - [](const ShellSectionStressRow& stress) { - return std::isfinite(stress.zeta) && - IsFinite(stress.components); - }); -} - } // namespace AnalysisState AnalysisState::Create(const DofManager& dofs, @@ -170,7 +151,7 @@ Status AnalysisState::CommitShellResults( "Shell stress rows require BOTTOM, MIDDLE, TOP identity."); } } - if (!IsFinite(row)) { + if (!results_internal::IsFiniteShellRow(row)) { return ShellCandidateFailure( "nonfinite-shell-state-value", std::to_string(row.element), "Shell result rows must contain only finite values."); diff --git a/src/fesa/analysis/dynamic_analysis_state.cpp b/src/fesa/analysis/dynamic_analysis_state.cpp index b494aa2..3e374c0 100644 --- a/src/fesa/analysis/dynamic_analysis_state.cpp +++ b/src/fesa/analysis/dynamic_analysis_state.cpp @@ -1,18 +1,24 @@ #include "fesa/analysis/dynamic_analysis_state.h" -#include #include #include #include #include #include +#include "fesa/core/source_identity.h" #include "fesa/elements/element_definition.h" #include "fesa/elements/finite_rotation.h" +#include "math/finite_values.h" +#include "results/shell_result_recovery.h" +#include "analysis/shell_state_inventory.h" namespace fesa { namespace { +using analysis_internal::ShellElementOrder; +using math_internal::IsFinite; + constexpr std::size_t kDofsPerNode = 6U; constexpr std::size_t kAngularDofsPerNode = 3U; constexpr std::size_t kShellLocationsPerElement = 4U; @@ -28,59 +34,6 @@ Status Failure(const FailureCategory category, const std::string& message) { message}}); } -/// @brief Compares canonical and raw source identity exactly. -bool SameId(const SourceEntityId& left, const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; -} - -/// @brief Checks all components of one fixed-size physical record. -template -bool IsFinite(const std::array& values) { - return std::all_of(values.begin(), values.end(), - [](double value) { return std::isfinite(value); }); -} - -/// @brief Checks every vector component before state acceptance. -bool IsFinite(const Vector& values) { - for (std::size_t index = 0U; index < values.Size(); ++index) { - if (!std::isfinite(values[index])) { - return false; - } - } - return true; -} - -/// @brief Checks all physical recovery quantities for finite values. -bool IsFinite(const ShellResultRow& row) { - if (!IsFinite(row.natural_coordinates) || !IsFinite(row.generalized_strain) || - !IsFinite(row.section_resultant)) { - return false; - } - for (const auto& axis : row.local_frame) { - if (!IsFinite(axis)) { - return false; - } - } - return std::all_of(row.stress.begin(), row.stress.end(), - [](const ShellSectionStressRow& stress) { - return std::isfinite(stress.zeta) && - IsFinite(stress.components); - }); -} - -/// @brief Collects stable Domain indices for recovery identity. -std::vector ShellElementOrder(const Domain& domain) { - std::vector order; - for (std::size_t index = 0U; index < domain.Elements().Size(); ++index) { - if (domain.Elements()[index].Kind() == ElementDefinitionKind::kMitc4Shell) { - order.push_back(static_cast(index)); - } - } - return order; -} - /// @brief Requires complete ordered Gauss and section-position rows. Status ValidateShellRows(const DynamicAcceptedFrameState& frame, const std::vector& shell_order) { @@ -110,7 +63,7 @@ Status ValidateShellRows(const DynamicAcceptedFrameState& frame, frame.shell_results[element * kShellLocationsPerElement + point]; if (row.element != shell_order[element] || row.location != kLocations[point] || - row.natural_coordinates != natural[point] || !IsFinite(row)) { + row.natural_coordinates != natural[point] || !results_internal::IsFiniteShellRow(row)) { return Failure(FailureCategory::kSolver, "Shell recovery rows have invalid identity or values."); } @@ -228,7 +181,7 @@ Status DynamicAnalysisState::CommitAcceptedFrame( } for (std::size_t node = 0U; node < node_count; ++node) { if (frame.nodal_internal_order[node] != node || - !SameId(frame.nodal_source_ids[node], nodal_source_ids_[node]) || + !SourceIdentityEquals(frame.nodal_source_ids[node], nodal_source_ids_[node]) || !IsFinite(frame.nodal_triad[node][0U]) || !IsFinite(frame.nodal_triad[node][1U]) || !IsFinite(frame.nodal_triad[node][2U]) || diff --git a/src/fesa/analysis/eigen_reduction.cpp b/src/fesa/analysis/eigen_reduction.cpp index 2b172e4..a7e7a0d 100644 --- a/src/fesa/analysis/eigen_reduction.cpp +++ b/src/fesa/analysis/eigen_reduction.cpp @@ -162,54 +162,49 @@ Result MakeLift(const Matrix& mass, Failure("eigen-mass-conditioning", node, "A positive-space mass pivot is not resolvable.")); } - Matrix lower(positive, positive); - Matrix inverse_lower(positive, positive); - if (!dense_blas_internal::CholeskyLowerAndInverse(normalized_mp, lower, - inverse_lower)) { + const auto factor = dense_blas_internal::DenseFactor::Cholesky(normalized_mp); + if (!factor.HasValue()) { return Result::Failure( Failure("eigen-mass-conditioning", node, "A positive-space mass pivot is not resolvable.")); } + const Matrix lower = std::move(factor.Value().Lower().Value()); Matrix transposed_lower(positive, positive); - Matrix scaled_inverse_transpose(positive, positive); - const double root_scale = std::sqrt(scale); for (std::size_t i = 0; i < positive; ++i) - for (std::size_t j = 0; j < positive; ++j) { + for (std::size_t j = 0; j < positive; ++j) transposed_lower(i, j) = lower(j, i); - scaled_inverse_transpose(i, j) = inverse_lower(j, i) / root_scale; - } - const auto inverse_mass = dense_blas_internal::MultiplyTransposeLeft( - inverse_lower, inverse_lower); + const auto condition = factor.Value().ReciprocalConditionInfinity(); const auto rebuilt_mass = lower.Multiply(transposed_lower); - double norm_mp = 0.0; - double norm_inverse = 0.0; double reconstruction = 0.0; double scaled_mass_norm = 0.0; double rebuilt_mass_norm = 0.0; for (std::size_t i = 0; i < positive; ++i) { - double row_mp = 0.0; - double row_inverse = 0.0; for (std::size_t j = 0; j < positive; ++j) { - const double inverse = inverse_mass(i, j); const double rebuilt = rebuilt_mass(i, j); - row_inverse += std::abs(inverse); - row_mp += std::abs(mp(i, j) / scale); reconstruction = std::hypot(reconstruction, rebuilt - mp(i, j) / scale); scaled_mass_norm = std::hypot(scaled_mass_norm, mp(i, j) / scale); rebuilt_mass_norm = std::hypot(rebuilt_mass_norm, rebuilt); } - norm_mp = (std::max)(norm_mp, row_mp); - norm_inverse = (std::max)(norm_inverse, row_inverse); } - result.record.rcond_inf = (1.0 / norm_mp) / norm_inverse; - if (!(result.record.rcond_inf >= kConditionLimit) || + if (!condition.HasValue() || !(condition.Value() >= kConditionLimit) || !(Ratio(reconstruction, scaled_mass_norm + rebuilt_mass_norm) <= kAlgebraLimit)) { return Result::Failure(Failure( "eigen-mass-conditioning", node, "Nodal mass fails rcond_inf >= 2^-32 or Cholesky reconstruction.")); } - result.scaled_lift = basis.Multiply(scaled_inverse_transpose); + result.record.rcond_inf = condition.Value(); + // X L^T = basis/sqrt(scale), so X^T M_scaled X = I. + Matrix scaled_basis = basis; + const double root_scale = std::sqrt(scale); + for (std::size_t c = 0; c < 6U; ++c) + for (std::size_t j = 0; j < positive; ++j) + scaled_basis(c, j) /= root_scale; + auto whitened = factor.Value().SolveLowerRight(scaled_basis, true); + if (!whitened.HasValue()) + return Result::Failure(Failure( + "eigen-mass-conditioning", node, "Nodal whitening is nonfinite.")); + result.scaled_lift = std::move(whitened.Value()); for (std::size_t c = 0; c < 6U; ++c) { for (std::size_t j = 0; j < positive; ++j) { if (!std::isfinite(result.scaled_lift(c, j))) { diff --git a/src/fesa/analysis/equilibrium_algorithm.h b/src/fesa/analysis/equilibrium_algorithm.h new file mode 100644 index 0000000..b50d492 --- /dev/null +++ b/src/fesa/analysis/equilibrium_algorithm.h @@ -0,0 +1,86 @@ +#ifndef FESA_ANALYSIS_EQUILIBRIUM_ALGORITHM_H_ +#define FESA_ANALYSIS_EQUILIBRIUM_ALGORITHM_H_ + +#include +#include +#include +#include + +#include "fesa/core/status.h" + +namespace fesa { + +/// @brief Controls evaluated iteration order without owning a family candidate. +/// @note Evaluation and its referenced trial context remain alive and unmoved +/// throughout this call. A successful evaluation value means candidate ready. +class EquilibriumAlgorithm { + public: + using Evaluation = std::function(std::uint32_t)>; + virtual ~EquilibriumAlgorithm() = default; + virtual Status SolveCurrentStep(std::uint32_t first, std::uint32_t last, + const Evaluation& evaluate) = 0; +}; + +/// @brief Preserves the original inclusive full-Newton evaluation sequence. +class NewtonStepAlgorithm final : public EquilibriumAlgorithm { + public: + Status SolveCurrentStep(std::uint32_t first, std::uint32_t last, + const Evaluation& evaluate) override { + for (std::uint32_t iteration = first; iteration <= last; ++iteration) { + auto result = evaluate(iteration); + if (!result.HasValue()) return result.GetStatus(); + if (result.Value()) return Status::Ok(); + } + // Family evaluators retain their original final-evaluation failure. + return Status::Ok(); + } +}; + +/// @brief Owns one procedure-local typed evaluator and unpublished candidate. +/// @note This value is not an algorithm interface. The injected algorithm never +/// owns or type-erases Candidate, and neither callback nor context may escape. +template +class EquilibriumStep { + public: + using Evaluation = + std::function>(std::uint32_t)>; + EquilibriumStep(Evaluation evaluate, std::uint32_t maximum) + : evaluate_(std::move(evaluate)), maximum_(maximum) {} + EquilibriumStep(const EquilibriumStep&) = delete; + EquilibriumStep& operator=(const EquilibriumStep&) = delete; + Status Solve(EquilibriumAlgorithm& algorithm) { + const EquilibriumAlgorithm::Evaluation evaluate = + [this](std::uint32_t iteration) -> Result { + auto result = evaluate_(iteration); + if (!result.HasValue()) return Result::Failure(result.GetStatus()); + if (result.Value().has_value()) { + pending_ = std::move(result.Value()); + return Result::Success(true); + } + return Result::Success(false); + }; + return algorithm.SolveCurrentStep(kFirstIteration, maximum_, evaluate); + } + bool HasCandidate() const { return pending_.has_value(); } + /// @brief Transfers the validated candidate to the procedure commit boundary. + Candidate TakeCandidate() { return std::move(pending_.value()); } + + private: + Evaluation evaluate_; + std::uint32_t maximum_; + std::optional pending_; +}; + +// Static evaluations start at one; mechanical HHT corrections start at zero. +// Evaluation at the maximum still performs the existing endpoint validation. +template +using ShellFullNewtonStep = EquilibriumStep; +template +using SolidFullNewtonStep = EquilibriumStep; +template +using ReducedShellHhtStep = EquilibriumStep; +template +using SolidHhtStep = EquilibriumStep; + +} // namespace fesa +#endif // FESA_ANALYSIS_EQUILIBRIUM_ALGORITHM_H_ diff --git a/src/fesa/analysis/hht_dynamic_algebra.cpp b/src/fesa/analysis/hht_dynamic_algebra.cpp index 45745fb..09d6803 100644 --- a/src/fesa/analysis/hht_dynamic_algebra.cpp +++ b/src/fesa/analysis/hht_dynamic_algebra.cpp @@ -16,11 +16,14 @@ #include "fesa/solvers/linear/linear_solver.h" #include "fesa/solvers/linear/tangent_solver.h" #include "math/dense_blas_internal.h" +#include "math/compensated_sum.h" namespace fesa { namespace hht_internal { namespace { +using math_internal::AddCompensated; + /// @brief Attaches a fail-closed dynamic diagnostic to the source model. Status Failure(const Domain& domain, const std::string& code, const std::string& message) { @@ -148,48 +151,23 @@ Status CheckLocalMass(const Domain& domain, const SparseMatrix& matrix, return Failure(domain, "dynamic-positive-mass", "A nonempty physical mass block has no positive scale."); } - double norm = 0.0; - for (std::size_t i = 0; i < size; ++i) { - double sum = 0.0; - for (std::size_t j = 0; j < size; ++j) { - block(i, j) /= scale; - sum += std::abs(block(i, j)); - } - norm = std::max(norm, sum); - } - Matrix lower{size, size}; - Matrix inverse_lower{size, size}; - auto factor_failure = dense_blas_internal::CholeskyFailure::kNone; + for (std::size_t i = 0; i < size; ++i) + for (std::size_t j = 0; j < size; ++j) block(i, j) /= scale; try { - if (!dense_blas_internal::CholeskyLowerAndInverse( - block, lower, inverse_lower, &factor_failure)) { - if (factor_failure == dense_blas_internal::CholeskyFailure::kInverse) - return Failure( - domain, "dynamic-positive-mass-conditioning", - "A nodal free physical block reciprocal condition is below 2^-32."); + const auto factor = dense_blas_internal::DenseFactor::Cholesky(block); + if (!factor.HasValue()) return Failure( domain, "dynamic-positive-mass", "Physical mass requires strictly positive Cholesky pivots."); - } + const auto rcond = factor.Value().ReciprocalConditionInfinity(); + if (!rcond.HasValue() || !std::isfinite(rcond.Value()) || + !(rcond.Value() >= std::ldexp(1.0, -32))) + return Failure( + domain, "dynamic-positive-mass-conditioning", + "A nodal free physical block reciprocal condition is below 2^-32."); } catch (const std::exception& error) { return Failure(domain, "dynamic-positive-mass", error.what()); } - const Matrix inverse = - dense_blas_internal::MultiplyTransposeLeft(inverse_lower, inverse_lower); - std::array sums{}; - for (std::size_t column = 0; column < size; ++column) { - for (std::size_t i = 0; i < size; ++i) { - sums[i] += std::abs(inverse(i, column)); - } - } - const double inverse_norm = *std::max_element(sums.begin(), sums.end()); - const double rcond = 1.0 / norm / inverse_norm; - if (!std::isfinite(inverse_norm) || !std::isfinite(rcond) || - !(rcond >= std::ldexp(1.0, -32))) { - return Failure( - domain, "dynamic-positive-mass-conditioning", - "A nodal free physical block reciprocal condition is below 2^-32."); - } return Status::Ok(); } @@ -468,15 +446,6 @@ Result ConstraintGradient(const DynamicAssembly& assembly, std::move(entries)); } -/// @brief Accumulates one deterministic sparse contraction without lost sums. -void AddCompensated(const double term, double* sum, double* correction) { - const double next = *sum + term; - *correction += std::abs(*sum) >= std::abs(term) - ? (*sum - next) + term - : (term - next) + *sum; - *sum = next; -} - /// @brief Stores W-scaled regularity with exact inverse-action infinity norms. struct Regularity { SparseMatrix matrix; @@ -553,23 +522,10 @@ Result CheckRegularity(const Domain& domain, sum += std::abs(matrix.Value().Values()[index]); norm = std::max(norm, sum); } - Vector inverse_sums{nodes.size()}; - // Columns are discarded after their absolute row sums are accumulated; - // a global dense inverse is never retained. - for (std::size_t column = 0; column < nodes.size(); ++column) { - Vector rhs{nodes.size()}; - rhs[column] = 1.0; - Vector solution{nodes.size()}; - const Status solved = solver.SolveCorrection(rhs, solution); - if (!solved.IsOk()) return Result::Failure(solved); - const Status checked = CheckLinearSolve(matrix.Value(), rhs, solution); - if (!checked.IsOk()) return Result::Failure(checked); - for (std::size_t row = 0; row < nodes.size(); ++row) - inverse_sums[row] += std::abs(solution[row]); - } double inverse_norm = 0.0; - for (std::size_t row = 0; row < nodes.size(); ++row) - inverse_norm = std::max(inverse_norm, inverse_sums[row]); + const Status accumulated = + AccumulateCheckedCanonicalNorm(matrix.Value(), solver, inverse_norm); + if (!accumulated.IsOk()) return Result::Failure(accumulated); const double condition = 1.0 / norm / inverse_norm; if (!std::isfinite(norm) || !std::isfinite(inverse_norm) || !std::isfinite(condition) || !(condition >= std::ldexp(1.0, -32))) { @@ -662,6 +618,26 @@ Status HiddenEvidence(const Domain& domain, const DynamicAssembly& assembly, } // namespace +Status AccumulateCheckedCanonicalNorm(const SparseMatrix& matrix, + TangentSolver& solver, double& norm) { + const auto size = matrix.Rows(); + Vector row_sums{size}; + for (std::size_t column = 0U; column < size; ++column) { + Vector rhs{size}; + rhs[column] = 1.0; + Vector solution{size}; + const Status solved = solver.SolveCorrection(rhs, solution); + if (!solved.IsOk()) return solved; + const Status checked = CheckLinearSolve(matrix, rhs, solution); + if (!checked.IsOk()) return checked; + for (std::size_t row = 0U; row < size; ++row) + row_sums[row] += std::abs(solution[row]); + } + for (std::size_t row = 0U; row < size; ++row) + norm = (std::max)(norm, row_sums[row]); + return Status::Ok(); +} + double OrderedNullMetric(const SparseMatrix& metric, const std::size_t node, const Vector3& direction) { Vector left{9U}; diff --git a/src/fesa/analysis/hht_dynamic_assembly.cpp b/src/fesa/analysis/hht_dynamic_assembly.cpp index bc60030..17012ab 100644 --- a/src/fesa/analysis/hht_dynamic_assembly.cpp +++ b/src/fesa/analysis/hht_dynamic_assembly.cpp @@ -151,9 +151,24 @@ Result> BuildRuntimeShells(const Domain& domain, *material, density); if (!inertia.HasValue()) return Result>::Failure(inertia.GetStatus()); - shells.push_back({static_cast(index), - dofs.ShellElementScatter(static_cast(index)), - std::move(internal.Value()), std::move(inertia.Value())}); + auto internal_kernel = + std::make_unique(std::move(internal.Value())); + auto inertia_kernel = + std::make_unique(std::move(inertia.Value())); + ElementDofLayout layout{ + definition->SourceId(), definition->NodeIndices(), + {DofComponent::kUx, DofComponent::kUy, DofComponent::kUz, + DofComponent::kUrx, DofComponent::kUry, DofComponent::kUrz}}; + auto trial = std::make_unique(layout, *internal_kernel); + auto kinetic = std::make_unique(layout, *inertia_kernel); + auto mapped = dofs.ElementScatter(kinetic->DofLayout()); + if (!mapped.HasValue()) + return Result>::Failure(mapped.GetStatus()); + std::array scatter{}; + std::copy(mapped.Value().begin(), mapped.Value().end(), scatter.begin()); + shells.push_back({static_cast(index), scatter, + std::move(internal_kernel), std::move(inertia_kernel), + std::move(trial), std::move(kinetic)}); } return Result>::Success(std::move(shells)); } @@ -431,8 +446,8 @@ Result EvaluateAssembly( } const auto before = retain_constraints ? ReadTrialEvaluationContext() : TrialEvaluationContext{}; - auto f = EvaluateInternalResidualAndTangent( - shells[e].internal, trial, directional_third ? &v : nullptr); + auto f = shells[e].internal->EvaluateTrial( + trial, directional_third ? &v : nullptr); if (!f.HasValue()) { failures[e] = f.GetStatus(); return; @@ -441,7 +456,7 @@ Result EvaluateAssembly( const auto after = ReadTrialEvaluationContext(); if (ReusableTrialContext(before, after)) evaluation_contexts[e] = after; } - auto m = shells[e].inertia.Evaluate(trial, v, a); + auto m = shells[e].inertia->Evaluate(trial, v, a); if (!m.HasValue()) { failures[e] = m.GetStatus(); return; @@ -499,7 +514,7 @@ Result EvaluateAssembly( external_done[node] = true; const auto first = 6U * node + 3U; const auto external = - shells[e].internal.EvaluateExternalDrillingConstraint( + shells[e].internal->EvaluateExternalDrillingConstraint( local, Triple(frame.generalized_coordinates, first), Triple(frame.velocity, first), Triple(frame.external_force, first), {}, {}); @@ -660,7 +675,7 @@ Result EvaluateAssembly( record.scatter = shells[e].scatter; record.configuration = nonlinear_mitc4_internal::ConfigurationSnapshot::Read( - shells[e].internal); + *shells[e].internal_kernel); record.evaluation_context = evaluation_contexts[e]; for (std::size_t i = 0U; i < 24U; ++i) { record.q[i] = frame.generalized_coordinates[shells[e].scatter[i]]; @@ -703,11 +718,13 @@ Status CompleteEquilibrium(const Domain& domain, const DofManager& dofs, const auto first = 6U * node; const Vector3 arm = Vector3(domain.Nodes()[node].coordinates) + Triple(frame->generalized_coordinates, first); - const Matrix transform = InverseTransposeLeftJacobianSO3( - Triple(frame->generalized_coordinates, first + 3U)); + const Vector3 phi = Triple(frame->generalized_coordinates, first + 3U); for (const Vector* values : {&frame->external_force, &frame->reaction}) { const Vector3 force = Triple(*values, first); - const Vector3 moment = Transform(transform, Triple(*values, first + 3U)); + const auto spatial = SpatialMomentSO3(phi, Triple(*values, first + 3U)); + if (!spatial.HasValue()) + return Failure("Dynamic physical force or moment balance exceeds 1e-8."); + const Vector3 moment = spatial.Value(); total_force = total_force + force; total_moment = total_moment + arm.Cross(force) + moment; force_scale += force.Norm(); diff --git a/src/fesa/analysis/hht_dynamic_internal.h b/src/fesa/analysis/hht_dynamic_internal.h index c199e93..2911f41 100644 --- a/src/fesa/analysis/hht_dynamic_internal.h +++ b/src/fesa/analysis/hht_dynamic_internal.h @@ -4,11 +4,13 @@ #include #include #include +#include #include #include #include "fesa/analysis/dynamic_analysis_state.h" #include "fesa/analysis/hht_time_integration.h" +#include "fesa/elements/element_capabilities.h" #include "fesa/elements/nonlinear_mitc4_inertia.h" #include "fesa/elements/nonlinear_mitc4_shell.h" #include "fesa/math/sparse_matrix.h" @@ -25,8 +27,10 @@ namespace hht_internal { struct RuntimeShell { EntityIndex element_index; std::array scatter; - NonlinearMitc4Shell internal; - NonlinearMitc4Inertia inertia; + std::unique_ptr internal_kernel; + std::unique_ptr inertia_kernel; + std::unique_ptr internal; + std::unique_ptr inertia; }; /// @brief Captures only controls used by the current MSVC x64 local evaluator. @@ -138,6 +142,12 @@ Result ScaledFree(const SparseMatrix& matrix, Status CheckLinearSolve(const SparseMatrix& matrix, const Vector& rhs, const Vector& solution); +/// @brief Streams checked canonical solves into the caller's infinity norm. +/// @note The caller owns factorization and the initial norm. Each column is +/// discarded after ascending absolute row-sum accumulation; failures preserve norm. +Status AccumulateCheckedCanonicalNorm(const SparseMatrix& matrix, + TangentSolver& solver, double& norm); + /// @brief Finds analytic admissible node null directions without rank cuts. std::vector NullNodes( const DofManager& dofs, diff --git a/src/fesa/analysis/hht_reduced_integrator.h b/src/fesa/analysis/hht_reduced_integrator.h new file mode 100644 index 0000000..5e461a6 --- /dev/null +++ b/src/fesa/analysis/hht_reduced_integrator.h @@ -0,0 +1,74 @@ +#ifndef FESA_ANALYSIS_HHT_REDUCED_INTEGRATOR_H_ +#define FESA_ANALYSIS_HHT_REDUCED_INTEGRATOR_H_ +#include +#include "analysis/hht_reduced_internal.h" +namespace fesa::hht_reduced_internal { +struct ReducedHistory { + Vector p{0U}; + Vector velocity{0U}; + Vector acceleration{0U}; + Vector algorithmic_acceleration{0U}; + Vector z{0U}; +}; + +/// @brief Keeps every private predictor compensation channel before a trial. +struct ReducedShellPredictor { + Vector pp{0U}; + Vector vpp{0U}; + Vector coordinate_low{0U}; + Vector increment_trace{0U}; + Vector increment_trace_compensation{0U}; + Vector increment_trace_absolute_sum{0U}; +}; + +struct ReducedShellRateRequest { + const FixedChart& chart; + const ReducedHistory& history; + const Vector& trial_algorithmic; + const Vector& vpp; + bool copy_translation_rates; + const Vector& retained_velocity; + const Vector& retained_acceleration; + double h; + const HhtParameters& parameters; +}; + +struct ReducedShellTrialRates { + Vector velocity{0U}; + Vector acceleration{0U}; +}; + +/// @brief Handles private shell predictors and exact sparse rate +/// reconstruction. +/// @note Chart/root/solver are non-owning call views; no history is committed. +class ShellHhtIntegrator { +public: + virtual ~ShellHhtIntegrator() = default; + virtual ReducedShellPredictor + Predict(const ReducedHistory& history, double h, + const HhtParameters& parameters) const = 0; + /// @note Output buffers have history.p.Size() entries and do not alias any + /// request input or each other. The caller owns their allocation/lifetime. + virtual void EvaluateRates(const ReducedShellRateRequest& request, + Vector& velocity, Vector& acceleration) const = 0; + virtual Result + ReconstructPhysicalRates(const FixedChart& chart, const EmbeddingRoot& root, + const Vector& velocity, const Vector& acceleration, + TangentSolver& solver) const = 0; +}; + +/// @brief Sequences one private predictor, pending endpoint and commit. +/// @note Callables are synchronous borrowed views. They retain all original +/// evaluation/diagnostic/commit policy; no accepted history is owned here. +template +Status RunReducedHhtStep(const ShellHhtIntegrator& integrator, + const ReducedHistory& history, double h, + const HhtParameters& parameters, + Evaluate&& evaluate, Commit&& commit) { + auto predictor = integrator.Predict(history, h, parameters); + auto pending = evaluate(integrator, std::move(predictor)); + if (!pending.HasValue()) return pending.GetStatus(); + return commit(std::move(pending.Value())); +} +} // namespace fesa::hht_reduced_internal +#endif // FESA_ANALYSIS_HHT_REDUCED_INTEGRATOR_H_ diff --git a/src/fesa/analysis/hht_reduced_operators.cpp b/src/fesa/analysis/hht_reduced_operators.cpp index a34cb5a..4f0b94b 100644 --- a/src/fesa/analysis/hht_reduced_operators.cpp +++ b/src/fesa/analysis/hht_reduced_operators.cpp @@ -10,13 +10,18 @@ #include #include +#include "fesa/core/source_identity.h" #include "fesa/solvers/linear/tangent_solver.h" #include "math/dense_blas_internal.h" #include "math/high_low_arithmetic.h" +#include "math/finite_values.h" +#include "math/compensated_sum.h" namespace fesa::hht_reduced_internal { namespace { +using RateSum = math_internal::CompensatedSum; + Status Failure(const std::string& message, const std::string& code = "dynamic-invalid-state") { return Status::Failure(FailureCategory::kSolver, @@ -25,27 +30,9 @@ Status Failure(const std::string& message, } bool Finite(const Vector& values) { - for (std::size_t i = 0U; i < values.Size(); ++i) - if (!std::isfinite(values[i])) return false; - return true; + return math_internal::IsFinite(values); } -class RateSum { - public: - void Add(const double term) { - const double next = sum_ + term; - correction_ += std::abs(sum_) >= std::abs(term) - ? (sum_ - next) + term - : (term - next) + sum_; - sum_ = next; - } - double Value() const { return sum_ + correction_; } - - private: - double sum_ = 0.0; - double correction_ = 0.0; -}; - bool ExactlyEqual(const Vector& left, const Vector& right) { if (left.Size() != right.Size()) return false; for (std::size_t i = 0U; i < left.Size(); ++i) @@ -65,13 +52,6 @@ bool SameBits(const double left, const double right) { return std::memcmp(&left, &right, sizeof(double)) == 0; } -/// @brief Compares semantic and original source identity without object keys. -bool SameSource(const SourceEntityId& left, const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; -} - /// @brief Finds only the current complete directional response, otherwise miss. const hht_internal::DirectionalShellConstraintData* MatchingConstraints( const Domain& domain, const hht_internal::RuntimeShell& shell, @@ -98,7 +78,7 @@ const hht_internal::DirectionalShellConstraintData* MatchingConstraints( hht_internal::ReadTrialEvaluationContext())) return nullptr; const auto configuration = - nonlinear_mitc4_internal::ConfigurationSnapshot::Read(shell.internal); + nonlinear_mitc4_internal::ConfigurationSnapshot::Read(*shell.internal_kernel); if (record.configuration.source.file != configuration.source.file || record.configuration.source.line != configuration.source.line || record.configuration.identity != configuration.identity) @@ -116,7 +96,7 @@ const hht_internal::DirectionalShellConstraintData* MatchingConstraints( for (std::size_t node = 0U; node < 4U; ++node) { const auto global_node = shell.scatter[6U * node] / 6U; if (global_node >= domain.Nodes().size() || - !SameSource(record.node_source_ids[node], + !SourceIdentityEquals(record.node_source_ids[node], domain.Nodes()[global_node].source_id)) return nullptr; } @@ -534,7 +514,7 @@ Result EvaluateConstraintOperators( std::optional fresh; if (saved == nullptr) { auto internal = - EvaluateInternalResidualAndTangent(shell.internal, Trial(q), &v); + shell.internal->EvaluateTrial(Trial(q), &v); if (!internal.HasValue()) return Result::Failure(internal.GetStatus()); fresh = std::move(internal.Value()); @@ -572,7 +552,7 @@ Result EvaluateConstraintOperators( if (external_done[global_node]) continue; external_done[global_node] = true; const auto first = 6U * global_node + 3U; - const auto external = shell.internal.EvaluateExternalDrillingConstraint( + const auto external = shell.internal->EvaluateExternalDrillingConstraint( local_node, Vector3{q[6U * local_node + 3U], q[6U * local_node + 4U], q[6U * local_node + 5U]}, @@ -587,7 +567,7 @@ Result EvaluateConstraintOperators( force_acceleration[first + 2U]}); if (!external.HasValue()) return Result::Failure(external.GetStatus()); - const auto rate_term = shell.internal.EvaluateExternalDrillingConstraint( + const auto rate_term = shell.internal->EvaluateExternalDrillingConstraint( local_node, Vector3{q[6U * local_node + 3U], q[6U * local_node + 4U], q[6U * local_node + 5U]}, @@ -596,7 +576,7 @@ Result EvaluateConstraintOperators( if (!rate_term.HasValue()) return Result::Failure(rate_term.GetStatus()); const auto acceleration_term = - shell.internal.EvaluateExternalDrillingConstraint( + shell.internal->EvaluateExternalDrillingConstraint( local_node, Vector3{q[6U * local_node + 3U], q[6U * local_node + 4U], q[6U * local_node + 5U]}, @@ -1321,21 +1301,10 @@ Result CheckGraphRegularity( if (!sparse.HasValue()) return Result::Failure(sparse.GetStatus()); Status status = solver.FactorizeFresh(sparse.Value()); if (!status.IsOk()) return Result::Failure(status); - Vector inverse_sums{size}; - for (std::size_t column = 0U; column < size; ++column) { - Vector rhs{size}; - rhs[column] = 1.0; - Vector solution{size}; - status = solver.SolveCorrection(rhs, solution); - if (!status.IsOk()) return Result::Failure(status); - status = hht_internal::CheckLinearSolve(sparse.Value(), rhs, solution); - if (!status.IsOk()) return Result::Failure(status); - for (std::size_t row = 0U; row < size; ++row) - inverse_sums[row] += std::abs(solution[row]); - } double inverse_norm = 0.0; - for (std::size_t row = 0U; row < size; ++row) - inverse_norm = std::max(inverse_norm, inverse_sums[row]); + status = hht_internal::AccumulateCheckedCanonicalNorm( + sparse.Value(), solver, inverse_norm); + if (!status.IsOk()) return Result::Failure(status); const double condition = 1.0 / norm / inverse_norm; if (!std::isfinite(norm) || !std::isfinite(inverse_norm) || !std::isfinite(condition) || !(condition >= std::ldexp(1.0, -32))) { @@ -1409,20 +1378,9 @@ Result CheckSelectorTransversality( if (!sparse.HasValue()) return Result::Failure(sparse.GetStatus()); auto status = solver.FactorizeFresh(sparse.Value()); if (!status.IsOk()) return Result::Failure(status); - Vector inverse_rows{rows.size()}; - for (std::size_t column = 0U; column < rows.size(); ++column) { - Vector rhs{rows.size()}; - rhs[column] = 1.0; - Vector solution{rows.size()}; - status = solver.SolveCorrection(rhs, solution); - if (!status.IsOk()) return Result::Failure(status); - status = hht_internal::CheckLinearSolve(sparse.Value(), rhs, solution); - if (!status.IsOk()) return Result::Failure(status); - for (std::size_t row = 0U; row < rows.size(); ++row) - inverse_rows[row] += std::abs(solution[row]); - } - for (std::size_t row = 0U; row < rows.size(); ++row) - inverse_norm = (std::max)(inverse_norm, inverse_rows[row]); + status = hht_internal::AccumulateCheckedCanonicalNorm( + sparse.Value(), solver, inverse_norm); + if (!status.IsOk()) return Result::Failure(status); } const double condition = 1.0 / norm / inverse_norm; if (!std::isfinite(condition) || condition < std::ldexp(1.0, -32)) diff --git a/src/fesa/analysis/hht_reduced_procedure.cpp b/src/fesa/analysis/hht_reduced_procedure.cpp index e7d9e40..efcd372 100644 --- a/src/fesa/analysis/hht_reduced_procedure.cpp +++ b/src/fesa/analysis/hht_reduced_procedure.cpp @@ -1,4 +1,7 @@ #include "analysis/hht_reduced_procedure.h" +#include "analysis/hht_reduced_integrator.h" + +#include "equilibrium_algorithm.h" #include #include @@ -296,12 +299,83 @@ Status CheckReducedUpdates(const Domain& domain, return Status::Ok(); } -struct ReducedHistory { - Vector p{0U}; - Vector velocity{0U}; - Vector acceleration{0U}; - Vector algorithmic_acceleration{0U}; - Vector z{0U}; +// Private nonvirtual primitive: keep velocity assignment before acceleration +// evaluation, including per-index position retries. No accepted state changes. +void EvaluateReducedShellRate(double predictor_velocity, + double algorithmic_acceleration, + double old_acceleration, double h, + const HhtParameters& parameters, + double* velocity, double* acceleration) { + *velocity = predictor_velocity + parameters.gamma * h * algorithmic_acceleration; + *acceleration = (algorithmic_acceleration + parameters.alpha * old_acceleration) / + (1.0 + parameters.alpha); +} + +class ReducedCoordinateShellHhtIntegrator final : public ShellHhtIntegrator { +public: + ReducedShellPredictor + Predict(const ReducedHistory& history, double h, + const HhtParameters& parameters) const override { + Vector pp{history.p.Size()}, vpp{history.p.Size()}; + for (std::size_t i = 0U; i < history.p.Size(); ++i) { + pp[i] = + history.p[i] + h * history.velocity[i] + + h * h * (0.5 - parameters.beta) * history.algorithmic_acceleration[i]; + vpp[i] = history.velocity[i] + h * (1.0 - parameters.gamma) * + history.algorithmic_acceleration[i]; + } + Vector coordinate_low{history.p.Size()}; + Vector increment_trace{history.p.Size()}; + Vector increment_trace_compensation{history.p.Size()}; + Vector increment_trace_absolute_sum{history.p.Size()}; + for (std::size_t i = 0U; i < history.p.Size(); ++i) { + const double velocity_term = h * history.velocity[i]; + const double old_acceleration_term = + h * h * (0.5 - parameters.beta) * history.algorithmic_acceleration[i]; + const double first_sum = history.p[i] + velocity_term; + coordinate_low[i] = + AdditionLowPart(history.p[i], velocity_term, first_sum) + + AdditionLowPart(first_sum, old_acceleration_term, pp[i]); + AddIncrementTraceTerm(velocity_term, &increment_trace[i], + &increment_trace_compensation[i]); + AddIncrementTraceTerm(old_acceleration_term, &increment_trace[i], + &increment_trace_compensation[i]); + increment_trace_absolute_sum[i] = + std::abs(velocity_term) + std::abs(old_acceleration_term); + } + return {std::move(pp), + std::move(vpp), + std::move(coordinate_low), + std::move(increment_trace), + std::move(increment_trace_compensation), + std::move(increment_trace_absolute_sum)}; + } + void EvaluateRates(const ReducedShellRateRequest& request, + Vector& trial_v, Vector& trial_a) const override { + const auto& history = request.history; + const auto& trial_algorithmic = request.trial_algorithmic; + const auto& vpp = request.vpp; + const auto& parameters = request.parameters; + const double h = request.h; + for (std::size_t i = 0U; i < history.p.Size(); ++i) { + if (request.copy_translation_rates && + PhysicalCoordinateChannel(request.chart, i) == 0U) { + trial_v[i] = request.retained_velocity[i]; + trial_a[i] = request.retained_acceleration[i]; + } else { + EvaluateReducedShellRate( + vpp[i], trial_algorithmic[i], history.acceleration[i], h, parameters, + &trial_v[i], &trial_a[i]); + } + } + } + Result + ReconstructPhysicalRates(const FixedChart& chart, const EmbeddingRoot& root, + const Vector& velocity, const Vector& acceleration, + TangentSolver& solver) const override { + return hht_reduced_internal::ReconstructPhysicalRates(chart, root, velocity, + acceleration, solver); + } }; struct Trial { @@ -320,6 +394,17 @@ Result ExecuteReducedHht( const Domain& domain, NewtonIterationLogWriter& log, const ParallelFor& parallel_for, LinearSolver& positive_solver, TangentSolver& tangent_solver) { + const ReducedCoordinateShellHhtIntegrator integrator; + NewtonStepAlgorithm algorithm; + return ExecuteReducedHht(domain, log, parallel_for, positive_solver, + tangent_solver, integrator, algorithm); +} + +Result ExecuteReducedHht( + const Domain& domain, NewtonIterationLogWriter& log, + const ParallelFor& parallel_for, LinearSolver& positive_solver, + TangentSolver& tangent_solver, const ShellHhtIntegrator& integrator, + EquilibriumAlgorithm& algorithm) { if (domain.Dynamic() == nullptr) return Result::Failure(Status::Failure( FailureCategory::kModel, {{Severity::kError, "invalid-dynamic-step", {}, @@ -433,7 +518,7 @@ Result ExecuteReducedHht( tangent_solver); if (!root0.HasValue()) return Result::Failure( WithProcedureContext(domain, root0.GetStatus(), "inner-position", 0U, 0.0)); - auto rates0 = ReconstructPhysicalRates(chart.Value(), root0.Value(), history.velocity, + auto rates0 = integrator.ReconstructPhysicalRates(chart.Value(), root0.Value(), history.velocity, history.acceleration, tangent_solver); if (!rates0.HasValue()) return Result::Failure( WithProcedureContext(domain, rates0.GetStatus(), "inner-rates", 0U, 0.0)); @@ -604,343 +689,434 @@ Result ExecuteReducedHht( status = log.Write(record); if (status.IsOk()) status = log.Flush(); if (!status.IsOk()) return Result::Failure(status); - for (std::uint32_t increment = 1U; increment <= domain.Dynamic()->increment_count; ++increment) { + struct ReducedStepCandidate { + DynamicAcceptedFrameState frame; + ReducedHistory history; + }; + for (std::uint32_t increment = 1U; + increment <= domain.Dynamic()->increment_count; ++increment) { const auto& old = state.CommittedState(); - Vector pp{history.p.Size()}, vpp{history.p.Size()}; - for (std::size_t i = 0U; i < history.p.Size(); ++i) { - pp[i] = history.p[i] + h * history.velocity[i] + h * h * (0.5 - parameters.beta) * history.algorithmic_acceleration[i]; - vpp[i] = history.velocity[i] + h * (1.0 - parameters.gamma) * history.algorithmic_acceleration[i]; - } - DynamicAcceptedFrameState trial_frame = old; - trial_frame.is_initial = false; trial_frame.frame_index = increment; - trial_frame.increment_index = increment; trial_frame.time = static_cast(increment) * h; - trial_frame.time_integration_formulation = DynamicTimeIntegrationFormulation::kReducedCoordinateHht; - Vector trial_algorithmic{history.p.Size()}; - Vector trial_p = pp; - Vector coordinate_low{history.p.Size()}; - Vector chosen_start_p = pp; - Vector increment_trace{history.p.Size()}; - Vector increment_trace_compensation{history.p.Size()}; - Vector increment_trace_absolute_sum{history.p.Size()}; - for (std::size_t i = 0U; i < history.p.Size(); ++i) { - const double velocity_term = h * history.velocity[i]; - const double old_acceleration_term = - h * h * (0.5 - parameters.beta) * history.algorithmic_acceleration[i]; - const double first_sum = history.p[i] + velocity_term; - coordinate_low[i] = AdditionLowPart(history.p[i], velocity_term, first_sum) + - AdditionLowPart(first_sum, old_acceleration_term, pp[i]); - AddIncrementTraceTerm(velocity_term, &increment_trace[i], - &increment_trace_compensation[i]); - AddIncrementTraceTerm(old_acceleration_term, &increment_trace[i], - &increment_trace_compensation[i]); - increment_trace_absolute_sum[i] = - std::abs(velocity_term) + std::abs(old_acceleration_term); - } - Vector seed = history.z; - record = {}; record.increment_index = increment; record.time = trial_frame.time; record.correction_pass = true; - bool translation_private_algorithmic_pass = true; - bool copy_translation_rates = false; - Vector retained_velocity{history.p.Size()}; - Vector retained_acceleration{history.p.Size()}; - bool accepted = false; - for (std::uint32_t iteration = 0U; - iteration <= kMaximumOuterCorrections; ++iteration) { - record.iteration_index = iteration; record.stage = "evaluation"; record.outcome = "candidate"; - const auto fail = [&](const Status& failure, - const char* stage = "outer") -> Result { - const Status contextual = WithProcedureContext( - domain, failure, stage, increment, trial_frame.time); - record.stage = stage; record.outcome = "failed"; - record.failure_code = contextual.Diagnostics().empty() - ? "dynamic-solver-failure" - : contextual.Diagnostics().front().code; - const Status written = log.Write(record); - return Result::Failure( - written.IsOk() ? contextual : written); - }; - Vector trial_v{history.p.Size()}, trial_a{history.p.Size()}; - for (std::size_t i = 0U; i < trial_p.Size(); ++i) { - if (copy_translation_rates && PhysicalCoordinateChannel(chart.Value(), i) == 0U) { - trial_v[i] = retained_velocity[i]; - trial_a[i] = retained_acceleration[i]; - } else { - trial_v[i] = vpp[i] + parameters.gamma * h * trial_algorithmic[i]; - trial_a[i] = (trial_algorithmic[i] + parameters.alpha * history.acceleration[i]) / (1.0 + parameters.alpha); - } - } - const auto evaluate_trial = [&](const Vector& physical_p, - const Vector& physical_v, - const Vector& physical_a, - const Vector& root_seed) -> Result { - auto root = SolveEmbeddingRoot(chart.Value(), physical_p, root_seed, - [&](const Vector& q) { return position_operators(trial_frame, q); }, - tangent_solver); - if (!root.HasValue()) return Result::Failure( - WithProcedureContext(domain, root.GetStatus(), "inner-position", - increment, trial_frame.time)); - auto rates = ReconstructPhysicalRates(chart.Value(), root.Value(), physical_v, - physical_a, tangent_solver); - if (!rates.HasValue()) return Result::Failure( - WithProcedureContext(domain, rates.GetStatus(), "inner-rates", - increment, trial_frame.time)); - auto candidate = trial_frame; - candidate.generalized_coordinates = root.Value().q; - candidate.velocity = rates.Value().velocity; - candidate.acceleration = rates.Value().acceleration; - candidate.algorithmic_acceleration = Vector(dofs.FullDofCount()); - for (std::size_t i = 0U; i < candidate.algorithmic_acceleration.Size(); ++i) - candidate.algorithmic_acceleration[i] = - (1.0 + parameters.alpha) * candidate.acceleration[i] - - parameters.alpha * old.acceleration[i]; - candidate.iteration_count = iteration; - auto assembly = EvaluateAssembly(domain, dofs, shells.Value(), candidate, - loads.Value()[1U], h, parameters, - parallel_for, true); - if (!assembly.HasValue()) return Result::Failure( - WithProcedureContext(domain, assembly.GetStatus(), "outer", - increment, trial_frame.time)); - assembly.Value().frame.time_integration_formulation = - DynamicTimeIntegrationFormulation::kReducedCoordinateHht; - return Result::Success( - {std::move(assembly.Value()), std::move(root.Value()), physical_p, - physical_v, physical_a, trial_algorithmic, - std::move(rates.Value().z_velocity), std::move(rates.Value().z_acceleration)}); - }; - position_geometry_failure = false; - auto trial = evaluate_trial(trial_p, trial_v, trial_a, seed); - if (!trial.HasValue() && iteration == 0U && position_geometry_failure) { - for (std::size_t i = 0U; i < trial_p.Size(); ++i) { - trial_algorithmic[i] = - (history.p[i] - pp[i]) / (parameters.beta * h * h); - trial_p[i] = history.p[i]; - chosen_start_p[i] = history.p[i]; - coordinate_low[i] = 0.0; - increment_trace[i] = 0.0; - increment_trace_compensation[i] = 0.0; - increment_trace_absolute_sum[i] = 0.0; - trial_v[i] = vpp[i] + parameters.gamma * h * trial_algorithmic[i]; - trial_a[i] = (trial_algorithmic[i] + - parameters.alpha * history.acceleration[i]) / - (1.0 + parameters.alpha); - } - trial = evaluate_trial(trial_p, trial_v, trial_a, seed); - } - if (!trial.HasValue()) return fail(trial.GetStatus()); - if (iteration == 0U && !ExactlyEqual(trial_p, history.p)) { - Vector old_algorithmic{trial_p.Size()}; - Vector old_velocity{trial_p.Size()}; - Vector old_acceleration{trial_p.Size()}; - for (std::size_t i = 0U; i < trial_p.Size(); ++i) { - old_algorithmic[i] = (history.p[i] - pp[i]) / (parameters.beta * h * h); - old_velocity[i] = vpp[i] + parameters.gamma * h * old_algorithmic[i]; - old_acceleration[i] = (old_algorithmic[i] + parameters.alpha * history.acceleration[i]) / - (1.0 + parameters.alpha); - } - auto old_trial = evaluate_trial(history.p, old_velocity, old_acceleration, seed); - if (!old_trial.HasValue()) return fail(old_trial.GetStatus()); - const auto reduced_residual = [&](const Trial& value) { - double norm = 0.0; - for (const auto full : dofs.FreeDofs()) { - const double scale = full % 6U < 3U ? length : 1.0; - norm = (std::max)(norm, - scale * std::abs(value.assembly.frame.residual[full])); - } - if (!std::isfinite(norm)) return std::numeric_limits::infinity(); - return norm; - }; - const double old_residual = reduced_residual(old_trial.Value()); - const double predictor_residual = reduced_residual(trial.Value()); - if (!std::isfinite(old_residual) || !std::isfinite(predictor_residual)) - return fail(Failure(domain, "dynamic-invalid-state", - "The scaled initial reduced residual is nonfinite.")); - if (old_residual < predictor_residual) { - trial = std::move(old_trial); - trial_p = history.p; - chosen_start_p = history.p; - coordinate_low = Vector(history.p.Size()); - increment_trace = Vector(history.p.Size()); - increment_trace_compensation = Vector(history.p.Size()); - increment_trace_absolute_sum = Vector(history.p.Size()); - trial_v = old_velocity; - trial_a = old_acceleration; - trial_algorithmic = old_algorithmic; - } - } - auto candidate = trial.Value().assembly.frame; - auto operators = EvaluateConstraintOperators(domain, dofs, shells.Value(), - trial.Value().assembly, chart.Value(), zero, zero); - if (!operators.HasValue()) return fail(operators.GetStatus()); - ResidualRecord(dofs, candidate, &record); - if (record.residual_pass && record.correction_pass) { - status = CompleteConstraintEvidence(domain, dofs, trial.Value().assembly, length, null_nodes, - positive_solver, tangent_solver, &candidate); - if (!status.IsOk()) return fail(status, "accepted"); - status = CompleteEquilibrium(domain, dofs, trial.Value().assembly, &candidate); - if (!status.IsOk()) return fail(status, "accepted"); - graph_regularity = CheckGraphRegularity(trial.Value().assembly, - chart.Value(), operators.Value(), - tangent_solver); - if (!graph_regularity.HasValue()) - return fail(graph_regularity.GetStatus(), "accepted"); - status = CheckReducedUpdates(domain, old, candidate, pp, vpp, trial_p, trial_v, - trial_a, trial.Value().root.z, - trial.Value().algebraic_velocity, - trial.Value().algebraic_acceleration, - trial_algorithmic, history.p, history.velocity, - history.acceleration, - history.algorithmic_acceleration, - increment_trace, - increment_trace_compensation, - increment_trace_absolute_sum, - chart.Value(), chosen_start_p, coordinate_low, - parameters, h); - if (!status.IsOk()) return fail(status, "accepted"); - candidate.external_work = 0.0; - for (std::size_t i = 0U; i < dofs.FullDofCount(); ++i) - candidate.external_work += candidate.external_force[i] * candidate.generalized_coordinates[i]; - candidate.energy_defect = candidate.kinetic_energy + candidate.physical_strain_energy + - candidate.drilling_energy - initial_energy - candidate.external_work; - status = state.CommitAcceptedFrame(candidate); - if (!status.IsOk()) return fail(status, "accepted"); - history = {trial_p, trial_v, trial_a, trial_algorithmic, trial.Value().root.z}; - record.stage = "accepted"; record.outcome = "accepted"; - status = log.Write(record); if (status.IsOk()) status = log.Flush(); - if (!status.IsOk()) return Result::Failure(status); - accepted = true; break; - } - if (!CanApplyOuterCorrection(iteration)) { - double full_hidden = 0.0; - double analytic_hidden = 0.0; - double inertia_hidden = 0.0; - double consistency = 0.0; - for (std::size_t row = 0U; row < chart.Value().null_nodes.size(); ++row) { - const auto node = chart.Value().null_nodes[row]; - const auto& null = trial.Value().assembly.rotations[node].drill_null; - double full = 0.0; - double inertia = 0.0; - for (std::size_t component = 0U; component < 3U; ++component) { - const auto full_dof = 6U * node + 3U + component; - full += null[component] * candidate.residual[full_dof]; - inertia += null[component] * candidate.inertia_force[full_dof]; - } - const double analytic = operators.Value().rows[row].value; - full_hidden = (std::max)(full_hidden, std::abs(full)); - analytic_hidden = (std::max)(analytic_hidden, std::abs(analytic)); - inertia_hidden = (std::max)(inertia_hidden, std::abs(inertia)); - consistency = (std::max)(consistency, std::abs(full - analytic - inertia)); - } - std::ostringstream message; - const auto maximum = [](const Vector& values) { - double result = 0.0; - for (std::size_t i = 0U; i < values.Size(); ++i) - result = (std::max)(result, std::abs(values[i])); - return result; - }; - Vector position_correction{trial_algorithmic.Size()}; - Vector velocity_correction{trial_algorithmic.Size()}; - for (std::size_t i = 0U; i < trial_algorithmic.Size(); ++i) { - position_correction[i] = parameters.beta * h * h * trial_algorithmic[i]; - velocity_correction[i] = parameters.gamma * h * trial_algorithmic[i]; - } - message << "HHT exhausted 100 corrections without satisfying every endpoint check; " - << "stage=outer, outer_iteration=" << iteration - << ", graph_iteration=" << trial.Value().root.graph_iteration_count - << ", graph_residual=" << trial.Value().root.graph_residual_infinity - << ", graph_relative=" << trial.Value().root.graph_residual_relative - << ", graph_correction=" << trial.Value().root.graph_correction_infinity - << ", max_NtE=" << full_hidden - << ", max_analytic_psi=" << analytic_hidden - << ", max_NtInertia=" << inertia_hidden - << ", max_NtE_minus_psi_minus_NtInertia=" << consistency - << ", max_pp=" << maximum(pp) - << ", max_beta_h2_trial_Ar=" << maximum(position_correction) - << ", max_trial_p=" << maximum(trial_p) - << ", max_vp_predictor=" << maximum(vpp) - << ", max_gamma_h_trial_Ar=" << maximum(velocity_correction) - << ", max_trial_v=" << maximum(trial_v) - << ", max_physical_v=" << maximum(trial.Value().velocity) << "."; - return fail(Failure(domain, "dynamic-nonconvergence", message.str())); - } - status = log.Write(record); - if (!status.IsOk()) return Result::Failure(status); - const double velocity_rate = parameters.gamma / (parameters.beta * h); - const double acceleration_rate = 1.0 / ((1.0 + parameters.alpha) * parameters.beta * h * h); - auto system = AssembleAugmentedReducedSystem(trial.Value().assembly, chart.Value(), operators.Value(), velocity_rate, acceleration_rate, length, h); - if (!system.HasValue()) return fail(system.GetStatus()); - const bool angular_only = ShouldRefineAngular( - chart.Value(), candidate.free_residual_metrics, - {record.coordinate_correction[0U], record.velocity_correction[0U], - record.acceleration_correction[0U], record.algorithmic_correction[0U]}, - translation_private_algorithmic_pass); - auto selected = SelectAugmentedSolve(system.Value(), chart.Value(), angular_only); - if (!selected.HasValue()) return fail(selected.GetStatus()); - const auto linear_failure = [&](const Status& failure) { - return fail(failure, angular_only ? "angular-newton-linear-solve" - : "full-newton-linear-solve"); - }; - Vector selected_solution{selected.Value().rhs.Size()}; - if (selected_solution.Size() > 0U) { - status = tangent_solver.FactorizeFresh(selected.Value().tangent); - if (!status.IsOk()) return linear_failure(status); - status = tangent_solver.SolveCorrection(selected.Value().rhs, selected_solution); - if (!status.IsOk()) return linear_failure(status); - status = CheckLinearSolve(selected.Value().tangent, selected.Value().rhs, selected_solution); - if (!status.IsOk()) return linear_failure(status); - } - auto solution = EmbedAugmentedSolution(selected.Value(), selected_solution, - system.Value().rhs.Size()); - if (!solution.HasValue()) return fail(solution.GetStatus()); - auto correction = MapAugmentedCorrection(chart.Value(), system.Value(), solution.Value(), velocity_rate, acceleration_rate); - if (!correction.HasValue()) return fail(correction.GetStatus()); - Vector full_algorithmic{dofs.FullDofCount()}; - Vector reduced_algorithmic{correction.Value().p.Size()}; - Vector reduced_physical{correction.Value().p.Size()}; - for (std::size_t i = 0U; i < full_algorithmic.Size(); ++i) - full_algorithmic[i] = - (1.0 + parameters.alpha) * correction.Value().acceleration[i]; - for (std::size_t i = 0U; i < reduced_algorithmic.Size(); ++i) { - reduced_algorithmic[i] = correction.Value().p[i] / - (parameters.beta * h * h); - reduced_physical[i] = acceleration_rate * correction.Value().p[i]; - } - CorrectionRecord(correction.Value().coordinate, correction.Value().velocity, - correction.Value().acceleration, full_algorithmic, - reduced_algorithmic, reduced_physical, chart.Value(), dofs, length, h, - parameters.alpha, - &record); - translation_private_algorithmic_pass = true; - for (std::size_t i = 0U; i < chart.Value().p_dofs.size(); ++i) - if (PhysicalCoordinateChannel(chart.Value(), i) == 0U) - translation_private_algorithmic_pass = - translation_private_algorithmic_pass && - PrivateCorrectionEqual(chart.Value(), i, full_algorithmic, - reduced_algorithmic, reduced_physical, parameters.alpha); - copy_translation_rates = angular_only; - if (angular_only) { - retained_velocity = trial_v; - retained_acceleration = trial_a; - } - for (std::size_t i = 0U; i < trial_algorithmic.Size(); ++i) { - if (angular_only && PhysicalCoordinateChannel(chart.Value(), i) == 0U) continue; - trial_algorithmic[i] += reduced_algorithmic[i]; - } - for (std::size_t i = 0U; i < trial_p.Size(); ++i) { - if (angular_only && PhysicalCoordinateChannel(chart.Value(), i) == 0U) continue; - AdvanceCoordinate(correction.Value().p[i], &trial_p[i], &coordinate_low[i]); - } - for (std::size_t i = 0U; i < increment_trace.Size(); ++i) { - if (angular_only && PhysicalCoordinateChannel(chart.Value(), i) == 0U) continue; - AddIncrementTraceTerm(correction.Value().p[i], &increment_trace[i], - &increment_trace_compensation[i]); - increment_trace_absolute_sum[i] += std::abs(correction.Value().p[i]); - } - seed = trial.Value().root.z; - for (std::size_t i = 0U; i < seed.Size(); ++i) - seed[i] += correction.Value().z[i]; - } - if (!accepted) return Result::Failure( - Failure(domain, "dynamic-nonconvergence", "Dynamic increment was not accepted.")); + const auto report_failure = [&](const Status& failure, const char* stage) { + const Status contextual = WithProcedureContext( + domain, failure, stage, increment, record.time); + record.stage = stage; + record.outcome = "failed"; + record.failure_code = contextual.Diagnostics().empty() + ? "dynamic-solver-failure" + : contextual.Diagnostics().front().code; + const Status written = log.Write(record); + return written.IsOk() ? contextual : written; + }; + status = RunReducedHhtStep( + integrator, history, h, parameters, + [&](const ShellHhtIntegrator& step_integrator, + ReducedShellPredictor predictor) -> Result { + Vector pp = std::move(predictor.pp); + Vector vpp = std::move(predictor.vpp); + DynamicAcceptedFrameState trial_frame = old; + trial_frame.is_initial = false; + trial_frame.frame_index = increment; + trial_frame.increment_index = increment; + trial_frame.time = static_cast(increment) * h; + trial_frame.time_integration_formulation = + DynamicTimeIntegrationFormulation::kReducedCoordinateHht; + Vector trial_algorithmic{history.p.Size()}; + Vector trial_p = pp; + Vector coordinate_low = std::move(predictor.coordinate_low); + Vector chosen_start_p = pp; + Vector increment_trace = std::move(predictor.increment_trace); + Vector increment_trace_compensation = + std::move(predictor.increment_trace_compensation); + Vector increment_trace_absolute_sum = + std::move(predictor.increment_trace_absolute_sum); + Vector seed = history.z; + record = {}; + record.increment_index = increment; + record.time = trial_frame.time; + record.correction_pass = true; + bool translation_private_algorithmic_pass = true; + bool copy_translation_rates = false; + Vector retained_velocity{history.p.Size()}; + Vector retained_acceleration{history.p.Size()}; + using StepResult = Result>; + const auto write_iteration = + [&](const DynamicNewtonIterationLogRecord& value) { + return log.Write(value); + }; + ReducedShellHhtStep iteration_step( + [&](std::uint32_t iteration) -> StepResult { + record.iteration_index = iteration; + record.stage = "evaluation"; + record.outcome = "candidate"; + const auto fail = [&](const Status& failure, + const char* stage = "outer") -> StepResult { + return StepResult::Failure(report_failure(failure, stage)); + }; + ReducedShellTrialRates reduced_rates{ + Vector{history.p.Size()}, Vector{history.p.Size()}}; + step_integrator.EvaluateRates( + {chart.Value(), history, trial_algorithmic, vpp, + copy_translation_rates, retained_velocity, retained_acceleration, + h, parameters}, reduced_rates.velocity, + reduced_rates.acceleration); + Vector trial_v = std::move(reduced_rates.velocity); + Vector trial_a = std::move(reduced_rates.acceleration); + const auto evaluate_trial = + [&](const Vector& physical_p, const Vector& physical_v, + const Vector& physical_a, + const Vector& root_seed) -> Result { + auto root = SolveEmbeddingRoot( + chart.Value(), physical_p, root_seed, + [&](const Vector& q) { + return position_operators(trial_frame, q); + }, + tangent_solver); + if (!root.HasValue()) + return Result::Failure(WithProcedureContext( + domain, root.GetStatus(), "inner-position", increment, + trial_frame.time)); + auto rates = step_integrator.ReconstructPhysicalRates( + chart.Value(), root.Value(), physical_v, physical_a, + tangent_solver); + if (!rates.HasValue()) + return Result::Failure( + WithProcedureContext(domain, rates.GetStatus(), "inner-rates", + increment, trial_frame.time)); + auto candidate = trial_frame; + candidate.generalized_coordinates = root.Value().q; + candidate.velocity = rates.Value().velocity; + candidate.acceleration = rates.Value().acceleration; + candidate.algorithmic_acceleration = Vector(dofs.FullDofCount()); + for (std::size_t i = 0U; + i < candidate.algorithmic_acceleration.Size(); ++i) + candidate.algorithmic_acceleration[i] = + (1.0 + parameters.alpha) * candidate.acceleration[i] - + parameters.alpha * old.acceleration[i]; + candidate.iteration_count = iteration; + auto assembly = EvaluateAssembly(domain, dofs, shells.Value(), + candidate, loads.Value()[1U], h, + parameters, parallel_for, true); + if (!assembly.HasValue()) + return Result::Failure( + WithProcedureContext(domain, assembly.GetStatus(), "outer", + increment, trial_frame.time)); + assembly.Value().frame.time_integration_formulation = + DynamicTimeIntegrationFormulation::kReducedCoordinateHht; + return Result::Success( + {std::move(assembly.Value()), std::move(root.Value()), + physical_p, physical_v, physical_a, trial_algorithmic, + std::move(rates.Value().z_velocity), + std::move(rates.Value().z_acceleration)}); + }; + position_geometry_failure = false; + auto trial = evaluate_trial(trial_p, trial_v, trial_a, seed); + if (!trial.HasValue() && iteration == 0U && + position_geometry_failure) { + for (std::size_t i = 0U; i < trial_p.Size(); ++i) { + trial_algorithmic[i] = + (history.p[i] - pp[i]) / (parameters.beta * h * h); + trial_p[i] = history.p[i]; + chosen_start_p[i] = history.p[i]; + coordinate_low[i] = 0.0; + increment_trace[i] = 0.0; + increment_trace_compensation[i] = 0.0; + increment_trace_absolute_sum[i] = 0.0; + } + step_integrator.EvaluateRates( + {chart.Value(), history, trial_algorithmic, vpp, false, + retained_velocity, retained_acceleration, h, parameters}, + trial_v, trial_a); + trial = evaluate_trial(trial_p, trial_v, trial_a, seed); + } + if (!trial.HasValue()) + return fail(trial.GetStatus()); + if (iteration == 0U && !ExactlyEqual(trial_p, history.p)) { + Vector old_algorithmic{trial_p.Size()}; + Vector old_velocity{trial_p.Size()}; + Vector old_acceleration{trial_p.Size()}; + for (std::size_t i = 0U; i < trial_p.Size(); ++i) { + old_algorithmic[i] = + (history.p[i] - pp[i]) / (parameters.beta * h * h); + } + step_integrator.EvaluateRates( + {chart.Value(), history, old_algorithmic, vpp, false, + retained_velocity, retained_acceleration, h, parameters}, + old_velocity, old_acceleration); + auto old_trial = + evaluate_trial(history.p, old_velocity, old_acceleration, seed); + if (!old_trial.HasValue()) + return fail(old_trial.GetStatus()); + const auto reduced_residual = [&](const Trial& value) { + double norm = 0.0; + for (const auto full : dofs.FreeDofs()) { + const double scale = full % 6U < 3U ? length : 1.0; + norm = (std::max)(norm, + scale * + std::abs( + value.assembly.frame.residual[full])); + } + if (!std::isfinite(norm)) + return std::numeric_limits::infinity(); + return norm; + }; + const double old_residual = reduced_residual(old_trial.Value()); + const double predictor_residual = reduced_residual(trial.Value()); + if (!std::isfinite(old_residual) || + !std::isfinite(predictor_residual)) + return fail( + Failure(domain, "dynamic-invalid-state", + "The scaled initial reduced residual is nonfinite.")); + if (old_residual < predictor_residual) { + trial = std::move(old_trial); + trial_p = history.p; + chosen_start_p = history.p; + coordinate_low = Vector(history.p.Size()); + increment_trace = Vector(history.p.Size()); + increment_trace_compensation = Vector(history.p.Size()); + increment_trace_absolute_sum = Vector(history.p.Size()); + trial_v = old_velocity; + trial_a = old_acceleration; + trial_algorithmic = old_algorithmic; + } + } + auto candidate = trial.Value().assembly.frame; + auto operators = EvaluateConstraintOperators( + domain, dofs, shells.Value(), trial.Value().assembly, + chart.Value(), zero, zero); + if (!operators.HasValue()) + return fail(operators.GetStatus()); + ResidualRecord(dofs, candidate, &record); + if (record.residual_pass && record.correction_pass) { + status = CompleteConstraintEvidence( + domain, dofs, trial.Value().assembly, length, null_nodes, + positive_solver, tangent_solver, &candidate); + if (!status.IsOk()) + return fail(status, "accepted"); + status = CompleteEquilibrium(domain, dofs, trial.Value().assembly, + &candidate); + if (!status.IsOk()) + return fail(status, "accepted"); + graph_regularity = + CheckGraphRegularity(trial.Value().assembly, chart.Value(), + operators.Value(), tangent_solver); + if (!graph_regularity.HasValue()) + return fail(graph_regularity.GetStatus(), "accepted"); + status = CheckReducedUpdates( + domain, old, candidate, pp, vpp, trial_p, trial_v, trial_a, + trial.Value().root.z, trial.Value().algebraic_velocity, + trial.Value().algebraic_acceleration, trial_algorithmic, + history.p, history.velocity, history.acceleration, + history.algorithmic_acceleration, increment_trace, + increment_trace_compensation, increment_trace_absolute_sum, + chart.Value(), chosen_start_p, coordinate_low, parameters, h); + if (!status.IsOk()) + return fail(status, "accepted"); + candidate.external_work = 0.0; + for (std::size_t i = 0U; i < dofs.FullDofCount(); ++i) + candidate.external_work += candidate.external_force[i] * + candidate.generalized_coordinates[i]; + candidate.energy_defect = candidate.kinetic_energy + + candidate.physical_strain_energy + + candidate.drilling_energy - + initial_energy - candidate.external_work; + return StepResult::Success(ReducedStepCandidate{ + std::move(candidate), + {trial_p, trial_v, trial_a, trial_algorithmic, + trial.Value().root.z}}); + } + if (!CanApplyOuterCorrection(iteration)) { + double full_hidden = 0.0; + double analytic_hidden = 0.0; + double inertia_hidden = 0.0; + double consistency = 0.0; + for (std::size_t row = 0U; row < chart.Value().null_nodes.size(); + ++row) { + const auto node = chart.Value().null_nodes[row]; + const auto& null = + trial.Value().assembly.rotations[node].drill_null; + double full = 0.0; + double inertia = 0.0; + for (std::size_t component = 0U; component < 3U; ++component) { + const auto full_dof = 6U * node + 3U + component; + full += null[component] * candidate.residual[full_dof]; + inertia += null[component] * candidate.inertia_force[full_dof]; + } + const double analytic = operators.Value().rows[row].value; + full_hidden = (std::max)(full_hidden, std::abs(full)); + analytic_hidden = (std::max)(analytic_hidden, std::abs(analytic)); + inertia_hidden = (std::max)(inertia_hidden, std::abs(inertia)); + consistency = + (std::max)(consistency, std::abs(full - analytic - inertia)); + } + std::ostringstream message; + const auto maximum = [](const Vector& values) { + double result = 0.0; + for (std::size_t i = 0U; i < values.Size(); ++i) + result = (std::max)(result, std::abs(values[i])); + return result; + }; + Vector position_correction{trial_algorithmic.Size()}; + Vector velocity_correction{trial_algorithmic.Size()}; + for (std::size_t i = 0U; i < trial_algorithmic.Size(); ++i) { + position_correction[i] = + parameters.beta * h * h * trial_algorithmic[i]; + velocity_correction[i] = + parameters.gamma * h * trial_algorithmic[i]; + } + message << "HHT exhausted 100 corrections without satisfying every " + "endpoint check; " + << "stage=outer, outer_iteration=" << iteration + << ", graph_iteration=" + << trial.Value().root.graph_iteration_count + << ", graph_residual=" + << trial.Value().root.graph_residual_infinity + << ", graph_relative=" + << trial.Value().root.graph_residual_relative + << ", graph_correction=" + << trial.Value().root.graph_correction_infinity + << ", max_NtE=" << full_hidden + << ", max_analytic_psi=" << analytic_hidden + << ", max_NtInertia=" << inertia_hidden + << ", max_NtE_minus_psi_minus_NtInertia=" << consistency + << ", max_pp=" << maximum(pp) + << ", max_beta_h2_trial_Ar=" << maximum(position_correction) + << ", max_trial_p=" << maximum(trial_p) + << ", max_vp_predictor=" << maximum(vpp) + << ", max_gamma_h_trial_Ar=" << maximum(velocity_correction) + << ", max_trial_v=" << maximum(trial_v) + << ", max_physical_v=" << maximum(trial.Value().velocity) + << "."; + return fail( + Failure(domain, "dynamic-nonconvergence", message.str())); + } + status = write_iteration(record); + if (!status.IsOk()) + return StepResult::Failure(status); + const double velocity_rate = parameters.gamma / (parameters.beta * h); + const double acceleration_rate = + 1.0 / ((1.0 + parameters.alpha) * parameters.beta * h * h); + auto system = AssembleAugmentedReducedSystem( + trial.Value().assembly, chart.Value(), operators.Value(), + velocity_rate, acceleration_rate, length, h); + if (!system.HasValue()) + return fail(system.GetStatus()); + const bool angular_only = ShouldRefineAngular( + chart.Value(), candidate.free_residual_metrics, + {record.coordinate_correction[0U], record.velocity_correction[0U], + record.acceleration_correction[0U], + record.algorithmic_correction[0U]}, + translation_private_algorithmic_pass); + auto selected = + SelectAugmentedSolve(system.Value(), chart.Value(), angular_only); + if (!selected.HasValue()) + return fail(selected.GetStatus()); + const auto linear_failure = [&](const Status& failure) { + return fail(failure, angular_only ? "angular-newton-linear-solve" + : "full-newton-linear-solve"); + }; + Vector selected_solution{selected.Value().rhs.Size()}; + if (selected_solution.Size() > 0U) { + status = tangent_solver.FactorizeFresh(selected.Value().tangent); + if (!status.IsOk()) + return linear_failure(status); + status = tangent_solver.SolveCorrection(selected.Value().rhs, + selected_solution); + if (!status.IsOk()) + return linear_failure(status); + status = CheckLinearSolve(selected.Value().tangent, + selected.Value().rhs, selected_solution); + if (!status.IsOk()) + return linear_failure(status); + } + auto solution = EmbedAugmentedSolution( + selected.Value(), selected_solution, system.Value().rhs.Size()); + if (!solution.HasValue()) + return fail(solution.GetStatus()); + auto correction = MapAugmentedCorrection( + chart.Value(), system.Value(), solution.Value(), velocity_rate, + acceleration_rate); + if (!correction.HasValue()) + return fail(correction.GetStatus()); + Vector full_algorithmic{dofs.FullDofCount()}; + Vector reduced_algorithmic{correction.Value().p.Size()}; + Vector reduced_physical{correction.Value().p.Size()}; + for (std::size_t i = 0U; i < full_algorithmic.Size(); ++i) + full_algorithmic[i] = + (1.0 + parameters.alpha) * correction.Value().acceleration[i]; + for (std::size_t i = 0U; i < reduced_algorithmic.Size(); ++i) { + reduced_algorithmic[i] = + correction.Value().p[i] / (parameters.beta * h * h); + reduced_physical[i] = acceleration_rate * correction.Value().p[i]; + } + CorrectionRecord(correction.Value().coordinate, + correction.Value().velocity, + correction.Value().acceleration, full_algorithmic, + reduced_algorithmic, reduced_physical, chart.Value(), + dofs, length, h, parameters.alpha, &record); + translation_private_algorithmic_pass = true; + for (std::size_t i = 0U; i < chart.Value().p_dofs.size(); ++i) + if (PhysicalCoordinateChannel(chart.Value(), i) == 0U) + translation_private_algorithmic_pass = + translation_private_algorithmic_pass && + PrivateCorrectionEqual(chart.Value(), i, full_algorithmic, + reduced_algorithmic, reduced_physical, + parameters.alpha); + copy_translation_rates = angular_only; + if (angular_only) { + retained_velocity = trial_v; + retained_acceleration = trial_a; + } + for (std::size_t i = 0U; i < trial_algorithmic.Size(); ++i) { + if (angular_only && + PhysicalCoordinateChannel(chart.Value(), i) == 0U) + continue; + trial_algorithmic[i] += reduced_algorithmic[i]; + } + for (std::size_t i = 0U; i < trial_p.Size(); ++i) { + if (angular_only && + PhysicalCoordinateChannel(chart.Value(), i) == 0U) + continue; + AdvanceCoordinate(correction.Value().p[i], &trial_p[i], + &coordinate_low[i]); + } + for (std::size_t i = 0U; i < increment_trace.Size(); ++i) { + if (angular_only && + PhysicalCoordinateChannel(chart.Value(), i) == 0U) + continue; + AddIncrementTraceTerm(correction.Value().p[i], &increment_trace[i], + &increment_trace_compensation[i]); + increment_trace_absolute_sum[i] += + std::abs(correction.Value().p[i]); + } + seed = trial.Value().root.z; + for (std::size_t i = 0U; i < seed.Size(); ++i) + seed[i] += correction.Value().z[i]; + return StepResult::Success(std::nullopt); + }, + kMaximumOuterCorrections); + const Status solved = iteration_step.Solve(algorithm); + if (!solved.IsOk()) + return Result::Failure(solved); + if (!iteration_step.HasCandidate()) return Result::Failure( + Failure(domain, "dynamic-nonconvergence", "Dynamic increment was not accepted.")); + return Result::Success( + iteration_step.TakeCandidate()); + }, + [&](ReducedStepCandidate&& accepted_candidate) -> Status { + status = state.CommitAcceptedFrame(accepted_candidate.frame); + if (!status.IsOk()) + return report_failure(status, "accepted"); + history = std::move(accepted_candidate.history); + record.stage = "accepted"; + record.outcome = "accepted"; + status = log.Write(record); + if (status.IsOk()) + status = log.Flush(); + return status; + }); + if (!status.IsOk()) return Result::Failure(status); } - return Result::Success({std::move(state), domain.Warnings()}); + return Result::Success( + {std::move(state), domain.Warnings()}); } -} // namespace fesa +} // namespace fesa diff --git a/src/fesa/analysis/hht_reduced_procedure.h b/src/fesa/analysis/hht_reduced_procedure.h index 93d72d9..572bfb7 100644 --- a/src/fesa/analysis/hht_reduced_procedure.h +++ b/src/fesa/analysis/hht_reduced_procedure.h @@ -3,16 +3,20 @@ #include -#include "fesa/analysis/prepared_analysis.h" +#include "fesa/analysis/dynamic_execution_result.h" +#include "fesa/core/status.h" namespace fesa { namespace hht_reduced_internal { +class ShellHhtIntegrator; constexpr std::uint32_t kMaximumOuterCorrections = 100U; constexpr bool CanApplyOuterCorrection(const std::uint32_t completed) { return completed < kMaximumOuterCorrections; } } // namespace hht_reduced_internal +class Domain; +class EquilibriumAlgorithm; class LinearSolver; class NewtonIterationLogWriter; class ParallelFor; @@ -22,6 +26,14 @@ Result ExecuteReducedHht( const Domain& domain, NewtonIterationLogWriter& log, const ParallelFor& parallel_for, LinearSolver& positive_solver, TangentSolver& tangent_solver); + +/// @brief Borrows caller iteration policy for the complete production core. +Result ExecuteReducedHht( + const Domain& domain, NewtonIterationLogWriter& log, + const ParallelFor& parallel_for, LinearSolver& positive_solver, + TangentSolver& tangent_solver, + const hht_reduced_internal::ShellHhtIntegrator& integrator, + EquilibriumAlgorithm& algorithm); } // namespace fesa #endif // FESA_ANALYSIS_HHT_REDUCED_PROCEDURE_H_ diff --git a/src/fesa/analysis/linear_frequency_procedure.cpp b/src/fesa/analysis/linear_frequency_procedure.cpp index fe3110c..d351098 100644 --- a/src/fesa/analysis/linear_frequency_procedure.cpp +++ b/src/fesa/analysis/linear_frequency_procedure.cpp @@ -20,6 +20,7 @@ #include "fesa/elements/mitc4_shell.h" #include "fesa/fem/dof_manager.h" #include "fesa/math/sparse_matrix.h" +#include "fesa/solvers/eigen/mkl_feast_eigen_solver.h" namespace fesa { namespace { @@ -84,7 +85,8 @@ double MaximumEdgeLength(const Domain& domain) { return maximum; } -Result ExecuteCandidate(const Domain& domain) { +Result ExecuteCandidate(const Domain& domain, + const EigenSolver& solver) { const FrequencyStepDefinition* frequency = domain.Frequency(); if (frequency == nullptr || domain.Steps().Size() != 1U) { return Result::Failure( @@ -101,6 +103,7 @@ Result ExecuteCandidate(const Domain& domain) { return Result::Failure(model.GetStatus()); const ElementFactory factory; std::vector> owned; + std::vector> references; ElementView view; owned.reserve(model.Value().ActiveElements().size()); view.reserve(model.Value().ActiveElements().size()); @@ -108,13 +111,15 @@ Result ExecuteCandidate(const Domain& domain) { auto element = factory.Create(domain.Elements()[index], domain); if (!element.HasValue()) return Result::Failure(element.GetStatus()); - if (dynamic_cast(element.Value().get()) == nullptr) { + auto reference = factory.BindShellReference(*element.Value()); + if (reference == nullptr) { return Result::Failure(Failure( "unsupported-frequency-element", std::to_string(index), "The frequency procedure supports MITC4 shell elements only.")); } view.emplace_back(*element.Value()); owned.push_back(std::move(element.Value())); + references.push_back(std::move(reference)); } DofManager dofs; const Status dof_status = dofs.Build(model.Value(), view); @@ -158,7 +163,7 @@ Result ExecuteCandidate(const Domain& domain) { std::to_string(definition.MaterialIndex()), "Every active shell material requires a positive density.")); } - const auto* element = dynamic_cast(owned[shell].get()); + const auto& element = references[shell]; auto mass = element->Mass(density[definition.MaterialIndex()]); auto shell_stiffness = element->Stiffness(); if (!mass.HasValue()) @@ -207,7 +212,7 @@ Result ExecuteCandidate(const Domain& domain) { (material->YoungsModulus() / density[material_id]) / length / length); } - auto backend = MklFeastEigenSolver{}.Solve( + auto backend = solver.Solve( reduction.Value().whitened_operator, request, zero_scale); if (!backend.HasValue()) return Result::Failure(backend.GetStatus()); @@ -403,7 +408,8 @@ Result ExecuteCandidate(const Domain& domain) { Result LinearFrequencyProcedureExecutor::Execute( const Domain& domain) const { try { - auto result = ExecuteCandidate(domain); + const MklFeastEigenSolver default_solver; + auto result = ExecuteCandidate(domain, solver_ ? *solver_ : default_solver); if (!result.HasValue()) { auto diagnostics = result.GetStatus().Diagnostics(); for (auto& diagnostic : diagnostics) { diff --git a/src/fesa/analysis/linear_static_procedure.cpp b/src/fesa/analysis/linear_static_procedure.cpp index f107523..8734275 100644 --- a/src/fesa/analysis/linear_static_procedure.cpp +++ b/src/fesa/analysis/linear_static_procedure.cpp @@ -142,7 +142,7 @@ Result LinearStaticProcedureExecutor::Execute( } state.ExternalForce() = std::move(nodal_external.Value()); - Result rhs = LoadAssembler::EffectiveFreeRhs( + Result rhs = EssentialConstraintPolicy{}.EffectiveFreeRhs( state.ExternalForce(), partitions.Value().k_fc, dofs.PrescribedValues(), dofs); if (!rhs.HasValue()) { diff --git a/src/fesa/analysis/nonlinear_analysis_state.cpp b/src/fesa/analysis/nonlinear_analysis_state.cpp index 79c6a91..23c3ee4 100644 --- a/src/fesa/analysis/nonlinear_analysis_state.cpp +++ b/src/fesa/analysis/nonlinear_analysis_state.cpp @@ -1,6 +1,5 @@ #include "fesa/analysis/nonlinear_analysis_state.h" -#include #include #include #include @@ -9,11 +8,18 @@ #include #include +#include "fesa/core/source_identity.h" #include "fesa/elements/element_definition.h" +#include "math/finite_values.h" +#include "results/shell_result_recovery.h" +#include "analysis/shell_state_inventory.h" namespace fesa { namespace { +using analysis_internal::ShellElementOrder; +using math_internal::IsFinite; + constexpr std::size_t kDofsPerNode = 6U; constexpr std::size_t kShellLocationsPerElement = 4U; constexpr std::uint32_t kMaximumNewtonIterations = 100U; @@ -27,59 +33,6 @@ Status StateFailure(const FailureCategory category, const std::string& code, message}}); } -/// @brief Compares every preserved source-identity component. -bool SourceIdsMatch(const SourceEntityId& left, const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; -} - -template -/// @brief Tests one fixed-size numerical array for finite values. -bool IsFinite(const std::array& values) { - return std::all_of(values.begin(), values.end(), - [](const double value) { return std::isfinite(value); }); -} - -/// @brief Tests each component of a stored trial vector for finiteness. -bool IsFinite(const Vector& values) { - for (std::size_t index = 0U; index < values.Size(); ++index) { - if (!std::isfinite(values[index])) { - return false; - } - } - return true; -} - -/// @brief Tests all physical quantities attached to one shell recovery row. -bool IsFinite(const ShellResultRow& row) { - if (!IsFinite(row.natural_coordinates) || !IsFinite(row.generalized_strain) || - !IsFinite(row.section_resultant)) { - return false; - } - for (const auto& axis : row.local_frame) { - if (!IsFinite(axis)) { - return false; - } - } - return std::all_of(row.stress.begin(), row.stress.end(), - [](const ShellSectionStressRow& stress) { - return std::isfinite(stress.zeta) && - IsFinite(stress.components); - }); -} - -/// @brief Returns shell Domain indices in deterministic unified element order. -std::vector ShellElementOrder(const Domain& domain) { - std::vector order; - for (std::size_t index = 0U; index < domain.Elements().Size(); ++index) { - if (domain.Elements()[index].Kind() == ElementDefinitionKind::kMitc4Shell) { - order.push_back(static_cast(index)); - } - } - return order; -} - /// @brief Validates one accepted frame before any committed-state mutation. Status ValidateAcceptedFrame(const AcceptedFrameState& frame, const NonlinearTrialState& committed, @@ -117,7 +70,7 @@ Status ValidateAcceptedFrame(const AcceptedFrameState& frame, for (std::size_t node = 0U; node < node_count; ++node) { if (frame.nodal_internal_order[node] != committed.nodal_internal_order[node] || - !SourceIdsMatch(frame.nodal_source_ids[node], + !SourceIdentityEquals(frame.nodal_source_ids[node], committed.nodal_source_ids[node]) || !IsFinite(frame.nodal_triad[node][0U]) || !IsFinite(frame.nodal_triad[node][1U]) || @@ -179,7 +132,7 @@ Status ValidateAcceptedFrame(const AcceptedFrameState& frame, if (row.element != shell_order[element] || row.location != expected_locations[point] || row.natural_coordinates != expected_coordinates[point] || - !IsFinite(row)) { + !results_internal::IsFiniteShellRow(row)) { return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, "Shell result rows do not preserve stable identity."); } @@ -241,7 +194,7 @@ Result NonlinearAnalysisState::Create( for (std::size_t node = 0U; node < node_count; ++node) { const auto& entry = baseline.node_baselines[node]; if (entry.node_index != static_cast(node) || - !SourceIdsMatch(entry.source_id, domain.Nodes()[node].source_id) || + !SourceIdentityEquals(entry.source_id, domain.Nodes()[node].source_id) || !IsFinite(entry.triad[0U]) || !IsFinite(entry.triad[1U]) || !IsFinite(entry.triad[2U]) || !IsFinite(entry.director)) { return Result::Failure(StateFailure( diff --git a/src/fesa/analysis/nonlinear_static_control.cpp b/src/fesa/analysis/nonlinear_static_control.cpp index 86235ae..b1daa03 100644 --- a/src/fesa/analysis/nonlinear_static_control.cpp +++ b/src/fesa/analysis/nonlinear_static_control.cpp @@ -12,10 +12,17 @@ #include "fesa/analysis/analysis_model.h" #include "fesa/assembly/load_assembler.h" #include "fesa/elements/finite_rotation.h" +#include "math/vector3_operations.h" +#include "elements/shell_kernel_values.h" +#include "math/dense_blas_internal.h" namespace fesa { namespace { +using shell_kernel_internal::FrameMatrix; +using math_internal::Multiply; +using math_internal::Skew; + constexpr std::size_t kDofsPerNode = 6U; constexpr std::size_t kTranslationDofCount = 3U; constexpr double kMomentAdmissibilityThreshold = 1.0e-12; @@ -67,27 +74,6 @@ Result RotationVectorForNode(const Vector& trial, return Result::Success(rotation); } -/// @brief Builds a proper initial frame from its semantic nodal record. -Matrix InitialFrame(const ShellNodeInitialFrame& frame) { - Matrix result{3U, 3U}; - for (std::size_t row = 0U; row < kTranslationDofCount; ++row) { - result(row, 0U) = frame.tangent_a[row]; - result(row, 1U) = frame.tangent_b[row]; - result(row, 2U) = frame.director[row]; - } - return result; -} - -/// @brief Multiplies a 3-by-3 matrix by a Vector3. -Vector3 Multiply(const Matrix& matrix, const Vector3& vector) { - return {matrix(0U, 0U) * vector.X() + matrix(0U, 1U) * vector.Y() + - matrix(0U, 2U) * vector.Z(), - matrix(1U, 0U) * vector.X() + matrix(1U, 1U) * vector.Y() + - matrix(1U, 2U) * vector.Z(), - matrix(2U, 0U) * vector.X() + matrix(2U, 1U) * vector.Y() + - matrix(2U, 2U) * vector.Z()}; -} - /// @brief Multiplies a 3-by-3 matrix transpose by a Vector3. Vector3 MultiplyTranspose(const Matrix& matrix, const Vector3& vector) { return {matrix(0U, 0U) * vector.X() + matrix(1U, 0U) * vector.Y() + @@ -98,37 +84,18 @@ Vector3 MultiplyTranspose(const Matrix& matrix, const Vector3& vector) { matrix(2U, 2U) * vector.Z()}; } -/// @brief Forms the three-dimensional skew matrix of a global vector. -Matrix Skew(const Vector3& vector) { - Matrix result{3U, 3U}; - result(0U, 1U) = -vector.Z(); - result(0U, 2U) = vector.Y(); - result(1U, 0U) = vector.Z(); - result(1U, 2U) = -vector.X(); - result(2U, 0U) = -vector.Y(); - result(2U, 1U) = vector.X(); - return result; -} - /// @brief Scales a small dense matrix without changing its shape. Matrix Scale(const Matrix& matrix, const double scale) { - Matrix result{matrix.Rows(), matrix.Columns()}; - for (std::size_t row = 0U; row < matrix.Rows(); ++row) { - for (std::size_t column = 0U; column < matrix.Columns(); ++column) { - result(row, column) = scale * matrix(row, column); - } - } + Matrix result{matrix}; + result.Scale(scale); return result; } /// @brief Adds matching small dense matrices. Matrix Add(const Matrix& left, const Matrix& right) { - Matrix result{left.Rows(), left.Columns()}; - for (std::size_t row = 0U; row < left.Rows(); ++row) { - for (std::size_t column = 0U; column < left.Columns(); ++column) { - result(row, column) = left(row, column) + right(row, column); - } - } + Matrix result{left}; + dense_blas_internal::AxpyValues(1.0, right.Data(), + left.Rows() * left.Columns(), result.Data()); return result; } @@ -472,7 +439,7 @@ Result AssembleGlobalFixedLoadContribution( return Result::Failure(phi.GetStatus()); } auto rotation = - MakeFiniteRotationState(phi.Value(), InitialFrame(*frames[node])); + MakeFiniteRotationState(phi.Value(), FrameMatrix(*frames[node])); if (!rotation.HasValue()) { return Result::Failure(rotation.GetStatus()); } diff --git a/src/fesa/analysis/nonlinear_static_core.h b/src/fesa/analysis/nonlinear_static_core.h new file mode 100644 index 0000000..25298f8 --- /dev/null +++ b/src/fesa/analysis/nonlinear_static_core.h @@ -0,0 +1,16 @@ +#ifndef FESA_ANALYSIS_NONLINEAR_STATIC_CORE_H_ +#define FESA_ANALYSIS_NONLINEAR_STATIC_CORE_H_ +#include "fesa/analysis/nonlinear_static_execution_result.h" +namespace fesa { +class EquilibriumAlgorithm; +class NewtonIterationLogWriter; +class ParallelFor; +class TangentSolver; +/// @brief Runs the production core with caller-owned iteration policy. +/// @note All adapters outlive this synchronous call; candidate/history stay local. +Result ExecuteNonlinearStaticCore( + const Domain& domain, NewtonIterationLogWriter& log, + const ParallelFor& parallel_for, TangentSolver& tangent_solver, + EquilibriumAlgorithm& algorithm); +} // namespace fesa +#endif // FESA_ANALYSIS_NONLINEAR_STATIC_CORE_H_ diff --git a/src/fesa/analysis/nonlinear_static_procedure.cpp b/src/fesa/analysis/nonlinear_static_procedure.cpp index c503758..4412f22 100644 --- a/src/fesa/analysis/nonlinear_static_procedure.cpp +++ b/src/fesa/analysis/nonlinear_static_procedure.cpp @@ -1,11 +1,15 @@ #include "fesa/analysis/nonlinear_static_procedure.h" +#include "equilibrium_algorithm.h" +#include "analysis/nonlinear_static_core.h" + #include #include #include #include #include #include +#include #include #include #include @@ -17,6 +21,7 @@ #include "fesa/assembly/parallel_for.h" #include "fesa/assembly/surface_pressure_assembler.h" #include "fesa/constraints/essential_constraint_policy.h" +#include "fesa/elements/element_capabilities.h" #include "fesa/elements/finite_rotation.h" #include "fesa/elements/mitc4_shell.h" #include "fesa/elements/nonlinear_mitc4_shell.h" @@ -25,9 +30,16 @@ #include "fesa/properties/shell_section.h" #include "fesa/solvers/linear/tangent_solver.h" +#include "assembly/ordered_contribution_internal.h" +#include "math/finite_values.h" +#include "elements/shell_kernel_values.h" + namespace fesa { namespace { +using shell_kernel_internal::FrameMatrix; +using math_internal::IsFinite; + constexpr std::size_t kDofsPerNode = 6U; constexpr std::size_t kTranslationsPerNode = 3U; constexpr std::size_t kShellDofCount = 24U; @@ -36,7 +48,8 @@ constexpr std::uint32_t kMaximumNewtonIterations = 100U; struct RuntimeShell { EntityIndex element_index; std::array scatter; - NonlinearMitc4Shell element; + std::unique_ptr kernel; + std::unique_ptr element; }; struct InternalAssembly { @@ -124,16 +137,6 @@ Status RecordFailure(NewtonIterationLogWriter& log, return log_status.IsOk() ? failure : log_status; } -Matrix InitialFrame(const ShellNodeInitialFrame& frame) { - Matrix result{3U, 3U}; - for (std::size_t row = 0U; row < kTranslationsPerNode; ++row) { - result(row, 0U) = frame.tangent_a[row]; - result(row, 1U) = frame.tangent_b[row]; - result(row, 2U) = frame.director[row]; - } - return result; -} - Result BuildDofManager(const Domain& domain) { Result model = AnalysisModel::Create(domain); if (!model.HasValue()) { @@ -239,9 +242,20 @@ Result> BuildRuntimeShells(const Domain& domain, return Result>::Failure(shell.GetStatus()); } const EntityIndex element_index = static_cast(index); + auto kernel = + std::make_unique(std::move(shell.Value())); + auto element = std::make_unique( + ElementDofLayout{definition->SourceId(), definition->NodeIndices(), + {DofComponent::kUx, DofComponent::kUy, DofComponent::kUz, + DofComponent::kUrx, DofComponent::kUry, DofComponent::kUrz}}, + *kernel); + auto mapped = dofs.ElementScatter(element->DofLayout()); + if (!mapped.HasValue()) + return Result>::Failure(mapped.GetStatus()); + std::array scatter{}; + std::copy(mapped.Value().begin(), mapped.Value().end(), scatter.begin()); shells.push_back( - {element_index, dofs.ShellElementScatter(element_index), - std::move(shell.Value())}); + {element_index, scatter, std::move(kernel), std::move(element)}); } return Result>::Success(std::move(shells)); } @@ -269,7 +283,7 @@ Status PopulateNodalKinematics(const Domain& domain, trial->generalized_coordinates[first + 4U], trial->generalized_coordinates[first + 5U]}; Result rotation = MakeFiniteRotationState( - phi, InitialFrame(domain.ShellNodeInitialFrames()[node])); + phi, FrameMatrix(domain.ShellNodeInitialFrames()[node])); if (!rotation.HasValue()) { return rotation.GetStatus(); } @@ -304,26 +318,6 @@ NonlinearMitc4TrialDofs ExtractElementTrial( return trial; } -bool IsFinite(const Vector& values) { - for (std::size_t index = 0U; index < values.Size(); ++index) { - if (!std::isfinite(values[index])) { - return false; - } - } - return true; -} - -bool IsFinite(const Matrix& values) { - for (std::size_t row = 0U; row < values.Rows(); ++row) { - for (std::size_t column = 0U; column < values.Columns(); ++column) { - if (!std::isfinite(values(row, column))) { - return false; - } - } - } - return true; -} - Result AssembleInternal( const std::vector& shells, const DofManager& dofs, const Vector& coordinates, const ParallelFor& parallel_for) { @@ -332,9 +326,8 @@ Result AssembleInternal( std::vector> failures(shells.size()); parallel_for.Execute(shells.size(), [&](const std::size_t index) { Result result = - EvaluateInternalResidualAndTangent(shells[index].element, - ExtractElementTrial(shells[index], - coordinates)); + shells[index].element->EvaluateTrial( + ExtractElementTrial(shells[index], coordinates)); if (!result.HasValue()) { failures[index] = result.GetStatus(); return; @@ -363,12 +356,9 @@ Result AssembleInternal( } for (std::size_t row = 0U; row < kShellDofCount; ++row) { force[shells[index].scatter[row]] += local[index]->internal_residual[row]; - for (std::size_t column = 0U; column < kShellDofCount; ++column) { - contributions.push_back( - {shells[index].scatter[row], shells[index].scatter[column], - local[index]->internal_tangent(row, column), index, - row * kShellDofCount + column}); - } + assembly_internal::AppendLocalMatrixRow( + local[index]->internal_tangent, shells[index].scatter, row, index, + contributions); } for (const NonlinearMitc4RecoveryPoint& point : local[index]->recovery.gauss_points) { @@ -573,19 +563,6 @@ Vector CurrentIncrementComponents(const Vector& current, const Vector& start, return SelectFreeComponents(difference, dofs, rotations); } -Vector3 SpatialMoment(const Matrix& transform, - const std::array& generalized) { - return {transform(0U, 0U) * generalized[0U] + - transform(0U, 1U) * generalized[1U] + - transform(0U, 2U) * generalized[2U], - transform(1U, 0U) * generalized[0U] + - transform(1U, 1U) * generalized[1U] + - transform(1U, 2U) * generalized[2U], - transform(2U, 0U) * generalized[0U] + - transform(2U, 1U) * generalized[1U] + - transform(2U, 2U) * generalized[2U]}; -} - /// @brief Computes accepted-state applied-plus-reaction balance evidence. Result> GlobalEquilibrium( const Domain& domain, const DofManager& dofs, @@ -634,7 +611,6 @@ Result> GlobalEquilibrium( constrained[first] ? trial.residual[first] : 0.0, constrained[first + 1U] ? trial.residual[first + 1U] : 0.0, constrained[first + 2U] ? trial.residual[first + 2U] : 0.0}; - const Matrix transform = InverseTransposeLeftJacobianSO3(phi); const std::array applied_generalized{ trial.external_force[first + 3U], trial.external_force[first + 4U], trial.external_force[first + 5U]}; @@ -642,9 +618,16 @@ Result> GlobalEquilibrium( constrained[first + 3U] ? trial.residual[first + 3U] : 0.0, constrained[first + 4U] ? trial.residual[first + 4U] : 0.0, constrained[first + 5U] ? trial.residual[first + 5U] : 0.0}; - const Vector3 applied_moment = SpatialMoment(transform, applied_generalized); - const Vector3 reaction_moment = - SpatialMoment(transform, reaction_generalized); + const auto applied = SpatialMomentSO3(phi, Vector3(applied_generalized)); + const auto reaction = SpatialMomentSO3(phi, Vector3(reaction_generalized)); + if (!applied.HasValue() || !reaction.HasValue()) + return Result>::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", + {domain.SourcePath(), 0U}, "NONLINEAR_STATIC_PROCEDURE", + domain.SourceContentIdentity(), + "Nonlinear global equilibrium balance is nonfinite.")); + const Vector3 applied_moment = applied.Value(); + const Vector3 reaction_moment = reaction.Value(); applied_force_resultant = applied_force_resultant + applied_force; applied_moment_resultant = applied_moment_resultant + position.Cross(applied_force) + applied_moment; @@ -694,11 +677,11 @@ Status ApplyIncrementConstraints(const StepDefinition& step, return Status::Ok(); } -AcceptedFrameState AcceptedFrame(const NonlinearAnalysisState& state, +AcceptedFrameState AcceptedFrame(const std::uint32_t frame_index, const NonlinearTrialState& trial, const LoadFactorIncrement& increment, const std::uint32_t iteration) { - return {static_cast(state.AcceptedFrames().size()), + return {frame_index, increment.increment_index, increment.load_factor, iteration, @@ -728,6 +711,15 @@ NonlinearStaticProcedureExecutor::NonlinearStaticProcedureExecutor( Result NonlinearStaticProcedureExecutor::Execute( const Domain& domain, NewtonIterationLogWriter& log) const { + NewtonStepAlgorithm algorithm; + return ExecuteNonlinearStaticCore(domain, log, parallel_for_, tangent_solver_, + algorithm); +} + +Result ExecuteNonlinearStaticCore( + const Domain& domain, NewtonIterationLogWriter& log, + const ParallelFor& parallel_for, TangentSolver& tangent_solver, + EquilibriumAlgorithm& algorithm) { if (domain.Steps().Size() != 1U || !domain.Steps()[0U].IsNonlinearStatic()) { return Result::Failure(ProcedureFailure( FailureCategory::kInput, "invalid-nonlinear-static-data", @@ -782,199 +774,237 @@ NonlinearStaticProcedureExecutor::Execute( return Result::Failure(constraint_status); } - for (std::uint32_t iteration = 1U; iteration <= kMaximumNewtonIterations; - ++iteration) { - NewtonIterationLogRecord record = - NewLogRecord(step, increment, iteration); - trial.Value().increment_index = increment.increment_index; - trial.Value().load_factor = increment.load_factor; - trial.Value().is_factor_zero_baseline = false; + struct ShellStepCandidate { + AcceptedFrameState frame; + NewtonIterationLogRecord record; + }; + const auto next_frame_index = + static_cast(state.Value().AcceptedFrames().size()); + const auto report_failure = [&](NewtonIterationLogRecord* record, + const Status& failure, + NewtonIterationStage stage) { + return RecordFailure(log, record, failure, stage); + }; + const auto write_iteration = [&](const NewtonIterationLogRecord& record) { + return WriteAndFlush(log, record); + }; + ShellFullNewtonStep iteration_step( + [&](std::uint32_t iteration) + -> Result> { + NewtonIterationLogRecord record = + NewLogRecord(step, increment, iteration); + trial.Value().increment_index = increment.increment_index; + trial.Value().load_factor = increment.load_factor; + trial.Value().is_factor_zero_baseline = false; - Status kinematics = PopulateNodalKinematics(domain, &trial.Value()); - if (!kinematics.IsOk()) { - return Result::Failure( - RecordFailure(log, &record, kinematics, - NewtonIterationStage::kKinematicsEvaluated)); - } - record.last_completed_stage = NewtonIterationStage::kKinematicsEvaluated; + Status kinematics = PopulateNodalKinematics(domain, &trial.Value()); + if (!kinematics.IsOk()) { + return Result>::Failure( + report_failure(&record, kinematics, + NewtonIterationStage::kKinematicsEvaluated)); + } + record.last_completed_stage = + NewtonIterationStage::kKinematicsEvaluated; - Result internal = AssembleInternal( - shells.Value(), dofs.Value(), trial.Value().generalized_coordinates, - parallel_for_); - if (!internal.HasValue()) { - return Result::Failure(RecordFailure( - log, &record, internal.GetStatus(), - NewtonIterationStage::kInternalAssembled)); - } - record.last_completed_stage = NewtonIterationStage::kInternalAssembled; + Result internal = AssembleInternal( + shells.Value(), dofs.Value(), + trial.Value().generalized_coordinates, parallel_for); + if (!internal.HasValue()) { + return Result>::Failure( + report_failure(&record, internal.GetStatus(), + NewtonIterationStage::kInternalAssembled)); + } + record.last_completed_stage = + NewtonIterationStage::kInternalAssembled; - Result fixed = - AssembleGlobalFixedLoadContribution( - domain, dofs.Value(), trial.Value().generalized_coordinates, - increment.load_factor); - if (!fixed.HasValue()) { - return Result::Failure( - RecordFailure(log, &record, fixed.GetStatus(), - NewtonIterationStage::kExternalAssembled)); - } - Result pressure = - AssembleSurfacePressure( - analysis_model.Value(), dofs.Value(), - trial.Value().generalized_coordinates, increment.load_factor, - SurfacePressureConfiguration::kCurrent, parallel_for_); - if (!pressure.HasValue()) { - return Result::Failure( - RecordFailure(log, &record, pressure.GetStatus(), - NewtonIterationStage::kExternalAssembled)); - } - Result external = - CombineExternalContributions(fixed.Value(), pressure.Value(), - dofs.Value()); - if (!external.HasValue()) { - return Result::Failure( - RecordFailure(log, &record, external.GetStatus(), - NewtonIterationStage::kExternalAssembled)); - } - record.last_completed_stage = NewtonIterationStage::kExternalAssembled; + Result fixed = + AssembleGlobalFixedLoadContribution( + domain, dofs.Value(), trial.Value().generalized_coordinates, + increment.load_factor); + if (!fixed.HasValue()) { + return Result>::Failure( + report_failure(&record, fixed.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + Result pressure = + AssembleSurfacePressure( + analysis_model.Value(), dofs.Value(), + trial.Value().generalized_coordinates, increment.load_factor, + SurfacePressureConfiguration::kCurrent, parallel_for); + if (!pressure.HasValue()) { + return Result>::Failure( + report_failure(&record, pressure.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + Result external = + CombineExternalContributions(fixed.Value(), pressure.Value(), + dofs.Value()); + if (!external.HasValue()) { + return Result>::Failure( + report_failure(&record, external.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + record.last_completed_stage = + NewtonIterationStage::kExternalAssembled; - Result residual = - Difference(internal.Value().force, - external.Value().generalized_external_force); - if (!residual.HasValue()) { - return Result::Failure(RecordFailure( - log, &record, residual.GetStatus(), - NewtonIterationStage::kExternalAssembled)); - } - Result tangent = - Difference(internal.Value().tangent, - external.Value().generalized_external_tangent, - dofs.Value()); - if (!tangent.HasValue()) { - return Result::Failure(RecordFailure( - log, &record, tangent.GetStatus(), - NewtonIterationStage::kExternalAssembled)); - } - trial.Value().internal_force = std::move(internal.Value().force); - trial.Value().external_force = - std::move(external.Value().generalized_external_force); - trial.Value().residual = std::move(residual.Value()); - trial.Value().reaction = trial.Value().residual; - trial.Value().shell_results = std::move(internal.Value().shell_rows); - trial.Value().physical_strain_energy = - internal.Value().physical_strain_energy; - Result> global_equilibrium = - GlobalEquilibrium(domain, dofs.Value(), trial.Value()); - if (!global_equilibrium.HasValue()) { - return Result::Failure(RecordFailure( - log, &record, global_equilibrium.GetStatus(), - NewtonIterationStage::kExternalAssembled)); - } - trial.Value().global_equilibrium = global_equilibrium.Value(); + Result residual = + Difference(internal.Value().force, + external.Value().generalized_external_force); + if (!residual.HasValue()) { + return Result>::Failure( + report_failure(&record, residual.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + Result tangent = Difference( + internal.Value().tangent, + external.Value().generalized_external_tangent, dofs.Value()); + if (!tangent.HasValue()) { + return Result>::Failure( + report_failure(&record, tangent.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + trial.Value().internal_force = std::move(internal.Value().force); + trial.Value().external_force = + std::move(external.Value().generalized_external_force); + trial.Value().residual = std::move(residual.Value()); + trial.Value().reaction = trial.Value().residual; + trial.Value().shell_results = std::move(internal.Value().shell_rows); + trial.Value().physical_strain_energy = + internal.Value().physical_strain_energy; + Result> global_equilibrium = + GlobalEquilibrium(domain, dofs.Value(), trial.Value()); + if (!global_equilibrium.HasValue()) { + return Result>::Failure( + report_failure(&record, global_equilibrium.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + trial.Value().global_equilibrium = global_equilibrium.Value(); - Result partition = - constraints.Partition(tangent.Value(), dofs.Value()); - if (!partition.HasValue()) { - return Result::Failure(RecordFailure( - log, &record, partition.GetStatus(), - NewtonIterationStage::kExternalAssembled)); - } - const Status factorization = tangent_solver_.FactorizeFresh( - partition.Value().k_ff); - if (!factorization.IsOk()) { - return Result::Failure(RecordFailure( - log, &record, factorization, - NewtonIterationStage::kSolvedCorrection)); - } + Result partition = + constraints.Partition(tangent.Value(), dofs.Value()); + if (!partition.HasValue()) { + return Result>::Failure( + report_failure(&record, partition.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + const Status factorization = + tangent_solver.FactorizeFresh(partition.Value().k_ff); + if (!factorization.IsOk()) { + return Result>::Failure( + report_failure(&record, factorization, + NewtonIterationStage::kSolvedCorrection)); + } - Vector correction_rhs = constraints.GatherFree(trial.Value().residual, - dofs.Value()); - for (std::size_t index = 0U; index < correction_rhs.Size(); ++index) { - correction_rhs[index] = -correction_rhs[index]; - } - Vector correction{dofs.Value().FreeDofCount()}; - const Status solve = - tangent_solver_.SolveCorrection(correction_rhs, correction); - if (!solve.IsOk()) { - return Result::Failure(RecordFailure( - log, &record, solve, NewtonIterationStage::kSolvedCorrection)); - } - record.last_completed_stage = NewtonIterationStage::kSolvedCorrection; + Vector correction_rhs = + constraints.GatherFree(trial.Value().residual, dofs.Value()); + for (std::size_t index = 0U; index < correction_rhs.Size(); ++index) { + correction_rhs[index] = -correction_rhs[index]; + } + Vector correction{dofs.Value().FreeDofCount()}; + const Status solve = + tangent_solver.SolveCorrection(correction_rhs, correction); + if (!solve.IsOk()) { + return Result>::Failure( + report_failure(&record, solve, + NewtonIterationStage::kSolvedCorrection)); + } + record.last_completed_stage = NewtonIterationStage::kSolvedCorrection; - const NewtonConvergenceResult convergence = EvaluateNewtonConvergence({ - {"residual_force", SelectFreeComponents(trial.Value().residual, - dofs.Value(), false), - SelectFreeComponents(trial.Value().internal_force, dofs.Value(), - false), - SelectFreeComponents(trial.Value().external_force, dofs.Value(), - false)}, - {"residual_moment", SelectFreeComponents(trial.Value().residual, - dofs.Value(), true), - SelectFreeComponents(trial.Value().internal_force, dofs.Value(), - true), - SelectFreeComponents(trial.Value().external_force, dofs.Value(), - true)}, - {"correction_translation", - SelectCorrectionComponents(correction, dofs.Value(), false), - CurrentIncrementComponents(trial.Value().generalized_coordinates, - increment_start, dofs.Value(), false)}, - {"correction_rotation", - SelectCorrectionComponents(correction, dofs.Value(), true), - CurrentIncrementComponents(trial.Value().generalized_coordinates, - increment_start, dofs.Value(), true)}}); - record.force_residual = convergence.force_residual; - record.moment_residual = convergence.moment_residual; - record.translation_correction = convergence.translation_correction; - record.rotation_correction = convergence.rotation_correction; - record.combined_passed = convergence.combined_passed; - record.last_completed_stage = NewtonIterationStage::kConvergenceEvaluated; + const NewtonConvergenceResult convergence = EvaluateNewtonConvergence( + {{"residual_force", + SelectFreeComponents(trial.Value().residual, dofs.Value(), + false), + SelectFreeComponents(trial.Value().internal_force, dofs.Value(), + false), + SelectFreeComponents(trial.Value().external_force, dofs.Value(), + false)}, + {"residual_moment", + SelectFreeComponents(trial.Value().residual, dofs.Value(), + true), + SelectFreeComponents(trial.Value().internal_force, dofs.Value(), + true), + SelectFreeComponents(trial.Value().external_force, dofs.Value(), + true)}, + {"correction_translation", + SelectCorrectionComponents(correction, dofs.Value(), false), + CurrentIncrementComponents( + trial.Value().generalized_coordinates, increment_start, + dofs.Value(), false)}, + {"correction_rotation", + SelectCorrectionComponents(correction, dofs.Value(), true), + CurrentIncrementComponents( + trial.Value().generalized_coordinates, increment_start, + dofs.Value(), true)}}); + record.force_residual = convergence.force_residual; + record.moment_residual = convergence.moment_residual; + record.translation_correction = convergence.translation_correction; + record.rotation_correction = convergence.rotation_correction; + record.combined_passed = convergence.combined_passed; + record.last_completed_stage = + NewtonIterationStage::kConvergenceEvaluated; - if (convergence.combined_passed) { - const Status committed = state.Value().CommitAcceptedFrame( - AcceptedFrame(state.Value(), trial.Value(), increment, iteration)); - if (!committed.IsOk()) { - return Result::Failure(RecordFailure( - log, &record, committed, NewtonIterationStage::kAccepted)); - } - record.last_completed_stage = NewtonIterationStage::kAccepted; - record.transition = "accepted"; - record.outcome = "accepted"; - const Status log_status = WriteAndFlush(log, record); - if (!log_status.IsOk()) { - return Result::Failure(log_status); - } - break; - } + if (convergence.combined_passed) { + return Result>::Success( + ShellStepCandidate{AcceptedFrame(next_frame_index, + trial.Value(), increment, + iteration), + record}); + } - if (iteration == kMaximumNewtonIterations) { - const Status failure = ProcedureFailure( - FailureCategory::kSolver, "nonlinear-nonconvergence", - step.Location(), "STATIC", step.Name(), - "The nonlinear procedure did not converge within 100 iterations."); - return Result::Failure(RecordFailure( - log, &record, failure, - NewtonIterationStage::kConvergenceEvaluated)); - } + if (iteration == kMaximumNewtonIterations) { + const Status failure = ProcedureFailure( + FailureCategory::kSolver, "nonlinear-nonconvergence", + step.Location(), "STATIC", step.Name(), + "The nonlinear procedure did not converge within 100 " + "iterations."); + return Result>::Failure( + report_failure(&record, failure, + NewtonIterationStage::kConvergenceEvaluated)); + } - for (std::size_t equation = 0U; equation < dofs.Value().FreeDofs().size(); - ++equation) { - const std::size_t full_dof = dofs.Value().FreeDofs()[equation]; - trial.Value().generalized_coordinates[full_dof] += correction[equation]; - if (!std::isfinite(trial.Value().generalized_coordinates[full_dof])) { - const Status failure = ProcedureFailure( - FailureCategory::kSolver, "nonfinite-newton-data", {}, - "NONLINEAR_STATIC_PROCEDURE", std::to_string(full_dof), - "A nonlinear free-coordinate correction is nonfinite."); - return Result::Failure(RecordFailure( - log, &record, failure, NewtonIterationStage::kSolvedCorrection)); - } - } - record.transition = "continue"; - record.outcome = "not-converged"; - const Status log_status = WriteAndFlush(log, record); - if (!log_status.IsOk()) { - return Result::Failure(log_status); - } + for (std::size_t equation = 0U; + equation < dofs.Value().FreeDofs().size(); ++equation) { + const std::size_t full_dof = dofs.Value().FreeDofs()[equation]; + trial.Value().generalized_coordinates[full_dof] += + correction[equation]; + if (!std::isfinite( + trial.Value().generalized_coordinates[full_dof])) { + const Status failure = ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", std::to_string(full_dof), + "A nonlinear free-coordinate correction is nonfinite."); + return Result>::Failure( + report_failure(&record, failure, + NewtonIterationStage::kSolvedCorrection)); + } + } + record.transition = "continue"; + record.outcome = "not-converged"; + const Status log_status = write_iteration(record); + if (!log_status.IsOk()) { + return Result>::Failure( + log_status); + } + return Result>::Success( + std::nullopt); + }, + kMaximumNewtonIterations); + const Status solved = iteration_step.Solve(algorithm); + if (!solved.IsOk()) + return Result::Failure(solved); + auto candidate = iteration_step.TakeCandidate(); + auto& record = candidate.record; + const Status committed = state.Value().CommitAcceptedFrame(candidate.frame); + if (!committed.IsOk()) { + return Result::Failure(RecordFailure( + log, &record, committed, NewtonIterationStage::kAccepted)); } + record.last_completed_stage = NewtonIterationStage::kAccepted; + record.transition = "accepted"; + record.outcome = "accepted"; + const Status log_status = WriteAndFlush(log, record); + if (!log_status.IsOk()) + return Result::Failure(log_status); } std::vector diagnostics = domain.Warnings(); @@ -983,4 +1013,4 @@ NonlinearStaticProcedureExecutor::Execute( {std::move(state.Value()), std::move(diagnostics)}); } -} // namespace fesa +} // namespace fesa diff --git a/src/fesa/analysis/prepared_analysis.cpp b/src/fesa/analysis/prepared_analysis.cpp index fff5a2e..f562a4e 100644 --- a/src/fesa/analysis/prepared_analysis.cpp +++ b/src/fesa/analysis/prepared_analysis.cpp @@ -1,7 +1,10 @@ #include "fesa/analysis/prepared_analysis.h" +#include #include +#include "analysis_procedures.h" + #include "fesa/analysis/analysis_model.h" #include "fesa/analysis/hht_dynamic_procedure.h" #include "fesa/analysis/linear_frequency_procedure.h" @@ -9,15 +12,13 @@ #include "fesa/analysis/newton_iteration_log.h" #include "fesa/analysis/nonlinear_static_procedure.h" #include "fesa/analysis/solid_frequency_procedure.h" +#include "fesa/analysis/solid_hht_dynamic_procedure.h" +#include "fesa/analysis/solid_static_procedure.h" +#include "fesa/analysis/transient_heat_procedure.h" #include "fesa/app/output_paths.h" #include "fesa/io/abaqus/domain_mapper.h" #include "fesa/io/abaqus/input_reader.h" -#include "fesa/results/dynamic_results_writer.h" -#include "fesa/results/eigen_results_writer.h" -#include "fesa/results/nonlinear_results_writer.h" -#include "fesa/results/results_writer.h" -#include "fesa/results/solid_results_writer.h" -#include "fesa/results/thermal_results_writer.h" +#include "fesa/results/prepared_results_writer.h" namespace fesa { @@ -39,6 +40,185 @@ Result PrepareAnalysisInput( return Result::Success(std::move(prepared)); } +namespace { + +enum class ProcedureKind { + kLinearStatic, + kNonlinearStatic, + kLinearFrequency, + kHhtDynamic, + kSolidStatic, + kSolidFrequency, + kSolidHhtDynamic, + kTransientHeat +}; + +// Keep procedure precedence and step-count diagnostics common to both APIs. +Result SelectProcedure(const Domain& domain) { + if (domain.ThermalStep() != nullptr) + return Result::Success(ProcedureKind::kTransientHeat); + if (domain.Steps().Size() != 1U) { + return Result::Failure(Status::Failure( + FailureCategory::kInput, + {{Severity::kError, + "invalid-analysis-step-count", + {}, + "*STEP", + {}, + "Prepared analysis requires exactly one analysis step."}})); + } + if (domain.IsSolid()) { + if (domain.Dynamic() != nullptr) + return Result::Success(ProcedureKind::kSolidHhtDynamic); + if (domain.Steps()[0U].IsFrequency()) + return Result::Success(ProcedureKind::kSolidFrequency); + return Result::Success(ProcedureKind::kSolidStatic); + } + if (domain.Dynamic() != nullptr) + return Result::Success(ProcedureKind::kHhtDynamic); + if (domain.Steps()[0U].IsFrequency()) + return Result::Success(ProcedureKind::kLinearFrequency); + if (domain.Steps()[0U].IsNonlinearStatic()) + return Result::Success(ProcedureKind::kNonlinearStatic); + return Result::Success(ProcedureKind::kLinearStatic); +} + +template +Result Completed(Result result) { + if (!result.HasValue()) + return Result::Failure(result.GetStatus()); + return Result::Success( + PreparedAnalysisOutcome{std::move(result.Value())}); +} + +Result +MissingExecutor(const char* code, const char* keyword, const char* message) { + return Result::Failure( + Status::Failure(FailureCategory::kSolver, + {{Severity::kError, code, {}, keyword, {}, message}})); +} + +} // namespace + +Result +LinearStaticProcedure::Execute(const Domain& domain) { + return Completed(executor_.Execute(domain)); +} + +Result +NonlinearStaticProcedure::Execute(const Domain& domain) { + return Completed(executor_.Execute(domain, log_)); +} + +Result +LinearFrequencyProcedure::Execute(const Domain& domain) { + return Completed(executor_.Execute(domain)); +} + +Result +HhtDynamicProcedure::Execute(const Domain& domain) { + return Completed(executor_.Execute(domain, log_)); +} + +Result +SolidStaticProcedure::Execute(const Domain& domain) { + SolidStaticState state; + const Status execution = executor_.ExecuteInto(domain, state); + for (const auto& record : state.IterationRecords()) { + const Status written = log_.Write(record, domain.Steps()[0U].Name()); + if (!written.IsOk()) + return Result::Failure(written); + } + if (!execution.IsOk()) + return Result::Failure(execution); + return Result::Success(PreparedAnalysisOutcome{ + SolidStaticExecutionResult{std::move(state), domain.Warnings()}}); +} + +Result +SolidFrequencyProcedure::Execute(const Domain& domain) { + return Completed(executor_.Execute(domain)); +} + +Result +SolidHhtDynamicProcedure::Execute(const Domain& domain) { + auto model = AnalysisModel::Create(domain); + if (!model.HasValue()) + return Result::Failure(model.GetStatus()); + auto dofs = DofManager::Create(model.Value()); + if (!dofs.HasValue()) + return Result::Failure(dofs.GetStatus()); + auto state = SolidDynamicAnalysisState::Create(domain, dofs.Value()); + if (!state.HasValue()) + return Result::Failure(state.GetStatus()); + const Status execution = executor_.ExecuteInto(domain, state.Value()); + for (const auto& record : state.Value().IterationRecords()) { + const Status written = log_.Write(record); + if (!written.IsOk()) + return Result::Failure(written); + } + if (!execution.IsOk()) + return Result::Failure(execution); + return Result::Success( + PreparedAnalysisOutcome{SolidDynamicExecutionResult{ + std::move(dofs.Value()), std::move(state.Value())}}); +} + +Result +TransientHeatProcedure::Execute(const Domain& domain) { + return Completed(executor_.Execute(domain)); +} + +Result> CreateAnalysisProcedure( + const Domain& domain, const ParallelFor& parallel_for, + LinearSolver& linear_solver, TangentSolver& tangent_solver, + const EigenSolver& eigen_solver, NewtonIterationLogWriter& log) { + const auto kind = SelectProcedure(domain); + if (!kind.HasValue()) + return Result>::Failure( + kind.GetStatus()); + std::unique_ptr procedure; + switch (kind.Value()) { + case ProcedureKind::kLinearStatic: + procedure = + std::make_unique(parallel_for, linear_solver); + break; + case ProcedureKind::kNonlinearStatic: + procedure = std::make_unique(parallel_for, + tangent_solver, log); + break; + case ProcedureKind::kLinearFrequency: + procedure = std::make_unique(eigen_solver); + break; + case ProcedureKind::kHhtDynamic: + procedure = std::make_unique( + parallel_for, linear_solver, tangent_solver, log); + break; + case ProcedureKind::kSolidStatic: + procedure = std::make_unique( + parallel_for, linear_solver, tangent_solver, log); + break; + case ProcedureKind::kSolidFrequency: + procedure = std::make_unique(eigen_solver); + break; + case ProcedureKind::kSolidHhtDynamic: + procedure = std::make_unique( + parallel_for, linear_solver, tangent_solver, log); + break; + case ProcedureKind::kTransientHeat: + procedure = + std::make_unique(parallel_for, linear_solver); + break; + } + return Result>::Success( + std::move(procedure)); +} + +Result +ExecutePreparedAnalysis(const Domain& domain, AnalysisProcedure& procedure) { + return procedure.Execute(domain); +} + Result ExecutePreparedAnalysis( const Domain& domain, LinearStaticProcedureExecutor& linear_executor, NonlinearStaticProcedureExecutor& nonlinear_executor, @@ -49,133 +229,59 @@ Result ExecutePreparedAnalysis( const SolidStaticProcedureExecutor* solid_static_executor, const SolidFrequencyProcedureExecutor* solid_frequency_executor, const SolidHhtDynamicProcedureExecutor* solid_dynamic_executor) { - if (domain.ThermalStep() != nullptr) { - if (thermal_executor == nullptr) { - return Result::Failure( - Status::Failure(FailureCategory::kSolver, - {{Severity::kError, - "missing-thermal-executor", - {}, - "HEAT TRANSFER", - {}, - "Thermal execution adapter is required."}})); - } - auto thermal = thermal_executor->Execute(domain); - if (!thermal.HasValue()) { - return Result::Failure(thermal.GetStatus()); - } - return Result::Success( - PreparedAnalysisOutcome{std::move(thermal.Value())}); - } - if (domain.Steps().Size() != 1U) { - return Result::Failure(Status::Failure( - FailureCategory::kInput, - {{Severity::kError, - "invalid-analysis-step-count", - {}, - "*STEP", - {}, - "Prepared analysis requires exactly one analysis step."}})); - } - - if (domain.IsSolid()) { - const auto missing = []() { - return Result::Failure(Status::Failure( - FailureCategory::kSolver, - {{Severity::kError, - "missing-solid-executor", - {}, - "", - {}, - "The selected Solid execution adapter is required."}})); - }; - if (domain.Dynamic() != nullptr) { - if (solid_dynamic_executor == nullptr) return missing(); - auto model = AnalysisModel::Create(domain); - if (!model.HasValue()) - return Result::Failure(model.GetStatus()); - auto dofs = DofManager::Create(model.Value()); - if (!dofs.HasValue()) - return Result::Failure(dofs.GetStatus()); - auto state = SolidDynamicAnalysisState::Create(domain, dofs.Value()); - if (!state.HasValue()) - return Result::Failure(state.GetStatus()); - const Status execution = - solid_dynamic_executor->ExecuteInto(domain, state.Value()); - for (const auto& record : state.Value().IterationRecords()) { - const Status written = log.Write(record); - if (!written.IsOk()) - return Result::Failure(written); - } - if (!execution.IsOk()) - return Result::Failure(execution); - return Result::Success( - PreparedAnalysisOutcome{SolidDynamicExecutionResult{ - std::move(dofs.Value()), std::move(state.Value())}}); - } - if (domain.Steps()[0U].IsFrequency()) { - if (solid_frequency_executor == nullptr) return missing(); - auto result = solid_frequency_executor->Execute(domain); - if (!result.HasValue()) - return Result::Failure(result.GetStatus()); - return Result::Success( - PreparedAnalysisOutcome{std::move(result.Value())}); - } - if (solid_static_executor == nullptr) return missing(); - SolidStaticState state; - const Status execution = solid_static_executor->ExecuteInto(domain, state); - for (const auto& record : state.IterationRecords()) { - const Status written = log.Write(record, domain.Steps()[0U].Name()); - if (!written.IsOk()) - return Result::Failure(written); - } - if (!execution.IsOk()) - return Result::Failure(execution); - return Result::Success(PreparedAnalysisOutcome{ - SolidStaticExecutionResult{std::move(state), domain.Warnings()}}); - } - - if (domain.Dynamic() != nullptr) { + const auto kind = SelectProcedure(domain); + if (!kind.HasValue()) + return Result::Failure(kind.GetStatus()); + std::unique_ptr procedure; + switch (kind.Value()) { + case ProcedureKind::kLinearStatic: + procedure = std::make_unique(linear_executor); + break; + case ProcedureKind::kNonlinearStatic: + procedure = + std::make_unique(nonlinear_executor, log); + break; + case ProcedureKind::kLinearFrequency: + procedure = std::make_unique(frequency_executor); + break; + case ProcedureKind::kHhtDynamic: if (dynamic_executor == nullptr) - return Result::Failure( - Status::Failure(FailureCategory::kSolver, - {{Severity::kError, - "missing-dynamic-executor", - {}, - "DYNAMIC", - {}, - "Dynamic execution adapter is required."}})); - auto dynamic = dynamic_executor->Execute(domain, log); - if (!dynamic.HasValue()) - return Result::Failure(dynamic.GetStatus()); - return Result::Success( - PreparedAnalysisOutcome{std::move(dynamic.Value())}); + return MissingExecutor("missing-dynamic-executor", "DYNAMIC", + "Dynamic execution adapter is required."); + procedure = std::make_unique(*dynamic_executor, log); + break; + case ProcedureKind::kSolidStatic: + if (solid_static_executor == nullptr) + return MissingExecutor( + "missing-solid-executor", "", + "The selected Solid execution adapter is required."); + procedure = + std::make_unique(*solid_static_executor, log); + break; + case ProcedureKind::kSolidFrequency: + if (solid_frequency_executor == nullptr) + return MissingExecutor( + "missing-solid-executor", "", + "The selected Solid execution adapter is required."); + procedure = + std::make_unique(*solid_frequency_executor); + break; + case ProcedureKind::kSolidHhtDynamic: + if (solid_dynamic_executor == nullptr) + return MissingExecutor( + "missing-solid-executor", "", + "The selected Solid execution adapter is required."); + procedure = std::make_unique( + *solid_dynamic_executor, log); + break; + case ProcedureKind::kTransientHeat: + if (thermal_executor == nullptr) + return MissingExecutor("missing-thermal-executor", "HEAT TRANSFER", + "Thermal execution adapter is required."); + procedure = std::make_unique(*thermal_executor); + break; } - if (domain.Steps()[0U].IsFrequency()) { - auto eigen = frequency_executor.Execute(domain); - if (!eigen.HasValue()) { - return Result::Failure(eigen.GetStatus()); - } - return Result::Success( - PreparedAnalysisOutcome{std::move(eigen.Value())}); - } - - if (domain.Steps()[0U].IsNonlinearStatic()) { - Result nonlinear = - nonlinear_executor.Execute(domain, log); - if (!nonlinear.HasValue()) { - return Result::Failure(nonlinear.GetStatus()); - } - return Result::Success( - PreparedAnalysisOutcome{std::move(nonlinear.Value())}); - } - - Result linear = linear_executor.Execute(domain); - if (!linear.HasValue()) { - return Result::Failure(linear.GetStatus()); - } - return Result::Success( - PreparedAnalysisOutcome{std::move(linear.Value())}); + return ExecutePreparedAnalysis(domain, *procedure); } Status FinalizePreparedAnalysisResult( @@ -185,68 +291,10 @@ Status FinalizePreparedAnalysisResult( NonlinearResultsWriter& nonlinear_writer, EigenResultsWriter& eigen_writer, DynamicResultsWriter* dynamic_writer, ThermalResultsWriter* thermal_writer, SolidResultsWriter* solid_writer) { - if (std::holds_alternative(outcome) || - std::holds_alternative(outcome) || - std::holds_alternative(outcome)) { - if (solid_writer == nullptr) - return Status::Failure(FailureCategory::kOutput, - {{Severity::kError, - "missing-solid-writer", - {}, - "", - {}, - "Solid result writer is required."}}); - if (const auto* result = std::get_if(&outcome)) - return solid_writer->Write(paths.results_path, domain, result->state, - diagnostics); - if (const auto* result = std::get_if(&outcome)) - return solid_writer->Write(paths.results_path, domain, *result, - diagnostics); - return solid_writer->Write( - paths.results_path, domain, - std::get(outcome).state, diagnostics); - } - if (std::holds_alternative(outcome)) { - if (thermal_writer == nullptr) { - return Status::Failure(FailureCategory::kOutput, - {{Severity::kError, - "missing-thermal-writer", - {}, - "HEAT TRANSFER", - {}, - "Thermal result writer is required."}}); - } - return thermal_writer->Write( - paths.results_path, domain, - std::get(outcome).state, diagnostics); - } - if (std::holds_alternative(outcome)) { - if (dynamic_writer == nullptr) - return Status::Failure(FailureCategory::kOutput, - {{Severity::kError, - "missing-dynamic-writer", - {}, - "DYNAMIC", - {}, - "Dynamic result writer is required."}}); - return dynamic_writer->Write( - paths.results_path, domain, - std::get(outcome).state, diagnostics); - } - if (std::holds_alternative(outcome)) { - return eigen_writer.Write(paths.results_path, domain, - std::get(outcome), - diagnostics); - } - if (std::holds_alternative(outcome)) { - return linear_writer.Write( - paths.results_path, domain, - std::get(outcome).state, diagnostics); - } - - return nonlinear_writer.Write( - paths.results_path, domain, - std::get(outcome).state, diagnostics); + return WritePreparedAnalysisResult( + paths.results_path, domain, outcome, diagnostics, linear_writer, + nonlinear_writer, eigen_writer, dynamic_writer, thermal_writer, + solid_writer); } } // namespace fesa diff --git a/src/fesa/analysis/shell_state_inventory.h b/src/fesa/analysis/shell_state_inventory.h new file mode 100644 index 0000000..f18fd5a --- /dev/null +++ b/src/fesa/analysis/shell_state_inventory.h @@ -0,0 +1,25 @@ +#ifndef FESA_ANALYSIS_SHELL_STATE_INVENTORY_H_ +#define FESA_ANALYSIS_SHELL_STATE_INVENTORY_H_ + +#include +#include + +#include "fesa/elements/element_definition.h" +#include "fesa/model/domain.h" + +namespace fesa::analysis_internal { + +/// @brief Collects unified MITC4 element indices in stable Domain order. +inline std::vector ShellElementOrder(const Domain& domain) { + std::vector order; + for (std::size_t index = 0U; index < domain.Elements().Size(); ++index) { + if (domain.Elements()[index].Kind() == ElementDefinitionKind::kMitc4Shell) { + order.push_back(static_cast(index)); + } + } + return order; +} + +} // namespace fesa::analysis_internal + +#endif // FESA_ANALYSIS_SHELL_STATE_INVENTORY_H_ diff --git a/src/fesa/analysis/solid_dynamic_analysis_state.cpp b/src/fesa/analysis/solid_dynamic_analysis_state.cpp index d5e2cab..c9bf86d 100644 --- a/src/fesa/analysis/solid_dynamic_analysis_state.cpp +++ b/src/fesa/analysis/solid_dynamic_analysis_state.cpp @@ -1,13 +1,15 @@ #include "fesa/analysis/solid_dynamic_analysis_state.h" -#include #include #include #include +#include "fesa/core/source_identity.h" #include "fesa/elements/element_factory.h" #include "fesa/elements/hex8_element.h" +#include "fesa/model/domain.h" #include "math/high_low_arithmetic.h" +#include "math/finite_values.h" namespace fesa { namespace { @@ -24,8 +26,7 @@ Status Failure(const std::string& message) { /// @brief Checks a physical record without replacing nonfinite quantities. template bool Finite(const std::array& values) { - return std::all_of(values.begin(), values.end(), - [](double x) { return std::isfinite(x); }); + return math_internal::IsFinite(values); } bool ValidPair(double high, double low) { const math_internal::HighLow value(high, low); @@ -44,12 +45,6 @@ bool ValidPair(const std::array& high, if (!ValidPair(high[i], low[i])) return false; return true; } -/// @brief Preserves canonical and raw source identity independently of indices. -bool SameId(const SourceEntityId& a, const SourceEntityId& b) { - return a.instance_name == b.instance_name && - a.source_label == b.source_label && - a.source_label_text == b.source_label_text; -} } // namespace Result SolidDynamicAnalysisState::Create( @@ -83,7 +78,7 @@ Result SolidDynamicAnalysisState::Create( auto runtime = factory.Create(domain.Elements()[e], domain); if (!runtime.HasValue()) return Result::Failure(runtime.GetStatus()); - const auto* solid = dynamic_cast(runtime.Value().get()); + auto solid = factory.BindSolidTrial(*runtime.Value()); if (solid == nullptr) return Result::Failure(Failure( "Dynamic Solid inventory contains a different element family.")); @@ -117,7 +112,7 @@ Status SolidDynamicAnalysisState::CommitAcceptedFrame( } for (std::size_t n = 0; n < source_ids_.size(); ++n) if (f.nodal_internal_order[n] != n || - !SameId(f.nodal_source_ids[n], source_ids_[n])) + !SourceIdentityEquals(f.nodal_source_ids[n], source_ids_[n])) return Failure("Solid nodal source identity differs from its inventory."); const std::array high{ &f.displacement, &f.velocity, diff --git a/src/fesa/analysis/solid_frequency_procedure.cpp b/src/fesa/analysis/solid_frequency_procedure.cpp index f3a33dc..b035ce2 100644 --- a/src/fesa/analysis/solid_frequency_procedure.cpp +++ b/src/fesa/analysis/solid_frequency_procedure.cpp @@ -18,6 +18,7 @@ #include "fesa/elements/hex8_element.h" #include "fesa/fem/dof_manager.h" #include "fesa/math/sparse_matrix.h" +#include "fesa/solvers/eigen/mkl_feast_eigen_solver.h" #include "fesa/math/vector.h" #include "fesa/model/domain.h" @@ -50,7 +51,8 @@ double Ratio(double numerator, double denominator) { return numerator / denominator; } /// @brief Builds an immutable candidate; all returns precede public commit. -Result ExecuteCandidate(const Domain& domain) { +Result ExecuteCandidate(const Domain& domain, + const EigenSolver& solver) { const auto* frequency = domain.Frequency(); if (!domain.IsSolid() || frequency == nullptr || frequency->requested_mode_count <= 0) @@ -76,6 +78,7 @@ Result ExecuteCandidate(const Domain& domain) { } ElementFactory factory; std::vector> owned; + std::vector> trials; ElementView view; for (const auto index : model.Value().ActiveElements()) { const auto& definition = domain.Elements()[index]; @@ -87,11 +90,13 @@ Result ExecuteCandidate(const Domain& domain) { auto element = factory.Create(definition, domain); if (!element.HasValue()) return Result::Failure(element.GetStatus()); - if (dynamic_cast(element.Value().get()) == nullptr) + auto trial = factory.BindSolidTrial(*element.Value()); + if (trial == nullptr) return Result::Failure( Failure("unsupported-frequency-element", "Only C3D8 is supported.")); view.emplace_back(*element.Value()); owned.push_back(std::move(element.Value())); + trials.push_back(std::move(trial)); } DofManager dofs; const Status mapping = dofs.Build(model.Value(), view); @@ -121,7 +126,7 @@ Result ExecuteCandidate(const Domain& domain) { std::vector additions_by_dof(dofs.FullDofCount(), 0U); constexpr double eps = std::numeric_limits::epsilon(); for (std::size_t e = 0; e < owned.size(); ++e) { - const auto& hex = static_cast(*owned[e]); + const auto& hex = *trials[e]; auto mass = hex.ComputeMass(); if (!mass.HasValue()) return Result::Failure(mass.GetStatus()); @@ -220,7 +225,7 @@ Result ExecuteCandidate(const Domain& domain) { return Result::Failure( Failure("invalid-solid-eigen-scale", "A positive finite classification scale is required.")); - auto backend = MklFeastEigenSolver{}.SolveGeneralized(k, m, requested, + auto backend = solver.SolveGeneralized(k, m, requested, mass_lower, scale); if (!backend.HasValue()) return Result::Failure(backend.GetStatus()); @@ -269,11 +274,11 @@ Result ExecuteCandidate(const Domain& domain) { "Normalized modal vector is not finite.")); } mv = m.Multiply(vector); - const Vector kv = k.Multiply(vector); + Vector kv = k.Multiply(vector); const double lambda = state.backend.eigenvalues[c]; const double modal_mass = vector.Dot(mv); const double energy = vector.Dot(kv); - Vector residual = kv; + Vector residual = std::move(kv); residual.Axpy(-lambda, mv); const double norm_phi = vector.Norm(); const double residual_norm = residual.Norm(); @@ -355,7 +360,8 @@ Result ExecuteCandidate(const Domain& domain) { Result SolidFrequencyProcedureExecutor::Execute( const Domain& domain) const { try { - auto result = ExecuteCandidate(domain); + const MklFeastEigenSolver default_solver; + auto result = ExecuteCandidate(domain, solver_ ? *solver_ : default_solver); if (result.HasValue()) return result; auto diagnostics = result.GetStatus().Diagnostics(); for (auto& diagnostic : diagnostics) diff --git a/src/fesa/analysis/solid_hht_core.h b/src/fesa/analysis/solid_hht_core.h new file mode 100644 index 0000000..75f93a1 --- /dev/null +++ b/src/fesa/analysis/solid_hht_core.h @@ -0,0 +1,20 @@ +#ifndef FESA_ANALYSIS_SOLID_HHT_CORE_H_ +#define FESA_ANALYSIS_SOLID_HHT_CORE_H_ +#include "fesa/core/status.h" +namespace fesa { +namespace detail { class SolidHhtIntegrator; } +class Domain; +class SolidDynamicAnalysisState; +class ParallelFor; +class LinearSolver; +class TangentSolver; +class EquilibriumAlgorithm; +/// @brief Runs the complete production core with borrowed iteration policy. +/// @note Adapters outlive this synchronous call; history remains state-owned. +Status ExecuteSolidHhtCore( + const Domain& domain, SolidDynamicAnalysisState& state, double alpha, + const ParallelFor& parallel_for, LinearSolver& mass_solver, + TangentSolver& tangent_solver, const detail::SolidHhtIntegrator& integrator, + EquilibriumAlgorithm& algorithm); +} // namespace fesa +#endif // FESA_ANALYSIS_SOLID_HHT_CORE_H_ diff --git a/src/fesa/analysis/solid_hht_dynamic_procedure.cpp b/src/fesa/analysis/solid_hht_dynamic_procedure.cpp index f0a833f..d5f5d89 100644 --- a/src/fesa/analysis/solid_hht_dynamic_procedure.cpp +++ b/src/fesa/analysis/solid_hht_dynamic_procedure.cpp @@ -1,5 +1,9 @@ #include "fesa/analysis/solid_hht_dynamic_procedure.h" +#include "equilibrium_algorithm.h" +#include "analysis/solid_hht_core.h" +#include "solid_hht_integrator.h" + #include #include #include @@ -85,7 +89,7 @@ Status CheckArithmeticEnvironment(const Domain& domain) { /// @brief Owns immutable kernels and the stable full-space translation scatter. struct RuntimeSolid { std::unique_ptr owner; - const Hex8Element* solid; + std::unique_ptr solid; std::vector scatter; }; /// @brief Creates checked kernels in declaration order, with no mutable element @@ -98,7 +102,7 @@ Result> BuildSolids(const Domain& domain, auto owner = factory.Create(domain.Elements()[e], domain); if (!owner.HasValue()) return Result>::Failure(owner.GetStatus()); - const auto* solid = dynamic_cast(owner.Value().get()); + auto solid = factory.BindSolidTrial(*owner.Value()); if (solid == nullptr) return Result>::Failure( Failure(domain, "solid-dynamic-element-family", @@ -107,7 +111,7 @@ Result> BuildSolids(const Domain& domain, if (!scatter.HasValue()) return Result>::Failure(scatter.GetStatus()); solids.push_back( - {std::move(owner.Value()), solid, std::move(scatter.Value())}); + {std::move(owner.Value()), std::move(solid), std::move(scatter.Value())}); } return Result>::Success(std::move(solids)); } @@ -239,7 +243,7 @@ Result ReferenceLength(const Domain& domain) { "Reference length is not finite positive.")); return Result::Success(length); } -/// @brief Forms M/(beta*h²)+(1+alpha)*Kt in the unchanged full sparse pattern. +/// @brief Forms M/(beta*h^2)+(1+alpha)*Kt in the unchanged full sparse pattern. Result EffectiveTangent(const SparseMatrix& m, const PairedTangent& k, const DofManager& dofs, double h, @@ -549,24 +553,6 @@ bool CorrectionPass(const std::array& metrics) { Compare(x, HighLow(1e-10)) <= 0; }); } -Status SetRates(const SolidDynamicAcceptedFrameState& old, - const detail::SolidHhtPairedPredictor& predictor, double h, - const HhtParameters& p, - SolidDynamicAcceptedFrameState* candidate) { - auto rates = detail::EvaluateSolidHhtHighLowRates( - candidate->displacement, candidate->low.displacement, predictor, - old.acceleration, old.low.acceleration, h, p); - if (!rates.HasValue()) return rates.GetStatus(); - candidate->velocity = std::move(rates.Value().velocity); - candidate->low.velocity = std::move(rates.Value().velocity_low); - candidate->acceleration = std::move(rates.Value().acceleration); - candidate->low.acceleration = std::move(rates.Value().acceleration_low); - candidate->algorithmic_acceleration = - std::move(rates.Value().algorithmic_acceleration); - candidate->low.algorithmic_acceleration = - std::move(rates.Value().algorithmic_acceleration_low); - return Status::Ok(); -} } // namespace SolidHhtDynamicProcedureExecutor::SolidHhtDynamicProcedureExecutor( @@ -600,6 +586,17 @@ Status SolidHhtDynamicProcedureExecutor::ExecuteInto( Status SolidHhtDynamicProcedureExecutor::ExecuteIntoForVerification( const Domain& domain, SolidDynamicAnalysisState& state, double alpha) const { + const detail::PairedSolidHhtIntegrator integrator; + NewtonStepAlgorithm algorithm; + return ExecuteSolidHhtCore(domain, state, alpha, parallel_for_, mass_solver_, + tangent_solver_, integrator, algorithm); +} + +Status ExecuteSolidHhtCore( + const Domain& domain, SolidDynamicAnalysisState& state, double alpha, + const ParallelFor& parallel_for, LinearSolver& mass_solver, + TangentSolver& tangent_solver, const detail::SolidHhtIntegrator& integrator, + EquilibriumAlgorithm& algorithm) { SolidDynamicIterationRecord record; auto fail = [&](const Status& failure) { record.stage = "failed"; @@ -630,7 +627,7 @@ Status SolidHhtDynamicProcedureExecutor::ExecuteIntoForVerification( auto mass_partition = partition.Partition(mass.Value(), dofs); if (!mass_partition.HasValue()) return fail(mass_partition.GetStatus()); if (dofs.FreeDofCount() != 0) { - const auto status = mass_solver_.Factorize(mass_partition.Value().k_ff); + const auto status = mass_solver.Factorize(mass_partition.Value().k_ff); if (!status.IsOk()) return fail(status); environment = CheckArithmeticEnvironment(domain); if (!environment.IsOk()) return fail(environment); @@ -655,7 +652,7 @@ Status SolidHhtDynamicProcedureExecutor::ExecuteIntoForVerification( if (!force.HasValue()) return fail(force.GetStatus()); initial.external_force = std::move(force.Value()); auto tangent = - EvaluateSolids(domain, solids.Value(), dofs, parallel_for_, &initial); + EvaluateSolids(domain, solids.Value(), dofs, parallel_for, &initial); if (!tangent.HasValue()) return fail(tangent.GetStatus()); SolidDynamicIterationEvidence evidence; bool initial_converged = false; @@ -682,7 +679,7 @@ Status SolidHhtDynamicProcedureExecutor::ExecuteIntoForVerification( const auto i = dofs.FreeDofs()[j]; rhs[j] = Rounded(Negate(Pair(initial.residual, initial.low.residual, i))); } - status = mass_solver_.Solve(rhs, a); + status = mass_solver.Solve(rhs, a); if (!status.IsOk()) return fail(status); environment = CheckArithmeticEnvironment(domain); if (!environment.IsOk()) return fail(environment); @@ -726,145 +723,188 @@ Status SolidHhtDynamicProcedureExecutor::ExecuteIntoForVerification( record = {}; record.increment_index = increment; record.time = static_cast(increment) * h; - auto predictor = detail::PredictSolidHhtHighLow(old, h, p); - if (!predictor.HasValue()) return fail(predictor.GetStatus()); - auto candidate = old; - candidate.frame_index = candidate.increment_index = increment; - candidate.iteration_count = 0; - candidate.time = record.time; - candidate.is_initial = false; - candidate.iterations.clear(); - // Begin from certified accepted geometry, not an unchecked predictor. - force = LoadAssembler::AssembleFullNodalLoad(model.Value(), dofs, - candidate.time); - if (!force.HasValue()) return fail(force.GetStatus()); - candidate.external_force = std::move(force.Value()); - candidate.low.external_force = Vector(dofs.FullDofCount()); - std::array correction{}, fresh_correction{}; - bool accepted = false; - for (std::uint32_t iteration = 0; iteration <= 100; ++iteration) { - record.stage = "evaluation"; - record.outcome = "paired-candidate"; - record.evidence = {}; - record.evidence.iteration_index = iteration; - status = SetRates(old, predictor.Value(), h, p, &candidate); - if (!status.IsOk()) return fail(status); - tangent = EvaluateSolids(domain, solids.Value(), dofs, parallel_for_, - &candidate); - if (!tangent.HasValue()) return fail(tangent.GetStatus()); - status = RecoverEndpoint(domain, dofs, mass.Value(), &old, initial_energy, - &candidate, &record.evidence); - if (!status.IsOk()) return fail(status); - auto MA = detail::MultiplySolidHhtMassHighLow( - mass.Value(), candidate.algorithmic_acceleration, - candidate.low.algorithmic_acceleration); - if (!MA.HasValue()) return fail(MA.GetStatus()); - Vector rhs(dofs.FreeDofCount()); - HighLow identity_metric, original_norm, solved_norm, old_norm; - for (std::size_t j = 0; j < dofs.FreeDofCount(); ++j) { - const auto i = dofs.FreeDofs()[j]; - detail::SolidHhtPairedForceIdentity identity; - if (!detail::EvaluateSolidHhtHighLowForceIdentity( - mass.Value(), i, Pair(MA.Value().high, MA.Value().low, i), - candidate, old, p.alpha, &identity)) - return fail( - Failure(domain, "solid-dynamic-nonfinite-residual", - "Paired weighted force arithmetic is unsupported.")); - rhs[j] = Rounded(Negate(identity.solved)); - identity_metric = Maximum(identity_metric, identity.metric); - original_norm = Maximum(original_norm, Abs(identity.original)); - solved_norm = Maximum(solved_norm, Abs(identity.solved)); - old_norm = - Maximum(old_norm, Abs(Pair(old.residual, old.low.residual, i))); - if (i == record.evidence.worst_full_dof) - record.evidence.worst_weighted_terms = { - Rounded(identity.original), Rounded(identity.solved), - Rounded(Pair(old.residual, old.low.residual, i)), - Rounded(identity.scale)}; - } - if (!Valid(identity_metric) || !Valid(original_norm) || - !Valid(solved_norm) || !Valid(old_norm) || - Compare(identity_metric, HighLow(1e-12)) > 0) - return fail(Failure(domain, - "solid-dynamic-weighted-algebra-inconsistency", - "Paired original and solved forces disagree beyond " - "their uncancelled scale.")); - record.evidence.weighted_equivalence_metric = Rounded(identity_metric); - record.evidence.weighted_residual_numerator = Rounded(original_norm); - record.evidence.recombined_residual_numerator = Rounded(solved_norm); - record.evidence.old_residual_numerator = Rounded(old_norm); - for (std::size_t c = 0; c < 4; ++c) { - if (!Valid(correction[c]) || !Valid(fresh_correction[c])) - return fail(detail::SolidHhtPairedKinematicsFailure()); - record.evidence.correction_metrics[c] = Rounded(correction[c]); - } - record.evidence.correction_pass = - CorrectionPass(correction) && CorrectionPass(fresh_correction); - const auto update = CheckUpdates(old, candidate, p, h); - if (!Valid(update)) - return fail(detail::SolidHhtPairedKinematicsFailure()); - record.evidence.update_metric = Rounded(update); - record.evidence.update_pass = Compare(update, HighLow(1e-12)) <= 0; - candidate.iterations.push_back(record.evidence); - candidate.iteration_count = iteration; - if (record.evidence.residual_pass && record.evidence.correction_pass && - record.evidence.update_pass) { - status = state.CommitAcceptedFrame(candidate); - if (!status.IsOk()) return fail(status); - record.stage = "accepted"; - record.outcome = "increment"; - state.RecordIteration(record); - accepted = true; - break; - } - state.RecordIteration(record); - if (iteration == 100) - return fail(Failure( - domain, "solid-dynamic-nonconvergence", - "Paired HHT endpoint did not converge in100 Newton solves.")); - auto effective = - EffectiveTangent(mass.Value(), tangent.Value(), dofs, h, p); - if (!effective.HasValue()) return fail(effective.GetStatus()); - auto reduced = partition.Partition(effective.Value(), dofs); - if (!reduced.HasValue()) return fail(reduced.GetStatus()); - Vector du(dofs.FreeDofCount()); - if (dofs.FreeDofCount() != 0) { - status = tangent_solver_.FactorizeFresh(reduced.Value().k_ff); - if (!status.IsOk()) return fail(status); - environment = CheckArithmeticEnvironment(domain); - if (!environment.IsOk()) return fail(environment); - status = tangent_solver_.SolveCorrection(rhs, du); - if (!status.IsOk()) return fail(status); - environment = CheckArithmeticEnvironment(domain); - if (!environment.IsOk()) return fail(environment); - } - if (du.Size() != dofs.FreeDofCount()) - return fail(Failure(domain, "solid-dynamic-invalid-backend-result", - "Tangent solve returned incompatible correction.")); - for (std::size_t j = 0; j < du.Size(); ++j) - if (!std::isfinite(du[j])) - return fail(Failure(domain, "solid-dynamic-invalid-backend-result", - "Tangent solve returned nonfinite correction.")); - fresh_correction = FreshCorrectionMetrics(du, length.Value(), p); - const auto before = candidate; - for (std::size_t j = 0; j < du.Size(); ++j) { - const auto i = dofs.FreeDofs()[j]; - const auto value = - Add(Pair(candidate.displacement, candidate.low.displacement, i), - HighLow(du[j] == 0 ? 0.0 : du[j])); - if (!Valid(value)) - return fail(detail::SolidHhtPairedKinematicsFailure()); - Store(value, &candidate.displacement, &candidate.low.displacement, i); - } - status = SetRates(old, predictor.Value(), h, p, &candidate); - if (!status.IsOk()) return fail(status); - correction = - ObservedCorrectionMetrics(before, candidate, h, length.Value()); - } - if (!accepted) - return fail(Failure(domain, "solid-dynamic-nonconvergence", - "No complete paired endpoint was accepted.")); + status = detail::RunSolidHhtStep( + integrator, old, h, p, fail, + [&](const detail::SolidHhtIntegrator& step_integrator, + const detail::SolidHhtPairedPredictor& predictor) + -> Result { + auto candidate = old; + candidate.frame_index = candidate.increment_index = increment; + candidate.iteration_count = 0; + candidate.time = record.time; + candidate.is_initial = false; + candidate.iterations.clear(); + // Begin from certified accepted geometry, not an unchecked predictor. + force = LoadAssembler::AssembleFullNodalLoad(model.Value(), dofs, + candidate.time); + if (!force.HasValue()) + return Result::Failure(fail(force.GetStatus())); + candidate.external_force = std::move(force.Value()); + candidate.low.external_force = Vector(dofs.FullDofCount()); + std::array correction{}, fresh_correction{}; + using StepResult = Result>; + const auto report_failure = fail; + const auto record_iteration = [&](const auto& value) { + state.RecordIteration(value); + }; + SolidHhtStep iteration_step( + [&](std::uint32_t iteration) -> StepResult { + const auto fail = [&](const Status& failure) { + return StepResult::Failure(report_failure(failure)); + }; + record.stage = "evaluation"; + record.outcome = "paired-candidate"; + record.evidence = {}; + record.evidence.iteration_index = iteration; + status = + detail::SetSolidHhtRates(step_integrator, old, predictor, h, p, &candidate); + if (!status.IsOk()) + return fail(status); + tangent = EvaluateSolids(domain, solids.Value(), dofs, parallel_for, + &candidate); + if (!tangent.HasValue()) + return fail(tangent.GetStatus()); + status = + RecoverEndpoint(domain, dofs, mass.Value(), &old, initial_energy, + &candidate, &record.evidence); + if (!status.IsOk()) + return fail(status); + auto MA = detail::MultiplySolidHhtMassHighLow( + mass.Value(), candidate.algorithmic_acceleration, + candidate.low.algorithmic_acceleration); + if (!MA.HasValue()) + return fail(MA.GetStatus()); + Vector rhs(dofs.FreeDofCount()); + HighLow identity_metric, original_norm, solved_norm, old_norm; + for (std::size_t j = 0; j < dofs.FreeDofCount(); ++j) { + const auto i = dofs.FreeDofs()[j]; + detail::SolidHhtPairedForceIdentity identity; + if (!detail::EvaluateSolidHhtHighLowForceIdentity( + mass.Value(), i, Pair(MA.Value().high, MA.Value().low, i), + candidate, old, p.alpha, &identity)) + return fail( + Failure(domain, "solid-dynamic-nonfinite-residual", + "Paired weighted force arithmetic is unsupported.")); + rhs[j] = Rounded(Negate(identity.solved)); + identity_metric = Maximum(identity_metric, identity.metric); + original_norm = Maximum(original_norm, Abs(identity.original)); + solved_norm = Maximum(solved_norm, Abs(identity.solved)); + old_norm = + Maximum(old_norm, Abs(Pair(old.residual, old.low.residual, i))); + if (i == record.evidence.worst_full_dof) + record.evidence.worst_weighted_terms = { + Rounded(identity.original), Rounded(identity.solved), + Rounded(Pair(old.residual, old.low.residual, i)), + Rounded(identity.scale)}; + } + if (!Valid(identity_metric) || !Valid(original_norm) || + !Valid(solved_norm) || !Valid(old_norm) || + Compare(identity_metric, HighLow(1e-12)) > 0) + return fail( + Failure(domain, "solid-dynamic-weighted-algebra-inconsistency", + "Paired original and solved forces disagree beyond " + "their uncancelled scale.")); + record.evidence.weighted_equivalence_metric = + Rounded(identity_metric); + record.evidence.weighted_residual_numerator = Rounded(original_norm); + record.evidence.recombined_residual_numerator = Rounded(solved_norm); + record.evidence.old_residual_numerator = Rounded(old_norm); + for (std::size_t c = 0; c < 4; ++c) { + if (!Valid(correction[c]) || !Valid(fresh_correction[c])) + return fail(detail::SolidHhtPairedKinematicsFailure()); + record.evidence.correction_metrics[c] = Rounded(correction[c]); + } + record.evidence.correction_pass = + CorrectionPass(correction) && CorrectionPass(fresh_correction); + const auto update = CheckUpdates(old, candidate, p, h); + if (!Valid(update)) + return fail(detail::SolidHhtPairedKinematicsFailure()); + record.evidence.update_metric = Rounded(update); + record.evidence.update_pass = Compare(update, HighLow(1e-12)) <= 0; + candidate.iterations.push_back(record.evidence); + candidate.iteration_count = iteration; + if (record.evidence.residual_pass && + record.evidence.correction_pass && record.evidence.update_pass) { + return StepResult::Success(candidate); + } + record_iteration(record); + if (iteration == 100) + return fail(Failure( + domain, "solid-dynamic-nonconvergence", + "Paired HHT endpoint did not converge in100 Newton solves.")); + auto effective = + EffectiveTangent(mass.Value(), tangent.Value(), dofs, h, p); + if (!effective.HasValue()) + return fail(effective.GetStatus()); + auto reduced = partition.Partition(effective.Value(), dofs); + if (!reduced.HasValue()) + return fail(reduced.GetStatus()); + Vector du(dofs.FreeDofCount()); + if (dofs.FreeDofCount() != 0) { + status = tangent_solver.FactorizeFresh(reduced.Value().k_ff); + if (!status.IsOk()) + return fail(status); + environment = CheckArithmeticEnvironment(domain); + if (!environment.IsOk()) + return fail(environment); + status = tangent_solver.SolveCorrection(rhs, du); + if (!status.IsOk()) + return fail(status); + environment = CheckArithmeticEnvironment(domain); + if (!environment.IsOk()) + return fail(environment); + } + if (du.Size() != dofs.FreeDofCount()) + return fail( + Failure(domain, "solid-dynamic-invalid-backend-result", + "Tangent solve returned incompatible correction.")); + for (std::size_t j = 0; j < du.Size(); ++j) + if (!std::isfinite(du[j])) + return fail( + Failure(domain, "solid-dynamic-invalid-backend-result", + "Tangent solve returned nonfinite correction.")); + fresh_correction = FreshCorrectionMetrics(du, length.Value(), p); + const auto before = candidate; + for (std::size_t j = 0; j < du.Size(); ++j) { + const auto i = dofs.FreeDofs()[j]; + const auto value = + Add(Pair(candidate.displacement, candidate.low.displacement, i), + HighLow(du[j] == 0 ? 0.0 : du[j])); + if (!Valid(value)) + return fail(detail::SolidHhtPairedKinematicsFailure()); + Store(value, &candidate.displacement, &candidate.low.displacement, + i); + } + status = + detail::SetSolidHhtRates(step_integrator, old, predictor, h, p, &candidate); + if (!status.IsOk()) + return fail(status); + correction = + ObservedCorrectionMetrics(before, candidate, h, length.Value()); + return StepResult::Success(std::nullopt); + }, + 100U); + const Status solved = iteration_step.Solve(algorithm); + if (!solved.IsOk()) + return Result::Failure(solved); + if (!iteration_step.HasCandidate()) + return Result::Failure( + fail(Failure(domain, "solid-dynamic-nonconvergence", + "No complete paired endpoint was accepted."))); + return Result::Success( + iteration_step.TakeCandidate()); + }, + [&](SolidDynamicAcceptedFrameState&& accepted_candidate) -> Status { + status = state.CommitAcceptedFrame(accepted_candidate); + if (!status.IsOk()) + return fail(status); + record.stage = "accepted"; + record.outcome = "increment"; + state.RecordIteration(record); + return Status::Ok(); + }); + if (!status.IsOk()) return status; } return Status::Ok(); } -} // namespace fesa +} // namespace fesa diff --git a/src/fesa/analysis/solid_hht_integrator.h b/src/fesa/analysis/solid_hht_integrator.h new file mode 100644 index 0000000..4a4ea0e --- /dev/null +++ b/src/fesa/analysis/solid_hht_integrator.h @@ -0,0 +1,75 @@ +#ifndef FESA_ANALYSIS_SOLID_HHT_INTEGRATOR_H_ +#define FESA_ANALYSIS_SOLID_HHT_INTEGRATOR_H_ + +#include +#include "analysis/solid_hht_high_low.h" + +namespace fesa::detail { + +/// @brief Predicts and evaluates complete paired mechanical HHT kinematics. +class SolidHhtIntegrator { + public: + virtual ~SolidHhtIntegrator() = default; + virtual Result Predict( + const SolidDynamicAcceptedFrameState& old, double h, + const HhtParameters& parameters) const = 0; + virtual Result EvaluateRates( + const Vector& high, const Vector& low, + const SolidHhtPairedPredictor& predictor, const Vector& old_acceleration, + const Vector& old_acceleration_low, double h, + const HhtParameters& parameters) const = 0; +}; + +/// @brief Retains every high/low physical and auxiliary acceleration channel. +class PairedSolidHhtIntegrator final : public SolidHhtIntegrator { + public: + Result Predict( + const SolidDynamicAcceptedFrameState& old, double h, + const HhtParameters& parameters) const override { + return PredictSolidHhtHighLow(old, h, parameters); + } + Result EvaluateRates( + const Vector& high, const Vector& low, + const SolidHhtPairedPredictor& predictor, const Vector& old_acceleration, + const Vector& old_acceleration_low, double h, + const HhtParameters& parameters) const override { + return EvaluateSolidHhtHighLowRates(high, low, predictor, old_acceleration, + old_acceleration_low, h, parameters); + } +}; + +inline Status SetSolidHhtRates(const SolidHhtIntegrator& integrator, + const SolidDynamicAcceptedFrameState& old, + const SolidHhtPairedPredictor& predictor, double h, + const HhtParameters& p, + SolidDynamicAcceptedFrameState* candidate) { + auto rates = integrator.EvaluateRates( + candidate->displacement, candidate->low.displacement, predictor, + old.acceleration, old.low.acceleration, h, p); + if (!rates.HasValue()) return rates.GetStatus(); + candidate->velocity = std::move(rates.Value().velocity); + candidate->low.velocity = std::move(rates.Value().velocity_low); + candidate->acceleration = std::move(rates.Value().acceleration); + candidate->low.acceleration = std::move(rates.Value().acceleration_low); + candidate->algorithmic_acceleration = + std::move(rates.Value().algorithmic_acceleration); + candidate->low.algorithmic_acceleration = + std::move(rates.Value().algorithmic_acceleration_low); + return Status::Ok(); +} +/// @brief Preserves predictor failure recording, endpoint evaluation and commit. +/// @note Borrowed callbacks do not escape; only commit may update history. +template +Status RunSolidHhtStep(const SolidHhtIntegrator& integrator, + const SolidDynamicAcceptedFrameState& old, double h, + const HhtParameters& parameters, Failure&& failure, + Evaluate&& evaluate, Commit&& commit) { + auto predictor = integrator.Predict(old, h, parameters); + if (!predictor.HasValue()) return failure(predictor.GetStatus()); + auto pending = evaluate(integrator, predictor.Value()); + if (!pending.HasValue()) return pending.GetStatus(); + return commit(std::move(pending.Value())); +} + +} // namespace fesa::detail +#endif // FESA_ANALYSIS_SOLID_HHT_INTEGRATOR_H_ diff --git a/src/fesa/analysis/solid_static_core.h b/src/fesa/analysis/solid_static_core.h new file mode 100644 index 0000000..139532c --- /dev/null +++ b/src/fesa/analysis/solid_static_core.h @@ -0,0 +1,27 @@ +#ifndef FESA_ANALYSIS_SOLID_STATIC_CORE_H_ +#define FESA_ANALYSIS_SOLID_STATIC_CORE_H_ +#include "fesa/core/status.h" +namespace fesa { +class Domain; +class SolidStaticState; +class ParallelFor; +class LinearSolver; +class TangentSolver; +class EquilibriumAlgorithm; +/// @brief Borrows the production static core's execution/solve/iteration policy. +/// @note Every adapter must outlive ExecuteInto; state owns accepted history. +class SolidStaticCore { + public: + SolidStaticCore(const ParallelFor& parallel_for, LinearSolver& linear_solver, + TangentSolver& tangent_solver, EquilibriumAlgorithm& algorithm) + : parallel_for_(parallel_for), linear_solver_(linear_solver), + tangent_solver_(tangent_solver), algorithm_(algorithm) {} + Status ExecuteInto(const Domain& domain, SolidStaticState& state) const; + private: + const ParallelFor& parallel_for_; + LinearSolver& linear_solver_; + TangentSolver& tangent_solver_; + EquilibriumAlgorithm& algorithm_; +}; +} // namespace fesa +#endif // FESA_ANALYSIS_SOLID_STATIC_CORE_H_ diff --git a/src/fesa/analysis/solid_static_procedure.cpp b/src/fesa/analysis/solid_static_procedure.cpp index eeb3195..35c23bb 100644 --- a/src/fesa/analysis/solid_static_procedure.cpp +++ b/src/fesa/analysis/solid_static_procedure.cpp @@ -1,5 +1,8 @@ #include "fesa/analysis/solid_static_procedure.h" +#include "equilibrium_algorithm.h" +#include "analysis/solid_static_core.h" + #include #include #include @@ -21,6 +24,8 @@ #include "fesa/solvers/linear/linear_solver.h" #include "fesa/solvers/linear/tangent_solver.h" +#include "assembly/ordered_contribution_internal.h" + namespace fesa { namespace { constexpr std::uint32_t kMaximumIterations = 100U; @@ -28,7 +33,7 @@ constexpr double kRoundoffBudget = 512.0 * std::numeric_limits::epsilon(); struct RuntimeSolid { - const Hex8Element* element; + std::unique_ptr element; std::vector scatter; }; struct SolidAssembly { @@ -131,9 +136,8 @@ Result Assemble(const std::vector& solids, const auto& response = responses[e]->Value(); for (std::size_t i = 0U; i < 24U; ++i) { force[solids[e].scatter[i]] += response.internal_force[i]; - for (std::size_t j = 0U; j < 24U; ++j) - contributions.push_back({solids[e].scatter[i], solids[e].scatter[j], - response.tangent(i, j), e, 24U * i + j}); + assembly_internal::AppendLocalMatrixRow( + response.tangent, solids[e].scatter, i, e, contributions); } energy += response.strain_energy; points.insert(points.end(), response.points.begin(), response.points.end()); @@ -283,6 +287,13 @@ SolidStaticProcedureExecutor::SolidStaticProcedureExecutor( Status SolidStaticProcedureExecutor::ExecuteInto( const Domain& domain, SolidStaticState& state) const { + NewtonStepAlgorithm algorithm; + return SolidStaticCore(parallel_for_, linear_solver_, tangent_solver_, algorithm) + .ExecuteInto(domain, state); +} + +Status SolidStaticCore::ExecuteInto( + const Domain& domain, SolidStaticState& state) const { if (state.initialized_) return Failure(domain, "solid-static-observer-not-fresh", "Execution requires a fresh static observer."); @@ -309,14 +320,14 @@ Status SolidStaticProcedureExecutor::ExecuteInto( state = std::move(baseline.Value()); std::vector solids; for (const auto& element : elements) { - const auto* hex = dynamic_cast(element.get()); + auto hex = ElementFactory{}.BindSolidTrial(*element); if (hex == nullptr) return Failure(domain, "invalid-solid-static-element", "Solid STATIC requires full-integration Hex8 kernels.", FailureCategory::kModel); auto scatter = dofs.ElementScatter(hex->DofLayout()); if (!scatter.HasValue()) return scatter.GetStatus(); - solids.push_back({hex, std::move(scatter.Value())}); + solids.push_back({std::move(hex), std::move(scatter.Value())}); } auto stiffness = SparseAssembler::Assemble(view, dofs, parallel_for_); if (!stiffness.HasValue()) return stiffness.GetStatus(); @@ -336,7 +347,7 @@ Status SolidStaticProcedureExecutor::ExecuteInto( // Preserve the required factorization-before-load-assembly lifecycle. auto load = LoadAssembler::AssembleFullNodalLoad(model.Value(), dofs); if (!load.HasValue()) return load.GetStatus(); - auto rhs = LoadAssembler::EffectiveFreeRhs( + auto rhs = constraints.EffectiveFreeRhs( load.Value(), partition.Value().k_fc, dofs.PrescribedValues(), dofs); if (!rhs.HasValue()) return rhs.GetStatus(); Vector free{dofs.FreeDofCount()}; @@ -369,91 +380,128 @@ Status SolidStaticProcedureExecutor::ExecuteInto( for (std::size_t c = 0U; c < dofs.ConstrainedDofCount(); ++c) trial[dofs.ConstrainedDofs()[c]] = increment.load_factor * dofs.PrescribedValues()[c]; - for (std::uint32_t iteration = 1U; iteration <= kMaximumIterations; - ++iteration) { + struct SolidStepCandidate { + SolidStaticFrame frame; SolidStaticIterationRecord record; - record.increment_index = increment.increment_index; - record.load_factor = increment.load_factor; - record.iteration = iteration; - record.stage = "entered"; - const auto fail = [&](const Status& failure) { - record.diagnostic_code = failure.Diagnostics().empty() - ? "solid-static-failure" - : failure.Diagnostics()[0].code; - record.failure_reason = failure.Diagnostics().empty() - ? "Static trial failed." - : failure.Diagnostics()[0].message; - state.iterations_.push_back(record); - return failure; - }; - record.stage = "trial-recovery"; - auto assembly = Assemble(solids, dofs, trial, true, parallel_for_); - if (!assembly.HasValue()) return fail(assembly.GetStatus()); - SolidStaticFrame frame = state.committed_; - frame.balance = {}; - frame.global_equilibrium = {}; - frame.frame_index = - static_cast(state.accepted_frames_.size()); - frame.increment_index = increment.increment_index; - frame.load_factor = increment.load_factor; - frame.iteration_count = iteration; - frame.is_factor_one = increment.is_factor_one; - frame.displacement = trial; - frame.internal_force = std::move(assembly.Value().force); - frame.external_force = base_load.Value(); - frame.external_force.Scale(increment.load_factor); - frame.solid_results = std::move(assembly.Value().points); - frame.physical_strain_energy = assembly.Value().energy; - auto status = CompleteFrame(domain, dofs, true, stiffness.Value(), frame); - if (!status.IsOk()) return fail(status); - record.stage = "tangent-partition"; - auto partition = constraints.Partition(assembly.Value().tangent, dofs); - if (!partition.HasValue()) return fail(partition.GetStatus()); - Vector correction{dofs.FreeDofCount()}; - // Empty free is vacuous; prescribed geometry/recovery above still runs. - if (dofs.FreeDofCount() != 0U) { - record.stage = "tangent-factorization"; - status = tangent_solver_.FactorizeFresh(partition.Value().k_ff); - if (!status.IsOk()) return fail(status); - auto rhs = constraints.GatherFree(frame.residual, dofs); - rhs.Scale(-1.0); - record.stage = "correction-solve"; - status = tangent_solver_.SolveCorrection(rhs, correction); - if (!status.IsOk()) return fail(status); - } - Vector current_increment{dofs.FreeDofCount()}; - for (std::size_t f = 0U; f < dofs.FreeDofCount(); ++f) { - const auto full = dofs.FreeDofs()[f]; - current_increment[f] = trial[full] - start[full]; - } - record.stage = "convergence"; - auto convergence = EvaluateSolidStaticConvergence( - constraints.GatherFree(frame.residual, dofs), - constraints.GatherFree(frame.internal_force, dofs), - constraints.GatherFree(frame.external_force, dofs), correction, - current_increment); - if (!convergence.HasValue()) return fail(convergence.GetStatus()); - record.force_residual = convergence.Value().force_residual; - record.translation_correction = - convergence.Value().translation_correction; - record.convergence_evaluated = true; - if (record.force_residual.passed && - record.translation_correction.passed) { - record.stage = "commit"; - status = state.CommitAcceptedFrame(frame); - if (!status.IsOk()) return fail(status); - record.accepted = true; - state.iterations_.push_back(record); - break; - } - if (iteration == kMaximumIterations) - return fail(Failure(domain, "solid-static-nonconvergence", - "Solid STATIC exceeded 100 Newton iterations.")); - for (std::size_t f = 0U; f < dofs.FreeDofCount(); ++f) - trial[dofs.FreeDofs()[f]] += correction[f]; - record.stage = "continue"; - state.iterations_.push_back(record); + }; + const auto observe_iteration = + [&](const SolidStaticIterationRecord& record) { + state.iterations_.push_back(record); + }; + SolidFullNewtonStep iteration_step( + [&](std::uint32_t iteration) + -> Result> { + SolidStaticIterationRecord record; + record.increment_index = increment.increment_index; + record.load_factor = increment.load_factor; + record.iteration = iteration; + record.stage = "entered"; + const auto fail = [&](const Status& failure) { + record.diagnostic_code = failure.Diagnostics().empty() + ? "solid-static-failure" + : failure.Diagnostics()[0].code; + record.failure_reason = failure.Diagnostics().empty() + ? "Static trial failed." + : failure.Diagnostics()[0].message; + observe_iteration(record); + return Result>::Failure(failure); + }; + record.stage = "trial-recovery"; + auto assembly = Assemble(solids, dofs, trial, true, parallel_for_); + if (!assembly.HasValue()) + return fail(assembly.GetStatus()); + SolidStaticFrame frame = state.committed_; + frame.balance = {}; + frame.global_equilibrium = {}; + frame.frame_index = + static_cast(state.accepted_frames_.size()); + frame.increment_index = increment.increment_index; + frame.load_factor = increment.load_factor; + frame.iteration_count = iteration; + frame.is_factor_one = increment.is_factor_one; + frame.displacement = trial; + frame.internal_force = std::move(assembly.Value().force); + frame.external_force = base_load.Value(); + frame.external_force.Scale(increment.load_factor); + frame.solid_results = std::move(assembly.Value().points); + frame.physical_strain_energy = assembly.Value().energy; + auto status = + CompleteFrame(domain, dofs, true, stiffness.Value(), frame); + if (!status.IsOk()) + return fail(status); + record.stage = "tangent-partition"; + auto partition = + constraints.Partition(assembly.Value().tangent, dofs); + if (!partition.HasValue()) + return fail(partition.GetStatus()); + Vector correction{dofs.FreeDofCount()}; + // Empty free is vacuous; prescribed geometry/recovery above still + // runs. + if (dofs.FreeDofCount() != 0U) { + record.stage = "tangent-factorization"; + status = tangent_solver_.FactorizeFresh(partition.Value().k_ff); + if (!status.IsOk()) + return fail(status); + auto rhs = constraints.GatherFree(frame.residual, dofs); + rhs.Scale(-1.0); + record.stage = "correction-solve"; + status = tangent_solver_.SolveCorrection(rhs, correction); + if (!status.IsOk()) + return fail(status); + } + Vector current_increment{dofs.FreeDofCount()}; + for (std::size_t f = 0U; f < dofs.FreeDofCount(); ++f) { + const auto full = dofs.FreeDofs()[f]; + current_increment[f] = trial[full] - start[full]; + } + record.stage = "convergence"; + auto convergence = EvaluateSolidStaticConvergence( + constraints.GatherFree(frame.residual, dofs), + constraints.GatherFree(frame.internal_force, dofs), + constraints.GatherFree(frame.external_force, dofs), correction, + current_increment); + if (!convergence.HasValue()) + return fail(convergence.GetStatus()); + record.force_residual = convergence.Value().force_residual; + record.translation_correction = + convergence.Value().translation_correction; + record.convergence_evaluated = true; + if (record.force_residual.passed && + record.translation_correction.passed) { + record.stage = "commit"; + return Result>::Success( + SolidStepCandidate{std::move(frame), record}); + } + if (iteration == kMaximumIterations) + return fail( + Failure(domain, "solid-static-nonconvergence", + "Solid STATIC exceeded 100 Newton iterations.")); + for (std::size_t f = 0U; f < dofs.FreeDofCount(); ++f) + trial[dofs.FreeDofs()[f]] += correction[f]; + record.stage = "continue"; + observe_iteration(record); + return Result>::Success( + std::nullopt); + }, + kMaximumIterations); + const Status solved = iteration_step.Solve(algorithm_); + if (!solved.IsOk()) + return solved; + auto candidate = iteration_step.TakeCandidate(); + auto& record = candidate.record; + const Status committed = state.CommitAcceptedFrame(candidate.frame); + if (!committed.IsOk()) { + record.diagnostic_code = committed.Diagnostics().empty() + ? "solid-static-failure" + : committed.Diagnostics()[0].code; + record.failure_reason = committed.Diagnostics().empty() + ? "Static trial failed." + : committed.Diagnostics()[0].message; + observe_iteration(record); + return committed; } + record.accepted = true; + observe_iteration(record); } return Status::Ok(); } diff --git a/src/fesa/analysis/solid_static_state.cpp b/src/fesa/analysis/solid_static_state.cpp index 02bfb52..ae9b999 100644 --- a/src/fesa/analysis/solid_static_state.cpp +++ b/src/fesa/analysis/solid_static_state.cpp @@ -37,10 +37,9 @@ double InfinityNorm(const Vector& values) { return norm; } /// @brief Compares immutable semantic and raw source identities. -bool SameIdentity(const SourceEntityId& a, const SourceEntityId& b) { - return a.instance_name == b.instance_name && - a.source_label == b.source_label && - a.source_label_text == b.source_label_text; +bool SameIdentity(const SourceEntityId& a, + const SourceEntityId& b) { + return fesa::SourceIdentityEquals(a, b); } /// @brief Builds one raw criterion with the approved branch and physical unit. NewtonChannelDecision Decision(const char* name, double numerator, @@ -119,7 +118,7 @@ Result SolidStaticState::Create(const Domain& domain, auto element = ElementFactory{}.Create(domain.Elements()[e], domain); if (!element.HasValue()) return Result::Failure(element.GetStatus()); - const auto* hex = dynamic_cast(element.Value().get()); + auto hex = ElementFactory{}.BindSolidTrial(*element.Value()); if (hex == nullptr) return Result::Failure(StateFailure( "invalid-solid-static-state", "Static state requires Hex8 kernels.")); diff --git a/src/fesa/analysis/thermal_analysis_state.cpp b/src/fesa/analysis/thermal_analysis_state.cpp index 1e2e034..f229d93 100644 --- a/src/fesa/analysis/thermal_analysis_state.cpp +++ b/src/fesa/analysis/thermal_analysis_state.cpp @@ -8,6 +8,9 @@ #include #include +#include "fesa/assembly/thermal_assembler.h" +#include "math/finite_values.h" + namespace fesa { namespace { @@ -23,9 +26,7 @@ Status Failure(const std::string& message) { /// @brief Checks every stored scalar without imposing a temperature sign bound. bool Finite(const Vector& vector) { - for (std::size_t i = 0; i < vector.Size(); ++i) - if (!std::isfinite(vector[i])) return false; - return true; + return math_internal::IsFinite(vector); } /// @brief Compares prescribed row identities without conflating node and row @@ -64,8 +65,8 @@ Result ThermalAnalysisState::Create( for (const auto node : state.node_order_) state.node_source_ids_.push_back(domain.Nodes()[node].source_id); for (std::size_t index = 0; index < state.element_order_.size(); ++index) { - state.element_source_ids_.push_back(assembly.Kernels()[index].SourceId()); - const auto frame = assembly.Kernels()[index].Recover({}); + state.element_source_ids_.push_back(assembly.Elements()[index]->DofLayout().source_id); + const auto frame = assembly.Elements()[index]->Recover({}); if (!frame.HasValue()) return Result::Failure(frame.GetStatus()); state.local_frames_.push_back(frame.Value().frames); diff --git a/src/fesa/analysis/thermal_transient_algebra.cpp b/src/fesa/analysis/thermal_transient_algebra.cpp index 2784d43..d323d4a 100644 --- a/src/fesa/analysis/thermal_transient_algebra.cpp +++ b/src/fesa/analysis/thermal_transient_algebra.cpp @@ -7,8 +7,10 @@ #include #include +#include "fesa/assembly/thermal_assembler.h" #include "thermal_transient_bounds.h" #include "math/dense_blas_internal.h" +#include "math/finite_values.h" namespace fesa::thermal_transient_internal { namespace { @@ -35,9 +37,7 @@ Status Failure(const std::string& message) { } /// @brief Checks every scalar while preserving signed temperatures and powers. bool Finite(const Vector& vector) { - for (std::size_t i = 0; i < vector.Size(); ++i) - if (!std::isfinite(vector[i])) return false; - return true; + return math_internal::IsFinite(vector); } /// @brief Checks aligned full operators and their coefficient-error storage. bool SamePattern(const SparseMatrix& a, const SparseMatrix& b) { @@ -500,6 +500,16 @@ Status RunThermalHistory(const ThermalAssembly& assembly, const DofManager& dofs, ThermalAnalysisState& state, LinearSolver& solver, const ThermalRecovery& recovery, std::vector* evidence) { + const BackwardEulerHeatIntegrator integrator; + return RunThermalHistory(assembly, dofs, state, solver, integrator, recovery, + evidence); +} + +Status RunThermalHistory(const ThermalAssembly& assembly, + const DofManager& dofs, ThermalAnalysisState& state, + LinearSolver& solver, const HeatStepIntegrator& integrator, + const ThermalRecovery& recovery, + std::vector* evidence) { if (!dofs.ValidateInvariants().IsOk() || dofs.Profile() != DofProfile::kThermal || dofs.FullDofCount() != state.CommittedState().temperature.Size() || @@ -517,19 +527,21 @@ Status RunThermalHistory(const ThermalAssembly& assembly, i <= count; ++i) { const auto frame = state.TimeGrid().Frame(static_cast(i)); if (!frame.HasValue()) return frame.GetStatus(); - auto candidate = SolveThermalIncrement(system, partition, - state.CommittedState().temperature, - frame.Value().delta, solver, cache); - if (!candidate.HasValue()) return candidate.GetStatus(); - auto flux = recovery(candidate.Value().temperature); - if (!flux.HasValue()) return flux.GetStatus(); - auto completed = state.MakeCompletedFrame( - static_cast(i), std::move(candidate.Value().temperature), - std::move(candidate.Value().reaction), std::move(flux.Value())); - if (!completed.HasValue()) return completed.GetStatus(); - const auto committed = state.CommitAcceptedFrame(completed.Value()); - if (!committed.IsOk()) return committed; - if (evidence) evidence->push_back(candidate.Value().evidence); + const Status step_status = RunThermalStep( + integrator, system, partition, state.CommittedState().temperature, + frame.Value().delta, solver, cache, recovery, + [&](ThermalStepCandidate&& candidate, + std::vector&& flux) -> Status { + auto completed = state.MakeCompletedFrame( + static_cast(i), std::move(candidate.temperature), + std::move(candidate.reaction), std::move(flux)); + if (!completed.HasValue()) return completed.GetStatus(); + const auto committed = state.CommitAcceptedFrame(completed.Value()); + if (!committed.IsOk()) return committed; + if (evidence) evidence->push_back(candidate.evidence); + return Status::Ok(); + }); + if (!step_status.IsOk()) return step_status; } return Status::Ok(); } diff --git a/src/fesa/analysis/thermal_transient_algebra.h b/src/fesa/analysis/thermal_transient_algebra.h index 5b05ce7..a361aea 100644 --- a/src/fesa/analysis/thermal_transient_algebra.h +++ b/src/fesa/analysis/thermal_transient_algebra.h @@ -4,8 +4,10 @@ #include #include #include +#include #include "fesa/analysis/thermal_analysis_state.h" +#include "fesa/math/sparse_matrix.h" #include "fesa/solvers/linear/linear_solver.h" namespace fesa::thermal_transient_internal { @@ -84,11 +86,52 @@ Result SolveThermalIncrement( const Vector& old_temperature, double delta, LinearSolver& solver, ThermalFactorization& factorization); +/// @brief Solves one thermal increment without committing accepted history. +class HeatStepIntegrator { +public: + virtual ~HeatStepIntegrator() = default; + virtual Result + SolveIncrement(const ThermalSystem &system, const ThermalPartition &partition, + const Vector &old_temperature, double delta, + LinearSolver &solver, + ThermalFactorization &factorization) const = 0; +}; + +/// @brief Preserves backward Euler actual-delta and factorization reuse policy. +class BackwardEulerHeatIntegrator final : public HeatStepIntegrator { +public: + Result + SolveIncrement(const ThermalSystem &system, const ThermalPartition &partition, + const Vector &old_temperature, double delta, + LinearSolver &solver, + ThermalFactorization &factorization) const override { + return SolveThermalIncrement(system, partition, old_temperature, delta, + solver, factorization); + } +}; + /// @brief Provides an internal recovery seam for the actual history commit /// path. using ThermalRecovery = std::function>( const Vector& temperature)>; +/// @brief Runs the actual solve/recovery/commit sequence without owning history. +/// @note Commit receives a validated unpublished candidate only after recovery. +template +Status RunThermalStep(const HeatStepIntegrator& integrator, + const ThermalSystem& system, + const ThermalPartition& partition, + const Vector& old_temperature, double delta, + LinearSolver& solver, ThermalFactorization& factorization, + const ThermalRecovery& recovery, Commit&& commit) { + auto candidate = integrator.SolveIncrement(system, partition, old_temperature, + delta, solver, factorization); + if (!candidate.HasValue()) return candidate.GetStatus(); + auto flux = recovery(candidate.Value().temperature); + if (!flux.HasValue()) return flux.GetStatus(); + return commit(std::move(candidate.Value()), std::move(flux.Value())); +} + /// @brief Advances an existing raw/accepted history, preserving it on every /// failure. /// @note Recovery runs after algebra validation and before atomic commit. @@ -101,5 +144,13 @@ Status RunThermalHistory(const ThermalAssembly& assembly, LinearSolver& solver, const ThermalRecovery& recovery, std::vector* evidence = nullptr); +/// @brief Borrows a caller-selected integrator for the complete history core. +/// @note Integrator and other referenced adapters outlive the synchronous call. +Status RunThermalHistory(const ThermalAssembly& assembly, + const DofManager& dofs, ThermalAnalysisState& state, + LinearSolver& solver, const HeatStepIntegrator& integrator, + const ThermalRecovery& recovery, + std::vector* evidence = nullptr); + } // namespace fesa::thermal_transient_internal #endif // FESA_ANALYSIS_THERMAL_TRANSIENT_ALGEBRA_H_ diff --git a/src/fesa/analysis/transient_heat_procedure.cpp b/src/fesa/analysis/transient_heat_procedure.cpp index b8cfdf1..ff819cc 100644 --- a/src/fesa/analysis/transient_heat_procedure.cpp +++ b/src/fesa/analysis/transient_heat_procedure.cpp @@ -1,6 +1,7 @@ #include "fesa/analysis/transient_heat_procedure.h" #include +#include "fesa/assembly/thermal_assembler.h" #include "thermal_transient_algebra.h" diff --git a/src/fesa/app/fesa_application.cpp b/src/fesa/app/fesa_application.cpp index f160877..658c460 100644 --- a/src/fesa/app/fesa_application.cpp +++ b/src/fesa/app/fesa_application.cpp @@ -12,6 +12,9 @@ #include "fesa/analysis/nonlinear_static_procedure.h" #include "fesa/analysis/prepared_analysis.h" #include "fesa/analysis/solid_frequency_procedure.h" +#include "fesa/analysis/solid_hht_dynamic_procedure.h" +#include "fesa/analysis/solid_static_procedure.h" +#include "fesa/analysis/transient_heat_procedure.h" #include "fesa/app/output_paths.h" #include "fesa/assembly/parallel_for.h" #include "fesa/core/diagnostic.h" @@ -21,6 +24,7 @@ #include "fesa/io/hdf5/nonlinear_hdf5_results_writer.h" #include "fesa/io/hdf5/solid_hdf5_results_writer.h" #include "fesa/io/hdf5/thermal_hdf5_results_writer.h" +#include "fesa/solvers/eigen/mkl_feast_eigen_solver.h" #include "fesa/solvers/linear/mkl_pardiso_solver.h" #include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" @@ -84,6 +88,7 @@ int FesaApplication::Run(const std::vector& arguments) { } TbbParallelFor parallel_for; + const MklFeastEigenSolver eigen_solver; MklPardisoSolver linear_solver; MklPardisoTangentSolver tangent_solver; Hdf5ResultsWriter linear_writer; @@ -105,23 +110,12 @@ int FesaApplication::Run(const std::vector& arguments) { if (!prepared.HasValue()) { status = prepared.GetStatus(); } else { - LinearStaticProcedureExecutor linear_executor(parallel_for, linear_solver); - NonlinearStaticProcedureExecutor nonlinear_executor(parallel_for, - tangent_solver); - const LinearFrequencyProcedureExecutor frequency_executor; - const HhtDynamicProcedureExecutor dynamic_executor( - parallel_for, linear_solver, tangent_solver); - const TransientHeatProcedureExecutor thermal_executor(parallel_for, - linear_solver); - const SolidStaticProcedureExecutor solid_static(parallel_for, linear_solver, - tangent_solver); - const SolidFrequencyProcedureExecutor solid_frequency; - const SolidHhtDynamicProcedureExecutor solid_dynamic( - parallel_for, linear_solver, tangent_solver); - Result outcome = ExecutePreparedAnalysis( - prepared.Value().domain, linear_executor, nonlinear_executor, - frequency_executor, log, &dynamic_executor, &thermal_executor, - &solid_static, &solid_frequency, &solid_dynamic); + auto procedure = CreateAnalysisProcedure( + prepared.Value().domain, parallel_for, linear_solver, tangent_solver, + eigen_solver, log); + Result outcome = procedure.HasValue() + ? ExecutePreparedAnalysis(prepared.Value().domain, *procedure.Value()) + : Result::Failure(procedure.GetStatus()); if (!outcome.HasValue()) { status = outcome.GetStatus(); } else { diff --git a/src/fesa/assembly/load_assembler.cpp b/src/fesa/assembly/load_assembler.cpp index caa0563..b74d057 100644 --- a/src/fesa/assembly/load_assembler.cpp +++ b/src/fesa/assembly/load_assembler.cpp @@ -11,7 +11,8 @@ #include "fesa/constraints/essential_constraint_policy.h" #include "fesa/loads/load.h" #include "fesa/model/source_target_resolver.h" -#include "math/dense_blas_internal.h" + +#include "assembly/ordered_contribution_internal.h" namespace fesa { namespace { @@ -27,20 +28,6 @@ Status LoadFailure(const std::string& code, const SourceLocation& location, {{Severity::kError, code, location, keyword, identity, message}}); } -Status ValidateFiniteVector(const Vector& values, - const SourceLocation& location, - const std::string& identity) { - for (std::size_t index = 0U; index < values.Size(); ++index) { - if (!std::isfinite(values[index])) { - return LoadFailure("nonfinite-load-value", location, "LOAD_ASSEMBLER", - identity + ":" + std::to_string(index), - "Load and prescribed displacement vectors must " - "contain finite values."); - } - } - return Status::Ok(); -} - Status ValidateShellMoments(const Domain& domain, const Vector& full_load) { if (domain.ShellElements().Empty()) { return Status::Ok(); @@ -224,14 +211,13 @@ Result LoadAssembler::AssembleFullNodalLoad(const AnalysisModel& model, for (const auto& contributions : contributions_by_load) { for (const auto& contribution : contributions) { const std::size_t full_dof = contribution.full_dof_index; - const double accumulated = full_load[full_dof] + contribution.value; - if (!std::isfinite(accumulated)) { + if (!assembly_internal::AccumulateFiniteLoad( + full_load, full_dof, contribution.value)) { return Result::Failure(LoadFailure( "nonfinite-load-accumulation", model.Step().Location(), "LOAD_ASSEMBLER", std::to_string(full_dof), "Source-order load accumulation produced a nonfinite value.")); } - full_load[full_dof] = accumulated; } } const Status shell_moment_status = ValidateShellMoments(domain, full_load); @@ -245,101 +231,8 @@ Result LoadAssembler::EffectiveFreeRhs(const Vector& full_load, const SparseMatrix& kfc, const Vector& prescribed_values, const DofManager& dofs) { - const SourceLocation location{{}, 0U}; - if (dofs.FullDofCount() != full_load.Size()) { - return Result::Failure( - LoadFailure("invalid-load-dimensions", location, "LOAD_ASSEMBLER", - std::to_string(dofs.FullDofCount()), - "The DofManager full dimension must match the full load.")); - } - const Status dof_status = dofs.ValidateInvariants(); - if (!dof_status.IsOk()) { - return Result::Failure(dof_status); - } - if (kfc.Rows() != dofs.FreeDofCount() || - kfc.Columns() != dofs.ConstrainedDofCount() || - prescribed_values.Size() != dofs.ConstrainedDofCount()) { - return Result::Failure(LoadFailure( - "invalid-load-dimensions", location, "LOAD_ASSEMBLER", - std::to_string(kfc.Rows()) + "x" + std::to_string(kfc.Columns()), - "Kfc rows/columns and prescribed values must match free/constrained " - "order.")); - } - const Status matrix_status = kfc.Validate(); - if (!matrix_status.IsOk()) { - return Result::Failure(matrix_status); - } - const Status load_status = - ValidateFiniteVector(full_load, location, "full-load"); - if (!load_status.IsOk()) { - return Result::Failure(load_status); - } - const Status prescribed_status = - ValidateFiniteVector(prescribed_values, location, "prescribed-values"); - if (!prescribed_status.IsOk()) { - return Result::Failure(prescribed_status); - } - - Vector entry_coefficients{kfc.Values().size()}; - Vector entry_prescribed{kfc.Values().size()}; - for (std::size_t position = 0U; position < kfc.Values().size(); ++position) { - entry_coefficients[position] = kfc.Values()[position]; - entry_prescribed[position] = - prescribed_values[kfc.ColumnIndices()[position]]; - } - Vector entry_products{0U}; - try { - entry_products = dense_blas_internal::MultiplyDiagonal(entry_coefficients, - entry_prescribed); - } catch (const std::length_error&) { - return Result::Failure(LoadFailure( - "load-backend-dimension-overflow", location, "LOAD_ASSEMBLER", "Kfc", - "Prescribed displacement products exceed the backend integer range.")); - } catch (const std::invalid_argument&) { - return Result::Failure(LoadFailure( - "invalid-load-product", location, "LOAD_ASSEMBLER", "Kfc", - "Prescribed displacement product inputs must be finite and compatible.")); - } - - // MKL computes independent entries; ordered CSR reduction below retains - // cancellation and the first product/row-sum overflow diagnostic. - Vector correction{kfc.Rows()}; - for (std::size_t row = 0U; row < kfc.Rows(); ++row) { - double sum = 0.0; - for (std::size_t position = kfc.RowOffsets()[row]; - position < kfc.RowOffsets()[row + 1U]; ++position) { - const double product = entry_products[position]; - if (!std::isfinite(product)) { - return Result::Failure(LoadFailure( - "nonfinite-load-accumulation", location, "LOAD_ASSEMBLER", - std::to_string(row), - "Kfc times prescribed displacement produced a nonfinite product.")); - } - sum += product; - if (!std::isfinite(sum)) { - return Result::Failure(LoadFailure( - "nonfinite-load-accumulation", location, "LOAD_ASSEMBLER", - std::to_string(row), - "Kfc times prescribed displacement produced a nonfinite row sum.")); - } - } - correction[row] = sum; - } - - Vector rhs = EssentialConstraintPolicy{}.GatherFree(full_load, dofs); - // The constrained vector is already in DofManager order, so this is the - // approved elimination equation rhs = Ff - Kfc*dc without reordering dc. - for (std::size_t row = 0U; row < rhs.Size(); ++row) { - const double value = rhs[row] - correction[row]; - if (!std::isfinite(value)) { - return Result::Failure( - LoadFailure("nonfinite-load-accumulation", location, "LOAD_ASSEMBLER", - std::to_string(row), - "Effective RHS subtraction produced a nonfinite value.")); - } - rhs[row] = value; - } - return Result::Success(std::move(rhs)); + return EssentialConstraintPolicy{}.EffectiveFreeRhs( + full_load, kfc, prescribed_values, dofs); } } // namespace fesa diff --git a/src/fesa/assembly/ordered_contribution_internal.h b/src/fesa/assembly/ordered_contribution_internal.h new file mode 100644 index 0000000..c22e25a --- /dev/null +++ b/src/fesa/assembly/ordered_contribution_internal.h @@ -0,0 +1,58 @@ +#ifndef FESA_ASSEMBLY_ORDERED_CONTRIBUTION_INTERNAL_H_ +#define FESA_ASSEMBLY_ORDERED_CONTRIBUTION_INTERNAL_H_ + +#include +#include +#include + +#include "fesa/math/matrix.h" +#include "fesa/math/sparse_matrix.h" +#include "fesa/math/vector.h" + +namespace fesa::assembly_internal { + +/// @brief Appends one validated local entry without changing its stable order. +/// @note Caller owns shape/scatter validation and diagnostic selection. Retains +/// every structural zero; never writes shared global storage from a worker. +template +void AppendLocalMatrixEntry(const Scatter& scatter, std::size_t row, + std::size_t column, double value, + std::size_t source_order, + std::vector& contributions) { + contributions.push_back({scatter[row], scatter[column], value, source_order, + row * scatter.size() + column}); +} + +/// @brief Appends a validated matrix row in the original local-column order. +template +void AppendLocalMatrixRow(const Matrix& values, const Scatter& scatter, + std::size_t row, std::size_t source_order, + std::vector& contributions) { + for (std::size_t column = 0U; column < scatter.size(); ++column) { + AppendLocalMatrixEntry(scatter, row, column, values(row, column), + source_order, contributions); + } +} + +/// @brief Appends a validated matrix in fixed local row/column order. +template +void AppendLocalMatrix(const Matrix& values, const Scatter& scatter, + std::size_t source_order, + std::vector& contributions) { + for (std::size_t row = 0U; row < scatter.size(); ++row) { + AppendLocalMatrixRow(values, scatter, row, source_order, contributions); + } +} + +/// @brief Adds one full-space load entry, committing only a finite candidate. +/// @note Caller validates the index and keeps source-order error provenance. +inline bool AccumulateFiniteLoad(Vector& full, std::size_t index, double value) { + const double accumulated = full[index] + value; + if (!std::isfinite(value) || !std::isfinite(accumulated)) return false; + full[index] = accumulated; + return true; +} + +} // namespace fesa::assembly_internal + +#endif // FESA_ASSEMBLY_ORDERED_CONTRIBUTION_INTERNAL_H_ diff --git a/src/fesa/assembly/sparse_assembler.cpp b/src/fesa/assembly/sparse_assembler.cpp index 61face6..8cb7146 100644 --- a/src/fesa/assembly/sparse_assembler.cpp +++ b/src/fesa/assembly/sparse_assembler.cpp @@ -15,6 +15,8 @@ #include "fesa/fem/dof_manager.h" #include "fesa/model/domain.h" +#include "assembly/ordered_contribution_internal.h" + namespace fesa { namespace { @@ -26,15 +28,8 @@ Status AssemblyFailure(const std::string& code, const SourceLocation& location, {{Severity::kError, code, location, "*ELEMENT", identity, message}}); } -bool SameSourceIdentity(const SourceEntityId& left, - const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; -} - bool SameLayout(const ElementDofLayout& left, const ElementDofLayout& right) { - return SameSourceIdentity(left.source_id, right.source_id) && + return SourceIdentityEquals(left.source_id, right.source_id) && left.node_indices == right.node_indices && left.components_per_node == right.components_per_node; } @@ -80,17 +75,8 @@ Result SparseAssembler::Assemble( auto& buffer = local_buffers[element_order]; buffer.reserve(local_dof_count * local_dof_count); - for (std::size_t local_row = 0U; local_row < local_dof_count; ++local_row) { - for (std::size_t local_column = 0U; local_column < local_dof_count; - ++local_column) { - const std::size_t local_order = - local_row * local_dof_count + local_column; - buffer.push_back({scatter.Value()[local_row], - scatter.Value()[local_column], - contribution.values(local_row, local_column), - element_order, local_order}); - } - } + assembly_internal::AppendLocalMatrix( + contribution.values, scatter.Value(), element_order, buffer); }); for (std::size_t element_order = 0U; element_order < local_failures.size(); diff --git a/src/fesa/assembly/surface_pressure_assembler.cpp b/src/fesa/assembly/surface_pressure_assembler.cpp index aafe1a6..e5db7b0 100644 --- a/src/fesa/assembly/surface_pressure_assembler.cpp +++ b/src/fesa/assembly/surface_pressure_assembler.cpp @@ -13,6 +13,8 @@ #include "fesa/elements/element_definition.h" #include "fesa/model/domain.h" +#include "assembly/ordered_contribution_internal.h" + namespace fesa { namespace { @@ -250,14 +252,13 @@ Result AssembleSurfacePressure( for (std::size_t local_row = 0U; local_row < kFacetDofCount; ++local_row) { const std::size_t full_row = task.scatter[local_row]; const double force = contribution.force[local_row]; - const double accumulated = full_force[full_row] + force; - if (!std::isfinite(force) || !std::isfinite(accumulated)) { + if (!assembly_internal::AccumulateFiniteLoad(full_force, full_row, + force)) { return Result::Failure(Failure( FailureCategory::kSolver, task.input.location, "nonfinite-pressure-accumulation", task.input.entity_identity, "Stable pressure force reduction produced a nonfinite value.")); } - full_force[full_row] = accumulated; for (std::size_t local_column = 0U; local_column < kFacetDofCount; ++local_column) { const double tangent = contribution.external_tangent[ @@ -268,12 +269,9 @@ Result AssembleSurfacePressure( "nonfinite-pressure-tangent", task.input.entity_identity, "A pressure local tangent contains a nonfinite value.")); } - tangent_contributions.push_back( - {full_row, - task.scatter[local_column], - tangent, - task_index, - local_row * kFacetDofCount + local_column}); + assembly_internal::AppendLocalMatrixEntry( + task.scatter, local_row, local_column, tangent, task_index, + tangent_contributions); } } } diff --git a/src/fesa/assembly/thermal_assembler.cpp b/src/fesa/assembly/thermal_assembler.cpp index f67e755..8fc05f2 100644 --- a/src/fesa/assembly/thermal_assembler.cpp +++ b/src/fesa/assembly/thermal_assembler.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -13,6 +14,8 @@ #include "fesa/elements/thermal_element_layout.h" +#include "assembly/ordered_contribution_internal.h" + namespace fesa { namespace { @@ -92,6 +95,7 @@ struct SumInterval { struct LocalContribution { std::optional kernel; + std::unique_ptr element; std::array scatter{}; std::vector conductivity; std::vector capacity; @@ -105,8 +109,8 @@ Result AssembleError(const SparseMatrix& matrix, bool capacity) { std::vector sums(matrix.Values().size()); for (const auto& contribution : local) { - const Matrix& error = capacity ? contribution.kernel->CapacityError() - : contribution.kernel->ConductivityError(); + const Matrix& error = capacity ? contribution.element->CapacityError() + : contribution.element->ConductivityError(); const auto& values = capacity ? contribution.capacity : contribution.conductivity; for (const auto& value : values) { @@ -215,16 +219,21 @@ Result AssembleThermal(const AnalysisModel& model, std::copy(scatter.Value().begin(), scatter.Value().end(), output.scatter.begin()); output.kernel = std::move(kernel.Value()); + // local is fully sized before workers run; this optional cannot move + // until every local matrix/error consumer has finished. + output.element = std::make_unique(*output.kernel); output.conductivity.reserve(400); output.capacity.reserve(400); + const Matrix& conductivity_matrix = output.element->Conductivity(); + const Matrix& capacity_matrix = output.element->Capacity(); for (std::size_t i = 0; i < 20; ++i) for (std::size_t j = 0; j < 20; ++j) { - output.conductivity.push_back({output.scatter[i], output.scatter[j], - output.kernel->Conductivity()(i, j), - index, 20 * i + j}); - output.capacity.push_back({output.scatter[i], output.scatter[j], - output.kernel->Capacity()(i, j), index, - 20 * i + j}); + assembly_internal::AppendLocalMatrixEntry( + output.scatter, i, j, conductivity_matrix(i, j), index, + output.conductivity); + assembly_internal::AppendLocalMatrixEntry( + output.scatter, i, j, capacity_matrix(i, j), index, + output.capacity); } }); std::vector conductivity; @@ -310,7 +319,11 @@ ThermalAssembly::ThermalAssembly( input_error_{std::move(input_error)}, element_order_{std::move(element_order)}, kernels_{std::move(kernels)}, - scatters_{std::move(scatters)} {} + scatters_{std::move(scatters)} { + elements_.reserve(kernels_.size()); + for (const auto& kernel : kernels_) + elements_.push_back(std::make_unique(kernel)); +} const SparseMatrix& ThermalAssembly::Conductivity() const noexcept { return conductivity_; } @@ -330,6 +343,10 @@ const Vector& ThermalAssembly::HeatInputError() const noexcept { const std::vector& ThermalAssembly::ElementOrder() const noexcept { return element_order_; } +const std::vector>& +ThermalAssembly::Elements() const noexcept { + return elements_; +} const std::vector& ThermalAssembly::Kernels() const noexcept { return kernels_; } @@ -358,7 +375,7 @@ Result> ThermalAssembly::RecoverFlux( std::array local{}; for (std::size_t p = 0; p < 20; ++p) local[p] = temperature[scatters_[index][p]]; - const auto result = kernels_[index].Recover(local); + const auto result = elements_[index]->Recover(local); if (!result.HasValue()) { status[index] = result.GetStatus(); return; diff --git a/src/fesa/constraints/essential_constraint_policy.cpp b/src/fesa/constraints/essential_constraint_policy.cpp index 5903d0d..4040323 100644 --- a/src/fesa/constraints/essential_constraint_policy.cpp +++ b/src/fesa/constraints/essential_constraint_policy.cpp @@ -1,5 +1,6 @@ #include "fesa/constraints/essential_constraint_policy.h" +#include #include #include #include @@ -7,6 +8,7 @@ #include #include "fesa/fem/dof_manager.h" +#include "math/dense_blas_internal.h" namespace fesa { namespace { @@ -22,6 +24,29 @@ Status ConstraintFailure(const std::string& code, const std::string& identity, message}}); } +// Preserve the established elimination diagnostics at the compatibility boundary. +Status LoadFailure(const std::string& code, const SourceLocation& location, + const std::string& keyword, const std::string& identity, + const std::string& message) { + return Status::Failure( + FailureCategory::kModel, + {{Severity::kError, code, location, keyword, identity, message}}); +} + +Status ValidateFiniteVector(const Vector& values, + const SourceLocation& location, + const std::string& identity) { + for (std::size_t index = 0U; index < values.Size(); ++index) { + if (!std::isfinite(values[index])) { + return LoadFailure("nonfinite-load-value", location, "LOAD_ASSEMBLER", + identity + ":" + std::to_string(index), + "Load and prescribed displacement vectors must " + "contain finite values."); + } + } + return Status::Ok(); +} + /// @brief Extracts one partition without changing the supplied DOF order. Result ExtractBlock(const SparseMatrix& full, const std::vector& row_dofs, @@ -156,4 +181,104 @@ Vector EssentialConstraintPolicy::ReconstructFull( return full; } +Result EssentialConstraintPolicy::EffectiveFreeRhs( + const Vector& full_load, const SparseMatrix& kfc, + const Vector& prescribed_values, const DofManager& dofs) const { + const SourceLocation location{{}, 0U}; + if (dofs.FullDofCount() != full_load.Size()) { + return Result::Failure( + LoadFailure("invalid-load-dimensions", location, "LOAD_ASSEMBLER", + std::to_string(dofs.FullDofCount()), + "The DofManager full dimension must match the full load.")); + } + const Status dof_status = dofs.ValidateInvariants(); + if (!dof_status.IsOk()) { + return Result::Failure(dof_status); + } + if (kfc.Rows() != dofs.FreeDofCount() || + kfc.Columns() != dofs.ConstrainedDofCount() || + prescribed_values.Size() != dofs.ConstrainedDofCount()) { + return Result::Failure(LoadFailure( + "invalid-load-dimensions", location, "LOAD_ASSEMBLER", + std::to_string(kfc.Rows()) + "x" + std::to_string(kfc.Columns()), + "Kfc rows/columns and prescribed values must match free/constrained " + "order.")); + } + const Status matrix_status = kfc.Validate(); + if (!matrix_status.IsOk()) { + return Result::Failure(matrix_status); + } + const Status load_status = + ValidateFiniteVector(full_load, location, "full-load"); + if (!load_status.IsOk()) { + return Result::Failure(load_status); + } + const Status prescribed_status = + ValidateFiniteVector(prescribed_values, location, "prescribed-values"); + if (!prescribed_status.IsOk()) { + return Result::Failure(prescribed_status); + } + + Vector entry_coefficients{kfc.Values().size()}; + Vector entry_prescribed{kfc.Values().size()}; + for (std::size_t position = 0U; position < kfc.Values().size(); ++position) { + entry_coefficients[position] = kfc.Values()[position]; + entry_prescribed[position] = + prescribed_values[kfc.ColumnIndices()[position]]; + } + Vector entry_products{0U}; + try { + entry_products = dense_blas_internal::MultiplyDiagonal(entry_coefficients, + entry_prescribed); + } catch (const std::length_error&) { + return Result::Failure(LoadFailure( + "load-backend-dimension-overflow", location, "LOAD_ASSEMBLER", "Kfc", + "Prescribed displacement products exceed the backend integer range.")); + } catch (const std::invalid_argument&) { + return Result::Failure(LoadFailure( + "invalid-load-product", location, "LOAD_ASSEMBLER", "Kfc", + "Prescribed displacement product inputs must be finite and compatible.")); + } + + // MKL computes independent entries; ordered CSR reduction below retains + // cancellation and the first product/row-sum overflow diagnostic. + Vector correction{kfc.Rows()}; + for (std::size_t row = 0U; row < kfc.Rows(); ++row) { + double sum = 0.0; + for (std::size_t position = kfc.RowOffsets()[row]; + position < kfc.RowOffsets()[row + 1U]; ++position) { + const double product = entry_products[position]; + if (!std::isfinite(product)) { + return Result::Failure(LoadFailure( + "nonfinite-load-accumulation", location, "LOAD_ASSEMBLER", + std::to_string(row), + "Kfc times prescribed displacement produced a nonfinite product.")); + } + sum += product; + if (!std::isfinite(sum)) { + return Result::Failure(LoadFailure( + "nonfinite-load-accumulation", location, "LOAD_ASSEMBLER", + std::to_string(row), + "Kfc times prescribed displacement produced a nonfinite row sum.")); + } + } + correction[row] = sum; + } + + Vector rhs = GatherFree(full_load, dofs); + // The constrained vector is already in DofManager order, so this is the + // approved elimination equation rhs = Ff - Kfc*dc without reordering dc. + for (std::size_t row = 0U; row < rhs.Size(); ++row) { + const double value = rhs[row] - correction[row]; + if (!std::isfinite(value)) { + return Result::Failure( + LoadFailure("nonfinite-load-accumulation", location, "LOAD_ASSEMBLER", + std::to_string(row), + "Effective RHS subtraction produced a nonfinite value.")); + } + rhs[row] = value; + } + return Result::Success(std::move(rhs)); +} + } // namespace fesa diff --git a/src/fesa/core/ascii.cpp b/src/fesa/core/ascii.cpp index 7a6a24e..32466d3 100644 --- a/src/fesa/core/ascii.cpp +++ b/src/fesa/core/ascii.cpp @@ -13,6 +13,15 @@ char AsciiLower(const char value) noexcept { return value; } +std::string AsciiUppercase(std::string value) { + for (char& character : value) { + if (character >= 'a' && character <= 'z') { + character = static_cast(character - 'a' + 'A'); + } + } + return value; +} + bool AsciiCaseInsensitiveEquals(const std::string_view lhs, const std::string_view rhs) noexcept { if (lhs.size() != rhs.size()) { @@ -35,14 +44,13 @@ Result ParsePositiveSourceLabel(const std::string_view text) { if (parsed.ec == std::errc{} && parsed.ptr == last && value > 0) { return Result::Success(value); } - const std::string identity{text}; return Result::Failure(Status::Failure( FailureCategory::kInput, {{Severity::kError, "invalid-source-label", {{}, 0U}, "SOURCE_LABEL", - identity, + std::string{text}, "A source label must be a complete positive base-10 integer."}})); } diff --git a/src/fesa/elements/AGENTS.md b/src/fesa/elements/AGENTS.md index 5a824b1..e1e753b 100644 --- a/src/fesa/elements/AGENTS.md +++ b/src/fesa/elements/AGENTS.md @@ -14,3 +14,7 @@ Global equation 번호, 공유 sparse write와 파일 저장은 소유하지 않 변경에 맞게 검증한다. - End action·단면력·응력의 location과 부호가 다르면 같은 recovery 함수로 강제하지 않는다. Local kernel 완료를 Abaqus 입력이나 CLI 노출 완료로 확대하지 않는다. + +- ShellTrial/SolidTrial/ShellInertia/Thermal/ShellReference capability는 local 계약이다. + Adapter는 stable-address immutable kernel을 빌리며 equation·accepted history를 소유하지 않는다. + Shell·solid·thermal layout이나 response를 하나의 무타입 buffer로 합치지 않는다. diff --git a/src/fesa/elements/element_capabilities.cpp b/src/fesa/elements/element_capabilities.cpp new file mode 100644 index 0000000..772fc0c --- /dev/null +++ b/src/fesa/elements/element_capabilities.cpp @@ -0,0 +1,115 @@ +#include "fesa/elements/element_capabilities.h" + +#include + +#include "fesa/elements/hex8_element.h" +#include "fesa/elements/nonlinear_mitc4_inertia.h" +#include "fesa/elements/thermal_shell.h" + +namespace fesa { + +Mitc4TrialAdapter::Mitc4TrialAdapter(ElementDofLayout layout, + const NonlinearMitc4Shell& kernel) + : layout_{std::move(layout)}, kernel_{kernel} {} +const ElementDofLayout& Mitc4TrialAdapter::DofLayout() const noexcept { + return layout_; +} +Result Mitc4TrialAdapter::EvaluateTrial( + const NonlinearMitc4TrialDofs& trial, const Vector* direction) const { + return EvaluateInternalResidualAndTangent(kernel_, trial, direction); +} +Result +Mitc4TrialAdapter::EvaluateExternalDrillingConstraint( + std::size_t node, const Vector3& phi, const Vector3& phi_dot, + const Vector3& force, const Vector3& force_rate, + const Vector3& force_acceleration) const { + return kernel_.EvaluateExternalDrillingConstraint( + node, phi, phi_dot, force, force_rate, force_acceleration); +} + +Hex8TrialAdapter::Hex8TrialAdapter(const Hex8Element& kernel) + : kernel_{kernel} {} +const ElementDofLayout& Hex8TrialAdapter::DofLayout() const noexcept { + return kernel_.DofLayout(); +} +Result Hex8TrialAdapter::ComputeStiffness() const { + return kernel_.ComputeStiffness(); +} +Result Hex8TrialAdapter::Recover(const Vector& u) const { + return kernel_.Recover(u); +} +Result Hex8TrialAdapter::EvaluateLinear(const Vector& u) const { + return kernel_.EvaluateLinear(u); +} +Result Hex8TrialAdapter::EvaluateNonlinear(const Vector& u) const { + return kernel_.EvaluateNonlinear(u); +} +Result Hex8TrialAdapter::EvaluateLinearHighLow( + const Vector& high, const Vector& low) const { + return kernel_.EvaluateLinearHighLow(high, low); +} +Result Hex8TrialAdapter::EvaluateNonlinearHighLow( + const Vector& high, const Vector& low) const { + return kernel_.EvaluateNonlinearHighLow(high, low); +} +Result Hex8TrialAdapter::ComputeMass() const { + return kernel_.ComputeMass(); +} +std::array Hex8TrialAdapter::ReferenceWeights() const noexcept { + return kernel_.ReferenceWeights(); +} + +Mitc4InertiaAdapter::Mitc4InertiaAdapter( + ElementDofLayout layout, const NonlinearMitc4Inertia& kernel) + : layout_{std::move(layout)}, kernel_{kernel} {} +const ElementDofLayout& Mitc4InertiaAdapter::DofLayout() const noexcept { + return layout_; +} +Result Mitc4InertiaAdapter::Evaluate( + const NonlinearMitc4TrialDofs& trial, const Vector& velocity24, + const Vector& acceleration24) const { + return kernel_.Evaluate(trial, velocity24, acceleration24); +} + +Ds4ThermalAdapter::Ds4ThermalAdapter(const ThermalShell& kernel) + : layout_{kernel.SourceId(), kernel.NodeIndices()}, kernel_{kernel} {} +const ThermalElementDofLayout& Ds4ThermalAdapter::DofLayout() const noexcept { + return layout_; +} +const Matrix& Ds4ThermalAdapter::Conductivity() const noexcept { + return kernel_.Conductivity(); +} +const Matrix& Ds4ThermalAdapter::Capacity() const noexcept { + return kernel_.Capacity(); +} +const Matrix& Ds4ThermalAdapter::ConductivityError() const noexcept { + return kernel_.ConductivityError(); +} +const Matrix& Ds4ThermalAdapter::CapacityError() const noexcept { + return kernel_.CapacityError(); +} +Result Ds4ThermalAdapter::Recover( + const std::array& temperature) const { + return kernel_.Recover(temperature); +} + +Mitc4ReferenceAdapter::Mitc4ReferenceAdapter(const Mitc4Shell& kernel) + : kernel_{kernel} {} +const ElementDofLayout& Mitc4ReferenceAdapter::DofLayout() const noexcept { + return kernel_.DofLayout(); +} +Result +Mitc4ReferenceAdapter::ComputeStiffness() const { + return kernel_.ComputeStiffness(); +} +Result Mitc4ReferenceAdapter::Recover(const Vector& u) const { + return kernel_.Recover(u); +} +Result Mitc4ReferenceAdapter::Stiffness() const { + return kernel_.Stiffness(); +} +Result Mitc4ReferenceAdapter::Mass(double density) const { + return kernel_.Mass(density); +} + +} // namespace fesa diff --git a/src/fesa/elements/element_factory.cpp b/src/fesa/elements/element_factory.cpp index 5fffbfa..5f785a5 100644 --- a/src/fesa/elements/element_factory.cpp +++ b/src/fesa/elements/element_factory.cpp @@ -292,6 +292,18 @@ Result> ElementFactory::CreateSolid( return Result>::Success(std::move(result)); } +std::unique_ptr ElementFactory::BindSolidTrial( + const Element& kernel) const { + const auto* solid = dynamic_cast(&kernel); + return solid == nullptr ? nullptr : std::make_unique(*solid); +} + +std::unique_ptr ElementFactory::BindShellReference( + const Element& kernel) const { + const auto* shell = dynamic_cast(&kernel); + return shell == nullptr ? nullptr : std::make_unique(*shell); +} + Result> ElementFactory::Create( const ElementDefinition& definition, const Domain& domain) const { switch (definition.Kind()) { diff --git a/src/fesa/elements/finite_rotation.cpp b/src/fesa/elements/finite_rotation.cpp index 4e82390..8048f4d 100644 --- a/src/fesa/elements/finite_rotation.cpp +++ b/src/fesa/elements/finite_rotation.cpp @@ -6,25 +6,21 @@ #include #include +#include "math/dense_blas_internal.h" +#include "math/finite_values.h" +#include "math/vector3_operations.h" + namespace fesa { namespace { +using math_internal::Multiply; +using math_internal::Skew; +using math_internal::IsFinite; + constexpr std::size_t kRotationDimension = 3U; constexpr double kRotationStateTolerance = 1.0e-12; constexpr double kSmallAngleThreshold = 1.0e-4; -/// @brief Returns the SO(3) skew-symmetric matrix for a global vector. -Matrix Skew(const Vector3& vector) { - Matrix result{kRotationDimension, kRotationDimension}; - result(0U, 1U) = -vector.Z(); - result(0U, 2U) = vector.Y(); - result(1U, 0U) = vector.Z(); - result(1U, 2U) = -vector.X(); - result(2U, 0U) = -vector.Y(); - result(2U, 1U) = vector.X(); - return result; -} - /// @brief Returns the 3-by-3 identity matrix. Matrix Identity() { Matrix result{kRotationDimension, kRotationDimension}; @@ -63,18 +59,6 @@ double Determinant(const Matrix& matrix) { matrix(1U, 1U) * matrix(2U, 0U)); } -/// @brief Checks that all matrix entries are finite. -bool IsFinite(const Matrix& matrix) { - for (std::size_t row = 0U; row < matrix.Rows(); ++row) { - for (std::size_t column = 0U; column < matrix.Columns(); ++column) { - if (!std::isfinite(matrix(row, column))) { - return false; - } - } - } - return true; -} - /// @brief Checks the exact 3-by-3 proper-orthogonal frame contract. bool IsProperOrthogonal(const Matrix& matrix) { if (matrix.Rows() != kRotationDimension || @@ -113,17 +97,6 @@ bool IsPrincipalCoordinate(const Vector3& phi) { return std::isfinite(angle) && pi - angle > margin; } -/// @brief Multiplies a 3-by-3 frame by a global vector. -Vector3 Multiply(const Matrix& matrix, const Vector3& vector) { - return Vector3{ - matrix(0U, 0U) * vector.X() + matrix(0U, 1U) * vector.Y() + - matrix(0U, 2U) * vector.Z(), - matrix(1U, 0U) * vector.X() + matrix(1U, 1U) * vector.Y() + - matrix(1U, 2U) * vector.Z(), - matrix(2U, 0U) * vector.X() + matrix(2U, 1U) * vector.Y() + - matrix(2U, 2U) * vector.Z()}; -} - /// @brief Checks componentwise agreement without scale-dependent repair. bool IsNear(const Matrix& actual, const Matrix& expected) { if (actual.Rows() != expected.Rows() || @@ -225,25 +198,15 @@ Matrix LeftJacobianSO3(const Vector3& phi) { quadratic_coefficient); } -Matrix InverseTransposeLeftJacobianSO3(const Vector3& phi) { - const Matrix skew = Skew(phi); - const Matrix skew_squared = skew.Multiply(skew); - const double theta = phi.Norm(); - const double theta_squared = theta * theta; - - double quadratic_coefficient = 1.0 / 12.0; - if (theta >= kSmallAngleThreshold) { - const double half_theta = 0.5 * theta; - quadratic_coefficient = - (1.0 - half_theta / std::tan(half_theta)) / theta_squared; - } else { - const double theta_fourth = theta_squared * theta_squared; - const double theta_sixth = theta_fourth * theta_squared; - quadratic_coefficient = - 1.0 / 12.0 + theta_squared / 720.0 + theta_fourth / 30240.0 + - theta_sixth / 1209600.0; - } - return Polynomial(skew, skew_squared, 0.5, quadratic_coefficient); +Result SpatialMomentSO3(const Vector3& phi, const Vector3& generalized) { + const auto factor = dense_blas_internal::DenseFactor::Lu(LeftJacobianSO3(phi)); + if (!factor.HasValue()) return Result::Failure(factor.GetStatus()); + Matrix rhs{3U, 1U}; + for (std::size_t i = 0; i < 3U; ++i) rhs(i, 0U) = generalized[i]; + const auto solved = factor.Value().Solve(rhs, true); + if (!solved.HasValue()) return Result::Failure(solved.GetStatus()); + return Result::Success( + Vector3{solved.Value()(0, 0), solved.Value()(1, 0), solved.Value()(2, 0)}); } Result MakeFiniteRotationState( diff --git a/src/fesa/elements/hex8_element.cpp b/src/fesa/elements/hex8_element.cpp index 71de886..bb25f4b 100644 --- a/src/fesa/elements/hex8_element.cpp +++ b/src/fesa/elements/hex8_element.cpp @@ -1,5 +1,7 @@ #include "fesa/elements/hex8_element.h" +#include "fesa/math/vector3.h" + #include #include #include @@ -180,17 +182,46 @@ Result Hex8Element::Create(EntityIndex index, point.weight <= 0.0) return Result::Failure(candidate.Failure( "Reference quadrature Jacobian must be finite and positive.")); - const auto inverse = hex8_internal::Inverse(jacobian, point.weight); - if (!Finite(inverse)) + const Vector3 c0{jacobian[0][0], jacobian[1][0], jacobian[2][0]}; + const Vector3 c1{jacobian[0][1], jacobian[1][1], jacobian[2][1]}; + const Vector3 c2{jacobian[0][2], jacobian[1][2], jacobian[2][2]}; + if (!c0.Cross(c1).IsFinite() || !c1.Cross(c2).IsFinite() || + !c2.Cross(c0).IsFinite()) return Result::Failure( candidate.Failure("Reference Jacobian inverse is nonfinite.")); + Matrix coefficients{3U, 3U}; + Matrix natural_gradients{3U, 8U}; + for (std::size_t i = 0; i < 3U; ++i) { + for (std::size_t d = 0; d < 3U; ++d) + coefficients(i, d) = jacobian[i][d]; + for (std::size_t a = 0; a < 8U; ++a) + natural_gradients(i, a) = derivatives[a][i]; + } + const auto factor = dense_blas_internal::DenseFactor::Lu(coefficients); + if (!factor.HasValue()) + return Result::Failure( + candidate.Failure("Reference Jacobian inverse is nonfinite.")); + // The original geometry gate required every reciprocal action to be + // finite, including entries not exposed by the smaller shape-gradient RHS. + Matrix canonical{3U, 1U}; + for (std::size_t axis = 0; axis < 3U; ++axis) { + if (axis != 0U) canonical(axis - 1U, 0U) = 0.0; + canonical(axis, 0U) = 1.0; + if (!factor.Value().Solve(canonical, true).HasValue()) + return Result::Failure( + candidate.Failure("Reference Jacobian inverse is nonfinite.")); + } + // J has Cartesian rows and natural columns: J^T grad_x N = grad_nat N. + const auto gradients = factor.Value().Solve(natural_gradients, true); + if (!gradients.HasValue()) + return Result::Failure(candidate.Failure( + "Reference gradient or point coordinate is nonfinite.")); point.position = coordinates[0]; for (std::size_t a = 0; a < 8; ++a) for (std::size_t i = 0; i < 3; ++i) { point.position[i] += point.shape[a] * (coordinates[a][i] - coordinates[0][i]); - for (std::size_t d = 0; d < 3; ++d) - point.gradients[a][i] += inverse[d][i] * derivatives[a][d]; + point.gradients[a][i] = gradients.Value()(i, a); if (!std::isfinite(point.gradients[a][i]) || !std::isfinite(point.position[i])) return Result::Failure(candidate.Failure( diff --git a/src/fesa/elements/hex8_geometry.cpp b/src/fesa/elements/hex8_geometry.cpp index e7eff40..6d444cf 100644 --- a/src/fesa/elements/hex8_geometry.cpp +++ b/src/fesa/elements/hex8_geometry.cpp @@ -228,17 +228,4 @@ double Determinant(const Tensor& j) { j[0][1] * (j[1][0] * j[2][2] - j[1][2] * j[2][0]) + j[0][2] * (j[1][0] * j[2][1] - j[1][1] * j[2][0]); } -Tensor Inverse(const Tensor& j, double determinant) { - Tensor inverse{}; - for (std::size_t i = 0; i < 3; ++i) - for (std::size_t d = 0; d < 3; ++d) { - const auto r1 = (d + 1U) % 3U; - const auto r2 = (d + 2U) % 3U; - const auto c1 = (i + 1U) % 3U; - const auto c2 = (i + 2U) % 3U; - inverse[i][d] = - (j[r1][c1] * j[r2][c2] - j[r1][c2] * j[r2][c1]) / determinant; - } - return inverse; -} } // namespace fesa::hex8_internal diff --git a/src/fesa/elements/hex8_geometry.h b/src/fesa/elements/hex8_geometry.h index 6e670c7..72bf299 100644 --- a/src/fesa/elements/hex8_geometry.h +++ b/src/fesa/elements/hex8_geometry.h @@ -26,8 +26,6 @@ Tensor Jacobian(const Hex8Element::Coordinates& coordinates, const std::array& derivatives); /// @brief Computes the signed determinant; no absolute value or clamp. double Determinant(const Tensor& matrix); -/// @brief Computes the inverse for an already validated positive determinant. -Tensor Inverse(const Tensor& matrix, double determinant); } // namespace fesa::hex8_internal #endif // FESA_ELEMENTS_HEX8_GEOMETRY_H_ diff --git a/src/fesa/elements/hex8_high_low.cpp b/src/fesa/elements/hex8_high_low.cpp index ed1f9dc..90cfd2c 100644 --- a/src/fesa/elements/hex8_high_low.cpp +++ b/src/fesa/elements/hex8_high_low.cpp @@ -8,7 +8,6 @@ #include "../math/high_low_arithmetic.h" #include "hex8_geometry.h" #include "hex8_linear_tangent_cache.h" -#include "hex8_pair_arithmetic.h" #include "hex8_pair_simd.h" namespace fesa { @@ -18,13 +17,13 @@ using Triple = std::array; using Tensor = std::array; HighLow operator+(HighLow a, HighLow b) { - return hex8_internal::AddPair(a, b); + return math_internal::Add(a, b); } HighLow operator-(HighLow a, HighLow b) { return math_internal::Subtract(a, b); } HighLow operator*(HighLow a, HighLow b) { - return hex8_internal::MultiplyPair(a, b); + return math_internal::Multiply(a, b); } HighLow operator/(HighLow a, HighLow b) { return math_internal::Divide(a, b); diff --git a/src/fesa/elements/hex8_pair_arithmetic.h b/src/fesa/elements/hex8_pair_arithmetic.h deleted file mode 100644 index d2fdd5f..0000000 --- a/src/fesa/elements/hex8_pair_arithmetic.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef FESA_SRC_FESA_ELEMENTS_HEX8_PAIR_ARITHMETIC_H_ -#define FESA_SRC_FESA_ELEMENTS_HEX8_PAIR_ARITHMETIC_H_ - -#include "../math/high_low_arithmetic.h" - -namespace fesa::hex8_internal { -/// @brief Preserves original zero-add normalization without redundant TwoSums. -/// @note Valid nonzero terms retain the original addition association. -inline math_internal::HighLow AddPair(math_internal::HighLow left, - math_internal::HighLow right) { - using namespace math_internal; - if (!IsNormalized(left) || !IsNormalized(right)) return InvalidHighLow(); - if (left.high == 0 && left.low == 0) - return {right.high, right.low == 0 ? 0.0 : right.low}; - if (right.high == 0 && right.low == 0) - return {left.high, left.low == 0 ? 0.0 : left.low}; - return Add(left, right); -} -/// @brief Omits exact-zero cross products without changing nonzero association. -/// @note A retained zero addition performs the original canonicalization and -/// invalid-result check; its repeated application is idempotent. -inline math_internal::HighLow MultiplyPair(math_internal::HighLow left, - math_internal::HighLow right) { - using namespace math_internal; - if (!IsNormalized(left) || !IsNormalized(right)) return InvalidHighLow(); - if (left.low != 0 && right.low != 0) return Multiply(left, right); - auto product = TwoProduct(left.high, right.high); - if (right.low != 0) { - product = AddPair(product, TwoProduct(left.high, right.low)); - } else if (left.low != 0) { - // The original zero addition precedes the nonzero low-high term. - product = AddPair(product, HighLow{}); - } - if (left.low != 0) - product = AddPair(product, TwoProduct(left.low, right.high)); - return AddPair(product, HighLow{}); -} -} // namespace fesa::hex8_internal - -#endif // FESA_SRC_FESA_ELEMENTS_HEX8_PAIR_ARITHMETIC_H_ diff --git a/src/fesa/elements/hex8_pair_simd.h b/src/fesa/elements/hex8_pair_simd.h index 4dffa07..4e5a933 100644 --- a/src/fesa/elements/hex8_pair_simd.h +++ b/src/fesa/elements/hex8_pair_simd.h @@ -60,11 +60,11 @@ void EvaluateMaterialPacketScalar(const MaterialPacketInput& input, void EvaluateMaterialPacketAvx2(const MaterialPacketInput& input, PairPacket* output); /// @brief Baseline-ISA checked addition bridge in lane order 0..3. -/// @note pair_shortcuts chooses the original local AddPair or general Add graph; +/// @note Uses the shared checked high/low arithmetic owner; /// invalid pairs are preserved, with no FP-state mutation or normalization here. void ScalarPacketAdd(const PairPacket& left, const PairPacket& right, - bool pair_shortcuts, PairPacket* output); -/// @brief Baseline-ISA original checked MultiplyPair bridge in lane order 0..3. + PairPacket* output); +/// @brief Baseline-ISA shared checked multiplication bridge in lane order 0..3. /// @note Raw invalid outputs remain invalid; no component is rounded away. void ScalarPacketMultiply(const PairPacket& left, const PairPacket& right, PairPacket* output); diff --git a/src/fesa/elements/hex8_pair_simd_avx2.cpp b/src/fesa/elements/hex8_pair_simd_avx2.cpp index 570b2a5..0a6e597 100644 --- a/src/fesa/elements/hex8_pair_simd_avx2.cpp +++ b/src/fesa/elements/hex8_pair_simd_avx2.cpp @@ -144,11 +144,11 @@ bool TwoSum(__m256d left, __m256d right, VectorPair* output) { return true; } /// @brief Routes exceptional packets to baseline checked Add in lane order. -VectorPair ScalarAdd(VectorPair left, VectorPair right, bool pair_shortcuts) { +VectorPair ScalarAdd(VectorPair left, VectorPair right) { const auto a = Store(left); const auto b = Store(right); PairPacket result; - ScalarPacketAdd(a, b, pair_shortcuts, &result); + ScalarPacketAdd(a, b, &result); return Load(result); } /// @brief Routes exceptional packets to baseline checked MultiplyPair. @@ -160,7 +160,7 @@ VectorPair ScalarMultiply(const PairPacket& left, const PairPacket& right) { /// @brief Retains normalized/zero branches and the checked per-lane Add graph. VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) { if (!NormalizedInputs(left, right)) - return ScalarAdd(left, right, pair_shortcuts); + return ScalarAdd(left, right); const int left_zero = _mm256_movemask_pd( _mm256_and_pd(Zero(left.high), Zero(left.low))); const int right_zero = _mm256_movemask_pd( @@ -171,7 +171,7 @@ VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) { if (right_zero == 15) return {left.high, Select(Zero(left.low), _mm256_setzero_pd(), left.low)}; if (left_zero != 0 || right_zero != 0) - return ScalarAdd(left, right, true); + return ScalarAdd(left, right); } VectorPair head; VectorPair tail; @@ -181,7 +181,7 @@ VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) { !TwoSum(left.low, right.low, &tail) || !TwoSum(head.low, tail.high, &middle) || !TwoSum(head.high, middle.high, &joined)) - return ScalarAdd(left, right, pair_shortcuts); + return ScalarAdd(left, right); const auto remainder = _mm256_add_pd( _mm256_add_pd(joined.low, middle.low), tail.low); const auto valid = _mm256_and_pd(Finite(remainder), _mm256_and_pd( @@ -193,7 +193,7 @@ VectorPair Add(VectorPair left, VectorPair right, bool pair_shortcuts) { VectorPair result; if (!TwoSum(Select(valid, joined.high, _mm256_setzero_pd()), Select(valid, remainder, _mm256_setzero_pd()), &result)) - return ScalarAdd(left, right, pair_shortcuts); + return ScalarAdd(left, right); return InvalidOutside(result, valid); } /// @brief Checks finite/zero/tail premises before products; neutralizes rejected diff --git a/src/fesa/elements/hex8_pair_simd_dispatch.cpp b/src/fesa/elements/hex8_pair_simd_dispatch.cpp index 97e0118..9c97047 100644 --- a/src/fesa/elements/hex8_pair_simd_dispatch.cpp +++ b/src/fesa/elements/hex8_pair_simd_dispatch.cpp @@ -1,6 +1,6 @@ #include "hex8_pair_simd.h" -#include "hex8_pair_arithmetic.h" +#include "../math/high_low_arithmetic.h" #if defined(FESA_HEX8_PAIR_AVX2) && defined(_MSC_VER) && defined(_M_X64) #include @@ -16,11 +16,11 @@ namespace fesa::hex8_internal { #endif FESA_HEX8_BASELINE_NOINLINE void ScalarPacketAdd(const PairPacket& left, const PairPacket& right, - bool pair_shortcuts, PairPacket* output) { + PairPacket* output) { for (std::size_t lane = 0; lane < 4; ++lane) { const math_internal::HighLow a{left.values[lane].high, left.values[lane].low}; const math_internal::HighLow b{right.values[lane].high, right.values[lane].low}; - const auto value = pair_shortcuts ? AddPair(a, b) : math_internal::Add(a, b); + const auto value = math_internal::Add(a, b); output->values[lane] = {value.high, value.low}; } } @@ -28,7 +28,7 @@ FESA_HEX8_BASELINE_NOINLINE void ScalarPacketMultiply(const PairPacket& left, const PairPacket& right, PairPacket* output) { for (std::size_t lane = 0; lane < 4; ++lane) { - const auto value = MultiplyPair( + const auto value = math_internal::Multiply( {left.values[lane].high, left.values[lane].low}, {right.values[lane].high, right.values[lane].low}); output->values[lane] = {value.high, value.low}; @@ -51,14 +51,14 @@ void EvaluateGeometryPacketScalar(const GeometryPacketInput& input, for (std::size_t lane = 0; lane < 4; ++lane) { math_internal::HighLow dot; for (std::size_t i = 0; i < 3; ++i) - dot = AddPair(dot, MultiplyPair(value(input.gradient_a[i]), + dot = math_internal::Add(dot, math_internal::Multiply(value(input.gradient_a[i]), value(input.gradient_b[i].values[lane]))); math_internal::HighLow geo; for (std::size_t j = 0; j < 3; ++j) for (std::size_t l = 0; l < 3; ++l) - geo = AddPair(geo, MultiplyPair(value(input.gradient_stress[j][l]), + geo = math_internal::Add(geo, math_internal::Multiply(value(input.gradient_stress[j][l]), value(input.gradient_b[l].values[lane]))); - const auto weighted = MultiplyPair(geo, value(input.weight)); + const auto weighted = math_internal::Multiply(geo, value(input.weight)); output->gradient_dot.values[lane] = {dot.high, dot.low}; output->weighted_geometric.values[lane] = {weighted.high, weighted.low}; } @@ -84,15 +84,15 @@ void EvaluateMaterialPacketScalar(const MaterialPacketInput& input, return math_internal::HighLow{pair.high, pair.low}; }; for (std::size_t lane = 0; lane < 4; ++lane) { - const auto first = MultiplyPair(value(input.deviatoric_left.values[lane]), + const auto first = math_internal::Multiply(value(input.deviatoric_left.values[lane]), value(input.deviatoric_right.values[lane])); - const auto second = MultiplyPair(value(input.shear_left.values[lane]), + const auto second = math_internal::Multiply(value(input.shear_left.values[lane]), value(input.shear_right.values[lane])); - const auto third = MultiplyPair(value(input.tensor_left.values[lane]), + const auto third = math_internal::Multiply(value(input.tensor_left.values[lane]), value(input.gradient_dot.values[lane])); - const auto material = AddPair(AddPair(first, second), third); - const auto accumulated = AddPair(value(input.accumulated.values[lane]), - MultiplyPair(material, value(input.weight))); + const auto material = math_internal::Add(math_internal::Add(first, second), third); + const auto accumulated = math_internal::Add(value(input.accumulated.values[lane]), + math_internal::Multiply(material, value(input.weight))); output->values[lane] = {accumulated.high, accumulated.low}; } } diff --git a/src/fesa/elements/mitc4_shell.cpp b/src/fesa/elements/mitc4_shell.cpp index 129f05b..6aea36e 100644 --- a/src/fesa/elements/mitc4_shell.cpp +++ b/src/fesa/elements/mitc4_shell.cpp @@ -9,6 +9,9 @@ #include "fesa/model/model_types.h" #include "math/dense_blas_internal.h" +#include "math/finite_values.h" +#include "math/vector3_operations.h" +#include "elements/shell_kernel_values.h" namespace fesa { @@ -63,6 +66,13 @@ void Mitc4ShellDefinition::SynchronizeNodeIndices() { namespace { +using shell_kernel_internal::FrameComponent; +using shell_kernel_internal::LocalEngineeringComponents; +using shell_kernel_internal::ElementIdentity; +using math_internal::DerivativeSum; +using math_internal::WeightedSum; +using math_internal::IsFinite; + constexpr std::size_t kNodeCount = 4U; constexpr std::size_t kPhysicalDofsPerNode = 5U; constexpr std::size_t kGlobalDofsPerNode = 6U; @@ -71,24 +81,6 @@ constexpr std::size_t kGlobalDofCount = 24U; constexpr double kShearCorrection = 5.0 / 6.0; constexpr double kFrameTolerance = 1.0e-12; -Vector3 WeightedSum(const std::array& weights, - const std::array& values) { - Vector3 result{}; - for (std::size_t node = 0U; node < kNodeCount; ++node) { - result = result + weights[node] * values[node]; - } - return result; -} - -Vector3 DerivativeSum(const std::array& derivatives, - const std::array& values) { - std::array relative{}; - for (std::size_t node = 0U; node < kNodeCount; ++node) { - relative[node] = values[node] - values[0]; - } - return WeightedSum(derivatives, relative); -} - bool SameCoordinates(const Vector3& left, const Vector3& right) { return left == right; } @@ -129,20 +121,6 @@ std::array NodalTangentsB( return tangents; } -std::string ElementIdentity(const std::array& nodes) { - std::string identity; - for (const Node* node : nodes) { - if (node == nullptr) { - continue; - } - if (!identity.empty()) { - identity += "-"; - } - identity += node->source_id.source_label_text; - } - return identity; -} - Result ModelFailure(std::string code, const SourceLocation& location, const std::string& identity, @@ -169,58 +147,36 @@ std::array, 3> CovariantStrainColumn( return strain; } -/// @brief Reconstructs Cartesian strain in the approved reciprocal-basis -/// reduction order. +/// @brief Solves C^T E C = E_cov for the actual strain tensor. std::array, 3> ReconstructCartesianStrain( const std::array, 3>& covariant_strain, - const std::array& reciprocal) { + const dense_blas_internal::DenseFactor& factor) { + Matrix rhs{3U, 3U}; + for (std::size_t i = 0; i < 3U; ++i) + for (std::size_t j = 0; j < 3U; ++j) rhs(i, j) = covariant_strain[i][j]; + const auto left = factor.Solve(rhs, true); + if (!left.HasValue()) + throw std::invalid_argument{"MITC4 Cartesian strain is nonfinite."}; + const auto solved = factor.SolveRight(left.Value()); + if (!solved.HasValue()) + throw std::invalid_argument{"MITC4 Cartesian strain is nonfinite."}; std::array, 3> tensor{}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - for (std::size_t first = 0U; first < 3U; ++first) { - for (std::size_t second = 0U; second < 3U; ++second) { - tensor[row][column] += covariant_strain[first][second] * - reciprocal[first][row] * - reciprocal[second][column]; - } - } - } - } + for (std::size_t i = 0; i < 3U; ++i) + for (std::size_t j = 0; j < 3U; ++j) tensor[i][j] = solved.Value()(i, j); return tensor; } -double FrameComponent(const Vector3& left, - const std::array, 3>& tensor, - const Vector3& right) { - double value = 0.0; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - value += left[row] * tensor[row][column] * right[column]; - } - } - return value; -} - -/// @brief Projects tensor strain into signed local engineering components. -std::array LocalEngineeringComponents( - const std::array, 3>& tensor, - const Mitc4LocalFrame& frame) { - const Vector3 e1{frame.e1}; - const Vector3 e2{frame.e2}; - const Vector3 e3{frame.e3}; - return {FrameComponent(e1, tensor, e1), FrameComponent(e2, tensor, e2), - 2.0 * FrameComponent(e1, tensor, e2), - 2.0 * FrameComponent(e1, tensor, e3), - 2.0 * FrameComponent(e2, tensor, e3)}; +/// @brief Packs covariant columns without constructing reciprocal vectors. +Matrix CovariantMatrix(const std::array& covariant) { + Matrix coefficients{3U, 3U}; + for (std::size_t i = 0; i < 3U; ++i) + for (std::size_t j = 0; j < 3U; ++j) coefficients(i, j) = covariant[j][i]; + return coefficients; } Matrix ScaledMatrix(const Matrix& source, double factor) { - Matrix result{source.Rows(), source.Columns()}; - for (std::size_t row = 0U; row < source.Rows(); ++row) { - for (std::size_t column = 0U; column < source.Columns(); ++column) { - result(row, column) = factor * source(row, column); - } - } + Matrix result{source}; + result.Scale(factor); return result; } @@ -241,26 +197,6 @@ Matrix Congruence(const Matrix& local, const Matrix& transformation) { return result; } -bool IsFinite(const Matrix& matrix) { - for (std::size_t row = 0U; row < matrix.Rows(); ++row) { - for (std::size_t column = 0U; column < matrix.Columns(); ++column) { - if (!std::isfinite(matrix(row, column))) { - return false; - } - } - } - return true; -} - -bool IsFinite(const Vector& vector) { - for (std::size_t index = 0U; index < vector.Size(); ++index) { - if (!std::isfinite(vector[index])) { - return false; - } - } - return true; -} - Result StiffnessFailure(const SourceLocation& location, const std::string& identity, std::string message) { @@ -1092,12 +1028,25 @@ bool Mitc4Shell::EvaluateGeometry(double xi, double eta, double zeta, return false; } - result.reciprocal[0] = - (1.0 / result.jacobian) * result.covariant[1].Cross(result.covariant[2]); - result.reciprocal[1] = - (1.0 / result.jacobian) * result.covariant[2].Cross(result.covariant[0]); - result.reciprocal[2] = - (1.0 / result.jacobian) * result.covariant[0].Cross(result.covariant[1]); + if (!std::isfinite(1.0 / result.jacobian) || + !result.covariant[1].Cross(result.covariant[2]).IsFinite() || + !result.covariant[2].Cross(result.covariant[0]).IsFinite() || + !result.covariant[0].Cross(result.covariant[1]).IsFinite()) return false; + // Preserve the reciprocal finiteness gate, streaming each action directly + // into validation rather than retaining a reciprocal-basis matrix. + try { + const auto factor = dense_blas_internal::DenseFactor::Lu( + CovariantMatrix(result.covariant)); + if (!factor.HasValue()) return false; + Matrix rhs{3U, 1U}; + for (std::size_t axis = 0; axis < 3U; ++axis) { + if (axis != 0U) rhs(axis - 1U, 0U) = 0.0; + rhs(axis, 0U) = 1.0; + if (!factor.Value().Solve(rhs, true).HasValue()) return false; + } + } catch (const std::exception&) { + return false; + } const Vector3 area = midsurface_xi.Cross(midsurface_eta); const double director_norm = director_value.Norm(); @@ -1120,8 +1069,7 @@ bool Mitc4Shell::EvaluateGeometry(double xi, double eta, double zeta, const Vector3 e2 = e3.Cross(e1); result.frame.e1 = e1.Components(); result.frame.e2 = e2.Components(); - return result.reciprocal[0].IsFinite() && result.reciprocal[1].IsFinite() && - result.reciprocal[2].IsFinite() && e2.IsFinite(); + return e2.IsFinite(); } std::array, 20> Mitc4Shell::BasisDerivatives( @@ -1165,6 +1113,11 @@ Matrix Mitc4Shell::StrainDisplacement(double xi, double eta, double zeta, throw std::invalid_argument{ "MITC4 strain geometry is invalid at the requested point."}; } + const auto factor = dense_blas_internal::DenseFactor::Lu( + CovariantMatrix(geometry.covariant)); + if (!factor.HasValue()) + throw std::invalid_argument{ + "MITC4 strain geometry is invalid at the requested point."}; const auto derivatives = BasisDerivatives(xi, eta, zeta); const Mitc4TyingWeights weights = TyingWeights(xi, eta); Matrix result{5U, kPhysicalDofCount}; @@ -1180,7 +1133,7 @@ Matrix Mitc4Shell::StrainDisplacement(double xi, double eta, double zeta, covariant[2U][1U] = covariant[1U][2U]; } const auto engineering = LocalEngineeringComponents( - ReconstructCartesianStrain(covariant, geometry.reciprocal), + ReconstructCartesianStrain(covariant, factor.Value()), geometry.frame); for (std::size_t component = 0U; component < engineering.size(); ++component) { diff --git a/src/fesa/elements/nonlinear_mitc4_inertia.cpp b/src/fesa/elements/nonlinear_mitc4_inertia.cpp index 13198fb..b0716d4 100644 --- a/src/fesa/elements/nonlinear_mitc4_inertia.cpp +++ b/src/fesa/elements/nonlinear_mitc4_inertia.cpp @@ -11,32 +11,29 @@ #include "fesa/elements/finite_rotation.h" #include "math/dense_blas_internal.h" +#include "math/jet_arithmetic.h" +#include "math/jet_linear_solve.h" +#include "math/finite_values.h" +#include "math/vector3_operations.h" +#include "elements/shell_kernel_values.h" +#include "math/compensated_sum.h" namespace fesa { namespace { +using shell_kernel_internal::Failure; +using InertiaSum = math_internal::CompensatedSum; +using shell_kernel_internal::FrameMatrix; +using math_internal::DerivativeSum; +using math_internal::WeightedSum; +using math_internal::IsFinite; + constexpr std::size_t kNodes = 4U; constexpr std::size_t kDofs = 24U; const std::array kGauss{-std::sqrt(3.0 / 5.0), 0.0, std::sqrt(3.0 / 5.0)}; constexpr std::array kWeights{5.0 / 9.0, 8.0 / 9.0, 5.0 / 9.0}; -class InertiaSum { - public: - void Add(const double term) { - const double next = sum_ + term; - correction_ += std::abs(sum_) >= std::abs(term) - ? (sum_ - next) + term - : (term - next) + sum_; - sum_ = next; - } - double Value() const { return sum_ + correction_; } - - private: - double sum_ = 0.0; - double correction_ = 0.0; -}; - /// @brief Contracts two nodal 6-by-3 coefficient blocks through dense MKL. /// @note Nonfinite coefficients remain failures of the final inertia gate. void DotBlocks(const std::array& left, @@ -47,25 +44,6 @@ void DotBlocks(const std::array& left, result.fill(std::numeric_limits::quiet_NaN()); } -Vector3 WeightedSum(const std::array& weights, - const std::array& values) { - Vector3 result{}; - for (std::size_t node = 0U; node < kNodes; ++node) - result = result + weights[node] * values[node]; - return result; -} - -// A derivative partition has no absolute-position contribution. Anchoring -// before reduction preserves that identity at large global offsets and keeps -// the reference/current covariants in the same canonical form. -Vector3 DerivativeSum(const std::array& derivatives, - const std::array& values) { - std::array relative{}; - for (std::size_t node = 0U; node < kNodes; ++node) - relative[node] = values[node] - values[0U]; - return WeightedSum(derivatives, relative); -} - Vector3 InterpolatedSum(const std::array& weights, const std::array& values) { std::array relative{}; @@ -74,14 +52,6 @@ Vector3 InterpolatedSum(const std::array& weights, return values[0U] + WeightedSum(weights, relative); } -template -Result Failure(const std::string& code, const SourceLocation& location, - const std::string& identity, std::string message) { - return Result::Failure(Status::Failure( - FailureCategory::kModel, {{Severity::kError, code, location, "*ELEMENT", - identity, std::move(message)}})); -} - std::string Identity(const std::array& nodes) { std::string identity; for (const Node* node : nodes) { @@ -93,36 +63,6 @@ std::string Identity(const std::array& nodes) { return identity; } -Matrix FrameMatrix(const ShellNodeInitialFrame& frame) { - Matrix result{3U, 3U}; - for (std::size_t row = 0U; row < 3U; ++row) { - result(row, 0U) = frame.tangent_a[row]; - result(row, 1U) = frame.tangent_b[row]; - result(row, 2U) = frame.director[row]; - } - return result; -} - -bool IsFinite(const Matrix& matrix) { - for (std::size_t row = 0U; row < matrix.Rows(); ++row) { - for (std::size_t column = 0U; column < matrix.Columns(); ++column) { - if (!std::isfinite(matrix(row, column))) { - return false; - } - } - } - return true; -} - -bool IsFinite(const Vector& vector) { - for (std::size_t index = 0U; index < vector.Size(); ++index) { - if (!std::isfinite(vector[index])) { - return false; - } - } - return true; -} - /// @brief Carries all derivatives through order three in one nodal rotation. struct Jet { double value{}; @@ -189,31 +129,6 @@ Jet operator*(const Jet& left, const Jet& right) { return result; } -Jet Reciprocal(const Jet& value) { - Jet result{}; - result.value = 1.0 / value.value; - const double squared = result.value * result.value; - const double cubed = squared * result.value; - const double fourth = cubed * result.value; - for (std::size_t i = 0U; i < 3U; ++i) { - result.d[i] = -value.d[i] * squared; - for (std::size_t j = 0U; j < 3U; ++j) { - result.dd[i][j] = - 2.0 * value.d[i] * value.d[j] * cubed - value.dd[i][j] * squared; - for (std::size_t k = 0U; k < 3U; ++k) { - result.ddd[i][j][k] = - -6.0 * value.d[i] * value.d[j] * value.d[k] * fourth + - 2.0 * - (value.dd[i][j] * value.d[k] + value.dd[i][k] * value.d[j] + - value.dd[j][k] * value.d[i]) * - cubed - - value.ddd[i][j][k] * squared; - } - } - } - return result; -} - Jet InverseSqrt(const Jet& value) { Jet result{}; result.value = 1.0 / std::sqrt(value.value); @@ -246,27 +161,11 @@ using JetVector = std::array; using JetMatrix = std::array, 3>; JetVector Multiply(const JetMatrix& matrix, const JetVector& vector) { - JetVector result{Constant(0.0), Constant(0.0), Constant(0.0)}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - result[row] = result[row] + matrix[row][column] * vector[column]; - } - } - return result; + return math_internal::MultiplyJetMatrixVector(matrix, vector, Constant); } JetMatrix Multiply(const JetMatrix& left, const JetMatrix& right) { - JetMatrix result{}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - result[row][column] = Constant(0.0); - for (std::size_t index = 0U; index < 3U; ++index) { - result[row][column] = - result[row][column] + left[row][index] * right[index][column]; - } - } - } - return result; + return math_internal::MultiplyJetMatrix(left, right, Constant); } JetMatrix IdentityMatrix() { @@ -296,30 +195,32 @@ Jet Dot(const JetVector& left, const JetVector& right) { return result; } -JetMatrix Inverse(const JetMatrix& matrix) { - JetMatrix cofactor{}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - const std::size_t a = (row + 1U) % 3U; - const std::size_t b = (row + 2U) % 3U; - const std::size_t c = (column + 1U) % 3U; - const std::size_t d = (column + 2U) % 3U; - cofactor[row][column] = - matrix[a][c] * matrix[b][d] - matrix[a][d] * matrix[b][c]; - // Cyclic minor ordering already includes the cofactor sign. - } - } - Jet determinant = Constant(0.0); - for (std::size_t column = 0U; column < 3U; ++column) { - determinant = determinant + matrix[0U][column] * cofactor[0U][column]; - } - const Jet inverse_determinant = Reciprocal(determinant); - JetMatrix result{}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - result[row][column] = cofactor[column][row] * inverse_determinant; - } - } +/// @brief Reads every nodal-rotation derivative in increasing total order. +double ReadChannel(const Jet& jet, std::size_t degree, std::size_t channel) { + if (degree == 0) return jet.value; + if (degree == 1) return jet.d[channel]; + if (degree == 2) return jet.dd[channel / 3][channel % 3]; + return jet.ddd[channel / 9][(channel / 3) % 3][channel % 3]; +} +void WriteChannel(Jet& jet, std::size_t degree, std::size_t channel, + double value) { + if (degree == 0) jet.value = value; + else if (degree == 1) jet.d[channel] = value; + else if (degree == 2) jet.dd[channel / 3][channel % 3] = value; + else jet.ddd[channel / 9][(channel / 3) % 3][channel % 3] = value; +} +/// @brief Solves the actual null-preimage RHS with all third derivatives. +JetVector Solve(const JetMatrix& matrix, const JetVector& rhs) { + Matrix primal{3, 3}; + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t column = 0; column < 3; ++column) + primal(row, column) = matrix[row][column].value; + const auto factor = dense_blas_internal::DenseFactor::Lu(primal); + JetVector result{}; + if (factor.HasValue() && math_internal::SolveJetAction( + matrix, rhs, factor.Value(), {1, 3, 9, 27}, Constant, ReadChannel, + WriteChannel, result)) return result; + result.fill(Constant(std::numeric_limits::quiet_NaN())); return result; } @@ -486,27 +387,12 @@ Status CheckPhysicalMass(const Matrix& mass, const Matrix mass_complement = scaled.Multiply(complement); const Matrix block = dense_blas_internal::MultiplyTransposeLeft(complement, mass_complement); - double block_norm = 0.0; - for (std::size_t row = 0U; row < kPhysical; ++row) { - double row_sum = 0.0; - for (std::size_t column = 0U; column < kPhysical; ++column) { - row_sum += std::abs(block(row, column)); - } - block_norm = std::max(block_norm, row_sum); - } - Matrix lower{kPhysical, kPhysical}; - Matrix inverse_lower{kPhysical, kPhysical}; - auto factor_failure = dense_blas_internal::CholeskyFailure::kNone; - if (!dense_blas_internal::CholeskyLowerAndInverse(block, lower, inverse_lower, - &factor_failure)) { - if (factor_failure == dense_blas_internal::CholeskyFailure::kInverse) - return fail( - "ill-conditioned-nonlinear-inertia-positive-mass", - "Physical mass reciprocal infinity condition is below 2^-32."); + const auto factor = dense_blas_internal::DenseFactor::Cholesky(block); + if (!factor.HasValue()) { return fail("invalid-nonlinear-inertia-positive-mass", "Physical mass requires strictly positive Cholesky pivots."); } - std::array inverse_row_sums{}; + const Matrix lower = std::move(factor.Value().Lower().Value()); double reconstruction_error = 0.0; double block_frobenius = 0.0; Matrix transpose{kPhysical, kPhysical}; @@ -526,16 +412,9 @@ Status CheckPhysicalMass(const Matrix& mass, return fail("invalid-nonlinear-inertia-positive-mass", "Physical mass Cholesky reconstruction failed."); } - const Matrix inverse = - dense_blas_internal::MultiplyTransposeLeft(inverse_lower, inverse_lower); - for (std::size_t column = 0U; column < kPhysical; ++column) - for (std::size_t row = 0U; row < kPhysical; ++row) - inverse_row_sums[row] += std::abs(inverse(row, column)); - const double inverse_norm = - *std::max_element(inverse_row_sums.begin(), inverse_row_sums.end()); - const double reciprocal_condition = 1.0 / block_norm / inverse_norm; - if (!std::isfinite(inverse_norm) || !std::isfinite(reciprocal_condition) || - !(reciprocal_condition >= std::ldexp(1.0, -32))) { + const auto reciprocal_condition = factor.Value().ReciprocalConditionInfinity(); + if (!reciprocal_condition.HasValue() || + !(reciprocal_condition.Value() >= std::ldexp(1.0, -32))) { return fail("ill-conditioned-nonlinear-inertia-positive-mass", "Physical mass reciprocal infinity condition is below 2^-32."); } @@ -566,7 +445,7 @@ Result EvaluateDynamicRotation( Constant(initial_director.Z())}; const JetVector director_jet = Multiply(ExpSkew(phi), initial); const JetMatrix left_jacobian = LeftJacobian(phi); - JetVector null_jet = Multiply(Inverse(left_jacobian), director_jet); + JetVector null_jet = Solve(left_jacobian, director_jet); const Jet null_norm_squared = Dot(null_jet, null_jet); if (!std::isfinite(null_norm_squared.value) || !(null_norm_squared.value > 0.0)) { diff --git a/src/fesa/elements/nonlinear_mitc4_shell.cpp b/src/fesa/elements/nonlinear_mitc4_shell.cpp index 400d3e7..d058f18 100644 --- a/src/fesa/elements/nonlinear_mitc4_shell.cpp +++ b/src/fesa/elements/nonlinear_mitc4_shell.cpp @@ -6,12 +6,18 @@ #include #include #include +#include #include #include #include "fesa/elements/finite_rotation.h" #include "elements/nonlinear_mitc4_configuration_internal.h" #include "math/dense_blas_internal.h" +#include "math/jet_arithmetic.h" +#include "math/jet_linear_solve.h" +#include "math/finite_values.h" +#include "math/vector3_operations.h" +#include "elements/shell_kernel_values.h" namespace fesa { @@ -40,6 +46,15 @@ nonlinear_mitc4_internal::ConfigurationSnapshot::Read( namespace { +using shell_kernel_internal::Failure; +using shell_kernel_internal::FrameComponent; +using shell_kernel_internal::LocalEngineeringComponents; +using shell_kernel_internal::FrameMatrix; +using shell_kernel_internal::ElementIdentity; +using math_internal::DerivativeSum; +using math_internal::WeightedSum; +using math_internal::IsFinite; + constexpr std::size_t kNodeCount = 4U; constexpr double kFrameTolerance = 1.0e-12; constexpr double kDirectorOppositionTolerance = 1.0e-8; @@ -53,7 +68,7 @@ struct Geometry { std::array reference_covariant; std::array current_covariant; std::array covariant_increment; - std::array reciprocal; + std::optional reference_factor; Mitc4LocalFrame local_frame; double reference_jacobian; }; @@ -64,61 +79,6 @@ struct PointEvaluation { EngineeringStress stress; }; -/// @brief Builds one deterministic structured nonlinear-shell failure. -template -Result Failure(const std::string& code, const SourceLocation& location, - const std::string& identity, std::string message) { - return Result::Failure(Status::Failure( - FailureCategory::kModel, {{Severity::kError, code, location, "*ELEMENT", - identity, std::move(message)}})); -} - -/// @brief Builds the stable source label concatenation used by diagnostics. -std::string ElementIdentity(const std::array& nodes) { - std::string identity; - for (const Node* node : nodes) { - if (node == nullptr) { - continue; - } - if (!identity.empty()) { - identity += "-"; - } - identity += node->source_id.source_label_text; - } - return identity; -} - -/// @brief Forms a weighted vector sum in source-node order. -Vector3 WeightedSum(const std::array& weights, - const std::array& values) { - Vector3 result{}; - for (std::size_t node = 0U; node < kNodeCount; ++node) { - result = result + weights[node] * values[node]; - } - return result; -} - -/// @brief Forms a stable derivative sum after cancelling the constant term. -Vector3 DerivativeSum(const std::array& derivatives, - const std::array& values) { - std::array relative{}; - for (std::size_t node = 0U; node < kNodeCount; ++node) { - relative[node] = values[node] - values[0U]; - } - return WeightedSum(derivatives, relative); -} - -/// @brief Returns a frame matrix whose columns are a, b and the director. -Matrix FrameMatrix(const ShellNodeInitialFrame& frame) { - Matrix result{3U, 3U}; - for (std::size_t row = 0U; row < 3U; ++row) { - result(row, 0U) = frame.tangent_a[row]; - result(row, 1U) = frame.tangent_b[row]; - result(row, 2U) = frame.director[row]; - } - return result; -} - /// @brief Checks every scalar in a tensor before recovery commits it. bool IsFinite(const Tensor& tensor) { for (const auto& row : tensor) { @@ -131,13 +91,6 @@ bool IsFinite(const Tensor& tensor) { return true; } -/// @brief Checks every scalar in one fixed-size engineering quantity. -template -bool IsFinite(const std::array& values) { - return std::all_of(values.begin(), values.end(), - [](const double value) { return std::isfinite(value); }); -} - /// @brief Evaluates a determinant from covariant basis columns. double Determinant(const std::array& covariant) { return covariant[0U].Dot(covariant[1U].Cross(covariant[2U])); @@ -256,20 +209,24 @@ bool EvaluateGeometry(const std::array& coordinates, return false; } - geometry.reciprocal[0U] = - geometry.reference_covariant[1U].Cross(geometry.reference_covariant[2U]) / - geometry.reference_jacobian; - geometry.reciprocal[1U] = - geometry.reference_covariant[2U].Cross(geometry.reference_covariant[0U]) / - geometry.reference_jacobian; - geometry.reciprocal[2U] = - geometry.reference_covariant[0U].Cross(geometry.reference_covariant[1U]) / - geometry.reference_jacobian; - if (!geometry.reciprocal[0U].IsFinite() || - !geometry.reciprocal[1U].IsFinite() || - !geometry.reciprocal[2U].IsFinite()) { - return false; + // Retain the old unscaled cross-product finite gate before factor actions. + for (std::size_t alpha = 0; alpha < 3; ++alpha) + if (!geometry.reference_covariant[(alpha+1)%3].Cross( + geometry.reference_covariant[(alpha+2)%3]).IsFinite()) return false; + Matrix basis{3, 3}; + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t alpha = 0; alpha < 3; ++alpha) + basis(row, alpha) = geometry.reference_covariant[alpha][row]; + auto factor = dense_blas_internal::DenseFactor::Lu(basis); + if (!factor.HasValue()) return false; + // Stream the former reciprocal finite gate without retaining an inverse. + Matrix rhs{3, 1}; + for (std::size_t column = 0; column < 3; ++column) { + if (column != 0) rhs(column-1, 0) = 0; + rhs(column, 0) = 1; + if (!factor.Value().Solve(rhs).HasValue()) return false; } + geometry.reference_factor = std::move(factor.Value()); return MakeLocalFrame(reference_xi, reference_eta, initial_director, geometry.local_frame); } @@ -293,47 +250,27 @@ Tensor DirectStrain(const Geometry& geometry) { } /// @brief Reconstructs a fixed-reference Cartesian strain from covariant data. -Tensor CartesianStrain(const Tensor& covariant, - const std::array& reciprocal) { +Tensor CartesianStrain(const Tensor& covariant, const Geometry& reference) { + Matrix rhs{3, 3}; + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t column = 0; column < 3; ++column) + rhs(row, column) = covariant[row][column]; + const auto right = reference.reference_factor->SolveRight(rhs); Tensor cartesian{}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - for (std::size_t first = 0U; first < 3U; ++first) { - for (std::size_t second = 0U; second < 3U; ++second) { - cartesian[row][column] += covariant[first][second] * - reciprocal[first][row] * - reciprocal[second][column]; - } - } + if (right.HasValue()) { + const auto left = reference.reference_factor->Solve(right.Value(), true); + if (left.HasValue()) { + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t column = 0; column < 3; ++column) + cartesian[row][column] = left.Value()(row, column); + return cartesian; } } + for (auto& row : cartesian) + row.fill(std::numeric_limits::quiet_NaN()); return cartesian; } -/// @brief Evaluates a tensor component in a fixed local reference frame. -double FrameComponent(const Vector3& left, const Tensor& tensor, - const Vector3& right) { - double value = 0.0; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - value += left[row] * tensor[row][column] * right[column]; - } - } - return value; -} - -/// @brief Converts fixed-reference Cartesian strain to engineering components. -EngineeringStrain LocalEngineering(const Tensor& tensor, - const Mitc4LocalFrame& frame) { - const Vector3 e1{frame.e1}; - const Vector3 e2{frame.e2}; - const Vector3 e3{frame.e3}; - return {FrameComponent(e1, tensor, e1), FrameComponent(e2, tensor, e2), - 2.0 * FrameComponent(e1, tensor, e2), - 2.0 * FrameComponent(e1, tensor, e3), - 2.0 * FrameComponent(e2, tensor, e3)}; -} - /// @brief Applies the approved homogeneous plane-stress plus shear law. EngineeringStress Stress(const EngineeringStrain& strain, const double youngs, const double poisson) { @@ -386,8 +323,8 @@ PointStatus EvaluatePoint(const std::array& coordinates, weights.eta_zeta[1U] * tying_samples[3U][1U][2U]; covariant[2U][1U] = covariant[1U][2U]; const Tensor cartesian = - CartesianStrain(covariant, point.geometry.reciprocal); - point.strain = LocalEngineering(cartesian, point.geometry.local_frame); + CartesianStrain(covariant, point.geometry); + point.strain = LocalEngineeringComponents(cartesian, point.geometry.local_frame); point.stress = Stress(point.strain, youngs, poisson); return IsFinite(covariant) && IsFinite(cartesian) && IsFinite(point.strain) && IsFinite(point.stress) @@ -890,27 +827,12 @@ JetMatrix3 Skew(const JetVector3& value) { /// @brief Multiplies two three-by-three Jet matrices. JetMatrix3 Multiply(const JetMatrix3& left, const JetMatrix3& right) { - JetMatrix3 result = ConstantZeroMatrix(); - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - for (std::size_t index = 0U; index < 3U; ++index) { - result[row][column] = - result[row][column] + left[row][index] * right[index][column]; - } - } - } - return result; + return math_internal::MultiplyJetMatrix(left, right, Constant); } /// @brief Multiplies a Jet matrix by a Jet vector. JetVector3 Multiply(const JetMatrix3& matrix, const JetVector3& vector) { - JetVector3 result{Constant(0.0), Constant(0.0), Constant(0.0)}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - result[row] = result[row] + matrix[row][column] * vector[column]; - } - } - return result; + return math_internal::MultiplyJetMatrixVector(matrix, vector, Constant); } /// @brief Transposes a three-by-three Jet matrix. @@ -957,38 +879,28 @@ JetMatrix3 Add(const JetMatrix3& left, const JetMatrix3& right) { return result; } -/// @brief Computes the analytic three-by-three inverse through its adjugate. -JetMatrix3 Inverse(const JetMatrix3& matrix) { - JetMatrix3 cofactor{}; - cofactor[0U][0U] = - matrix[1U][1U] * matrix[2U][2U] - matrix[1U][2U] * matrix[2U][1U]; - cofactor[0U][1U] = - matrix[1U][2U] * matrix[2U][0U] - matrix[1U][0U] * matrix[2U][2U]; - cofactor[0U][2U] = - matrix[1U][0U] * matrix[2U][1U] - matrix[1U][1U] * matrix[2U][0U]; - cofactor[1U][0U] = - matrix[0U][2U] * matrix[2U][1U] - matrix[0U][1U] * matrix[2U][2U]; - cofactor[1U][1U] = - matrix[0U][0U] * matrix[2U][2U] - matrix[0U][2U] * matrix[2U][0U]; - cofactor[1U][2U] = - matrix[0U][1U] * matrix[2U][0U] - matrix[0U][0U] * matrix[2U][1U]; - cofactor[2U][0U] = - matrix[0U][1U] * matrix[1U][2U] - matrix[0U][2U] * matrix[1U][1U]; - cofactor[2U][1U] = - matrix[0U][2U] * matrix[1U][0U] - matrix[0U][0U] * matrix[1U][2U]; - cofactor[2U][2U] = - matrix[0U][0U] * matrix[1U][1U] - matrix[0U][1U] * matrix[1U][0U]; - const Jet determinant = matrix[0U][0U] * cofactor[0U][0U] + - matrix[0U][1U] * cofactor[0U][1U] + - matrix[0U][2U] * cofactor[0U][2U]; - JetMatrix3 result{}; - const Jet inverse_determinant = Reciprocal(determinant); - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - result[row][column] = cofactor[column][row] * inverse_determinant; - } - } - return result; +/// @brief Reads shell variations without conflating directional third order. +double ReadChannel(const Jet& jet, std::size_t degree, std::size_t channel) { + if (degree == 0) return jet.value; + if (degree == 1) return channel < kGlobalDofCount ? jet.first[channel] + : jet.directional_first; + if (degree == 3) return jet.mixed_second[channel]; + if (channel < kHessianSize) return jet.second.ReadData()[channel]; + if (channel == kHessianSize) return jet.directional_second; + return jet.mixed_first[channel - kHessianSize - 1]; +} +void WriteChannel(Jet& jet, std::size_t degree, std::size_t channel, + double value) { + if (degree == 0) { jet.value = value; return; } + // A null Hessian is not constant provenance, including zero first seeds. + jet.constant_derivatives = false; + if (degree == 1) { + if (channel < kGlobalDofCount) jet.first[channel] = value; + else jet.directional_first = value; + } else if (degree == 3) jet.mixed_second[channel] = value; + else if (channel < kHessianSize) jet.second.OverwriteData()[channel] = value; + else if (channel == kHessianSize) jet.directional_second = value; + else jet.mixed_first[channel - kHessianSize - 1] = value; } /// @brief Evaluates Rodrigues' map with an analytic near-zero series branch. @@ -1119,19 +1031,32 @@ JetTensor DirectStrain(const std::array& increment, /// @brief Reconstructs a fixed-reference Cartesian Jet strain tensor. JetTensor CartesianStrain(const JetTensor& covariant, const Geometry& reference) { - JetTensor result{}; - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - for (std::size_t first = 0U; first < 3U; ++first) { - for (std::size_t second = 0U; second < 3U; ++second) { - result[row][column] = - result[row][column] + reference.reciprocal[first][row] * - reference.reciprocal[second][column] * - covariant[first][second]; - } - } + // E_cart = B^-T E_cov B^-1. First solve each row against B, then each + // column against B^T, carrying every independent Jet channel unchanged. + const std::array channels{ + 1, kGlobalDofCount+1, kHessianSize+1+kGlobalDofCount, kGlobalDofCount}; + JetTensor right{}, result{}; + for (std::size_t row = 0; row < 3; ++row) { + if (!math_internal::SolveConstantJetAction( + covariant[row], *reference.reference_factor, true, channels, + Constant, ReadChannel, WriteChannel, right[row])) { + for (auto& entry : result) + entry.fill(Constant(std::numeric_limits::quiet_NaN())); + return result; } } + for (std::size_t column = 0; column < 3; ++column) { + const JetVector3 rhs{right[0][column],right[1][column],right[2][column]}; + JetVector3 action{}; + if (!math_internal::SolveConstantJetAction( + rhs, *reference.reference_factor, true, channels, + Constant, ReadChannel, WriteChannel, action)) { + for (auto& entry : result) + entry.fill(Constant(std::numeric_limits::quiet_NaN())); + return result; + } + for (std::size_t row = 0; row < 3; ++row) result[row][column] = action[row]; + } return result; } @@ -1235,7 +1160,29 @@ Jet PhysicalEnergy(const std::array& coordinates, JetMatrix3 PolarRotation(const JetMatrix3& deformation) { JetMatrix3 result = deformation; for (std::size_t iteration = 0U; iteration < 12U; ++iteration) { - result = Scale(0.5, Add(result, Transpose(Inverse(result)))); + const JetMatrix3 coefficients = Transpose(result); + Matrix primal{3, 3}; + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t column = 0; column < 3; ++column) + primal(row, column) = coefficients[row][column].value; + const auto factor = dense_blas_internal::DenseFactor::Lu(primal); + JetMatrix3 candidate{}; + for (std::size_t column = 0; column < 3; ++column) { + JetVector3 rhs{Constant(0), Constant(0), Constant(0)}, action{}; + rhs[column] = Constant(1); + if (!factor.HasValue() || !math_internal::SolveJetAction( + coefficients, rhs, factor.Value(), + {1, kGlobalDofCount + 1, kHessianSize + 1 + kGlobalDofCount, + kGlobalDofCount}, Constant, ReadChannel, WriteChannel, action)) { + for (auto& row : candidate) + row.fill(Constant(std::numeric_limits::quiet_NaN())); + return candidate; + } + for (std::size_t row = 0; row < 3; ++row) + candidate[row][column] = 0.5 * (result[row][column] + action[row]); + } + // All actions used the previous snapshot; never a partial next iterate. + result = std::move(candidate); } return result; } @@ -1297,14 +1244,19 @@ Jet DrillingEnergy(const std::array& coordinates, const auto current = CovariantIncrement(initial_directors, trial, thickness, 0.0, 0.0, 0.0); JetMatrix3 deformation = Identity(); - for (std::size_t row = 0U; row < 3U; ++row) { - for (std::size_t column = 0U; column < 3U; ++column) { - for (std::size_t alpha = 0U; alpha < 3U; ++alpha) { - deformation[row][column] = - deformation[row][column] + - current[alpha][row] * reference.reciprocal[alpha][column]; - } + const std::array channels{ + 1, kGlobalDofCount+1, kHessianSize+1+kGlobalDofCount, kGlobalDofCount}; + for (std::size_t row = 0; row < 3; ++row) { + const JetVector3 rhs{current[0][row],current[1][row],current[2][row]}; + JetVector3 action{}; + if (!math_internal::SolveConstantJetAction( + rhs, *reference.reference_factor, true, channels, + Constant, ReadChannel, WriteChannel, action)) { + valid = false; + return {}; } + for (std::size_t column = 0; column < 3; ++column) + deformation[row][column] = deformation[row][column] + action[column]; } const JetMatrix3 element_rotation = PolarRotation(deformation); Jet energy{}; diff --git a/src/fesa/elements/shell_kernel_values.h b/src/fesa/elements/shell_kernel_values.h new file mode 100644 index 0000000..9c0b761 --- /dev/null +++ b/src/fesa/elements/shell_kernel_values.h @@ -0,0 +1,79 @@ +#ifndef FESA_ELEMENTS_SHELL_KERNEL_VALUES_H_ +#define FESA_ELEMENTS_SHELL_KERNEL_VALUES_H_ + +#include +#include +#include +#include + +#include "fesa/elements/mitc4_shell.h" +#include "fesa/math/matrix.h" +#include "fesa/math/vector3.h" +#include "fesa/model/model_types.h" + +namespace fesa::shell_kernel_internal { + +/// @brief Constructs the shared model-category shell-kernel failure envelope. +template +Result Failure(const std::string& code, const SourceLocation& location, + const std::string& identity, std::string message) { + return Result::Failure(Status::Failure( + FailureCategory::kModel, {{Severity::kError, code, location, "*ELEMENT", + identity, std::move(message)}})); +} + +/// @brief Preserves raw source labels and the existing null-skip diagnostic identity. +inline std::string ElementIdentity(const std::array& nodes) { + std::string identity; + for (const Node* node : nodes) { + if (node == nullptr) { + continue; + } + if (!identity.empty()) { + identity += "-"; + } + identity += node->source_id.source_label_text; + } + return identity; +} + +/// @brief Copies the initial semantic frame into its three ordered columns. +inline Matrix FrameMatrix(const ShellNodeInitialFrame& frame) { + Matrix result{3U, 3U}; + for (std::size_t row = 0U; row < 3U; ++row) { + result(row, 0U) = frame.tangent_a[row]; + result(row, 1U) = frame.tangent_b[row]; + result(row, 2U) = frame.director[row]; + } + return result; +} + +/// @brief Contracts one ordinary tensor component in the original row/column order. +inline double FrameComponent( + const Vector3& left, const std::array, 3>& tensor, + const Vector3& right) { + double value = 0.0; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + value += left[row] * tensor[row][column] * right[column]; + } + } + return value; +} + +/// @brief Projects fixed-reference tensor strain to the five engineering components. +inline std::array LocalEngineeringComponents( + const std::array, 3>& tensor, + const Mitc4LocalFrame& frame) { + const Vector3 e1{frame.e1}; + const Vector3 e2{frame.e2}; + const Vector3 e3{frame.e3}; + return {FrameComponent(e1, tensor, e1), FrameComponent(e2, tensor, e2), + 2.0 * FrameComponent(e1, tensor, e2), + 2.0 * FrameComponent(e1, tensor, e3), + 2.0 * FrameComponent(e2, tensor, e3)}; +} + +} // namespace fesa::shell_kernel_internal + +#endif // FESA_ELEMENTS_SHELL_KERNEL_VALUES_H_ diff --git a/src/fesa/elements/thermal_shell_geometry.cpp b/src/fesa/elements/thermal_shell_geometry.cpp index 8219714..ac21a9a 100644 --- a/src/fesa/elements/thermal_shell_geometry.cpp +++ b/src/fesa/elements/thermal_shell_geometry.cpp @@ -12,6 +12,7 @@ #include #include "fesa/model/model_types.h" +#include "math/dense_blas_internal.h" namespace fesa { namespace thermal_internal { @@ -136,10 +137,20 @@ Result BuildGeometry(const std::array& coordinates, const double uv = u.Dot(v); const double determinant = uu * vv - uv * uv; if (determinant > 0 && std::isfinite(determinant)) { - const double xi = (uv * v.Dot(w0) - vv * u.Dot(w0)) / determinant; - const double eta = (uv * u.Dot(w0) - uu * v.Dot(w0)) / determinant; - if (std::abs(xi) <= 1 && std::abs(eta) <= 1) { - candidates.push_back(w0 + xi * u + eta * v); + Matrix metric{2, 2}; + metric(0,0) = uu; metric(0,1) = uv; + metric(1,0) = uv; metric(1,1) = vv; + Matrix rhs{2, 1}; + rhs(0,0) = -u.Dot(w0); rhs(1,0) = -v.Dot(w0); + const auto factor = dense_blas_internal::DenseFactor::Lu(metric); + if (factor.HasValue()) { + const auto stationary = factor.Value().Solve(rhs); + if (stationary.HasValue()) { + const double xi = stationary.Value()(0,0); + const double eta = stationary.Value()(1,0); + if (std::abs(xi) <= 1 && std::abs(eta) <= 1) + candidates.push_back(w0 + xi * u + eta * v); + } } } // The center is also useful for affine or rank-one normal images. @@ -169,30 +180,39 @@ Result EvaluateSurface(const Geometry& geometry, double xi, const double jacobian = w.Norm(); const Interval determinant_interval = NormSquared(wi); const double determinant = w.Dot(w); - // |a1 x a2|^2 is the Gram determinant identity, avoiding subtraction of - // nearly equal g11*g22 and g12*g12. This is still the actual-point metric. - const Interval inverse11 = Dot(a2i, a2i) / determinant_interval; - const Interval inverse12 = - (Interval{0} - Dot(a1i, a2i)) / determinant_interval; - const Interval inverse22 = Dot(a1i, a1i) / determinant_interval; - if (!(determinant_interval.lower > 0) || !inverse11.IsFinite() || - !inverse12.IsFinite() || !inverse22.IsFinite() || !(jacobian > 0) || + // Retain the original scalar range/scale certificate. Each canonical + // metric action is consumed immediately by its finite gate, never retained + // as inverse coefficients or used to compute a physical gradient. + const auto finite_metric_action = [&](Interval numerator) { + const Interval action = numerator / determinant_interval; + return action.IsFinite() && + Scale(action, -2 * geometry.length_exponent).IsFinite(); + }; + if (!(determinant_interval.lower > 0) || + !finite_metric_action(Dot(a2i, a2i)) || + !finite_metric_action(Interval{0} - Dot(a1i, a2i)) || + !finite_metric_action(Dot(a1i, a1i)) || !(jacobian > 0) || !std::isfinite(determinant) || determinant <= 0 || - !Scale(inverse11, -2 * geometry.length_exponent).IsFinite() || - !Scale(inverse12, -2 * geometry.length_exponent).IsFinite() || - !Scale(inverse22, -2 * geometry.length_exponent).IsFinite() || !Scale(Dot(a1i, a1i), 2 * geometry.length_exponent).IsFinite() || !Scale(Dot(a2i, a2i), 2 * geometry.length_exponent).IsFinite()) { return Result::Failure(GeometryFailure( source, location, "uncertain-thermal-shell-metric", "Metric inverse enclosure is not finite or excludes no zero divisor.")); } - const Vector3 reciprocal1 = a2.Cross(w) / determinant; - const Vector3 reciprocal2 = w.Cross(a1) / determinant; - const auto reciprocal1i = - (Interval{1} / determinant_interval) * Cross(a2i, wi); - const auto reciprocal2i = - (Interval{1} / determinant_interval) * Cross(wi, a1i); + // Factor the physical tangent constraints rather than the rounded Gram + // matrix, which can lose rank while the certified patch is still regular. + Matrix constraints{3, 3}; + for (std::size_t j = 0; j < 3; ++j) { + constraints(0,j) = a1[j]; + constraints(1,j) = a2[j]; + constraints(2,j) = w[j] / jacobian; + } + const auto factor = dense_blas_internal::DenseFactor::Lu(constraints); + if (!factor.HasValue()) + return Result::Failure(GeometryFailure( + source, location, "uncertain-thermal-shell-metric", + "Surface gradient enclosure is not finite.")); + const Interval reciprocal_determinant = Interval{1} / determinant_interval; SurfacePoint point{}; point.jacobian = std::ldexp(jacobian, 2 * geometry.length_exponent); point.jacobian_interval = @@ -213,13 +233,26 @@ Result EvaluateSurface(const Geometry& geometry, double xi, (Interval{1} + Interval{kEta[i]} * eta_interval); const Interval dyi = Interval{.25 * kEta[i]} * (Interval{1} + Interval{kXi[i]} * xi_interval); - const Vector3 gradient = dx * reciprocal1 + dy * reciprocal2; - const auto gradient_interval = dxi * reciprocal1i + dyi * reciprocal2i; + Matrix rhs{3, 1}; + rhs(0,0) = dx; rhs(1,0) = dy; + const auto gradient = factor.Value().Solve(rhs); + if (!gradient.HasValue()) + return Result::Failure(GeometryFailure( + source, location, "uncertain-thermal-shell-metric", + "Surface gradient enclosure is not finite.")); + // The real solution obeys a1.g=dx, a2.g=dy, w.g=0. Its exterior-product + // identity encloses the solution directly. The original outward endpoint + // graph is retained component by component; no interval factor pivot or + // interval inverse/basis is introduced and no low-order term is discarded. + const auto first_numerator = Cross(a2i, wi); + const auto second_numerator = Cross(wi, a1i); std::array components{}; for (std::size_t j = 0; j < 3; ++j) { - components[j] = std::ldexp(gradient[j], -geometry.length_exponent); + components[j] = std::ldexp(gradient.Value()(j,0), -geometry.length_exponent); point.gradient_interval[i][j] = - Scale(gradient_interval[j], -geometry.length_exponent); + Scale(dxi * (reciprocal_determinant * first_numerator[j]) + + dyi * (reciprocal_determinant * second_numerator[j]), + -geometry.length_exponent); } point.gradient[i] = Vector3{components}; if (!point.gradient[i].IsFinite() || diff --git a/src/fesa/elements/thermal_shell_geometry.h b/src/fesa/elements/thermal_shell_geometry.h index a31b339..bf007c7 100644 --- a/src/fesa/elements/thermal_shell_geometry.h +++ b/src/fesa/elements/thermal_shell_geometry.h @@ -39,7 +39,7 @@ struct SurfacePoint { Result BuildGeometry(const std::array& coordinates, const SourceEntityId& source, const SourceLocation& location); -/// @brief Checks finite metric inverse and gradients at one used surface point. +/// @brief Solves actual tangential-gradient RHS and certifies their enclosures. Result EvaluateSurface(const Geometry& geometry, double xi, double eta, Interval xi_interval, Interval eta_interval, diff --git a/src/fesa/fem/dof_manager.cpp b/src/fesa/fem/dof_manager.cpp index 17ac70a..a945bef 100644 --- a/src/fesa/fem/dof_manager.cpp +++ b/src/fesa/fem/dof_manager.cpp @@ -11,6 +11,8 @@ #include #include +#include "fesa/analysis/analysis_model.h" +#include "fesa/elements/element.h" #include "fesa/model/source_target_resolver.h" namespace fesa { @@ -26,13 +28,6 @@ Status DofFailure(const std::string& code, const SourceLocation& location, {{Severity::kError, code, location, "DOF_MANAGER", identity, message}}); } -bool SameSourceIdentity(const SourceEntityId& left, - const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; -} - bool IsStrictlyIncreasing(const std::vector& values) { return std::adjacent_find( values.begin(), values.end(), @@ -220,7 +215,7 @@ Status DofManager::BuildThermal( candidate.element_scatters_.reserve(layouts.size()); for (std::size_t index = 0U; index < layouts.size(); ++index) { const auto& definition = domain.ThermalElements()[index]; - if (!SameSourceIdentity(layouts[index].source_id, definition.SourceId())) { + if (!SourceIdentityEquals(layouts[index].source_id, definition.SourceId())) { return DofFailure( "invalid-element-layout-order", {domain.SourcePath(), 0U}, std::to_string(index), "Thermal layout identity changed source order."); @@ -323,7 +318,7 @@ Status DofManager::BuildLayouts(const AnalysisModel& analysis_model, } } if (definition_index >= domain.Elements().Size() || - !SameSourceIdentity(layouts[source_order].source_id, + !SourceIdentityEquals(layouts[source_order].source_id, domain.Elements()[definition_index].SourceId())) { return DofFailure( "invalid-element-layout-order", {domain.SourcePath(), 0U}, diff --git a/src/fesa/io/abaqus/domain_mapping_context.cpp b/src/fesa/io/abaqus/domain_mapping_context.cpp index 4d5b046..941bf3f 100644 --- a/src/fesa/io/abaqus/domain_mapping_context.cpp +++ b/src/fesa/io/abaqus/domain_mapping_context.cpp @@ -7,25 +7,22 @@ #include #include #include -#include #include #include #include #include #include -#include #include #include -#include "fesa/analysis/thermal_time_grid.h" #include "fesa/core/ascii.h" -#include "fesa/math/vector3.h" -#include "fesa/model/shell_geometry.h" -#include "fesa/model/source_target_resolver.h" +#include "io/abaqus/mapping_diagnostics.h" +#include "io/abaqus/material_property_candidates.h" +#include "io/abaqus/step_definition_candidates.h" +#include "io/abaqus/surface_definition_candidates.h" +#include "io/abaqus/topology_candidates.h" namespace fesa::abaqus_internal { -namespace { - std::vector WithoutTrailingEmpty(std::vector fields) { while (!fields.empty() && fields.back().empty()) { fields.pop_back(); @@ -33,183 +30,214 @@ std::vector WithoutTrailingEmpty(std::vector fields) { return fields; } -std::string CanonicalizeAscii(std::string value) { - for (char& character : value) { - if (character >= 'a' && character <= 'z') { - character = static_cast(character - 'a' + 'A'); - } +void MappingDiagnostics::RecordFailure(const Status& status) { + if (!failure_) { + failure_ = + MappingFailure{status.Category().value_or(FailureCategory::kModel), + status.Diagnostics().front()}; } - return value; } -struct RawNode { - std::int64_t label; - std::string label_text; - std::array coordinates; - SourceLocation location; -}; +bool MappingDiagnostics::ParseInteger(const std::string& text, + std::int64_t& value, + const SourceLocation& location, + const std::string& keyword, + bool positive) { + if (text.empty()) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "A numeric field cannot be empty."); + } + char* end = nullptr; + errno = 0; + const long long parsed = std::strtoll(text.c_str(), &end, 10); + if (errno == ERANGE || end != text.c_str() + text.size() || + (positive && parsed <= 0)) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "The field must be a valid positive base-10 integer."); + } + value = static_cast(parsed); + return true; +} -struct RawElement { - enum class Type { kB33, kS4, kS4r, kDs4, kC3d8 }; +void MappingDiagnostics::RejectUnknown(const KeywordBlock& block, + bool shell_model) { + if (block.canonical_name == "DLOAD" && shell_model) { + InputFailure("unsupported-distributed-load", block.location, + block.canonical_name, "", + "Distributed, pressure, gravity, body, edge, and follower " + "loads are unsupported."); + return; + } + InputFailure("unsupported-keyword", block.location, block.canonical_name, "", + "The keyword is outside the approved Abaqus subset."); +} - std::int64_t label; - std::string label_text; - Type type; - std::vector node_labels; - SourceLocation location; -}; +Status MappingDiagnostics::CurrentStatus() const { + if (!failure_) { + return Status::Ok(); + } + return Status::Failure(failure_->category, {failure_->diagnostic}); +} -enum class ElementFamily { kBeam, kShell, kThermalShell, kSolid }; +const KeywordParameter* MappingDiagnostics::Parameter( + const KeywordBlock& block, std::string_view name) const { + const auto found = + std::find_if(block.parameters.begin(), block.parameters.end(), + [name](const KeywordParameter& candidate) { + return candidate.name == name; + }); + return found == block.parameters.end() ? nullptr : &*found; +} -struct RawSet { - std::string name; - std::vector members; - SourceLocation location; -}; +bool MappingDiagnostics::Fail(FailureCategory category, std::string code, + const SourceLocation& location, + std::string keyword, std::string entity_identity, + std::string message) { + if (!failure_) { + failure_ = MappingFailure{ + category, + {Severity::kError, std::move(code), location, std::move(keyword), + std::move(entity_identity), std::move(message)}}; + } + return false; +} -struct RawSection { - std::string element_set_name; - std::string material_name; - std::array properties; - std::array first_axis; - std::vector> section_points; - SourceLocation location; -}; +bool MappingDiagnostics::InputFailure(std::string code, + const SourceLocation& location, + std::string keyword, + std::string entity_identity, + std::string message) { + return Fail(FailureCategory::kInput, std::move(code), location, + std::move(keyword), std::move(entity_identity), + std::move(message)); +} -struct RawShellSection { - std::string element_set_name; - std::string material_name; - double thickness; - SourceLocation location; -}; +bool MappingDiagnostics::ModelFailure(std::string code, + const SourceLocation& location, + std::string keyword, + std::string entity_identity, + std::string message) { + return Fail(FailureCategory::kModel, std::move(code), location, + std::move(keyword), std::move(entity_identity), + std::move(message)); +} -struct RawSolidSection { - std::string element_set_name; - std::string material_name; - SourceLocation location; -}; +bool MappingDiagnostics::InvalidKeywordLocation(const KeywordBlock& block, + std::string message) { + return InputFailure("invalid-keyword-location", block.location, + block.canonical_name, "", std::move(message)); +} -struct RawPart { - std::string name; - SourceLocation location; - std::vector nodes; - std::vector elements; - std::vector node_sets; - std::vector element_sets; - std::vector sections; - std::vector shell_sections; - std::vector solid_sections; -}; +bool MappingDiagnostics::ValidateParameters( + const KeywordBlock& block, const std::vector& allowed, + std::string_view unsupported_code) { + std::set seen; + for (const auto& candidate : block.parameters) { + if (!seen.insert(candidate.name).second) { + return InputFailure("duplicate-entity", block.location, + block.canonical_name, candidate.name, + "A keyword parameter may be declared only once."); + } + if (std::find(allowed.begin(), allowed.end(), candidate.name) == + allowed.end()) { + return InputFailure(std::string{unsupported_code}, block.location, + block.canonical_name, candidate.name, + "The keyword parameter is outside the approved " + "subset."); + } + } + return true; +} -struct RawInstance { - std::string name; - std::string part_name; - SourceLocation location; -}; +const std::string* MappingDiagnostics::RequiredParameterValue( + const KeywordBlock& block, std::string_view name) { + const auto* found = Parameter(block, name); + if (found == nullptr || !found->value || found->value->empty()) { + InputFailure("invalid-keyword-parameter", block.location, + block.canonical_name, std::string{name}, + "The keyword requires a non-empty parameter value."); + return nullptr; + } + return &*found->value; +} -struct RawAssemblySet { - bool is_node_set; - std::string name; - std::string instance_name; - std::vector members; - SourceLocation location; -}; +bool MappingDiagnostics::RequireNoData(const KeywordBlock& block) { + if (!block.data.empty()) { + return InputFailure("invalid-data-arity", block.data.front().location, + block.canonical_name, "", + "This keyword does not accept data rows."); + } + return true; +} -struct RawSurfaceMember { - std::string target; - ShellSurfaceSide side; - SourceLocation location; - std::size_t ordinal; -}; +bool MappingDiagnostics::ParseDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword) { + if (text.empty()) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "A numeric field cannot be empty."); + } + char* end = nullptr; + errno = 0; + const double parsed = std::strtod(text.c_str(), &end); + if (errno == ERANGE || end != text.c_str() + text.size() || + !std::isfinite(parsed)) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "The field must be a finite floating-point value."); + } + value = parsed; + return true; +} -struct RawElementSurface { - std::string name; - SourceLocation location; - std::size_t declaration_ordinal; - std::vector members; -}; +bool MappingDiagnostics::ParseThermalDouble(const std::string& text, + double& value, + const SourceLocation& location, + const std::string& keyword) { + if (text.empty() || + (text.front() == '+' && + (text.size() == 1U || text[1U] == '+' || text[1U] == '-'))) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "A thermal scalar requires finite decimal syntax."); + } + const char* begin = text.data() + (text.front() == '+' ? 1U : 0U); + const char* end = text.data() + text.size(); + const auto parsed = + std::from_chars(begin, end, value, std::chars_format::general); + if (parsed.ec != std::errc{} || parsed.ptr != end || !std::isfinite(value)) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "A thermal scalar must be representable and finite."); + } + return true; +} -struct RawSurfacePressureLoad { - std::string surface_name; - double magnitude; - std::string magnitude_raw; - SourceLocation keyword_location; - SourceLocation data_location; - std::size_t data_ordinal; - std::size_t load_ordinal; -}; - -struct RawMaterial { - std::string name; - double youngs_modulus{0.0}; - double poisson_ratio{0.0}; - bool has_elastic{false}; - std::optional density; - std::optional conductivity; - std::optional specific_heat; - SourceLocation location; - SourceLocation elastic_location; - SourceLocation density_location; -}; - -struct RawThermalBoundary { - std::string target; - int dof; - double value; - SourceLocation location; -}; - -struct RawThermalInitial { - std::string target; - double value; - SourceLocation location; -}; - -struct RawThermalFlux { - std::string target; - int dof; - double power; - SourceLocation location; -}; - -struct RawStep { - SourceLocation location; - std::string name_raw; - std::string name_canonical; - bool has_static{false}; - bool static_direct{false}; - std::uint32_t static_increment_count{0U}; - std::optional dynamic; - bool perturbation_explicit{false}; - bool nlgeom_explicit{false}; - StaticProcedureKind procedure_kind{ - StaticProcedureKind::kLinearSmallDisplacement}; - bool nlgeom{false}; - std::uint32_t maximum_increments{0U}; - std::array static_values{}; - std::optional frequency; - bool has_heat_transfer{false}; - double thermal_increment{0.0}; - double thermal_period{0.0}; - std::vector thermal_boundaries; - std::vector thermal_fluxes; - std::vector boundaries; - std::vector loads; - std::vector surface_pressure_loads; - std::size_t next_load_ordinal{0U}; -}; - -struct MappingFailure { - FailureCategory category; - Diagnostic diagnostic; -}; - -} // namespace +bool MappingDiagnostics::ParseModelDouble(const std::string& text, + double& value, + const SourceLocation& location, + const std::string& keyword, + const std::string& diagnostic_code, + const std::string& message) { + if (text.empty()) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "A numeric field cannot be empty."); + } + char* end = nullptr; + errno = 0; + const double parsed = std::strtod(text.c_str(), &end); + if (end != text.c_str() + text.size()) { + return InputFailure("invalid-numeric-value", location, keyword, text, + "The field must use floating-point syntax."); + } + if (errno == ERANGE || !std::isfinite(parsed)) { + return ModelFailure(diagnostic_code, location, keyword, text, message); + } + value = parsed; + return true; +} /// @brief Builds one complete Domain candidate while retaining source identity. /// @note The candidate is committed only after all blocks and cross-references /// have been validated. -class DomainMappingContext::Impl { +class DomainMappingContext::Impl : private MappingDiagnostics { public: explicit Impl(const ParsedInput& input) : input_{input} {} @@ -224,52 +252,36 @@ class DomainMappingContext::Impl { } ValidateCardinality(); if (!failure_) { - FinalizeMaterials(); + material_properties_.FinalizeMaterials(definition_); } if (!failure_) { - FinalizePartsAndSections(); + material_properties_.FinalizePartsAndSections(topology_.Parts(), + definition_); } if (!failure_) { - FinalizeDensities(); + material_properties_.FinalizeDensities( + steps_.MaterialProcedure(surfaces_.FirstSurface(), + physical_constants_location_), + definition_); } return CurrentStatus(); } Status FinalizeTopology() { - if (failure_) { - return CurrentStatus(); - } - ExpandInstances(); - if (!failure_ && !definition_.shell_elements.empty()) { - auto geometry = - PreprocessShellGeometry(definition_.nodes, definition_.shell_elements, - definition_.shell_sections); - if (!geometry.HasValue()) { - const auto& status = geometry.GetStatus(); - failure_ = - MappingFailure{status.Category().value_or(FailureCategory::kModel), - status.Diagnostics().front()}; - } else { - definition_.shell_node_initial_frames = - std::move(geometry.Value().nodal_frames); - } - } - if (!failure_) { - ExpandAssemblySets(); - } + topology_.Finalize(material_properties_, definition_); return CurrentStatus(); } Status FinalizeElementSurfaces() { if (!failure_) { - ResolveElementSurfaces(); + surfaces_.ResolveElementSurfaces(); } return CurrentStatus(); } Status FinalizeStepCandidate() { if (!failure_) { - FinalizeStep(); + steps_.FinalizeStep(); } return CurrentStatus(); } @@ -285,22 +297,19 @@ class DomainMappingContext::Impl { DomainMappingCandidateSummary CandidateSummary() const noexcept { DomainMappingCandidateSummary summary{}; - summary.part_count = parts_.size(); - summary.instance_count = instances_.size(); - summary.material_count = materials_.size(); - summary.model_boundary_count = model_boundaries_.size(); - summary.step_boundary_count = step_.boundaries.size(); - summary.step_load_count = step_.loads.size(); - summary.has_static_step = step_.has_static; - for (const auto& part : parts_) { + summary.part_count = topology_.Parts().size(); + summary.instance_count = topology_.Instances().size(); + summary.material_count = material_properties_.Count(); + steps_.FillSummary(summary); + for (const auto& part : topology_.Parts()) { summary.node_count += part.nodes.size(); summary.element_count += part.elements.size(); summary.node_set_count += part.node_sets.size(); summary.element_set_count += part.element_sets.size(); - summary.beam_section_count += part.sections.size(); - summary.shell_section_count += part.shell_sections.size(); + summary.beam_section_count += part.properties.sections.size(); + summary.shell_section_count += part.properties.shell_sections.size(); } - for (const auto& set : assembly_sets_) { + for (const auto& set : topology_.AssemblySets()) { if (set.is_node_set) { ++summary.node_set_count; } else { @@ -311,282 +320,6 @@ class DomainMappingContext::Impl { } private: - Status CurrentStatus() const { - if (!failure_) { - return Status::Ok(); - } - return Status::Failure(failure_->category, {failure_->diagnostic}); - } - - const KeywordParameter* Parameter(const KeywordBlock& block, - std::string_view name) const { - const auto found = - std::find_if(block.parameters.begin(), block.parameters.end(), - [name](const KeywordParameter& candidate) { - return candidate.name == name; - }); - return found == block.parameters.end() ? nullptr : &*found; - } - - bool Fail(FailureCategory category, std::string code, - const SourceLocation& location, std::string keyword, - std::string entity_identity, std::string message) { - if (!failure_) { - failure_ = MappingFailure{ - category, - {Severity::kError, std::move(code), location, std::move(keyword), - std::move(entity_identity), std::move(message)}}; - } - return false; - } - - bool InputFailure(std::string code, const SourceLocation& location, - std::string keyword, std::string entity_identity, - std::string message) { - return Fail(FailureCategory::kInput, std::move(code), location, - std::move(keyword), std::move(entity_identity), - std::move(message)); - } - - bool ModelFailure(std::string code, const SourceLocation& location, - std::string keyword, std::string entity_identity, - std::string message) { - return Fail(FailureCategory::kModel, std::move(code), location, - std::move(keyword), std::move(entity_identity), - std::move(message)); - } - - bool InvalidKeywordLocation(const KeywordBlock& block, std::string message) { - return InputFailure("invalid-keyword-location", block.location, - block.canonical_name, "", std::move(message)); - } - - bool ValidateParameters( - const KeywordBlock& block, const std::vector& allowed, - std::string_view unsupported_code = "invalid-keyword-parameter") { - std::set seen; - for (const auto& candidate : block.parameters) { - if (!seen.insert(candidate.name).second) { - return InputFailure("duplicate-entity", block.location, - block.canonical_name, candidate.name, - "A keyword parameter may be declared only once."); - } - if (std::find(allowed.begin(), allowed.end(), candidate.name) == - allowed.end()) { - return InputFailure(std::string{unsupported_code}, block.location, - block.canonical_name, candidate.name, - "The keyword parameter is outside the approved " - "subset."); - } - } - return true; - } - - const std::string* RequiredParameterValue(const KeywordBlock& block, - std::string_view name) { - const auto* found = Parameter(block, name); - if (found == nullptr || !found->value || found->value->empty()) { - InputFailure("invalid-keyword-parameter", block.location, - block.canonical_name, std::string{name}, - "The keyword requires a non-empty parameter value."); - return nullptr; - } - return &*found->value; - } - - bool RequireNoData(const KeywordBlock& block) { - if (!block.data.empty()) { - return InputFailure("invalid-data-arity", block.data.front().location, - block.canonical_name, "", - "This keyword does not accept data rows."); - } - return true; - } - - bool ParseInteger(const std::string& text, std::int64_t& value, - const SourceLocation& location, const std::string& keyword, - bool positive) { - if (text.empty()) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "A numeric field cannot be empty."); - } - char* end = nullptr; - errno = 0; - const long long parsed = std::strtoll(text.c_str(), &end, 10); - if (errno == ERANGE || end != text.c_str() + text.size() || - (positive && parsed <= 0)) { - return InputFailure( - "invalid-numeric-value", location, keyword, text, - "The field must be a valid positive base-10 integer."); - } - value = static_cast(parsed); - return true; - } - - bool ParseDouble(const std::string& text, double& value, - const SourceLocation& location, const std::string& keyword) { - if (text.empty()) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "A numeric field cannot be empty."); - } - char* end = nullptr; - errno = 0; - const double parsed = std::strtod(text.c_str(), &end); - if (errno == ERANGE || end != text.c_str() + text.size() || - !std::isfinite(parsed)) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "The field must be a finite floating-point value."); - } - value = parsed; - return true; - } - - /// @brief Parses finite thermal decimal scalars without strtod underflow - /// flags. - /// @note from_chars preserves representable subnormals and rejects values - /// outside binary64 range; structural scalar parsing remains unchanged. - bool ParseThermalDouble(const std::string& text, double& value, - const SourceLocation& location, - const std::string& keyword) { - if (text.empty() || - (text.front() == '+' && - (text.size() == 1U || text[1U] == '+' || text[1U] == '-'))) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "A thermal scalar requires finite decimal syntax."); - } - const char* begin = text.data() + (text.front() == '+' ? 1U : 0U); - const char* end = text.data() + text.size(); - const auto parsed = - std::from_chars(begin, end, value, std::chars_format::general); - if (parsed.ec != std::errc{} || parsed.ptr != end || - !std::isfinite(value)) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "A thermal scalar must be representable and finite."); - } - return true; - } - - bool ParseSurfacePressureDouble(const std::string& text, double& value, - const SourceLocation& location, - const std::string& keyword) { - std::size_t cursor = 0U; - if (cursor < text.size() && (text[cursor] == '+' || text[cursor] == '-')) { - ++cursor; - } - const std::size_t integer_start = cursor; - while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { - ++cursor; - } - const bool has_integer_digits = cursor != integer_start; - bool has_fraction_digits = false; - if (cursor < text.size() && text[cursor] == '.') { - ++cursor; - const std::size_t fraction_start = cursor; - while (cursor < text.size() && text[cursor] >= '0' && - text[cursor] <= '9') { - ++cursor; - } - has_fraction_digits = cursor != fraction_start; - } - if (!has_integer_digits && !has_fraction_digits) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "Pressure values require C-locale decimal syntax."); - } - if (cursor < text.size() && (text[cursor] == 'E' || text[cursor] == 'e')) { - ++cursor; - if (cursor < text.size() && - (text[cursor] == '+' || text[cursor] == '-')) { - ++cursor; - } - const std::size_t exponent_start = cursor; - while (cursor < text.size() && text[cursor] >= '0' && - text[cursor] <= '9') { - ++cursor; - } - if (cursor == exponent_start) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "Pressure exponents require one or more digits."); - } - } - if (cursor != text.size()) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "Pressure values require C-locale decimal syntax."); - } - const char* const begin = text.data(); - const char* const end = begin + text.size(); - const char* const numeric_begin = *begin == '+' ? begin + 1U : begin; - const auto parsed = - std::from_chars(numeric_begin, end, value, std::chars_format::general); - if (parsed.ec != std::errc{} || parsed.ptr != end || - !std::isfinite(value)) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "Pressure values must be finite C-locale values."); - } - return true; - } - - bool ParseNonlinearStaticDouble(const std::string& text, double& value, - const SourceLocation& location, - const std::string& keyword) { - if (text.empty()) { - return InputFailure("invalid-nonlinear-static-data", location, keyword, - text, "A nonlinear STATIC field cannot be empty."); - } - char* end = nullptr; - errno = 0; - const double parsed = std::strtod(text.c_str(), &end); - if (errno == ERANGE || end != text.c_str() + text.size() || - !std::isfinite(parsed)) { - return InputFailure("invalid-nonlinear-static-data", location, keyword, - text, - "All four nonlinear STATIC fields must be finite."); - } - value = parsed; - return true; - } - - bool ParseDynamicDouble(const std::string& text, double& value, - const SourceLocation& location, - const std::string& keyword) { - if (text.empty()) { - return InputFailure("invalid-dynamic-data", location, keyword, text, - "Dynamic data fields cannot be empty."); - } - char* end = nullptr; - errno = 0; - const double parsed = std::strtod(text.c_str(), &end); - if (errno == ERANGE || end != text.c_str() + text.size() || - !std::isfinite(parsed)) { - return InputFailure("invalid-dynamic-data", location, keyword, text, - "Dynamic data fields must be finite."); - } - value = parsed; - return true; - } - - bool ParseModelDouble(const std::string& text, double& value, - const SourceLocation& location, - const std::string& keyword, - const std::string& diagnostic_code, - const std::string& message) { - if (text.empty()) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "A numeric field cannot be empty."); - } - char* end = nullptr; - errno = 0; - const double parsed = std::strtod(text.c_str(), &end); - if (end != text.c_str() + text.size()) { - return InputFailure("invalid-numeric-value", location, keyword, text, - "The field must use floating-point syntax."); - } - if (errno == ERANGE || !std::isfinite(parsed)) { - return ModelFailure(diagnostic_code, location, keyword, text, message); - } - value = parsed; - return true; - } - bool ContainsName(const std::vector& values, const std::string& name) const { return std::any_of(values.begin(), values.end(), @@ -603,14 +336,6 @@ class DomainMappingContext::Impl { }); } - bool ContainsName(const std::vector& values, - const std::string& name) const { - return std::any_of(values.begin(), values.end(), - [&name](const RawMaterial& value) { - return AsciiCaseInsensitiveEquals(value.name, name); - }); - } - bool ContainsSetName(const std::vector& sets, const std::string& name) const { const auto matches = [&name](const RawSet& set) { @@ -620,36 +345,14 @@ class DomainMappingContext::Impl { } bool ContainsAssemblySetName(bool node_set, const std::string& name) const { - return std::any_of(assembly_sets_.begin(), assembly_sets_.end(), + return std::any_of(topology_.AssemblySets().begin(), + topology_.AssemblySets().end(), [node_set, &name](const RawAssemblySet& set) { return set.is_node_set == node_set && AsciiCaseInsensitiveEquals(set.name, name); }); } - bool ContainsSurfaceName(const std::string& name) const { - return std::any_of(element_surfaces_.begin(), element_surfaces_.end(), - [&name](const RawElementSurface& surface) { - return AsciiCaseInsensitiveEquals(surface.name, name); - }); - } - - bool IsPressureNameToken(const std::string_view text) const noexcept { - if (text.empty() || text.size() > 80U) { - return false; - } - const auto is_initial = [](const char value) { - return (value >= 'A' && value <= 'Z') || (value >= 'a' && value <= 'z') || - value == '_'; - }; - const auto is_subsequent = [is_initial](const char value) { - return is_initial(value) || (value >= '0' && value <= '9') || - value == '-' || value == '_'; - }; - return is_initial(text.front()) && - std::all_of(text.begin() + 1, text.end(), is_subsequent); - } - void ParseBlocks() { definition_.source_path = input_.source_path; definition_.source_content_identity = input_.source_content_identity; @@ -663,15 +366,15 @@ class DomainMappingContext::Impl { ParsePartBlock(block); } else if (in_assembly_) { ParseAssemblyBlock(block); - } else if (in_step_) { - ParseStepBlock(block); + } else if (steps_.InStep()) { + steps_.ParseStepBlock(block); } else { ParseTopLevelBlock(block, index); } } if (!failure_ && - (current_part_ || in_assembly_ || in_instance_ || in_step_)) { + (current_part_ || in_assembly_ || in_instance_ || steps_.InStep())) { const auto location = input_.blocks.empty() ? SourceLocation{input_.source_path, 0U} : input_.blocks.back().location; @@ -681,9 +384,10 @@ class DomainMappingContext::Impl { } void ParseTopLevelBlock(const KeywordBlock& block, std::size_t index) { - if (step_seen_) { + if (steps_.HasStep()) { if (block.canonical_name == "STEP") { - ParseStepStart(block); + steps_.ParseStepStart(block, + assembly_seen_ && !material_properties_.Empty()); } else { InvalidKeywordLocation( block, "The sole analysis step must be the final top-level block."); @@ -695,10 +399,10 @@ class DomainMappingContext::Impl { block.canonical_name != "DENSITY" && block.canonical_name != "CONDUCTIVITY" && block.canonical_name != "SPECIFIC HEAT") { - material_eligible_.reset(); + material_properties_.EndMaterial(); } - pending_section_.reset(); - active_output_ = false; + material_properties_.EndSection(); + steps_.EndOutput(); if (block.canonical_name == "HEADING") { if (index != 0U || heading_seen_ || !ValidateParameters(block, {})) { @@ -728,7 +432,7 @@ class DomainMappingContext::Impl { if (!RequireNoData(block)) { return; } - AddIgnoredWarning(block); + steps_.AddIgnoredWarning(block); return; } if (block.canonical_name == "PHYSICAL CONSTANTS") { @@ -743,7 +447,7 @@ class DomainMappingContext::Impl { block.canonical_name)) { if (!physical_constants_location_) physical_constants_location_ = block.location; - AddIgnoredWarning(block); + steps_.AddIgnoredWarning(block); } return; } @@ -756,53 +460,56 @@ class DomainMappingContext::Impl { return; } if (block.canonical_name == "AMPLITUDE") { - ParseAmplitude(block); + steps_.ParseAmplitude(block); return; } if (block.canonical_name == "MATERIAL") { - ParseMaterial(block); + if (!assembly_seen_ || model_boundary_seen_) { + InvalidKeywordLocation(block, + "Material definitions follow the assembly and " + "precede model boundaries."); + return; + } + material_properties_.ParseMaterial(block); return; } if (block.canonical_name == "ELASTIC") { - ParseElastic(block); + material_properties_.ParseElastic(block); return; } if (block.canonical_name == "DENSITY") { - if (!material_eligible_) { - RejectUnknown(block); + if (!material_properties_.HasActiveMaterial()) { + RejectUnknown(block, model_element_family_ == ElementFamily::kShell); return; } - ParseDensity(block); + material_properties_.ParseDensity(block); return; } if (block.canonical_name == "CONDUCTIVITY") { - ParseThermalProperty(block, true); + material_properties_.ParseThermalProperty(block, true); return; } if (block.canonical_name == "SPECIFIC HEAT") { - ParseThermalProperty(block, false); + material_properties_.ParseThermalProperty(block, false); return; } if (block.canonical_name == "INITIAL CONDITIONS") { - ParseInitialConditions(block); + steps_.ParseInitialConditions(block); return; } if (block.canonical_name == "BOUNDARY") { - if (!assembly_seen_ || materials_.empty()) { + if (!assembly_seen_ || material_properties_.Empty()) { InvalidKeywordLocation( block, "Model boundary data follows the assembly and materials."); return; } model_boundary_seen_ = true; - if (model_element_family_ == ElementFamily::kThermalShell) { - ParseThermalBoundary(block, thermal_model_boundaries_); - } else { - ParseBoundary(block, model_boundaries_); - } + steps_.ParseModelBoundary(block); return; } if (block.canonical_name == "STEP") { - ParseStepStart(block); + steps_.ParseStepStart(block, + assembly_seen_ && !material_properties_.Empty()); return; } if (block.canonical_name == "END PART" || @@ -814,11 +521,12 @@ class DomainMappingContext::Impl { "The closing keyword has no matching open block."); return; } - RejectUnknown(block); + RejectUnknown(block, model_element_family_ == ElementFamily::kShell); } void ParsePartStart(const KeywordBlock& block) { - if (assembly_seen_ || !materials_.empty() || model_boundary_seen_) { + if (assembly_seen_ || !material_properties_.Empty() || + model_boundary_seen_) { InvalidKeywordLocation( block, "All part blocks must precede the sole assembly block."); return; @@ -830,14 +538,14 @@ class DomainMappingContext::Impl { if (name == nullptr) { return; } - if (ContainsName(parts_, *name)) { + if (ContainsName(topology_.Parts(), *name)) { InputFailure("duplicate-entity", block.location, block.canonical_name, *name, "Part names are unique under case-insensitive lookup."); return; } - parts_.push_back({*name, block.location, {}, {}, {}, {}, {}, {}}); - current_part_ = parts_.size() - 1U; + topology_.Parts().push_back({*name, block.location, {}, {}, {}, {}, {}}); + current_part_ = topology_.Parts().size() - 1U; part_elements_seen_ = false; part_sets_seen_ = false; part_sections_seen_ = false; @@ -849,20 +557,20 @@ class DomainMappingContext::Impl { if (!ValidateParameters(block, {}) || !RequireNoData(block)) { return; } - const RawPart& part = parts_[*current_part_]; + const RawPart& part = topology_.Parts()[*current_part_]; const bool shell_part = model_element_family_ == ElementFamily::kShell || model_element_family_ == ElementFamily::kThermalShell; if (part.nodes.empty() || part.elements.empty() || (!shell_part && model_element_family_ != ElementFamily::kSolid && - part.sections.empty())) { + part.properties.sections.empty())) { InvalidKeywordLocation(block, "A part closes only after node, element, " "and matching section blocks."); return; } current_part_.reset(); - pending_section_.reset(); + material_properties_.EndSection(); beam_section_context_active_ = false; return; } @@ -879,7 +587,7 @@ class DomainMappingContext::Impl { return; } - RawPart& part = parts_[*current_part_]; + RawPart& part = topology_.Parts()[*current_part_]; if (block.canonical_name == "NODE") { beam_section_context_active_ = false; if (part_elements_seen_ || part_sets_seen_ || part_sections_seen_) { @@ -888,7 +596,7 @@ class DomainMappingContext::Impl { "NODE blocks must precede element, set, and section blocks."); return; } - pending_section_.reset(); + material_properties_.EndSection(); ParseNodes(block, part); } else if (block.canonical_name == "ELEMENT") { beam_section_context_active_ = false; @@ -898,7 +606,7 @@ class DomainMappingContext::Impl { "and precede sets and sections."); return; } - pending_section_.reset(); + material_properties_.EndSection(); ParseElements(block, part); part_elements_seen_ = !failure_; } else if (block.canonical_name == "NSET") { @@ -909,7 +617,7 @@ class DomainMappingContext::Impl { "Part sets follow element blocks and precede beam sections."); return; } - pending_section_.reset(); + material_properties_.EndSection(); ParseSet(block, true, part); part_sets_seen_ = !failure_; } else if (block.canonical_name == "ELSET") { @@ -920,7 +628,7 @@ class DomainMappingContext::Impl { "Part sets follow element blocks and precede beam sections."); return; } - pending_section_.reset(); + material_properties_.EndSection(); ParseSet(block, false, part); part_sets_seen_ = !failure_; } else if (block.canonical_name == "BEAM GENERAL SECTION") { @@ -939,7 +647,7 @@ class DomainMappingContext::Impl { "Beam-section semantics cannot be mixed with shell elements."); return; } - ParseBeamSection(block, part); + material_properties_.ParseBeamSection(block, part.properties); part_sections_seen_ = !failure_; beam_section_context_active_ = !failure_; } else if (block.canonical_name == "SHELL SECTION") { @@ -957,7 +665,7 @@ class DomainMappingContext::Impl { "Shell-section semantics cannot be mixed with beam elements."); return; } - ParseShellSection(block, part); + material_properties_.ParseShellSection(block, part.properties); part_sections_seen_ = !failure_; } else if (block.canonical_name == "SOLID SECTION") { beam_section_context_active_ = false; @@ -968,12 +676,12 @@ class DomainMappingContext::Impl { "SOLID SECTION requires an exclusive C3D8 mesh."); return; } - ParseSolidSection(block, part); + material_properties_.ParseSolidSection(block, part.properties); part_sections_seen_ = !failure_; } else if (block.canonical_name == "SECTION POINTS") { - ParseSectionPoints(block, part); + material_properties_.ParseSectionPoints(block, part.properties); } else if (block.canonical_name == "TRANSVERSE SHEAR STIFFNESS") { - pending_section_.reset(); + material_properties_.EndSection(); if (!beam_section_context_active_) { InputFailure( "invalid-keyword-location", block.location, block.canonical_name, @@ -981,15 +689,15 @@ class DomainMappingContext::Impl { "The ignored shear keyword still requires beam-section context."); return; } - AddIgnoredWarning(block); + steps_.AddIgnoredWarning(block); } else if (block.canonical_name == "SURFACE") { InputFailure("unsupported-surface-scope", block.location, block.canonical_name, "", "Pressure surfaces are supported only at assembly scope."); } else { - pending_section_.reset(); + material_properties_.EndSection(); beam_section_context_active_ = false; - RejectUnknown(block); + RejectUnknown(block, model_element_family_ == ElementFamily::kShell); } } @@ -1172,168 +880,6 @@ class DomainMappingContext::Impl { if (inline_set) part.element_sets.push_back(std::move(*inline_set)); } - /// @brief Parses material-only Solid assignment without thickness defaults. - void ParseSolidSection(const KeywordBlock& block, RawPart& part) { - if (!ValidateParameters(block, {"ELSET", "MATERIAL"})) return; - const auto* elset = RequiredParameterValue(block, "ELSET"); - const auto* material = RequiredParameterValue(block, "MATERIAL"); - if (!elset || !material) return; - if (block.data.size() > 1U || - (!block.data.empty() && - std::any_of(block.data[0].fields.begin(), block.data[0].fields.end(), - [](const auto& field) { return !field.empty(); }))) { - InputFailure("invalid-solid-section", block.location, - block.canonical_name, *elset, - "SOLID SECTION permits omitted or blank data only."); - return; - } - part.solid_sections.push_back({*elset, *material, block.location}); - } - - /// @brief Validates and owns one model-level supported load amplitude. - void ParseAmplitude(const KeywordBlock& block) { - const bool dynamic_source = std::any_of( - input_.blocks.begin(), input_.blocks.end(), [](const auto& candidate) { - return candidate.canonical_name == "DYNAMIC"; - }); - if (model_element_family_ != ElementFamily::kSolid || !dynamic_source) { - InputFailure("unsupported-load-amplitude", block.location, - block.canonical_name, "", - "Amplitude is supported only in Solid dynamic models."); - return; - } - if (!ValidateParameters(block, {"NAME", "DEFINITION", "TIME", "VALUE"})) - return; - const auto* name = RequiredParameterValue(block, "NAME"); - if (!name) return; - for (const auto& option : - std::array, 3>{ - {{"DEFINITION", "TABULAR"}, - {"TIME", "STEP TIME"}, - {"VALUE", "RELATIVE"}}}) { - const auto* parameter = Parameter(block, option.first); - if (parameter && - (!parameter->value || - !AsciiCaseInsensitiveEquals(*parameter->value, option.second))) { - InputFailure("unsupported-amplitude-option", block.location, - block.canonical_name, option.first, - "Only TABULAR STEP TIME RELATIVE amplitude is supported."); - return; - } - } - const std::string canonical = CanonicalizeAscii(*name); - if (std::any_of(definition_.amplitudes.begin(), - definition_.amplitudes.end(), [&canonical](const auto& a) { - return a.name_canonical == canonical; - })) { - InputFailure("duplicate-amplitude", block.location, block.canonical_name, - *name, - "Amplitude names must be unique ignoring ASCII case."); - return; - } - TabularAmplitudeDefinition amplitude{*name, canonical, block.location, {}}; - for (const auto& row : block.data) { - if (row.fields.empty() || row.fields.size() % 2U != 0U) { - InputFailure("invalid-amplitude-data", row.location, - block.canonical_name, *name, - "Amplitude rows require complete time/value pairs."); - return; - } - for (std::size_t field = 0U; field < row.fields.size(); field += 2U) { - double time = 0.0; - double value = 0.0; - if (!ParseDouble(row.fields[field], time, row.location, - block.canonical_name) || - !ParseDouble(row.fields[field + 1U], value, row.location, - block.canonical_name)) - return; - if (time < 0.0 || (!amplitude.points.empty() && - !(time > amplitude.points.back()[0]))) { - InputFailure( - "invalid-amplitude-data", row.location, block.canonical_name, - *name, - "Amplitude times must be nonnegative and strictly increasing."); - return; - } - amplitude.points.push_back({time, value}); - } - } - if (amplitude.points.empty()) { - InputFailure("invalid-amplitude-data", block.location, - block.canonical_name, *name, - "Amplitude requires at least one finite time/value pair."); - return; - } - definition_.amplitudes.push_back(std::move(amplitude)); - } - - void ParseShellSection(const KeywordBlock& block, RawPart& part) { - for (const auto& candidate : block.parameters) { - if (candidate.name != "ELSET" && candidate.name != "MATERIAL") { - InputFailure("unsupported-shell-section-option", block.location, - block.canonical_name, candidate.name, - "The shell-section option is outside the centered " - "single-layer subset."); - return; - } - } - if (!ValidateParameters(block, {"ELSET", "MATERIAL"})) { - return; - } - const auto* element_set = RequiredParameterValue(block, "ELSET"); - const auto* material = RequiredParameterValue(block, "MATERIAL"); - if (element_set == nullptr || material == nullptr) { - return; - } - if (block.data.size() != 1U || block.data[0].fields.empty() || - block.data[0].fields.size() > 2U) { - InputFailure("unsupported-shell-section-option", block.location, - block.canonical_name, *element_set, - "SHELL SECTION requires one thickness row with one optional " - "integration-point field."); - return; - } - double thickness = 0.0; - const bool parsed_thickness = - model_element_family_ == ElementFamily::kThermalShell - ? ParseThermalDouble(block.data[0].fields[0], thickness, - block.data[0].location, block.canonical_name) - : ParseModelDouble(block.data[0].fields[0], thickness, - block.data[0].location, block.canonical_name, - "invalid-shell-thickness", - "Shell thickness must be finite and positive."); - if (!parsed_thickness) { - return; - } - if (!(thickness > 0.0)) { - ModelFailure("invalid-shell-thickness", block.data[0].location, - block.canonical_name, *element_set, - "Shell thickness must be finite and positive."); - return; - } - if (block.data[0].fields.size() == 2U) { - const auto integration_points = - ParsePositiveSourceLabel(block.data[0].fields[1]); - if (!integration_points.HasValue()) { - InputFailure("unsupported-shell-section-option", block.data[0].location, - block.canonical_name, block.data[0].fields[1], - "The optional shell integration-point field must be a " - "positive integer."); - return; - } - if (model_element_family_ == ElementFamily::kThermalShell && - integration_points.Value() != 5) { - InputFailure( - "unsupported-shell-section-option", block.data[0].location, - block.canonical_name, block.data[0].fields[1], - "Thermal DS4 sections require exactly five integration points."); - return; - } - } - part.shell_sections.push_back( - {*element_set, *material, thickness, block.location}); - } - bool ParseSetMembers(const KeywordBlock& block, bool generate, std::vector& members) { if (block.data.empty()) { @@ -1447,100 +993,6 @@ class DomainMappingContext::Impl { } } - void ParseBeamSection(const KeywordBlock& block, RawPart& part) { - pending_section_.reset(); - if (!ValidateParameters(block, {"ELSET", "MATERIAL", "SECTION"})) { - return; - } - const auto* element_set = RequiredParameterValue(block, "ELSET"); - const auto* material = RequiredParameterValue(block, "MATERIAL"); - const auto* section = RequiredParameterValue(block, "SECTION"); - if (element_set == nullptr || material == nullptr || section == nullptr) { - return; - } - if (!AsciiCaseInsensitiveEquals(*section, "GENERAL")) { - InputFailure("unsupported-section-formulation", block.location, - block.canonical_name, *section, - "Only SECTION=GENERAL belongs to the approved subset."); - return; - } - if (std::any_of(part.sections.begin(), part.sections.end(), - [element_set](const RawSection& existing) { - return AsciiCaseInsensitiveEquals( - existing.element_set_name, *element_set); - })) { - InputFailure("duplicate-entity", block.location, block.canonical_name, - *element_set, - "An element set can receive only one beam section."); - return; - } - if (block.data.size() != 2U || block.data[0].fields.size() != 5U || - block.data[1].fields.size() != 3U) { - InputFailure("invalid-data-arity", block.location, block.canonical_name, - *element_set, - "A general section requires one five-field property row and " - "one three-field axis row."); - return; - } - RawSection raw{*element_set, *material, {}, {}, {}, block.location}; - for (std::size_t property = 0U; property < 5U; ++property) { - if (!ParseModelDouble(block.data[0].fields[property], - raw.properties[property], block.data[0].location, - block.canonical_name, "invalid-beam-property", - "Beam section properties must be finite.")) { - return; - } - } - for (std::size_t coordinate = 0U; coordinate < 3U; ++coordinate) { - if (!ParseModelDouble(block.data[1].fields[coordinate], - raw.first_axis[coordinate], block.data[1].location, - block.canonical_name, "invalid-beam-guide-vector", - "The beam guide vector must be finite.")) { - return; - } - } - part.sections.push_back(std::move(raw)); - pending_section_ = part.sections.size() - 1U; - } - - void ParseSectionPoints(const KeywordBlock& block, RawPart& part) { - if (!pending_section_ || !ValidateParameters(block, {}) || - block.data.empty()) { - if (!failure_) { - InputFailure( - "invalid-keyword-location", block.location, block.canonical_name, - "", "SECTION POINTS must immediately follow a general section."); - } - return; - } - RawSection& section = part.sections[*pending_section_]; - for (const auto& row : block.data) { - if (row.fields.size() != 2U) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - section.element_set_name, - "Section-point rows require x1 and x2."); - return; - } - std::array point{}; - if (!ParseDouble(row.fields[0], point[0], row.location, - block.canonical_name) || - !ParseDouble(row.fields[1], point[1], row.location, - block.canonical_name)) { - return; - } - if (std::find(section.section_points.begin(), - section.section_points.end(), - point) != section.section_points.end()) { - InputFailure("duplicate-entity", row.location, block.canonical_name, - section.element_set_name, - "Section points must be unique within a section."); - return; - } - section.section_points.push_back(point); - } - pending_section_.reset(); - } - void ParseAssemblyStart(const KeywordBlock& block) { if (assembly_seen_) { InputFailure("unsupported-nested-assembly", block.location, @@ -1548,7 +1000,8 @@ class DomainMappingContext::Impl { "V0 accepts exactly one non-nested assembly."); return; } - if (parts_.empty() || !materials_.empty() || model_boundary_seen_) { + if (topology_.Parts().empty() || !material_properties_.Empty() || + model_boundary_seen_) { InvalidKeywordLocation( block, "The sole assembly follows all part blocks and precedes model data."); @@ -1570,7 +1023,7 @@ class DomainMappingContext::Impl { if (!ValidateParameters(block, {}) || !RequireNoData(block)) { return; } - if (instances_.empty()) { + if (topology_.Instances().empty()) { InvalidKeywordLocation( block, "The assembly requires at least one identity instance."); return; @@ -1590,7 +1043,7 @@ class DomainMappingContext::Impl { } ParseInstanceStart(block); } else if (block.canonical_name == "NSET") { - if (instances_.empty()) { + if (topology_.Instances().empty()) { InvalidKeywordLocation( block, "Assembly sets follow at least one identity instance."); return; @@ -1598,7 +1051,7 @@ class DomainMappingContext::Impl { assembly_set_seen_ = true; ParseAssemblySet(block, true); } else if (block.canonical_name == "ELSET") { - if (instances_.empty()) { + if (topology_.Instances().empty()) { InvalidKeywordLocation( block, "Assembly sets follow at least one identity instance."); return; @@ -1606,14 +1059,16 @@ class DomainMappingContext::Impl { assembly_set_seen_ = true; ParseAssemblySet(block, false); } else if (block.canonical_name == "SURFACE") { - if (instances_.empty()) { + if (topology_.Instances().empty()) { InvalidKeywordLocation( block, "Assembly surfaces follow at least one identity instance."); return; } - ParseElementSurface(block); + surfaces_.ParseElementSurface(block); + if (!failure_ && model_element_family_ == ElementFamily::kThermalShell) + steps_.AddIgnoredWarning(block); } else { - RejectUnknown(block); + RejectUnknown(block, model_element_family_ == ElementFamily::kShell); } } @@ -1640,12 +1095,12 @@ class DomainMappingContext::Impl { "Instance translation or rotation data is unsupported."); return; } - if (ContainsName(instances_, *name)) { + if (ContainsName(topology_.Instances(), *name)) { InputFailure("duplicate-entity", block.location, block.canonical_name, *name, "Instance names are globally unique."); return; } - instances_.push_back({*name, *part, block.location}); + topology_.Instances().push_back({*name, *part, block.location}); in_instance_ = true; } @@ -1665,12 +1120,12 @@ class DomainMappingContext::Impl { } if (block.canonical_name == "SURFACE") { InputFailure("unsupported-surface-scope", block.location, - block.canonical_name, instances_.back().name, + block.canonical_name, topology_.Instances().back().name, "Pressure surfaces are unsupported inside an instance."); return; } InputFailure("unsupported-instance-mesh-semantics", block.location, - block.canonical_name, instances_.back().name, + block.canonical_name, topology_.Instances().back().name, "Instance-local mesh definitions are unsupported."); } @@ -1744,1519 +1199,13 @@ class DomainMappingContext::Impl { if (!ParseSetMembers(block, generate_parameter != nullptr, set.members)) { return; } - assembly_sets_.push_back(std::move(set)); - } - - void ParseElementSurface(const KeywordBlock& block) { - if (!ValidateParameters(block, {"TYPE", "NAME"}, "unsupported-parameter")) { - return; - } - const auto* type = RequiredParameterValue(block, "TYPE"); - const auto* name = RequiredParameterValue(block, "NAME"); - if (type == nullptr || name == nullptr) { - return; - } - if (!IsPressureNameToken(*name)) { - InputFailure("invalid-surface-name", block.location, block.canonical_name, - *name, - "Surface names must use the approved ASCII name syntax."); - return; - } - if (!AsciiCaseInsensitiveEquals(*type, "ELEMENT")) { - InputFailure("unsupported-surface-type", block.location, - block.canonical_name, *type, - "Only TYPE=ELEMENT belongs to the approved surface subset."); - return; - } - if (ContainsSurfaceName(*name)) { - InputFailure("duplicate-entity", block.location, block.canonical_name, - *name, - "Surface names are unique in the assembly namespace."); - return; - } - if (block.data.empty()) { - InputFailure("empty-surface", block.location, block.canonical_name, *name, - "An element surface requires at least one member."); - return; - } - - RawElementSurface surface{ - *name, block.location, element_surfaces_.size(), {}}; - for (std::size_t ordinal = 0U; ordinal < block.data.size(); ++ordinal) { - const auto& row = block.data[ordinal]; - if (row.fields.size() != 2U || row.fields[0].empty() || - row.fields[1].empty()) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - *name, - "Surface rows require one member and SPOS or SNEG."); - return; - } - ShellSurfaceSide side = ShellSurfaceSide::kSpos; - if (AsciiCaseInsensitiveEquals(row.fields[1], "SPOS")) { - side = ShellSurfaceSide::kSpos; - } else if (AsciiCaseInsensitiveEquals(row.fields[1], "SNEG")) { - side = ShellSurfaceSide::kSneg; - } else { - InputFailure("unsupported-surface-side", row.location, - block.canonical_name, row.fields[1], - "Surface sides must be SPOS or SNEG."); - return; - } - surface.members.push_back({row.fields[0], side, row.location, ordinal}); - } - element_surfaces_.push_back(std::move(surface)); - if (model_element_family_ == ElementFamily::kThermalShell) - AddIgnoredWarning(block); - } - - void ParseMaterial(const KeywordBlock& block) { - if (!assembly_seen_ || model_boundary_seen_) { - InvalidKeywordLocation(block, - "Material definitions follow the assembly and " - "precede model boundaries."); - return; - } - if (!ValidateParameters(block, {"NAME"}) || !RequireNoData(block)) { - return; - } - const auto* name = RequiredParameterValue(block, "NAME"); - if (name == nullptr) { - return; - } - if (ContainsName(materials_, *name)) { - InputFailure("duplicate-entity", block.location, block.canonical_name, - *name, "Material names are globally unique."); - return; - } - materials_.push_back({*name, - 0.0, - 0.0, - false, - std::nullopt, - std::nullopt, - std::nullopt, - block.location, - {}, - {}}); - material_eligible_ = materials_.size() - 1U; - } - - void ParseElastic(const KeywordBlock& block) { - if (model_element_family_ == ElementFamily::kThermalShell) { - InputFailure("unsupported-keyword", block.location, block.canonical_name, - "", "ELASTIC is outside the thermal material subset."); - return; - } - if (!material_eligible_) { - InputFailure("invalid-keyword-location", block.location, - block.canonical_name, "", - "ELASTIC must immediately follow MATERIAL."); - return; - } - if (!ValidateParameters(block, {}) || block.data.size() != 1U || - block.data[0].fields.size() != 2U) { - if (!failure_) { - InputFailure("invalid-data-arity", block.location, block.canonical_name, - materials_[*material_eligible_].name, - "ELASTIC requires exactly one E, nu row."); - } - return; - } - RawMaterial& material = materials_[*material_eligible_]; - if (material.has_elastic) { - InputFailure("duplicate-entity", block.location, block.canonical_name, - material.name, "A material accepts one ELASTIC definition."); - return; - } - if (!ParseModelDouble(block.data[0].fields[0], material.youngs_modulus, - block.data[0].location, block.canonical_name, - model_element_family_ == ElementFamily::kSolid - ? "invalid-solid-material" - : model_element_family_ == ElementFamily::kShell - ? "invalid-shell-material" - : "invalid-beam-property", - "Elastic material values must be finite.") || - !ParseModelDouble(block.data[0].fields[1], material.poisson_ratio, - block.data[0].location, block.canonical_name, - model_element_family_ == ElementFamily::kSolid - ? "invalid-solid-material" - : model_element_family_ == ElementFamily::kShell - ? "invalid-shell-material" - : "invalid-beam-property", - "Elastic material values must be finite.")) { - return; - } - material.has_elastic = true; - material.elastic_location = block.data[0].location; - } - - bool ParseDensityValue(const std::string& text, double& value, - const SourceLocation& location) { - const std::string canonical = CanonicalizeAscii(text); - if (canonical == "NAN" || canonical == "+NAN" || canonical == "-NAN" || - canonical == "INF" || canonical == "+INF" || canonical == "-INF" || - canonical == "INFINITY" || canonical == "+INFINITY" || - canonical == "-INFINITY") { - return ModelFailure( - "invalid-material-density", location, "DENSITY", text, - "Density must convert to a finite value greater than zero."); - } - std::size_t cursor = 0U; - if (cursor < text.size() && (text[cursor] == '+' || text[cursor] == '-')) { - ++cursor; - } - const std::size_t integer_start = cursor; - while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { - ++cursor; - } - const bool has_integer_digits = cursor != integer_start; - bool has_fraction_digits = false; - if (cursor < text.size() && text[cursor] == '.') { - ++cursor; - const std::size_t fraction_start = cursor; - while (cursor < text.size() && text[cursor] >= '0' && - text[cursor] <= '9') { - ++cursor; - } - has_fraction_digits = cursor != fraction_start; - } - if (!has_integer_digits && !has_fraction_digits) { - return InputFailure("invalid-density-data", location, "DENSITY", text, - "Density requires C-locale decimal syntax."); - } - if (cursor < text.size() && (text[cursor] == 'E' || text[cursor] == 'e')) { - ++cursor; - if (cursor < text.size() && - (text[cursor] == '+' || text[cursor] == '-')) { - ++cursor; - } - const std::size_t exponent_start = cursor; - while (cursor < text.size() && text[cursor] >= '0' && - text[cursor] <= '9') { - ++cursor; - } - if (cursor == exponent_start) { - return InputFailure("invalid-density-data", location, "DENSITY", text, - "Density exponents require one or more digits."); - } - } - if (cursor != text.size()) { - return InputFailure("invalid-density-data", location, "DENSITY", text, - "Density requires C-locale decimal syntax."); - } - const char* begin = text.data(); - if (*begin == '+') { - ++begin; - } - double parsed = 0.0; - const auto conversion = std::from_chars(begin, text.data() + text.size(), - parsed, std::chars_format::general); - if (conversion.ec != std::errc{} || - conversion.ptr != text.data() + text.size() || !std::isfinite(parsed) || - !(parsed > 0.0)) { - return ModelFailure( - "invalid-material-density", location, "DENSITY", text, - "Density must convert to a finite value greater than zero."); - } - value = parsed; - return true; - } - - void ParseDensity(const KeywordBlock& block) { - if (!material_eligible_) { - InputFailure("invalid-density-data", block.location, block.canonical_name, - "", "DENSITY must be declared inside one MATERIAL."); - return; - } - if (!ValidateParameters(block, {}, "unsupported-density-option")) { - return; - } - RawMaterial& material = materials_[*material_eligible_]; - if (material.density) { - InputFailure("duplicate-density", block.location, block.canonical_name, - material.name, "A material accepts one DENSITY definition."); - return; - } - if (block.data.size() != 1U || - (block.data[0].fields.size() != 1U && - (block.data[0].fields.size() != 2U || - !block.data[0].fields[1].empty())) || - block.data[0].fields[0].empty()) { - InputFailure("invalid-density-data", block.location, block.canonical_name, - material.name, "DENSITY requires exactly rho or rho,."); - return; - } - double rho = 0.0; - if (!ParseDensityValue(block.data[0].fields[0], rho, - block.data[0].location)) { - return; - } - material.density = rho; - material.density_location = block.data[0].location; - } - - void ParseThermalProperty(const KeywordBlock& block, bool conductivity) { - if (model_element_family_ != ElementFamily::kThermalShell || - !material_eligible_ || !ValidateParameters(block, {})) { - if (!failure_) { - InputFailure("invalid-keyword-location", block.location, - block.canonical_name, "", - "Thermal properties belong to a DS4 material."); - } - return; - } - RawMaterial& material = materials_[*material_eligible_]; - std::optional& destination = - conductivity ? material.conductivity : material.specific_heat; - if (destination || block.data.size() != 1U || - (block.data[0].fields.size() != 1U && - (block.data[0].fields.size() != 2U || - !block.data[0].fields[1].empty()))) { - InputFailure("invalid-data-arity", block.location, block.canonical_name, - material.name, - "Thermal property requires one constant row."); - return; - } - double value = 0.0; - if (!ParseThermalDouble(block.data[0].fields[0], value, - block.data[0].location, block.canonical_name) || - !(value > 0.0)) { - if (!failure_) { - ModelFailure("invalid-thermal-material", block.data[0].location, - block.canonical_name, material.name, - "Thermal material values must be finite and positive."); - } - return; - } - destination = value; - } - - void ParseInitialConditions(const KeywordBlock& block) { - if (model_element_family_ != ElementFamily::kThermalShell || - !ValidateParameters(block, {"TYPE"}) || block.data.empty()) { - if (!failure_) { - InputFailure("invalid-data-arity", block.location, block.canonical_name, - "", "Thermal initial conditions require data rows."); - } - return; - } - const auto* type = RequiredParameterValue(block, "TYPE"); - if (type == nullptr || !AsciiCaseInsensitiveEquals(*type, "TEMPERATURE")) { - if (!failure_) - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "TYPE", - "Only TYPE=TEMPERATURE is supported."); - return; - } - for (const auto& row : block.data) { - if (row.fields.size() != 2U || row.fields[0].empty()) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - "", "Initial temperatures require target, value."); - return; - } - double value = 0.0; - if (!ParseThermalDouble(row.fields[1], value, row.location, - block.canonical_name)) - return; - thermal_initial_conditions_.push_back( - {row.fields[0], value, row.location}); - } - } - - void ParseThermalBoundary(const KeywordBlock& block, - std::vector& destination) { - if (!ValidateParameters(block, {}) || block.data.empty()) { - if (!failure_) - InputFailure("invalid-data-arity", block.location, block.canonical_name, - "", "Thermal BOUNDARY requires data rows."); - return; - } - for (const auto& row : block.data) { - if ((row.fields.size() != 3U && row.fields.size() != 4U) || - row.fields[0].empty()) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - "", "Thermal boundaries require target, DOF, DOF, value."); - return; - } - std::int64_t first = 0; - std::int64_t last = 0; - if (!ParseInteger(row.fields[1], first, row.location, - block.canonical_name, true) || - !ParseInteger(row.fields[2], last, row.location, block.canonical_name, - true) || - first != last || (first != 11 && first != 15)) { - InputFailure("invalid-dof", row.location, block.canonical_name, - row.fields[0], "Thermal boundaries support DOF 11 or 15."); - return; - } - double value = 0.0; - if (row.fields.size() == 4U && - !ParseThermalDouble(row.fields[3], value, row.location, - block.canonical_name)) - return; - destination.push_back( - {row.fields[0], static_cast(first), value, row.location}); - } - } - - void ParseBoundary( - const KeywordBlock& block, - std::vector& destination) { - const bool dynamic_input = std::any_of( - input_.blocks.begin(), input_.blocks.end(), [](const auto& candidate) { - return candidate.canonical_name == "DYNAMIC"; - }); - if (!ValidateParameters(block, {}, - dynamic_input ? "unsupported-dynamic-boundary" - : "invalid-keyword-parameter") || - block.data.empty()) { - if (!failure_) { - InputFailure("invalid-data-arity", block.location, block.canonical_name, - "", "BOUNDARY requires one or more data rows."); - } - return; - } - for (const auto& row : block.data) { - if (row.fields.size() != 3U && row.fields.size() != 4U) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - "", - "BOUNDARY rows require target, first DOF, last DOF, and " - "optional value."); - return; - } - if (row.fields[0].empty()) { - InputFailure("unresolved-reference", row.location, block.canonical_name, - "", "A boundary target cannot be empty."); - return; - } - std::int64_t first = 0; - std::int64_t last = 0; - if (!ParseInteger(row.fields[1], first, row.location, - block.canonical_name, true) || - !ParseInteger(row.fields[2], last, row.location, block.canonical_name, - true)) { - return; - } - if (first < 1 || first > 6 || last < first || last > 6) { - InputFailure("invalid-dof", row.location, block.canonical_name, - row.fields[0], - "Boundary DOFs must be an ordered range in 1..6."); - return; - } - double value = 0.0; - if (row.fields.size() == 4U && - !(model_element_family_ == ElementFamily::kSolid && - row.fields[3].empty()) && - !ParseDouble(row.fields[3], value, row.location, - block.canonical_name)) { - return; - } - destination.push_back({row.fields[0], static_cast(first), - static_cast(last), value, row.location}); - } - } - - void ParseCload(const KeywordBlock& block, std::vector& loads) { - if (step_.dynamic && model_element_family_ != ElementFamily::kSolid && - !block.parameters.empty()) { - InputFailure("unsupported-dynamic-load", block.location, - block.canonical_name, "", - "Dynamic CLOAD does not support keyword parameters."); - return; - } - const bool solid_dynamic = - step_.dynamic && model_element_family_ == ElementFamily::kSolid; - if (!ValidateParameters( - block, solid_dynamic ? std::vector{"AMPLITUDE"} - : std::vector{}) || - block.data.empty()) { - if (!failure_) { - InputFailure("invalid-data-arity", block.location, block.canonical_name, - "", "CLOAD requires one or more rows."); - } - return; - } - std::optional amplitude_index; - std::string amplitude_name; - if (Parameter(block, "AMPLITUDE")) { - const auto* name = RequiredParameterValue(block, "AMPLITUDE"); - if (!name) return; - amplitude_name = *name; - for (std::size_t index = 0U; index < definition_.amplitudes.size(); - ++index) { - if (AsciiCaseInsensitiveEquals(definition_.amplitudes[index].name_raw, - *name)) { - amplitude_index = static_cast(index); - break; - } - } - if (!amplitude_index) { - InputFailure("unresolved-amplitude", block.location, - block.canonical_name, *name, - "CLOAD amplitude must resolve to a model-level curve."); - return; - } - } - for (const auto& row : block.data) { - if (row.fields.size() != 3U || row.fields[0].empty()) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - "", "CLOAD rows require target, DOF, magnitude."); - return; - } - std::int64_t dof = 0; - double magnitude = 0.0; - if (!ParseInteger(row.fields[1], dof, row.location, block.canonical_name, - true) || - !ParseDouble(row.fields[2], magnitude, row.location, - block.canonical_name)) { - return; - } - if (dof < 1 || dof > 6) { - InputFailure("invalid-dof", row.location, block.canonical_name, - row.fields[0], "CLOAD DOF must be in 1..6."); - return; - } - if ((step_.dynamic || model_element_family_ == ElementFamily::kSolid) && - dof > 3) { - InputFailure("unsupported-dynamic-load", row.location, - block.canonical_name, row.fields[1], - "Dynamic CLOAD supports global translational DOF 1 " - "through 3 only."); - return; - } - loads.push_back({row.fields[0], static_cast(dof), magnitude, - row.location, amplitude_index, amplitude_name, - block.location}); - } - } - - void ParseDsload(const KeywordBlock& block) { - if (!ValidateParameters(block, {}, "unsupported-dsload-parameter") || - block.data.empty()) { - if (!failure_) { - InputFailure("invalid-data-arity", block.location, block.canonical_name, - "", "DSLOAD requires one or more rows."); - } - return; - } - for (std::size_t ordinal = 0U; ordinal < block.data.size(); ++ordinal) { - const auto& row = block.data[ordinal]; - if (row.fields.size() != 3U || row.fields[0].empty() || - row.fields[1].empty() || row.fields[2].empty()) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - "", "DSLOAD rows require surface, P, magnitude."); - return; - } - if (!IsPressureNameToken(row.fields[0])) { - InputFailure("invalid-surface-name", row.location, block.canonical_name, - row.fields[0], - "DSLOAD surface names must use the approved ASCII name " - "syntax."); - return; - } - if (!AsciiCaseInsensitiveEquals(row.fields[1], "P")) { - InputFailure("unsupported-load-type", row.location, - block.canonical_name, row.fields[1], - "Only uniform surface pressure load type P is supported."); - return; - } - double magnitude = 0.0; - if (!ParseSurfacePressureDouble(row.fields[2], magnitude, row.location, - block.canonical_name)) { - return; - } - step_.surface_pressure_loads.push_back( - {row.fields[0], magnitude, row.fields[2], block.location, - row.location, ordinal, step_.next_load_ordinal++}); - } - } - - void ParseStepStart(const KeywordBlock& block) { - if (step_seen_) { - if (step_.frequency || step_.dynamic) { - InputFailure( - "unsupported-analysis-procedure", block.location, - block.canonical_name, "", - "The frequency subset accepts exactly one procedure step."); - } else { - const auto* nlgeom = Parameter(block, "NLGEOM"); - const bool nonlinear_second_step = - nlgeom != nullptr && nlgeom->value && - AsciiCaseInsensitiveEquals(*nlgeom->value, "YES"); - if (step_.nlgeom || nonlinear_second_step) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, "", - "The nonlinear static subset accepts exactly one " - "procedure step."); - } else { - InputFailure("unsupported-multiple-step", block.location, - block.canonical_name, "", - "V0 accepts exactly one analysis step."); - } - } - return; - } - if (!assembly_seen_ || materials_.empty()) { - InvalidKeywordLocation(block, - "The sole step follows the complete assembly and " - "material definitions."); - return; - } - if (!ValidateParameters(block, {"NAME", "NLGEOM", "PERTURBATION", "INC"}) || - !RequireNoData(block)) { - return; - } - StaticProcedureKind procedure_kind = - StaticProcedureKind::kLinearSmallDisplacement; - bool nlgeom = false; - const auto* nlgeom_parameter = Parameter(block, "NLGEOM"); - if (nlgeom_parameter != nullptr) { - if (!nlgeom_parameter->value || nlgeom_parameter->value->empty()) { - InputFailure("invalid-keyword-parameter", block.location, - block.canonical_name, "NLGEOM", - "NLGEOM requires YES or NO in the approved subset."); - return; - } - if (AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "YES")) { - if (model_element_family_ != ElementFamily::kShell && - model_element_family_ != ElementFamily::kSolid) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, *nlgeom_parameter->value, - "NLGEOM=YES requires a supported Shell or Solid model."); - return; - } - procedure_kind = StaticProcedureKind::kNonlinearFullNewton; - nlgeom = true; - } else if (!AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "NO")) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, *nlgeom_parameter->value, - "NLGEOM must select YES or NO."); - return; - } - } - const auto* perturbation = Parameter(block, "PERTURBATION"); - if (perturbation != nullptr && perturbation->value) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, "PERTURBATION", - "PERTURBATION is accepted only as a value-less flag."); - return; - } - const auto* name = Parameter(block, "NAME"); - if (name != nullptr && (!name->value || name->value->empty())) { - InputFailure("invalid-keyword-parameter", block.location, - block.canonical_name, "NAME", - "STEP NAME must not be empty when it is present."); - return; - } - const auto* increment_limit = Parameter(block, "INC"); - std::uint32_t maximum_increments = 100U; - if (increment_limit != nullptr) { - if (!increment_limit->value || increment_limit->value->empty()) { - InputFailure("invalid-dynamic-data", block.location, - block.canonical_name, "INC", - "INC requires a positive uint32 value."); - return; - } - std::int64_t parsed_limit = 0; - if (!ParseInteger(*increment_limit->value, parsed_limit, block.location, - block.canonical_name, true) || - parsed_limit > static_cast( - std::numeric_limits::max())) { - if (!failure_) { - InputFailure("invalid-dynamic-data", block.location, - block.canonical_name, "INC", - "INC requires a positive uint32 value."); - } - return; - } - maximum_increments = static_cast(parsed_limit); - } - step_seen_ = true; - in_step_ = true; - step_ = {}; - step_.location = block.location; - step_.name_raw = name == nullptr ? "Step-1" : *name->value; - step_.name_canonical = CanonicalizeAscii(step_.name_raw); - step_.procedure_kind = procedure_kind; - step_.nlgeom = nlgeom; - step_.nlgeom_explicit = nlgeom_parameter != nullptr; - step_.perturbation_explicit = perturbation != nullptr; - step_.maximum_increments = maximum_increments; - step_load_seen_ = false; - step_no_op_seen_ = false; - } - - void ParseStepBlock(const KeywordBlock& block) { - if (model_element_family_ == ElementFamily::kSolid && - (block.canonical_name == "STATIC" || - block.canonical_name == "FREQUENCY" || - block.canonical_name == "DYNAMIC") && - (step_.has_static || step_.frequency || step_.dynamic)) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, step_.name_raw, - "Solid steps accept exactly one procedure."); - return; - } - if (model_element_family_ == ElementFamily::kThermalShell && - (block.canonical_name == "STATIC" || - block.canonical_name == "FREQUENCY" || - block.canonical_name == "DYNAMIC")) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, step_.name_raw, - "DS4 supports only one HEAT TRANSFER procedure."); - return; - } - if (block.canonical_name == "END STEP") { - active_output_ = false; - if (!ValidateParameters(block, {}) || !RequireNoData(block)) { - return; - } - if (!step_.has_static && !step_.frequency && !step_.dynamic && - !step_.has_heat_transfer) { - InvalidKeywordLocation( - block, "The sole step requires one supported procedure keyword."); - return; - } - in_step_ = false; - return; - } - if (block.canonical_name == "STEP") { - InputFailure("unsupported-multiple-step", block.location, - block.canonical_name, "", - "A second or nested step is unsupported."); - return; - } - if (block.canonical_name == "HEAT TRANSFER") { - active_output_ = false; - if (step_.has_static || step_.frequency || step_.dynamic || - step_.has_heat_transfer || !step_.boundaries.empty() || - !step_.loads.empty() || step_no_op_seen_) { - InvalidKeywordLocation(block, - "HEAT TRANSFER must be the first procedure."); - return; - } - ParseHeatTransfer(block); - } else if (block.canonical_name == "STATIC") { - active_output_ = false; - if (!step_.boundaries.empty() || !step_.loads.empty() || - !step_.surface_pressure_loads.empty() || step_no_op_seen_) { - InvalidKeywordLocation( - block, "STATIC must be the first keyword in the sole step."); - return; - } - ParseStatic(block); - } else if (block.canonical_name == "FREQUENCY") { - active_output_ = false; - if (step_.has_static || step_.frequency || !step_.boundaries.empty() || - !step_.loads.empty() || !step_.surface_pressure_loads.empty() || - step_no_op_seen_) { - InvalidKeywordLocation( - block, "FREQUENCY must be the first procedure in the sole step."); - return; - } - ParseFrequency(block); - } else if (block.canonical_name == "DYNAMIC") { - active_output_ = false; - if (step_.has_static || step_.frequency || step_.dynamic || - !step_.boundaries.empty() || !step_.loads.empty() || - !step_.surface_pressure_loads.empty() || step_no_op_seen_) { - InvalidKeywordLocation( - block, "DYNAMIC must be the first procedure in the sole step."); - return; - } - ParseDynamic(block); - } else if (block.canonical_name == "BOUNDARY") { - active_output_ = false; - if ((!step_.has_static && !step_.frequency && !step_.dynamic && - !step_.has_heat_transfer) || - step_load_seen_ || step_no_op_seen_) { - InvalidKeywordLocation( - block, - "Step boundaries follow STATIC and precede loads " - "and no-op requests."); - return; - } - if (step_.dynamic && !block.parameters.empty()) { - InputFailure("unsupported-dynamic-boundary", block.location, - block.canonical_name, "", - "Dynamic BOUNDARY does not support keyword parameters."); - return; - } - if (step_.has_heat_transfer) { - ParseThermalBoundary(block, step_.thermal_boundaries); - } else { - ParseBoundary(block, step_.boundaries); - } - if (!failure_ && step_.frequency) { - ValidateEigenBoundaries(step_.boundaries); - } - if (!failure_ && step_.dynamic) { - ValidateDynamicBoundaries(step_.boundaries); - } - } else if (block.canonical_name == "CLOAD") { - active_output_ = false; - if ((!step_.has_static && !step_.dynamic) || step_no_op_seen_) { - InvalidKeywordLocation( - block, - "CLOAD follows STATIC and boundaries and precedes no-op requests."); - return; - } - ParseCload(block, step_.loads); - if (!failure_) { - step_.next_load_ordinal += block.data.size(); - } - step_load_seen_ = !failure_; - } else if (block.canonical_name == "CFLUX") { - active_output_ = false; - if (!step_.has_heat_transfer || step_no_op_seen_) { - InvalidKeywordLocation(block, - "CFLUX follows HEAT TRANSFER and boundaries."); - return; - } - ParseCflux(block); - step_load_seen_ = !failure_; - } else if (block.canonical_name == "DSLOAD") { - active_output_ = false; - if (!step_.has_static || step_.dynamic || step_no_op_seen_) { - InvalidKeywordLocation(block, - "DSLOAD follows STATIC and boundaries and " - "precedes no-op requests."); - return; - } - ParseDsload(block); - step_load_seen_ = !failure_; - } else if (block.canonical_name == "RESTART") { - active_output_ = false; - if (!step_.has_static && !step_.frequency && !step_.dynamic && - !step_.has_heat_transfer) { - InvalidKeywordLocation( - block, "Step no-op requests follow STATIC, boundaries, and loads."); - return; - } - step_no_op_seen_ = true; - if (step_.frequency || step_.has_heat_transfer || - model_element_family_ == ElementFamily::kSolid) { - const auto* write = Parameter(block, "WRITE"); - const auto* frequency = Parameter(block, "FREQUENCY"); - if (!ValidateParameters(block, {"WRITE", "FREQUENCY"}) || - write == nullptr || write->value || frequency == nullptr || - !frequency->value || *frequency->value != "0") { - if (!failure_) { - InputFailure( - "unsupported-keyword", block.location, block.canonical_name, "", - "Supported RESTART no-op requires WRITE, FREQUENCY=0."); - } - return; - } - } - if (RequireNoData(block)) { - AddIgnoredWarning(block); - } - } else if (block.canonical_name == "OUTPUT") { - if (!step_.has_static && !step_.frequency && !step_.dynamic && - !step_.has_heat_transfer) { - InvalidKeywordLocation( - block, "Step no-op requests follow STATIC, boundaries, and loads."); - return; - } - step_no_op_seen_ = true; - ParseOutputRoot(block); - } else if (block.canonical_name == "NODE OUTPUT" || - block.canonical_name == "ELEMENT OUTPUT" || - block.canonical_name == "CONTACT OUTPUT" || - block.canonical_name == "ENERGY OUTPUT") { - ParseOutputChild(block); - } else { - active_output_ = false; - if (step_.procedure_kind == StaticProcedureKind::kNonlinearFullNewton && - !step_.has_static) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, "", - "The nonlinear step supports only the STATIC procedure."); - return; - } - RejectUnknown(block); - } - } - - bool ParseFrequencyModeCount(const std::string& text, std::int64_t& value, - const SourceLocation& location) { - if (text.empty() || - !std::all_of(text.begin(), text.end(), [](char character) { - return character >= '0' && character <= '9'; - })) { - return InputFailure( - "invalid-frequency-data", location, "FREQUENCY", text, - "The requested mode count must be positive decimal digits."); - } - const auto parsed = - std::from_chars(text.data(), text.data() + text.size(), value); - if (parsed.ec != std::errc{} || parsed.ptr != text.data() + text.size() || - value <= 0) { - return InputFailure( - "invalid-frequency-data", location, "FREQUENCY", text, - "The requested mode count must be a positive int64 value."); - } - return true; - } - - void ParseFrequency(const KeywordBlock& block) { - if (step_.nlgeom || (step_.perturbation_explicit && step_.has_static) || - !ValidateParameters( - block, {"EIGENSOLVER", "SIM", "ACOUSTIC COUPLING", "NORMALIZATION"}, - "unsupported-frequency-option")) { - if (!failure_) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, "", - "FREQUENCY requires the original linear configuration."); - } - return; - } - if (block.data.size() != 1U || block.data[0].fields.empty() || - block.data[0].fields.size() > 7U) { - InputFailure("invalid-frequency-data", block.location, - block.canonical_name, "", - "FREQUENCY requires one data row with one to seven fields."); - return; - } - for (std::size_t field = 1U; field < block.data[0].fields.size(); ++field) { - if (!block.data[0].fields[field].empty()) { - InputFailure("invalid-frequency-data", block.data[0].location, - block.canonical_name, std::to_string(field + 1U), - "Only the requested mode-count field may be non-empty."); - return; - } - } - FrequencyStepDefinition frequency{step_.name_raw, - step_.name_canonical, - step_.location, - block.location, - block.data[0].location, - 0, - step_.nlgeom_explicit, - step_.perturbation_explicit, - false, - false, - false, - false, - FrequencyEigensolver::kLanczos, - FrequencyNormalization::kMass, - {}}; - if (!ParseFrequencyModeCount(block.data[0].fields[0], - frequency.requested_mode_count, - block.data[0].location)) { - return; - } - const auto* eigensolver = Parameter(block, "EIGENSOLVER"); - if (eigensolver != nullptr) { - if (!eigensolver->value || - !AsciiCaseInsensitiveEquals(*eigensolver->value, "LANCZOS")) { - InputFailure("unsupported-frequency-option", block.location, - block.canonical_name, "EIGENSOLVER", - "Only EIGENSOLVER=LANCZOS is accepted."); - return; - } - frequency.eigensolver_explicit = true; - } - const auto* sim = Parameter(block, "SIM"); - if (sim != nullptr) { - if (sim->value && !AsciiCaseInsensitiveEquals(*sim->value, "YES")) { - InputFailure("unsupported-frequency-option", block.location, - block.canonical_name, "SIM", - "SIM accepts only a flag or YES."); - return; - } - frequency.sim_explicit = true; - } - const auto* acoustic = Parameter(block, "ACOUSTIC COUPLING"); - if (acoustic != nullptr) { - if (!acoustic->value || - !AsciiCaseInsensitiveEquals(*acoustic->value, "ON")) { - InputFailure("unsupported-frequency-option", block.location, - block.canonical_name, "ACOUSTIC COUPLING", - "Only ACOUSTIC COUPLING=ON is accepted."); - return; - } - frequency.acoustic_coupling_explicit = true; - } - const auto* normalization = Parameter(block, "NORMALIZATION"); - if (normalization != nullptr) { - if (!normalization->value || - !AsciiCaseInsensitiveEquals(*normalization->value, "MASS")) { - InputFailure("unsupported-frequency-option", block.location, - block.canonical_name, "NORMALIZATION", - "Only NORMALIZATION=MASS is accepted."); - return; - } - frequency.normalization_explicit = true; - } - step_.frequency = std::move(frequency); - definition_.warnings.push_back( - {Severity::kWarning, "source-eigensolver-mapped-to-feast", - block.location, block.canonical_name, step_.name_raw, - "The accepted source eigensolver is mapped to the FEAST backend."}); - if (step_.frequency->sim_explicit) { - definition_.warnings.push_back( - {Severity::kWarning, "source-sim-option-not-applied", block.location, - block.canonical_name, step_.name_raw, - "The accepted source SIM option has no FESA runtime effect."}); - } - if (step_.frequency->acoustic_coupling_explicit) { - definition_.warnings.push_back( - {Severity::kWarning, "acoustic-option-inapplicable-structural-only", - block.location, block.canonical_name, step_.name_raw, - "Acoustic coupling is inapplicable to this structural-only model."}); - } - } - - void ValidateEigenBoundaries( - const std::vector& boundaries) { - for (const auto& boundary : boundaries) { - if (boundary.value != 0.0) { - InputFailure("unsupported-eigen-boundary", boundary.location, - "BOUNDARY", boundary.target, - "Frequency boundaries must prescribe exact zero."); - return; - } - } - } - - void ValidateDynamicBoundaries( - const std::vector& boundaries) { - for (const auto& boundary : boundaries) { - if (boundary.value != 0.0) { - InputFailure("unsupported-dynamic-boundary", boundary.location, - "BOUNDARY", boundary.target, - "Dynamic boundaries must be homogeneous and constant."); - return; - } - } - } - - void ParseDynamic(const KeywordBlock& block) { - if (step_.perturbation_explicit || - (model_element_family_ != ElementFamily::kSolid && - (!step_.nlgeom || model_element_family_ != ElementFamily::kShell)) || - !ValidateParameters(block, {"DIRECT"}, - "unsupported-dynamic-parameter")) { - if (!failure_) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, "", - "DYNAMIC requires nonlinear Shell or linear/nonlinear " - "Solid geometry."); - } - return; - } - if (model_element_family_ == ElementFamily::kSolid && - block.data.size() == 1U && block.data[0].fields.size() > 3U) { - InputFailure("invalid-dynamic-data", block.data[0].location, - block.canonical_name, "", - "Solid DYNAMIC requires h,T with at most one blank field."); - return; - } - const auto* direct = Parameter(block, "DIRECT"); - if (direct == nullptr || direct->value || block.data.size() != 1U || - block.data[0].fields.size() < 2U || - std::any_of(block.data[0].fields.begin() + 2, - block.data[0].fields.end(), - [](const auto& field) { return !field.empty(); })) { - InputFailure( - "invalid-dynamic-data", block.location, block.canonical_name, "", - "DYNAMIC,DIRECT requires one row with increment and time period."); - return; - } - DynamicStepDefinition dynamic{step_.name_raw, - step_.name_canonical, - step_.location, - block.location, - block.data[0].location, - 0.0, - 0.0, - 0U, - step_.maximum_increments, - -0.05, - 0.275625, - 0.55, - {}, - {}}; - if (!ParseDynamicDouble(block.data[0].fields[0], dynamic.initial_increment, - block.data[0].location, block.canonical_name) || - !ParseDynamicDouble(block.data[0].fields[1], dynamic.time_period, - block.data[0].location, block.canonical_name) || - !(dynamic.initial_increment > 0.0) || !(dynamic.time_period > 0.0)) { - if (!failure_) { - InputFailure( - "invalid-dynamic-data", block.data[0].location, - block.canonical_name, "", - "Dynamic increment and time period must be finite and positive."); - } - return; - } - const double count = dynamic.time_period / dynamic.initial_increment; - const double rounded_count = std::round(count); - if (!std::isfinite(count) || rounded_count < 1.0 || - rounded_count > - static_cast(std::numeric_limits::max()) || - dynamic.initial_increment * rounded_count != dynamic.time_period) { - InputFailure("invalid-dynamic-schedule", block.data[0].location, - block.canonical_name, "", - "DYNAMIC,DIRECT requires an exact positive integer number " - "of increments."); - return; - } - dynamic.increment_count = static_cast(rounded_count); - if (dynamic.increment_count > dynamic.maximum_increments) { - InputFailure("invalid-dynamic-schedule", block.data[0].location, - block.canonical_name, "", - "DYNAMIC,DIRECT increment count cannot exceed STEP INC."); - return; - } - dynamic.nlgeom = step_.nlgeom; - step_.dynamic = std::move(dynamic); - } - - void ParseHeatTransfer(const KeywordBlock& block) { - if (model_element_family_ != ElementFamily::kThermalShell || step_.nlgeom || - step_.perturbation_explicit || - !ValidateParameters(block, {"END"}, "unsupported-thermal-option") || - block.data.size() != 1U) { - if (!failure_) - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, "", - "HEAT TRANSFER requires the DS4 thermal subset."); - return; - } - const auto* end = Parameter(block, "END"); - if (end != nullptr && - (!end->value || !AsciiCaseInsensitiveEquals(*end->value, "PERIOD"))) { - InputFailure("unsupported-thermal-option", block.location, - block.canonical_name, "END", - "HEAT TRANSFER accepts only END=PERIOD."); - return; - } - if (block.data[0].fields.size() > 5U) { - InputFailure( - "invalid-thermal-time-grid", block.data[0].location, - block.canonical_name, "", - "HEAT TRANSFER permits at most three trailing empty fields."); - return; - } - const auto fields = WithoutTrailingEmpty(block.data[0].fields); - if (fields.size() != 2U) { - InputFailure("invalid-thermal-time-grid", block.data[0].location, - block.canonical_name, "", - "HEAT TRANSFER requires increment and time period."); - return; - } - if (!ParseThermalDouble(fields[0], step_.thermal_increment, - block.data[0].location, block.canonical_name) || - !ParseThermalDouble(fields[1], step_.thermal_period, - block.data[0].location, block.canonical_name) || - !(step_.thermal_increment > 0.0) || !(step_.thermal_period > 0.0)) { - if (!failure_) - InputFailure( - "invalid-thermal-time-grid", block.data[0].location, - block.canonical_name, "", - "Thermal increment and period must be finite and positive."); - return; - } - const auto grid = - ThermalTimeGrid::Create(step_.thermal_period, step_.thermal_increment, - step_.maximum_increments); - if (!grid.HasValue()) { - auto diagnostic = grid.GetStatus().Diagnostics().front(); - diagnostic.location = block.data[0].location; - diagnostic.keyword = block.canonical_name; - diagnostic.entity_identity = step_.name_raw; - failure_ = MappingFailure{ - grid.GetStatus().Category().value_or(FailureCategory::kInput), - std::move(diagnostic)}; - return; - } - step_.has_heat_transfer = true; - } - - void ParseCflux(const KeywordBlock& block) { - if (!ValidateParameters(block, {}) || block.data.empty()) { - if (!failure_) - InputFailure("invalid-data-arity", block.location, block.canonical_name, - "", "CFLUX requires target, DOF, power rows."); - return; - } - for (const auto& row : block.data) { - if (row.fields.size() != 3U || row.fields[0].empty()) { - InputFailure("invalid-data-arity", row.location, block.canonical_name, - "", "CFLUX rows require target, DOF, power."); - return; - } - std::int64_t dof = 0; - double power = 0.0; - if (!ParseInteger(row.fields[1], dof, row.location, block.canonical_name, - true) || - !ParseThermalDouble(row.fields[2], power, row.location, - block.canonical_name) || - (dof != 11 && dof != 15)) { - InputFailure("invalid-dof", row.location, block.canonical_name, - row.fields[0], "CFLUX supports DOF 11 or 15."); - return; - } - step_.thermal_fluxes.push_back( - {row.fields[0], static_cast(dof), power, row.location}); - } - } - - void ParseStatic(const KeywordBlock& block) { - if (model_element_family_ == ElementFamily::kSolid && - Parameter(block, "DIRECT")) { - if (step_.perturbation_explicit || step_.has_static || step_.frequency || - step_.dynamic) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, step_.name_raw, - "STATIC DIRECT requires one non-perturbation procedure."); - return; - } - if (!ValidateParameters(block, {"DIRECT"})) return; - const auto* direct = Parameter(block, "DIRECT"); - if (direct->value || block.data.size() != 1U || - (block.data[0].fields.size() < 2U || - block.data[0].fields.size() > 3U || - std::any_of(block.data[0].fields.begin() + 2, - block.data[0].fields.end(), - [](const auto& field) { return !field.empty(); }))) { - InputFailure("invalid-static-data", block.location, - block.canonical_name, "DIRECT", - "STATIC DIRECT requires exactly h,T."); - return; - } - double h = 0.0; - double period = 0.0; - if (!ParseDouble(block.data[0].fields[0], h, block.data[0].location, - "STATIC") || - !ParseDouble(block.data[0].fields[1], period, block.data[0].location, - "STATIC")) - return; - const double count = std::round(period / h); - if (!(h > 0.0) || !(period > 0.0) || !std::isfinite(count) || - count < 1.0 || - count > static_cast(step_.maximum_increments) || - h * count != period) { - InputFailure("invalid-static-schedule", block.data[0].location, - block.canonical_name, "DIRECT", - "STATIC DIRECT requires positive exact N*h=T and N<=INC."); - return; - } - step_.static_values = {h, period, h, h}; - step_.static_direct = true; - step_.static_increment_count = static_cast(count); - step_.has_static = true; - return; - } - if (step_.perturbation_explicit || step_.frequency) { - InputFailure("unsupported-analysis-procedure", block.location, - block.canonical_name, "PERTURBATION", - "PERTURBATION is supported only with FREQUENCY."); - return; - } - if (step_.has_heat_transfer || step_.has_static || - !ValidateParameters(block, {}) || block.data.size() != 1U || - block.data[0].fields.size() != 4U) { - if (!failure_) { - InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" - : "invalid-static-data", - block.location, block.canonical_name, "", - "STATIC requires exactly one row of four values."); - } - return; - } - for (std::size_t field = 0U; field < 4U; ++field) { - const std::string& text = block.data[0].fields[field]; - const bool parsed = - step_.nlgeom - ? ParseNonlinearStaticDouble(text, step_.static_values[field], - block.data[0].location, - block.canonical_name) - : ParseDouble(text, step_.static_values[field], - block.data[0].location, block.canonical_name); - if (!parsed) { - return; - } - if (step_.static_values[field] <= 0.0) { - InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" - : "invalid-static-data", - block.data[0].location, block.canonical_name, "", - "All four STATIC fields must be positive."); - return; - } - } - if (step_.static_values[2] > step_.static_values[3]) { - InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" - : "invalid-static-data", - block.data[0].location, block.canonical_name, "", - "STATIC minimum increment cannot exceed maximum increment."); - return; - } - if (step_.nlgeom && step_.static_values[1] != 1.0) { - InputFailure("invalid-nonlinear-static-data", block.data[0].location, - block.canonical_name, "", - "The nonlinear STATIC time period must be exactly 1.0."); - return; - } - step_.has_static = true; - } - - void ParseOutputRoot(const KeywordBlock& block) { - if (step_.has_heat_transfer) { - const auto* field = Parameter(block, "FIELD"); - const auto* history = Parameter(block, "HISTORY"); - const auto* variable = Parameter(block, "VARIABLE"); - const auto* frequency = Parameter(block, "FREQUENCY"); - const bool valid_field = - field && !field->value && variable && variable->value && - AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"); - const bool valid_history = history && !history->value && frequency && - frequency->value && *frequency->value == "0"; - if (!RequireNoData(block)) return; - if (block.parameters.size() != 2U || (!valid_field && !valid_history)) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "", - "Thermal OUTPUT accepts FIELD, VARIABLE=PRESELECT or " - "HISTORY, FREQUENCY=0."); - return; - } - AddIgnoredWarning(block); - return; - } - if (!ValidateParameters( - block, (step_.dynamic || step_.has_heat_transfer) - ? std::vector{"FIELD", "HISTORY", - "VARIABLE", "FREQUENCY"} - : std::vector{"FIELD", "HISTORY", - "VARIABLE"})) { - return; - } - const auto* field = Parameter(block, "FIELD"); - const auto* history = Parameter(block, "HISTORY"); - const auto* variable = Parameter(block, "VARIABLE"); - if ((field == nullptr) == (history == nullptr) || - (field != nullptr && field->value) || - (history != nullptr && history->value)) { - InputFailure( - step_.nlgeom ? "invalid-keyword-parameter" : "unsupported-keyword", - block.location, block.canonical_name, "", - "OUTPUT must select exactly FIELD or HISTORY."); - return; - } - if (model_element_family_ == ElementFamily::kSolid && - ((variable && - (!variable->value || - !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) || - !RequireNoData(block))) { - if (!failure_) - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "VARIABLE", - "Solid OUTPUT accepts only PRESELECT requests."); - return; - } - if (step_.nlgeom && - (variable == nullptr || !variable->value || - !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) { - InputFailure("invalid-keyword-parameter", block.location, - block.canonical_name, "VARIABLE", - "Nonlinear OUTPUT requires VARIABLE=PRESELECT."); - return; - } - if (step_.dynamic) { - const auto* frequency = Parameter(block, "FREQUENCY"); - if (!ValidateParameters(block, - {"FIELD", "HISTORY", "VARIABLE", "FREQUENCY"}) || - variable == nullptr || !variable->value || - !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT") || - (frequency != nullptr && - (!frequency->value || *frequency->value != "1")) || - !RequireNoData(block)) { - if (!failure_) { - InputFailure( - "unsupported-keyword", block.location, block.canonical_name, "", - "Dynamic OUTPUT accepts only VARIABLE=PRESELECT, FREQUENCY=1."); - } - return; - } - } else if (step_.frequency && - ((variable != nullptr && - (!variable->value || !AsciiCaseInsensitiveEquals( - *variable->value, "PRESELECT"))) || - !RequireNoData(block))) { - if (!failure_) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "", - "Frequency OUTPUT accepts only VARIABLE=PRESELECT."); - } - return; - } - active_output_ = true; - active_output_is_field_ = field != nullptr; - AddIgnoredWarning(block); - } - - void ParseOutputChild(const KeywordBlock& block) { - if (step_.has_heat_transfer) { - InputFailure("unsupported-keyword", block.location, block.canonical_name, - "", - "Thermal output children are outside the approved subset."); - return; - } - if (!active_output_) { - InputFailure( - "invalid-keyword-location", block.location, block.canonical_name, "", - "Output variable keywords require an active OUTPUT request."); - return; - } - if (model_element_family_ == ElementFamily::kSolid && step_.dynamic) { - InputFailure( - "unsupported-keyword", block.location, block.canonical_name, "", - "Solid dynamic output children are outside the approved subset."); - return; - } - if (model_element_family_ == ElementFamily::kSolid && step_.has_static) { - const auto* variable = Parameter(block, "VARIABLE"); - const auto* directions = Parameter(block, "DIRECTIONS"); - const bool node = block.canonical_name == "NODE OUTPUT"; - const bool element = block.canonical_name == "ELEMENT OUTPUT"; - const bool contact = block.canonical_name == "CONTACT OUTPUT"; - if (!active_output_is_field_ || (!node && !element && !contact) || - !ValidateParameters( - block, - element ? std::vector{"VARIABLE", "DIRECTIONS"} - : std::vector{"VARIABLE"}) || - (directions && - (!directions->value || - !AsciiCaseInsensitiveEquals(*directions->value, "YES"))) || - (variable && - (!variable->value || - !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) || - (contact && (!variable || !block.data.empty()))) { - if (!failure_) - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "", - "Solid static output child is unsupported."); - return; - } - for (const auto& row : block.data) { - for (const auto& field : row.fields) { - const std::string token = CanonicalizeAscii(field); - if (!(node ? (token == "U" || token == "RF") - : (token == "S" || token == "E"))) { - InputFailure("unsupported-keyword", row.location, - block.canonical_name, field, - "Solid output quantities must be physical supported " - "components."); - return; - } - } - } - } - if (step_.frequency) { - const std::string_view required_variable = - block.canonical_name == "NODE OUTPUT" ? "PRESELECT" : "ALL"; - const auto* variable = Parameter(block, "VARIABLE"); - if ((block.canonical_name != "NODE OUTPUT" && - block.canonical_name != "ENERGY OUTPUT") || - (block.canonical_name == "NODE OUTPUT" && !active_output_is_field_) || - (block.canonical_name == "ENERGY OUTPUT" && - active_output_is_field_) || - !ValidateParameters(block, {"VARIABLE"}) || variable == nullptr || - !variable->value || - !AsciiCaseInsensitiveEquals(*variable->value, required_variable) || - !RequireNoData(block)) { - if (!failure_) { - InputFailure( - "unsupported-keyword", block.location, block.canonical_name, "", - "Frequency output child is outside the approved subset."); - } - return; - } - } - AddIgnoredWarning(block); - } - - void AddIgnoredWarning(const KeywordBlock& block) { - // One warning per allowlisted keyword keeps no-op provenance stable; - // subordinate variable rows remain attached to that keyword record. - definition_.warnings.push_back( - {Severity::kWarning, - step_.dynamic ? "ignored-output-request" : "ignored-input-keyword", - block.location, block.canonical_name, "", - "The allowlisted Abaqus keyword is " - "ignored without semantic effect."}); - } - - void RejectUnknown(const KeywordBlock& block) { - if (block.canonical_name == "DLOAD" && - model_element_family_ == ElementFamily::kShell) { - InputFailure("unsupported-distributed-load", block.location, - block.canonical_name, "", - "Distributed, pressure, gravity, body, edge, and follower " - "loads are unsupported."); - return; - } - InputFailure("unsupported-keyword", block.location, block.canonical_name, - "", "The keyword is outside the approved Abaqus subset."); - } - - const RawPart* FindPart(const std::string& name) const { - const auto found = std::find_if( - parts_.begin(), parts_.end(), [&name](const RawPart& part) { - return AsciiCaseInsensitiveEquals(part.name, name); - }); - return found == parts_.end() ? nullptr : &*found; - } - - const RawInstance* FindInstance(const std::string& name) const { - const auto found = - std::find_if(instances_.begin(), instances_.end(), - [&name](const RawInstance& instance) { - return AsciiCaseInsensitiveEquals(instance.name, name); - }); - return found == instances_.end() ? nullptr : &*found; - } - - std::optional FindMaterialIndex(const std::string& name) const { - for (std::size_t index = 0U; index < materials_.size(); ++index) { - if (AsciiCaseInsensitiveEquals(materials_[index].name, name)) { - return static_cast(index); - } - } - return std::nullopt; - } - - const RawSet* FindSet(const std::vector& sets, - const std::string& name) const { - const auto found = - std::find_if(sets.begin(), sets.end(), [&name](const RawSet& set) { - return AsciiCaseInsensitiveEquals(set.name, name); - }); - return found == sets.end() ? nullptr : &*found; - } - - const RawNode* FindNode(const RawPart& part, std::int64_t label) const { - const auto found = std::find_if( - part.nodes.begin(), part.nodes.end(), - [label](const RawNode& node) { return node.label == label; }); - return found == part.nodes.end() ? nullptr : &*found; - } - - const RawElement* FindElement(const RawPart& part, std::int64_t label) const { - const auto found = std::find_if( - part.elements.begin(), part.elements.end(), - [label](const RawElement& element) { return element.label == label; }); - return found == part.elements.end() ? nullptr : &*found; + topology_.AssemblySets().push_back(std::move(set)); } void ValidateCardinality() { - if (parts_.empty() || !assembly_seen_ || instances_.empty() || - materials_.empty() || !step_seen_ || - (!step_.has_static && !step_.frequency && !step_.dynamic && - !step_.has_heat_transfer)) { + if (topology_.Parts().empty() || !assembly_seen_ || + topology_.Instances().empty() || material_properties_.Empty() || + !steps_.HasStep() || !steps_.HasSupportedProcedure()) { const auto location = input_.blocks.empty() ? SourceLocation{input_.source_path, 0U} : input_.blocks.back().location; @@ -3266,1321 +1215,19 @@ class DomainMappingContext::Impl { } } - void FinalizeMaterials() { - for (const auto& material : materials_) { - if (model_element_family_ == ElementFamily::kThermalShell) { - if (!material.density || !material.conductivity || - !material.specific_heat) { - ModelFailure("missing-thermal-material-property", material.location, - "MATERIAL", material.name, - "DS4 materials require DENSITY, CONDUCTIVITY, and " - "SPECIFIC HEAT."); - return; - } - definition_.thermal_materials.push_back({{"", 0, material.name}, - material.name, - *material.conductivity, - *material.density, - *material.specific_heat, - material.location}); - continue; - } - if (!material.has_elastic) { - InputFailure("unresolved-reference", material.location, "MATERIAL", - material.name, - "A material must own exactly one ELASTIC row."); - return; - } - if (model_element_family_ == ElementFamily::kShell || - model_element_family_ == ElementFamily::kSolid) { - if (!(material.youngs_modulus > 0.0) || - !(material.poisson_ratio > -1.0) || - !(material.poisson_ratio < 0.5)) { - ModelFailure(model_element_family_ == ElementFamily::kSolid - ? "invalid-solid-material" - : "invalid-shell-material", - material.elastic_location, "ELASTIC", material.name, - "Isotropic elasticity requires E>0 and -1 0.0) || !std::isfinite(shear_modulus) || - !(shear_modulus > 0.0)) { - ModelFailure("invalid-beam-property", material.elastic_location, - "ELASTIC", material.name, - "E and the derived G=E/(2*(1+nu)) must be positive."); - return; - } - definition_.materials.push_back({material.name, material.youngs_modulus, - material.poisson_ratio, - material.location}); - } - } - - void FinalizeDensities() { - if (model_element_family_ == ElementFamily::kThermalShell) { - for (const auto& block : input_.blocks) { - if (block.canonical_name != "PREPRINT") continue; - if (!ValidateParameters(block, {"ECHO", "MODEL", "HISTORY", "CONTACT"})) - return; - if (block.parameters.size() != 4U) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "", - "Thermal PREPRINT requires four NO parameters."); - return; - } - for (const auto& parameter : block.parameters) { - if (!parameter.value || - !AsciiCaseInsensitiveEquals(*parameter.value, "NO")) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, parameter.name, - "Thermal PREPRINT parameters must equal NO."); - return; - } - } - } - return; - } - if (physical_constants_location_) { - InputFailure("unsupported-keyword", *physical_constants_location_, - "PHYSICAL CONSTANTS", "", - "PHYSICAL CONSTANTS is supported only by thermal input."); - return; - } - if (!step_.frequency && !step_.dynamic && - model_element_family_ == ElementFamily::kSolid) { - for (std::size_t index = 0U; index < materials_.size(); ++index) { - if (materials_[index].density) - definition_.densities.push_back({static_cast(index), - *materials_[index].density, - materials_[index].density_location}); - } - return; - } - if (!step_.frequency && !step_.dynamic) { - if (std::any_of(materials_.begin(), materials_.end(), - [](const RawMaterial& material) { - return material.density.has_value(); - })) { - InputFailure("invalid-density-data", step_.location, "DENSITY", "", - "DENSITY is supported only by the FREQUENCY procedure."); - } - return; - } - if (step_.frequency) { - ValidateFrequencyPreprint(); - if (failure_) { - return; - } - } - if (step_.dynamic) { - ValidateDynamicPreprint(); - if (failure_) { - return; - } - for (auto& warning : definition_.warnings) { - if (warning.keyword == "PREPRINT") { - warning.code = "ignored-output-request"; - } - } - } - if (model_element_family_ != ElementFamily::kShell && - model_element_family_ != ElementFamily::kSolid) { - InputFailure("unsupported-analysis-procedure", step_.location, - step_.frequency ? "FREQUENCY" : "DYNAMIC", step_.name_raw, - "The procedure requires an approved Shell or Solid model."); - return; - } - if (!element_surfaces_.empty()) { - InputFailure("unsupported-keyword", element_surfaces_.front().location, - "SURFACE", element_surfaces_.front().name, - "The selected procedure does not support element surfaces."); - return; - } - for (std::size_t index = 0U; index < materials_.size(); ++index) { - const RawMaterial& material = materials_[index]; - if (!material.density) { - bool active = false; - for (const auto& section : definition_.shell_sections) { - if (section.material_index == static_cast(index)) { - active = true; - break; - } - } - for (const auto& section : definition_.solid_sections) { - if (section.MaterialIndex() == static_cast(index)) - active = true; - } - if (active) { - ModelFailure( - "missing-material-density", material.location, "MATERIAL", - material.name, - "Each active dynamic or frequency material requires DENSITY."); - return; - } - continue; - } - definition_.densities.push_back({static_cast(index), - *material.density, - material.density_location}); - } - } - - void ValidateFrequencyPreprint() { - for (const auto& block : input_.blocks) { - if (block.canonical_name != "PREPRINT") { - continue; - } - if (!ValidateParameters(block, {"ECHO", "MODEL", "HISTORY", "CONTACT"}) || - block.parameters.size() != 4U) { - if (!failure_) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "", - "FREQUENCY requires PREPRINT with ECHO, MODEL, HISTORY, " - "and CONTACT parameters."); - } - return; - } - for (const auto& parameter : block.parameters) { - if (!parameter.value || - !AsciiCaseInsensitiveEquals(*parameter.value, "NO")) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, parameter.name, - "FREQUENCY requires PREPRINT parameters to equal NO."); - return; - } - } - } - for (auto& warning : definition_.warnings) { - if (warning.keyword == "PREPRINT") { - warning.message = "mandatory-eigen-output-unchanged"; - } - } - } - - void ValidateDynamicPreprint() { - for (const auto& block : input_.blocks) { - if (block.canonical_name != "PREPRINT") { - continue; - } - if (!ValidateParameters(block, {"ECHO", "MODEL", "HISTORY", "CONTACT"}) || - block.parameters.size() != 4U) { - if (!failure_) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, "", - "DYNAMIC requires PREPRINT with ECHO, MODEL, HISTORY, " - "and CONTACT parameters."); - } - return; - } - for (const auto& parameter : block.parameters) { - if (!parameter.value || - !AsciiCaseInsensitiveEquals(*parameter.value, "NO")) { - InputFailure("unsupported-keyword", block.location, - block.canonical_name, parameter.name, - "DYNAMIC requires PREPRINT parameters to equal NO."); - return; - } - } - } - } - - void FinalizePartsAndSections() { - part_section_assignments_.resize(parts_.size()); - part_shell_section_assignments_.resize(parts_.size()); - const bool shell_model = - model_element_family_ == ElementFamily::kShell || - model_element_family_ == ElementFamily::kThermalShell; - for (std::size_t part_index = 0U; part_index < parts_.size(); - ++part_index) { - const RawPart& part = parts_[part_index]; - if (part.nodes.empty() || part.elements.empty() || - (!shell_model && model_element_family_ != ElementFamily::kSolid && - part.sections.empty())) { - InputFailure("invalid-model-cardinality", part.location, "PART", - part.name, - "A part requires nodes, elements, and its approved " - "section form."); - return; - } - - PartDefinition part_definition{}; - part_definition.name = part.name; - part_definition.location = part.location; - for (const auto& node : part.nodes) { - part_definition.node_source_labels.push_back(node.label); - } - for (const auto& element : part.elements) { - part_definition.element_source_labels.push_back(element.label); - for (const auto node_label : element.node_labels) { - if (FindNode(part, node_label) == nullptr) { - InputFailure(shell_model ? "invalid-shell-connectivity" - : "unresolved-reference", - element.location, "ELEMENT", element.label_text, - "Element connectivity must resolve within its part."); - return; - } - } - } - for (const auto& set : part.node_sets) { - part_definition.node_set_names.push_back(set.name); - for (const auto label : set.members) { - if (FindNode(part, label) == nullptr) { - InputFailure("unresolved-reference", set.location, "NSET", set.name, - "Every node-set member must resolve within its part."); - return; - } - } - } - for (const auto& set : part.element_sets) { - part_definition.element_set_names.push_back(set.name); - for (const auto label : set.members) { - if (FindElement(part, label) == nullptr) { - InputFailure( - "unresolved-reference", set.location, "ELSET", set.name, - "Every element-set member must resolve within its part."); - return; - } - } - } - definition_.parts.push_back(std::move(part_definition)); - - if (model_element_family_ == ElementFamily::kSolid) { - auto& assignments = part_shell_section_assignments_[part_index]; - for (const auto& section : part.solid_sections) { - const auto* element_set = - FindSet(part.element_sets, section.element_set_name); - const auto material = FindMaterialIndex(section.material_name); - if (!element_set || !material) { - InputFailure("unresolved-solid-section", section.location, - "SOLID SECTION", section.element_set_name, - "Solid ELSET and MATERIAL must resolve."); - return; - } - const auto index = - static_cast(definition_.solid_sections.size()); - definition_.solid_sections.emplace_back( - SourceEntityId{part.name, static_cast(index), - section.element_set_name}, - section.element_set_name, *material, section.location); - for (const auto label : element_set->members) { - if (!assignments.emplace(label, std::make_pair(index, *material)) - .second) { - InputFailure( - "invalid-solid-section-assignment", section.location, - "SOLID SECTION", std::to_string(label), - "Solid elements require exactly one section assignment."); - return; - } - } - } - for (const auto& element : part.elements) { - if (assignments.find(element.label) == assignments.end()) { - InputFailure("invalid-solid-section-assignment", element.location, - "ELEMENT", element.label_text, - "A Solid section assignment is missing."); - return; - } - } - continue; - } - if (shell_model) { - auto& assignments = part_shell_section_assignments_[part_index]; - for (const auto& section : part.shell_sections) { - const auto* element_set = - FindSet(part.element_sets, section.element_set_name); - const auto material_index = FindMaterialIndex(section.material_name); - if (element_set == nullptr || !material_index) { - InputFailure("unresolved-shell-section", section.location, - "SHELL SECTION", section.element_set_name, - "Shell section ELSET and MATERIAL references " - "must resolve."); - return; - } - const EntityIndex section_index = - model_element_family_ == ElementFamily::kThermalShell - ? static_cast( - definition_.thermal_sections.size()) - : static_cast(definition_.shell_sections.size()); - if (model_element_family_ == ElementFamily::kThermalShell) { - definition_.thermal_sections.push_back( - {{part.name, static_cast(section_index), - section.element_set_name}, - section.element_set_name, - section.thickness, - *material_index, - section.location}); - } else { - definition_.shell_sections.push_back( - {section.element_set_name, section.thickness, *material_index, - section.location}); - } - for (const auto element_label : element_set->members) { - if (!assignments - .emplace(element_label, - std::make_pair(section_index, *material_index)) - .second) { - InputFailure("invalid-shell-section-assignment", section.location, - "SHELL SECTION", std::to_string(element_label), - "A shell element cannot receive multiple " - "section assignments."); - return; - } - } - } - for (const auto& element : part.elements) { - if (assignments.find(element.label) == assignments.end()) { - InputFailure("invalid-shell-section-assignment", element.location, - "ELEMENT", element.label_text, - "Every shell element requires exactly one " - "resolved section assignment."); - return; - } - } - continue; - } - - auto& assignments = part_section_assignments_[part_index]; - for (const auto& section : part.sections) { - const auto* element_set = - FindSet(part.element_sets, section.element_set_name); - const auto material_index = FindMaterialIndex(section.material_name); - if (element_set == nullptr || !material_index) { - InputFailure("unresolved-reference", section.location, - "BEAM GENERAL SECTION", section.element_set_name, - "Section ELSET and MATERIAL references must resolve."); - return; - } - if (section.properties[2] != 0.0) { - ModelFailure("unsupported-coupled-section", section.location, - "BEAM GENERAL SECTION", section.element_set_name, - "V0 requires exact I12=0."); - return; - } - if (!(section.properties[0] > 0.0) || !(section.properties[1] > 0.0) || - !(section.properties[3] > 0.0) || !(section.properties[4] > 0.0)) { - ModelFailure("invalid-beam-property", section.location, - "BEAM GENERAL SECTION", section.element_set_name, - "A, I11, I22, and J must be positive."); - return; - } - const EntityIndex section_index = - static_cast(definition_.sections.size()); - definition_.sections.push_back( - {section.element_set_name, section.properties[0], - section.properties[1], section.properties[2], - section.properties[3], section.properties[4], section.first_axis, - section.section_points, section.location}); - for (const auto element_label : element_set->members) { - if (!assignments - .emplace(element_label, - std::make_pair(section_index, *material_index)) - .second) { - InputFailure("duplicate-entity", section.location, - "BEAM GENERAL SECTION", std::to_string(element_label), - "An element cannot receive multiple section " - "assignments."); - return; - } - } - } - for (const auto& element : part.elements) { - if (assignments.find(element.label) == assignments.end()) { - InputFailure( - "unresolved-reference", element.location, "ELEMENT", - element.label_text, - "Every B33 element requires a resolved section assignment."); - return; - } - } - } - } - - std::size_t PartIndex(const RawPart& part) const { - return static_cast(&part - parts_.data()); - } - - bool ValidateGeometry(const RawElement& raw, const Node& first, - const Node& second, const GeneralBeamSection& section) { - const auto maximum_absolute = [](const Vector3& vector) { - return std::max( - {std::abs(vector[0]), std::abs(vector[1]), std::abs(vector[2])}); - }; - const Vector3 first_position{first.coordinates}; - const Vector3 second_position{second.coordinates}; - - // Compare both approved inequalities after a common scaling. This - // preserves the exact ratios while avoiding overflow in x*x and in - // subtraction between large finite coordinates. - const double global_coordinate_scale = - std::max({1.0, maximum_absolute(first_position), - maximum_absolute(second_position)}); - const Vector3 first_scaled = first_position / global_coordinate_scale; - const Vector3 second_scaled = second_position / global_coordinate_scale; - const Vector3 delta_scaled = second_scaled - first_scaled; - const double length_ratio = delta_scaled.Norm(); - const double coordinate_norm_ratio = - std::max({1.0 / global_coordinate_scale, first_scaled.Norm(), - second_scaled.Norm()}); - if (!(length_ratio > 1.0e-12 * coordinate_norm_ratio)) { - return ModelFailure( - "invalid-beam-length", raw.location, "ELEMENT", raw.label_text, - "Beam length fails the approved scale-aware threshold."); - } - const Vector3 tangent = delta_scaled / length_ratio; - - const Vector3 guide{section.first_axis}; - const double global_guide_scale = std::max(1.0, maximum_absolute(guide)); - const Vector3 guide_scaled = guide / global_guide_scale; - const double projection = guide_scaled.Dot(tangent); - const Vector3 perpendicular = guide_scaled - projection * tangent; - const double guide_norm_ratio = - std::max(1.0 / global_guide_scale, guide_scaled.Norm()); - if (!(perpendicular.Norm() > 1.0e-12 * guide_norm_ratio)) { - return ModelFailure( - "invalid-beam-guide-vector", section.location, "BEAM GENERAL SECTION", - raw.label_text, - "The first section axis cannot be zero or tangent-parallel."); - } - return true; - } - - void ExpandInstances() { - for (const auto& raw_instance : instances_) { - const RawPart* part = FindPart(raw_instance.part_name); - if (part == nullptr) { - InputFailure("unresolved-reference", raw_instance.location, "INSTANCE", - raw_instance.name, - "INSTANCE PART must resolve case-insensitively."); - return; - } - InstanceDefinition instance{ - raw_instance.name, part->name, {}, {}, raw_instance.location}; - std::map node_indices; - std::map element_indices; - - // Instance order, followed by part-local declaration order, is the - // sole source of stable expanded internal IDs. - for (const auto& raw_node : part->nodes) { - if (definition_.nodes.size() > - std::numeric_limits::max()) { - InputFailure("entity-index-overflow", raw_node.location, "NODE", - raw_node.label_text, - "Expanded node count exceeds EntityIndex capacity."); - return; - } - const EntityIndex index = - static_cast(definition_.nodes.size()); - definition_.nodes.push_back( - {{raw_instance.name, raw_node.label, raw_node.label_text}, - raw_node.coordinates, - raw_node.location}); - node_indices.emplace(raw_node.label, index); - instance.node_mappings.push_back({raw_node.label, index}); - } - - for (const auto& raw_element : part->elements) { - EntityIndex index = 0U; - if (raw_element.type == RawElement::Type::kB33) { - const auto first = node_indices.find(raw_element.node_labels[0]); - const auto second = node_indices.find(raw_element.node_labels[1]); - const auto& assignments = part_section_assignments_[PartIndex(*part)]; - const auto assignment = assignments.find(raw_element.label); - if (first == node_indices.end() || second == node_indices.end() || - assignment == assignments.end()) { - InputFailure( - "unresolved-reference", raw_element.location, "ELEMENT", - raw_element.label_text, - "Expanded connectivity and section assignment must resolve."); - return; - } - if (definition_.elements.size() > - std::numeric_limits::max()) { - InputFailure( - "entity-index-overflow", raw_element.location, "ELEMENT", - raw_element.label_text, - "Expanded element count exceeds EntityIndex capacity."); - return; - } - index = static_cast(definition_.elements.size()); - const auto& section = definition_.sections[assignment->second.first]; - if (!ValidateGeometry(raw_element, definition_.nodes[first->second], - definition_.nodes[second->second], section)) { - return; - } - definition_.elements.push_back( - {{raw_instance.name, raw_element.label, raw_element.label_text}, - {first->second, second->second}, - assignment->second.second, - assignment->second.first, - raw_element.location}); - } else if (raw_element.type == RawElement::Type::kC3d8) { - std::array connected_nodes{}; - for (std::size_t node = 0U; node < connected_nodes.size(); ++node) { - const auto found = node_indices.find(raw_element.node_labels[node]); - if (found == node_indices.end()) { - InputFailure("invalid-solid-connectivity", raw_element.location, - "ELEMENT", raw_element.label_text, - "Solid nodes must resolve."); - return; - } - connected_nodes[node] = found->second; - } - const auto& assignments = - part_shell_section_assignments_[PartIndex(*part)]; - const auto assignment = assignments.find(raw_element.label); - if (assignment == assignments.end() || - definition_.solid_elements.size() > - std::numeric_limits::max()) { - InputFailure("invalid-solid-section-assignment", - raw_element.location, "ELEMENT", - raw_element.label_text, - "Solid assignment must resolve."); - return; - } - index = static_cast(definition_.solid_elements.size()); - definition_.solid_elements.emplace_back( - SourceEntityId{raw_instance.name, raw_element.label, - raw_element.label_text}, - connected_nodes, assignment->second.second, - assignment->second.first, raw_element.location); - } else { - std::array connected_nodes{}; - for (std::size_t node = 0U; node < connected_nodes.size(); ++node) { - const auto found = node_indices.find(raw_element.node_labels[node]); - if (found == node_indices.end()) { - InputFailure("invalid-shell-connectivity", raw_element.location, - "ELEMENT", raw_element.label_text, - "Expanded shell connectivity must resolve."); - return; - } - connected_nodes[node] = found->second; - } - const auto& assignments = - part_shell_section_assignments_[PartIndex(*part)]; - const auto assignment = assignments.find(raw_element.label); - if (assignment == assignments.end()) { - InputFailure( - "invalid-shell-section-assignment", raw_element.location, - "ELEMENT", raw_element.label_text, - "Expanded shell section assignment must resolve exactly once."); - return; - } - if (raw_element.type == RawElement::Type::kDs4) { - if (definition_.thermal_elements.size() > - std::numeric_limits::max()) { - InputFailure("entity-index-overflow", raw_element.location, - "ELEMENT", raw_element.label_text, - "Expanded thermal element count exceeds EntityIndex " - "capacity."); - return; - } - index = - static_cast(definition_.thermal_elements.size()); - definition_.thermal_elements.push_back( - {{raw_instance.name, raw_element.label, raw_element.label_text}, - connected_nodes, - assignment->second.first, - raw_element.location}); - element_indices.emplace(raw_element.label, index); - instance.element_mappings.push_back({raw_element.label, index}); - continue; - } - if (definition_.shell_elements.size() > - std::numeric_limits::max()) { - InputFailure( - "entity-index-overflow", raw_element.location, "ELEMENT", - raw_element.label_text, - "Expanded shell element count exceeds EntityIndex capacity."); - return; - } - index = static_cast(definition_.shell_elements.size()); - definition_.shell_elements.push_back( - {{raw_instance.name, raw_element.label, raw_element.label_text}, - raw_element.type == RawElement::Type::kS4 - ? ShellSourceElementType::kS4 - : ShellSourceElementType::kS4r, - connected_nodes, - assignment->second.second, - assignment->second.first, - raw_element.location}); - } - element_indices.emplace(raw_element.label, index); - instance.element_mappings.push_back({raw_element.label, index}); - } - - for (const auto& raw_set : part->node_sets) { - NodeSet set{raw_set.name, raw_instance.name, {}, raw_set.location}; - for (const auto member : raw_set.members) { - const auto found = node_indices.find(member); - if (found == node_indices.end()) { - InputFailure("unresolved-reference", raw_set.location, "NSET", - raw_set.name, "Part node-set expansion failed."); - return; - } - set.node_indices.push_back(found->second); - } - definition_.node_sets.push_back(std::move(set)); - } - for (const auto& raw_set : part->element_sets) { - ElementSet set{raw_set.name, raw_instance.name, {}, raw_set.location}; - for (const auto member : raw_set.members) { - const auto found = element_indices.find(member); - if (found == element_indices.end()) { - InputFailure("unresolved-reference", raw_set.location, "ELSET", - raw_set.name, "Part element-set expansion failed."); - return; - } - set.element_indices.push_back(found->second); - } - definition_.element_sets.push_back(std::move(set)); - } - definition_.instances.push_back(std::move(instance)); - } - } - - void ExpandAssemblySets() { - for (const auto& raw_set : assembly_sets_) { - const RawInstance* raw_instance = FindInstance(raw_set.instance_name); - if (raw_instance == nullptr) { - InputFailure("unresolved-reference", raw_set.location, - raw_set.is_node_set ? "NSET" : "ELSET", raw_set.name, - "Assembly set INSTANCE must resolve."); - return; - } - const auto definition_instance = std::find_if( - definition_.instances.begin(), definition_.instances.end(), - [&raw_instance](const InstanceDefinition& instance) { - return AsciiCaseInsensitiveEquals(instance.name, - raw_instance->name); - }); - if (definition_instance == definition_.instances.end()) { - InputFailure("unresolved-reference", raw_set.location, - raw_set.is_node_set ? "NSET" : "ELSET", raw_set.name, - "Assembly set instance expansion is unavailable."); - return; - } - if (raw_set.is_node_set) { - definition_.node_sets.erase( - std::remove_if( - definition_.node_sets.begin(), definition_.node_sets.end(), - [&raw_set](const NodeSet& set) { - return AsciiCaseInsensitiveEquals(set.name, raw_set.name); - }), - definition_.node_sets.end()); - NodeSet set{ - raw_set.name, definition_instance->name, {}, raw_set.location}; - for (const auto member : raw_set.members) { - const auto mapping = - std::find_if(definition_instance->node_mappings.begin(), - definition_instance->node_mappings.end(), - [member](const SourceIndexMapping& value) { - return value.source_label == member; - }); - if (mapping == definition_instance->node_mappings.end()) { - InputFailure("unresolved-reference", raw_set.location, "NSET", - raw_set.name, - "Assembly node-set member must resolve in its " - "instance."); - return; - } - set.node_indices.push_back(mapping->internal_index); - } - definition_.node_sets.push_back(std::move(set)); - } else { - definition_.element_sets.erase( - std::remove_if(definition_.element_sets.begin(), - definition_.element_sets.end(), - [&raw_set](const ElementSet& set) { - return AsciiCaseInsensitiveEquals(set.name, - raw_set.name); - }), - definition_.element_sets.end()); - ElementSet set{ - raw_set.name, definition_instance->name, {}, raw_set.location}; - for (const auto member : raw_set.members) { - const auto mapping = - std::find_if(definition_instance->element_mappings.begin(), - definition_instance->element_mappings.end(), - [member](const SourceIndexMapping& value) { - return value.source_label == member; - }); - if (mapping == definition_instance->element_mappings.end()) { - InputFailure("unresolved-reference", raw_set.location, "ELSET", - raw_set.name, - "Assembly element-set member must resolve in " - "its instance."); - return; - } - set.element_indices.push_back(mapping->internal_index); - } - definition_.element_sets.push_back(std::move(set)); - } - } - } - - bool AppendSurfaceFacet( - const RawSurfaceMember& member, const RawInstance& raw_instance, - std::size_t instance_ordinal, EntityIndex element_index, - SurfaceMemberKind member_kind, const std::string& elset_name_raw, - std::vector>* - candidates) { - const bool thermal = model_element_family_ == ElementFamily::kThermalShell; - const auto element_count = thermal ? definition_.thermal_elements.size() - : definition_.shell_elements.size(); - if (static_cast(element_index) >= element_count) { - return InputFailure( - "unsupported-element-formulation", member.location, "SURFACE", - member.target, - "Element surfaces may resolve only to S4 or S4R shell elements."); - } - const RawPart* part = FindPart(raw_instance.part_name); - if (part == nullptr) { - return InputFailure( - "unresolved-reference", member.location, "SURFACE", member.target, - "The surface instance must resolve to its source part."); - } - const auto& source_id = - thermal ? definition_.thermal_elements[element_index].source_id - : definition_.shell_elements[element_index].source_id; - const std::string source_type = - thermal ? "DS4" - : (definition_.shell_elements[element_index].source_type == - ShellSourceElementType::kS4 - ? "S4" - : "S4R"); - ElementSurfaceFacetDefinition facet{element_index, - 0U, - part->name, - CanonicalizeAscii(part->name), - raw_instance.name, - CanonicalizeAscii(raw_instance.name), - source_id.source_label, - source_id.source_label_text, - source_type, - member.side, - member.location, - member.ordinal, - member_kind, - elset_name_raw, - member_kind == SurfaceMemberKind::kElset - ? CanonicalizeAscii(elset_name_raw) - : ""}; - candidates->push_back({std::move(facet), instance_ordinal}); - return true; - } - - bool ResolveDirectSurfaceMember( - const RawSurfaceMember& member, - std::vector>* - candidates) { - const std::size_t dot = member.target.find('.'); - if (dot == std::string::npos || dot == 0U || - dot + 1U >= member.target.size() || - member.target.find('.', dot + 1U) != std::string::npos) { - return InputFailure( - "unresolved-reference", member.location, "SURFACE", member.target, - "A direct surface member must be instance.positive-element-label."); - } - const std::string instance_name = member.target.substr(0U, dot); - if (!IsPressureNameToken(instance_name)) { - return InputFailure( - "unsupported-surface-target", member.location, "SURFACE", - member.target, - "A direct surface member must use an identity instance name."); - } - std::int64_t source_label = 0; - if (!ParseInteger(member.target.substr(dot + 1U), source_label, - member.location, "SURFACE", true)) { - return false; - } - const auto raw_instance = std::find_if( - instances_.begin(), instances_.end(), - [&instance_name](const RawInstance& value) { - return AsciiCaseInsensitiveEquals(value.name, instance_name); - }); - if (raw_instance == instances_.end()) { - if (FindPart(instance_name) != nullptr) { - return InputFailure( - "unsupported-surface-target", member.location, "SURFACE", - member.target, - "A direct surface member cannot use a part name as an instance."); - } - return InputFailure("unresolved-reference", member.location, "SURFACE", - member.target, - "A direct surface member instance must resolve."); - } - const auto instance = std::find_if( - definition_.instances.begin(), definition_.instances.end(), - [&raw_instance](const InstanceDefinition& value) { - return AsciiCaseInsensitiveEquals(value.name, raw_instance->name); - }); - const auto element = std::find_if( - instance->element_mappings.begin(), instance->element_mappings.end(), - [source_label](const SourceIndexMapping& value) { - return value.source_label == source_label; - }); - if (element == instance->element_mappings.end()) { - return InputFailure( - "unresolved-reference", member.location, "SURFACE", member.target, - "A direct surface member must resolve to a supported shell element."); - } - return AppendSurfaceFacet(member, *raw_instance, - static_cast(std::distance( - instances_.begin(), raw_instance)), - element->internal_index, - SurfaceMemberKind::kDirect, "", candidates); - } - - bool ResolveElsetSurfaceMember( - const RawSurfaceMember& member, - std::vector>* - candidates) { - if (!IsPressureNameToken(member.target)) { - return InputFailure("unsupported-surface-target", member.location, - "SURFACE", member.target, - "A surface ELSET must use the approved name syntax."); - } - const auto raw_set = std::find_if( - assembly_sets_.begin(), assembly_sets_.end(), - [&member](const RawAssemblySet& value) { - return !value.is_node_set && - AsciiCaseInsensitiveEquals(value.name, member.target); - }); - if (raw_set == assembly_sets_.end()) { - const bool part_scoped = std::any_of( - parts_.begin(), parts_.end(), [this, &member](const RawPart& part) { - return FindSet(part.element_sets, member.target) != nullptr; - }); - if (part_scoped) { - return InputFailure( - "cross-scope-target", member.location, "SURFACE", member.target, - "A surface ELSET must be declared at assembly scope."); - } - return InputFailure( - "missing-reference", member.location, "SURFACE", member.target, - "A surface ELSET must be assembly-scoped and explicit-instance."); - } - const auto raw_instance = std::find_if( - instances_.begin(), instances_.end(), - [&raw_set](const RawInstance& value) { - return AsciiCaseInsensitiveEquals(value.name, raw_set->instance_name); - }); - if (raw_instance == instances_.end()) { - return InputFailure("unresolved-reference", member.location, "SURFACE", - member.target, - "The surface ELSET instance must resolve."); - } - const auto element_set = std::find_if( - definition_.element_sets.begin(), definition_.element_sets.end(), - [&raw_set](const ElementSet& value) { - return AsciiCaseInsensitiveEquals(value.name, raw_set->name) && - value.instance_name && - AsciiCaseInsensitiveEquals(*value.instance_name, - raw_set->instance_name); - }); - if (element_set == definition_.element_sets.end()) { - return InputFailure( - "unresolved-reference", member.location, "SURFACE", member.target, - "The surface ELSET must expand in its explicit instance."); - } - for (const EntityIndex element_index : element_set->element_indices) { - if (!AppendSurfaceFacet(member, *raw_instance, - static_cast(std::distance( - instances_.begin(), raw_instance)), - element_index, SurfaceMemberKind::kElset, - member.target, candidates)) { - return false; - } - } - return true; - } - - void ResolveElementSurfaces() { - std::vector resolved_surfaces; - resolved_surfaces.reserve(element_surfaces_.size()); - for (const auto& surface : element_surfaces_) { - std::vector> - candidates; - for (const auto& member : surface.members) { - const bool is_direct = member.target.find('.') != std::string::npos; - if (!(is_direct ? ResolveDirectSurfaceMember(member, &candidates) - : ResolveElsetSurfaceMember(member, &candidates))) { - return; - } - } - if (candidates.empty()) { - InputFailure("empty-surface", surface.location, "SURFACE", surface.name, - "An element surface must resolve at least one facet."); - return; - } - - std::vector> - unique_facets; - for (auto& candidate : candidates) { - const auto same_element = - std::find_if(unique_facets.begin(), unique_facets.end(), - [&candidate](const auto& existing) { - return existing.first.instance_name_canonical == - candidate.first.instance_name_canonical && - existing.first.source_element_label == - candidate.first.source_element_label; - }); - if (same_element != unique_facets.end()) { - if (same_element->first.side != candidate.first.side) { - InputFailure( - "conflicting-surface-membership", - candidate.first.first_member_location, "SURFACE", surface.name, - "One shell element cannot appear on both surface sides."); - return; - } - if (model_element_family_ != ElementFamily::kThermalShell) { - definition_.warnings.push_back( - {Severity::kWarning, "duplicate-surface-member-normalized", - candidate.first.first_member_location, "SURFACE", surface.name, - "A repeated same-side surface member was normalized once."}); - } - continue; - } - unique_facets.push_back(std::move(candidate)); - } - std::sort(unique_facets.begin(), unique_facets.end(), - [](const auto& lhs, const auto& rhs) { - const int lhs_side = - lhs.first.side == ShellSurfaceSide::kSpos ? 0 : 1; - const int rhs_side = - rhs.first.side == ShellSurfaceSide::kSpos ? 0 : 1; - return std::tie(lhs.second, lhs.first.source_element_label, - lhs_side) < - std::tie(rhs.second, rhs.first.source_element_label, - rhs_side); - }); - - ElementSurfaceDefinition resolved{surface.name, - CanonicalizeAscii(surface.name), - {}, - surface.location, - surface.declaration_ordinal}; - resolved.facets.reserve(unique_facets.size()); - for (std::size_t ordinal = 0U; ordinal < unique_facets.size(); - ++ordinal) { - unique_facets[ordinal].first.facet_ordinal = ordinal; - resolved.facets.push_back(std::move(unique_facets[ordinal].first)); - } - resolved_surfaces.push_back(std::move(resolved)); - } - definition_.element_surfaces = std::move(resolved_surfaces); - } - - /// @brief Builds one stable node-target index from the completed candidate. - SourceTargetIndex BuildSourceTargetIndex() const { - std::vector entries; - std::size_t declaration_order = 0U; - for (std::size_t node = 0U; node < definition_.nodes.size(); ++node) { - const auto& source_id = definition_.nodes[node].source_id; - entries.push_back({SourceEntityKind::kNode, source_id.instance_name, "", - source_id, static_cast(node), - declaration_order++}); - } - for (const auto& set : definition_.node_sets) { - for (const EntityIndex node : set.node_indices) { - const auto& source_id = definition_.nodes[node].source_id; - entries.push_back({SourceEntityKind::kNode, - set.instance_name.value_or(source_id.instance_name), - set.name, source_id, node, declaration_order++}); - } - } - return SourceTargetIndex{std::move(entries)}; - } - - std::optional> ResolveNodeTarget( - const SourceTargetResolver& resolver, const std::string& target, - const SourceLocation& location, const std::string& keyword) { - auto resolved = resolver.Resolve({SourceEntityKind::kNode, "", target}); - if (!resolved.HasValue()) { - InputFailure( - "unresolved-reference", location, keyword, target, - "The boundary or load target must resolve unambiguously to one " - "node or one node set."); - return std::nullopt; - } - std::vector indices; - indices.reserve(resolved.Value().size()); - for (const auto& entry : resolved.Value()) { - if (model_element_family_ == ElementFamily::kThermalShell && - !thermal_active_nodes_[entry.entity_index]) { - ModelFailure("inactive-thermal-target", location, keyword, target, - "Thermal targets must connect to an active DS4 element."); - return std::nullopt; - } - indices.push_back(entry.entity_index); - } - return indices; - } - - void FinalizeStep() { - if (step_.has_heat_transfer) { - thermal_active_nodes_.assign(definition_.nodes.size(), false); - for (const auto& element : definition_.thermal_elements) - for (const auto node : element.node_indices) - thermal_active_nodes_[node] = true; - const SourceTargetIndex target_index = BuildSourceTargetIndex(); - const SourceTargetResolver resolver{target_index}; - const auto append_boundaries = - [this, &resolver]( - const std::vector& rows, - std::map, double>* values, - std::vector* out) { - for (const auto& row : rows) { - const auto nodes = ResolveNodeTarget(resolver, row.target, - row.location, "BOUNDARY"); - if (!nodes) return false; - for (const EntityIndex node : *nodes) { - const auto key = std::make_pair(node, row.dof); - const auto existing = values->find(key); - if (existing != values->end() && - existing->second != row.value) { - return InputFailure("conflicting-boundary-condition", - row.location, "BOUNDARY", row.target, - "Expanded thermal boundaries prescribe " - "different values."); - } - (*values)[key] = row.value; - out->push_back({node, row.dof, row.value, row.location}); - } - } - return true; - }; - std::map, double> model_values; - if (!append_boundaries(thermal_model_boundaries_, &model_values, - &definition_.thermal_model_boundaries)) - return; - std::vector step_boundaries; - std::map, double> step_values; - if (!append_boundaries(step_.thermal_boundaries, &step_values, - &step_boundaries)) - return; - std::map initial_values; - for (const auto& row : thermal_initial_conditions_) { - const auto nodes = ResolveNodeTarget(resolver, row.target, row.location, - "INITIAL CONDITIONS"); - if (!nodes) return; - for (const EntityIndex node : *nodes) { - const auto inserted = initial_values.emplace(node, row.value); - if (!inserted.second && inserted.first->second != row.value) { - InputFailure( - "conflicting-initial-temperature", row.location, - "INITIAL CONDITIONS", row.target, - "Expanded initial temperatures prescribe different values."); - return; - } - definition_.thermal_initial_conditions.push_back( - {node, row.value, row.location}); - } - } - std::vector loads; - for (const auto& row : step_.thermal_fluxes) { - const auto nodes = - ResolveNodeTarget(resolver, row.target, row.location, "CFLUX"); - if (!nodes) return; - for (const EntityIndex node : *nodes) { - loads.push_back( - {node, row.dof, row.power, row.location, loads.size()}); - } - } - definition_.thermal_step = {step_.name_raw, - step_.thermal_increment, - step_.thermal_period, - step_.maximum_increments, - false, - std::move(step_boundaries), - std::move(loads), - step_.location}; - return; - } - std::vector boundaries = - model_boundaries_; - boundaries.insert(boundaries.end(), step_.boundaries.begin(), - step_.boundaries.end()); - if (step_.frequency) { - ValidateEigenBoundaries(boundaries); - if (failure_) { - return; - } - } - if (step_.dynamic) { - ValidateDynamicBoundaries(boundaries); - if (failure_) { - return; - } - } - const SourceTargetIndex target_index = BuildSourceTargetIndex(); - const SourceTargetResolver target_resolver{target_index}; - - if (model_element_family_ == ElementFamily::kSolid) { - std::vector physical; - for (auto boundary : boundaries) { - if (!ResolveNodeTarget(target_resolver, boundary.target, - boundary.location, "BOUNDARY")) - return; - if (boundary.last_dof > 3) { - if (boundary.value != 0.0) { - InputFailure("unsupported-solid-rotation-boundary", - boundary.location, "BOUNDARY", boundary.target, - "Solid rotational boundaries must be exact zero to be " - "inactive."); - return; - } - definition_.warnings.push_back( - {Severity::kWarning, "inactive-solid-rotation-boundary", - boundary.location, "BOUNDARY", boundary.target, - "Exact-zero rotational boundary DOFs " + - std::to_string(std::max(4, boundary.first_dof)) + ".." + - std::to_string(boundary.last_dof) + - " are inactive; Solid equations contain translations " - "only."}); - boundary.last_dof = 3; - } - if (boundary.first_dof <= boundary.last_dof) - physical.push_back(std::move(boundary)); - } - boundaries = std::move(physical); - std::vector active(definition_.nodes.size(), false); - for (const auto& element : definition_.solid_elements) - for (const auto node : element.node_indices) active[node] = true; - for (std::size_t node = 0U; node < active.size(); ++node) { - if (!active[node]) { - ModelFailure("unused-solid-node", definition_.nodes[node].location, - "NODE", - definition_.nodes[node].source_id.source_label_text, - "Every Solid node must connect to a C3D8 element."); - return; - } - } - } - std::map, double> prescribed_values; - for (const auto& boundary : boundaries) { - auto target = ResolveNodeTarget(target_resolver, boundary.target, - boundary.location, "BOUNDARY"); - if (!target) { - return; - } - for (const auto node : *target) { - for (int dof = boundary.first_dof; dof <= boundary.last_dof; ++dof) { - const auto key = std::make_pair(node, dof); - const auto existing = prescribed_values.find(key); - if (existing != prescribed_values.end() && - existing->second != boundary.value) { - InputFailure("conflicting-boundary-condition", boundary.location, - "BOUNDARY", boundary.target, - "Expanded boundary rows prescribe different values to " - "one node/DOF."); - return; - } - prescribed_values[key] = boundary.value; - } - } - } - for (const auto& load : step_.loads) { - if (!ResolveNodeTarget(target_resolver, load.target, load.location, - "CLOAD")) { - return; - } - } - if (step_.frequency) { - step_.frequency->boundaries = std::move(boundaries); - definition_.frequency_step = std::move(step_.frequency); - return; - } - if (step_.dynamic) { - step_.dynamic->boundaries = std::move(boundaries); - step_.dynamic->loads = step_.loads; - definition_.dynamic_step = std::move(step_.dynamic); - return; - } - std::vector surface_pressure_loads; - surface_pressure_loads.reserve(step_.surface_pressure_loads.size()); - for (const auto& load : step_.surface_pressure_loads) { - const auto surface = std::find_if( - definition_.element_surfaces.begin(), - definition_.element_surfaces.end(), [&load](const auto& candidate) { - return AsciiCaseInsensitiveEquals(candidate.surface_name_raw, - load.surface_name); - }); - if (surface == definition_.element_surfaces.end()) { - InputFailure("missing-reference", load.data_location, "DSLOAD", - load.surface_name, - "A DSLOAD surface must resolve after surface validation."); - return; - } - surface_pressure_loads.push_back( - {step_.name_raw, step_.name_canonical, - static_cast( - std::distance(definition_.element_surfaces.begin(), surface)), - load.surface_name, CanonicalizeAscii(load.surface_name), "P", - load.magnitude, load.magnitude_raw, load.keyword_location, - load.data_location, load.data_ordinal, load.load_ordinal}); - } - - // Static time-control values are provenance only: V0 creates exactly - // the canonical final frame 0 and performs no increment loop here. - definition_.steps.push_back( - {model_element_family_ == ElementFamily::kSolid ? step_.name_raw - : "Step-1", - std::move(boundaries), step_.loads, std::move(surface_pressure_loads), - step_.procedure_kind, step_.nlgeom, step_.static_values[0], - step_.static_values[1], step_.static_values[2], step_.static_values[3], - step_.location}); - definition_.steps.back().direct = step_.static_direct; - definition_.steps.back().increment_count = step_.static_increment_count; - definition_.steps.back().maximum_increments = step_.maximum_increments; - } - const ParsedInput& input_; ModelDefinition definition_{}; - std::optional failure_; - std::vector parts_; - std::vector instances_; - std::vector assembly_sets_; - std::vector element_surfaces_; - std::vector materials_; - std::vector model_boundaries_; - std::vector thermal_model_boundaries_; - std::vector thermal_initial_conditions_; - std::vector thermal_active_nodes_; - RawStep step_{}; - std::vector>> - part_section_assignments_; - std::vector>> - part_shell_section_assignments_; + TopologyCandidates topology_{*this}; std::optional current_part_; - std::optional pending_section_; - std::optional material_eligible_; std::optional model_element_family_; + MaterialPropertyCandidates material_properties_{*this, input_, + model_element_family_}; + SurfaceDefinitionCandidates surfaces_{*this, topology_, model_element_family_, + definition_}; + StepDefinitionCandidates steps_{*this, input_, model_element_family_, + definition_}; bool heading_seen_{false}; bool part_elements_seen_{false}; bool part_sets_seen_{false}; @@ -4591,12 +1238,6 @@ class DomainMappingContext::Impl { bool model_boundary_seen_{false}; bool in_assembly_{false}; bool in_instance_{false}; - bool step_seen_{false}; - bool in_step_{false}; - bool step_load_seen_{false}; - bool step_no_op_seen_{false}; - bool active_output_{false}; - bool active_output_is_field_{false}; std::optional physical_constants_location_; }; diff --git a/src/fesa/io/abaqus/input_reader.cpp b/src/fesa/io/abaqus/input_reader.cpp index 44ae217..a8410c7 100644 --- a/src/fesa/io/abaqus/input_reader.cpp +++ b/src/fesa/io/abaqus/input_reader.cpp @@ -12,6 +12,8 @@ #include #include +#include "fesa/core/ascii.h" + namespace fesa { namespace { @@ -40,16 +42,6 @@ std::string Trim(std::string_view text) { return std::string{text}; } -std::string UppercaseAscii(std::string value) { - std::transform(value.begin(), value.end(), value.begin(), [](char character) { - if (character >= 'a' && character <= 'z') { - return static_cast(character - 'a' + 'A'); - } - return character; - }); - return value; -} - std::vector SplitFields(std::string_view line) { std::vector fields; std::size_t field_start = 0U; @@ -88,13 +80,14 @@ bool AppendKeywordParameters(KeywordBlock& block, } const std::size_t equals = field.find('='); - const std::string parameter_name = + std::string parameter_name = Trim(std::string_view{field}.substr(0U, equals)); if (parameter_name.empty()) { return false; } - KeywordParameter parameter{UppercaseAscii(parameter_name), std::nullopt}; + KeywordParameter parameter{AsciiUppercase(std::move(parameter_name)), + std::nullopt}; if (equals != std::string::npos) { parameter.value = Trim(std::string_view{field}.substr(equals + 1U)); } @@ -132,8 +125,10 @@ Result Failure(const std::filesystem::path& source_path, std::move(keyword), "", std::move(message)}; + std::vector diagnostics; + diagnostics.push_back(std::move(diagnostic)); return Result::Failure( - Status::Failure(FailureCategory::kInput, {std::move(diagnostic)})); + Status::Failure(FailureCategory::kInput, std::move(diagnostics))); } } // namespace @@ -182,8 +177,9 @@ Result AbaqusInputReader::Read( } } + std::string trimmed_line = Trim(original_line); physical_lines.push_back( - {original_line, Trim(original_line), line_number}); + {std::move(original_line), std::move(trimmed_line), line_number}); if (newline == std::string::npos) { break; @@ -209,7 +205,7 @@ Result AbaqusInputReader::Read( "A keyword line requires a non-empty keyword name."); } - KeywordBlock block{UppercaseAscii(keyword_text), + KeywordBlock block{AsciiUppercase(keyword_text), line.original_line, {line.original_line}, {}, diff --git a/src/fesa/io/abaqus/mapping_diagnostics.h b/src/fesa/io/abaqus/mapping_diagnostics.h new file mode 100644 index 0000000..1a66a99 --- /dev/null +++ b/src/fesa/io/abaqus/mapping_diagnostics.h @@ -0,0 +1,105 @@ +#ifndef FESA_IO_ABAQUS_MAPPING_DIAGNOSTICS_H_ +#define FESA_IO_ABAQUS_MAPPING_DIAGNOSTICS_H_ + +#include +#include +#include +#include + +#include "fesa/core/status.h" +#include "fesa/io/abaqus/input_syntax.h" + +namespace fesa::abaqus_internal { + +struct MappingFailure { + FailureCategory category; + Diagnostic diagnostic; +}; + +/// @brief Drops only trailing empty syntax fields without changing interior fields. +std::vector WithoutTrailingEmpty(std::vector fields); + +/// @brief Retains the first mapping failure and shared lexical validation. +/// @note Mapping stage candidates borrow this context-owned service. +class MappingDiagnostics { + public: + /// @brief Reports whether a previous mapping stage retained a failure. + bool HasFailure() const noexcept { return failure_.has_value(); } + + /// @brief Reports the existing unsupported-keyword policy for this model + /// family. + void RejectUnknown(const KeywordBlock& block, bool shell_model); + + /// @brief Copies the retained first failure or returns successful mapping + /// status. + Status CurrentStatus() const; + + /// @brief Retains the first diagnostic of a failed nonempty stage status. + void RecordFailure(const Status& status); + + /// @brief Borrows one canonical parameter from its source keyword block. + const KeywordParameter* Parameter(const KeywordBlock& block, + std::string_view name) const; + + /// @brief Retains one diagnostic only if no earlier mapping failure exists. + bool Fail(FailureCategory category, std::string code, + const SourceLocation& location, std::string keyword, + std::string entity_identity, std::string message); + + /// @brief Retains the first input-category diagnostic. + bool InputFailure(std::string code, const SourceLocation& location, + std::string keyword, std::string entity_identity, + std::string message); + + /// @brief Retains the first model-category diagnostic. + bool ModelFailure(std::string code, const SourceLocation& location, + std::string keyword, std::string entity_identity, + std::string message); + + /// @brief Reports a keyword outside its approved source scope. + bool InvalidKeywordLocation(const KeywordBlock& block, std::string message); + + /// @brief Rejects duplicate or unsupported parameters in declaration order. + bool ValidateParameters( + const KeywordBlock& block, const std::vector& allowed, + std::string_view unsupported_code = "invalid-keyword-parameter"); + + /// @brief Borrows a required nonempty value from its source keyword block. + const std::string* RequiredParameterValue(const KeywordBlock& block, + std::string_view name); + + /// @brief Rejects the first source row of a data-free keyword. + bool RequireNoData(const KeywordBlock& block); + + /// @brief Parses the existing base-10 scalar policy with contextual + /// diagnostics. + bool ParseInteger(const std::string& text, std::int64_t& value, + const SourceLocation& location, const std::string& keyword, + bool positive); + + /// @brief Parses finite structural scalars with the existing input failure + /// policy. + bool ParseDouble(const std::string& text, double& value, + const SourceLocation& location, const std::string& keyword); + + /// @brief Parses thermal decimal scalars while preserving representable + /// subnormals. + bool ParseThermalDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword); + + /// @brief Distinguishes malformed syntax from nonfinite model property + /// values. + bool ParseModelDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword, + const std::string& diagnostic_code, + const std::string& message); + + protected: + std::optional failure_; +}; + +} // namespace fesa::abaqus_internal + +#endif // FESA_IO_ABAQUS_MAPPING_DIAGNOSTICS_H_ diff --git a/src/fesa/io/abaqus/material_property_candidates.h b/src/fesa/io/abaqus/material_property_candidates.h new file mode 100644 index 0000000..de7297b --- /dev/null +++ b/src/fesa/io/abaqus/material_property_candidates.h @@ -0,0 +1,185 @@ +#ifndef FESA_IO_ABAQUS_MATERIAL_PROPERTY_CANDIDATES_H_ +#define FESA_IO_ABAQUS_MATERIAL_PROPERTY_CANDIDATES_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/model/model_types.h" +#include "io/abaqus/mapping_diagnostics.h" + +namespace fesa::abaqus_internal { + +enum class ElementFamily; +struct RawPart; + +struct RawSection { + std::string element_set_name; + std::string material_name; + std::array properties; + std::array first_axis; + std::vector> section_points; + SourceLocation location; +}; + +struct RawShellSection { + std::string element_set_name; + std::string material_name; + double thickness; + SourceLocation location; +}; + +struct RawSolidSection { + std::string element_set_name; + std::string material_name; + SourceLocation location; +}; + +/// @brief Owns source section candidates for one part before resolution. +struct PartPropertyCandidates { + std::vector sections; + std::vector shell_sections; + std::vector solid_sections; +}; + +/// @brief Supplies procedure policy without giving material mapping step state. +struct MaterialProcedureView { + struct Surface { + SourceLocation location; + std::string name; + }; + bool frequency; + bool dynamic; + const SourceLocation& location; + const std::string& name_raw; + std::optional first_surface; + const std::optional& physical_constants_location; +}; + +/// @brief Owns material candidates, their validation, and section assignments. +/// @note The context-owned diagnostics, input, and family outlive this object. +class MaterialPropertyCandidates { + public: + using Assignments = + std::map>; + + /// @brief Borrows context services while owning this uncommitted mapping + /// stage. + MaterialPropertyCandidates(MappingDiagnostics& diagnostics, + const ParsedInput& input, + const std::optional& family) + : diagnostics_{diagnostics}, + input_{input}, + model_element_family_{family} {} + + /// @brief Returns the source material declaration count. + std::size_t Count() const noexcept { return materials_.size(); } + /// @brief Reports whether no source material has been declared. + bool Empty() const noexcept { return materials_.empty(); } + /// @brief Reports whether a material child may follow the current + /// declaration. + bool HasActiveMaterial() const noexcept { + return material_eligible_.has_value(); + } + /// @brief Ends the optional section-point continuation scope. + void EndSection() noexcept { pending_section_.reset(); } + /// @brief Ends the material-child continuation scope. + void EndMaterial() noexcept { material_eligible_.reset(); } + /// @brief Borrows resolved beam section and material indices for one part. + const Assignments& BeamAssignments(std::size_t part) const { + return part_section_assignments_[part]; + } + /// @brief Borrows resolved shell or solid property and material indices for + /// one part. + const Assignments& ShellAssignments(std::size_t part) const { + return part_shell_section_assignments_[part]; + } + + /// @brief Parses material-only solid assignments without introducing + /// thickness. + void ParseSolidSection(const KeywordBlock& block, + PartPropertyCandidates& properties); + + /// @brief Parses centered shell thickness and source integration-point + /// metadata. + void ParseShellSection(const KeywordBlock& block, + PartPropertyCandidates& properties); + + /// @brief Parses general beam properties and their global guide vector. + void ParseBeamSection(const KeywordBlock& block, + PartPropertyCandidates& properties); + + /// @brief Parses optional beam stress points in the active section scope. + void ParseSectionPoints(const KeywordBlock& block, + PartPropertyCandidates& properties); + + /// @brief Starts one source material after syntax ordering has been checked. + void ParseMaterial(const KeywordBlock& block); + + /// @brief Parses an elastic row without conflating beam and shell material + /// ranges. + void ParseElastic(const KeywordBlock& block); + + /// @brief Parses positive finite density with its source-specific failure + /// policy. + void ParseDensity(const KeywordBlock& block); + + /// @brief Parses constant conductivity or specific heat in the thermal + /// subset. + void ParseThermalProperty(const KeywordBlock& block, bool conductivity); + + /// @brief Appends validated material definitions in source order. + void FinalizeMaterials(ModelDefinition& definition); + + /// @brief Validates part references and unique section/material assignments. + void FinalizePartsAndSections(const std::vector& parts, + ModelDefinition& definition); + + /// @brief Checks procedure policy before appending active material densities. + void FinalizeDensities(const MaterialProcedureView& procedure, + ModelDefinition& definition); + + private: + struct RawMaterial { + std::string name; + double youngs_modulus{0.0}; + double poisson_ratio{0.0}; + bool has_elastic{false}; + std::optional density; + std::optional conductivity; + std::optional specific_heat; + SourceLocation location; + SourceLocation elastic_location; + SourceLocation density_location; + }; + + bool ParseDensityValue(const std::string& text, double& value, + const SourceLocation& location); + + std::optional FindMaterialIndex(const std::string& name) const; + + void ValidateFrequencyPreprint(ModelDefinition& definition); + + void ValidateDynamicPreprint(); + + bool ContainsName(const std::vector& values, + const std::string& name) const; + + MappingDiagnostics& diagnostics_; + const ParsedInput& input_; + const std::optional& model_element_family_; + std::vector materials_; + std::optional material_eligible_; + std::optional pending_section_; + std::vector part_section_assignments_; + std::vector part_shell_section_assignments_; +}; + +} // namespace fesa::abaqus_internal + +#endif // FESA_IO_ABAQUS_MATERIAL_PROPERTY_CANDIDATES_H_ diff --git a/src/fesa/io/abaqus/material_property_mapper.cpp b/src/fesa/io/abaqus/material_property_mapper.cpp index 84cdc2b..82b4351 100644 --- a/src/fesa/io/abaqus/material_property_mapper.cpp +++ b/src/fesa/io/abaqus/material_property_mapper.cpp @@ -1,9 +1,927 @@ #include "io/abaqus/material_property_mapper.h" +#include +#include +#include +#include +#include + +#include "fesa/core/ascii.h" #include "io/abaqus/domain_mapping_context.h" +#include "io/abaqus/material_property_candidates.h" +#include "io/abaqus/topology_candidates.h" namespace fesa::abaqus_internal { +void MaterialPropertyCandidates::ParseMaterial(const KeywordBlock& block) { + if (!diagnostics_.ValidateParameters(block, {"NAME"}) || + !diagnostics_.RequireNoData(block)) { + return; + } + const auto* name = diagnostics_.RequiredParameterValue(block, "NAME"); + if (name == nullptr) { + return; + } + if (ContainsName(materials_, *name)) { + diagnostics_.InputFailure("duplicate-entity", block.location, + block.canonical_name, *name, + "Material names are globally unique."); + return; + } + materials_.push_back({*name, + 0.0, + 0.0, + false, + std::nullopt, + std::nullopt, + std::nullopt, + block.location, + {}, + {}}); + material_eligible_ = materials_.size() - 1U; +} + +void MaterialPropertyCandidates::ParseElastic(const KeywordBlock& block) { + if (model_element_family_ == ElementFamily::kThermalShell) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "ELASTIC is outside the thermal material subset."); + return; + } + if (!material_eligible_) { + diagnostics_.InputFailure("invalid-keyword-location", block.location, + block.canonical_name, "", + "ELASTIC must immediately follow MATERIAL."); + return; + } + if (!diagnostics_.ValidateParameters(block, {}) || block.data.size() != 1U || + block.data[0].fields.size() != 2U) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure("invalid-data-arity", block.location, + block.canonical_name, + materials_[*material_eligible_].name, + "ELASTIC requires exactly one E, nu row."); + } + return; + } + RawMaterial& material = materials_[*material_eligible_]; + if (material.has_elastic) { + diagnostics_.InputFailure("duplicate-entity", block.location, + block.canonical_name, material.name, + "A material accepts one ELASTIC definition."); + return; + } + if (!diagnostics_.ParseModelDouble( + block.data[0].fields[0], material.youngs_modulus, + block.data[0].location, block.canonical_name, + model_element_family_ == ElementFamily::kSolid + ? "invalid-solid-material" + : model_element_family_ == ElementFamily::kShell + ? "invalid-shell-material" + : "invalid-beam-property", + "Elastic material values must be finite.") || + !diagnostics_.ParseModelDouble( + block.data[0].fields[1], material.poisson_ratio, + block.data[0].location, block.canonical_name, + model_element_family_ == ElementFamily::kSolid + ? "invalid-solid-material" + : model_element_family_ == ElementFamily::kShell + ? "invalid-shell-material" + : "invalid-beam-property", + "Elastic material values must be finite.")) { + return; + } + material.has_elastic = true; + material.elastic_location = block.data[0].location; +} + +bool MaterialPropertyCandidates::ParseDensityValue( + const std::string& text, double& value, const SourceLocation& location) { + const std::string canonical = AsciiUppercase(text); + if (canonical == "NAN" || canonical == "+NAN" || canonical == "-NAN" || + canonical == "INF" || canonical == "+INF" || canonical == "-INF" || + canonical == "INFINITY" || canonical == "+INFINITY" || + canonical == "-INFINITY") { + return diagnostics_.ModelFailure( + "invalid-material-density", location, "DENSITY", text, + "Density must convert to a finite value greater than zero."); + } + std::size_t cursor = 0U; + if (cursor < text.size() && (text[cursor] == '+' || text[cursor] == '-')) { + ++cursor; + } + const std::size_t integer_start = cursor; + while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { + ++cursor; + } + const bool has_integer_digits = cursor != integer_start; + bool has_fraction_digits = false; + if (cursor < text.size() && text[cursor] == '.') { + ++cursor; + const std::size_t fraction_start = cursor; + while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { + ++cursor; + } + has_fraction_digits = cursor != fraction_start; + } + if (!has_integer_digits && !has_fraction_digits) { + return diagnostics_.InputFailure( + "invalid-density-data", location, "DENSITY", text, + "Density requires C-locale decimal syntax."); + } + if (cursor < text.size() && (text[cursor] == 'E' || text[cursor] == 'e')) { + ++cursor; + if (cursor < text.size() && (text[cursor] == '+' || text[cursor] == '-')) { + ++cursor; + } + const std::size_t exponent_start = cursor; + while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { + ++cursor; + } + if (cursor == exponent_start) { + return diagnostics_.InputFailure( + "invalid-density-data", location, "DENSITY", text, + "Density exponents require one or more digits."); + } + } + if (cursor != text.size()) { + return diagnostics_.InputFailure( + "invalid-density-data", location, "DENSITY", text, + "Density requires C-locale decimal syntax."); + } + const char* begin = text.data(); + if (*begin == '+') { + ++begin; + } + double parsed = 0.0; + const auto conversion = std::from_chars(begin, text.data() + text.size(), + parsed, std::chars_format::general); + if (conversion.ec != std::errc{} || + conversion.ptr != text.data() + text.size() || !std::isfinite(parsed) || + !(parsed > 0.0)) { + return diagnostics_.ModelFailure( + "invalid-material-density", location, "DENSITY", text, + "Density must convert to a finite value greater than zero."); + } + value = parsed; + return true; +} + +void MaterialPropertyCandidates::ParseDensity(const KeywordBlock& block) { + if (!material_eligible_) { + diagnostics_.InputFailure("invalid-density-data", block.location, + block.canonical_name, "", + "DENSITY must be declared inside one MATERIAL."); + return; + } + if (!diagnostics_.ValidateParameters(block, {}, + "unsupported-density-option")) { + return; + } + RawMaterial& material = materials_[*material_eligible_]; + if (material.density) { + diagnostics_.InputFailure("duplicate-density", block.location, + block.canonical_name, material.name, + "A material accepts one DENSITY definition."); + return; + } + if (block.data.size() != 1U || + (block.data[0].fields.size() != 1U && + (block.data[0].fields.size() != 2U || + !block.data[0].fields[1].empty())) || + block.data[0].fields[0].empty()) { + diagnostics_.InputFailure("invalid-density-data", block.location, + block.canonical_name, material.name, + "DENSITY requires exactly rho or rho,."); + return; + } + double rho = 0.0; + if (!ParseDensityValue(block.data[0].fields[0], rho, + block.data[0].location)) { + return; + } + material.density = rho; + material.density_location = block.data[0].location; +} + +void MaterialPropertyCandidates::ParseThermalProperty(const KeywordBlock& block, + bool conductivity) { + if (model_element_family_ != ElementFamily::kThermalShell || + !material_eligible_ || !diagnostics_.ValidateParameters(block, {})) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure("invalid-keyword-location", block.location, + block.canonical_name, "", + "Thermal properties belong to a DS4 material."); + } + return; + } + RawMaterial& material = materials_[*material_eligible_]; + std::optional& destination = + conductivity ? material.conductivity : material.specific_heat; + if (destination || block.data.size() != 1U || + (block.data[0].fields.size() != 1U && + (block.data[0].fields.size() != 2U || + !block.data[0].fields[1].empty()))) { + diagnostics_.InputFailure("invalid-data-arity", block.location, + block.canonical_name, material.name, + "Thermal property requires one constant row."); + return; + } + double value = 0.0; + if (!diagnostics_.ParseThermalDouble(block.data[0].fields[0], value, + block.data[0].location, + block.canonical_name) || + !(value > 0.0)) { + if (!diagnostics_.HasFailure()) { + diagnostics_.ModelFailure( + "invalid-thermal-material", block.data[0].location, + block.canonical_name, material.name, + "Thermal material values must be finite and positive."); + } + return; + } + destination = value; +} + +std::optional MaterialPropertyCandidates::FindMaterialIndex( + const std::string& name) const { + for (std::size_t index = 0U; index < materials_.size(); ++index) { + if (AsciiCaseInsensitiveEquals(materials_[index].name, name)) { + return static_cast(index); + } + } + return std::nullopt; +} + +void MaterialPropertyCandidates::FinalizeMaterials( + ModelDefinition& definition) { + for (const auto& material : materials_) { + if (model_element_family_ == ElementFamily::kThermalShell) { + if (!material.density || !material.conductivity || + !material.specific_heat) { + diagnostics_.ModelFailure( + "missing-thermal-material-property", material.location, "MATERIAL", + material.name, + "DS4 materials require DENSITY, CONDUCTIVITY, and " + "SPECIFIC HEAT."); + return; + } + definition.thermal_materials.push_back({{"", 0, material.name}, + material.name, + *material.conductivity, + *material.density, + *material.specific_heat, + material.location}); + continue; + } + if (!material.has_elastic) { + diagnostics_.InputFailure("unresolved-reference", material.location, + "MATERIAL", material.name, + "A material must own exactly one ELASTIC row."); + return; + } + if (model_element_family_ == ElementFamily::kShell || + model_element_family_ == ElementFamily::kSolid) { + if (!(material.youngs_modulus > 0.0) || + !(material.poisson_ratio > -1.0) || !(material.poisson_ratio < 0.5)) { + diagnostics_.ModelFailure( + model_element_family_ == ElementFamily::kSolid + ? "invalid-solid-material" + : "invalid-shell-material", + material.elastic_location, "ELASTIC", material.name, + "Isotropic elasticity requires E>0 and -1 0.0) || !std::isfinite(shear_modulus) || + !(shear_modulus > 0.0)) { + diagnostics_.ModelFailure( + "invalid-beam-property", material.elastic_location, "ELASTIC", + material.name, "E and the derived G=E/(2*(1+nu)) must be positive."); + return; + } + definition.materials.push_back({material.name, material.youngs_modulus, + material.poisson_ratio, material.location}); + } +} + +void MaterialPropertyCandidates::FinalizeDensities( + const MaterialProcedureView& procedure, ModelDefinition& definition) { + if (model_element_family_ == ElementFamily::kThermalShell) { + for (const auto& block : input_.blocks) { + if (block.canonical_name != "PREPRINT") continue; + if (!diagnostics_.ValidateParameters( + block, {"ECHO", "MODEL", "HISTORY", "CONTACT"})) + return; + if (block.parameters.size() != 4U) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Thermal PREPRINT requires four NO parameters."); + return; + } + for (const auto& parameter : block.parameters) { + if (!parameter.value || + !AsciiCaseInsensitiveEquals(*parameter.value, "NO")) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, + parameter.name, "Thermal PREPRINT parameters must equal NO."); + return; + } + } + } + return; + } + if (procedure.physical_constants_location) { + diagnostics_.InputFailure( + "unsupported-keyword", *procedure.physical_constants_location, + "PHYSICAL CONSTANTS", "", + "PHYSICAL CONSTANTS is supported only by thermal input."); + return; + } + if (!procedure.frequency && !procedure.dynamic && + model_element_family_ == ElementFamily::kSolid) { + for (std::size_t index = 0U; index < materials_.size(); ++index) { + if (materials_[index].density) + definition.densities.push_back({static_cast(index), + *materials_[index].density, + materials_[index].density_location}); + } + return; + } + if (!procedure.frequency && !procedure.dynamic) { + if (std::any_of(materials_.begin(), materials_.end(), + [](const RawMaterial& material) { + return material.density.has_value(); + })) { + diagnostics_.InputFailure( + "invalid-density-data", procedure.location, "DENSITY", "", + "DENSITY is supported only by the FREQUENCY procedure."); + } + return; + } + if (procedure.frequency) { + ValidateFrequencyPreprint(definition); + if (diagnostics_.HasFailure()) { + return; + } + } + if (procedure.dynamic) { + ValidateDynamicPreprint(); + if (diagnostics_.HasFailure()) { + return; + } + for (auto& warning : definition.warnings) { + if (warning.keyword == "PREPRINT") { + warning.code = "ignored-output-request"; + } + } + } + if (model_element_family_ != ElementFamily::kShell && + model_element_family_ != ElementFamily::kSolid) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", procedure.location, + procedure.frequency ? "FREQUENCY" : "DYNAMIC", procedure.name_raw, + "The procedure requires an approved Shell or Solid model."); + return; + } + if (procedure.first_surface.has_value()) { + diagnostics_.InputFailure( + "unsupported-keyword", procedure.first_surface->location, "SURFACE", + procedure.first_surface->name, + "The selected procedure does not support element surfaces."); + return; + } + for (std::size_t index = 0U; index < materials_.size(); ++index) { + const RawMaterial& material = materials_[index]; + if (!material.density) { + bool active = false; + for (const auto& section : definition.shell_sections) { + if (section.material_index == static_cast(index)) { + active = true; + break; + } + } + for (const auto& section : definition.solid_sections) { + if (section.MaterialIndex() == static_cast(index)) + active = true; + } + if (active) { + diagnostics_.ModelFailure( + "missing-material-density", material.location, "MATERIAL", + material.name, + "Each active dynamic or frequency material requires DENSITY."); + return; + } + continue; + } + definition.densities.push_back({static_cast(index), + *material.density, + material.density_location}); + } +} + +void MaterialPropertyCandidates::ValidateFrequencyPreprint( + ModelDefinition& definition) { + for (const auto& block : input_.blocks) { + if (block.canonical_name != "PREPRINT") { + continue; + } + if (!diagnostics_.ValidateParameters( + block, {"ECHO", "MODEL", "HISTORY", "CONTACT"}) || + block.parameters.size() != 4U) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "FREQUENCY requires PREPRINT with ECHO, MODEL, HISTORY, " + "and CONTACT parameters."); + } + return; + } + for (const auto& parameter : block.parameters) { + if (!parameter.value || + !AsciiCaseInsensitiveEquals(*parameter.value, "NO")) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, + parameter.name, + "FREQUENCY requires PREPRINT parameters to equal NO."); + return; + } + } + } + for (auto& warning : definition.warnings) { + if (warning.keyword == "PREPRINT") { + warning.message = "mandatory-eigen-output-unchanged"; + } + } +} + +void MaterialPropertyCandidates::ValidateDynamicPreprint() { + for (const auto& block : input_.blocks) { + if (block.canonical_name != "PREPRINT") { + continue; + } + if (!diagnostics_.ValidateParameters( + block, {"ECHO", "MODEL", "HISTORY", "CONTACT"}) || + block.parameters.size() != 4U) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "DYNAMIC requires PREPRINT with ECHO, MODEL, HISTORY, " + "and CONTACT parameters."); + } + return; + } + for (const auto& parameter : block.parameters) { + if (!parameter.value || + !AsciiCaseInsensitiveEquals(*parameter.value, "NO")) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, + parameter.name, + "DYNAMIC requires PREPRINT parameters to equal NO."); + return; + } + } + } +} + +void MaterialPropertyCandidates::FinalizePartsAndSections( + const std::vector& parts, ModelDefinition& definition) { + part_section_assignments_.resize(parts.size()); + part_shell_section_assignments_.resize(parts.size()); + const bool shell_model = + model_element_family_ == ElementFamily::kShell || + model_element_family_ == ElementFamily::kThermalShell; + for (std::size_t part_index = 0U; part_index < parts.size(); ++part_index) { + const RawPart& part = parts[part_index]; + if (part.nodes.empty() || part.elements.empty() || + (!shell_model && model_element_family_ != ElementFamily::kSolid && + part.properties.sections.empty())) { + diagnostics_.InputFailure( + "invalid-model-cardinality", part.location, "PART", part.name, + "A part requires nodes, elements, and its approved " + "section form."); + return; + } + + PartDefinition part_definition{}; + part_definition.name = part.name; + part_definition.location = part.location; + for (const auto& node : part.nodes) { + part_definition.node_source_labels.push_back(node.label); + } + for (const auto& element : part.elements) { + part_definition.element_source_labels.push_back(element.label); + for (const auto node_label : element.node_labels) { + if (FindNode(part, node_label) == nullptr) { + diagnostics_.InputFailure( + shell_model ? "invalid-shell-connectivity" + : "unresolved-reference", + element.location, "ELEMENT", element.label_text, + "Element connectivity must resolve within its part."); + return; + } + } + } + for (const auto& set : part.node_sets) { + part_definition.node_set_names.push_back(set.name); + for (const auto label : set.members) { + if (FindNode(part, label) == nullptr) { + diagnostics_.InputFailure( + "unresolved-reference", set.location, "NSET", set.name, + "Every node-set member must resolve within its part."); + return; + } + } + } + for (const auto& set : part.element_sets) { + part_definition.element_set_names.push_back(set.name); + for (const auto label : set.members) { + if (FindElement(part, label) == nullptr) { + diagnostics_.InputFailure( + "unresolved-reference", set.location, "ELSET", set.name, + "Every element-set member must resolve within its part."); + return; + } + } + } + definition.parts.push_back(std::move(part_definition)); + + if (model_element_family_ == ElementFamily::kSolid) { + auto& assignments = part_shell_section_assignments_[part_index]; + for (const auto& section : part.properties.solid_sections) { + const auto* element_set = + FindSet(part.element_sets, section.element_set_name); + const auto material = FindMaterialIndex(section.material_name); + if (!element_set || !material) { + diagnostics_.InputFailure("unresolved-solid-section", + section.location, "SOLID SECTION", + section.element_set_name, + "Solid ELSET and MATERIAL must resolve."); + return; + } + const auto index = + static_cast(definition.solid_sections.size()); + definition.solid_sections.emplace_back( + SourceEntityId{part.name, static_cast(index), + section.element_set_name}, + section.element_set_name, *material, section.location); + for (const auto label : element_set->members) { + if (!assignments.emplace(label, std::make_pair(index, *material)) + .second) { + diagnostics_.InputFailure( + "invalid-solid-section-assignment", section.location, + "SOLID SECTION", std::to_string(label), + "Solid elements require exactly one section assignment."); + return; + } + } + } + for (const auto& element : part.elements) { + if (assignments.find(element.label) == assignments.end()) { + diagnostics_.InputFailure( + "invalid-solid-section-assignment", element.location, "ELEMENT", + element.label_text, "A Solid section assignment is missing."); + return; + } + } + continue; + } + if (shell_model) { + auto& assignments = part_shell_section_assignments_[part_index]; + for (const auto& section : part.properties.shell_sections) { + const auto* element_set = + FindSet(part.element_sets, section.element_set_name); + const auto material_index = FindMaterialIndex(section.material_name); + if (element_set == nullptr || !material_index) { + diagnostics_.InputFailure( + "unresolved-shell-section", section.location, "SHELL SECTION", + section.element_set_name, + "Shell section ELSET and MATERIAL references " + "must resolve."); + return; + } + const EntityIndex section_index = + model_element_family_ == ElementFamily::kThermalShell + ? static_cast(definition.thermal_sections.size()) + : static_cast(definition.shell_sections.size()); + if (model_element_family_ == ElementFamily::kThermalShell) { + definition.thermal_sections.push_back( + {{part.name, static_cast(section_index), + section.element_set_name}, + section.element_set_name, + section.thickness, + *material_index, + section.location}); + } else { + definition.shell_sections.push_back( + {section.element_set_name, section.thickness, *material_index, + section.location}); + } + for (const auto element_label : element_set->members) { + if (!assignments + .emplace(element_label, + std::make_pair(section_index, *material_index)) + .second) { + diagnostics_.InputFailure("invalid-shell-section-assignment", + section.location, "SHELL SECTION", + std::to_string(element_label), + "A shell element cannot receive multiple " + "section assignments."); + return; + } + } + } + for (const auto& element : part.elements) { + if (assignments.find(element.label) == assignments.end()) { + diagnostics_.InputFailure("invalid-shell-section-assignment", + element.location, "ELEMENT", + element.label_text, + "Every shell element requires exactly one " + "resolved section assignment."); + return; + } + } + continue; + } + + auto& assignments = part_section_assignments_[part_index]; + for (const auto& section : part.properties.sections) { + const auto* element_set = + FindSet(part.element_sets, section.element_set_name); + const auto material_index = FindMaterialIndex(section.material_name); + if (element_set == nullptr || !material_index) { + diagnostics_.InputFailure( + "unresolved-reference", section.location, "BEAM GENERAL SECTION", + section.element_set_name, + "Section ELSET and MATERIAL references must resolve."); + return; + } + if (section.properties[2] != 0.0) { + diagnostics_.ModelFailure("unsupported-coupled-section", + section.location, "BEAM GENERAL SECTION", + section.element_set_name, + "V0 requires exact I12=0."); + return; + } + if (!(section.properties[0] > 0.0) || !(section.properties[1] > 0.0) || + !(section.properties[3] > 0.0) || !(section.properties[4] > 0.0)) { + diagnostics_.ModelFailure( + "invalid-beam-property", section.location, "BEAM GENERAL SECTION", + section.element_set_name, "A, I11, I22, and J must be positive."); + return; + } + const EntityIndex section_index = + static_cast(definition.sections.size()); + definition.sections.push_back( + {section.element_set_name, section.properties[0], + section.properties[1], section.properties[2], section.properties[3], + section.properties[4], section.first_axis, section.section_points, + section.location}); + for (const auto element_label : element_set->members) { + if (!assignments + .emplace(element_label, + std::make_pair(section_index, *material_index)) + .second) { + diagnostics_.InputFailure( + "duplicate-entity", section.location, "BEAM GENERAL SECTION", + std::to_string(element_label), + "An element cannot receive multiple section " + "assignments."); + return; + } + } + } + for (const auto& element : part.elements) { + if (assignments.find(element.label) == assignments.end()) { + diagnostics_.InputFailure( + "unresolved-reference", element.location, "ELEMENT", + element.label_text, + "Every B33 element requires a resolved section assignment."); + return; + } + } + } +} + +bool MaterialPropertyCandidates::ContainsName( + const std::vector& values, const std::string& name) const { + return std::any_of(values.begin(), values.end(), + [&name](const RawMaterial& value) { + return AsciiCaseInsensitiveEquals(value.name, name); + }); +} + +void MaterialPropertyCandidates::ParseSolidSection( + const KeywordBlock& block, PartPropertyCandidates& properties) { + if (!diagnostics_.ValidateParameters(block, {"ELSET", "MATERIAL"})) return; + const auto* elset = diagnostics_.RequiredParameterValue(block, "ELSET"); + const auto* material = diagnostics_.RequiredParameterValue(block, "MATERIAL"); + if (!elset || !material) return; + if (block.data.size() > 1U || + (!block.data.empty() && + std::any_of(block.data[0].fields.begin(), block.data[0].fields.end(), + [](const auto& field) { return !field.empty(); }))) { + diagnostics_.InputFailure( + "invalid-solid-section", block.location, block.canonical_name, *elset, + "SOLID SECTION permits omitted or blank data only."); + return; + } + properties.solid_sections.push_back({*elset, *material, block.location}); +} + +void MaterialPropertyCandidates::ParseShellSection( + const KeywordBlock& block, PartPropertyCandidates& properties) { + for (const auto& candidate : block.parameters) { + if (candidate.name != "ELSET" && candidate.name != "MATERIAL") { + diagnostics_.InputFailure( + "unsupported-shell-section-option", block.location, + block.canonical_name, candidate.name, + "The shell-section option is outside the centered " + "single-layer subset."); + return; + } + } + if (!diagnostics_.ValidateParameters(block, {"ELSET", "MATERIAL"})) { + return; + } + const auto* element_set = diagnostics_.RequiredParameterValue(block, "ELSET"); + const auto* material = diagnostics_.RequiredParameterValue(block, "MATERIAL"); + if (element_set == nullptr || material == nullptr) { + return; + } + if (block.data.size() != 1U || block.data[0].fields.empty() || + block.data[0].fields.size() > 2U) { + diagnostics_.InputFailure( + "unsupported-shell-section-option", block.location, + block.canonical_name, *element_set, + "SHELL SECTION requires one thickness row with one optional " + "integration-point field."); + return; + } + double thickness = 0.0; + const bool parsed_thickness = + model_element_family_ == ElementFamily::kThermalShell + ? diagnostics_.ParseThermalDouble(block.data[0].fields[0], thickness, + block.data[0].location, + block.canonical_name) + : diagnostics_.ParseModelDouble( + block.data[0].fields[0], thickness, block.data[0].location, + block.canonical_name, "invalid-shell-thickness", + "Shell thickness must be finite and positive."); + if (!parsed_thickness) { + return; + } + if (!(thickness > 0.0)) { + diagnostics_.ModelFailure("invalid-shell-thickness", block.data[0].location, + block.canonical_name, *element_set, + "Shell thickness must be finite and positive."); + return; + } + if (block.data[0].fields.size() == 2U) { + const auto integration_points = + ParsePositiveSourceLabel(block.data[0].fields[1]); + if (!integration_points.HasValue()) { + diagnostics_.InputFailure( + "unsupported-shell-section-option", block.data[0].location, + block.canonical_name, block.data[0].fields[1], + "The optional shell integration-point field must be a " + "positive integer."); + return; + } + if (model_element_family_ == ElementFamily::kThermalShell && + integration_points.Value() != 5) { + diagnostics_.InputFailure( + "unsupported-shell-section-option", block.data[0].location, + block.canonical_name, block.data[0].fields[1], + "Thermal DS4 sections require exactly five integration points."); + return; + } + } + properties.shell_sections.push_back( + {*element_set, *material, thickness, block.location}); +} + +void MaterialPropertyCandidates::ParseBeamSection( + const KeywordBlock& block, PartPropertyCandidates& properties) { + pending_section_.reset(); + if (!diagnostics_.ValidateParameters(block, + {"ELSET", "MATERIAL", "SECTION"})) { + return; + } + const auto* element_set = diagnostics_.RequiredParameterValue(block, "ELSET"); + const auto* material = diagnostics_.RequiredParameterValue(block, "MATERIAL"); + const auto* section = diagnostics_.RequiredParameterValue(block, "SECTION"); + if (element_set == nullptr || material == nullptr || section == nullptr) { + return; + } + if (!AsciiCaseInsensitiveEquals(*section, "GENERAL")) { + diagnostics_.InputFailure( + "unsupported-section-formulation", block.location, block.canonical_name, + *section, "Only SECTION=GENERAL belongs to the approved subset."); + return; + } + if (std::any_of(properties.sections.begin(), properties.sections.end(), + [element_set](const RawSection& existing) { + return AsciiCaseInsensitiveEquals(existing.element_set_name, + *element_set); + })) { + diagnostics_.InputFailure( + "duplicate-entity", block.location, block.canonical_name, *element_set, + "An element set can receive only one beam section."); + return; + } + if (block.data.size() != 2U || block.data[0].fields.size() != 5U || + block.data[1].fields.size() != 3U) { + diagnostics_.InputFailure( + "invalid-data-arity", block.location, block.canonical_name, + *element_set, + "A general section requires one five-field property row and " + "one three-field axis row."); + return; + } + RawSection raw{*element_set, *material, {}, {}, {}, block.location}; + for (std::size_t property = 0U; property < 5U; ++property) { + if (!diagnostics_.ParseModelDouble( + block.data[0].fields[property], raw.properties[property], + block.data[0].location, block.canonical_name, + "invalid-beam-property", + "Beam section properties must be finite.")) { + return; + } + } + for (std::size_t coordinate = 0U; coordinate < 3U; ++coordinate) { + if (!diagnostics_.ParseModelDouble( + block.data[1].fields[coordinate], raw.first_axis[coordinate], + block.data[1].location, block.canonical_name, + "invalid-beam-guide-vector", + "The beam guide vector must be finite.")) { + return; + } + } + properties.sections.push_back(std::move(raw)); + pending_section_ = properties.sections.size() - 1U; +} + +void MaterialPropertyCandidates::ParseSectionPoints( + const KeywordBlock& block, PartPropertyCandidates& properties) { + if (!pending_section_ || !diagnostics_.ValidateParameters(block, {}) || + block.data.empty()) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "invalid-keyword-location", block.location, block.canonical_name, "", + "SECTION POINTS must immediately follow a general section."); + } + return; + } + RawSection& section = properties.sections[*pending_section_]; + for (const auto& row : block.data) { + if (row.fields.size() != 2U) { + diagnostics_.InputFailure("invalid-data-arity", row.location, + block.canonical_name, section.element_set_name, + "Section-point rows require x1 and x2."); + return; + } + std::array point{}; + if (!diagnostics_.ParseDouble(row.fields[0], point[0], row.location, + block.canonical_name) || + !diagnostics_.ParseDouble(row.fields[1], point[1], row.location, + block.canonical_name)) { + return; + } + if (std::find(section.section_points.begin(), section.section_points.end(), + point) != section.section_points.end()) { + diagnostics_.InputFailure( + "duplicate-entity", row.location, block.canonical_name, + section.element_set_name, + "Section points must be unique within a section."); + return; + } + section.section_points.push_back(point); + } + pending_section_.reset(); +} + Status MaterialPropertyMapper::Map(DomainMappingContext& context) const { return context.FinalizeMaterialProperties(); } diff --git a/src/fesa/io/abaqus/step_definition_candidates.h b/src/fesa/io/abaqus/step_definition_candidates.h new file mode 100644 index 0000000..da5d9d7 --- /dev/null +++ b/src/fesa/io/abaqus/step_definition_candidates.h @@ -0,0 +1,196 @@ +#ifndef FESA_IO_ABAQUS_STEP_DEFINITION_CANDIDATES_H_ +#define FESA_IO_ABAQUS_STEP_DEFINITION_CANDIDATES_H_ + +#include +#include +#include +#include +#include +#include + +#include "fesa/model/source_target_resolver.h" +#include "io/abaqus/topology_candidates.h" + +namespace fesa::abaqus_internal { + +struct DomainMappingCandidateSummary; + +/// @brief Owns uncommitted step, boundary, load, and initial-condition syntax. +/// @note The context-owned input, family, diagnostics, and candidate outlive +/// it. +class StepDefinitionCandidates { + public: + /// @brief Borrows context services while owning this uncommitted mapping + /// stage. + StepDefinitionCandidates(MappingDiagnostics& diagnostics, + const ParsedInput& input, + const std::optional& family, + ModelDefinition& definition) + : diagnostics_{diagnostics}, + input_{input}, + model_element_family_{family}, + definition_{definition} {} + + /// @brief Reports whether the sole source step has been declared. + bool HasStep() const noexcept { return step_seen_; } + /// @brief Reports whether source step syntax remains open. + bool InStep() const noexcept { return in_step_; } + /// @brief Reports whether the step selected an existing supported procedure. + bool HasSupportedProcedure() const noexcept; + /// @brief Ends output-child scope when source syntax routing changes. + void EndOutput() noexcept { active_output_ = false; } + /// @brief Copies stable candidate counts without committing a Domain. + void FillSummary(DomainMappingCandidateSummary& summary) const noexcept; + /// @brief Borrows procedure provenance for immediate material validation. + MaterialProcedureView MaterialProcedure( + std::optional first_surface, + const std::optional& physical_constants) const; + /// @brief Owns model-level structural or thermal boundary rows. + void ParseModelBoundary(const KeywordBlock& block); + + /// @brief Parses step controls while preserving repeated-step first failure. + void ParseStepStart(const KeywordBlock& block, bool model_ready); + + /// @brief Parses children with the existing procedure allowlist and ordering. + void ParseStepBlock(const KeywordBlock& block); + + /// @brief Owns supported model-level load amplitude source records. + void ParseAmplitude(const KeywordBlock& block); + + /// @brief Owns supported thermal initial-temperature source rows. + void ParseInitialConditions(const KeywordBlock& block); + + /// @brief Appends source no-op provenance with its procedure warning code. + void AddIgnoredWarning(const KeywordBlock& block); + + /// @brief Resolves source targets and appends complete step definitions. + void FinalizeStep(); + + private: + struct RawSurfacePressureLoad { + std::string surface_name; + double magnitude; + std::string magnitude_raw; + SourceLocation keyword_location; + SourceLocation data_location; + std::size_t data_ordinal; + std::size_t load_ordinal; + }; + + struct RawThermalBoundary { + std::string target; + int dof; + double value; + SourceLocation location; + }; + + struct RawThermalInitial { + std::string target; + double value; + SourceLocation location; + }; + + struct RawThermalFlux { + std::string target; + int dof; + double power; + SourceLocation location; + }; + + struct RawStep { + SourceLocation location; + std::string name_raw; + std::string name_canonical; + bool has_static{false}; + bool static_direct{false}; + std::uint32_t static_increment_count{0U}; + std::optional dynamic; + bool perturbation_explicit{false}; + bool nlgeom_explicit{false}; + StaticProcedureKind procedure_kind{ + StaticProcedureKind::kLinearSmallDisplacement}; + bool nlgeom{false}; + std::uint32_t maximum_increments{0U}; + std::array static_values{}; + std::optional frequency; + bool has_heat_transfer{false}; + double thermal_increment{0.0}; + double thermal_period{0.0}; + std::vector thermal_boundaries; + std::vector thermal_fluxes; + std::vector boundaries; + std::vector loads; + std::vector surface_pressure_loads; + std::size_t next_load_ordinal{0U}; + }; + + bool ParseSurfacePressureDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword); + + bool ParseNonlinearStaticDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword); + + bool ParseDynamicDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword); + + void ParseThermalBoundary(const KeywordBlock& block, + std::vector& destination); + + void ParseBoundary( + const KeywordBlock& block, + std::vector& destination); + + void ParseCload(const KeywordBlock& block, std::vector& loads); + + void ParseDsload(const KeywordBlock& block); + + bool ParseFrequencyModeCount(const std::string& text, std::int64_t& value, + const SourceLocation& location); + + void ParseFrequency(const KeywordBlock& block); + + void ValidateEigenBoundaries( + const std::vector& boundaries); + + void ValidateDynamicBoundaries( + const std::vector& boundaries); + + void ParseDynamic(const KeywordBlock& block); + + void ParseHeatTransfer(const KeywordBlock& block); + + void ParseCflux(const KeywordBlock& block); + + void ParseStatic(const KeywordBlock& block); + + void ParseOutputRoot(const KeywordBlock& block); + + void ParseOutputChild(const KeywordBlock& block); + + std::optional> ResolveNodeTarget( + const SourceTargetResolver& resolver, const std::string& target, + const SourceLocation& location, const std::string& keyword); + + MappingDiagnostics& diagnostics_; + const ParsedInput& input_; + const std::optional& model_element_family_; + ModelDefinition& definition_; + RawStep step_{}; + std::vector model_boundaries_; + std::vector thermal_model_boundaries_; + std::vector thermal_initial_conditions_; + std::vector thermal_active_nodes_; + bool step_seen_{false}; + bool in_step_{false}; + bool step_load_seen_{false}; + bool step_no_op_seen_{false}; + bool active_output_{false}; + bool active_output_is_field_{false}; +}; + +} // namespace fesa::abaqus_internal + +#endif // FESA_IO_ABAQUS_STEP_DEFINITION_CANDIDATES_H_ diff --git a/src/fesa/io/abaqus/step_definition_mapper.cpp b/src/fesa/io/abaqus/step_definition_mapper.cpp index 2ecd82d..d543951 100644 --- a/src/fesa/io/abaqus/step_definition_mapper.cpp +++ b/src/fesa/io/abaqus/step_definition_mapper.cpp @@ -1,9 +1,1679 @@ #include "io/abaqus/step_definition_mapper.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/analysis/thermal_time_grid.h" +#include "fesa/core/ascii.h" #include "io/abaqus/domain_mapping_context.h" +#include "io/abaqus/step_definition_candidates.h" +#include "io/abaqus/surface_definition_candidates.h" namespace fesa::abaqus_internal { +bool StepDefinitionCandidates::HasSupportedProcedure() const noexcept { + return step_.has_static || step_.frequency || step_.dynamic || + step_.has_heat_transfer; +} + +void StepDefinitionCandidates::FillSummary( + DomainMappingCandidateSummary& summary) const noexcept { + summary.model_boundary_count = model_boundaries_.size(); + summary.step_boundary_count = step_.boundaries.size(); + summary.step_load_count = step_.loads.size(); + summary.has_static_step = step_.has_static; +} + +MaterialProcedureView StepDefinitionCandidates::MaterialProcedure( + std::optional first_surface, + const std::optional& physical_constants) const { + return {step_.frequency.has_value(), + step_.dynamic.has_value(), + step_.location, + step_.name_raw, + std::move(first_surface), + physical_constants}; +} + +void StepDefinitionCandidates::ParseModelBoundary(const KeywordBlock& block) { + if (model_element_family_ == ElementFamily::kThermalShell) { + ParseThermalBoundary(block, thermal_model_boundaries_); + } else { + ParseBoundary(block, model_boundaries_); + } +} + +bool StepDefinitionCandidates::ParseSurfacePressureDouble( + const std::string& text, double& value, const SourceLocation& location, + const std::string& keyword) { + std::size_t cursor = 0U; + if (cursor < text.size() && (text[cursor] == '+' || text[cursor] == '-')) { + ++cursor; + } + const std::size_t integer_start = cursor; + while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { + ++cursor; + } + const bool has_integer_digits = cursor != integer_start; + bool has_fraction_digits = false; + if (cursor < text.size() && text[cursor] == '.') { + ++cursor; + const std::size_t fraction_start = cursor; + while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { + ++cursor; + } + has_fraction_digits = cursor != fraction_start; + } + if (!has_integer_digits && !has_fraction_digits) { + return diagnostics_.InputFailure( + "invalid-numeric-value", location, keyword, text, + "Pressure values require C-locale decimal syntax."); + } + if (cursor < text.size() && (text[cursor] == 'E' || text[cursor] == 'e')) { + ++cursor; + if (cursor < text.size() && (text[cursor] == '+' || text[cursor] == '-')) { + ++cursor; + } + const std::size_t exponent_start = cursor; + while (cursor < text.size() && text[cursor] >= '0' && text[cursor] <= '9') { + ++cursor; + } + if (cursor == exponent_start) { + return diagnostics_.InputFailure( + "invalid-numeric-value", location, keyword, text, + "Pressure exponents require one or more digits."); + } + } + if (cursor != text.size()) { + return diagnostics_.InputFailure( + "invalid-numeric-value", location, keyword, text, + "Pressure values require C-locale decimal syntax."); + } + const char* const begin = text.data(); + const char* const end = begin + text.size(); + const char* const numeric_begin = *begin == '+' ? begin + 1U : begin; + const auto parsed = + std::from_chars(numeric_begin, end, value, std::chars_format::general); + if (parsed.ec != std::errc{} || parsed.ptr != end || !std::isfinite(value)) { + return diagnostics_.InputFailure( + "invalid-numeric-value", location, keyword, text, + "Pressure values must be finite C-locale values."); + } + return true; +} + +bool StepDefinitionCandidates::ParseNonlinearStaticDouble( + const std::string& text, double& value, const SourceLocation& location, + const std::string& keyword) { + if (text.empty()) { + return diagnostics_.InputFailure( + "invalid-nonlinear-static-data", location, keyword, text, + "A nonlinear STATIC field cannot be empty."); + } + char* end = nullptr; + errno = 0; + const double parsed = std::strtod(text.c_str(), &end); + if (errno == ERANGE || end != text.c_str() + text.size() || + !std::isfinite(parsed)) { + return diagnostics_.InputFailure( + "invalid-nonlinear-static-data", location, keyword, text, + "All four nonlinear STATIC fields must be finite."); + } + value = parsed; + return true; +} + +bool StepDefinitionCandidates::ParseDynamicDouble( + const std::string& text, double& value, const SourceLocation& location, + const std::string& keyword) { + if (text.empty()) { + return diagnostics_.InputFailure("invalid-dynamic-data", location, keyword, + text, + "Dynamic data fields cannot be empty."); + } + char* end = nullptr; + errno = 0; + const double parsed = std::strtod(text.c_str(), &end); + if (errno == ERANGE || end != text.c_str() + text.size() || + !std::isfinite(parsed)) { + return diagnostics_.InputFailure("invalid-dynamic-data", location, keyword, + text, + "Dynamic data fields must be finite."); + } + value = parsed; + return true; +} + +void StepDefinitionCandidates::ParseAmplitude(const KeywordBlock& block) { + const bool dynamic_source = std::any_of( + input_.blocks.begin(), input_.blocks.end(), [](const auto& candidate) { + return candidate.canonical_name == "DYNAMIC"; + }); + if (model_element_family_ != ElementFamily::kSolid || !dynamic_source) { + diagnostics_.InputFailure( + "unsupported-load-amplitude", block.location, block.canonical_name, "", + "Amplitude is supported only in Solid dynamic models."); + return; + } + if (!diagnostics_.ValidateParameters(block, + {"NAME", "DEFINITION", "TIME", "VALUE"})) + return; + const auto* name = diagnostics_.RequiredParameterValue(block, "NAME"); + if (!name) return; + for (const auto& option : std::array, 3>{ + {{"DEFINITION", "TABULAR"}, + {"TIME", "STEP TIME"}, + {"VALUE", "RELATIVE"}}}) { + const auto* parameter = diagnostics_.Parameter(block, option.first); + if (parameter && + (!parameter->value || + !AsciiCaseInsensitiveEquals(*parameter->value, option.second))) { + diagnostics_.InputFailure( + "unsupported-amplitude-option", block.location, block.canonical_name, + option.first, + "Only TABULAR STEP TIME RELATIVE amplitude is supported."); + return; + } + } + const std::string canonical = AsciiUppercase(*name); + if (std::any_of(definition_.amplitudes.begin(), definition_.amplitudes.end(), + [&canonical](const auto& a) { + return a.name_canonical == canonical; + })) { + diagnostics_.InputFailure( + "duplicate-amplitude", block.location, block.canonical_name, *name, + "Amplitude names must be unique ignoring ASCII case."); + return; + } + TabularAmplitudeDefinition amplitude{*name, canonical, block.location, {}}; + for (const auto& row : block.data) { + if (row.fields.empty() || row.fields.size() % 2U != 0U) { + diagnostics_.InputFailure( + "invalid-amplitude-data", row.location, block.canonical_name, *name, + "Amplitude rows require complete time/value pairs."); + return; + } + for (std::size_t field = 0U; field < row.fields.size(); field += 2U) { + double time = 0.0; + double value = 0.0; + if (!diagnostics_.ParseDouble(row.fields[field], time, row.location, + block.canonical_name) || + !diagnostics_.ParseDouble(row.fields[field + 1U], value, row.location, + block.canonical_name)) + return; + if (time < 0.0 || + (!amplitude.points.empty() && !(time > amplitude.points.back()[0]))) { + diagnostics_.InputFailure( + "invalid-amplitude-data", row.location, block.canonical_name, *name, + "Amplitude times must be nonnegative and strictly increasing."); + return; + } + amplitude.points.push_back({time, value}); + } + } + if (amplitude.points.empty()) { + diagnostics_.InputFailure( + "invalid-amplitude-data", block.location, block.canonical_name, *name, + "Amplitude requires at least one finite time/value pair."); + return; + } + definition_.amplitudes.push_back(std::move(amplitude)); +} + +void StepDefinitionCandidates::ParseInitialConditions( + const KeywordBlock& block) { + if (model_element_family_ != ElementFamily::kThermalShell || + !diagnostics_.ValidateParameters(block, {"TYPE"}) || block.data.empty()) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "invalid-data-arity", block.location, block.canonical_name, "", + "Thermal initial conditions require data rows."); + } + return; + } + const auto* type = diagnostics_.RequiredParameterValue(block, "TYPE"); + if (type == nullptr || !AsciiCaseInsensitiveEquals(*type, "TEMPERATURE")) { + if (!diagnostics_.HasFailure()) + diagnostics_.InputFailure("unsupported-keyword", block.location, + block.canonical_name, "TYPE", + "Only TYPE=TEMPERATURE is supported."); + return; + } + for (const auto& row : block.data) { + if (row.fields.size() != 2U || row.fields[0].empty()) { + diagnostics_.InputFailure("invalid-data-arity", row.location, + block.canonical_name, "", + "Initial temperatures require target, value."); + return; + } + double value = 0.0; + if (!diagnostics_.ParseThermalDouble(row.fields[1], value, row.location, + block.canonical_name)) + return; + thermal_initial_conditions_.push_back({row.fields[0], value, row.location}); + } +} + +void StepDefinitionCandidates::ParseThermalBoundary( + const KeywordBlock& block, std::vector& destination) { + if (!diagnostics_.ValidateParameters(block, {}) || block.data.empty()) { + if (!diagnostics_.HasFailure()) + diagnostics_.InputFailure("invalid-data-arity", block.location, + block.canonical_name, "", + "Thermal BOUNDARY requires data rows."); + return; + } + for (const auto& row : block.data) { + if ((row.fields.size() != 3U && row.fields.size() != 4U) || + row.fields[0].empty()) { + diagnostics_.InputFailure( + "invalid-data-arity", row.location, block.canonical_name, "", + "Thermal boundaries require target, DOF, DOF, value."); + return; + } + std::int64_t first = 0; + std::int64_t last = 0; + if (!diagnostics_.ParseInteger(row.fields[1], first, row.location, + block.canonical_name, true) || + !diagnostics_.ParseInteger(row.fields[2], last, row.location, + block.canonical_name, true) || + first != last || (first != 11 && first != 15)) { + diagnostics_.InputFailure("invalid-dof", row.location, + block.canonical_name, row.fields[0], + "Thermal boundaries support DOF 11 or 15."); + return; + } + double value = 0.0; + if (row.fields.size() == 4U && + !diagnostics_.ParseThermalDouble(row.fields[3], value, row.location, + block.canonical_name)) + return; + destination.push_back( + {row.fields[0], static_cast(first), value, row.location}); + } +} + +void StepDefinitionCandidates::ParseBoundary( + const KeywordBlock& block, + std::vector& destination) { + const bool dynamic_input = std::any_of( + input_.blocks.begin(), input_.blocks.end(), [](const auto& candidate) { + return candidate.canonical_name == "DYNAMIC"; + }); + if (!diagnostics_.ValidateParameters(block, {}, + dynamic_input + ? "unsupported-dynamic-boundary" + : "invalid-keyword-parameter") || + block.data.empty()) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure("invalid-data-arity", block.location, + block.canonical_name, "", + "BOUNDARY requires one or more data rows."); + } + return; + } + for (const auto& row : block.data) { + if (row.fields.size() != 3U && row.fields.size() != 4U) { + diagnostics_.InputFailure( + "invalid-data-arity", row.location, block.canonical_name, "", + "BOUNDARY rows require target, first DOF, last DOF, and " + "optional value."); + return; + } + if (row.fields[0].empty()) { + diagnostics_.InputFailure("unresolved-reference", row.location, + block.canonical_name, "", + "A boundary target cannot be empty."); + return; + } + std::int64_t first = 0; + std::int64_t last = 0; + if (!diagnostics_.ParseInteger(row.fields[1], first, row.location, + block.canonical_name, true) || + !diagnostics_.ParseInteger(row.fields[2], last, row.location, + block.canonical_name, true)) { + return; + } + if (first < 1 || first > 6 || last < first || last > 6) { + diagnostics_.InputFailure( + "invalid-dof", row.location, block.canonical_name, row.fields[0], + "Boundary DOFs must be an ordered range in 1..6."); + return; + } + double value = 0.0; + if (row.fields.size() == 4U && + !(model_element_family_ == ElementFamily::kSolid && + row.fields[3].empty()) && + !diagnostics_.ParseDouble(row.fields[3], value, row.location, + block.canonical_name)) { + return; + } + destination.push_back({row.fields[0], static_cast(first), + static_cast(last), value, row.location}); + } +} + +void StepDefinitionCandidates::ParseCload(const KeywordBlock& block, + std::vector& loads) { + if (step_.dynamic && model_element_family_ != ElementFamily::kSolid && + !block.parameters.empty()) { + diagnostics_.InputFailure( + "unsupported-dynamic-load", block.location, block.canonical_name, "", + "Dynamic CLOAD does not support keyword parameters."); + return; + } + const bool solid_dynamic = + step_.dynamic && model_element_family_ == ElementFamily::kSolid; + if (!diagnostics_.ValidateParameters( + block, solid_dynamic ? std::vector{"AMPLITUDE"} + : std::vector{}) || + block.data.empty()) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure("invalid-data-arity", block.location, + block.canonical_name, "", + "CLOAD requires one or more rows."); + } + return; + } + std::optional amplitude_index; + std::string amplitude_name; + if (diagnostics_.Parameter(block, "AMPLITUDE")) { + const auto* name = diagnostics_.RequiredParameterValue(block, "AMPLITUDE"); + if (!name) return; + amplitude_name = *name; + for (std::size_t index = 0U; index < definition_.amplitudes.size(); + ++index) { + if (AsciiCaseInsensitiveEquals(definition_.amplitudes[index].name_raw, + *name)) { + amplitude_index = static_cast(index); + break; + } + } + if (!amplitude_index) { + diagnostics_.InputFailure( + "unresolved-amplitude", block.location, block.canonical_name, *name, + "CLOAD amplitude must resolve to a model-level curve."); + return; + } + } + for (const auto& row : block.data) { + if (row.fields.size() != 3U || row.fields[0].empty()) { + diagnostics_.InputFailure("invalid-data-arity", row.location, + block.canonical_name, "", + "CLOAD rows require target, DOF, magnitude."); + return; + } + std::int64_t dof = 0; + double magnitude = 0.0; + if (!diagnostics_.ParseInteger(row.fields[1], dof, row.location, + block.canonical_name, true) || + !diagnostics_.ParseDouble(row.fields[2], magnitude, row.location, + block.canonical_name)) { + return; + } + if (dof < 1 || dof > 6) { + diagnostics_.InputFailure("invalid-dof", row.location, + block.canonical_name, row.fields[0], + "CLOAD DOF must be in 1..6."); + return; + } + if ((step_.dynamic || model_element_family_ == ElementFamily::kSolid) && + dof > 3) { + diagnostics_.InputFailure( + "unsupported-dynamic-load", row.location, block.canonical_name, + row.fields[1], + "Dynamic CLOAD supports global translational DOF 1 " + "through 3 only."); + return; + } + loads.push_back({row.fields[0], static_cast(dof), magnitude, + row.location, amplitude_index, amplitude_name, + block.location}); + } +} + +void StepDefinitionCandidates::ParseDsload(const KeywordBlock& block) { + if (!diagnostics_.ValidateParameters(block, {}, + "unsupported-dsload-parameter") || + block.data.empty()) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure("invalid-data-arity", block.location, + block.canonical_name, "", + "DSLOAD requires one or more rows."); + } + return; + } + for (std::size_t ordinal = 0U; ordinal < block.data.size(); ++ordinal) { + const auto& row = block.data[ordinal]; + if (row.fields.size() != 3U || row.fields[0].empty() || + row.fields[1].empty() || row.fields[2].empty()) { + diagnostics_.InputFailure("invalid-data-arity", row.location, + block.canonical_name, "", + "DSLOAD rows require surface, P, magnitude."); + return; + } + if (!IsPressureNameToken(row.fields[0])) { + diagnostics_.InputFailure( + "invalid-surface-name", row.location, block.canonical_name, + row.fields[0], + "DSLOAD surface names must use the approved ASCII name " + "syntax."); + return; + } + if (!AsciiCaseInsensitiveEquals(row.fields[1], "P")) { + diagnostics_.InputFailure( + "unsupported-load-type", row.location, block.canonical_name, + row.fields[1], + "Only uniform surface pressure load type P is supported."); + return; + } + double magnitude = 0.0; + if (!ParseSurfacePressureDouble(row.fields[2], magnitude, row.location, + block.canonical_name)) { + return; + } + step_.surface_pressure_loads.push_back( + {row.fields[0], magnitude, row.fields[2], block.location, row.location, + ordinal, step_.next_load_ordinal++}); + } +} + +void StepDefinitionCandidates::ParseStepStart(const KeywordBlock& block, + bool model_ready) { + if (step_seen_) { + if (step_.frequency || step_.dynamic) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "The frequency subset accepts exactly one procedure step."); + } else { + const auto* nlgeom = diagnostics_.Parameter(block, "NLGEOM"); + const bool nonlinear_second_step = + nlgeom != nullptr && nlgeom->value && + AsciiCaseInsensitiveEquals(*nlgeom->value, "YES"); + if (step_.nlgeom || nonlinear_second_step) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "The nonlinear static subset accepts exactly one " + "procedure step."); + } else { + diagnostics_.InputFailure("unsupported-multiple-step", block.location, + block.canonical_name, "", + "V0 accepts exactly one analysis step."); + } + } + return; + } + if (!model_ready) { + diagnostics_.InvalidKeywordLocation( + block, + "The sole step follows the complete assembly and " + "material definitions."); + return; + } + if (!diagnostics_.ValidateParameters( + block, {"NAME", "NLGEOM", "PERTURBATION", "INC"}) || + !diagnostics_.RequireNoData(block)) { + return; + } + StaticProcedureKind procedure_kind = + StaticProcedureKind::kLinearSmallDisplacement; + bool nlgeom = false; + const auto* nlgeom_parameter = diagnostics_.Parameter(block, "NLGEOM"); + if (nlgeom_parameter != nullptr) { + if (!nlgeom_parameter->value || nlgeom_parameter->value->empty()) { + diagnostics_.InputFailure( + "invalid-keyword-parameter", block.location, block.canonical_name, + "NLGEOM", "NLGEOM requires YES or NO in the approved subset."); + return; + } + if (AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "YES")) { + if (model_element_family_ != ElementFamily::kShell && + model_element_family_ != ElementFamily::kSolid) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, *nlgeom_parameter->value, + "NLGEOM=YES requires a supported Shell or Solid model."); + return; + } + procedure_kind = StaticProcedureKind::kNonlinearFullNewton; + nlgeom = true; + } else if (!AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "NO")) { + diagnostics_.InputFailure("unsupported-analysis-procedure", + block.location, block.canonical_name, + *nlgeom_parameter->value, + "NLGEOM must select YES or NO."); + return; + } + } + const auto* perturbation = diagnostics_.Parameter(block, "PERTURBATION"); + if (perturbation != nullptr && perturbation->value) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, block.canonical_name, + "PERTURBATION", "PERTURBATION is accepted only as a value-less flag."); + return; + } + const auto* name = diagnostics_.Parameter(block, "NAME"); + if (name != nullptr && (!name->value || name->value->empty())) { + diagnostics_.InputFailure( + "invalid-keyword-parameter", block.location, block.canonical_name, + "NAME", "STEP NAME must not be empty when it is present."); + return; + } + const auto* increment_limit = diagnostics_.Parameter(block, "INC"); + std::uint32_t maximum_increments = 100U; + if (increment_limit != nullptr) { + if (!increment_limit->value || increment_limit->value->empty()) { + diagnostics_.InputFailure("invalid-dynamic-data", block.location, + block.canonical_name, "INC", + "INC requires a positive uint32 value."); + return; + } + std::int64_t parsed_limit = 0; + if (!diagnostics_.ParseInteger(*increment_limit->value, parsed_limit, + block.location, block.canonical_name, + true) || + parsed_limit > static_cast( + std::numeric_limits::max())) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure("invalid-dynamic-data", block.location, + block.canonical_name, "INC", + "INC requires a positive uint32 value."); + } + return; + } + maximum_increments = static_cast(parsed_limit); + } + step_seen_ = true; + in_step_ = true; + step_ = {}; + step_.location = block.location; + step_.name_raw = name == nullptr ? "Step-1" : *name->value; + step_.name_canonical = AsciiUppercase(step_.name_raw); + step_.procedure_kind = procedure_kind; + step_.nlgeom = nlgeom; + step_.nlgeom_explicit = nlgeom_parameter != nullptr; + step_.perturbation_explicit = perturbation != nullptr; + step_.maximum_increments = maximum_increments; + step_load_seen_ = false; + step_no_op_seen_ = false; +} + +void StepDefinitionCandidates::ParseStepBlock(const KeywordBlock& block) { + if (model_element_family_ == ElementFamily::kSolid && + (block.canonical_name == "STATIC" || + block.canonical_name == "FREQUENCY" || + block.canonical_name == "DYNAMIC") && + (step_.has_static || step_.frequency || step_.dynamic)) { + diagnostics_.InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, step_.name_raw, + "Solid steps accept exactly one procedure."); + return; + } + if (model_element_family_ == ElementFamily::kThermalShell && + (block.canonical_name == "STATIC" || + block.canonical_name == "FREQUENCY" || + block.canonical_name == "DYNAMIC")) { + diagnostics_.InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, step_.name_raw, + "DS4 supports only one HEAT TRANSFER procedure."); + return; + } + if (block.canonical_name == "END STEP") { + active_output_ = false; + if (!diagnostics_.ValidateParameters(block, {}) || + !diagnostics_.RequireNoData(block)) { + return; + } + if (!step_.has_static && !step_.frequency && !step_.dynamic && + !step_.has_heat_transfer) { + diagnostics_.InvalidKeywordLocation( + block, "The sole step requires one supported procedure keyword."); + return; + } + in_step_ = false; + return; + } + if (block.canonical_name == "STEP") { + diagnostics_.InputFailure("unsupported-multiple-step", block.location, + block.canonical_name, "", + "A second or nested step is unsupported."); + return; + } + if (block.canonical_name == "HEAT TRANSFER") { + active_output_ = false; + if (step_.has_static || step_.frequency || step_.dynamic || + step_.has_heat_transfer || !step_.boundaries.empty() || + !step_.loads.empty() || step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, "HEAT TRANSFER must be the first procedure."); + return; + } + ParseHeatTransfer(block); + } else if (block.canonical_name == "STATIC") { + active_output_ = false; + if (!step_.boundaries.empty() || !step_.loads.empty() || + !step_.surface_pressure_loads.empty() || step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, "STATIC must be the first keyword in the sole step."); + return; + } + ParseStatic(block); + } else if (block.canonical_name == "FREQUENCY") { + active_output_ = false; + if (step_.has_static || step_.frequency || !step_.boundaries.empty() || + !step_.loads.empty() || !step_.surface_pressure_loads.empty() || + step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, "FREQUENCY must be the first procedure in the sole step."); + return; + } + ParseFrequency(block); + } else if (block.canonical_name == "DYNAMIC") { + active_output_ = false; + if (step_.has_static || step_.frequency || step_.dynamic || + !step_.boundaries.empty() || !step_.loads.empty() || + !step_.surface_pressure_loads.empty() || step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, "DYNAMIC must be the first procedure in the sole step."); + return; + } + ParseDynamic(block); + } else if (block.canonical_name == "BOUNDARY") { + active_output_ = false; + if ((!step_.has_static && !step_.frequency && !step_.dynamic && + !step_.has_heat_transfer) || + step_load_seen_ || step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, + "Step boundaries follow STATIC and precede loads " + "and no-op requests."); + return; + } + if (step_.dynamic && !block.parameters.empty()) { + diagnostics_.InputFailure( + "unsupported-dynamic-boundary", block.location, block.canonical_name, + "", "Dynamic BOUNDARY does not support keyword parameters."); + return; + } + if (step_.has_heat_transfer) { + ParseThermalBoundary(block, step_.thermal_boundaries); + } else { + ParseBoundary(block, step_.boundaries); + } + if (!diagnostics_.HasFailure() && step_.frequency) { + ValidateEigenBoundaries(step_.boundaries); + } + if (!diagnostics_.HasFailure() && step_.dynamic) { + ValidateDynamicBoundaries(step_.boundaries); + } + } else if (block.canonical_name == "CLOAD") { + active_output_ = false; + if ((!step_.has_static && !step_.dynamic) || step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, + "CLOAD follows STATIC and boundaries and precedes no-op requests."); + return; + } + ParseCload(block, step_.loads); + if (!diagnostics_.HasFailure()) { + step_.next_load_ordinal += block.data.size(); + } + step_load_seen_ = !diagnostics_.HasFailure(); + } else if (block.canonical_name == "CFLUX") { + active_output_ = false; + if (!step_.has_heat_transfer || step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, "CFLUX follows HEAT TRANSFER and boundaries."); + return; + } + ParseCflux(block); + step_load_seen_ = !diagnostics_.HasFailure(); + } else if (block.canonical_name == "DSLOAD") { + active_output_ = false; + if (!step_.has_static || step_.dynamic || step_no_op_seen_) { + diagnostics_.InvalidKeywordLocation( + block, + "DSLOAD follows STATIC and boundaries and " + "precedes no-op requests."); + return; + } + ParseDsload(block); + step_load_seen_ = !diagnostics_.HasFailure(); + } else if (block.canonical_name == "RESTART") { + active_output_ = false; + if (!step_.has_static && !step_.frequency && !step_.dynamic && + !step_.has_heat_transfer) { + diagnostics_.InvalidKeywordLocation( + block, "Step no-op requests follow STATIC, boundaries, and loads."); + return; + } + step_no_op_seen_ = true; + if (step_.frequency || step_.has_heat_transfer || + model_element_family_ == ElementFamily::kSolid) { + const auto* write = diagnostics_.Parameter(block, "WRITE"); + const auto* frequency = diagnostics_.Parameter(block, "FREQUENCY"); + if (!diagnostics_.ValidateParameters(block, {"WRITE", "FREQUENCY"}) || + write == nullptr || write->value || frequency == nullptr || + !frequency->value || *frequency->value != "0") { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Supported RESTART no-op requires WRITE, FREQUENCY=0."); + } + return; + } + } + if (diagnostics_.RequireNoData(block)) { + AddIgnoredWarning(block); + } + } else if (block.canonical_name == "OUTPUT") { + if (!step_.has_static && !step_.frequency && !step_.dynamic && + !step_.has_heat_transfer) { + diagnostics_.InvalidKeywordLocation( + block, "Step no-op requests follow STATIC, boundaries, and loads."); + return; + } + step_no_op_seen_ = true; + ParseOutputRoot(block); + } else if (block.canonical_name == "NODE OUTPUT" || + block.canonical_name == "ELEMENT OUTPUT" || + block.canonical_name == "CONTACT OUTPUT" || + block.canonical_name == "ENERGY OUTPUT") { + ParseOutputChild(block); + } else { + active_output_ = false; + if (step_.procedure_kind == StaticProcedureKind::kNonlinearFullNewton && + !step_.has_static) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "The nonlinear step supports only the STATIC procedure."); + return; + } + diagnostics_.RejectUnknown(block, + model_element_family_ == ElementFamily::kShell); + } +} + +bool StepDefinitionCandidates::ParseFrequencyModeCount( + const std::string& text, std::int64_t& value, + const SourceLocation& location) { + if (text.empty() || + !std::all_of(text.begin(), text.end(), [](char character) { + return character >= '0' && character <= '9'; + })) { + return diagnostics_.InputFailure( + "invalid-frequency-data", location, "FREQUENCY", text, + "The requested mode count must be positive decimal digits."); + } + const auto parsed = + std::from_chars(text.data(), text.data() + text.size(), value); + if (parsed.ec != std::errc{} || parsed.ptr != text.data() + text.size() || + value <= 0) { + return diagnostics_.InputFailure( + "invalid-frequency-data", location, "FREQUENCY", text, + "The requested mode count must be a positive int64 value."); + } + return true; +} + +void StepDefinitionCandidates::ParseFrequency(const KeywordBlock& block) { + if (step_.nlgeom || (step_.perturbation_explicit && step_.has_static) || + !diagnostics_.ValidateParameters( + block, {"EIGENSOLVER", "SIM", "ACOUSTIC COUPLING", "NORMALIZATION"}, + "unsupported-frequency-option")) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "FREQUENCY requires the original linear configuration."); + } + return; + } + if (block.data.size() != 1U || block.data[0].fields.empty() || + block.data[0].fields.size() > 7U) { + diagnostics_.InputFailure( + "invalid-frequency-data", block.location, block.canonical_name, "", + "FREQUENCY requires one data row with one to seven fields."); + return; + } + for (std::size_t field = 1U; field < block.data[0].fields.size(); ++field) { + if (!block.data[0].fields[field].empty()) { + diagnostics_.InputFailure( + "invalid-frequency-data", block.data[0].location, + block.canonical_name, std::to_string(field + 1U), + "Only the requested mode-count field may be non-empty."); + return; + } + } + FrequencyStepDefinition frequency{step_.name_raw, + step_.name_canonical, + step_.location, + block.location, + block.data[0].location, + 0, + step_.nlgeom_explicit, + step_.perturbation_explicit, + false, + false, + false, + false, + FrequencyEigensolver::kLanczos, + FrequencyNormalization::kMass, + {}}; + if (!ParseFrequencyModeCount(block.data[0].fields[0], + frequency.requested_mode_count, + block.data[0].location)) { + return; + } + const auto* eigensolver = diagnostics_.Parameter(block, "EIGENSOLVER"); + if (eigensolver != nullptr) { + if (!eigensolver->value || + !AsciiCaseInsensitiveEquals(*eigensolver->value, "LANCZOS")) { + diagnostics_.InputFailure("unsupported-frequency-option", block.location, + block.canonical_name, "EIGENSOLVER", + "Only EIGENSOLVER=LANCZOS is accepted."); + return; + } + frequency.eigensolver_explicit = true; + } + const auto* sim = diagnostics_.Parameter(block, "SIM"); + if (sim != nullptr) { + if (sim->value && !AsciiCaseInsensitiveEquals(*sim->value, "YES")) { + diagnostics_.InputFailure("unsupported-frequency-option", block.location, + block.canonical_name, "SIM", + "SIM accepts only a flag or YES."); + return; + } + frequency.sim_explicit = true; + } + const auto* acoustic = diagnostics_.Parameter(block, "ACOUSTIC COUPLING"); + if (acoustic != nullptr) { + if (!acoustic->value || + !AsciiCaseInsensitiveEquals(*acoustic->value, "ON")) { + diagnostics_.InputFailure("unsupported-frequency-option", block.location, + block.canonical_name, "ACOUSTIC COUPLING", + "Only ACOUSTIC COUPLING=ON is accepted."); + return; + } + frequency.acoustic_coupling_explicit = true; + } + const auto* normalization = diagnostics_.Parameter(block, "NORMALIZATION"); + if (normalization != nullptr) { + if (!normalization->value || + !AsciiCaseInsensitiveEquals(*normalization->value, "MASS")) { + diagnostics_.InputFailure("unsupported-frequency-option", block.location, + block.canonical_name, "NORMALIZATION", + "Only NORMALIZATION=MASS is accepted."); + return; + } + frequency.normalization_explicit = true; + } + step_.frequency = std::move(frequency); + definition_.warnings.push_back( + {Severity::kWarning, "source-eigensolver-mapped-to-feast", block.location, + block.canonical_name, step_.name_raw, + "The accepted source eigensolver is mapped to the FEAST backend."}); + if (step_.frequency->sim_explicit) { + definition_.warnings.push_back( + {Severity::kWarning, "source-sim-option-not-applied", block.location, + block.canonical_name, step_.name_raw, + "The accepted source SIM option has no FESA runtime effect."}); + } + if (step_.frequency->acoustic_coupling_explicit) { + definition_.warnings.push_back( + {Severity::kWarning, "acoustic-option-inapplicable-structural-only", + block.location, block.canonical_name, step_.name_raw, + "Acoustic coupling is inapplicable to this structural-only model."}); + } +} + +void StepDefinitionCandidates::ValidateEigenBoundaries( + const std::vector& boundaries) { + for (const auto& boundary : boundaries) { + if (boundary.value != 0.0) { + diagnostics_.InputFailure( + "unsupported-eigen-boundary", boundary.location, "BOUNDARY", + boundary.target, "Frequency boundaries must prescribe exact zero."); + return; + } + } +} + +void StepDefinitionCandidates::ValidateDynamicBoundaries( + const std::vector& boundaries) { + for (const auto& boundary : boundaries) { + if (boundary.value != 0.0) { + diagnostics_.InputFailure( + "unsupported-dynamic-boundary", boundary.location, "BOUNDARY", + boundary.target, + "Dynamic boundaries must be homogeneous and constant."); + return; + } + } +} + +void StepDefinitionCandidates::ParseDynamic(const KeywordBlock& block) { + if (step_.perturbation_explicit || + (model_element_family_ != ElementFamily::kSolid && + (!step_.nlgeom || model_element_family_ != ElementFamily::kShell)) || + !diagnostics_.ValidateParameters(block, {"DIRECT"}, + "unsupported-dynamic-parameter")) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "DYNAMIC requires nonlinear Shell or linear/nonlinear " + "Solid geometry."); + } + return; + } + if (model_element_family_ == ElementFamily::kSolid && + block.data.size() == 1U && block.data[0].fields.size() > 3U) { + diagnostics_.InputFailure( + "invalid-dynamic-data", block.data[0].location, block.canonical_name, + "", "Solid DYNAMIC requires h,T with at most one blank field."); + return; + } + const auto* direct = diagnostics_.Parameter(block, "DIRECT"); + if (direct == nullptr || direct->value || block.data.size() != 1U || + block.data[0].fields.size() < 2U || + std::any_of(block.data[0].fields.begin() + 2, block.data[0].fields.end(), + [](const auto& field) { return !field.empty(); })) { + diagnostics_.InputFailure( + "invalid-dynamic-data", block.location, block.canonical_name, "", + "DYNAMIC,DIRECT requires one row with increment and time period."); + return; + } + DynamicStepDefinition dynamic{step_.name_raw, + step_.name_canonical, + step_.location, + block.location, + block.data[0].location, + 0.0, + 0.0, + 0U, + step_.maximum_increments, + -0.05, + 0.275625, + 0.55, + {}, + {}}; + if (!ParseDynamicDouble(block.data[0].fields[0], dynamic.initial_increment, + block.data[0].location, block.canonical_name) || + !ParseDynamicDouble(block.data[0].fields[1], dynamic.time_period, + block.data[0].location, block.canonical_name) || + !(dynamic.initial_increment > 0.0) || !(dynamic.time_period > 0.0)) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "invalid-dynamic-data", block.data[0].location, block.canonical_name, + "", "Dynamic increment and time period must be finite and positive."); + } + return; + } + const double count = dynamic.time_period / dynamic.initial_increment; + const double rounded_count = std::round(count); + if (!std::isfinite(count) || rounded_count < 1.0 || + rounded_count > + static_cast(std::numeric_limits::max()) || + dynamic.initial_increment * rounded_count != dynamic.time_period) { + diagnostics_.InputFailure( + "invalid-dynamic-schedule", block.data[0].location, + block.canonical_name, "", + "DYNAMIC,DIRECT requires an exact positive integer number " + "of increments."); + return; + } + dynamic.increment_count = static_cast(rounded_count); + if (dynamic.increment_count > dynamic.maximum_increments) { + diagnostics_.InputFailure( + "invalid-dynamic-schedule", block.data[0].location, + block.canonical_name, "", + "DYNAMIC,DIRECT increment count cannot exceed STEP INC."); + return; + } + dynamic.nlgeom = step_.nlgeom; + step_.dynamic = std::move(dynamic); +} + +void StepDefinitionCandidates::ParseHeatTransfer(const KeywordBlock& block) { + if (model_element_family_ != ElementFamily::kThermalShell || step_.nlgeom || + step_.perturbation_explicit || + !diagnostics_.ValidateParameters(block, {"END"}, + "unsupported-thermal-option") || + block.data.size() != 1U) { + if (!diagnostics_.HasFailure()) + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "HEAT TRANSFER requires the DS4 thermal subset."); + return; + } + const auto* end = diagnostics_.Parameter(block, "END"); + if (end != nullptr && + (!end->value || !AsciiCaseInsensitiveEquals(*end->value, "PERIOD"))) { + diagnostics_.InputFailure("unsupported-thermal-option", block.location, + block.canonical_name, "END", + "HEAT TRANSFER accepts only END=PERIOD."); + return; + } + if (block.data[0].fields.size() > 5U) { + diagnostics_.InputFailure( + "invalid-thermal-time-grid", block.data[0].location, + block.canonical_name, "", + "HEAT TRANSFER permits at most three trailing empty fields."); + return; + } + const auto fields = WithoutTrailingEmpty(block.data[0].fields); + if (fields.size() != 2U) { + diagnostics_.InputFailure( + "invalid-thermal-time-grid", block.data[0].location, + block.canonical_name, "", + "HEAT TRANSFER requires increment and time period."); + return; + } + if (!diagnostics_.ParseThermalDouble(fields[0], step_.thermal_increment, + block.data[0].location, + block.canonical_name) || + !diagnostics_.ParseThermalDouble(fields[1], step_.thermal_period, + block.data[0].location, + block.canonical_name) || + !(step_.thermal_increment > 0.0) || !(step_.thermal_period > 0.0)) { + if (!diagnostics_.HasFailure()) + diagnostics_.InputFailure( + "invalid-thermal-time-grid", block.data[0].location, + block.canonical_name, "", + "Thermal increment and period must be finite and positive."); + return; + } + const auto grid = ThermalTimeGrid::Create( + step_.thermal_period, step_.thermal_increment, step_.maximum_increments); + if (!grid.HasValue()) { + auto diagnostic = grid.GetStatus().Diagnostics().front(); + diagnostic.location = block.data[0].location; + diagnostic.keyword = block.canonical_name; + diagnostic.entity_identity = step_.name_raw; + diagnostics_.Fail( + grid.GetStatus().Category().value_or(FailureCategory::kInput), + std::move(diagnostic.code), diagnostic.location, + std::move(diagnostic.keyword), std::move(diagnostic.entity_identity), + std::move(diagnostic.message)); + return; + } + step_.has_heat_transfer = true; +} + +void StepDefinitionCandidates::ParseCflux(const KeywordBlock& block) { + if (!diagnostics_.ValidateParameters(block, {}) || block.data.empty()) { + if (!diagnostics_.HasFailure()) + diagnostics_.InputFailure("invalid-data-arity", block.location, + block.canonical_name, "", + "CFLUX requires target, DOF, power rows."); + return; + } + for (const auto& row : block.data) { + if (row.fields.size() != 3U || row.fields[0].empty()) { + diagnostics_.InputFailure("invalid-data-arity", row.location, + block.canonical_name, "", + "CFLUX rows require target, DOF, power."); + return; + } + std::int64_t dof = 0; + double power = 0.0; + if (!diagnostics_.ParseInteger(row.fields[1], dof, row.location, + block.canonical_name, true) || + !diagnostics_.ParseThermalDouble(row.fields[2], power, row.location, + block.canonical_name) || + (dof != 11 && dof != 15)) { + diagnostics_.InputFailure("invalid-dof", row.location, + block.canonical_name, row.fields[0], + "CFLUX supports DOF 11 or 15."); + return; + } + step_.thermal_fluxes.push_back( + {row.fields[0], static_cast(dof), power, row.location}); + } +} + +void StepDefinitionCandidates::ParseStatic(const KeywordBlock& block) { + if (model_element_family_ == ElementFamily::kSolid && + diagnostics_.Parameter(block, "DIRECT")) { + if (step_.perturbation_explicit || step_.has_static || step_.frequency || + step_.dynamic) { + diagnostics_.InputFailure( + "unsupported-analysis-procedure", block.location, + block.canonical_name, step_.name_raw, + "STATIC DIRECT requires one non-perturbation procedure."); + return; + } + if (!diagnostics_.ValidateParameters(block, {"DIRECT"})) return; + const auto* direct = diagnostics_.Parameter(block, "DIRECT"); + if (direct->value || block.data.size() != 1U || + (block.data[0].fields.size() < 2U || block.data[0].fields.size() > 3U || + std::any_of(block.data[0].fields.begin() + 2, + block.data[0].fields.end(), + [](const auto& field) { return !field.empty(); }))) { + diagnostics_.InputFailure("invalid-static-data", block.location, + block.canonical_name, "DIRECT", + "STATIC DIRECT requires exactly h,T."); + return; + } + double h = 0.0; + double period = 0.0; + if (!diagnostics_.ParseDouble(block.data[0].fields[0], h, + block.data[0].location, "STATIC") || + !diagnostics_.ParseDouble(block.data[0].fields[1], period, + block.data[0].location, "STATIC")) + return; + const double count = std::round(period / h); + if (!(h > 0.0) || !(period > 0.0) || !std::isfinite(count) || count < 1.0 || + count > static_cast(step_.maximum_increments) || + h * count != period) { + diagnostics_.InputFailure( + "invalid-static-schedule", block.data[0].location, + block.canonical_name, "DIRECT", + "STATIC DIRECT requires positive exact N*h=T and N<=INC."); + return; + } + step_.static_values = {h, period, h, h}; + step_.static_direct = true; + step_.static_increment_count = static_cast(count); + step_.has_static = true; + return; + } + if (step_.perturbation_explicit || step_.frequency) { + diagnostics_.InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, "PERTURBATION", + "PERTURBATION is supported only with FREQUENCY."); + return; + } + if (step_.has_heat_transfer || step_.has_static || + !diagnostics_.ValidateParameters(block, {}) || block.data.size() != 1U || + block.data[0].fields.size() != 4U) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.location, block.canonical_name, "", + "STATIC requires exactly one row of four values."); + } + return; + } + for (std::size_t field = 0U; field < 4U; ++field) { + const std::string& text = block.data[0].fields[field]; + const bool parsed = step_.nlgeom + ? ParseNonlinearStaticDouble( + text, step_.static_values[field], + block.data[0].location, block.canonical_name) + : diagnostics_.ParseDouble( + text, step_.static_values[field], + block.data[0].location, block.canonical_name); + if (!parsed) { + return; + } + if (step_.static_values[field] <= 0.0) { + diagnostics_.InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.data[0].location, block.canonical_name, + "", "All four STATIC fields must be positive."); + return; + } + } + if (step_.static_values[2] > step_.static_values[3]) { + diagnostics_.InputFailure( + step_.nlgeom ? "invalid-nonlinear-static-data" : "invalid-static-data", + block.data[0].location, block.canonical_name, "", + "STATIC minimum increment cannot exceed maximum increment."); + return; + } + if (step_.nlgeom && step_.static_values[1] != 1.0) { + diagnostics_.InputFailure( + "invalid-nonlinear-static-data", block.data[0].location, + block.canonical_name, "", + "The nonlinear STATIC time period must be exactly 1.0."); + return; + } + step_.has_static = true; +} + +void StepDefinitionCandidates::ParseOutputRoot(const KeywordBlock& block) { + if (step_.has_heat_transfer) { + const auto* field = diagnostics_.Parameter(block, "FIELD"); + const auto* history = diagnostics_.Parameter(block, "HISTORY"); + const auto* variable = diagnostics_.Parameter(block, "VARIABLE"); + const auto* frequency = diagnostics_.Parameter(block, "FREQUENCY"); + const bool valid_field = + field && !field->value && variable && variable->value && + AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"); + const bool valid_history = history && !history->value && frequency && + frequency->value && *frequency->value == "0"; + if (!diagnostics_.RequireNoData(block)) return; + if (block.parameters.size() != 2U || (!valid_field && !valid_history)) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Thermal OUTPUT accepts FIELD, VARIABLE=PRESELECT or " + "HISTORY, FREQUENCY=0."); + return; + } + AddIgnoredWarning(block); + return; + } + if (!diagnostics_.ValidateParameters( + block, (step_.dynamic || step_.has_heat_transfer) + ? std::vector{"FIELD", "HISTORY", + "VARIABLE", "FREQUENCY"} + : std::vector{"FIELD", "HISTORY", + "VARIABLE"})) { + return; + } + const auto* field = diagnostics_.Parameter(block, "FIELD"); + const auto* history = diagnostics_.Parameter(block, "HISTORY"); + const auto* variable = diagnostics_.Parameter(block, "VARIABLE"); + if ((field == nullptr) == (history == nullptr) || + (field != nullptr && field->value) || + (history != nullptr && history->value)) { + diagnostics_.InputFailure( + step_.nlgeom ? "invalid-keyword-parameter" : "unsupported-keyword", + block.location, block.canonical_name, "", + "OUTPUT must select exactly FIELD or HISTORY."); + return; + } + if (model_element_family_ == ElementFamily::kSolid && + ((variable && (!variable->value || !AsciiCaseInsensitiveEquals( + *variable->value, "PRESELECT"))) || + !diagnostics_.RequireNoData(block))) { + if (!diagnostics_.HasFailure()) + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, + "VARIABLE", "Solid OUTPUT accepts only PRESELECT requests."); + return; + } + if (step_.nlgeom && + (variable == nullptr || !variable->value || + !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) { + diagnostics_.InputFailure("invalid-keyword-parameter", block.location, + block.canonical_name, "VARIABLE", + "Nonlinear OUTPUT requires VARIABLE=PRESELECT."); + return; + } + if (step_.dynamic) { + const auto* frequency = diagnostics_.Parameter(block, "FREQUENCY"); + if (!diagnostics_.ValidateParameters( + block, {"FIELD", "HISTORY", "VARIABLE", "FREQUENCY"}) || + variable == nullptr || !variable->value || + !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT") || + (frequency != nullptr && + (!frequency->value || *frequency->value != "1")) || + !diagnostics_.RequireNoData(block)) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Dynamic OUTPUT accepts only VARIABLE=PRESELECT, FREQUENCY=1."); + } + return; + } + } else if (step_.frequency && + ((variable != nullptr && + (!variable->value || + !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) || + !diagnostics_.RequireNoData(block))) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Frequency OUTPUT accepts only VARIABLE=PRESELECT."); + } + return; + } + active_output_ = true; + active_output_is_field_ = field != nullptr; + AddIgnoredWarning(block); +} + +void StepDefinitionCandidates::ParseOutputChild(const KeywordBlock& block) { + if (step_.has_heat_transfer) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Thermal output children are outside the approved subset."); + return; + } + if (!active_output_) { + diagnostics_.InputFailure( + "invalid-keyword-location", block.location, block.canonical_name, "", + "Output variable keywords require an active OUTPUT request."); + return; + } + if (model_element_family_ == ElementFamily::kSolid && step_.dynamic) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Solid dynamic output children are outside the approved subset."); + return; + } + if (model_element_family_ == ElementFamily::kSolid && step_.has_static) { + const auto* variable = diagnostics_.Parameter(block, "VARIABLE"); + const auto* directions = diagnostics_.Parameter(block, "DIRECTIONS"); + const bool node = block.canonical_name == "NODE OUTPUT"; + const bool element = block.canonical_name == "ELEMENT OUTPUT"; + const bool contact = block.canonical_name == "CONTACT OUTPUT"; + if (!active_output_is_field_ || (!node && !element && !contact) || + !diagnostics_.ValidateParameters( + block, element + ? std::vector{"VARIABLE", "DIRECTIONS"} + : std::vector{"VARIABLE"}) || + (directions && + (!directions->value || + !AsciiCaseInsensitiveEquals(*directions->value, "YES"))) || + (variable && + (!variable->value || + !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) || + (contact && (!variable || !block.data.empty()))) { + if (!diagnostics_.HasFailure()) + diagnostics_.InputFailure("unsupported-keyword", block.location, + block.canonical_name, "", + "Solid static output child is unsupported."); + return; + } + for (const auto& row : block.data) { + for (const auto& field : row.fields) { + const std::string token = AsciiUppercase(field); + if (!(node ? (token == "U" || token == "RF") + : (token == "S" || token == "E"))) { + diagnostics_.InputFailure( + "unsupported-keyword", row.location, block.canonical_name, field, + "Solid output quantities must be physical supported " + "components."); + return; + } + } + } + } + if (step_.frequency) { + const std::string_view required_variable = + block.canonical_name == "NODE OUTPUT" ? "PRESELECT" : "ALL"; + const auto* variable = diagnostics_.Parameter(block, "VARIABLE"); + if ((block.canonical_name != "NODE OUTPUT" && + block.canonical_name != "ENERGY OUTPUT") || + (block.canonical_name == "NODE OUTPUT" && !active_output_is_field_) || + (block.canonical_name == "ENERGY OUTPUT" && active_output_is_field_) || + !diagnostics_.ValidateParameters(block, {"VARIABLE"}) || + variable == nullptr || !variable->value || + !AsciiCaseInsensitiveEquals(*variable->value, required_variable) || + !diagnostics_.RequireNoData(block)) { + if (!diagnostics_.HasFailure()) { + diagnostics_.InputFailure( + "unsupported-keyword", block.location, block.canonical_name, "", + "Frequency output child is outside the approved subset."); + } + return; + } + } + AddIgnoredWarning(block); +} + +void StepDefinitionCandidates::AddIgnoredWarning(const KeywordBlock& block) { + // One warning per allowlisted keyword keeps no-op provenance stable; + // subordinate variable rows remain attached to that keyword record. + definition_.warnings.push_back( + {Severity::kWarning, + step_.dynamic ? "ignored-output-request" : "ignored-input-keyword", + block.location, block.canonical_name, "", + "The allowlisted Abaqus keyword is " + "ignored without semantic effect."}); +} + +std::optional> +StepDefinitionCandidates::ResolveNodeTarget( + const SourceTargetResolver& resolver, const std::string& target, + const SourceLocation& location, const std::string& keyword) { + auto resolved = resolver.Resolve({SourceEntityKind::kNode, "", target}); + if (!resolved.HasValue()) { + diagnostics_.InputFailure( + "unresolved-reference", location, keyword, target, + "The boundary or load target must resolve unambiguously to one " + "node or one node set."); + return std::nullopt; + } + std::vector indices; + indices.reserve(resolved.Value().size()); + for (const auto& entry : resolved.Value()) { + if (model_element_family_ == ElementFamily::kThermalShell && + !thermal_active_nodes_[entry.entity_index]) { + diagnostics_.ModelFailure( + "inactive-thermal-target", location, keyword, target, + "Thermal targets must connect to an active DS4 element."); + return std::nullopt; + } + indices.push_back(entry.entity_index); + } + return indices; +} + +void StepDefinitionCandidates::FinalizeStep() { + if (step_.has_heat_transfer) { + thermal_active_nodes_.assign(definition_.nodes.size(), false); + for (const auto& element : definition_.thermal_elements) + for (const auto node : element.node_indices) + thermal_active_nodes_[node] = true; + const SourceTargetIndex target_index = SourceTargetIndex::FromNodeDefinitions(definition_.nodes, definition_.node_sets); + const SourceTargetResolver resolver{target_index}; + const auto append_boundaries = + [this, &resolver]( + const std::vector& rows, + std::map, double>* values, + std::vector* out) { + for (const auto& row : rows) { + const auto nodes = ResolveNodeTarget(resolver, row.target, + row.location, "BOUNDARY"); + if (!nodes) return false; + for (const EntityIndex node : *nodes) { + const auto key = std::make_pair(node, row.dof); + const auto existing = values->find(key); + if (existing != values->end() && existing->second != row.value) { + return diagnostics_.InputFailure( + "conflicting-boundary-condition", row.location, "BOUNDARY", + row.target, + "Expanded thermal boundaries prescribe " + "different values."); + } + (*values)[key] = row.value; + out->push_back({node, row.dof, row.value, row.location}); + } + } + return true; + }; + std::map, double> model_values; + if (!append_boundaries(thermal_model_boundaries_, &model_values, + &definition_.thermal_model_boundaries)) + return; + std::vector step_boundaries; + std::map, double> step_values; + if (!append_boundaries(step_.thermal_boundaries, &step_values, + &step_boundaries)) + return; + std::map initial_values; + for (const auto& row : thermal_initial_conditions_) { + const auto nodes = ResolveNodeTarget(resolver, row.target, row.location, + "INITIAL CONDITIONS"); + if (!nodes) return; + for (const EntityIndex node : *nodes) { + const auto inserted = initial_values.emplace(node, row.value); + if (!inserted.second && inserted.first->second != row.value) { + diagnostics_.InputFailure( + "conflicting-initial-temperature", row.location, + "INITIAL CONDITIONS", row.target, + "Expanded initial temperatures prescribe different values."); + return; + } + definition_.thermal_initial_conditions.push_back( + {node, row.value, row.location}); + } + } + std::vector loads; + for (const auto& row : step_.thermal_fluxes) { + const auto nodes = + ResolveNodeTarget(resolver, row.target, row.location, "CFLUX"); + if (!nodes) return; + for (const EntityIndex node : *nodes) { + loads.push_back({node, row.dof, row.power, row.location, loads.size()}); + } + } + definition_.thermal_step = {step_.name_raw, + step_.thermal_increment, + step_.thermal_period, + step_.maximum_increments, + false, + std::move(step_boundaries), + std::move(loads), + step_.location}; + return; + } + std::vector boundaries = model_boundaries_; + boundaries.insert(boundaries.end(), step_.boundaries.begin(), + step_.boundaries.end()); + if (step_.frequency) { + ValidateEigenBoundaries(boundaries); + if (diagnostics_.HasFailure()) { + return; + } + } + if (step_.dynamic) { + ValidateDynamicBoundaries(boundaries); + if (diagnostics_.HasFailure()) { + return; + } + } + const SourceTargetIndex target_index = SourceTargetIndex::FromNodeDefinitions(definition_.nodes, definition_.node_sets); + const SourceTargetResolver target_resolver{target_index}; + + if (model_element_family_ == ElementFamily::kSolid) { + std::vector physical; + for (auto boundary : boundaries) { + if (!ResolveNodeTarget(target_resolver, boundary.target, + boundary.location, "BOUNDARY")) + return; + if (boundary.last_dof > 3) { + if (boundary.value != 0.0) { + diagnostics_.InputFailure( + "unsupported-solid-rotation-boundary", boundary.location, + "BOUNDARY", boundary.target, + "Solid rotational boundaries must be exact zero to be " + "inactive."); + return; + } + definition_.warnings.push_back( + {Severity::kWarning, "inactive-solid-rotation-boundary", + boundary.location, "BOUNDARY", boundary.target, + "Exact-zero rotational boundary DOFs " + + std::to_string(std::max(4, boundary.first_dof)) + ".." + + std::to_string(boundary.last_dof) + + " are inactive; Solid equations contain translations " + "only."}); + boundary.last_dof = 3; + } + if (boundary.first_dof <= boundary.last_dof) + physical.push_back(std::move(boundary)); + } + boundaries = std::move(physical); + std::vector active(definition_.nodes.size(), false); + for (const auto& element : definition_.solid_elements) + for (const auto node : element.node_indices) active[node] = true; + for (std::size_t node = 0U; node < active.size(); ++node) { + if (!active[node]) { + diagnostics_.ModelFailure( + "unused-solid-node", definition_.nodes[node].location, "NODE", + definition_.nodes[node].source_id.source_label_text, + "Every Solid node must connect to a C3D8 element."); + return; + } + } + } + std::map, double> prescribed_values; + for (const auto& boundary : boundaries) { + auto target = ResolveNodeTarget(target_resolver, boundary.target, + boundary.location, "BOUNDARY"); + if (!target) { + return; + } + for (const auto node : *target) { + for (int dof = boundary.first_dof; dof <= boundary.last_dof; ++dof) { + const auto key = std::make_pair(node, dof); + const auto existing = prescribed_values.find(key); + if (existing != prescribed_values.end() && + existing->second != boundary.value) { + diagnostics_.InputFailure( + "conflicting-boundary-condition", boundary.location, "BOUNDARY", + boundary.target, + "Expanded boundary rows prescribe different values to " + "one node/DOF."); + return; + } + prescribed_values[key] = boundary.value; + } + } + } + for (const auto& load : step_.loads) { + if (!ResolveNodeTarget(target_resolver, load.target, load.location, + "CLOAD")) { + return; + } + } + if (step_.frequency) { + step_.frequency->boundaries = std::move(boundaries); + definition_.frequency_step = std::move(step_.frequency); + return; + } + if (step_.dynamic) { + step_.dynamic->boundaries = std::move(boundaries); + step_.dynamic->loads = step_.loads; + definition_.dynamic_step = std::move(step_.dynamic); + return; + } + std::vector surface_pressure_loads; + surface_pressure_loads.reserve(step_.surface_pressure_loads.size()); + for (const auto& load : step_.surface_pressure_loads) { + const auto surface = std::find_if( + definition_.element_surfaces.begin(), + definition_.element_surfaces.end(), [&load](const auto& candidate) { + return AsciiCaseInsensitiveEquals(candidate.surface_name_raw, + load.surface_name); + }); + if (surface == definition_.element_surfaces.end()) { + diagnostics_.InputFailure( + "missing-reference", load.data_location, "DSLOAD", load.surface_name, + "A DSLOAD surface must resolve after surface validation."); + return; + } + surface_pressure_loads.push_back( + {step_.name_raw, step_.name_canonical, + static_cast( + std::distance(definition_.element_surfaces.begin(), surface)), + load.surface_name, AsciiUppercase(load.surface_name), "P", + load.magnitude, load.magnitude_raw, load.keyword_location, + load.data_location, load.data_ordinal, load.load_ordinal}); + } + + // Static time-control values are provenance only: V0 creates exactly + // the canonical final frame 0 and performs no increment loop here. + definition_.steps.push_back( + {model_element_family_ == ElementFamily::kSolid ? step_.name_raw + : "Step-1", + std::move(boundaries), step_.loads, std::move(surface_pressure_loads), + step_.procedure_kind, step_.nlgeom, step_.static_values[0], + step_.static_values[1], step_.static_values[2], step_.static_values[3], + step_.location}); + definition_.steps.back().direct = step_.static_direct; + definition_.steps.back().increment_count = step_.static_increment_count; + definition_.steps.back().maximum_increments = step_.maximum_increments; +} + Status StepDefinitionMapper::Map(DomainMappingContext& context) const { return context.FinalizeStep(); } diff --git a/src/fesa/io/abaqus/surface_definition_candidates.h b/src/fesa/io/abaqus/surface_definition_candidates.h new file mode 100644 index 0000000..ce9ed9d --- /dev/null +++ b/src/fesa/io/abaqus/surface_definition_candidates.h @@ -0,0 +1,87 @@ +#ifndef FESA_IO_ABAQUS_SURFACE_DEFINITION_CANDIDATES_H_ +#define FESA_IO_ABAQUS_SURFACE_DEFINITION_CANDIDATES_H_ + +#include +#include +#include +#include +#include +#include + +#include "io/abaqus/topology_candidates.h" + +namespace fesa::abaqus_internal { + +/// @brief Checks the source name syntax shared by surface and pressure records. +bool IsPressureNameToken(std::string_view text) noexcept; + +/// @brief Owns assembly surface candidates and ordered facet resolution. +/// @note Context diagnostics, topology, family, and candidate outlive this +/// stage. +class SurfaceDefinitionCandidates { + public: + /// @brief Borrows context services while owning this uncommitted mapping + /// stage. + SurfaceDefinitionCandidates(MappingDiagnostics& diagnostics, + const TopologyCandidates& topology, + const std::optional& family, + ModelDefinition& definition) + : diagnostics_{diagnostics}, + topology_{topology}, + model_element_family_{family}, + definition_{definition} {} + + /// @brief Copies first-surface provenance for material procedure validation. + std::optional FirstSurface() const; + + /// @brief Owns one source surface after assembly-scope validation. + void ParseElementSurface(const KeywordBlock& block); + + /// @brief Resolves ordered facets while retaining first failure and warning + /// order. + void ResolveElementSurfaces(); + + private: + struct RawSurfaceMember { + std::string target; + ShellSurfaceSide side; + SourceLocation location; + std::size_t ordinal; + }; + + struct RawElementSurface { + std::string name; + SourceLocation location; + std::size_t declaration_ordinal; + std::vector members; + }; + + bool ContainsSurfaceName(const std::string& name) const; + + bool AppendSurfaceFacet( + const RawSurfaceMember& member, const RawInstance& raw_instance, + std::size_t instance_ordinal, EntityIndex element_index, + SurfaceMemberKind member_kind, const std::string& elset_name_raw, + std::vector>* + candidates); + + bool ResolveDirectSurfaceMember( + const RawSurfaceMember& member, + std::vector>* + candidates); + + bool ResolveElsetSurfaceMember( + const RawSurfaceMember& member, + std::vector>* + candidates); + + MappingDiagnostics& diagnostics_; + const TopologyCandidates& topology_; + const std::optional& model_element_family_; + ModelDefinition& definition_; + std::vector element_surfaces_; +}; + +} // namespace fesa::abaqus_internal + +#endif // FESA_IO_ABAQUS_SURFACE_DEFINITION_CANDIDATES_H_ diff --git a/src/fesa/io/abaqus/surface_definition_mapper.cpp b/src/fesa/io/abaqus/surface_definition_mapper.cpp index 0855e11..9931d7b 100644 --- a/src/fesa/io/abaqus/surface_definition_mapper.cpp +++ b/src/fesa/io/abaqus/surface_definition_mapper.cpp @@ -1,9 +1,363 @@ #include "io/abaqus/surface_definition_mapper.h" +#include +#include +#include +#include + +#include "fesa/core/ascii.h" #include "io/abaqus/domain_mapping_context.h" +#include "io/abaqus/surface_definition_candidates.h" namespace fesa::abaqus_internal { +bool IsPressureNameToken(const std::string_view text) noexcept { + if (text.empty() || text.size() > 80U) { + return false; + } + const auto is_initial = [](const char value) { + return (value >= 'A' && value <= 'Z') || (value >= 'a' && value <= 'z') || + value == '_'; + }; + const auto is_subsequent = [is_initial](const char value) { + return is_initial(value) || (value >= '0' && value <= '9') || + value == '-' || value == '_'; + }; + return is_initial(text.front()) && + std::all_of(text.begin() + 1, text.end(), is_subsequent); +} + +std::optional +SurfaceDefinitionCandidates::FirstSurface() const { + if (element_surfaces_.empty()) return std::nullopt; + return MaterialProcedureView::Surface{element_surfaces_.front().location, + element_surfaces_.front().name}; +} + +bool SurfaceDefinitionCandidates::ContainsSurfaceName( + const std::string& name) const { + return std::any_of(element_surfaces_.begin(), element_surfaces_.end(), + [&name](const RawElementSurface& surface) { + return AsciiCaseInsensitiveEquals(surface.name, name); + }); +} + +void SurfaceDefinitionCandidates::ParseElementSurface( + const KeywordBlock& block) { + if (!diagnostics_.ValidateParameters(block, {"TYPE", "NAME"}, + "unsupported-parameter")) { + return; + } + const auto* type = diagnostics_.RequiredParameterValue(block, "TYPE"); + const auto* name = diagnostics_.RequiredParameterValue(block, "NAME"); + if (type == nullptr || name == nullptr) { + return; + } + if (!IsPressureNameToken(*name)) { + diagnostics_.InputFailure( + "invalid-surface-name", block.location, block.canonical_name, *name, + "Surface names must use the approved ASCII name syntax."); + return; + } + if (!AsciiCaseInsensitiveEquals(*type, "ELEMENT")) { + diagnostics_.InputFailure( + "unsupported-surface-type", block.location, block.canonical_name, *type, + "Only TYPE=ELEMENT belongs to the approved surface subset."); + return; + } + if (ContainsSurfaceName(*name)) { + diagnostics_.InputFailure( + "duplicate-entity", block.location, block.canonical_name, *name, + "Surface names are unique in the assembly namespace."); + return; + } + if (block.data.empty()) { + diagnostics_.InputFailure( + "empty-surface", block.location, block.canonical_name, *name, + "An element surface requires at least one member."); + return; + } + + RawElementSurface surface{ + *name, block.location, element_surfaces_.size(), {}}; + for (std::size_t ordinal = 0U; ordinal < block.data.size(); ++ordinal) { + const auto& row = block.data[ordinal]; + if (row.fields.size() != 2U || row.fields[0].empty() || + row.fields[1].empty()) { + diagnostics_.InputFailure( + "invalid-data-arity", row.location, block.canonical_name, *name, + "Surface rows require one member and SPOS or SNEG."); + return; + } + ShellSurfaceSide side = ShellSurfaceSide::kSpos; + if (AsciiCaseInsensitiveEquals(row.fields[1], "SPOS")) { + side = ShellSurfaceSide::kSpos; + } else if (AsciiCaseInsensitiveEquals(row.fields[1], "SNEG")) { + side = ShellSurfaceSide::kSneg; + } else { + diagnostics_.InputFailure("unsupported-surface-side", row.location, + block.canonical_name, row.fields[1], + "Surface sides must be SPOS or SNEG."); + return; + } + surface.members.push_back({row.fields[0], side, row.location, ordinal}); + } + element_surfaces_.push_back(std::move(surface)); +} + +bool SurfaceDefinitionCandidates::AppendSurfaceFacet( + const RawSurfaceMember& member, const RawInstance& raw_instance, + std::size_t instance_ordinal, EntityIndex element_index, + SurfaceMemberKind member_kind, const std::string& elset_name_raw, + std::vector>* + candidates) { + const bool thermal = model_element_family_ == ElementFamily::kThermalShell; + const auto element_count = thermal ? definition_.thermal_elements.size() + : definition_.shell_elements.size(); + if (static_cast(element_index) >= element_count) { + return diagnostics_.InputFailure( + "unsupported-element-formulation", member.location, "SURFACE", + member.target, + "Element surfaces may resolve only to S4 or S4R shell elements."); + } + const RawPart* part = topology_.FindPart(raw_instance.part_name); + if (part == nullptr) { + return diagnostics_.InputFailure( + "unresolved-reference", member.location, "SURFACE", member.target, + "The surface instance must resolve to its source part."); + } + const auto& source_id = + thermal ? definition_.thermal_elements[element_index].source_id + : definition_.shell_elements[element_index].source_id; + const std::string source_type = + thermal ? "DS4" + : (definition_.shell_elements[element_index].source_type == + ShellSourceElementType::kS4 + ? "S4" + : "S4R"); + ElementSurfaceFacetDefinition facet{element_index, + 0U, + part->name, + AsciiUppercase(part->name), + raw_instance.name, + AsciiUppercase(raw_instance.name), + source_id.source_label, + source_id.source_label_text, + source_type, + member.side, + member.location, + member.ordinal, + member_kind, + elset_name_raw, + member_kind == SurfaceMemberKind::kElset + ? AsciiUppercase(elset_name_raw) + : ""}; + candidates->push_back({std::move(facet), instance_ordinal}); + return true; +} + +bool SurfaceDefinitionCandidates::ResolveDirectSurfaceMember( + const RawSurfaceMember& member, + std::vector>* + candidates) { + const std::size_t dot = member.target.find('.'); + if (dot == std::string::npos || dot == 0U || + dot + 1U >= member.target.size() || + member.target.find('.', dot + 1U) != std::string::npos) { + return diagnostics_.InputFailure( + "unresolved-reference", member.location, "SURFACE", member.target, + "A direct surface member must be instance.positive-element-label."); + } + const std::string instance_name = member.target.substr(0U, dot); + if (!IsPressureNameToken(instance_name)) { + return diagnostics_.InputFailure( + "unsupported-surface-target", member.location, "SURFACE", member.target, + "A direct surface member must use an identity instance name."); + } + std::int64_t source_label = 0; + if (!diagnostics_.ParseInteger(member.target.substr(dot + 1U), source_label, + member.location, "SURFACE", true)) { + return false; + } + const auto raw_instance = std::find_if( + topology_.Instances().begin(), topology_.Instances().end(), + [&instance_name](const RawInstance& value) { + return AsciiCaseInsensitiveEquals(value.name, instance_name); + }); + if (raw_instance == topology_.Instances().end()) { + if (topology_.FindPart(instance_name) != nullptr) { + return diagnostics_.InputFailure( + "unsupported-surface-target", member.location, "SURFACE", + member.target, + "A direct surface member cannot use a part name as an instance."); + } + return diagnostics_.InputFailure( + "unresolved-reference", member.location, "SURFACE", member.target, + "A direct surface member instance must resolve."); + } + const auto instance = std::find_if( + definition_.instances.begin(), definition_.instances.end(), + [&raw_instance](const InstanceDefinition& value) { + return AsciiCaseInsensitiveEquals(value.name, raw_instance->name); + }); + const auto element = std::find_if( + instance->element_mappings.begin(), instance->element_mappings.end(), + [source_label](const SourceIndexMapping& value) { + return value.source_label == source_label; + }); + if (element == instance->element_mappings.end()) { + return diagnostics_.InputFailure( + "unresolved-reference", member.location, "SURFACE", member.target, + "A direct surface member must resolve to a supported shell element."); + } + return AppendSurfaceFacet(member, *raw_instance, + static_cast(std::distance( + topology_.Instances().begin(), raw_instance)), + element->internal_index, SurfaceMemberKind::kDirect, + "", candidates); +} + +bool SurfaceDefinitionCandidates::ResolveElsetSurfaceMember( + const RawSurfaceMember& member, + std::vector>* + candidates) { + if (!IsPressureNameToken(member.target)) { + return diagnostics_.InputFailure( + "unsupported-surface-target", member.location, "SURFACE", member.target, + "A surface ELSET must use the approved name syntax."); + } + const auto raw_set = std::find_if( + topology_.AssemblySets().begin(), topology_.AssemblySets().end(), + [&member](const RawAssemblySet& value) { + return !value.is_node_set && + AsciiCaseInsensitiveEquals(value.name, member.target); + }); + if (raw_set == topology_.AssemblySets().end()) { + const bool part_scoped = std::any_of( + topology_.Parts().begin(), topology_.Parts().end(), + [this, &member](const RawPart& part) { + return FindSet(part.element_sets, member.target) != nullptr; + }); + if (part_scoped) { + return diagnostics_.InputFailure( + "cross-scope-target", member.location, "SURFACE", member.target, + "A surface ELSET must be declared at assembly scope."); + } + return diagnostics_.InputFailure( + "missing-reference", member.location, "SURFACE", member.target, + "A surface ELSET must be assembly-scoped and explicit-instance."); + } + const auto raw_instance = std::find_if( + topology_.Instances().begin(), topology_.Instances().end(), + [&raw_set](const RawInstance& value) { + return AsciiCaseInsensitiveEquals(value.name, raw_set->instance_name); + }); + if (raw_instance == topology_.Instances().end()) { + return diagnostics_.InputFailure( + "unresolved-reference", member.location, "SURFACE", member.target, + "The surface ELSET instance must resolve."); + } + const auto element_set = std::find_if( + definition_.element_sets.begin(), definition_.element_sets.end(), + [&raw_set](const ElementSet& value) { + return AsciiCaseInsensitiveEquals(value.name, raw_set->name) && + value.instance_name && + AsciiCaseInsensitiveEquals(*value.instance_name, + raw_set->instance_name); + }); + if (element_set == definition_.element_sets.end()) { + return diagnostics_.InputFailure( + "unresolved-reference", member.location, "SURFACE", member.target, + "The surface ELSET must expand in its explicit instance."); + } + for (const EntityIndex element_index : element_set->element_indices) { + if (!AppendSurfaceFacet(member, *raw_instance, + static_cast(std::distance( + topology_.Instances().begin(), raw_instance)), + element_index, SurfaceMemberKind::kElset, + member.target, candidates)) { + return false; + } + } + return true; +} + +void SurfaceDefinitionCandidates::ResolveElementSurfaces() { + std::vector resolved_surfaces; + resolved_surfaces.reserve(element_surfaces_.size()); + for (const auto& surface : element_surfaces_) { + std::vector> + candidates; + for (const auto& member : surface.members) { + const bool is_direct = member.target.find('.') != std::string::npos; + if (!(is_direct ? ResolveDirectSurfaceMember(member, &candidates) + : ResolveElsetSurfaceMember(member, &candidates))) { + return; + } + } + if (candidates.empty()) { + diagnostics_.InputFailure( + "empty-surface", surface.location, "SURFACE", surface.name, + "An element surface must resolve at least one facet."); + return; + } + + std::vector> + unique_facets; + for (auto& candidate : candidates) { + const auto same_element = + std::find_if(unique_facets.begin(), unique_facets.end(), + [&candidate](const auto& existing) { + return existing.first.instance_name_canonical == + candidate.first.instance_name_canonical && + existing.first.source_element_label == + candidate.first.source_element_label; + }); + if (same_element != unique_facets.end()) { + if (same_element->first.side != candidate.first.side) { + diagnostics_.InputFailure( + "conflicting-surface-membership", + candidate.first.first_member_location, "SURFACE", surface.name, + "One shell element cannot appear on both surface sides."); + return; + } + if (model_element_family_ != ElementFamily::kThermalShell) { + definition_.warnings.push_back( + {Severity::kWarning, "duplicate-surface-member-normalized", + candidate.first.first_member_location, "SURFACE", surface.name, + "A repeated same-side surface member was normalized once."}); + } + continue; + } + unique_facets.push_back(std::move(candidate)); + } + std::sort(unique_facets.begin(), unique_facets.end(), + [](const auto& lhs, const auto& rhs) { + const int lhs_side = + lhs.first.side == ShellSurfaceSide::kSpos ? 0 : 1; + const int rhs_side = + rhs.first.side == ShellSurfaceSide::kSpos ? 0 : 1; + return std::tie(lhs.second, lhs.first.source_element_label, + lhs_side) < + std::tie(rhs.second, rhs.first.source_element_label, + rhs_side); + }); + + ElementSurfaceDefinition resolved{surface.name, + AsciiUppercase(surface.name), + {}, + surface.location, + surface.declaration_ordinal}; + resolved.facets.reserve(unique_facets.size()); + for (std::size_t ordinal = 0U; ordinal < unique_facets.size(); ++ordinal) { + unique_facets[ordinal].first.facet_ordinal = ordinal; + resolved.facets.push_back(std::move(unique_facets[ordinal].first)); + } + resolved_surfaces.push_back(std::move(resolved)); + } + definition_.element_surfaces = std::move(resolved_surfaces); +} + Status SurfaceDefinitionMapper::Map(DomainMappingContext& context) const { return context.FinalizeElementSurfaces(); } diff --git a/src/fesa/io/abaqus/topology_candidates.h b/src/fesa/io/abaqus/topology_candidates.h new file mode 100644 index 0000000..c74eb87 --- /dev/null +++ b/src/fesa/io/abaqus/topology_candidates.h @@ -0,0 +1,133 @@ +#ifndef FESA_IO_ABAQUS_TOPOLOGY_CANDIDATES_H_ +#define FESA_IO_ABAQUS_TOPOLOGY_CANDIDATES_H_ + +#include +#include +#include +#include + +#include "fesa/core/source_identity.h" +#include "io/abaqus/material_property_candidates.h" + +namespace fesa::abaqus_internal { + +struct RawNode { + std::int64_t label; + std::string label_text; + std::array coordinates; + SourceLocation location; +}; + +struct RawElement { + enum class Type { kB33, kS4, kS4r, kDs4, kC3d8 }; + + std::int64_t label; + std::string label_text; + Type type; + std::vector node_labels; + SourceLocation location; +}; + +enum class ElementFamily { kBeam, kShell, kThermalShell, kSolid }; + +struct RawSet { + std::string name; + std::vector members; + SourceLocation location; +}; + +struct RawPart { + std::string name; + SourceLocation location; + std::vector nodes; + std::vector elements; + std::vector node_sets; + std::vector element_sets; + PartPropertyCandidates properties; +}; + +struct RawInstance { + std::string name; + std::string part_name; + SourceLocation location; +}; + +struct RawAssemblySet { + bool is_node_set; + std::string name; + std::string instance_name; + std::vector members; + SourceLocation location; +}; + +/// @brief Borrows a part-local set by ASCII-insensitive name or returns null. +const RawSet* FindSet(const std::vector& sets, const std::string& name); + +/// @brief Borrows a part-local source node by label or returns null. +const RawNode* FindNode(const RawPart& part, std::int64_t label); + +/// @brief Borrows a part-local source element by label or returns null. +const RawElement* FindElement(const RawPart& part, std::int64_t label); + +/// @brief Owns raw topology and its deterministic expansion into a candidate. +/// @note The syntax coordinator may mutate raw records until finalization. +/// Context-owned diagnostics outlive this stage and its borrowed consumers. +class TopologyCandidates { + public: + /// @brief Borrows context services while owning this uncommitted mapping + /// stage. + explicit TopologyCandidates(MappingDiagnostics& diagnostics) + : diagnostics_{diagnostics} {} + + /// @brief Provides raw part records to mapping stages and the syntax + /// coordinator. + std::vector& Parts() noexcept { return parts_; } + /// @brief Provides raw part records to mapping stages and the syntax + /// coordinator. + const std::vector& Parts() const noexcept { return parts_; } + /// @brief Provides raw identity instances in source declaration order. + std::vector& Instances() noexcept { return instances_; } + /// @brief Provides raw identity instances in source declaration order. + const std::vector& Instances() const noexcept { + return instances_; + } + /// @brief Provides raw assembly sets in source declaration order. + std::vector& AssemblySets() noexcept { + return assembly_sets_; + } + /// @brief Provides raw assembly sets in source declaration order. + const std::vector& AssemblySets() const noexcept { + return assembly_sets_; + } + + /// @brief Borrows the matching source part or returns null. + const RawPart* FindPart(const std::string& name) const; + + /// @brief Borrows the matching identity instance or returns null. + const RawInstance* FindInstance(const std::string& name) const; + + /// @brief Expands instances, preprocesses shell geometry, then expands + /// assembly sets. + void Finalize(const MaterialPropertyCandidates& material_properties, + ModelDefinition& definition); + + private: + std::size_t PartIndex(const RawPart& part) const; + + bool ValidateGeometry(const RawElement& raw, const Node& first, + const Node& second, const GeneralBeamSection& section); + + void ExpandInstances(const MaterialPropertyCandidates& material_properties, + ModelDefinition& definition); + + void ExpandAssemblySets(ModelDefinition& definition); + + MappingDiagnostics& diagnostics_; + std::vector parts_; + std::vector instances_; + std::vector assembly_sets_; +}; + +} // namespace fesa::abaqus_internal + +#endif // FESA_IO_ABAQUS_TOPOLOGY_CANDIDATES_H_ diff --git a/src/fesa/io/abaqus/topology_mapper.cpp b/src/fesa/io/abaqus/topology_mapper.cpp index 5d78175..b48e045 100644 --- a/src/fesa/io/abaqus/topology_mapper.cpp +++ b/src/fesa/io/abaqus/topology_mapper.cpp @@ -1,9 +1,414 @@ #include "io/abaqus/topology_mapper.h" +#include +#include +#include +#include +#include + +#include "fesa/core/ascii.h" +#include "fesa/math/vector3.h" +#include "fesa/model/shell_geometry.h" #include "io/abaqus/domain_mapping_context.h" +#include "io/abaqus/topology_candidates.h" namespace fesa::abaqus_internal { +const RawSet* FindSet(const std::vector& sets, + const std::string& name) { + const auto found = + std::find_if(sets.begin(), sets.end(), [&name](const RawSet& set) { + return AsciiCaseInsensitiveEquals(set.name, name); + }); + return found == sets.end() ? nullptr : &*found; +} + +const RawNode* FindNode(const RawPart& part, std::int64_t label) { + const auto found = std::find_if( + part.nodes.begin(), part.nodes.end(), + [label](const RawNode& node) { return node.label == label; }); + return found == part.nodes.end() ? nullptr : &*found; +} + +const RawElement* FindElement(const RawPart& part, std::int64_t label) { + const auto found = std::find_if( + part.elements.begin(), part.elements.end(), + [label](const RawElement& element) { return element.label == label; }); + return found == part.elements.end() ? nullptr : &*found; +} + +const RawPart* TopologyCandidates::FindPart(const std::string& name) const { + const auto found = + std::find_if(parts_.begin(), parts_.end(), [&name](const RawPart& part) { + return AsciiCaseInsensitiveEquals(part.name, name); + }); + return found == parts_.end() ? nullptr : &*found; +} + +const RawInstance* TopologyCandidates::FindInstance( + const std::string& name) const { + const auto found = + std::find_if(instances_.begin(), instances_.end(), + [&name](const RawInstance& instance) { + return AsciiCaseInsensitiveEquals(instance.name, name); + }); + return found == instances_.end() ? nullptr : &*found; +} + +std::size_t TopologyCandidates::PartIndex(const RawPart& part) const { + return static_cast(&part - parts_.data()); +} + +bool TopologyCandidates::ValidateGeometry(const RawElement& raw, + const Node& first, const Node& second, + const GeneralBeamSection& section) { + const auto maximum_absolute = [](const Vector3& vector) { + return std::max( + {std::abs(vector[0]), std::abs(vector[1]), std::abs(vector[2])}); + }; + const Vector3 first_position{first.coordinates}; + const Vector3 second_position{second.coordinates}; + + // Compare both approved inequalities after a common scaling. This + // preserves the exact ratios while avoiding overflow in x*x and in + // subtraction between large finite coordinates. + const double global_coordinate_scale = + std::max({1.0, maximum_absolute(first_position), + maximum_absolute(second_position)}); + const Vector3 first_scaled = first_position / global_coordinate_scale; + const Vector3 second_scaled = second_position / global_coordinate_scale; + const Vector3 delta_scaled = second_scaled - first_scaled; + const double length_ratio = delta_scaled.Norm(); + const double coordinate_norm_ratio = + std::max({1.0 / global_coordinate_scale, first_scaled.Norm(), + second_scaled.Norm()}); + if (!(length_ratio > 1.0e-12 * coordinate_norm_ratio)) { + return diagnostics_.ModelFailure( + "invalid-beam-length", raw.location, "ELEMENT", raw.label_text, + "Beam length fails the approved scale-aware threshold."); + } + const Vector3 tangent = delta_scaled / length_ratio; + + const Vector3 guide{section.first_axis}; + const double global_guide_scale = std::max(1.0, maximum_absolute(guide)); + const Vector3 guide_scaled = guide / global_guide_scale; + const double projection = guide_scaled.Dot(tangent); + const Vector3 perpendicular = guide_scaled - projection * tangent; + const double guide_norm_ratio = + std::max(1.0 / global_guide_scale, guide_scaled.Norm()); + if (!(perpendicular.Norm() > 1.0e-12 * guide_norm_ratio)) { + return diagnostics_.ModelFailure( + "invalid-beam-guide-vector", section.location, "BEAM GENERAL SECTION", + raw.label_text, + "The first section axis cannot be zero or tangent-parallel."); + } + return true; +} + +void TopologyCandidates::ExpandInstances( + const MaterialPropertyCandidates& material_properties, + ModelDefinition& definition) { + for (const auto& raw_instance : instances_) { + const RawPart* part = FindPart(raw_instance.part_name); + if (part == nullptr) { + diagnostics_.InputFailure( + "unresolved-reference", raw_instance.location, "INSTANCE", + raw_instance.name, "INSTANCE PART must resolve case-insensitively."); + return; + } + InstanceDefinition instance{ + raw_instance.name, part->name, {}, {}, raw_instance.location}; + std::map node_indices; + std::map element_indices; + + // Instance order, followed by part-local declaration order, is the + // sole source of stable expanded internal IDs. + for (const auto& raw_node : part->nodes) { + if (definition.nodes.size() > std::numeric_limits::max()) { + diagnostics_.InputFailure( + "entity-index-overflow", raw_node.location, "NODE", + raw_node.label_text, + "Expanded node count exceeds EntityIndex capacity."); + return; + } + const EntityIndex index = + static_cast(definition.nodes.size()); + definition.nodes.push_back( + {{raw_instance.name, raw_node.label, raw_node.label_text}, + raw_node.coordinates, + raw_node.location}); + node_indices.emplace(raw_node.label, index); + instance.node_mappings.push_back({raw_node.label, index}); + } + + for (const auto& raw_element : part->elements) { + EntityIndex index = 0U; + if (raw_element.type == RawElement::Type::kB33) { + const auto first = node_indices.find(raw_element.node_labels[0]); + const auto second = node_indices.find(raw_element.node_labels[1]); + const auto& assignments = + material_properties.BeamAssignments(PartIndex(*part)); + const auto assignment = assignments.find(raw_element.label); + if (first == node_indices.end() || second == node_indices.end() || + assignment == assignments.end()) { + diagnostics_.InputFailure( + "unresolved-reference", raw_element.location, "ELEMENT", + raw_element.label_text, + "Expanded connectivity and section assignment must resolve."); + return; + } + if (definition.elements.size() > + std::numeric_limits::max()) { + diagnostics_.InputFailure( + "entity-index-overflow", raw_element.location, "ELEMENT", + raw_element.label_text, + "Expanded element count exceeds EntityIndex capacity."); + return; + } + index = static_cast(definition.elements.size()); + const auto& section = definition.sections[assignment->second.first]; + if (!ValidateGeometry(raw_element, definition.nodes[first->second], + definition.nodes[second->second], section)) { + return; + } + definition.elements.push_back( + {{raw_instance.name, raw_element.label, raw_element.label_text}, + {first->second, second->second}, + assignment->second.second, + assignment->second.first, + raw_element.location}); + } else if (raw_element.type == RawElement::Type::kC3d8) { + std::array connected_nodes{}; + for (std::size_t node = 0U; node < connected_nodes.size(); ++node) { + const auto found = node_indices.find(raw_element.node_labels[node]); + if (found == node_indices.end()) { + diagnostics_.InputFailure( + "invalid-solid-connectivity", raw_element.location, "ELEMENT", + raw_element.label_text, "Solid nodes must resolve."); + return; + } + connected_nodes[node] = found->second; + } + const auto& assignments = + material_properties.ShellAssignments(PartIndex(*part)); + const auto assignment = assignments.find(raw_element.label); + if (assignment == assignments.end() || + definition.solid_elements.size() > + std::numeric_limits::max()) { + diagnostics_.InputFailure("invalid-solid-section-assignment", + raw_element.location, "ELEMENT", + raw_element.label_text, + "Solid assignment must resolve."); + return; + } + index = static_cast(definition.solid_elements.size()); + definition.solid_elements.emplace_back( + SourceEntityId{raw_instance.name, raw_element.label, + raw_element.label_text}, + connected_nodes, assignment->second.second, + assignment->second.first, raw_element.location); + } else { + std::array connected_nodes{}; + for (std::size_t node = 0U; node < connected_nodes.size(); ++node) { + const auto found = node_indices.find(raw_element.node_labels[node]); + if (found == node_indices.end()) { + diagnostics_.InputFailure( + "invalid-shell-connectivity", raw_element.location, "ELEMENT", + raw_element.label_text, + "Expanded shell connectivity must resolve."); + return; + } + connected_nodes[node] = found->second; + } + const auto& assignments = + material_properties.ShellAssignments(PartIndex(*part)); + const auto assignment = assignments.find(raw_element.label); + if (assignment == assignments.end()) { + diagnostics_.InputFailure( + "invalid-shell-section-assignment", raw_element.location, + "ELEMENT", raw_element.label_text, + "Expanded shell section assignment must resolve exactly once."); + return; + } + if (raw_element.type == RawElement::Type::kDs4) { + if (definition.thermal_elements.size() > + std::numeric_limits::max()) { + diagnostics_.InputFailure( + "entity-index-overflow", raw_element.location, "ELEMENT", + raw_element.label_text, + "Expanded thermal element count exceeds EntityIndex " + "capacity."); + return; + } + index = static_cast(definition.thermal_elements.size()); + definition.thermal_elements.push_back( + {{raw_instance.name, raw_element.label, raw_element.label_text}, + connected_nodes, + assignment->second.first, + raw_element.location}); + element_indices.emplace(raw_element.label, index); + instance.element_mappings.push_back({raw_element.label, index}); + continue; + } + if (definition.shell_elements.size() > + std::numeric_limits::max()) { + diagnostics_.InputFailure( + "entity-index-overflow", raw_element.location, "ELEMENT", + raw_element.label_text, + "Expanded shell element count exceeds EntityIndex capacity."); + return; + } + index = static_cast(definition.shell_elements.size()); + definition.shell_elements.push_back( + {{raw_instance.name, raw_element.label, raw_element.label_text}, + raw_element.type == RawElement::Type::kS4 + ? ShellSourceElementType::kS4 + : ShellSourceElementType::kS4r, + connected_nodes, + assignment->second.second, + assignment->second.first, + raw_element.location}); + } + element_indices.emplace(raw_element.label, index); + instance.element_mappings.push_back({raw_element.label, index}); + } + + for (const auto& raw_set : part->node_sets) { + NodeSet set{raw_set.name, raw_instance.name, {}, raw_set.location}; + for (const auto member : raw_set.members) { + const auto found = node_indices.find(member); + if (found == node_indices.end()) { + diagnostics_.InputFailure("unresolved-reference", raw_set.location, + "NSET", raw_set.name, + "Part node-set expansion failed."); + return; + } + set.node_indices.push_back(found->second); + } + definition.node_sets.push_back(std::move(set)); + } + for (const auto& raw_set : part->element_sets) { + ElementSet set{raw_set.name, raw_instance.name, {}, raw_set.location}; + for (const auto member : raw_set.members) { + const auto found = element_indices.find(member); + if (found == element_indices.end()) { + diagnostics_.InputFailure("unresolved-reference", raw_set.location, + "ELSET", raw_set.name, + "Part element-set expansion failed."); + return; + } + set.element_indices.push_back(found->second); + } + definition.element_sets.push_back(std::move(set)); + } + definition.instances.push_back(std::move(instance)); + } +} + +void TopologyCandidates::ExpandAssemblySets(ModelDefinition& definition) { + for (const auto& raw_set : assembly_sets_) { + const RawInstance* raw_instance = FindInstance(raw_set.instance_name); + if (raw_instance == nullptr) { + diagnostics_.InputFailure("unresolved-reference", raw_set.location, + raw_set.is_node_set ? "NSET" : "ELSET", + raw_set.name, + "Assembly set INSTANCE must resolve."); + return; + } + const auto definition_instance = std::find_if( + definition.instances.begin(), definition.instances.end(), + [&raw_instance](const InstanceDefinition& instance) { + return AsciiCaseInsensitiveEquals(instance.name, raw_instance->name); + }); + if (definition_instance == definition.instances.end()) { + diagnostics_.InputFailure( + "unresolved-reference", raw_set.location, + raw_set.is_node_set ? "NSET" : "ELSET", raw_set.name, + "Assembly set instance expansion is unavailable."); + return; + } + if (raw_set.is_node_set) { + definition.node_sets.erase( + std::remove_if( + definition.node_sets.begin(), definition.node_sets.end(), + [&raw_set](const NodeSet& set) { + return AsciiCaseInsensitiveEquals(set.name, raw_set.name); + }), + definition.node_sets.end()); + NodeSet set{ + raw_set.name, definition_instance->name, {}, raw_set.location}; + for (const auto member : raw_set.members) { + const auto mapping = + std::find_if(definition_instance->node_mappings.begin(), + definition_instance->node_mappings.end(), + [member](const SourceIndexMapping& value) { + return value.source_label == member; + }); + if (mapping == definition_instance->node_mappings.end()) { + diagnostics_.InputFailure( + "unresolved-reference", raw_set.location, "NSET", raw_set.name, + "Assembly node-set member must resolve in its " + "instance."); + return; + } + set.node_indices.push_back(mapping->internal_index); + } + definition.node_sets.push_back(std::move(set)); + } else { + definition.element_sets.erase( + std::remove_if( + definition.element_sets.begin(), definition.element_sets.end(), + [&raw_set](const ElementSet& set) { + return AsciiCaseInsensitiveEquals(set.name, raw_set.name); + }), + definition.element_sets.end()); + ElementSet set{ + raw_set.name, definition_instance->name, {}, raw_set.location}; + for (const auto member : raw_set.members) { + const auto mapping = + std::find_if(definition_instance->element_mappings.begin(), + definition_instance->element_mappings.end(), + [member](const SourceIndexMapping& value) { + return value.source_label == member; + }); + if (mapping == definition_instance->element_mappings.end()) { + diagnostics_.InputFailure( + "unresolved-reference", raw_set.location, "ELSET", raw_set.name, + "Assembly element-set member must resolve in " + "its instance."); + return; + } + set.element_indices.push_back(mapping->internal_index); + } + definition.element_sets.push_back(std::move(set)); + } + } +} + +void TopologyCandidates::Finalize( + const MaterialPropertyCandidates& material_properties, + ModelDefinition& definition) { + if (diagnostics_.HasFailure()) { + return; + } + ExpandInstances(material_properties, definition); + if (!diagnostics_.HasFailure() && !definition.shell_elements.empty()) { + auto geometry = PreprocessShellGeometry( + definition.nodes, definition.shell_elements, definition.shell_sections); + if (!geometry.HasValue()) { + const auto& status = geometry.GetStatus(); + diagnostics_.RecordFailure(status); + } else { + definition.shell_node_initial_frames = + std::move(geometry.Value().nodal_frames); + } + } + if (!diagnostics_.HasFailure()) { + ExpandAssemblySets(definition); + } + return; +} + Status TopologyMapper::Map(DomainMappingContext& context) const { return context.ParseSyntax(); } diff --git a/src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp b/src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp index 19ec6c7..db70de4 100644 --- a/src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp +++ b/src/fesa/io/hdf5/dynamic_hdf5_results_writer.cpp @@ -12,7 +12,6 @@ #include "fesa/analysis/analysis_model.h" #include "fesa/build_info.h" #include "fesa/core/diagnostic.h" -#include "fesa/elements/finite_rotation.h" #include "fesa/fem/dof_manager.h" #include "io/hdf5/hdf5_atomic_file.h" #include "io/hdf5/hdf5_model_writer.h" @@ -24,6 +23,10 @@ namespace { using hdf5_internal::Hdf5Failure; using hdf5_internal::Hdf5Handle; +using hdf5_internal::CopyVectorValues; +using hdf5_internal::FlattenNodalTriads; +using hdf5_internal::FlattenNodalDirectors; +using hdf5_internal::SpatialReactionValues; struct AcceptedFrameRow { std::uint64_t frame_index; @@ -228,11 +231,6 @@ Status Failure(const char* code, const std::string& message) { return hdf5_internal::OutputFailure(code, message); } -/// @brief Copies one nonempty full-space vector in node-major order. -std::vector Values(const Vector& values) { - return std::vector{values.Data(), values.Data() + values.Size()}; -} - /// @brief Removes inherited metadata before applying the dynamic schema. void DeleteAttribute(const hid_t object, const char* name) { if (H5Aexists(object, name) > 0) { @@ -401,26 +399,6 @@ void ProcessDataset(const hid_t file, const std::string& path, } } -/// @brief Flattens nodal triad axes in A,B,D row order. -std::vector FlattenTriad(const DynamicAcceptedFrameState& frame) { - std::vector values; - values.reserve(frame.nodal_triad.size() * 9U); - for (const auto& triad : frame.nodal_triad) { - for (const auto& axis : triad) - values.insert(values.end(), axis.begin(), axis.end()); - } - return values; -} - -/// @brief Flattens nodal directors in stable node order. -std::vector FlattenDirector(const DynamicAcceptedFrameState& frame) { - std::vector values; - values.reserve(frame.nodal_director.size() * 3U); - for (const auto& director : frame.nodal_director) - values.insert(values.end(), director.begin(), director.end()); - return values; -} - /// @brief Flattens physical recovery in element and Gauss order. std::vector FlattenShell(const DynamicAcceptedFrameState& frame, const int quantity) { @@ -442,27 +420,6 @@ std::vector FlattenShell(const DynamicAcceptedFrameState& frame, return values; } -/// @brief Maps generalized support moments to work-conjugate spatial moments. -std::vector SpatialReaction(const DynamicAcceptedFrameState& frame) { - std::vector values = Values(frame.reaction); - for (std::size_t node = 0U; node < frame.nodal_internal_order.size(); - ++node) { - const std::size_t offset = node * 6U; - const Vector3 phi{frame.generalized_coordinates[offset + 3U], - frame.generalized_coordinates[offset + 4U], - frame.generalized_coordinates[offset + 5U]}; - const Matrix transform = InverseTransposeLeftJacobianSO3(phi); - for (std::size_t row = 0U; row < 3U; ++row) { - values[offset + 3U + row] = 0.0; - for (std::size_t column = 0U; column < 3U; ++column) { - values[offset + 3U + row] += - transform(row, column) * frame.reaction[offset + 3U + column]; - } - } - } - return values; -} - /// @brief Writes or reads back all mandatory accepted-endpoint quantities. void WriteFrame(const hid_t file, const Domain& domain, const DynamicAcceptedFrameState& frame, @@ -491,52 +448,55 @@ void WriteFrame(const hid_t file, const Domain& domain, "force,force,force,force*length,force*length,force*length"; const std::vector nodal{nodes, 6U}; WriteDataset(file, root + "/nodal/displacement", nodal, - Values(frame.generalized_coordinates), "UX,UY,UZ,URX,URY,URZ", + CopyVectorValues(frame.generalized_coordinates), "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", "global-cartesian", "nodal", frame); - WriteDataset(file, root + "/nodal/velocity", nodal, Values(frame.velocity), + WriteDataset(file, root + "/nodal/velocity", nodal, CopyVectorValues(frame.velocity), "V1,V2,V3,PHIDOT1,PHIDOT2,PHIDOT3", "length/time,length/time,length/time,1/time,1/time,1/time", "fixed-initial-global-chart", "nodal", frame); WriteDataset( - file, root + "/nodal/acceleration", nodal, Values(frame.acceleration), + file, root + "/nodal/acceleration", nodal, CopyVectorValues(frame.acceleration), "A1,A2,A3,PHIDDOT1,PHIDDOT2,PHIDDOT3", "length/time^2,length/time^2,length/time^2,1/time^2,1/time^2,1/time^2", "fixed-initial-global-chart", "nodal", frame); WriteDataset( file, root + "/nodal/algorithmic_acceleration", nodal, - Values(frame.algorithmic_acceleration), "AUX1,AUX2,AUX3,AUX4,AUX5,AUX6", + CopyVectorValues(frame.algorithmic_acceleration), "AUX1,AUX2,AUX3,AUX4,AUX5,AUX6", "length/time^2,length/time^2,length/time^2,1/time^2,1/time^2,1/time^2", "fixed-initial-global-chart", "nodal", frame); WriteDataset(file, root + "/nodal/angular_velocity", {nodes, 3U}, - Values(frame.angular_velocity), "OMEGA1,OMEGA2,OMEGA3", + CopyVectorValues(frame.angular_velocity), "OMEGA1,OMEGA2,OMEGA3", "1/time,1/time,1/time", "global-cartesian", "nodal", frame); WriteDataset(file, root + "/nodal/angular_acceleration", {nodes, 3U}, - Values(frame.angular_acceleration), + CopyVectorValues(frame.angular_acceleration), "OMEGADOT1,OMEGADOT2,OMEGADOT3", "1/time^2,1/time^2,1/time^2", "global-cartesian", "nodal", frame); WriteDataset(file, root + "/nodal/triad", {nodes, 3U, 3U}, - FlattenTriad(frame), "X,Y,Z", "1,1,1", "global-cartesian", + FlattenNodalTriads(frame.nodal_triad), "X,Y,Z", "1,1,1", "global-cartesian", "nodal", frame); WriteDataset(file, root + "/nodal/director", {nodes, 3U}, - FlattenDirector(frame), "D1,D2,D3", "1,1,1", "global-cartesian", + FlattenNodalDirectors(frame.nodal_director), "D1,D2,D3", "1,1,1", "global-cartesian", "nodal", frame); WriteDataset(file, root + "/nodal/generalized_inertia_force", nodal, - Values(frame.inertia_force), kGeneralized, kGeneralizedUnits, + CopyVectorValues(frame.inertia_force), kGeneralized, kGeneralizedUnits, "fixed-initial-global-chart", "nodal", frame); WriteDataset(file, root + "/nodal/generalized_internal_force", nodal, - Values(frame.internal_force), kGeneralized, kGeneralizedUnits, + CopyVectorValues(frame.internal_force), kGeneralized, kGeneralizedUnits, "fixed-initial-global-chart", "nodal", frame); WriteDataset(file, root + "/nodal/generalized_external_force", nodal, - Values(frame.external_force), kGeneralized, kGeneralizedUnits, + CopyVectorValues(frame.external_force), kGeneralized, kGeneralizedUnits, "fixed-initial-global-chart", "nodal", frame); WriteDataset(file, root + "/nodal/generalized_residual", nodal, - Values(frame.residual), kGeneralized, kGeneralizedUnits, + CopyVectorValues(frame.residual), kGeneralized, kGeneralizedUnits, "fixed-initial-global-chart", "nodal", frame); WriteDataset(file, root + "/nodal/generalized_reaction", nodal, - Values(frame.reaction), kGeneralized, kGeneralizedUnits, + CopyVectorValues(frame.reaction), kGeneralized, kGeneralizedUnits, "fixed-initial-global-chart", "nodal", frame); - WriteDataset(file, root + "/nodal/reaction", nodal, SpatialReaction(frame), + WriteDataset(file, root + "/nodal/reaction", nodal, + SpatialReactionValues(frame.generalized_coordinates, + frame.reaction, + frame.nodal_internal_order.size()), "RF1,RF2,RF3,RM1,RM2,RM3", kGeneralizedUnits, "global-cartesian", "nodal", frame); const std::string shell = root + "/element/shell/"; @@ -810,13 +770,7 @@ void CheckModel(const hid_t file, const Domain& domain, model.prescribed_displacement); std::vector directors; std::vector frames; - for (const auto& frame : domain.ShellNodeInitialFrames()) { - directors.insert(directors.end(), frame.director.begin(), - frame.director.end()); - frames.insert(frames.end(), frame.tangent_a.begin(), frame.tangent_a.end()); - frames.insert(frames.end(), frame.tangent_b.begin(), frame.tangent_b.end()); - frames.insert(frames.end(), frame.director.begin(), frame.director.end()); - } + hdf5_internal::AppendShellReferenceFrames(domain, directors, frames); (void)CheckDoubles(file, "/model/shell/nodal_director", {count, 3U}, directors); (void)CheckDoubles(file, "/model/shell/nodal_frame", {count, 3U, 3U}, frames); diff --git a/src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp b/src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp index cbcfa5b..60688de 100644 --- a/src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp +++ b/src/fesa/io/hdf5/eigen_hdf5_results_writer.cpp @@ -20,23 +20,16 @@ #include "io/hdf5/hdf5_model_writer.h" #include "io/hdf5/hdf5_primitives.h" #include "io/hdf5/hdf5_raii.h" +#include "math/finite_values.h" namespace fesa { namespace { -constexpr const char* kEigenRoot = "/steps/Step-1/eigen"; +using math_internal::IsFinite; -void WriteQuantityAttributes(hid_t dataset, const std::string& components, - const std::string& units, - const std::string& coordinates, - const std::string& location) { - hdf5_internal::WriteStringAttribute(dataset, "component_names", components); - hdf5_internal::WriteStringAttribute(dataset, "component_unit_dimensions", - units); - hdf5_internal::WriteStringAttribute(dataset, "coordinate_system", - coordinates); - hdf5_internal::WriteStringAttribute(dataset, "location", location); -} +using hdf5_internal::WriteQuantityAttributes; + +constexpr const char* kEigenRoot = "/steps/Step-1/eigen"; void WriteModalAttributes(hid_t dataset, const std::string& source_step) { hdf5_internal::WriteUint64Attribute(dataset, "eigen_schema_version", 1U); @@ -44,17 +37,6 @@ void WriteModalAttributes(hid_t dataset, const std::string& source_step) { hdf5_internal::WriteStringAttribute(dataset, "domain", "mode"); } -bool IsFinite(const Matrix& matrix) { - for (std::size_t row = 0U; row < matrix.Rows(); ++row) { - for (std::size_t column = 0U; column < matrix.Columns(); ++column) { - if (!std::isfinite(matrix(row, column))) { - return false; - } - } - } - return true; -} - Status Validate(const Domain& domain, const EigenAnalysisState& state, const std::vector& diagnostics) { const FrequencyStepDefinition* frequency = domain.Frequency(); diff --git a/src/fesa/io/hdf5/eigen_hdf5_self_check.cpp b/src/fesa/io/hdf5/eigen_hdf5_self_check.cpp index c54c43e..b41907e 100644 --- a/src/fesa/io/hdf5/eigen_hdf5_self_check.cpp +++ b/src/fesa/io/hdf5/eigen_hdf5_self_check.cpp @@ -489,13 +489,7 @@ bool CheckModelRows(hid_t file, const Domain& domain) { [&](auto i) { return domain.ShellSections()[i].thickness; })) return false; std::vector directors, frames; - for (const auto& frame : domain.ShellNodeInitialFrames()) { - directors.insert(directors.end(), frame.director.begin(), - frame.director.end()); - frames.insert(frames.end(), frame.tangent_a.begin(), frame.tangent_a.end()); - frames.insert(frames.end(), frame.tangent_b.begin(), frame.tangent_b.end()); - frames.insert(frames.end(), frame.director.begin(), frame.director.end()); - } + hdf5_internal::AppendShellReferenceFrames(domain, directors, frames); return CheckArray(file, "/model/shell/nodal_director", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE, {static_cast(domain.Nodes().size()), 3U}, diff --git a/src/fesa/io/hdf5/hdf5_model_writer.cpp b/src/fesa/io/hdf5/hdf5_model_writer.cpp index 628c331..91e83f5 100644 --- a/src/fesa/io/hdf5/hdf5_model_writer.cpp +++ b/src/fesa/io/hdf5/hdf5_model_writer.cpp @@ -419,13 +419,7 @@ void WriteShellModelData(const hid_t file, const Domain& domain, directors.reserve(domain.Nodes().size() * 3U); std::vector frames; frames.reserve(domain.Nodes().size() * 9U); - for (const auto& frame : domain.ShellNodeInitialFrames()) { - directors.insert(directors.end(), frame.director.begin(), - frame.director.end()); - frames.insert(frames.end(), frame.tangent_a.begin(), frame.tangent_a.end()); - frames.insert(frames.end(), frame.tangent_b.begin(), frame.tangent_b.end()); - frames.insert(frames.end(), frame.director.begin(), frame.director.end()); - } + hdf5_internal::AppendShellReferenceFrames(domain, directors, frames); WriteModelDoubleDataset(file, "/model/shell/nodal_director", {static_cast(domain.Nodes().size()), 3U}, directors.data(), directors.size(), "D1,D2,D3", diff --git a/src/fesa/io/hdf5/hdf5_primitives.cpp b/src/fesa/io/hdf5/hdf5_primitives.cpp index 1256580..7a872b8 100644 --- a/src/fesa/io/hdf5/hdf5_primitives.cpp +++ b/src/fesa/io/hdf5/hdf5_primitives.cpp @@ -5,9 +5,13 @@ #include #include #include +#include #include #include +#include "fesa/elements/finite_rotation.h" +#include "fesa/math/vector3.h" + namespace fesa::hdf5_internal { Status OutputFailure(const std::string& code, const std::string& message) { @@ -60,10 +64,20 @@ bool IsValidUtf8(const std::string& value) { return true; } -bool SameIdentity(const SourceEntityId& left, const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; +bool SameIdentity(const SourceEntityId& left, + const SourceEntityId& right) { + return fesa::SourceIdentityEquals(left, right); +} + +void AppendShellReferenceFrames(const Domain& domain, + std::vector& directors, + std::vector& frames) { + for (const auto& frame : domain.ShellNodeInitialFrames()) { + directors.insert(directors.end(), frame.director.begin(), frame.director.end()); + frames.insert(frames.end(), frame.tangent_a.begin(), frame.tangent_a.end()); + frames.insert(frames.end(), frame.tangent_b.begin(), frame.tangent_b.end()); + frames.insert(frames.end(), frame.director.begin(), frame.director.end()); + } } bool IsShellDomain(const Domain& domain) noexcept { @@ -95,6 +109,55 @@ std::string SourceInputIdentity(const Domain& domain) { ";content_identity=" + domain.SourceContentIdentity(); } +std::vector CopyVectorValues(const Vector& source) { + std::vector values(source.Size()); + for (std::size_t index = 0U; index < source.Size(); ++index) { + values[index] = source[index]; + } + return values; +} + +std::vector FlattenNodalTriads( + const std::vector, 3>>& triads) { + std::vector values; + values.reserve(triads.size() * 9U); + for (const auto& triad : triads) { + for (const auto& axis : triad) { + values.insert(values.end(), axis.begin(), axis.end()); + } + } + return values; +} + +std::vector FlattenNodalDirectors( + const std::vector>& directors) { + std::vector values; + values.reserve(directors.size() * 3U); + for (const auto& director : directors) { + values.insert(values.end(), director.begin(), director.end()); + } + return values; +} + +std::vector SpatialReactionValues(const Vector& rotation, + const Vector& reaction, + const std::size_t node_count) { + std::vector values = CopyVectorValues(reaction); + for (std::size_t node = 0U; node < node_count; ++node) { + const std::size_t offset = kDofsPerNode * node; + const Vector3 phi{rotation[offset + 3U], rotation[offset + 4U], + rotation[offset + 5U]}; + const Vector3 generalized{reaction[offset + 3U], reaction[offset + 4U], + reaction[offset + 5U]}; + const auto moment = SpatialMomentSO3(phi, generalized); + if (!moment.HasValue()) + throw std::runtime_error{"Spatial reaction moment is nonfinite."}; + for (std::size_t row = 0U; row < 3U; ++row) + values[offset + 3U + row] = moment.Value()[row]; + } + return values; +} + Hdf5Handle MakeUtf8StringType() { Hdf5Handle type{ RequireHdf5Id(H5Tcopy(H5T_C_S1), "Unable to copy an HDF5 string type."), @@ -186,7 +249,7 @@ Hdf5Handle CreateDatasetSpace(const std::vector& dimensions) { H5Sclose}; } -void WriteResultAttributes(const hid_t dataset, +void WriteQuantityAttributes(const hid_t dataset, const std::string& component_names, const std::string& component_units, const std::string& coordinate_system, @@ -195,6 +258,15 @@ void WriteResultAttributes(const hid_t dataset, WriteStringAttribute(dataset, "component_unit_dimensions", component_units); WriteStringAttribute(dataset, "coordinate_system", coordinate_system); WriteStringAttribute(dataset, "location", location); +} + +void WriteResultAttributes(const hid_t dataset, + const std::string& component_names, + const std::string& component_units, + const std::string& coordinate_system, + const std::string& location) { + WriteQuantityAttributes(dataset, component_names, component_units, + coordinate_system, location); WriteStringAttribute(dataset, "step_name", kStepName); WriteUint64Attribute(dataset, "frame_index", 0U); } @@ -238,11 +310,8 @@ void WriteModelDoubleDataset(const hid_t file, const std::string& path, const std::string& coordinate_system, const std::string& location) { auto dataset = WriteDoubleValues(file, path, dimensions, values, value_count); - WriteStringAttribute(dataset.Get(), "component_names", component_names); - WriteStringAttribute(dataset.Get(), "component_unit_dimensions", - component_units); - WriteStringAttribute(dataset.Get(), "coordinate_system", coordinate_system); - WriteStringAttribute(dataset.Get(), "location", location); + WriteQuantityAttributes(dataset.Get(), component_names, component_units, + coordinate_system, location); } void WriteUint8Dataset(const hid_t file, const std::string& path, diff --git a/src/fesa/io/hdf5/hdf5_primitives.h b/src/fesa/io/hdf5/hdf5_primitives.h index da215e4..dcca53e 100644 --- a/src/fesa/io/hdf5/hdf5_primitives.h +++ b/src/fesa/io/hdf5/hdf5_primitives.h @@ -13,11 +13,15 @@ #include "fesa/core/source_identity.h" #include "fesa/core/status.h" +#include "fesa/math/vector.h" #include "fesa/model/domain.h" #include "io/hdf5/hdf5_raii.h" +#include "math/finite_values.h" namespace fesa::hdf5_internal { +using math_internal::IsFinite; + inline constexpr std::size_t kDofsPerNode = 6U; inline constexpr std::size_t kEndpointCount = 2U; inline constexpr std::size_t kGaussPointCount = 2U; @@ -64,16 +68,11 @@ Status OutputFailure(const std::string& code, const std::string& message); /// @brief Tests exact preserved source identity. bool SameIdentity(const SourceEntityId& left, const SourceEntityId& right); -/// @brief Tests a fixed component record for finite values. -template -bool IsFinite(const std::array& values) { - for (const double value : values) { - if (!std::isfinite(value)) { - return false; - } - } - return true; -} +/// @brief Appends source-ordered reference directors and a,b,d frame columns. +/// @note Callers retain allocation, schema, write/readback and failure ownership. +void AppendShellReferenceFrames(const Domain& domain, + std::vector& directors, + std::vector& frames); /// @brief Validates UTF-8 without accepting overlong or surrogate encodings. bool IsValidUtf8(const std::string& value); @@ -93,6 +92,25 @@ std::string NormalizedPathString(const std::filesystem::path& path); /// @brief Returns schema-v0 source path and content identity metadata. std::string SourceInputIdentity(const Domain& domain); +/// @brief Copies validated vector values in their existing component order. +std::vector CopyVectorValues(const Vector& source); + +/// @brief Flattens global nodal A,B,D axes in stable node/axis/component order. +std::vector FlattenNodalTriads( + const std::vector, 3>>& triads); + +/// @brief Flattens global nodal directors in stable node/component order. +std::vector FlattenNodalDirectors( + const std::vector>& directors); + +/// @brief Preserves force rows and maps generalized moments to spatial moments. +/// @pre Both six-DOF vectors and node_count were validated by the typed writer. +/// @note Rotation entries are at offsets 3..5; conversion uses J^T m = q. +/// @throws std::runtime_error when the existing spatial-moment solve fails. +std::vector SpatialReactionValues(const Vector& rotation, + const Vector& reaction, + std::size_t node_count); + Hdf5Handle MakeUtf8StringType(); void WriteStringAttribute(hid_t object, const char* name, const std::string& value); @@ -101,6 +119,11 @@ void WriteUint8Attribute(hid_t object, const char* name, std::uint8_t value); void WriteDoubleAttribute(hid_t object, const char* name, double value); Hdf5Handle CreateGroup(hid_t file, const char* path); Hdf5Handle CreateDatasetSpace(const std::vector& dimensions); +/// @brief Writes quantity identity attributes, without family/frame metadata. +void WriteQuantityAttributes(hid_t dataset, const std::string& component_names, + const std::string& component_units, + const std::string& coordinate_system, + const std::string& location); void WriteResultAttributes(hid_t dataset, const std::string& component_names, const std::string& component_units, const std::string& coordinate_system, diff --git a/src/fesa/io/hdf5/hdf5_result_writer.cpp b/src/fesa/io/hdf5/hdf5_result_writer.cpp index 779b839..d832f9d 100644 --- a/src/fesa/io/hdf5/hdf5_result_writer.cpp +++ b/src/fesa/io/hdf5/hdf5_result_writer.cpp @@ -756,27 +756,19 @@ void WriteResultDatasets(const hid_t file, const Domain& domain, WriteStress(file, state); } -std::vector CopyVector(const Vector& source) { - std::vector values(source.Size()); - for (std::size_t index = 0U; index < source.Size(); ++index) { - values[index] = source[index]; - } - return values; -} - std::vector BuildResultDatasetPlans( const Domain& domain, const AnalysisState& state) { std::vector datasets; const std::vector nodal_dimensions{domain.Nodes().size(), kDofsPerNode}; datasets.push_back({std::string{kStepRoot} + "/nodal/displacement", - nodal_dimensions, CopyVector(state.Displacement()), + nodal_dimensions, CopyVectorValues(state.Displacement()), "UX,UY,UZ,URX,URY,URZ", "length,length,length,radian,radian,radian", "global-cartesian", "nodal"}); datasets.push_back( {std::string{kStepRoot} + "/nodal/reaction", nodal_dimensions, - CopyVector(state.Reaction()), "RF1,RF2,RF3,RM1,RM2,RM3", + CopyVectorValues(state.Reaction()), "RF1,RF2,RF3,RM1,RM2,RM3", "force,force,force,force*length,force*length,force*length", "global-cartesian", "nodal"}); if (IsShellDomain(domain)) { diff --git a/src/fesa/io/hdf5/hdf5_self_check.cpp b/src/fesa/io/hdf5/hdf5_self_check.cpp index 6a77619..2779079 100644 --- a/src/fesa/io/hdf5/hdf5_self_check.cpp +++ b/src/fesa/io/hdf5/hdf5_self_check.cpp @@ -11,6 +11,7 @@ #include "fesa/build_info.h" #include "io/hdf5/hdf5_raii.h" +#include "io/hdf5/hdf5_primitives.h" namespace fesa::hdf5_internal { @@ -596,15 +597,7 @@ void SelfCheckFile(const std::filesystem::path& path, const Domain& domain, std::vector frames; directors.reserve(domain.Nodes().size() * 3U); frames.reserve(domain.Nodes().size() * 9U); - for (const auto& frame : domain.ShellNodeInitialFrames()) { - directors.insert(directors.end(), frame.director.begin(), - frame.director.end()); - frames.insert(frames.end(), frame.tangent_a.begin(), - frame.tangent_a.end()); - frames.insert(frames.end(), frame.tangent_b.begin(), - frame.tangent_b.end()); - frames.insert(frames.end(), frame.director.begin(), frame.director.end()); - } + hdf5_internal::AppendShellReferenceFrames(domain, directors, frames); RequireModelDoubleDataset(file.Get(), "/model/shell/nodal_director", {static_cast(domain.Nodes().size()), 3U}, "D1,D2,D3", "1,1,1", "global-cartesian", "nodal", diff --git a/src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp b/src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp index dd75d69..cadd201 100644 --- a/src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp +++ b/src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp @@ -1,6 +1,5 @@ #include "fesa/io/hdf5/nonlinear_hdf5_results_writer.h" -#include #include #include #include @@ -14,17 +13,20 @@ #include "fesa/analysis/analysis_model.h" #include "fesa/build_info.h" -#include "fesa/elements/finite_rotation.h" #include "fesa/fem/dof_manager.h" #include "fesa/math/vector3.h" #include "io/hdf5/hdf5_atomic_file.h" #include "io/hdf5/hdf5_primitives.h" #include "io/hdf5/hdf5_raii.h" #include "io/hdf5/hdf5_self_check.h" +#include "math/finite_values.h" +#include "results/shell_result_recovery.h" namespace fesa { namespace { +using math_internal::IsFinite; + using hdf5_internal::Hdf5Failure; using hdf5_internal::Hdf5Handle; @@ -90,43 +92,9 @@ struct DiagnosticWriteRow { const char* message; }; -template -bool IsFinite(const std::array& values) { - return std::all_of(values.begin(), values.end(), - [](const double value) { return std::isfinite(value); }); -} - -bool IsFinite(const Vector& values) { - for (std::size_t index = 0U; index < values.Size(); ++index) { - if (!std::isfinite(values[index])) { - return false; - } - } - return true; -} - -bool SameIdentity(const SourceEntityId& left, const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; -} - -bool IsFinite(const ShellResultRow& row) { - if (!IsFinite(row.natural_coordinates) || !IsFinite(row.generalized_strain) || - !IsFinite(row.section_resultant)) { - return false; - } - for (const auto& axis : row.local_frame) { - if (!IsFinite(axis)) { - return false; - } - } - for (const auto& stress : row.stress) { - if (!std::isfinite(stress.zeta) || !IsFinite(stress.components)) { - return false; - } - } - return true; +bool SameIdentity(const SourceEntityId& left, + const SourceEntityId& right) { + return fesa::SourceIdentityEquals(left, right); } Status Failure(const char* code, const std::string& message) { @@ -300,7 +268,8 @@ Status ValidateState(const Domain& domain, const NonlinearAnalysisState& state) const std::size_t element = row_index / kShellLocationsPerElement; const std::size_t location = row_index % kShellLocationsPerElement; if (row.element != element || row.location != locations[location] || - row.natural_coordinates != coordinates[location] || !IsFinite(row)) { + row.natural_coordinates != coordinates[location] || + !results_internal::IsFiniteShellRow(row)) { return Failure("invalid-result-state", "Accepted shell rows must preserve element and GP order."); } @@ -315,13 +284,8 @@ void WriteCommonNumericAttributes(const hid_t dataset, const std::string& coordinate_system, const std::string& location) { hdf5_internal::WriteUint64Attribute(dataset, "schema_version", 1U); - hdf5_internal::WriteStringAttribute(dataset, "component_names", - component_names); - hdf5_internal::WriteStringAttribute(dataset, "component_unit_dimensions", - component_units); - hdf5_internal::WriteStringAttribute(dataset, "coordinate_system", - coordinate_system); - hdf5_internal::WriteStringAttribute(dataset, "location", location); + hdf5_internal::WriteQuantityAttributes( + dataset, component_names, component_units, coordinate_system, location); } void WriteFrameAttributes(const hid_t dataset, const AcceptedFrameState& frame) { @@ -660,12 +624,7 @@ void WriteModelData(const hid_t file, const Domain& domain, std::vector frames; directors.reserve(domain.Nodes().size() * 3U); frames.reserve(domain.Nodes().size() * 9U); - for (const auto& frame : domain.ShellNodeInitialFrames()) { - directors.insert(directors.end(), frame.director.begin(), frame.director.end()); - frames.insert(frames.end(), frame.tangent_a.begin(), frame.tangent_a.end()); - frames.insert(frames.end(), frame.tangent_b.begin(), frame.tangent_b.end()); - frames.insert(frames.end(), frame.director.begin(), frame.director.end()); - } + hdf5_internal::AppendShellReferenceFrames(domain, directors, frames); const hsize_t node_count = static_cast(domain.Nodes().size()); (void)WriteModelDoubleDataset(file, "/model/shell/nodal_director", {node_count, 3U}, directors.data(), @@ -772,14 +731,6 @@ void WriteAcceptedFrameTable(const hid_t file, hdf5_internal::WriteUint64Attribute(dataset.Get(), "schema_version", 1U); } -std::vector CopyVector(const Vector& source) { - std::vector values(source.Size()); - for (std::size_t index = 0U; index < source.Size(); ++index) { - values[index] = source[index]; - } - return values; -} - std::vector NodalDisplacement(const AcceptedFrameState& frame) { std::vector values(frame.displacement.Size()); for (std::size_t node = 0U; node < frame.nodal_internal_order.size(); ++node) { @@ -793,47 +744,6 @@ std::vector NodalDisplacement(const AcceptedFrameState& frame) { return values; } -std::vector FlattenTriads(const AcceptedFrameState& frame) { - std::vector values; - values.reserve(frame.nodal_triad.size() * 9U); - for (const auto& triad : frame.nodal_triad) { - for (const auto& axis : triad) { - values.insert(values.end(), axis.begin(), axis.end()); - } - } - return values; -} - -std::vector FlattenDirectors(const AcceptedFrameState& frame) { - std::vector values; - values.reserve(frame.nodal_director.size() * 3U); - for (const auto& director : frame.nodal_director) { - values.insert(values.end(), director.begin(), director.end()); - } - return values; -} - -std::vector SpatialReaction(const AcceptedFrameState& frame) { - std::vector values = CopyVector(frame.reaction); - for (std::size_t node = 0U; node < frame.nodal_internal_order.size(); ++node) { - const std::size_t offset = kDofsPerNode * node; - const Vector3 phi{frame.rotation_vector[offset + 3U], - frame.rotation_vector[offset + 4U], - frame.rotation_vector[offset + 5U]}; - const Matrix transform = InverseTransposeLeftJacobianSO3(phi); - const std::array generalized{ - frame.reaction[offset + 3U], frame.reaction[offset + 4U], - frame.reaction[offset + 5U]}; - for (std::size_t row = 0U; row < 3U; ++row) { - values[offset + 3U + row] = 0.0; - for (std::size_t column = 0U; column < 3U; ++column) { - values[offset + 3U + row] += transform(row, column) * generalized[column]; - } - } - } - return values; -} - void WriteShellIdentity(const hid_t dataset, const bool has_section_positions, const std::string& local_frame_path) { hdf5_internal::WriteStringAttribute(dataset, "source_element_type_dataset", @@ -864,35 +774,36 @@ void WriteFrame(const hid_t file, const Domain& domain, file, root + "/nodal/displacement", nodal_dimensions, displacement.data(), displacement.size(), "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", "global-cartesian", "nodal", frame); - const auto triads = FlattenTriads(frame); + const auto triads = hdf5_internal::FlattenNodalTriads(frame.nodal_triad); (void)WriteFrameDoubleDataset(file, root + "/nodal/triad", {node_count, 3U, 3U}, triads.data(), triads.size(), "X,Y,Z", "1,1,1", "global-cartesian", "nodal-triad", frame); - const auto directors = FlattenDirectors(frame); + const auto directors = hdf5_internal::FlattenNodalDirectors(frame.nodal_director); (void)WriteFrameDoubleDataset(file, root + "/nodal/director", {node_count, 3U}, directors.data(), directors.size(), "D1,D2,D3", "1,1,1", "global-cartesian", "nodal-director", frame); - const auto internal = CopyVector(frame.internal_force); + const auto internal = hdf5_internal::CopyVectorValues(frame.internal_force); (void)WriteFrameDoubleDataset( file, root + "/nodal/generalized_internal_force", nodal_dimensions, internal.data(), internal.size(), "FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3", "force,force,force,force*length,force*length,force*length", "global-cartesian", "nodal", frame); - const auto external = CopyVector(frame.external_force); + const auto external = hdf5_internal::CopyVectorValues(frame.external_force); (void)WriteFrameDoubleDataset( file, root + "/nodal/generalized_external_force", nodal_dimensions, external.data(), external.size(), "FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3", "force,force,force,force*length,force*length,force*length", "global-cartesian", "nodal", frame); - const auto residual = CopyVector(frame.residual); + const auto residual = hdf5_internal::CopyVectorValues(frame.residual); (void)WriteFrameDoubleDataset( file, root + "/nodal/generalized_residual", nodal_dimensions, residual.data(), residual.size(), "RU1,RU2,RU3,RPHI1,RPHI2,RPHI3", "force,force,force,force*length,force*length,force*length", "global-cartesian", "nodal", frame); - const auto reaction = SpatialReaction(frame); + const auto reaction = hdf5_internal::SpatialReactionValues( + frame.rotation_vector, frame.reaction, frame.nodal_internal_order.size()); (void)WriteFrameDoubleDataset( file, root + "/nodal/reaction", nodal_dimensions, reaction.data(), reaction.size(), "RF1,RF2,RF3,RM1,RM2,RM3", diff --git a/src/fesa/io/hdf5/solid_hdf5_results_writer.cpp b/src/fesa/io/hdf5/solid_hdf5_results_writer.cpp index ba70639..4b72f29 100644 --- a/src/fesa/io/hdf5/solid_hdf5_results_writer.cpp +++ b/src/fesa/io/hdf5/solid_hdf5_results_writer.cpp @@ -27,11 +27,6 @@ using U = std::vector; using B = std::vector; using D = std::vector; using S = std::vector; -std::vector Values(const Vector& vector) { - D result; - for (std::size_t i = 0; i < vector.Size(); ++i) result.push_back(vector[i]); - return result; -} void Parent(hid_t file, const std::string& path) { const auto parent = path.substr(0, path.find_last_of('/')); if (!parent.empty() && H5Lexists(file, parent.c_str(), H5P_DEFAULT) <= 0) @@ -110,11 +105,11 @@ void FrameData(SolidPlan& plan, const Domain& domain, std::size_t frame, value.doubles = {{dynamic ? "time" : "load_factor", coordinate}}; plan.datasets.push_back(std::move(value)); }; - add(Data(root + "/nodal/displacement", {n, 3}, Values(u), "U1,U2,U3", + add(Data(root + "/nodal/displacement", {n, 3}, CopyVectorValues(u), "U1,U2,U3", "length", "nodal")); - add(Data(root + "/nodal/reaction", {n, 3}, Values(rf), "RF1,RF2,RF3", "force", + add(Data(root + "/nodal/reaction", {n, 3}, CopyVectorValues(rf), "RF1,RF2,RF3", "force", "nodal")); - add(Data(root + "/nodal/residual", {n, 3}, Values(r), "R1,R2,R3", "force", + add(Data(root + "/nodal/residual", {n, 3}, CopyVectorValues(r), "R1,R2,R3", "force", "nodal")); D stress, strain; Check(points.size() == 8 * e, "Solid point count is invalid."); @@ -249,7 +244,7 @@ void Model(SolidPlan& plan, const Domain& domain, const DofManager& dofs) { for (std::size_t i = 0; i < domain.Elements().Size(); ++i) { auto element = factory.Create(domain.Elements()[i], domain); Check(element.HasValue(), "Solid factory reference failed."); - const auto* hex = dynamic_cast(element.Value().get()); + auto hex = factory.BindSolidTrial(*element.Value()); Check(hex != nullptr, "Solid kernel identity failed."); auto response = hex->EvaluateLinear(Vector{24}); Check(response.HasValue(), "Solid reference recovery failed."); @@ -426,15 +421,15 @@ Result BuildSolidPlan(const Domain& domain, SolidStateView view, plan.datasets.push_back(std::move(data)); }; add(Data(root + "/nodal/velocity", {domain.Nodes().size(), 3}, - Values(frame.velocity), "V1,V2,V3", "length/time", "nodal")); + CopyVectorValues(frame.velocity), "V1,V2,V3", "length/time", "nodal")); auto a = Data(root + "/nodal/acceleration", {domain.Nodes().size(), 3}, - Values(frame.acceleration), "A1,A2,A3", "length/time^2", + CopyVectorValues(frame.acceleration), "A1,A2,A3", "length/time^2", "nodal"); a.strings["acceleration_kind"] = "physical"; add(std::move(a)); a = Data(root + "/nodal/algorithmic_acceleration", {domain.Nodes().size(), 3}, - Values(frame.algorithmic_acceleration), "A1,A2,A3", + CopyVectorValues(frame.algorithmic_acceleration), "A1,A2,A3", "length/time^2", "nodal"); a.strings["acceleration_kind"] = "algorithmic"; add(std::move(a)); diff --git a/src/fesa/io/hdf5/thermal_hdf5_self_check.cpp b/src/fesa/io/hdf5/thermal_hdf5_self_check.cpp index fb19698..bf2ddfb 100644 --- a/src/fesa/io/hdf5/thermal_hdf5_self_check.cpp +++ b/src/fesa/io/hdf5/thermal_hdf5_self_check.cpp @@ -7,7 +7,9 @@ #include #include +#include "fesa/analysis/analysis_model.h" #include "fesa/build_info.h" +#include "fesa/fem/dof_manager.h" #include "io/hdf5/hdf5_primitives.h" #include "io/hdf5/hdf5_raii.h" @@ -424,8 +426,7 @@ void Frames(hid_t f, const ThermalAnalysisState& s) { Number(g.Get(), "is_initial", H5T_STD_U8LE, H5T_NATIVE_UINT8, static_cast(frame.is_initial)); ResultValues(f, root + "/nodal/temperature", {s.NodeOrder().size(), 5}, - {frame.temperature.Data(), - frame.temperature.Data() + frame.temperature.Size()}, + CopyVectorValues(frame.temperature), "NT11,NT12,NT13,NT14,NT15", "temperature", "scalar", "nodal-thickness-stations"); if (frame.is_initial) { @@ -433,9 +434,7 @@ void Frames(hid_t f, const ThermalAnalysisState& s) { Absent(f, root + "/element", "heat_flux"); } else { const auto& payload = *frame.completed; - std::vector reaction(payload.reaction_heat_rate.Size()); - for (std::size_t i = 0; i < reaction.size(); ++i) - reaction[i] = payload.reaction_heat_rate[i]; + const auto reaction = CopyVectorValues(payload.reaction_heat_rate); ResultValues(f, root + "/nodal/reaction_heat_rate", {reaction.size()}, reaction, "RFL", "power", "scalar", "prescribed-temperature-dofs"); diff --git a/src/fesa/loads/shell_surface_pressure.cpp b/src/fesa/loads/shell_surface_pressure.cpp index 603fda5..01a9896 100644 --- a/src/fesa/loads/shell_surface_pressure.cpp +++ b/src/fesa/loads/shell_surface_pressure.cpp @@ -6,10 +6,13 @@ #include #include #include +#include "math/vector3_operations.h" namespace fesa { namespace { +using math_internal::WeightedSum; + constexpr std::size_t kNodeCount = 4U; constexpr std::size_t kDofsPerNode = 6U; constexpr std::size_t kDofCount = kNodeCount * kDofsPerNode; @@ -54,16 +57,6 @@ ShapeData ShapeAt(const double xi, const double eta) noexcept { 0.25 * (1.0 + xi), 0.25 * (1.0 - xi)}}}; } -/// @brief Evaluates one tangent or area vector from shape coefficients. -Vector3 WeightedSum(const std::array& weights, - const std::array& coordinates) { - Vector3 result{}; - for (std::size_t node = 0U; node < kNodeCount; ++node) { - result = result + weights[node] * coordinates[node]; - } - return result; -} - /// @brief Evaluates finite bilinear surface data at one natural point. bool EvaluateGeometry(const std::array& coordinates, const double xi, const double eta, diff --git a/src/fesa/math/compensated_sum.h b/src/fesa/math/compensated_sum.h new file mode 100644 index 0000000..7201513 --- /dev/null +++ b/src/fesa/math/compensated_sum.h @@ -0,0 +1,30 @@ +#ifndef FESA_MATH_COMPENSATED_SUM_H_ +#define FESA_MATH_COMPENSATED_SUM_H_ + +#include + +namespace fesa::math_internal { + +/// @brief Preserves the compensated scalar accumulation graph and caller order. +inline void AddCompensated(const double term, double* sum, double* correction) { + const double next = *sum + term; + *correction += std::abs(*sum) >= std::abs(term) + ? (*sum - next) + term + : (term - next) + *sum; + *sum = next; +} + +/// @brief Owns one sum and its correction without changing reduction order. +class CompensatedSum { + public: + void Add(const double term) { AddCompensated(term, &sum_, &correction_); } + double Value() const { return sum_ + correction_; } + + private: + double sum_ = 0.0; + double correction_ = 0.0; +}; + +} // namespace fesa::math_internal + +#endif // FESA_MATH_COMPENSATED_SUM_H_ diff --git a/src/fesa/math/dense_blas_internal.cpp b/src/fesa/math/dense_blas_internal.cpp index ed5de9d..bc03aba 100644 --- a/src/fesa/math/dense_blas_internal.cpp +++ b/src/fesa/math/dense_blas_internal.cpp @@ -7,8 +7,271 @@ #include #include +#include "math/finite_values.h" + namespace fesa::dense_blas_internal { +namespace { + +using math_internal::IsFinite; + +/// @brief Keeps dense failures backend-neutral for caller-specific diagnostics. +Status FactorFailure(const char* code, const char* message) { + return Status::Failure({{Severity::kError, code, {}, "", "", message}}); +} + +/// @brief Preserves each value owner's size exception at the private boundary. +MKL_INT MklSizeOrThrow(const std::size_t size, const char* message) { + const auto converted = ToMklSize(size); + if (!converted.HasValue()) throw std::length_error{message}; + return converted.Value(); +} + +/// @brief Converts a contiguous BLAS vector length with its existing contract. +MKL_INT VectorSizeOrThrow(const std::size_t size) { + return MklSizeOrThrow(size, + "Dense vector size exceeds the MKL integer range."); +} + +/// @brief Converts a matrix dimension with its existing exception contract. +MKL_INT MatrixSizeOrThrow(const std::size_t size) { + return MklSizeOrThrow(size, + "Dense matrix dimension exceeds the MKL integer range."); +} + +/// @brief Rejects Matrix product inputs before allocation or empty returns. +void RequireFinite(const double* values, const std::size_t size) { + for (std::size_t i = 0; i < size; ++i) + if (!std::isfinite(values[i])) + throw std::invalid_argument{"Matrix product inputs must be finite."}; +} + +} // namespace + +DenseFactor::DenseFactor(const Matrix& coefficients, + const bool positive_definite) + : factors_{coefficients}, + pivots_(positive_definite ? 0U : coefficients.Rows()), + positive_definite_{positive_definite} { + for (std::size_t row = 0; row < coefficients.Rows(); ++row) { + double row_sum = 0.0; + for (std::size_t column = 0; column < coefficients.Columns(); ++column) + row_sum += std::abs(coefficients(row, column)); + coefficient_norm_inf_ = (std::max)(coefficient_norm_inf_, row_sum); + } +} + +Result DenseFactor::Lu(const Matrix& coefficients) { + return Create(coefficients, false); +} + +Result DenseFactor::Cholesky(const Matrix& coefficients) { + return Create(coefficients, true); +} + +Result DenseFactor::Create(const Matrix& coefficients, + const bool positive_definite) { + if (coefficients.Rows() != coefficients.Columns()) + return Result::Failure(FactorFailure( + "dense-factor-shape", "Dense factor requires a square matrix.")); + const auto size = ToMklSize(coefficients.Rows()); + if (!size.HasValue()) return Result::Failure(size.GetStatus()); + if (!IsFinite(coefficients)) + return Result::Failure(FactorFailure( + "dense-factor-nonfinite", "Dense factor inputs must be finite.")); + DenseFactor candidate{coefficients, positive_definite}; + if (size.Value() != 0) { + const auto info = + positive_definite + ? LAPACKE_dpotrf(LAPACK_ROW_MAJOR, 'L', size.Value(), + candidate.factors_.Data(), size.Value()) + : LAPACKE_dgetrf(LAPACK_ROW_MAJOR, size.Value(), size.Value(), + candidate.factors_.Data(), size.Value(), + candidate.pivots_.data()); + if (info != 0 || !IsFinite(candidate.factors_)) + return Result::Failure(FactorFailure( + "dense-factor-pivot", "Dense numerical factorization failed.")); + } + return Result::Success(std::move(candidate)); +} + +Result DenseFactor::Solve(const Matrix& rhs, + const bool transpose) const { + return SolveImpl(rhs, transpose, false, false); +} + +Result DenseFactor::SolveRight(const Matrix& rhs, + const bool transpose) const { + return SolveImpl(rhs, transpose, true, false); +} + +Result DenseFactor::SolveLower(const Matrix& rhs, + const bool transpose) const { + return SolveImpl(rhs, transpose, false, true); +} + +Result DenseFactor::SolveLowerRight(const Matrix& rhs, + const bool transpose) const { + return SolveImpl(rhs, transpose, true, true); +} + +Result DenseFactor::SolveImpl(const Matrix& rhs, const bool transpose, + const bool right, + const bool lower_only) const { + const auto order = factors_.Rows(); + if ((right ? rhs.Columns() : rhs.Rows()) != order || + (lower_only && !positive_definite_)) + return Result::Failure(FactorFailure( + "dense-solve-shape", "Dense solve shape or factor property differs.")); + const auto count = ToMklSize(right ? rhs.Rows() : rhs.Columns()); + if (!count.HasValue()) return Result::Failure(count.GetStatus()); + if (!IsFinite(rhs)) + return Result::Failure(FactorFailure( + "dense-solve-nonfinite", "Dense solve RHS must be finite.")); + if (order == 0U || count.Value() == 0) + return Result::Success(Matrix{rhs}); + Matrix candidate = right && !lower_only ? Matrix{order, rhs.Rows()} + : Matrix{rhs}; + const auto size = ToMklSize(order).Value(); + if (lower_only) { + cblas_dtrsm(CblasRowMajor, right ? CblasRight : CblasLeft, CblasLower, + transpose ? CblasTrans : CblasNoTrans, CblasNonUnit, + right ? count.Value() : size, right ? size : count.Value(), 1.0, + factors_.Data(), size, candidate.Data(), + right ? size : count.Value()); + } else { + // X*op(A)=B becomes op(A)^T*X^T=B^T. GETRS uses a compact n-by-nrhs + // row-major RHS with ldb=nrhs, including nonsquare multi-RHS storage. + if (right) { + for (std::size_t i = 0; i < rhs.Rows(); ++i) + for (std::size_t j = 0; j < order; ++j) candidate(j, i) = rhs(i, j); + } + const auto info = + positive_definite_ + ? LAPACKE_dpotrs(LAPACK_ROW_MAJOR, 'L', size, count.Value(), + factors_.Data(), size, candidate.Data(), + count.Value()) + : LAPACKE_dgetrs(LAPACK_ROW_MAJOR, transpose != right ? 'T' : 'N', + size, count.Value(), factors_.Data(), size, + pivots_.data(), candidate.Data(), count.Value()); + if (info != 0) + return Result::Failure( + FactorFailure("dense-solve-backend", "Dense backend solve failed.")); + if (right) { + Matrix transposed{rhs.Rows(), order}; + for (std::size_t i = 0; i < rhs.Rows(); ++i) + for (std::size_t j = 0; j < order; ++j) + transposed(i, j) = candidate(j, i); + candidate = std::move(transposed); + } + } + if (!IsFinite(candidate)) + return Result::Failure(FactorFailure( + "dense-solve-nonfinite", "Dense solve result is nonfinite.")); + return Result::Success(std::move(candidate)); +} + +Result DenseFactor::Lower() const { + if (!positive_definite_) + return Result::Failure(FactorFailure( + "dense-factor-property", "An LU factor has no Cholesky lower factor.")); + Matrix lower{factors_.Rows(), factors_.Columns()}; + for (std::size_t i = 0; i < factors_.Rows(); ++i) + for (std::size_t j = 0; j <= i; ++j) lower(i, j) = factors_(i, j); + return Result::Success(std::move(lower)); +} + +double DenseFactor::Determinant() const { + double determinant = 1.0; + for (std::size_t i = 0; i < factors_.Rows(); ++i) { + determinant *= factors_(i, i); + if (positive_definite_) + determinant *= factors_(i, i); + else if (pivots_[i] != static_cast(i + 1U)) + determinant = -determinant; + } + return determinant; +} + +Result DenseFactor::ReciprocalConditionInfinity() const { + if (!(coefficient_norm_inf_ > 0.0) || !std::isfinite(coefficient_norm_inf_)) + return Result::Failure(FactorFailure( + "dense-condition-norm", "Dense coefficient infinity norm is invalid.")); + const auto order = factors_.Rows(); + std::vector row_sums(order, 0.0); + Matrix rhs{order, 1U}; + for (std::size_t column = 0; column < order; ++column) { + if (column != 0U) rhs(column - 1U, 0U) = 0.0; + rhs(column, 0U) = 1.0; + const auto solved = Solve(rhs); + if (!solved.HasValue()) return Result::Failure(solved.GetStatus()); + for (std::size_t row = 0; row < order; ++row) + row_sums[row] += std::abs(solved.Value()(row, 0U)); + } + double inverse_norm = 0.0; + for (const auto row_sum : row_sums) + inverse_norm = (std::max)(inverse_norm, row_sum); + if (!(inverse_norm > 0.0) || !std::isfinite(inverse_norm)) + return Result::Failure(FactorFailure( + "dense-condition-norm", "Dense inverse infinity norm is invalid.")); + return Result::Success((1.0 / coefficient_norm_inf_) / inverse_norm); +} + +double DotValues(const double* left, const std::size_t size, + const double* right) { + if (size == 0U) return 0.0; + return cblas_ddot(VectorSizeOrThrow(size), left, 1, right, 1); +} + +double NormValues(const double* values, const std::size_t size) { + if (size == 0U) return 0.0; + return cblas_dnrm2(VectorSizeOrThrow(size), values, 1); +} + +void ScaleValues(const double alpha, double* values, const std::size_t size) { + if (size == 0U) return; + cblas_dscal(VectorSizeOrThrow(size), alpha, values, 1); +} + +void AxpyValues(const double alpha, const double* x, const std::size_t size, + double* y) { + if (size == 0U) return; + cblas_daxpy(VectorSizeOrThrow(size), alpha, x, 1, y, 1); +} + +Vector Multiply(const Matrix& left, const Vector& right) { + if (left.Columns() != right.Size()) + throw std::invalid_argument{ + "Matrix-vector multiplication has incompatible dimensions."}; + RequireFinite(left.Data(), left.Rows() * left.Columns()); + RequireFinite(right.Data(), right.Size()); + Vector result{left.Rows()}; + if (left.Rows() == 0U || left.Columns() == 0U) return result; + const auto rows = MatrixSizeOrThrow(left.Rows()); + const auto columns = MatrixSizeOrThrow(left.Columns()); + cblas_dgemv(CblasRowMajor, CblasNoTrans, rows, columns, 1.0, left.Data(), + columns, right.Data(), 1, 0.0, result.Data(), 1); + return result; +} + +Matrix Multiply(const Matrix& left, const Matrix& right) { + if (left.Columns() != right.Rows()) + throw std::invalid_argument{ + "Matrix multiplication has incompatible dimensions."}; + RequireFinite(left.Data(), left.Rows() * left.Columns()); + RequireFinite(right.Data(), right.Rows() * right.Columns()); + Matrix result{left.Rows(), right.Columns()}; + if (left.Rows() == 0U || left.Columns() == 0U || right.Columns() == 0U) + return result; + const auto rows = MatrixSizeOrThrow(left.Rows()); + const auto columns = MatrixSizeOrThrow(right.Columns()); + const auto inner = MatrixSizeOrThrow(left.Columns()); + cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, rows, columns, inner, + 1.0, left.Data(), inner, right.Data(), columns, 0.0, + result.Data(), columns); + return result; +} + ScopedSingleEquationThreads::ScopedSingleEquationThreads( const std::size_t equation_count) noexcept { // The measured 1x1 PARDISO case has backend/thread overhead and an @@ -45,60 +308,6 @@ LocalDensePolicy ReadScopedLocalDensePolicy() noexcept { return {mkl_domain_get_max_threads(MKL_DOMAIN_BLAS), mkl_get_dynamic()}; } -bool CholeskyLowerAndInverse(const Matrix& matrix, Matrix& lower, - Matrix& inverse_lower, CholeskyFailure* failure) { - if (failure != nullptr) *failure = CholeskyFailure::kNone; - if (matrix.Rows() != matrix.Columns()) - throw std::invalid_argument{"Cholesky requires a square matrix."}; - const auto size = ToMklSize(matrix.Rows()); - if (!size.HasValue()) - throw std::length_error{"Cholesky size exceeds the MKL integer range."}; - Matrix candidate_lower{matrix.Rows(), matrix.Columns()}; - Matrix candidate_inverse{matrix.Rows(), matrix.Columns()}; - if (matrix.Rows() == 0U) { - lower = std::move(candidate_lower); - inverse_lower = std::move(candidate_inverse); - return true; - } - std::vector values(matrix.Rows() * matrix.Columns()); - for (std::size_t row = 0; row < matrix.Rows(); ++row) - for (std::size_t column = 0; column < matrix.Columns(); ++column) { - if (!std::isfinite(matrix(row, column))) - throw std::invalid_argument{"Cholesky inputs must be finite."}; - values[row * matrix.Columns() + column] = matrix(row, column); - } - if (LAPACKE_dpotrf(LAPACK_ROW_MAJOR, 'L', size.Value(), values.data(), - size.Value()) != 0) { - if (failure != nullptr) *failure = CholeskyFailure::kPivot; - return false; - } - for (std::size_t row = 0; row < matrix.Rows(); ++row) - for (std::size_t column = 0; column <= row; ++column) { - candidate_lower(row, column) = values[row * matrix.Columns() + column]; - if (!std::isfinite(candidate_lower(row, column))) { - if (failure != nullptr) *failure = CholeskyFailure::kPivot; - return false; - } - } - if (LAPACKE_dtrtri(LAPACK_ROW_MAJOR, 'L', 'N', size.Value(), values.data(), - size.Value()) != 0) { - if (failure != nullptr) *failure = CholeskyFailure::kInverse; - return false; - } - for (std::size_t row = 0; row < matrix.Rows(); ++row) - for (std::size_t column = 0; column <= row; ++column) { - const auto value = values[row * matrix.Columns() + column]; - if (!std::isfinite(value)) { - if (failure != nullptr) *failure = CholeskyFailure::kInverse; - return false; - } - candidate_inverse(row, column) = value; - } - lower = std::move(candidate_lower); - inverse_lower = std::move(candidate_inverse); - return true; -} - Vector MultiplyDiagonal(const Vector& diagonal, const Vector& rhs) { if (diagonal.Size() != rhs.Size()) throw std::invalid_argument{"Diagonal product dimensions differ."}; @@ -122,11 +331,19 @@ Matrix MultiplyTransposeLeft(const Matrix& left, const Matrix& right) { if (left.Rows() != right.Rows()) { throw std::invalid_argument{"Transpose product dimensions differ."}; } - Matrix transposed{left.Columns(), left.Rows()}; - for (std::size_t row = 0; row < left.Rows(); ++row) - for (std::size_t column = 0; column < left.Columns(); ++column) - transposed(column, row) = left(row, column); - return transposed.Multiply(right); + RequireFinite(left.Data(), left.Rows() * left.Columns()); + RequireFinite(right.Data(), right.Rows() * right.Columns()); + Matrix result{left.Columns(), right.Columns()}; + if (left.Columns() == 0U || left.Rows() == 0U || right.Columns() == 0U) + return result; + const auto rows = MatrixSizeOrThrow(left.Columns()); + const auto columns = MatrixSizeOrThrow(right.Columns()); + const auto inner = MatrixSizeOrThrow(left.Rows()); + // Row-major A is stored inner-by-rows even when GEMM consumes A-transpose. + cblas_dgemm(CblasRowMajor, CblasTrans, CblasNoTrans, rows, columns, inner, + 1.0, left.Data(), rows, right.Data(), columns, 0.0, + result.Data(), columns); + return result; } bool OuterProduct(const double* left, const std::size_t rows, diff --git a/src/fesa/math/dense_blas_internal.h b/src/fesa/math/dense_blas_internal.h index b2d4481..037c94a 100644 --- a/src/fesa/math/dense_blas_internal.h +++ b/src/fesa/math/dense_blas_internal.h @@ -2,6 +2,7 @@ #define FESA_SRC_FESA_MATH_DENSE_BLAS_INTERNAL_H_ #include +#include #include @@ -11,6 +12,73 @@ namespace fesa::dense_blas_internal { +/// @brief Owns a double-precision numerical factor of a coefficient snapshot. +/// @note Repeated RHS may reuse this immutable factor concurrently. Changing +/// coefficients, dimension, matrix property or precision requires a new factor; +/// matching sparsity alone never permits numerical reuse. No symbolic cache or +/// borrowed coefficient storage exists. Backend thread policy stays +/// caller-owned. +class DenseFactor { + public: + /// @brief Factors a finite square general matrix with partial-pivoting LU. + /// @return An independent factor or a shape, finite, or singular failure. + static Result Lu(const Matrix& coefficients); + + /// @brief Factors the lower triangle of a positive definite matrix. + /// @pre The caller establishes symmetry, including its own tolerance policy. + /// @return An independent factor or a shape, finite, or pivot failure. + /// @note All entries are checked for finiteness; upper values are not + /// averaged. + static Result Cholesky(const Matrix& coefficients); + + /// @brief Solves op(A)*X=rhs with one or more row-major RHS columns. + /// @return A finite owned solution or failure, leaving factor and rhs intact. + Result Solve(const Matrix& rhs, bool transpose = false) const; + + /// @brief Solves X*op(A)=rhs with one or more row-major RHS rows. + /// @return A finite owned solution or failure, leaving factor and rhs intact. + Result SolveRight(const Matrix& rhs, bool transpose = false) const; + + /// @brief Solves op(L)*X=rhs using this Cholesky lower factor. + /// @return Failure for an LU factor, incompatible shape or nonfinite result. + Result SolveLower(const Matrix& rhs, bool transpose = false) const; + + /// @brief Solves X*op(L)=rhs using this Cholesky lower factor. + /// @return Failure for an LU factor, incompatible shape or nonfinite result. + Result SolveLowerRight(const Matrix& rhs, + bool transpose = false) const; + + /// @brief Returns an owned lower Cholesky factor with an exact zero upper + /// part. + /// @return Failure for an LU factor. + Result Lower() const; + + /// @brief Computes the signed determinant from pivots and diagonal factors. + /// @note Empty determinant is one; double overflow/underflow propagates. + double Determinant() const; + + /// @brief Computes (1/||A||inf)/||A^-1||inf without retaining an inverse. + /// @note Solves canonical RHS in ascending order and streams row absolute + /// sums. No estimator, acceptance threshold or regularization is applied. + /// @return Failure for an empty matrix or nonfinite norm/solution arithmetic. + Result ReciprocalConditionInfinity() const; + + private: + /// @brief Constructs a candidate before any backend factorization succeeds. + DenseFactor(const Matrix& coefficients, bool positive_definite); + /// @brief Implements factor creation while keeping failed candidates local. + static Result Create(const Matrix& coefficients, + bool positive_definite); + /// @brief Solves into a candidate with a shared finite/shape failure gate. + Result SolveImpl(const Matrix& rhs, bool transpose, bool right, + bool lower_only) const; + + Matrix factors_; + std::vector pivots_; + double coefficient_norm_inf_{0.0}; + bool positive_definite_; +}; + /// @brief Limits only default-policy one-equation backend calls to one thread. /// @note Existing caller TLS overrides are retained. Destruction restores the /// default request; process-wide MKL/OpenMP settings are never changed. @@ -54,6 +122,37 @@ LocalDensePolicy ReadScopedLocalDensePolicy() noexcept; /// @return The converted length or an uncategorized overflow failure. Result ToMklSize(std::size_t size); +/// @brief Computes a contiguous dot product without rejecting nonfinite input. +/// @pre Both arrays contain size readable entries; null is valid for size zero. +/// @throws std::length_error if size exceeds the backend integer range. +double DotValues(const double* left, std::size_t size, const double* right); + +/// @brief Computes a robust contiguous Euclidean norm with BLAS propagation. +/// @pre values contains size readable entries; null is valid for size zero. +/// @throws std::length_error if size exceeds the backend integer range. +double NormValues(const double* values, std::size_t size); + +/// @brief Scales contiguous values with BLAS nonfinite propagation. +/// @pre values contains size writable entries; null is valid for size zero. +/// @throws std::length_error if size exceeds the backend integer range. +void ScaleValues(double alpha, double* values, std::size_t size); + +/// @brief Accumulates alpha*x into y, allowing x and y to be identical. +/// @pre Arrays contain size entries; other overlap is unsupported. +/// @note Null storage is valid for size zero; nonfinite values follow BLAS. +/// @throws std::length_error if size exceeds the backend integer range. +void AxpyValues(double alpha, const double* x, std::size_t size, double* y); + +/// @brief Multiplies owned row-major values with the Matrix failure contract. +/// @throws std::invalid_argument for incompatible shapes or nonfinite input. +/// @throws std::length_error if dimensions exceed the backend integer range. +Vector Multiply(const Matrix& left, const Vector& right); + +/// @brief Multiplies owned row-major matrices with the Matrix failure contract. +/// @throws std::invalid_argument for incompatible shapes or nonfinite input. +/// @throws std::length_error if dimensions exceed the backend integer range. +Matrix Multiply(const Matrix& left, const Matrix& right); + /// @brief Computes left-transpose times right through ordinary dense MKL. /// @throws std::invalid_argument for mismatched rows or nonfinite operands. Matrix MultiplyTransposeLeft(const Matrix& left, const Matrix& right); @@ -83,19 +182,6 @@ bool MultiplyTransposeRight(const double* left, std::size_t rows, const double* right, std::size_t columns, std::size_t inner, double* destination); -/// @brief Distinguishes positive-factor failure from inverse failure. -enum class CholeskyFailure { kNone, kPivot, kInverse }; - -/// @brief Computes a lower Cholesky factor and its inverse with MKL LAPACK. -/// @return False for a nonpositive pivot or nonfinite factor/inverse. -/// @note Outputs are replaced only after both finite candidates succeed. -/// The optional failure output is initialized even when validation throws. -/// @throws std::invalid_argument for a nonsquare or nonfinite input. -/// @throws std::length_error for a backend size overflow. -bool CholeskyLowerAndInverse(const Matrix& matrix, Matrix& lower, - Matrix& inverse_lower, - CholeskyFailure* failure = nullptr); - /// @brief Copies contiguous double values through the private BLAS backend. /// @param source Readable storage for size values when size is nonzero. /// @param size Number of contiguous values to copy. diff --git a/src/fesa/math/finite_values.h b/src/fesa/math/finite_values.h new file mode 100644 index 0000000..3433915 --- /dev/null +++ b/src/fesa/math/finite_values.h @@ -0,0 +1,40 @@ +#ifndef FESA_MATH_FINITE_VALUES_H_ +#define FESA_MATH_FINITE_VALUES_H_ + +#include +#include +#include + +#include "fesa/math/matrix.h" +#include "fesa/math/vector.h" + +namespace fesa::math_internal { + +/// @brief Checks ordinary doubles in ascending order without dereferencing empty storage. +inline bool IsFiniteValues(const double* values, const std::size_t size) { + for (std::size_t index = 0U; index < size; ++index) { + if (!std::isfinite(values[index])) { + return false; + } + } + return true; +} + +template +bool IsFinite(const std::array& values) { + return IsFiniteValues(values.data(), Size); +} + +inline bool IsFinite(const Vector& values) { + return IsFiniteValues(values.Data(), values.Size()); +} + +inline bool IsFinite(const Matrix& values) { + const auto size = values.Rows() * values.Columns(); + const double* const data = values.Data(); + return IsFiniteValues(data, size); +} + +} // namespace fesa::math_internal + +#endif // FESA_MATH_FINITE_VALUES_H_ diff --git a/src/fesa/math/high_low_arithmetic.h b/src/fesa/math/high_low_arithmetic.h index 8e9bde6..9776724 100644 --- a/src/fesa/math/high_low_arithmetic.h +++ b/src/fesa/math/high_low_arithmetic.h @@ -88,6 +88,12 @@ inline double Rounded(HighLow value) { /// @brief Adds normalized expansions; rounding of discarded tail is bounded. inline HighLow Add(HighLow left, HighLow right) { if (!IsNormalized(left) || !IsNormalized(right)) return InvalidHighLow(); + // Exact-zero additions only normalize signed zero in the retained pair. + // The nonzero graph and its discarded-tail association stay unchanged. + if (left.high == 0 && left.low == 0) + return {right.high, right.low == 0 ? 0.0 : right.low}; + if (right.high == 0 && right.low == 0) + return {left.high, left.low == 0 ? 0.0 : left.low}; const auto head = TwoSum(left.high, right.high); const auto tail = TwoSum(left.low, right.low); const auto middle = TwoSum(head.low, tail.high); @@ -164,9 +170,16 @@ inline HighLow TwoProduct(double left, double right) { inline HighLow Multiply(HighLow left, HighLow right) { if (!IsNormalized(left) || !IsNormalized(right)) return InvalidHighLow(); auto product = TwoProduct(left.high, right.high); - product = Add(product, TwoProduct(left.high, right.low)); - product = Add(product, TwoProduct(left.low, right.high)); - return Add(product, TwoProduct(left.low, right.low)); + // Omitted terms are exact zero; retain the zero normalization that preceded + // a nonzero low-high term and the final canonicalization/invalid check. + if (right.low != 0) + product = Add(product, TwoProduct(left.high, right.low)); + else if (left.low != 0) + product = Add(product, HighLow{}); + if (left.low != 0) + product = Add(product, TwoProduct(left.low, right.high)); + return Add(product, left.low != 0 && right.low != 0 + ? TwoProduct(left.low, right.low) : HighLow{}); } /// @brief Orders canonical values; 2 means unordered/unsupported input. inline int Compare(HighLow left, HighLow right) { diff --git a/src/fesa/math/jet_arithmetic.h b/src/fesa/math/jet_arithmetic.h new file mode 100644 index 0000000..439e439 --- /dev/null +++ b/src/fesa/math/jet_arithmetic.h @@ -0,0 +1,38 @@ +#ifndef FESA_SRC_FESA_MATH_JET_ARITHMETIC_H_ +#define FESA_SRC_FESA_MATH_JET_ARITHMETIC_H_ + +#include +#include + +namespace fesa::math_internal { +/// @brief Multiplies fixed Jet matrices in row/column/index order. +/// @note The caller retains its Jet precision, derivative storage, product rule +/// and constant provenance. Each result starts at its actual constant zero. +template +std::array, 3> MultiplyJetMatrix( + const std::array, 3>& left, + const std::array, 3>& right, Constant constant) { + std::array, 3> result{}; + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t column = 0; column < 3; ++column) { + result[row][column] = constant(0.0); + for (std::size_t index = 0; index < 3; ++index) + result[row][column] = result[row][column] + + left[row][index] * right[index][column]; + } + return result; +} +/// @brief Multiplies a fixed Jet matrix and actual vector RHS in row order. +/// @note The zero-start component accumulation matches both Jet consumers. +template +std::array MultiplyJetMatrixVector( + const std::array, 3>& matrix, + const std::array& vector, Constant constant) { + std::array result{constant(0.0),constant(0.0),constant(0.0)}; + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t column = 0; column < 3; ++column) + result[row] = result[row] + matrix[row][column] * vector[column]; + return result; +} +} // namespace fesa::math_internal +#endif // FESA_SRC_FESA_MATH_JET_ARITHMETIC_H_ diff --git a/src/fesa/math/jet_linear_solve.h b/src/fesa/math/jet_linear_solve.h new file mode 100644 index 0000000..8bb63b1 --- /dev/null +++ b/src/fesa/math/jet_linear_solve.h @@ -0,0 +1,85 @@ +#ifndef FESA_SRC_FESA_MATH_JET_LINEAR_SOLVE_H_ +#define FESA_SRC_FESA_MATH_JET_LINEAR_SOLVE_H_ + +#include +#include +#include + +#include "dense_blas_internal.h" + +namespace fesa::math_internal { +/// @brief Solves one three-component Jet action by increasing derivative degree. +/// @pre factor is LU of exactly the value coefficients of a. Channel zero of +/// degree zero is the value; each later degree contains every retained channel. +/// The reader/writer preserve the caller's derivative or Taylor convention. +/// @note Each degree solves A0*x_degree=(b-A*x_lower)_degree using the same +/// immutable factor. The caller's product supplies every product-rule term; +/// the not-yet-written degree is zero. Distinct Jet storage/order stays owned +/// by the caller. No inverse or primal-only approximation is formed. +/// @return False on a nonfinite solve, leaving output and inputs unchanged. +template +bool SolveJetAction(const std::array, 3>& a, + const std::array& b, + const dense_blas_internal::DenseFactor& factor, + const std::array& channels, + Constant constant, Read read, Write write, + std::array& output) { + std::array candidate{constant(0.0), constant(0.0), constant(0.0)}; + for (std::size_t degree = 0; degree < channels.size(); ++degree) { + Matrix rhs{3, channels[degree]}; + for (std::size_t row = 0; row < 3; ++row) { + Jet residual = b[row]; + // At degree zero the entire candidate is zero. Avoid 0*nonfinite higher + // derivatives affecting a value-only RHS before their own finite gate. + if (degree != 0) + for (std::size_t column = 0; column < 3; ++column) + residual = residual - a[row][column] * candidate[column]; + for (std::size_t channel = 0; channel < channels[degree]; ++channel) + rhs(row, channel) = read(residual, degree, channel); + } + const auto solved = factor.Solve(rhs); + if (!solved.HasValue()) return false; + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t channel = 0; channel < channels[degree]; ++channel) + write(candidate[row], degree, channel, solved.Value()(row, channel)); + } + output = std::move(candidate); + return true; +} +/// @brief Applies a fixed double factor to every channel of one Jet RHS. +/// @note Fixed coefficients have no variations, so the differentiated equation +/// is A0*x_channel=b_channel with no lower-order product terms. Packing never +/// rounds, contracts or omits a derivative channel. Candidate publication is +/// atomic and the factor remains immutable. +template +bool SolveConstantJetAction(const std::array& b, + const dense_blas_internal::DenseFactor& factor, + bool transpose, + const std::array& channels, + Constant constant, Read read, Write write, + std::array& output) { + std::size_t count = 0; + for (const auto size : channels) count += size; + Matrix rhs{3, count}; + std::size_t offset = 0; + for (std::size_t degree = 0; degree < channels.size(); ++degree) { + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t channel = 0; channel < channels[degree]; ++channel) + rhs(row, offset + channel) = read(b[row], degree, channel); + offset += channels[degree]; + } + const auto solved = factor.Solve(rhs, transpose); + if (!solved.HasValue()) return false; + std::array candidate{constant(0), constant(0), constant(0)}; + offset = 0; + for (std::size_t degree = 0; degree < channels.size(); ++degree) { + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t channel = 0; channel < channels[degree]; ++channel) + write(candidate[row], degree, channel, solved.Value()(row, offset+channel)); + offset += channels[degree]; + } + output = std::move(candidate); + return true; +} +} // namespace fesa::math_internal +#endif // FESA_SRC_FESA_MATH_JET_LINEAR_SOLVE_H_ diff --git a/src/fesa/math/matrix.cpp b/src/fesa/math/matrix.cpp index a28e167..b991f24 100644 --- a/src/fesa/math/matrix.cpp +++ b/src/fesa/math/matrix.cpp @@ -1,8 +1,5 @@ #include "fesa/math/matrix.h" -#include -#include - #include #include #include @@ -24,17 +21,6 @@ std::size_t CheckedStorageSize(const std::size_t rows, return rows * columns; } -/// @brief Preserves the Matrix exception contract around private size -/// conversion. -MKL_INT MklSizeOrThrow(const std::size_t size) { - const auto converted = dense_blas_internal::ToMklSize(size); - if (!converted.HasValue()) { - throw std::length_error{ - "Dense matrix dimension exceeds the MKL integer range."}; - } - return converted.Value(); -} - } // namespace Matrix::Matrix(const std::size_t rows, const std::size_t columns, @@ -88,6 +74,18 @@ std::size_t Matrix::Rows() const noexcept { return rows_; } std::size_t Matrix::Columns() const noexcept { return columns_; } +double* Matrix::Data() noexcept { return values_.data(); } + +const double* Matrix::Data() const noexcept { return values_.data(); } + +double Matrix::Norm() const { + return dense_blas_internal::NormValues(Data(), values_.size()); +} + +void Matrix::Scale(const double alpha) { + dense_blas_internal::ScaleValues(alpha, Data(), values_.size()); +} + double& Matrix::operator()(const std::size_t row, const std::size_t column) { if (row >= rows_ || column >= columns_) { throw std::out_of_range{"Matrix index is outside its dimensions."}; @@ -104,53 +102,11 @@ const double& Matrix::operator()(const std::size_t row, } Vector Matrix::Multiply(const Vector& rhs) const { - if (columns_ != rhs.Size()) { - throw std::invalid_argument{ - "Matrix-vector multiplication has incompatible dimensions."}; - } - for (const double value : values_) - if (!std::isfinite(value)) - throw std::invalid_argument{"Matrix product inputs must be finite."}; - for (std::size_t i = 0; i < rhs.Size(); ++i) - if (!std::isfinite(rhs.Data()[i])) - throw std::invalid_argument{"Matrix product inputs must be finite."}; - - Vector result{rows_}; - if (rows_ == 0 || columns_ == 0) { - return result; - } - - // The owned layout is row-major, so the leading dimension is the column - // count for the adapter call and remains invisible to public consumers. - cblas_dgemv(CblasRowMajor, CblasNoTrans, MklSizeOrThrow(rows_), - MklSizeOrThrow(columns_), 1.0, values_.data(), - MklSizeOrThrow(columns_), rhs.Data(), 1, 0.0, result.Data(), 1); - return result; + return dense_blas_internal::Multiply(*this, rhs); } Matrix Matrix::Multiply(const Matrix& rhs) const { - if (columns_ != rhs.rows_) { - throw std::invalid_argument{ - "Matrix multiplication has incompatible dimensions."}; - } - for (const double value : values_) - if (!std::isfinite(value)) - throw std::invalid_argument{"Matrix product inputs must be finite."}; - for (const double value : rhs.values_) - if (!std::isfinite(value)) - throw std::invalid_argument{"Matrix product inputs must be finite."}; - - Matrix result{rows_, rhs.columns_}; - if (rows_ == 0 || columns_ == 0 || rhs.columns_ == 0) { - return result; - } - - cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, MklSizeOrThrow(rows_), - MklSizeOrThrow(rhs.columns_), MklSizeOrThrow(columns_), 1.0, - values_.data(), MklSizeOrThrow(columns_), rhs.values_.data(), - MklSizeOrThrow(rhs.columns_), 0.0, result.values_.data(), - MklSizeOrThrow(rhs.columns_)); - return result; + return dense_blas_internal::Multiply(*this, rhs); } } // namespace fesa diff --git a/src/fesa/math/sparse_matrix.cpp b/src/fesa/math/sparse_matrix.cpp index 988964e..b2d9c16 100644 --- a/src/fesa/math/sparse_matrix.cpp +++ b/src/fesa/math/sparse_matrix.cpp @@ -10,7 +10,6 @@ #include -#include "fesa/fem/dof_manager.h" #include "math/dense_blas_internal.h" namespace fesa { diff --git a/src/fesa/math/vector.cpp b/src/fesa/math/vector.cpp index feadd38..b60da8f 100644 --- a/src/fesa/math/vector.cpp +++ b/src/fesa/math/vector.cpp @@ -1,26 +1,11 @@ #include "fesa/math/vector.h" -#include - #include #include #include "math/dense_blas_internal.h" namespace fesa { -namespace { - -/// @brief Preserves the Vector exception contract around private size -/// conversion. -MKL_INT MklSizeOrThrow(const std::size_t size) { - const auto converted = dense_blas_internal::ToMklSize(size); - if (!converted.HasValue()) { - throw std::length_error{"Dense vector size exceeds the MKL integer range."}; - } - return converted.Value(); -} - -} // namespace Vector::Vector(const std::size_t size, const double value) : values_(size, value) {} @@ -71,38 +56,22 @@ double Vector::Dot(const Vector& rhs) const { throw std::invalid_argument{ "Vector dot product requires equal dimensions."}; } - if (values_.empty()) { - return 0.0; - } - - return cblas_ddot(MklSizeOrThrow(Size()), Data(), 1, rhs.Data(), 1); + return dense_blas_internal::DotValues(Data(), Size(), rhs.Data()); } double Vector::Norm() const { - if (values_.empty()) { - return 0.0; - } - - return cblas_dnrm2(MklSizeOrThrow(Size()), Data(), 1); + return dense_blas_internal::NormValues(Data(), Size()); } void Vector::Scale(const double alpha) { - if (values_.empty()) { - return; - } - - cblas_dscal(MklSizeOrThrow(Size()), alpha, Data(), 1); + dense_blas_internal::ScaleValues(alpha, Data(), Size()); } void Vector::Axpy(const double alpha, const Vector& x) { if (Size() != x.Size()) { throw std::invalid_argument{"Vector axpy requires equal dimensions."}; } - if (values_.empty()) { - return; - } - - cblas_daxpy(MklSizeOrThrow(Size()), alpha, x.Data(), 1, Data(), 1); + dense_blas_internal::AxpyValues(alpha, x.Data(), Size(), Data()); } } // namespace fesa diff --git a/src/fesa/math/vector3_operations.h b/src/fesa/math/vector3_operations.h new file mode 100644 index 0000000..06daf7c --- /dev/null +++ b/src/fesa/math/vector3_operations.h @@ -0,0 +1,57 @@ +#ifndef FESA_MATH_VECTOR3_OPERATIONS_H_ +#define FESA_MATH_VECTOR3_OPERATIONS_H_ + +#include +#include + +#include "fesa/math/matrix.h" +#include "fesa/math/vector3.h" + +namespace fesa::math_internal { + +/// @brief Reduces four source-ordered geometric vectors with scalar-left products. +inline Vector3 WeightedSum(const std::array& weights, + const std::array& values) { + Vector3 result{}; + for (std::size_t node = 0U; node < 4U; ++node) { + result = result + weights[node] * values[node]; + } + return result; +} + +/// @brief Cancels the first-node anchor before the same ordered reduction. +inline Vector3 DerivativeSum(const std::array& derivatives, + const std::array& values) { + std::array relative{}; + for (std::size_t node = 0U; node < 4U; ++node) { + relative[node] = values[node] - values[0U]; + } + return WeightedSum(derivatives, relative); +} + +/// @brief Forms the positive cross-product matrix in fixed Cartesian coordinates. +inline Matrix Skew(const Vector3& vector) { + Matrix result{3U, 3U}; + result(0U, 1U) = -vector.Z(); + result(0U, 2U) = vector.Y(); + result(1U, 0U) = vector.Z(); + result(1U, 2U) = -vector.X(); + result(2U, 0U) = -vector.Y(); + result(2U, 1U) = vector.X(); + return result; +} + +/// @brief Applies a fixed 3-by-3 geometric frame with the original component graph. +inline Vector3 Multiply(const Matrix& matrix, const Vector3& vector) { + return Vector3{ + matrix(0U, 0U) * vector.X() + matrix(0U, 1U) * vector.Y() + + matrix(0U, 2U) * vector.Z(), + matrix(1U, 0U) * vector.X() + matrix(1U, 1U) * vector.Y() + + matrix(1U, 2U) * vector.Z(), + matrix(2U, 0U) * vector.X() + matrix(2U, 1U) * vector.Y() + + matrix(2U, 2U) * vector.Z()}; +} + +} // namespace fesa::math_internal + +#endif // FESA_MATH_VECTOR3_OPERATIONS_H_ diff --git a/src/fesa/model/shell_geometry.cpp b/src/fesa/model/shell_geometry.cpp index 9e152fe..3998ad7 100644 --- a/src/fesa/model/shell_geometry.cpp +++ b/src/fesa/model/shell_geometry.cpp @@ -7,9 +7,15 @@ #include "fesa/math/vector3.h" +#include "math/dense_blas_internal.h" +#include "math/vector3_operations.h" + namespace fesa { namespace { +using math_internal::DerivativeSum; +using math_internal::WeightedSum; + constexpr std::array kXiSigns{-1.0, 1.0, 1.0, -1.0}; constexpr std::array kEtaSigns{-1.0, -1.0, 1.0, 1.0}; @@ -38,27 +44,6 @@ ShapeData ShapeDataAt(double xi, double eta) { return data; } -Vector3 WeightedSum(const std::array& weights, - const std::array& values) { - Vector3 result{}; - for (std::size_t node = 0U; node < values.size(); ++node) { - result = result + weights[node] * values[node]; - } - return result; -} - -/// @brief Forms a translation-invariant covariant tangent in node order. -Vector3 DerivativeSum(const std::array& derivatives, - const std::array& coordinates) { - // Shape derivatives sum to zero, so translating by node 1 improves the - // numerical cancellation without changing the covariant tangent. - std::array relative{}; - for (std::size_t node = 0U; node < coordinates.size(); ++node) { - relative[node] = coordinates[node] - coordinates[0]; - } - return WeightedSum(derivatives, relative); -} - Result GeometryFailure(std::string code, const SourceLocation& location, std::string keyword, std::string identity, @@ -405,14 +390,27 @@ Result PreprocessShellGeometry( element.source_id.source_label_text, "Shell Jacobian is nonfinite or nonpositive at a required point."); } - const Vector3 reciprocal_xi = - (1.0 / jacobian) * covariant_eta.Cross(covariant_zeta); - const Vector3 reciprocal_eta = - (1.0 / jacobian) * covariant_zeta.Cross(covariant_xi); - const Vector3 reciprocal_zeta = - (1.0 / jacobian) * covariant_xi.Cross(covariant_eta); - if (!reciprocal_xi.IsFinite() || !reciprocal_eta.IsFinite() || - !reciprocal_zeta.IsFinite()) { + bool finite_actions = std::isfinite(1.0 / jacobian) && + covariant_eta.Cross(covariant_zeta).IsFinite() && + covariant_zeta.Cross(covariant_xi).IsFinite() && + covariant_xi.Cross(covariant_eta).IsFinite(); + if (finite_actions) { + Matrix coefficients{3U, 3U}; + for (std::size_t i = 0; i < 3U; ++i) { + coefficients(i, 0) = covariant_xi[i]; + coefficients(i, 1) = covariant_eta[i]; + coefficients(i, 2) = covariant_zeta[i]; + } + const auto factor = dense_blas_internal::DenseFactor::Lu(coefficients); + finite_actions = factor.HasValue(); + Matrix rhs{3U, 1U}; + for (std::size_t axis = 0; finite_actions && axis < 3U; ++axis) { + if (axis != 0U) rhs(axis - 1U, 0U) = 0.0; + rhs(axis, 0U) = 1.0; + finite_actions = factor.Value().Solve(rhs, true).HasValue(); + } + } + if (!finite_actions) { return GeometryFailure( "invalid-shell-jacobian", element.location, "ELEMENT", element.source_id.source_label_text, diff --git a/src/fesa/model/source_target_resolver.cpp b/src/fesa/model/source_target_resolver.cpp index fd81c01..df77c54 100644 --- a/src/fesa/model/source_target_resolver.cpp +++ b/src/fesa/model/source_target_resolver.cpp @@ -74,20 +74,21 @@ SourceTargetIndex::SourceTargetIndex( std::vector entries) : entries_{std::move(entries)} {} -SourceTargetIndex SourceTargetIndex::FromDomain(const Domain& domain) { +SourceTargetIndex SourceTargetIndex::FromNodeDefinitions( + const std::vector& nodes, const std::vector& node_sets) { std::vector entries; std::size_t declaration_order = 0U; - for (std::size_t index = 0U; index < domain.Nodes().size(); ++index) { - const auto& node = domain.Nodes()[index]; + for (std::size_t index = 0U; index < nodes.size(); ++index) { + const auto& node = nodes[index]; entries.push_back({SourceEntityKind::kNode, node.source_id.instance_name, "", node.source_id, static_cast(index), declaration_order++}); } - for (const auto& set : domain.NodeSets()) { + for (const auto& set : node_sets) { for (const EntityIndex node_index : set.node_indices) { SourceEntityId source_id{set.instance_name.value_or(""), 0, ""}; - if (node_index < domain.Nodes().size()) { - source_id = domain.Nodes()[node_index].source_id; + if (node_index < nodes.size()) { + source_id = nodes[node_index].source_id; } entries.push_back({SourceEntityKind::kNode, set.instance_name.value_or(source_id.instance_name), @@ -96,6 +97,13 @@ SourceTargetIndex SourceTargetIndex::FromDomain(const Domain& domain) { } } + return SourceTargetIndex{std::move(entries)}; +} + +SourceTargetIndex SourceTargetIndex::FromDomain(const Domain& domain) { + SourceTargetIndex result = FromNodeDefinitions(domain.Nodes(), domain.NodeSets()); + auto& entries = result.entries_; + std::size_t declaration_order = entries.size(); for (std::size_t index = 0U; index < domain.Elements().Size(); ++index) { const auto& element = domain.Elements()[index]; entries.push_back({SourceEntityKind::kElement, @@ -114,7 +122,7 @@ SourceTargetIndex SourceTargetIndex::FromDomain(const Domain& domain) { declaration_order++}); } } - return SourceTargetIndex{std::move(entries)}; + return result; } const std::vector& SourceTargetIndex::Entries() diff --git a/src/fesa/results/AGENTS.md b/src/fesa/results/AGENTS.md index 5b298d2..1ab587b 100644 --- a/src/fesa/results/AGENTS.md +++ b/src/fesa/results/AGENTS.md @@ -12,3 +12,7 @@ HDF5 layout이나 reference 데이터를 맞추기 위한 보정은 하지 않 - 전체 recovery candidate의 finite·identity·balance 검증 뒤 state에 반영한다. - Analytical recovery, thickness scaling, 원점·좌표변환, force/moment balance, failure preservation와 row ordering을 검증한다. Displacement 일치만으로 recovery를 승인하지 않는다. + +- WritePreparedAnalysisResult는 completed typed outcome을 해당 authoritative writer로 보낸다. + 호출자는 로그 close 성공을 먼저 확인하며 선택 family의 필수 adapter 부재는 output failure다. + Dispatch가 schema·수치 gate·candidate finalize를 우회하지 않게 한다. diff --git a/src/fesa/results/prepared_results_writer.cpp b/src/fesa/results/prepared_results_writer.cpp new file mode 100644 index 0000000..aa69c41 --- /dev/null +++ b/src/fesa/results/prepared_results_writer.cpp @@ -0,0 +1,83 @@ +#include "fesa/results/prepared_results_writer.h" + +#include "fesa/results/dynamic_results_writer.h" +#include "fesa/results/eigen_results_writer.h" +#include "fesa/results/nonlinear_results_writer.h" +#include "fesa/results/results_writer.h" +#include "fesa/results/solid_results_writer.h" +#include "fesa/results/thermal_results_writer.h" + +namespace fesa { + +Status WritePreparedAnalysisResult( + const std::filesystem::path& results_path, const Domain& domain, + const PreparedAnalysisOutcome& outcome, + const std::vector& diagnostics, ResultsWriter& linear_writer, + NonlinearResultsWriter& nonlinear_writer, EigenResultsWriter& eigen_writer, + DynamicResultsWriter* dynamic_writer, ThermalResultsWriter* thermal_writer, + SolidResultsWriter* solid_writer) { + if (std::holds_alternative(outcome) || + std::holds_alternative(outcome) || + std::holds_alternative(outcome)) { + if (solid_writer == nullptr) + return Status::Failure(FailureCategory::kOutput, + {{Severity::kError, + "missing-solid-writer", + {}, + "", + {}, + "Solid result writer is required."}}); + if (const auto* result = std::get_if(&outcome)) + return solid_writer->Write(results_path, domain, result->state, + diagnostics); + if (const auto* result = std::get_if(&outcome)) + return solid_writer->Write(results_path, domain, *result, + diagnostics); + return solid_writer->Write( + results_path, domain, + std::get(outcome).state, diagnostics); + } + if (std::holds_alternative(outcome)) { + if (thermal_writer == nullptr) { + return Status::Failure(FailureCategory::kOutput, + {{Severity::kError, + "missing-thermal-writer", + {}, + "HEAT TRANSFER", + {}, + "Thermal result writer is required."}}); + } + return thermal_writer->Write( + results_path, domain, + std::get(outcome).state, diagnostics); + } + if (std::holds_alternative(outcome)) { + if (dynamic_writer == nullptr) + return Status::Failure(FailureCategory::kOutput, + {{Severity::kError, + "missing-dynamic-writer", + {}, + "DYNAMIC", + {}, + "Dynamic result writer is required."}}); + return dynamic_writer->Write( + results_path, domain, + std::get(outcome).state, diagnostics); + } + if (std::holds_alternative(outcome)) { + return eigen_writer.Write(results_path, domain, + std::get(outcome), + diagnostics); + } + if (std::holds_alternative(outcome)) { + return linear_writer.Write( + results_path, domain, + std::get(outcome).state, diagnostics); + } + + return nonlinear_writer.Write( + results_path, domain, + std::get(outcome).state, diagnostics); +} + +} // namespace fesa diff --git a/src/fesa/results/recovery_candidate.cpp b/src/fesa/results/recovery_candidate.cpp index d16300c..762931d 100644 --- a/src/fesa/results/recovery_candidate.cpp +++ b/src/fesa/results/recovery_candidate.cpp @@ -22,18 +22,11 @@ Status RecoveryFailure(const std::string& code, const SourceLocation& location, bool SameSourceIdentity(const SourceEntityId& left, const SourceEntityId& right) { - return left.instance_name == right.instance_name && - left.source_label == right.source_label && - left.source_label_text == right.source_label_text; + return fesa::SourceIdentityEquals(left, right); } bool IsFiniteVector(const Vector& values) { - for (std::size_t index = 0U; index < values.Size(); ++index) { - if (!std::isfinite(values[index])) { - return false; - } - } - return true; + return math_internal::IsFinite(values); } } // namespace fesa::results_internal diff --git a/src/fesa/results/recovery_candidate.h b/src/fesa/results/recovery_candidate.h index ab11fcd..9141e62 100644 --- a/src/fesa/results/recovery_candidate.h +++ b/src/fesa/results/recovery_candidate.h @@ -1,9 +1,7 @@ #ifndef FESA_RESULTS_RECOVERY_CANDIDATE_H_ #define FESA_RESULTS_RECOVERY_CANDIDATE_H_ -#include #include -#include #include #include #include @@ -12,6 +10,7 @@ #include "fesa/core/status.h" #include "fesa/math/vector.h" #include "fesa/results/result_records.h" +#include "math/finite_values.h" namespace fesa::results_internal { @@ -53,8 +52,7 @@ bool SameSourceIdentity(const SourceEntityId& left, /// @brief Tests a fixed-size recovery component array for finite values. template bool IsFiniteArray(const std::array& values) { - return std::all_of(values.begin(), values.end(), - [](const double value) { return std::isfinite(value); }); + return math_internal::IsFinite(values); } /// @brief Tests an owned Vector for finite values. diff --git a/src/fesa/results/result_recovery.cpp b/src/fesa/results/result_recovery.cpp index b23041a..6ffe396 100644 --- a/src/fesa/results/result_recovery.cpp +++ b/src/fesa/results/result_recovery.cpp @@ -32,21 +32,8 @@ constexpr double kAxisTolerance = 1.0e-12; using AxisSet = std::array, 3>; -Status RecoveryFailure(const std::string& code, const SourceLocation& location, - const std::string& identity, - const std::string& message) { - return Status::Failure(FailureCategory::kModel, - {{Severity::kError, code, location, "RESULT_RECOVERY", - identity, message}}); -} - -template -Result RecoveryResultFailure(const std::string& code, - const SourceLocation& location, - const std::string& identity, - const std::string& message) { - return Result::Failure(RecoveryFailure(code, location, identity, message)); -} +using results_internal::RecoveryFailure; +using results_internal::RecoveryResultFailure; template bool IsFinite(const std::array& values) { diff --git a/src/fesa/results/shell_result_recovery.cpp b/src/fesa/results/shell_result_recovery.cpp index bd47684..b7c00da 100644 --- a/src/fesa/results/shell_result_recovery.cpp +++ b/src/fesa/results/shell_result_recovery.cpp @@ -5,7 +5,6 @@ #include namespace fesa::results_internal { -namespace { bool IsFiniteShellRow(const ShellResultRow& row) { if (!IsFiniteArray(row.natural_coordinates) || @@ -25,8 +24,6 @@ bool IsFiniteShellRow(const ShellResultRow& row) { }); } -} // namespace - Status ShellResultRecovery(const SourceLocation& location, const SourceEntityId& source_id, const EntityIndex expected_element, diff --git a/src/fesa/results/shell_result_recovery.h b/src/fesa/results/shell_result_recovery.h index 183eba4..01bc186 100644 --- a/src/fesa/results/shell_result_recovery.h +++ b/src/fesa/results/shell_result_recovery.h @@ -8,6 +8,9 @@ namespace fesa::results_internal { +/// @brief Checks physical fields in their preserved source-row order. +bool IsFiniteShellRow(const ShellResultRow& row); + /// @brief Validates and appends physical shell rows and energy evidence. Status ShellResultRecovery(const SourceLocation& location, const SourceEntityId& source_id, diff --git a/src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp b/src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp index 7e3a237..e97674d 100644 --- a/src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp +++ b/src/fesa/solvers/eigen/mkl_feast_eigen_solver.cpp @@ -355,11 +355,12 @@ bool FillInitialBasis(std::vector& vectors, const std::size_t n, } for (double& value : reflector) value /= reflector_norm; for (std::size_t target = column; target < columns; ++target) { - const auto length = static_cast(n - column); + const std::size_t length = n - column; auto* target_column = vectors.data() + column + target * n; - const double dot = cblas_ddot(length, reflector.data(), 1, - target_column, 1); - cblas_daxpy(length, -2.0 * dot, reflector.data(), 1, target_column, 1); + const double dot = dense_blas_internal::DotValues( + reflector.data(), length, target_column); + dense_blas_internal::AxpyValues(-2.0 * dot, reflector.data(), length, + target_column); } reflectors.push_back(std::move(reflector)); } @@ -370,11 +371,12 @@ bool FillInitialBasis(std::vector& vectors, const std::size_t n, const std::size_t column = index - 1U; const auto& reflector = reflectors[column]; for (std::size_t target = 0U; target < columns; ++target) { - const auto length = static_cast(n - column); + const std::size_t length = n - column; auto* target_column = vectors.data() + column + target * n; - const double dot = cblas_ddot(length, reflector.data(), 1, - target_column, 1); - cblas_daxpy(length, -2.0 * dot, reflector.data(), 1, target_column, 1); + const double dot = dense_blas_internal::DotValues( + reflector.data(), length, target_column); + dense_blas_internal::AxpyValues(-2.0 * dot, reflector.data(), length, + target_column); } } for (std::size_t column = 0U; column < columns; ++column) @@ -383,9 +385,8 @@ bool FillInitialBasis(std::vector& vectors, const std::size_t n, double gram_error = 0.0; for (std::size_t left = 0U; left < columns; ++left) { for (std::size_t right = 0U; right < columns; ++right) { - const double dot = cblas_ddot(static_cast(n), - vectors.data() + left * n, 1, - vectors.data() + right * n, 1); + const double dot = dense_blas_internal::DotValues( + vectors.data() + left * n, n, vectors.data() + right * n); gram_error = std::hypot(gram_error, dot - (left == right ? 1.0 : 0.0)); } } diff --git a/src/fesa/solvers/linear/AGENTS.md b/src/fesa/solvers/linear/AGENTS.md index 3f16801..6668e19 100644 --- a/src/fesa/solvers/linear/AGENTS.md +++ b/src/fesa/solvers/linear/AGENTS.md @@ -11,3 +11,6 @@ Model 수정, constraint 추가와 물성 변경은 solver 실패의 대안이 남기지 않는다. Empty free 처리의 caller/backend 계약을 유지한다. - 알려진 해, residual, 잘못된 matrix, failure/reuse, size 변환과 resource 정리를 검증한다. 해가 finite인 것만으로 FEM 평형을 통과했다고 보고하지 않는다. + +- 공통 private Pardiso Session의 factor/solve/release 소유권과 failure cleanup을 유지한다. + 기존1×1 local-thread/TLS 회피의 범위를 모든 matrix/vendor heap 문제의 해결로 확대하지 않는다. diff --git a/src/fesa/solvers/linear/mkl_pardiso_solver.cpp b/src/fesa/solvers/linear/mkl_pardiso_solver.cpp index 0cc9adc..edf319a 100644 --- a/src/fesa/solvers/linear/mkl_pardiso_solver.cpp +++ b/src/fesa/solvers/linear/mkl_pardiso_solver.cpp @@ -1,339 +1,15 @@ #include "fesa/solvers/linear/mkl_pardiso_solver.h" -#include - -#include -#include -#include -#include -#include #include -#include -#include -#include -#include "fesa/math/sparse_matrix.h" -#include "fesa/math/vector.h" -#include "math/dense_blas_internal.h" +#include "solvers/linear/pardiso_session.h" namespace fesa { -namespace { - -/// @brief Builds a structured linear-solver failure. -Status SolverFailure(const std::string& code, const std::string& identity, - const std::string& message) { - return Status::Failure( - FailureCategory::kSolver, - {{Severity::kError, code, {{}, 0U}, "PARDISO", identity, message}}); -} - -/// @brief Translates a PARDISO phase error into the stable solver taxonomy. -Status PardisoFailure(const MKL_INT phase, const MKL_INT error) { - std::string code; - std::string reason; - switch (error) { - case -4: - code = "pardiso-zero-or-negative-pivot"; - reason = "zero or negative pivot"; - break; - case -7: - code = "pardiso-singular-diagonal"; - reason = "singular diagonal"; - break; - case -8: - code = "pardiso-integer-overflow"; - reason = "32-bit backend integer overflow"; - break; - case 21: - case 22: - case 23: - case 24: - code = "pardiso-invalid-csr"; - reason = "matrix checker rejected the CSR indices"; - break; - default: - code = phase == 11 ? "pardiso-analysis-failed" - : phase == 22 ? "pardiso-factorization-failed" - : phase == 33 ? "pardiso-solve-failed" - : "pardiso-release-failed"; - reason = "backend error"; - break; - } - - const std::string phase_text = std::to_string(phase); - const std::string error_text = std::to_string(error); - return SolverFailure(code, "phase=" + phase_text + ",error=" + error_text, - "oneMKL PARDISO phase " + phase_text + - " failed with error " + error_text + " (" + reason + - ")."); -} - -/// @brief Reports whether a public size fits the private MKL integer type. -bool ConvertsToMklInt(const std::size_t value) { - return value <= - static_cast((std::numeric_limits::max)()); -} - -} // namespace class MklPardisoSolver::Impl { public: - Impl() = default; - - ~Impl() { static_cast(Release()); } - - /// @brief Validates and factorizes one public CSR matrix. - Status Factorize(const SparseMatrix& matrix) { - const MKL_INT release_error = Release(); - if (release_error != 0) { - return PardisoFailure(-1, release_error); - } - - const Status csr_status = matrix.Validate(); - if (!csr_status.IsOk()) { - return SolverFailure("solver-invalid-csr", "public-csr", - "The public sparse matrix failed CSR validation."); - } - if (matrix.Rows() != matrix.Columns()) { - return SolverFailure("solver-matrix-not-square", "matrix-shape", - "PARDISO factorization requires a square matrix."); - } - if (matrix.Rows() == 0U) { - // A fully constrained model has no free equations. Preserve the - // observable factorize/solve lifecycle without creating backend - // state or calling PARDISO with its invalid n=0 input. - factorized_ = true; - return Status::Ok(); - } - if (!ConvertsToMklInt(matrix.Rows()) || - !ConvertsToMklInt(matrix.Values().size())) { - return SolverFailure( - "solver-dimension-overflow", "matrix-shape", - "Sparse matrix dimensions exceed the oneMKL integer range."); - } - - const Status copy_status = CopyValidatedUpperTriangle(matrix); - if (!copy_status.IsOk()) { - ClearOwnedArrays(); - return copy_status; - } - - // PARDISO owns internal memory behind pt after phase 11. Initialize - // once per factorization and retain it until refactorization/destruction. - pt_.fill(nullptr); - iparm_.fill(0); - pardisoinit(pt_.data(), &mtype_, iparm_.data()); - iparm_[26] = 1; // Validate sorted CSR integer arrays. - iparm_[34] = 1; // Consume the project's native zero-based CSR. - permutation_.assign(static_cast(equation_count_), 0); - owns_pardiso_state_ = true; - - MKL_INT phase = 11; - MKL_INT error = 0; - CallPardiso(phase, nullptr, nullptr, error); - if (error != 0) { - const Status failure = PardisoFailure(phase, error); - static_cast(Release()); - return failure; - } - - phase = 22; - error = 0; - CallPardiso(phase, nullptr, nullptr, error); - if (error != 0) { - const Status failure = PardisoFailure(phase, error); - static_cast(Release()); - return failure; - } - - factorized_ = true; - return Status::Ok(); - } - - /// @brief Substitutes one RHS while preserving solution on failure. - Status Solve(const Vector& rhs, Vector& solution) { - if (!factorized_) { - return SolverFailure( - "solver-not-factorized", "factorization-state", - "Substitution requires a successful retained factorization."); - } - const std::size_t size = static_cast(equation_count_); - if (rhs.Size() != size || solution.Size() != size) { - return SolverFailure( - "solver-vector-dimension-mismatch", "rhs-or-solution", - "RHS and solution dimensions must match the factorized matrix."); - } - for (std::size_t index = 0U; index < rhs.Size(); ++index) { - if (!std::isfinite(rhs[index])) { - return SolverFailure("nonfinite-solver-rhs", std::to_string(index), - "PARDISO RHS values must be finite."); - } - } - if (size == 0U) { - return Status::Ok(); - } - - std::vector rhs_copy(rhs.Data(), rhs.Data() + rhs.Size()); - Vector candidate{size}; - MKL_INT phase = 33; - MKL_INT error = 0; - CallPardiso(phase, rhs_copy.data(), candidate.Data(), error); - if (error != 0) { - return PardisoFailure(phase, error); - } - for (std::size_t index = 0U; index < candidate.Size(); ++index) { - if (!std::isfinite(candidate[index])) { - return SolverFailure( - "nonfinite-solver-solution", std::to_string(index), - "PARDISO substitution produced a nonfinite solution."); - } - } - - solution = std::move(candidate); - return Status::Ok(); - } - - private: - /// @brief Validates symmetry and copies the upper triangle for PARDISO. - Status CopyValidatedUpperTriangle(const SparseMatrix& matrix) { - const auto& public_offsets = matrix.RowOffsets(); - const auto& public_columns = matrix.ColumnIndices(); - const auto& public_values = matrix.Values(); - - double matrix_scale = 0.0; - for (const double value : public_values) { - matrix_scale = (std::max)(matrix_scale, std::abs(value)); - } - - for (std::size_t row = 0U; row < matrix.Rows(); ++row) { - for (std::size_t position = public_offsets[row]; - position < public_offsets[row + 1U]; ++position) { - const std::size_t column = public_columns[position]; - const auto reverse_begin = - public_columns.begin() + - static_cast(public_offsets[column]); - const auto reverse_end = - public_columns.begin() + - static_cast(public_offsets[column + 1U]); - const auto reverse = std::lower_bound(reverse_begin, reverse_end, row); - if (reverse == reverse_end || *reverse != row) { - return SolverFailure( - "solver-matrix-not-symmetric", - std::to_string(row) + ":" + std::to_string(column), - "The full public CSR must contain both symmetric entries."); - } - - const std::size_t reverse_position = static_cast( - std::distance(public_columns.begin(), reverse)); - const double left = public_values[position]; - const double right = public_values[reverse_position]; - const double difference = std::abs(left - right); - // The approved symmetry test is normalized by the matrix's - // actual nonzero scale, without an absolute unit-size floor. - const bool is_symmetric = matrix_scale == 0.0 - ? difference == 0.0 - : difference <= 1.0e-12 * matrix_scale; - if (!is_symmetric) { - return SolverFailure( - "solver-matrix-not-symmetric", - std::to_string(row) + ":" + std::to_string(column), - "The full public CSR values violate the approved symmetry " - "tolerance."); - } - } - } - - equation_count_ = static_cast(matrix.Rows()); - row_offsets_.clear(); - column_indices_.clear(); - values_.clear(); - row_offsets_.reserve(matrix.Rows() + 1U); - row_offsets_.push_back(0); - - for (std::size_t row = 0U; row < matrix.Rows(); ++row) { - bool has_diagonal = false; - for (std::size_t position = public_offsets[row]; - position < public_offsets[row + 1U]; ++position) { - const std::size_t column = public_columns[position]; - if (column < row) { - continue; - } - if (!ConvertsToMklInt(column) || - !ConvertsToMklInt(column_indices_.size())) { - return SolverFailure( - "solver-dimension-overflow", - std::to_string(row) + ":" + std::to_string(column), - "CSR indices exceed the oneMKL integer range."); - } - has_diagonal = has_diagonal || column == row; - column_indices_.push_back(static_cast(column)); - values_.push_back(public_values[position]); - } - if (!has_diagonal) { - return SolverFailure( - "solver-missing-diagonal", std::to_string(row), - "Every PARDISO SPD row must retain its diagonal slot."); - } - if (!ConvertsToMklInt(column_indices_.size())) { - return SolverFailure( - "solver-dimension-overflow", std::to_string(row), - "CSR row offsets exceed the oneMKL integer range."); - } - row_offsets_.push_back(static_cast(column_indices_.size())); - } - return Status::Ok(); - } - - /// @brief Calls PARDISO with retained private arrays and phase state. - void CallPardiso(const MKL_INT phase, double* rhs, double* solution, - MKL_INT& error) { - const dense_blas_internal::ScopedSingleEquationThreads thread_scope{ - static_cast(equation_count_)}; - pardiso(pt_.data(), &max_factorizations_, &matrix_number_, &mtype_, &phase, - &equation_count_, values_.data(), row_offsets_.data(), - column_indices_.data(), permutation_.data(), &rhs_count_, - iparm_.data(), &message_level_, rhs, solution, &error); - } - - /// @brief Releases backend state and resets every retained array. - MKL_INT Release() noexcept { - MKL_INT error = 0; - if (owns_pardiso_state_) { - const MKL_INT phase = -1; - double placeholder = 0.0; - CallPardiso(phase, &placeholder, &placeholder, error); - } - owns_pardiso_state_ = false; - factorized_ = false; - pt_.fill(nullptr); - iparm_.fill(0); - permutation_.clear(); - ClearOwnedArrays(); - return error; - } - - /// @brief Clears FESA-owned CSR arrays without touching backend state. - void ClearOwnedArrays() noexcept { - equation_count_ = 0; - row_offsets_.clear(); - column_indices_.clear(); - values_.clear(); - } - - std::array pt_{}; - std::array iparm_{}; - std::vector row_offsets_; - std::vector column_indices_; - std::vector permutation_; - std::vector values_; - MKL_INT equation_count_{0}; - MKL_INT max_factorizations_{1}; - MKL_INT matrix_number_{1}; - MKL_INT mtype_{2}; - MKL_INT rhs_count_{1}; - MKL_INT message_level_{0}; - bool owns_pardiso_state_{false}; - bool factorized_{false}; + pardiso_internal::PardisoSession session_{ + pardiso_internal::PardisoMatrixPolicy::kSpdUpper}; }; MklPardisoSolver::MklPardisoSolver() : impl_{std::make_unique()} {} @@ -341,11 +17,11 @@ MklPardisoSolver::MklPardisoSolver() : impl_{std::make_unique()} {} MklPardisoSolver::~MklPardisoSolver() = default; Status MklPardisoSolver::Factorize(const SparseMatrix& matrix) { - return impl_->Factorize(matrix); + return impl_->session_.Factorize(matrix); } Status MklPardisoSolver::Solve(const Vector& rhs, Vector& solution) const { - return impl_->Solve(rhs, solution); + return impl_->session_.Solve(rhs, solution); } } // namespace fesa diff --git a/src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp b/src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp index b544312..728dc53 100644 --- a/src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp +++ b/src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp @@ -1,297 +1,27 @@ #include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" -#include - -#include -#include -#include -#include #include -#include -#include -#include -#include "fesa/math/sparse_matrix.h" -#include "fesa/math/vector.h" -#include "math/dense_blas_internal.h" +#include "solvers/linear/pardiso_session.h" namespace fesa { -namespace { - -/// @brief Builds a structured nonlinear tangent-solver failure. -Status SolverFailure(const std::string& code, const std::string& identity, - const std::string& message) { - return Status::Failure( - FailureCategory::kSolver, - {{Severity::kError, code, {{}, 0U}, "PARDISO", identity, message}}); -} - -/// @brief Translates a PARDISO phase error into the stable solver taxonomy. -Status PardisoFailure(const MKL_INT phase, const MKL_INT error) { - std::string code; - std::string reason; - switch (error) { - case -4: - code = "pardiso-zero-or-negative-pivot"; - reason = "zero or negative pivot"; - break; - case -7: - code = "pardiso-singular-diagonal"; - reason = "singular diagonal"; - break; - case -8: - code = "pardiso-integer-overflow"; - reason = "32-bit backend integer overflow"; - break; - case 21: - case 22: - case 23: - case 24: - code = "pardiso-invalid-csr"; - reason = "matrix checker rejected the CSR indices"; - break; - default: - code = phase == 11 ? "pardiso-analysis-failed" - : phase == 22 ? "pardiso-factorization-failed" - : phase == 33 ? "pardiso-solve-failed" - : "pardiso-release-failed"; - reason = "backend error"; - break; - } - - const std::string phase_text = std::to_string(phase); - const std::string error_text = std::to_string(error); - return SolverFailure(code, "phase=" + phase_text + ",error=" + error_text, - "oneMKL PARDISO phase " + phase_text + - " failed with error " + error_text + " (" + reason + - ")."); -} - -/// @brief Reports whether a public size fits the private MKL integer type. -bool ConvertsToMklInt(const std::size_t value) { - return value <= - static_cast((std::numeric_limits::max)()); -} - -} // namespace class MklPardisoTangentSolver::Impl { public: - Impl() = default; - - ~Impl() { static_cast(Release()); } - - /// @brief Replaces any retained state with one validated full-CSR tangent. - Status FactorizeFresh(const SparseMatrix& matrix) { - const MKL_INT release_error = Release(); - if (release_error != 0) { - return PardisoFailure(-1, release_error); - } - - const Status csr_status = matrix.Validate(); - if (!csr_status.IsOk()) { - return SolverFailure("solver-invalid-csr", "public-csr", - "The public sparse matrix failed CSR validation."); - } - if (matrix.Rows() != matrix.Columns()) { - return SolverFailure("solver-matrix-not-square", "matrix-shape", - "PARDISO factorization requires a square matrix."); - } - if (matrix.Rows() == 0U) { - // PARDISO does not accept n=0, but a fully constrained nonlinear - // correction remains a valid factorize/solve lifecycle. - factorized_ = true; - return Status::Ok(); - } - if (!ConvertsToMklInt(matrix.Rows()) || - !ConvertsToMklInt(matrix.Values().size())) { - return SolverFailure( - "solver-dimension-overflow", "matrix-shape", - "Sparse matrix dimensions exceed the oneMKL integer range."); - } - - const Status copy_status = CopyValidatedFullCsr(matrix); - if (!copy_status.IsOk()) { - ClearOwnedArrays(); - return copy_status; - } - - // The nonlinear tangent is generally nonsymmetric, so PARDISO consumes - // the complete public CSR with mtype=11 instead of an SPD triangle. - pt_.fill(nullptr); - iparm_.fill(0); - pardisoinit(pt_.data(), &mtype_, iparm_.data()); - iparm_[26] = 1; // Validate sorted CSR integer arrays. - iparm_[34] = 1; // Consume the project's native zero-based CSR. - permutation_.assign(static_cast(equation_count_), 0); - owns_pardiso_state_ = true; - - MKL_INT phase = 11; - MKL_INT error = 0; - CallPardiso(phase, nullptr, nullptr, error); - if (error != 0) { - const Status failure = PardisoFailure(phase, error); - static_cast(Release()); - return failure; - } - - phase = 22; - error = 0; - CallPardiso(phase, nullptr, nullptr, error); - if (error != 0) { - const Status failure = PardisoFailure(phase, error); - static_cast(Release()); - return failure; - } - if (iparm_[13] != 0) { - const Status failure = SolverFailure( - "pardiso-perturbed-pivot", "phase=22", - "oneMKL PARDISO perturbed one or more tangent pivots."); - static_cast(Release()); - return failure; - } - - factorized_ = true; - return Status::Ok(); - } - - /// @brief Solves one correction while preserving caller output on failure. - Status SolveCorrection(const Vector& rhs, Vector& correction) { - if (!factorized_) { - return SolverFailure( - "solver-not-factorized", "factorization-state", - "Substitution requires a successful retained factorization."); - } - const std::size_t size = static_cast(equation_count_); - if (rhs.Size() != size || correction.Size() != size) { - return SolverFailure( - "solver-vector-dimension-mismatch", "rhs-or-correction", - "RHS and correction dimensions must match the factorized matrix."); - } - for (std::size_t index = 0U; index < rhs.Size(); ++index) { - if (!std::isfinite(rhs[index])) { - return SolverFailure("nonfinite-solver-rhs", std::to_string(index), - "PARDISO RHS values must be finite."); - } - } - if (size == 0U) { - return Status::Ok(); - } - - std::vector rhs_copy(rhs.Data(), rhs.Data() + rhs.Size()); - Vector candidate{size}; - MKL_INT phase = 33; - MKL_INT error = 0; - CallPardiso(phase, rhs_copy.data(), candidate.Data(), error); - if (error != 0) { - return PardisoFailure(phase, error); - } - for (std::size_t index = 0U; index < candidate.Size(); ++index) { - if (!std::isfinite(candidate[index])) { - return SolverFailure( - "nonfinite-solver-solution", std::to_string(index), - "PARDISO substitution produced a nonfinite solution."); - } - } - - correction = std::move(candidate); - return Status::Ok(); - } - - private: - /// @brief Copies validated public CSR without symmetry or diagonal filtering. - Status CopyValidatedFullCsr(const SparseMatrix& matrix) { - equation_count_ = static_cast(matrix.Rows()); - row_offsets_.clear(); - column_indices_.clear(); - values_.clear(); - row_offsets_.reserve(matrix.RowOffsets().size()); - column_indices_.reserve(matrix.ColumnIndices().size()); - values_.reserve(matrix.Values().size()); - - for (const std::size_t offset : matrix.RowOffsets()) { - if (!ConvertsToMklInt(offset)) { - return SolverFailure("solver-dimension-overflow", "row-offsets", - "CSR row offsets exceed the oneMKL integer " - "range."); - } - row_offsets_.push_back(static_cast(offset)); - } - for (const std::size_t column : matrix.ColumnIndices()) { - if (!ConvertsToMklInt(column)) { - return SolverFailure("solver-dimension-overflow", "column-indices", - "CSR indices exceed the oneMKL integer range."); - } - column_indices_.push_back(static_cast(column)); - } - values_ = matrix.Values(); - return Status::Ok(); - } - - /// @brief Calls PARDISO with retained private arrays and phase state. - void CallPardiso(const MKL_INT phase, double* rhs, double* correction, - MKL_INT& error) { - const dense_blas_internal::ScopedSingleEquationThreads thread_scope{ - static_cast(equation_count_)}; - pardiso(pt_.data(), &max_factorizations_, &matrix_number_, &mtype_, &phase, - &equation_count_, values_.data(), row_offsets_.data(), - column_indices_.data(), permutation_.data(), &rhs_count_, - iparm_.data(), &message_level_, rhs, correction, &error); - } - - /// @brief Releases backend state and resets every retained array. - MKL_INT Release() noexcept { - MKL_INT error = 0; - if (owns_pardiso_state_) { - const MKL_INT phase = -1; - double placeholder = 0.0; - CallPardiso(phase, &placeholder, &placeholder, error); - } - owns_pardiso_state_ = false; - factorized_ = false; - pt_.fill(nullptr); - iparm_.fill(0); - permutation_.clear(); - ClearOwnedArrays(); - return error; - } - - /// @brief Clears FESA-owned CSR arrays without touching backend state. - void ClearOwnedArrays() noexcept { - equation_count_ = 0; - row_offsets_.clear(); - column_indices_.clear(); - values_.clear(); - } - - std::array pt_{}; - std::array iparm_{}; - std::vector row_offsets_; - std::vector column_indices_; - std::vector permutation_; - std::vector values_; - MKL_INT equation_count_{0}; - MKL_INT max_factorizations_{1}; - MKL_INT matrix_number_{1}; - MKL_INT mtype_{11}; - MKL_INT rhs_count_{1}; - MKL_INT message_level_{0}; - bool owns_pardiso_state_{false}; - bool factorized_{false}; + pardiso_internal::PardisoSession session_{ + pardiso_internal::PardisoMatrixPolicy::kUnsymmetricFull}; }; -MklPardisoTangentSolver::MklPardisoTangentSolver() - : impl_{std::make_unique()} {} +MklPardisoTangentSolver::MklPardisoTangentSolver() : impl_{std::make_unique()} {} MklPardisoTangentSolver::~MklPardisoTangentSolver() = default; Status MklPardisoTangentSolver::FactorizeFresh(const SparseMatrix& matrix) { - return impl_->FactorizeFresh(matrix); + return impl_->session_.Factorize(matrix); } -Status MklPardisoTangentSolver::SolveCorrection(const Vector& rhs, - Vector& correction) const { - return impl_->SolveCorrection(rhs, correction); +Status MklPardisoTangentSolver::SolveCorrection(const Vector& rhs, Vector& solution) const { + return impl_->session_.Solve(rhs, solution); } } // namespace fesa diff --git a/src/fesa/solvers/linear/pardiso_session.cpp b/src/fesa/solvers/linear/pardiso_session.cpp new file mode 100644 index 0000000..b6fcfcc --- /dev/null +++ b/src/fesa/solvers/linear/pardiso_session.cpp @@ -0,0 +1,384 @@ +#include "solvers/linear/pardiso_session.h" + +#include +#include +#include +#include +#include + +#include "fesa/math/sparse_matrix.h" +#include "fesa/math/vector.h" +#include "math/dense_blas_internal.h" +#include "solvers/linear/pardiso_session_test_seam.h" + +namespace fesa { +namespace { +thread_local internal::PardisoBackendTestHook* g_pardiso_backend_test_hook = + nullptr; +} // namespace + +namespace internal { +ScopedPardisoBackendTestHook::ScopedPardisoBackendTestHook( + PardisoBackendTestHook hook) + : hook_(std::move(hook)), previous_(g_pardiso_backend_test_hook) { + g_pardiso_backend_test_hook = &hook_; +} + +ScopedPardisoBackendTestHook::~ScopedPardisoBackendTestHook() { + g_pardiso_backend_test_hook = previous_; +} +} // namespace internal + +namespace pardiso_internal { +namespace { +/// @brief Builds a structured linear-solver failure. +Status SolverFailure(const std::string& code, const std::string& identity, + const std::string& message) { + return Status::Failure( + FailureCategory::kSolver, + {{Severity::kError, code, {{}, 0U}, "PARDISO", identity, message}}); +} + +/// @brief Translates a PARDISO phase error into the stable solver taxonomy. +Status PardisoFailure(const MKL_INT phase, const MKL_INT error) { + std::string code; + std::string reason; + switch (error) { + case -4: + code = "pardiso-zero-or-negative-pivot"; + reason = "zero or negative pivot"; + break; + case -7: + code = "pardiso-singular-diagonal"; + reason = "singular diagonal"; + break; + case -8: + code = "pardiso-integer-overflow"; + reason = "32-bit backend integer overflow"; + break; + case 21: + case 22: + case 23: + case 24: + code = "pardiso-invalid-csr"; + reason = "matrix checker rejected the CSR indices"; + break; + default: + code = phase == 11 ? "pardiso-analysis-failed" + : phase == 22 ? "pardiso-factorization-failed" + : phase == 33 ? "pardiso-solve-failed" + : "pardiso-release-failed"; + reason = "backend error"; + break; + } + + const std::string phase_text = std::to_string(phase); + const std::string error_text = std::to_string(error); + return SolverFailure(code, "phase=" + phase_text + ",error=" + error_text, + "oneMKL PARDISO phase " + phase_text + + " failed with error " + error_text + " (" + reason + + ")."); +} + +/// @brief Reports whether a public size fits the private MKL integer type. +bool ConvertsToMklInt(const std::size_t value) { + return dense_blas_internal::ToMklSize(value).HasValue(); +} + +} // namespace + +PardisoSession::PardisoSession(const PardisoMatrixPolicy policy) + : policy_(policy), + mtype_(policy == PardisoMatrixPolicy::kSpdUpper ? 2 : 11) {} + +PardisoSession::~PardisoSession() { static_cast(Release()); } + +Status PardisoSession::Factorize(const SparseMatrix& matrix) { + const MKL_INT release_error = Release(); + if (release_error != 0) { + return PardisoFailure(-1, release_error); + } + + const Status csr_status = matrix.Validate(); + if (!csr_status.IsOk()) { + return SolverFailure("solver-invalid-csr", "public-csr", + "The public sparse matrix failed CSR validation."); + } + if (matrix.Rows() != matrix.Columns()) { + return SolverFailure("solver-matrix-not-square", "matrix-shape", + "PARDISO factorization requires a square matrix."); + } + if (matrix.Rows() == 0U) { + // A fully constrained model has no free equations. Preserve the + // observable factorize/solve lifecycle without creating backend + // state or calling PARDISO with its invalid n=0 input. + factorized_ = true; + return Status::Ok(); + } + if (!ConvertsToMklInt(matrix.Rows()) || + !ConvertsToMklInt(matrix.Values().size())) { + return SolverFailure( + "solver-dimension-overflow", "matrix-shape", + "Sparse matrix dimensions exceed the oneMKL integer range."); + } + + const Status copy_status = + policy_ == PardisoMatrixPolicy::kSpdUpper + ? CopyValidatedUpperTriangle(matrix) + : CopyValidatedFullCsr(matrix); + if (!copy_status.IsOk()) { + ClearOwnedArrays(); + return copy_status; + } + + // PARDISO owns internal memory behind pt after phase 11. Initialize + // once per factorization and retain it until refactorization/destruction. + pt_.fill(nullptr); + iparm_.fill(0); + pardisoinit(pt_.data(), &mtype_, iparm_.data()); + iparm_[26] = 1; // Validate sorted CSR integer arrays. + iparm_[34] = 1; // Consume the project's native zero-based CSR. + permutation_.assign(static_cast(equation_count_), 0); + owns_pardiso_state_ = true; + + try { + MKL_INT phase = 11; + MKL_INT error = 0; + CallPardiso(phase, nullptr, nullptr, error); + if (error != 0) { + const Status failure = PardisoFailure(phase, error); + static_cast(Release()); + return failure; + } + + phase = 22; + error = 0; + CallPardiso(phase, nullptr, nullptr, error); + if (error != 0) { + const Status failure = PardisoFailure(phase, error); + static_cast(Release()); + return failure; + } + + if (policy_ == PardisoMatrixPolicy::kUnsymmetricFull && iparm_[13] != 0) { + const Status failure = SolverFailure( + "pardiso-perturbed-pivot", "phase=22", + "oneMKL PARDISO perturbed one or more tangent pivots."); + static_cast(Release()); + return failure; + } + factorized_ = true; + return Status::Ok(); + } catch (...) { + static_cast(Release()); + throw; + } +} + +Status PardisoSession::Solve(const Vector& rhs, Vector& solution) { + if (!factorized_) { + return SolverFailure( + "solver-not-factorized", "factorization-state", + "Substitution requires a successful retained factorization."); + } + const std::size_t size = static_cast(equation_count_); + if (rhs.Size() != size || solution.Size() != size) { + return SolverFailure( + "solver-vector-dimension-mismatch", + policy_ == PardisoMatrixPolicy::kSpdUpper ? "rhs-or-solution" + : "rhs-or-correction", + policy_ == PardisoMatrixPolicy::kSpdUpper + ? "RHS and solution dimensions must match the factorized matrix." + : "RHS and correction dimensions must match the factorized matrix."); + } + for (std::size_t index = 0U; index < rhs.Size(); ++index) { + if (!std::isfinite(rhs[index])) { + return SolverFailure("nonfinite-solver-rhs", std::to_string(index), + "PARDISO RHS values must be finite."); + } + } + if (size == 0U) { + return Status::Ok(); + } + + std::vector rhs_copy(rhs.Size()); + dense_blas_internal::CopyValues(rhs.Data(), rhs.Size(), rhs_copy.data()); + Vector candidate{size}; + MKL_INT phase = 33; + MKL_INT error = 0; + CallPardiso(phase, rhs_copy.data(), candidate.Data(), error); + if (error != 0) { + return PardisoFailure(phase, error); + } + for (std::size_t index = 0U; index < candidate.Size(); ++index) { + if (!std::isfinite(candidate[index])) { + return SolverFailure( + "nonfinite-solver-solution", std::to_string(index), + "PARDISO substitution produced a nonfinite solution."); + } + } + + solution = std::move(candidate); + return Status::Ok(); +} + +Status PardisoSession::CopyValidatedUpperTriangle(const SparseMatrix& matrix) { + const auto& public_offsets = matrix.RowOffsets(); + const auto& public_columns = matrix.ColumnIndices(); + const auto& public_values = matrix.Values(); + + double matrix_scale = 0.0; + for (const double value : public_values) { + matrix_scale = (std::max)(matrix_scale, std::abs(value)); + } + + for (std::size_t row = 0U; row < matrix.Rows(); ++row) { + for (std::size_t position = public_offsets[row]; + position < public_offsets[row + 1U]; ++position) { + const std::size_t column = public_columns[position]; + const auto reverse_begin = + public_columns.begin() + + static_cast(public_offsets[column]); + const auto reverse_end = + public_columns.begin() + + static_cast(public_offsets[column + 1U]); + const auto reverse = std::lower_bound(reverse_begin, reverse_end, row); + if (reverse == reverse_end || *reverse != row) { + return SolverFailure( + "solver-matrix-not-symmetric", + std::to_string(row) + ":" + std::to_string(column), + "The full public CSR must contain both symmetric entries."); + } + + const std::size_t reverse_position = static_cast( + std::distance(public_columns.begin(), reverse)); + const double left = public_values[position]; + const double right = public_values[reverse_position]; + const double difference = std::abs(left - right); + // The approved symmetry test is normalized by the matrix's + // actual nonzero scale, without an absolute unit-size floor. + const bool is_symmetric = matrix_scale == 0.0 + ? difference == 0.0 + : difference <= 1.0e-12 * matrix_scale; + if (!is_symmetric) { + return SolverFailure( + "solver-matrix-not-symmetric", + std::to_string(row) + ":" + std::to_string(column), + "The full public CSR values violate the approved symmetry " + "tolerance."); + } + } + } + + equation_count_ = static_cast(matrix.Rows()); + row_offsets_.clear(); + column_indices_.clear(); + values_.clear(); + row_offsets_.reserve(matrix.Rows() + 1U); + row_offsets_.push_back(0); + + for (std::size_t row = 0U; row < matrix.Rows(); ++row) { + bool has_diagonal = false; + for (std::size_t position = public_offsets[row]; + position < public_offsets[row + 1U]; ++position) { + const std::size_t column = public_columns[position]; + if (column < row) { + continue; + } + if (!ConvertsToMklInt(column) || + !ConvertsToMklInt(column_indices_.size())) { + return SolverFailure( + "solver-dimension-overflow", + std::to_string(row) + ":" + std::to_string(column), + "CSR indices exceed the oneMKL integer range."); + } + has_diagonal = has_diagonal || column == row; + column_indices_.push_back(static_cast(column)); + values_.push_back(public_values[position]); + } + if (!has_diagonal) { + return SolverFailure( + "solver-missing-diagonal", std::to_string(row), + "Every PARDISO SPD row must retain its diagonal slot."); + } + if (!ConvertsToMklInt(column_indices_.size())) { + return SolverFailure( + "solver-dimension-overflow", std::to_string(row), + "CSR row offsets exceed the oneMKL integer range."); + } + row_offsets_.push_back(static_cast(column_indices_.size())); + } + return Status::Ok(); +} + +Status PardisoSession::CopyValidatedFullCsr(const SparseMatrix& matrix) { + equation_count_ = static_cast(matrix.Rows()); + row_offsets_.clear(); + column_indices_.clear(); + values_.clear(); + row_offsets_.reserve(matrix.RowOffsets().size()); + column_indices_.reserve(matrix.ColumnIndices().size()); + values_.reserve(matrix.Values().size()); + + for (const std::size_t offset : matrix.RowOffsets()) { + if (!ConvertsToMklInt(offset)) { + return SolverFailure("solver-dimension-overflow", "row-offsets", + "CSR row offsets exceed the oneMKL integer " + "range."); + } + row_offsets_.push_back(static_cast(offset)); + } + for (const std::size_t column : matrix.ColumnIndices()) { + if (!ConvertsToMklInt(column)) { + return SolverFailure("solver-dimension-overflow", "column-indices", + "CSR indices exceed the oneMKL integer range."); + } + column_indices_.push_back(static_cast(column)); + } + values_.resize(matrix.Values().size()); + dense_blas_internal::CopyValues(matrix.Values().data(), values_.size(), + values_.data()); + return Status::Ok(); +} + +void PardisoSession::CallPardiso(const MKL_INT phase, double* rhs, + double* solution, MKL_INT& error) { + const dense_blas_internal::ScopedSingleEquationThreads thread_scope{ + static_cast(equation_count_)}; + pardiso(pt_.data(), &max_factorizations_, &matrix_number_, &mtype_, &phase, + &equation_count_, values_.data(), row_offsets_.data(), + column_indices_.data(), permutation_.data(), &rhs_count_, + iparm_.data(), &message_level_, rhs, solution, &error); + if (g_pardiso_backend_test_hook != nullptr) { + const internal::PardisoBackendTestCall call{ + phase, mtype_, equation_count_, row_offsets_.data(), + column_indices_.data(), values_.data(), solution}; + (*g_pardiso_backend_test_hook)(call, error, iparm_[13]); + } +} + +MKL_INT PardisoSession::Release() noexcept { + MKL_INT error = 0; + if (owns_pardiso_state_) { + const MKL_INT phase = -1; + double placeholder = 0.0; + CallPardiso(phase, &placeholder, &placeholder, error); + } + owns_pardiso_state_ = false; + factorized_ = false; + pt_.fill(nullptr); + iparm_.fill(0); + permutation_.clear(); + ClearOwnedArrays(); + return error; +} + +void PardisoSession::ClearOwnedArrays() noexcept { + equation_count_ = 0; + row_offsets_.clear(); + column_indices_.clear(); + values_.clear(); +} + +} // namespace pardiso_internal +} // namespace fesa diff --git a/src/fesa/solvers/linear/pardiso_session.h b/src/fesa/solvers/linear/pardiso_session.h new file mode 100644 index 0000000..28311c8 --- /dev/null +++ b/src/fesa/solvers/linear/pardiso_session.h @@ -0,0 +1,60 @@ +#ifndef FESA_SRC_FESA_SOLVERS_LINEAR_PARDISO_SESSION_H_ +#define FESA_SRC_FESA_SOLVERS_LINEAR_PARDISO_SESSION_H_ + +#include +#include + +#include + +#include "fesa/core/status.h" + +namespace fesa { +class SparseMatrix; +class Vector; + +namespace pardiso_internal { + +/// @brief Retains the two existing CSR and pivot policies. +enum class PardisoMatrixPolicy { kSpdUpper, kUnsymmetricFull }; + +/// @brief Owns one backend factorization, CSR storage and phase lifecycle. +/// @note No symbolic reuse is performed across Factorize calls. +class PardisoSession final { + public: + explicit PardisoSession(PardisoMatrixPolicy policy); + ~PardisoSession(); + PardisoSession(const PardisoSession&) = delete; + PardisoSession& operator=(const PardisoSession&) = delete; + + Status Factorize(const SparseMatrix& matrix); + Status Solve(const Vector& rhs, Vector& solution); + + private: + Status CopyValidatedUpperTriangle(const SparseMatrix& matrix); + Status CopyValidatedFullCsr(const SparseMatrix& matrix); + void CallPardiso(MKL_INT phase, double* rhs, double* solution, + MKL_INT& error); + MKL_INT Release() noexcept; + void ClearOwnedArrays() noexcept; + + std::array pt_{}; + std::array iparm_{}; + std::vector row_offsets_; + std::vector column_indices_; + std::vector permutation_; + std::vector values_; + MKL_INT equation_count_{0}; + MKL_INT max_factorizations_{1}; + MKL_INT matrix_number_{1}; + const PardisoMatrixPolicy policy_; + MKL_INT mtype_; + MKL_INT rhs_count_{1}; + MKL_INT message_level_{0}; + bool owns_pardiso_state_{false}; + bool factorized_{false}; +}; + +} // namespace pardiso_internal +} // namespace fesa + +#endif // FESA_SRC_FESA_SOLVERS_LINEAR_PARDISO_SESSION_H_ diff --git a/src/fesa/solvers/linear/pardiso_session_test_seam.h b/src/fesa/solvers/linear/pardiso_session_test_seam.h new file mode 100644 index 0000000..9cc0f02 --- /dev/null +++ b/src/fesa/solvers/linear/pardiso_session_test_seam.h @@ -0,0 +1,41 @@ +#ifndef FESA_SRC_FESA_SOLVERS_LINEAR_PARDISO_SESSION_TEST_SEAM_H_ +#define FESA_SRC_FESA_SOLVERS_LINEAR_PARDISO_SESSION_TEST_SEAM_H_ + +#include + +#include + +namespace fesa::internal { + +/// @brief Borrows call storage only while a backend observation hook runs. +struct PardisoBackendTestCall { + MKL_INT phase; + MKL_INT matrix_type; + MKL_INT equation_count; + const MKL_INT* row_offsets; + const MKL_INT* column_indices; + const double* values; + double* solution; +}; + +// Private fault seam runs after the real call, including real resource release. +// It is thread-local and never replaces a backend allocation with fake state. +using PardisoBackendTestHook = std::function; + +class ScopedPardisoBackendTestHook final { + public: + explicit ScopedPardisoBackendTestHook(PardisoBackendTestHook hook); + ~ScopedPardisoBackendTestHook(); + ScopedPardisoBackendTestHook(const ScopedPardisoBackendTestHook&) = delete; + ScopedPardisoBackendTestHook& operator=(const ScopedPardisoBackendTestHook&) = + delete; + + private: + PardisoBackendTestHook hook_; + PardisoBackendTestHook* previous_; +}; + +} // namespace fesa::internal + +#endif // FESA_SRC_FESA_SOLVERS_LINEAR_PARDISO_SESSION_TEST_SEAM_H_ diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 38c09ad..9997247 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -14,3 +14,13 @@ Tests는 solver 동작·수학적 일관성·외부 비교와 C++ 개발 규약 - Reference의 경로·값·naming·metadata를 임의 수정하지 않는다. 검증용 algebra fixture의 입력 자유도를 공개 CLI 지원으로 승격하지 않는다. - 미실행·skip·제외·실패를 PASS로 계산하거나 폐기된 workflow를 복원하지 않는다. + +- 직접 MSVC와 CMake의 세 executable 전체 등록 identity를 대조한다. 이번 병합은 + 2026-10-18 사용자 변경에 따라 정적·공통 계약 검사를 명시적으로 선택해 직렬 실행한다. + 두 실행의 TMP/TEMP·XML·raw 경로를 분리하고 inherited filter/sharding을 제거한다. + 실제 선택·제외 identity와 body 기반 이유를 남긴다. HHT·dynamic·eigen·transient thermal은 + 이번 실행 범위에서 제외하며, 제외를 통과나 테스트 삭제 근거로 삼지 않는다. +- `reference/temp`는 검증에 사용하지 않는다. 정식 reference 부재는 자료 누락으로 기록한다. + 승인된 정적 통합 검증 전에는 중복·폐기 내부구조 검사도 최종 삭제하지 않는다. + 자료 없는 비교의 유일 검증과 비정적 테스트는 유지한다. 삭제 시 이관표에 + 동등한 대체 identity·실패 경계·수치 조건 또는 폐기 구조를 연결한다. diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index be0178c..5845708 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -39,6 +39,7 @@ add_executable( unit/core/diagnostic_test.cpp unit/core/source_identity_test.cpp unit/core/status_test.cpp + unit/elements/element_capabilities_test.cpp unit/elements/element_factory_test.cpp unit/elements/hex8_element_test.cpp unit/elements/hex8_high_low_test.cpp diff --git a/tests/integration/analysis/nonlinear_static_procedure_test.cpp b/tests/integration/analysis/nonlinear_static_procedure_test.cpp index b5adfa5..8f41c34 100644 --- a/tests/integration/analysis/nonlinear_static_procedure_test.cpp +++ b/tests/integration/analysis/nonlinear_static_procedure_test.cpp @@ -223,16 +223,15 @@ std::vector ReadConstraintMask(const Hdf5File& file) { fesa::Vector3 SpatialMoment(const fesa::Vector3& phi, const fesa::Vector3& generalized) { - const fesa::Matrix transform = fesa::InverseTransposeLeftJacobianSO3(phi); - return {transform(0U, 0U) * generalized.X() + - transform(0U, 1U) * generalized.Y() + - transform(0U, 2U) * generalized.Z(), - transform(1U, 0U) * generalized.X() + - transform(1U, 1U) * generalized.Y() + - transform(1U, 2U) * generalized.Z(), - transform(2U, 0U) * generalized.X() + - transform(2U, 1U) * generalized.Y() + - transform(2U, 2U) * generalized.Z()}; + // Independent closed-form action, used only as a test oracle. + const double angle = phi.Norm(); + const double square = angle * angle; + const double coefficient = angle < 1e-4 ? + 1.0 / 12.0 + square / 720.0 + square * square / 30240.0 + + square * square * square / 1209600.0 : + (1.0 - 0.5 * angle / std::tan(0.5 * angle)) / square; + return generalized + 0.5 * phi.Cross(generalized) + + coefficient * phi.Cross(phi.Cross(generalized)); } std::array ReconstructGlobalBalance(const Hdf5File& file) { diff --git a/tests/integration/analysis/thermal_physics_test.cpp b/tests/integration/analysis/thermal_physics_test.cpp index de76b29..172628d 100644 --- a/tests/integration/analysis/thermal_physics_test.cpp +++ b/tests/integration/analysis/thermal_physics_test.cpp @@ -19,6 +19,8 @@ #include "thermal_gauss_oracle.h" #include "thermal_slab_oracle.h" +#include "fesa/assembly/thermal_assembler.h" + namespace { namespace ti = fesa::thermal_transient_internal; using fesa::Vector; diff --git a/tests/integration/app/thermal_application_test.cpp b/tests/integration/app/thermal_application_test.cpp index b97b05a..c43fd97 100644 --- a/tests/integration/app/thermal_application_test.cpp +++ b/tests/integration/app/thermal_application_test.cpp @@ -29,6 +29,8 @@ #include "fesa/solvers/linear/mkl_pardiso_solver.h" #include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" +#include "fesa/analysis/transient_heat_procedure.h" + namespace { class HdfHandle { diff --git a/tests/reference/eigen_reference_cases_test.cpp b/tests/reference/eigen_reference_cases_test.cpp index 97aee97..d6c5af6 100644 --- a/tests/reference/eigen_reference_cases_test.cpp +++ b/tests/reference/eigen_reference_cases_test.cpp @@ -32,7 +32,16 @@ std::string ReadBytes(const std::filesystem::path& path) { TEST(EigenReference, RunsOriginalInputAndComparesAllModalFrameIdentities) { const std::filesystem::path source_root{FESA_TEST_SOURCE_DIR}; const std::filesystem::path reference_directory = - source_root / "reference" / "shellNL-eigen-meshfine"; + std::filesystem::path{FESA_TEST_BINARY_DIR} / "reference" / + "eigen-execution"; + std::filesystem::create_directories(reference_directory); + for (const auto& name : {"shellNL-eigen-meshfine.inp", + "shellNL-eigen-meshfine eigenvalues.txt"}) { + std::filesystem::copy_file( + source_root / "reference" / "shellNL-eigen-meshfine" / name, + reference_directory / name, + std::filesystem::copy_options::overwrite_existing); + } const std::filesystem::path input = reference_directory / "shellNL-eigen-meshfine.inp"; const std::filesystem::path text = diff --git a/tests/reference/nonlinear_static_reference_comparison.cpp b/tests/reference/nonlinear_static_reference_comparison.cpp index f23d8a2..874e701 100644 --- a/tests/reference/nonlinear_static_reference_comparison.cpp +++ b/tests/reference/nonlinear_static_reference_comparison.cpp @@ -1193,16 +1193,15 @@ fesa::Vector3 VectorAt(const std::vector& values, fesa::Vector3 SpatialMoment(const fesa::Vector3& phi, const fesa::Vector3& generalized) { - const Matrix transform = InverseTransposeLeftJacobianSO3(phi); - return {transform(0U, 0U) * generalized.X() + - transform(0U, 1U) * generalized.Y() + - transform(0U, 2U) * generalized.Z(), - transform(1U, 0U) * generalized.X() + - transform(1U, 1U) * generalized.Y() + - transform(1U, 2U) * generalized.Z(), - transform(2U, 0U) * generalized.X() + - transform(2U, 1U) * generalized.Y() + - transform(2U, 2U) * generalized.Z()}; + // Independent closed-form action, used only as a test oracle. + const double angle = phi.Norm(); + const double square = angle * angle; + const double coefficient = angle < 1e-4 ? + 1.0 / 12.0 + square / 720.0 + square * square / 30240.0 + + square * square * square / 1209600.0 : + (1.0 - 0.5 * angle / std::tan(0.5 * angle)) / square; + return generalized + 0.5 * phi.Cross(generalized) + + coefficient * phi.Cross(phi.Cross(generalized)); } fesa::Vector3 MaskedResidual(const Hdf5Projection& projection, diff --git a/tests/reference/thermal_reference_cases_test.cpp b/tests/reference/thermal_reference_cases_test.cpp index 1484203..8ff59e0 100644 --- a/tests/reference/thermal_reference_cases_test.cpp +++ b/tests/reference/thermal_reference_cases_test.cpp @@ -15,7 +15,14 @@ std::string Bytes(const std::filesystem::path& path) { } TEST(ThermalReference, OriginalAbaqusNt11RemainsAnExplicitFailingDiagnostic) { const auto folder = - std::filesystem::path{FESA_TEST_SOURCE_DIR} / "reference/shell-thermal"; + std::filesystem::path{FESA_TEST_BINARY_DIR} / "reference/thermal-execution"; + std::filesystem::create_directories(folder); + for (const auto& name : {"shell-thermal.inp", + "shell-thermal NodalTemperature.csv"}) { + std::filesystem::copy_file( + std::filesystem::path{FESA_TEST_SOURCE_DIR} / "reference/shell-thermal" / name, + folder / name, std::filesystem::copy_options::overwrite_existing); + } const auto input = folder / "shell-thermal.inp"; const auto csv = folder / "shell-thermal NodalTemperature.csv"; const auto before_input = Bytes(input), before_csv = Bytes(csv); diff --git a/tests/test_compare_hex8.py b/tests/test_compare_hex8.py new file mode 100644 index 0000000..4311886 --- /dev/null +++ b/tests/test_compare_hex8.py @@ -0,0 +1,856 @@ +"""Independent comparison contracts; generated result fixtures are not source evidence.""" + +import csv +import importlib.util +import json +import math +import os +from pathlib import Path +import shutil +import subprocess +import sys + +import h5py +import numpy as np +import pytest + + +ROOT = Path(__file__).resolve().parents[1] +SPEC = importlib.util.spec_from_file_location( + "compare_hex8", ROOT / "scripts/verification/compare_hex8.py" +) +COMPARE = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(COMPARE) + + +def family(actual, reference): + identities = [{"node_label": i + 1, "component": "U1"} for i in range(len(actual))] + return COMPARE.evaluate_family( + {"case": "hexa_linearstatic", "step": "Step-1", "increment": 10, + "quantity": "U", "unit_dimensions": "length", "rows": identities}, + actual, reference, + ) + + +def test_zero_reference_scale_requires_exact_zero(): + report = family([0.0, 1e-300], [0.0, 0.0]) + assert not report["passed"] + assert report["diagnostic_code"] == "zero-reference-scale-nonzero-error" + + +def test_row_pass_does_not_override_one_percent_rms(): + report = family([1.02] * 10, [1.0] * 10) + assert report["rows_passed"] + assert not report["rms_passed"] + assert not report["passed"] + + +def test_near_zero_band_uses_reference_scale_only(): + report = family([100.0, 1.0], [100.0, 0.0]) + assert report["passed"] + assert report["rows"][1]["branch"] == "near-zero" + assert not family([100.0, 1.0001], [100.0, 0.0])["passed"] + + +def test_nonfinite_family_fails_before_tolerance(): + with pytest.raises(COMPARE.ComparisonError, match="finite"): + family([float("nan")], [1.0]) + + +def test_header_strip_collision_rejected_before_bad_numeric(tmp_path): + path = tmp_path / "collision.csv" + path.write_text("Node Label, Node Label\n1,NaN\n", encoding="utf-8") + with pytest.raises(COMPARE.ComparisonError) as error: + COMPARE.read_reference(path, "hexa_linearstatic", "U", {}) + assert error.value.code == "duplicate-reference-header" + + +def test_modal_quantity_and_units_are_explicit(): + rows = [{"step": "Step-1", "mode": i, "quantity": "eigenvalue", + "unit_dimensions": "1/time^2", "value": float(i)} for i in range(1, 11)] + with pytest.raises(COMPARE.ComparisonError) as error: + COMPARE.compare_modal(rows, rows, "frequency", "1/time") + assert error.value.code == "wrong-modal-quantity" + + +def test_modal_singletons_use_common_one_percent_rms(): + reference = [{"step": "Step-1", "mode": i, "quantity": "eigenvalue", + "unit_dimensions": "1/time^2", "value": float(i)} for i in range(1, 11)] + actual = [dict(row, value=row["value"] * 1.02) for row in reference] + report = COMPARE.compare_modal(reference, actual, "eigenvalue", "1/time^2") + assert not report["passed"] + assert len(report["families"]) == 10 + assert all(row["rows_passed"] and not row["rms_passed"] for row in report["families"]) + +# These schema declarations are independent of the comparator's declarations. +TEXT = h5py.string_dtype(encoding="utf-8") +REFERENCE = ROOT / "reference/hexa" + + +def write_strings(obj, attributes): + for name, value in attributes.items(): + obj.attrs.create(name, value, dtype=TEXT) + + +def compound(group, name, schema, rows): + data = np.empty(len(rows), dtype=np.dtype(schema)) + for i, row in enumerate(rows): + data[i] = row + return group.create_dataset(name, data=data) + + +@pytest.fixture(scope="module") +def source_models(): + return {case: COMPARE.input_inventory(REFERENCE / f"{case}.inp", case) + for case in ("hexa_linearstatic", "hexa_nonlinearstatic", "hexa_dynlinear", "hexa_dynnonlinear", "hexa_freq")} + + +def source_rows(case, quantity): + with (REFERENCE / f"{case}_{quantity}.csv").open(newline="", encoding="utf-8") as stream: + reader = csv.reader(stream) + headers = [value.strip() for value in next(reader)] + return [dict(zip(headers, [value.strip() for value in row])) for row in reader] + + +def make_result(path, model): + """Build an original-sized schema fixture, not a validated physical solution.""" + case = model["case"] + dynamic = case in ("hexa_dynlinear", "hexa_dynnonlinear") + nonlinear = case in ("hexa_nonlinearstatic", "hexa_dynnonlinear") + frequency = case == "hexa_freq" + reference_values = {} + if not frequency: + for quantity in (["U"] if dynamic else ["U", "RF", "S"]): + table_rows = {} + for row in source_rows(case, quantity): + increment = int(row["Frame"].split(":")[0].split()[-1]) + entity = int(row["Element Label" if quantity == "S" else "Node Label"]) + point = int(row["IntPt"]) if quantity == "S" else 0 + names = ("S11", "S22", "S33", "S12", "S13", "S23") if quantity == "S" else tuple(f"{quantity}{c}" for c in (1, 2, 3)) + table_rows[increment, entity, point] = [float(row[f"{quantity}-{name}"]) for name in names] + reference_values[quantity] = table_rows + with h5py.File(path, "w") as file: + metadata = file.create_group("metadata") + metadata.attrs.create("schema_version", np.uint64(1), dtype="f8", "wrong-result-value-type")]) +def test_wrong_shape_or_dtype_is_not_sliced_into_supported_components(tmp_path, result_fixtures, shape, dtype, code): + path = copy_result(tmp_path, result_fixtures) + with h5py.File(path, "r+") as file: + key = "steps/Step-1/frames/0/nodal/displacement" + del file[key] + file.create_dataset(key, shape=shape, dtype=dtype) + assert compare_fixture(path)["precheck"]["code"] == code + + +def test_signed_ids_and_fixed_ascii_are_not_official_compound_schema(tmp_path, result_fixtures): + path = copy_result(tmp_path, result_fixtures) + with h5py.File(path, "r+") as file: + old = file["model/nodes"][:] + del file["model/nodes"] + compound(file["model"], "nodes", [("internal_node_id", " #include +#include "fesa/analysis/analysis_model.h" +#include "fesa/fem/dof_manager.h" + namespace { template diff --git a/tests/unit/analysis/analysis_test.cpp b/tests/unit/analysis/analysis_test.cpp index 72f5bf8..f45aa50 100644 --- a/tests/unit/analysis/analysis_test.cpp +++ b/tests/unit/analysis/analysis_test.cpp @@ -1,9 +1,20 @@ #include "fesa/analysis/analysis.h" +#include "fesa/analysis/analysis_procedure.h" +#include "fesa/analysis/prepared_analysis.h" +#include "analysis/equilibrium_algorithm.h" +#include "analysis/hht_reduced_integrator.h" +#include "analysis/hht_reduced_procedure.h" +#include "analysis/solid_hht_integrator.h" +#include "analysis/solid_hht_core.h" +#include "analysis/thermal_transient_algebra.h" +#include "fesa/solvers/linear/tangent_solver.h" #include #include #include +#include +#include #include #include @@ -65,3 +76,555 @@ TEST(Analysis, PropagatesStatusAndDestroysThroughMinimalAnalysis) { analysis.reset(); EXPECT_TRUE(destroyed); } + +namespace { + +using ProcedureSignature = fesa::Result ( + fesa::AnalysisProcedure::*)(const fesa::Domain &); +static_assert(std::has_virtual_destructor_v); +static_assert(std::is_abstract_v); +static_assert(std::is_same_v); + +class ObservedProcedure final : public fesa::AnalysisProcedure { +public: + ObservedProcedure(const fesa::Domain *&observed, bool &destroyed) + : observed_(observed), destroyed_(destroyed) {} + ~ObservedProcedure() override { destroyed_ = true; } + fesa::Result + Execute(const fesa::Domain &domain) override { + observed_ = &domain; + return fesa::Result::Failure( + fesa::Status::Failure(fesa::FailureCategory::kSolver, + {{fesa::Severity::kError, + "procedure-original-failure", + {}, + "ORIGINAL", + "source-identity", + "Original failure message."}})); + } + +private: + const fesa::Domain *&observed_; + bool &destroyed_; +}; + +} // namespace + +TEST(AnalysisProcedure, PreparedConsumerPreservesDomainFailureAndLifetime) { + const auto domain_result = fesa::Domain::Create({}); + ASSERT_TRUE(domain_result.HasValue()); + const auto &domain = domain_result.Value(); + const fesa::Domain *observed = nullptr; + bool destroyed = false; + std::unique_ptr procedure = + std::make_unique(observed, destroyed); + auto outcome = fesa::ExecutePreparedAnalysis(domain, *procedure); + EXPECT_EQ(observed, &domain); + ASSERT_FALSE(outcome.HasValue()); + EXPECT_EQ(outcome.GetStatus().Category(), fesa::FailureCategory::kSolver); + ASSERT_EQ(outcome.GetStatus().Diagnostics().size(), 1U); + const auto &diagnostic = outcome.GetStatus().Diagnostics()[0]; + EXPECT_EQ(diagnostic.code, "procedure-original-failure"); + EXPECT_EQ(diagnostic.keyword, "ORIGINAL"); + EXPECT_EQ(diagnostic.entity_identity, "source-identity"); + EXPECT_EQ(diagnostic.message, "Original failure message."); + EXPECT_FALSE(destroyed); + procedure.reset(); + EXPECT_TRUE(destroyed); +} + +TEST(EquilibriumAlgorithm, RetainsMoveOnlyCandidateUntilProcedureTakesIt) { + static_assert(std::has_virtual_destructor_v); + static_assert(std::is_abstract_v); + using Candidate = std::unique_ptr; + using EvaluationResult = fesa::Result>; + std::vector observed; + fesa::EquilibriumStep step( + [&](std::uint32_t iteration) { + observed.push_back(iteration); + if (iteration == 3U) + return EvaluationResult::Success(std::make_unique(42)); + return EvaluationResult::Success(std::nullopt); + }, 100U); + fesa::NewtonStepAlgorithm algorithm; + fesa::EquilibriumAlgorithm& base = algorithm; + EXPECT_FALSE(step.HasCandidate()); + ASSERT_TRUE(step.Solve(base).IsOk()); + EXPECT_EQ(observed, (std::vector{1U, 2U, 3U})); + ASSERT_TRUE(step.HasCandidate()); + Candidate accepted = step.TakeCandidate(); + ASSERT_NE(accepted, nullptr); + EXPECT_EQ(*accepted, 42); +} + +TEST(EquilibriumAlgorithm, FirstFailedEvaluationLeavesNoAcceptedCandidate) { + using EvaluationResult = fesa::Result>; + std::vector observed; + fesa::EquilibriumStep step( + [&](std::uint32_t iteration) { + observed.push_back(iteration); + return EvaluationResult::Failure(fesa::Status::Failure( + fesa::FailureCategory::kSolver, + {{fesa::Severity::kError, "first-evaluation-failure", {}, + "STATIC", "original-owner", "Original evaluation failure."}})); + }, 100U); + fesa::NewtonStepAlgorithm algorithm; + fesa::EquilibriumAlgorithm& base = algorithm; + const auto status = step.Solve(base); + EXPECT_EQ(observed, (std::vector{1U})); + EXPECT_FALSE(step.HasCandidate()); + ASSERT_FALSE(status.IsOk()); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics()[0].code, "first-evaluation-failure"); + EXPECT_EQ(status.Diagnostics()[0].entity_identity, "original-owner"); + EXPECT_EQ(status.Diagnostics()[0].message, "Original evaluation failure."); +} + +namespace { +// These helpers route supplied values only. They never call a concrete time +// integrator, Domain/assembly/time-grid builder, analysis or numerical solver. +fesa::Status InjectionFailure() { + return fesa::Status::Failure(fesa::FailureCategory::kSolver, + {{fesa::Severity::kError, "injected-policy-failure", {}, "MOCK", + "caller-owned", "Original injected failure."}}); +} +void ExpectInjectionFailure(const fesa::Status& status) { + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver); + ASSERT_EQ(status.Diagnostics().size(), 1U); + const auto& diagnostic = status.Diagnostics()[0]; + EXPECT_EQ(diagnostic.code, "injected-policy-failure"); + EXPECT_EQ(diagnostic.keyword, "MOCK"); + EXPECT_EQ(diagnostic.entity_identity, "caller-owned"); + EXPECT_EQ(diagnostic.message, "Original injected failure."); +} +void ExpectValueVector(const fesa::Vector& value, double expected) { + ASSERT_EQ(value.Size(), 2U); + for (std::size_t i = 0; i < value.Size(); ++i) + EXPECT_DOUBLE_EQ(value[i], expected); +} +class NeverCalledLinear final : public fesa::LinearSolver { + public: + fesa::Status Factorize(const fesa::SparseMatrix&) override { + ADD_FAILURE() << "Mock dispatch must not factorize."; + return InjectionFailure(); + } + fesa::Status Solve(const fesa::Vector&, fesa::Vector&) const override { + ADD_FAILURE() << "Mock dispatch must not solve."; + return InjectionFailure(); + } +}; +class NeverCalledTangent final : public fesa::TangentSolver { + public: + fesa::Status FactorizeFresh(const fesa::SparseMatrix&) override { + ADD_FAILURE() << "Mock dispatch must not factorize."; + return InjectionFailure(); + } + fesa::Status SolveCorrection(const fesa::Vector&, fesa::Vector&) const override { + ADD_FAILURE() << "Mock dispatch must not solve."; + return InjectionFailure(); + } +}; +class SelectedOrderAlgorithm final : public fesa::EquilibriumAlgorithm { + public: + explicit SelectedOrderAlgorithm(bool& destroyed) : destroyed_(destroyed) {} + ~SelectedOrderAlgorithm() override { destroyed_ = true; } + bool fail = false; + fesa::Status SolveCurrentStep(std::uint32_t first, std::uint32_t last, + const Evaluation& evaluate) override { + EXPECT_EQ(first, 0U); + EXPECT_EQ(last, 3U); + if (fail) return InjectionFailure(); + auto first_result = evaluate(first); + if (!first_result.HasValue()) return first_result.GetStatus(); + EXPECT_FALSE(first_result.Value()); + auto last_result = evaluate(last); + if (!last_result.HasValue()) return last_result.GetStatus(); + EXPECT_TRUE(last_result.Value()); + return fesa::Status::Ok(); + } + private: + bool& destroyed_; +}; +namespace shell_value = fesa::hht_reduced_internal; +class ValueShellIntegrator final : public shell_value::ShellHhtIntegrator { + public: + ValueShellIntegrator(bool& destroyed, std::vector& events) + : destroyed_(destroyed), events_(events) {} + ~ValueShellIntegrator() override { destroyed_ = true; } + std::function predict; + std::function rates; + std::function( + const shell_value::FixedChart&, const shell_value::EmbeddingRoot&, + const fesa::Vector&, const fesa::Vector&, fesa::TangentSolver&)> reconstruct; + shell_value::ReducedShellPredictor Predict( + const shell_value::ReducedHistory& history, double h, + const fesa::HhtParameters& parameters) const override { + events_.push_back("predict"); + return predict(history, h, parameters); + } + void EvaluateRates(const shell_value::ReducedShellRateRequest& request, + fesa::Vector& velocity, fesa::Vector& acceleration) const override { + events_.push_back("rates"); + rates(request, velocity, acceleration); + } + fesa::Result ReconstructPhysicalRates( + const shell_value::FixedChart& chart, const shell_value::EmbeddingRoot& root, + const fesa::Vector& velocity, const fesa::Vector& acceleration, + fesa::TangentSolver& solver) const override { + events_.push_back("reconstruct"); + return reconstruct(chart, root, velocity, acceleration, solver); + } + private: + bool& destroyed_; + std::vector& events_; +}; +class ValueSolidIntegrator final : public fesa::detail::SolidHhtIntegrator { + public: + ValueSolidIntegrator(bool& destroyed, std::vector& events) + : destroyed_(destroyed), events_(events) {} + ~ValueSolidIntegrator() override { destroyed_ = true; } + std::function( + const fesa::SolidDynamicAcceptedFrameState&, double, + const fesa::HhtParameters&)> predict; + std::function( + const fesa::Vector&, const fesa::Vector&, + const fesa::detail::SolidHhtPairedPredictor&, const fesa::Vector&, + const fesa::Vector&, double, const fesa::HhtParameters&)> rates; + fesa::Result Predict( + const fesa::SolidDynamicAcceptedFrameState& old, double h, + const fesa::HhtParameters& parameters) const override { + events_.push_back("predict"); + return predict(old, h, parameters); + } + fesa::Result EvaluateRates( + const fesa::Vector& high, const fesa::Vector& low, + const fesa::detail::SolidHhtPairedPredictor& predictor, + const fesa::Vector& old_acceleration, + const fesa::Vector& old_acceleration_low, double h, + const fesa::HhtParameters& parameters) const override { + events_.push_back("rates"); + return rates(high, low, predictor, old_acceleration, old_acceleration_low, + h, parameters); + } + private: + bool& destroyed_; + std::vector& events_; +}; +namespace heat_value = fesa::thermal_transient_internal; +class ValueHeatIntegrator final : public heat_value::HeatStepIntegrator { + public: + ValueHeatIntegrator(bool& destroyed, std::vector& events) + : destroyed_(destroyed), events_(events) {} + ~ValueHeatIntegrator() override { destroyed_ = true; } + std::function( + const heat_value::ThermalSystem&, const heat_value::ThermalPartition&, + const fesa::Vector&, double, fesa::LinearSolver&, + heat_value::ThermalFactorization&)> solve; + fesa::Result SolveIncrement( + const heat_value::ThermalSystem& system, + const heat_value::ThermalPartition& partition, + const fesa::Vector& old, double delta, fesa::LinearSolver& solver, + heat_value::ThermalFactorization& cache) const override { + events_.push_back("solve"); + return solve(system, partition, old, delta, solver, cache); + } + private: + bool& destroyed_; + std::vector& events_; +}; +} // namespace + +TEST(EquilibriumAlgorithm, InjectsAlternativeOrderAndPreservesTypedPendingOnFailure) { + bool destroyed = false; + auto owned = std::make_unique(destroyed); + auto* selected = owned.get(); + std::unique_ptr policy = std::move(owned); + std::vector observed; + using Candidate = std::unique_ptr; + using EvaluationResult = fesa::Result>; + fesa::EquilibriumStep step( + [&](std::uint32_t iteration) { + observed.push_back(iteration); + return iteration == 3U + ? EvaluationResult::Success(std::make_unique(42)) + : EvaluationResult::Success(std::nullopt); + }, 3U); + ASSERT_TRUE(step.Solve(*policy).IsOk()); + EXPECT_EQ(observed, (std::vector{0U, 3U})); + selected->fail = true; + ExpectInjectionFailure(step.Solve(*policy)); + EXPECT_EQ(observed, (std::vector{0U, 3U})); + ASSERT_TRUE(step.HasCandidate()); + EXPECT_EQ(*step.TakeCandidate(), 42); + EXPECT_FALSE(destroyed); + policy.reset(); + EXPECT_TRUE(destroyed); + // The default algorithm still evaluates zero through the inclusive maximum. + std::vector zero_observed; + fesa::NewtonStepAlgorithm zero_algorithm; + fesa::EquilibriumStep zero_step([&](std::uint32_t iteration) { + zero_observed.push_back(iteration); + return iteration == 2U ? fesa::Result>::Success(7) + : fesa::Result>::Success(std::nullopt); + }, 2U); + ASSERT_TRUE(zero_step.Solve(zero_algorithm).IsOk()); + EXPECT_EQ(zero_observed, (std::vector{0U, 1U, 2U})); + ASSERT_TRUE(zero_step.HasCandidate()); + EXPECT_EQ(zero_step.TakeCandidate(), 7); +} + +TEST(ProcedureIntegratorInjection, ShellValuesUseProductionStepAndPreserveHistory) { + bool destroyed = false; + std::vector events; + auto owned = std::make_unique(destroyed, events); + auto* fake = owned.get(); + std::unique_ptr integrator = std::move(owned); + shell_value::ReducedHistory old{fesa::Vector(2, 1), fesa::Vector(2, 2), + fesa::Vector(2, 3), fesa::Vector(2, 4), fesa::Vector(2, 5)}; + shell_value::FixedChart chart; + shell_value::EmbeddingRoot root; + fesa::Vector algorithmic(2, 6), retained_v(2, 7), retained_a(2, 8); + const fesa::HhtParameters parameters{11, 12, 13}; + NeverCalledTangent solver; + bool fail_reconstruction = false, fail_commit = false; + fake->predict = [&](const auto& history, double h, const auto& p) { + EXPECT_EQ(&history, &old); EXPECT_EQ(&p, ¶meters); EXPECT_DOUBLE_EQ(h, 17); + return shell_value::ReducedShellPredictor{fesa::Vector(2, 21), fesa::Vector(2, 22), + fesa::Vector(2, 23), fesa::Vector(2, 24), fesa::Vector(2, 25), fesa::Vector(2, 26)}; + }; + fake->rates = [&](const auto& request, auto& velocity, auto& acceleration) { + EXPECT_EQ(&request.history, &old); EXPECT_EQ(&request.chart, &chart); + EXPECT_EQ(&request.trial_algorithmic, &algorithmic); + EXPECT_EQ(&request.retained_velocity, &retained_v); + EXPECT_EQ(&request.retained_acceleration, &retained_a); + EXPECT_EQ(&request.parameters, ¶meters); EXPECT_DOUBLE_EQ(request.h, 17); + EXPECT_FALSE(request.copy_translation_rates); ExpectValueVector(request.vpp, 22); + EXPECT_NE(velocity.Data(), acceleration.Data()); + EXPECT_NE(velocity.Data(), request.vpp.Data()); + EXPECT_NE(acceleration.Data(), request.trial_algorithmic.Data()); + ExpectValueVector(velocity, 0); ExpectValueVector(acceleration, 0); + for (std::size_t i = 0; i < 2; ++i) { velocity[i] = 31; acceleration[i] = 32; } + }; + fake->reconstruct = [&](const auto& c, const auto& r, const auto& v, + const auto& a, auto& backend) { + EXPECT_EQ(&c, &chart); EXPECT_EQ(&r, &root); EXPECT_EQ(&backend, &solver); + ExpectValueVector(v, 31); ExpectValueVector(a, 32); + if (fail_reconstruction) + return fesa::Result::Failure(InjectionFailure()); + return fesa::Result::Success({ + fesa::Vector(2, 41), fesa::Vector(2, 42), fesa::Vector(2, 43), fesa::Vector(2, 44)}); + }; + std::vector history; + const auto evaluate = [&](const auto& selected, auto predictor) { + ExpectValueVector(predictor.pp, 21); ExpectValueVector(predictor.vpp, 22); + ExpectValueVector(predictor.coordinate_low, 23); + ExpectValueVector(predictor.increment_trace, 24); + ExpectValueVector(predictor.increment_trace_compensation, 25); + ExpectValueVector(predictor.increment_trace_absolute_sum, 26); + shell_value::ReducedShellTrialRates rates{fesa::Vector(2), fesa::Vector(2)}; + auto* v_data = rates.velocity.Data(); auto* a_data = rates.acceleration.Data(); + selected.EvaluateRates({chart, old, algorithmic, predictor.vpp, false, + retained_v, retained_a, 17, parameters}, rates.velocity, rates.acceleration); + EXPECT_EQ(v_data, rates.velocity.Data()); EXPECT_EQ(a_data, rates.acceleration.Data()); + return selected.ReconstructPhysicalRates(chart, root, rates.velocity, + rates.acceleration, solver); + }; + const auto commit = [&](shell_value::ReconstructedRates&& pending) { + events.push_back("commit"); + ExpectValueVector(pending.velocity, 41); ExpectValueVector(pending.acceleration, 42); + ExpectValueVector(pending.z_velocity, 43); ExpectValueVector(pending.z_acceleration, 44); + if (fail_commit) return InjectionFailure(); + history.push_back(std::move(pending)); + return fesa::Status::Ok(); + }; + ASSERT_TRUE(shell_value::RunReducedHhtStep(*integrator, old, 17, parameters, + evaluate, commit).IsOk()); + EXPECT_EQ(events, (std::vector{"predict", "rates", "reconstruct", "commit"})); + ASSERT_EQ(history.size(), 1U); + events.clear(); fail_reconstruction = true; + ExpectInjectionFailure(shell_value::RunReducedHhtStep(*integrator, old, 17, + parameters, evaluate, commit)); + EXPECT_EQ(events, (std::vector{"predict", "rates", "reconstruct"})); + EXPECT_EQ(history.size(), 1U); + events.clear(); fail_reconstruction = false; fail_commit = true; + ExpectInjectionFailure(shell_value::RunReducedHhtStep(*integrator, old, 17, + parameters, evaluate, commit)); + EXPECT_EQ(events, (std::vector{"predict", "rates", "reconstruct", "commit"})); + EXPECT_EQ(history.size(), 1U); + ExpectValueVector(old.p, 1); ExpectValueVector(old.velocity, 2); + ExpectValueVector(old.acceleration, 3); ExpectValueVector(old.algorithmic_acceleration, 4); + ExpectValueVector(old.z, 5); ExpectValueVector(history[0].velocity, 41); + EXPECT_FALSE(destroyed); integrator.reset(); EXPECT_TRUE(destroyed); +} + +TEST(ProcedureIntegratorInjection, SolidPairedValuesUseProductionStepAndPreserveHistory) { + bool destroyed = false; + std::vector events; + auto owned = std::make_unique(destroyed, events); + auto* fake = owned.get(); + std::unique_ptr integrator = std::move(owned); + fesa::SolidDynamicAcceptedFrameState old; + old.displacement = fesa::Vector(2, 1); old.low.displacement = fesa::Vector(2, 2); + old.velocity = fesa::Vector(2, 3); old.low.velocity = fesa::Vector(2, 4); + old.acceleration = fesa::Vector(2, 5); old.low.acceleration = fesa::Vector(2, 6); + old.algorithmic_acceleration = fesa::Vector(2, 7); + old.low.algorithmic_acceleration = fesa::Vector(2, 8); + const fesa::HhtParameters parameters{11, 12, 13}; + bool fail_predict = false, fail_rates = false, fail_commit = false; + fake->predict = [&](const auto& frame, double h, const auto& p) { + EXPECT_EQ(&frame, &old); EXPECT_EQ(&p, ¶meters); EXPECT_DOUBLE_EQ(h, 17); + if (fail_predict) + return fesa::Result::Failure(InjectionFailure()); + return fesa::Result::Success({ + fesa::Vector(2, 21), fesa::Vector(2, 22), fesa::Vector(2, 23), fesa::Vector(2, 24)}); + }; + fake->rates = [&](const auto& high, const auto& low, const auto& predictor, + const auto& old_a, const auto& old_a_low, double h, const auto& p) { + ExpectValueVector(high, 1); ExpectValueVector(low, 2); + ExpectValueVector(predictor.displacement, 21); ExpectValueVector(predictor.displacement_low, 22); + ExpectValueVector(predictor.velocity, 23); ExpectValueVector(predictor.velocity_low, 24); + EXPECT_EQ(&old_a, &old.acceleration); EXPECT_EQ(&old_a_low, &old.low.acceleration); + EXPECT_EQ(&p, ¶meters); EXPECT_DOUBLE_EQ(h, 17); + if (fail_rates) + return fesa::Result::Failure(InjectionFailure()); + return fesa::Result::Success({ + fesa::Vector(2, 31), fesa::Vector(2, 32), fesa::Vector(2, 33), + fesa::Vector(2, 34), fesa::Vector(2, 35), fesa::Vector(2, 36)}); + }; + std::vector history; + const auto failure = [&](const fesa::Status& status) { + events.push_back("predict-failure"); return status; + }; + const auto evaluate = [&](const auto& selected, const auto& predictor) { + auto pending = old; + const auto status = fesa::detail::SetSolidHhtRates(selected, old, predictor, + 17, parameters, &pending); + if (!status.IsOk()) { + ExpectValueVector(pending.velocity, 3); ExpectValueVector(pending.low.velocity, 4); + ExpectValueVector(pending.acceleration, 5); ExpectValueVector(pending.low.acceleration, 6); + ExpectValueVector(pending.algorithmic_acceleration, 7); + ExpectValueVector(pending.low.algorithmic_acceleration, 8); + return fesa::Result::Failure(status); + } + return fesa::Result::Success(std::move(pending)); + }; + const auto commit = [&](fesa::SolidDynamicAcceptedFrameState&& pending) { + events.push_back("commit"); + ExpectValueVector(pending.displacement, 1); ExpectValueVector(pending.low.displacement, 2); + ExpectValueVector(pending.velocity, 31); ExpectValueVector(pending.low.velocity, 32); + ExpectValueVector(pending.acceleration, 33); ExpectValueVector(pending.low.acceleration, 34); + ExpectValueVector(pending.algorithmic_acceleration, 35); + ExpectValueVector(pending.low.algorithmic_acceleration, 36); + if (fail_commit) return InjectionFailure(); + history.push_back(std::move(pending)); return fesa::Status::Ok(); + }; + ASSERT_TRUE(fesa::detail::RunSolidHhtStep(*integrator, old, 17, parameters, + failure, evaluate, commit).IsOk()); + EXPECT_EQ(events, (std::vector{"predict", "rates", "commit"})); + ASSERT_EQ(history.size(), 1U); + events.clear(); fail_predict = true; + ExpectInjectionFailure(fesa::detail::RunSolidHhtStep(*integrator, old, 17, + parameters, failure, evaluate, commit)); + EXPECT_EQ(events, (std::vector{"predict", "predict-failure"})); + EXPECT_EQ(history.size(), 1U); + events.clear(); fail_predict = false; fail_rates = true; + ExpectInjectionFailure(fesa::detail::RunSolidHhtStep(*integrator, old, 17, + parameters, failure, evaluate, commit)); + EXPECT_EQ(events, (std::vector{"predict", "rates"})); + EXPECT_EQ(history.size(), 1U); + events.clear(); fail_rates = false; fail_commit = true; + ExpectInjectionFailure(fesa::detail::RunSolidHhtStep(*integrator, old, 17, + parameters, failure, evaluate, commit)); + EXPECT_EQ(events, (std::vector{"predict", "rates", "commit"})); + EXPECT_EQ(history.size(), 1U); + ExpectValueVector(old.displacement, 1); ExpectValueVector(old.low.displacement, 2); + ExpectValueVector(old.velocity, 3); ExpectValueVector(old.low.velocity, 4); + ExpectValueVector(old.acceleration, 5); ExpectValueVector(old.low.acceleration, 6); + ExpectValueVector(old.algorithmic_acceleration, 7); ExpectValueVector(old.low.algorithmic_acceleration, 8); + ExpectValueVector(history[0].low.algorithmic_acceleration, 36); + EXPECT_FALSE(destroyed); integrator.reset(); EXPECT_TRUE(destroyed); +} + +TEST(ProcedureIntegratorInjection, HeatValuesUseProductionRecoveryCommitAndPreserveHistory) { + bool destroyed = false; + std::vector events; + auto owned = std::make_unique(destroyed, events); + auto* fake = owned.get(); + std::unique_ptr integrator = std::move(owned); + auto matrix = fesa::SparseMatrix::FromCoo( + 2, 2, {}, fesa::SparsePattern{{0, 0, 0}, {}}); + ASSERT_TRUE(matrix.HasValue()); + const auto& k = matrix.Value(); + const fesa::SparseMatrix c{k}; + const fesa::Vector q(2, 2), old(2, 1); + const heat_value::ThermalSystem system{k, c, q}; + const heat_value::ThermalPartition partition{{0, 1}, {}, fesa::Vector(0)}; + heat_value::ThermalFactorization cache; + NeverCalledLinear solver; + bool fail_solve = false, fail_recovery = false, fail_commit = false; + fake->solve = [&](const auto& supplied, const auto& p, const auto& previous, + double delta, auto& backend, auto& workspace) { + EXPECT_EQ(&supplied, &system); EXPECT_EQ(&p, &partition); EXPECT_EQ(&previous, &old); + EXPECT_EQ(&backend, &solver); EXPECT_EQ(&workspace, &cache); EXPECT_DOUBLE_EQ(delta, 17); + EXPECT_EQ(&supplied.k, &k); EXPECT_EQ(&supplied.c, &c); EXPECT_EQ(&supplied.q, &q); + EXPECT_EQ(supplied.k_error, nullptr); EXPECT_EQ(supplied.c_error, nullptr); + EXPECT_EQ(supplied.q_error, nullptr); EXPECT_EQ(p.free, (std::vector{0, 1})); + EXPECT_TRUE(p.constrained.empty()); EXPECT_EQ(p.prescribed.Size(), 0U); + if (fail_solve) + return fesa::Result::Failure(InjectionFailure()); + heat_value::ThermalStepCandidate pending{fesa::Vector(2, 21), fesa::Vector(2, 22), + fesa::Vector(2, 23), fesa::Vector(2, 24), + {31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, true, 42, 43}}; + return fesa::Result::Success(std::move(pending)); + }; + const heat_value::ThermalRecovery recovery = [&](const fesa::Vector& temperature) { + events.push_back("recovery"); ExpectValueVector(temperature, 21); + if (fail_recovery) + return fesa::Result>::Failure(InjectionFailure()); + std::vector flux(1); + for (auto& value : flux[0]) value = fesa::Vector3{51, 52, 53}; + return fesa::Result>::Success(std::move(flux)); + }; + std::vector history; + const auto commit = [&](heat_value::ThermalStepCandidate&& pending, + std::vector&& flux) { + events.push_back("commit"); + ExpectValueVector(pending.temperature, 21); ExpectValueVector(pending.residual, 22); + ExpectValueVector(pending.reaction, 23); ExpectValueVector(pending.certified_residual, 24); + const auto& e = pending.evidence; + EXPECT_DOUBLE_EQ(e.beta_cert, 31); EXPECT_DOUBLE_EQ(e.beta_limit, 32); + EXPECT_DOUBLE_EQ(e.free_residual_cert, 33); EXPECT_DOUBLE_EQ(e.full_free_residual_cert, 34); + EXPECT_DOUBLE_EQ(e.full_beta_cert, 35); EXPECT_DOUBLE_EQ(e.operator_construction_error, 36); + EXPECT_DOUBLE_EQ(e.rhs_construction_error, 37); EXPECT_DOUBLE_EQ(e.construction_identity_bound, 38); + EXPECT_DOUBLE_EQ(e.energy_change, 39); EXPECT_DOUBLE_EQ(e.energy_defect, 40); + EXPECT_DOUBLE_EQ(e.energy_bound, 41); EXPECT_TRUE(e.dissipation_checked); + EXPECT_DOUBLE_EQ(e.dissipation_defect, 42); EXPECT_DOUBLE_EQ(e.dissipation_bound, 43); + EXPECT_EQ(flux.size(), 1U); + for (const auto& value : flux[0]) EXPECT_EQ(value.Components(), (std::array{51, 52, 53})); + if (fail_commit) return InjectionFailure(); + history.push_back(std::move(pending)); return fesa::Status::Ok(); + }; + ASSERT_TRUE(heat_value::RunThermalStep(*integrator, system, partition, old, + 17, solver, cache, recovery, commit).IsOk()); + EXPECT_EQ(events, (std::vector{"solve", "recovery", "commit"})); + ASSERT_EQ(history.size(), 1U); + events.clear(); fail_solve = true; + ExpectInjectionFailure(heat_value::RunThermalStep(*integrator, system, partition, + old, 17, solver, cache, recovery, commit)); + EXPECT_EQ(events, (std::vector{"solve"})); EXPECT_EQ(history.size(), 1U); + events.clear(); fail_solve = false; fail_recovery = true; + ExpectInjectionFailure(heat_value::RunThermalStep(*integrator, system, partition, + old, 17, solver, cache, recovery, commit)); + EXPECT_EQ(events, (std::vector{"solve", "recovery"})); EXPECT_EQ(history.size(), 1U); + events.clear(); fail_recovery = false; fail_commit = true; + ExpectInjectionFailure(heat_value::RunThermalStep(*integrator, system, partition, + old, 17, solver, cache, recovery, commit)); + EXPECT_EQ(events, (std::vector{"solve", "recovery", "commit"})); + EXPECT_EQ(history.size(), 1U); ExpectValueVector(old, 1); + ExpectValueVector(history[0].temperature, 21); EXPECT_FALSE(cache.matrix.has_value()); + EXPECT_FALSE(destroyed); integrator.reset(); EXPECT_TRUE(destroyed); +} diff --git a/tests/unit/analysis/eigen_reduction_test.cpp b/tests/unit/analysis/eigen_reduction_test.cpp index a7f9108..f4fb0a0 100644 --- a/tests/unit/analysis/eigen_reduction_test.cpp +++ b/tests/unit/analysis/eigen_reduction_test.cpp @@ -1,3 +1,4 @@ +#include #include "analysis/eigen_reduction.h" #include @@ -6,7 +7,6 @@ #include #include #include -#include #include #include @@ -47,6 +47,37 @@ fesa::ShellNodeInitialFrame TiltedFrame() { return {0U, {0.6, 0.0, 0.8}, {0.0, 1.0, 0.0}, {-0.8, 0.0, 0.6}}; } +TEST(EigenReduction, RejectsNonfiniteUsedBasisAndPreservesPriorCandidate) { + const fesa::ShellNodeInitialFrame frame{0U, {0, 0, 1}, {1, 0, 0}, {0, 1, 0}}; + const auto mass = NodalMass(frame.director); + fesa::Matrix stiffness(6U, 6U); + for (std::size_t i = 0; i < 5U; ++i) stiffness(i, i) = mass(i, i) * 7.0; + stiffness(5U, 5U) = .25; + const auto matrix = Sparse(stiffness); + const std::vector mask(6U, 0U); + const auto prior = fesa::eigen_internal::BuildEigenReduction( + matrix, {mass}, {frame}, mask, {.25}, 2.0); + ASSERT_TRUE(prior.HasValue()); + const auto prior_values = prior.Value().whitened_operator.Values(); + for (const double invalid : {std::numeric_limits::quiet_NaN(), + std::numeric_limits::infinity()}) { + for (const bool first_tangent : {false, true}) { + auto bad_frame = frame; + (first_tangent ? bad_frame.tangent_a : bad_frame.tangent_b)[0] = invalid; + const auto rejected = fesa::eigen_internal::BuildEigenReduction( + matrix, {mass}, {bad_frame}, mask, {.25}, 2.0); + ASSERT_FALSE(rejected.HasValue()); + EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kSolver); + EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, + "invalid-eigen-mass-space"); + EXPECT_EQ(prior.Value().whitened_operator.Values(), prior_values); + } + } + const auto rerun = fesa::eigen_internal::BuildEigenReduction( + matrix, {mass}, {frame}, mask, {.25}, 2.0); + ASSERT_TRUE(rerun.HasValue()); + EXPECT_EQ(rerun.Value().whitened_operator.Values(), prior_values); +} } // namespace TEST(EigenReduction, KeepsPositivePartialGlobalRotationAndOriginalPencil) { @@ -93,38 +124,6 @@ TEST(EigenReduction, RemovesOnlyActualFreeDirectorNull) { .HasValue()); } -TEST(EigenReduction, RejectsNonfiniteUsedBasisAndPreservesPriorCandidate) { - const fesa::ShellNodeInitialFrame frame{0U, {0, 0, 1}, {1, 0, 0}, {0, 1, 0}}; - const auto mass = NodalMass(frame.director); - fesa::Matrix stiffness(6U, 6U); - for (std::size_t i = 0; i < 5U; ++i) stiffness(i, i) = mass(i, i) * 7.0; - stiffness(5U, 5U) = .25; - const auto matrix = Sparse(stiffness); - const std::vector mask(6U, 0U); - const auto prior = fesa::eigen_internal::BuildEigenReduction( - matrix, {mass}, {frame}, mask, {.25}, 2.0); - ASSERT_TRUE(prior.HasValue()); - const auto prior_values = prior.Value().whitened_operator.Values(); - for (const double invalid : {std::numeric_limits::quiet_NaN(), - std::numeric_limits::infinity()}) { - for (const bool first_tangent : {false, true}) { - auto bad_frame = frame; - (first_tangent ? bad_frame.tangent_a : bad_frame.tangent_b)[0] = invalid; - const auto rejected = fesa::eigen_internal::BuildEigenReduction( - matrix, {mass}, {bad_frame}, mask, {.25}, 2.0); - ASSERT_FALSE(rejected.HasValue()); - EXPECT_EQ(rejected.GetStatus().Category(), fesa::FailureCategory::kSolver); - EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, - "invalid-eigen-mass-space"); - EXPECT_EQ(prior.Value().whitened_operator.Values(), prior_values); - } - } - const auto rerun = fesa::eigen_internal::BuildEigenReduction( - matrix, {mass}, {frame}, mask, {.25}, 2.0); - ASSERT_TRUE(rerun.HasValue()); - EXPECT_EQ(rerun.Value().whitened_operator.Values(), prior_values); -} - TEST(EigenReduction, RejectsPositiveButUnresolvableMassWithoutDeletingDofs) { const double p = 1e-8; const std::array d{2 * p / (1 + p * p), 0, @@ -215,3 +214,70 @@ TEST(EigenReduction, HandlesTwoFreeRotationsAndRejectsEmptyFiniteSpace) { EXPECT_EQ(empty.GetStatus().Diagnostics()[0].code, "empty-eigenproblem"); } } + +TEST(EigenReduction, PureMassWhiteningRetainsInclusiveInfinityConditionGate) { + const fesa::ShellNodeInitialFrame frame{0U, {0, 0, 1}, {1, 0, 0}, {0, 1, 0}}; + for (const double diagonal : {0x1p-31, 0x1p-32, 0x1p-33}) { + auto mass = NodalMass(frame.director); + mass(0, 0) = 1.0; + mass(1, 1) = diagonal; + fesa::Matrix stiffness{6U, 6U}; + stiffness(0, 0) = 3.0; + stiffness(1, 1) = 3.0 * diagonal; + const auto reduced = fesa::eigen_internal::BuildEigenReduction( + Sparse(stiffness), {mass}, {frame}, {0, 0, 1, 1, 1, 1}, {0.25}, 1.0); + EXPECT_EQ(reduced.HasValue(), diagonal >= 0x1p-32); + if (reduced.HasValue()) { + EXPECT_DOUBLE_EQ(reduced.Value().nodes[0].record.rcond_inf, diagonal); + fesa::Vector one{2U, 1.0}; + const auto applied = reduced.Value().whitened_operator.Multiply(one); + EXPECT_NEAR(applied[0], 3.0, 1e-12); + EXPECT_NEAR(applied[1], 3.0, 1e-12); + } else { + EXPECT_EQ(reduced.GetStatus().Diagnostics()[0].code, + "eigen-mass-conditioning"); + } + } +} + +TEST(EigenReduction, PureOffDiagonalWhiteningMatchesAnalyticGramAndPencil) { + const fesa::ShellNodeInitialFrame frame{0U, {0, 0, 1}, {1, 0, 0}, {0, 1, 0}}; + auto mass = NodalMass(frame.director); + mass(0, 1) = mass(1, 0) = 1.0; + fesa::Matrix stiffness{6U, 6U}; + stiffness(0, 0) = stiffness(1, 1) = 6.0; + stiffness(0, 1) = stiffness(1, 0) = 4.0; + // For M=[[2,1],[1,2]], physical whitening columns are analytically + // (1/sqrt(2),0) and (-1/sqrt(6),2/sqrt(6)). No eigensolver is invoked. + for (const double length : {0.25, 3.0, 16.0}) { + const auto reduced = fesa::eigen_internal::BuildEigenReduction( + Sparse(stiffness), {mass}, {frame}, {0, 0, 1, 1, 1, 1}, {0.25}, length); + ASSERT_TRUE(reduced.HasValue()); + fesa::Matrix canonical{2U, 2U}; + canonical(0, 0) = canonical(1, 1) = 1.0; + std::array physical{fesa::Vector{6U}, fesa::Vector{6U}}; + for (std::size_t column = 0; column < 2U; ++column) { + physical[column] = fesa::eigen_internal::RestoreScaledMode( + reduced.Value(), canonical, column); + for (std::size_t i = 0; i < 3U; ++i) physical[column][i] *= length; + } + EXPECT_NEAR(physical[0][0], 1.0 / std::sqrt(2.0), 1e-12); + EXPECT_NEAR(physical[0][1], 0.0, 1e-12); + EXPECT_NEAR(physical[1][0], -1.0 / std::sqrt(6.0), 1e-12); + EXPECT_NEAR(physical[1][1], 2.0 / std::sqrt(6.0), 1e-12); + const double expected[2][2]{{3.0, 1.0 / std::sqrt(3.0)}, + {1.0 / std::sqrt(3.0), 7.0 / 3.0}}; + for (std::size_t column = 0; column < 2U; ++column) { + fesa::Vector coordinate{2U}; + coordinate[column] = 1.0; + const auto action = reduced.Value().whitened_operator.Multiply(coordinate); + const auto mq = mass.Multiply(physical[column]); + const auto kq = stiffness.Multiply(physical[column]); + for (std::size_t row = 0; row < 2U; ++row) { + EXPECT_NEAR(physical[row].Dot(mq), row == column ? 1.0 : 0.0, 1e-12); + EXPECT_NEAR(action[row], expected[row][column], 1e-12); + EXPECT_NEAR(action[row], physical[row].Dot(kq), 1e-12); + } + } + } +} diff --git a/tests/unit/analysis/hht_reduced_shell_test.cpp b/tests/unit/analysis/hht_reduced_shell_test.cpp index d8ce519..752198a 100644 --- a/tests/unit/analysis/hht_reduced_shell_test.cpp +++ b/tests/unit/analysis/hht_reduced_shell_test.cpp @@ -505,8 +505,7 @@ TEST(HhtReducedOperators, saved.q[first + 3U], saved.q[first + 4U], saved.q[first + 5U]}; } for (std::size_t i = 0U; i < 24U; ++i) direction[i] = saved.v[i]; - const auto response = fesa::EvaluateInternalResidualAndTangent( - shells.Value()[e].internal, trial, &direction); + const auto response = shells.Value()[e].internal->EvaluateTrial(trial, &direction); ASSERT_TRUE(response.HasValue()); for (std::size_t node = 0U; node < 4U; ++node) { ExpectSameBits(saved.drilling_constraint[node], diff --git a/tests/unit/analysis/hht_shell_physics_test.cpp b/tests/unit/analysis/hht_shell_physics_test.cpp index e5a3548..13b49c9 100644 --- a/tests/unit/analysis/hht_shell_physics_test.cpp +++ b/tests/unit/analysis/hht_shell_physics_test.cpp @@ -573,8 +573,7 @@ TEST(HhtShellPhysics, ExternalDrillingHessianBalancesGradientAcceleration) { const fesa::Vector3 velocity{1.0, 0.0, 1.0}; const fesa::Vector3 acceleration{0.0, -1.0 / 3.0, 0.0}; const fesa::Vector3 force{1.0, 0.0, 0.0}; - const auto external = fixture.shells[0U].internal - .EvaluateExternalDrillingConstraint( + const auto external = fixture.shells[0U].internal->EvaluateExternalDrillingConstraint( 0U, phi, velocity, force, {}, {}); ASSERT_TRUE(external.HasValue()); double gradient_acceleration = 0.0; @@ -586,14 +585,11 @@ TEST(HhtShellPhysics, ExternalDrillingHessianBalancesGradientAcceleration) { EXPECT_NEAR(external.Value().directional_second + gradient_acceleration, 0.0, 1.0e-14); constexpr double step = 1.0e-4; - const auto plus = fixture.shells[0U].internal - .EvaluateExternalDrillingConstraint( + const auto plus = fixture.shells[0U].internal->EvaluateExternalDrillingConstraint( 0U, {step, 0.0, step}, {}, force, {}, {}); - const auto middle = fixture.shells[0U].internal - .EvaluateExternalDrillingConstraint( + const auto middle = fixture.shells[0U].internal->EvaluateExternalDrillingConstraint( 0U, phi, {}, force, {}, {}); - const auto minus = fixture.shells[0U].internal - .EvaluateExternalDrillingConstraint( + const auto minus = fixture.shells[0U].internal->EvaluateExternalDrillingConstraint( 0U, {-step, 0.0, -step}, {}, force, {}, {}); ASSERT_TRUE(plus.HasValue()); ASSERT_TRUE(middle.HasValue()); diff --git a/tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp b/tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp index f577af2..3eb945c 100644 --- a/tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp +++ b/tests/unit/analysis/solid_hht_dynamic_procedure_test.cpp @@ -21,6 +21,8 @@ #include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" #include "solid_hht_test_fixture.h" +#include "fesa/analysis/analysis_model.h" + namespace { fesa::Result RunDynamics( fesa::ModelDefinition d) { diff --git a/tests/unit/analysis/solid_static_procedure_test.cpp b/tests/unit/analysis/solid_static_procedure_test.cpp index acebcee..19e0fee 100644 --- a/tests/unit/analysis/solid_static_procedure_test.cpp +++ b/tests/unit/analysis/solid_static_procedure_test.cpp @@ -1,4 +1,7 @@ #include "fesa/analysis/solid_static_procedure.h" +#include "analysis/solid_static_core.h" +#include "analysis/equilibrium_algorithm.h" +#include "fesa/core/source_identity.h" #include @@ -7,6 +10,7 @@ #include #include #include +#include #include #include @@ -824,3 +828,116 @@ TEST(SolidStaticProcedure, << " energy=" << frame.physical_strain_energy << '\n'; } } + +namespace { +fesa::Status StaticPolicyFailure() { + return fesa::Status::Failure(fesa::FailureCategory::kSolver, + {{fesa::Severity::kError, "injected-static-algorithm", {}, "STATIC", + "original-owner", "Original algorithm failure."}}); +} +class UnusedStaticSolvers final : public fesa::LinearSolver, + public fesa::TangentSolver { + public: + mutable int calls = 0; + fesa::Status Factorize(const fesa::SparseMatrix&) override { + ++calls; return StaticPolicyFailure(); + } + fesa::Status Solve(const fesa::Vector&, fesa::Vector&) const override { + ++calls; return StaticPolicyFailure(); + } + fesa::Status FactorizeFresh(const fesa::SparseMatrix&) override { + ++calls; return StaticPolicyFailure(); + } + fesa::Status SolveCorrection(const fesa::Vector&, fesa::Vector&) const override { + ++calls; return StaticPolicyFailure(); + } +}; +class RefusingStaticAlgorithm final : public fesa::EquilibriumAlgorithm { + public: + RefusingStaticAlgorithm(const fesa::SolidStaticState& state, bool& destroyed) + : state_(state), destroyed_(destroyed) {} + ~RefusingStaticAlgorithm() override { destroyed_ = true; } + int calls = 0; + fesa::SolidStaticFrame baseline; + fesa::Status SolveCurrentStep(std::uint32_t first, std::uint32_t last, + const Evaluation&) override { + ++calls; + EXPECT_EQ(first, 1U); EXPECT_EQ(last, 100U); + EXPECT_TRUE(state_.AcceptedFrames().empty()); + EXPECT_TRUE(state_.IterationRecords().empty()); + baseline = state_.CommittedState(); + return StaticPolicyFailure(); + } + private: + const fesa::SolidStaticState& state_; + bool& destroyed_; +}; +} // namespace + +TEST(SolidStaticProcedure, InjectedAlgorithmFailurePreservesInitializedBaseline) { + auto domain = Map(Deck(Supports(), Tension(1.0), true)); + ASSERT_TRUE(domain.HasValue()) << Message(domain.GetStatus()); + fesa::SerialParallelFor serial; + UnusedStaticSolvers solvers; + fesa::SolidStaticState state; + bool destroyed = false; + auto owned = std::make_unique(state, destroyed); + auto* selected = owned.get(); + std::unique_ptr algorithm = std::move(owned); + { + fesa::SolidStaticCore core(serial, solvers, solvers, *algorithm); + const auto status = core.ExecuteInto(domain.Value(), state); + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver); + ASSERT_EQ(status.Diagnostics().size(), 1U); + const auto& diagnostic = status.Diagnostics()[0]; + EXPECT_EQ(diagnostic.code, "injected-static-algorithm"); + EXPECT_EQ(diagnostic.keyword, "STATIC"); + EXPECT_EQ(diagnostic.entity_identity, "original-owner"); + EXPECT_EQ(diagnostic.message, "Original algorithm failure."); + } + EXPECT_EQ(selected->calls, 1); EXPECT_EQ(solvers.calls, 0); + EXPECT_TRUE(state.AcceptedFrames().empty()); + EXPECT_TRUE(state.IterationRecords().empty()); + // Core initialization legitimately installs the zero-factor baseline before + // iteration. Compare to that exact baseline at algorithm entry, not to the + // initially uninitialized observer. + const auto& expected = selected->baseline; + const auto& actual = state.CommittedState(); + EXPECT_EQ(actual.frame_index, expected.frame_index); + EXPECT_EQ(actual.increment_index, expected.increment_index); + EXPECT_DOUBLE_EQ(actual.load_factor, expected.load_factor); + EXPECT_EQ(actual.iteration_count, expected.iteration_count); + EXPECT_EQ(actual.is_factor_one, expected.is_factor_one); + EXPECT_EQ(actual.nodal_internal_order, expected.nodal_internal_order); + ASSERT_EQ(actual.nodal_source_ids.size(), expected.nodal_source_ids.size()); + for (std::size_t i = 0; i < actual.nodal_source_ids.size(); ++i) + EXPECT_TRUE(fesa::SourceIdentityEquals(actual.nodal_source_ids[i], expected.nodal_source_ids[i])); + const auto same_vector = [](const fesa::Vector& a, const fesa::Vector& b) { + ASSERT_EQ(a.Size(), b.Size()); + for (std::size_t i = 0; i < a.Size(); ++i) EXPECT_DOUBLE_EQ(a[i], b[i]); + }; + same_vector(actual.displacement, expected.displacement); + same_vector(actual.internal_force, expected.internal_force); + same_vector(actual.external_force, expected.external_force); + same_vector(actual.residual, expected.residual); same_vector(actual.reaction, expected.reaction); + EXPECT_DOUBLE_EQ(actual.physical_strain_energy, expected.physical_strain_energy); + EXPECT_EQ(actual.global_equilibrium, expected.global_equilibrium); + EXPECT_EQ(actual.balance.internal_force_sum, expected.balance.internal_force_sum); + EXPECT_EQ(actual.balance.reference_internal_moment, expected.balance.reference_internal_moment); + EXPECT_EQ(actual.balance.current_internal_moment, expected.balance.current_internal_moment); + EXPECT_EQ(actual.balance.free_residual_moment, expected.balance.free_residual_moment); + EXPECT_EQ(actual.balance.linearization_moment, expected.balance.linearization_moment); + EXPECT_EQ(actual.balance.internal_force_scale, expected.balance.internal_force_scale); + EXPECT_EQ(actual.balance.reference_moment_scale, expected.balance.reference_moment_scale); + EXPECT_EQ(actual.balance.current_moment_scale, expected.balance.current_moment_scale); + ASSERT_EQ(actual.solid_results.size(), expected.solid_results.size()); + for (std::size_t i = 0; i < actual.solid_results.size(); ++i) { + const auto& a = actual.solid_results[i]; const auto& b = expected.solid_results[i]; + EXPECT_EQ(a.element, b.element); EXPECT_EQ(a.integration_point, b.integration_point); + EXPECT_EQ(a.natural_coordinates, b.natural_coordinates); + EXPECT_EQ(a.reference_coordinates, b.reference_coordinates); + EXPECT_EQ(a.cauchy_stress, b.cauchy_stress); EXPECT_EQ(a.strain, b.strain); + } + EXPECT_FALSE(destroyed); algorithm.reset(); EXPECT_TRUE(destroyed); +} diff --git a/tests/unit/analysis/thermal_analysis_state_test.cpp b/tests/unit/analysis/thermal_analysis_state_test.cpp index c1f58b8..04a092a 100644 --- a/tests/unit/analysis/thermal_analysis_state_test.cpp +++ b/tests/unit/analysis/thermal_analysis_state_test.cpp @@ -11,6 +11,8 @@ #include #include +#include "fesa/assembly/thermal_assembler.h" + namespace { fesa::ModelDefinition Definition(bool constrained = true, double period = .9, double increment = .3, diff --git a/tests/unit/analysis/transient_heat_procedure_test.cpp b/tests/unit/analysis/transient_heat_procedure_test.cpp index b31af42..646c0e3 100644 --- a/tests/unit/analysis/transient_heat_procedure_test.cpp +++ b/tests/unit/analysis/transient_heat_procedure_test.cpp @@ -12,6 +12,8 @@ #include "analysis/thermal_transient_bounds.h" #include "fesa/solvers/linear/mkl_pardiso_solver.h" +#include "fesa/assembly/thermal_assembler.h" + namespace { namespace ti = fesa::thermal_transient_internal; std::string Messages(const fesa::Status& status) { diff --git a/tests/unit/assembly/sparse_assembler_test.cpp b/tests/unit/assembly/sparse_assembler_test.cpp index 564ddbd..33ef767 100644 --- a/tests/unit/assembly/sparse_assembler_test.cpp +++ b/tests/unit/assembly/sparse_assembler_test.cpp @@ -185,7 +185,12 @@ class ReverseParallelFor final : public fesa::ParallelFor { class FakeStiffnessElement final : public fesa::Element { public: FakeStiffnessElement(fesa::ElementDofLayout layout, fesa::Matrix stiffness) - : layout_{std::move(layout)}, stiffness_{std::move(stiffness)} {} + : layout_{std::move(layout)}, stiffness_{std::move(stiffness)}, + contribution_layout_{layout_} {} + + void ReturnLayout(fesa::ElementDofLayout layout) { + contribution_layout_ = std::move(layout); + } const fesa::ElementDofLayout& DofLayout() const noexcept override { return layout_; @@ -194,7 +199,7 @@ class FakeStiffnessElement final : public fesa::Element { fesa::Result ComputeStiffness() const override { return fesa::Result::Success( - {layout_, stiffness_}); + {contribution_layout_, stiffness_}); } fesa::Result Recover( @@ -206,6 +211,7 @@ class FakeStiffnessElement final : public fesa::Element { private: fesa::ElementDofLayout layout_; fesa::Matrix stiffness_; + fesa::ElementDofLayout contribution_layout_; }; fesa::Matrix MatrixFromRows(const std::vector>& rows) { @@ -414,4 +420,59 @@ TEST(SparseAssembly, S4AndS4rSemanticFixturesAssembleIdenticalStiffness) { ExpectByteIdentical(s4r.Value(), s4.Value()); } +TEST(SparseAssembly, RejectsLayoutAndDimensionsInStableElementOrder) { + auto domain = fesa::Domain::Create(MakeDefinition()); + ASSERT_TRUE(domain.HasValue()); + auto model = fesa::AnalysisModel::Create(domain.Value()); + ASSERT_TRUE(model.HasValue()); + const fesa::ElementDofLayout first_layout{ + {"Beam-1", 10, "10"}, {0U, 1U}, {fesa::DofComponent::kUx}}; + const fesa::ElementDofLayout second_layout{ + {"Beam-1", 20, "20"}, {1U, 2U}, {fesa::DofComponent::kUx}}; + FakeStiffnessElement first{first_layout, fesa::Matrix{2U, 2U}}; + FakeStiffnessElement second{second_layout, fesa::Matrix{1U, 1U}}; + const fesa::ElementView elements{std::cref(first), std::cref(second)}; + fesa::DofManager dofs; + ASSERT_TRUE(dofs.Build(model.Value(), elements).IsOk()); + const auto original_pattern = dofs.GetSparsePattern(); + + std::vector invalid(5U, first_layout); + invalid[0U].source_id.instance_name = "beam-1"; + invalid[1U].source_id.source_label = 11; + invalid[2U].source_id.source_label_text = "010"; + invalid[3U].node_indices = {1U, 0U}; + invalid[4U].components_per_node = {fesa::DofComponent::kUy}; + fesa::SerialParallelFor serial; + fesa::TbbParallelFor tbb; + ReverseParallelFor reverse; + for (const auto& layout : invalid) { + first.ReturnLayout(layout); + for (const fesa::ParallelFor* executor : + std::array{&serial, &tbb, &reverse}) { + auto candidate = + fesa::SparseAssembler::Assemble(elements, dofs, *executor); + ASSERT_FALSE(candidate.HasValue()); + EXPECT_EQ(candidate.GetStatus().Category(), fesa::FailureCategory::kModel); + ASSERT_EQ(candidate.GetStatus().Diagnostics().size(), 1U); + const auto& diagnostic = candidate.GetStatus().Diagnostics()[0U]; + EXPECT_EQ(diagnostic.code, "invalid-assembly-layout"); + EXPECT_EQ(diagnostic.keyword, "*ELEMENT"); + EXPECT_EQ(diagnostic.entity_identity, "10"); + EXPECT_EQ(diagnostic.message, + "Element stiffness layout must match its declared runtime layout."); + } + } + first.ReturnLayout(first_layout); + auto candidate = fesa::SparseAssembler::Assemble(elements, dofs, reverse); + ASSERT_FALSE(candidate.HasValue()); + EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].code, + "invalid-assembly-dimensions"); + EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].entity_identity, "20"); + EXPECT_EQ(first.DofLayout().node_indices, first_layout.node_indices); + EXPECT_EQ(dofs.GetSparsePattern().row_offsets, original_pattern.row_offsets); + EXPECT_EQ(dofs.GetSparsePattern().column_indices, + original_pattern.column_indices); + EXPECT_TRUE(dofs.ValidateInvariants().IsOk()); +} + } // namespace diff --git a/tests/unit/constraints/essential_constraints_test.cpp b/tests/unit/constraints/essential_constraints_test.cpp index 166f0d0..88ea888 100644 --- a/tests/unit/constraints/essential_constraints_test.cpp +++ b/tests/unit/constraints/essential_constraints_test.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -185,6 +186,24 @@ TEST(EssentialConstraints, HandlesNoAllAndMixedConstraints) { ExpectShape(all.Value().k_cc, 6U, 6U); EXPECT_EQ(all.Value().k_cc.Values(), full.Values()); + fesa::Vector full_load{6U}; + for (std::size_t i = 0U; i < full_load.Size(); ++i) + full_load[i] = static_cast(i) - 2.0; + auto empty_rhs = policy.EffectiveFreeRhs( + full_load, all.Value().k_fc, all_constraints.PrescribedValues(), + all_constraints); + ASSERT_TRUE(empty_rhs.HasValue()); + EXPECT_EQ(empty_rhs.Value().Size(), 0U); + auto full_rhs = policy.EffectiveFreeRhs( + full_load, none.Value().k_fc, no_constraints.PrescribedValues(), + no_constraints); + ASSERT_TRUE(full_rhs.HasValue()); + for (std::size_t i = 0U; i < full_load.Size(); ++i) { + EXPECT_EQ(full_rhs.Value()[i], static_cast(i) - 2.0); + EXPECT_EQ(full_load[i], static_cast(i) - 2.0); + } + + const auto mixed_constraints = MakeDofs({{"1", 3, 4, 0.0, {{}, 12U}}}); auto mixed = policy.Partition(full, mixed_constraints); ASSERT_TRUE(mixed.HasValue()); @@ -316,3 +335,52 @@ TEST(EssentialConstraints, RejectsDimensionOrOrderMismatch) { fesa::Vector{4U}, fesa::Vector{2U}, dofs)), std::invalid_argument); } + +TEST(EssentialConstraints, PreservesEliminationFailureOrderAndInputs) { + const fesa::EssentialConstraintPolicy policy; + const auto dofs = MakeDofs({{"1", 2, 2, 2.0, {{}, 12U}}, + {"1", 5, 5, -1.0, {{}, 13U}}}); + const double maximum = (std::numeric_limits::max)(); + fesa::Vector load{6U}; + load[0U] = std::numeric_limits::infinity(); + fesa::Vector prescribed{2U}; + prescribed[0U] = std::numeric_limits::infinity(); + prescribed[1U] = 1.0; + const auto kfc = MakeMatrix(4U, 2U, {0.4 * maximum, 0.8 * maximum, + maximum, 0.0, 0.0, 0.0, 0.0, 0.0}); + const auto original_values = kfc.Values(); + const auto original_pattern = dofs.GetSparsePattern(); + auto candidate = policy.EffectiveFreeRhs( + load, MakeMatrix(3U, 2U, std::vector(6U)), prescribed, dofs); + ASSERT_FALSE(candidate.HasValue()); + EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].code, + "invalid-load-dimensions"); + candidate = policy.EffectiveFreeRhs(load, kfc, prescribed, dofs); + ASSERT_FALSE(candidate.HasValue()); + EXPECT_EQ(candidate.GetStatus().Diagnostics()[0U].entity_identity, + "full-load:0"); + EXPECT_EQ(load[0U], std::numeric_limits::infinity()); + EXPECT_EQ(prescribed[0U], std::numeric_limits::infinity()); + + load[0U] = 7.0; + prescribed[0U] = 2.0; + candidate = policy.EffectiveFreeRhs(load, kfc, prescribed, dofs); + ASSERT_FALSE(candidate.HasValue()); + EXPECT_EQ(candidate.GetStatus().Category(), fesa::FailureCategory::kModel); + ASSERT_EQ(candidate.GetStatus().Diagnostics().size(), 1U); + const auto& diagnostic = candidate.GetStatus().Diagnostics()[0U]; + EXPECT_EQ(diagnostic.code, "nonfinite-load-accumulation"); + EXPECT_EQ(diagnostic.keyword, "LOAD_ASSEMBLER"); + EXPECT_EQ(diagnostic.entity_identity, "0"); + EXPECT_TRUE(diagnostic.location.file.empty()); + EXPECT_EQ(diagnostic.location.line, 0U); + EXPECT_EQ(diagnostic.message, + "Kfc times prescribed displacement produced a nonfinite row sum."); + EXPECT_EQ(load[0U], 7.0); + EXPECT_EQ(prescribed[0U], 2.0); + EXPECT_EQ(prescribed[1U], 1.0); + EXPECT_EQ(kfc.Values(), original_values); + EXPECT_EQ(dofs.GetSparsePattern().row_offsets, original_pattern.row_offsets); + EXPECT_EQ(dofs.GetSparsePattern().column_indices, + original_pattern.column_indices); +} diff --git a/tests/unit/core/ascii_test.cpp b/tests/unit/core/ascii_test.cpp index c0fff58..ec0036c 100644 --- a/tests/unit/core/ascii_test.cpp +++ b/tests/unit/core/ascii_test.cpp @@ -17,6 +17,21 @@ TEST(Ascii, LowercasesOnlyAsciiUppercaseBytes) { EXPECT_EQ(fesa::AsciiLower(non_ascii), non_ascii); } +TEST(Ascii, UppercaseCanonicalizationPreservesEveryOtherByteAndSourceText) { + std::string source; + std::string expected; + for (unsigned int byte = 0U; byte < 256U; ++byte) { + source.push_back(static_cast(byte)); + expected.push_back( + static_cast(byte >= 97U && byte <= 122U ? byte - 32U : byte)); + } + const std::string original = source; + EXPECT_EQ(fesa::AsciiUppercase(source), expected); + EXPECT_EQ(source, original); + EXPECT_TRUE(fesa::AsciiUppercase("").empty()); + EXPECT_EQ(fesa::AsciiUppercase("Shell-01"), "SHELL-01"); +} + TEST(Ascii, ComparesNamesWithoutLocaleOrUnicodeFolding) { EXPECT_TRUE(fesa::AsciiCaseInsensitiveEquals("Beam-1", "bEaM-1")); EXPECT_FALSE(fesa::AsciiCaseInsensitiveEquals("Beam-1", "Beam-10")); diff --git a/tests/unit/core/source_identity_test.cpp b/tests/unit/core/source_identity_test.cpp index 0201bf7..f0ac82a 100644 --- a/tests/unit/core/source_identity_test.cpp +++ b/tests/unit/core/source_identity_test.cpp @@ -17,4 +17,12 @@ TEST(CoreDiagnostics, SourceIdentityPreservesRawIdentity) { EXPECT_EQ(identity.instance_name, "Beam-Instance_A"); EXPECT_EQ(identity.source_label, 42); EXPECT_EQ(identity.source_label_text, "00042"); + + EXPECT_TRUE(fesa::SourceIdentityEquals(identity, identity)); + EXPECT_FALSE(fesa::SourceIdentityEquals( + identity, {"beam-instance_a", std::int64_t{42}, "00042"})); + EXPECT_FALSE(fesa::SourceIdentityEquals( + identity, {"Beam-Instance_A", std::int64_t{43}, "00042"})); + EXPECT_FALSE(fesa::SourceIdentityEquals( + identity, {"Beam-Instance_A", std::int64_t{42}, "42"})); } diff --git a/tests/unit/core/status_test.cpp b/tests/unit/core/status_test.cpp index 90ace79..cd3223f 100644 --- a/tests/unit/core/status_test.cpp +++ b/tests/unit/core/status_test.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -19,8 +20,68 @@ fesa::Diagnostic ModelDiagnostic() { "Beam length must be positive."}; } +struct CopyOnlyPayload { + explicit CopyOnlyPayload(int initial_value) : value{initial_value} {} + CopyOnlyPayload(const CopyOnlyPayload& other) + : value{other.value}, copies{other.copies + 1} {} + + int value; + int copies = 0; +}; + +struct TransferPayload { + explicit TransferPayload(int initial_value) : value{initial_value} {} + TransferPayload(const TransferPayload& other) + : value{other.value}, copies{other.copies + 1}, moves{other.moves} {} + TransferPayload(TransferPayload&& other) noexcept + : value{other.value}, copies{other.copies}, moves{other.moves + 1} { + other.value = -1; + } + + int value; + int copies = 0; + int moves = 0; +}; + } // namespace +TEST(CoreDiagnostics, ResultOwnsCopyOnlyPayloadWithoutIntermediateCopy) { + CopyOnlyPayload source{23}; + auto result = fesa::Result::Success(source); + + ASSERT_TRUE(result.HasValue()); + EXPECT_TRUE(result.GetStatus().IsOk()); + EXPECT_EQ(result.Value().value, 23); + EXPECT_EQ(result.Value().copies, 2); + result.Value().value = 42; + EXPECT_EQ(source.value, 23); + EXPECT_EQ(source.copies, 0); +} + +TEST(CoreDiagnostics, ResultTransfersOwnedPayloadDirectlyIntoValue) { + TransferPayload source{17}; + const auto from_lvalue = fesa::Result::Success(source); + EXPECT_EQ(source.value, 17); + EXPECT_EQ(source.copies, 0); + EXPECT_EQ(source.moves, 0); + EXPECT_EQ(from_lvalue.Value().value, 17); + EXPECT_EQ(from_lvalue.Value().copies, 1); + EXPECT_EQ(from_lvalue.Value().moves, 1); + + const auto from_temporary = + fesa::Result::Success(TransferPayload{29}); + EXPECT_EQ(from_temporary.Value().value, 29); + EXPECT_EQ(from_temporary.Value().copies, 0); + EXPECT_EQ(from_temporary.Value().moves, 1); + + auto owned = std::make_unique(31); + const auto move_only = + fesa::Result>::Success(std::move(owned)); + EXPECT_EQ(owned, nullptr); + ASSERT_NE(move_only.Value(), nullptr); + EXPECT_EQ(*move_only.Value(), 31); +} + TEST(CoreDiagnostics, ResultEnforcesValueErrorExclusivity) { const fesa::Status ok = fesa::Status::Ok(); EXPECT_TRUE(ok.IsOk()); diff --git a/tests/unit/elements/element_capabilities_test.cpp b/tests/unit/elements/element_capabilities_test.cpp new file mode 100644 index 0000000..585d749 --- /dev/null +++ b/tests/unit/elements/element_capabilities_test.cpp @@ -0,0 +1,413 @@ +#include "fesa/elements/element_capabilities.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "fesa/elements/element_factory.h" +#include "fesa/elements/hex8_element.h" +#include "fesa/elements/nonlinear_mitc4_inertia.h" +#include "fesa/elements/thermal_shell.h" + +namespace { + +void Same(double a, double b) { + EXPECT_EQ(std::memcmp(&a, &b, sizeof(double)), 0); +} +template +void Same(const std::array& a, const std::array& b) { + for (std::size_t i = 0; i < N; ++i) Same(a[i], b[i]); +} +void Same(const fesa::Vector& a, const fesa::Vector& b) { + ASSERT_EQ(a.Size(), b.Size()); + for (std::size_t i = 0; i < a.Size(); ++i) Same(a[i], b[i]); +} +void Same(const fesa::Matrix& a, const fesa::Matrix& b) { + ASSERT_EQ(a.Rows(), b.Rows()); + ASSERT_EQ(a.Columns(), b.Columns()); + for (std::size_t i = 0; i < a.Rows(); ++i) + for (std::size_t j = 0; j < a.Columns(); ++j) Same(a(i, j), b(i, j)); +} +void Same(const fesa::Vector3& a, const fesa::Vector3& b) { + for (std::size_t i = 0; i < 3; ++i) Same(a[i], b[i]); +} +void Same(const fesa::Status& a, const fesa::Status& b) { + EXPECT_EQ(a.Category(), b.Category()); + ASSERT_EQ(a.Diagnostics().size(), b.Diagnostics().size()); + for (std::size_t i = 0; i < a.Diagnostics().size(); ++i) { + const auto& x = a.Diagnostics()[i]; + const auto& y = b.Diagnostics()[i]; + EXPECT_EQ(x.code, y.code); + EXPECT_EQ(x.location.file, y.location.file); + EXPECT_EQ(x.location.line, y.location.line); + EXPECT_EQ(x.keyword, y.keyword); + EXPECT_EQ(x.entity_identity, y.entity_identity); + EXPECT_EQ(x.message, y.message); + } +} +fesa::ElementDofLayout ShellLayout() { + return {{"shell", 9, "0009"}, {7, 2, 9, 4}, + {fesa::DofComponent::kUx, fesa::DofComponent::kUy, + fesa::DofComponent::kUz, fesa::DofComponent::kUrx, + fesa::DofComponent::kUry, fesa::DofComponent::kUrz}}; +} +struct ShellInput { + std::array nodes{{ + {{"shell", 1, "1"}, {-1., -1., 0.}, {"cap.inp", 1}}, + {{"shell", 2, "2"}, {1., -1., 0.}, {"cap.inp", 2}}, + {{"shell", 3, "3"}, {1., 1., 0.}, {"cap.inp", 3}}, + {{"shell", 4, "4"}, {-1., 1., 0.}, {"cap.inp", 4}}}}; + std::array frames{{ + {0, {0., 0., 1.}, {1., 0., 0.}, {0., 1., 0.}}, + {1, {0., 0., 1.}, {1., 0., 0.}, {0., 1., 0.}}, + {2, {0., 0., 1.}, {1., 0., 0.}, {0., 1., 0.}}, + {3, {0., 0., 1.}, {1., 0., 0.}, {0., 1., 0.}}}}; + fesa::ShellSection section{"section", .2, 0, {"cap.inp", 20}}; + fesa::LinearElasticMaterial material{"elastic", 120., .25, {"cap.inp", 21}}; + std::array Pointers() const { + return {&nodes[0], &nodes[1], &nodes[2], &nodes[3]}; + } +}; +fesa::NonlinearMitc4TrialDofs Trial() { + fesa::NonlinearMitc4TrialDofs trial{}; + for (std::size_t i = 0; i < 4; ++i) { + const double n = static_cast(i + 1); + trial.displacement[i] = {.001 * n, -.002 * n, .0005 * n}; + trial.rotation_vector[i] = {.01 * n, -.005 * n, .002 * n}; + } + return trial; +} +void Same(const fesa::NonlinearMitc4Recovery& a, + const fesa::NonlinearMitc4Recovery& b) { + Same(a.physical_strain_energy, b.physical_strain_energy); + for (std::size_t g = 0; g < 4; ++g) { + const auto& x = a.gauss_points[g]; + const auto& y = b.gauss_points[g]; + EXPECT_EQ(x.location, y.location); + for (std::size_t i = 0; i < 2; ++i) + Same(x.natural_coordinates[i], y.natural_coordinates[i]); + for (std::size_t i = 0; i < 8; ++i) { + Same(x.generalized_strain[i], y.generalized_strain[i]); + Same(x.section_resultant[i], y.section_resultant[i]); + } + Same(x.local_frame.e1, y.local_frame.e1); + Same(x.local_frame.e2, y.local_frame.e2); + Same(x.local_frame.e3, y.local_frame.e3); + for (std::size_t s = 0; s < 3; ++s) + for (std::size_t i = 0; i < x.stress[s].components.size(); ++i) + Same(x.stress[s].components[i], y.stress[s].components[i]); + } +} + +TEST(ElementCapabilities, ShellTrialPreservesCompleteDirectionalResponseAndFailure) { + ShellInput input; + auto made = fesa::NonlinearMitc4Shell::Create( + input.Pointers(), input.frames, input.section, input.material); + ASSERT_TRUE(made.HasValue()); + auto kernel = std::make_unique(std::move(made.Value())); + std::unique_ptr capability = + std::make_unique(ShellLayout(), *kernel); + const auto trial = Trial(); + fesa::Vector direction{24}; + for (std::size_t i = 0; i < 24; ++i) direction[i] = .003 * (i + 1); + const auto saved_direction = direction; + const auto direct = fesa::EvaluateInternalResidualAndTangent(*kernel, trial, &direction); + const auto via = capability->EvaluateTrial(trial, &direction); + ASSERT_TRUE(direct.HasValue()); + ASSERT_TRUE(via.HasValue()); + const auto& a = direct.Value(); + const auto& b = via.Value(); + Same(a.internal_residual, b.internal_residual); + Same(a.internal_tangent, b.internal_tangent); + Same(a.internal_force, b.internal_force); + Same(a.recovery, b.recovery); + Same(a.physical_strain_energy, b.physical_strain_energy); + Same(a.physical_force, b.physical_force); + Same(a.drilling_force, b.drilling_force); + Same(a.drilling_tangent, b.drilling_tangent); + Same(a.drilling_metric, b.drilling_metric); + Same(a.drilling_energy, b.drilling_energy); + Same(a.force_directional_second, b.force_directional_second); + Same(a.drilling_constraint, b.drilling_constraint); + Same(a.drilling_constraint_gradient, b.drilling_constraint_gradient); + for (std::size_t n = 0; n < 4; ++n) { + Same(a.drilling_constraint_hessian[n], b.drilling_constraint_hessian[n]); + Same(a.drilling_constraint_third_directional_gradient[n], + b.drilling_constraint_third_directional_gradient[n]); + } + Same(direction, saved_direction); + EXPECT_EQ(capability->DofLayout().node_indices, ShellLayout().node_indices); + EXPECT_EQ(capability->DofLayout().components_per_node, ShellLayout().components_per_node); + auto invalid = trial; + invalid.rotation_vector[2] = {std::numeric_limits::quiet_NaN(), 0., 0.}; + const auto failed_direct = fesa::EvaluateInternalResidualAndTangent(*kernel, invalid); + const auto failed_via = capability->EvaluateTrial(invalid); + ASSERT_FALSE(failed_direct.HasValue()); + ASSERT_FALSE(failed_via.HasValue()); + Same(failed_direct.GetStatus(), failed_via.GetStatus()); + const auto again = capability->EvaluateTrial(trial, &direction); + ASSERT_TRUE(again.HasValue()); + Same(again.Value().internal_force, a.internal_force); +} + +TEST(ElementCapabilities, ShellExternalConstraintRetainsEveryVariation) { + ShellInput input; + const auto kernel = fesa::NonlinearMitc4Shell::Create( + input.Pointers(), input.frames, input.section, input.material); + ASSERT_TRUE(kernel.HasValue()); + fesa::Mitc4TrialAdapter adapter{ShellLayout(), kernel.Value()}; + const fesa::ShellTrialElement& capability = adapter; + const fesa::Vector3 phi{.12, -.23, .07}, rate{.31, .02, -.17}; + const fesa::Vector3 force{1., -2., 3.}, force_rate{.2, .7, -.4}, acceleration{.1, -.3, .9}; + const auto direct = kernel.Value().EvaluateExternalDrillingConstraint( + 2, phi, rate, force, force_rate, acceleration); + const auto via = capability.EvaluateExternalDrillingConstraint( + 2, phi, rate, force, force_rate, acceleration); + ASSERT_TRUE(direct.HasValue()); + ASSERT_TRUE(via.HasValue()); + const auto& a = direct.Value(); + const auto& b = via.Value(); + Same(a.value, b.value); + Same(a.gradient, b.gradient); + Same(a.hessian, b.hessian); + Same(a.directional_first, b.directional_first); + Same(a.directional_second, b.directional_second); + Same(a.gradient_directional_first, b.gradient_directional_first); + Same(a.gradient_directional_second, b.gradient_directional_second); + const auto failed_direct = kernel.Value().EvaluateExternalDrillingConstraint( + 4, phi, rate, force, force_rate, acceleration); + const auto failed_via = capability.EvaluateExternalDrillingConstraint( + 4, phi, rate, force, force_rate, acceleration); + ASSERT_FALSE(failed_direct.HasValue()); + ASSERT_FALSE(failed_via.HasValue()); + Same(failed_direct.GetStatus(), failed_via.GetStatus()); +} + +TEST(ElementCapabilities, ShellInertiaRetainsCompletePhysicalResponse) { + ShellInput input; + const auto kernel = fesa::NonlinearMitc4Inertia::Create( + input.Pointers(), input.frames, input.section, input.material, 2.); + ASSERT_TRUE(kernel.HasValue()); + std::unique_ptr capability = + std::make_unique(ShellLayout(), kernel.Value()); + const auto trial = Trial(); + fesa::Vector v{24}, acceleration{24}; + for (std::size_t i = 0; i < 24; ++i) { + v[i] = .013 * (i + 1); + acceleration[i] = -.007 * (i + 1); + } + const auto saved_v = v, saved_acceleration = acceleration; + const auto direct = kernel.Value().Evaluate(trial, v, acceleration); + const auto via = capability->Evaluate(trial, v, acceleration); + ASSERT_TRUE(direct.HasValue()); + ASSERT_TRUE(via.HasValue()); + const auto& a = direct.Value(); + const auto& b = via.Value(); + Same(a.mass, b.mass); + Same(a.position_tangent, b.position_tangent); + Same(a.velocity_tangent, b.velocity_tangent); + Same(a.force, b.force); + Same(a.convective_force, b.convective_force); + Same(a.kinetic_energy, b.kinetic_energy); + Same(a.momentum, b.momentum); + Same(a.angular_momentum, b.angular_momentum); + Same(a.momentum_rate, b.momentum_rate); + Same(a.angular_momentum_rate, b.angular_momentum_rate); + Same(a.momentum_rate_scale, b.momentum_rate_scale); + Same(a.angular_momentum_rate_scale, b.angular_momentum_rate_scale); + Same(v, saved_v); + Same(acceleration, saved_acceleration); + const auto failed_direct = kernel.Value().Evaluate(trial, fesa::Vector{23}, acceleration); + const auto failed_via = capability->Evaluate(trial, fesa::Vector{23}, acceleration); + ASSERT_FALSE(failed_direct.HasValue()); + ASSERT_FALSE(failed_via.HasValue()); + Same(failed_direct.GetStatus(), failed_via.GetStatus()); +} + +TEST(ElementCapabilities, ThermalPreservesStationLayoutIntervalsAndAllTraces) { + const std::array x{{{0., 0., 0.}, {1., 0., 0.}, + {1., 1., 0.}, {0., 1., 0.}}}; + const auto kernel = fesa::ThermalShell::Create( + {"thermal", 19, "0019"}, {7, 2, 9, 4}, x, 2., 3., 4., .5); + ASSERT_TRUE(kernel.HasValue()); + std::unique_ptr capability = + std::make_unique(kernel.Value()); + EXPECT_EQ(capability->DofLayout().source_id.source_label_text, "0019"); + EXPECT_EQ(capability->DofLayout().node_indices, kernel.Value().NodeIndices()); + for (std::size_t i = 0; i < 5; ++i) + EXPECT_EQ(static_cast(capability->DofLayout().components[i]), 11 + i); + EXPECT_EQ(&capability->Conductivity(), &kernel.Value().Conductivity()); + EXPECT_EQ(&capability->Capacity(), &kernel.Value().Capacity()); + EXPECT_EQ(&capability->ConductivityError(), &kernel.Value().ConductivityError()); + EXPECT_EQ(&capability->CapacityError(), &kernel.Value().CapacityError()); + std::array temperature{}; + for (std::size_t i = 0; i < 20; ++i) temperature[i] = static_cast(i * i); + const auto saved = temperature; + const auto direct = kernel.Value().Recover(temperature); + const auto via = capability->Recover(temperature); + ASSERT_TRUE(direct.HasValue()); + ASSERT_TRUE(via.HasValue()); + for (std::size_t i = 0; i < 24; ++i) + Same(direct.Value().global_flux[i], via.Value().global_flux[i]); + for (std::size_t p = 0; p < 4; ++p) + for (std::size_t i = 0; i < 3; ++i) + Same(direct.Value().frames[p][i], via.Value().frames[p][i]); + EXPECT_EQ(temperature, saved); + temperature[9] = std::numeric_limits::infinity(); + const auto failed_direct = kernel.Value().Recover(temperature); + const auto failed_via = capability->Recover(temperature); + ASSERT_FALSE(failed_direct.HasValue()); + ASSERT_FALSE(failed_via.HasValue()); + Same(failed_direct.GetStatus(), failed_via.GetStatus()); +} + +fesa::Result Solid() { + const fesa::Hex8Element::Coordinates x{{ + {-1., -1., -1.}, {1., -1., -1.}, {1., 1., -1.}, {-1., 1., -1.}, + {-1., -1., 1.}, {1., -1., 1.}, {1., 1., 1.}, {-1., 1., 1.}}}; + return fesa::Hex8Element::Create( + 3, {{"solid", 42, "0042"}, {7, 2, 9, 4, 8, 3, 10, 5}, + {fesa::DofComponent::kUx, fesa::DofComponent::kUy, + fesa::DofComponent::kUz}}, + x, fesa::LinearElasticMaterial{"elastic", 120., .25, {}}, 2.); +} +void Same(const fesa::Hex8Response& a, const fesa::Hex8Response& b) { + Same(a.internal_force, b.internal_force); + Same(a.material_tangent, b.material_tangent); + Same(a.geometric_tangent, b.geometric_tangent); + Same(a.tangent, b.tangent); + Same(a.strain_energy, b.strain_energy); + for (std::size_t i = 0; i < 8; ++i) { + const auto& x = a.points[i]; + const auto& y = b.points[i]; + EXPECT_EQ(x.element, y.element); + EXPECT_EQ(x.integration_point, y.integration_point); + Same(x.natural_coordinates, y.natural_coordinates); + Same(x.reference_coordinates, y.reference_coordinates); + Same(x.strain, y.strain); + Same(x.cauchy_stress, y.cauchy_stress); + } +} + +TEST(ElementCapabilities, SolidRetainsLinearNonlinearAndPairedResponses) { + auto made = Solid(); + ASSERT_TRUE(made.HasValue()); + const auto& kernel = made.Value(); + const fesa::Hex8TrialAdapter adapter{kernel}; + const fesa::SolidTrialElement& capability = adapter; + const fesa::Element& base = capability; + EXPECT_EQ(&base.DofLayout(), &kernel.DofLayout()); + fesa::Vector u{24}, low{24}; + for (std::size_t i = 0; i < 24; ++i) { + u[i] = .001 * static_cast(i + 1); + low[i] = 1e-20 * static_cast(i + 1); + } + const auto saved_u = u, saved_low = low; + const auto linear = kernel.EvaluateLinear(u); + const auto via_linear = capability.EvaluateLinear(u); + const auto nonlinear = kernel.EvaluateNonlinear(u); + const auto via_nonlinear = capability.EvaluateNonlinear(u); + ASSERT_TRUE(linear.HasValue()); + ASSERT_TRUE(via_linear.HasValue()); + ASSERT_TRUE(nonlinear.HasValue()); + ASSERT_TRUE(via_nonlinear.HasValue()); + Same(linear.Value(), via_linear.Value()); + Same(nonlinear.Value(), via_nonlinear.Value()); + for (const bool nonlinear_path : {false, true}) { + const auto direct = nonlinear_path ? kernel.EvaluateNonlinearHighLow(u, low) + : kernel.EvaluateLinearHighLow(u, low); + const auto via = nonlinear_path ? capability.EvaluateNonlinearHighLow(u, low) + : capability.EvaluateLinearHighLow(u, low); + ASSERT_TRUE(direct.HasValue()); + ASSERT_TRUE(via.HasValue()); + Same(direct.Value().high, via.Value().high); + Same(direct.Value().internal_force_low, via.Value().internal_force_low); + Same(direct.Value().tangent_low, via.Value().tangent_low); + Same(direct.Value().strain_energy_low, via.Value().strain_energy_low); + } + const auto k = kernel.ComputeStiffness(), via_k = base.ComputeStiffness(); + const auto m = kernel.ComputeMass(), via_m = capability.ComputeMass(); + ASSERT_TRUE(k.HasValue()); + ASSERT_TRUE(via_k.HasValue()); + ASSERT_TRUE(m.HasValue()); + ASSERT_TRUE(via_m.HasValue()); + Same(k.Value().values, via_k.Value().values); + Same(m.Value().values, via_m.Value().values); + Same(kernel.ReferenceWeights(), capability.ReferenceWeights()); + const auto recovered = base.Recover(u), direct_recovered = kernel.Recover(u); + ASSERT_TRUE(recovered.HasValue()); + ASSERT_TRUE(direct_recovered.HasValue()); + EXPECT_EQ(recovered.Value().source_id.source_label_text, "0042"); + const auto& rows = std::get(recovered.Value().payload); + const auto& direct_rows = std::get(direct_recovered.Value().payload); + ASSERT_EQ(rows.rows.size(), direct_rows.rows.size()); + for (std::size_t i = 0; i < rows.rows.size(); ++i) { + EXPECT_EQ(rows.rows[i].element, direct_rows.rows[i].element); + EXPECT_EQ(rows.rows[i].integration_point, direct_rows.rows[i].integration_point); + Same(rows.rows[i].cauchy_stress, direct_rows.rows[i].cauchy_stress); + Same(rows.rows[i].strain, direct_rows.rows[i].strain); + } + Same(u, saved_u); + Same(low, saved_low); + const auto failed = capability.EvaluateNonlinear(fesa::Vector{23}); + const auto direct_failed = kernel.EvaluateNonlinear(fesa::Vector{23}); + ASSERT_FALSE(failed.HasValue()); + ASSERT_FALSE(direct_failed.HasValue()); + Same(failed.GetStatus(), direct_failed.GetStatus()); + const auto paired_failed = capability.EvaluateNonlinearHighLow(u, fesa::Vector{23}); + const auto direct_paired_failed = kernel.EvaluateNonlinearHighLow(u, fesa::Vector{23}); + ASSERT_FALSE(paired_failed.HasValue()); + ASSERT_FALSE(direct_paired_failed.HasValue()); + Same(paired_failed.GetStatus(), direct_paired_failed.GetStatus()); + const auto again = capability.EvaluateNonlinear(u); + ASSERT_TRUE(again.HasValue()); + Same(again.Value(), nonlinear.Value()); +} + +TEST(ElementCapabilities, BoundViewsSurviveOwnerVectorMovesAndRejectOtherFamilies) { + static_assert(std::has_virtual_destructor_v); + static_assert(std::has_virtual_destructor_v); + static_assert(std::has_virtual_destructor_v); + static_assert(std::has_virtual_destructor_v); + static_assert(std::has_virtual_destructor_v); + auto made = Solid(); + ASSERT_TRUE(made.HasValue()); + std::vector> owners; + owners.push_back(std::make_unique(std::move(made.Value()))); + const auto* original = owners[0].get(); + const fesa::ElementFactory factory; + auto capability = factory.BindSolidTrial(*original); + ASSERT_NE(capability, nullptr); + EXPECT_EQ(factory.BindShellReference(*original), nullptr); + // Reallocation moves unique_ptr owners, never the kernels they own. + owners.reserve(32); + auto transferred = std::move(owners); + EXPECT_EQ(transferred[0].get(), original); + EXPECT_EQ(&capability->DofLayout(), &original->DofLayout()); + const auto evaluated = capability->EvaluateLinear(fesa::Vector{24}); + ASSERT_TRUE(evaluated.HasValue()); + capability.reset(); // Destruction through the role must not delete its kernel. + const auto recovered = original->Recover(fesa::Vector{24}); + ASSERT_TRUE(recovered.HasValue()); + ShellInput input; + auto shell = fesa::Mitc4Shell::Create( + input.Pointers(), {{{0., 0., 1.}, {0., 0., 1.}, {0., 0., 1.}, {0., 0., 1.}}}, + input.section, input.material); + ASSERT_TRUE(shell.HasValue()); + EXPECT_EQ(factory.BindSolidTrial(shell.Value()), nullptr); + auto reference = factory.BindShellReference(shell.Value()); + ASSERT_NE(reference, nullptr); + EXPECT_EQ(&reference->DofLayout(), &shell.Value().DofLayout()); + const auto direct_k = shell.Value().Stiffness(); + const auto via_k = reference->Stiffness(); + ASSERT_TRUE(direct_k.HasValue()); + ASSERT_TRUE(via_k.HasValue()); + Same(direct_k.Value().stabilized_global24, via_k.Value().stabilized_global24); +} + +} // namespace diff --git a/tests/unit/elements/finite_rotation_test.cpp b/tests/unit/elements/finite_rotation_test.cpp index 913ec79..e8b2144 100644 --- a/tests/unit/elements/finite_rotation_test.cpp +++ b/tests/unit/elements/finite_rotation_test.cpp @@ -161,6 +161,28 @@ TEST(FiniteRotation, RejectsCoordinatesInsidePrincipalBranchMargin) { "invalid-accepted-state"); } +TEST(FiniteRotation, SpatialMomentSolvePreservesKnownLoadAndVirtualWork) { + const Vector3 moment{2.0, -3.0, 4.0}; + const Vector3 variation{0.3, -0.5, 0.7}; + const double pi = std::acos(-1.0); + for (const double angle : {0.0, 1e-9, 0.7, pi - 1e-6}) { + const double a = angle == 0.0 ? 1.0 : std::sin(angle) / angle; + const double b = angle < 1e-8 ? angle / 2.0 : + (1.0 - std::cos(angle)) / angle; + // Independent z-axis J^T*m; the axial component is unchanged. + const Vector3 generalized{a * moment.X() + b * moment.Y(), + -b * moment.X() + a * moment.Y(), moment.Z()}; + const auto solved = SpatialMomentSO3(Vector3{0, 0, angle}, generalized); + ASSERT_TRUE(solved.HasValue()); + ExpectVectorNear(solved.Value(), moment, 1e-11); + const Vector3 spatial_variation{a * variation.X() - b * variation.Y(), + b * variation.X() + a * variation.Y(), + variation.Z()}; + EXPECT_NEAR(generalized.Dot(variation), + solved.Value().Dot(spatial_variation), 1e-11); + } +} + TEST(FiniteRotation, JacobiansAreFiniteInverseTransposeAndDerivativeConsistent) { const double pi = std::acos(-1.0); @@ -172,19 +194,29 @@ TEST(FiniteRotation, for (const Vector3& phi : rotations) { const Matrix left_jacobian = LeftJacobianSO3(phi); - const Matrix inverse_transpose = InverseTransposeLeftJacobianSO3(phi); EXPECT_TRUE(IsFinite(left_jacobian)); - EXPECT_TRUE(IsFinite(inverse_transpose)); - const Matrix identity = - Transpose(left_jacobian).Multiply(inverse_transpose); - for (std::size_t row = 0U; row < kRotationDimension; ++row) { - for (std::size_t column = 0U; column < kRotationDimension; ++column) { - EXPECT_NEAR(identity(row, column), row == column ? 1.0 : 0.0, - 1.0e-11); - } + // Preserve the original complete inverse-action check through the solve API. + for (std::size_t column = 0; column < kRotationDimension; ++column) { + const Vector3 basis{column == 0 ? 1.0 : 0.0, + column == 1 ? 1.0 : 0.0, + column == 2 ? 1.0 : 0.0}; + const auto solved = SpatialMomentSO3(phi, basis); + ASSERT_TRUE(solved.HasValue()); + EXPECT_TRUE(std::isfinite(solved.Value().X())); + EXPECT_TRUE(std::isfinite(solved.Value().Y())); + EXPECT_TRUE(std::isfinite(solved.Value().Z())); + const auto identity_column = Multiply(Transpose(left_jacobian), solved.Value()); + for (std::size_t row = 0; row < kRotationDimension; ++row) + EXPECT_NEAR(identity_column[row], row == column ? 1.0 : 0.0, 1.0e-11); } + const Vector3 load{0.7, -0.2, 0.4}; + const auto spatial = SpatialMomentSO3(phi, load); + ASSERT_TRUE(spatial.HasValue()); + ExpectVectorNear(Multiply(Transpose(left_jacobian), spatial.Value()), + load, 1e-11); + const Vector3 director = Multiply(ExpSkew(phi), Vector3{0.0, 0.0, 1.0}); const Vector3 positive = Multiply(ExpSkew(phi + perturbation * direction), diff --git a/tests/unit/elements/hex8_element_test.cpp b/tests/unit/elements/hex8_element_test.cpp index 7c055af..83d2150 100644 --- a/tests/unit/elements/hex8_element_test.cpp +++ b/tests/unit/elements/hex8_element_test.cpp @@ -811,36 +811,6 @@ TEST(Hex8Element, FiniteInputsThatOverflowDerivedArithmeticFailClosed) { std::string::npos); } -TEST(Hex8Element, BackendOperandRejectionRetainsOriginalStiffnessDiagnostic) { - Coordinates coordinates{}; - for (std::size_t a = 0; a < 8; ++a) - for (std::size_t i = 0; i < 3; ++i) - coordinates[a][i] = 0.01 * kSigns[a][i]; - // Original native probe: finite moduli/volume, but mu*gradient overflows. - // The failed diagnostic candidate must not become a scalar success fallback. - const auto element = Make(coordinates, 1e308, -0.5); - ASSERT_FALSE(element.HasValue()); - EXPECT_EQ(element.GetStatus().Diagnostics()[0].code, "invalid-hex8"); - EXPECT_EQ(element.GetStatus().Diagnostics()[0].message, - "Hex8 reference stiffness is nonfinite."); -} - -TEST(Hex8Element, TensorFailureRetainsPriorityOverEnergyAndTangentOverflow) { - Coordinates coordinates{}; - for (std::size_t a = 0; a < 8; ++a) - for (std::size_t i = 0; i < 3; ++i) - coordinates[a][i] = 0.01 * kSigns[a][i]; - const auto element = Make(coordinates, 1e200, -0.5); - ASSERT_TRUE(element.HasValue()); - const auto displacement = Affine(coordinates, - Tensor{{{1e100, 0, 0}, {0, 1e100, 0}, {0, 0, 1e100}}}); - const auto response = element.Value().EvaluateNonlinear(displacement); - ASSERT_FALSE(response.HasValue()); - EXPECT_EQ(response.GetStatus().Diagnostics()[0].code, "invalid-hex8"); - EXPECT_EQ(response.GetStatus().Diagnostics()[0].message, - "Hex8 trial tensor is nonfinite."); -} - // Independent Gauss-Legendre abscissae from polynomial root iteration. This // test does not call the kernel's shapes, Jacobian, inverse or quadrature. std::vector> LegendreRule(unsigned count) { @@ -1210,4 +1180,47 @@ TEST(Hex8Element, MeanVolumeWarpedLowOnlyStateRetainsWeightedCubicEnergy) { EXPECT_NEAR(actual_cubic.high, cubic * c * c * c, 1e-11 * c * c * c); EXPECT_NE(actual_cubic.high, 0); } +TEST(Hex8Element, BackendOperandRejectionRetainsOriginalStiffnessDiagnostic) { + Coordinates coordinates{}; + for (std::size_t a = 0; a < 8; ++a) + for (std::size_t i = 0; i < 3; ++i) + coordinates[a][i] = 0.01 * kSigns[a][i]; + // Original native probe: finite moduli/volume, but mu*gradient overflows. + // The failed diagnostic candidate must not become a scalar success fallback. + const auto element = Make(coordinates, 1e308, -0.5); + ASSERT_FALSE(element.HasValue()); + EXPECT_EQ(element.GetStatus().Diagnostics()[0].code, "invalid-hex8"); + EXPECT_EQ(element.GetStatus().Diagnostics()[0].message, + "Hex8 reference stiffness is nonfinite."); +} + +TEST(Hex8Element, TensorFailureRetainsPriorityOverEnergyAndTangentOverflow) { + Coordinates coordinates{}; + for (std::size_t a = 0; a < 8; ++a) + for (std::size_t i = 0; i < 3; ++i) + coordinates[a][i] = 0.01 * kSigns[a][i]; + const auto element = Make(coordinates, 1e200, -0.5); + ASSERT_TRUE(element.HasValue()); + const auto displacement = Affine(coordinates, + Tensor{{{1e100, 0, 0}, {0, 1e100, 0}, {0, 0, 1e100}}}); + const auto response = element.Value().EvaluateNonlinear(displacement); + ASSERT_FALSE(response.HasValue()); + EXPECT_EQ(response.GetStatus().Diagnostics()[0].code, "invalid-hex8"); + EXPECT_EQ(response.GetStatus().Diagnostics()[0].message, + "Hex8 trial tensor is nonfinite."); +} } // namespace + +TEST(Hex8Element, RejectsNonfiniteCanonicalJacobianActionBeforeFiniteGradients) { + auto coordinates = Brick(); + for (std::size_t a = 0; a < 8U; ++a) { + coordinates[a][0] = kSigns[a][0] * std::ldexp(1.0, -1025); + coordinates[a][1] = static_cast(kSigns[a][1]); + coordinates[a][2] = static_cast(kSigns[a][2]); + } + const auto rejected = Make(coordinates); + ASSERT_FALSE(rejected.HasValue()); + ASSERT_EQ(rejected.GetStatus().Diagnostics().size(), 1U); + EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].message, + "Reference Jacobian inverse is nonfinite."); +} diff --git a/tests/unit/elements/hex8_high_low_test.cpp b/tests/unit/elements/hex8_high_low_test.cpp index d1df9e7..7a44f06 100644 --- a/tests/unit/elements/hex8_high_low_test.cpp +++ b/tests/unit/elements/hex8_high_low_test.cpp @@ -19,7 +19,6 @@ #include "fesa/materials/isotropic_linear_elastic_material.h" #include "../../../src/fesa/math/high_low_arithmetic.h" #include "../../../src/fesa/elements/hex8_geometry.h" -#include "../../../src/fesa/elements/hex8_pair_arithmetic.h" #include "../../../src/fesa/elements/hex8_pair_simd.h" #include "../math/high_low_arithmetic_original.h" @@ -34,12 +33,12 @@ std::uint64_t PairBits(double value) { } void ExpectOriginalProduct(HighLow left, HighLow right) { - const auto actual = fesa::hex8_internal::MultiplyPair(left, right); + const auto actual = fesa::math_internal::Multiply(left, right); const auto expected = fesa::high_low_original::Multiply( {left.high, left.low}, {right.high, right.low}); EXPECT_EQ(PairBits(actual.high), PairBits(expected.high)); EXPECT_EQ(PairBits(actual.low), PairBits(expected.low)); - const auto actual_sum = fesa::hex8_internal::AddPair(left, right); + const auto actual_sum = fesa::math_internal::Add(left, right); const auto expected_sum = fesa::high_low_original::Add( {left.high, left.low}, {right.high, right.low}); EXPECT_EQ(PairBits(actual_sum.high), PairBits(expected_sum.high)); @@ -525,13 +524,13 @@ void ExpectGeometryPacketBitsAndFlags( if (original_order) { HighLow dot; for (std::size_t i = 0; i < 3; ++i) - dot = fesa::hex8_internal::AddPair(dot, - fesa::hex8_internal::MultiplyPair(current_pair(input.gradient_a[i]), + dot = fesa::math_internal::Add(dot, + fesa::math_internal::Multiply(current_pair(input.gradient_a[i]), current_pair(input.gradient_b[i].values[lane]))); for (std::size_t j = 0; j < 3; ++j) for (std::size_t l = 0; l < 3; ++l) - geo = fesa::hex8_internal::AddPair(geo, - fesa::hex8_internal::MultiplyPair( + geo = fesa::math_internal::Add(geo, + fesa::math_internal::Multiply( current_pair(input.gradient_stress[j][l]), current_pair(input.gradient_b[l].values[lane]))); value.output.gradient_dot.values[lane] = {dot.high, dot.low}; @@ -540,12 +539,12 @@ void ExpectGeometryPacketBitsAndFlags( {static_cast(lane + 1), std::ldexp(1.0, -54)}, {-1, -0.0}}; for (std::size_t component = 0; component < 3; ++component) { const auto weighted = original_order - ? fesa::hex8_internal::MultiplyPair(geo, current_pair(input.weight)) + ? fesa::math_internal::Multiply(geo, current_pair(input.weight)) : current_pair(value.output.weighted_geometric.values[lane]); if (original_order) value.output.weighted_geometric.values[lane] = {weighted.high, weighted.low}; - const auto accumulated = fesa::hex8_internal::AddPair( + const auto accumulated = fesa::math_internal::Add( accumulators[component], weighted); value.accumulators[component].values[lane] = {accumulated.high, accumulated.low}; @@ -787,9 +786,7 @@ TEST(Hex8HighLow, PacketScalarBridgesPreserveOriginalRawBits) { EXPECT_EQ(PairBits(result.values[lane].low), PairBits(expected.low)); } }; - fesa::hex8_internal::ScalarPacketAdd(a, b, false, &result); - expect(fesa::high_low_original::Add(x, y)); - fesa::hex8_internal::ScalarPacketAdd(a, b, true, &result); + fesa::hex8_internal::ScalarPacketAdd(a, b, &result); expect(fesa::high_low_original::Add(x, y)); fesa::hex8_internal::ScalarPacketMultiply(a, b, &result); expect(fesa::high_low_original::Multiply(x, y)); diff --git a/tests/unit/elements/mitc4_shell_test.cpp b/tests/unit/elements/mitc4_shell_test.cpp index d90edc2..0cc2d9c 100644 --- a/tests/unit/elements/mitc4_shell_test.cpp +++ b/tests/unit/elements/mitc4_shell_test.cpp @@ -1173,3 +1173,16 @@ TEST(Mitc4ShellPhysicalRecovery, } EXPECT_NEAR(recovery.strain_energy, 72.16, 1.0e-12); } + +TEST(Mitc4ShellKinematics, RetainsReciprocalDeterminantOverflowGateAtTinyScale) { + const std::array nodes{ + Node(0, {0.0, 0.0, 0.0}), Node(1, {2e-104, 0.0, 0.0}), + Node(2, {2e-104, 2e-104, 0.0}), Node(3, {0.0, 2e-104, 0.0})}; + EXPECT_TRUE(fesa::Mitc4Shell::Create( + NodePointers(nodes), Directors(), Section(2e-99), Material()).HasValue()); + const auto rejected = fesa::Mitc4Shell::Create( + NodePointers(nodes), Directors(), Section(2e-102), Material()); + ASSERT_FALSE(rejected.HasValue()); + EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, + "invalid-shell-jacobian"); +} diff --git a/tests/unit/elements/nonlinear_mitc4_inertia_test.cpp b/tests/unit/elements/nonlinear_mitc4_inertia_test.cpp index 6257951..79f5761 100644 --- a/tests/unit/elements/nonlinear_mitc4_inertia_test.cpp +++ b/tests/unit/elements/nonlinear_mitc4_inertia_test.cpp @@ -494,25 +494,17 @@ TEST(DynamicRotation, InverseIdentityAndCurrentAnalyticNullAtFiniteRotation) { for (const V3 phi : {V3{0.5, 0.0, 0.0}, V3{0.2, -0.3, 0.1}}) { const auto rotation = fesa::ExpSkew(phi); const auto jacobian = fesa::LeftJacobianSO3(phi); - const auto inverse_transpose = fesa::InverseTransposeLeftJacobianSO3(phi); for (std::size_t column = 0; column < 3; ++column) { // R^T e_j is a unit initial director; its current director is e_j. const V3 initial{rotation(column, 0), rotation(column, 1), rotation(column, 2)}; const auto value = fesa::EvaluateDynamicRotation(phi, initial, {}, {}); ASSERT_TRUE(value.HasValue()); - const V3 inverse_column{inverse_transpose(column, 0), - inverse_transpose(column, 1), - inverse_transpose(column, 2)}; - EXPECT_LE( - (value.Value().drill_null - inverse_column / inverse_column.Norm()) - .Norm(), - 1.0e-12); - const V3 identity_column = - Multiply(jacobian, value.Value().drill_null) * inverse_column.Norm(); - for (std::size_t row = 0; row < 3; ++row) { - EXPECT_NEAR(identity_column[row], row == column ? 1.0 : 0.0, 1.0e-12); - } + const V3 mapped = Multiply(jacobian, value.Value().drill_null); + EXPECT_GT(mapped[column], 0.0); + EXPECT_NEAR(value.Value().drill_null.Norm(), 1.0, 1e-12); + for (std::size_t row = 0; row < 3; ++row) + if (row != column) EXPECT_NEAR(mapped[row], 0.0, 1e-12); } } for (const Fixture fixture : {Fixture{}, Warped()}) { diff --git a/tests/unit/fem/dof_manager_test.cpp b/tests/unit/fem/dof_manager_test.cpp index c93823c..0a95cce 100644 --- a/tests/unit/fem/dof_manager_test.cpp +++ b/tests/unit/fem/dof_manager_test.cpp @@ -14,6 +14,9 @@ #include #include +#include "fesa/analysis/analysis_model.h" +#include "fesa/elements/element.h" + namespace fesa { class DofManagerTestAccess { diff --git a/tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp b/tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp index 1a3ea6b..92ce68a 100644 --- a/tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp +++ b/tests/unit/io/hdf5/solid_hdf5_results_writer_test.cpp @@ -26,6 +26,9 @@ #include "io/hdf5/hdf5_primitives.h" #include "io/hdf5/solid_hdf5_self_check.h" #include "solid_output_test_fixture.h" +#include "fesa/analysis/solid_hht_dynamic_procedure.h" +#include "fesa/analysis/solid_static_procedure.h" + namespace { using namespace fesa; using namespace fesa::hdf5_internal; diff --git a/tests/unit/math/dense_blas_internal_test.cpp b/tests/unit/math/dense_blas_internal_test.cpp index 7ddfb66..fa67569 100644 --- a/tests/unit/math/dense_blas_internal_test.cpp +++ b/tests/unit/math/dense_blas_internal_test.cpp @@ -1,4 +1,5 @@ #include "math/dense_blas_internal.h" +#include "math/jet_linear_solve.h" #include @@ -11,66 +12,445 @@ namespace fesa::dense_blas_internal { namespace { -TEST(DenseBlasInternal, PolicyQueryPreservesDefaultPositiveAndNestedTls) { - const int previous = mkl_set_num_threads_local(0); - struct Restore { - int previous; - ~Restore() { static_cast(mkl_set_num_threads_local(previous)); } - } restore{previous}; - const int global = mkl_get_max_threads(); - const int domain = mkl_domain_get_max_threads(MKL_DOMAIN_BLAS); - const int dynamic = mkl_get_dynamic(); - for (int repeat = 0; repeat < 2; ++repeat) { - const auto policy = ReadScopedLocalDensePolicy(); - EXPECT_EQ(policy.blas_max_threads, 1); - EXPECT_EQ(policy.dynamic, dynamic); - EXPECT_EQ(mkl_set_num_threads_local(0), 0); - EXPECT_EQ(mkl_get_max_threads(), global); - EXPECT_EQ(mkl_domain_get_max_threads(MKL_DOMAIN_BLAS), domain); - EXPECT_EQ(mkl_get_dynamic(), dynamic); - } - static_cast(mkl_set_num_threads_local(2)); - EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 2); - EXPECT_EQ(mkl_set_num_threads_local(2), 2); - static_cast(mkl_set_num_threads_local(0)); - try { - const ScopedLocalDenseThreads outer{}; - EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 1); - EXPECT_EQ(mkl_set_num_threads_local(1), 1); - throw std::runtime_error{"policy-query-unwind"}; - } catch (const std::runtime_error&) { - } - EXPECT_EQ(mkl_set_num_threads_local(0), 0); - EXPECT_EQ(mkl_get_dynamic(), dynamic); +// Forms RHS and residuals independently of the production dense adapter. +Matrix FactorRhs(const Matrix& a, const Matrix& x, const bool transpose, + const bool right) { + Matrix b{x.Rows(), x.Columns()}; + for (std::size_t i = 0; i < b.Rows(); ++i) + for (std::size_t j = 0; j < b.Columns(); ++j) + for (std::size_t k = 0; k < a.Rows(); ++k) + b(i, j) += right ? x(i, k) * (transpose ? a(j, k) : a(k, j)) + : (transpose ? a(k, i) : a(i, k)) * x(k, j); + return b; } -TEST(DenseBlasInternal, - OuterProductUsesRectangularStorageAndPreservesRejection) { - const std::array left{2.0, -3.0}; - const std::array right{4.0, -5.0, 0.25}; - std::array product{}; - ASSERT_TRUE(OuterProduct(left.data(), left.size(), right.data(), right.size(), - product.data())); - const std::array expected{8.0, -10.0, 0.5, -12.0, 15.0, -0.75}; - EXPECT_EQ(product, expected); - const auto accepted = product; - const std::array invalid{ - 1.0, std::numeric_limits::quiet_NaN()}; - EXPECT_FALSE(OuterProduct(invalid.data(), invalid.size(), right.data(), - right.size(), product.data())); - EXPECT_EQ(product, accepted); - EXPECT_TRUE(OuterProduct(nullptr, 0U, nullptr, 3U, nullptr)); - EXPECT_TRUE(OuterProduct(nullptr, 2U, nullptr, 0U, nullptr)); - EXPECT_THROW(OuterProduct(nullptr, 2U, right.data(), 3U, product.data()), - std::invalid_argument); - const auto too_large = +void ExpectFactorSolution(const Matrix& a, const Matrix& x, const Matrix& b, + const Matrix& expected, const bool transpose, + const bool right) { + ASSERT_EQ(x.Rows(), expected.Rows()); + ASSERT_EQ(x.Columns(), expected.Columns()); + const auto residual = FactorRhs(a, x, transpose, right); + for (std::size_t i = 0; i < x.Rows(); ++i) + for (std::size_t j = 0; j < x.Columns(); ++j) { + EXPECT_DOUBLE_EQ(x(i, j), expected(i, j)); + EXPECT_DOUBLE_EQ(residual(i, j), b(i, j)); + } +} + +TEST(DenseFactor, LuSolvesRectangularRhsOnBothSidesAndTransposes) { + Matrix a{3U, 3U}; + const double values[]{0, 2, 1, 1, 1, 0, 2, 0, 1}; + for (std::size_t i = 0; i < 9U; ++i) a.Data()[i] = values[i]; + auto factor = DenseFactor::Lu(a); + ASSERT_TRUE(factor.HasValue()); + EXPECT_DOUBLE_EQ(factor.Value().Determinant(), -4.0); + for (const bool right : {false, true}) + for (const bool transpose : {false, true}) { + Matrix expected{right ? 2U : 3U, right ? 3U : 2U}; + for (std::size_t i = 0; i < 6U; ++i) + expected.Data()[i] = static_cast(i) - 2.0; + const auto b = FactorRhs(a, expected, transpose, right); + const auto solved = right ? factor.Value().SolveRight(b, transpose) + : factor.Value().Solve(b, transpose); + ASSERT_TRUE(solved.HasValue()); + ExpectFactorSolution(a, solved.Value(), b, expected, transpose, right); + } +} + +TEST(DenseFactor, CholeskySolvesAndWhiteningRetainsScaleAndOrientation) { + Matrix a{2U, 2U}; + a(0, 0) = 4; + a(0, 1) = 2; + a(1, 0) = 2; + a(1, 1) = 5; + const auto factor = DenseFactor::Cholesky(a); + ASSERT_TRUE(factor.HasValue()); + EXPECT_DOUBLE_EQ(factor.Value().Determinant(), 16.0); + const auto lower = factor.Value().Lower(); + ASSERT_TRUE(lower.HasValue()); + EXPECT_DOUBLE_EQ(lower.Value()(0, 0), 2.0); + EXPECT_DOUBLE_EQ(lower.Value()(0, 1), 0.0); + EXPECT_DOUBLE_EQ(lower.Value()(1, 0), 1.0); + EXPECT_DOUBLE_EQ(lower.Value()(1, 1), 2.0); + for (const bool right : {false, true}) + for (const bool transpose : {false, true}) { + Matrix expected{right ? 3U : 2U, right ? 2U : 3U}; + for (std::size_t i = 0; i < 6U; ++i) + expected.Data()[i] = static_cast(i) - 2.0; + const auto b = FactorRhs(a, expected, transpose, right); + const auto solved = right ? factor.Value().SolveRight(b, transpose) + : factor.Value().Solve(b, transpose); + ASSERT_TRUE(solved.HasValue()); + ExpectFactorSolution(a, solved.Value(), b, expected, transpose, right); + const auto triangular_rhs = + FactorRhs(lower.Value(), expected, transpose, right); + const auto triangular = + right ? factor.Value().SolveLowerRight(triangular_rhs, transpose) + : factor.Value().SolveLower(triangular_rhs, transpose); + ASSERT_TRUE(triangular.HasValue()); + ExpectFactorSolution(lower.Value(), triangular.Value(), triangular_rhs, + expected, transpose, right); + } + // W = I * L^-T / sqrt(4); verify W^T (4*A) W = I without a procedure. + Matrix basis{3U, 2U}; + basis(0, 0) = 0.5; + basis(1, 1) = 0.5; + const auto w = factor.Value().SolveLowerRight(basis, true); + ASSERT_TRUE(w.HasValue()); + for (std::size_t i = 0; i < 2U; ++i) + for (std::size_t j = 0; j < 2U; ++j) { + double gram = 0; + for (std::size_t k = 0; k < 2U; ++k) + for (std::size_t l = 0; l < 2U; ++l) + gram += w.Value()(k, i) * (4 * a(k, l)) * w.Value()(l, j); + EXPECT_DOUBLE_EQ(gram, i == j ? 1.0 : 0.0); + } +} + +TEST(DenseFactor, OwnsSnapshotAndFailedCandidatesPreserveReusableFactor) { + Matrix a{2U, 2U}; + a(0, 0) = 2; + a(1, 1) = 4; + auto factor = DenseFactor::Lu(a); + ASSERT_TRUE(factor.HasValue()); + a(0, 0) = 8; + const auto changed = DenseFactor::Lu(a); + ASSERT_TRUE(changed.HasValue()); + Matrix rhs{2U, 1U, 8}; + const auto old_solution = factor.Value().Solve(rhs); + ASSERT_TRUE(old_solution.HasValue()); + EXPECT_DOUBLE_EQ(old_solution.Value()(0, 0), 4); + EXPECT_DOUBLE_EQ(changed.Value().Solve(rhs).Value()(0, 0), 1); + EXPECT_FALSE(DenseFactor::Lu(Matrix{2U, 2U}).HasValue()); + EXPECT_FALSE(DenseFactor::Cholesky(Matrix{2U, 2U}).HasValue()); + a(0, 0) = -1; + EXPECT_FALSE(DenseFactor::Cholesky(a).HasValue()); + EXPECT_FALSE(DenseFactor::Lu(Matrix{2U, 3U}).HasValue()); + a(0, 0) = (std::numeric_limits::quiet_NaN)(); + EXPECT_FALSE(DenseFactor::Lu(a).HasValue()); + EXPECT_FALSE(DenseFactor::Cholesky(a).HasValue()); + EXPECT_FALSE(factor.Value().Solve(Matrix{3U, 1U}).HasValue()); + EXPECT_FALSE(factor.Value().SolveRight(Matrix{1U, 3U}).HasValue()); + EXPECT_FALSE(factor.Value().SolveLower(rhs).HasValue()); + rhs(0, 0) = (std::numeric_limits::infinity)(); + EXPECT_FALSE(factor.Value().Solve(rhs).HasValue()); + EXPECT_DOUBLE_EQ(old_solution.Value()(0, 0), 4); + rhs(0, 0) = 8; + EXPECT_DOUBLE_EQ(factor.Value().Solve(rhs).Value()(0, 0), 4); + Matrix tiny{1U, 1U, (std::numeric_limits::min)()}; + const auto tiny_factor = DenseFactor::Lu(tiny); + ASSERT_TRUE(tiny_factor.HasValue()); + EXPECT_FALSE(tiny_factor.Value() + .Solve(Matrix{1U, 1U, (std::numeric_limits::max)()}) + .HasValue()); + EXPECT_DOUBLE_EQ(tiny_factor.Value().Solve(tiny).Value()(0, 0), 1); +} + +TEST(DenseFactor, EmptyAndInfinityConditionBoundaryAreExplicit) { + for (const bool positive : {false, true}) { + const auto empty = positive ? DenseFactor::Cholesky(Matrix{0U, 0U}) + : DenseFactor::Lu(Matrix{0U, 0U}); + ASSERT_TRUE(empty.HasValue()); + const auto left = empty.Value().Solve(Matrix{0U, 3U}); + ASSERT_TRUE(left.HasValue()); + EXPECT_EQ(left.Value().Columns(), 3U); + const auto right = empty.Value().SolveRight(Matrix{4U, 0U}); + ASSERT_TRUE(right.HasValue()); + EXPECT_EQ(right.Value().Rows(), 4U); + EXPECT_FALSE(empty.Value().ReciprocalConditionInfinity().HasValue()); + for (const double diagonal : {0x1p-31, 0x1p-32, 0x1p-33}) { + Matrix a{2U, 2U}; + a(0, 0) = 1; + a(1, 1) = diagonal; + const auto factor = + positive ? DenseFactor::Cholesky(a) : DenseFactor::Lu(a); + ASSERT_TRUE(factor.HasValue()); + const auto rcond = factor.Value().ReciprocalConditionInfinity(); + ASSERT_TRUE(rcond.HasValue()); + EXPECT_DOUBLE_EQ(rcond.Value(), diagonal); + EXPECT_EQ(rcond.Value() >= 0x1p-32, diagonal >= 0x1p-32); + EXPECT_EQ(factor.Value().Solve(Matrix{2U, 0U}).Value().Columns(), 0U); + EXPECT_EQ(factor.Value().SolveRight(Matrix{0U, 2U}).Value().Rows(), 0U); + } + } +} + +TEST(DenseFactor, GeneralDimensionAndNonDiagonalConditionUseFullCoefficient) { + Matrix a{8U, 8U}; + a(0, 0) = 4; + for (std::size_t i = 1; i < 8U; ++i) { + a(i, i) = 5; + a(i, i - 1U) = 2; + a(i - 1U, i) = 2; + } + const auto factor = DenseFactor::Cholesky(a); + ASSERT_TRUE(factor.HasValue()); + Matrix expected{8U, 3U}; + for (std::size_t i = 0; i < 24U; ++i) + expected.Data()[i] = static_cast(i) - 8; + const auto rhs = FactorRhs(a, expected, false, false); + const auto solved = factor.Value().Solve(rhs); + ASSERT_TRUE(solved.HasValue()); + ExpectFactorSolution(a, solved.Value(), rhs, expected, false, false); + Matrix general{2U, 2U}; + general(0, 0) = 2; + general(0, 1) = 1; + general(1, 1) = 1; + const auto lu = DenseFactor::Lu(general); + ASSERT_TRUE(lu.HasValue()); + EXPECT_DOUBLE_EQ(lu.Value().ReciprocalConditionInfinity().Value(), 1.0 / 3.0); + EXPECT_FALSE(lu.Value().Lower().HasValue()); + Matrix overflow{2U, 2U, (std::numeric_limits::max)()}; + overflow(1, 0) = -overflow(1, 0); + EXPECT_FALSE(DenseFactor::Lu(overflow).HasValue()); +} + +TEST(DenseBlasInternal, CDup003ConvertsZeroNormalAndOverflowLengths) { + const auto zero = ToMklSize(0U); + ASSERT_TRUE(zero.HasValue()); + EXPECT_EQ(zero.Value(), 0); + + const auto normal = ToMklSize(3U); + ASSERT_TRUE(normal.HasValue()); + EXPECT_EQ(normal.Value(), 3); + + const std::size_t overflow = static_cast((std::numeric_limits::max)()) + 1U; - EXPECT_THROW(OuterProduct(nullptr, too_large, nullptr, 1U, nullptr), - std::length_error); - const auto too_many_elements = - std::numeric_limits::max() / sizeof(double) + 1U; - EXPECT_THROW(OuterProduct(nullptr, too_many_elements, nullptr, 1U, nullptr), - std::length_error); + const auto rejected = ToMklSize(overflow); + EXPECT_FALSE(rejected.HasValue()); + EXPECT_FALSE(rejected.GetStatus().IsOk()); +} + +TEST(DenseBlasInternal, CDup003CopiesZeroAndNonzeroContiguousValues) { + EXPECT_NO_THROW(CopyValues(nullptr, 0U, nullptr)); + + const std::array source{1.25, -2.5, 4.0}; + std::array destination{}; + CopyValues(source.data(), source.size(), destination.data()); + + EXPECT_EQ(destination, source); +} + + +TEST(DenseBlasInternal, TransposeLeftMatchesIndependentRectangularProduct) { + Matrix left{3U, 2U}; + Matrix right{3U, 4U}; + for (std::size_t row = 0; row < 3U; ++row) { + for (std::size_t column = 0; column < 2U; ++column) + left(row, column) = static_cast(1U + row * 2U + column); + for (std::size_t column = 0; column < 4U; ++column) + right(row, column) = static_cast(row + column) - 2.0; + } + const Matrix product = MultiplyTransposeLeft(left, right); + ASSERT_EQ(product.Rows(), 2U); + ASSERT_EQ(product.Columns(), 4U); + for (std::size_t row = 0; row < 2U; ++row) + for (std::size_t column = 0; column < 4U; ++column) { + double expected = 0.0; + for (std::size_t inner = 0; inner < 3U; ++inner) + expected += left(inner, row) * right(inner, column); + EXPECT_DOUBLE_EQ(product(row, column), expected); + } + const auto gram = MultiplyTransposeLeft(left, left); + EXPECT_DOUBLE_EQ(gram(0U, 0U), 35.0); + EXPECT_DOUBLE_EQ(gram(0U, 1U), 44.0); + EXPECT_DOUBLE_EQ(gram(1U, 1U), 56.0); +} + +TEST(DenseBlasInternal, TransposeLeftRetainsEmptyAndFailureContracts) { + const auto zeros = MultiplyTransposeLeft(Matrix{0U, 2U}, Matrix{0U, 3U}); + ASSERT_EQ(zeros.Rows(), 2U); + ASSERT_EQ(zeros.Columns(), 3U); + EXPECT_DOUBLE_EQ(zeros(1U, 2U), 0.0); + const auto empty = MultiplyTransposeLeft( + Matrix{(std::numeric_limits::max)(), 0U}, + Matrix{(std::numeric_limits::max)(), 0U}); + EXPECT_EQ(empty.Rows(), 0U); + EXPECT_EQ(empty.Columns(), 0U); + EXPECT_THROW(static_cast(MultiplyTransposeLeft(Matrix{1U, 2U}, + Matrix{2U, 1U})), + std::invalid_argument); + EXPECT_THROW(static_cast(MultiplyTransposeLeft( + Matrix{1U, 0U}, Matrix{1U, 1U, + (std::numeric_limits::quiet_NaN)()})), + std::invalid_argument); +} + +TEST(DenseBlasInternal, RawProductsPreserveDestinationOnNonfiniteInput) { + const double left[]{1.0, 2.0, -3.0, 4.0}; + const double right[]{5.0, -6.0, 7.0, 8.0, -9.0, 10.0}; + std::array destination{}; + ASSERT_TRUE(MultiplyTransposeRight(left, 2U, right, 3U, 2U, + destination.data())); + EXPECT_EQ(destination, (std::array{-7.0, 23.0, 11.0, + -39.0, 11.0, 67.0})); + const double invalid[]{(std::numeric_limits::infinity)(), 1.0}; + destination.fill(42.0); + EXPECT_FALSE(MultiplyTransposeRight(invalid, 1U, right, 3U, 2U, + destination.data())); + EXPECT_FALSE(OuterProduct(left, 2U, invalid, 2U, destination.data())); + for (const double value : destination) EXPECT_DOUBLE_EQ(value, 42.0); + ASSERT_TRUE(OuterProduct(left, 2U, right, 3U, destination.data())); + EXPECT_EQ(destination, (std::array{5.0, -6.0, 7.0, + 10.0, -12.0, 14.0})); +} + +TEST(DenseBlasInternal, RawProductZeroDimensionsAndOverflowAreExplicit) { + EXPECT_TRUE(OuterProduct(nullptr, 0U, nullptr, 3U, nullptr)); + EXPECT_TRUE(MultiplyTransposeRight(nullptr, 2U, nullptr, 0U, 3U, nullptr)); + std::array zeros{1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + ASSERT_TRUE(MultiplyTransposeRight(nullptr, 2U, nullptr, 3U, 0U, + zeros.data())); + for (const double value : zeros) EXPECT_DOUBLE_EQ(value, 0.0); + EXPECT_THROW(MultiplyTransposeRight(nullptr, 1U, nullptr, 1U, 1U, nullptr), + std::invalid_argument); + const auto overflow = + static_cast((std::numeric_limits::max)()) + 1U; + EXPECT_THROW(MultiplyTransposeRight(nullptr, overflow, nullptr, 0U, 0U, + nullptr), std::length_error); + double unchanged = 42.0; + EXPECT_THROW(CopyValues(&unchanged, overflow, &unchanged), std::length_error); + EXPECT_DOUBLE_EQ(unchanged, 42.0); +} + +TEST(DenseBlasInternal, ContiguousPrimitivesCheckEmptyAndOverflowBeforeUse) { + EXPECT_DOUBLE_EQ(DotValues(nullptr, 0U, nullptr), 0.0); + EXPECT_DOUBLE_EQ(NormValues(nullptr, 0U), 0.0); + EXPECT_NO_THROW(ScaleValues(2.0, nullptr, 0U)); + EXPECT_NO_THROW(AxpyValues(2.0, nullptr, 0U, nullptr)); + const auto overflow = + static_cast((std::numeric_limits::max)()) + 1U; + double unchanged = 42.0; + EXPECT_THROW(DotValues(nullptr, overflow, nullptr), std::length_error); + EXPECT_THROW(NormValues(nullptr, overflow), std::length_error); + EXPECT_THROW(ScaleValues(2.0, &unchanged, overflow), std::length_error); + EXPECT_THROW(AxpyValues(2.0, nullptr, overflow, &unchanged), std::length_error); + EXPECT_DOUBLE_EQ(unchanged, 42.0); +} + +} // namespace +} // namespace fesa::dense_blas_internal + +namespace fesa::math_internal { +namespace { +// Taylor coefficients of t^i s^j through total degree three. This independent +// polynomial oracle deliberately uses coefficients, not derivative channels. +struct Polynomial { + std::array, 4> c{}; +}; +Polynomial operator-(Polynomial a, const Polynomial& b) { + for (std::size_t i = 0; i <= 3; ++i) + for (std::size_t j = 0; i + j <= 3; ++j) a.c[i][j] -= b.c[i][j]; + return a; +} +Polynomial operator*(const Polynomial& a, const Polynomial& b) { + Polynomial result; + for (std::size_t i = 0; i <= 3; ++i) + for (std::size_t j = 0; i + j <= 3; ++j) + for (std::size_t k = 0; k <= i; ++k) + for (std::size_t l = 0; l <= j; ++l) + result.c[i][j] += a.c[k][l] * b.c[i-k][j-l]; + return result; +} +Polynomial PolynomialConstant(double value) { + Polynomial p; + p.c[0][0] = value; + return p; +} +double PolynomialRead(const Polynomial& p, std::size_t degree, + std::size_t channel) { + return p.c[channel][degree-channel]; +} +void PolynomialWrite(Polynomial& p, std::size_t degree, std::size_t channel, + double value) { + p.c[channel][degree-channel] = value; +} +TEST(JetLinearSolve, RecoversMixedCubicCoefficientsWithOnePrimalFactor) { + std::array, 3> a{}; + const double values[]{0, 2, 1, 1, 1, 0, 2, 0, 1}; + for (std::size_t i = 0; i < 3; ++i) + for (std::size_t j = 0; j < 3; ++j) { + a[i][j] = PolynomialConstant(values[3*i+j]); + for (std::size_t degree = 1; degree <= 3; ++degree) + for (std::size_t c = 0; c <= degree; ++c) + a[i][j].c[c][degree-c] = (static_cast(i+2*j+c)-2) / 16; + } + std::array expected{}, rhs{}; + for (std::size_t i = 0; i < 3; ++i) + for (std::size_t degree = 0; degree <= 3; ++degree) + for (std::size_t c = 0; c <= degree; ++c) + expected[i].c[c][degree-c] = (static_cast(i+degree+2*c)-3) / 8; + // Form the full product independently using exact dyadic long-double sums. + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t i = 0; i <= 3; ++i) + for (std::size_t j = 0; i+j <= 3; ++j) { + long double sum = 0; + for (std::size_t column = 0; column < 3; ++column) + for (std::size_t k = 0; k <= i; ++k) + for (std::size_t l = 0; l <= j; ++l) + sum += static_cast(a[row][column].c[k][l]) * + expected[column].c[i-k][j-l]; + rhs[row].c[i][j] = static_cast(sum); + } + Matrix primal{3, 3}; + for (std::size_t i = 0; i < 3; ++i) + for (std::size_t j = 0; j < 3; ++j) primal(i,j) = a[i][j].c[0][0]; + const auto factor = dense_blas_internal::DenseFactor::Lu(primal); + ASSERT_TRUE(factor.HasValue()); + std::array solved{}; + ASSERT_TRUE(SolveJetAction(a, rhs, factor.Value(), {1,2,3,4}, + PolynomialConstant, PolynomialRead, + PolynomialWrite, solved)); + for (std::size_t row = 0; row < 3; ++row) + for (std::size_t i = 0; i <= 3; ++i) + for (std::size_t j = 0; i+j <= 3; ++j) + EXPECT_NEAR(solved[row].c[i][j], expected[row].c[i][j], 2e-14); +} +TEST(JetLinearSolve, FailedChannelSolvePreservesCandidateAndInputs) { + std::array, 3> a{}; + Matrix primal{3, 3}; + for (std::size_t i = 0; i < 3; ++i) { + primal(i,i) = 1; + a[i][i] = PolynomialConstant(1); + } + const auto factor = dense_blas_internal::DenseFactor::Lu(primal); + ASSERT_TRUE(factor.HasValue()); + std::array rhs{}, solved{}; + rhs[1].c[1][0] = std::numeric_limits::infinity(); + solved[0].c[0][0] = 17; + EXPECT_FALSE(SolveJetAction(a, rhs, factor.Value(), {1,2,3,4}, + PolynomialConstant, PolynomialRead, + PolynomialWrite, solved)); + EXPECT_EQ(solved[0].c[0][0], 17); + EXPECT_EQ(a[1][1].c[0][0], 1); + EXPECT_EQ(rhs[1].c[1][0], std::numeric_limits::infinity()); +} +} // namespace +} // namespace fesa::math_internal + +namespace fesa::dense_blas_internal { +TEST(DenseBlasInternal, DiagonalProductKeepsEntrywiseCancellationAndChecks) { + Vector diagonal{3U}; + diagonal[0U] = 4; + diagonal[1U] = 2; + diagonal[2U] = -1; + Vector input{3U}; + const double large = std::ldexp(1.0, 56); + input[0U] = 1; + input[1U] = -large; + input[2U] = 2 * large; + const auto product = MultiplyDiagonal(diagonal, input); + EXPECT_DOUBLE_EQ(product[0U] + (product[1U] - product[2U]), 4); + EXPECT_EQ(MultiplyDiagonal(Vector{0U}, Vector{0U}).Size(), 0U); + EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, Vector{2U})), + std::invalid_argument); + input[0U] = std::numeric_limits::infinity(); + EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), + std::invalid_argument); + input[0U] = 1; + diagonal[0U] = std::numeric_limits::quiet_NaN(); + EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), + std::invalid_argument); } TEST(DenseBlasInternal, LocalDenseScopeRestoresTlsAfterProductsAndUnwind) { @@ -116,152 +496,66 @@ TEST(DenseBlasInternal, OuterProductLeavesFiniteInputOverflowForOwnerGate) { EXPECT_TRUE(std::isinf(product[0U])); } -TEST(DenseBlasInternal, TransposeRightProductUsesInnerAndRectangularStrides) { - const std::array left{1, 2, 3, 4, 5, 6}; - const std::array right{7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18}; - std::array product; - ASSERT_TRUE(MultiplyTransposeRight(left.data(), 2U, right.data(), 4U, 3U, - product.data())); - const std::array expected{50, 68, 86, 104, 122, 167, 212, 257}; - EXPECT_EQ(product, expected); - EXPECT_TRUE( - MultiplyTransposeRight(nullptr, 2U, nullptr, 4U, 0U, product.data())); - for (const auto value : product) EXPECT_DOUBLE_EQ(value, 0.0); - auto nonfinite = right; - nonfinite[8U] = std::numeric_limits::infinity(); - product.fill(31.0); - EXPECT_FALSE(MultiplyTransposeRight(left.data(), 2U, nonfinite.data(), 4U, 3U, - product.data())); - for (const auto value : product) EXPECT_DOUBLE_EQ(value, 31.0); -} - -TEST(DenseBlasInternal, CDup003ConvertsZeroNormalAndOverflowLengths) { - const auto zero = ToMklSize(0U); - ASSERT_TRUE(zero.HasValue()); - EXPECT_EQ(zero.Value(), 0); - - const auto normal = ToMklSize(3U); - ASSERT_TRUE(normal.HasValue()); - EXPECT_EQ(normal.Value(), 3); - - const std::size_t overflow = - static_cast((std::numeric_limits::max)()) + 1U; - const auto rejected = ToMklSize(overflow); - EXPECT_FALSE(rejected.HasValue()); - EXPECT_FALSE(rejected.GetStatus().IsOk()); -} - -TEST(DenseBlasInternal, CDup003CopiesZeroAndNonzeroContiguousValues) { - EXPECT_NO_THROW(CopyValues(nullptr, 0U, nullptr)); - - const std::array source{1.25, -2.5, 4.0}; - std::array destination{}; - CopyValues(source.data(), source.size(), destination.data()); - - EXPECT_EQ(destination, source); -} - -TEST(DenseBlasInternal, TransposeProductChecksShapeAndKnownRectangularAction) { - Matrix left{3U, 2U}; - Matrix right{3U, 1U}; - for (std::size_t row = 0; row < 3U; ++row) { - left(row, 0U) = static_cast(row + 1U); - left(row, 1U) = 2.0; - right(row, 0U) = static_cast(row); - } - const auto product = MultiplyTransposeLeft(left, right); - ASSERT_EQ(product.Rows(), 2U); - ASSERT_EQ(product.Columns(), 1U); - EXPECT_DOUBLE_EQ(product(0U, 0U), 8.0); - EXPECT_DOUBLE_EQ(product(1U, 0U), 6.0); - EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, Matrix{2U, 1U})), - std::invalid_argument); - const auto empty = MultiplyTransposeLeft(Matrix{0U, 2U}, Matrix{0U, 3U}); - EXPECT_EQ(empty.Rows(), 2U); - EXPECT_EQ(empty.Columns(), 3U); - EXPECT_DOUBLE_EQ(empty(1U, 2U), 0.0); - left(0U, 0U) = std::numeric_limits::quiet_NaN(); - EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), - std::invalid_argument); - left(0U, 0U) = 1.0; - right(0U, 0U) = std::numeric_limits::infinity(); - EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), - std::invalid_argument); -} - -TEST(DenseBlasInternal, DiagonalProductKeepsEntrywiseCancellationAndChecks) { - Vector diagonal{3U}; - diagonal[0U] = 4; - diagonal[1U] = 2; - diagonal[2U] = -1; - Vector input{3U}; - const double large = std::ldexp(1.0, 56); - input[0U] = 1; - input[1U] = -large; - input[2U] = 2 * large; - const auto product = MultiplyDiagonal(diagonal, input); - EXPECT_DOUBLE_EQ(product[0U] + (product[1U] - product[2U]), 4); - EXPECT_EQ(MultiplyDiagonal(Vector{0U}, Vector{0U}).Size(), 0U); - EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, Vector{2U})), - std::invalid_argument); - input[0U] = std::numeric_limits::infinity(); - EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), - std::invalid_argument); - input[0U] = 1; - diagonal[0U] = std::numeric_limits::quiet_NaN(); - EXPECT_THROW(static_cast(MultiplyDiagonal(diagonal, input)), - std::invalid_argument); -} - -TEST(DenseBlasInternal, CholeskyAndInverseMatchKnownFactorsAndKeepFailedOutput) { - Matrix matrix{2U, 2U}; - matrix(0U, 0U) = 4; - matrix(0U, 1U) = 2; - matrix(1U, 0U) = 2; - matrix(1U, 1U) = 5; - Matrix lower{0U, 0U}, inverse{0U, 0U}; - ASSERT_TRUE(CholeskyLowerAndInverse(matrix, lower, inverse)); - EXPECT_DOUBLE_EQ(lower(0U, 0U), 2); - EXPECT_DOUBLE_EQ(lower(1U, 0U), 1); - EXPECT_DOUBLE_EQ(lower(1U, 1U), 2); - EXPECT_DOUBLE_EQ(lower(0U, 1U), 0); - EXPECT_DOUBLE_EQ(inverse(0U, 0U), .5); - EXPECT_DOUBLE_EQ(inverse(1U, 0U), -.25); - EXPECT_DOUBLE_EQ(inverse(1U, 1U), .5); - matrix(1U, 1U) = 0; - EXPECT_FALSE(CholeskyLowerAndInverse(matrix, lower, inverse)); - EXPECT_DOUBLE_EQ(lower(1U, 1U), 2); - EXPECT_DOUBLE_EQ(inverse(1U, 1U), .5); - EXPECT_THROW(static_cast(CholeskyLowerAndInverse( - Matrix{2U, 1U}, lower, inverse)), std::invalid_argument); - matrix(0U, 0U) = std::numeric_limits::quiet_NaN(); - EXPECT_THROW(static_cast(CholeskyLowerAndInverse(matrix, lower, inverse)), - std::invalid_argument); -} - TEST(DenseBlasInternal, - CholeskyFailureReasonPreservesCandidatesAndResetsOnReuse) { - Matrix matrix{2U, 2U}; - matrix(0U, 0U) = 4.0; - matrix(1U, 1U) = 9.0; - Matrix lower{0U, 0U}; - Matrix inverse{0U, 0U}; - auto reason = CholeskyFailure::kInverse; - ASSERT_TRUE(CholeskyLowerAndInverse(matrix, lower, inverse, &reason)); - EXPECT_EQ(reason, CholeskyFailure::kNone); - matrix(1U, 1U) = -1.0; - EXPECT_FALSE(CholeskyLowerAndInverse(matrix, lower, inverse, &reason)); - EXPECT_EQ(reason, CholeskyFailure::kPivot); - EXPECT_DOUBLE_EQ(lower(1U, 1U), 3.0); - EXPECT_DOUBLE_EQ(inverse(1U, 1U), 1.0 / 3.0); - matrix(1U, 1U) = 9.0; - EXPECT_TRUE(CholeskyLowerAndInverse(matrix, lower, inverse, &reason)); - EXPECT_EQ(reason, CholeskyFailure::kNone); - reason = CholeskyFailure::kInverse; - EXPECT_THROW(CholeskyLowerAndInverse(Matrix{2U, 1U}, lower, inverse, &reason), + OuterProductUsesRectangularStorageAndPreservesRejection) { + const std::array left{2.0, -3.0}; + const std::array right{4.0, -5.0, 0.25}; + std::array product{}; + ASSERT_TRUE(OuterProduct(left.data(), left.size(), right.data(), right.size(), + product.data())); + const std::array expected{8.0, -10.0, 0.5, -12.0, 15.0, -0.75}; + EXPECT_EQ(product, expected); + const auto accepted = product; + const std::array invalid{ + 1.0, std::numeric_limits::quiet_NaN()}; + EXPECT_FALSE(OuterProduct(invalid.data(), invalid.size(), right.data(), + right.size(), product.data())); + EXPECT_EQ(product, accepted); + EXPECT_TRUE(OuterProduct(nullptr, 0U, nullptr, 3U, nullptr)); + EXPECT_TRUE(OuterProduct(nullptr, 2U, nullptr, 0U, nullptr)); + EXPECT_THROW(OuterProduct(nullptr, 2U, right.data(), 3U, product.data()), std::invalid_argument); - EXPECT_EQ(reason, CholeskyFailure::kNone); + const auto too_large = + static_cast((std::numeric_limits::max)()) + 1U; + EXPECT_THROW(OuterProduct(nullptr, too_large, nullptr, 1U, nullptr), + std::length_error); + const auto too_many_elements = + std::numeric_limits::max() / sizeof(double) + 1U; + EXPECT_THROW(OuterProduct(nullptr, too_many_elements, nullptr, 1U, nullptr), + std::length_error); +} + +TEST(DenseBlasInternal, PolicyQueryPreservesDefaultPositiveAndNestedTls) { + const int previous = mkl_set_num_threads_local(0); + struct Restore { + int previous; + ~Restore() { static_cast(mkl_set_num_threads_local(previous)); } + } restore{previous}; + const int global = mkl_get_max_threads(); + const int domain = mkl_domain_get_max_threads(MKL_DOMAIN_BLAS); + const int dynamic = mkl_get_dynamic(); + for (int repeat = 0; repeat < 2; ++repeat) { + const auto policy = ReadScopedLocalDensePolicy(); + EXPECT_EQ(policy.blas_max_threads, 1); + EXPECT_EQ(policy.dynamic, dynamic); + EXPECT_EQ(mkl_set_num_threads_local(0), 0); + EXPECT_EQ(mkl_get_max_threads(), global); + EXPECT_EQ(mkl_domain_get_max_threads(MKL_DOMAIN_BLAS), domain); + EXPECT_EQ(mkl_get_dynamic(), dynamic); + } + static_cast(mkl_set_num_threads_local(2)); + EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 2); + EXPECT_EQ(mkl_set_num_threads_local(2), 2); + static_cast(mkl_set_num_threads_local(0)); + try { + const ScopedLocalDenseThreads outer{}; + EXPECT_EQ(ReadScopedLocalDensePolicy().blas_max_threads, 1); + EXPECT_EQ(mkl_set_num_threads_local(1), 1); + throw std::runtime_error{"policy-query-unwind"}; + } catch (const std::runtime_error&) { + } + EXPECT_EQ(mkl_set_num_threads_local(0), 0); + EXPECT_EQ(mkl_get_dynamic(), dynamic); } TEST(DenseBlasInternal, SingleEquationScopeRestoresTlsAndRespectsOverrides) { @@ -295,5 +589,104 @@ TEST(DenseBlasInternal, SingleEquationScopeRestoresTlsAndRespectsOverrides) { EXPECT_EQ(mkl_get_max_threads(), 3); } -} // namespace +TEST(DenseBlasInternal, TransposeProductChecksShapeAndKnownRectangularAction) { + Matrix left{3U, 2U}; + Matrix right{3U, 1U}; + for (std::size_t row = 0; row < 3U; ++row) { + left(row, 0U) = static_cast(row + 1U); + left(row, 1U) = 2.0; + right(row, 0U) = static_cast(row); + } + const auto product = MultiplyTransposeLeft(left, right); + ASSERT_EQ(product.Rows(), 2U); + ASSERT_EQ(product.Columns(), 1U); + EXPECT_DOUBLE_EQ(product(0U, 0U), 8.0); + EXPECT_DOUBLE_EQ(product(1U, 0U), 6.0); + EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, Matrix{2U, 1U})), + std::invalid_argument); + const auto empty = MultiplyTransposeLeft(Matrix{0U, 2U}, Matrix{0U, 3U}); + EXPECT_EQ(empty.Rows(), 2U); + EXPECT_EQ(empty.Columns(), 3U); + EXPECT_DOUBLE_EQ(empty(1U, 2U), 0.0); + left(0U, 0U) = std::numeric_limits::quiet_NaN(); + EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), + std::invalid_argument); + left(0U, 0U) = 1.0; + right(0U, 0U) = std::numeric_limits::infinity(); + EXPECT_THROW(static_cast(MultiplyTransposeLeft(left, right)), + std::invalid_argument); +} + +TEST(DenseBlasInternal, TransposeRightProductUsesInnerAndRectangularStrides) { + const std::array left{1, 2, 3, 4, 5, 6}; + const std::array right{7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18}; + std::array product; + ASSERT_TRUE(MultiplyTransposeRight(left.data(), 2U, right.data(), 4U, 3U, + product.data())); + const std::array expected{50, 68, 86, 104, 122, 167, 212, 257}; + EXPECT_EQ(product, expected); + EXPECT_TRUE( + MultiplyTransposeRight(nullptr, 2U, nullptr, 4U, 0U, product.data())); + for (const auto value : product) EXPECT_DOUBLE_EQ(value, 0.0); + auto nonfinite = right; + nonfinite[8U] = std::numeric_limits::infinity(); + product.fill(31.0); + EXPECT_FALSE(MultiplyTransposeRight(left.data(), 2U, nonfinite.data(), 4U, 3U, + product.data())); + for (const auto value : product) EXPECT_DOUBLE_EQ(value, 31.0); +} + +// The former lower/inverse output parameters are now owned factor results. +TEST(DenseBlasInternal, CholeskyAndInverseMatchKnownFactorsAndKeepFailedOutput) { + Matrix matrix{2U, 2U}; + matrix(0, 0) = 4; + matrix(0, 1) = matrix(1, 0) = 2; + matrix(1, 1) = 5; + auto factor = DenseFactor::Cholesky(matrix); + ASSERT_TRUE(factor.HasValue()); + const auto lower = factor.Value().Lower(); + Matrix identity{2U, 2U}; + identity(0, 0) = identity(1, 1) = 1; + const auto inverse = factor.Value().SolveLower(identity); + ASSERT_TRUE(lower.HasValue()); + ASSERT_TRUE(inverse.HasValue()); + EXPECT_DOUBLE_EQ(lower.Value()(0, 0), 2); + EXPECT_DOUBLE_EQ(lower.Value()(1, 0), 1); + EXPECT_DOUBLE_EQ(lower.Value()(1, 1), 2); + EXPECT_DOUBLE_EQ(lower.Value()(0, 1), 0); + EXPECT_DOUBLE_EQ(inverse.Value()(0, 0), .5); + EXPECT_DOUBLE_EQ(inverse.Value()(1, 0), -.25); + EXPECT_DOUBLE_EQ(inverse.Value()(1, 1), .5); + matrix(1, 1) = 0; + EXPECT_FALSE(DenseFactor::Cholesky(matrix).HasValue()); + EXPECT_DOUBLE_EQ(lower.Value()(1, 1), 2); + EXPECT_DOUBLE_EQ(inverse.Value()(1, 1), .5); + EXPECT_FALSE(DenseFactor::Cholesky(Matrix{2U, 1U}).HasValue()); + matrix(0, 0) = std::numeric_limits::quiet_NaN(); + EXPECT_FALSE(DenseFactor::Cholesky(matrix).HasValue()); + EXPECT_DOUBLE_EQ(factor.Value().SolveLower(identity).Value()(1, 1), .5); +} + +TEST(DenseBlasInternal, + CholeskyFailureReasonPreservesCandidatesAndResetsOnReuse) { + Matrix matrix{2U, 2U}; + matrix(0, 0) = 4; + matrix(1, 1) = 9; + const auto accepted = DenseFactor::Cholesky(matrix); + ASSERT_TRUE(accepted.HasValue()); + Matrix identity{2U, 2U}; + identity(0, 0) = identity(1, 1) = 1; + matrix(1, 1) = -1; + const auto failed = DenseFactor::Cholesky(matrix); + ASSERT_FALSE(failed.HasValue()); + ASSERT_FALSE(failed.GetStatus().Diagnostics().empty()); + EXPECT_EQ(failed.GetStatus().Diagnostics()[0].code, "dense-factor-pivot"); + EXPECT_DOUBLE_EQ(accepted.Value().Lower().Value()(1, 1), 3); + EXPECT_DOUBLE_EQ(accepted.Value().SolveLower(identity).Value()(1, 1), 1.0 / 3.0); + matrix(1, 1) = 9; + EXPECT_TRUE(DenseFactor::Cholesky(matrix).HasValue()); + EXPECT_FALSE(DenseFactor::Cholesky(Matrix{2U, 1U}).HasValue()); + EXPECT_TRUE(DenseFactor::Cholesky(matrix).HasValue()); +} } // namespace fesa::dense_blas_internal diff --git a/tests/unit/math/high_low_arithmetic_test.cpp b/tests/unit/math/high_low_arithmetic_test.cpp index fc41fad..2c84758 100644 --- a/tests/unit/math/high_low_arithmetic_test.cpp +++ b/tests/unit/math/high_low_arithmetic_test.cpp @@ -1,6 +1,7 @@ #include "../../../src/fesa/math/high_low_arithmetic.h" #include +#include "elements/hex8_pair_simd.h" #include #include @@ -236,4 +237,78 @@ TEST(HighLowArithmetic, OptimizedArithmeticMatchesFrozenOriginalBits) { } } } +TEST(HighLowArithmetic, PacketDispatchRetainsComponentsAndInstructionGates) { + using namespace fesa::hex8_internal; + const std::uint32_t leaf1 = (1U << 12) | (1U << 26) | (1U << 27) | (1U << 28); + const std::uint32_t leaf7 = (1U << 3) | (1U << 5) | (1U << 8); + EXPECT_TRUE(SupportsMaterialPacketInstructions(leaf1, 6, leaf7)); + for (const auto bit : {12,26,27,28}) + EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1 & ~(1U << bit),6,leaf7)); + for (const auto bit : {3,5,8}) + EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,6,leaf7 & ~(1U << bit))); + EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,2,leaf7)); + EXPECT_FALSE(SupportsMaterialPacketInstructions(leaf1,4,leaf7)); + const auto selected = SelectMaterialPacketEvaluator(); + std::size_t finite_pairs = 0, retained_low_pairs = 0, invalid_pairs = 0; + RecordProperty("selected_backend", selected == EvaluateMaterialPacketAvx2 ? "avx2" : "scalar"); + const auto verify = [selected, &finite_pairs, &retained_low_pairs, &invalid_pairs]( + const MaterialPacketInput& input) { + PairPacket expected{}, actual{}; + EvaluateMaterialPacketScalar(input, &expected); + selected(input, &actual); + for (std::size_t lane = 0; lane < 4; ++lane) { + if (std::isnan(expected.values[lane].high)) { + ++invalid_pairs; + EXPECT_TRUE(std::isnan(actual.values[lane].high)); + } else { + ++finite_pairs; + if (expected.values[lane].low != 0) ++retained_low_pairs; + EXPECT_DOUBLE_EQ(actual.values[lane].high, expected.values[lane].high); + EXPECT_DOUBLE_EQ(actual.values[lane].low, expected.values[lane].low); + EXPECT_EQ(std::signbit(actual.values[lane].low), + std::signbit(expected.values[lane].low)); + } + } + }; + for (const bool full_low : {false,true}) + for (const int exponent : {-970,-100,0,100,400}) { + MaterialPacketInput input{}; + input.weight = {0.5, 0}; + for (std::size_t lane = 0; lane < 4; ++lane) { + input.deviatoric_left.values[lane] = + {std::ldexp(1.0, exponent), full_low ? std::ldexp(1.0,exponent-54) : 0}; + input.deviatoric_right.values[lane] = {1.25, std::ldexp(1.0,-60)}; + input.shear_left.values[lane] = {0, 0}; + input.shear_right.values[lane] = {1,0}; + input.tensor_left.values[lane] = {-1, std::ldexp(1.0,-55)}; + input.gradient_dot.values[lane] = {std::ldexp(1.0,exponent),0}; + input.accumulated.values[lane] = {std::ldexp(1.0,exponent),0}; + } + verify(input); + // Mixed-low packets explicitly exercise the scalar bridge. + input.deviatoric_left.values[1].low = 0; + verify(input); + input.shear_left.values[3] = {-0.0,0}; // raw signed-zero is invalid by contract + input.deviatoric_left.values[0] = {std::numeric_limits::max(),0}; + input.deviatoric_right.values[0] = {2,0}; + input.deviatoric_left.values[1] = {1,1}; + input.deviatoric_left.values[2] = {std::numeric_limits::denorm_min(),0}; + input.deviatoric_right.values[2] = {0.5,0}; + verify(input); + } + EXPECT_GT(finite_pairs, 0U); + EXPECT_GT(retained_low_pairs, 0U); + EXPECT_GT(invalid_pairs, 0U); + RecordProperty("finite_pairs", static_cast(finite_pairs)); + RecordProperty("retained_low_pairs", static_cast(retained_low_pairs)); + RecordProperty("invalid_pairs", static_cast(invalid_pairs)); + // Selection is thread-environment dependent rather than cached after first use. +#if defined(_M_X64) || defined(__SSE2__) + const unsigned saved = _mm_getcsr(); + _mm_setcsr(saved | 0x8000U); + EXPECT_EQ(SelectMaterialPacketEvaluator(), EvaluateMaterialPacketScalar); + _mm_setcsr(saved); + EXPECT_EQ(SelectMaterialPacketEvaluator(), selected); +#endif +} } // namespace diff --git a/tests/unit/math/matrix_test.cpp b/tests/unit/math/matrix_test.cpp index b315b44..49fa1b8 100644 --- a/tests/unit/math/matrix_test.cpp +++ b/tests/unit/math/matrix_test.cpp @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -109,6 +110,63 @@ TEST(DenseMath, RowMajorMatrixMatchesKnownGemvGemm) { std::invalid_argument); } + +TEST(DenseMath, MatrixContiguousScaleAndRobustNorm) { + Matrix matrix{2U, 3U}; + const double entries[]{1.0, -2.0, 3.0, -4.0, 5.0, -6.0}; + for (std::size_t i = 0; i < 6U; ++i) matrix.Data()[i] = entries[i]; + const Matrix& immutable = matrix; + EXPECT_EQ(immutable.Data() + 3, &immutable(1U, 0U)); + EXPECT_NEAR(matrix.Norm(), std::sqrt(91.0), 2.0e-15); + matrix.Scale(-2.0); + for (std::size_t i = 0; i < 6U; ++i) + EXPECT_DOUBLE_EQ(matrix.Data()[i], -2.0 * entries[i]); + EXPECT_DOUBLE_EQ(immutable(1U, 2U), 12.0); + Matrix huge{1U, 2U, 1.0e308}; + EXPECT_NEAR(huge.Norm() / 1.0e308, std::sqrt(2.0), 4.0e-16); + Matrix tiny{2U, 1U, 1.0e-300}; + EXPECT_NEAR(tiny.Norm() / 1.0e-300, std::sqrt(2.0), 4.0e-16); + Matrix empty{0U, (std::numeric_limits::max)()}; + EXPECT_DOUBLE_EQ(empty.Norm(), 0.0); + EXPECT_NO_THROW(empty.Scale(3.0)); +} + +TEST(DenseMath, MatrixProductKeepsShapeAndFiniteValidationOrder) { + const double nan = (std::numeric_limits::quiet_NaN)(); + Matrix matrix{1U, 2U, nan}; + try { + static_cast(matrix.Multiply(Vector{1U})); + FAIL() << "Shape mismatch was accepted"; + } catch (const std::invalid_argument& failure) { + EXPECT_STREQ(failure.what(), + "Matrix-vector multiplication has incompatible dimensions."); + } + EXPECT_THROW(static_cast(matrix.Multiply(Vector{2U})), + std::invalid_argument); + EXPECT_THROW(static_cast(matrix.Multiply(Matrix{2U, 0U})), + std::invalid_argument); + EXPECT_THROW(static_cast(Matrix{0U, 2U}.Multiply(Vector{2U, nan})), + std::invalid_argument); + const Matrix finite{2U, 2U, 3.0}; + const auto square = finite.Multiply(finite); + EXPECT_DOUBLE_EQ(square(0U, 0U), 18.0); + EXPECT_DOUBLE_EQ(finite(0U, 0U), 3.0); +} + +TEST(DenseMath, MatrixSelfAssignmentPreservesShapeAndStorage) { + Matrix matrix{2U, 1U, 7.0}; + const Matrix* same = &matrix; + matrix = *same; + EXPECT_EQ(matrix.Rows(), 2U); + EXPECT_EQ(matrix.Columns(), 1U); + EXPECT_DOUBLE_EQ(matrix(1U, 0U), 7.0); + Matrix* mutable_same = &matrix; + matrix = std::move(*mutable_same); + EXPECT_EQ(matrix.Rows(), 2U); + EXPECT_DOUBLE_EQ(matrix(1U, 0U), 7.0); +} + +} // namespace TEST(DenseMath, MatrixProductsRejectNonfiniteOperandsAndPreserveValidReuse) { Matrix left{2U, 2U, 1.0}; Matrix right{2U, 1U, 2.0}; @@ -126,6 +184,4 @@ TEST(DenseMath, MatrixProductsRejectNonfiniteOperandsAndPreserveValidReuse) { EXPECT_DOUBLE_EQ(left.Multiply(rhs)[0U], 4.0); EXPECT_DOUBLE_EQ(left.Multiply(right)(1U, 0U), 4.0); } - -} // namespace } // namespace fesa diff --git a/tests/unit/math/vector3_test.cpp b/tests/unit/math/vector3_test.cpp index bd51337..48d2d64 100644 --- a/tests/unit/math/vector3_test.cpp +++ b/tests/unit/math/vector3_test.cpp @@ -112,5 +112,19 @@ TEST(Vector3, RejectsZeroAndNonfiniteNormalization) { EXPECT_FALSE(Vector3(0.0, not_a_number, 0.0).Normalized().has_value()); } + +TEST(Vector3, RightHandedFrameMatchesIndependentCoordinateTransform) { + const Vector3 x_axis{0.0, 1.0, 0.0}; + const Vector3 y_axis{0.0, 0.0, 1.0}; + const Vector3 z_axis = x_axis.Cross(y_axis); + const Vector3 global{2.0, -3.0, 4.0}; + EXPECT_DOUBLE_EQ(x_axis.Dot(global), -3.0); + EXPECT_DOUBLE_EQ(y_axis.Dot(global), 4.0); + EXPECT_DOUBLE_EQ(z_axis.Dot(global), 2.0); + const Vector3 recovered = x_axis * -3.0 + y_axis * 4.0 + z_axis * 2.0; + EXPECT_TRUE(recovered == global); + EXPECT_DOUBLE_EQ(x_axis.Dot(y_axis.Cross(z_axis)), 1.0); +} + } // namespace } // namespace fesa diff --git a/tests/unit/math/vector_test.cpp b/tests/unit/math/vector_test.cpp index bd62869..59d221b 100644 --- a/tests/unit/math/vector_test.cpp +++ b/tests/unit/math/vector_test.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -83,5 +84,31 @@ TEST(DenseMath, VectorOwnsAndChecksContiguousStorage) { EXPECT_THROW(original.Axpy(1.0, Vector{2}), std::invalid_argument); } + +TEST(DenseMath, VectorRobustNormSelfAliasAndNonfinitePropagation) { + Vector large{2U, 1.0e308}; + EXPECT_NEAR(large.Norm() / 1.0e308, std::sqrt(2.0), 4.0e-16); + Vector tiny{2U, 1.0e-300}; + EXPECT_NEAR(tiny.Norm() / 1.0e-300, std::sqrt(2.0), 4.0e-16); + Vector values{2U}; + values[0] = 2.0; + values[1] = -3.0; + values.Axpy(-2.0, values); + EXPECT_DOUBLE_EQ(values[0], -2.0); + EXPECT_DOUBLE_EQ(values[1], 3.0); + const Vector* same = &values; + values = *same; + Vector* mutable_same = &values; + values = std::move(*mutable_same); + EXPECT_DOUBLE_EQ(values.Dot(values), 13.0); + Vector nonfinite{1U, (std::numeric_limits::quiet_NaN)()}; + EXPECT_TRUE(std::isnan(nonfinite.Dot(Vector{1U, 1.0}))); + EXPECT_TRUE(std::isnan(nonfinite.Norm())); + EXPECT_NO_THROW(nonfinite.Scale(2.0)); + EXPECT_NO_THROW(nonfinite.Axpy(1.0, Vector{1U, 1.0})); + EXPECT_TRUE(std::isnan(nonfinite[0])); + EXPECT_DOUBLE_EQ(Vector{0U}.Dot(Vector{0U}), 0.0); +} + } // namespace } // namespace fesa diff --git a/tests/unit/model/shell_geometry_test.cpp b/tests/unit/model/shell_geometry_test.cpp index 41ab691..460b716 100644 --- a/tests/unit/model/shell_geometry_test.cpp +++ b/tests/unit/model/shell_geometry_test.cpp @@ -283,3 +283,14 @@ TEST(Mitc4Geometry, ExposesTheCompleteRequiredValidationPointInventory) { EXPECT_EQ(points[13].natural_coordinates, (Vector3{-gauss, -gauss, 0.0})); EXPECT_EQ(points[16].natural_coordinates, (Vector3{-gauss, gauss, 0.0})); } + +TEST(Mitc4Geometry, RetainsReciprocalDeterminantOverflowGateAtTinyScale) { + const std::vector nodes{ + Node(0U, {0.0, 0.0, 0.0}), Node(1U, {2e-104, 0.0, 0.0}), + Node(2U, {2e-104, 2e-104, 0.0}), Node(3U, {0.0, 2e-104, 0.0})}; + EXPECT_TRUE(fesa::PreprocessShellGeometry( + nodes, {Element(10U, {0U, 1U, 2U, 3U})}, Sections(2e-99)).HasValue()); + ExpectFailureCode(fesa::PreprocessShellGeometry( + nodes, {Element(10U, {0U, 1U, 2U, 3U})}, Sections(2e-102)), + "invalid-shell-jacobian"); +} diff --git a/tests/unit/model/source_target_resolver_test.cpp b/tests/unit/model/source_target_resolver_test.cpp index fc94cb8..1aa6273 100644 --- a/tests/unit/model/source_target_resolver_test.cpp +++ b/tests/unit/model/source_target_resolver_test.cpp @@ -133,3 +133,41 @@ TEST(SourceTargetResolver, EXPECT_EQ(result.GetStatus().Diagnostics()[1U].message, "Duplicate resolved source target 10."); } + +TEST(SourceTargetResolver, OwnsNodeCandidateIndexBeforeDomainCommit) { + using fesa::SourceEntityKind; + const auto index = [] { + const std::vector nodes{{{"Part-1", 20, "0020"}, {}, {}}, + {{"Part-1", 10, "0010"}, {}, {}}, + {{"Part-2", 10, "0010"}, {}, {}}}; + const std::vector sets{ + {"Ends", "Part-1", {1U, 0U}, {}}, + {"Ends", "Part-2", {2U}, {}}, + {"Repeated", "Part-1", {0U, 1U, 0U, 1U}, {}}}; + return fesa::SourceTargetIndex::FromNodeDefinitions(nodes, sets); + }(); + const fesa::SourceTargetResolver resolver{index}; + const auto ends = + resolver.Resolve({SourceEntityKind::kNode, "part-1", "ENDS"}); + ASSERT_TRUE(ends.HasValue()); + EXPECT_EQ(Indices(ends.Value()), (std::vector{1U, 0U})); + EXPECT_EQ(ends.Value()[0U].source_id.source_label_text, "0010"); + EXPECT_EQ(ends.Value()[1U].source_id.source_label_text, "0020"); + const auto direct = + resolver.Resolve({SourceEntityKind::kNode, "Part-2", "10"}); + ASSERT_TRUE(direct.HasValue()); + EXPECT_EQ(Indices(direct.Value()), (std::vector{2U})); + ExpectFailure(index, {SourceEntityKind::kNode, "", "Ends"}, + "ambiguous-source-target"); + const auto repeated = + resolver.Resolve({SourceEntityKind::kNode, "Part-1", "Repeated"}); + ASSERT_FALSE(repeated.HasValue()); + ASSERT_EQ(repeated.GetStatus().Diagnostics().size(), 2U); + EXPECT_EQ(repeated.GetStatus().Diagnostics()[0U].message, + "Duplicate resolved source target 0020."); + EXPECT_EQ(repeated.GetStatus().Diagnostics()[1U].message, + "Duplicate resolved source target 0010."); + const auto empty = fesa::SourceTargetIndex::FromNodeDefinitions({}, {}); + ExpectFailure(empty, {SourceEntityKind::kNode, "", "1"}, + "unresolved-source-target"); +} diff --git a/tests/unit/model/thermal_shell_geometry_test.cpp b/tests/unit/model/thermal_shell_geometry_test.cpp index 4c7633d..6988e65 100644 --- a/tests/unit/model/thermal_shell_geometry_test.cpp +++ b/tests/unit/model/thermal_shell_geometry_test.cpp @@ -7,6 +7,7 @@ #include "fesa/elements/thermal_shell.h" #include "fesa/model/domain.h" +#include "elements/thermal_shell_geometry.h" namespace { using fesa::Vector3; @@ -210,3 +211,68 @@ TEST(ThermalShellGeometry, {1, 1, 0}}, {{{0, 1, 4, 3}}, {{1, 2, 5, 4}}, {{3, 4, 7, 6}}, {{4, 5, 8, 7}}}))); } + +namespace { +TEST(ThermalGeometryAction, EnclosesIndependentDyadicTangentialConstraints) { + using namespace fesa::thermal_internal; + // The rounded Gram matrix loses rank for delta=2^-40, while the physical + // tangents and their exterior determinant remain certified and nonsingular. + for (const int exponent : {-40,-27,-4,0}) { + const double delta = std::ldexp(1.,exponent); + Geometry geometry; + geometry.b = {1,1,0}; + geometry.c = {1,1+delta,0}; + for (std::size_t j=0; j<3; ++j) { + geometry.bi[j] = Interval{geometry.b[j]}; + geometry.ci[j] = Interval{geometry.c[j]}; + } + const auto evaluated = EvaluateSurface(geometry, 0, 0, Interval{0}, + Interval{0}, {}, {}); + ASSERT_TRUE(evaluated.HasValue()) << exponent; + const double dx[4]{-.25,.25,.25,-.25}; + const double dy[4]{-.25,-.25,.25,.25}; + for (std::size_t i=0; i<4; ++i) { + const double gy = (dy[i]-dx[i])/delta; + const double gx = dx[i]-gy; + const double oracle[3]{gx,gy,0}; + for (std::size_t j=0; j<3; ++j) { + EXPECT_DOUBLE_EQ(evaluated.Value().gradient[i][j],oracle[j]); + const auto interval = evaluated.Value().gradient_interval[i][j]; + EXPECT_LE(interval.lower,oracle[j]); + EXPECT_GE(interval.upper,oracle[j]); + } + } + } +} +TEST(ThermalGeometryAction, PreservesWholePatchAndScaledFiniteRejections) { + using namespace fesa::thermal_internal; + for (const Patch patch : { + kSquare, + Patch{{{3,-9,-3},{1,3,-3},{-1,3,3},{-3,3,3}}}, + Patch{{{-1,4,-4},{-1,-2,2},{3,2,4},{-1,-4,-2}}}}) { + const auto geometry = BuildGeometry(patch, {}, {}); + ASSERT_TRUE(geometry.HasValue()); + for (const double xi : {-std::sqrt(.6),0.,std::sqrt(.6)}) + for (const double eta : {-std::sqrt(.6),0.,std::sqrt(.6)}) + EXPECT_TRUE(EvaluateSurface(geometry.Value(),xi,eta, + Interval{Down(xi),Up(xi)},Interval{Down(eta),Up(eta)},{},{}).HasValue()); + } + const Patch folded{{{0,0,0},{1,1,0},{1,0,0},{0,1,0}}}; + const auto rejected = BuildGeometry(folded,{"part",27,"0027"},{"mesh.inp",17}); + ASSERT_FALSE(rejected.HasValue()); + EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].code, + "uncertain-thermal-shell-geometry"); + EXPECT_EQ(rejected.GetStatus().Diagnostics()[0].entity_identity,"part:0027"); + Geometry geometry; + geometry.b = {1,0,0}; geometry.c = {0,1,0}; + geometry.bi[0] = Interval{1}; geometry.ci[1] = Interval{1}; + geometry.length_exponent = -600; + const auto scaled = EvaluateSurface(geometry,0,0,Interval{0},Interval{0}, + {"part",27,"0027"},{"mesh.inp",17}); + ASSERT_FALSE(scaled.HasValue()); + EXPECT_EQ(scaled.GetStatus().Diagnostics()[0].code, + "uncertain-thermal-shell-metric"); + EXPECT_EQ(scaled.GetStatus().Diagnostics()[0].message, + "Metric inverse enclosure is not finite or excludes no zero divisor."); +} +} // namespace diff --git a/tests/unit/results/result_records_test.cpp b/tests/unit/results/result_records_test.cpp index a418ddf..c35285c 100644 --- a/tests/unit/results/result_records_test.cpp +++ b/tests/unit/results/result_records_test.cpp @@ -9,6 +9,9 @@ #include "fesa/analysis/analysis_state.h" +#include "fesa/analysis/analysis_model.h" +#include "fesa/fem/dof_manager.h" + namespace { fesa::DofManager MakeEmptyDofs() { diff --git a/tests/unit/results/results_writer_test.cpp b/tests/unit/results/results_writer_test.cpp index b2dceb8..a4842c7 100644 --- a/tests/unit/results/results_writer_test.cpp +++ b/tests/unit/results/results_writer_test.cpp @@ -1,9 +1,22 @@ #include "fesa/results/results_writer.h" +#include "fesa/results/prepared_results_writer.h" +#include "fesa/results/dynamic_results_writer.h" +#include "fesa/results/eigen_results_writer.h" +#include "fesa/results/nonlinear_results_writer.h" +#include "fesa/results/solid_results_writer.h" +#include "fesa/results/thermal_results_writer.h" + +#include + +#include #include +#include +#include #include #include +#include "fesa/analysis/analysis_model.h" #include "fesa/analysis/analysis_state.h" #include "fesa/core/diagnostic.h" #include "fesa/core/status.h" @@ -21,3 +34,181 @@ static_assert( std::is_same_v); } // namespace + +namespace { + +// These adapters only observe borrowed values; no procedure, kernel, or file I/O. +struct WriterCalls { + std::vector paths; + std::vector domains; + std::vector*> diagnostics; + std::vector families; + + fesa::Status Record(unsigned family, const std::filesystem::path& path, + const fesa::Domain& domain, + const std::vector& values) { + paths.push_back(&path); + domains.push_back(&domain); + diagnostics.push_back(&values); + families.push_back(family); + return fesa::Status::Failure( + fesa::FailureCategory::kOutput, + {{fesa::Severity::kError, "candidate-close-failure", {"source.inp", 7U}, + "WRITER", "0007", "Preserved writer failure."}}); + } +}; + +template +class RecordingWriter final : public Writer { + public: + explicit RecordingWriter(WriterCalls& calls) : calls_{calls} {} + fesa::Status Write(const std::filesystem::path& path, + const fesa::Domain& domain, const State& state, + const std::vector& diagnostics) override { + received = &state; + return calls_.Record(Family, path, domain, diagnostics); + } + const State* received{nullptr}; + + private: + WriterCalls& calls_; +}; + +class RecordingSolidWriter final : public fesa::SolidResultsWriter { + public: + explicit RecordingSolidWriter(WriterCalls& calls) : calls_{calls} {} + fesa::Status Write(const std::filesystem::path& p, const fesa::Domain& d, + const fesa::SolidStaticState& s, + const std::vector& v) override { + static_state = &s; + return calls_.Record(5U, p, d, v); + } + fesa::Status Write(const std::filesystem::path& p, const fesa::Domain& d, + const fesa::SolidFrequencyState& s, + const std::vector& v) override { + frequency_state = &s; + return calls_.Record(6U, p, d, v); + } + fesa::Status Write(const std::filesystem::path& p, const fesa::Domain& d, + const fesa::SolidDynamicAnalysisState& s, + const std::vector& v) override { + dynamic_state = &s; + return calls_.Record(7U, p, d, v); + } + const fesa::SolidStaticState* static_state{nullptr}; + const fesa::SolidFrequencyState* frequency_state{nullptr}; + const fesa::SolidDynamicAnalysisState* dynamic_state{nullptr}; + + private: + WriterCalls& calls_; +}; + +// Empty values intentionally bypass physics: dispatch must preserve their type. +std::vector EmptyOutcomes() { + std::vector values; + values.emplace_back(fesa::LinearStaticExecutionResult{ + fesa::AnalysisState::Create(fesa::DofManager{}, {"source/step", 9U}), {}}); + fesa::ModelDefinition definition{}; + definition.steps = {{"value-only", {}, {}, 0.1, 1.0, 0.01, 1.0, {}}}; + auto domain = fesa::Domain::Create(std::move(definition)); + auto model = fesa::AnalysisModel::Create(domain.Value()); + auto dofs = fesa::DofManager::Create(model.Value()); + auto nonlinear = fesa::NonlinearAnalysisState::Create( + domain.Value(), dofs.Value(), {}); + if (!nonlinear.HasValue()) + throw std::runtime_error{"Empty nonlinear value construction failed."}; + values.emplace_back( + fesa::NonlinearStaticExecutionResult{std::move(nonlinear.Value()), {}}); + values.emplace_back(fesa::EigenAnalysisState{ + fesa::FeastEigenResult{0U, {}, fesa::Matrix{0U, 0U}}}); + values.emplace_back(fesa::DynamicExecutionResult{}); + values.emplace_back(fesa::SolidStaticExecutionResult{}); + values.emplace_back(fesa::SolidFrequencyState{ + fesa::FeastEigenResult{0U, {}, fesa::Matrix{0U, 0U}}}); + values.emplace_back(fesa::SolidDynamicExecutionResult{}); + return values; +} + +} // namespace + +TEST(PreparedResultsWriter, RoutesValueOutcomesAndPreservesWriterFailure) { + auto domain = fesa::Domain::Create({}); + ASSERT_TRUE(domain.HasValue()); + const std::filesystem::path output{"relative/custom-result.h5"}; + const std::vector diagnostics{ + {fesa::Severity::kWarning, "original-warning", {"source.inp", 3U}, + "NODE", "0003", "Original diagnostic."}}; + WriterCalls calls; + RecordingWriter linear{calls}; + RecordingWriter + nonlinear{calls}; + RecordingWriter + eigen{calls}; + RecordingWriter + dynamic{calls}; + RecordingWriter + thermal{calls}; + RecordingSolidWriter solid{calls}; + auto outcomes = EmptyOutcomes(); + const std::array families{0U, 1U, 2U, 3U, 5U, 6U, 7U}; + ASSERT_EQ(outcomes.size(), families.size()); + for (std::size_t index = 0U; index < outcomes.size(); ++index) { + const auto status = fesa::WritePreparedAnalysisResult( + output, domain.Value(), outcomes[index], diagnostics, linear, + nonlinear, eigen, &dynamic, &thermal, &solid); + ASSERT_EQ(calls.families.size(), index + 1U); + EXPECT_EQ(calls.families.back(), families[index]); + EXPECT_EQ(calls.paths.back(), &output); + EXPECT_EQ(calls.domains.back(), &domain.Value()); + EXPECT_EQ(calls.diagnostics.back(), &diagnostics); + EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics()[0U].code, "candidate-close-failure"); + EXPECT_EQ(status.Diagnostics()[0U].location.file, "source.inp"); + EXPECT_EQ(status.Diagnostics()[0U].location.line, 7U); + EXPECT_EQ(status.Diagnostics()[0U].keyword, "WRITER"); + EXPECT_EQ(status.Diagnostics()[0U].entity_identity, "0007"); + EXPECT_EQ(status.Diagnostics()[0U].message, "Preserved writer failure."); + } + EXPECT_EQ(linear.received, + &std::get(outcomes[0U]).state); + EXPECT_EQ(nonlinear.received, + &std::get(outcomes[1U]).state); + EXPECT_EQ(eigen.received, &std::get(outcomes[2U])); + EXPECT_EQ(dynamic.received, + &std::get(outcomes[3U]).state); + EXPECT_EQ(thermal.received, nullptr); + EXPECT_EQ(solid.static_state, + &std::get(outcomes[4U]).state); + EXPECT_EQ(solid.frequency_state, + &std::get(outcomes[5U])); + EXPECT_EQ(solid.dynamic_state, + &std::get(outcomes[6U]).state); +} + +TEST(PreparedResultsWriter, MissingOptionalAdapterInvokesNoOtherWriter) { + auto domain = fesa::Domain::Create({}); + ASSERT_TRUE(domain.HasValue()); + WriterCalls calls; + RecordingWriter linear{calls}; + RecordingWriter + nonlinear{calls}; + RecordingWriter + eigen{calls}; + auto outcomes = EmptyOutcomes(); + const std::array codes{ + "missing-dynamic-writer", "missing-solid-writer", + "missing-solid-writer", "missing-solid-writer"}; + const std::array keywords{"DYNAMIC", "", "", ""}; + for (std::size_t index = 3U; index < outcomes.size(); ++index) { + const auto status = fesa::WritePreparedAnalysisResult( + "explicit.h5", domain.Value(), outcomes[index], {}, linear, nonlinear, + eigen); + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics()[0U].code, codes[index - 3U]); + EXPECT_EQ(status.Diagnostics()[0U].keyword, keywords[index - 3U]); + EXPECT_TRUE(calls.families.empty()); + } +} diff --git a/tests/unit/solvers/linear/linear_solver_test.cpp b/tests/unit/solvers/linear/linear_solver_test.cpp index b9b95aa..98025f3 100644 --- a/tests/unit/solvers/linear/linear_solver_test.cpp +++ b/tests/unit/solvers/linear/linear_solver_test.cpp @@ -2,13 +2,22 @@ #include +#include +#include +#include #include #include #include +#include "fesa/analysis/linear_frequency_procedure.h" +#include "fesa/analysis/solid_frequency_procedure.h" +#include "fesa/solvers/eigen/eigen_solver.h" +#include "fesa/solvers/eigen/mkl_feast_eigen_solver.h" #include "fesa/fem/dof_manager.h" #include "fesa/math/sparse_matrix.h" #include "fesa/solvers/linear/mkl_pardiso_solver.h" +#include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" +#include "solvers/linear/pardiso_session_test_seam.h" namespace { @@ -125,3 +134,277 @@ TEST(MklPardisoSolver, RejectsInvalidCsrStateAndDimensions) { EXPECT_EQ(no_diagonal_status.Diagnostics().front().code, "solver-missing-diagonal"); } + +namespace { + +class RecordingEigenSolver final : public fesa::EigenSolver { + public: + explicit RecordingEigenSolver(bool& destroyed) : destroyed_(destroyed) {} + ~RecordingEigenSolver() override { destroyed_ = true; } + + fesa::Result Solve( + const fesa::SparseMatrix& matrix, std::size_t modes, + double scale) const override { + EXPECT_EQ(matrix.Rows(), 0U); + EXPECT_EQ(modes, 3U); + EXPECT_DOUBLE_EQ(scale, 7.0); + ++standard_calls; + return fesa::Result::Failure( + fesa::Status::Failure(fesa::FailureCategory::kSolver, {})); + } + + fesa::Result SolveGeneralized( + const fesa::SparseMatrix& stiffness, const fesa::SparseMatrix& mass, + std::size_t modes, double lower_bound, + double scale) const override { + EXPECT_EQ(stiffness.Rows(), 0U); + EXPECT_EQ(mass.Rows(), 0U); + EXPECT_EQ(modes, 4U); + EXPECT_DOUBLE_EQ(lower_bound, 2.0); + EXPECT_DOUBLE_EQ(scale, 11.0); + ++generalized_calls; + return fesa::Result::Failure( + fesa::Status::Failure(fesa::FailureCategory::kSolver, {})); + } + + mutable int standard_calls{0}; + mutable int generalized_calls{0}; + + private: + bool& destroyed_; +}; + +} // namespace + +TEST(EigenSolverContract, DispatchesBothPencilsAndDestroysThroughBase) { + static_assert(std::is_abstract_v); + static_assert(std::has_virtual_destructor_v); + static_assert(std::is_base_of_v); + static_assert(std::is_constructible_v); + static_assert(std::is_constructible_v); + bool destroyed = false; + { + auto recording = std::make_unique(destroyed); + const auto* observations = recording.get(); + std::unique_ptr solver = std::move(recording); + const fesa::EigenSolver& contract = *solver; + const auto empty = MakeDenseCsr(0U, 0U, {}); + EXPECT_FALSE(contract.Solve(empty, 3U, 7.0).HasValue()); + EXPECT_FALSE(contract.SolveGeneralized(empty, empty, 4U, 2.0, 11.0) + .HasValue()); + EXPECT_EQ(observations->standard_calls, 1); + EXPECT_EQ(observations->generalized_calls, 1); + EXPECT_FALSE(destroyed); + } + EXPECT_TRUE(destroyed); +} + +TEST(PardisoSession, RetainsDistinctStoragePoliciesAndFreshPhaseOrder) { + std::vector phases; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall& call, + MKL_INT&, MKL_INT&) { + phases.push_back(static_cast(call.phase)); + if (call.phase == 11) { + EXPECT_EQ(call.equation_count, 2); + if (call.matrix_type == 2) { + EXPECT_EQ(call.row_offsets[2], 3); + EXPECT_EQ(call.column_indices[0], 0); + EXPECT_EQ(call.column_indices[1], 1); + EXPECT_EQ(call.column_indices[2], 1); + } else { + EXPECT_EQ(call.matrix_type, 11); + EXPECT_EQ(call.row_offsets[2], 4); + EXPECT_DOUBLE_EQ(call.values[2], 0.0); + } + } + }}; + { + fesa::MklPardisoSolver solver; + const auto matrix = MakeDenseCsr(2U, 2U, {4.0, 1.0, 1.0, 3.0}); + ASSERT_TRUE(solver.Factorize(matrix).IsOk()); + fesa::Vector solution{2U}; + ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 1.0}, solution).IsOk()); + EXPECT_NEAR(solution[0], 2.0 / 11.0, 1e-14); + ASSERT_TRUE(solver.Solve(fesa::Vector{2U, 2.0}, solution).IsOk()); + EXPECT_NEAR(solution[1], 6.0 / 11.0, 1e-14); + ASSERT_TRUE(solver.Factorize(matrix).IsOk()); + } + EXPECT_EQ(phases, (std::vector{11, 22, 33, 33, -1, 11, 22, -1})); + phases.clear(); + { + fesa::MklPardisoTangentSolver solver; + const auto matrix = MakeDenseCsr(2U, 2U, {2.0, 1.0, 0.0, 3.0}); + ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()); + fesa::Vector correction{2U}; + ASSERT_TRUE(solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction).IsOk()); + EXPECT_NEAR(correction[0], 2.0, 1e-14); + EXPECT_NEAR(correction[1], 2.0, 1e-14); + ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()); + } + EXPECT_EQ(phases, (std::vector{11, 22, 33, -1, 11, 22, -1})); +} + +TEST(PardisoSession, FailedSolvePreservesOutputAndRetainedFactorization) { + int solve_calls = 0; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall& call, + MKL_INT& error, MKL_INT&) { + if (call.phase != 33) return; + ++solve_calls; + if (solve_calls == 1) error = -3; + if (solve_calls == 2) + call.solution[0] = (std::numeric_limits::infinity)(); + }}; + fesa::MklPardisoSolver solver; + ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, 1U, {2.0})).IsOk()); + fesa::Vector solution{1U, 17.0}; + const auto failed = solver.Solve(fesa::Vector{1U, 6.0}, solution); + ASSERT_FALSE(failed.IsOk()); + EXPECT_EQ(failed.Diagnostics().front().code, "pardiso-solve-failed"); + EXPECT_DOUBLE_EQ(solution[0], 17.0); + const auto nonfinite = solver.Solve(fesa::Vector{1U, 6.0}, solution); + ASSERT_FALSE(nonfinite.IsOk()); + EXPECT_EQ(nonfinite.Diagnostics().front().code, "nonfinite-solver-solution"); + EXPECT_DOUBLE_EQ(solution[0], 17.0); + ASSERT_TRUE(solver.Solve(fesa::Vector{1U, 6.0}, solution).IsOk()); + EXPECT_DOUBLE_EQ(solution[0], 3.0); +} + +TEST(PardisoSession, ReleaseFailurePrecedesNewValidationAndInvalidatesState) { + int releases = 0; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall& call, + MKL_INT& error, MKL_INT&) { + if (call.phase == -1) { ++releases; error = -3; } + }}; + fesa::MklPardisoSolver solver; + ASSERT_TRUE(solver.Factorize(MakeDenseCsr(1U, 1U, {2.0})).IsOk()); + const auto status = solver.Factorize(MakeDenseCsr(1U, 2U, {1.0, 2.0})); + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Diagnostics().front().code, "pardiso-release-failed"); + fesa::Vector output{1U, 19.0}; + const auto unavailable = solver.Solve(fesa::Vector{1U, 1.0}, output); + ASSERT_FALSE(unavailable.IsOk()); + EXPECT_EQ(unavailable.Diagnostics().front().code, "solver-not-factorized"); + EXPECT_DOUBLE_EQ(output[0], 19.0); + EXPECT_EQ(releases, 1); +} + +TEST(PardisoSession, FactorizationFailuresAndExceptionsReleaseExactlyOnce) { + const auto matrix = MakeDenseCsr(1U, 1U, {2.0}); + for (const int failing_phase : {11, 22}) { + std::vector phases; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall& call, + MKL_INT& error, MKL_INT&) { + phases.push_back(static_cast(call.phase)); + if (call.phase == failing_phase) error = -8; + }}; + { + fesa::MklPardisoSolver solver; + const auto status = solver.Factorize(matrix); + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Diagnostics().front().code, "pardiso-integer-overflow"); + fesa::Vector output{1U, 29.0}; + EXPECT_FALSE(solver.Solve(fesa::Vector{1U, 1.0}, output).IsOk()); + EXPECT_DOUBLE_EQ(output[0], 29.0); + } + EXPECT_EQ(phases, failing_phase == 11 ? (std::vector{11, -1}) + : (std::vector{11, 22, -1})); + } + std::vector phases; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall& call, + MKL_INT&, MKL_INT&) { + phases.push_back(static_cast(call.phase)); + if (call.phase == 11) throw std::runtime_error("injected unwind"); + }}; + { + fesa::MklPardisoTangentSolver solver; + EXPECT_THROW(solver.FactorizeFresh(matrix), std::runtime_error); + EXPECT_EQ(phases, (std::vector{11, -1})); + } + EXPECT_EQ(phases, (std::vector{11, -1})); +} + +TEST(PardisoSession, FailedTangentSolveRetainsStateButFailedFreshInvalidatesIt) { + bool fail_solve = true; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall& call, + MKL_INT& error, MKL_INT&) { + if (call.phase == 33 && fail_solve) error = -3; + }}; + fesa::MklPardisoTangentSolver solver; + ASSERT_TRUE(solver.FactorizeFresh( + MakeDenseCsr(2U, 2U, {2.0, 1.0, 0.0, 3.0})).IsOk()); + fesa::Vector correction{2U, 31.0}; + auto status = solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction); + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Diagnostics().front().code, "pardiso-solve-failed"); + EXPECT_DOUBLE_EQ(correction[0], 31.0); + EXPECT_DOUBLE_EQ(correction[1], 31.0); + fail_solve = false; + ASSERT_TRUE(solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction).IsOk()); + EXPECT_NEAR(correction[0], 2.0, 1e-14); + EXPECT_NEAR(correction[1], 2.0, 1e-14); + status = solver.FactorizeFresh(MakeDenseCsr(1U, 2U, {1.0, 2.0})); + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Diagnostics().front().code, "solver-matrix-not-square"); + status = solver.SolveCorrection(fesa::Vector{2U, 6.0}, correction); + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Diagnostics().front().code, "solver-not-factorized"); + EXPECT_NEAR(correction[0], 2.0, 1e-14); + EXPECT_NEAR(correction[1], 2.0, 1e-14); +} + +TEST(PardisoSession, EmptyLifecycleNeverInvokesBackend) { + int calls = 0; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall&, MKL_INT&, MKL_INT&) { + ++calls; + }}; + { + fesa::MklPardisoSolver solver; + fesa::MklPardisoTangentSolver tangent; + const auto empty = MakeDenseCsr(0U, 0U, {}); + fesa::Vector solution{0U}; + ASSERT_TRUE(solver.Factorize(empty).IsOk()); + ASSERT_TRUE(solver.Solve(fesa::Vector{0U}, solution).IsOk()); + ASSERT_TRUE(solver.Factorize(empty).IsOk()); + ASSERT_TRUE(tangent.FactorizeFresh(empty).IsOk()); + ASSERT_TRUE(tangent.SolveCorrection(fesa::Vector{0U}, solution).IsOk()); + ASSERT_TRUE(tangent.FactorizeFresh(empty).IsOk()); + } + EXPECT_EQ(calls, 0); +} + +TEST(PardisoSession, RestoresDefaultThreadPolicyAndPreservesCallerOverride) { + const int previous = mkl_set_num_threads_local(0); + struct RestoreThreads { + int previous; + ~RestoreThreads() { mkl_set_num_threads_local(previous); } + } restore{previous}; + const auto matrix = MakeDenseCsr(1U, 1U, {2.0}); + for (const int caller_threads : {0, 2}) { + mkl_set_num_threads_local(caller_threads); + int release_calls = 0; + fesa::internal::ScopedPardisoBackendTestHook hook{ + [&](const fesa::internal::PardisoBackendTestCall& call, + MKL_INT& error, MKL_INT&) { + EXPECT_EQ(mkl_get_max_threads(), caller_threads == 0 ? 1 : 2); + if (call.phase == 22) error = -8; + if (call.phase == -1) ++release_calls; + }}; + { + fesa::MklPardisoSolver solver; + EXPECT_FALSE(solver.Factorize(matrix).IsOk()); + EXPECT_EQ(mkl_set_num_threads_local(caller_threads), caller_threads); + } + EXPECT_EQ(release_calls, 1); + EXPECT_EQ(mkl_set_num_threads_local(caller_threads), caller_threads); + } +}