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
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
00317
00318
00319
00320
00321
00322
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
00451 }
00452 info=DSDPDataMatInitialize(A); DSDPCHKERR(info);
00453
00454
00455 DSDPFunctionReturn(0);
00456 }
00457