9#define __FUNCT__ "DSDPDataTransposeInitialize"
17 ATranspose->nnzblocks=0;
18 ATranspose->nzblocks=0;
21 ATranspose->ttnzmat=0;
22 ATranspose->nnzblocks=0;
23 DSDPFunctionReturn(0);
27#define __FUNCT__ "DSDPDataTransposeSetup"
38 int i,ii,kk,vvar,info;
39 int nnzmats,tnzmats=0;
45 DSDPCALLOC2(&ATranspose->nnzblocks,
int,(m),&info);DSDPCHKERR(info);
46 DSDPCALLOC2(&ATranspose->nzblocks,
int*,(m),&info);DSDPCHKERR(info);
47 DSDPCALLOC2(&ATranspose->idA,
int*,(m),&info);DSDPCHKERR(info);
49 for (i=0;i<m;i++){ ATranspose->nnzblocks[i]=0; }
50 for (kk=0; kk<nblocks; kk++){
53 for (tnzmats=0,i=0;i<m;i++){ tnzmats += ATranspose->nnzblocks[i];}
55 DSDPCALLOC2(&ATranspose->ttnzmat,
int,tnzmats,&info);DSDPCHKERR(info);
56 ATranspose->nzblocks[0]=ATranspose->ttnzmat;
58 ATranspose->nzblocks[i]=ATranspose->nzblocks[i-1]+ATranspose->nnzblocks[i-1];
61 DSDPCALLOC2(&ATranspose->idAP,
int,tnzmats,&info);DSDPCHKERR(info);
62 ATranspose->idA[0]=ATranspose->idAP;
64 ATranspose->idA[i]=ATranspose->idA[i-1]+ATranspose->nnzblocks[i-1];
67 for (i=0;i<m;i++){ATranspose->nnzblocks[i]=0;}
68 for (kk=0; kk<nblocks; kk++){
70 for (i=0;i<nnzmats;i++){
72 vvar=ATranspose->nnzblocks[ii];
73 ATranspose->nzblocks[ii][vvar]=kk;
74 ATranspose->idA[ii][vvar]=i;
75 ATranspose->nnzblocks[ii]++;
79 DSDPFunctionReturn(0);
83#define __FUNCT__ "DSDPDataTransposeTakeDown"
92 DSDPFREE(&ATranspose->ttnzmat,&info);DSDPCHKERR(info);
93 DSDPFREE(&ATranspose->idAP,&info);DSDPCHKERR(info);
94 DSDPFREE(&ATranspose->nzblocks,&info);DSDPCHKERR(info);
95 DSDPFREE(&ATranspose->nnzblocks,&info);DSDPCHKERR(info);
96 DSDPFREE(&ATranspose->idA,&info);DSDPCHKERR(info);
98 DSDPFunctionReturn(0);
102#define __FUNCT__ "DSDPCreateSDPCone"
113int DSDPCreateSDPCone(
DSDP dsdp,
int blocks,
SDPCone* dspcone){
118 DSDPCALLOC1(&sdpcone,
struct SDPCone_C,&info);DSDPCHKERR(info);
120 sdpcone->keyid=SDPCONEKEY;
121 info=
DSDPAddSDP(dsdp,sdpcone);DSDPCHKERR(info);
123 info=DSDPGetNumberOfVariables(dsdp,&sdpcone->m);DSDPCHKERR(info);
124 DSDPCALLOC2(&sdpcone->blk,
SDPblk,blocks,&info); DSDPCHKERR(info);
125 for (i=0;i<blocks; i++){
129 sdpcone->nblocks=blocks;
131 info=DSDPUseDefaultDualMatrix(sdpcone); DSDPCHKERR(info);
136 info=DSDPBlockEventZero();DSDPCHKERR(info);
137 info=DSDPDualMatEventZero();DSDPCHKERR(info);
138 info=DSDPVMatEventZero();DSDPCHKERR(info);
139 DSDPFunctionReturn(0);
143int DSDPCreateS(
DSDPBlockData*,
char,
int,
DSDPVec,
DSDPVMat,
SDPConeVec,
SDPConeVec,
DSDPDualMat*,
DSDPDualMat*,
DSDPDSMat*,
void*);
146#define __FUNCT__ "DSDPBlockSetup"
155 int n,info,trank,flag;
163 info=
DSDPMakeVMat(blk->format,n,&blk->T);DSDPCHKERR(info);
167 info = SDPConeVecCreate(blk->n,&blk->W);DSDPCHKERR(info);
177 DSDPLogInfo(0,19,
"SDP Block %d using Fast Lanczos\n",blockj);
180 DSDPLogInfo(0,19,
"SDP Block %d using Full Lanczos\n",blockj);
185 info=DSDPBlockDataRank(&blk->ADATA,&trank,n);DSDPCHKERR(info);
187 info=
DSDPCreateS(&blk->ADATA,blk->format,trank,WY,blk->T,blk->W,blk->W2,&blk->S,&blk->SS,&blk->DS,0);DSDPCHKERR(info);
189 DSDPFunctionReturn(0);
193#define __FUNCT__ "SDPConeBlockNNZ"
194int SDPConeBlockNNZ(
SDPblk *blk,
int m){
195 int i,ii,n,info,nnz,nnzmats,tnnzmats,tnnz=0;
199 nnzmats=blk->ADATA.nnzmats;tnnzmats=nnzmats;
202 for (i=0;i<nnzmats;i++){
204 if (ii==0){tnnzmats--;
continue;}
205 if (ii==m-1){
continue;}
207 tnnz+= (nnz*(tnnzmats-i));
209 if (tnnzmats>1){ tnnz=tnnz/((tnnzmats)*(tnnzmats+1)/2); }
210 if (tnnz<1) tnnz = 1;
212 DSDPFunctionReturn(0);
216#define __FUNCT__ "SDPConeSetup2"
229 info=DSDPVecGetSize(yy0,&m);DSDPCHKERR(info);
230 for (kk=0; kk<sdpcone->nblocks; kk++){
231 blk=&sdpcone->blk[kk];
233 info=SDPConeBlockNNZ(blk,m);DSDPCHKERR(info);
238 DSDPFunctionReturn(0);
242#define __FUNCT__ "SDPConeSetup"
253 info = DSDPVecGetSize(yy0,&m);DSDPCHKERR(info);
254 if (m!=sdpcone->m+2){DSDPSETERR(8,
"CHECK DIMENSION\n");}
255 info = DSDPVecDuplicate(yy0,&sdpcone->Work);DSDPCHKERR(info);
256 info = DSDPVecDuplicate(yy0,&sdpcone->Work2);DSDPCHKERR(info);
257 info = DSDPVecDuplicate(yy0,&sdpcone->YY);DSDPCHKERR(info);
258 info = DSDPVecDuplicate(yy0,&sdpcone->YX);DSDPCHKERR(info);
259 info = DSDPVecDuplicate(yy0,&sdpcone->DYX);DSDPCHKERR(info);
260 for (kk=0; kk<sdpcone->nblocks; kk++){
261 n=sdpcone->blk[kk].n;
266 info=DSDPBlockEventInitialize();DSDPCHKERR(info);
267 info=DSDPDualMatEventInitialize();DSDPCHKERR(info);
268 info=DSDPVMatEventInitialize();DSDPCHKERR(info);
269 DSDPFunctionReturn(0);
273#define __FUNCT__ "DSDPBlockInitialize"
295 DSDPFunctionReturn(0);
299#define __FUNCT__ "DSDPBlockTakeDown"
308 if (!blk){DSDPFunctionReturn(0);}
310 info=SDPConeVecDestroy(&blk->W);DSDPCHKERR(info);
311 info=SDPConeVecDestroy(&blk->W2);DSDPCHKERR(info);
318 DSDPFunctionReturn(0);
322#define __FUNCT__ "DSDPConeTakeDown"
331 for (blockj=0; blockj<sdpcone->nblocks; blockj++){
334 info=DSDPVecDestroy(&sdpcone->Work);DSDPCHKERR(info);
335 info=DSDPVecDestroy(&sdpcone->Work2);DSDPCHKERR(info);
336 info=DSDPVecDestroy(&sdpcone->YY);DSDPCHKERR(info);
337 info=DSDPVecDestroy(&sdpcone->YX);DSDPCHKERR(info);
338 info=DSDPVecDestroy(&sdpcone->DYX);DSDPCHKERR(info);
340 DSDPFunctionReturn(0);
344#define __FUNCT__ "SDPConeDestroy"
354 for (blockj=0; blockj<sdpcone->nblocks; blockj++){
357 DSDPFREE(&sdpcone->blk,&info);DSDPCHKERR(info);
358 DSDPFREE(&sdpcone,&info);DSDPCHKERR(info);
359 info=DSDPBlockEventZero();DSDPCHKERR(info);
360 info=DSDPDualMatEventZero();DSDPCHKERR(info);
361 info=DSDPVMatEventZero();DSDPCHKERR(info);
362 DSDPFunctionReturn(0);
int SDPConeSetRIdentity(SDPCone sdpcone, int blockj, int n, double rr)
Add identify matrix to dual matrix.
int DSDPBlockDataDestroy(DSDPBlockData *ADATA)
Free the data matrices.
int DSDPBlockGetMatrix(DSDPBlockData *ADATA, int id, int *vari, double *scl, DSDPDataMat *A)
Get a data matrix from a block of data.
int DSDPBlockDataInitialize(DSDPBlockData *ADATA)
Set pointers to null.
int DSDPBlockDataMarkNonzeroMatrices(DSDPBlockData *ADATA, int *annz)
Mark which variable in block have a data matrix.
int DSDPBlockCountNonzeroMatrices(DSDPBlockData *ADATA, int *nzmats)
Count how many data matrices are in a block of data.
int DSDPBlockFactorData(DSDPBlockData *ADATA, DSDPVMat X, SDPConeVec W)
Factor the data matrices.
int DSDPBlockTakeDownData(DSDPBlockData *ADATA)
Free structures in block of data.
int DSDPDataMatCountNonzeros(DSDPDataMat A, int *nnz, int n)
Compute the square of the Frobenius norm.
int DSDPDSMatDestroy(DSDPDSMat *A)
Free the data structure.
int DSDPDSMatInitialize(DSDPDSMat *B)
Set pointers to null.
int DSDPDualMatInitialize(DSDPDualMat *S)
Set pointers to null.
int DSDPDualMatDestroy(DSDPDualMat *S)
Free the matrix structure.
int DSDPFastLanczosSetup(DSDPLanczosStepLength *, SDPConeVec)
Use Lanczos procedure. Assume off tridiagonal entries are zero.
int DSDPLanczosDestroy(DSDPLanczosStepLength *)
Free data structure.
int DSDPLanczosInitialize(DSDPLanczosStepLength *)
Initialize Lanczos structure.
int DSDPSetMaximumLanczosIterations(DSDPLanczosStepLength *LZ, int)
Set parameter.
int DSDPRobustLanczosSetup(DSDPLanczosStepLength *, SDPConeVec)
Use slowerer but more robust method.
Internal SDPCone data structures and routines.
int DSDPAddSDP(DSDP, SDPCone)
Pass a semidefinite cone to the solver.
int DSDPMakeVMat(char, int, DSDPVMat *)
Allocate V matrix.
Error handling, printing, and profiling.
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.
int DSDPVMatInitialize(DSDPVMat *B)
Set pointers to null.
int DSDPVMatExist(DSDPVMat X, int *flag)
Answer whether the array has been allocated or not.
int DSDPVMatDestroy(DSDPVMat *X)
Deallocate matrix.
int DSDPConeTakeDown(SDPCone sdpcone)
Free data structure of the cone.
int DSDPBlockTakeDown(SDPblk *blk)
Free data structures in one block of the cone.
int DSDPBlockSetup(SDPblk *blk, int blockj, DSDPVec WY)
Allocate data structures of one block the cone.
int DSDPCreateS(DSDPBlockData *, char, int, DSDPVec, DSDPVMat, SDPConeVec, SDPConeVec, DSDPDualMat *, DSDPDualMat *, DSDPDSMat *, void *)
Create S1, S2, and DS.
int DSDPBlockInitialize(SDPblk *blk)
Initialize data structures in one block of the cone.
int SDPConeSetup(SDPCone sdpcone, DSDPVec yy0)
Allocate data structure of the cone.
int SDPConeDestroy(SDPCone sdpcone)
Free data structure of the cone.
int SDPConeSetup2(SDPCone sdpcone, DSDPVec yy0, DSDPSchurMat M)
Allocate data structure of the cone.
int DSDPDataTransposeSetup(DSDPDataTranspose *ATranspose, SDPblk *blk, int nblocks, int m)
Set up transpose structure for data.
int DSDPDataTransposeTakeDown(DSDPDataTranspose *ATranspose)
Free transpose structure for data.
int DSDPDataTransposeInitialize(DSDPDataTranspose *ATranspose)
Initialize transpose structure for data.
int SDPConeVecDuplicate(SDPConeVec V1, SDPConeVec *V2)
Allocate another vector with the same structure as the first.
int DSDPIndexDestroy(DSDPIndex *IS)
Deallocate memory.
int DSDPIndexCreate(int n, DSDPIndex *IS)
Allocate array for indices.
int DSDPIndexInitialize(DSDPIndex *IS)
Set structure pointers to 0.
Internal structure for data in one block of semidefintie.
Symmetric Delta S matrix for one block in the semidefinite cone.
Symmetric data matrix for one block in the semidefinite cone.
Internal structure for transpose of data.
Represents an S matrix for one block in the semidefinite cone.
Schur complement matrix whose solution is the Newton direction.
Dense symmetric matrix for one block in the semidefinite cone.
Internal structures for the DSDP solver.
Vector whose length corresponds to dimension of a block in a cone.
Internal structure for semidefinite cone.
Internal structure for block of semidefinite cone.