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);
43 #define __FUNCT__ "DSDPSetIdentityP" 49 AA=(identitymat*) malloc(1*
sizeof(identitymat));
52 info=IdentitymatOperationsInitializeP(&identitymatopsp); DSDPCHKERR(info);
53 if (dops){*dops=&identitymatopsp;}
54 if (imat){*imat=(
void*)AA;}
55 DSDPFunctionReturn(0);
68 #define __FUNCT__ "DSDPSetIdentityF" 74 AA=(identitymat*) malloc(1*
sizeof(identitymat));
77 info=IdentitymatOperationsInitializeF(&identitymatopsf); DSDPCHKERR(info);
78 if (dops){*dops=&identitymatopsf;}
79 if (imat){*imat=(
void*)AA;}
80 DSDPFunctionReturn(0);
83 static int IdentityMatDestroy(
void* AA){
89 static int IdentityMatVecVec(
void* AA,
double x[],
int n,
double *v){
90 identitymat* A=(identitymat*)AA;
100 static int IdentityMatDotP(
void* AA,
double x[],
int nn,
int n,
double *v){
101 identitymat* A=(identitymat*)AA;
113 static int IdentityMatDotF(
void* AA,
double x[],
int nn,
int n,
double *v){
114 identitymat* A=(identitymat*)AA;
126 static int IdentityMatFNorm2(
void* AA,
int n,
double *v){
127 identitymat* A=(identitymat*)AA;
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);
138 static int IdentityMatGetRank(
void *AA,
int*rank,
int n){
139 identitymat* A=(identitymat*)AA;
144 static int IdentityMatFactor(
void*A){
148 static int IdentityMatGetEig(
void*AA,
int neig,
double *eig,
double v[],
int n,
int* indx,
int *nind){
149 identitymat* A = (identitymat*)AA;
151 if (neig<0 || neig>= A->n){ *eig=0;
return 0;}
152 memset((
void*)v,0,(A->n)*
sizeof(
double));
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){
171 static int IdentityMatCountNonzeros(
void*A,
int *nnz,
int n){
172 identitymat* AA = (identitymat*)A;
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;
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;
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;
205 static const char *datamatname=
"MULTIPLE OF IDENTITY";
207 static int IdentitymatOperationsInitializeP(
struct DSDPDataMat_Ops* spdiagops){
209 if (spdiagops==NULL)
return 0;
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;
224 spdiagops->matname=datamatname;
228 static int IdentitymatOperationsInitializeF(
struct DSDPDataMat_Ops* spdiagops){
230 if (spdiagops==NULL)
return 0;
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;
245 spdiagops->matname=datamatname;
Error handling, printing, and profiling.
int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops *dops)
Initialize the table of function pointers for SDP Data matrices.
int DSDPGetIdentityDataMatF(int n, double val, struct DSDPDataMat_Ops **dops, void **imat)
Create a sparse matrix usuable by DSDP in full symmetric format.
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.