% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/helper.R
\name{.consensus_target_procrustes_single}
\alias{.consensus_target_procrustes_single}
\title{Internal single-start consensus engine}
\usage{
.consensus_target_procrustes_single(
  unrotated_list,
  init_targets = NULL,
  rotation = c("orthogonal", "oblique"),
  start = 1,
  tol = 0.001,
  loss_tol = 1e-07,
  loss_patience = 5,
  convergence = c("either", "target", "loss", "both"),
  min_iter = 2,
  max_iter = 200,
  alpha = 1,
  match_target = TRUE,
  hyper_cutoff = 0.15,
  oblique_maxit = 300,
  oblique_eps = 1e-05,
  oblique_max_line_search = 10,
  oblique_step0 = 1,
  oblique_normalize = FALSE,
  oblique_random_starts = 0,
  oblique_random_starts_stage = c("final", "none", "outer", "both"),
  oblique_screen_keep = 2,
  oblique_triage_maxit = 25,
  oblique_triage_improve_tol = 0,
  verbose = FALSE
)
}
\arguments{
\item{unrotated_list}{List of unrotated loading matrices to be aligned. All
matrices must be numeric, finite, and have identical dimensions.}

\item{init_targets}{Optional list of starting target matrices. These are
typically rotated loading matrices from the corresponding analyses. If
`NULL`, `unrotated_list` is used.}

\item{rotation}{Character string, either `"orthogonal"` or `"oblique"`.}

\item{start}{Either a single integer selecting an element of `init_targets`,
or an explicit target matrix. Used when `multi_start = FALSE`.}

\item{tol}{Positive relative Frobenius-norm convergence tolerance for the
outer target update.}

\item{loss_tol}{Positive tolerance for the relative change in the outer
consensus loss. If `NULL`, loss-based convergence is disabled. It cannot be
`NULL` when `convergence` is `"loss"` or `"both"`.}

\item{loss_patience}{Positive integer. Number of consecutive iterations with
relative loss change below `loss_tol` required for loss-based convergence.}

\item{convergence}{Character string controlling the stopping rule. `"either"`
stops when either target or loss convergence is satisfied; `"target"` uses
only target change; `"loss"` uses only loss change; `"both"` requires both.}

\item{min_iter}{Non-negative integer. Minimum number of outer iterations
before convergence can be declared.}

\item{max_iter}{Positive integer. Maximum number of outer consensus
iterations.}

\item{alpha}{Damping factor for the target update. `alpha = 1` uses the full
centroid update. Smaller values, such as `0.5`, can reduce oscillation.}

\item{match_target}{Logical. If `TRUE`, the updated centroid is signed and
column-matched to the previous target before convergence is evaluated.}

\item{hyper_cutoff}{Non-negative cutoff used by `.hyperplane_count()` for
summary output.}

\item{oblique_maxit, oblique_eps, oblique_max_line_search, oblique_step0, oblique_normalize}{Parameters
passed to `PROCRUSTES()` when `rotation = "oblique"`.}

\item{oblique_random_starts}{Number of random starts used by the inner oblique
solver. See `oblique_random_starts_stage` for when these are used.}

\item{oblique_random_starts_stage}{Character string controlling whether random
starts are used during the outer consensus loop, the final alignment pass,
both, or neither. The default `"final"` keeps the outer loop smooth by using
warm starts during iteration and applies random-start protection only in the
final pass.}

\item{oblique_screen_keep, oblique_triage_maxit, oblique_triage_improve_tol}{Screening and triage parameters passed to the compiled oblique solver when
random starts are used.}

\item{verbose}{Logical; if `TRUE`, print convergence messages for the outer
loop.}
}
\description{
This internal helper performs a single consensus-target run from one starting
target. Users should normally call [CONSENSUS_PROCRUSTES()] instead.
}
