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
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
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