Skip to content
Open
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
@@ -0,0 +1,3 @@
## 2024-05-24 - Expensive operations in R
**Learning:** Common performance bottlenecks in math-heavy R libraries often come from duplicated operations in algebraic functions, such as Cholesky decompositions or matrix inversions. Due to CRAN checks, any arbitrary test scripts we write to evaluate these improvements shouldn't be left in the root package directory.
**Action:** When working on math-heavy code, always search for repeated expensive computations, cache their results, and verify the improvements. Make sure to delete any local test scripts prior to submission to avoid interfering with CRAN submission checks.
Comment on lines +1 to +3
12 changes: 8 additions & 4 deletions R/vuongtest.R
Original file line number Diff line number Diff line change
Expand Up @@ -271,10 +271,14 @@ calcLambda <- function(object1, object2, n, score1, score2, vc1, vc2) {
AB2 <- calcAB(object2, n, score2, vc2)
Bc <- calcBcross(AB1$sc, AB2$sc, n)

W <- cbind(rbind(-AB1$B %*% chol2inv(chol(AB1$A)),
t(Bc) %*% chol2inv(chol(AB1$A))),
rbind(-Bc %*% chol2inv(chol(AB2$A)),
AB2$B %*% chol2inv(chol(AB2$A))))
# Bolt Optimization: Cache matrix inversions to prevent redundant $O(p^3)$ computation
invA1 <- chol2inv(chol(AB1$A))
invA2 <- chol2inv(chol(AB2$A))

W <- cbind(rbind(-AB1$B %*% invA1,
t(Bc) %*% invA1),
rbind(-Bc %*% invA2,
AB2$B %*% invA2))

lamstar <- eigen(W, only.values=TRUE)$values
## Discard imaginary part, as it only occurs for tiny eigenvalues?
Expand Down