Skip to content
Merged
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
30 changes: 30 additions & 0 deletions scripts/start/prepare.R
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,27 @@
# | REMIND License Exception, version 1.0 (see LICENSE file).
# | Contact: remind@pik-potsdam.de

library(stringr)
library(glue)

#' check if delimiters only occur paired in a file. No nesting allowed.
#'
#' @param file_path where to check
#' @param openDelim string of the open delimiter
#' @param closeDelim string of the closing delimiter
#'
#' @return boolean
validatePairedDelimiters <- function(file_path, openDelim = "$onDelim", closeDelim = "$offDelim") {
content <- paste(readLines(file_path, warn = FALSE), collapse = "\n")
matches <- str_extract_all(content, glue("{str_escape(openDelim)}|{str_escape(closeDelim)}"))[[1]]

# Build expected alternating sequence
expected <- rep_len(c(openDelim, closeDelim), length(matches))

# Valid if matches alternating pattern AND count is even
return(length(matches) %% 2 == 0 && identical(matches, expected))
}

prepare <- function() {

timePrepareStart <- Sys.time()
Expand Down Expand Up @@ -227,6 +248,15 @@ prepare <- function() {
' are missing. Call RSE immediately')
}

# $offlisting appears in main.gms but the current process does not let it survive into full.gms
# therefore all cs3r/cs4r file contents are dumped directly into the full.lst
# to avoid this we add $offlisting manually at $onDelim present at each include of a cs4r/cs3r
# first do a sanity check on "$onDelim", "$offDelim"
if (!validatePairedDelimiters(dumpFilePath, "$onDelim", "$offDelim")) {
stop("We either have nested $onDelim/$offDelim blocks (unnecessarily large) or $onDelim/$offDelim are not correctly matched.")
}
lucode2::manipulateFile(dumpFilePath, list(c("$onDelim", "$offlisting\n$onDelim"), c("$offDelim", "$offDelim\n$onlisting")), fixed = TRUE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should it be deleted everywhere where it is already used?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately $offlisting does not get passed to the full.gms at all. The creation of full.gms removes all instances of it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems to be a side effect of dumpopt=21 here:

exitcode <- system2(cfg$gamsv, c(tmpModelFile, "action=c", "dumpopt=21",

file.rename(from[exist], to[exist])

if ( 0 < exitcode ) {
Expand Down
Loading