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);