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" 82 info = DSDPDataMatSetData(A, &dsdpdatamatdefault,0); DSDPCHKERR(info);
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,...
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.
The interface between the SDPCone and the data matrices.
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.