Changes in version 1.18.4 (2026-05-13) Bug Fix - Re-export Surv() and strata() from the survival package so that user-supplied formulas in action functions (e.g. Surv(os, os_event) ~ arm) work after library(TrialSimulator) alone, without requiring library(survival) or the survival:: prefix. This fixes errors in parallel runs (n_workers > 1) where each worker only attaches TrialSimulator (reported in #14). Changes in version 1.18.1 Bug Fix - Fix a bug where a composite milestone triggering condition combined with 'or' would error out when not all of its branches could be reached, instead of resolving to the reachable branch. Changes in version 1.18.0 New Feature - Accelerate milestone trigger evaluation via C++ helpers (Rcpp) for eventNumber() and enrollment() conditions. Wall-time reduction ranges from a few percent to ~20% depending on how condition-evaluation-heavy the design is, with no change to results. Set options(trialsimulator.use_cpp = FALSE) to fall back to the original R implementation. Changes in version 1.17.1 (2026-04-27) Updates - Reduce vignette compilation time for CRAN (doseRanging.Rmd now loads pre-computed simulation output; simulatePfsAndOsGumbel.Rmd uses a smaller validation sample). - Skip a few stochastic unit tests on CRAN to avoid occasional flakes from RNG variation. Changes in version 1.17.0 New Feature - Add CorrelatedPfsAndOs2() to simulate correlated PFS and OS using a Gumbel copula while targeting marginal PFS/OS medians and Kendall's tau between observed, uncensored PFS and OS times. Updates - Add a vignette for simulating correlated PFS and OS using the Gumbel copula method, alongside the existing illness-death model vignette. - Skip an unnecessary dplyr::filter() call in Trials$get_event_tables() when no filter expression is provided, reducing total simulation wall time by roughly 5-10% in trials with frequent milestone condition checks. Changes in version 1.16.0 (2026-04-13) New Feature - Add n_switches column to locked data returned by get_locked_data(), counting the number of treatment switches per patient within the data lock window. - Add expandRegimen() to expand the regimen_trajectory column in locked data into a long-format data frame with one row per regimen segment per patient. Updates - Cut running time by ~75% via base R rewrites. Changes in version 1.15.0 New Feature - Support stratified permuted block randomization in trial() using argument stratification_factors. - Support ... in regimen() to pass arguments to what(), when() and how(). Bug Fix - Fix a bug in regimen() to support both single or multiple switching. Changes in version 1.14.0 New Feature - Support multiple rounds of dynamic treatment switching through regimen(). Updates - New implementation that is 55% faster without regimen, or 40% faster with regimen. This is achieved by avoid computing redundant event counts. Changes in version 1.13.0 New Feature - New implementation of regimen that is 60% faster. Update - Add a vignette of crossover design with wash-out periods. Bug Fix - Fix a minor bug displaying incorrect event count when using enrollment() to define milestone. This bug does not affect milestone triggering. Changes in version 1.12.0 New Feature - Support editing trajectory of endpoint over time. - Add new argument tidy (default: TRUE) in Controllers$run() to stop computing and saving event count per arm per endpoint for 40% shorter run time. Changes in version 1.11.0 New Feature - Add function solvePiecewiseConstantExponentialDistribution() to compute event rates in time windows given survival probabilities at changepoints. - Add qPiecewiseExponent(), the quantile function of piecewise exponential distribution. This function is useful to simulate time-to-event endpoint that is correlated to other endpoints using the copula method. For example, the simdata package needs marginal quantile functions. Changes in version 1.10.0 (2026-02-15) New Feature - Support parallelization in Controllers$run() through new argument n_workers. The package mirai is used. Although mirai advocates the use of L'Ecuyer-CMRG streams to maintain independence between multiple streams, however, TrialSimulator resets it to be Mersenne-Twister streams to force identical behavior between n_workers = 1 and n_workers > 1. This enables debuggability and reproduciability under single-process mode by setting seed that causes issues under multi-process mode. Changes in version 1.9.0 New Feature - Support wrapper functions for adaptation, including remove_arms(), add_arms(), update_sample_ratio(), set_duration(), resize() and update_generator(). - More informative message is prompted when error is throwed from an action function; milestone's name is printed. Changes in version 1.8.0 New Feature - Support new adaptation Trials$resize() that resizes an ongoing trial. Changes in version 1.7.0 (2025-12-19) New Feature - Columns automatically recorded at milestones can be eliminated from get_output() by setting new argument tidy = TRUE. Minor Updates - Some minor fixes for CRAN submission. Changes in version 1.6.0 New Feature - Generator of an endpoint can be updated during a running trial with Trials$update_generator(). Changes in version 1.5.0 Update - enforce = TRUE is no longer needed when adding new arms to an existing trial with at least one arm through Trials$add_arms(). However, for backward compatibility, legacy codes with enforce = TRUE still behaves as expected and no need to update. Changes in version 1.4.0 Update - Add vignette of dose-ranging study. Changes in version 1.3.0 (2025-09-26) Major Updates - Action function no longer needs argument milestone_name. Now action function only requires argument trial and supports optional arguments. - milestone() now support ... to pass arguments to action functions. - Documents and vignettes are updated. Minor Updates - Some minor fixes. Changes in version 1.2.0 New Feature - enrollment() now supports min_treatment_duration to ensure minimum treatment duration received by patients at a milestone. With its default value 0, milestone is triggered when a specific number of patients are enrolled. - No longer print the return value of action function, thus invisible(NULL) is no longer recommended as return value of action function. Changes in version 1.1.0 Update - Add notes to R6 class indicating public methods that can be used by end users. - Update help documents. Changes in version 1.0.0 (2025-09-03) Update - Fix issues to meet CRAN submission conditions. Changes in version 0.97.0 Bug Fix - Fix a bug in function event_plot() for plot of cumulative events number when endpoint name is "ep". This is due to data masking in dplyr. - Fix issues in unit tests caused by new dropout mechanisum. - use Bonferroni method in unit test of update_sample_ratio. This test is probably broken by randomness (it is okay). Changes in version 0.96.0 Update - Update mechanism of simulating dropout time. Switching from trial level to patient level, i.e. dropout time is now the time from a patient is enrolled until leaving a trial. This aligns with common practice and popular softwares. Changes in version 0.95.0 Update - Add vignette of action function. Changes in version 0.94.0 New Feature - Add function summarizeMilestoneTime and its plot method to summarize triggering time of milestones. Changes in version 0.93.0 New Feature - update_sample_ratio() now supports updating multiple arms simultaneously. When ratio is not a whole number, sample() is used to replace the permuted block algorithm to randomize patients to arms. This enable response-adaptive design. - Add a vignette of response-adaptive design using update_sample_ratio(). Changes in version 0.92.0 Update -Add vignette of fixed design. -Add vignette of wrapper functions of commom statistical tests. Changes in version 0.91.0 New Feature - Add function \code[solveThreeStateModel] that maps medians of PFS and OS, and their correlation to the hazard parameters. The induced hazard parameters can be used with PFS-OS generator \code{CorrelatedPfsAndOs3}. Update - Add vignette of simulating PFS and OS. Changes in version 0.90.0 New Feature - Save event counts per arm in simulation output. - No long stop the program when all planned patients are already randomized into the trial when calling the function enroll_patients. This is useful when a milestone is triggered after all patients are recruited. Bug Fix - Fix a bug that affects functions \code{dunnettTest} and \code{closedTest} when patient recruitment is completed fast thus no sample increment between some milestones. This bug can substantially reduce testing powers. Changes in version 0.89.0 New Feature - Support ... in eventNumber to count event in subset of trial data. This is useful in enrichment design when milestone is defined based on biomarker. Changes in version 0.88.0 New Feature - Add function get as alias of get_custom_data in the Trials class. Bug Fix - Fix a bug that no results is returned to controller when an error is triggered. Update - Print informative message when trial$dunnettTest(..., planned_info = "default") triggers an error. Changes in version 0.87.0 Bug Fix - Revise Trials$dunnettTest to be compatible to one-sided logrank test. Changes in version 0.86.0 Bug Fix - Fix a bug in the fourth-state model. Changes in version 0.85.0 New Feature - Add data generators of time to response, progression and death. Changes in version 0.84.0 New Feature - The function fitLogrank now supports formula. strata(...) can be in formula. No covariate is accepted. - Add unit tests for fitLogistic. Changes in version 0.83.0 New Feature - The function fitLogistic now supports scale = "coefficient" to compute regression coefficient as main effect of arm in the presence of covariates. It is also equivalent to scale = "log odds ratio" in the absence of covariates. - Add unit tests for fitLogistic. Changes in version 0.82.0 New Feature - The function fitCoxph now supports formula to compute log hazard ratio or hazard ratio as main effect of arm. It will detect whether arm's main effect is specified in formula. It allows covariates and interaction between covariates and arm. However, only the main effect of arm is tested and returned. - Add unit tests for fitCoxph. Changes in version 0.81.0 New Feature - The function fitLogistic now supports computing log odds ratio, odds ratio, risk ratio, and risk difference using emmeans contrast, in the presence of covariates. - Add unit tests for fitLogistic and fitLinear. Changes in version 0.80.0 New Feature - The function fitLogistic now supports formula with covariates, and uses emmeans contrast to compute average treatment effect (ATE) on the logit scale. Changes in version 0.79.0 New Feature - The function fitLinear now supports formula with covariates, and uses emmeans contrast to compute average treatment effect (ATE) on the mean scale. Changes in version 0.78.0 Updates - The trigger_condition in the function milestone is deprecated and is replaced with when. Note that trigger_condition is still supported in the R6 class Milestones. Changes in version 0.77.0 Updates - Add case for unit test. Changes in version 0.76.0 Bug Fixes - Fix a bug that trial$get_custom_data throws an error when n > 1 in controller$run(n) because custom data is wiped out in trial$reset. Changes in version 0.75.0 Update - Add vignette of defining arms. Changes in version 0.74.0 New Feature - Support inclusion criteria in arm through the ... argument. Changes in version 0.73.0 New Feature - Print summary report of arms when printing an arm object in console or rmarkdown. Changes in version 0.72.0 New Feature - Print summary report of endpoints when printing an endpoint object in console or rmarkdown. Changes in version 0.70.0 Updates - Add vignette for longitudinal endpoints. Changes in version 0.68.0 Updates - Rename trial event as milestone. This a major update. Relevant codes and documents are updated accordingly. - Add executable examples for controller() as per suggestion from CRAN team. Changes in version 0.67.0 Updates - Print event counts at trial events using message() so that Shiny app can display it properly. Changes in version 0.66.0 Updates - Add cases for unit test. Changes in version 0.65.0 New Features - Add function solveMixtureExponentialDistribution to compute median of exponential endpoint of subgroup or the overall population. Changes in version 0.63.0 New Features - Add wrapper functions endpoints, arm, trial, event, listener and controller for Endpoint$new, Arm$new, Trial$new, Event$new, Listener$new and Controller$new. Changes in version 0.62.0 New Features - Allow extending trial duration with Trial$set_duration. Changes in version 0.61.0 Updates - Deprecate function enroll_a_patient. Use enroll_patients only. Changes in version 0.58.0 Updates - Update vignette of adaptive seamless design. Bug Fixes - Fix a bug to use n > 1 in Controller$run when an arm can possibly be removed adaptively during a trial. New Features - Allow specifying arms in enrollment. This is useful to count randomized patients of all arms even if some are removed adaptively. Changes in version 0.57.0 Updates - Move vignette of comparison between GraphicalTesting and graphicalMCP to repository TrialSimulatorDocuments. Changes in version 0.56.0 New Features - Controller$run now can specify number of simulation replicates by newly added argument n. If n is greater than 1, simulation results can be accessed in Controller$get_output(). Changes in version 0.55.0 Bug Fixes - Fix a bug in StaggeredRecruiter to force the enrollment time of the first patient is zero. This is an known issue but I was too lazy to fix it. Earlier version may have overestimated time of events. New Features - add function fitFarringtonManning of Farrington-Manning test for rate difference. Changes in version 0.54.0 New Features - Add function Trial$bind to row bind data frame in action functions. It is useful to prepare inputs of group sequential or graphical test. Changes in version 0.53.0 New Features - Add vignette of condition system. Changes in version 0.52.0 Bug Fixes - Fix a bug that data is not censored correctly at events. This bug does not affect a trial without interims. Changes in version 0.51.0 New Features - Add vignette of non-time-to-event endpoints. - Add function weibullDropout to compute parameters of Weibull distribution when using it for dropout distribution. Changes in version 0.49.0 New Features - Add vignette of time-to-event endpoints. Changes in version 0.48.0 Bug Fixes - Fix a bug when alpha of a node in graph is set to rounding error bound 1e-5 while no alpha should have been propagated. Changes in version 0.47.0 New Features - Support new condition system for event triggering. Built-in functions enrollment, eventNumber and calendarTime can be combined with & and |. Nested combination is supported by using parentheses. - TriggerByEventNumbers and TriggerByCalendarTime are therefore deprecated. Changes in version 0.44.0 Bug Fixes - Fix a bug when adding an arm that is already in the trial. Changes in version 0.43.0 New Features - Add function fitLogistic to fit logistic regression model. - Support model fitting for multiple treatment arms in logistic regression, Cox PH model, and logrank test. Changes in version 0.42.0 Minor Updates - Add a logo. Changes in version 0.40.0 Bug Fixes - Revise examples for CRAN submission. Changes in version 0.39.0 Bug Fixes - Remove space in class name to eliminate R CMD check note. Changes in version 0.38.2 Bug Fixes - Throw error message when none of the hypotheses at test has non-zero alpha in graphical test. - Update vignette. Changes in version 0.38.1 New Features - Plot stacked area chart for accumulative event numbers of endpoints. Bug Fixes - Fix a bug when small weight (epsilon) is used in graph in graphical testing. Small weight can be conflict with integral tolerance error. Changes in version 0.37.0 New Features - Return more informative error message when custom random number generators are used to define endpoints. Specifically, it guides users to return columns for time-to-event endpoints properly. - Update manual for generator in Endpoint. Changes in version 0.36.0 Bug Fixes - Fix a bug in GraphicalTesting when a hypothesis is tested multiple times at the same stage because more alpha is passed from other rejected hypothesis. Changes in version 0.35.0 New Features - Warn when incremental information is too low that can affect normality approximation of combination test. Bug Fixes - Minor bugs fixed. Changes in version 0.33.0 New Features - Add README. New Features - Provide a default action function do_nothing() if users have no intent to do anything at a triggered event. This function can be passed to the argument action when creating a new event, e.g., Event$new(name = 'interim', trigger_condition = TriggerByCalendarTime, action = do_nothing, calendar_time = 64). Changes in version 0.30.0 New Features - Capture error inside Controller$run() and insert error message into output (see Trial$get_output()$error_message). It helps to integrate TrialSimulator with targets. Changes in version 0.29.0 New Features - Support closed test based on inverse normal combination test. - Seed can be accessed by Trial$get_seed(). Changes in version 0.28.0 New Features - Support inverse normal combination test when multiple treatment arms present. Dunnett's test is used for comparison. - Specify random seed if user dose not pick one. Seed is saved into Trial's output for reproducibility. Changes in version 0.27.0 New Features - Support dry run for fixed design. Changes in version 0.26.0 New Features - Adjust boundary at final analysis for over- or under-running trials. - Support custom alpha spending function in graphical testing procedure. Changes in version 0.25.0 New Features - Support inverse normal combination test for logrank statistics. Changes in version 0.24.0 New Features - Update GraphicalTesting based on simplified interface of GroupSequentialTest.