Skip to content

Commit c222c9a

Browse files
committed
Progress towards a CRAN submission / release workflow
1 parent 01670a2 commit c222c9a

32 files changed

+312
-53
lines changed

R/bart.R

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
#' test_set_pct <- 0.2
6767
#' n_test <- round(test_set_pct*n)
6868
#' n_train <- n - n_test
69-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
69+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
7070
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
7171
#' X_test <- X[test_inds,]
7272
#' X_train <- X[train_inds,]
@@ -511,7 +511,7 @@ bart <- function(X_train, y_train, W_train = NULL, group_ids_train = NULL,
511511
#' test_set_pct <- 0.2
512512
#' n_test <- round(test_set_pct*n)
513513
#' n_train <- n - n_test
514-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
514+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
515515
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
516516
#' X_test <- X[test_inds,]
517517
#' X_train <- X[train_inds,]
@@ -637,7 +637,7 @@ predict.bartmodel <- function(bart, X_test, W_test = NULL, group_ids_test = NULL
637637
#' test_set_pct <- 0.2
638638
#' n_test <- round(test_set_pct*n)
639639
#' n_train <- n - n_test
640-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
640+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
641641
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
642642
#' X_test <- X[test_inds,]
643643
#' X_train <- X[train_inds,]

R/bcf.R

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
#' test_set_pct <- 0.2
8686
#' n_test <- round(test_set_pct*n)
8787
#' n_train <- n - n_test
88-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
88+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
8989
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
9090
#' X_test <- X[test_inds,]
9191
#' X_train <- X[train_inds,]
@@ -787,7 +787,7 @@ bcf <- function(X_train, Z_train, y_train, pi_train = NULL, group_ids_train = NU
787787
#' test_set_pct <- 0.2
788788
#' n_test <- round(test_set_pct*n)
789789
#' n_train <- n - n_test
790-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
790+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
791791
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
792792
#' X_test <- X[test_inds,]
793793
#' X_train <- X[train_inds,]
@@ -965,7 +965,7 @@ predict.bcf <- function(bcf, X_test, Z_test, pi_test = NULL, group_ids_test = NU
965965
#' test_set_pct <- 0.2
966966
#' n_test <- round(test_set_pct*n)
967967
#' n_train <- n - n_test
968-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
968+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
969969
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
970970
#' X_test <- X[test_inds,]
971971
#' X_train <- X[train_inds,]
@@ -1051,7 +1051,7 @@ getRandomEffectSamples.bcf <- function(object, ...){
10511051
#' test_set_pct <- 0.2
10521052
#' n_test <- round(test_set_pct*n)
10531053
#' n_train <- n - n_test
1054-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
1054+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
10551055
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
10561056
#' X_test <- X[test_inds,]
10571057
#' X_train <- X[train_inds,]
@@ -1182,7 +1182,7 @@ convertBCFModelToJson <- function(object){
11821182
#' test_set_pct <- 0.2
11831183
#' n_test <- round(test_set_pct*n)
11841184
#' n_train <- n - n_test
1185-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
1185+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
11861186
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
11871187
#' X_test <- X[test_inds,]
11881188
#' X_train <- X[train_inds,]
@@ -1254,7 +1254,7 @@ saveBCFModelToJsonFile <- function(object, filename){
12541254
#' test_set_pct <- 0.2
12551255
#' n_test <- round(test_set_pct*n)
12561256
#' n_train <- n - n_test
1257-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
1257+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
12581258
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
12591259
#' X_test <- X[test_inds,]
12601260
#' X_train <- X[train_inds,]
@@ -1390,7 +1390,7 @@ createBCFModelFromJson <- function(json_object){
13901390
#' test_set_pct <- 0.2
13911391
#' n_test <- round(test_set_pct*n)
13921392
#' n_train <- n - n_test
1393-
#' test_inds <- sort(sample(1:n, n_test, replace = F))
1393+
#' test_inds <- sort(sample(1:n, n_test, replace = FALSE))
13941394
#' train_inds <- (1:n)[!((1:n) %in% test_inds)]
13951395
#' X_test <- X[test_inds,]
13961396
#' X_train <- X[train_inds,]

cran-bootstrap.R

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
# Derived from a combination of
2+
#
3+
# 1) The bootstrap.R files in the arrow-adbc suite of R packages,
4+
# https://github.com/apache/arrow-adbc/tree/main/r, all of which are Apache
5+
# licensed with the following copyright:
6+
# Copyright 2022 The Apache Software Foundation
7+
#
8+
# 2) LightGBM's build-cran-package.sh script,
9+
# https://github.com/microsoft/LightGBM/blob/master/build-cran-package.sh,
10+
# which is MIT licensed with the following copyright:
11+
# Copyright (c) Microsoft Corporation
12+
13+
# Use xfun for find and replace in files / directories
14+
# require(xfun)
15+
# if (!require(xfun)) {
16+
# install.packages("xfun")
17+
# }
18+
19+
# Create the stochtree_cran folder
20+
cran_dir <- "stochtree_cran"
21+
if (!dir.exists(cran_dir)) {
22+
dir.create(cran_dir, recursive = TRUE)
23+
}
24+
25+
# Copy the "core" package files to CRAN folder
26+
src_files <- list.files("src", recursive = TRUE, full.names = TRUE)
27+
pybind_src_files <- list.files("src", pattern = "^(py_)", recursive = TRUE, full.names = TRUE)
28+
r_src_files <- src_files[!(src_files %in% pybind_src_files)]
29+
pkg_core_files <- c(
30+
".Rbuildignore",
31+
"DESCRIPTION",
32+
"LICENSE",
33+
"LICENSE.md",
34+
list.files("man", recursive = TRUE, full.names = TRUE),
35+
"NAMESPACE",
36+
list.files("R", recursive = TRUE, full.names = TRUE),
37+
r_src_files,
38+
list.files("test/r", recursive = TRUE, full.names = TRUE),
39+
list.files("vignettes", recursive = TRUE, full.names = TRUE)
40+
)
41+
pkg_core_files_dst <- file.path(cran_dir, pkg_core_files)
42+
if (all(file.exists(pkg_core_files))) {
43+
n_removed <- suppressWarnings(sum(file.remove(pkg_core_files_dst)))
44+
if (n_removed > 0) {
45+
cat(sprintf("Removed %d previously vendored files from temporary CRAN directory (%s)\n", n_removed, cran_dir))
46+
}
47+
48+
cat(
49+
sprintf(
50+
"Copying core package files to CRAN subdirectory\n"
51+
)
52+
)
53+
54+
# Recreate the directory structure
55+
dst_dirs <- unique(dirname(pkg_core_files_dst))
56+
for (dst_dir in dst_dirs) {
57+
if (!dir.exists(dst_dir)) {
58+
dir.create(dst_dir, recursive = TRUE)
59+
}
60+
}
61+
62+
if (all(file.copy(pkg_core_files, pkg_core_files_dst))) {
63+
cat("All core package files successfully copied to CRAN subdirectory\n")
64+
} else {
65+
stop("Failed to copy all core package files")
66+
}
67+
}
68+
69+
# Overwrite PKG_CPPFLAGS in src/Makevars
70+
cran_makevars <- file.path(cran_dir, "src/Makevars")
71+
makevars_lines <- readLines(cran_makevars)
72+
makevars_lines[grep("^(PKG_CPPFLAGS)", makevars_lines)] <- "PKG_CPPFLAGS= -I$(PKGROOT)/src/include"
73+
writeLines(makevars_lines, cran_makevars)
74+
75+
# Copy fast_double_parser header to an include/ subdirectory of src/
76+
header_folders <- c("nlohmann", "stochtree")
77+
header_files_to_vendor_src <- c()
78+
header_files_to_vendor_dst <- c()
79+
for (header_folder in header_folders) {
80+
# Existing source files
81+
header_subfolder_src <- paste0("include/", header_folder)
82+
header_filenames_src <- list.files(header_subfolder_src, recursive = TRUE)
83+
header_src <- file.path(header_subfolder_src, header_filenames_src)
84+
header_files_to_vendor_src <- c(header_files_to_vendor_src, header_src)
85+
86+
# Destination files
87+
header_subfolder_dst <- paste0(cran_dir, "/src/include/", header_folder)
88+
header_dst <- file.path(header_subfolder_dst, basename(header_src))
89+
header_files_to_vendor_dst <- c(header_files_to_vendor_dst, header_dst)
90+
}
91+
92+
fast_double_parser_src <- file.path("deps/fast_double_parser/include/fast_double_parser.h")
93+
fast_double_parser_dst <- file.path(cran_dir, "src/include/fast_double_parser.h")
94+
if (file.exists(fast_double_parser_src)) {
95+
file_removed <- suppressWarnings(sum(file.remove(fast_double_parser_dst)) > 0)
96+
if (file_removed) {
97+
cat(sprintf("Removed previously vendored fast_double_parser.h file from src/include\n"))
98+
}
99+
100+
cat(
101+
sprintf(
102+
"Vendoring fast_double_parser.h file from deps/fast_double_parser/include to src/include\n"
103+
)
104+
)
105+
106+
# Recreate the directory structure
107+
dst_dir <- dirname(fast_double_parser_dst)
108+
if (!dir.exists(dst_dir)) {
109+
dir.create(dst_dir, recursive = TRUE)
110+
}
111+
112+
if (file.copy(fast_double_parser_src, fast_double_parser_dst)) {
113+
cat("fast_double_parser.h header file successfully copied to src/include\n")
114+
} else {
115+
stop("Failed to vendor fast_double_parser.h header file")
116+
}
117+
}
118+
119+
# Copy include/ headers to an include/ subdirectory of src/
120+
header_folders <- c("nlohmann", "stochtree")
121+
header_files_to_vendor_src <- c()
122+
header_files_to_vendor_dst <- c()
123+
for (header_folder in header_folders) {
124+
# Existing source files
125+
header_subfolder_src <- paste0("include/", header_folder)
126+
header_filenames_src <- list.files(header_subfolder_src, recursive = TRUE)
127+
header_src <- file.path(header_subfolder_src, header_filenames_src)
128+
header_files_to_vendor_src <- c(header_files_to_vendor_src, header_src)
129+
130+
# Destination files
131+
header_subfolder_dst <- paste0(cran_dir, "/src/include/", header_folder)
132+
header_dst <- file.path(header_subfolder_dst, basename(header_src))
133+
header_files_to_vendor_dst <- c(header_files_to_vendor_dst, header_dst)
134+
}
135+
136+
if (all(file.exists(header_files_to_vendor_src))) {
137+
n_removed <- suppressWarnings(sum(file.remove(header_files_to_vendor_dst)))
138+
if (n_removed > 0) {
139+
cat(sprintf("Removed %d previously vendored files from src/include\n", n_removed))
140+
}
141+
142+
cat(
143+
sprintf(
144+
"Vendoring files from include/ to src/include\n"
145+
)
146+
)
147+
148+
# Recreate the directory structure
149+
dst_dirs <- unique(dirname(header_files_to_vendor_dst))
150+
for (dst_dir in dst_dirs) {
151+
if (!dir.exists(dst_dir)) {
152+
dir.create(dst_dir, recursive = TRUE)
153+
}
154+
}
155+
156+
if (all(file.copy(header_files_to_vendor_src, header_files_to_vendor_dst))) {
157+
cat("All include/ header files successfully copied to src/include\n")
158+
} else {
159+
stop("Failed to vendor all include/ header files")
160+
}
161+
}
162+
163+
# Copy fmt headers to an include/ subdirectory of src/
164+
fmt_header_files_to_vendor_src <- c()
165+
fmt_header_files_to_vendor_dst <- c()
166+
# Existing source files
167+
fmt_header_subfolder_src <- "deps/fmt/include/fmt"
168+
fmt_header_filenames_src <- list.files(fmt_header_subfolder_src, pattern = "\\.(h)$", recursive = TRUE)
169+
fmt_header_files_to_vendor_src <- file.path(fmt_header_subfolder_src, fmt_header_filenames_src)
170+
# Destination files
171+
fmt_header_subfolder_dst <- "src/include/fmt"
172+
fmt_header_files_to_vendor_dst <- file.path(cran_dir, fmt_header_subfolder_dst, basename(fmt_header_filenames_src))
173+
174+
if (all(file.exists(fmt_header_files_to_vendor_src))) {
175+
n_removed <- suppressWarnings(sum(file.remove(fmt_header_files_to_vendor_dst)))
176+
if (n_removed > 0) {
177+
cat(sprintf("Removed %d previously vendored files from src/include/fmt\n", n_removed))
178+
}
179+
180+
cat(
181+
sprintf(
182+
"Vendoring files from deps/fmt/include/ to src/include/fmt\n"
183+
)
184+
)
185+
186+
# Recreate the directory structure
187+
dst_dirs <- unique(dirname(fmt_header_files_to_vendor_dst))
188+
for (dst_dir in dst_dirs) {
189+
if (!dir.exists(dst_dir)) {
190+
dir.create(dst_dir, recursive = TRUE)
191+
}
192+
}
193+
194+
if (all(file.copy(fmt_header_files_to_vendor_src, fmt_header_files_to_vendor_dst))) {
195+
cat("All deps/fmt/include/ header files successfully copied to src/include/fmt\n")
196+
} else {
197+
stop("Failed to vendor all deps/fmt/include/ header files")
198+
}
199+
}
200+
201+
# Copy Eigen module headers to an include/Eigen subdirectory of src/
202+
eigen_modules <- c("Cholesky", "Core", "Dense", "Eigenvalues", "Geometry", "Householder", "IterativeLinearSolvers", "Jacobi", "LU", "OrderingMethods", "QR", "SVD", "Sparse", "SparseCholesky", "SparseCore", "SparseLU", "SparseQR", "misc", "plugins")
203+
eigen_files_to_vendor_src <- c()
204+
eigen_files_to_vendor_dst <- c()
205+
for (eigen_mod in eigen_modules) {
206+
# Existing source files
207+
eigen_module_subfolder_src <- paste0("deps/eigen/Eigen/src/", eigen_mod)
208+
# eigen_module_filenames_src <- list.files(eigen_module_subfolder_src, recursive = TRUE)
209+
# eigen_module_source_src <- file.path(eigen_module_subfolder_src, eigen_module_filenames_src)
210+
eigen_module_source_src <- list.files(eigen_module_subfolder_src, recursive = TRUE, full.names = TRUE)
211+
if (eigen_mod %in% c("misc", "plugins")) {
212+
eigen_files_to_vendor_src <- c(eigen_files_to_vendor_src, eigen_module_source_src)
213+
} else {
214+
eigen_module_header_src <- file.path("deps/eigen/Eigen", eigen_mod)
215+
eigen_files_to_vendor_src <- c(eigen_files_to_vendor_src, eigen_module_header_src, eigen_module_source_src)
216+
}
217+
218+
# Destination files
219+
eigen_module_source_dst <- gsub("deps/eigen/Eigen", paste0(cran_dir, "/src/include/Eigen"), eigen_module_source_src)
220+
if (eigen_mod %in% c("misc", "plugins")) {
221+
eigen_files_to_vendor_dst <- c(eigen_files_to_vendor_dst, eigen_module_source_dst)
222+
} else {
223+
eigen_module_header_dst <- file.path(cran_dir, "src/include/Eigen", eigen_mod)
224+
eigen_files_to_vendor_dst <- c(eigen_files_to_vendor_dst, eigen_module_header_dst, eigen_module_source_dst)
225+
}
226+
}
227+
228+
if (all(file.exists(eigen_files_to_vendor_src))) {
229+
n_removed <- suppressWarnings(sum(file.remove(eigen_files_to_vendor_dst)))
230+
if (n_removed > 0) {
231+
cat(sprintf("Removed %d previously vendored files from src/include/Eigen\n", n_removed))
232+
}
233+
234+
cat(
235+
sprintf(
236+
"Vendoring files from deps/eigen to src/include/Eigen\n"
237+
)
238+
)
239+
240+
# Recreate the directory structure
241+
dst_dirs <- unique(dirname(eigen_files_to_vendor_dst))
242+
for (dst_dir in dst_dirs) {
243+
if (!dir.exists(dst_dir)) {
244+
dir.create(dst_dir, recursive = TRUE)
245+
}
246+
}
247+
248+
if (all(file.copy(eigen_files_to_vendor_src, eigen_files_to_vendor_dst))) {
249+
cat("All Eigen files successfully copied to src/include/Eigen\n")
250+
} else {
251+
stop("Failed to vendor all Eigen files")
252+
}
253+
}

cran-cleanup.R

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Create the stochtree_cran folder
2+
cran_dir <- "stochtree_cran"
3+
if (dir.exists(cran_dir)) {
4+
# cran_subfolder_files <- list.files(cran_dir, recursive = TRUE, full.names = TRUE)
5+
unlink(cran_dir, recursive = TRUE)
6+
}

include/stochtree/common.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
#include <vector>
2929

3030
#define FMT_HEADER_ONLY
31-
#include "../../deps/fast_double_parser/include/fast_double_parser.h"
32-
#include "../../deps/fmt/include/fmt/format.h"
31+
#include <fast_double_parser.h>
32+
#include <fmt/format.h>
3333

3434
#ifdef _MSC_VER
3535
#include <intrin.h>

man/bart.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/bcf.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/convertBCFModelToJson.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/createBCFModelFromJson.Rd

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)