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