From d5644e87de25072922976e10582af0d2095f91fa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 03:11:46 +0000 Subject: [PATCH 1/4] Initial plan From d02a82b9665fccae93b52998fcdc02e29aec8b0e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 03:14:33 +0000 Subject: [PATCH 2/4] Normalize beta parameter string aliases to TRUE/FALSE before calling downstream functions Co-authored-by: smasongarrison <6001608+smasongarrison@users.noreply.github.com> --- R/simulatePedigree.R | 21 ++++++++---- R/simulatePedigree_within.R | 25 +++++++++----- tests/testthat/test-simulatePedigree.R | 45 ++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 14 deletions(-) diff --git a/R/simulatePedigree.R b/R/simulatePedigree.R index a5ecfa1d..401d0dfa 100644 --- a/R/simulatePedigree.R +++ b/R/simulatePedigree.R @@ -27,7 +27,18 @@ buildBetweenGenerations <- function(df_Fam, Ngen, sizeGens, verbose = FALSE, mar momID = "momID", dadID = "dadID", code_male = "M", code_female = "F", beta = FALSE) { - if (beta == TRUE || beta %in% c("optimized", "index", "indexed")) { + # Normalize string aliases to logical values for downstream functions + use_optimized <- FALSE + + if (isTRUE(beta) || beta %in% c("optimized", "index", "indexed")) { + use_optimized <- TRUE + } else if (isFALSE(beta) || beta %in% c("base", "original") || is.null(beta)) { + use_optimized <- FALSE + } else { + stop("Invalid value for beta parameter. Use TRUE/'optimized' or FALSE/'base'.") + } + + if (use_optimized) { df_Fam <- buildBetweenGenerations_optimized( df_Fam = df_Fam, Ngen = Ngen, @@ -42,9 +53,9 @@ buildBetweenGenerations <- function(df_Fam, Ngen, sizeGens, verbose = FALSE, mar dadID = dadID, code_male = code_male, code_female = code_female, - beta = beta + beta = TRUE ) - } else if (beta == FALSE || beta %in% c("base", "original") || is.null(beta)) { + } else { df_Fam <- buildBetweenGenerations_base( df_Fam = df_Fam, Ngen = Ngen, @@ -59,10 +70,8 @@ buildBetweenGenerations <- function(df_Fam, Ngen, sizeGens, verbose = FALSE, mar dadID = dadID, code_male = code_male, code_female = code_female, - beta = beta + beta = FALSE ) - } else { - stop("Invalid value for beta parameter. Use TRUE/'optimized' or FALSE/'base'.") } return(df_Fam) } diff --git a/R/simulatePedigree_within.R b/R/simulatePedigree_within.R index e2548b4a..d7549827 100644 --- a/R/simulatePedigree_within.R +++ b/R/simulatePedigree_within.R @@ -17,7 +17,20 @@ buildWithinGenerations <- function( code_female = "F", fam_shift = 1L ) { - if (beta == TRUE || beta == "optimized") { + # Normalize string aliases to logical values for downstream functions + use_optimized <- FALSE + + if (isTRUE(beta) || identical(beta, "optimized")) { + use_optimized <- TRUE + } else if (beta %in% c("index", "indexed")) { + stop("The 'index' or 'indexed' option for parameter 'beta' is not yet implemented.") + } else if (isFALSE(beta) || is.null(beta)) { + use_optimized <- FALSE + } else { + stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', or 'index'.") + } + + if (use_optimized) { df_Fam <- buildWithinGenerations_optimized( sizeGens = sizeGens, marR = marR, @@ -30,11 +43,9 @@ buildWithinGenerations <- function( code_male = code_male, code_female = code_female, fam_shift = fam_shift, - beta = beta + beta = TRUE ) - } else if (beta %in% c("index", "indexed")) { - stop("The 'index' or 'indexed' option for parameter 'beta' is not yet implemented.") - } else if (beta == FALSE || is.null(beta)) { + } else { df_Fam <- buildWithinGenerations_base( sizeGens = sizeGens, marR = marR, @@ -47,10 +58,8 @@ buildWithinGenerations <- function( code_male = code_male, code_female = code_female, fam_shift = fam_shift, - beta = beta + beta = FALSE ) - } else { - stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', or 'index'.") } return(df_Fam) } diff --git a/tests/testthat/test-simulatePedigree.R b/tests/testthat/test-simulatePedigree.R index 52dfa1c7..21903a75 100644 --- a/tests/testthat/test-simulatePedigree.R +++ b/tests/testthat/test-simulatePedigree.R @@ -165,3 +165,48 @@ test_that("simulatePedigree verbose prints updates", { message("Beta option Ending: ", beta) } }) + +test_that("simulatePedigree accepts string aliases for beta parameter", { + seed <- 5 + Ngen <- 4 + kpc <- 4 + sexR <- .50 + marR <- .7 + strict_tolerance <- 1e-8 + + # Test that "optimized" string alias works + set.seed(seed) + result_true <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = TRUE) + + set.seed(seed) + result_optimized <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "optimized") + + # Results should be identical when using TRUE vs "optimized" + expect_equal(nrow(result_true), nrow(result_optimized)) + expect_equal(ncol(result_true), ncol(result_optimized)) + expect_equal(result_true$ID, result_optimized$ID) + + # Test that "base" string alias works + set.seed(seed) + result_false <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = FALSE) + + set.seed(seed) + result_base <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "base") + + # Results should be identical when using FALSE vs "base" + expect_equal(nrow(result_false), nrow(result_base)) + expect_equal(ncol(result_false), ncol(result_base)) + expect_equal(result_false$ID, result_base$ID) + + # Test that invalid beta values throw errors + expect_error( + simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "invalid"), + "Invalid value for beta parameter" + ) + + # Test that "indexed" throws appropriate error + expect_error( + simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "indexed"), + "not yet implemented" + ) +}) From ba135bb3dc757a9a5868c3aa769d08526018ac4d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 03:16:15 +0000 Subject: [PATCH 3/4] Fix inconsistencies in beta parameter validation and add support for all string aliases Co-authored-by: smasongarrison <6001608+smasongarrison@users.noreply.github.com> --- R/simulatePedigree.R | 6 ++++-- R/simulatePedigree_within.R | 10 +++++----- tests/testthat/test-simulatePedigree.R | 12 ++++++++++-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/R/simulatePedigree.R b/R/simulatePedigree.R index 401d0dfa..794e8049 100644 --- a/R/simulatePedigree.R +++ b/R/simulatePedigree.R @@ -30,12 +30,14 @@ buildBetweenGenerations <- function(df_Fam, Ngen, sizeGens, verbose = FALSE, mar # Normalize string aliases to logical values for downstream functions use_optimized <- FALSE - if (isTRUE(beta) || beta %in% c("optimized", "index", "indexed")) { + if (beta %in% c("index", "indexed")) { + stop("The 'index' or 'indexed' option for parameter 'beta' is not yet implemented.") + } else if (isTRUE(beta) || identical(beta, "optimized")) { use_optimized <- TRUE } else if (isFALSE(beta) || beta %in% c("base", "original") || is.null(beta)) { use_optimized <- FALSE } else { - stop("Invalid value for beta parameter. Use TRUE/'optimized' or FALSE/'base'.") + stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', 'base', 'original', or 'index'/'indexed'.") } if (use_optimized) { diff --git a/R/simulatePedigree_within.R b/R/simulatePedigree_within.R index d7549827..b60735b6 100644 --- a/R/simulatePedigree_within.R +++ b/R/simulatePedigree_within.R @@ -20,14 +20,14 @@ buildWithinGenerations <- function( # Normalize string aliases to logical values for downstream functions use_optimized <- FALSE - if (isTRUE(beta) || identical(beta, "optimized")) { - use_optimized <- TRUE - } else if (beta %in% c("index", "indexed")) { + if (beta %in% c("index", "indexed")) { stop("The 'index' or 'indexed' option for parameter 'beta' is not yet implemented.") - } else if (isFALSE(beta) || is.null(beta)) { + } else if (isTRUE(beta) || identical(beta, "optimized")) { + use_optimized <- TRUE + } else if (isFALSE(beta) || beta %in% c("base", "original") || is.null(beta)) { use_optimized <- FALSE } else { - stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', or 'index'.") + stop("Invalid value for parameter 'beta'. Accepted values are TRUE, FALSE, 'optimized', 'base', 'original', or 'index'/'indexed'.") } if (use_optimized) { diff --git a/tests/testthat/test-simulatePedigree.R b/tests/testthat/test-simulatePedigree.R index 21903a75..d2509754 100644 --- a/tests/testthat/test-simulatePedigree.R +++ b/tests/testthat/test-simulatePedigree.R @@ -172,7 +172,6 @@ test_that("simulatePedigree accepts string aliases for beta parameter", { kpc <- 4 sexR <- .50 marR <- .7 - strict_tolerance <- 1e-8 # Test that "optimized" string alias works set.seed(seed) @@ -198,10 +197,19 @@ test_that("simulatePedigree accepts string aliases for beta parameter", { expect_equal(ncol(result_false), ncol(result_base)) expect_equal(result_false$ID, result_base$ID) + # Test that "original" string alias works + set.seed(seed) + result_original <- simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "original") + + # Results should be identical when using FALSE vs "original" + expect_equal(nrow(result_false), nrow(result_original)) + expect_equal(ncol(result_false), ncol(result_original)) + expect_equal(result_false$ID, result_original$ID) + # Test that invalid beta values throw errors expect_error( simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "invalid"), - "Invalid value for beta parameter" + "Invalid value for parameter" ) # Test that "indexed" throws appropriate error From 5c43f45ee76e97e09be90c43a3bf256b374c24e3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 03:17:43 +0000 Subject: [PATCH 4/4] Fix test for original alias to use proper seed and add test for index alias Co-authored-by: smasongarrison <6001608+smasongarrison@users.noreply.github.com> --- tests/testthat/test-simulatePedigree.R | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/testthat/test-simulatePedigree.R b/tests/testthat/test-simulatePedigree.R index d2509754..a19bd93f 100644 --- a/tests/testthat/test-simulatePedigree.R +++ b/tests/testthat/test-simulatePedigree.R @@ -212,7 +212,12 @@ test_that("simulatePedigree accepts string aliases for beta parameter", { "Invalid value for parameter" ) - # Test that "indexed" throws appropriate error + # Test that "index" and "indexed" both throw appropriate error + expect_error( + simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "index"), + "not yet implemented" + ) + expect_error( simulatePedigree(kpc = kpc, Ngen = Ngen, sexR = sexR, marR = marR, beta = "indexed"), "not yet implemented"