8 #define DSDPNoOperationError(a); { DSDPSETERR1(1,"Data natrix type: %s, Operation not defined\n",(a).dsdpops->matname); } 9 #define DSDPChkDataError(a,b); { if (b){ DSDPSETERR1(b,"Data natrix type: %s,\n",(a).dsdpops->matname);} } 15 #define __FUNCT__ "DSDPDataMatSetData" 31 (*A).dsdpops=&dsdpdatamatdefault;
35 DSDPFunctionReturn(0);
38 static char datamatnoname[20]=
"MATRIX NOT SET";
40 #define __FUNCT__ "DSDPDataMatOpsInitialize" 49 if (dops==NULL)
return 0;
56 dops->mataddrowmultiple=0;
57 dops->mataddallmultiple=0;
64 dops->matname=datamatnoname;
65 DSDPFunctionReturn(0);
70 #define __FUNCT__ "DSDPDataMatInitialize" 83 DSDPFunctionReturn(0);
88 #define __FUNCT__ "DSDPDataMatTest" 99 if (A.dsdpops==0 || A.dsdpops==&dsdpdatamatdefault){
100 }
else if (A.dsdpops->mattest){
101 info=(A.dsdpops->mattest)(A.matdata); DSDPChkDataError(A,info);
107 DSDPFunctionReturn(0);
111 #define __FUNCT__ "DSDPDataMatGetType" 115 DSDPFunctionReturn(0);
119 #define __FUNCT__ "DSDPDataMatGetRank" 132 if (A.dsdpops->matgetrank){
133 info=(A.dsdpops->matgetrank)(A.matdata,rank,n); DSDPChkDataError(A,info);
135 DSDPNoOperationError(A);
137 DSDPFunctionReturn(0);
141 #define __FUNCT__ "DSDPDataMatCountNonzeros" 155 if (A.dsdpops->matnnz){
156 info=(A.dsdpops->matnnz)(A.matdata,nnz,n); DSDPChkDataError(A,info);
158 DSDPNoOperationError(A);
160 DSDPFunctionReturn(0);
164 #define __FUNCT__ "DSDPDataMatFNorm2" 178 if (A.dsdpops->matfnorm2){
180 info=(A.dsdpops->matfnorm2)(A.matdata,n,fnorm2); DSDPChkDataError(A,info);
182 DSDPNoOperationError(A);
184 DSDPFunctionReturn(0);
189 #define __FUNCT__ "DSDPDataMatGetEig" 208 if (A.dsdpops->matgeteig){
209 info=SDPConeVecGetArray(V,&vv); DSDPCHKERR(info);
210 info=SDPConeVecGetSize(V,&n); DSDPCHKERR(info);
211 info=(A.dsdpops->matgeteig)(A.matdata,rr, eigenvalue, vv,n,S.indx+1,S.indx); DSDPChkDataError(A,info);
212 info=SDPConeVecRestoreArray(V,&vv); DSDPCHKERR(info);
214 DSDPNoOperationError(A);
216 DSDPFunctionReturn(0);
220 #define __FUNCT__ "DSDPDataMatFactor" 241 double *dwork3n,
int nd,
int* iwork,
int ni){
245 if (A.dsdpops->matfactor1){
246 info=(A.dsdpops->matfactor1)(A.matdata); DSDPChkDataError(A,info);
247 }
else if (A.dsdpops->matfactor2){
248 info=SDPConeVecGetSize(W,&n);
249 info=SDPConeVecGetArray(W,&dvecwork);
250 info=(A.dsdpops->matfactor2)(A.matdata,dworknn,nn0,dvecwork,n,dwork3n,nd,iwork,ni); DSDPChkDataError(A,info);
251 info=SDPConeVecRestoreArray(W,&dvecwork);
253 DSDPNoOperationError(A);
255 DSDPFunctionReturn(0);
259 #define __FUNCT__ "DSDPDataMatDot" 277 if (A.dsdpops->matdot){
278 info=(A.dsdpops->matdot)(A.matdata,x,nn,n,v); DSDPChkDataError(A,info);
280 DSDPNoOperationError(A);
282 DSDPFunctionReturn(0);
286 #define __FUNCT__ "DSDPDataMatVecVec" 302 if (A.dsdpops->matvecvec){
303 info=SDPConeVecGetSize(W,&n); DSDPCHKERR(info);
304 info=SDPConeVecGetArray(W,&x); DSDPCHKERR(info);
305 info=(A.dsdpops->matvecvec)(A.matdata,x,n,v); DSDPChkDataError(A,info);
306 info=SDPConeVecRestoreArray(W,&x); DSDPCHKERR(info);
308 DSDPNoOperationError(A);
310 DSDPFunctionReturn(0);
314 #define __FUNCT__ "DSDPDataMatMultiply" 329 if (A.dsdpops->matmultiply){
330 info=SDPConeVecGetSize(V1,&n); DSDPCHKERR(info);
331 info=SDPConeVecGetArray(V1,&vv1); DSDPCHKERR(info);
332 info=SDPConeVecGetArray(V2,&vv2); DSDPCHKERR(info);
333 info=(A.dsdpops->matmultiply)(A.matdata,vv1,vv2,n); DSDPChkDataError(A,info);
334 info=SDPConeVecRestoreArray(V1,&vv1); DSDPCHKERR(info);
335 info=SDPConeVecRestoreArray(V2,&vv2); DSDPCHKERR(info);
337 DSDPNoOperationError(A);
339 DSDPFunctionReturn(0);
343 #define __FUNCT__ "DSDPDataMatGetRowNonzeros" 358 if (A.dsdpops->matrownz){
359 info=(A.dsdpops->matrownz)(A.matdata,nrow,nz,nnz,nmax); DSDPChkDataError(A,info);
362 for (i=0;i<nmax;i++){
366 DSDPFunctionReturn(0);
370 #define __FUNCT__ "DSDPDataMatAddRowMultipleToVector" 375 if (A.dsdpops->mataddrowmultiple){
376 info=SDPConeVecGetArray(R,&vv);DSDPCHKERR(info);
377 info=SDPConeVecGetSize(R,&n);DSDPCHKERR(info);
378 info=(A.dsdpops->mataddrowmultiple)(A.matdata,nrow,ytmp,vv,n); DSDPChkDataError(A,info);
379 info=SDPConeVecRestoreArray(R,&vv);DSDPCHKERR(info);
381 DSDPNoOperationError(A);
383 DSDPFunctionReturn(0);
388 #define __FUNCT__ "DSDPDataMatAddMultiple" 405 if (A.dsdpops->mataddallmultiple){
406 info=(A.dsdpops->mataddallmultiple)(A.matdata,ytmp,v,nn,n); DSDPChkDataError(A,info);
408 DSDPNoOperationError(A);
410 DSDPFunctionReturn(0);
415 #define __FUNCT__ "DSDPDataMatView" 426 if (A.dsdpops->matview){
427 info=(A.dsdpops->matview)(A.matdata); DSDPChkDataError(A,info);
429 printf(
"No matrix view available for matrix type %s.\n",A.dsdpops->matname);
431 DSDPFunctionReturn(0);
436 #define __FUNCT__ "DSDPDataMatDestroy" 447 if ( (*A).dsdpops->matdestroy){
448 info=((*A).dsdpops->matdestroy)((*A).matdata); DSDPChkDataError(*A,info);
455 DSDPFunctionReturn(0);
int DSDPDataMatDot(DSDPDataMat A, double x[], int nn, int n, double *v)
Compute inner product of data with a dense matrix.
int DSDPDataMatFNorm2(DSDPDataMat A, int n, double *fnorm2)
Compute the square of the Frobenius norm.
Error handling, printing, and profiling.
int DSDPDataMatTest(DSDPDataMat A)
Test validity of matrix.
int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops *dops)
Initialize the table of function pointers for SDP Data matrices.
int DSDPDataMatGetRank(DSDPDataMat A, int *rank, int n)
Get the number of nonzero eigenvalues/eigenvectors for the matrix.
int DSDPDataMatGetEig(DSDPDataMat A, int rr, SDPConeVec V, DSDPIndex S, double *eigenvalue)
Get an eigenvalue/vector pair.
int DSDPDataMatGetRowNonzeros(DSDPDataMat A, int nrow, int nmax, int *nz, int *nnz)
Get sparsity pattern of a row of the matrix.
int DSDPDataMatInitialize(DSDPDataMat *A)
Set pointers to NULL;.
Vector whose length corresponds to dimension of a block in a cone.
Structure of function pointers that each SDP data matrix type (sparse, dense, constant, identity, ...) must implement.
Symmetric data matrix for one block in the semidefinite cone.
int DSDPDataMatCountNonzeros(DSDPDataMat A, int *nnz, int n)
Compute the square of the Frobenius norm.
int DSDPDataMatAddMultiple(DSDPDataMat A, double ytmp, double *v, int nn, int n)
Add a multiple the data matrix to the array.
int DSDPDataMatSetData(DSDPDataMat *A, struct DSDPDataMat_Ops *ops, void *data)
Set the opaque pointer and function pointers to the matrix.
The interface between the SDPCone and the data matrices.
int DSDPDataMatFactor(DSDPDataMat A, SDPConeVec W, double *dworknn, int nn0, double *dwork3n, int nd, int *iwork, int ni)
Do eigenvalue/vector or other factorization.
Table of function pointers that operate on the data matrix.
int DSDPDataMatDestroy(DSDPDataMat *A)
Free the data structures.
int DSDPDataMatVecVec(DSDPDataMat A, SDPConeVec W, double *v)
Compute w' A w.
int DSDPDataMatView(DSDPDataMat A)
Print matrix.