Cut from the 0.2.0 development line for the CRAN resubmission. Every
estimate, coefficient and acceptance decision in
tests/package-characterization.R reproduces the 0.1.0
values within the tolerances recorded there. The one change to fitting
itself is the refusal of a dense conditional solve that does not solve
its own system, recorded under engineering below. Everything else is new
reporting, corrections, engineering behind private seams, and the
release maintenance that followed 0.1.0.
gt_diagnostics() gains a stages element
summarising the numerical checks a fit passed through: optimizer
completion, conditional mode, independent stationarity, restart and
tolerance stability, numerical acceptance, and approximation assessment,
each with a status, a reason and its supporting measurements, so a
rejection names the stage responsible without the caller reading private
optimizer records. The status is passed,
failed, not_assessed for a check that did not
run or does not apply to the engine, or inconclusive for
one that ran without a clear verdict; absent evidence is never read as a
pass. The summary is derived from evidence the fit already retained,
including the tolerances that governed the retained solve: it never
refits and never changes an acceptance decision. Print methods are
registered for the stage summary and for a single stage.passed when a record says its solve was tightened but does
not retain the tolerance that governed it. That record now reports
inconclusive, because the retained evidence cannot
establish that the solve met what was asked of it. This changes
reporting only, and only for incomplete or older fit objects: a fit
produced by this version retains that tolerance. Fitting, numerical
acceptance, and reliability and D-study eligibility are unchanged.docs/, scripts/VALIDATION.md,
validation-studies/, artifacts/,
SECURITY.md, LICENSE) are now absolute
repository URLs. CRAN’s incoming check reported the relative
scripts/VALIDATION.md and LICENSE links of the
0.0.6 submission as invalid file URIs; a test now refuses any README or
NEWS link to a file that .Rbuildignore keeps out of the
archive.SECURITY.md named a control that does not exist. The
retention switch is
gt_control(retain = list(data = FALSE)).BIC() on a REML fit is documented, and its convention,
N response vectors with the covariance parameters only, is recorded as
reml_BIC_response_vectors_variance_parameters.
help("gt_fit") no longer says the generic criteria are
unavailable for REML: the fit’s own AIC and
BIC elements are NA, the generics are
not.load_functions.R sources
R/discrete_sparse_mode.R, matching the Collate field; a
test keeps the two lists equal.print(gt_diagnostics(fit)) states the standard-error
availability once.gt_component_vcov() adds
conditional_on_fixed naming every fixed component, and
conditional_on_zero now names only the zero ones. The
boundary flag, the point estimates and the interval arithmetic are
unchanged (#36).logLik(), and through it AIC() and
BIC(), refuse a fit that failed numerical acceptance, as
gt_reliability() already did; the objective stays in
minus2loglik for diagnosis. The generics previously
returned ordinary values while print(fit) called the
estimates diagnostic only.gt_control(retain = list(data = FALSE)) now removes
every copy of the observations. The retained Gaussian OpenMx model
carried the raw outcomes as summary metadata, so a fit saved after
dropping the data still held them, and the recorded call held the whole
data frame, unused columns included, when the fit came through
do.call() or with the data written inline. The observations
are stripped from the retained model, which nothing reads after fitting,
the call’s data argument is replaced by a marker, and a test hunts a
sentinel observation and a sentinel unused column through the serialized
fit for direct, programmatic and inline calls. SECURITY.md
says so.1e15 and 1e15 + 1, passed
gt_preflight() and were then refused by
gt_fit() as duplicate cells; they now fit (#39, facet
identity).1e12
moved accepted estimates in their fifth digit and 1e15 in
their second. A regression fits the same represented panel at the origin
and at an offset of 1e12 and requires identical variances
and deviance.summary() of an ordinal fit no longer lists the
outcome’s location under “Fixed location or contrast estimates”: it is
fixed at zero for identification and is now printed as such. Binary
intercepts and categorical contrasts are still printed as
estimates.gt_diagnostics(),
no longer carry the constructor’s specification-only note after the
engine’s data checks have run; the discrete path now records its
validation scope through the same step the Gaussian path uses.scripts/prepare_release.py --from-checked-candidate
refuses a candidate directory without a check report recording a
successful R-devel check of exactly those archive bytes, and records the
checking R version in the manifest’s provenance.dense_newton_solve_invalid,
dense_final_factor_invalid), reporting the backward error
and its bound when the refusal happens at the starting values. A native
Cholesky can return successfully and still hand back a factor of some
other matrix; issue #14 captured one such instance on a hosted runner,
and a returned factor is no longer treated as valid merely because no
error was raised.Matrix and
methods joined Imports for the private sparse
random-design, Hessian, factorization and conditional-mode files behind
a private evaluator seam. None of it is public API: no public entry
point selects the sparse path, and every fit still runs through the
dense engine. The compatibility matrix runs the sparse factorization
test on every platform.Source version: 0.2.0. For versioned archives, manuals and publication status, see the repository manifest and GitHub releases. These repository records are excluded from the package archive; this source version does not assert that a corresponding release has been published.
First 0.1 release. An earlier 0.1.0 candidate was prepared locally
but never tagged or published, so this release is cut from the hardened
sources instead and supersedes it; the notes below cover both. The
statistical models are unchanged from that candidate: every estimate,
coefficient and acceptance decision in
tests/package-characterization.R reproduces its values
within the tolerances recorded there.
p x (i:h) and for
p x (i:h) x r with a fixed facet, with every expected
coefficient written out from the published formulas rather than produced
by the code under test. Nested designs were previously exercised only at
the specification level: no nested model was fitted, and no nested
reliability or decision study was computed.help("gt_design"), help("gt_reliability")
and help("gt_dstudy") now define balanced coded
panel explicitly, with a worked contrast between globally unique
child labels and within-parent codes.R/gaussian_retry.R.
Every attempt now records a real optimizer status; previously a trial
run inside OpenMx’s own retry loop could be recorded with an unknown
status, and a change in OpenMx’s message wording could fail an otherwise
valid fit.fit$retry_attempts gains start_type
(replacing start) and optimizer_success, and
drops the transcript-specific native_attempt,
invocation, continuation_reason and
native_returned_fit columns. attempt,
optimizer, status, minus2loglik,
external_accepted, external_rejection_reason,
error and returned_fit are unchanged.
fit$retry_settings$native_invocations becomes
optimizer_runs.extra_tries + 1 runs, each unsuccessful run followed by
OpenMx’s own bounded uniform perturbation of the best model so far,
stopping at the first externally accepted run.logLik(), nobs() and
coef() methods for gt_fit, and a print method
for gt_diagnostics(), which now returns a classed
object.AIC() and BIC() reproduce the fit’s own
recorded conventions: an ML fit’s ml_AIC and
ml_BIC_response_vectors, a REML fit’s
reml_AIC_variance_parameters. A REML logLik
carries REML = TRUE; a discrete one is labelled as a
first-order Laplace approximation.gt_component_vcov() for the sampling covariance of
the estimated source covariances, which is what
gt_reliability() propagates into an interval.vcov() on a fit raises an error rather than returning
that matrix. In R, vcov(fit) is the covariance of
coef(fit), and generic tooling relies on the pairing; this
package does not estimate it, because Gaussian outcome means are
profiled out of the likelihood and the discrete engine computes no
observed information. The error names the reason and points at
gt_component_vcov().gt_control() gains retain, choosing which
optional components a fit keeps: data, model,
retry_log and session. Every default is
TRUE, so an existing call is unaffected. Dropping all four
reduced a 600-row Gaussian fit from 525 KB to 64 KB with every reported
result identical, including reliability, decision studies, diagnostics,
correlations and the component covariance.panel summary, so
reliability and decision studies remain available when the modelled data
was not kept. Where the data is kept it is still what the balanced-panel
rules are checked against, so a panel edited after fitting is still
caught.max_dense_bytes (default 512
MiB), checked before allocation. The other discrete limits bound counts;
this bounds the dense algebra those counts imply, which is what protects
a caller who raises them. The refusal names the estimate, the limit, the
observation count, the random dimension, the size of the random-design
matrix, and the alternatives. It does not bind for any model the
existing count limits already allow.artifacts/manifest.json declares
release_state, and the marked README and NEWS blocks
declare it too. Publication is now checked against git: a
published claim requires the version tag, and a
prepared claim fails once that tag exists. Nothing calls a
bundle published before it is.scripts/prepare_release.py, which derives every
version from DESCRIPTION, validates, builds the archive and manual,
writes the manifest, rewrites the release blocks, verifies the result,
and stops. It never tags, pushes, uploads or submits.scripts/check_public_contents.py no longer hard-codes
the version: the package name comes from DESCRIPTION and the bundle
version from the manifest, which is what lets a development checkout
retain the preceding bundle.docs/REPOSITORY_POLICY.md with the required
branch-protection state, docs/branch-protection.json as the
exact payload, and scripts/check_branch_protection.py to
verify it. The declared branch protection was applied to
main after the release was published.SECURITY.md and CODEOWNERS.R CMD Rd2pdf when R’s generated LaTeX is not the layout its
customized cover knows how to reflow, and reports which route it took
and whether the overfull-box gate could run. The manual gate now
requires both pdflatex and makeindex before
claiming it can run, and names the missing tool when it skips.scripts/dependency-locks/renv-bootstrap.json, verified by
SHA-256 before installation, and preferentially taken from a cache that
both locked workflows now keep. Pinning a version says which renv is
used; the digest and the cache are what make retrieving it checkable and
possible.plot() on a decision study now reports an invalid
coefficient instead of failing on a zero-length
condition.gt_preflight() and gt_fit() now share one
definition of the covariance and residual rules, so a request one
accepts is a request the other accepts. Previously preflight admitted a
Residual covariance override that fitting refused, and
fitting completed abbreviated residual names that preflight rejected.
Both now refuse both, with the same message.T in the discrete engine no
longer shadows the TRUE alias.docs/LIMITATIONS.md collects every limitation in one
place; the other documents link to it. docs/ROADMAP.md
records planned work. docs/DEVELOPMENT_STATUS.md now holds
only the current state.The capability this release ships, unchanged from the earlier candidate.
The version change does not add sparse fitting, unbalanced Gaussian estimation or reliability, cost-aware planning, bootstrap/jackknife, or discrete intervals. GitHub publication and package checks are separate from CRAN submission and acceptance.
variance covariance coordinates, which
auto now selects for every univariate or diagonal discrete
model, treated any negative coordinate as an error. A bounded optimizer
evaluates a few ulps outside a bound while projecting onto it, so a
coordinate of -3.4e-17 recorded an attempt error, set
computation_failed, and rejected the entire fit. Zero is
this parameterization’s natural domain boundary, so rounding noise is
now projected onto it; a coordinate meaningfully below zero still stops.
This rejected fits whose estimates were already correct, including the
ordinal fit in examples/standalone_usage.R.NA rather than a number whenever the joint Hessian happened
to stay invertible, matching what it already reported when the Hessian
did not. No symmetric interval follows from curvature at a boundary. The
full entry covariance matrix is unchanged in $uncertainty,
and coefficient intervals still use it.R CMD build write
build/vignette.rds and inst/doc/ products into
the archive, which no release gate expected. The public-content audit
rejected the build index as an unexpected build file and then as a
malformed example resource; the committed-artifact gate would have
reported every generated vignette product as content missing from git at
the next release. Both now account for them, and inst/doc/
products are derived from the vignettes declared in the source commit
rather than excused by prefix, so an unexpected file there still
fails.R CMD check
failed the whole package on
Packages suggested but not available, reporting a missing
documentation toolchain as a package defect. The gate now checks with
_R_CHECK_FORCE_SUGGESTS_=false in exactly that case, and
accepts the single extra --as-cran line about a missing
vignette index only when vignettes were genuinely skipped, so it can
never excuse a real one.fs needs libuv headers, and install.packages()
only warns when a build fails, so the step passed while the toolchain
was absent. The workflow installs libuv1-dev and the step
now asserts the result instead of reporting success either way.fixed = "temp" selects a reliability
estimand after fitting; it does not alter the fitted variance model. A
within-temperature analysis is one conditional sensitivity analysis when
pooling is questionable.2 * H^-1 and
keeps it. Reconstructed values match OpenMx’s own standard errors to
machine precision and match the classical mean-square formulas for a
crossed two-way design to five significant figures.gt_reliability() and gt_dstudy(),
per outcome and for weighted composites. New level
argument; new Erho2_se, Erho2_lower,
Erho2_upper, Phi_se, Phi_lower,
and Phi_upper columns. plot.gt_dstudy() draws
the bounds. Deterministic tests check the delta-method mapping. A
previously reported pilot coverage range has no reproducible
protocol/results in the public repository and does not define a
validated operating range.NA,
never a structural zero that would read as certainty.check_hessian is disabled or the curvature is unusable. The
discrete Laplace engine computes no observed information and says so
rather than leaving the field empty.fixed to gt_reliability() and
gt_dstudy(), implementing the mixed model of Brennan
(2001): the object-by-fixed-facet variance is averaged over that facet’s
levels and joins universe-score variance, a source built only from fixed
facets shifts every object equally and leaves the model, and every other
source keeps its usual divisor. With no fixed facet the decomposition is
unchanged. $source_roles records the role each source
took.full_cell to gt_design().
full_cell = FALSE removes exactly the object-by-all-facets
source and leaves every other requested source unchanged, which is how a
binary or ordinal study with one observation per cell declares the
default crossed design. The discrete rejection message now names that
argument. The source is still never dropped automatically.browseVignettes("Gtheory4LLM") finds it.
system.file("doc", "LLM-workflow.R") and the installed HTML
keep working.man/*.Rd and NAMESPACE the only
documentation source of truth. The R files previously carried roxygen
blocks that were not the source of the richer hand-written Rd pages;
running roxygen2 would have replaced them and dropped the S3 methods
registered in NAMESPACE. Those blocks are now plain
comments.R (>= 4.5.0) floor comes from
OpenMx’s under-declared C API requirement rather than from this
package’s own code.covariance_parameterization default change, and adds
installed-package regression tests for standard errors, the delta-method
mapping, coefficient intervals, mixed-model fixed facets, and
full_cell..DS_Store, which git
already ignores and a desktop environment recreates. The exemption is by
exact filename, is reported under skipped_os_metadata, and
never applies inside an archive.scripts/check_package.py needs knitr, rmarkdown, and
pandoc. When they are absent it records that, builds with
--no-build-vignettes, checks with
--ignore-vignettes, and the installed-tutorial stage prints
NOT RUN rather than passing silently. The three workflows
install the toolchain.counts to gt_reliability() with the
existing design argument retained as a compatibility
alias.auto:
direct variances for univariate/diagonal models and log-Cholesky for
joint unstructured models. Explicit choices and numerical acceptance
criteria remain available.gt_preflight() to report resolved sources,
covariance and random-effect dimensions, replication/completeness,
resource limits, and supported scales.Scope at 0.0.6 was exact balanced Gaussian likelihood and small-model first-order Laplace discrete likelihood. Discrete latent random effects remain Gaussian. Binary/ordinal reliability requires an explicit latent scale; unordered categorical scalar reliability, observed-score discrete reliability, joint Gaussian-discrete fitting, bootstrap/jackknife, and uncertainty intervals of any kind were not implemented in that release. (The development version adds asymptotic Wald standard errors and delta-method coefficient intervals for Gaussian fits only; see above.) Numerical tests do not establish parameter recovery, approximation adequacy, or application-wide statistical validity.