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.