Hessian L1 ADMM uses an operator-scale initial penalty by default
(admm.rho = NULL) and adapts it during its initial iterations. An explicit
positive admm.rho still sets the initial value; use
admm.adaptive.rho = FALSE to hold it fixed. Numerical stabilization now
preserves the requested objective instead of adding an unintended ridge.
ADMM convergence also checks stationarity of the original objective. Incomplete fixed fits warn and print their status. CV excludes candidates with any unsuccessful fold and errors if none qualify or the selected full-data ADMM refit is incomplete. Fold diagnostics are retained, including on the no-eligible-candidate error. Generalized-lasso warnings are retained.
The shared PTTF L1 solver receives the same safeguards. Hessian L1 objective reporting now accounts for the penalty actually used with row scaling; the unscaled Hessian norm remains available separately.
Generalized-lasso Hessian paths now propose penalties only: all returned
coefficients and CV candidates are solved by ADMM on the original objective.
Finite path coefficients can be suboptimal for nearly rank-deficient operators;
missing-label path coefficients can include an extra ridge. The path remains
diagnostic, with its original objectives in solver$path.objective and the
refined route labeled genlasso_admm_refined. Default Hessian ADMM stopping
tolerances are now 1e-6 absolute and 1e-5 relative. Fitted values and selected
penalties can change; difficult candidates may require a larger iteration cap.
lps.pointwise.band() now estimates noise variance using residual noise
degrees of freedom sum((I - S)^2) = n - 2*tr(S) + sum(S^2). The former
n - tr(S) denominator is available as variance.method = "legacy".
df still reports tr(S); residual.df is returned separately. Bands remain
pointwise, conditional on a fixed smoother, and uncorrected for smoothing bias.fitted() and residuals() with their existing
vector/matrix and missing-label contracts. Residuals at other evaluation
coordinates are rejected. Tracked harmonic fitted values use fitted(); density mass
stays $rho. No new out-of-sample prediction or reusable-refit contract is implied.summary()
methods cover the main regression families. Unavailable convergence information
is labeled explicitly, and density accounting and local fallbacks remain visible.plot.synthetic_dataset() adds named view, legend, and col
controls while preserving automatic view selection. Point-color keys now
describe the displayed values; region coloring requires region labels.dgraph representation, without restoring
retired geometry re-exports.TRUE or FALSE.
Recognized controls forwarded to subject-occupation smoothers remain supported.harmonic.smoother() reports extrema-stability detection separately from
numerical convergence. stable_iteration is now NA_integer_ when no
stability window was detected; check stability_detected before using it.
It returns update/residual histories and actual recorded iteration numbers,
always records the final state, and uses those numbers in plots. Stability
of recorded extrema does not establish convergence or optimal smoothing.This release reduces the explicit public API from 93 to 60 exported functions. The 35 retired names are replaced by dependency-qualified calls, a unified fitter, or two S3 generics.
Replace the six exported refit.*() functions with the S3 generic
refit(object, y, ...), covering MALPS, both lifting trend filters,
metric graph low-pass, quadratic Hessian, and Hessian L1 fits. In old
calls, rename fitted.model to object and y.new to y.
Method-specific controls, response-shape restrictions, selection behavior,
and return classes are preserved. Former help names remain available.
Replace lps.smoother.matrix() and malps.smoother.matrix() with
smoother.matrix(object, ...). LPS retains check.tol and its
fixed-configuration requirements; MALPS retains max.n, allow.robust,
and its conditional interpretation. The eight former entry points are
no longer exported. The function-guide vignette documents all supported methods.
API consolidation (breaking change): retire the 25 transitional synthetic
geometry and sampling re-exports. Call the same names and arguments with
dgraphs::, for example dgraphs::synthetic.circle() and
dgraphs::synthetic.sampling.uniform.interval(0, 1). Statistical recipe,
truth, response, materialization, and validation functions remain in
geosmooth, including its local synthetic.sampling.stratified().
Consolidate quadratic Hessian regression into
fit.ssrhe.hessian.regression(). Existing fixed calls with lambda1 and
lambda2 are unchanged. Replace the former .cv() and .gcv() fitters
with lambda.selection = "cv" or "gcv" and penalty grids. The old
function names are no longer exported; their help aliases explain migration.
CV settings now use cv.control = list(foldid = ..., cv.folds = ..., loss = "mse", selection = "min"); foldid replaces fold.id and
cv.folds replaces nfolds. GCV trace settings use
gcv.control = list(trace.method = "hutchinson", trace.n.probes = 50L, trace.seed = ...). Both control lists support support.selection,
support.grid, and support.max.candidates (formerly the mode-specific
support.cv.max.candidates / support.gcv.max.candidates). Nonempty controls
for the wrong mode, unknown control entries, and simultaneous scalar/grid
penalties are errors. CV still supports missing labels; GCV still requires
a single fully observed response and strictly positive weights. Existing
fit classes, CV/GCV tables, and refit support are preserved.
n.cores argument does not enable parallel
execution, and per-column GCV results report n.cores.used = 1L.