00001 #include "dsdp5.h"
00006 static void DprintfD(FILE*fp, double d1){
00007 int i1=(int)d1,i2=(int)(d1*100),i3=(int)(d1*10000),i4=(int)(d1*10000000);
00008 if ( d1==(double)i1){ fprintf(fp,"%2.0f ",d1);
00009 } else if (d1==(double)i2/100.0){ fprintf(fp,"%4.2f ",d1);
00010 } else if (d1==(double)i3/10000.0){ fprintf(fp,"%6.4f ",d1);
00011 } else if (d1==(double)i4/1000000.0){ fprintf(fp,"%8.6f ",d1);
00012 } else { fprintf(fp,"%22.22e ",d1);
00013 }
00014 return;
00015 }
00016
00017 static void Dprintf(FILE*fp, int i1, int i2, int i3, int i4, double d1){
00018 if (fabs(d1)<1e-30){return;}
00019 fprintf(fp,"%d %d %d %d ",i1,i2,i3+1,i4+1);
00020 if (i1==0)
00021 DprintfD(fp,-d1);
00022 else
00023 DprintfD(fp,d1);
00024 fprintf(fp,"\n");
00025 return;
00026 }
00027
00028
00029 #undef __FUNCT__
00030 #define __FUNCT__ "DPrintUpperRightMatrix"
00031 static void DPrintUpperRightMatrix(int constraint, int block, double amat[], int n, FILE*fp){
00032 int col,row;
00033 for (row=0;row<n;row++){
00034 for (col=0;col<=row;col++){
00035 if (fabs(amat[col])>1.0e-20){
00036 Dprintf(fp,constraint,block,col,row,amat[col]);
00037 }
00038 }
00039 amat+=(row+1);
00040 }
00041 return;
00042 }
00043
00044 #undef __FUNCT__
00045 #define __FUNCT__ "DPrintUpperFullMatrix"
00046 static void DPrintUpperFullMatrix(int constraint, int block, double amat[], int n, FILE*fp){
00047 int col,row;
00048 for (row=0;row<n;row++){
00049 for (col=0;col<=row;col++){
00050 if (fabs(amat[col])>1.0e-20){
00051 Dprintf(fp,constraint,block,col,row,amat[col]);
00052 }
00053 }
00054 amat+=n;
00055 }
00056 return;
00057 }
00058
00059 #undef __FUNCT__
00060 #define __FUNCT__ "DPrintMatrix"
00061 static void DPrintMatrix(char UPLQ, int constraint, int block, double amat[], int n, FILE*fp){
00062 if (UPLQ=='P'){
00063 DPrintUpperRightMatrix(constraint,block,amat,n,fp);
00064 } else if (UPLQ=='U'){
00065 DPrintUpperFullMatrix(constraint,block,amat,n,fp);
00066 }
00067 return;
00068 }
00069
00070 #undef __FUNCT__
00071 #define __FUNCT__ "DPrintLPArray"
00072 static int DPrintLPArray(int cc, int block, double *vv, int n, FILE *fp ){
00073 int i;
00074 for (i=0;i<n;i++){
00075 if ( fabs(vv[i]) > 0){
00076 Dprintf(fp,cc,block,i,i,vv[i]);
00077 }
00078 }
00079 return 0;
00080 }
00081
00082
00083 #undef __FUNCT__
00084 #define __FUNCT__ "DSDPPrintSolution"
00085
00094 int DSDPPrintSolution(FILE *fp,DSDP dsdp,SDPCone sdpcone, LPCone lpcone){
00095 int i,kk,info,n,nn,lpn=0,nblocks,nvars;
00096 double *ss,*xx,*y,*lparray;
00097 char UPLQ;
00098
00099 info=DSDPGetNumberOfVariables(dsdp,&nvars);DSDPCHKERR(info);
00100 DSDPCALLOC2(&y,double,(nvars+2),&info);DSDPCHKERR(info);
00101 info=SDPConeGetNumberOfBlocks(sdpcone,&nblocks);DSDPCHKERR(info);
00102
00103 if (lpcone){info=LPConeGetXArray(lpcone,&xx,&lpn);DSDPCHKERR(info);nblocks--;}
00104 DSDPCALLOC2(&lparray,double,(lpn+1),&info);DSDPCHKERR(info);
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 info=DSDPGetY(dsdp,y+1,nvars);DSDPCHKERR(info);
00116 y[0]=1.0;y[nvars+1]=0;
00117 info=DSDPGetR(dsdp,y+nvars+1);DSDPCHKERR(info);
00118 for (i=0; i<nvars; i++){ DprintfD(fp,-y[i+1]);}
00119 fprintf(fp," \n");
00120
00121
00122 for (kk=0;kk<nblocks;kk++){
00123 info=SDPConeGetBlockSize(sdpcone,kk,&n);DSDPCHKERR(info);
00124 info=SDPConeGetXArray(sdpcone,kk,&ss,&nn);DSDPCHKERR(info);
00125 info=SDPConeComputeS(sdpcone,kk,y[0],y+1,nvars,y[nvars+1],n,ss,nn);DSDPCHKERR(info);
00126 info=SDPConeGetStorageFormat(sdpcone,kk,&UPLQ);DSDPCHKERR(info);
00127 DPrintMatrix(UPLQ,1,kk+1,ss,n,fp);
00128 info=SDPConeRestoreXArray(sdpcone,kk,&ss,&nn);DSDPCHKERR(info);
00129 }
00130 if (lpcone){
00131 info=LPConeCopyS(lpcone,lparray,lpn);DSDPCHKERR(info);
00132 info=DPrintLPArray(1,nblocks+1,lparray,lpn,fp);DSDPCHKERR(info);
00133 }
00134
00135 info=DSDPComputeX(dsdp);DSDPCHKERR(info);
00136
00137 for (kk=0; kk<nblocks; kk++){
00138 info=SDPConeGetBlockSize(sdpcone,kk,&n);DSDPCHKERR(info);
00139 info=SDPConeGetStorageFormat(sdpcone,kk,&UPLQ);DSDPCHKERR(info);
00140 info=SDPConeGetXArray(sdpcone,kk,&xx,&nn);DSDPCHKERR(info);
00141 DPrintMatrix(UPLQ,2,kk+1,xx,n,fp);
00142 info=SDPConeRestoreXArray(sdpcone,kk,&xx,&nn);DSDPCHKERR(info);
00143 }
00144 if (lpcone){
00145 info=LPConeGetXArray(lpcone,&xx,&nn);DSDPCHKERR(info);
00146 info=DPrintLPArray(2,nblocks+1,xx,nn,fp);DSDPCHKERR(info);
00147 }
00148
00149 DSDPFREE(&y,&info);
00150 return 0;
00151 }
00152
00153
00154 #undef __FUNCT__
00155 #define __FUNCT__ "DSDPPrintData"
00156
00164 int DSDPPrintData(DSDP dsdp, SDPCone sdpcone, LPCone lpcone){
00165
00166 int info,nblocks,i,nvars,n,nn,kk,lpblock=0,lpn=0;
00167 double *ss,*y=0,*vv=0;
00168 char filename[100]="";
00169 char UPLQ;
00170 FILE *fp;
00171
00172 info=DSDPGetNumberOfVariables(dsdp,&nvars);DSDPCHKERR(info);
00173 DSDPCALLOC2(&y,double,(nvars+3),&info);DSDPCHKERR(info);
00174 info=SDPConeGetNumberOfBlocks(sdpcone,&nblocks);DSDPCHKERR(info);
00175 strncat(filename,"output.sdpa",50);
00176
00177 fp=fopen("input.sdpa","w");
00178 if (lpcone){
00179 info=LPConeGetDimension(lpcone,&lpn);DSDPCHKERR(info);
00180 DSDPCALLOC2(&vv,double,lpn,&info);DSDPCHKERR(info);
00181 lpblock=1;
00182 info=SDPConeGetBlockSize(sdpcone,nblocks-1,&n);DSDPCHKERR(info);
00183 if (n==0){nblocks--;}
00184 }
00185 fprintf(fp,"%d \n%d\n",nvars,nblocks+lpblock);
00186 for (kk=0;kk<nblocks;kk++){
00187 info=SDPConeGetBlockSize(sdpcone,kk,&n);DSDPCHKERR(info);
00188 fprintf(fp,"%d ",n);
00189 }
00190 if (lpcone){
00191 fprintf(fp,"%d ",-lpn);
00192 }
00193 fprintf(fp,"\n");
00194 info=DSDPCopyB(dsdp,y,nvars);
00195 for (i=0;i<nvars;i++){
00196 DprintfD(fp,y[i]);
00197 }
00198 fprintf(fp,"\n");
00199
00200 for (i=0;i<=nvars;i++){
00201 for (kk=0;kk<nvars+2;kk++) y[kk]=0.0;
00202 if (i==0){y[i]=1.0;} else {y[i]=-1.0; }
00203 for (kk=0;kk<nblocks;kk++){
00204 info=SDPConeGetBlockSize(sdpcone,kk,&n);DSDPCHKERR(info);
00205 info=SDPConeGetXArray(sdpcone,kk,&ss,&nn);DSDPCHKERR(info);
00206 info=SDPConeComputeS(sdpcone,kk,y[0],y+1,nvars,y[nvars+1],n,ss,nn);DSDPCHKERR(info);
00207 info=SDPConeGetStorageFormat(sdpcone,kk,&UPLQ);DSDPCHKERR(info);
00208 DPrintMatrix(UPLQ,i,kk+1,ss,n,fp);
00209 }
00210 }
00211 if (lpcone && lpn>0){
00212 info=LPConeGetDimension(lpcone,&lpn);DSDPCHKERR(info);
00213 for (i=0;i<=nvars;i++){
00214 info=LPConeGetData(lpcone,i,vv,lpn);DSDPCHKERR(info);
00215 info=DPrintLPArray(i,nblocks+1,vv,lpn,fp);DSDPCHKERR(info);
00216 }
00217 }
00218 DSDPFREE(&y,&info);
00219 if (vv){
00220 DSDPFREE(&vv,&info);
00221 }
00222 fclose(fp);
00223
00224 return 0;
00225 }