/home/coin/SVN-release/CoinAll-1.1.0/Clp/src/ClpHelperFunctions.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2003, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #ifndef ClpHelperFunctions_H
00004 #define ClpHelperFunctions_H
00005 
00014 double maximumAbsElement(const double * region, int size);
00015 void setElements(double * region, int size, double value);
00016 void multiplyAdd(const double * region1, int size, double multiplier1,
00017                  double * region2, double multiplier2);
00018 double innerProduct(const double * region1, int size, const double * region2);
00019 void getNorms(const double * region, int size, double & norm1, double & norm2);
00020 
00022 #ifdef ClpPdco_H
00023 
00024 
00025 inline double pdxxxmerit(int nlow, int nupp, int *low, int *upp, CoinDenseVector <double> &r1,
00026                 CoinDenseVector <double> &r2, CoinDenseVector <double> &rL,
00027                 CoinDenseVector <double> &rU, CoinDenseVector <double> &cL,
00028                 CoinDenseVector <double> &cU ){
00029 
00030 // Evaluate the merit function for Newton's method.
00031 // It is the 2-norm of the three sets of residuals.
00032   double sum1, sum2;
00033   CoinDenseVector <double> f(6);
00034   f[0] = r1.twoNorm();
00035   f[1] = r2.twoNorm();
00036   sum1 = sum2 = 0.0;
00037   for (int k=0; k<nlow; k++){
00038     sum1 += rL[low[k]]*rL[low[k]];
00039     sum2 += cL[low[k]]*cL[low[k]];
00040   }
00041   f[2] = sqrt(sum1);
00042   f[4] = sqrt(sum2);
00043   sum1 = sum2 = 0.0;
00044   for (int k=0; k<nupp; k++){
00045     sum1 += rL[upp[k]]*rL[upp[k]];
00046     sum2 += cL[upp[k]]*cL[upp[k]];
00047   }
00048   f[3] = sqrt(sum1);
00049   f[5] = sqrt(sum2);
00050 
00051   return f.twoNorm();
00052 }
00053 
00054 //-----------------------------------------------------------------------
00055 // End private function pdxxxmerit
00056 //-----------------------------------------------------------------------
00057 
00058 
00059 //function [r1,r2,rL,rU,Pinf,Dinf] =    ...
00060 //      pdxxxresid1( Aname,fix,low,upp, ...
00061 //                   b,bl,bu,d1,d2,grad,rL,rU,x,x1,x2,y,z1,z2 )
00062 
00063 inline void pdxxxresid1(ClpPdco *model, const int nlow, const int nupp, const int nfix,
00064                  int *low, int *upp, int *fix,
00065                  CoinDenseVector <double> &b, double *bl, double *bu, double d1, double d2,
00066                  CoinDenseVector <double> &grad, CoinDenseVector <double> &rL,
00067                  CoinDenseVector <double> &rU, CoinDenseVector <double> &x,
00068                  CoinDenseVector <double> &x1, CoinDenseVector <double> &x2,
00069                  CoinDenseVector <double> &y,  CoinDenseVector <double> &z1,
00070                  CoinDenseVector <double> &z2, CoinDenseVector <double> &r1,
00071                  CoinDenseVector <double> &r2, double *Pinf, double *Dinf){
00072 
00073 // Form residuals for the primal and dual equations.
00074 // rL, rU are output, but we input them as full vectors
00075 // initialized (permanently) with any relevant zeros.
00076 
00077 // Get some element pointers for efficiency
00078   double *x_elts  = x.getElements();
00079   double *r2_elts = r2.getElements();
00080   
00081   for (int k=0; k<nfix; k++)
00082     x_elts[fix[k]]  = 0;
00083 
00084   r1.clear();
00085   r2.clear();   
00086   model->matVecMult( 1, r1, x );
00087   model->matVecMult( 2, r2, y );
00088   for (int k=0; k<nfix; k++)
00089     r2_elts[fix[k]]  = 0;
00090 
00091 
00092   r1      = b    - r1 - d2*d2*y;
00093   r2      = grad - r2 - z1;              // grad includes d1*d1*x
00094   if(nupp > 0)       
00095     r2    = r2 + z2;   
00096 
00097   for (int k=0; k<nlow; k++)
00098     rL[low[k]] = bl[low[k]] - x[low[k]] + x1[low[k]];
00099   for (int k=0; k<nupp; k++)
00100     rU[upp[k]] = - bu[upp[k]] + x[upp[k]] + x2[upp[k]];
00101 
00102   double normL = 0.0;
00103   double normU = 0.0;
00104   for (int k=0; k<nlow; k++)
00105     if (rL[low[k]] > normL) normL = rL[low[k]];
00106   for (int k=0; k<nupp; k++)
00107     if (rU[upp[k]] > normU) normU = rU[upp[k]];
00108 
00109   *Pinf    = CoinMax(normL, normU);  
00110   *Pinf    = CoinMax( r1.infNorm() , *Pinf );
00111   *Dinf    = r2.infNorm();
00112   *Pinf    = CoinMax( *Pinf, 1e-99 );
00113   *Dinf    = CoinMax( *Dinf, 1e-99 );
00114 }
00115 
00116 //-----------------------------------------------------------------------
00117 // End private function pdxxxresid1
00118 //-----------------------------------------------------------------------
00119 
00120 
00121 //function [cL,cU,center,Cinf,Cinf0] = ...
00122 //      pdxxxresid2( mu,low,upp,cL,cU,x1,x2,z1,z2 )
00123 
00124 inline void pdxxxresid2(double mu, int nlow, int nupp, int *low, int *upp,
00125                  CoinDenseVector <double> &cL, CoinDenseVector <double> &cU,
00126                  CoinDenseVector <double> &x1, CoinDenseVector <double> &x2,
00127                  CoinDenseVector <double> &z1, CoinDenseVector <double> &z2,
00128                  double *center, double *Cinf, double *Cinf0){
00129 
00130 // Form residuals for the complementarity equations.
00131 // cL, cU are output, but we input them as full vectors
00132 // initialized (permanently) with any relevant zeros.
00133 // Cinf  is the complementarity residual for X1 z1 = mu e, etc.
00134 // Cinf0 is the same for mu=0 (i.e., for the original problem).
00135 
00136   double maxXz = -1e20;
00137   double minXz = 1e20;
00138 
00139   double *x1_elts = x1.getElements();
00140   double *z1_elts = z1.getElements();
00141   double *cL_elts = cL.getElements();
00142   for (int k=0; k<nlow; k++){
00143     double x1z1    = x1_elts[low[k]] * z1_elts[low[k]];
00144     cL_elts[low[k]] = mu - x1z1;
00145     if(x1z1 > maxXz) maxXz = x1z1;
00146     if(x1z1 < minXz) minXz = x1z1;
00147   }
00148 
00149   double *x2_elts = x2.getElements();
00150   double *z2_elts = z2.getElements();
00151   double *cU_elts = cU.getElements();
00152   for (int k=0; k<nupp; k++){
00153     double x2z2    = x2_elts[upp[k]] * z2_elts[upp[k]];
00154     cU_elts[upp[k]] = mu - x2z2;
00155     if(x2z2 > maxXz) maxXz = x2z2;
00156     if(x2z2 < minXz) minXz = x2z2;
00157   }
00158 
00159   maxXz   = CoinMax( maxXz, 1e-99 );
00160   minXz   = CoinMax( minXz, 1e-99 );
00161   *center  = maxXz / minXz;
00162 
00163   double normL = 0.0;
00164   double normU = 0.0;
00165   for (int k=0; k<nlow; k++)
00166     if (cL_elts[low[k]] > normL) normL = cL_elts[low[k]];
00167   for (int k=0; k<nupp; k++)
00168     if (cU_elts[upp[k]] > normU) normU = cU_elts[upp[k]];
00169   *Cinf    = CoinMax( normL, normU);
00170   *Cinf0   = maxXz;
00171 }
00172 //-----------------------------------------------------------------------
00173 // End private function pdxxxresid2
00174 //-----------------------------------------------------------------------
00175 
00176 inline double  pdxxxstep( CoinDenseVector <double> &x, CoinDenseVector <double> &dx ){
00177 
00178 // Assumes x > 0.
00179 // Finds the maximum step such that x + step*dx >= 0.
00180 
00181   double step     = 1e+20;
00182 
00183   int n = x.size();
00184   double *x_elts = x.getElements();
00185   double *dx_elts = dx.getElements();
00186   for (int k=0; k<n; k++)
00187     if (dx_elts[k] < 0)
00188       if ((x_elts[k]/(-dx_elts[k])) < step)
00189         step = x_elts[k]/(-dx_elts[k]);
00190   return step;
00191 }
00192 //-----------------------------------------------------------------------
00193 // End private function pdxxxstep
00194 //-----------------------------------------------------------------------
00195 
00196 inline double  pdxxxstep(int nset, int *set, CoinDenseVector <double> &x, CoinDenseVector <double> &dx ){
00197 
00198 // Assumes x > 0.
00199 // Finds the maximum step such that x + step*dx >= 0.
00200 
00201   double step     = 1e+20;
00202 
00203   int n = x.size();
00204   double *x_elts = x.getElements();
00205   double *dx_elts = dx.getElements();
00206   for (int k=0; k<n; k++)
00207     if (dx_elts[k] < 0)
00208       if ((x_elts[k]/(-dx_elts[k])) < step)
00209         step = x_elts[k]/(-dx_elts[k]);
00210   return step;
00211 }
00212 //-----------------------------------------------------------------------
00213 // End private function pdxxxstep
00214 //-----------------------------------------------------------------------
00215 #endif
00216 #endif

Generated on Sun Nov 14 14:06:31 2010 for Coin-All by  doxygen 1.4.7