DSDP
spds.c
Go to the documentation of this file.
1 #include "dsdpsys.h"
2 #include "dsdpdsmat_impl.h"
3 
8 typedef struct {
9  int n;
10  double *an;
11  int *col;
12  int *nnz;
13 } spdsmat;
14 
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;
18  double *an=ds->an;
19  for (i=0;i<n;i++,nnz++){
20  k1=*nnz; k2=*(nnz+1);
21  for (j=k1;j<k2;j++,an++,col++){
22  if ((*col)==i){ *an = v[*col]/2;}
23  else { *an = v[*col]; }
24  }
25  v+=i+1;
26  }
27  return 0;
28 }
29 
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;
33  double *an=ds->an;
34  for (i=0;i<n;i++,nnz++){
35  k1=*nnz; k2=*(nnz+1);
36  for (j=k1;j<k2;j++,an++,col++){
37  if ((*col)==i){ *an = v[*col]/2;}
38  else { *an = v[*col]; }
39  }
40  v+=n;
41  }
42  return 0;
43 }
44 
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;
48  double *an=ds->an;
49  for (i=0;i<n;i++){
50  k1=nnz[i]; k2=nnz[i+1];
51  printf("Row %d: ",i);
52  for (j=k1;j<k2;j++){
53  if (col[j]==i){ printf("%d: %4.4f",col[j],2*an[j]); }
54  else { printf("%d: %4.4f",col[j],an[j]);}
55  }
56  printf("\n");
57  }
58  return 0;
59 }
60 /*
61 static int SpSymMatShiftDiagonal(void *DS, double dd){
62  spdsmat*ds=(spdsmat*)DS;
63  int i,n=ds->n,*nnz=ds->nnz;
64  double *an=ds->an;
65  for (i=0;i<n;i++){
66  an[nnz[i+1]-1] += dd/2;
67  }
68  return 0;
69 }
70 */
71 static int SpSymMatDestroy(void *DS){
72  spdsmat*ds=(spdsmat*)DS;
73  int info;
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;
78  return 0;
79 }
80 
81 static int SpSymMatGetSize(void *DS, int*n){
82  spdsmat*ds=(spdsmat*)DS;
83  *n=ds->n;
84  return 0;
85 }
86 
87 static int SpSymMatZero(void*DS){
88  spdsmat*ds=(spdsmat*)DS;
89  int nn=ds->nnz[ds->n];
90  double *an=ds->an;
91  memset((void*)an,0,nn*sizeof(double));
92  return 0;
93 }
94 
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;
98  double *an=ds->an;
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);
105  }
106  }
107  return 0;
108 }
109 
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;
114  *vAv=0;
115  for (i=0;i<n;i++,nnz++){
116  k1=*nnz; k2=*(nnz+1);
117  vv=0;
118  for (j=k1;j<k2;j++,col++,an++){
119  vv+=x[*col]*(*an);
120  }
121  *vAv+=vv*x[i]*2;
122  }
123  return 0;
124 }
125 /*
126 static int SpSymMatAddRow(void *DS, int row, double dd, double v[], int n){
127  spdsmat*ds=(spdsmat*)DS;
128  int j,k1,k2,*nnz=ds->nnz,*col=ds->col;
129  double *an=ds->an;
130  k1=nnz[row]; k2=nnz[row+1];
131  for (j=k1;j<k2;j++){
132  if (row==col[j]){ an[j] += dd*v[col[j]]/2; }
133  else { an[j] += dd*v[col[j]]; }
134  }
135  return 0;
136 }
137 */
138 static const char* dsmatname="SPARSE, SYMMETRIC MATRIX";
139 static int DSDPDSSparseInitializeOpsP(struct DSDPDSMat_Ops* dsops){
140  int info;
141  if (!dsops) return 0;
142  info=DSDPDSMatOpsInitialize(dsops); DSDPCHKERR(info);
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;
150  dsops->id=6;
151  dsops->matname=dsmatname;
152  return 0;
153 }
154 static int DSDPDSSparseInitializeOpsU(struct DSDPDSMat_Ops* dsops){
155  int info;
156  if (!dsops) return 0;
157  info=DSDPDSMatOpsInitialize(dsops); DSDPCHKERR(info);
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;
165  dsops->id=6;
166  dsops->matname=dsmatname;
167  return 0;
168 }
169 
170 static struct DSDPDSMat_Ops tdsdsopsp;
171 static struct DSDPDSMat_Ops tdsdsopsu;
172 #undef __FUNCT__
173 #define __FUNCT__ "DSDPCreateSparseDSMat"
174 int DSDPSparseMatCreatePattern2P(int n, int rnnz[], int cols[], int tnnz,struct DSDPDSMat_Ops* *dsmatops, void**dsmat){
175  int i,info;
176  spdsmat*ds;
177  DSDPFunctionBegin;
178  DSDPCALLOC1(&ds,spdsmat,&info);DSDPCHKERR(info);
179  DSDPCALLOC2(&ds->nnz,int,(n+1),&info);DSDPCHKERR(info);
180  ds->nnz[0]=0;
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;
187  *dsmat=(void*)ds;
188  DSDPFunctionReturn(0);
189 }
190 
191 #undef __FUNCT__
192 #define __FUNCT__ "DSDPCreateSparseDSMatU"
193 int DSDPSparseMatCreatePattern2U(int n, int rnnz[], int cols[], int tnnz,struct DSDPDSMat_Ops* *dsmatops, void**dsmat){
194  int i,info;
195  spdsmat*ds;
196  DSDPFunctionBegin;
197  DSDPCALLOC1(&ds,spdsmat,&info);DSDPCHKERR(info);
198  DSDPCALLOC2(&ds->nnz,int,(n+1),&info);DSDPCHKERR(info);
199  ds->nnz[0]=0;
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;
206  *dsmat=(void*)ds;
207  DSDPFunctionReturn(0);
208 }
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.
Definition: dsdpdsmat.c:214
Symmetric Delta S matrix for one block in the semidefinite cone.