1- #include <suitesparse/SuiteSparseQR_C.h>
21//umfpack solve sparse Ax=b
32int umfpack_di_symbolic (int ,int ,int * ,int * ,double * , void * * ,double * ,double * );
43int umfpack_zi_symbolic (int ,int ,int * ,int * ,double * ,double * ,void * * ,double * ,double * );
@@ -11,7 +10,6 @@ int umfpack_zi_solve(int,int*,int*,double*,double*,double*,double*,double*,doub
1110void umfpack_di_free_numeric (void * * );
1211void umfpack_zi_free_numeric (void * * );
1312
14- /*
1513//spqr sparse least squares (cholmod.h spqr.h)
1614typedef struct choldmod_dense_struct {
1715 size_t nrow ,ncol ,nzmax ,d ; //A is nrow x ncol, nmax(entries) d(lda>=nrow)
@@ -25,8 +23,8 @@ typedef struct cholmod_sparse_struct{
2523} cholmod_sparse ;
2624int cholmod_start (void * cc );
2725int cholmod_finish (void * cc );
26+ int cholmod_free_dense (cholmod_dense * * ,void * );
2827cholmod_dense * SuiteSparseQR_C_backslash_default (cholmod_sparse * A ,cholmod_dense * B ,void * cc );
29- */
3028
3129uint64_t spqr (uint64_t x ){ //todo: b maybe m-by-k dense..
3230 uint64_t common [400 ];//enough to hold cholmod_common structure (sizeof 2680)
@@ -35,20 +33,22 @@ uint64_t spqr(uint64_t x){ //todo: b maybe m-by-k dense..
3533 uint64_t M = x0 (A ),N = x1 (A ),Ap = x2 (A ),Ai = x3 (A ),Ax = FZ (x4 (A ));dx (A );int z = (tp (Ax )== Zt );
3634 if (tp (M )!= it || tp (N )!= it || tp (Ap )!= It || tp (Ai )!= It )trap ();
3735 int32_t m = (int32_t )M ,n = (int32_t )N ;
38- if (nn (B )!= m )trap ();if (z && tp (B )!= Zt )B = uptype (B ,zt );
36+ if (nn (Ap )!= 1 + n || nn (Ai )!= nn (Ax ))trap ();
37+ int32_t nb = nn (B ),k = nb /m ;if (nb != k * m )trap (); //k>1: multirhs flat colmajor vector
38+ if (z && tp (B )!= Zt )B = uptype (B ,zt );
3939 void * cc = & common ;cholmod_start (cc );
4040 cholmod_sparse a ;
41- a .nrow = m ;a .ncol = n ;a .nzmax = nn (A );a .p = IK (Ap );a .i = IK (Ai );a .nz = NULL ;a .x = FK (A );a .z = NULL ;
41+ a .nrow = m ;a .ncol = n ;a .nzmax = nn (Ax );a .p = IK (Ap );a .i = IK (Ai );a .nz = NULL ;a .x = FK (Ax );a .z = NULL ;
4242 a .stype = 0 ;a .itype = 0 ;a .xtype = 1 + z ;a .dtype = 0 ;a .sorted = 0 ;a .packed = 1 ;
4343 cholmod_dense b ;
44- b .nrow = m ;b .ncol = 1 ;b .nzmax = m ;b .x = FK (B );b .z = NULL ;b .xtype = 1 + z ;b .dtype = 0 ;
44+ b .nrow = m ;b .ncol = k ;b .nzmax = m ;b .x = FK (B );b .z = NULL ;b .xtype = 1 + z ;b .dtype = 0 ;
4545 cholmod_dense * r = SuiteSparseQR_C_backslash_default (& a ,& b ,cc );
46- //printf("r: %d %d #%d xt%d dt%d: [", r->nrow, r->ncol, r->nzmax, r->xtype, r->dtype);
47- //printf("%g %g %g %g %g]\n", r->x[0], r->x[1], r->x[2], r->x[3], r->x[4]);
46+ dx (Ap );dx (Ai );dx (Ax );dx (B );
47+ x = mk (z ?Zt :Ft ,nb );
48+ memcpy (M_ + (int32_t )x ,r -> x ,nb <<(z ?4 :3 ));
49+ cholmod_free_dense (& r ,cc );
4850 cholmod_finish (cc );
49- //todo is A/B overwritten? where is the workspace, what must be freed?
50- //cholmod_free_dense(
51- return Ki (0 );
51+ return x ;
5252}
5353
5454//dense matrix representation
@@ -63,6 +63,7 @@ uint64_t spsolve(uint64_t x){ // spsolve[A;b]
6363 uint64_t N = x1 (A ),Ap = x2 (A ),Ai = x3 (A ),Ax = FZ (x4 (A ));dx (A );
6464 if (tp (N )!= it || tp (Ap )!= It || tp (Ai )!= It )trap ();
6565 int z = 0 ,n = (int32_t )N ;int * ap = IK (Ap ),* ai = IK (Ai );double * ax = FK (Ax );void * sy ,* nu ;
66+ if (nn (Ap )!= 1 + n || nn (Ai )!= nn (Ax ))trap ();
6667 if (tp (Ax )== Ft ){
6768 if (umfpack_di_symbolic (n ,n ,ap ,ai ,ax ,& sy ,NULL ,NULL ))trap ();
6869 if (umfpack_di_numeric (ap ,ai ,ax ,sy ,& nu , NULL ,NULL )){umfpack_di_free_symbolic (& sy );trap ();}
@@ -96,7 +97,6 @@ uint64_t spsolve(uint64_t x){ // spsolve[A;b]
9697 return mrhs ?r :Fst (r );
9798}
9899void umfpack (void ){
99- printf ("%d\n" , sizeof (cholmod_common )); //2680
100100 reg (spsolve ,"spsolve" ,2 );
101101 reg (spqr , "spqr" , 2 );
102102}
@@ -132,6 +132,6 @@ void *Symbolic, *Numeric ;
132132#include<stdio.h>
133133#include<cholmod.h>
134134int main(){
135- printf("%d\n", sizeof(cholmod_common)); //2680(win) 2664(debian)
135+ printf("%d\n", sizeof(cholmod_common)); //should be 2680
136136}
137137*/
0 commit comments