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;