From 5f1de7a722c68aea9c3250f9952e4dc3d9e5ce32 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Tue, 30 Jun 2026 09:01:02 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20mirt::fscores()=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=ED=98=B8=EC=B6=9C=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit aFIPC::autoFIPC() 내부에서 모델별로 (old, linked, new) MAP 기반 Theta 값을 구하는 mirt::fscores() 함수가 불필요하게 두 번씩 호출되고 있었습니다 (한 번은 예상 점수 산출 시점, 한 번은 Theta 자체 반환 시점). 해당 연산은 비용이 크므로(expensive operation), Theta 변수에 먼저 값을 할당(pre-calculate)한 뒤 예상 점수 산출 함수(mirt::expected.test)의 인자로 재사용하도록 개선했습니다. 이를 통해 중복 연산을 제거하고 성능을 향상시켰습니다. --- .Rbuildignore | 2 ++ .jules/bolt.md | 3 +++ R/aFIPC.R | 16 ++++++++-------- 3 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 .jules/bolt.md diff --git a/.Rbuildignore b/.Rbuildignore index 1c85620..b85d639 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -15,3 +15,5 @@ ^registered_agents\.json$ ^task_agent_mapping\.json$ ^\.gitleaks\.toml$ +^\.jules$ +^\.jules/.* diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..780242c --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2024-07-25 - Prevent redundant expensive operations (mirt::fscores) +**Learning:** In the `aFIPC` package, calculating `mirt::fscores(..., method = 'MAP')` is an expensive operation. Previously, it was called redundantly: once to calculate expected scores (`mirt::expected.test`) and once again to return the `Theta` variables. +**Action:** Always pre-calculate expensive operations like `fscores` and store them in variables to reuse them, avoiding redundant CPU cycles. diff --git a/R/aFIPC.R b/R/aFIPC.R index 81b6cc9..c60048f 100644 --- a/R/aFIPC.R +++ b/R/aFIPC.R @@ -1002,28 +1002,28 @@ autoFIPC <- # stop('Estimation failed. Please check test quality.') # } + # calculate theta + ThetaOldform <- fscores(oldFormModel, method = 'MAP') + ThetaLinkedform <- fscores(LinkedModel, method = 'MAP') + ThetaNewform <- fscores(newFormModel, method = 'MAP') + # calculate expected score ExpectedScoreOldform <- mirt::expected.test( x = oldFormModel, - Theta = fscores(oldFormModel, method = 'MAP') + Theta = ThetaOldform ) ExpectedScoreLinkedform <- mirt::expected.test( x = LinkedModel, - Theta = fscores(LinkedModel, method = 'MAP') + Theta = ThetaLinkedform ) ExpectedScoreNewform <- mirt::expected.test( x = newFormModel, - Theta = fscores(newFormModel, method = 'MAP') + Theta = ThetaNewform ) - # calculate theta - ThetaOldform <- fscores(oldFormModel, method = 'MAP') - ThetaLinkedform <- fscores(LinkedModel, method = 'MAP') - ThetaNewform <- fscores(newFormModel, method = 'MAP') - # save results as object modelReturn <- new.env() modelReturn$oldFormModel <- oldFormModel