9 #define min(a,b) ((a <= b)? (a) : (b)) 12 #define max(a,b) ((a >= b)? (a) : (b)) 15 #define DSPPVecCheck(a,b) {if (a.dim != b.dim) return 1; if (a.dim>0 && (a.val==NULL || b.val==NULL) ) return 2;} 19 #define __FUNCT__ "DSDPVecCreateSeq" 22 info = DSDPVecCreateSeq(0,V);DSDPCHKERR(info);
27 #define __FUNCT__ "DSDPVecCreateSeq" 28 int DSDPVecCreateSeq(
int n ,
DSDPVec *V){
33 DSDPCALLOC2(&(V->val),
double,n,&info);DSDPCHKERR(info);
34 if (V->val==NULL)
return 1;
54 #define __FUNCT__ "DSDPVecDestroy" 58 DSDPFREE(&(*V).val,&info);DSDPCHKERR(info);
86 #define __FUNCT__ "DSDPVecView" 89 for (i=0; i<vec.dim; i++){
90 printf(
"%3.3e ",vec.val[i]);
97 #define __FUNCT__ "DSDPVecISet" 98 int DSDPVecISet(
int* ival,
DSDPVec V){
100 for (i=0;i<V.dim;i++){
107 #define __FUNCT__ "DSDPVecSetValue" 108 int DSDPVecSetValue(
DSDPVec V,
int row,
double value){
114 #define __FUNCT__ "DSDPVecZero" 118 memset((
void*)v,0,n*
sizeof(
double));
124 #define __FUNCT__ "DSDPVecNormalize" 125 int DSDPVecNormalize(
DSDPVec V){
128 info = DSDPVecNorm2(V,&vnorm);DSDPCHKERR(info);
129 if (vnorm==0){
return 1;}
131 info = DSDPVecScale(vnorm,V);DSDPCHKERR(info);
136 #define __FUNCT__ "DSDPVecSetBasis" 137 int DSDPVecSetBasis(
DSDPVec V,
int row){
145 #define __FUNCT__ "DSDPVecCopy" 149 double *val1=v1.val,*val2=v2.val;
152 memcpy(val2,val1,n*
sizeof(
double));
159 #define __FUNCT__ "DSDPVecSum" 160 int DSDPVecSum(
DSDPVec v,
double *vnorm){
167 if (*vnorm!=*vnorm)
return 1;
171 #define __FUNCT__ "DSDPVecNorm1" 172 int DSDPVecNorm1(
DSDPVec v,
double *vnorm){
173 ffinteger N=v.dim,INCX=1;
175 *vnorm=dasum(&N,v.val,&INCX);
176 if (*vnorm!=*vnorm)
return 1;
182 #define __FUNCT__ "DSDPVecDot" 184 ffinteger ione=1, nn=V1.dim;
185 double *v1=V1.val,*v2=V2.val;
186 *ans=ddot(&nn,v1,&ione,v2,&ione);
187 if (*ans!=*ans)
return 1;
193 #define __FUNCT__ "DSDPVecNorm22" 194 int DSDPVecNorm22(
DSDPVec VV,
double *vnorm){
195 ffinteger ione=1,nn=VV.dim;
197 dd=dnrm2(&nn,v,&ione);
199 if (*vnorm!=*vnorm)
return 1;
203 #define __FUNCT__ "DSDPVecNorm2" 204 int DSDPVecNorm2(
DSDPVec VV,
double *vnorm){
205 ffinteger ione=1,nn=VV.dim;
207 dd=dnrm2(&nn,v,&ione);
209 if (*vnorm!=*vnorm)
return 1;
214 #define __FUNCT__ "DSDPVecScale" 215 int DSDPVecScale(
double alpha,
DSDPVec VV){
216 ffinteger ione=1,nn=VV.dim;
218 dscal(&nn,&alpha,v,&ione);
223 #define __FUNCT__ "DSDPVecAXPY" 225 ffinteger ione=1,nn=x.dim;
226 double *yy=y.val,*xx=x.val;
227 if (alpha==0)
return 0;
228 daxpy(&nn,&alpha,xx,&ione,yy,&ione);
256 #define __FUNCT__ "DSDPVecNormInfinity" 257 int DSDPVecNormInfinity(
DSDPVec v,
double *vnorm){
265 *vnorm = max(*vnorm,fabs(val[i]));
267 if (*vnorm!=*vnorm)
return 1;
316 #define __FUNCT__ "DSDPVecWAXPBY" 320 double *yy=y.val,*xx=x.val,*ww=w.val;
324 for (ii=0; ii<n/4; ++ii){
326 ww[i] = (alpha)*xx[i] + (beta)*yy[i];
327 ww[i+1] = (alpha)*xx[i+1] + (beta)*yy[i+1];
328 ww[i+2] = (alpha)*xx[i+2] + (beta)*yy[i+2];
329 ww[i+3] = (alpha)*xx[i+3] + (beta)*yy[i+3];
331 for (i=4*(n/4); i<n; ++i){
332 ww[i] = (alpha)*xx[i] + (beta)*yy[i];
339 #define __FUNCT__ "DSDPVecWAXPY" 342 info=DSDPVecCopy(y,w);
343 info=DSDPVecAXPY(alpha,x,w);
349 #define __FUNCT__ "DSDPVecAYPX" 353 double *yy=y.val,*xx=x.val;
356 for (ii=0; ii<n/4; ++ii){
358 yy[i] = xx[i]+(alpha)*yy[i];
359 yy[i+1] = xx[i+1]+(alpha)*yy[i+1];
360 yy[i+2] = xx[i+2]+(alpha)*yy[i+2];
361 yy[i+3] = xx[i+3]+(alpha)*yy[i+3];
363 for (i=4*(n/4); i<n; ++i){
364 yy[i] = xx[i]+(alpha)*yy[i];
371 #define __FUNCT__ "DSDPVecAYPX" 375 double *yy=y.val,*xx=x.val;
378 for (ii=0; ii<n/4; ++ii){
380 yy[i] = (alpha)*xx[i];
381 yy[i+1] = (alpha)*xx[i+1];
382 yy[i+2] = (alpha)*xx[i+2];
383 yy[i+3] = (alpha)*xx[i+3];
385 for (i=4*(n/4); i<n; ++i){
386 yy[i] = (alpha)*xx[i];
393 #define __FUNCT__ "DSDPVecDuplicate" 396 info = DSDPVecCreateSeq(n ,V2);DSDPCHKERR(info);
402 #define __FUNCT__ "DSDPVecSet" 403 int DSDPVecSet(
double alpha,
DSDPVec V){
409 memset((
void*)val,0,n*
sizeof(
double));
412 for (ii=0; ii<n/4; ++ii){
414 val[i] = val[i+1] = val[i+2] = val[i+3] = alpha;
416 for (i=4*(n/4); i<n; ++i){
446 #define __FUNCT__ "DSDPVecPointwiseMin" 450 double *v1=V1.val,*v2=V2.val,*v3=V3.val;
455 v3[i]=DSDPMin(v2[i],v1[i]);
462 #define __FUNCT__ "DSDPVecPointwiseMax" 466 double *v1=V1.val,*v2=V2.val,*v3=V3.val;
471 v3[i]=DSDPMax(v2[i],v1[i]);
477 #define __FUNCT__ "DSDPVecPointwiseMult" 481 double *v1=V1.val,*v2=V2.val,*v3=V3.val;
485 for (ii=0; ii<n/4; ++ii){
488 v3[i+1]=v1[i+1]*v2[i+1];
489 v3[i+2]=v1[i+2]*v2[i+2];
490 v3[i+3]=v1[i+3]*v2[i+3];
492 for (i=4*(n/4); i<n; i++){
500 #define __FUNCT__ "DSDPVecPointwiseDivide" 504 double *v1=V1.val,*v2=V2.val,*v3=V3.val;
508 for (ii=0; ii<n/4; ++ii){
510 v3[i]=v1[i]/v2[i]; v3[i+1]=v1[i+1]/v2[i+1]; v3[i+2]=v1[i+2]/v2[i+2]; v3[i+3]=v1[i+3]/v2[i+3];
512 for (i=4*(n/4); i<n; i++){
520 #define __FUNCT__ "DSDPVecShift" 521 int DSDPVecShift(
double alpha,
DSDPVec V){
532 #define __FUNCT__ "DSDPVecSemiNorm" 533 int DSDPVecSemiNorm(
DSDPVec V,
double *ans){
538 for (i=0; i<V.dim; i++){
539 dtmp=min(V.val[i],dtmp);
542 if (*ans!=*ans)
return 1;
548 #define __FUNCT__ "DSDPVecReciprocal" 549 int DSDPVecReciprocal(
DSDPVec V){
562 #define __FUNCT__ "DSDPVecReciprocalSqrt" 563 int DSDPVecReciprocalSqrt(
DSDPVec V){
569 val[i]= sqrt(1.0/val[i]);
576 #define __FUNCT__ "DSDPVecAbsoluteValue" 577 int DSDPVecAbsoluteValue(
DSDPVec V){
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.
Error handling, printing, and profiling.
Vector operations used by the solver.
DSDP uses BLAS and LAPACK for many of its operations.