DSDP
identity.c
Go to the documentation of this file.
1 #include "dsdpdatamat_impl.h"
2 #include "dsdpsys.h"
8 typedef struct {
9  int n;
10  double dm;
11 } identitymat;
12 
13 
14 static int IdentityMatDestroy(void*);
15 static int IdentityMatView(void*);
16 static int IdentityMatVecVec(void*, double[], int, double *);
17 static int IdentityMatDotP(void*, double[], int, int, double*);
18 static int IdentityMatDotF(void*, double[], int, int, double*);
19 static int IdentityMatGetRank(void*, int*,int);
20 static int IdentityMatFactor(void*);
21 static int IdentityMatGetEig(void*, int, double*, double[], int,int[],int*);
22 static int IdentityMatAddRowMultiple(void*, int, double, double[], int);
23 static int IdentityMatAddMultipleP(void*, double, double[], int, int);
24 static int IdentityMatAddMultipleF(void*, double, double[], int, int);
25 static int IdentityMatGetRowNnz(void*, int, int[], int*, int);
26 
27 static struct DSDPDataMat_Ops identitymatopsp;
28 static struct DSDPDataMat_Ops identitymatopsf;
29 static int IdentitymatOperationsInitializeP(struct DSDPDataMat_Ops*);
30 static int IdentitymatOperationsInitializeF(struct DSDPDataMat_Ops*);
31 
32 
42 #undef __FUNCT__
43 #define __FUNCT__ "DSDPSetIdentityP"
44 int 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"
69 int 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 
83 static int IdentityMatDestroy(void* AA){
84  free(AA);
85  return 0;
86 }
87 
88 
89 static 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 
100 static 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 
113 static 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 
126 static 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 
132 static 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 
138 static int IdentityMatGetRank(void *AA, int*rank, int n){
139  identitymat* A=(identitymat*)AA;
140  *rank=A->n;;
141  return 0;
142 }
143 
144 static int IdentityMatFactor(void*A){
145  return 0;
146 }
147 
148 static 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 
160 static 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 
171 static int IdentityMatCountNonzeros(void*A, int *nnz, int n){
172  identitymat* AA = (identitymat*)A;
173  *nnz=AA->n;
174  return 0;
175 }
176 
177 static 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 
183 static 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 
194 static 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 
205 static const char *datamatname="MULTIPLE OF IDENTITY";
206 
207 static 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 
228 static 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 }
Error handling, printing, and profiling.
int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops *dops)
Initialize the table of function pointers for SDP Data matrices.
Definition: dsdpdatamat.c:47
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
Structure of function pointers that each SDP data matrix type (sparse, dense, constant, identity, ...) must implement.
Table of function pointers that operate on the data matrix.
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