@@ -708,11 +708,11 @@ emObjfn <- function(obj, control = list()) {
708708 pars_full_names = pars_full_names
709709 )
710710 ic <- modifyList(list (rinit = 1 , rmax = 10 , iterlim = 30 ,
711- fterm = 1e-7 , mterm = 1e-7 ,
711+ ftol = 1e-7 , mtol = 1e-7 ,
712712 eigen_floor_relative = 1e-10 ),
713713 innerControl )
714714 oc <- modifyList(list (rinit = 1 , rmax = 10 , iterlim = 200 ,
715- fterm = 1e-7 , mterm = 1e-7 ),
715+ ftol = 1e-7 , mtol = 1e-7 ),
716716 trustControl )
717717 control_cpp <- list (inner = ic , outer = oc )
718718
@@ -779,8 +779,8 @@ emObjfn <- function(obj, control = list()) {
779779 K <- om $ K
780780 chol_pars <- om $ cholPars
781781 if (is.null(epsQuadLevels )) epsQuadLevels <- K + 1 : 3
782- cm1 <- modifyList (list (rinit = 1 , rmax = 10 ,
783- fterm = 1e-6 , mterm = 1e-6 ), cm1Control )
782+ cm1 <- .trustControl (list (rinit = 1 , rmax = 10 , ftol = 1e-6 , mtol = 1e-6 ) ,
783+ cm1Control , label = " cm1Control" )
784784 psi <- init
785785 if (! all(chol_pars %in% names(psi )))
786786 stop(" .fitNormal: `init` is missing omega$cholPars (" ,
@@ -801,11 +801,9 @@ emObjfn <- function(obj, control = list()) {
801801 if (ecmIter > 1L )
802802 e_info <- rebuild(psi , level_new = level , fixed = fixed ,
803803 eta_init = e_info $ etaModes )
804- cm1_fit <- suppressMessages(trust(
805- em , parinit = psi [structural_names ], fixed = fixed ,
806- rinit = cm1 $ rinit , rmax = cm1 $ rmax ,
807- iterlim = maxCm1Iter ,
808- fterm = cm1 $ fterm , mterm = cm1 $ mterm ))
804+ cm1_fit <- suppressMessages(do.call(trust , modifyList(cm1 , list (
805+ objfun = em , parinit = psi [structural_names ], fixed = fixed ,
806+ iterlim = maxCm1Iter ))))
809807 psi [structural_names ] <- cm1_fit $ argument
810808 out_after_cm1 <- em(psi [structural_names ], fixed = fixed , deriv = FALSE )
811809 diag_after <- attr(out_after_cm1 , " emDiag" )
@@ -881,8 +879,8 @@ emObjfn <- function(obj, control = list()) {
881879 N <- nrow(om $ subjectEtas )
882880 chol_pars <- om $ cholPars
883881 level <- K # single-node Smolyak == Laplace
884- cm1 <- modifyList (list (rinit = 1 , rmax = 10 , fterm = 1e-6 , mterm = 1e-6 ),
885- cm1Control )
882+ cm1 <- .trustControl (list (rinit = 1 , rmax = 10 , ftol = 1e-6 , mtol = 1e-6 ),
883+ cm1Control , label = " cm1Control " )
886884 psi <- init
887885 if (! all(chol_pars %in% names(psi )))
888886 stop(" .fitNormal: `init` is missing omega$cholPars (" ,
@@ -898,10 +896,9 @@ emObjfn <- function(obj, control = list()) {
898896 eta_init = e_info $ etaModes )
899897
900898 # CM-1: structural pars via the Laplace marginal, Omega frozen.
901- cm1_fit <- suppressMessages(trust(
902- em , parinit = psi [structural_names ], fixed = fixed ,
903- rinit = cm1 $ rinit , rmax = cm1 $ rmax , iterlim = maxCm1Iter ,
904- fterm = cm1 $ fterm , mterm = cm1 $ mterm ))
899+ cm1_fit <- suppressMessages(do.call(trust , modifyList(cm1 , list (
900+ objfun = em , parinit = psi [structural_names ], fixed = fixed ,
901+ iterlim = maxCm1Iter ))))
905902 psi [structural_names ] <- cm1_fit $ argument
906903
907904 # CM-2: closed-form Omega from covariance-corrected posterior moments.
@@ -979,8 +976,9 @@ emObjfn <- function(obj, control = list()) {
979976 N <- meta_pkg $ N ; K <- meta_pkg $ K
980977 chol_pars <- omega $ cholPars
981978 structural_names <- setdiff(names(init ), chol_pars )
982- cm1 <- modifyList(list (rinit = 1 , rmax = 10 , iterlim = 30 ,
983- fterm = 1e-6 , mterm = 1e-6 ), cm1Control )
979+ cm1 <- .trustControl(list (rinit = 1 , rmax = 10 , iterlim = 30 ,
980+ ftol = 1e-6 , mtol = 1e-6 ),
981+ cm1Control , label = " cm1Control" )
984982
985983 parsFull <- setNames(numeric (length(meta $ pars_full_names )),
986984 meta $ pars_full_names )
@@ -1050,10 +1048,8 @@ emObjfn <- function(obj, control = list()) {
10501048 parsFull [chol_pars ] <- updateOmegaChol(list (S_omega ), omega )
10511049
10521050 # CM-1: structural M-step at the drawn etas, RM-damped in convergence phase.
1053- cm1_fit <- suppressMessages(trust(
1054- cm1_obj , parinit = parsFull [structural_names ],
1055- rinit = cm1 $ rinit , rmax = cm1 $ rmax , iterlim = cm1 $ iterlim ,
1056- fterm = cm1 $ fterm , mterm = cm1 $ mterm ))
1051+ cm1_fit <- suppressMessages(do.call(trust , modifyList(cm1 , list (
1052+ objfun = cm1_obj , parinit = parsFull [structural_names ]))))
10571053 theta_hat <- cm1_fit $ argument
10581054 parsFull [structural_names ] <-
10591055 if (k < = nBurnin ) theta_hat
@@ -1146,10 +1142,12 @@ emObjfn <- function(obj, control = list()) {
11461142 fc <- control $ focei %|| % list ()
11471143 .normalCheckControlKeys(fc , c(" innerControl" , " trustControl" , " cores" ), " focei" )
11481144 .normalCheckControlKeys(fc $ innerControl %|| % list (),
1149- c(" rinit" , " rmax" , " iterlim" , " fterm" , " mterm" ,
1150- " eigen_floor_relative" ), " focei$innerControl" )
1145+ c(" rinit" , " rmax" , " iterlim" , " ftol" , " mtol" ,
1146+ " fterm" , " mterm" , " eigen_floor_relative" ),
1147+ " focei$innerControl" )
11511148 .normalCheckControlKeys(fc $ trustControl %|| % list (),
1152- c(" rinit" , " rmax" , " iterlim" , " fterm" , " mterm" ),
1149+ c(" rinit" , " rmax" , " iterlim" , " ftol" , " mtol" ,
1150+ " fterm" , " mterm" ),
11531151 " focei$trustControl" )
11541152 .normalCheckControlKeys(control $ quadrature %|| % list (),
11551153 c(" level" , " cores" , " epsQuadLevels" , " epsEcm" , " epsOfvRel" ,
@@ -1246,7 +1244,10 @@ emObjfn <- function(obj, control = list()) {
12461244# ' \item{`$saem`}{Recognised keys: `nBurnin`, `nEM`, `nMcmc`, `cm1Control`,
12471245# ' `cores`.}
12481246# ' }
1249- # ' Unrecognised keys raise a warning.
1247+ # ' Unrecognised keys raise a warning. `cm1Control` accepts any [trust]
1248+ # ' argument; `innerControl`/`trustControl` steer the C++ FOCEI loops and take
1249+ # ' `rinit`, `rmax`, `iterlim`, `ftol`, `mtol` (plus `eigen_floor_relative`
1250+ # ' for the inner one).
12501251# ' @param verbose Logical. If TRUE prints solver progress.
12511252# '
12521253# ' @return An `EM` S3 list with fields `argument`, `value` (plain-ML
0 commit comments