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"
28int 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"
98int DSDPVecISet(
int* ival,
DSDPVec V){
100 for (i=0;i<V.dim;i++){
107#define __FUNCT__ "DSDPVecSetValue"
108int DSDPVecSetValue(
DSDPVec V,
int row,
double value){
114#define __FUNCT__ "DSDPVecZero"
118 memset((
void*)v,0,n*
sizeof(
double));
124#define __FUNCT__ "DSDPVecNormalize"
125int 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"
137int 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"
160int DSDPVecSum(
DSDPVec v,
double *vnorm){
167 if (*vnorm!=*vnorm)
return 1;
171#define __FUNCT__ "DSDPVecNorm1"
172int 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"
194int 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"
204int 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"
215int 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"
257int 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"
403int 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"
521int DSDPVecShift(
double alpha,
DSDPVec V){
532#define __FUNCT__ "DSDPVecSemiNorm"
533int 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"
549int DSDPVecReciprocal(
DSDPVec V){
562#define __FUNCT__ "DSDPVecReciprocalSqrt"
563int DSDPVecReciprocalSqrt(
DSDPVec V){
569 val[i]= sqrt(1.0/val[i]);
576#define __FUNCT__ "DSDPVecAbsoluteValue"
577int DSDPVecAbsoluteValue(
DSDPVec V){
DSDP uses BLAS and LAPACK for many of its operations.
Error handling, printing, and profiling.
Vector operations used by the solver.
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.