DSDP
|
00001 #include "dsdpdatamat.h" 00002 #include "dsdpsys.h" 00003 #include "dsdp5.h" 00004 00010 extern int DSDPGetZeroDataMatOps(struct DSDPDataMat_Ops**); 00011 extern int DSDPGetConstantMat(int,double,char,struct DSDPDataMat_Ops**,void**); 00012 00013 extern int DSDPGetVechMat(int,int,double,const int[], const double[],int, struct DSDPDataMat_Ops**,void**); 00014 extern int DSDPGetVecUMat(int,int,double,const int[], const double[],int, struct DSDPDataMat_Ops**,void**); 00015 00016 extern int DSDPGetIdentityDataMatP(int,double,struct DSDPDataMat_Ops**,void**); 00017 extern int DSDPGetIdentityDataMatF(int,double,struct DSDPDataMat_Ops**,void**); 00018 00019 extern int DSDPGetDMat(int,double,double[],struct DSDPDataMat_Ops**,void**); 00020 00021 extern int DSDPGetR1PMat(int,double,int,const int[],const double[],int,struct DSDPDataMat_Ops**,void**); 00022 extern int DSDPGetR1UMat(int,double,int,const int[],const double[],int,struct DSDPDataMat_Ops**,void**); 00023 00024 extern int SDPConeAddDataMatrix(SDPCone,int, int, int, char, struct DSDPDataMat_Ops*, void*); 00025 extern int SDPConeSetRMatrix(SDPCone,int,int,char,struct DSDPDataMat_Ops*,void*); 00026 00027 00028 #undef __FUNCT__ 00029 #define __FUNCT__ "SDPConeAddASparseVecMat" 00030 00049 int SDPConeAddASparseVecMat(SDPCone sdpcone,int blockj, int vari, int n, 00050 double alpha, int ishift, 00051 const int ind[], const double val[], int nnz){ 00052 00053 int info; 00054 char UPLQ; 00055 void* dmat=0; 00056 struct DSDPDataMat_Ops* dmatops=0; 00057 00058 DSDPFunctionBegin; 00059 info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ); DSDPCHKERR(info); 00060 DSDPLogInfo(0,20,"Set sparse matrix: Block: %d, Variable %d, size: %d, Nonzeros: %d .\n",blockj,vari,n,nnz); 00061 switch (UPLQ){ 00062 case 'P': 00063 info=DSDPGetVechMat(n,ishift,alpha,ind,val,nnz,&dmatops,&dmat); DSDPCHKERR(info); 00064 break; 00065 case 'U': 00066 info=DSDPGetVecUMat(n,ishift,alpha,ind,val,nnz,&dmatops,&dmat); DSDPCHKERR(info); 00067 break; 00068 } 00069 info=SDPConeAddDataMatrix(sdpcone,blockj,vari,n,UPLQ,dmatops,dmat); DSDPCHKERR(info); 00070 DSDPFunctionReturn(0); 00071 } 00072 00073 #undef __FUNCT__ 00074 #define __FUNCT__ "SDPConeAddSparseVecMat" 00075 /* Needed for backward compatibility */ 00076 int SDPConeAddSparseVecMat(SDPCone sdpcone,int blockj, int vari, int n, 00077 int ishift,const int ind[], const double val[], int nnz){ 00078 00079 int info; 00080 00081 DSDPFunctionBegin; 00082 info= SDPConeAddASparseVecMat(sdpcone,blockj,vari,n, 00083 1.0,ishift,ind,val,nnz);DSDPCHKERR(info); 00084 DSDPFunctionReturn(0); 00085 } 00086 00087 #undef __FUNCT__ 00088 #define __FUNCT__ "SDPConeSetASparseVecMat" 00089 00152 int SDPConeSetASparseVecMat(SDPCone sdpcone,int blockj, int vari, int n, 00153 double alpha,int ishift, 00154 const int ind[], const double val[], int nnz){ 00155 00156 int info; 00157 DSDPFunctionBegin; 00158 info=SDPConeRemoveDataMatrix(sdpcone,blockj,vari); DSDPCHKERR(info); 00159 info=SDPConeAddASparseVecMat(sdpcone,blockj,vari,n,alpha,ishift,ind,val,nnz); DSDPCHKERR(info); 00160 DSDPFunctionReturn(0); 00161 } 00162 00163 #undef __FUNCT__ 00164 #define __FUNCT__ "SDPConeSetSparseVecMat" 00165 /* Needed for backward compatibility */ 00166 int SDPConeSetSparseVecMat(SDPCone sdpcone,int blockj, int vari, int n, 00167 int ishift,const int ind[], const double val[], int nnz){ 00168 00169 int info; 00170 DSDPFunctionBegin; 00171 info=SDPConeSetASparseVecMat(sdpcone,blockj,vari,n,1.0,ishift,ind,val,nnz); DSDPCHKERR(info); 00172 DSDPFunctionReturn(0); 00173 } 00174 00175 00176 #undef __FUNCT__ 00177 #define __FUNCT__ "SDPConeAddADenseVecMat" 00178 00203 int SDPConeAddADenseVecMat(SDPCone sdpcone,int blockj, int vari,int n, 00204 double alpha,double val[], int nnz){ 00205 int info; 00206 char UPLQ; 00207 void* dmat=0; 00208 struct DSDPDataMat_Ops* dmatops=0; 00209 00210 DSDPFunctionBegin; 00211 info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ); DSDPCHKERR(info); 00212 DSDPLogInfo(0,20,"Set dense matrix: Block: %d, Variable %d, size: %d, Nonzeros: %d .\n",blockj,vari,n,nnz); 00213 switch (UPLQ){ 00214 case 'P': 00215 info=DSDPGetDMat(n,alpha,val,&dmatops,&dmat); DSDPCHKERR(info); 00216 break; 00217 case 'U': 00218 DSDPSETERR(1,"Dense U Mat type does not exist.\n"); 00219 break; 00220 } 00221 info=SDPConeAddDataMatrix(sdpcone,blockj,vari,n,UPLQ,dmatops,dmat); DSDPCHKERR(info); 00222 DSDPFunctionReturn(0); 00223 } 00224 00225 #undef __FUNCT__ 00226 #define __FUNCT__ "SDPConeAddDenseVecMat" 00227 /* Needed for backward compatibility */ 00228 int SDPConeAddDenseVecMat(SDPCone sdpcone,int blockj, int vari,int n, 00229 double val[], int nnz){ 00230 int info; 00231 DSDPFunctionBegin; 00232 info=SDPConeAddADenseVecMat(sdpcone,blockj,vari,n,1.0,val,nnz); DSDPCHKERR(info); 00233 DSDPFunctionReturn(0); 00234 } 00235 00236 00237 #undef __FUNCT__ 00238 #define __FUNCT__ "SDPConeSetADenseVecMat" 00239 00265 int SDPConeSetADenseVecMat(SDPCone sdpcone,int blockj, int vari,int n, 00266 double alpha,double val[], int nnz){ 00267 int info; 00268 DSDPFunctionBegin; 00269 info=SDPConeRemoveDataMatrix(sdpcone,blockj,vari); DSDPCHKERR(info); 00270 info=SDPConeAddADenseVecMat(sdpcone,blockj,vari,n,alpha,val,nnz); DSDPCHKERR(info); 00271 DSDPFunctionReturn(0); 00272 } 00273 00274 #undef __FUNCT__ 00275 #define __FUNCT__ "SDPConeSetDenseVecMat" 00276 /* Needed for backward compatibility */ 00277 int SDPConeSetDenseVecMat(SDPCone sdpcone,int blockj, int vari,int n, 00278 double val[], int nnz){ 00279 int info; 00280 DSDPFunctionBegin; 00281 info=SDPConeSetADenseVecMat(sdpcone,blockj,vari,n,1.0,val,nnz); DSDPCHKERR(info); 00282 DSDPFunctionReturn(0); 00283 } 00284 00285 00286 #undef __FUNCT__ 00287 #define __FUNCT__ "SDPConeAddIdentity" 00288 00299 int SDPConeAddIdentity(SDPCone sdpcone, int blockj,int vari, int n, 00300 double val){ 00301 int info; 00302 char UPLQ; 00303 struct DSDPDataMat_Ops* identitymatops=0; 00304 void* imat=0; 00305 00306 DSDPFunctionBegin; 00307 DSDPLogInfo(0,20,"Set identity matrix: Block: %d, Variable %d, size: %d, Multiple: %4.4e .\n",blockj,vari,n,val); 00308 info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ); DSDPCHKERR(info); 00309 switch (UPLQ){ 00310 case 'P': 00311 info=DSDPGetIdentityDataMatP(n,val,&identitymatops,&imat);DSDPCHKERR(info); 00312 break; 00313 case 'U': 00314 info=DSDPGetIdentityDataMatF(n,val,&identitymatops,&imat);DSDPCHKERR(info); 00315 break; 00316 } 00317 info=SDPConeAddDataMatrix(sdpcone,blockj,vari,n,UPLQ,identitymatops,imat); DSDPCHKERR(info); 00318 DSDPFunctionReturn(0); 00319 } 00320 00321 #undef __FUNCT__ 00322 #define __FUNCT__ "SDPConeSetIdentity" 00323 00334 int SDPConeSetIdentity(SDPCone sdpcone, int blockj, int vari, int n, 00335 double val){ 00336 int info; 00337 DSDPFunctionBegin; 00338 info=SDPConeRemoveDataMatrix(sdpcone,blockj,vari); DSDPCHKERR(info); 00339 info=SDPConeAddIdentity(sdpcone,blockj,vari,n,val); DSDPCHKERR(info); 00340 DSDPFunctionReturn(0); 00341 } 00342 00343 #undef __FUNCT__ 00344 #define __FUNCT__ "SDPConeAddConstantMat" 00345 00356 int SDPConeAddConstantMat(SDPCone sdpcone,int blockj, int vari, int n, 00357 double value){ 00358 int info; 00359 char UPLQ; 00360 struct DSDPDataMat_Ops* constantmatops=0; 00361 void* smat=0; 00362 00363 DSDPFunctionBegin; 00364 DSDPLogInfo(0,20,"Add allsame matrix: Block: %d, Variable %d, size: %d, Elements: %4.4e .\n",blockj,vari,n,value); 00365 info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ); DSDPCHKERR(info); 00366 switch (UPLQ){ 00367 case 'P': 00368 info=DSDPGetConstantMat(n,value,UPLQ,&constantmatops,&smat);DSDPCHKERR(info); 00369 break; 00370 case 'U': 00371 info=DSDPGetConstantMat(n,value,UPLQ,&constantmatops,&smat);DSDPCHKERR(info); 00372 break; 00373 } 00374 info=SDPConeAddDataMatrix(sdpcone,blockj,vari,n,UPLQ,constantmatops,smat); DSDPCHKERR(info); 00375 DSDPFunctionReturn(0); 00376 } 00377 00378 #undef __FUNCT__ 00379 #define __FUNCT__ "SDPConeSetConstantMat" 00380 00391 int SDPConeSetConstantMat(SDPCone sdpcone,int blockj, int vari, int n, 00392 double value){ 00393 int info; 00394 DSDPFunctionBegin; 00395 info=SDPConeRemoveDataMatrix(sdpcone,blockj,vari); DSDPCHKERR(info); 00396 info=SDPConeAddConstantMat(sdpcone,blockj,vari,n,value); DSDPCHKERR(info); 00397 DSDPFunctionReturn(0); 00398 } 00399 00400 00401 #undef __FUNCT__ 00402 #define __FUNCT__ "SDPConeSetZeroMat" 00403 00414 int SDPConeSetZeroMat(SDPCone sdpcone,int blockj, int vari, int n){ 00415 int info; 00416 char UPLQ; 00417 struct DSDPDataMat_Ops* zeromatops=0; 00418 DSDPFunctionBegin; 00419 DSDPLogInfo(0,20,"Add zero matrix: Block: %d, Variable %d, size: %d .\n",blockj,vari,n); 00420 info=DSDPGetZeroDataMatOps(&zeromatops); DSDPCHKERR(info); 00421 info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ); DSDPCHKERR(info); 00422 info=SDPConeRemoveDataMatrix(sdpcone,blockj,vari); DSDPCHKERR(info); 00423 info=SDPConeAddDataMatrix(sdpcone,blockj,vari,n,UPLQ,zeromatops,0); DSDPCHKERR(info); 00424 DSDPFunctionReturn(0); 00425 } 00426 00427 #undef __FUNCT__ 00428 #define __FUNCT__ "SDPConeSetRIdentity" 00429 00438 int SDPConeSetRIdentity(SDPCone sdpcone,int blockj, int n, double rr){ 00439 int info; 00440 char UPLQ; 00441 struct DSDPDataMat_Ops* identitymatops=0; 00442 void* imat=0; 00443 DSDPFunctionBegin; 00444 info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ); DSDPCHKERR(info); 00445 switch (UPLQ){ 00446 case 'P': 00447 info=DSDPGetIdentityDataMatP(n,rr,&identitymatops,&imat);DSDPCHKERR(info); break; 00448 case 'U': 00449 info=DSDPGetIdentityDataMatF(n,rr,&identitymatops,&imat);DSDPCHKERR(info); break; 00450 default: 00451 break; 00452 } 00453 info=SDPConeSetRMatrix(sdpcone,blockj,n,UPLQ,identitymatops,imat); DSDPCHKERR(info); 00454 00455 DSDPFunctionReturn(0); 00456 } 00457 00458 #undef __FUNCT__ 00459 #define __FUNCT__ "SDPConeAddARankOneMat" 00460 00478 int SDPConeAddARankOneMat(SDPCone sdpcone,int blockj, int vari, int n, 00479 double alpha, int ishift,const int ind[], const double val[], int nnz){ 00480 00481 int info; 00482 char UPLQ; 00483 void* dmat=0; 00484 struct DSDPDataMat_Ops* dmatops=0; 00485 00486 DSDPFunctionBegin; 00487 info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ); DSDPCHKERR(info); 00488 DSDPLogInfo(0,20,"Set sparse matrix: Block: %d, Variable %d, size: %d, Nonzeros: %d .\n",blockj,vari,n,nnz); 00489 switch (UPLQ){ 00490 case 'P': 00491 info=DSDPGetR1PMat(n,alpha,ishift,ind,val,nnz,&dmatops,&dmat); DSDPCHKERR(info); 00492 break; 00493 case 'U': 00494 info=DSDPGetR1UMat(n,alpha,ishift,ind,val,nnz,&dmatops,&dmat); DSDPCHKERR(info); 00495 break; 00496 } 00497 info=SDPConeAddDataMatrix(sdpcone,blockj,vari,n,UPLQ,dmatops,dmat); DSDPCHKERR(info); 00498 DSDPFunctionReturn(0); 00499 } 00500 #undef __FUNCT__ 00501 #define __FUNCT__ "SDPConeSetARankOneMat" 00502 00519 int SDPConeSetARankOneMat(SDPCone sdpcone,int blockj, int vari, int n, 00520 double alpha, int ishift,const int ind[], const double val[], int nnz){ 00521 00522 00523 int info; 00524 DSDPFunctionBegin; 00525 info=SDPConeRemoveDataMatrix(sdpcone,blockj,vari); DSDPCHKERR(info); 00526 info=SDPConeAddARankOneMat(sdpcone,blockj,vari,n,alpha,ishift,ind,val,nnz); DSDPCHKERR(info); 00527 DSDPFunctionReturn(0); 00528 } 00529 00530 #undef __FUNCT__ 00531 #define __FUNCT__ "DSDPSetDataMatZero" 00532 00537 int DSDPSetDataMatZero(DSDPDataMat *A){ 00538 int info; 00539 struct DSDPDataMat_Ops* zeromatops=0; 00540 DSDPFunctionBegin; 00541 info=DSDPGetZeroDataMatOps(&zeromatops); DSDPCHKERR(info); 00542 info=DSDPDataMatSetData(A,zeromatops,0);DSDPCHKERR(info); 00543 DSDPFunctionReturn(0); 00544 } 00545