17static int RCMatDestroy(
void*);
18static int RCMatView(
void*);
19static int RCMatVecVec(
void*,
double[],
int,
double *);
20static int RCMatDot(
void*,
double[],
int,
int,
double *);
21static int RCMatGetRank(
void*,
int*,
int);
22static int RCMatFactor(
void*);
23static int RCMatGetEig(
void*,
int,
double*,
double[],
int,
int[],
int*);
24static int RCMatAddRowMultiple(
void*,
int,
double,
double[],
int);
25static int RCMatAddMultiple(
void*,
double,
double[],
int,
int);
26static int RCMatGetRowNnz(
void*,
int,
int[],
int*,
int);
28static int RCMatCreate(
int n,
int rowcol,
const double v[], rcmat**M){
30 M16=(rcmat*) malloc(1*
sizeof(rcmat));
38static int RCMatDestroy(
void* AA){
42static 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];}
51static 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];}
62static 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]);
73static 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);
90static int RCMatGetRank(
void *A,
int*rank,
int n){
95static 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;}
116static 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;}
125static 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];
134static 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){
146static int RCMatFNorm(
void*A,
int n,
double *fnorm){
150 const double *val=RC->val;
155 ff+=2*val[rc]*val[rc];
159static int RCMatCountNonzeros(
void*A,
int *nnz,
int n){
164static const char *datamatname=
"One Row and Column matrix";
165static 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"
189int 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);
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,...
Error handling, printing, and profiling.
Table of function pointers that operate on the data matrix.