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;
00045 double scl;
00046 } DSDPBlockData;
00047
00052 typedef struct{
00053
00054 DSDPBlockData ADATA;
00055 DSDPLanczosStepLength Lanczos;
00056
00057 int n;
00058 double gammamu;
00059 double bmu;
00060 char format;
00061 int nnz;
00062 SDPConeStatus status;
00063
00064 SDPConeVec W;
00065 SDPConeVec W2;
00066 DSDPIndex IS;
00067
00068 DSDPDualMat S;
00069 DSDPDualMat SS;
00070 DSDPDSMat DS;
00071 DSDPVMat T;
00072
00073 } SDPblk;
00074
00080 struct SDPCone_C {
00081 int keyid;
00082
00083
00084 int m, nn;
00085
00086
00087 int nblocks;
00088 SDPblk *blk;
00089
00090
00091 DSDPDataTranspose ATR;
00092
00093
00094 DSDPVec Work, Work2;
00095
00096
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
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
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
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