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);
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);
struct SDPCone_C * SDPCone
The SDPCone object points to blocks of data that specify semidefinite matrix inequalities.
int SDPConeSetRIdentity(SDPCone sdpcone, int blockj, int n, double rr)
Add identify matrix to dual matrix.
struct DSDP_C * DSDP
An implementation of the dual-scaling algorithm for semidefinite programming.
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.
struct DSDPDataMat_C DSDPDataMat
Represents a single symmetric data matrix for one block in this semidefinite cone.
int DSDPDSMatDestroy(DSDPDSMat *A)
Free the data structure.
int DSDPDSMatInitialize(DSDPDSMat *B)
Set pointers to null.
struct DSDPDSMat_C DSDPDSMat
A symmetric Delta S matrix for one block in the semidefinite cone.
int DSDPDualMatInitialize(DSDPDualMat *S)
Set pointers to null.
int DSDPDualMatDestroy(DSDPDualMat *S)
Free the matrix structure.
struct DSDPDualMat_C DSDPDualMat
Represents an S matrix for one block in the semidefinite cone.
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.
struct DSDPSchurMat_C DSDPSchurMat
This object represents the Schur Matrix. Its structure is opaque to the DSDP solver,...
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.
struct DSDPVMat_C DSDPVMat
Represents a dense symmetric matrix for one block in the semidefinite cone.
int DSDPGetNumberOfVariables(DSDP dsdp, int *m)
Copy the number of variables y.
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.
struct SDPConeVec_C SDPConeVec
SDPConeVec is a vector with the dimension of the block in the SDP cone.
Internal structure for data in one block of semidefintie.
Internal structure for transpose of data.
Internal structure for semidefinite cone.
Internal structure for block of semidefinite cone.