DSDP
|
00001 #include "dsdpdatamat_impl.h" 00002 #include "dsdpdatamat.h" 00003 #include "dsdpsys.h" 00008 #define DSDPNoOperationError(a); { DSDPSETERR1(1,"Data natrix type: %s, Operation not defined\n",(a).dsdpops->matname); } 00009 #define DSDPChkDataError(a,b); { if (b){ DSDPSETERR1(b,"Data natrix type: %s,\n",(a).dsdpops->matname);} } 00010 00011 00012 static struct DSDPDataMat_Ops dsdpdatamatdefault; 00013 00014 #undef __FUNCT__ 00015 #define __FUNCT__ "DSDPDataMatSetData" 00016 00025 int DSDPDataMatSetData(DSDPDataMat *A, struct DSDPDataMat_Ops* ops, void*data){ 00026 int info; 00027 DSDPFunctionBegin; 00028 (*A).dsdpops=ops; 00029 (*A).matdata=data; 00030 if (ops==NULL){ 00031 (*A).dsdpops=&dsdpdatamatdefault; 00032 } 00033 info = DSDPDataMatOpsInitialize(&dsdpdatamatdefault); DSDPCHKERR(info); 00034 info=DSDPDataMatTest(*A);DSDPCHKERR(info); 00035 DSDPFunctionReturn(0); 00036 } 00037 00038 static char datamatnoname[20]="MATRIX NOT SET"; 00039 #undef __FUNCT__ 00040 #define __FUNCT__ "DSDPDataMatOpsInitialize" 00041 00047 int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops* dops){ 00048 DSDPFunctionBegin; 00049 if (dops==NULL) return 0; 00050 dops->matfactor1=0; 00051 dops->matfactor2=0; 00052 dops->matgetrank=0; 00053 dops->matgeteig=0; 00054 dops->matvecvec=0; 00055 dops->matdot=0; 00056 dops->mataddrowmultiple=0; 00057 dops->mataddallmultiple=0; 00058 dops->matdestroy=0; 00059 dops->matview=0; 00060 dops->matrownz=0; 00061 dops->matnnz=0; 00062 dops->matfnorm2=0; 00063 dops->id=0; 00064 dops->matname=datamatnoname; 00065 DSDPFunctionReturn(0); 00066 } 00067 00068 00069 #undef __FUNCT__ 00070 #define __FUNCT__ "DSDPDataMatInitialize" 00071 00078 int DSDPDataMatInitialize(DSDPDataMat *A){ 00079 int info; 00080 DSDPFunctionBegin; 00081 info = DSDPDataMatOpsInitialize(&dsdpdatamatdefault); DSDPCHKERR(info); 00082 info = DSDPDataMatSetData(A, &dsdpdatamatdefault,0); DSDPCHKERR(info); 00083 DSDPFunctionReturn(0); 00084 } 00085 00086 00087 #undef __FUNCT__ 00088 #define __FUNCT__ "DSDPDataMatTest" 00089 00096 int DSDPDataMatTest(DSDPDataMat A){ 00097 int info; 00098 DSDPFunctionBegin; 00099 if (A.dsdpops==0 || A.dsdpops==&dsdpdatamatdefault){ 00100 } else if (A.dsdpops->mattest){ 00101 info=(A.dsdpops->mattest)(A.matdata); DSDPChkDataError(A,info); 00102 } else { 00103 /* 00104 DSDPNoOperationError(A); 00105 */ 00106 } 00107 DSDPFunctionReturn(0); 00108 } 00109 00110 #undef __FUNCT__ 00111 #define __FUNCT__ "DSDPDataMatGetType" 00112 int DSDPDataMatGetType(DSDPDataMat A, int *id){ 00113 DSDPFunctionBegin; 00114 *id=A.dsdpops->id; 00115 DSDPFunctionReturn(0); 00116 } 00117 00118 #undef __FUNCT__ 00119 #define __FUNCT__ "DSDPDataMatGetRank" 00120 00129 int DSDPDataMatGetRank(DSDPDataMat A, int *rank, int n){ 00130 int info; 00131 DSDPFunctionBegin; 00132 if (A.dsdpops->matgetrank){ 00133 info=(A.dsdpops->matgetrank)(A.matdata,rank,n); DSDPChkDataError(A,info); 00134 } else { 00135 DSDPNoOperationError(A); 00136 } 00137 DSDPFunctionReturn(0); 00138 } 00139 00140 #undef __FUNCT__ 00141 #define __FUNCT__ "DSDPDataMatCountNonzeros" 00142 00152 int DSDPDataMatCountNonzeros(DSDPDataMat A, int *nnz, int n){ 00153 int info; 00154 DSDPFunctionBegin; 00155 if (A.dsdpops->matnnz){ 00156 info=(A.dsdpops->matnnz)(A.matdata,nnz,n); DSDPChkDataError(A,info); 00157 } else { 00158 DSDPNoOperationError(A); 00159 } 00160 DSDPFunctionReturn(0); 00161 } 00162 00163 #undef __FUNCT__ 00164 #define __FUNCT__ "DSDPDataMatFNorm2" 00165 00175 int DSDPDataMatFNorm2(DSDPDataMat A, int n, double *fnorm2){ 00176 int info; 00177 DSDPFunctionBegin; 00178 if (A.dsdpops->matfnorm2){ 00179 *fnorm2=0.0; 00180 info=(A.dsdpops->matfnorm2)(A.matdata,n,fnorm2); DSDPChkDataError(A,info); 00181 } else { 00182 DSDPNoOperationError(A); 00183 } 00184 DSDPFunctionReturn(0); 00185 } 00186 00187 00188 #undef __FUNCT__ 00189 #define __FUNCT__ "DSDPDataMatGetEig" 00190 00204 int DSDPDataMatGetEig(DSDPDataMat A, int rr, SDPConeVec V, DSDPIndex S, double *eigenvalue){ 00205 int info,n; 00206 double *vv; 00207 DSDPFunctionBegin; 00208 if (A.dsdpops->matgeteig){ 00209 info=SDPConeVecGetArray(V,&vv); DSDPCHKERR(info); 00210 info=SDPConeVecGetSize(V,&n); DSDPCHKERR(info); 00211 info=(A.dsdpops->matgeteig)(A.matdata,rr, eigenvalue, vv,n,S.indx+1,S.indx); DSDPChkDataError(A,info); 00212 info=SDPConeVecRestoreArray(V,&vv); DSDPCHKERR(info); 00213 } else { 00214 DSDPNoOperationError(A); 00215 } 00216 DSDPFunctionReturn(0); 00217 } 00218 00219 #undef __FUNCT__ 00220 #define __FUNCT__ "DSDPDataMatFactor" 00221 00240 int DSDPDataMatFactor(DSDPDataMat A, SDPConeVec W, double*dworknn, int nn0, 00241 double *dwork3n, int nd, int* iwork, int ni){ 00242 int info,n; 00243 double *dvecwork; 00244 DSDPFunctionBegin; 00245 if (A.dsdpops->matfactor1){ 00246 info=(A.dsdpops->matfactor1)(A.matdata); DSDPChkDataError(A,info); 00247 } else if (A.dsdpops->matfactor2){ 00248 info=SDPConeVecGetSize(W,&n); 00249 info=SDPConeVecGetArray(W,&dvecwork); 00250 info=(A.dsdpops->matfactor2)(A.matdata,dworknn,nn0,dvecwork,n,dwork3n,nd,iwork,ni); DSDPChkDataError(A,info); 00251 info=SDPConeVecRestoreArray(W,&dvecwork); 00252 } else { 00253 DSDPNoOperationError(A); 00254 } 00255 DSDPFunctionReturn(0); 00256 } 00257 00258 #undef __FUNCT__ 00259 #define __FUNCT__ "DSDPDataMatDot" 00260 00273 int DSDPDataMatDot(DSDPDataMat A, double x[], int nn, int n, double *v){ 00274 int info; 00275 00276 DSDPFunctionBegin; 00277 if (A.dsdpops->matdot){ 00278 info=(A.dsdpops->matdot)(A.matdata,x,nn,n,v); DSDPChkDataError(A,info); 00279 } else { 00280 DSDPNoOperationError(A); 00281 } 00282 DSDPFunctionReturn(0); 00283 } 00284 00285 #undef __FUNCT__ 00286 #define __FUNCT__ "DSDPDataMatVecVec" 00287 00297 int DSDPDataMatVecVec(DSDPDataMat A, SDPConeVec W, double *v){ 00298 int info,n; 00299 double *x; 00300 00301 DSDPFunctionBegin; 00302 if (A.dsdpops->matvecvec){ 00303 info=SDPConeVecGetSize(W,&n); DSDPCHKERR(info); 00304 info=SDPConeVecGetArray(W,&x); DSDPCHKERR(info); 00305 info=(A.dsdpops->matvecvec)(A.matdata,x,n,v); DSDPChkDataError(A,info); 00306 info=SDPConeVecRestoreArray(W,&x); DSDPCHKERR(info); 00307 } else { 00308 DSDPNoOperationError(A); 00309 } 00310 DSDPFunctionReturn(0); 00311 } 00312 00313 #undef __FUNCT__ 00314 #define __FUNCT__ "DSDPDataMatMultiply" 00315 /* 00316 \fn int DSDPDataMatMultiply(DSDPDataMat A, SDPConeVec V1, SDPConeVec V2); 00317 00318 \brief Compute V2 = A*V1; 00319 \param A symmetric data matrix 00320 \param V1 in vector 00321 \param V2 the product 00322 Not needed. 00323 */ 00324 int DSDPDataMatMultiply(DSDPDataMat A, SDPConeVec V1, SDPConeVec V2){ 00325 int info,n; 00326 double *vv1,*vv2; 00327 00328 DSDPFunctionBegin; 00329 if (A.dsdpops->matmultiply){ 00330 info=SDPConeVecGetSize(V1,&n); DSDPCHKERR(info); 00331 info=SDPConeVecGetArray(V1,&vv1); DSDPCHKERR(info); 00332 info=SDPConeVecGetArray(V2,&vv2); DSDPCHKERR(info); 00333 info=(A.dsdpops->matmultiply)(A.matdata,vv1,vv2,n); DSDPChkDataError(A,info); 00334 info=SDPConeVecRestoreArray(V1,&vv1); DSDPCHKERR(info); 00335 info=SDPConeVecRestoreArray(V2,&vv2); DSDPCHKERR(info); 00336 } else { 00337 DSDPNoOperationError(A); 00338 } 00339 DSDPFunctionReturn(0); 00340 } 00341 00342 #undef __FUNCT__ 00343 #define __FUNCT__ "DSDPDataMatGetRowNonzeros" 00344 00355 int DSDPDataMatGetRowNonzeros(DSDPDataMat A, int nrow, int nmax, int *nz, int *nnz){ 00356 int i,info; 00357 DSDPFunctionBegin; 00358 if (A.dsdpops->matrownz){ 00359 info=(A.dsdpops->matrownz)(A.matdata,nrow,nz,nnz,nmax); DSDPChkDataError(A,info); 00360 } else { 00361 *nnz=nmax; 00362 for (i=0;i<nmax;i++){ 00363 nz[i]++; 00364 } 00365 } 00366 DSDPFunctionReturn(0); 00367 } 00368 00369 #undef __FUNCT__ 00370 #define __FUNCT__ "DSDPDataMatAddRowMultipleToVector" 00371 int DSDPDataMatAddRowMultipleToVector(DSDPDataMat A, int nrow, double ytmp, SDPConeVec R){ 00372 int info,n; 00373 double *vv; 00374 DSDPFunctionBegin; 00375 if (A.dsdpops->mataddrowmultiple){ 00376 info=SDPConeVecGetArray(R,&vv);DSDPCHKERR(info); 00377 info=SDPConeVecGetSize(R,&n);DSDPCHKERR(info); 00378 info=(A.dsdpops->mataddrowmultiple)(A.matdata,nrow,ytmp,vv,n); DSDPChkDataError(A,info); 00379 info=SDPConeVecRestoreArray(R,&vv);DSDPCHKERR(info); 00380 } else { 00381 DSDPNoOperationError(A); 00382 } 00383 DSDPFunctionReturn(0); 00384 } 00385 00386 00387 #undef __FUNCT__ 00388 #define __FUNCT__ "DSDPDataMatAddMultiple" 00389 00402 int DSDPDataMatAddMultiple(DSDPDataMat A, double ytmp, double *v, int nn, int n){ 00403 int info; 00404 DSDPFunctionBegin; 00405 if (A.dsdpops->mataddallmultiple){ 00406 info=(A.dsdpops->mataddallmultiple)(A.matdata,ytmp,v,nn,n); DSDPChkDataError(A,info); 00407 } else { 00408 DSDPNoOperationError(A); 00409 } 00410 DSDPFunctionReturn(0); 00411 } 00412 00413 00414 #undef __FUNCT__ 00415 #define __FUNCT__ "DSDPDataMatView" 00416 00423 int DSDPDataMatView(DSDPDataMat A){ 00424 int info; 00425 DSDPFunctionBegin; 00426 if (A.dsdpops->matview){ 00427 info=(A.dsdpops->matview)(A.matdata); DSDPChkDataError(A,info); 00428 } else { 00429 printf("No matrix view available for matrix type %s.\n",A.dsdpops->matname); 00430 } 00431 DSDPFunctionReturn(0); 00432 } 00433 00434 00435 #undef __FUNCT__ 00436 #define __FUNCT__ "DSDPDataMatDestroy" 00437 00444 int DSDPDataMatDestroy(DSDPDataMat* A){ 00445 int info; 00446 DSDPFunctionBegin; 00447 if ( (*A).dsdpops->matdestroy){ 00448 info=((*A).dsdpops->matdestroy)((*A).matdata); DSDPChkDataError(*A,info); 00449 } else { 00450 /* DSDPNoOperationError(*A); */ 00451 } 00452 info=DSDPDataMatInitialize(A); DSDPCHKERR(info); 00453 /* info=DSDPZeroMatCreate(0,A); DSDPCHKERR(info); */ 00454 00455 DSDPFunctionReturn(0); 00456 } 00457