Sept 12, 2017: version 3.2.0

    * replaced UFget with ssget
    * added comment to cs_lu.c

May 4, 2016: version 3.1.9

    * minor changes to Makefile

Apr 1, 2016: version 3.1.8

    * licensing simplified (no other change); refer to CSparse/Doc/License.txt

Feb 17, 2016: version 3.1.8beta (not released publically)

    * minor update to cs_sprealloc, for handling sparse empty matrices.

Feb 1, 2016: version 3.1.7

    * update to Makefiles

Jan 30, 2016: version 3.1.6

    * correction to Makefiles
    * correction to mexFunctions required for MATLAB R2015b,
	for sparse empty matrices and NULL mxGetPr

Jan 1, 2016: version 3.1.5

    * Makefile now creates both static (*.a) and shared (*.so / *.dylib)
        libraries. No change to C code except version number in cs.h.

Oct 10, 2014: version 3.1.4

    modified cs_make.m.  No change to C code except version number.

Mar 26, 2014: version 3.1.3

    * minor update to UFget

Apr 16, 2013: verison 3.1.2

    * removed a useless line from cs_sqr.c (no integer overflow can
        occur in S->lnz, S->unz at that point)

Jun 20, 2012: verison 3.1.1

    * minor update for Windows (removed filesep)

Jun 1, 2012: version 3.1.0

    * minor changes to enable the creation of CXSparse 3.1.0

Dec 7, 2011: version 3.0.2

    * fixed the Makefile to better align with CFLAGS and other standards
    * minor fix to MATLAB cs_install.m

Jan 18, 2010: version 3.0.0

    * changed "int" to "csi", which is normally "ptrdiff_t".  This way,
        CSparse can be used on a 64-bit platform (and in 64-bit MATLAB
        in particular), without the need to use CXSparse.  If you wish
        to use "int", simply edit CSparse/Include/cs.h and change the
        definition of csi, or compile with -Dcsi=int.

Jan 25, 2011: version 2.2.5

    * minor fix to "make install"
    * minor change to cs_util.c, typecast return (cs_free (...))
    * minor fixes to UFget: help file, UFsettings.txt

Nov 30, 2009: version 2.2.4

    * added "make install" and "make uninstall"
    * minor change to cs_make.m

Jan 20, 2009, v2.2.3

    * all tabs expanded to 8 spaces (except for Makefiles)
    * example corrected in cs_gaxpy.m
    * minor change to cs_sparse to allow for i,j,x to be either
        row or column vectors (or any mixture)

Sept 8, 2008, v2.2.2

    * minor change to cs_make.m, to change "/" to filesep ("/" on Unix, "\"
        on Windows), to handle limitations in some Windows compilers

Nov 1, 2007, v2.2.1

    * very minor change to Include/cs.h:  Changed name of 2nd argument of
        cs_permute, to match the code.  This has no affect on the code itself,
        since the type ("int *") is unchanged.  It's just a documentation issue.

    * minor lint cleanup in mexFunctions

Mar 31, 2007, v2.2.0

    * few changes to primary Source/ files.  Changes mostly affect MATLAB
        interface.

    * Source/cs_house.c: correction to comment

    * Souce/cs_updown.c: whitespace changed to reflect change in CXSparse,
        no impact at all on CSparse itself.

    * Doc/, Lib/ and Include/ directories created.

    * Source/cs.h moved to Include/cs.h, version number changed to 2.2.0.

    * modification to Makefiles, cs_make.m

    * correction to help comments in cs_dmperm.m, cs_qr.m, cs_scc2.m, cs_scc.m

    * if complex matrix passed to CSparse in MATLAB, error message 
        suggests using CXSparse instead

    * minor performance fix to cs_sparse_mex.c

    * cs_randperm added to MATLAB/Makefile; already appeared in cs_make.m

    * minor improvements to MATLAB/ demos.

Mar 1, 2007, v2.1.0

    * Source/cs_add.c:  added test for matrix dimensions

    * Source/cs_multiply.c:  added test for matrix dimensions

    * correction to MATLAB demo3 (no error in C code version of the demo)

    * minor corrections to MATLAB m-file help comments.

Dec 12, 2006, v2.0.7

    * minor MATLAB cleanup

Dec 6, 2006, v2.0.6

    * Update to UFget.  Now relies on the MATLAB urlwrite function instead of
        my own Java code.

Nov 2006, v2.0.5

    * Added UFgrep to UFget toolbox.

    * No changes to C Source code, except for version number and date.

    * Added two test matrices: ibm32a and ibm32b.  ibm32a is the Harwell/
        Boeing matrix ibm32, but with the last column removed.  ibm32b
        is the transpose of ibm32a.  With optimization enabled (-O),
        2 lines in cs_maxtrans.c are not tested; these matrices correct
        that problem.

    * Fixed UFget.  Earlier version could not download matrices larger than
        32MB.

    * Modified UFget/UFweb, to reflect changes in the UF Sparse Matrix
        Collection.

    * Added ccspy.m and cs_scc2.m MATLAB functions

    * Added examples to help info in each *.m MATLAB file

    * modified cs_dmspy to speed up the plotting of large matrices with many    
        singletons

    * minor change to cspy: now draws a box around the matrix.

    * minor changes to MATLAB demos and tests.

Oct 13, 2006, v2.0.4

    * minor modification to cs_updown.c.  "n" was incorrectly declared "double".
        It should be "int".  This was safe, just a little confusing (n was only
        used in an argument to cs_malloc, and is thus typecast).

Sept 28, 2006, v2.0.3

    * minor modifications to MATLAB interface, to allow CSparse to be used
        in MATLAB 6.5.

    * added examples to m-files, other minor m-file cleanup.

    * bug fix to cspy, to handle NaN's properly.

Aug 23, 2006: v2.0.2

    * change to cs_updown mexFunction, to handle multiple rank updates

    * symbolic links removed from Tcov/ directory in the distribution.
        They are now created by Tcov/Makefile as needed.  This makes the
        zip files cleaner.  Tcov/*test.c test files renamed.

July 19, 2006:

    * minor fix to cs_must_compile.m and cs_make.m, to allow CSparse to be
        compiled in MATLAB 6.5 with cs_make.

    * minor fix to cspy for complex matrices (imaginary part was ignored).

    * no change to version number or date, since there are no changes that
        affect the appearance of CSparse in the book ("Direct Methods for
        Sparse Linear Systems", SIAM, 2006).

June 24, 2006:

    * minor typos in comments corrected.  No change in code itself,
        and no change in version number or date.

May 27, 2006, v2.0.1: (this version is printed in the book)

    * minor bug fix.  cs_util.c modified, so that cs_sprealloc (T,0) works
        properly for a triplet matrix T (setting T->nzmax equal to T->nz).
        The line in v2.0.0:

            nzmax = (nzmax <= 0) ? (A->p [A->n]) : nzmax ;

        changes to the following in v2.0.1:

            if (nzmax <= 0) nzmax = (CS_CSC (A)) ? (A->p [A->n]) : A->nz ;

    * minor typographical changes arising from the editting of the book.

Apr 12, 2006, v2.0.0:

    * random permutation option added to cs_maxtrans and cs_dmperm, to help
        avoid rare cases where the O(|A|n) time complexity is reached in
        practice (GHS_indef/boyd2 in the UF sparse matrix collection, for
        example).  New cs_randperm function added.

Apr 10, 2006:

    * stylistic changes for the book (except for the bug fix):

    * "int order" parameter of cs_amd, cs_lusol, cs_cholsol, cs_qrsol, cs_sqr,
        cs_schol changed.  Now 0 means no ordering, 1 is A+A', 2 is S*S', and
        3 is A*A'.  In v1.2 and earlier, "order" took on a value ranging from
        -1 to 2.  "int n" parameter rearranged for cs_ipvec, cs_pvec, cs_post
        (int n moved to the end).  cs_triplet renamed cs_compress.

        To ensure that these changes are propagated into user code that calls
        CSparse, the "order" parameter has been placed as the first parameter
        in all these routines.  Your compiler will complain (gcc will halt) if
        you upgrade from v1.2 to v2.0 without changing your code.  This is much
        better than a silent error in which you get the wrong ordering by
        mistake (with a huge penalty in run-time performance and no compiler
        warnings).

        New syntax (v2.0 and later):
        ----------------------------

            order = 0: natural ordering
            order = 1: amd (A+A')
            order = 2: amd (S'*S), where S=A except dense rows dropped
            order = 3: amd (A'*A)

            int cs_cholsol (int order, const cs *A, double *b) ;
            int cs_lusol (int order, const cs *A, double *b, double tol) ;
            int cs_qrsol (int order, const cs *A, double *b) ;
            int *cs_amd (int order, const cs *A) ;
            css *cs_schol (int order, const cs *A) ;
            css *cs_sqr (int order, const cs *A, int qr) ;

            int *cs_post (const int *parent, int n) ;
            int cs_ipvec (const int *p, const double *b, double *x, int n) ;
            int cs_pvec (const int *p, const double *b, double *x, int n) ;

            cs *cs_compress (const cs *T) ;

        Old syntax (v1.2 and earlier):
        ------------------------------

            order = -1: natural ordering
            order = 0: amd (A+A')
            order = 1: amd (S'*S), where S=A except dense rows dropped
            order = 2: amd (A'*A)

            int cs_cholsol (const cs *A, double *b, int order) ;
            int cs_lusol (const cs *A, double *b, int order, double tol) ;
            int cs_qrsol (const cs *A, double *b, int order) ;
            int *cs_amd (const cs *A, int order) ;
            css *cs_schol (const cs *A, int order) ;
            css *cs_sqr (const cs *A, int order, int qr) ;

            int *cs_post (int n, const int *parent) ;
            int cs_ipvec (int n, const int *p, const double *b, double *x) ;
            int cs_pvec (int n, const int *p, const double *b, double *x) ;

            cs *cs_triplet (const cs *T) ;

    * CS_OVERFLOW macro removed (removed from cs_malloc.c; not needed).

    * S->leftmost added to css (it was tacked onto S->pinv before).

    * P,Q,R,S components of csd struct changed to p,q,r,s.

    * Pinv and Q components of css struct changed to pinv and q.

    * CS_CSC and CS_TRIPLET macros added, to clarify which CSparse functions
        accept cs matrices in compressed column form, triplet form, or both.

    * check for negative row/column indices added to cs_entry.

    * cs_ereach and cs_leaf functions added.

    * call to cs_sprealloc added to cs_fkeep.

    * bug fixes in cs_counts and cs_amd (memory leak under rare out-of-memory
        conditions).

Mar 15, 2006:

    * cs_scc modified so that the row and columns of each component are put in
        their natural order.  cs_dmperm modified so that columns of each block
        (instead of rows) are placed in their natural order.

    * cs_splsolve renamed cs_spsolve, generalized to handle both Lx=b and
        Ux=b, and non-unit diagonal, and placed in its own file (cs_spsolve.c;
        it was a static function in cs_lu.c).  cs_lsolve_mex.c and
        cs_splsolve_mex.c merged (the latter was removed).  cs_spsolve.c file
        added

    * cs_dmspy changed, so that block borders line up better with the matrix.

Mar 6, 2006:

    * Makefile modified so that the Tcov tests (which may not be portable)
        are not compiled and run by the default "make" in the CSparse directory.
        To compile everything, including the Tcov tests, use "make all".
        Trivial change to cs.h.

Feb 27, 2006:

    * cs_reach, cs_dfs, cs_splsolve, cs_lu, and cs_scc changed to remove O(n)
        initialized workspace.
    * cs_reach and cs_splsolve now user-callable (were static in cs_lu.c).

Feb 20, 2006:

    * various changes to simplify the construction of CXSparse

Feb 7, 2006:

    * changed prototypes, adding "const" where appropriate.

