00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <vector>
00012
00013 #include "CoinHelperFunctions.hpp"
00014 #include "exprMul.hpp"
00015
00016 int exprMul::impliedBoundMul (CouNumber wl,
00017 CouNumber wu,
00018 std::vector <CouNumber> &xlv,
00019 std::vector <CouNumber> &xuv,
00020 std::vector <std::pair <int, CouNumber> > &nl,
00021 std::vector <std::pair <int, CouNumber> > &nu) {
00022 int nImpr = 0;
00023
00024
00025
00026 if (xlv.size () == 2) {
00027
00028 CouNumber
00029 xl = xlv [0], xu = xuv [0],
00030 yl = xlv [1], yu = xuv [1];
00031
00032 if (wl >= 0.) {
00033
00034
00035
00036 if (xu * yu < wl) {
00037 if (xu * yl < wl) {nu.push_back (std::pair <int, CouNumber> (0, wl / yl)); nImpr++;}
00038 if (xl * yu < wl) {nu.push_back (std::pair <int, CouNumber> (1, wl / xl)); nImpr++;}
00039
00040
00041 }
00042
00043
00044
00045 if (xl * yl < wl) {
00046 if (xl * yu < wl) {nl.push_back (std::pair <int, CouNumber> (0, wl / yu)); nImpr++;}
00047 if (xu * yl < wl) {nl.push_back (std::pair <int, CouNumber> (1, wl / xu)); nImpr++;}
00048
00049
00050 }
00051 } else if (wl > -COUENNE_INFINITY) {
00052
00053
00054
00055
00056 if ((xl*yl < wl) && (yl>0.)) {nl.push_back (std::pair <int, CouNumber> (0, wl / yl)); nImpr++;}
00057 if ((xu*yu < wl) && (yu>0.)) {nu.push_back (std::pair <int, CouNumber> (1, wl / xu)); nImpr++;}
00058
00059
00060
00061
00062 if ((xu*yu < wl) && (yu<0.)) {nu.push_back (std::pair <int, CouNumber> (0, wl / yu)); nImpr++;}
00063 if ((xl*yl < wl) && (yl<0.)) {nl.push_back (std::pair <int, CouNumber> (1, wl / xl)); nImpr++;}
00064
00065
00066 }
00067
00068
00069
00070
00071 if (wu >= 0.) {
00072
00073 if (wu < COUENNE_INFINITY) {
00074
00075
00076
00077 if ((xu*yl > wu) && (yl>0.)) {nu.push_back (std::pair <int, CouNumber> (0, wu/yl)); nImpr++;}
00078 if ((xl*yu > wu) && (yu>0.)) {nu.push_back (std::pair <int, CouNumber> (1, wu/xl)); nImpr++;}
00079
00080
00081
00082
00083 if ((xl*yu > wu) && (yu<0.)) {nl.push_back (std::pair <int, CouNumber> (0, wu/yu)); nImpr++;}
00084 if ((xu*yl > wu) && (yl<0.)) {nl.push_back (std::pair <int, CouNumber> (1, wu/xu)); nImpr++;}
00085
00086
00087 }
00088
00089 } else {
00090
00091
00092
00093 if (xu * yl > wu) {
00094 if (xu * yu > wu) {nu.push_back (std::pair <int, CouNumber> (0, wu / yu)); nImpr++;}
00095 if (xl * yl > wu) {nl.push_back (std::pair <int, CouNumber> (1, wu / xl)); nImpr++;}
00096
00097
00098 }
00099
00100
00101
00102 if (xl * yu > wu) {
00103 if (xl * yl > wu) {nl.push_back (std::pair <int, CouNumber> (0, wu / yl)); nImpr++;}
00104 if (xu * yu > wu) {nu.push_back (std::pair <int, CouNumber> (1, wu / xu)); nImpr++;}
00105
00106
00107 }
00108 }
00109 }
00110
00111 return nImpr;
00112 }