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,...
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