DSDP
identity.c
Go to the documentation of this file.
1#include "dsdpdatamat_impl.h"
2#include "dsdpsys.h"
8typedef struct {
9 int n;
10 double dm;
11} identitymat;
12
13
14static int IdentityMatDestroy(void*);
15static int IdentityMatView(void*);
16static int IdentityMatVecVec(void*, double[], int, double *);
17static int IdentityMatDotP(void*, double[], int, int, double*);
18static int IdentityMatDotF(void*, double[], int, int, double*);
19static int IdentityMatGetRank(void*, int*,int);
20static int IdentityMatFactor(void*);
21static int IdentityMatGetEig(void*, int, double*, double[], int,int[],int*);
22static int IdentityMatAddRowMultiple(void*, int, double, double[], int);
23static int IdentityMatAddMultipleP(void*, double, double[], int, int);
24static int IdentityMatAddMultipleF(void*, double, double[], int, int);
25static int IdentityMatGetRowNnz(void*, int, int[], int*, int);
26
27static struct DSDPDataMat_Ops identitymatopsp;
28static struct DSDPDataMat_Ops identitymatopsf;
29static int IdentitymatOperationsInitializeP(struct DSDPDataMat_Ops*);
30static int IdentitymatOperationsInitializeF(struct DSDPDataMat_Ops*);
31
32
42#undef __FUNCT__
43#define __FUNCT__ "DSDPSetIdentityP"
44int DSDPGetIdentityDataMatP(int n, double val, struct DSDPDataMat_Ops** dops, void** imat){
45 int info;
46 identitymat *AA;
47
48 DSDPFunctionBegin;
49 AA=(identitymat*) malloc(1*sizeof(identitymat));
50 AA->dm=val;
51 AA->n=n;
52 info=IdentitymatOperationsInitializeP(&identitymatopsp); DSDPCHKERR(info);
53 if (dops){*dops=&identitymatopsp;}
54 if (imat){*imat=(void*)AA;}
55 DSDPFunctionReturn(0);
56}
57
67#undef __FUNCT__
68#define __FUNCT__ "DSDPSetIdentityF"
69int DSDPGetIdentityDataMatF(int n, double val, struct DSDPDataMat_Ops** dops, void** imat){
70 int info;
71 identitymat *AA;
72
73 DSDPFunctionBegin;
74 AA=(identitymat*) malloc(1*sizeof(identitymat));
75 AA->dm=val;
76 AA->n=n;
77 info=IdentitymatOperationsInitializeF(&identitymatopsf); DSDPCHKERR(info);
78 if (dops){*dops=&identitymatopsf;}
79 if (imat){*imat=(void*)AA;}
80 DSDPFunctionReturn(0);
81}
82
83static int IdentityMatDestroy(void* AA){
84 free(AA);
85 return 0;
86}
87
88
89static int IdentityMatVecVec(void* AA, double x[], int n, double *v){
90 identitymat* A=(identitymat*)AA;
91 int i;
92 *v=0;
93 for (i=0;i<n;i++){
94 *v+=x[i]*x[i];
95 }
96 *v *= A->dm;
97 return 0;
98}
99
100static int IdentityMatDotP(void* AA, double x[], int nn, int n, double *v){
101 identitymat* A=(identitymat*)AA;
102 int i;
103 double *xx=x;
104 *v=0;
105 for (i=0;i<n;i++){
106 *v+=*xx;
107 xx+=i+2;
108 }
109 *v *= 2*A->dm;
110 return 0;
111}
112
113static int IdentityMatDotF(void* AA, double x[], int nn, int n, double *v){
114 identitymat* A=(identitymat*)AA;
115 int i;
116 double *xx=x;
117 *v=0;
118 for (i=0;i<n;i++){
119 *v+=*xx;
120 xx+=n+1;
121 }
122 *v *= 2*A->dm;
123 return 0;
124}
125
126static int IdentityMatFNorm2(void* AA, int n, double *v){
127 identitymat* A=(identitymat*)AA;
128 *v=A->n*A->dm*A->dm;
129 return 0;
130}
131
132static int IdentityMatView(void* AA){
133 identitymat* A=(identitymat*)AA;
134 printf("Multiple of Identity matrix: All Diagonal elements equal %8.8e \n",A->dm);
135 return 0;
136}
137
138static int IdentityMatGetRank(void *AA, int*rank, int n){
139 identitymat* A=(identitymat*)AA;
140 *rank=A->n;;
141 return 0;
142}
143
144static int IdentityMatFactor(void*A){
145 return 0;
146}
147
148static int IdentityMatGetEig(void*AA, int neig, double *eig, double v[], int n, int* indx, int *nind){
149 identitymat* A = (identitymat*)AA;
150
151 if (neig<0 || neig>= A->n){ *eig=0; return 0;}
152 memset((void*)v,0,(A->n)*sizeof(double));
153 v[neig]=1.0;
154 indx[0]=neig;
155 *nind=1;
156 *eig=A->dm;
157 return 0;
158}
159
160static int IdentityMatGetRowNnz(void*A, int nrow, int nz[], int *nnzz, int n){
161 identitymat* AA = (identitymat*)A;
162 if (nrow>=0 && nrow < AA->n){
163 *nnzz=1;
164 nz[nrow]++;
165 } else {
166 *nnzz=0;
167 }
168 return 0;
169}
170
171static int IdentityMatCountNonzeros(void*A, int *nnz, int n){
172 identitymat* AA = (identitymat*)A;
173 *nnz=AA->n;
174 return 0;
175}
176
177static int IdentityMatAddRowMultiple(void*A, int nrow, double dd, double rrow[], int n){
178 identitymat* AA = (identitymat*)A;
179 rrow[nrow] += dd*AA->dm;
180 return 0;
181}
182
183static int IdentityMatAddMultipleP(void*A, double dd, double vv[], int nn, int n){
184 identitymat* AA = (identitymat*)A;
185 double *v=vv,dm=dd*AA->dm;
186 int i;
187 for (i=0;i<n;i++){
188 *v += dm;
189 v+= i+2;
190 }
191 return 0;
192}
193
194static int IdentityMatAddMultipleF(void*A, double dd, double vv[], int nn, int n){
195 identitymat* AA = (identitymat*)A;
196 double *v=vv,dm=dd*AA->dm;
197 int i;
198 for (i=0;i<n;i++){
199 *v += dm;
200 v+= n+1;
201 }
202 return 0;
203}
204
205static const char *datamatname="MULTIPLE OF IDENTITY";
206
207static int IdentitymatOperationsInitializeP(struct DSDPDataMat_Ops* spdiagops){
208 int info;
209 if (spdiagops==NULL) return 0;
210 info=DSDPDataMatOpsInitialize(spdiagops); if (info){return info;}
211 spdiagops->matfactor1=IdentityMatFactor;
212 spdiagops->matgetrank=IdentityMatGetRank;
213 spdiagops->matgeteig=IdentityMatGetEig;
214 spdiagops->matvecvec=IdentityMatVecVec;
215 spdiagops->matrownz=IdentityMatGetRowNnz;
216 spdiagops->matdot=IdentityMatDotP;
217 spdiagops->matfnorm2=IdentityMatFNorm2;
218 spdiagops->matnnz=IdentityMatCountNonzeros;
219 spdiagops->mataddrowmultiple=IdentityMatAddRowMultiple;
220 spdiagops->mataddallmultiple=IdentityMatAddMultipleP;
221 spdiagops->matdestroy=IdentityMatDestroy;
222 spdiagops->matview=IdentityMatView;
223 spdiagops->id=12;
224 spdiagops->matname=datamatname;
225 return 0;
226}
227
228static int IdentitymatOperationsInitializeF(struct DSDPDataMat_Ops* spdiagops){
229 int info;
230 if (spdiagops==NULL) return 0;
231 info=DSDPDataMatOpsInitialize(spdiagops); if (info){return info;}
232 spdiagops->matfactor1=IdentityMatFactor;
233 spdiagops->matgetrank=IdentityMatGetRank;
234 spdiagops->matgeteig=IdentityMatGetEig;
235 spdiagops->matvecvec=IdentityMatVecVec;
236 spdiagops->matrownz=IdentityMatGetRowNnz;
237 spdiagops->matdot=IdentityMatDotF;
238 spdiagops->matfnorm2=IdentityMatFNorm2;
239 spdiagops->matnnz=IdentityMatCountNonzeros;
240 spdiagops->mataddrowmultiple=IdentityMatAddRowMultiple;
241 spdiagops->mataddallmultiple=IdentityMatAddMultipleF;
242 spdiagops->matdestroy=IdentityMatDestroy;
243 spdiagops->matview=IdentityMatView;
244 spdiagops->id=12;
245 spdiagops->matname=datamatname;
246 return 0;
247}
int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops *dops)
Initialize the table of function pointers for SDP Data matrices.
Definition dsdpdatamat.c:47
Structure of function pointers that each SDP data matrix type (sparse, dense, constant,...
Error handling, printing, and profiling.
int DSDPGetIdentityDataMatP(int n, double val, struct DSDPDataMat_Ops **dops, void **imat)
Create a sparse matrix usuable by DSDP in packed symmetric format.
Definition identity.c:44
int DSDPGetIdentityDataMatF(int n, double val, struct DSDPDataMat_Ops **dops, void **imat)
Create a sparse matrix usuable by DSDP in full symmetric format.
Definition identity.c:69
Table of function pointers that operate on the data matrix.