DSDP
dsdpsdp.h
Go to the documentation of this file.
1 #ifndef __TAO_DSDPSDP_H
2 #define __TAO_DSDPSDP_H
3 
8 #include "dsdpschurmat.h"
9 #include "dsdpbasictypes.h"
10 #include "dsdpvec.h"
11 
12 #include "sdpconevec.h"
13 #include "dsdpdatamat.h"
14 #include "dsdpdualmat.h"
15 #include "dsdpxmat.h"
16 #include "dsdpdsmat.h"
17 #include "dsdplanczos.h"
18 
19 typedef enum { SDPCONEEXIST=1, SDPCONESETUP1=2 } SDPConeStatus;
20 
25 typedef struct{
26  int m;
27  int *nnzblocks;
28  int **nzblocks;
29  int *ttnzmat;
30  int **nnzmats;
31  int **idA;
32  int *idAP;
34 
39 typedef struct{
40  int maxnnzmats;
41  int nnzmats;
42  int *nzmat;
43  DSDPDataMat *A;
44  double r; /* Multiple of Identity added to S to make it psd */
45  double scl;
47 
52 typedef struct{
53 
54  DSDPBlockData ADATA;
55  DSDPLanczosStepLength Lanczos; /* For Lanczos steplength routine */
56 
57  int n; /* Dimensions */
58  double gammamu; /* Scale Barrier, used only by user option */
59  double bmu; /* For LMI, not used */
60  char format; /* Packed Symmetric, Full Symmetric, Lower,Upper */
61  int nnz;
62  SDPConeStatus status;
63 
64  SDPConeVec W;
65  SDPConeVec W2;
66  DSDPIndex IS;
67 
68  DSDPDualMat S; /* Dual variable matrices */
69  DSDPDualMat SS; /* Compute primal variable matrices */
70  DSDPDSMat DS; /* Dual variable step matrices */
71  DSDPVMat T; /* Work Array and Primal variable matrice X */
72 
73 } SDPblk;
74 
80 struct SDPCone_C {
81  int keyid;
82 
83  /* Dimensions */
84  int m, nn;
85 
86  /* Data in block format */
87  int nblocks;
88  SDPblk *blk;
89 
90  /* Transpose of Data */
92 
93  /* Work space */
94  DSDPVec Work, Work2;
95 
96  /* Current Solution */
97  DSDPVec YY,YX,DYX;
98  double xmakermu;
99 
100  int optype;
101  DSDP dsdp;
102 };
103 
104 #define SDPCONEKEY 5438
105 #define SDPConeValid(a) {if (!(a)||((a)->keyid!=SDPCONEKEY)){ DSDPSETERR(101,"DSDPERROR: Invalid SDPCone object\n");}}
106 
107 #define DSDPCHKBLOCKERR(a,b); { if (b){ DSDPSETERR1(b,"Block Number: %d,\n",a);} }
108 #define DSDPCHKVARERR(a,b); { if (b){ DSDPSETERR1(b,"Variable Number: %d,\n",a);} }
109 
110 extern int DSDPSetDataMatZero(DSDPDataMat*);
111 
112 #include "dsdp5.h"
113 
114 #ifdef __cplusplus
115 extern "C" {
116 #endif
117 
118 /* Operations on the Data */
120 extern int DSDPBlockDataAllocate(DSDPBlockData*, int);
121 extern int DSDPBlockAddDataMatrix(DSDPBlockData*,int, struct DSDPDataMat_Ops*, void*);
122 extern int DSDPBlockSetDataMatrix(DSDPBlockData*,int, struct DSDPDataMat_Ops*, void*);
125 extern int DSDPBlockDataRowSparsity(DSDPBlockData*,int,int[],int[],int);
126 extern int DSDPBlockASum(DSDPBlockData*,double,DSDPVec,DSDPVMat);
130 extern int DSDPBlockCheck(DSDPBlockData*,SDPConeVec,DSDPVMat);
131 extern int DSDPBlockANorm2(DSDPBlockData*, DSDPVec, int);
132 extern int DSDPBlockView(DSDPBlockData*);
133 extern int DSDPBlockView2(DSDPBlockData*);
135 extern int DSDPBlockGetMatrix(DSDPBlockData*,int,int*,double*,DSDPDataMat*);
138 extern int DSDPBlockDataRank(DSDPBlockData*,int*,int);
139 
140 extern int DSDPBlockTakeDown(SDPblk*);
141 extern int DSDPBlockInitialize(SDPblk*);
142 
143 extern int DSDPBlockEventInitialize(void);
144 extern int DSDPBlockEventZero(void);
145 
146 extern int DSDPDataMatCheck(DSDPDataMat,SDPConeVec,DSDPIndex,DSDPVMat);
147 
148 /* Operations on the Transpose of the Data */
151 extern int DSDPDataTransposeSetup(DSDPDataTranspose*,SDPblk*,int,int);
152 
153 extern int DSDPUseDefaultDualMatrix(SDPCone);
154 
155 extern int SDPConeSetup(SDPCone,DSDPVec);
158 extern int SDPConeMultiply(SDPCone,int,double,DSDPVec,DSDPVec,DSDPVec);
159 extern int SDPConeComputeRHS(SDPCone, int, double, DSDPVec, DSDPVec,DSDPVec);
160 extern int SDPConeComputeXX(SDPCone,int,DSDPVec,double,DSDPDualMat, DSDPVMat);
161 extern int SDPConeDestroy(SDPCone);
162 
163 extern int SDPConeCheckJ(SDPCone,int);
164 extern int SDPConeCheckN(SDPCone,int, int);
165 extern int SDPConeCheckM(SDPCone,int);
166 extern int SDPConeCheckStorageFormat(SDPCone,int, char);
167 
168 
169 extern int SDPConeComputeSS(SDPCone, int, DSDPVec, DSDPVMat);
170 extern int SDPConeComputeXDot(SDPCone,int,DSDPVec,DSDPVMat,DSDPVec,double*,double*, double *);
171 extern int SDPConeComputeX3(SDPCone,int,double,DSDPVec,DSDPVec,DSDPVMat);
172 
173 /* extern int DSDPPrintSDPA(TAO_DSDP *); */
174 extern int DSDPMakeVMat(char, int, DSDPVMat*);
175 extern int DSDPMakeVMatWithArray(char, double[], int, int, DSDPVMat*);
176 
177 extern int DSDPSetDualMatrix(SDPCone sdpcone,int (*createdualmatrix)(DSDPBlockData*,DSDPVec,DSDPVMat,DSDPVec,DSDPVec,DSDPDualMat*,DSDPDualMat*,DSDPDSMat*,void*),void*);
178 
179 extern int DSDPAddSDP(DSDP,SDPCone);
180 #ifdef __cplusplus
181 }
182 #endif
183 
184 extern int SDPConeSetRIdentity(SDPCone,int,int,double);
185 extern int DSDPDualMatEventInitialize(void);
186 extern int DSDPVMatEventInitialize(void);
187 extern int DSDPDualMatEventZero(void);
188 extern int DSDPVMatEventZero(void);
189 
190 #endif