R stays the interface; the computation moved to C++ (Rcpp and RcppEigen). All exported functions, their names, and their arguments are those of v2.4.2, so v2 scripts run unchanged.
optTrain(method = ); score a given set with its
*_score() function; list them with criteria().
Each has a page on the website with the original reference, the authors’
repository, and a license review.optTrain() has a lambda argument (ridge
penalty).SSDFGS(), FGCM(), and nt2r()
run independent searches in parallel with OpenMP
(multi.threads = TRUE or threads = n) instead
of parallel::mclapply. Each search has its own random
generator, so values do not depend on the number of threads. They differ
from the serial run with the same seed. Benchmark:
bench/bench_openmp.R.parallel; the default
thread count comes from OpenMP (processors available to the process,
limited by OMP_NUM_THREADS).optTrain(threads = ) sets the threads Eigen may use
inside one search (useful for several hundred columns).r_score(), optTrain(), and
SSDFGS() keep the method of Ou & Liao (2019, doi:10.1007/s00122-019-03387-0). The criterion values
equal the v2.4.2 values to about 1e-7 (v2.4.2 returned single-precision
numbers).optTrain() keeps the search moves, the order of the
random numbers, the default number of iterations, and the stopping rule.
With options(TSDFGS.legacy_float = TRUE) and the same seed
it returns the training sets recorded from v2.4.2 for all twelve routes
(with or without sub-populations, targeted or not, three criteria). This
is tested.r_score() still uses the scalar 1 - 1/n0
where a centering matrix may be intended. It is kept on purpose, so that
results do not change.bench/bench_speed.R; results in the article
“Moving from v2 to v3”.optTrain() no longer fails with “the condition has
length > 1” when min.iter is smaller than
5 * sqrt(length(cand) * n.train) (negative look-back index
in the stopping rule).1:x.cand need not be
1:nrow(geno).n.train larger than
cand, and row numbers outside geno.min.iter must be a single finite number of at least 1;
NA or Inf used to run forever.NaN. A test set needs at least 2 individuals.n.train must be a whole number, and cand
must not contain duplicates.TSDFGS.legacy_float keeps that draw). A
sub-population with too few candidates gives a clear error.*.o, *.so) from
the repository.optTrain(seed = ); the result also has
n.iter and converged.SSDFGS() use the Okabe-Ito colors; ggplot2 is
optional (without it the figures are NULL and the numbers
are still returned).dplyr, ggplot2, and
latex2exp are no longer imported (dplyr was
never used). Imports are now Rcpp and stats;
RcppEigen is link-time only.tests/testthat) with regression tests against
v2.4.2 output. Only the r-score, PEV, and CD (the criteria of v2.4.2)
are tested carefully; the 15 added criteria are provided but not
carefully tested.env/: Apptainer recipe (TSDFGS.def) and
pinned conda list for building and testing.environment.yml and env/Dockerfile: the
tested software versions as a conda environment and as a Docker image
(GitHub Container Registry, built by
.github/workflows/docker.yaml).