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);
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, identity, ...) must implement.
Table of function pointers that operate on the data matrix.