00001 #include "dsdpdatamat_impl.h"
00002 #include "dsdpsys.h"
00008 typedef struct {
00009 int n;
00010 double dm;
00011 } identitymat;
00012
00013
00014 static int IdentityMatDestroy(void*);
00015 static int IdentityMatView(void*);
00016 static int IdentityMatVecVec(void*, double[], int, double *);
00017 static int IdentityMatDotP(void*, double[], int, int, double*);
00018 static int IdentityMatDotF(void*, double[], int, int, double*);
00019 static int IdentityMatGetRank(void*, int*,int);
00020 static int IdentityMatFactor(void*);
00021 static int IdentityMatGetEig(void*, int, double*, double[], int,int[],int*);
00022 static int IdentityMatAddRowMultiple(void*, int, double, double[], int);
00023 static int IdentityMatAddMultipleP(void*, double, double[], int, int);
00024 static int IdentityMatAddMultipleF(void*, double, double[], int, int);
00025 static int IdentityMatGetRowNnz(void*, int, int[], int*, int);
00026
00027 static struct DSDPDataMat_Ops identitymatopsp;
00028 static struct DSDPDataMat_Ops identitymatopsf;
00029 static int IdentitymatOperationsInitializeP(struct DSDPDataMat_Ops*);
00030 static int IdentitymatOperationsInitializeF(struct DSDPDataMat_Ops*);
00031
00032
00042 #undef __FUNCT__
00043 #define __FUNCT__ "DSDPSetIdentityP"
00044 int DSDPGetIdentityDataMatP(int n, double val, struct DSDPDataMat_Ops** dops, void** imat){
00045 int info;
00046 identitymat *AA;
00047
00048 DSDPFunctionBegin;
00049 AA=(identitymat*) malloc(1*sizeof(identitymat));
00050 AA->dm=val;
00051 AA->n=n;
00052 info=IdentitymatOperationsInitializeP(&identitymatopsp); DSDPCHKERR(info);
00053 if (dops){*dops=&identitymatopsp;}
00054 if (imat){*imat=(void*)AA;}
00055 DSDPFunctionReturn(0);
00056 }
00057
00067 #undef __FUNCT__
00068 #define __FUNCT__ "DSDPSetIdentityF"
00069 int DSDPGetIdentityDataMatF(int n, double val, struct DSDPDataMat_Ops** dops, void** imat){
00070 int info;
00071 identitymat *AA;
00072
00073 DSDPFunctionBegin;
00074 AA=(identitymat*) malloc(1*sizeof(identitymat));
00075 AA->dm=val;
00076 AA->n=n;
00077 info=IdentitymatOperationsInitializeF(&identitymatopsf); DSDPCHKERR(info);
00078 if (dops){*dops=&identitymatopsf;}
00079 if (imat){*imat=(void*)AA;}
00080 DSDPFunctionReturn(0);
00081 }
00082
00083 static int IdentityMatDestroy(void* AA){
00084 free(AA);
00085 return 0;
00086 }
00087
00088
00089 static int IdentityMatVecVec(void* AA, double x[], int n, double *v){
00090 identitymat* A=(identitymat*)AA;
00091 int i;
00092 *v=0;
00093 for (i=0;i<n;i++){
00094 *v+=x[i]*x[i];
00095 }
00096 *v *= A->dm;
00097 return 0;
00098 }
00099
00100 static int IdentityMatDotP(void* AA, double x[], int nn, int n, double *v){
00101 identitymat* A=(identitymat*)AA;
00102 int i;
00103 double *xx=x;
00104 *v=0;
00105 for (i=0;i<n;i++){
00106 *v+=*xx;
00107 xx+=i+2;
00108 }
00109 *v *= 2*A->dm;
00110 return 0;
00111 }
00112
00113 static int IdentityMatDotF(void* AA, double x[], int nn, int n, double *v){
00114 identitymat* A=(identitymat*)AA;
00115 int i;
00116 double *xx=x;
00117 *v=0;
00118 for (i=0;i<n;i++){
00119 *v+=*xx;
00120 xx+=n+1;
00121 }
00122 *v *= 2*A->dm;
00123 return 0;
00124 }
00125
00126 static int IdentityMatFNorm2(void* AA, int n, double *v){
00127 identitymat* A=(identitymat*)AA;
00128 *v=A->n*A->dm*A->dm;
00129 return 0;
00130 }
00131
00132 static int IdentityMatView(void* AA){
00133 identitymat* A=(identitymat*)AA;
00134 printf("Multiple of Identity matrix: All Diagonal elements equal %8.8e \n",A->dm);
00135 return 0;
00136 }
00137
00138 static int IdentityMatGetRank(void *AA, int*rank, int n){
00139 identitymat* A=(identitymat*)AA;
00140 *rank=A->n;;
00141 return 0;
00142 }
00143
00144 static int IdentityMatFactor(void*A){
00145 return 0;
00146 }
00147
00148 static int IdentityMatGetEig(void*AA, int neig, double *eig, double v[], int n, int* indx, int *nind){
00149 identitymat* A = (identitymat*)AA;
00150
00151 if (neig<0 || neig>= A->n){ *eig=0; return 0;}
00152 memset((void*)v,0,(A->n)*sizeof(double));
00153 v[neig]=1.0;
00154 indx[0]=neig;
00155 *nind=1;
00156 *eig=A->dm;
00157 return 0;
00158 }
00159
00160 static int IdentityMatGetRowNnz(void*A, int nrow, int nz[], int *nnzz, int n){
00161 identitymat* AA = (identitymat*)A;
00162 if (nrow>=0 && nrow < AA->n){
00163 *nnzz=1;
00164 nz[nrow]++;
00165 } else {
00166 *nnzz=0;
00167 }
00168 return 0;
00169 }
00170
00171 static int IdentityMatCountNonzeros(void*A, int *nnz, int n){
00172 identitymat* AA = (identitymat*)A;
00173 *nnz=AA->n;
00174 return 0;
00175 }
00176
00177 static int IdentityMatAddRowMultiple(void*A, int nrow, double dd, double rrow[], int n){
00178 identitymat* AA = (identitymat*)A;
00179 rrow[nrow] += dd*AA->dm;
00180 return 0;
00181 }
00182
00183 static int IdentityMatAddMultipleP(void*A, double dd, double vv[], int nn, int n){
00184 identitymat* AA = (identitymat*)A;
00185 double *v=vv,dm=dd*AA->dm;
00186 int i;
00187 for (i=0;i<n;i++){
00188 *v += dm;
00189 v+= i+2;
00190 }
00191 return 0;
00192 }
00193
00194 static int IdentityMatAddMultipleF(void*A, double dd, double vv[], int nn, int n){
00195 identitymat* AA = (identitymat*)A;
00196 double *v=vv,dm=dd*AA->dm;
00197 int i;
00198 for (i=0;i<n;i++){
00199 *v += dm;
00200 v+= n+1;
00201 }
00202 return 0;
00203 }
00204
00205 static const char *datamatname="MULTIPLE OF IDENTITY";
00206
00207 static int IdentitymatOperationsInitializeP(struct DSDPDataMat_Ops* spdiagops){
00208 int info;
00209 if (spdiagops==NULL) return 0;
00210 info=DSDPDataMatOpsInitialize(spdiagops); if (info){return info;}
00211 spdiagops->matfactor1=IdentityMatFactor;
00212 spdiagops->matgetrank=IdentityMatGetRank;
00213 spdiagops->matgeteig=IdentityMatGetEig;
00214 spdiagops->matvecvec=IdentityMatVecVec;
00215 spdiagops->matrownz=IdentityMatGetRowNnz;
00216 spdiagops->matdot=IdentityMatDotP;
00217 spdiagops->matfnorm2=IdentityMatFNorm2;
00218 spdiagops->matnnz=IdentityMatCountNonzeros;
00219 spdiagops->mataddrowmultiple=IdentityMatAddRowMultiple;
00220 spdiagops->mataddallmultiple=IdentityMatAddMultipleP;
00221 spdiagops->matdestroy=IdentityMatDestroy;
00222 spdiagops->matview=IdentityMatView;
00223 spdiagops->id=12;
00224 spdiagops->matname=datamatname;
00225 return 0;
00226 }
00227
00228 static int IdentitymatOperationsInitializeF(struct DSDPDataMat_Ops* spdiagops){
00229 int info;
00230 if (spdiagops==NULL) return 0;
00231 info=DSDPDataMatOpsInitialize(spdiagops); if (info){return info;}
00232 spdiagops->matfactor1=IdentityMatFactor;
00233 spdiagops->matgetrank=IdentityMatGetRank;
00234 spdiagops->matgeteig=IdentityMatGetEig;
00235 spdiagops->matvecvec=IdentityMatVecVec;
00236 spdiagops->matrownz=IdentityMatGetRowNnz;
00237 spdiagops->matdot=IdentityMatDotF;
00238 spdiagops->matfnorm2=IdentityMatFNorm2;
00239 spdiagops->matnnz=IdentityMatCountNonzeros;
00240 spdiagops->mataddrowmultiple=IdentityMatAddRowMultiple;
00241 spdiagops->mataddallmultiple=IdentityMatAddMultipleF;
00242 spdiagops->matdestroy=IdentityMatDestroy;
00243 spdiagops->matview=IdentityMatView;
00244 spdiagops->id=12;
00245 spdiagops->matname=datamatname;
00246 return 0;
00247 }