From dadaf2f5cdc8020f21e3afbb3eca0b7a535d5b48 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Wed, 29 Jul 2026 07:53:16 +0200 Subject: [PATCH 1/6] chore: Use PMcore 0.26.2 Also introduces a flag that ensures that the user is only warned about a missing PmetricsReports package only once per session. --- Cargo.lock | 17 +++++++++-------- R/PM_report.R | 17 ++++++++++++++++- src/rust/Cargo.toml | 2 +- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1f73445d..440934e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1458,9 +1458,9 @@ dependencies = [ [[package]] name = "pharmsol" -version = "0.28.2" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "517dcb31d91e7ef22317abc4a636602a27c96fe895306e5e66a6618c79a8b259" +checksum = "0900c715396930974e65a3afcd6870b9bfb20f64fff58f85e892acaa84460128" dependencies = [ "ahash", "argmin", @@ -1488,19 +1488,20 @@ dependencies = [ [[package]] name = "pharmsol-dsl" -version = "0.28.2" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bc3d888e264fe8b8ff3beb013b6cc5a7e7aef7e7183125ceacc287e39cca1a" +checksum = "d6b6a128eb248ea8c3380b6494287043a4897f996cc31edd31f46b6b198c2060" dependencies = [ "serde", "serde_json", + "thiserror 2.0.18", ] [[package]] name = "pharmsol-macros" -version = "0.28.2" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe9df0be821a8064e4b95e30d17edac93461ab6e1514b17db154047ff6a1e12" +checksum = "94a0f0d3c3248ead2fbbabbad7591f0758d9e0820b40821bcbf231d583deb396" dependencies = [ "pharmsol-dsl", "proc-macro2", @@ -1529,9 +1530,9 @@ dependencies = [ [[package]] name = "pmcore" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f104417c52358763982b02c1617499f1ad6349d5e6f342d504f477d98166676" +checksum = "282b27fdcb5b2d65c016262413fe7aaf2918461e374515717dd32fc95537c5ea" dependencies = [ "anyhow", "argmin", diff --git a/R/PM_report.R b/R/PM_report.R index 0186e64b..39c1ca6f 100755 --- a/R/PM_report.R +++ b/R/PM_report.R @@ -22,6 +22,21 @@ requireNamespace(package, quietly = TRUE) } +# Environment used to track state for the current R session, e.g. whether +# a given warning has already been shown once this session. +.report_session_state <- new.env(parent = emptyenv()) + +#' @param key Character string uniquely identifying the warning. +#' @param message A named character vector passed to `cli::cli_warn()`. +#' @noRd +.report_warn_once <- function(key, message) { + if (isTRUE(.report_session_state[[key]])) { + return(invisible(NULL)) + } + .report_session_state[[key]] <- TRUE + cli::cli_warn(message) +} + .report_app_runner <- function() { getExportedValue("PmetricsReports", "run_app") } @@ -164,7 +179,7 @@ PM_report <- function(x, template, path, show = TRUE, quiet = TRUE) { } if (!.report_dependency_available("PmetricsReports")) { - cli::cli_warn(c( + .report_warn_once("PmetricsReports_unavailable", c( "!" = "The {.pkg PmetricsReports} package is not available.", "i" = "Falling back to legacy HTML report generation.", "i" = "{.code install.packages('PmetricsReports', repos = 'https://lapkb.r-universe.dev')} for a better experience." diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index 9230a3c3..dacb8376 100755 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -9,7 +9,7 @@ name = 'pm_rs' [dependencies] extendr-api = "=0.9.0" -pmcore = { version = "0.26.1", features = ["dsl-jit"] } +pmcore = { version = "0.26.2", features = ["dsl-jit"] } rayon = "1.12.0" anyhow = "1.0.103" From 837d1f2b2cc15402e9bce9c1f4f7e58400d5cab8 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Wed, 29 Jul 2026 09:06:50 +0200 Subject: [PATCH 2/6] chore: Cleanup unused files and code --- NAMESPACE | 1 - R/PMpatch.R | 10 -- R/PMutilities.R | 183 +---------------------------------- data-raw/errors.xlsx | Bin 54732 -> 0 bytes inst/mac/install_homebrew.sh | 1 - man/PMpatch.Rd | 17 ---- 6 files changed, 4 insertions(+), 208 deletions(-) delete mode 100755 R/PMpatch.R delete mode 100755 data-raw/errors.xlsx delete mode 100755 inst/mac/install_homebrew.sh delete mode 100755 man/PMpatch.Rd diff --git a/NAMESPACE b/NAMESPACE index b9a175e7..7ee32116 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -80,7 +80,6 @@ export(PMgetCRCL) export(PMload) export(PMmatrixRelTime) export(PMnews) -export(PMpatch) export(PMreadDefaults) export(PMreport) export(PMsave) diff --git a/R/PMpatch.R b/R/PMpatch.R deleted file mode 100755 index 8030affb..00000000 --- a/R/PMpatch.R +++ /dev/null @@ -1,10 +0,0 @@ -#' Download and install Pmetrics patches from LAPK website -#' -#' @title Download and install Pmetrics patches -#' @return A Pmetrics patch which will be installed via \code{source} -#' @author Michael Neely -#' @export - -PMpatch <- function() { - source("http://www.lapk.org/patch.R") -} diff --git a/R/PMutilities.R b/R/PMutilities.R index 12458ded..2b698301 100755 --- a/R/PMutilities.R +++ b/R/PMutilities.R @@ -1,125 +1,3 @@ -# This file contains internal Pmetrics utility functions -# BUG FIX wmy.2017.04.12 The Femke error polynomial quandry. -# -# wmy.2017.04.12 -# -# Symptoms: -# For NPrun(...data=RunNo...) the RunNo/wrk/working_files are copied to the new -# NPAG run. The working files include an error polynomial. NPAG -# uses this error polynomial instead of the error function requested in the -# model.txt file for the new optimization. -# -# Relevant observations: -# 1) NPprep() reads the name of the model.txt file, just prior to -# determining if data=RunNo or a new *.csv file. -# -# Solution: Immediately after determining that data=RunNo AND is.integer(RunNo) == T, -# compare the #ERR block of /RunNo/input/model.txt to the model.txt for the current -# run. If equivalent, no problem -- if different, then use the /RunNo/input/*.csv -# as a "new" dataset and generate working files from it. Soution reqs the following -# two utility functions: -# 1) compareTwoModelERRs <- function(mod1,mod2) -# 2) - -# -# This function compares two model.txt file #ERR blocks and returns T/F if -# the same or different, respectively. -# -# Below is MN's code as of 12/3/18 - -compareTwoModelERRs <- function(mod1, mod2) { - getAssErr <- function(model) { - blocks <- parseBlocks(model) - if (length(grep(";", blocks$primVar)) > 0) { - # using ';' as separator - sep <- ";" - } else { - if (length(grep(",", blocks$primVar)) > 0) { - # using ',' as separator - sep <- "," - } else { - return(F) - } - } - blocks$error <- tolower(gsub("[[:space:]]", "", blocks$error)) - gamlam <- grep("^g|^l", blocks$error) - asserr <- gsub(sep, " ", blocks$error[-gamlam]) - return(asserr) - } - asserr1 <- getAssErr(mod1) - asserr2 <- getAssErr(mod2) - return(identical(asserr1, asserr2)) -} - -# This utility gets a block of information from a past run instr.inx file. -# -# TODO -# 1) add parameter for pathToInstFile -- currently just assumes this is "../ -# which should be fine b/c the only reason to use this utility is -# to compare old instructions to a new NPAG run instructions. Therefore, -# the user should be calling this utility from a /.../Runs/new_run/ directory, -# and the old instructions will be in ../data/etc/instr.inx, where data is -# the interger identifier of the old run. -# 2) Write error checking code for: if a file or directory exists, -# if an instr is a valid phrase, if old.data is an integer, REM* is the -# first line and is not preceded by a HEADER line, PAR(I) is treated as -# regex instead of as plain text, -# -getNPinstr <- function(old.data, instr) { - Ifile <- paste("../", old.data, "/etc/instr.inx", sep = "") - # The header lines for all instruction blocks in old.data (lines that begin w/a " ") - HLs <- grep(" ", readLines(Ifile)) - lines <- readLines(Ifile) - FirstChar <- substring(lines, 1, 1) - HLs <- which(FirstChar == " ") - # The header line for the requested instruction block - dataHeaderLine <- (grep(instr, readLines(Ifile), ignore.case = T)) - # The desired block is in instr.inx[dataHeaderLine:HLs[dataHeaderLine+1]] - instrBlockStart <- HLs[which(HLs == dataHeaderLine)] + 1 - instrBlockStop <- HLs[which(HLs == dataHeaderLine) + 1] - 1 - if ((instrBlockStop - instrBlockStart) > -1) { - read1 <- readLines(Ifile, n = instrBlockStop) - InstrBlock <- read1[instrBlockStart:instrBlockStop] - } else { - InstrBlock <- -99 - } - return(InstrBlock) -} -# wmy ########### END of Femke Error Polynomial Quandry - -# make pretty log axes -logAxis <- function(side, grid = F, ...) { - pow <- log10(axTicks(side)) - pow[1] <- ceiling(pow[1]) - pow[length(pow)] <- floor(pow[length(pow)]) - pow <- round(pow, 0) - pow <- unique(pow) - ticksat1 <- 10^pow - ticksat2 <- as.vector(sapply(pow, function(p) (1:9) * 10^p)) - labels <- formatC(ticksat1, digits = 5, format = "g") - for (i in 1:length(labels)) { - if (length(grep("e", labels[i])) > 0) labels[i] <- as.expression(substitute(10^x, list(x = log10(ticksat1[i])))) - } - axis(side, ticksat1, labels = labels, tcl = -0.5, lwd = 0, lwd.ticks = 1, ...) - axis(side, ticksat2, labels = NA, tcl = -0.25, lwd = 0, lwd.ticks = 1, ...) - - if (grid & (side == 1 | side == 3)) abline(v = ticksat2, col = "lightgray", lty = 1) - if (grid & (side == 2 | side == 4)) abline(h = ticksat2, col = "lightgray", lty = 1) -} - - -# sample from multivariate normal distribution, code modified from mvtnorm package -rmnorm <- function(n, mean, sigma) { - sigma1 <- sigma - ev <- eigen(sigma, symmetric = TRUE) - retval <- ev$vectors %*% diag(sqrt(ev$values), length(ev$values)) %*% - t(ev$vectors) - retval <- matrix(rnorm(n * ncol(sigma)), nrow = n) %*% retval - retval <- sweep(retval, 2, mean, "+") - colnames(retval) <- names(mean) - retval -} - # density function for the multivariate normal distribution, code from mvtnorm package dmv_norm <- function( x, mean = rep(0, p), sigma = diag(p), log = FALSE, @@ -167,20 +45,7 @@ dmv_norm <- function( } } - openHTML <- function(x) { - if (file.exists(x)) { - utils::browseURL(normalizePath(x, winslash = "/", mustWork = FALSE)) - } else { - cli::cli_warn(c( - "!" = "HTML file not found: {.val {x}}.", - "i" = "Please check the path and try again." - )) - } - } - # parse NP_RF file only for final cycle information; used for bootstrapping - # indpts,ab,corden,nvar,nactve,iaddl,icyctot,par - - + random_name <- function() { n <- 1 a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE)) @@ -188,22 +53,7 @@ dmv_norm <- function( } - # check for numeric id and convert to number if necessary - checkID <- function(id) { - id <- gsub("^[[:blank:]]+", "", id) - id <- gsub("[[:blank:]]+$", "", id) - idNonNum <- suppressWarnings(any(is.na(as.numeric(id)))) - if (!idNonNum) id <- as.numeric(id) - return(id) - } - - # extract pattern from strings - strparse <- function(pattern, x) { - match <- regexpr(pattern, x, ignore.case = T) - start <- match[1] - stop <- match[1] + attr(match, "match.length") - 1 - return(substr(x, start, stop)) - } + # parse blocks in new model template @@ -270,34 +120,9 @@ dmv_norm <- function( return(blocks) } # end parseBlocks - # check all blocks statements for more than maxwidth characters and insert line break if necessary - chunks <- function(x, maxwidth = 60) { - for (i in 1:length(x)) { - for (j in 1:length(x[[i]])) { - temp <- x[[i]][j] - if (nchar(temp) > maxwidth) { - numchunks <- floor(nchar(temp) / maxwidth) - if (nchar(temp) %% maxwidth > 0) numchunks <- numchunks + 1 - splitchunks <- vector("character", numchunks) - chunkindex <- c(seq(0, numchunks * maxwidth, maxwidth), nchar(temp)) - for (k in 1:numchunks) { - splitchunks[k] <- substr(temp, chunkindex[k] + 1, chunkindex[k + 1]) - } - x[[i]][j] <- paste(splitchunks, collapse = "\n & ") - } - } - } - return(x) - } # end chunks - - # change dX[digit] to XP(digit) and X[digit] to X(digit) - fortranize <- function(block) { - block <- purrr::map_chr(block, ~ gsub("dX\\[(\\d+)\\]", "XP\\(\\1\\)", .x, ignore.case = T, perl = T)) - block <- purrr::map_chr(block, ~ gsub("BOLUS\\[\\d+\\]", "", .x, ignore.case = T, perl = T)) - block <- purrr::map_chr(block, ~ gsub("\\[(\\d+)\\]", "\\(\\1\\)", .x, ignore.case = T, perl = T)) - return(block) - } + + # get the next line when building a file like instructions getNext <- function(build) { diff --git a/data-raw/errors.xlsx b/data-raw/errors.xlsx deleted file mode 100755 index 6d607a02b8225bea3583e88500a32c48b2768283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54732 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

}8o__oE+{N&xob6Tyg#MQnib#IlQRfXomf zkd8S_w|#&CtK`}WyqXh5z;y2sg^ z+`YE|ub>#r?R}1|0QOD?AIDEQm)=`9#ic zAc$+r*M(b8!grh4BoXt8WCOq-;&uP1o&p?*`uqW`!~t+1L`*QRHh|5})%dK^eeebL z@(iX5&MK$zUT`X0UwVGE%3&4)@y-*k3!n=P-9e}3P!O!o!+WIVrn<$Cj?x9-*I8Ni z$iKh~*oteZtIo_a8JLQOfe0Q}OF;yz{Bf)#Ui)a>xEpDDZCoim?1(yVaYUx04!|$C z&J7JQ+4F11t0ot1G8EMb>T~SadH>EXFcM%ubj}ZTys&*#B2X% z-G>S8XfDD7%s_+5=tOsPeV@iI@TWL&?r7Y6X!7hVea#p0xq8k|iYxtR;AvPwq&3QT z!B=TBy#8B$%mFv4l=QGwZ-R++X_D}|ne3z_>1Zo+AG}G@eT&b(rH7?W32wag)AK8! zO?}h*R{G|RRP4x+zP?IJOaN}oq(<53vk^NHEO^$~ZCAiL;U`+->dJ9rAC$i77jV`T zjGQ%xo*2j4}AJZ@9xL&jOj^zhq3_H9*f{y{@AzFm70!z zJMS&iK6V(z72@vZ*jTk(@%4fQ{Go_DIWo{`euWZ+3xxPs@YVkP4otj zEFGWwxxSd8sDtSo?yq}HMvD0f2h0ap8}d5xbbm@cqqW#zTPFIP=jwbCuL5=sHRl-o z%luUwHYoE_(T!0`)hOA}GBovjPN`L45AU>|w(qXVlnL=Le@e}GT-{u!H|N!%RaEZ_ z&cj!#kv5{dszm-c5+%#4-MRjCV$0729^!m+dcQ4~zO*ywwqtJJ(2YFn*n6UCv#x*x zTUyap<}&VsnLA^9%g?7FJ1T^~nKp;GTsqp*rFr{@eiX2GJ z=dJ%^gLzp}T~=X_(REuh+uQh^ zzMMfn?AU}sKjHCc;^E6v{h009+{WlhzDq~-8Yw2?c9T&`-#=5jUoVYpk+G}J?X$&L z1adS=uGnwHEb-`E!qDi856ia=Xg3T57el5#-+p(P;}PsqG-?1HT;o(pEq{4!e^!}M zj96!jFnzQ8S1ZwEQOZ@ddh2?t742-umP^elc_mm@+WIJ>x8ORfr0b^Sl5=%uKjS`D zp6ZL5j*T$XAn3Rz1fhKpYAe-^AT2E|sOaaO?|yjM$9e%lkPmoX2dv*O#Rz!`OTtHy z?U3^Og~Er_X?8ZK)T;$ShVNBiU5u~92=`jO^Gr*vH~bS19g`xsfX0(sY8e)yefI2rS{PYAbS8R zuTqk4)qtRcD7)E~Q;DR={X}A<+(Kn9RB%STI~G9@>iWV)#4lF(gb<^nK|hc;sfyym z>R-UI08zYGE3hvMJ2353!avGD+qd0QgH|iG;Uwr!pvIAcso^o9WV`t2s2#KAO-NAw zc%x*C4;i6U8CBKX>cF$%9znsHW7V-LvP^B@(J$Ky#?g_IJ8kH*_6?o}qEQP4`VeAI6R z>8z);Z;KrYgZYDD;X(3fKI9+-qA?J>rIJ|P`!6v$43DRf-wiFrh9VG^18dOmLaS;+ z&oBPQP%%(c8e#_YGM<9SaQ_uy@~*!zRJ_uwG@Q?IlGB>rFU5%3-3txp8oRLL=D!V5 pc5(VurHjf_!TdA4vJ1OSrHi6jXdex5l7b*(a9avW7dzxze*!I=E_MI_ diff --git a/inst/mac/install_homebrew.sh b/inst/mac/install_homebrew.sh deleted file mode 100755 index bb791e56..00000000 --- a/inst/mac/install_homebrew.sh +++ /dev/null @@ -1 +0,0 @@ -ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \ No newline at end of file diff --git a/man/PMpatch.Rd b/man/PMpatch.Rd deleted file mode 100755 index c8ea69ad..00000000 --- a/man/PMpatch.Rd +++ /dev/null @@ -1,17 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/PMpatch.R -\name{PMpatch} -\alias{PMpatch} -\title{Download and install Pmetrics patches} -\usage{ -PMpatch() -} -\value{ -A Pmetrics patch which will be installed via \code{source} -} -\description{ -Download and install Pmetrics patches from LAPK website -} -\author{ -Michael Neely -} From eb37e36b396ec92bde15582140079222a70308d9 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Wed, 29 Jul 2026 09:08:34 +0200 Subject: [PATCH 3/6] Cleaning --- R/PMconfig.R | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/R/PMconfig.R b/R/PMconfig.R index 3a7c7a88..8328503a 100755 --- a/R/PMconfig.R +++ b/R/PMconfig.R @@ -1,21 +1,3 @@ -# Returns environment variables used throughout Pmetrics - -getPMpath <- function() { - # return Pmetrics installation folder - paste(.libPaths(), "Pmetrics", sep = "/") |> - keep(file.exists) |> - pluck(1) # ensure only one path returned (should be unnecessary) -} - -getBits <- function() { - if (.Machine$sizeof.pointer == 8) { - return(64) - } else if (.Machine$sizeof.pointer == 4) { - return(32) - } else { - stop("Unknown architecture") - } -} getFixedColNames <- function() { # set current names of fixed columns in data file @@ -47,7 +29,3 @@ getFixedColNum <- function() { # set current number of fixed columns in data file length(getFixedColNames()) } - -.getApiKey <- function() { - return("qoc+7YRUCCK7BmOJrkzNRY6gKzXIGzPPR6IoefaZpOtPkEsKwO48vkCPM18G97Y9") -} From 1263d302025dddadc4745884312f71ca88d165b8 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Wed, 29 Jul 2026 09:36:22 +0200 Subject: [PATCH 4/6] Update _pkgdown.yml --- _pkgdown.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/_pkgdown.yml b/_pkgdown.yml index b3a9865d..3a7d8beb 100755 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -134,7 +134,6 @@ reference: - PM_build - PM_help - PMcheck - - PMpatch - PMtest - PM_tutorial - setPMoptions From 0ed9c56c784c101c5e3018d463d82a355352248a Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Wed, 29 Jul 2026 09:46:53 +0200 Subject: [PATCH 5/6] Trigger CI after updating Codecov token From 242dbd0618829de07fbb2a81c339e6331b1b3e91 Mon Sep 17 00:00:00 2001 From: Markus <66058642+mhovd@users.noreply.github.com> Date: Wed, 29 Jul 2026 14:19:33 +0200 Subject: [PATCH 6/6] Remove rust remnants --- get-dependencies/Cargo.toml | 6 ------ get-dependencies/src/main.rs | 3 --- 2 files changed, 9 deletions(-) delete mode 100755 get-dependencies/Cargo.toml delete mode 100755 get-dependencies/src/main.rs diff --git a/get-dependencies/Cargo.toml b/get-dependencies/Cargo.toml deleted file mode 100755 index ac2f2eb8..00000000 --- a/get-dependencies/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "get-dependencies" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/get-dependencies/src/main.rs b/get-dependencies/src/main.rs deleted file mode 100755 index e7a11a96..00000000 --- a/get-dependencies/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -}