                        Changes in version 1.3.5                        

  - lfo() refits no longer carry two intercepts. The stored design
    (fit$Xlist) already includes the intercept slice, and lfo() passed
    it back through Xdyad, so each refit added a second, exactly
    collinear intercept; the stored slice is now stripped before
    refitting.
  - lame() no longer errors when called through a wrapper that forwards
    ... (or with only positional arguments); the model.name
    partial-match guard assumed the call had names.
  - uv_plot() now honors layout = "circle" for dynamic snapshot plots;
    it was silently drawing a biplot. Also corrected the latent-space
    description in the help to the inner-product (eigenmodel)
    interpretation.
  - simulate_posterior() now returns latent-factor and coefficient draws
    for dynamic fits (dynamic_uv, dynamic_beta) instead of erroring, and
    its bipartite draws include the interaction matrix G (they
    previously reconstructed U V' rather than U G V'). Credible-interval
    forecasts keep their actor names.
  - Fixed the bundled sampsonmonks data: the three liking layers
    (like_m2, like_m1, like) had their actors in a different order from
    the array's row/column names (a problem inherited from amen), so
    those layers were mislabeled. All ten layers now share the same
    actor order.
  - ab_plot(effect = "both") now works for ame and lame fits, drawing
    the sender and receiver effects as two panels (for dynamic fits, in
    the snapshot views); it previously only worked for ame_als fits.
  - ame() and lame() gained a multistart argument that is forwarded to
    the static ALS estimators when method = "als"; it used to be dropped
    with an unused-argument error (lame()) or warning (ame()).
  - symmetric = TRUE with the rank-nomination families (cbin, frn) is
    now rejected with an explanation; it used to route silently through
    the directed samplers.
  - latent_positions() and procrustes_align() now say plainly that
    alignment is across the periods of one fit, and how to align two
    fits by hand.
  - Poisson fits with many zero cells no longer pin the actor effects
    and latent factors at zero and inflate the fitted level (about 3x
    at 5% density, 1.2-1.4x at 20%): their prior scale vanished as zeros
    dominated. ame() also gained a level move so the predicted total
    settles quickly; see the notes in ?ame.
  - Fixed a scale drift in bipartite dynamic_uv fits. Only the product U
    G V' is identified, and the leftover scale used to wander: G shrank
    toward zero while the latent coordinates grew, until they hit
    prior$uv_max_abs and the sampler began rejecting 20-40% of its own
    U/V proposals on realistic panel sizes. The latent coordinates are
    now kept at or below unit scale, with G absorbing the scale, which
    leaves U G V' untouched. For normal outcomes each margin is held at
    unit scale, which also stops the slow drift of scale into the
    interaction matrix on long dynamic_G chains, so the raw coordinates
    and the persistence parameters stay readable. For binary and Poisson
    outcomes the coordinates are only ever shrunk: a saturated
    likelihood wants the product to grow without bound, and pulling the
    coordinates back up would push all of that growth into G. Estimates
    of the identified quantities were not affected, but the raw
    coordinate scale was arbitrary and sampling efficiency suffered. The
    warning for this case now says what to do instead of suggesting a
    longer chain, which made it worse.
  - Longitudinal fits estimate the latent-persistence parameters
    (rho_uv, sigma_uv) more reliably: the unipartite sampler now updates
    them every sweep instead of every tenth, matching the earlier
    bipartite fix, so they no longer sit near their starting value on
    default-length chains.
  - Warm-starting a dynamic MCMC run from an ALS fit now carries the
    dynamic hyperparameters along: get_start_vals() (and the bipartite
    path) pass rho_uv, sigma_uv, rho_ab, and sigma_ab through instead of
    dropping them.
  - Dynamic ALS fits (lame(method = "als") with dynamic_uv, dynamic_ab,
    or dynamic_beta) now report the innovation scales sigma_uv,
    sigma_ab, and sigma_beta implied by their fitted paths, so
    als_start_vals() can hand them to a warm-started MCMC run; they used
    to be NULL, which left the slowest-mixing parameters of a sparse
    dynamic panel at their cold defaults. Read them as starting values,
    not estimates: the smoothness penalty shrinks the fitted paths, so
    the implied scales run at roughly half the posterior scale. The
    persistences rho_uv, rho_ab, and rho_beta on a dynamic ALS fit are
    the values its penalty used, not estimates; absent a prior they now
    sit at the same prior means the MCMC uses (0.9, 0.8, and 0.8) rather
    than at 0.95.
  - ALS fits with R > 0 expose the fitted multiplicative surface as UVPM
    (and ULUPM for symmetric fits), matching the MCMC fit objects.
  - Dynamic ALS (lame(method = "als") with dynamic effects) no longer
    runs away on sparse binary or Poisson panels. It now reweights only
    once the block updates have settled or spent their step budget,
    keeps a reweighted step only when the true penalized deviance falls,
    and falls back to the best state on an overshoot, the same scheme
    the static route uses; the non-normal families also carry a level
    prior on the dynamic sender and receiver paths. A warning still
    fires if a block update fails to descend, and now says so plainly.
  - dynamic_beta combined with dynamic_ab now gives the additive effects
    a real AR(1): the per-period draws pool across neighbouring years
    and rho_ab / sigma_ab are sampled rather than sitting at their
    starting values.
  - Bipartite dynamic_G = TRUE fits can no longer be poisoned by a
    single non-finite state draw. The time-varying interaction matrix is
    accepted only when every element is finite, its variance draw keeps
    the current value when the state path is not finite, and the chain
    falls back to the last finite draw otherwise; before, one bad draw
    made every later update fail and the fit returned non-finite values
    for the rest of the run.
  - Tidied up the documentation and test suite.

Known limitations

  - In bipartite dynamic_G = TRUE fits with a binary or Poisson outcome,
    the raw latent coordinates can drift toward zero over long chains
    while G grows to compensate, and rho_G may then sit near its upper
    bound. The fitted product U G V' (and so EZ, YPM, and the forecasts)
    is unaffected; read the raw coordinates and rho_G qualitatively in
    that case.

                 Changes in version 1.3.4 (2026-08-04)                  

  - The handful of Gibbs samplers and helpers once adapted from amen
    have been rewritten from the underlying published methods, so the
    package carries no derived code and stays under the MIT license.
  - Fixed a prior-scaling bug that could silently collapse the latent
    factors in asymmetric ame() fits with R > 0; fits now match amen.
  - dynamic_ab fits carry per-period posterior SDs, so ab_plot(fit,
    plot_type = "ribbon") draws a real credible band.
  - A few documented options now do what they say: log_lik_method =
    "augmented", gof(nsim = NULL) (uses all draws), and bootstrap error
    bars in ab_plot() for ame_als fits. Dropped an unused argument and
    fixed some stale help text.
  - Fitting no longer leaves a .Random.seed behind or touches
    options(warn).
  - Fixed Rd markup flagged by CRAN.
  - Time-varying coefficients (dynamic_beta) compose freely with the
    multiplicative latent factors (R > 0) and additive sender/receiver
    effects, for every family and network type. Coefficients can follow
    AR(1), random-walk, or Matern dynamics, and predict() carries that
    drift into its forecasts.
  - netify objects can be passed straight to ame(), lame(), and the ALS
    fitters; a network's symmetric attribute is honored automatically,
    and named covariates are aligned to Y by actor.
  - Set posterior_opts = list(save_UV = TRUE) to keep the per-draw
    latent factors (and the bipartite mixing matrix), so
    latent_positions(), uv_plot(), and the goodness-of-fit tools report
    posterior uncertainty directly. Symmetric fits now store V_samples
    (U L per draw) alongside U_samples, so the per-draw latent
    similarity U L U' is reconstructable via simulate_posterior(fit,
    "UV").
  - summary() on a lame fit exposes the coefficient table under
    $coefficients, matching summary.ame and the broom/lm idiom.

Known limitations

  - Bipartite fit$U / fit$V are a single posterior draw (the rotation is
    unidentified); use fit$YPM or reconstruct_UVPM() for the stable
    multiplicative structure.
  - In the bipartite dynamic_uv path, latent persistence rho_uv is only
    weakly identified -- read it qualitatively. The unipartite path is
    unaffected.

                        Changes in version 1.2.0                        

  - Cleaned up ALS support and documentation.
  - Raised the lame(method = "als") iteration cap and exposed dynamic
    ALS convergence component traces.
  - Stabilized dynamic-UV MCMC by normalizing the raw U/V coordinate
    scale, centering additive row/column effects, pooling very sparse
    additive effects toward the prior mean, and carrying ALS fits into
    MCMC with als_start_vals().

                        Changes in version 1.1.0                        

New features

  - Fast, MCMC-free estimation via ame_als() and lame_als(): an
    alternating least squares / IRLS point estimator for the normal,
    binary, and Poisson families. Supports parametric-bootstrap and
    sandwich standard errors and the full S3 method set (coef(), vcov(),
    confint(), predict(), tidy(), glance(), and the diagnostic plots).

                        Changes in version 1.0.0                        

Initial CRAN Submission

Features

  - Cross-sectional network analysis via ame() with support for 6
    distributional families: normal, binary, ordinal, Poisson, censored
    binary, and fixed rank nomination.
  - Longitudinal network analysis via lame() with dynamic additive and
    multiplicative effects modeled as AR(1) processes.
  - Support for both unipartite (square) and bipartite (rectangular)
    network structures.
  - Covariate support: dyadic (Xdyad), row (Xrow), and column (Xcol)
    covariates with automatic design matrix construction.
  - S3 methods: print(), summary(), coef(), vcov(), confint(),
    predict(), fitted(), residuals(), simulate(), plot().
  - Visualization functions: trace_plot(), gof_plot(), ab_plot(),
    uv_plot() for MCMC diagnostics and model assessment.
  - Goodness-of-fit via posterior predictive checks with gof().
  - C++ acceleration via Rcpp and RcppArmadillo for core sampling
    routines.
  - Handles changing actor compositions across time periods.
