Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

ClpHelperFunctions.cpp

00001 // Copyright (C) 2003, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 
00004 /*
00005     Note (JJF) I have added some operations on arrays even though they may
00006     duplicate CoinDenseVector.  I think the use of templates was a mistake
00007     as I don't think inline generic code can take as much advantage of
00008     parallelism or machine architectures or memory hierarchies.
00009 
00010 */
00011 #include <cfloat>
00012 #include <cmath>
00013 #include "CoinHelperFunctions.hpp"
00014 
00015 double 
00016 maximumAbsElement(const double * region, int size)
00017 {
00018   int i;
00019   double maxValue=0.0;
00020   for (i=0;i<size;i++) 
00021     maxValue = std::max(maxValue,fabs(region[i]));
00022   return maxValue;
00023 }
00024 void 
00025 setElements(double * region, int size, double value)
00026 {
00027   int i;
00028   for (i=0;i<size;i++) 
00029     region[i]=value;
00030 }
00031 void 
00032 multiplyAdd(const double * region1, int size, double multiplier1,
00033                  double * region2, double multiplier2)
00034 {
00035   int i;
00036   if (multiplier1==1.0) {
00037     if (multiplier2==1.0) {
00038       for (i=0;i<size;i++) 
00039         region2[i] = region1[i] + region2[i];
00040     } else if (multiplier2==-1.0) {
00041       for (i=0;i<size;i++) 
00042         region2[i] = region1[i] - region2[i];
00043     } else if (multiplier2==0.0) {
00044       for (i=0;i<size;i++) 
00045         region2[i] = region1[i] ;
00046     } else {
00047       for (i=0;i<size;i++) 
00048         region2[i] = region1[i] + multiplier2*region2[i];
00049     }
00050   } else if (multiplier1==-1.0) {
00051     if (multiplier2==1.0) {
00052       for (i=0;i<size;i++) 
00053         region2[i] = -region1[i] + region2[i];
00054     } else if (multiplier2==-1.0) {
00055       for (i=0;i<size;i++) 
00056         region2[i] = -region1[i] - region2[i];
00057     } else if (multiplier2==0.0) {
00058       for (i=0;i<size;i++) 
00059         region2[i] = -region1[i] ;
00060     } else {
00061       for (i=0;i<size;i++) 
00062         region2[i] = -region1[i] + multiplier2*region2[i];
00063     }
00064   } else if (multiplier1==0.0) {
00065     if (multiplier2==1.0) {
00066       // nothing to do
00067     } else if (multiplier2==-1.0) {
00068       for (i=0;i<size;i++) 
00069         region2[i] =  -region2[i];
00070     } else if (multiplier2==0.0) {
00071       for (i=0;i<size;i++) 
00072         region2[i] =  0.0;
00073     } else {
00074       for (i=0;i<size;i++) 
00075         region2[i] =  multiplier2*region2[i];
00076     }
00077   } else {
00078     if (multiplier2==1.0) {
00079       for (i=0;i<size;i++) 
00080         region2[i] = multiplier1*region1[i] + region2[i];
00081     } else if (multiplier2==-1.0) {
00082       for (i=0;i<size;i++) 
00083         region2[i] = multiplier1*region1[i] - region2[i];
00084     } else if (multiplier2==0.0) {
00085       for (i=0;i<size;i++) 
00086         region2[i] = multiplier1*region1[i] ;
00087     } else {
00088       for (i=0;i<size;i++) 
00089         region2[i] = multiplier1*region1[i] + multiplier2*region2[i];
00090     }
00091   }
00092 }
00093 double 
00094 innerProduct(const double * region1, int size, const double * region2)
00095 {
00096   int i;
00097   double value=0.0;
00098   for (i=0;i<size;i++)
00099     value += region1[i]*region2[i];
00100   return value;
00101 }
00102 void 
00103 getNorms(const double * region, int size, double & norm1, double & norm2)
00104 {
00105   norm1 = 0.0;
00106   norm2 = 0.0;
00107   int i;
00108   for (i=0;i<size;i++) {
00109     norm2 += region[i]*region[i];
00110     norm1 = std::max(norm1,fabs(region[i]));
00111   }
00112 }
00113 

Generated on Wed Dec 3 14:37:25 2003 for CLP by doxygen 1.3.5