Changeset 2858


Ignore:
Timestamp:
Jul 27, 2010 4:48:15 PM (9 years ago)
Author:
prsteel
Message:

Fixes _VarValue bounds bug. Prior to this fix, explicit bounds overrode domains defined by rules. Resolves ticket 4101.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • coopr.pyomo/trunk/coopr/pyomo/base/var.py

    r2823 r2858  
    121121           ostream = sys.stdout
    122122        print >>ostream, str(self),
     123
     124    def _tighten_bounds(self):
     125        """
     126        Attempts to tighten the lower- and upper-bounds on this variable
     127        by using the domain.
     128        """
     129        dbounds = self.domain.bounds()
     130
     131        if self.lb is None or \
     132               (dbounds[0] is not None and dbounds[0] > self.lb.value):
     133            self.setlb(dbounds[0])
     134
     135        if self.ub is None or \
     136               (dbounds[1] is not None and dbounds[1] < self.ub.value):
     137            self.setub(dbounds[1])
     138       
    123139
    124140#
     
    306322            if type(self._initialize) is dict:
    307323                self._index = self._initialize.keys()
     324
    308325            for ndx in self._index:
    309                 if ndx is not None:
    310 
    311                     # Check for domain rules
    312                     if self._domain_rule is not None:
    313                         domain = self._domain_rule(ndx, self.model)
    314                         if isinstance(domain, BooleanSet):
    315                             self._binary_keys.append(ndx)
    316                         elif isinstance(domain, IntegerSet):
    317                             self._integer_keys.append(ndx)
    318                         else:
    319                             self._continuous_keys.append(ndx)
     326                # Check for domain rules
     327                if self._domain_rule is not None:
     328                    domain = self._domain_rule(ndx, self.model)
     329                    if isinstance(domain, BooleanSet):
     330                        self._binary_keys.append(ndx)
     331                    elif isinstance(domain, IntegerSet):
     332                        self._integer_keys.append(ndx)
    320333                    else:
    321                         domain = self.domain
    322                         self._add_domain_key(ndx, domain)
    323 
    324                     self._varval[ndx] = _VarValue(
    325                           name = create_name(self.name,ndx),
    326                           domain = domain,
    327                           )
    328 
    329                     self._varval[ndx].var = self
    330                     self._varval[ndx].index = ndx
     334                        self._continuous_keys.append(ndx)
     335                else:
     336                    domain = self.domain
     337                    self._add_domain_key(ndx, domain)
     338
     339                self._varval[ndx] = _VarValue(
     340                      name = create_name(self.name,ndx),
     341                      domain = domain,
     342                      )
     343
     344                self._varval[ndx].var = self
     345                self._varval[ndx].index = ndx
    331346
    332347        #
     
    410425        # the domain bounds information.
    411426        #
    412         # Only done if self.domain is not a rule
     427        # Only done if self.domain is not a rule. If it is, _VarArray level
     428        # bounds become meaningless, since the individual _VarElement objects
     429        # likely have more restricted domains.
    413430        #
    414431        if self._domain_rule is None:
     
    437454        print >>ostream, "  ",self.name,":",
    438455        print >>ostream, "\tSize="+str(len(self)),
    439         print >>ostream, "\tDomain="+self.domain.name
     456        if self.domain is not None:
     457            print >>ostream, "\tDomain="+self.domain.name
     458        else:
     459            print >>ostream, "\tDomain=None"
    440460        if self._index_set is not None:
    441461            print >>ostream, "\tIndicies: ",
     
    520540                setattr(self._varval[key],name,default)
    521541
    522 
     542       
    523543class _VarElement(_VarBase,_VarValue):
    524544
     
    533553        return _VarValue.is_constant(self)
    534554
    535 
    536555class _VarArray(_VarBase):
    537556
     
    556575    def __str__(self):
    557576        return self.name
     577
     578    def construct(self, data=None):
     579        _VarBase.construct(self, data)
     580
     581        for (ndx, var) in self._varval.items():
     582            var._tighten_bounds()
    558583
    559584if sys.version_info[0:2] < (2, 5):
Note: See TracChangeset for help on using the changeset viewer.