00001
00002
00003
00004
00005
00006
00007
00008
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
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