HEX
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/8.4.25
System: Windows NT DESKTOP-4TAV2RJ 10.0 build 19045 (Windows 10) AMD64
User: fred (0)
PHP: 8.4.25
Disabled: NONE
Upload Files
File: C:/Program Files/R/R-4.4.0/library/Matrix/scripts/CXSparse.patch
diff -ruN src/SuiteSparse/CXSparse/Makefile src/SuiteSparse-patched/CXSparse/Makefile
--- src/SuiteSparse/CXSparse/Makefile	1969-12-31 19:00:00
+++ src/SuiteSparse-patched/CXSparse/Makefile	2024-01-12 11:54:13
@@ -0,0 +1,71 @@
+sources = \
+	Source/cs_add.c       Source/cs_dl_add.c       Source/cs_ci_add.c       Source/cs_cl_add.c \
+	Source/cs_amd.c       Source/cs_dl_amd.c       Source/cs_ci_amd.c       Source/cs_cl_amd.c \
+	Source/cs_chol.c      Source/cs_dl_chol.c      Source/cs_ci_chol.c      Source/cs_cl_chol.c \
+	Source/cs_cholsol.c   Source/cs_dl_cholsol.c   Source/cs_ci_cholsol.c   Source/cs_cl_cholsol.c \
+	Source/cs_compress.c  Source/cs_dl_compress.c  Source/cs_ci_compress.c  Source/cs_cl_compress.c \
+	Source/cs_convert.c \
+	Source/cs_counts.c    Source/cs_dl_counts.c    Source/cs_ci_counts.c    Source/cs_cl_counts.c \
+	Source/cs_cumsum.c    Source/cs_dl_cumsum.c    Source/cs_ci_cumsum.c    Source/cs_cl_cumsum.c \
+	Source/cs_dfs.c       Source/cs_dl_dfs.c       Source/cs_ci_dfs.c       Source/cs_cl_dfs.c \
+	Source/cs_dmperm.c    Source/cs_dl_dmperm.c    Source/cs_ci_dmperm.c    Source/cs_cl_dmperm.c \
+	Source/cs_droptol.c   Source/cs_dl_droptol.c   Source/cs_ci_droptol.c   Source/cs_cl_droptol.c \
+	Source/cs_dropzeros.c Source/cs_dl_dropzeros.c Source/cs_ci_dropzeros.c Source/cs_cl_dropzeros.c \
+	Source/cs_dupl.c      Source/cs_dl_dupl.c      Source/cs_ci_dupl.c      Source/cs_cl_dupl.c \
+	Source/cs_entry.c     Source/cs_dl_entry.c     Source/cs_ci_entry.c     Source/cs_cl_entry.c \
+	Source/cs_ereach.c    Source/cs_dl_ereach.c    Source/cs_ci_ereach.c    Source/cs_cl_ereach.c \
+	Source/cs_etree.c     Source/cs_dl_etree.c     Source/cs_ci_etree.c     Source/cs_cl_etree.c \
+	Source/cs_fkeep.c     Source/cs_dl_fkeep.c     Source/cs_ci_fkeep.c     Source/cs_cl_fkeep.c \
+	Source/cs_gaxpy.c     Source/cs_dl_gaxpy.c     Source/cs_ci_gaxpy.c     Source/cs_cl_gaxpy.c \
+	Source/cs_happly.c    Source/cs_dl_happly.c    Source/cs_ci_happly.c    Source/cs_cl_happly.c \
+	Source/cs_house.c     Source/cs_dl_house.c     Source/cs_ci_house.c     Source/cs_cl_house.c \
+	Source/cs_ipvec.c     Source/cs_dl_ipvec.c     Source/cs_ci_ipvec.c     Source/cs_cl_ipvec.c \
+	Source/cs_leaf.c      Source/cs_dl_leaf.c      Source/cs_ci_leaf.c      Source/cs_cl_leaf.c \
+	Source/cs_load.c      Source/cs_dl_load.c      Source/cs_ci_load.c      Source/cs_cl_load.c \
+	Source/cs_lsolve.c    Source/cs_dl_lsolve.c    Source/cs_ci_lsolve.c    Source/cs_cl_lsolve.c \
+	Source/cs_ltsolve.c   Source/cs_dl_ltsolve.c   Source/cs_ci_ltsolve.c   Source/cs_cl_ltsolve.c \
+	Source/cs_lu.c        Source/cs_dl_lu.c        Source/cs_ci_lu.c        Source/cs_cl_lu.c \
+	Source/cs_lusol.c     Source/cs_dl_lusol.c     Source/cs_ci_lusol.c     Source/cs_cl_lusol.c \
+	Source/cs_malloc.c    Source/cs_dl_malloc.c    Source/cs_ci_malloc.c    Source/cs_cl_malloc.c \
+	Source/cs_maxtrans.c  Source/cs_dl_maxtrans.c  Source/cs_ci_maxtrans.c  Source/cs_cl_maxtrans.c \
+	Source/cs_multiply.c  Source/cs_dl_multiply.c  Source/cs_ci_multiply.c  Source/cs_cl_multiply.c \
+	Source/cs_norm.c      Source/cs_dl_norm.c      Source/cs_ci_norm.c      Source/cs_cl_norm.c \
+	Source/cs_permute.c   Source/cs_dl_permute.c   Source/cs_ci_permute.c   Source/cs_cl_permute.c \
+	Source/cs_pinv.c      Source/cs_dl_pinv.c      Source/cs_ci_pinv.c      Source/cs_cl_pinv.c \
+	Source/cs_post.c      Source/cs_dl_post.c      Source/cs_ci_post.c      Source/cs_cl_post.c \
+	Source/cs_print.c     Source/cs_dl_print.c     Source/cs_ci_print.c     Source/cs_cl_print.c \
+	Source/cs_pvec.c      Source/cs_dl_pvec.c      Source/cs_ci_pvec.c      Source/cs_cl_pvec.c \
+	Source/cs_qr.c        Source/cs_dl_qr.c        Source/cs_ci_qr.c        Source/cs_cl_qr.c \
+	Source/cs_qrsol.c     Source/cs_dl_qrsol.c     Source/cs_ci_qrsol.c     Source/cs_cl_qrsol.c \
+	Source/cs_randperm.c  Source/cs_dl_randperm.c  Source/cs_ci_randperm.c  Source/cs_cl_randperm.c \
+	Source/cs_reach.c     Source/cs_dl_reach.c     Source/cs_ci_reach.c     Source/cs_cl_reach.c \
+	Source/cs_scatter.c   Source/cs_dl_scatter.c   Source/cs_ci_scatter.c   Source/cs_cl_scatter.c \
+	Source/cs_scc.c       Source/cs_dl_scc.c       Source/cs_ci_scc.c       Source/cs_cl_scc.c \
+	Source/cs_schol.c     Source/cs_dl_schol.c     Source/cs_ci_schol.c     Source/cs_cl_schol.c \
+	Source/cs_spsolve.c   Source/cs_dl_spsolve.c   Source/cs_ci_spsolve.c   Source/cs_cl_spsolve.c \
+	Source/cs_sqr.c       Source/cs_dl_sqr.c       Source/cs_ci_sqr.c       Source/cs_cl_sqr.c \
+	Source/cs_symperm.c   Source/cs_dl_symperm.c   Source/cs_ci_symperm.c   Source/cs_cl_symperm.c \
+	Source/cs_tdfs.c      Source/cs_dl_tdfs.c      Source/cs_ci_tdfs.c      Source/cs_cl_tdfs.c \
+	Source/cs_transpose.c Source/cs_dl_transpose.c Source/cs_ci_transpose.c Source/cs_cl_transpose.c \
+	Source/cs_updown.c    Source/cs_dl_updown.c    Source/cs_ci_updown.c    Source/cs_cl_updown.c \
+	Source/cs_usolve.c    Source/cs_dl_usolve.c    Source/cs_ci_usolve.c    Source/cs_cl_usolve.c \
+	Source/cs_util.c      Source/cs_dl_util.c      Source/cs_ci_util.c      Source/cs_cl_util.c \
+	Source/cs_utsolve.c   Source/cs_dl_utsolve.c   Source/cs_ci_utsolve.c   Source/cs_cl_utsolve.c \
+	Source/cxsparse_version.c
+objects = $(sources:.c=.o)
+archive = CXSparse.a
+
+PKG_CPPFLAGS = -I./Include -I../SuiteSparse_config
+
+all : $(archive)
+
+$(archive) : $(objects)
+	rm -f $@
+	$(AR) -cr $@ $(objects)
+	$(RANLIB) $@
+
+.c.o :
+	$(CC) $(PKG_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) -c $< -o $*.o
+
+clean :
+	@rm -f $(objects) $(archive)
diff -ruN src/SuiteSparse/CXSparse/Source/cs_multiply.c src/SuiteSparse-patched/CXSparse/Source/cs_multiply.c
--- src/SuiteSparse/CXSparse/Source/cs_multiply.c	2024-01-10 19:08:51
+++ src/SuiteSparse-patched/CXSparse/Source/cs_multiply.c	2024-01-12 11:54:13
@@ -20,7 +20,8 @@
     Cp = C->p ;
     for (j = 0 ; j < n ; j++)
     {
-        if (nz + m > C->nzmax && !cs_sprealloc (C, 2*(C->nzmax)+m))
+        if (C->nzmax > (CS_INT_MAX - m) / 2 || /* 2*(C->nzmax)+m overflows */
+            (nz + m > C->nzmax && !cs_sprealloc (C, 2*(C->nzmax)+m)))
         {
             return (cs_done (C, w, x, 0)) ;             /* out of memory */
         } 
diff -ruN src/SuiteSparse/CXSparse/Source/cs_print.c src/SuiteSparse-patched/CXSparse/Source/cs_print.c
--- src/SuiteSparse/CXSparse/Source/cs_print.c	2024-01-10 19:08:51
+++ src/SuiteSparse-patched/CXSparse/Source/cs_print.c	2024-01-12 11:54:13
@@ -2,52 +2,54 @@
 // CXSparse, Copyright (c) 2006-2022, Timothy A. Davis. All Rights Reserved.
 // SPDX-License-Identifier: LGPL-2.1+
 #include "cs.h"
+#include <R_ext/Print.h>
+
 /* print a sparse matrix; use %g for integers to avoid differences with CS_INT */
 CS_INT cs_print (const cs *A, CS_INT brief)
 {
     CS_INT p, j, m, n, nzmax, nz, *Ap, *Ai ;
     CS_ENTRY *Ax ;
-    if (!A) { printf ("(null)\n") ; return (0) ; }
+    if (!A) { Rprintf ("(null)\n") ; return (0) ; }
     m = A->m ; n = A->n ; Ap = A->p ; Ai = A->i ; Ax = A->x ;
     nzmax = A->nzmax ; nz = A->nz ;
-    printf ("CXSparse Version %d.%d.%d, %s.  %s\n", CS_VER, CS_SUBVER,
+    Rprintf ("CXSparse Version %d.%d.%d, %s.  %s\n", CS_VER, CS_SUBVER,
         CS_SUBSUB, CS_DATE, CS_COPYRIGHT) ;
     if (nz < 0)
     {
-        printf ("%g-by-%g, nzmax: %g nnz: %g, 1-norm: %g\n", (double) m,
+        Rprintf ("%g-by-%g, nzmax: %g nnz: %g, 1-norm: %g\n", (double) m,
             (double) n, (double) nzmax, (double) (Ap [n]), cs_norm (A)) ;
         for (j = 0 ; j < n ; j++)
         {
-            printf ("    col %g : locations %g to %g\n", (double) j, 
+            Rprintf ("    col %g : locations %g to %g\n", (double) j, 
                 (double) (Ap [j]), (double) (Ap [j+1]-1)) ;
             for (p = Ap [j] ; p < Ap [j+1] ; p++)
             {
-                printf ("      %g : ", (double) (Ai [p])) ;
+                Rprintf ("      %g : ", (double) (Ai [p])) ;
 #ifdef CS_COMPLEX
-                printf ("(%g, %g)\n",
+                Rprintf ("(%g, %g)\n",
                     Ax ? CS_REAL (Ax [p]) : 1, Ax ? CS_IMAG (Ax [p]) : 0) ;
 #else
-                printf ("%g\n", Ax ? Ax [p] : 1) ;
+                Rprintf ("%g\n", Ax ? Ax [p] : 1) ;
 #endif
-                if (brief && p > 20) { printf ("  ...\n") ; return (1) ; }
+                if (brief && p > 20) { Rprintf ("  ...\n") ; return (1) ; }
             }
         }
     }
     else
     {
-        printf ("triplet: %g-by-%g, nzmax: %g nnz: %g\n", (double) m,
+        Rprintf ("triplet: %g-by-%g, nzmax: %g nnz: %g\n", (double) m,
             (double) n, (double) nzmax, (double) nz) ;
         for (p = 0 ; p < nz ; p++)
         {
 
-            printf ("    %g %g : ", (double) (Ai [p]), (double) (Ap [p])) ;
+            Rprintf ("    %g %g : ", (double) (Ai [p]), (double) (Ap [p])) ;
 #ifdef CS_COMPLEX
-            printf ("(%g, %g)\n",
+            Rprintf ("(%g, %g)\n",
                 Ax ? CS_REAL (Ax [p]) : 1, Ax ? CS_IMAG (Ax [p]) : 0) ;
 #else
-            printf ("%g\n", Ax ? Ax [p] : 1) ;
+            Rprintf ("%g\n", Ax ? Ax [p] : 1) ;
 #endif
-            if (brief && p > 20) { printf ("  ...\n") ; return (1) ; }
+            if (brief && p > 20) { Rprintf ("  ...\n") ; return (1) ; }
         }
     }
     return (1) ;
diff -ruN src/SuiteSparse/CXSparse/Source/cs_randperm.c src/SuiteSparse-patched/CXSparse/Source/cs_randperm.c
--- src/SuiteSparse/CXSparse/Source/cs_randperm.c	2024-01-10 19:08:51
+++ src/SuiteSparse-patched/CXSparse/Source/cs_randperm.c	2024-01-12 11:54:13
@@ -2,6 +2,8 @@
 // CXSparse, Copyright (c) 2006-2022, Timothy A. Davis. All Rights Reserved.
 // SPDX-License-Identifier: LGPL-2.1+
 #include "cs.h"
+#include <R_ext/Random.h>
+
 /* return a random permutation vector, the identity perm, or p = n-1:-1:0.
  * seed = -1 means p = n-1:-1:0.  seed = 0 means p = identity.  otherwise
  * p = random permutation.  */
@@ -13,6 +15,7 @@
     if (!p) return (NULL) ;             /* out of memory */
     for (k = 0 ; k < n ; k++) p [k] = n-k-1 ;
     if (seed == -1) return (p) ;        /* return reverse permutation */
+    GetRNGstate();
     srand (seed) ;                      /* get new random number seed */
     for (k = 0 ; k < n ; k++)
     {
@@ -21,5 +24,6 @@
         p [j] = p [k] ;
         p [k] = t ;
     }
+    PutRNGstate();
     return (p) ;
 }