From 2873afff39cb86c7318a55d311794765c2a2e0e8 Mon Sep 17 00:00:00 2001 From: simonpcouch Date: Fri, 25 Apr 2025 12:41:00 -0500 Subject: [PATCH 1/3] remove support for foreach --- DESCRIPTION | 2 +- NEWS.md | 4 ++++ R/fit_members.R | 32 ++++++++------------------------ 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 677f374..a2469d2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -22,7 +22,7 @@ Imports: cli, doFuture, dplyr (>= 1.1.0), - foreach, + furrr, future, generics, ggplot2, diff --git a/NEWS.md b/NEWS.md index 04ee603..9ba7389 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,10 @@ * Added missing commas and addressed formatting issues throughout the vignettes and articles. Backticks for package names were removed and missing parentheses for functions were added (@Joscelinrocha, #218). * Increased the minimum R version to R 4.1. + +* Transitioned support for parallel processing fully to the + [future](https://www.futureverse.org/) framework. Parallelism backends + registered with foreach will be ignored (#234). # stacks 1.0.5 diff --git a/R/fit_members.R b/R/fit_members.R index 707f595..ef17bbd 100644 --- a/R/fit_members.R +++ b/R/fit_members.R @@ -129,32 +129,16 @@ fit_members <- function(model_stack, ...) { ) } - if (foreach::getDoParWorkers() > 1 || future::nbrOfWorkers() > 1) { - `%do_op%` <- switch( - # note some backends can return +Inf - min(future::nbrOfWorkers(), 2), - foreach::`%dopar%`, - doFuture::`%dofuture%` - ) - } else { - `%do_op%` <- foreach::`%do%` - } - # fit each of them member_fits <- - foreach::foreach( - mem = member_names, - .inorder = FALSE, - .options.future = list(seed = TRUE) - ) %do_op% - { - asNamespace("stacks")$fit_member( - name = mem, - wflows = model_stack[["model_defs"]], - members_map = members_map, - train_dat = dat - ) - } + furrr::future_map( + member_names, + .f = fit_member, + wflows = model_stack[["model_defs"]], + members_map = members_map, + train_dat = dat, + .options = furrr::furrr_options(seed = TRUE) + ) model_stack[["member_fits"]] <- setNames(member_fits, member_names) From 245fa2296eed6014401dd3fc026faf4e9cdffffe Mon Sep 17 00:00:00 2001 From: simonpcouch Date: Wed, 30 Apr 2025 10:06:16 -0500 Subject: [PATCH 2/3] raise a warning with foreach only --- NEWS.md | 2 +- R/fit_members.R | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 9ba7389..565cd2d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -9,7 +9,7 @@ * Transitioned support for parallel processing fully to the [future](https://www.futureverse.org/) framework. Parallelism backends - registered with foreach will be ignored (#234). + registered with foreach will be ignored with a warning (#234). # stacks 1.0.5 diff --git a/R/fit_members.R b/R/fit_members.R index ef17bbd..700a0fb 100644 --- a/R/fit_members.R +++ b/R/fit_members.R @@ -129,6 +129,10 @@ fit_members <- function(model_stack, ...) { ) } + if (uses_foreach_only()) { + warn_foreach_deprecation() + } + # fit each of them member_fits <- furrr::future_map( @@ -253,7 +257,8 @@ check_for_required_packages <- function(x) { purrr::map( pkgs, - function(.x) suppressPackageStartupMessages(requireNamespace(.x, quietly = TRUE)) + function(.x) + suppressPackageStartupMessages(requireNamespace(.x, quietly = TRUE)) ) invisible(TRUE) @@ -274,3 +279,17 @@ error_needs_install <- function(pkgs, installed, call) { is_installed_ <- function(pkg) { rlang::is_installed(pkg) } + +uses_foreach_only <- function() { + future::nbrOfWorkers() == 1 && foreach::getDoParWorkers() > 1 +} + +warn_foreach_deprecation <- function() { + cli::cli_warn(c( + "!" = "{.pkg stacks} detected a parallel backend registered with \\ + foreach but no backend registered with future.", + "i" = "Support for parallel processing with foreach was \\ + deprecated in {.pkg stacks} 1.0.6.", + "i" = "See {.help tune::parallelism} to learn more." + )) +} From f5fd346569eb8aeed1f2f2a886ce812392af8a67 Mon Sep 17 00:00:00 2001 From: simonpcouch Date: Wed, 30 Apr 2025 10:17:29 -0500 Subject: [PATCH 3/3] clean up R CMD check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses: ``` ❯ checking dependencies in R code ... WARNING '::' or ':::' import not declared from: ‘foreach’ Namespace in Imports field not imported from: ‘doFuture’ All declared Imports should be used. ❯ checking R code for possible problems ... NOTE multi_net_helper : : no visible binding for global variable ‘.sum’ (/home/runner/work/stacks/stacks/check/stacks.Rcheck/00_pkg_src/stacks/R/expressions.R:175-184) Undefined global functions or variables: .sum ``` Considering inlining `foreach::getDoParWorkers()` but will just remove that dependency when the warning is removed. --- DESCRIPTION | 2 +- R/utils.R | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index a2469d2..167778e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,8 +20,8 @@ Depends: Imports: butcher (>= 0.1.3), cli, - doFuture, dplyr (>= 1.1.0), + foreach, furrr, future, generics, diff --git a/R/utils.R b/R/utils.R index a35fff1..34b7707 100644 --- a/R/utils.R +++ b/R/utils.R @@ -21,6 +21,7 @@ utils::globalVariables(c( ".metric", ".pred", ".pred_class", + ".sum", "across", "any_of", "as.formula",