00001
00002
00003 #ifndef CglSimpleRounding_H
00004 #define CglSimpleRounding_H
00005
00006 #include <string>
00007
00008 #include "CglCutGenerator.hpp"
00009 #include "CoinPackedMatrix.hpp"
00010
00026 class CglSimpleRounding : public CglCutGenerator {
00027 friend void CglSimpleRoundingUnitTest(const OsiSolverInterface * siP,
00028 const std::string mpdDir );
00029
00030 public:
00031
00037 virtual void generateCuts( const OsiSolverInterface & si, OsiCuts & cs,
00038 const CglTreeInfo info = CglTreeInfo()) const;
00040
00043
00044 CglSimpleRounding ();
00045
00047 CglSimpleRounding (
00048 const CglSimpleRounding &);
00049
00051 virtual CglCutGenerator * clone() const;
00052
00054 CglSimpleRounding &
00055 operator=(
00056 const CglSimpleRounding& rhs);
00057
00059 virtual
00060 ~CglSimpleRounding ();
00062 virtual std::string generateCpp( FILE * fp);
00064
00065 private:
00066
00067
00068
00071
00073 bool deriveAnIntegerRow(
00074 const OsiSolverInterface & si,
00075 int rowIndex,
00076 const CoinShallowPackedVector & matrixRow,
00077 CoinPackedVector & irow,
00078 double & b,
00079 bool * negative) const;
00080
00081
00097 int power10ToMakeDoubleAnInt(
00098 int size,
00099 const double * x,
00100 double dataTol ) const;
00101
00102
00105
00106 inline int gcd(int a, int b) const;
00107
00111 inline int gcdv(int n, const int * const vi) const;
00113
00115
00118
00119 double epsilon_;
00121 };
00122
00123
00124
00125
00126
00127
00128 int
00129 CglSimpleRounding::gcd(int a, int b) const
00130 {
00131 if(a > b) {
00132
00133 int temp = a;
00134 a = b;
00135 b = temp;
00136 }
00137 int remainder = b % a;
00138 if (remainder == 0) return a;
00139 else return gcd(remainder,a);
00140 }
00141
00142
00143
00144
00145
00146 int
00147 CglSimpleRounding::gcdv(int n, const int* const vi) const
00148 {
00149 if (n==0)
00150 abort();
00151
00152 if (n==1)
00153 return vi[0];
00154
00155 int retval=gcd(vi[0], vi[1]);
00156 for (int i=2; i<n; i++){
00157 retval=gcd(retval,vi[i]);
00158 }
00159 return retval;
00160 }
00161
00162
00168 void CglSimpleRoundingUnitTest(const OsiSolverInterface * siP,
00169 const std::string mpdDir );
00170
00171 #endif