source: stable/0.2/Couenne/src/bound_tightening/impliedBounds.cpp @ 159

Last change on this file since 159 was 159, checked in by pbelotti, 11 years ago

created new stable branch 0.2 from trunk (rev. 157)

File size: 4.7 KB
Line 
1/* $Id: impliedBounds.cpp 141 2009-06-03 04:19:19Z pbelotti $ */
2/*
3 * Name:    impliedBounds.cpp
4 * Author:  Pietro Belotti
5 * Purpose: backward implied bound search
6 *
7 * (C) Carnegie-Mellon University, 2006.
8 * This file is licensed under the Common Public License (CPL)
9 */
10
11#include "CouenneProblem.hpp"
12
13/// Bound tightening for auxiliary variables
14
15int CouenneProblem::impliedBounds (t_chg_bounds *chg_bds) const {
16
17  int nchg = 0; //< number of bounds changed for propagation
18
19  if (Jnlst()->ProduceOutput(Ipopt::J_DETAILED, J_BOUNDTIGHTENING)) { 
20    Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING,"  backward =====================\n  ");
21    int j=0;
22    for (int i=0; i < nVars (); i++) 
23      if (variables_ [i] -> Multiplicity () >= 0) {
24        Jnlst()->Printf(Ipopt::J_MOREVECTOR, J_BOUNDTIGHTENING,
25                        "x_%03d [%+15.8g %+15.8g] ", i, 
26                        domain_.lb (i),
27                        domain_.ub (i));
28        if (!(++j % 6)) Jnlst()->Printf(Ipopt::J_MOREVECTOR, J_BOUNDTIGHTENING,"\n  ");
29      }
30    if (j % 6) Jnlst()->Printf(Ipopt::J_MOREVECTOR, J_BOUNDTIGHTENING,"\n");
31    }
32
33  for (int ii = nVars (); ii--;) {
34
35    int i = numbering_ [ii];
36
37    if ((variables_ [i] -> Type () == AUX) &&
38        (variables_ [i] -> Multiplicity () > 0)) {
39
40      if (Lb (i) > Ub (i) + COUENNE_EPS * (1 + CoinMin (fabs (Lb (i)), fabs (Ub (i))))) {
41        Jnlst () -> Printf (Ipopt::J_DETAILED, J_BOUNDTIGHTENING,
42                            "  implied bounds: w_%d has infeasible bounds [%g,%g]\n", 
43                            i, Lb (i), Ub (i));
44        return -1;
45      }
46
47      //    if ((auxiliaries_ [i] -> Image () -> code () == COU_EXPRSUM) ||
48      //        (auxiliaries_ [i] -> Image () -> code () == COU_EXPRGROUP))
49
50      /*if (auxiliaries_ [i] -> Image () -> Argument () ||
51          auxiliaries_ [i] -> Image () -> ArgList  ()) {
52
53        expression *arg = auxiliaries_ [i] -> Image () -> Argument ();
54        if (!arg)   arg = auxiliaries_ [i] -> Image () -> ArgList  () [0];
55
56        printf (":::: ");
57          arg -> print (std::cout);
58          if (arg -> Index () >= 0) {
59          int ind = arg -> Index ();
60          printf (" in [%g,%g]",
61          expression::Lbound (ind),
62          expression::Ubound (ind));
63          }
64          printf ("\n");
65      }*/
66
67      // TODO: also test if this expression, or any of its indep
68      // variables, have changed. If not, skip
69
70      CouNumber
71        l0 = Lb (i), 
72        u0 = Ub (i);
73
74      if (variables_ [i] -> Image () -> impliedBound
75          (variables_ [i] -> Index (), Lb (), Ub (), chg_bds)) {
76
77        // conservative check for integer variables.
78        /*if (Var (i) -> isInteger ()) {
79          Lb (i) = ceil  (Lb (i) - COUENNE_EPS);
80          Ub (i) = floor (Ub (i) + COUENNE_EPS);
81          }*/
82
83        if (Jnlst()->ProduceOutput(Ipopt::J_VECTOR, J_BOUNDTIGHTENING)) {
84          // todo: send all output through journalist
85          Jnlst()->Printf(Ipopt::J_VECTOR, J_BOUNDTIGHTENING,
86                          "  impli %2d [%15.8g, %15.8g] -> [%15.8g, %15.8g]: ",
87                          i, l0, u0, Lb (i), Ub (i));
88
89          variables_ [i] -> print (std::cout);
90
91          if (Jnlst()->ProduceOutput(Ipopt::J_MOREVECTOR, J_BOUNDTIGHTENING)) {
92            Jnlst()->Printf(Ipopt::J_MOREVECTOR, J_BOUNDTIGHTENING," := ");
93            variables_ [i] -> Image () -> print (std::cout);
94          }
95
96          Jnlst()->Printf(Ipopt::J_VECTOR, J_BOUNDTIGHTENING,"\n");
97        }
98
99        /*if (optimum_ &&
100            ((optimum_ [i] < Lb (i) - COUENNE_EPS) ||
101             (optimum_ [i] > Ub (i) + COUENNE_EPS)))
102          Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING,
103                          "#### implied b_%d [%g,%g] cuts optimum %g: [%g --> %g, %g <-- %g]\n",
104                          i+nvar, expression::Lbound (i+nvar), expression::Ubound (i+nvar),
105                          optimum_ [i+nvar], l0, lb_ [i+nvar], ub_ [i+nvar], u0);*/
106
107        //printf ("impli %2d ", nvar+i);
108
109        /*if (variables_ [i] -> Image () -> Argument () ||
110            variables_ [i] -> Image () -> ArgList ()) {
111
112          expression *arg = variables_ [i] -> Image () -> Argument ();
113
114          if (!arg) {
115            for (int k=0; k < variables_ [i] -> Image () -> nArgs (); k++) {
116              arg =  variables_ [i] -> Image () -> ArgList () [k];
117              Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING," ");
118              arg -> print (std::cout);
119              if (arg -> Index () >= 0) {
120                int ind = arg -> Index ();
121                Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING,
122                                " in [%g,%g]",
123                                expression::Lbound (ind),
124                                expression::Ubound (ind));
125              }     
126            }
127          } else {
128            Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING," ");
129            arg -> print (std::cout);
130            if (arg -> Index () >= 0) {
131              int ind = arg -> Index ();
132              Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING," in [%g,%g]",
133                      expression::Lbound (ind),
134                      expression::Ubound (ind));
135            }
136          }
137        } else Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING," [no args]");
138        Jnlst()->Printf(Ipopt::J_DETAILED, J_BOUNDTIGHTENING,"\n");*/
139
140        nchg++;
141      }
142    }
143  }
144
145  if (nchg)
146    Jnlst () -> Printf (J_DETAILED, J_BOUNDTIGHTENING,
147                        "  implied bounds: %d changes\n", nchg);
148
149  return nchg;
150}
Note: See TracBrowser for help on using the repository browser.