18static int DiagMatCreate(
int,diagmat**);
19static int DiagMatMult(
void*,
double[],
double[],
int);
20static int DiagMatGetSize(
void*,
int *);
21static int DiagMatAddRow2(
void*,
int,
double,
double[],
int);
22static int DiagMatDestroy(
void*);
23static int DiagMatView(
void*);
24static int DiagMatLogDeterminant(
void*,
double *);
28static int DiagMatCreate(
int n,diagmat**M){
32 DSDPCALLOC1(&M7,diagmat,&info);DSDPCHKERR(info);
33 DSDPCALLOC2(&M7->val,
double,n,&info);DSDPCHKERR(info);
34 if (n>0 && M7->val==NULL)
return 1;
35 M7->owndata=1; M7->n=n;
40static int DiagMatDestroy(
void* AA){
42 diagmat* A=(diagmat*) AA;
43 if (A->owndata && A->val){ DSDPFREE(&A->val,&info);DSDPCHKERR(info);}
44 DSDPFREE(&A,&info);DSDPCHKERR(info);
49static int DiagMatMult(
void* AA,
double x[],
double y[],
int n){
51 diagmat* A=(diagmat*) AA;
55 if (A->n != n)
return 1;
56 if (x==0 && n>0)
return 3;
57 if (y==0 && n>0)
return 3;
66static int DiagMatGetSize(
void *AA,
int *n){
67 diagmat* A=(diagmat*) AA;
72static int DiagMatView(
void* AA){
73 diagmat* A=(diagmat*) AA;
75 for (i=0;i<A->n; i++){
76 printf(
" Row: %d, Column: %d, Value: %8.4e \n",i,i,A->val[i]);
81static int DiagMatAddRow2(
void* AA,
int nrow,
double dd,
double row[],
int n){
82 diagmat* A=(diagmat*) AA;
83 A->val[nrow] += dd*row[nrow];
88static int DiagMatAddElement(
void*A,
int nrow,
double dd){
89 diagmat* AA = (diagmat*)A;
94static int DiagMatZeros(
void*A){
95 diagmat* AA = (diagmat*)A;
97 memset(AA->val,0,n*
sizeof(
double));
101static int DiagMatSolve(
void* A,
double b[],
double x[],
int n){
102 diagmat* AA = (diagmat*)A;
111static int DiagMatSolve2(
void* A,
int indx[],
int nindx,
double b[],
double x[],
int n){
112 diagmat* AA = (diagmat*)A;
115 memset((
void*)x,0,n*
sizeof(
double));
116 for (j=0;j<nindx;j++){
123static int DiagMatCholeskySolveBackward(
void* A,
double b[],
double x[],
int n){
131static int DiagMatInvert(
void *A){
135static int DiagMatCholeskyFactor(
void*A,
int *flag){
136 diagmat* AA = (diagmat*)A;
141 if (v[i]<=0){ *flag=i+1;
break;}
146static int DiagMatLogDeterminant(
void*A,
double *dd){
147 diagmat* AA = (diagmat*)A;
148 double d=0,*val=AA->val;
151 if (val[i]<=0)
return 1;
158static int DiagMatTakeUREntriesP(
void*A,
double dd[],
int nn,
int n){
159 diagmat* AA = (diagmat*)A;
168static int DiagMatTakeUREntriesU(
void*A,
double dd[],
int nn,
int n){
169 diagmat* AA = (diagmat*)A;
178static int DiagMatInverseAddP(
void*A,
double alpha,
double dd[],
int nn,
int n){
179 diagmat* AA = (diagmat*)A;
184 dd[ii]+=alpha/val[i];
188static int DiagMatInverseAddU(
void*A,
double alpha,
double dd[],
int nn,
int n){
189 diagmat* AA = (diagmat*)A;
193 dd[i*n+i]+=alpha/val[i];
198static int DiagMatFull(
void*A,
int* dfull){
205static const char* diagmatname=
"DIAGONAL";
209 if (sops==NULL)
return 0;
211 sops->matcholesky=DiagMatCholeskyFactor;
212 sops->matsolveforward=DiagMatSolve;
213 sops->matsolvebackward=DiagMatCholeskySolveBackward;
214 sops->matinvert=DiagMatInvert;
215 sops->matinverseadd=DiagMatInverseAddP;
216 sops->matinversemultiply=DiagMatSolve2;
217 sops->matseturmat=DiagMatTakeUREntriesP;
218 sops->matfull=DiagMatFull;
219 sops->matdestroy=DiagMatDestroy;
220 sops->matgetsize=DiagMatGetSize;
221 sops->matview=DiagMatView;
222 sops->matlogdet=DiagMatLogDeterminant;
224 sops->matname=diagmatname;
229 if (sops==NULL)
return 0;
231 sops->matcholesky=DiagMatCholeskyFactor;
232 sops->matsolveforward=DiagMatSolve;
233 sops->matsolvebackward=DiagMatCholeskySolveBackward;
234 sops->matinvert=DiagMatInvert;
235 sops->matinversemultiply=DiagMatSolve2;
236 sops->matseturmat=DiagMatTakeUREntriesU;
237 sops->matfull=DiagMatFull;
238 sops->matinverseadd=DiagMatInverseAddU;
239 sops->matdestroy=DiagMatDestroy;
240 sops->matgetsize=DiagMatGetSize;
241 sops->matview=DiagMatView;
242 sops->matlogdet=DiagMatLogDeterminant;
244 sops->matname=diagmatname;
249#define __FUNCT__ "DSDPDiagDualMatCreateP"
250int DSDPDiagDualMatCreateP(
int n,
257 info=DiagMatCreate(n,&AA); DSDPCHKERR(info);
258 info=DiagDualOpsInitializeP(&sdmatopsp); DSDPCHKERR(info);
262 info=DiagMatCreate(n,&AA); DSDPCHKERR(info);
263 info=DiagDualOpsInitializeP(&sdmatopsp); DSDPCHKERR(info);
266 DSDPFunctionReturn(0);
270#define __FUNCT__ "DSDPDiagDualMatCreateU"
271int DSDPDiagDualMatCreateU(
int n,
277 info=DiagMatCreate(n,&AA); DSDPCHKERR(info);
278 info=DiagDualOpsInitializeU(&sdmatopsu); DSDPCHKERR(info);
281 info=DiagMatCreate(n,&AA); DSDPCHKERR(info);
282 info=DiagDualOpsInitializeU(&sdmatopsu); DSDPCHKERR(info);
285 DSDPFunctionReturn(0);
290static int DiagMatVecVec(
void*A,
double x[],
int n,
double *vv){
291 diagmat* AA = (diagmat*)A;
292 double *v=AA->val,vAv=0;
301static int DDiagDSMatOpsInitP(
struct DSDPDSMat_Ops *ddiagops){
303 if (ddiagops==NULL)
return 0;
305 ddiagops->matseturmat=DiagMatTakeUREntriesP;
306 ddiagops->matview=DiagMatView;
307 ddiagops->matgetsize=DiagMatGetSize;
308 ddiagops->matmult=DiagMatMult;
309 ddiagops->matvecvec=DiagMatVecVec;
310 ddiagops->matzeroentries=DiagMatZeros;
311 ddiagops->matdestroy=DiagMatDestroy;
313 ddiagops->matname=diagmatname;
314 DSDPFunctionReturn(0);
316static int DDiagDSMatOpsInitU(
struct DSDPDSMat_Ops *ddiagops){
318 if (ddiagops==NULL)
return 0;
320 ddiagops->matseturmat=DiagMatTakeUREntriesU;
321 ddiagops->matview=DiagMatView;
322 ddiagops->matgetsize=DiagMatGetSize;
323 ddiagops->matmult=DiagMatMult;
324 ddiagops->matvecvec=DiagMatVecVec;
325 ddiagops->matzeroentries=DiagMatZeros;
326 ddiagops->matdestroy=DiagMatDestroy;
328 ddiagops->matname=diagmatname;
329 DSDPFunctionReturn(0);
336#define __FUNCT__ "DSDPDiagDSMatP"
337int DSDPCreateDiagDSMatP(
int n,
struct DSDPDSMat_Ops* *dsmatops,
void**dsmat){
343 info=DiagMatCreate(n,&AA); DSDPCHKERR(info);
344 info=DDiagDSMatOpsInitP(&dsdiagmatopsp); DSDPCHKERR(info);
345 *dsmatops=&dsdiagmatopsp;
347 DSDPFunctionReturn(0);
350#define __FUNCT__ "DSDPDiagDSMatU"
351int DSDPCreateDiagDSMatU(
int n,
struct DSDPDSMat_Ops* *dsmatops,
void**dsmat){
357 info=DiagMatCreate(n,&AA); DSDPCHKERR(info);
358 info=DDiagDSMatOpsInitU(&dsdiagmatopsu); DSDPCHKERR(info);
359 *dsmatops=&dsdiagmatopsu;
361 DSDPFunctionReturn(0);
364static int DiagRowNonzeros(
void*M,
int row,
double cols[],
int *ncols,
int nrows){
368 DSDPFunctionReturn(0);
371static int DiagAddDiag(
void*M,
double diag[],
int m){
372 diagmat* AA = (diagmat*)M;
379 DSDPFunctionReturn(0);
382static int DiagMultiply(
void*M,
double xin[],
double xout[],
int m){
383 diagmat* AA = (diagmat*)M;
388 xout[i]+=v[i]*xin[i];
390 DSDPFunctionReturn(0);
393static int DiagShiftDiag(
void*M,
double dd){
394 diagmat* AA = (diagmat*)M;
401 DSDPFunctionReturn(0);
404static int DiagAddElement(
void*M,
int ii,
double dd){
405 diagmat* AA = (diagmat*)M;
408 DSDPFunctionReturn(0);
411static int DiagMatOnProcessor(
void*A,
int row,
int*flag){
416static int DiagAssemble(
void*M){
420static struct DSDPSchurMat_Ops dsdpdiagschurops;
423#define __FUNCT__ "DSDPDiagSchurOps"
424static int DiagSchurOps(
struct DSDPSchurMat_Ops *sops){
429 sops->matzero=DiagMatZeros;
430 sops->mataddrow=DiagMatAddRow2;
431 sops->mataddelement=DiagMatAddElement;
432 sops->matdestroy=DiagMatDestroy;
433 sops->matfactor=DiagMatCholeskyFactor;
434 sops->matsolve=DiagMatSolve;
435 sops->matadddiagonal=DiagAddDiag;
436 sops->matshiftdiagonal=DiagShiftDiag;
437 sops->mataddelement=DiagAddElement;
438 sops->matscaledmultiply=DiagMultiply;
439 sops->matassemble=DiagAssemble;
440 sops->pmatonprocessor=DiagMatOnProcessor;
441 sops->matrownonzeros=DiagRowNonzeros;
443 sops->matname=diagmatname;
444 DSDPFunctionReturn(0);
448#define __FUNCT__ "DSDPGetDiagSchurMat"
449int DSDPGetDiagSchurMat(
int n,
struct DSDPSchurMat_Ops **sops,
void **data){
453 info=DiagMatCreate(n,&AA); DSDPCHKERR(info);
454 info=DiagSchurOps(&dsdpdiagschurops); DSDPCHKERR(info);
455 if (sops){*sops=&dsdpdiagschurops;}
456 if (data){*data=(
void*)AA;}
457 DSDPFunctionReturn(0);
int DSDPDSMatOpsInitialize(struct DSDPDSMat_Ops *aops)
Set pointers to null.
Structure of function pointers that each SDP Delta S matrix type (sparse, dense, diagonal,...
int DSDPDualMatOpsInitialize(struct DSDPDualMat_Ops *sops)
Set pointers to null.
Structure of function pointers that each symmetric positive definite matrix type (dense,...
int DSDPSchurMatOpsInitialize(struct DSDPSchurMat_Ops *dops)
Initialize function pointers to 0.
Function pointers that a Schur complement matrix (dense, sparse, parallel dense) must provide.
Error handling, printing, and profiling.
Symmetric Delta S matrix for one block in the semidefinite cone.
Table of function pointers that operate on the S matrix.