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);
38static 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 DSDPDataMatAddMultiple(DSDPDataMat A, double ytmp, double *v, int nn, int n)
Add a multiple the data matrix to the array.
int DSDPDataMatVecVec(DSDPDataMat A, SDPConeVec W, double *v)
Compute w' A w.
int DSDPDataMatDestroy(DSDPDataMat *A)
Free the data structures.
int DSDPDataMatGetRowNonzeros(DSDPDataMat A, int nrow, int nmax, int *nz, int *nnz)
Get sparsity pattern of a row of the matrix.
int DSDPDataMatGetEig(DSDPDataMat A, int rr, SDPConeVec V, DSDPIndex S, double *eigenvalue)
Get an eigenvalue/vector pair.
int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops *dops)
Initialize the table of function pointers for SDP Data matrices.
int DSDPDataMatView(DSDPDataMat A)
Print matrix.
int DSDPDataMatSetData(DSDPDataMat *A, struct DSDPDataMat_Ops *ops, void *data)
Set the opaque pointer and function pointers to the matrix.
int DSDPDataMatGetRank(DSDPDataMat A, int *rank, int n)
Get the number of nonzero eigenvalues/eigenvectors for the matrix.
int DSDPDataMatDot(DSDPDataMat A, double x[], int nn, int n, double *v)
Compute inner product of data with a dense matrix.
int DSDPDataMatCountNonzeros(DSDPDataMat A, int *nnz, int n)
Compute the square of the Frobenius norm.
int DSDPDataMatFNorm2(DSDPDataMat A, int n, double *fnorm2)
Compute the square of the Frobenius norm.
int DSDPDataMatTest(DSDPDataMat A)
Test validity of matrix.
int DSDPDataMatFactor(DSDPDataMat A, SDPConeVec W, double *dworknn, int nn0, double *dwork3n, int nd, int *iwork, int ni)
Do eigenvalue/vector or other factorization.
int DSDPDataMatInitialize(DSDPDataMat *A)
Set pointers to NULL;.
The interface between the SDPCone and the data matrices.
Structure of function pointers that each SDP data matrix type (sparse, dense, constant,...
Error handling, printing, and profiling.
Symmetric data matrix for one block in the semidefinite cone.
Table of function pointers that operate on the data matrix.
Vector whose length corresponds to dimension of a block in a cone.