17 static int RCMatDestroy(
void*);
18 static int RCMatView(
void*);
19 static int RCMatVecVec(
void*,
double[],
int,
double *);
20 static int RCMatDot(
void*,
double[],
int,
int,
double *);
21 static int RCMatGetRank(
void*,
int*,
int);
22 static int RCMatFactor(
void*);
23 static int RCMatGetEig(
void*,
int,
double*,
double[],
int,
int[],
int*);
24 static int RCMatAddRowMultiple(
void*,
int,
double,
double[],
int);
25 static int RCMatAddMultiple(
void*,
double,
double[],
int,
int);
26 static int RCMatGetRowNnz(
void*,
int,
int[],
int*,
int);
28 static int RCMatCreate(
int n,
int rowcol,
const double v[], rcmat**M){
30 M16=(rcmat*) malloc(1*
sizeof(rcmat));
38 static int RCMatDestroy(
void* AA){
42 static int RCMatVecVec(
void* A,
double x[],
int n,
double *v){
46 const double *val=RC->val;
47 for (i=0;i<n;i++){ vv+=val[i]*x[i];}
51 static int RCMatDot(
void* A,
double x[],
int nn,
int n1,
double *v){
53 int i,k=0,rc=RC->rc,n=RC->n;
55 const double *val=RC->val;
57 for (i=0;i<=rc;i++,k++){ vv+=v[k]*val[i]; }
58 for (i=rc+1;i<n;i++,k+=i){ vv+=v[k+rc]*val[i];}
62 static int RCMatView(
void* A){
65 printf(
"Row Col %d\n",RC->rc);
66 for (i=0;i<RC->n;i++){
67 printf(
"%4.4e ",RC->val[i]);
73 static int RCMatFactor(
void* A){
78 const double *val=RC->val;
79 for (i=0;i<RC->n;i++){ vnorm2+=val[i]*val[i];}
83 RC->x=sqrt(2*val[rc]+RC->y*RC->y);
86 RC->y=-sqrt(-2*val[rc]+RC->x*RC->x);
90 static int RCMatGetRank(
void *A,
int*rank,
int n){
95 static int RCMatGetEig(
void*A,
int neig,
double *eig,
double v[],
int n,
int spind[],
int *nind){
98 double x=RC->x,y=RC->y,xmy=x-y;
99 const double *val=RC->val;
101 for (i=0;i<n;i++){spind[i]=i;}
102 for (i=0;i<n;i++){v[i]=val[i]/xmy;}
107 for (i=0;i<n;i++){spind[i]=i;}
108 for (i=0;i<n;i++){v[i]=val[i]/xmy;}
112 }
else { *eig=0;*nind=0;}
116 static int RCMatGetRowNnz(
void*A,
int nrow,
int nz[],
int *nnzz,
int n){
120 if (nrow==RC->rc){
for (i=0;i<n;i++){nz[i]++;}*nnzz=n;}
125 static int RCMatAddRowMultiple(
void*A,
int nrow,
double dd,
double rrow[],
int n){
129 for (i=0;i<n;i++){rrow[i]+=dd*RC->val[i];}
131 rrow[nrow]+=dd*RC->val[nrow];
134 static int RCMatAddMultiple(
void*A,
double dd,
double vv[],
int nn,
int n1){
136 int i,rc=RC->rc,k=rc*(rc+1)/2,n=RC->n;
137 const double *val=RC->val;
138 for (i=0;i<=rc;i++,k++){
141 for (i=rc+1;i<n;i++,k+=i){
146 static int RCMatFNorm(
void*A,
int n,
double *fnorm){
150 const double *val=RC->val;
155 ff+=2*val[rc]*val[rc];
159 static int RCMatCountNonzeros(
void*A,
int *nnz,
int n){
164 static const char *datamatname=
"One Row and Column matrix";
165 static int RCMatOperationsInitialize(
struct DSDPDataMat_Ops* rcmatoperator){
167 if (rcmatoperator==NULL)
return 0;
169 rcmatoperator->matfactor1=RCMatFactor;
170 rcmatoperator->matgetrank=RCMatGetRank;
171 rcmatoperator->matgeteig=RCMatGetEig;
172 rcmatoperator->matvecvec=RCMatVecVec;
173 rcmatoperator->matrownz=RCMatGetRowNnz;
174 rcmatoperator->matdot=RCMatDot;
175 rcmatoperator->matfnorm2=RCMatFNorm;
176 rcmatoperator->matnnz=RCMatCountNonzeros;
177 rcmatoperator->mataddrowmultiple=RCMatAddRowMultiple;
178 rcmatoperator->mataddallmultiple=RCMatAddMultiple;
179 rcmatoperator->matdestroy=RCMatDestroy;
180 rcmatoperator->matview=RCMatView;
181 rcmatoperator->matname=datamatname;
182 rcmatoperator->id=27;
188 #define __FUNCT__ "DSDPGetRCMat"
189 int DSDPGetRCMat(
int n,
const double val[],
int rowcol,
struct DSDPDataMat_Ops**sops,
void**smat){
193 info=RCMatCreate(n,rowcol,val,&AA);DSDPCHKERR(info);
194 info=RCMatOperationsInitialize(&rcmatops); DSDPCHKERR(info);
195 if (sops){*sops=&rcmatops;}
196 if (smat){*smat=(
void*)AA;}
197 DSDPFunctionReturn(0);