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);
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);
83static int IdentityMatDestroy(
void* AA){
89static int IdentityMatVecVec(
void* AA,
double x[],
int n,
double *v){
90 identitymat* A=(identitymat*)AA;
100static int IdentityMatDotP(
void* AA,
double x[],
int nn,
int n,
double *v){
101 identitymat* A=(identitymat*)AA;
113static int IdentityMatDotF(
void* AA,
double x[],
int nn,
int n,
double *v){
114 identitymat* A=(identitymat*)AA;
126static int IdentityMatFNorm2(
void* AA,
int n,
double *v){
127 identitymat* A=(identitymat*)AA;
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);
138static int IdentityMatGetRank(
void *AA,
int*rank,
int n){
139 identitymat* A=(identitymat*)AA;
144static int IdentityMatFactor(
void*A){
148static 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));
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){
171static int IdentityMatCountNonzeros(
void*A,
int *nnz,
int n){
172 identitymat* AA = (identitymat*)A;
177static int IdentityMatAddRowMultiple(
void*A,
int nrow,
double dd,
double rrow[],
int n){
178 identitymat* AA = (identitymat*)A;
179 rrow[nrow] += dd*AA->dm;
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;
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;
205static const char *datamatname=
"MULTIPLE OF IDENTITY";
207static 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;
228static 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;
int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops *dops)
Initialize the table of function pointers for SDP Data matrices.
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.
int DSDPGetIdentityDataMatF(int n, double val, struct DSDPDataMat_Ops **dops, void **imat)
Create a sparse matrix usuable by DSDP in full symmetric format.
Table of function pointers that operate on the data matrix.