DSDP
|
00001 #ifndef __TAO_DSDPSDP_H 00002 #define __TAO_DSDPSDP_H 00003 00008 #include "dsdpschurmat.h" 00009 #include "dsdpbasictypes.h" 00010 #include "dsdpvec.h" 00011 00012 #include "sdpconevec.h" 00013 #include "dsdpdatamat.h" 00014 #include "dsdpdualmat.h" 00015 #include "dsdpxmat.h" 00016 #include "dsdpdsmat.h" 00017 #include "dsdplanczos.h" 00018 00019 typedef enum { SDPCONEEXIST=1, SDPCONESETUP1=2 } SDPConeStatus; 00020 00025 typedef struct{ 00026 int m; 00027 int *nnzblocks; 00028 int **nzblocks; 00029 int *ttnzmat; 00030 int **nnzmats; 00031 int **idA; 00032 int *idAP; 00033 } DSDPDataTranspose; 00034 00039 typedef struct{ 00040 int maxnnzmats; 00041 int nnzmats; 00042 int *nzmat; 00043 DSDPDataMat *A; 00044 double r; /* Multiple of Identity added to S to make it psd */ 00045 double scl; 00046 } DSDPBlockData; 00047 00052 typedef struct{ 00053 00054 DSDPBlockData ADATA; 00055 DSDPLanczosStepLength Lanczos; /* For Lanczos steplength routine */ 00056 00057 int n; /* Dimensions */ 00058 double gammamu; /* Scale Barrier, used only by user option */ 00059 double bmu; /* For LMI, not used */ 00060 char format; /* Packed Symmetric, Full Symmetric, Lower,Upper */ 00061 int nnz; 00062 SDPConeStatus status; 00063 00064 SDPConeVec W; 00065 SDPConeVec W2; 00066 DSDPIndex IS; 00067 00068 DSDPDualMat S; /* Dual variable matrices */ 00069 DSDPDualMat SS; /* Compute primal variable matrices */ 00070 DSDPDSMat DS; /* Dual variable step matrices */ 00071 DSDPVMat T; /* Work Array and Primal variable matrice X */ 00072 00073 } SDPblk; 00074 00080 struct SDPCone_C { 00081 int keyid; 00082 00083 /* Dimensions */ 00084 int m, nn; 00085 00086 /* Data in block format */ 00087 int nblocks; 00088 SDPblk *blk; 00089 00090 /* Transpose of Data */ 00091 DSDPDataTranspose ATR; 00092 00093 /* Work space */ 00094 DSDPVec Work, Work2; 00095 00096 /* Current Solution */ 00097 DSDPVec YY,YX,DYX; 00098 double xmakermu; 00099 00100 int optype; 00101 DSDP dsdp; 00102 }; 00103 00104 #define SDPCONEKEY 5438 00105 #define SDPConeValid(a) {if (!(a)||((a)->keyid!=SDPCONEKEY)){ DSDPSETERR(101,"DSDPERROR: Invalid SDPCone object\n");}} 00106 00107 #define DSDPCHKBLOCKERR(a,b); { if (b){ DSDPSETERR1(b,"Block Number: %d,\n",a);} } 00108 #define DSDPCHKVARERR(a,b); { if (b){ DSDPSETERR1(b,"Variable Number: %d,\n",a);} } 00109 00110 extern int DSDPSetDataMatZero(DSDPDataMat*); 00111 00112 #include "dsdp5.h" 00113 00114 #ifdef __cplusplus 00115 extern "C" { 00116 #endif 00117 00118 /* Operations on the Data */ 00119 extern int DSDPBlockDataInitialize(DSDPBlockData*); 00120 extern int DSDPBlockDataAllocate(DSDPBlockData*, int); 00121 extern int DSDPBlockAddDataMatrix(DSDPBlockData*,int, struct DSDPDataMat_Ops*, void*); 00122 extern int DSDPBlockSetDataMatrix(DSDPBlockData*,int, struct DSDPDataMat_Ops*, void*); 00123 extern int DSDPBlockRemoveDataMatrix(DSDPBlockData*,int); 00124 extern int DSDPBlockDataMarkNonzeroMatrices(DSDPBlockData*,int*); 00125 extern int DSDPBlockDataRowSparsity(DSDPBlockData*,int,int[],int[],int); 00126 extern int DSDPBlockASum(DSDPBlockData*,double,DSDPVec,DSDPVMat); 00127 extern int DSDPBlockADot(DSDPBlockData*,double,DSDPVec,DSDPVMat,DSDPVec); 00128 extern int DSDPBlockvAv(DSDPBlockData*,double,DSDPVec,SDPConeVec,DSDPVec); 00129 extern int DSDPBlockDataDestroy(DSDPBlockData*); 00130 extern int DSDPBlockCheck(DSDPBlockData*,SDPConeVec,DSDPVMat); 00131 extern int DSDPBlockANorm2(DSDPBlockData*, DSDPVec, int); 00132 extern int DSDPBlockView(DSDPBlockData*); 00133 extern int DSDPBlockView2(DSDPBlockData*); 00134 extern int DSDPBlockCountNonzeroMatrices(DSDPBlockData *,int*); 00135 extern int DSDPBlockGetMatrix(DSDPBlockData*,int,int*,double*,DSDPDataMat*); 00136 extern int DSDPBlockFactorData(DSDPBlockData*,DSDPVMat,SDPConeVec); 00137 extern int DSDPBlockTakeDownData(DSDPBlockData*); 00138 extern int DSDPBlockDataRank(DSDPBlockData*,int*,int); 00139 00140 extern int DSDPBlockTakeDown(SDPblk*); 00141 extern int DSDPBlockInitialize(SDPblk*); 00142 00143 extern int DSDPBlockEventInitialize(void); 00144 extern int DSDPBlockEventZero(void); 00145 00146 extern int DSDPDataMatCheck(DSDPDataMat,SDPConeVec,DSDPIndex,DSDPVMat); 00147 00148 /* Operations on the Transpose of the Data */ 00149 extern int DSDPDataTransposeInitialize(DSDPDataTranspose*); 00150 extern int DSDPDataTransposeTakeDown(DSDPDataTranspose*); 00151 extern int DSDPDataTransposeSetup(DSDPDataTranspose*,SDPblk*,int,int); 00152 00153 extern int DSDPUseDefaultDualMatrix(SDPCone); 00154 00155 extern int SDPConeSetup(SDPCone,DSDPVec); 00156 extern int SDPConeSetup2(SDPCone,DSDPVec,DSDPSchurMat); 00157 extern int SDPConeComputeHessian(SDPCone,double,DSDPSchurMat,DSDPVec,DSDPVec); 00158 extern int SDPConeMultiply(SDPCone,int,double,DSDPVec,DSDPVec,DSDPVec); 00159 extern int SDPConeComputeRHS(SDPCone, int, double, DSDPVec, DSDPVec,DSDPVec); 00160 extern int SDPConeComputeXX(SDPCone,int,DSDPVec,double,DSDPDualMat, DSDPVMat); 00161 extern int SDPConeDestroy(SDPCone); 00162 00163 extern int SDPConeCheckJ(SDPCone,int); 00164 extern int SDPConeCheckN(SDPCone,int, int); 00165 extern int SDPConeCheckM(SDPCone,int); 00166 extern int SDPConeCheckStorageFormat(SDPCone,int, char); 00167 00168 00169 extern int SDPConeComputeSS(SDPCone, int, DSDPVec, DSDPVMat); 00170 extern int SDPConeComputeXDot(SDPCone,int,DSDPVec,DSDPVMat,DSDPVec,double*,double*, double *); 00171 extern int SDPConeComputeX3(SDPCone,int,double,DSDPVec,DSDPVec,DSDPVMat); 00172 00173 /* extern int DSDPPrintSDPA(TAO_DSDP *); */ 00174 extern int DSDPMakeVMat(char, int, DSDPVMat*); 00175 extern int DSDPMakeVMatWithArray(char, double[], int, int, DSDPVMat*); 00176 00177 extern int DSDPSetDualMatrix(SDPCone sdpcone,int (*createdualmatrix)(DSDPBlockData*,DSDPVec,DSDPVMat,DSDPVec,DSDPVec,DSDPDualMat*,DSDPDualMat*,DSDPDSMat*,void*),void*); 00178 00179 extern int DSDPAddSDP(DSDP,SDPCone); 00180 #ifdef __cplusplus 00181 } 00182 #endif 00183 00184 extern int SDPConeSetRIdentity(SDPCone,int,int,double); 00185 extern int DSDPDualMatEventInitialize(void); 00186 extern int DSDPVMatEventInitialize(void); 00187 extern int DSDPDualMatEventZero(void); 00188 extern int DSDPVMatEventZero(void); 00189 00190 #endif