
Version 3.1.0
2023-05-10

   Fixed the issue with the memory conserving evaluation for gridded 
   interpolants.

   Reduced the partition size and the number of evaluation points for the
   N-D test to make it complete more rapidly. Now it takes about an hour
   rather than 3 or more hours.
   
Version 3.0.1
2023-05-10

   Found a problem with the memory conserving evaluation for gridded 
   interpolants. Switched to using the full grid until I resolve the issue.

Version 3.0.1
2023-05-10

   Fixed test scripts.

Version 3.0.0
2023-04-10

   Made various documentation fixes across the headers of the functions, mostly
   fixing typos.

   bsspdfest()
   bsseval()

     Converted the interfaces from positional arguments to varargin.

   bsseval()
   bsseval1d()
   bsseval2d()
   bsseval3d()
   bssevalnd()

     Improved the use of gridded interpolants for evaluation of the probability
     functions.

     Implemented bssgridevalc(), an on-the-fly evaluation for a gridded
     interpolant using a compact grid. This significantly reduces the memory
     footprint when compared with generating the entire grid of points first
     and then evaluating with a small penalty in overall execution speed.

     Removed 'bss' as a valid evaluation function since generic B-spline series
     function representations are not supported, only probabilty density
     functions and various derived functions.

     For bsseval(), the B-spline series struct is no longer duplicated when
     creating gridded interpolants.

   bsscreatestruct()

     Added permanent fields for the pdf and cdf gridded interpolants. They are
     empty until a gridded interpolant is created.

   bssdeleteinterpolant()

     Modified to retain the pdf and cdf gridded interpolant fields, making them
     empty rather than removing them from the struct, when deleted.

   bsspointsperpartition()

     Made the default multipliers smaller to reduce the sizes of the gridded
     interpolants that were created while keeping the pdf errors at
     approximately the same levels.

   test_bsspdfest
   test_bsspdfest_nostats

     Modified for the interface changes from positional arguments to varargin.

Version 2.5.0
2022-12-28

   bssbndsok()
   bssorderok()
   bsspartitionsizeok()

     Removed the output flag. It was not necessary since the function
     signals errors. If it returns without an error all is OK.

   bsscreatestruct()

     Removed unnecessary tests for the validity of the B-spline series
     bounds, order, and partition.

     Removed the output from the calls to bssbndsok(), bssorderok(), and
     bsspartitionsizeok(). It no longer returns an output; it only signals
     errors. If it returns everything is OK.

     Fixed a cut and paste error in the B-spline order test: the test for
     was changed from isempty(n) to isempty(m). This code will likely be deleted
     at some point as these functions are not intended to be called directly.

   bsspdfest()

     Fixed cut and past error when assigning a reasonable initial value for
     the B-spline order when the number of input values was 4 and the value
     of M was empty.

   bsspdfest1d()
   bsspdfest2d()
   bsspdfest3d()
   bsspdfestnd()

     Fixed cut and past error when assigning a reasonable initial value for
     the B-spline order when the number of input values was 4 and the value
     of M was empty.

     Fixed a bug where an input B-spline series to be updateed would be
     overwritten by a new B-spline series.

     Commented out redundant initial value assignmments and input testing
     as this is done by bsspdfest().

   test_bsspdfest

     Added tests for 3-D and N-D data, with N=4, and comparisons with
     mvksdensity for dimensions greater than two.

   test_bsspdfest_nostats

     Added tests for 3-D and N-D data.

   Documentation
      No documentation changes were made other than updating the version number.

Version 2.4.0
2022-12-05

   bsspdfcheckinputs()

      Removed the output B-spline series argument as unnecessary since the
      function is only supposed to validate its inputs.

      Also removed all code supporting the creation of values for the
      B-spline series output.

      Modified the header to indicate the new behavior of the function.

   bsspdfest()

      Assigned appropriate values to missing inputs that made more sense
      than assigning an empty value.

      Removed temporary values that were used only once in if statements,
      replacing them with function calls directly used in the if statements.

      Removed dependencies on a B-spline series output from
      bsscheckinputs().

   bsscreatestruct()

      Made some white space changes to improve readability.

   bsspdfest1d()
   bsspdfest2d()
   bsspdfest3d()
   bsspdfestnd()

      Assigned appropriate values to missing inputs that made more sense
      than assigning an empty value.

      Removed temporary values that were used only once in if statements,
      replacing them with function calls directly used in the if statements.

      Removed dependencies on a B-spline series output from
      bsscheckinputs().

      Added a call to bsscreatestruct() after successful input validation.

   bsspartitionsize()

      Changed the input from number of points and dimension to the data
      matrix. This simplified a variety of things, including removing a
      variety of input validation tests.

    test_bsspdfest.m

      Made some white space changes to improve readability.

   Documentation
      No documentation changes were made other than updating the version number
      and copyright dates.

Version 2.3.1
2018-09-19

Fixed a typo that was not caught in other testing for some reason. Should
have done one more test after packaging.

Version 2.3.0
2018-09-19

   Changed the method for dealing with boundary corrections from using the
   histogram value to reflection through any active boundaries. In addition,
   for 2- and 3-dimensional data the reflections are also performed for corners
   and edges where multiple active boundaries intersect.

   Added boundary corrections for N-dimensional data via reflection through the
   active boundaries. No additional corrections are made for multiple
   intersecting active boundaries; there are simply too many of them.

   Fixed an off by 1 error in bsspdfestnd(). The error produced linear index
   values that were out of bounds when performing computations with an active
   boundary. When there was no active boundary this error would have caused a
   shift in the computed PDF by one partition interval for each dimension since
   the  number of partition points was used not the number of partition
   intervals.

   Fixed a bug in the extrapolation of the values for the 3-dimensional CDF
   in do_cdf. There was an incorrect test that caused the extrapolated values to
   be zero in one of several extrapolation cases.

   Changed calls to repmat() to calls to bsxfun() to improve performance and
   reduce memory requirements for intermediate results.

   Changed the way the coefficient matrix was updated from a point by point
   summation to a chunked summation based on a sorted list of the unique
   indices into the coefficient matrix. This provided a significant speed
   improvement for 2- and 3-dimensional estimation functions.

   Rearranged the computations for the 2- and 3-dimensional estimation
   functions to improve performance.

   Moved the bssdeleteinterpolant() function out of the private folder so that
   it could be used.

   Cleaned up the comments for several functions and fixed typos in several
   error messages.

   Fixed a bug in bsscreatestruct() where an unassigned variable was passed to
   bsscheckmemory(). The variable name used was 'ngrid' which is now a MATLAB
   function.

   Changed the variable name 'ngrid' in bsscreateinterpolant to 'tmpngrid' to
   avoid any potential problems with the MATLAB function ngrid.

   Added tests to see if the storage requirements were less than
   intmax('uint32') bytes. If so, everything is assumed to be OK and
   bsscheckmemory() just returns. Otherwise check the memory. The call to
   memory() was taking a huge amount of time.

   Added a new private function bssuniqueidx() to compute the unique index
   values, break points, and an order vector.

   Updated the User's Guide for the new boundary correction method, fixed typos,
   misspellings, etc. Several new examples were also added.

Version 2.2.1
2018-02-11

   Fixed a bug in an error message in bsspdfcheckinputs()  where the wrong
   variable was used to specify a value for the error message.

   No other updates.

Version 2.2.0
2016-11-10

   Updated the Users Guide to add an examples section demonstrating the
   estimation for bounded domains. Removed the N-dimensional examples; they
   are essentially identical to the 3-d example.

   Added a check for active bounds on the estimation interval.  This is
   detected by checking to see if any of the B-spline series coefficients that
   overlap a boundary are greater than zero. If so, a histogram estimate
   is generated for the bin(s) adjacent to the boundary and used to specify
   the PDF value at the boundary. The B-spline series coefficients are
   then modified to produce this value at the boundary.

   Data points that are not in the estimation interval are now ignored.
   Previously they were evaluated, but always returned zero values, that
   would stack up on the boundaries. This caused several unnecessary
   complications when computing boundary values, leading to the change in
   behavior.

   Changed values of the multipliers in the bsspartitionsize() function that
   computes the default partition sizes to improve the visual smoothness of
   continuous distributions slightly. There are still too many partition
   intervals, but erring on the side of undersmoothing is the right way to go.

   If the number of inbounds points was zero an error occurred, but the
   output values should all have had a value of zero. This was fixed. If
   all points are out of bounds zero values are returned.

Version 2.1.1
2016-09-01

   Fixed a bug when checking the B-spline order. The bsspartitionsizeok()
   function was called with the partition size by mistake. It should have been
   the bssorderok() function with the B-spline order.

   Fixed a bug that occurred when a single 1-dimensional evaluation point was
   given to bsseval and the B-spline series order was greater than one. This
   caused a row vector of index values to be used to index a column vector
   producing a column vector, not a row vector, due to the 1-dimensional
   indexing semantics of MATLAB.

   Consolidated the input checking for all of the bsspdfest functions.

   Removed the 3-d mixture distribution movie files to reduce the overall
   package size. The movies may be found at
   http://www.biometricsnw.com/projects/bssest/bssest.htm

Version 2.1.0
2016-07-02

   Updated the User's Guide to reflect changes in the testing and example scripts
   and their versions that do not use the MATLAB Statitics and Machine Learning
   Toolbox.

   Added a new test script test_bsspdfest_nostats. This script
   is identical to the test script test_bsspdfest except for not
   reqruiring the MATLAB Statistics and Machine Learning Toolbox.

   Added two support functions normpdftestbss and mvnpdftestbss for the
   _nostats version the test script. The functions are simple implementations
   the evaluate the normal PDF and multivariate normal PDF for testing the
   bsspdfest toolbox.

   Deleted references to the example script mk_example_figs_nostats.m from the
   User's Guide. This file is no longer provided with the bsspdfest Toolbox.

 Version 2.0.0
 2016-06-25

   Algorithmic improvements were made to enhance the performance of the bsspdfest
   software.

   Replaced outer products with vectors of ones used to replicate data
   with calls to REPMAT. Since REPMAT is now a built-in function it is
   significantly faster than using the outer product to do replication.

   Removed unnecessary reshaping for B-splines of order 1.

   Changed the matrix orientation from m by n to n by m, where m is the
   B-spline order and n is the total number of evaluation points
   specified by the input X.

   Removed unnecessary temporary variables.

   Explicitly created indexes and B-spline evaluation matrices for each
   dimension in the 2-D and 3-D specific functions.

   Added the ability to compute probability based functions in addition to the
   PDF: the CDF and survivor functions in all dimensions as well as the inverse
   CDF and cumulative hazard function in one dimension.

   The ability to generate a gridded interpolant for linear interpolation and
   extrapolation of the PDF and CDF has also been added. When the underlying
   probability functions are to be estimated once and evaluated many times the
   gridded interpolant can be significantly faster than the B-spline evaluation
   procedures for B-spline orders greater than 1.

   For the 1-D estimation, sorted the partition indexes derived from the input
   data, computing a permutation vector to the data and partition index break
   point indices to speed up the computations. This replaced using a logical
   index of values that wwas computed for each partition to identify the data
   points contained within each partition interval.

 Version 1.1.0
 2015-01-23

   Fixed an issue with the license file. No other changes.

 Version 1.0.0
 2015-01-20

   The initial releast of bsspdfest.
