Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@
## 2026-07-11 - R μ–Έμ–΄μ—μ„œ 루프 λ‚΄ 벑터 동적 ν™•μž₯ 및 쑰건뢀 탐색 μ΅œμ ν™”
**Learning:** Rμ—μ„œ for 루프 내에 λ™μ μœΌλ‘œ 벑터 크기λ₯Ό λŠ˜λ¦¬λ©΄μ„œ (`vector[i] <- value`) 쑰건을 κ²€μ‚¬ν•˜λŠ” 것은 O(N^2)의 볡사 μ˜€λ²„ν—€λ“œ(copy-on-modify)λ₯Ό λ°œμƒμ‹œν‚€λ©° λ§€ λ°˜λ³΅λ§ˆλ‹€ `match()` μŠ€μΊ”μ„ μˆ˜ν–‰ν•˜λ©΄ μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€.
**Action:** 루프 외뢀에 λ²‘ν„°ν™”λœ `match()`λ₯Ό ν•œ 번만 μˆ˜ν–‰ν•˜μ—¬ μœ νš¨ν•œ 인덱슀λ₯Ό μ°Ύκ³ , 벑터 인덱싱(`vector[idx]`)으둜 ν•œ λ²ˆμ— 데이터λ₯Ό μΆ”μΆœν•˜μ—¬ λΆˆν•„μš”ν•œ 루프 μ˜€λ²„ν—€λ“œ 및 동적 λ©”λͺ¨λ¦¬ μž¬ν• λ‹Ήμ„ λ°©μ§€ν•˜μ—¬ O(1) μˆ˜μ€€μœΌλ‘œ μ„±λŠ₯을 κ°œμ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€.
## 2024-07-12 - R μ–Έμ–΄μ—μ„œ λ°μ΄ν„°ν”„λ ˆμž„ μ„œλΈŒμ…‹νŒ… μ‹œ λΆˆν•„μš”ν•œ which() 및 반볡 평가 제거
**Learning:** 데이터 ν”„λ ˆμž„μ˜ νŠΉμ • 둜우(row)λ₯Ό λ³€κ²½ν•  λ•Œ `df[which(df$col == "val"), ]`와 같이 `which()`λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ μΆ”κ°€ ν•¨μˆ˜ 호좜 및 논리 벑터 평가 μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•©λ‹ˆλ‹€. λ˜ν•œ, μ—¬λŸ¬ 값을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ λ™μΌν•œ 쑰건식을 μ—°μ†μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ 맀번 λ™μΌν•œ O(N) 논리 벑터 평가가 μ€‘λ³΅ν•΄μ„œ μΌμ–΄λ‚©λ‹ˆλ‹€. λΆˆν•„μš”ν•œ `paste0("GROUP")` ν˜ΈμΆœλ„ μ˜€λ²„ν—€λ“œλ₯Ό λ”ν•©λ‹ˆλ‹€.
**Action:** `which()`λ₯Ό μƒλž΅ν•˜κ³  직접 논리 인덱싱(`df$col == "val"`)을 μ‚¬μš©ν•˜λ©°, λ™μΌν•œ 쑰건식을 두 번 이상 μ—°μ†μœΌλ‘œ μ‚¬μš©ν•  경우 ν•΄λ‹Ή 논리 벑터λ₯Ό λ³€μˆ˜μ— 캐싱(`idx <- df$col == "val"`)ν•˜μ—¬ μ—¬λŸ¬ 번 μž¬μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ€‘λ³΅λœ O(N) μ„ ν˜• μŠ€μΊ”μ„ ν”Όν•˜κ³  μ„±λŠ₯을 μ΅œμ ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ λΆˆν•„μš”ν•œ λ¬Έμžμ—΄ 연산을 μ œκ±°ν•©λ‹ˆλ‹€.
50 changes: 22 additions & 28 deletions R/aFIPC.R
Original file line number Diff line number Diff line change
Expand Up @@ -598,19 +598,15 @@ autoFIPC <-
# Preserve mirt's structural estimability flags. Forcing every row TRUE
# frees boundary parameters such as 2PL g/u and makes the Hessian unstable.

NewScaleParms[which(NewScaleParms$item == paste0('GROUP')), "est"] <-
FALSE
OldScaleParms[which(OldScaleParms$item == paste0('GROUP')), "est"] <-
FALSE
NewScaleParms[NewScaleParms$item == 'GROUP', "est"] <- FALSE
OldScaleParms[OldScaleParms$item == 'GROUP', "est"] <- FALSE

NewScaleParms[which(NewScaleParms$name == "COV_11"), "est"] <-
TRUE
OldScaleParms[which(OldScaleParms$name == "COV_11"), "est"] <-
TRUE
NewScaleParms[NewScaleParms$name == "COV_11", "est"] <- TRUE
OldScaleParms[OldScaleParms$name == "COV_11", "est"] <- TRUE

if (itemtype == 'Rasch') {
NewScaleParms[which(NewScaleParms$name == "a1"), "est"] <- FALSE
OldScaleParms[which(OldScaleParms$name == "a1"), "est"] <- FALSE
NewScaleParms[NewScaleParms$name == "a1", "est"] <- FALSE
OldScaleParms[OldScaleParms$name == "a1", "est"] <- FALSE
}

#IPD
Expand Down Expand Up @@ -814,8 +810,8 @@ autoFIPC <-
length(attr(newFormModel@ParObjects$lrPars, 'parnum')) != 0 &&
length(attr(oldFormModel@ParObjects$lrPars, 'parnum')) != 0
) {
newBetaIdx <- which(NewScaleParms$item == 'BETA')
oldBetaIdx <- which(OldScaleParms$item == 'BETA')
newBetaIdx <- NewScaleParms$item == 'BETA'
oldBetaIdx <- OldScaleParms$item == 'BETA'

NewScaleParms[newBetaIdx, "value"] <-
OldScaleParms[oldBetaIdx, "value"]
Expand Down Expand Up @@ -853,18 +849,18 @@ autoFIPC <-
if (forceNormalZeroOne) {
freeMEAN <- F

NewScaleParms[which(NewScaleParms$name == "COV_11"), "est"] <-
FALSE
OldScaleParms[which(OldScaleParms$name == "COV_11"), "est"] <-
FALSE
NewScaleParms[which(NewScaleParms$name == "MEAN_11"), "est"] <-
FALSE
OldScaleParms[which(OldScaleParms$name == "MEAN_11"), "est"] <-
FALSE
NewScaleParms[which(NewScaleParms$name == "COV_11"), "value"] <-
1
OldScaleParms[which(OldScaleParms$name == "MEAN_11"), "value"] <-
0
new_cov11_idx <- NewScaleParms$name == "COV_11"
old_cov11_idx <- OldScaleParms$name == "COV_11"
new_mean11_idx <- NewScaleParms$name == "MEAN_11"
old_mean11_idx <- OldScaleParms$name == "MEAN_11"

NewScaleParms[new_cov11_idx, "est"] <- FALSE
OldScaleParms[old_cov11_idx, "est"] <- FALSE
NewScaleParms[new_mean11_idx, "est"] <- FALSE
OldScaleParms[old_mean11_idx, "est"] <- FALSE

NewScaleParms[new_cov11_idx, "value"] <- 1
OldScaleParms[old_mean11_idx, "value"] <- 0
}
if (freeMEAN == T) {
LinkedModelSyntax <-
Expand All @@ -875,10 +871,8 @@ autoFIPC <-
'MEAN = F1'
))

NewScaleParms[which(NewScaleParms$name == "MEAN_1"), "est"] <-
TRUE
OldScaleParms[which(OldScaleParms$name == "MEAN_1"), "est"] <-
TRUE
NewScaleParms[NewScaleParms$name == "MEAN_1", "est"] <- TRUE
OldScaleParms[OldScaleParms$name == "MEAN_1", "est"] <- TRUE
} else {
LinkedModelSyntax <-
mirt::mirt.model(paste0(
Expand Down
Loading