DSDP
|
00001 #include "dsdpdsmat_impl.h" 00002 #include "dsdpdsmat.h" 00003 #include "dsdpsys.h" 00008 #define DSDPNoOperationError(a); { DSDPSETERR1(1,"Delta S Matrix type: %s, Operation not defined\n",(a).dsdpops->matname); } 00009 #define DSDPChkMatError(a,b); { if (b){ DSDPSETERR1(b,"Delta S Matrix type: %s,\n",(a).dsdpops->matname); } } 00010 00011 #undef __FUNCT__ 00012 #define __FUNCT__ "DSDPDSMatGetType" 00013 int DSDPDSMatGetType(DSDPDSMat A, int *id){ 00014 DSDPFunctionBegin; 00015 *id=A.dsdpops->id; 00016 DSDPFunctionReturn(0); 00017 } 00018 00019 00020 #undef __FUNCT__ 00021 #define __FUNCT__ "DSDPDSMatSetData" 00022 00031 int DSDPDSMatSetData(DSDPDSMat *M, struct DSDPDSMat_Ops* ops, void*data){ 00032 int info; 00033 DSDPFunctionBegin; 00034 (*M).dsdpops=ops; 00035 (*M).matdata=data; 00036 info=DSDPDSMatTest(*M); DSDPChkMatError(*M,info); 00037 DSDPFunctionReturn(0); 00038 } 00039 00040 00041 #undef __FUNCT__ 00042 #define __FUNCT__ "DSDPDSMatGetSize" 00043 00050 int DSDPDSMatGetSize(DSDPDSMat A,int*n){ 00051 int info; 00052 DSDPFunctionBegin; 00053 if (A.dsdpops->matgetsize){ 00054 info=(A.dsdpops->matgetsize)(A.matdata,n); DSDPChkMatError(A,info); 00055 } else { 00056 DSDPNoOperationError(A); 00057 } 00058 DSDPFunctionReturn(0); 00059 } 00060 00061 00062 #undef __FUNCT__ 00063 #define __FUNCT__ "DSDPDSMatDestroy" 00064 00070 int DSDPDSMatDestroy(DSDPDSMat *A){ 00071 int info; 00072 DSDPFunctionBegin; 00073 if (!(*A).dsdpops){ return 0;} 00074 if ((*A).dsdpops->matdestroy){ 00075 info=((*A).dsdpops->matdestroy)((*A).matdata); DSDPChkMatError(*A,info); 00076 } else { 00077 /* DSDPNoOperationError(1); */ 00078 } 00079 info=DSDPDSMatInitialize(A); DSDPCHKERR(info); 00080 DSDPFunctionReturn(0); 00081 } 00082 00083 00084 #undef __FUNCT__ 00085 #define __FUNCT__ "DSDPDSMatView" 00086 00092 int DSDPDSMatView(DSDPDSMat A){ 00093 int info; 00094 if (A.dsdpops->matview){ 00095 info=(A.dsdpops->matview)(A.matdata); DSDPChkMatError(A,info); 00096 } else { 00097 printf("No viewer available for matrix type: %s",A.dsdpops->matname); 00098 } 00099 DSDPFunctionReturn(0); 00100 } 00101 00102 00103 #undef __FUNCT__ 00104 #define __FUNCT__ "DSDPDSMatZeroEntries" 00105 00110 int DSDPDSMatZeroEntries(DSDPDSMat A){ 00111 int info; 00112 DSDPFunctionBegin; 00113 if (A.dsdpops->matzeroentries){ 00114 info=(A.dsdpops->matzeroentries)(A.matdata); DSDPChkMatError(A,info); 00115 } else { 00116 DSDPNoOperationError(A); 00117 } 00118 DSDPFunctionReturn(0); 00119 } 00120 00121 #undef __FUNCT__ 00122 #define __FUNCT__ "DSDPDSMatSetArray" 00123 00130 int DSDPDSMatSetArray(DSDPDSMat A, DSDPVMat T){ 00131 int info,n,nn; 00132 double *ds; 00133 DSDPFunctionBegin; 00134 if (A.dsdpops->matseturmat){ 00135 info=DSDPVMatGetSize(T,&n);DSDPCHKERR(info); 00136 info=DSDPVMatGetArray(T, &ds, &nn); DSDPCHKERR(info); 00137 info=(A.dsdpops->matseturmat)(A.matdata,ds,nn,n); DSDPChkMatError(A,info); 00138 info=DSDPVMatRestoreArray(T, &ds, &nn); DSDPCHKERR(info); 00139 } else { 00140 DSDPNoOperationError(A); 00141 } 00142 DSDPFunctionReturn(0); 00143 } 00144 00145 #undef __FUNCT__ 00146 #define __FUNCT__ "DSDPDSMatMult" 00147 00154 int DSDPDSMatMult(DSDPDSMat A, SDPConeVec X, SDPConeVec Y){ 00155 int n,info; 00156 double *x,*y; 00157 00158 DSDPFunctionBegin; 00159 if (A.dsdpops->matmult){ 00160 info=SDPConeVecGetArray(X,&x); DSDPCHKERR(info); 00161 info=SDPConeVecGetArray(Y,&y); DSDPCHKERR(info); 00162 info=SDPConeVecGetSize(Y,&n); DSDPCHKERR(info); 00163 info=(A.dsdpops->matmult)(A.matdata,x,y,n); DSDPChkMatError(A,info); 00164 info=SDPConeVecRestoreArray(X,&x); DSDPCHKERR(info); 00165 info=SDPConeVecRestoreArray(Y,&y); DSDPCHKERR(info); 00166 } else { 00167 DSDPNoOperationError(A); 00168 } 00169 DSDPFunctionReturn(0); 00170 } 00171 00172 #undef __FUNCT__ 00173 #define __FUNCT__ "DSDPDSVecVec" 00174 00181 int DSDPDSMatVecVec(DSDPDSMat A, SDPConeVec X, double *vAv){ 00182 int n,info; 00183 double *x; 00184 00185 DSDPFunctionBegin; 00186 if (A.dsdpops->matvecvec){ 00187 info=SDPConeVecGetArray(X,&x); DSDPCHKERR(info); 00188 info=SDPConeVecGetSize(X,&n); DSDPCHKERR(info); 00189 info=(A.dsdpops->matvecvec)(A.matdata,x,n,vAv); DSDPChkMatError(A,info); 00190 info=SDPConeVecRestoreArray(X,&x); DSDPCHKERR(info); 00191 } else { 00192 DSDPNoOperationError(A); 00193 } 00194 DSDPFunctionReturn(0); 00195 } 00196 00197 #undef __FUNCT__ 00198 #define __FUNCT__ "DSDPDSMatCheck" 00199 int DSDPDSMatCheck(DSDPDSMat DS,SDPConeVec W1,SDPConeVec W2,DSDPVMat T){ 00200 DSDPFunctionBegin; 00201 DSDPFunctionReturn(0); 00202 } 00203 00204 00205 static struct DSDPDSMat_Ops dsdpmatops2; 00206 static const char* dsmatname="NOT SET YET"; 00207 #undef __FUNCT__ 00208 #define __FUNCT__ "DSDPDSMatOpsInitialize" 00209 00214 int DSDPDSMatOpsInitialize(struct DSDPDSMat_Ops*aops){ 00215 aops->matseturmat=0; 00216 aops->matview=0; 00217 aops->matdestroy=0; 00218 aops->matgetsize=0; 00219 aops->matzeroentries=0; 00220 aops->matmult=0; 00221 aops->mattest=0; 00222 aops->matvecvec=0; 00223 aops->id=0; 00224 aops->matname=dsmatname; 00225 return 0; 00226 } 00227 00228 #undef __FUNCT__ 00229 #define __FUNCT__ "DSDPDSMatTest" 00230 int DSDPDSMatTest(DSDPDSMat A){ 00231 int info; 00232 DSDPFunctionBegin; 00233 if (A.dsdpops==0 || A.dsdpops==&dsdpmatops2){ 00234 } else if (A.dsdpops->mattest){ 00235 DSDPLogInfo(0,120,"Start to set DS Matrix\n"); 00236 info=(A.dsdpops->mattest)(A.matdata); DSDPChkMatError(A,info); 00237 DSDPLogInfo(0,120,"Done set DS Matrix\n"); 00238 } else { 00239 /* 00240 DSDPNoOperationError(A); 00241 */ 00242 } 00243 DSDPFunctionReturn(0); 00244 } 00245 00246 00247 #undef __FUNCT__ 00248 #define __FUNCT__ "DSDPDSMatInitialize" 00249 00254 int DSDPDSMatInitialize(DSDPDSMat *B){ 00255 int info; 00256 DSDPFunctionBegin; 00257 info=DSDPDSMatOpsInitialize(&dsdpmatops2); DSDPCHKERR(info); 00258 info=DSDPDSMatSetData(B, &dsdpmatops2, 0); DSDPCHKERR(info); 00259 DSDPFunctionReturn(0); 00260 } 00261