Changes after Version 0.15-45

User-visible changes are maintained in NEWS.md. Detailed implementation
history is maintained in the Git repository and linked issues. The entries
below preserve the historical package change log through Version 0.15-45.

Changes from Version 0.15-44 to 0.15-45 [26-Jun-2026]

* Opened the 0.15-45 development cycle after CRAN publication of 0.15-44.
  No `crs` source changes were required for the proactive `np`/`npRmpi`
  memory-hardening and MPI nearest-neighbor cache reassessment tranche.

* Improved mixed-data cross-validation efficiency by using a guarded
  weighted least-squares Gram/Cholesky solve with QR/SVD fallback for
  kernel and factor spline CV routes. The change covers `cv.ls`, `cv.gcv`,
  and `cv.aic` for additive, tensor, and GLP bases consistently across
  weighted and unweighted mean-regression CV, while preserving the existing
  rank, fallback, and objective contracts.

* Restored the GLP model-matrix column oracle used to select generalized
  local-polynomial interactions while retaining compiled column-product
  construction, preserving GLP stability and shape compatibility.

* Improved categorical-kernel mean fit and evaluation efficiency by reusing
  the guarded weighted least-squares Gram/Cholesky primitive for the
  non-quantile prediction ingredients when `model.return=FALSE`, covering
  additive, tensor, and GLP bases consistently across weighted and
  unweighted routes while preserving fitted values, intervals, standard
  errors, hatvalues, rank, and residual degrees of freedom.

* Improved categorical-kernel mean-gradient efficiency by reusing the same
  guarded weighted least-squares Gram/Cholesky primitive for non-quantile
  derivative solves in training and evaluation routes. The change covers
  additive, tensor, and GLP bases consistently across weighted and unweighted
  routes while preserving derivative estimates and normal-approximation
  intervals to numerical roundoff.

* Changed the public `crs.formula()` NOMAD evaluation-budget default
  `max.bb.eval` to `NULL`, with route-specific defaults resolved after
  route selection. Continuous-only `frscvNOMAD` searches default to
  `max.bb.eval=10000`, while kernel/categorical `krscvNOMAD` searches
  default to `max.bb.eval=1000`. These defaults were set on the basis
  of simulation evidence and real-world applications, and explicit
  user-supplied `max.bb.eval` values continue to pass through to the
  selected NOMAD route.

* Repaired public-wrapper consistency so `crs.formula()` forwards
  `random.seed`, `max.bb.eval`, integer mesh/frame geometry controls,
  and `tau` to `frscvNOMAD`, matching the existing `krscvNOMAD`
  forwarding contract.

* Made NOMAD multistart generation invariant to progress/display
  settings in `frscvNOMAD` and `krscvNOMAD`, so displaying optimizer
  progress no longer changes the starting-value geometry or fitted
  result.

* Implemented independent native NOMAD restart sweeps for CRS
  cross-validation searches, preserving the public multistart contract while
  keeping restart diagnostics explicit.

* Added public `max.eval` control for NOMAD point-lookup budgets and changed
  continuous-only `frscvNOMAD` defaults so `MAX_EVAL` and `MAX_BB_EVAL` can be
  controlled independently. The default point-lookup cap for continuous-only
  CRS NOMAD searches is now 1000, reducing duplicate NOMAD cache lookups while
  preserving the established black-box evaluation budget.

* Clarified NOMAD cache reporting in summaries. User-facing output now
  distinguishes true objective/function evaluations from repeated NOMAD point
  lookups avoided by the native cache.

* Added elapsed-time recording and reporting for CRS cross-validation and
  summary paths using wall-clock elapsed time rather than user CPU time.

* Modernized CRS plot methods toward the current `np` plot interface,
  including fitted mean/quantile displays by default, NP-style controls such
  as `errors`, `band`, `B`, `output`, `data_overlay`, `data_rug`,
  `perspective`, `renderer`, and `view`, plus base/rgl surface rendering,
  data overlays, rugs, and asymptotic/inid/wild/bootstrap interval support
  where defined.

* Hardened CRS plot argument validation and public plot contracts. Legacy
  CRS plot switches that no longer match the NP-style interface now fail fast
  with guidance, and unsupported controls such as renderer-level switches are
  rejected explicitly rather than silently ignored.

* Added refit and wild-bootstrap interval support for CRS gradient plots and
  aligned categorical/factor plot rendering, legends, and interval displays
  more closely with `np`.

* Repaired explicit derivative handling in `predict.crs()` so caller-supplied
  derivative orders are honored rather than bypassed by the fitted-object fast
  path.

* Expanded the `crs_nomad_api` help page with package-author guidance,
  direct C-callback and R-callback bridge skeletons, and explanations of the
  most important native result fields.

Changes from Version 0.15-43 to 0.15-44 [01-Jun-2026]

* Development version opened after CRAN publication of 0.15-43.

* Added the final package-author native NOMAD C API (`crs_nomad_solve`) with
  C and R callback modes, explicit option arrays, generated starts,
  multistart support, budget handling, mesh-size array options, interrupt
  handling, and deterministic seed behavior for downstream packages.

* Exposed NOMAD native cache counters from `snomadr()` (`cache.hits`,
  `cache.size`, `callback.evaluations`, and `total.evaluations`) so
  downstream callers can distinguish true R callback evaluations from
  points satisfied by NOMAD's cache without changing optimizer behavior.

* Hardened native NOMAD API contracts by rejecting cache-off native solves,
  mirroring infinite objective handling, documenting main-thread affinity for
  R callback routes, and tightening named-list validation in native helpers.

Changes from Version 0.15-42 to 0.15-43 [15-May-2026]

* Hardened native-code protection in the NOMAD interface to address rchk
  reports, preserving existing optimizer behavior and user-facing semantics.

* Addressed the GCC 16 compilation warnings reported by Kurt Hornik/CRAN for
  the `r-devel-linux-x86_64-debian-gcc` check flavor by replacing two
  warning-triggering NOMAD `std::make_shared` construction sites with
  equivalent `std::shared_ptr(new ...)` construction. The repair is limited
  to the implicated vendored NOMAD allocation expressions and preserves
  existing `snomadr()` behavior, `crs` native-call behavior, and downstream
  `np`/`npRmpi` `nomad = TRUE` caller results.

Changes from Version 0.15-41 to 0.15-42 [29-Apr-2026]

* Updated the package startup message to point first to the online gallery
  of examples and guides, while retaining the compact installed
  `crs_getting_started` vignette as the offline/package-side entry point.

* Reorganized and expanded `.Rd` argument documentation into user-oriented
  sections with clearer defaults and cross-references, improving scanability
  without changing the public API.

* Added `.Rbuildignore` coverage for local agent/skill guidance files so
  release tarballs remain clean.

* Hardened selected demos for noninteractive smoke use by adding validated
  defaults and optional `CRS_DEMO_*` overrides while preserving interactive
  prompts for users running demos manually.

* Sealed the unsupported experimental NOMAD OpenMP-only routes in the
  shipped `crs` build so ambient `_OPENMP` settings can no longer
  enable `COOP_MADS_OPTIMIZATION`, `PSD_MADS_OPTIMIZATION`, or
  `NB_THREADS_PARALLEL_EVAL > 1`.

* Fixed the source-build missing-symbol failure reported for
  `COOPMads`/`PSDMads` by preventing those excluded translation units
  from being referenced in the shipped package.

* Added installed-build regression coverage for the shipped serial
  `snomadr()` contract, including explicit checks that unsupported
  NOMAD OpenMP-only options fail cleanly.

Changes from Version 0.15-40 to 0.15-41 [07-Apr-2026]

* Removed the legacy `npglpreg` package surface from `crs`
  (`R/`, `man/`, `tests/`, `demo/`, and `NAMESPACE`). Users should
  now use `np::npreg(..., nomad = TRUE)` or
  `npRmpi::npreg(..., nomad = TRUE)`.

* Replaced the remaining `crsivderiv()` reliance on `np` density,
  distribution, and kernel-sum helpers with internal gaussian
  normal-reference helpers, eliminating the hard runtime dependency on
  `np` for IV derivative estimation.

* Removed `np` from the `DESCRIPTION` dependency fields entirely and
  dropped the remaining optional `npreg()` comparison examples,
  yielding a clean package-level break from `np`.

* Restored the internal `resolve_cv_maxPenalty()` helper to the source
  tree and validated the affected CV-penalty and `crsivderiv` routes on
  an installed build.

Changes from Version 0.15-39 to 0.15-40 [10-Feb-2026]

* Major speedups in core CV/estimation helpers (kernel/spline paths),
  including reduced categorical overhead and improved caching.

* Added warm-start optimization and formal S3 classes/methods for
  crsiv/crsivderiv (print/summary/plot), with enhanced reporting.

* Updated CV penalty strategy (data-driven defaults and cv.func-aware
  scaling) to improve optimization robustness.

* Extended test coverage and resolved check/doc issues (codoc/aliases,
  non-ASCII cleanups, and dependency declarations).

* Improved npglpreg/MPI workflow handling and console-output controls
  for cleaner batch/interactive runs.

Changes from Version 0.15-38 to 0.15-39 [28-Jan-2026]

* Added ggplot2 to Suggests field in DESCRIPTION per CRAN requirements

* Indexing issues with shrinkage addressed

* Optimization of kernel(), prod.kernel(), integrate.trapezoidal(), NZD(), NZD_pos(), matrix.combn(), splitFrame(), blank(), check.function(), dimBS()

* Fixed index validation bug in crssigtest.R

* Fixed ci=T deprecation in npglpreg.Rd

* Fixed typos reported by users in man page

Changes from Version 0.15-37 to 0.15-38 [4-Sep-2024]

* Thanks to Zhenghua Nie for fixing the compiling failure when R_NO_REMAP is defined, and the C/C++ compiling failure when R_NO_REMAP is defined.

*  Thanks to Duncan Murdoch for the heads up and PR (new function names from rgl package merged) ``An upcoming release of rgl will deprecate a large number of rgl.* functions in favour of the *3d versions. This PR makes the substitutions needed to avoid warnings when that happens. I think the displays should remain the same, but it is possible some defaults (e.g. background colour) are changed.''

Changes from Version 0.15-36 to 0.15-37 [31-Dec-2022]

* Fixed issue in snomadr.cpp reported by Brian Ripley "warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]" (thanks Zhenghua!)

* Fixed issue reported - compilation error on Alpine Linux #9

Changes from Version 0.15-35 to 0.15-36 [18-Oct-2022]

* Fixed warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype] (thanks Zhenghua!)

Changes from Version 0.15-34 to 0.15-35 [09-Oct-2022]

* Explicit acknowledgment in DESCRIPTION of code gsl_bspline.c/.h adapted from the GNU GSL library with further details appended to gsl_bspline.c/.h (thanks to Professor Brian Ripley for noting this oversight).

Changes from Version 0.15-33 to 0.15-34 [30-Mar-2022]

* Fixed warnings flagged on CRAN (thanks Zhenghua!) [i) snomadr.cpp:374:60: warning: void operator delete(void*, std::size_t) called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete], ii) nomad_src/Sgtelib_Model_Search.cpp:957:43: warning: array subscript -1 is outside array bounds of bool [2147483647] [-Warray-bounds]]

* Additional casting of x as as.matrix() in is.fullrank()

Changes from Version 0.15-32 to 0.15-33 [02-Feb-2021]

* Updated NOMAD to version 3.9.1

* Removed dependency on C++11 random_shuffle per recommendation from R development team (thanks Zhenghua!)

* Followed R core team request to "Please move rgl to Suggests and use conditionally (see 1.1.3.1 of Writing R Extensions) at the next package update"

Changes from Version 0.15-31 to 0.15-32 [19-Nov-2019]

* Corrected return value for mgcv_tmm() (was void, not valid address of R object)

* Added crs.messages=FALSE capabilities to clsd()

Changes from Version 0.15-30 to 0.15-31 [01-May-2018]

* basis="auto" was default, doc/code discrepancy fixed

* Hattip to Thibault Vatter who patched an issue with weights not being functional in crsiv.R

* Fixed issue with compiler compliance to support ICC and retain backwards compatability with MSVC C++

Changes from Version 0.15-29 to 0.15-30 [03-Dec-2017]

* dim.plot() replaced by n2mfrow() for determining layout of multiple
  figures on one device

* Fixed issue where, occasionally during cross-validation, execution of
  the function npglpreg() could halt with an error indicating missing
  value needed where TRUE/FALSE needed

Changes from Version 0.15-28 to 0.15-29 [06-Oct-2017]

* Fixed issue pointed out by Brian Ripley (thanks!) about double ** _X; in the nomad code

* Updated licence to GPL (>= 3)

Changes from Version 0.15-27 to 0.15-28 [06-Oct-2017]

* Zhenghua worked his magic to furnish a computationally efficient glp.model.matrix using a C backend similar to Simon Wood's C backend for his tensor.product.model.matrix

* Fixed issue with integer predictors and NOMAD for npglpreg() arising from upgrade to latest version of NOMAD

* Fixed issue with min.poll.size arising from upgrade to latest version of NOMAD

Changes from Version 0.15-26 to 0.15-27 [06-May-2017]

* Zhenghua fixed minor issue with dim.bs()

* Incorporating Simon Wood's C-based tensor product code (was using his R-based code, the C code is substantially faster)

* Naming of variables in NOMAD port aligned with Brian Ripley's comment ('Identifiers starting with an underscore followed by an upper-case letter or another underscore are reserved for system macros and should not be used in portable code (including not as guards in C/C++ headers).')

Changes from Version 0.15-25 to 0.15-26 [29-April-2017]

* Zhenghua patched up issues arising with windows build

* crs_init.c attempts to deal with registration issue/note

Changes from Version 0.15-24 to 0.15-25 [29-April-2017]

* Fixed glitch that could potentially arise when computing derivatives and multiple predictors are assigned degree 0 when using the glp basis

* Updated NOMAD to latest version (3.8, released March 2017)

Changes from Version 0.15-23 to 0.15-24 [18-Dec-2014]

* Move option init from .onAttach to .onLoad in zzz.R (Bernd Bischl)

* Reworded DESCRIPTION (request from Kurt Hornik)

Changes from Version 0.15-22 to 0.15-23 [11-Aug-2014]

* Fixed bugs on setting seed in snomadr so that successive calls with
  restarting result in the same solution (thanks to Arne Henningson for
  detecting and reporting this issue)

* Addressed issue with cv.aic and npglpreg where degenerate solution could
  occur when shrinking was invoked

* Enhanced the robust measure of scale to include mad which is more robust
  than IQR

Changes from Version 0.15-21 to 0.15-22 [22-Jan-2014]

* crs.messages=FALSE was being ignored in frscv, krscv, frscvNOMAD, and
  krscvNOMAD, as was the passing of additional arguments via opts=list()
  to snomadr from certain functions

* Default settings for tuning parameters for snomadr in npglpreg have been
  optimized based on extensive simulations for simulated and real datasets
  (we `optimized the optimizer' so to speak)

* Fixed glitch in npglpreg where cv.aic was only working properly for
  the local constant estimator (i.e. degree=0)

* bwscaling is deprecated in the latest (development) version of np which
  necessitated changes to npglpreg. In the process the way scaling is
  performed ought to be more robust in general due to changes to default
  starting values for numeric predictors

Changes from Version 0.15-19 to 0.15-21 [08-Jan-2014]

* Addressed issues with certain non-package files being included via use
  of .Rbuildignore

* NOMAD team corrected dereferencing null pointer in Mads.cpp that was
  uncovered through the use of UB sanitizer checks with clang

Changes from Version 0.15-18 to 0.15-19 [30-Dec-2013]

* Updated snomadr to NOMAD 3.6.2 (released Dec 2013) which resolves
  crash/incompatibility with the clang compiler on Mac OS X Mavericks 10.9.1

* Added new function clsd() that does logspline regression jointly
  choosing the degree and number of segments (knots) - this is to be
  treated as beta but the univariate continuous only case currently
  implemented is capable of outperforming existing logspline methods that
  set the spline degree to an ad hoc value (3)

* npglpreg() now optimizes at the level of the bandwidth scaling factors
  (thanks to Sebastien Le Digabel for the suggestion) to bring
  parameters to a `common scale'

* For cross-validation with npglpreg() we test for very large
  bandwidths for the continuous predictors (> bandwidth.switch
  robust standard deviations) then switch to the global
  polynomial approximation for computation speed (produces identical
  results but uses global least squares rather than local least
  squares). This can result in substantial improvements when large
  bandwidths are appropriate. Combined with trees (in progress in
  np) this could lead to marked reductions in computation time with
  zero loss in accuracy

Changes from Version 0.15-17 to 0.15-18 [29-Dec-2012]

* Using .onUnload rather than .Last.lib in zzz.R

* Added options to smooth residuals for stopping rule in crsiv
  (i.e. smooth y-phi(z)~w as opposed to separately smoothing y~w and
  phi(z)~w)

* Added options to input starting values for crsiv and crsivderiv

* Stopping rules for crsiv and crsivderiv modified

Changes from Version 0.15-16 to 0.15-17 [04-Jun-2012]

* Updated NOMAD from 3.5.0 (released Jan 2011) to 3.5.1 (released Mar
  2012)

Changes from Version 0.15-15 to 0.15-16 [30-Apr-2012]

* Fixed bug when deriv= is used in crs() (derivatives for categorical
  variables were not correct in some cases - derivatives computed by
  plot and plot-data were correct however)

* Fixed issue when plot called with "plot-data" or "data" and
  par(mfrow()) is not reset

* Startup message points to the faq, faq is now a vignette

* Glitch fixed in npglpreg() where kernel types were not being passed
  to the NOMAD solver...

* Added ckerorder option to npglpreg()

* More information output by summary for npglpreg() objects (kernel
  type, order etc.)

* tol for determining ill-conditioned bases now consistent with
  Octave/Matlab etc. and uses the tolerance
  max(dim(x))*max(sqrt(abs(e)))*.Machine$double.eps

Changes from Version 0.15-14 to 0.15-15 [16-Apr-2012]

* NOTE: ** major change in default setting ** Default basis set to
  "auto" from "additive" for more robust results when using default
  settings with more than one continuous predictor (at the cost of
  additional computation for all supported bases, more memory
  required). Warnings changed to reflect this, additional warnings
  provided, but mainly when cv="none" (i.e. user is doing things
  manually and failing to provide defaults)

* Added switch for discarding singular bases during cross-validation
  (singular.ok=FALSE is default, so default is to discard singular
  bases)

* More stringent checking for ill-conditioned bases during
  cross-validation - previous checks were insufficient allowing poorly
  conditioned bases to creep into the final model (this may result in
  increased runtime for large datasets and multivariate tensor models)

* Potential runtime improvement for large bases (test for
  ill-conditioned bases was still relying in parts on rcond(t(B)%*%B),
  now using crossprod(B) which is more computationally efficient than
  rcond(t(B)%*%B) and has a substantially smaller memory footprint)

* No longer report basis type for one continuous predictor as all
  bases are identical in this case

Changes from Version 0.15-13 to 0.15-14 [22-Mar-2012]

* Added support for weights to crs()

* Corrected issue with reporting of cv function value by summary()
  with quantile regression splines

* Test for coexistence of pruning and quantile regression splines and
  stop with a message that these cannot coexist

* Check for valid derivative integer

Changes from Version 0.15-12 to 0.15-13 [05-Mar-2012]

* Added new function crsivderiv()

* More options added to crsiv()

* Modified vignette (spline_primer)

* Corrected error in demo for IV regression when exhaustive search was
  selected (nmulti needed to be set though it is not used)

* Changes to code to improve compliance with R `Writing portable
  packages' guidelines and correct partial argument matches

Changes from Version 0.15-11 to 0.15-12 [7-Dec-2011]

* Added option to limit the minimum degrees of freedom when conducting
  cross validation (see cv.df.min which defaults to 1) which can save
  memory and computation time for large sample sizes by avoiding
  computation of potentially very large dimensioned spline bases

Changes from Version 0.15-10 to 0.15-11 [3-Dec-2011]

* Fixed glitch in bwtype="auto" when adaptive_nn is selected

Changes from Version 0.15-9 to 0.15-10 [3-Dec-2011]

* Fixed regression in code when using cv.func=cv.aic

* Added option bwtype="auto" for npglpreg (automatically determine the
  bandwidth type via cross-validation)

Changes from Version 0.15-8 to 0.15-9 [25-Nov-2011]

* Fixed glitch when computing derivatives with crs and multiple
  predictors are of degree zero

* Added support for parallel npglpreg (calls npRmpi rather than np -
  see demo)

* Improved handling of complex bases via dim.bs (test for negative
  degrees of freedom prior to attempting to construct the basis
  function - dramatically reduces memory overhead and can cut down on
  unnecessary computation)

Changes from Version 0.15-7 to 0.15-8 [16-Nov-2011]

* Added support for is.fullrank testing for generalized local
  polynomial kernel regression for cross-validation (default remains
  ridging a la Seifert & Gasser), replaced rcond(t(X)%*%X) with
  is.fullrank(X) (smaller memory footprint for large datasets)

* Fixed glitch with derivative computation when one or more degrees is
  0 when kernel=TRUE and additionally when one or more factors is
  excluded when using kernel=FALSE

* Fixed issue with reported cross-validation score only corresponding
  to leave-one-out cross-validation by passing back cv function from
  solver rather than computing post estimation

* Added ability to estimate quantile regression splines

* More rigorous testing for rank deficient fit via rcond() in cv
  function

* Fixed issue where degree.min was set > 1 but initial degree was 1
  (corresponding to the linear model which is the default for the
  initial degree otherwise)

* Added the option to treat the continuous bandwidths as discrete with
  lambda.discrete.num+1 values in the range [0,1] which can be more
  computationally efficient when a `quick and dirty' solution is
  sufficient rather than conducting mixed integer search treating the
  lambda as real-valued

* Corrected incorrect warning about using basis="auto" when there was
  only one continuous predictor

Changes from Version 0.15-6 to 0.15-7 [24-Oct-2011]

* Added logical model.return to crs (default model.return=FALSE) which
  previously returned a list of models corresponding to each unique
  combination of the categorical predictors when kernel=TRUE (the
  memory footprint could be potentially very large so this allows the
  user to generate this list if so needed)

Changes from Version 0.15-5 to 0.15-6 [17-Oct-2011]

* Compiler error thrown on some systems due to changes in
  Eval_Point.hpp corrected

Changes from Version 0.15-4 to 0.15-5 [16-Oct-2011]

* Thanks to Professor Brian Ripley, additional Solaris C/C++ compiler
  warnings/issues have been resolved

* Some internal changes for soon to be deprecated functionality
  (sd(<matrix>) expected to be deprecated shortly)

Changes from Version 0.15-3 to 0.15-4 [15-Oct-2011]

* Extended the gsl.bs functionality to permit out-of-sample prediction
  of the spline basis and its derivatives

* Added option knots="auto" to automatically determine via
  cross-validation whether to use quantile or uniform knots

* Minor changes to help page examples and descriptions and to the crs
  vignette

Changes from Version 0.15-2 to 0.15-3 [05-Sep-2011]

* Fixed glitch when all degrees are zero when computing the
  cross-validation function (also fixes glitch when all degrees are
  zero when plotting the partial surfaces)

* Added new function crssigtest (to be considered in beta status until
  further notice)

* Added F test for no effect (joint test of significance) in crs
  summary

* Both degree and segments now set to one for first multistart in crs
  (previously only degree was, but intent was always to begin from a
  linear model (with interactions where appropriate) so this glitch is
  corrected)

* Test for pathological case in npglpreg when initializing bandwidths
  where IQR is zero but sd > 0 (for setting robust sd) which occurs
  when there exist many repeated values for a continuous predictor

* Added `typical usage' preformatted illustrations for docs

Changes from Version 0.15-1 to 0.15-2 [30-Jul-2011]

* Renamed COPYING file to COPYRIGHTS

Changes from Version 0.15-0 to 0.15-1 [29-Jul-2011]

* Automated detection of ordered/unordered factors implemented

* Initial degree values set to 1 when conducting NOMAD search (only
  for initial, when nmulti > 1 random valid values are generated)

* Multiple tests for well-conditioned B-spline bases, dynamic
  modification of search boundaries when ill-conditioned bases are
  detected, and detection of non-positive degrees of freedom and full
  column rank of the spline basis (otherwise the penalty
  sqrt(.Machine$double.xmax) is returned during search) - this can
  lead to a significant reduction in the memory footprint

* Added support for generalized B-spline kernel bases (varying order
  generalized polynomial)

* Corrected issue with plot when variables were cast as factors in the
  model formula

* Fixed glitch with return object and i/o when cv="bandwidth" and
  degree=c(0,0,...,0)

* Added tests for pathological cases (e.g. optimize degree and knots
  but set max degree to min degree or max segments to min hence no
  search possible).

* Added argument cv.threshold that uses exhaustive search for simple
  cases where the number of objective function evaluations is less
  than cv.threshold (currently set to 1000 but user can
  set). Naturally exhaustive search is always preferred but often
  unfeasible, so when it is feasible use it.

* Added additional demos for constrained estimation (Du, Parmeter, and
  Racine (2011)), inference, and a sine-based function.

* Substantial reductions in run-time realized.

  - Product kernel computation modified for improved run-time of
  kernel-based cross-validation and estimation.

  - Moved from lsfit to lm.fit and from lm to lm.wfit/lm.fit in
  cv.kernel.spline and cv.factor.spline (compute objective function
  values). Two effects - R devel indicates lm.fit/lm.wfit are more
  robust (confirmed for large number of predictors) and much faster
  cv.kernel.spline function emerges (run-time cut 20-30%).

  - The combined effects of these changes are noticeable. For instance,
  run-time for wage1 with 7 predictor cross-validation goes from 510
  seconds in 0.15-0 to 304 seconds due to use of lm.fit/lm.wfit
  described below to 148 seconds due to the modified kernel function.

Changes from Version 0.14-9 to 0.15-0 [23-Jun-2011]

* Thanks to Professor Brian Ripley, compile on Solaris system issues
  are resolved, and check/examples are reduced in run time to
  alleviate the excessive check times by the R development team. Many
  thanks to them for their patience and guidance.

* Minor changes to radial_rgl demo

Changes from Version 0.14-8 to 0.14-9 [20-Jun-2011]

* Cleaned up issues for creating binary for windows

* Setting seed in crs -> frscvNOMAD/krscvNOMAD fed to snomadr.cpp via
  snomadr.R for starting points when nmulti > 0

* frscvNOMAD and krscvNOMAD will check the number of times the
  objective function, compare with MAX_BB_EVAL and give the warning if
  the maximum is reached (nmulti * MAX_BB_EVAL - note this will only
  detect the case where every restart hit MAX_BB_EVAL)

* Increased default MAX_BB_EVAL from 500 to 10000 (makes a difference
  for difficult problems) and modified default EPSILON in NOMAD along
  with other parameters (MIN_MESH_SIZE, MIN_POLL_SIZE) to reflect
  actual machine precision (using R's .Machine$double.eps where NOMAD
  fixed EPSILON at 1e-13)

* Zhenghua added help functionality for retrieving help via snomadr

* Now default number of restarts in crs is 5 (zero is not reliable
  and I want sensible defaults in this package - higher is better but
  for many problems this ought to suffice)

* Corrected glitches in interactive demos where options were not being
  passed, updated docs to reflect demos

Changes from Version 0.14-7 to 0.14-8 [10-Jun-2011]

* crsiv now returns a crs model object that supports residuals,
  fitted, predict and other generic functions. Note that this approach
  is based on first computing the model via regularization and then
  feeding a transformed response to a crs model object. You can test
  how close the two approaches are to one another by comparing
  model$phihat with fitted(model) via

  all.equal(as.numeric(fitted(model)),as.numeric(model$phihat))

Changes from Version 0.14-6 to 0.14-7 [09-Jun-2011]

* Checking for non-auto basis corrected, modify crsiv to use auto
  basis.

* When degree==0 segments is not used, so set segments==1 in this case
  (could be NA).

Changes from Version 0.14-3 to 0.14-6 [08-Jun-2011]

* Initial release of the crs package on CRAN.

* Added internal support for NOMAD via snomadr (Zhenghua's simple
  NOMAD interface). Ideally in the future Sebastien Le Digabel will be
  releasing an R package for NOMAD and we will be able to dump our
  internal code and rely on his R package. In the meantime this allows
  us to proceed with an R package.

* Numerous internal changes incorporated, most noteworthy additional
  flexibility in search provided by degree.min, degree.max,
  segments.min, and segments.max. Replaces basis.maxdim.

* Default now search via NOMAD, kernel=TRUE.

* crsiv implemented.

* Engel95 data added.

* Demos added.

Changes from Version 0.14-2 to 0.14-3 [01-May-2011]

* Zhenghua migrated the necessary files from the gsl so that the crs
  package is now standalone with the exception of NOMAD.

Changes from Version 0.14-0 to 0.14-2 [30-Apr-2011]

* Zhenghua migrated the bare-bones code required for the mgcv functions
  uniquecombs and tensor.prod.model.matrix, and I migrated the
  associated manpages, modified NAMESPACE and now the package does not
  require loading of mgcv which was sub-optimal.

* dropped cv.norm and replaced with cv.func=c("cv.ls","cv.gcv","cv.aic").

Changes from Version 0.13-8 to 0.14-0 [14-Apr-2011]

* tensor products now working properly (need gsl.bs intercept and no
  intercept in lm()) so dumped "additive-tensor" option and had to
  rework code to support additive (lm() has intercept, gsl.bs no
  intercept here) etc. In the process realized derivatives were all
  effed up and now for the first time they work (with segments being
  any value at all etc.).

Changes from Version 0.13-7 to 0.13-8 [30-Jan-2011]

* cv now default, increased basis.maxdim to 10

* segments and degree hit different maxima (basis.maxdim+1,
  basis.maxdim) but `degree equal to basis.maxdim' warning was only
  being issued when equal to basis.maxdim.

* restarts was not being passed to krscv

Changes from Version 0.13-6 to 0.13-7 [9-Dec-2010]

* added option to choose both degree and knots independently for each
  predictor and (more importantly) cross-validate both

Changes from Version 0.13-5 to 0.13-6 [8-Dec-2010]

* added option to use either uniform knots (equally spaced segments)
  or quantile knots (equal number of observations in each segment)

Changes from Version 0.13-4 to 0.13-5 [17-Apr-2010]

* changed package and function names to `crs' as Lijian strictly
  prefers `regression spline' to `smoothing spline' (The major
  difference is to place knots on sample points (smoothing spline,
  Wahba) or on equidistant deterministic points (B spline, Stone))

Changes from Version 0.13-3 to 0.13-4 [07-Apr-2010]

* fixed annoying "Working... Working" in plot (message produced by
  predict.*.spline sufficient here)

* added option for L1 CV (incomplete as properly this would require L1
  estimation as well)

* neglected to set cv and cv.pruned when degree is zero (fixed)

* adjusted R-squared corrected

Changes from Version 0.13-2 to 0.13-3 [28-Mar-2010]

* had to revamp derivative code to support pruning by taking out the
  reordering prior to derivative estimation - new approach is more
  natural with less issues. Examples all pass with flying colors

* had to modify the add1.lm function (modified version is add1.lm.cv)
  to flesh out stepCV

Changes from Version 0.13-1 to 0.13-2 [28-Mar-2010]

* modified stepAIC code from the MASS package to admit the
  cross-validation objective function, renamed to stepCV to not
  clobber users using stepAIC - this is a three line addition of the
  extractCV() function followed by wholesale replacement of AIC with
  CV - appears to work perfectly and now pruning returns models that
  indeed improve in terms of CV (was mixing objective functions
  pruning with stepAIC at the final stage (BIC) and hence testing for
  model that improves etc.)

Changes from Version 0.13-0 to 0.13-1 [25-Mar-2010]

* migrated pruning inside predict.factor.spline, derivatives not
  crashing and are working for one continuous regressor - one major
  benefit is that the object is now a proper cssreg object hence
  predict etc. are fully supported (the old function prune.cssreg
  could not do this)

Changes from Version 0.12-6 to 0.13-0 [22-Mar-2010]

* added prune.cssreg that allows for a final pruning stage a la
  Friedman's MARS, or alternatively a BIC model selection criterion to
  complement cross-validation - I prefer first running
  cross-validation as it operates at the _variable_ level while
  stepAIC operates at the individual basis level

* added passing back of hatvalues from predict.factor.spline and
  predict.kernel.spline to facilitate default plot (added Cook's
  Distance)

* fixed corner case via data.frame(as.matrix(P))

* added passing of se back in fitted.values[,4] so now confidence
  intervals for differences in levels are implemented (though no cov()
  term). Also, went through code and cleaned up all lingering
  issues. A true milestone hence the new cssver

Changes from Version 0.12-5 to 0.12-6 [22-Mar-2010]

* lwr/upr error bounds (95% cis) now being returned and used in plot
  when ci=TRUE - lingering issue with differences in levels

Changes from Version 0.12-4 to 0.12-5 [21-Mar-2010]

* no longer using ncoeffs as a passable parameter, rather nbreak (>=2)

* all appears to be working smoothly. Now passing back model/model
  list for cssreg. Next standard errors from predict and for
  derivatives.

Changes from Version 0.12-3 to 0.12-4 [20-Mar-2010]

* kernel derivatives implemented and appear to be working
  properly. drop=FALSE populated so that as.matrix() no longer needed
  and handles corner cases of nrow=1 in matrices etc. This is the
  first real fully functioning version with multivariate derivatives
  etc. appearing to work. Passes R CMD check and numerous toy
  examples. One big improvement is adding factor.to.numeric to
  splitFrame() to admit both numeric and character string factors.

Changes from Version 0.12-2 to 0.12-3 [20-Mar-2010]

* streamlining code, removing now redundant functions (prod.spline can
  be handled by prod.kernel.spline so removed former and renamed the
  latter to prod.spline throughout)

Changes from Version 0.12-1 to 0.12-2 [16-Mar-2010]

* fitted and predict are faster than the matrix multiplication I am
  using (not to mention simpler) - moving to these for simplicity and
  to facilitate standard errors

Changes from Version 0.12-0 to 0.12-1 [16-Mar-2010]

* multivariate gradients working with tensor enabled/disabled - now
  cleaning up to match np in terms of functionality

Changes from Version 0.11-9 to 0.12-0 [13-Mar-2010]

* gradients successfully implemented - remains to get factor/ordered
  in plot and allowing for plot to handle factor in formula (not a
  high priority)

Changes from Version 0.11-8 to 0.11-9 [13-Mar-2010]

* adding S3 plot class

* support for mean and (continuous) derivatives with drawback that
  data must be cast as a factor to work

Changes from Version 0.11-6 to 0.11-8 [13-Mar-2010]

* multivariate bugs squashed for factor estimator... now to test for
  kernel... if working, we move on to a plot method for the fit and
  derivatives

Changes from Version 0.11-5 to 0.11-6 [11-Mar-2010]

* multivariate derivatives implemented and appear to be working, at
  least when tensor is disabled so I can verify

* next to add to predict in order to get evaluation (attribute? could
  add gradients function to do this? a bit odd but not sure what else
  would be easier)

Changes from Version 0.11-4 to 0.11-5 [11-Mar-2010]

* about to begin adding derivatives

Changes from Version 0.10-8 to 0.11-4 [11-Mar-2010]

* total reworking of package for S3 methods - now one function cssreg
  that does it all, supports predict properly etc. Big effort but now
  much happier with code (streamlined and simpler to maintain)

* gsl spline support for derivatives, have dumped spline package as it
  is missing its S-Plus counterpart's derivative capabilities

Changes from Version 0.10-8 to 0.10-9 [4-Mar-2010]

* cleaned up and lingering bugs gone related to use of predict.bs (now
  compares exactly with pre package code)

Changes from Version 0.10-7 to 0.10-8 [4-Mar-2010]

* added factor smoothing splines using indicator basis functions

* this (fssreg) supplants ssreg, so will have a change from x=matrix
  to x=data frame shortly

* corrected glitch in B-splines and reverting to using predict.bs as
  previously

* removing poly() splines and switch

Changes from Version 0.10-6 to 0.10-7 [2-Mar-2010]

* removed straight search pending MIQP solver in R 

* added better i/o to help gauge time to completion

* fixed bug in dimension warning

* added more trapping of issues for small cells having less data than
  the spline degree etc. prior to beginning search

Changes from Version 0.10-5 to 0.10-6 [1-Mar-2010]

* multivariate x now implemented and working in ssregcv and cssregcv
  for exhaustive search - issues remain with straight search
  (parscale, ndeps etc.)

Changes from Version 0.10-4 to 0.10-5 [27-Feb-2010]

* new functions predict.spline, model.spline, and cv.spline
  automatically handle K=0 and z/no z cases - code much more modular
  hence handling multivariate x will in principle be simplified

Changes from Version 0.10-3 to 0.10-4 [27-Feb-2010]

* implementing tensor product splines in function to facilitate
  multivariate x and make code base easier to handle - handle base case
  of zero in this function so use intercept=TRUE

* revisiting search with discrete K

Changes from Version 0.10-2 to 0.10-3 [26-Feb-2010]

* added S3 predict method for ssreg and cssreg

* added ssreg and ssregcv for continuous-only x case to facilitate
  comparison of improvements

* added wage1 and cps71 data and examples

Changes from Version 0.00-0 to 0.10-2 [24-Feb-2010]

* S3 methods for summary, print

* created functions cssreg and cssregcv

* initial version of the css package
