dsdpdatamat.c

Go to the documentation of this file.
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 

Generated on Sun Mar 23 07:30:49 2008 for DSDP by  doxygen 1.5.5