8int DSDPCreateS(
DSDPBlockData*,
char,
int,
DSDPVec,
DSDPVMat,
SDPConeVec,
SDPConeVec,
DSDPDualMat*,
DSDPDualMat*,
DSDPDSMat*,
void*);
16extern int DSDPXMatPCreate(
int,
struct DSDPVMat_Ops**,
void**);
17extern int DSDPXMatPCreateWithData(
int,
double[],
int,
struct DSDPVMat_Ops**,
void**);
18extern int DSDPXMatUCreate(
int,
struct DSDPVMat_Ops**,
void**);
19extern int DSDPXMatUCreateWithData(
int,
double[],
int,
struct DSDPVMat_Ops**,
void**);
29extern int DSDPSparseMatCreatePattern2P(
int,
int[],
int[],
int,
struct DSDPDSMat_Ops**,
void**);
30extern int DSDPSparseMatCreatePattern2U(
int,
int[],
int[],
int,
struct DSDPDSMat_Ops**,
void**);
32extern int DSDPCreateDiagDSMatP(
int,
struct DSDPDSMat_Ops**,
void**);
33extern int DSDPCreateDiagDSMatU(
int,
struct DSDPDSMat_Ops**,
void**);
35extern int DSDPCreateDSMatWithArray(
int,
double[],
int,
struct DSDPDSMat_Ops**,
void**);
36extern int DSDPCreateDSMatWithArray2(
int,
double[],
int,
struct DSDPDSMat_Ops**,
void**);
38extern int DSDPCreateURDSMat(
int,
struct DSDPDSMat_Ops**,
void**);
51#define __FUNCT__ "CountNonzeros"
52static int CountNonzeros(
DSDPBlockData *ADATA,
int m,
int rnnz[],
int innz[],
int n,
int *nnz1,
int *nnz2)
54 int i,j,info,totalnnz1=0,totalnnz2=0;
57 memset(rnnz,0,n*
sizeof(
int));
59 for (j=0;j<m;j++) innz[j]=1;innz[0]=0;
61 for (j=0; j<i; j++){
if (rnnz[j]>0) totalnnz1++;}
63 for (j=0;j<m;j++) innz[j]=0;innz[0]=1;
65 for (j=0; j<i; j++){
if (rnnz[j]>0) totalnnz2++;}
73#define __FUNCT__ "CreateS1b"
74static int CreateS1b(
DSDPBlockData *ADATA,
int innz[],
int m,
int n,
int tnnz[],
int rnnz[],
int snnz[])
77 if (ADATA->nnzmats<=0){
return 0;};
79 memset(rnnz,0,n*
sizeof(
int));
80 for (i=0;i<m;i++) innz[i]=1;
85 memset(tnnz,0,n*
sizeof(
int));
88 if (tnnz[j]>0){ *snnz=j; snnz++; rnnz[i]++;}
96#define __FUNCT__ "DSDPCreateDS"
98 int i,n1,*cols,allnnz,info;
103 DSDPLogInfo(0,19,
"DS Matrix has %d nonzeros of %d\n",nnz,n*(n-1)/2);
105 info=DSDPCreateDiagDSMatP(n,&dsops,&dsmat); DSDPCHKERR(info);
106 DSDPLogInfo(0,19,
"Using Diagonal Delta S matrix\n");
107 }
else if (2*nnz +n < n*n/5){
110 info = CreateS1b(ADATA, iworkm, m, n, tnnz, rnnz, cols); DSDPCHKERR(info);
111 for (allnnz=0,i=0;i<n;i++){allnnz+=rnnz[i];}
112 info = DSDPSparseMatCreatePattern2P(n,rnnz,cols,allnnz,&dsops,&dsmat); DSDPCHKERR(info);
114 DSDPLogInfo(0,19,
"Using Sparse Delta S matrix\n");
117 info=DSDPCreateDSMatWithArray(n,ss,n1,&dsops,&dsmat); DSDPCHKERR(info);
119 DSDPLogInfo(0,19,
"Using Full Delta S matrix\n");
122 DSDPFunctionReturn(0);
127#define __FUNCT__ "CreateS1c"
128static int CreateS1c(
DSDPBlockData *ADATA,
int innz[],
int m,
int n,
int tnnz[],
int rnnz[],
int snnz[])
131 memset(rnnz,0,n*
sizeof(
int));
132 for (i=0;i<m;i++) innz[i]=1;
135 memset(tnnz,0,n*
sizeof(
int));
137 for (j=i+1; j<n; j++){
138 if (tnnz[j]>0){ *snnz=j; snnz++; rnnz[i]++;}
144static int dsdpuselapack=1;
146#define __FUNCT__ "SDPConeUseLAPACKForDualMatrix"
147int SDPConeUseLAPACKForDualMatrix(
SDPCone sdpcone,
int flag){
149 dsdpuselapack = flag;
150 DSDPFunctionReturn(0);
155#define __FUNCT__ "DSDPCreateS"
158 int nnz,n,n1,*cols,*rnnz,*tnnz,*iworkm,m,info;
159 int dsnnz,snnz,sfnnz;
165 info=DSDPVecGetSize(WY,&m);DSDPCHKERR(info);
166 info=DSDPVecGetArray(WY,&pss);DSDPCHKERR(info);
169 info=SDPConeVecGetSize(W1,&n);DSDPCHKERR(info);
170 info=SDPConeVecGetArray(W1,&pss);DSDPCHKERR(info);
172 info=SDPConeVecGetArray(W2,&pss);DSDPCHKERR(info);
175 DSDPLogInfo(0,19,
"Compute Sparsity\n");
176 info = CountNonzeros(ADATA, m, rnnz, iworkm, n, &dsnnz,&snnz); DSDPCHKERR(info);
180 info=DSDPCreateDS(ADATA,T,iworkm,m,n,dsnnz,rnnz,tnnz,DS);DSDPCHKERR(info);
183 info=DSDPDiagDualMatCreateP(n,&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
184 DSDPLogInfo(0,19,
"Using Diagonal S matrix\n");
185 }
else if (2*snnz+n+2<n*n/8){
188 info = CreateS1c(ADATA, iworkm, m, n, tnnz, rnnz, cols); DSDPCHKERR(info);
189 info=DSDPSparseDualMatCreate(n,rnnz,cols,trank,
'P',&sfnnz,&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
192 DSDPLogInfo(0,19,
"Count %d of %d nonzeros: Using Sparse S matrix\n",nnz,n*(n-1)/2);
193 DSDPLogInfo(0,19,
"Total rank of block: %d, n= %d\n",trank,n);
194 }
else if (n>20 && dsdpuselapack){
195 info=DSDPLAPACKSUDualMatCreate2P(n,&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
196 DSDPLogInfo(0,19,
"Count %d of %d nonzeros: Using Full Dense LAPACK S matrix\n",nnz,n*(n-1)/2);
197 }
else if (dsdpuselapack){
198 info=DSDPLAPACKPUDualMatCreate2(n,&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
199 DSDPLogInfo(0,19,
"Count %d of %d nonzeros: Using Packed Dense LAPACK S matrix\n",nnz,n*(n-1)/2);
201 info=DSDPDenseDualMatCreate(n,
'P',&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
202 DSDPLogInfo(0,19,
"Count %d of %d nonzeros: Using Dense S matrix\n",nnz,n*(n-1)/2);
207 DSDPFunctionReturn(0);
213#define __FUNCT__ "DSDPCreateDS2"
215 int i,n1,*cols,allnnz,info;
220 DSDPLogInfo(0,19,
"DS Matrix has %d nonzeros of %d\n",nnz,n*(n-1)/2);
222 info=DSDPCreateDiagDSMatU(n,&dsops,&dsmat); DSDPCHKERR(info);
223 DSDPLogInfo(0,19,
"Using Diagonal Delta S matrix\n");
224 }
else if (2*nnz +n < n*n/4){
227 info = CreateS1b(ADATA, iworkm, m, n, tnnz, rnnz, cols); DSDPCHKERR(info);
228 for (allnnz=0,i=0;i<n;i++){allnnz+=rnnz[i];}
229 info = DSDPSparseMatCreatePattern2U(n,rnnz,cols,allnnz,&dsops,&dsmat); DSDPCHKERR(info);
231 DSDPLogInfo(0,19,
"Using Sparse Delta S matrix\n");
234 info=DSDPCreateDSMatWithArray2(n,ss,n1,&dsops,&dsmat); DSDPCHKERR(info);
236 DSDPLogInfo(0,19,
"Using Full Delta S matrix\n");
239 DSDPFunctionReturn(0);
243#define __FUNCT__ "DSDPCreateS2"
246 int nnz,n,n1,*cols,*rnnz,*tnnz,*iworkm,m,info;
247 int dsnnz,snnz,sfnnz;
253 info=DSDPVecGetSize(WY,&m);DSDPCHKERR(info);
254 info=DSDPVecGetArray(WY,&pss);DSDPCHKERR(info);
257 info=SDPConeVecGetSize(W1,&n);DSDPCHKERR(info);
258 info=SDPConeVecGetArray(W1,&pss);DSDPCHKERR(info);
260 info=SDPConeVecGetArray(W2,&pss);DSDPCHKERR(info);
263 DSDPLogInfo(0,19,
"Compute Sparsity\n");
264 info = CountNonzeros(ADATA, m, rnnz, iworkm, n, &dsnnz,&snnz); DSDPCHKERR(info);
268 info=DSDPCreateDS2(ADATA,T,iworkm,m,n,dsnnz,rnnz,tnnz,DS);DSDPCHKERR(info);
271 info=DSDPDiagDualMatCreateU(n,&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
272 DSDPLogInfo(0,19,
"Using Diagonal S matrix\n");
273 }
else if (2*snnz+n+2<n*n/10){
276 info = CreateS1c(ADATA, iworkm, m, n, tnnz, rnnz, cols); DSDPCHKERR(info);
277 info=DSDPSparseDualMatCreate(n,rnnz,cols,trank,
'U',&sfnnz,&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
279 DSDPLogInfo(0,19,
"Count %d of %d nonzeros: Using Sparse S matrix\n",nnz,n*(n-1)/2);
280 }
else if (dsdpuselapack){
281 info=DSDPLAPACKSUDualMatCreate2(n,&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
282 DSDPLogInfo(0,19,
"Count %d of %d nonzeros: Using Full Dense LAPACK S matrix\n",nnz,n*(n-1)/2);
284 info=DSDPDenseDualMatCreate(n,
'U',&sops1,&smat1,&sops2,&smat2); DSDPCHKERR(info);
285 DSDPLogInfo(0,19,
"Count %d of %d nonzeros: Using Packed Dense S matrix\n",nnz,n*(n-1)/2);
290 DSDPFunctionReturn(0);
294int DSDPCreateS(
DSDPBlockData*,
char,
int,
DSDPVec,
DSDPVMat,
SDPConeVec,
SDPConeVec,
DSDPDualMat*,
DSDPDualMat*,
DSDPDSMat*,
void*);
297#define __FUNCT__ "DSDPCreateS"
314int DSDPCreateS(
DSDPBlockData *ADATA,
char UPLQ,
int trank,
DSDPVec WY,
DSDPVMat T,
SDPConeVec W1,
SDPConeVec W2,
DSDPDualMat *S,
DSDPDualMat *SS,
DSDPDSMat *DS,
void*ctx){
319 info=DSDPCreateS1(ADATA,trank,WY,T,W1,W2,S,SS,DS,ctx);DSDPCHKERR(info);
322 info=DSDPCreateS2(ADATA,trank,WY,T,W1,W2,S,SS,DS,ctx);DSDPCHKERR(info);
325 DSDPFunctionReturn(0);
331#define __FUNCT__ "DSDPCreateS"
332int DSDPUseDefaultDualMatrix(
SDPCone sdpcone){
338 DSDPFunctionReturn(0);
342#define __FUNCT__ "DSDPMakeVMat"
358 info=DSDPXMatPCreate(n,&xops,&xmat);DSDPCHKERR(info);
361 info=DSDPXMatUCreate(n,&xops,&xmat);DSDPCHKERR(info);
365 DSDPFunctionReturn(0);
369#define __FUNCT__ "DSDPMakeVMatWithArray"
388 info=DSDPXMatPCreateWithData(n,xx,nnz,&xops,&xmat);DSDPCHKERR(info);
391 info=DSDPXMatUCreateWithData(n,xx,nnz,&xops,&xmat);DSDPCHKERR(info);
395 DSDPFunctionReturn(0);
int DSDPBlockDataRowSparsity(DSDPBlockData *ADATA, int row, int ai[], int rnnz[], int n)
Determine sparsity pattern of data.
int DSDPDSMatSetData(DSDPDSMat *M, struct DSDPDSMat_Ops *ops, void *data)
Set the opaque pointer and function pointers to the matrix.
int DSDPDualMatSetData(DSDPDualMat *S, struct DSDPDualMat_Ops *ops, void *data)
Set the opaque pointer and function pointers to the matrix.
Internal SDPCone data structures and routines.
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 DSDPVMatSetData(DSDPVMat *X, struct DSDPVMat_Ops *ops, void *data)
Set opaque pointer an function pointers.
int DSDPVMatGetArray(DSDPVMat X, double **v, int *nn)
Get the array that stores the matrix.
int DSDPVMatRestoreArray(DSDPVMat X, double **v, int *nn)
Restore the array that stores the matrix.
int DSDPCreateS(DSDPBlockData *, char, int, DSDPVec, DSDPVMat, SDPConeVec, SDPConeVec, DSDPDualMat *, DSDPDualMat *, DSDPDSMat *, void *)
Create S1, S2, and DS.
int DSDPMakeVMat(char UPLQ, int n, DSDPVMat *X)
Allocate V matrix.
int DSDPMakeVMatWithArray(char UPLQ, double xx[], int nnz, int n, DSDPVMat *X)
Allocate V matrix using the given array.
Internal structure for data in one block of semidefintie.
Symmetric Delta S matrix for one block in the semidefinite cone.
Symmetric Delta S matrix for one block in the semidefinite cone.
Represents an S matrix for one block in the semidefinite cone.
Table of function pointers that operate on the S matrix.
Dense symmetric matrix for one block in the semidefinite cone.
Table of function pointers that operate on the dense matrix.
Vector whose length corresponds to dimension of a block in a cone.
Internal structure for semidefinite cone.