15 static int SpSymMatSetURValuesP(
void*DS,
double v[],
int nn,
int n){
16 spdsmat*ds=(spdsmat*)DS;
17 int i,j,k1,k2,*nnz=ds->nnz,*col=ds->col;
19 for (i=0;i<n;i++,nnz++){
21 for (j=k1;j<k2;j++,an++,col++){
22 if ((*col)==i){ *an = v[*col]/2;}
23 else { *an = v[*col]; }
30 static int SpSymMatSetURValuesU(
void*DS,
double v[],
int nn,
int n){
31 spdsmat*ds=(spdsmat*)DS;
32 int i,j,k1,k2,*nnz=ds->nnz,*col=ds->col;
34 for (i=0;i<n;i++,nnz++){
36 for (j=k1;j<k2;j++,an++,col++){
37 if ((*col)==i){ *an = v[*col]/2;}
38 else { *an = v[*col]; }
45 static int SpSymMatView(
void *DS){
46 spdsmat*ds=(spdsmat*)DS;
47 int i,j,k1,k2,n=ds->n,*nnz=ds->nnz,*col=ds->col;
50 k1=nnz[i]; k2=nnz[i+1];
53 if (col[j]==i){ printf(
"%d: %4.4f",col[j],2*an[j]); }
54 else { printf(
"%d: %4.4f",col[j],an[j]);}
71 static int SpSymMatDestroy(
void *DS){
72 spdsmat*ds=(spdsmat*)DS;
74 DSDPFREE(&ds->nnz,&info);
if (info)
return 1;
75 DSDPFREE(&ds->col,&info);
if (info)
return 1;
76 DSDPFREE(&ds->an,&info);
if (info)
return 1;
77 DSDPFREE(&ds,&info);
if (info)
return 1;
81 static int SpSymMatGetSize(
void *DS,
int*n){
82 spdsmat*ds=(spdsmat*)DS;
87 static int SpSymMatZero(
void*DS){
88 spdsmat*ds=(spdsmat*)DS;
89 int nn=ds->nnz[ds->n];
91 memset((
void*)an,0,nn*
sizeof(
double));
95 static int SpSymMatMult(
void*DS,
double x[],
double y[],
int n){
96 spdsmat*ds=(spdsmat*)DS;
97 int i,j,k1,k2,*nnz=ds->nnz,*col=ds->col;
99 memset((
void*)y,0,n*
sizeof(
double));
100 for (i=0;i<n;i++,nnz++){
101 k1=*nnz; k2=*(nnz+1);
102 for (j=k1;j<k2;j++,col++,an++){
103 y[*col] += x[i] * (*an);
104 y[i] += x[*col] * (*an);
110 static int SpSymMatVecVec(
void*DS,
double x[],
int n,
double *vAv){
111 spdsmat*ds=(spdsmat*)DS;
112 int i,j,k1,k2,*nnz=ds->nnz,*col=ds->col;
113 double vv,*an=ds->an;
115 for (i=0;i<n;i++,nnz++){
116 k1=*nnz; k2=*(nnz+1);
118 for (j=k1;j<k2;j++,col++,an++){
138 static const char* dsmatname=
"SPARSE, SYMMETRIC MATRIX";
139 static int DSDPDSSparseInitializeOpsP(
struct DSDPDSMat_Ops* dsops){
141 if (!dsops)
return 0;
143 dsops->matseturmat=SpSymMatSetURValuesP;
144 dsops->matview=SpSymMatView;
145 dsops->matdestroy=SpSymMatDestroy;
146 dsops->matgetsize=SpSymMatGetSize;
147 dsops->matzeroentries=SpSymMatZero;
148 dsops->matmult=SpSymMatMult;
149 dsops->matvecvec=SpSymMatVecVec;
151 dsops->matname=dsmatname;
154 static int DSDPDSSparseInitializeOpsU(
struct DSDPDSMat_Ops* dsops){
156 if (!dsops)
return 0;
158 dsops->matseturmat=SpSymMatSetURValuesU;
159 dsops->matview=SpSymMatView;
160 dsops->matdestroy=SpSymMatDestroy;
161 dsops->matgetsize=SpSymMatGetSize;
162 dsops->matzeroentries=SpSymMatZero;
163 dsops->matmult=SpSymMatMult;
164 dsops->matvecvec=SpSymMatVecVec;
166 dsops->matname=dsmatname;
173 #define __FUNCT__ "DSDPCreateSparseDSMat" 174 int DSDPSparseMatCreatePattern2P(
int n,
int rnnz[],
int cols[],
int tnnz,
struct DSDPDSMat_Ops* *dsmatops,
void**dsmat){
178 DSDPCALLOC1(&ds,spdsmat,&info);DSDPCHKERR(info);
179 DSDPCALLOC2(&ds->nnz,
int,(n+1),&info);DSDPCHKERR(info);
181 for (i=0;i<n;i++) ds->nnz[i+1]=ds->nnz[i]+rnnz[i];
182 DSDPCALLOC2(&ds->col,
int,tnnz,&info);DSDPCHKERR(info);
183 DSDPCALLOC2(&ds->an,
double,tnnz,&info);DSDPCHKERR(info);
184 for (i=0;i<tnnz;i++) ds->col[i]=cols[i];
185 info=DSDPDSSparseInitializeOpsP(&tdsdsopsp); DSDPCHKERR(info);
186 *dsmatops=&tdsdsopsp;
188 DSDPFunctionReturn(0);
192 #define __FUNCT__ "DSDPCreateSparseDSMatU" 193 int DSDPSparseMatCreatePattern2U(
int n,
int rnnz[],
int cols[],
int tnnz,
struct DSDPDSMat_Ops* *dsmatops,
void**dsmat){
197 DSDPCALLOC1(&ds,spdsmat,&info);DSDPCHKERR(info);
198 DSDPCALLOC2(&ds->nnz,
int,(n+1),&info);DSDPCHKERR(info);
200 for (i=0;i<n;i++) ds->nnz[i+1]=ds->nnz[i]+rnnz[i];
201 DSDPCALLOC2(&ds->col,
int,tnnz,&info);DSDPCHKERR(info);
202 DSDPCALLOC2(&ds->an,
double,tnnz,&info);DSDPCHKERR(info);
203 for (i=0;i<tnnz;i++) ds->col[i]=cols[i];
204 info=DSDPDSSparseInitializeOpsU(&tdsdsopsu); DSDPCHKERR(info);
205 *dsmatops=&tdsdsopsu;
207 DSDPFunctionReturn(0);
Error handling, printing, and profiling.
Structure of function pointers that each SDP Delta S matrix type (sparse, dense, diagonal, ...) must implement.
int DSDPDSMatOpsInitialize(struct DSDPDSMat_Ops *aops)
Set pointers to null.
Symmetric Delta S matrix for one block in the semidefinite cone.