18 static int R1MatDestroy(
void*);
19 static int R1MatView(
void*);
20 static int R1MatVecVec(
void*,
double[],
int,
double *);
21 static int R1MatDotP(
void*,
double[],
int,
int,
double *);
22 static int R1MatDotU(
void*,
double[],
int,
int,
double *);
23 static int R1MatGetRank(
void*,
int*,
int);
24 static int R1MatFactor(
void*);
25 static int R1MatGetEig(
void*,
int,
double*,
double[],
int,
int[],
int*);
26 static int R1MatRowNnz(
void*,
int,
int[],
int*,
int);
27 static int R1MatAddRowMultiple(
void*,
int,
double,
double[],
int);
28 static int R1MatAddMultipleP(
void*,
double,
double[],
int,
int);
29 static int R1MatAddMultipleU(
void*,
double,
double[],
int,
int);
38 #define __FUNCT__ "DSDPGetR1Mat" 39 int DSDPGetR1Mat(
int n,
double ev,
int ishift,
const int spai[],
const double spval[],
int nnz,
char UPLQ,
void**mmat){
44 if (spai[i]-ishift<0 || spai[i]-ishift >=n){
45 printf(
"Invalid entry: Entry %d . Is %d <= %d < %d?\n",i,ishift,spai[i],n+ishift);
49 AA=(r1mat*) malloc(1*
sizeof(r1mat));
50 if (AA==NULL)
return 1;
58 if (mmat){*mmat=(
void*)AA;}
59 DSDPFunctionReturn(0);
63 #define __FUNCT__ "DSDPGetR1PMat" 80 info=DSDPGetR1Mat(n,ev,ishift,spai,spval,nnz,
'P',mmat);
81 info=R1MatOpsInitializeP(&r1matopsP);
if(info){
return 1;}
82 if (mops){*mops=&r1matopsP;}
83 DSDPFunctionReturn(0);
87 #define __FUNCT__ "DSDPGetR1UMat" 104 info=DSDPGetR1Mat(n,ev,ishift,spai,spval,nnz,
'U',mmat);
105 info=R1MatOpsInitializeU(&r1matopsU);
if(info){
return 1;}
106 if (mops){*mops=&r1matopsU;}
107 DSDPFunctionReturn(0);
110 static int R1MatDotP(
void* A,
double x[],
int nn,
int n,
double *v){
111 r1mat* AA = (r1mat*)A;
113 int nnz=AA->nnz,ishift=AA->ishift;
114 const int *ai=AA->spai;
116 const double *val=AA->spval;
124 dtmp+=2*x[i3+j2]*d3*val[j];
132 static int R1MatDotU(
void* A,
double x[],
int nn,
int n,
double *v){
133 r1mat* AA = (r1mat*)A;
135 int nnz=AA->nnz,ishift=AA->ishift;
136 const int *ai=AA->spai;
137 const double *val=AA->spval;
147 dtmp+=2*x[i3+j2]*d3*val[j];
155 static int R1MatVecVec(
void* A,
double x[],
int n,
double *v){
157 r1mat* AA = (r1mat*)A;
159 const double *val=AA->spval;
160 int i,ishift=AA->ishift,nnz=AA->nnz;
161 const int *ai=AA->spai;
162 for (i=0; i<nnz; i++){
163 dtmp+=val[i] * x[ai[i]-ishift];
169 static int R1MatAddMultipleP(
void*A,
double dd,
double vv[],
int nn,
int n){
170 r1mat* AA = (r1mat*)A;
172 int nnz=AA->nnz,ishift=AA->ishift;
173 const int *ai=AA->spai;
174 const double *val=AA->spval;
175 double d3,ddd=dd*AA->ev;
183 vv[i3+j2]+=d3*val[j];
189 static int R1MatAddMultipleU(
void*A,
double dd,
double vv[],
int nn,
int n){
190 r1mat* AA = (r1mat*)A;
192 int nnz=AA->nnz,ishift=AA->ishift;
193 const int *ai=AA->spai;
194 const double *val=AA->spval;
195 double d3,ddd=dd*AA->ev;
203 vv[i3+j2]+=d3*val[j];
210 static int R1MatAddRowMultiple(
void*A,
int nrow,
double dd,
double row[],
int n){
211 r1mat* AA = (r1mat*)A;
212 int nnz=AA->nnz,ishift=AA->ishift;
213 const int *ai=AA->spai;
214 const double *val=AA->spval;
215 double ddd=dd*AA->ev;
218 if (ai[i]-ishift==nrow){
220 row[ai[j]-ishift]+= ddd*val[i]*val[j];
228 static int R1MatFactor(
void*A){
233 static int R1MatGetRank(
void *A,
int*rank,
int n){
238 static int R1MatGetEig(
void*A,
int neig,
double *eig,
double v[],
int n,
int indx[],
int*nind){
239 r1mat* AA = (r1mat*)A;
240 int i,aii,ishift=AA->ishift,nnz=AA->nnz;
241 const int *ai=AA->spai;
242 const double *val=AA->spval;
243 for (i=0;i<n;i++){ v[i]=0.0; }
251 *eig=AA->ev; *nind=AA->nnz;
257 static int R1MatRowNnz(
void*A,
int row,
int nz[],
int *rnnz,
int n){
258 r1mat* AA = (r1mat*)A;
260 int nnz=AA->nnz,ishift=AA->ishift;
261 const int *ai=AA->spai;
264 if (ai[i]-ishift==row){
274 static int R1MatFNorm2(
void*A,
int n,
double *fnorm2){
275 r1mat* AA = (r1mat*)A;
277 const double *val=AA->spval;
282 *fnorm2=dd*dd*AA->ev*AA->ev;
286 static int R1MatCountNonzeros(
void*A,
int *nnz,
int n){
287 r1mat* AA = (r1mat*)A;
288 *nnz=AA->nnz*AA->nnz;
293 static int R1MatView(
void* A){
295 r1mat* AA = (r1mat*)A;
296 printf(
"This matrix is %4.8e times the outer product of \n",AA->ev);
297 for (i=0;i<AA->nnz;i++){
298 printf(
"%d %4.8e \n",AA->spai[i],AA->spval[i]);
304 static int R1MatDestroy(
void* A){
309 static const char *datamatname=
"RANK 1 Outer Product";
312 if (r1matops==NULL)
return 0;
314 r1matops->matfactor1=R1MatFactor;
315 r1matops->matgetrank=R1MatGetRank;
316 r1matops->matgeteig=R1MatGetEig;
317 r1matops->matvecvec=R1MatVecVec;
318 r1matops->matdot=R1MatDotP;
319 r1matops->mataddrowmultiple=R1MatAddRowMultiple;
320 r1matops->mataddallmultiple=R1MatAddMultipleP;
321 r1matops->matdestroy=R1MatDestroy;
322 r1matops->matview=R1MatView;
323 r1matops->matrownz=R1MatRowNnz;
324 r1matops->matfnorm2=R1MatFNorm2;
325 r1matops->matnnz=R1MatCountNonzeros;
327 r1matops->matname=datamatname;
332 if (r1matops==NULL)
return 0;
334 r1matops->matfactor1=R1MatFactor;
335 r1matops->matgetrank=R1MatGetRank;
336 r1matops->matgeteig=R1MatGetEig;
337 r1matops->matvecvec=R1MatVecVec;
338 r1matops->matdot=R1MatDotU;
339 r1matops->mataddrowmultiple=R1MatAddRowMultiple;
340 r1matops->mataddallmultiple=R1MatAddMultipleU;
341 r1matops->matdestroy=R1MatDestroy;
342 r1matops->matview=R1MatView;
343 r1matops->matrownz=R1MatRowNnz;
344 r1matops->matfnorm2=R1MatFNorm2;
345 r1matops->matnnz=R1MatCountNonzeros;
347 r1matops->matname=datamatname;
int DSDPGetR1UMat(int n, double ev, int ishift, const int spai[], const double spval[], int nnz, struct DSDPDataMat_Ops **mops, void **mmat)
Create a rank one matrix usuable by DSDP in full symmetric format.
Error handling, printing, and profiling.
int DSDPDataMatOpsInitialize(struct DSDPDataMat_Ops *dops)
Initialize the table of function pointers for SDP Data matrices.
Structure of function pointers that each SDP data matrix type (sparse, dense, constant,...
Table of function pointers that operate on the data matrix.
int DSDPGetR1PMat(int n, double ev, int ishift, const int spai[], const double spval[], int nnz, struct DSDPDataMat_Ops **mops, void **mmat)
Create a rank one matrix usuable by DSDP in packed symmetric format.