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" 113 int 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);
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);
143 int 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" 194 int 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);
Internal structure for transpose of data.
int DSDPVMatExist(DSDPVMat X, int *flag)
Answer whether the array has been allocated or not.
int DSDPDualMatDestroy(DSDPDualMat *S)
Free the matrix structure.
int DSDPDataTransposeInitialize(DSDPDataTranspose *ATranspose)
Initialize transpose structure for data.
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.
int DSDPConeTakeDown(SDPCone sdpcone)
Free data structure of the cone.
Schur complement matrix whose solution is the Newton direction.
int DSDPBlockDataMarkNonzeroMatrices(DSDPBlockData *ADATA, int *annz)
Mark which variable in block have a data matrix.
int SDPConeSetRIdentity(SDPCone sdpcone, int blockj, int n, double rr)
Add identify matrix to dual matrix.
Error handling, printing, and profiling.
int SDPConeDestroy(SDPCone sdpcone)
Free data structure of the cone.
int DSDPRobustLanczosSetup(DSDPLanczosStepLength *, SDPConeVec)
Use slowerer but more robust method.
Internal structures for the DSDP solver.
int DSDPLanczosDestroy(DSDPLanczosStepLength *)
Free data structure.
int DSDPCreateS(DSDPBlockData *, char, int, DSDPVec, DSDPVMat, SDPConeVec, SDPConeVec, DSDPDualMat *, DSDPDualMat *, DSDPDSMat *, void *)
Create S1, S2, and DS.
int DSDPDataTransposeTakeDown(DSDPDataTranspose *ATranspose)
Free transpose structure for data.
int DSDPDataTransposeSetup(DSDPDataTranspose *ATranspose, SDPblk *blk, int nblocks, int m)
Set up transpose structure for data.
int DSDPBlockCountNonzeroMatrices(DSDPBlockData *ADATA, int *nzmats)
Count how many data matrices are in a block of data.
int DSDPVMatInitialize(DSDPVMat *B)
Set pointers to null.
int DSDPIndexInitialize(DSDPIndex *IS)
Set structure pointers to 0.
int DSDPDSMatInitialize(DSDPDSMat *B)
Set pointers to null.
int DSDPBlockTakeDownData(DSDPBlockData *ADATA)
Free structures in block of data.
Internal structure for data in one block of semidefintie.
Vector whose length corresponds to dimension of a block in a cone.
Symmetric data matrix for one block in the semidefinite cone.
int DSDPDataMatCountNonzeros(DSDPDataMat A, int *nnz, int n)
Compute the square of the Frobenius norm.
int DSDPBlockFactorData(DSDPBlockData *ADATA, DSDPVMat X, SDPConeVec W)
Factor the data matrices.
int DSDPBlockTakeDown(SDPblk *blk)
Free data structures in one block of the cone.
int DSDPBlockInitialize(SDPblk *blk)
Initialize data structures in one block of the cone.
int DSDPVMatDestroy(DSDPVMat *X)
Deallocate matrix.
int SDPConeSetup(SDPCone sdpcone, DSDPVec yy0)
Allocate data structure of the cone.
int DSDPDualMatInitialize(DSDPDualMat *S)
Set pointers to null.
Internal structure for block of semidefinite cone.
int DSDPIndexDestroy(DSDPIndex *IS)
Deallocate memory.
int SDPConeVecDuplicate(SDPConeVec V1, SDPConeVec *V2)
Allocate another vector with the same structure as the first.
int DSDPDSMatDestroy(DSDPDSMat *A)
Free the data structure.
Represents an S matrix for one block in the semidefinite cone.
int DSDPLanczosInitialize(DSDPLanczosStepLength *)
Initialize Lanczos structure.
int DSDPIndexCreate(int n, DSDPIndex *IS)
Allocate array for indices.
int DSDPBlockSetup(SDPblk *blk, int blockj, DSDPVec WY)
Allocate data structures of one block the cone.
int DSDPBlockGetMatrix(DSDPBlockData *ADATA, int id, int *vari, double *scl, DSDPDataMat *A)
Get a data matrix from a block of data.
Internal structure for semidefinite cone.
int DSDPGetNumberOfVariables(DSDP dsdp, int *m)
Copy the number of variables y.
int DSDPFastLanczosSetup(DSDPLanczosStepLength *, SDPConeVec)
Use Lanczos procedure. Assume off tridiagonal entries are zero.
int DSDPMakeVMat(char, int, DSDPVMat *)
Allocate V matrix.
Symmetric Delta S matrix for one block in the semidefinite cone.
int DSDPSetMaximumLanczosIterations(DSDPLanczosStepLength *LZ, int)
Set parameter.
Dense symmetric matrix for one block in the semidefinite cone.
int DSDPBlockDataDestroy(DSDPBlockData *ADATA)
Free the data matrices.
int DSDPBlockDataInitialize(DSDPBlockData *ADATA)
Set pointers to null.
int DSDPAddSDP(DSDP, SDPCone)
Pass a semidefinite cone to the solver.
int SDPConeSetup2(SDPCone sdpcone, DSDPVec yy0, DSDPSchurMat M)
Allocate data structure of the cone.
Internal SDPCone data structures and routines.