DSDP
spds.c
Go to the documentation of this file.
1#include "dsdpsys.h"
2#include "dsdpdsmat_impl.h"
3
8typedef struct {
9 int n;
10 double *an;
11 int *col;
12 int *nnz;
13} spdsmat;
14
15static 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
30static 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
45static 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/*
61static 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*/
71static 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
81static int SpSymMatGetSize(void *DS, int*n){
82 spdsmat*ds=(spdsmat*)DS;
83 *n=ds->n;
84 return 0;
85}
86
87static 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
95static 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
110static 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/*
126static 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*/
138static const char* dsmatname="SPARSE, SYMMETRIC MATRIX";
139static 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}
154static 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
170static struct DSDPDSMat_Ops tdsdsopsp;
171static struct DSDPDSMat_Ops tdsdsopsu;
172#undef __FUNCT__
173#define __FUNCT__ "DSDPCreateSparseDSMat"
174int 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"
193int 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}
int DSDPDSMatOpsInitialize(struct DSDPDSMat_Ops *aops)
Set pointers to null.
Definition dsdpdsmat.c:214
Structure of function pointers that each SDP Delta S matrix type (sparse, dense, diagonal,...
Error handling, printing, and profiling.
Symmetric Delta S matrix for one block in the semidefinite cone.