18 static int DiagMatCreate(
int,diagmat**);
19 static int DiagMatMult(
void*,
double[],
double[],
int);
20 static int DiagMatGetSize(
void*,
int *);
21 static int DiagMatAddRow2(
void*,
int,
double,
double[],
int);
22 static int DiagMatDestroy(
void*);
23 static int DiagMatView(
void*);
24 static int DiagMatLogDeterminant(
void*,
double *);
28 static 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;
40 static 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);
49 static 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;
66 static int DiagMatGetSize(
void *AA,
int *n){
67 diagmat* A=(diagmat*) AA;
72 static 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]);
81 static int DiagMatAddRow2(
void* AA,
int nrow,
double dd,
double row[],
int n){
82 diagmat* A=(diagmat*) AA;
83 A->val[nrow] += dd*row[nrow];
88 static int DiagMatAddElement(
void*A,
int nrow,
double dd){
89 diagmat* AA = (diagmat*)A;
94 static int DiagMatZeros(
void*A){
95 diagmat* AA = (diagmat*)A;
97 memset(AA->val,0,n*
sizeof(
double));
101 static int DiagMatSolve(
void* A,
double b[],
double x[],
int n){
102 diagmat* AA = (diagmat*)A;
111 static 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++){
123 static int DiagMatCholeskySolveBackward(
void* A,
double b[],
double x[],
int n){
131 static int DiagMatInvert(
void *A){
135 static int DiagMatCholeskyFactor(
void*A,
int *flag){
136 diagmat* AA = (diagmat*)A;
141 if (v[i]<=0){ *flag=i+1;
break;}
146 static 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;
158 static int DiagMatTakeUREntriesP(
void*A,
double dd[],
int nn,
int n){
159 diagmat* AA = (diagmat*)A;
168 static int DiagMatTakeUREntriesU(
void*A,
double dd[],
int nn,
int n){
169 diagmat* AA = (diagmat*)A;
178 static int DiagMatInverseAddP(
void*A,
double alpha,
double dd[],
int nn,
int n){
179 diagmat* AA = (diagmat*)A;
184 dd[ii]+=alpha/val[i];
188 static 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];
198 static int DiagMatFull(
void*A,
int* dfull){
205 static 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" 250 int 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" 271 int 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);
290 static int DiagMatVecVec(
void*A,
double x[],
int n,
double *vv){
291 diagmat* AA = (diagmat*)A;
292 double *v=AA->val,vAv=0;
301 static 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);
316 static 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" 337 int 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" 351 int 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);
364 static int DiagRowNonzeros(
void*M,
int row,
double cols[],
int *ncols,
int nrows){
368 DSDPFunctionReturn(0);
371 static int DiagAddDiag(
void*M,
double diag[],
int m){
372 diagmat* AA = (diagmat*)M;
379 DSDPFunctionReturn(0);
382 static 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);
393 static int DiagShiftDiag(
void*M,
double dd){
394 diagmat* AA = (diagmat*)M;
401 DSDPFunctionReturn(0);
404 static int DiagAddElement(
void*M,
int ii,
double dd){
405 diagmat* AA = (diagmat*)M;
408 DSDPFunctionReturn(0);
411 static int DiagMatOnProcessor(
void*A,
int row,
int*flag){
416 static int DiagAssemble(
void*M){
420 static struct DSDPSchurMat_Ops dsdpdiagschurops;
423 #define __FUNCT__ "DSDPDiagSchurOps" 424 static 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" 449 int 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 DSDPDualMatOpsInitialize(struct DSDPDualMat_Ops *sops)
Set pointers to null.
Error handling, printing, and profiling.
Function pointers that a Schur complement matrix (dense, sparse, parallel dense) must provide.
Structure of function pointers that each SDP Delta S matrix type (sparse, dense, diagonal,...
Table of function pointers that operate on the S matrix.
int DSDPDSMatOpsInitialize(struct DSDPDSMat_Ops *aops)
Set pointers to null.
int DSDPSchurMatOpsInitialize(struct DSDPSchurMat_Ops *dops)
Initialize function pointers to 0.
Structure of function pointers that each symmetric positive definite matrix type (dense,...
Symmetric Delta S matrix for one block in the semidefinite cone.