Changes in Version 0.15
  o The package has gone through a large overhaul in the 0.14.x series of
    package versions. The most important changes are listed below.
  o Major C++ optimization of the estimation pipeline, resulting in ~45%
    cumulative speedup. This includes O(nFreePar) direct parameter-to-matrix
    mapping, OptimWorkspace caching of constant data across iterations,
    cache-aware prepareModel to skip redundant computations, and the new
    LBFGS++ pure C++ optimizer.
  o Added ordinal data support and WLSMV estimation for the lvm framework.
    lvm() now accepts ordinal variables via the 'ordered' argument, with
    WLS, DWLS, and ULS estimators. The WLSMV scaled test statistic
    (Asparouhov & Muthen, 2010) provides scaled chi-square, scaled RMSEA,
    and scaled incremental fit indices matching lavaan output.
  o Restructured dlvm1() to accept both wide-format and long-format data,
    unifying the interface for panel data models. Deprecated ml_tsdlvm1(),
    ml_gvar(), ml_var(), and related wrappers in favor of dlvm1() and
    panellvgvar().
  o Penalized maximum likelihood (PML) and penalized FIML (PFIML) estimation
    with automatic lambda selection via EBIC-based grid search. Includes
    beta_min thresholding, warm starts across the lambda path, and refit()
    for post-selection inference.
  o New meta_lvm() model family for single-stage meta-analytic latent variable
    modeling (extending the MAGNA framework to CFA/SEM), and new meta_var1()
    / meta_gvar() for meta-analytic VAR(1) network models pooling temporal
    and contemporaneous structures across studies.
  o New write_psychonetrics() function for exporting comprehensive
    Mplus/LISREL-style output to a text file, intended for supplementary
    materials in publications.
  o Standardized input arguments across all model families: new 'cors',
    'groupvar', and 'corinput' arguments with consistent validation via
    standardize_input(). Meta-analytic models now accept raw data input.
  o Added SRMR (Standardized Root Mean Square Residual) fit measure using
    Bentler (1995) standardization. Ising models now also compute
    model-implied means and covariances enabling SRMR computation.
  o Improved starting values: OLS-based beta starting values for SEM models,
    fixed the 'equal' argument in multi-group lvm() models.
  o New loop_psychonetrics() convenience function for parallel bootstrapping
    and simulations with automatic variable export and progress bars.
  o Changed default missing data handling to missing = "auto", automatically
    switching to FIML/PFIML when missing data is detected.
  o Automatic fallback to approximate standard errors when the Fisher
    information matrix cannot be inverted.
  o lvm() now accepts lambda = "full" to specify a full loading matrix where
    all cross-loadings are free. Requires the 'latents' argument to be
    specified. FA-based starting values use promax-rotated loadings directly
    (no permutation matching needed for full lambda).
  o penalize() now accepts a matrix for the 'lambda' argument, enabling
    per-element penalty specification: 0 = don't penalize, NA = auto-select
    via EBIC grid search, numeric > 0 = fixed penalty strength. Parameters
    that are fixed at zero in the model are automatically freed when a
    non-zero penalty is specified, combining freepar() and penalize() in
    one step. Works for both symmetric (e.g., sigma_epsilon) and
    non-symmetric (e.g., lambda) matrices.
  o Various bugfixes for Ising Fisher information, dlvm1 Jacobian
    construction, dplyr/ggplot2 deprecation warnings, and CRAN compliance.

Changes in Version 0.14.28
  o Ising models now compute model-implied means (mu) and covariances (sigma)
    from the exact Ising expectations after optimization. This enables SRMR
    and other residual-based fit measures for Ising models (previously returned
    NA). The computation uses the existing isingExpectation() C++ function:
    mu = E[X] and sigma = E[XX'] - E[X]E[X]'.

Changes in Version 0.14.27
  o Removed roptim-based C++ optimizers (cpp_L-BFGS-B, cpp_BFGS, cpp_CG,
    cpp_SANN, cpp_Nelder-Mead) from the public interface. These optimizers
    are no longer available via setoptimizer() or documented in help pages.
    Users should use "nlminb" (default), "ucminf", "nloptr_TNEWTON", or
    "LBFGS++" instead.
  o Replaced deprecated ggplot2::aes_string() calls with
    ggplot2::aes(.data[[]]) in CIplot() and ESA plot methods.
  o Fixed delta matrix starting values when using delta_* = "zero":
    diagonal elements fixed at zero now correctly show est = 0 in the
    parameter table instead of data-derived starting values.
  o Added SRMR (Standardized Root Mean Square Residual) fit measure.
    Uses Bentler (1995) standardization, matching lavaan's default
    srmr_bentler. Includes mean residuals when a mean structure is
    present. Under FIML, uses the saturated model's EM-estimated
    covariance as the observed statistic (matching lavaan's h1 approach).
    Multi-group models use an N-weighted average across groups.
  o The 'beta_min' argument in find_penalized_lambda() and runmodel() now
    accepts "numerical" (default, uses 1e-05), "theoretical"
    (uses sqrt(log(p)/n)), or a numeric value. The previous default was
    the theoretical formula; the new default is the fixed numerical threshold.
  o Added C++ pipeline for meta_var1/meta_gvar models. The C++ implementation
    (cpp=TRUE, the default) uses OptimWorkspace caching and
    formModelMatrices_direct for efficient parameter-to-matrix mapping.
  o C++ implied model (implied_meta_var1_cpp) computes BetaStar, Sigma0,
    Sigma1, and meta-analytic mu/sigma/kappa entirely in C++.
  o C++ derivatives (d_phi_theta_meta_var1_cpp) reuse existing var1 C++
    derivative helpers for the mean part and varcov helpers for the
    random effects variance part.
  o C++ prepare (prepare_meta_var1_cpp) follows the meta_lvm_prepare_cpp
    pattern with D_c override for the ML gradient.
  o Registered meta_var1 in all C++ dispatchers: prepareModel_cpp,
    impliedModel_cpp, psychonetrics_gradient_cpp_inner, and
    psychonetrics_FisherInformation_cpp_inner.

Changes in Version 0.14.26
  o New meta_var1() model family: meta-analytic VAR(1) model for pooling
    temporal and contemporaneous network structures across multiple studies.
    Uses a one-stage random effects framework. Accepts either raw time-series
    data (via data + studyvar) or pre-computed Toeplitz covariance matrices
    (via covs + nobs).
  o New meta_gvar() wrapper: convenience function that calls meta_var1()
    with contemporaneous = "ggm" for graphical VAR estimation.
  o meta_var1/meta_gvar model the stationary covariance (Sigma0) and lag-1
    cross-covariance (Sigma1) blocks, excluding the nuisance exogenous
    covariance block from the Toeplitz matrix.
  o Derivatives for meta_var1 reuse existing var1 Jacobian helpers
    (d_sigma0_beta_var1_cpp, etc.) for the mean part, and meta_lvm random
    effects Jacobians for the variance part.
  o R-only implementation (no C++ yet); model@cpp is set to FALSE.
  o If studyvar is not assigned but idvar is, studyvar is set to idvar
    with a warning. If both are assigned, idvar functions within each study
    for collating time series.

Changes in Version 0.14.24
  o Standardized input arguments across model families. All model constructors
    (varcov, lvm, var1, tsdlvm1, dlvm1, meta_varcov, meta_lvm) now accept a
    consistent set of input arguments:
    - New 'cors' argument: supply correlation matrices directly (with 'nobs').
      In varcov/meta_varcov, 'corinput' defaults to TRUE. In other families,
      correlations are treated as covariances with a warning.
    - New 'groupvar' argument: replaces the deprecated 'groups' argument. If both
      are supplied, 'groupvar' takes precedence with a deprecation warning.
    - New 'corinput' argument added to lvm, var1, tsdlvm1, and dlvm1 signatures
      (errors if set to TRUE, as correlation input is only supported in varcov
      and meta_varcov).
  o Meta-analytic models (meta_varcov, meta_lvm) now support raw data input via
    'data' + 'studyvar' arguments. Correlation/covariance matrices and sample
    sizes are computed internally per study.
  o meta_varcov() now also accepts covariance matrices via 'covs' argument.
  o meta_lvm() now also accepts correlation matrices via 'cors' argument.
  o Shared input validation consolidated into standardize_input() helper function,
    providing consistent error messages for mutual exclusion violations, missing
    required arguments, and unsupported combinations.
  o Fixed pre-existing bug in meta_varcov() baseline/saturated model construction
    where R's missing() function was passed as the 'missing' argument to varcov()
    instead of a string value.

Changes in Version 0.14.23
  o Strip debug symbols from compiled shared library via linker flags in Makevars,
    reducing installed libs/ size on CRAN macOS builds (from ~29MB to ~2MB).
  o Added C++ pipeline for meta_lvm (implied, prepare, derivatives), providing
    ~2.8x speedup over the R-only implementation.
  o Fixed meta_lvm.Rd documentation to match actual function signature.

Changes in Version 0.14.22
  o meta_lvm() now accepts covariance matrices (not just correlations). The data vector
    includes diagonal elements (variances) alongside off-diagonal covariances, with free
    sigma_epsilon diagonal. V matrix computation, implied model, and derivatives updated
    to handle the full vech (with diagonal).
  o Fixed checkJacobian() and checkFisher() to respect the model's @cpp slot: models
    with cpp=FALSE (e.g., meta_lvm) now correctly use R-only fit/gradient/Fisher functions
    instead of always defaulting to C++ versions.
  o Fixed R CMD check --as-cran issues:
    o panelvar()/panelgvar() now handle missing data argument correctly
    o dlvm1() guards against missing data in auto-detect and samplestats calls
    o penalty_lambda documentation updated to match code default (NA, not 0)
    o Removed stray browser() calls from var1 implied and identify functions
    o Fixed non-ASCII character in NA2020.Rd reference
  o Removed continuous-data corinput from lvm(): correlations passed as covs are now
    treated as covariances with free diagonal. Ordinal corinput retained internally.

Changes in Version 0.14.20
  o Added meta_lvm() function for single-stage meta-analytic latent variable modeling.
    Combines a latent variable model (CFA/SEM) for the mean structure of pooled
    covariance/correlation matrices with a random-effects model for between-study
    heterogeneity. Extends the MAGNA framework to latent variable models. Supports all
    standard parameterizations for latent (cov/chol/prec/ggm), residual (cov/chol/prec/ggm),
    and random effects (chol/cov/prec/ggm/cor) structures.

Changes in Version 0.14.18
  o Standard errors now auto-fallback to approximate SEs when the Fisher information matrix
    cannot be inverted (e.g., due to zero cells in crosstables in multi-group Ising models).
    Previously this returned NA standard errors; now approximate SEs are computed automatically
    with an informative warning

Changes in Version 0.14.17
  o Fixed the 'equal' argument in multi-group lvm() models:
    o The equal= argument (e.g., equal="lambda") now correctly constrains parameters across groups
    o Previously, the equality flag was passed as a positional argument to fixMatrix, causing it to
      be silently ignored
    o Additionally fixed corrupted starting values when equal= is used: the lambda structure matrix
      contains integer codes (>1) for equality constraints, but these were used as multipliers for
      FA-derived starting values, producing extreme values that prevented convergence
    o Both loadings and variance identification now work correctly with equal=
    o Results from equal= now match those from the groupequal() workflow
  o Added OLS-based starting values for the beta (structural) matrix in lvm()/sem():
    o For each endogenous latent, OLS regression on FA-implied latent covariance provides initial
      beta coefficients
    o Disturbance covariance (sigma_zeta) is adjusted via (I-B)*Cov(eta)*(I-B)' instead of using
      the raw FA factor correlations
    o Guard rails for near-singular covariance, ill-conditioned predictor blocks, extreme
      coefficients, and near-singular (I-B)
    o Falls back to previous zero-initialization on any numerical issue
    o New 'start' argument: "default" for OLS-based, "simple" for zero-initialization
  o Added loop_psychonetrics() convenience function for parallel bootstrapping and simulations:
    o Replaces boilerplate of makeCluster / clusterExport / parLapply / stopCluster
    o Variables referenced in the expression are automatically detected and exported to workers
    o Uses pbapply progress bars and safe cluster cleanup via on.exit
    o Works with aggregate_bootstraps() and CIplot() for bootstrap analysis
  o Added the NA2020 dataset: 8 self-report items (n=501) from Isvoranu (2020) for GGM examples

Changes in Version 0.14.16
  o Added automatic lambda selection for PML/PFIML estimation via EBIC-based grid search:
    o New function find_penalized_lambda() searches over a log-spaced grid of 100 lambda values
    o Lambda now defaults to NA in all model constructors, signaling automatic selection
    o runmodel() automatically triggers the grid search when NA lambdas are detected
    o Lambda_max computed analytically from KKT conditions at the null-penalized model
    o Warm starts across the lambda path for efficient computation
    o Supports criterion selection: "bic", "ebic.25", "ebic.5" (default), "ebic.75", "ebic1"
    o Users can still specify a fixed lambda (e.g., penalty_lambda = 0.1) for manual control
  o Added beta_min thresholding for penalized estimates:
    o Near-zero estimates below beta_min are set to exactly zero after convergence
    o Default threshold: sqrt(log(p)/n) where p = number of penalized parameters
    o Applied both during EBIC evaluation (for degree-of-freedom counting) and on the final model
    o Reduces numerical noise from ISTA optimizer, improving specificity
    o Exposed as user argument in runmodel() and find_penalized_lambda()
  o EBIC for penalized model selection uses unpenalized log-likelihood at penalized estimates
    (Convention A), with npar = unpenalized free params + nonzero penalized params after threshold
  o Print and write methods now display lambda search results (selected lambda, criterion value,
    beta_min) and show "auto (not yet selected)" for models with NA lambda before estimation
  o NA-safe comparisons throughout the codebase for penalty_lambda column (print, write, refit,
    penalize, unpenalize, C++ workspace builder)

Changes in Version 0.14.15
  o Added PFIML (Penalized Full Information Maximum Likelihood) estimator:
    o Combines FIML with L1/L2 penalty for penalized estimation with missing data
    o Available for all Gaussian models (varcov, lvm, var1, dlvm1, tsdlvm1)
    o Uses proximal gradient optimizer (same as PML)
    o refit() switches PFIML back to FIML for post-selection inference
  o Changed default missing data handling to missing = "auto" for all Gaussian models:
    o ML automatically switches to FIML when missing data is detected
    o PML automatically switches to PFIML when missing data is detected
    o LS estimators (ULS, WLS, DWLS) default to listwise deletion
    o Users can still override with explicit missing = "listwise" or missing = "pairwise"
    o No change for Ising models (missing = "listwise" default remains)
  o Penalty setup in model constructors now supports PFIML:
    o estimator = "PML" and estimator = "PFIML" both trigger penalty initialization
    o Baseline/saturated models use the appropriate unpenalized estimator (ML or FIML)
  o Added experimental feature warnings for features introduced in the 0.14.x branch:
    o PML, PFIML, LBFGS++ optimizer, ordinal data in lvm()/varcov(), WLSMV scaled test statistic
    o Warnings appear once per session and only while version < 0.15
    o Users are directed to report unexpected behavior to GitHub issues

Changes in Version 0.14.14
  o Unified dlvm1() to accept both wide-format and long-format data:
    o New 'datatype' argument with options "auto" (default), "wide", and "long"
    o Auto-detects format from 'vars': matrix = wide, character vector = long
    o New 'idvar' and 'beepvar' arguments for long-format data
    o Long-to-wide conversion handled internally (previously required ml_tsdlvm1)
  o Added 'standardize' argument to dlvm1() with options:
    o "none" (default): no standardization
    o "z": global z-scores per variable across all waves (does not impose stationarity)
    o "quantile": quantile normalization across all waves
    o "z_per_wave": independent z-scores per wave column (imposes stationarity)
  o Added panellvgvar() as the canonical wrapper for panel latent variable GVAR models
  o Deprecated functions (still work but emit warnings):
    o ml_tsdlvm1() - use dlvm1() with long-format data instead
    o ml_gvar() - use dlvm1() with within_latent="ggm", between_latent="ggm"
    o ml_var() - use dlvm1() with desired within_latent and between_latent
    o ml_ts_lvgvar() - use panellvgvar() instead
    o panel_lvgvar() - use panellvgvar() instead

Changes in Version 0.14.13
  o Added write_psychonetrics() function for exporting comprehensive model output to a text file:
    o Produces Mplus/LISREL-style output with logo, sample info, model specification, parameter
      estimates, fit measures, model matrices, modification indices, and logbook
    o Intended for sharing as supplementary materials to papers
    o Supports uncomputed models: shows starting values with clear warnings, omitting SEs, p-values,
      fit measures, and modification indices
    o Model matrices section shows only modeled matrices (not derived/implied quantities)
    o Matrix output uses 2-digit rounding with dots for fixed zeros
  o Fixed prune() error when no parameters to test in the requested matrix:
    o adjust_p_values() now correctly returns a numeric vector (not the S4 model object) when nTest == 0
  o Fixed backward compatibility for models saved without the WLS.Gamma slot:
    o Added .hasSlot() guard to prevent "no slot of name 'WLS.Gamma'" warnings

Changes in Version 0.14.12
  o Added WLSMV scaled test statistic (mean-and-variance adjusted chi-square) for WLS/DWLS/ULS estimators:
    o Implements the scaled-shifted test (Asparouhov & Muthen, 2010) matching lavaan's WLSMV output
    o New fit measures: chisq.scaled, df.scaled, pvalue.scaled, chisq.scaling.factor
    o Scaled incremental fit indices: cfi.scaled, tli.scaled, nfi.scaled, rfi.scaled, ifi.scaled, rni.scaled, nnfi.scaled
    o Scaled RMSEA: rmsea.scaled
    o Baseline model also receives scaled test statistic (baseline.chisq.scaled, etc.)
    o Added WLS.Gamma slot to store the full asymptotic covariance matrix (Gamma) per group
    o Added LS_Gamma() helper function for computing Gamma from raw data
    o Scaling factors match lavaan to 6+ decimal places for both ordinal and continuous data
    o Supports single-group and multi-group models
  o Changed the default estimator for ordinal data from WLS to DWLS, matching lavaan's convention
  o Added "WLSMV" as an estimator alias for "DWLS" in lvm() and varcov()
  o Fixed the DWLS weight matrix for ordinal data:
    o Previously used diag(Gamma^{-1}) (diagonal of the full inverse), which differs from standard
    o Now uses 1/diag(Gamma) (reciprocal of the diagonal), matching the lavaan convention
  o Fixed (n+1)/n scaling bug in ULS fit function, gradient, and expected Hessian (R and C++):
    o The weight matrix normalisation factor was (n+1)/n instead of 1, causing small systematic bias

Changes in Version 0.14.11
  o Added corinput support to the lvm framework:
    o lvm() now accepts a 'corinput' argument to specify that the input is a correlation matrix
    o When corinput=TRUE, residual variances (diagonal of sigma_epsilon) are derived from the constraint diag(sigma) = 1
    o Diagonal sigma_epsilon parameters are fixed and derived in the implied function, not freely estimated
    o Supports WLS, DWLS, and ULS estimators; defaults to WLS when corinput=TRUE
    o Variance identification is automatically enforced
    o Both R and C++ code paths updated (implied and derivatives)
  o Fixed a bug in the identity weight matrix dimension in samplestats for corinput/meanstructure combinations
  o Fixed a bug in lvm Jacobian row removal when both corinput=TRUE and meanstructure=FALSE for continuous data

Changes in Version 0.14.10
  o Added ordinal data support to the lvm framework (Muthen, 1984 three-stage estimator):
    o lvm() now accepts an 'ordered' argument (character vector or TRUE) to specify ordinal variables
    o Supports WLS, DWLS, and ULS estimators for ordinal CFA/SEM
    o Polychoric correlations and thresholds are estimated from ordinal data
    o Variance identification is automatically enforced for ordinal models
    o Both R and C++ code paths (implied, prepare, derivatives) handle ordinal/continuous seamlessly
  o Added nloptr_TNEWTON as a new optimizer, available via setoptimizer(x, "nloptr_TNEWTON"):
    o Uses NLopt's preconditioned truncated Newton with restarts (NLOPT_LD_TNEWTON_PRECOND_RESTART)
    o Builds a local quadratic model and solves the Newton system via preconditioned conjugate-gradient
    o Supports box constraints and analytic gradients
    o Added nloptr to Imports
  o Fixed CRAN NOTE: commented out stray std::cout in vendored LBFGS++ header (LineSearchMoreThuente.h)

Changes in Version 0.14.9
  o Tuned LBFGS++ convergence parameters for better performance on ill-conditioned models:
    o Switched primary convergence criterion from gradient norm to relative function change (delta = 1e-8), matching nlminb behavior
    o Increased L-BFGS history size from 6 to 10 for better Hessian approximation on larger models
    o Relaxed gradient tolerance (epsilon = 1e-5) to avoid unnecessary iterations on ill-conditioned FIML problems
    o ~4x faster on complex dlvm1/panel models (e.g., 8.6s -> 2.0s on 84-parameter panelgvar)
  o Removed unused variable declarations to eliminate all compiler warnings from psychonetrics C++ source

Changes in Version 0.14.8
  o Added LBFGS++ (LBFGSpp) as a new pure C++ optimizer, available via setoptimizer(x, "LBFGS++"):
    o Vendored header-only LBFGS++ library (MIT license) into inst/include/
    o Combined function+gradient evaluation exploits the prepareModel cache for efficiency
    o ~1.6x faster than the existing roptim-based cpp_L-BFGS-B optimizer on benchmark models
    o Added RcppEigen to LinkingTo for Eigen header support

Changes in Version 0.14.7
  o Fixed R CMD check --as-cran issues:
    o Guarded semPlot example with requireNamespace() since it is a Suggested package
    o Replaced defunct dplyr::summarize_each_() with summarize(across()) in lvm example
    o Added build artifacts and non-package files to .Rbuildignore

Changes in Version 0.14.6
  o Fixed Ising model Fisher information for the beta (inverse temperature) parameter:
    o Added missing beta factor in beta-threshold and beta-network cross-derivative blocks of the expected Hessian
    o Fixed expectedmodel() to replace sample sufficient statistics with model-implied expectations for Ising models

Changes in Version 0.14.5
  o Optimized dlvm1 Jacobian construction (d_phi_theta_dlvm1_group_cpp):
    o Added dense Kronecker helpers (kronecker_I_X_dense, kronecker_X_I_dense) to avoid slow sparse element-by-element insertion when the result is used as a dense matrix
    o Precompute the constant "between" Kronecker block once instead of recomputing it for every lag
    o Pre-extract all grouplist values before the loop to eliminate repeated string-based hash lookups
    o Fixed copy-paste bug: removed duplicate Jac.submat write for sigma_zeta_between in the lag loop

Changes in Version 0.14.4
  o Fixed dplyr 1.1.0 deprecation warning about one-column matrices in filter() calls

Changes in Version 0.14.3
  o Cache-aware prepareModel_cpp: skip redundant prepare when fit and gradient are called at the same parameter vector
  o ~24% speedup in full model fitting (e.g., 9-variable CFA: ~155ms -> ~118ms)

Changes in Version 0.14.2
  o Expanded OptimWorkspace to cache all constant S4 model/sample data (extramatrices, types, sample stats, etc.)
  o All prepare_*_cpp and implied_*_cpp_core functions now read from cached workspace instead of S4 slots
  o prepareModel_cpp post-processing now reads from workspace instead of S4 slots

Changes in Version 0.14.1
  o Performance optimization: replaced O(nMat * nPar) parameter-to-matrix mapping with O(nFreePar) direct index mapping
  o Eliminated S4 model cloning during optimization iterations by bypassing updateModel_cpp in all prepare functions
  o Refactored all 8 implied_*_cpp functions into _core variants that accept pre-formed matrices
  o All 8 prepare_*_cpp functions now use formModelMatrices_cpp_direct + implied_*_cpp_core pipeline
  o Added OptimWorkspace: static cache for MatrixMapping, M matrix, and parameter indices across optimization iterations
  o ~25% speedup in full model fitting (e.g., 9-variable CFA: ~200ms -> ~155ms)

Changes in Version 0.13.2
  o Fixed a bug in 'intersectionmodel' not properly clearing removed parameters
  o Improved starting values for identity model in partialprune
  o Fixed a bug in partialprune resulting in an uninformative error
  o Switch from deprecated arma::is_finite() to std::isfinite()

Changes in Version 0.13.1
  o Bootstrapping now occurs before standardizing the data (thanks to Yiwei Yang and Amanda Montoya)
  o Improved support for N=1 models in dlvm1 (e.g., for true ML estimation)
  o Fixed a bug with missing values in the beta starting values matrix for dlvm1 models
  o Changed partialprune() default for 'return' to "partialprune"; set to "best" to mimic old behavior
  o Added 'final_prune' argument to partialprune() and changed the default to "saturated"; set to "partialprune" to mimic old behavior

Changes in Version 0.13
  o Added bootstrap support:
    o Every model now supports 'bootstrap' (to enable bootstrap), 'boot_sub' (for subsampling) and 'boot_resample' (to resample)
    o Enabling these will bootstrap the data *once* and create a psychonetrics object for the bootstrap sample
    o The function 'aggregate_bootstraps' can be used to aggregate bootstraps:
      o use print(...) for some general info
      o use parameters(...) for the bootstrap results on the parameters
      o use fit(...) for the bootstrap results on the fit indices
      o use CIplot(...) for the bootstrap results on the confidence intervals (enable split0=TRUE if model selection is used)

Changes in Version 0.12
  o Updates for the dlvm1 model family:
    o Changed the starting values for dlvm1 models for better convergence
    o Added the 'start' argument to the dlvm1 model family. Use start = "version1" to use pre 0.12 start values
    o Added the 'baseline' argument to dlvm1 model family, which now defaults to "stationary_random_intercept". Note: this will change incremental fit indices! To recover old behavior, set baseline = "independence"
  o The log(det(kappa)) value used in fit function is now computed in FIML in the same way as computed in ML framework, this should lead to more stability, but might also lead to some different chi-square values
  o The startreduce argument in prune() now defaults to 1
  o Using "empty" for matrix specification is now deprecated; use "diag" or "zero" instead.
  o getmatrix will no longer evaluate a model if it is not computed (now returns start values)
  o the 'startreduce' argument in 'prune' now defaults to 1
  o Added the 'fixstart' function that can aide in fixing startvalues
  o The 'getmatrix' function now supports thresholded PDC matrices
  o Diagnostic functions 'checkJacobian' and 'checkFischer' are now exported
  o Added the transmod function, which can be used to transform one model type (e.g., using a Cholesky decomposition) to another model type (e.g., a GGM).
  o Improved support for models with only one (latent) variable
  o Added the 'logbook' function which can be used to more easily retrieve the psychonetrics logbook
  o The 'partialprune' function has been updated and now allows for pruning specific matrices as well as returning different models
  o Fixed some instances where the 'equal' argument wasn't working
  o 'partialprune' now supports multiple matrices
  o 'unionmodel' and 'intersectionmodel' now support the 'matrices' argument
  o Changed lambda starting value choice to the following: Run an EFA, set the starting values to the loadigs of the factor that has the strongest loadings in the indicators, and set correlations between factors that use the same EFA factor for starting values to 0.8
  o added warning for non computed model in parameters()

Changes in Version 0.11.5
  o Fixes to support Matrix 1.7-0

Changes in Version 0.11.5
  o The groupequal, groupfree, fixpar and freepar functions can now handle multiple rows/columns for symmetric matrices
  o Fixed a bug in the identification function for ml_lvm models
  o Implemented min_sum argument for estimating Ising models on data with a minimum sum score due to selection bias. This method is further discussed in  Boot, de Ron, Haslbeck & Epskamp (in preperation). Correcting for selection bias after sum score selection in the Ising model.
  o The 'warn_improper' argument in runmodel now defaults to FALSE, omitting the warning that a non-positive defnite matrix was encountered in parameter estimation.
  o SEs are now set to NA if the Fischer information matrix could not be inverted normally
  o Added an argument 'approximate_SEs' to runmodel to allow for SEs to be approximated using a pseudoinverse

Changes in Version 0.11
  o Optimised lambda starting value choice
  o Changed warning for when a peusdoinverse was used in model estimation.
  o Added 'threshold' argument to the matrix(...) function for significance thresholding
  o Fixed a bug in psychonetrics:::emergencystart

Changes in Version 0.10.3
  o Added a 'bootstrap' argument to var1() family to facilitate bootstrapping the data
  o Fixed a bug where the saturated log-likelihood under FIML estimation could be incorrect

Changes in Version 0.10.2
  o Built in a check to find NA sample covs
  o added diag argument to getmatrix to obtain diagonal
  o diagonal elements are now also thresholded when using getmatrix(..., threshold = ...)

Changes in Version 0.10.2
  o Added 'threshold' argument to getmatrix()
  o Adjusting p-values is now done by default only for the tested p-values. This means that the number of tests is assumed to be the number of parameters of interest (matrices that are to be pruned), not the total number of parameters. Previous behavior can be reproduced with mode = "all" in prune(..).
  o panelvar and panelgvar now support arguments within_latent and between_latent

Changes in Version 0.10.1
  o Fixed a bug in 'prune' which did not allow intercept/mean vectors to be pruned

Changes in Version 0.10
  o ml_tsdlvm1 now orders data by idvar if beepvar is not supplied.
  o Added 'CIplot' function
  o Standardizing in ts_dlvm1 is now more stable.
  o dlvm1 now uses observed variable names as latent variable names when appropriate.
  o Fixed a bug with the beepvar argument in psychonetrics

Changes in Version 0.9:
  o Changed 'rel.tol=1e-10' in the nlminb optimizer to be in line with lavaan
  o Added 'warn_improper' argument to runmodel(..)
  o The argument 'return_improper' now defaults to TRUE
  o Optimizer no longer uses a spectral shift when inverting a semi-positive definite matrix
  o Detection of non positive definite matrices is now done faster and should lead to less problems
  o Added the 'bounded' argument to runmodel() to define if bounded estimation should be used (defaults to TRUE)
  o Diagonals of symmetrical matrices can no longer be estimated to be negative (avoiding Heywood cases, although doing this with a Cholesky decomposition is nicer!)
  
Changes in Version 0.8.1:
  o The nlminb estimator now uses more iterations.

Changes in Version 0.8:
  o The log determinant is now computer better to be able to include fit measures at higher model complexities
  o The 'return_improper' argument in runmodel( ) now returns improper estimates without trying different starting values
  o Fixed a bug in meta_varcov when using individual estimates of the sampling variation
  o Updated optimizer default control parameters

Changes in version 0.7.6:
  o Model estimations that used improper estimation (pseudoinverse of variance-covariance matrix) now return with an error unless return_improper = TRUE in runmodel()
  o Equality-free MIs are now also computed when all edges are included

Changes in version 0.7.5:
  o Fixed a bug with nu_zeta being constrained in multigroup LGC models.
  o factorscores now supports multi group models

Changes in version 0.7.3:
  o Added the 'covariates_as' argument to latentgrowth() to model covariates with regressions (now default) or covariances

Changes in version 0.7.2:
  o Fixed a bug with removing diagonal elements of sigma_epsilon with single indicators
  o Fixed another bug with models with only one free indicator
  o Added the partialprune function for partially pruning multi-group models


Changes in version 0.7.1:
  o Fixed a bug for Solaris

Changes in version 0.7:
  o Major changes
    o Major restructuring of underlying core code. Most vital functions have been translated to C++, leading to a large speedup!
    o Added C++ based optimizers cpp_L-BFGS-B, cpp_CG, cpp_SANN, and cpp_Nelder. These are faster but slightly less stable than nlminb (now the default optimizer).
    o Verbose now defaults to FALSE everywhere. This can be set with the setverbose function for a model
    o Added meta-analysis model for varcov family (meta_varcov)
    o The ml_tsdlvm1 function now allows for multi-kevek tsdlvm1 models (dlvm1 models) to be specified using syntax familiar to those using mlVAR and graphicalVAR
  o Minor changes
    o Numerous small bugfixes and improvements (e.g., better starting values)
    o Added function 'fullFIML' to use true FIML computing the likelihood per row
    o Changed 'WLS.V' to 'WLS.W'
    o Several warning messages have been updated
  

Changes in version 0.6:
  o The 'dlvm1' model family now also returns the implied latent variance-covarriance matrix as 'sigma_eta_within'
      o The latent lag-1 matrix is also returned as 'sigma_eta_within_lag1'
  o The dlvm1 model family now no longer requires a 'lambda' matrix to be specified (will default to a panelvar model)
  o Most model families now support the 'standardized' argument, which can be set to 'z' for z-scores (helps convergence) or 'quantile' for a semiparametric transformation
  o Added the ml_lvm family for two-level random intercept latent variable models
  o Added the simplestructure function to easily make a lambda matrix
  o addalpha in modelsearch now works as expected
  o addalpha and prunealpha now default to 0.01 in 'modelsearch'
  o recursive now defaults to FALSE in 'prune'

Changes in version 0.5.1:
  o Fixed a bug with responses being missing when summary statistics are used in Ising()
  o Fixed a bug with covtype sometimes being set to UB when corinput = TRUE
  o Added DOI to description field

Changes in version 0.5.0:
  o The Ising model is now supported (only ML estimation) through the Ising() model function
  o Added the covtype option to several models, controlling if maximum likelihood or unbiased estimates are used for the input covariances
  o Added the function 'covML' for maximum likelihood covariance estimates

Changes in version 0.4.1:
  o Small fix for CRAN checks

Changes in version 0.4:
  o type = "cor" is now supported in varcov, with rho representing the correlations and SD the diagonal standard deviations matrix.
      o The 'corr' function is now implemented as shorthand for varcov(..., type = "cor")
  o The scale of the Fisher information matrix has been adjusted to portray unit information to be similar to Lavaan
  o The getVCOV function has been added to obtain the estimated asymptotic var-cov matrix of the parameters.
  o The meanstructure can now be ignored using meanstructure = TRUE in the following model families:
    - varcov
  o A correlation matrix can now be used as input (detected or set with corinput = TRUE) for the following families:
    - varcov (type = "ggm" and type = "cor")
  o The WLS estimator will now not investigate means when meanstructure is ignored, and variances when a correlaton matrix is used as input.
    - The WLS weights matrix must be of the appropriate dimensions!
    - The WLS.V matrix will no longer be adjusted for missing means.
    - Added 'startEPC' argument to stepup and freepar
  o Added the 'modelsearch' function for extensive stepwise model search
  o Fixed several bugs and improved starting values in several models

Changes in version 0.3.3:
  o prune() now removes diagonal values of temporal effects
  o psychonetrics now requires R 3.6
  o Some C++ fixes for Solaris
  
Changes in version 0.3.2:
	o The parameters function now invisibly returns the parameter estimate data frame
	o The MIs function now invisibly returns a data frame with MI estimates
	o fit now invisibly returns a data frame with fit measure estimates


Changes in version 0.3.1:
	o Several help-files are now updated with executable examples

Changes in version 0.3.0: 
  o First version to be submitted to CRAN