Changeset 3740


Ignore:
Timestamp:
Feb 28, 2011 8:28:59 PM (9 years ago)
Author:
jdsiiro
Message:

Overhaul of Constraint generation code

  • collapsing _LessThanExpression and _LesThanOrEqualExpression to a single _InequalityExpression that can hold 2 or 3 arguments
  • centralizing relational expression generation in expr.generate_relational_expression()
  • standardizing tests in constraint.add() to be more robust to unexpected input
  • slight performance improvement in constraint.add()
Location:
coopr.pyomo/trunk/coopr/pyomo
Files:
9 edited

Legend:

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

    r3737 r3740  
    103103class ConstraintData(NumericValue):
    104104
    105     __slots__ = ['label','id','active','_equality','lower','lower_ineq_strict','lin_body','body','upper','upper_ineq_strict','repn','ampl_repn','dual']
    106 
    107     def __init__(self, name=None):
     105    __slots__ = ('label','id','active','_equality','lower',
     106                 'lower_ineq_strict','lin_body','body','upper',
     107                 'upper_ineq_strict','repn','ampl_repn','dual')
     108
     109    def __init__(self, name):
    108110
    109111        NumericValue.__init__(self,name=name,domain=Reals)
     
    230232            if self._data[None].body is None:
    231233                return None
    232             return self._data[None].body()
     234            return value(self._data[None].body)
    233235        if exception:
    234236            msg = 'Cannot compute the value of an array of constraints'
     
    312314        #
    313315        conData = ConstraintData(name=create_name(self.name,index))
    314        
    315         if expr_type is tuple or expr_type is list:
     316
     317        if expr_type is tuple: # or expr_type is list:
    316318            #
    317319            # Form equality expression
    318320            #
    319321            if len(expr) == 2:
     322                arg0 = expr[0]
     323                if arg0 is not None:
     324                    arg0 = as_numeric(arg0)
     325                arg1 = expr[1]
     326                if arg1 is not None:
     327                    arg1 = as_numeric(arg1)
     328
    320329                conData._equality = True
    321                 if is_constant(expr[1]):
    322                     tpl = ( expr[1], expr[0], expr[1], False, False )
     330                conData.lower_ineq_strict = conData.upper_ineq_strict = False
     331                if arg1 is None or arg1.is_constant():
     332                    conData.lower = conData.upper = arg1
     333                    conData.body = arg0
     334                elif arg0 is None or arg0.is_constant():
     335                    conData.lower = conData.upper = arg0
     336                    conData.body = arg1
    323337                else:
    324                     tpl = ( expr[0], expr[1], expr[0], False, False )
     338                    conData.lower = conData.upper = NumericConstant(value=0)
     339                    conData.body = arg0 - arg1
    325340            #
    326341            # Form inequality expression
    327342            #
    328343            elif len(expr) == 3:
    329                 tpl = tuple(expr) + ( expr[0] is None, expr[2] is None )
     344                arg0 = expr[0]
     345                if arg0 is None:
     346                    conData.lower_ineq_strict = True
     347                else:
     348                    conData.lower_ineq_strict = False
     349                    arg0 = as_numeric(arg0)
     350                    if not arg0.is_constant():
     351                        msg = "Constraint '%s' found a 3-tuple (lower, " \
     352                              "expression, upper) but the lower value was "\
     353                              "non-constant"
     354                        raise ValueError, msg % (conData.name,)
     355
     356                arg1 = expr[1]
     357                if arg1 is not None:
     358                    arg1 = as_numeric(arg1)
     359
     360                arg2 = expr[2]
     361                if arg2 is None:
     362                    conData.upper_ineq_strict = True
     363                else:
     364                    conData.upper_ineq_strict = False
     365                    arg2 = as_numeric(arg2)
     366                    if not arg2.is_constant():
     367                        msg = "Constraint '%s' found a 3-tuple (lower, " \
     368                              "expression, upper) but the upper value was "\
     369                              "non-constant"
     370                        raise ValueError, msg % (conData.name,)
     371
     372                conData.lower = arg0
     373                conData.body  = arg1
     374                conData.upper = arg2
    330375            else:
    331376                msg = "Constructor rule for constraint '%s' returned a tuple" \
    332377                      ' of length %d.  Expecting a tuple of length 2 or 3:\n' \
    333378                      'Equality:   (left, right)\n' \
    334                       'Inequality: (lower, variable, upper)'
     379                      'Inequality: (lower, expression, upper)'
    335380                raise ValueError, msg % ( self.name, len(expr) )
    336381
     382            relational_expr = False
    337383        else:
    338             arg0 = expr._args[0]
    339             arg1 = expr._args[1]
    340             arg0_type = type(arg0)
    341             arg1_type = type(arg1)
    342 
    343             #
    344             # If the constructor rule returns an inequality expression, then
    345             # convert to a 3-tuple
    346             #
    347             if expr_type is _LessThanOrEqualExpression or expr_type is _LessThanExpression:
    348                 # First, some basic error checking
    349                 if arg0_type is _EqualToExpression or arg1_type is _EqualToExpression:
    350                     raise ValueError, 'Bound error: < expression used with an = expression.'
     384            try:
     385                relational_expr = expr.is_relational()
     386                if not relational_expr:
     387                    msg = "Constraint '%s' does not have a proper value.  " \
     388                          "Found '%s'\nExpecting a tuple or equation.  " \
     389                          "Examples:\n" \
     390                          "    summation( model.costs ) == model.income\n" \
     391                          "    (0, model.price[ item ], 50)"
     392                    raise ValueError, msg % ( conData.name, str(expr) )
     393            except:
     394                msg = "Constraint '%s' does not have a proper value.  " \
     395                      "Found '%s'\nExpecting a tuple or equation.  " \
     396                      "Examples:\n" \
     397                      "    summation( model.costs ) == model.income\n" \
     398                      "    (0, model.price[ item ], 50)"
     399                raise ValueError, msg % ( conData.name, str(expr) )
    351400               
    352                 if arg0_type is _LessThanOrEqualExpression or arg0_type is _LessThanExpression:
    353                     tpl = ( arg0._args[0], arg0._args[1], arg1,
    354                             arg0_type is _LessThanExpression,
    355                             expr_type is _LessThanExpression )
    356                    
    357                 elif arg1_type is _LessThanOrEqualExpression or arg1_type is _LessThanExpression:
    358                     tpl = ( arg0, arg1._args[0], arg1._args[1],
    359                             expr_type is _LessThanExpression,
    360                             arg1_type is _LessThanExpression )
    361                        
    362                 elif arg0.is_constant():
    363                     tpl = ( arg0, arg1, None,
    364                             expr_type is _LessThanExpression, True )
    365                 elif arg1.is_constant():
    366                     tpl = ( None, arg0, arg1,
    367                             True, expr_type is _LessThanExpression )
     401        if relational_expr:
     402            if expr_type is _EqualityExpression:
     403                # Equality expression: only 2 arguments!
     404                conData._equality = True
     405                conData.lower_ineq_strict = conData.upper_ineq_strict = False
     406                if expr._args[1].is_constant():
     407                    conData.lower = conData.upper = expr._args[1]
     408                    conData.body = expr._args[0]
     409                elif expr._args[0].is_constant():
     410                    conData.lower = conData.upper = expr._args[0]
     411                    conData.body = expr._args[1]
    368412                else:
    369                     tpl = ( None, arg0-arg1, 0.0,
    370                             True, expr_type is _LessThanExpression )
    371                        
    372             # If the constructor rule returns an equality expression, then
    373             # convert to a 3-tuple
    374             #
    375             elif expr_type is _EqualToExpression:
    376                 # First, some basic error checking
    377                 if arg0_type is _EqualToExpression or arg1_type is _EqualToExpression:
    378                     raise ValueError, 'Bound error: = expression used with an = expression.'
    379                 #if arg0_type in less or arg1_type in less:
    380                 #    raise ValueError, 'Bound error: < expression used with an = expression.'
    381            
    382                 conData._equality = True
    383                 if is_constant(arg1):
    384                     tpl = ( arg1, arg0, arg1, False, False )
    385                 elif is_constant(arg0):
    386                     tpl = ( arg0, arg1, arg0, False, False )
     413                    conData.lower = conData.upper = NumericConstant(value=0)
     414                    conData.body = expr._args[0] - expr._args[1]
     415            else:
     416                # Inequality expression: 2 or 3 arguments
     417                if len(expr._args) == 3:
     418                    if not expr._args[0].is_constant():
     419                        msg = "Constraint '%s' found a double-sided "\
     420                              "inequality expression (lower <= expression "\
     421                              "<= upper) but the lower bound was non-constant"
     422                        raise ValueError, msg % (conData.name,)
     423                    if not expr._args[2].is_constant():
     424                        msg = "Constraint '%s' found a double-sided "\
     425                              "inequality expression (lower <= expression "\
     426                              "<= upper) but the upper bound was non-constant"
     427                        raise ValueError, msg % (conData.name,)
     428                    conData.lower = expr._args[0]
     429                    conData.body  = expr._args[1]
     430                    conData.upper = expr._args[2]
     431                    conData.lower_ineq_strict = expr._strict[0]
     432                    conData.upper_ineq_strict = expr._strict[1]
    387433                else:
    388                     tpl = ( 0.0 , arg0 - arg1, 0.0, False, False )
    389 
    390             # Unrecognized expression type
    391             #
    392             else:
    393                 # Verify that the user actually provided an expression or tuple/list --
    394                 # they can (and have) specified odd expressions that evaluate to
    395                 # unexpected values, e.g., True or False.
    396                 #
    397                 if not isinstance(expr, Expression):
    398                     msg = 'Non-expression object of type %s supplied to ' \
    399                           'initialize constraint %s'
    400                     raise ValueError, msg % ( str(type(expr)), conData.name )
    401                
    402                 msg = "Constraint '%s' does not have a proper value.  Found '%s'\n"\
    403                       'Expecting a tuple or equation.  Examples:\n\n' \
    404                       ' return summation( model.costs ) == model.income\n' \
    405                       ' return (0, model.price[ item ], 50)'
    406                 raise ValueError, msg % ( conData.name, str(expr) )
    407 
    408         # Populate the raw constraint data
    409         conData.lower = tpl[0]
    410         conData.lower_ineq_strict = tpl[3]
    411         conData.body = tpl[1]
    412         conData.upper = tpl[2]
    413         conData.upper_ineq_strict = tpl[4]
     434                    if expr._args[1].is_constant():
     435                        conData.lower = None
     436                        conData.body  = expr._args[0]
     437                        conData.upper = expr._args[1]
     438                        conData.lower_ineq_strict = True
     439                        conData.upper_ineq_strict = expr._strict[0]
     440                    elif expr._args[0].is_constant():
     441                        conData.lower = expr._args[0]
     442                        conData.body  = expr._args[1]
     443                        conData.upper = None
     444                        conData.lower_ineq_strict = expr._strict[0]
     445                        conData.upper_ineq_strict = True
     446                    else:
     447                        conData.lower = None
     448                        conData.body  = expr._args[0] - expr._args[1]
     449                        conData.upper = NumericConstant(value=0)
     450                        conData.lower_ineq_strict = True
     451                        conData.upper_ineq_strict = expr._strict[0]
    414452
    415453        #
     
    417455        # and reset the values to 'None' if they are 'infinite'
    418456        #
    419         if conData._equality:
    420             conData.upper = conData.lower
    421 
    422         bound = conData.lower
    423         bound_type = type(conData.lower)
    424         if bound_type is NumericConstant and \
    425                  not pyutilib.math.is_finite(bound()):
     457        if conData.lower is not None and \
     458               not pyutilib.math.is_finite(conData.lower()):
    426459            conData.lower = None
    427         elif bound_type is int or bound_type is float  or bound_type is long  or bound_type is bool:
    428             if pyutilib.math.is_finite(bound):
    429                 conData.lower = NumericConstant(value=float(bound))
    430             else:
    431                 conData.lower = None
    432 
    433         bound = conData.upper
    434         bound_type = type(conData.upper)
    435         if bound_type is NumericConstant and \
    436                  not pyutilib.math.is_finite(bound()):
     460            conData.lower_ineq_strict = True
     461        if conData.upper is not None and \
     462               not pyutilib.math.is_finite(conData.upper()):
    437463            conData.upper = None
    438         elif bound_type is int or bound_type is float  or bound_type is long  or bound_type is bool:
    439             if pyutilib.math.is_finite(bound):
    440                 conData.upper = NumericConstant(value=float(bound))
    441             else:
    442                 conData.upper = None
     464            conData.upper_ineq_strict = True
    443465
    444466        # Error check, to ensure that we don't have a constraint that
    445         # doesn't depend on any variables / parameters (should this just
    446         # check, "is_constant()"?)
    447         #
    448         bound_type = type(conData.body)
    449         if bound_type is int or bound_type is float or bound_type is long  or bound_type is bool:
    450             msg = "Constraint '%s', index='%s', has a numeric body with value=%s; an expression is expected."
    451             raise ValueError, msg % (conData.name , str(index), str(tpl[1]))
     467        # doesn't depend on any variables / parameters
     468        #
     469        # TBD: This is an expensive test (is_constant() is recursive).
     470        # The pre-coopr-2.5 version of this test was basically never
     471        # executed (just looked for int, float, etc.)  It is not clear
     472        # that running this debugging test is even worth it [JDS, 28 Feb 2011].
     473        #
     474        #if conData.body.is_constant():
     475        #    feasible = True
     476        #    value = conData.body()
     477        #    if conData.lower is not None:
     478        #        if conData.lower_ineq_strict:
     479        #            feasible = feasible and (conData.lower() < value)
     480        #        else:
     481        #            feasible = feasible and (conData.lower() <= value)
     482        #    if conData.upper is not None:
     483        #        if conData.upper_ineq_strict:
     484        #            feasible = feasible and (value < conData.upper())
     485        #        else:
     486        #            feasible = feasible and (value < conData.upper())
     487        #    if feasible:
     488        #        logger.warn("Constraint '%s' has a constant constant body.")
     489        #    else:
     490        #        logger.error("Constraint '%s' has an constant infeasible "
     491        #                     "constant body.")
    452492
    453493        # Error check, to ensure that we don't have an equality constraint with
     
    460500        # Setup identity expressions
    461501        #
    462         if conData.lower is not None:
    463             if not isinstance(conData.lower,Expression):
    464                 conData.lower = _IdentityExpression(conData.lower)
    465         if conData.body is not None:
    466             if not isinstance(conData.body,Expression):
    467                 conData.body = _IdentityExpression(conData.body)
    468         if conData.upper is not None:
    469             if not isinstance(conData.upper,Expression):
    470                 conData.upper = _IdentityExpression(conData.upper)
     502        #if conData.lower is not None:
     503        #    if not isinstance(conData.lower,Expression):
     504        #        conData.lower = _IdentityExpression(conData.lower)
     505        #if conData.body is not None:
     506        #    if not isinstance(conData.body,Expression):
     507        #        conData.body = _IdentityExpression(conData.body)
     508        #if conData.upper is not None:
     509        #    if not isinstance(conData.upper,Expression):
     510        #        conData.upper = _IdentityExpression(conData.upper)
     511       
    471512        #
    472513        # hook up the constraint data object to the parent constraint.
     
    479520        if self.model is not None:
    480521           self.model._name_conmap[conData.label] = conData
     522
    481523
    482524    def pprint(self, ostream=None):
     
    494536          if self._data[val].lower is not None:
    495537             print >>ostream, "\t\t",
    496              self._data[val].lower.pprint(ostream)
     538             if self._data[val].lower.is_expression():
     539                self._data[val].lower.pprint(ostream)
     540             else:
     541                print >>ostream, str(self._data[val].lower)
    497542          else:
    498543             print >>ostream, "\t\t-Inf"
     
    503548          if self._data[val].body is not None:
    504549             print >>ostream, "\t\t",
    505              self._data[val].body.pprint(ostream)
     550             if self._data[val].body.is_expression():
     551                self._data[val].body.pprint(ostream)
     552             else:
     553                print >>ostream, str(self._data[val].body)
    506554          #else:                         #pragma:nocover
    507555             #raise ValueError, "Unexpected empty constraint body"
     
    512560          if self._data[val].upper is not None:
    513561             print >>ostream, "\t\t",
    514              self._data[val].upper.pprint(ostream)
     562             if self._data[val].upper.is_expression():
     563                self._data[val].upper.pprint(ostream)
     564             else:
     565                print >>ostream, str(self._data[val].upper)
    515566          elif self._data[val]._equality:
    516567             print >>ostream, "\t\t",
    517              self._data[val].lower.pprint(ostream)
     568             if self._data[val].lower.is_expression():
     569                self._data[val].lower.pprint(ostream)
     570             else:
     571                print >>ostream, str(self._data[val].lower)
    518572          else:
    519573             print >>ostream, "\t\tInf"
  • coopr.pyomo/trunk/coopr/pyomo/base/expr.py

    r3714 r3740  
    1111from __future__ import division
    1212
    13 __all__ = ['Expression', '_LessThanExpression', '_LessThanOrEqualExpression',
    14         '_EqualToExpression', '_IdentityExpression' , 'generate_expression']
     13__all__ = ['Expression', '_EqualityExpression', '_InequalityExpression',
     14           '_IdentityExpression' ,
     15           'generate_expression', 'generate_relational_expression']
    1516
    1617from plugin import *
     
    231232
    232233
    233 class _LessThanExpression(_LinearExpression):
    234     """An object that defines a less-than expression"""
    235 
    236     __slots__ = ()
    237 
    238     def __init__(self, args):
     234class _InequalityExpression(_LinearExpression):
     235    """An object that defines a series of less-than or
     236    less-than-or-equal expressions"""
     237
     238    __slots__ = ('_strict',)
     239
     240    def __init__(self, args, strict):
    239241        """Constructor"""
    240         _LinearExpression.__init__(self, 'lt', 2, args)
    241 
    242     def __getstate__(self):
    243        return _LinearExpression.__getstate__(self)
    244 
    245     def _apply_operation(self, values):
    246         """Method that defines the less-than operation"""
    247         return values.next() < values.next()
    248 
    249 
    250 class _LessThanOrEqualExpression(_LinearExpression):
    251     """An object that defines a less-than-or-equal expression"""
    252 
    253     __slots__ = ()   
    254 
    255     def __init__(self, args):
    256         """Constructor"""
    257         _LinearExpression.__init__(self, 'le', 2, args)
    258 
    259     def __getstate__(self):
    260        return _LinearExpression.__getstate__(self)
     242        _LinearExpression.__init__(self, 'ineq', None, args)
     243        self._strict = strict
     244        if len(self._args)-1 != len(self._strict):
     245            raise ValueError, "_InequalityExpression(): len(args)-1 != " \
     246                  "len(strict)(%d and %d given)" % (len(args), len(strict))
     247
     248    def __getstate__(self):
     249       result = _LinearExpression.__getstate__(self)
     250       for i in _InequalityExpression.__slots__:
     251          result[i] = getattr(self, i)
     252       return result
     253
     254    def is_relational(self):
     255        return True
     256
     257    def clone(self):
     258        return self.__class__( copy.copy(self._args), copy.copy(self._strict) )
    261259
    262260    def _apply_operation(self, values):
    263261        """Method that defines the less-than-or-equal operation"""
    264         return values.next() <= values.next()
    265 
    266 
    267 class _EqualToExpression(_LinearExpression):
     262        arg1 = values.next()
     263        for i in xrange(len(self._strict)):
     264            arg2 = values.next()
     265            if self._strict[i]:
     266                if not (arg1 < arg2):
     267                    return False
     268            else:
     269                if not (arg1 <= arg2):
     270                    return False
     271            arg1 = arg2
     272        return True
     273
     274    def pprint(self, ostream=None, nested=True, eol_flag=True):
     275        """Print this expression"""
     276        if ostream is None:
     277           ostream = sys.stdout
     278        if nested:
     279           first=True
     280           for i in xrange(len(self._strict)):
     281               arg = self._args[i]
     282               if arg.is_expression():
     283                   arg.pprint(ostream=ostream, nested=nested, eol_flag=False)
     284               else:
     285                   print >>ostream, str(arg),
     286               if self._strict[i]:
     287                   print >> ostream, " < ",
     288               else:
     289                   print >> ostream, " <= ",
     290           arg = self._args[-1]
     291           if arg.is_expression():
     292               arg.pprint(ostream=ostream, nested=nested, eol_flag=False)
     293           else:
     294               print >>ostream, str(arg),
     295           if eol_flag==True:
     296              print >>ostream, ""
     297
     298
     299class _EqualityExpression(_LinearExpression):
    268300    """An object that defines a equal-to expression"""
    269301
     
    276308    def __getstate__(self):
    277309       return _LinearExpression.__getstate__(self)
     310
     311    def is_relational(self):
     312        return True
    278313
    279314    def _apply_operation(self, values):
     
    472507def generate_expression(*_args):
    473508    def _clone_if_needed(obj):
    474         count = sys.getrefcount(obj) - generate_expression.UNREFERENCED_EXPR_COUNT
     509        count = sys.getrefcount(obj) - \
     510                generate_expression.UNREFERENCED_EXPR_COUNT
    475511        if generate_expression.clone_if_needed_callback:
    476512            generate_expression.clone_if_needed_callback(count)
     
    729765
    730766
    731 ExpressionRegistration('<', _LessThanExpression)
    732 ExpressionRegistration('lt', _LessThanExpression)
    733 ExpressionRegistration('>', _LessThanExpression, True)
    734 ExpressionRegistration('gt', _LessThanExpression, True)
    735 ExpressionRegistration('<=', _LessThanOrEqualExpression)
    736 ExpressionRegistration('lte', _LessThanOrEqualExpression)
    737 ExpressionRegistration('>=', _LessThanOrEqualExpression, True)
    738 ExpressionRegistration('gte', _LessThanOrEqualExpression, True)
    739 ExpressionRegistration('=', _EqualToExpression)
    740 ExpressionRegistration('eq', _EqualToExpression)
     767
     768def generate_relational_expression(etype, lhs, rhs):
     769    def _clone_if_needed(obj):
     770        count = sys.getrefcount(obj) - \
     771                generate_relational_expression.UNREFERENCED_EXPR_COUNT
     772        if generate_relational_expression.clone_if_needed_callback:
     773            generate_relational_expression.clone_if_needed_callback(count)
     774        if count == 0:
     775            return obj
     776        elif count > 0:
     777            generate_relational_expression.clone_counter += 1
     778            return obj.clone()
     779        else:
     780            raise RuntimeError, "Expression entered " \
     781                "generate_relational_expression() " \
     782                "with too few references (%s<0); this is indicative of a " \
     783                "SERIOUS ERROR in the expression reuse detection scheme." \
     784                % ( count, )
     785
     786    if lhs.is_expression():
     787        lhs = _clone_if_needed(lhs)
     788    elif rhs.is_indexed():
     789        raise ValueError, "Argument for expression '%s' is an n-ary "\
     790            "numeric value: %s\n    Have you given variable or "\
     791            "parameter '%s' an index?" % (etype, lhs.name, lhs.name)
     792
     793    if rhs.is_expression():
     794        rhs = _clone_if_needed(rhs)
     795    elif rhs.is_indexed():
     796        raise ValueError, "Argument for expression '%s' is an n-ary "\
     797            "numeric value: %s\n    Have you given variable or "\
     798            "parameter '%s' an index?" % (etype, rhs.name, rhs.name)
     799
     800    if etype == '==':
     801        if lhs.is_relational() or rhs.is_relational():
     802            raise ValueError, "Cannot create an EqualityExpression where "\
     803                  "one of the sub-expressions is a relational expression."
     804        return _EqualityExpression((lhs,rhs))
     805    else:
     806        if etype == '<=':
     807            strict = False
     808        elif etype == '<':
     809            strict = True
     810        else:
     811            raise ValueError, "Unknown relational expression type '%s'" % etype
     812        if lhs.is_relational():
     813            if lhs.__class__ is _InequalityExpression:
     814                if rhs.is_relational():
     815                    raise ValueError, "Cannot create an InequalityExpression "\
     816                          "where both sub-expressions are also relational "\
     817                          "expressions (we can support no more than 3 terms "\
     818                          "in an inequality expression)."
     819                if len(lhs._args) > 2:
     820                    raise ValueError, "Cannot create an InequalityExpression "\
     821                          "with more than 3 terms."
     822                lhs._args.append(rhs)
     823                lhs._strict.append(strict)
     824                return lhs
     825            else:
     826                raise ValueError, "Cannot create an InequalityExpression "\
     827                      "where one of the sub-expressions is an equality "\
     828                      "expression."
     829        elif rhs.is_relational():
     830            if rhs.__class__ is _InequalityExpression:
     831                if len(rhs._args) > 2:
     832                    raise ValueError, "Cannot create an InequalityExpression "\
     833                          "with more than 3 terms."
     834                rhs._args.insert(0, lhs)
     835                rhs._strict.insert(0, strict)
     836                return rhs
     837            else:
     838                raise ValueError, "Cannot create an InequalityExpression "\
     839                      "where one of the sub-expressions is an equality "\
     840                      "expression."
     841        else:
     842            return _InequalityExpression([lhs,rhs], [strict])
     843
     844
     845##
     846## "static" variables within the generate_relational_expression function
     847##
     848
     849# [testing] clone_check_callback allows test functions to intercept the
     850# call to _clone_if_needed and see the returned value from
     851# sys.getrefcount.
     852generate_relational_expression.clone_if_needed_callback = None
     853
     854# [debugging] clone_counter is a count of the number of calls to
     855# expr.clone() made during expression generation.
     856generate_relational_expression.clone_counter = 0
     857
     858# [configuration] UNREFERENCED_EXPR_COUNT is a "magic number" that
     859# indicates the stack depth between "normal" modeling and
     860# _clone_if_needed().  If an expression enters _clone_if_needed() with
     861# UNREFERENCED_EXPR_COUNT references, then there are no other variables
     862# that hold a reference to the expression and cloning is not necessary.
     863# If there are more references than UNREFERENCED_EXPR_COUNT, then we
     864# must clone the expression before operating on it.  It should be an
     865# error to hit _clone_if_needed() with fewer than
     866# UNREFERENCED_EXPR_COUNT references.
     867generate_relational_expression.UNREFERENCED_EXPR_COUNT = 9
     868
     869
     870if True:
     871    ExpressionRegistration('<', _InequalityExpression)
     872    ExpressionRegistration('lt', _InequalityExpression)
     873    ExpressionRegistration('>', _InequalityExpression, True)
     874    ExpressionRegistration('gt', _InequalityExpression, True)
     875    ExpressionRegistration('<=', _InequalityExpression)
     876    ExpressionRegistration('lte', _InequalityExpression)
     877    ExpressionRegistration('>=', _InequalityExpression, True)
     878    ExpressionRegistration('gte', _InequalityExpression, True)
     879    ExpressionRegistration('=', _EqualityExpression)
     880    ExpressionRegistration('eq', _EqualityExpression)
    741881
    742882if False:
  • coopr.pyomo/trunk/coopr/pyomo/base/intrinsic_functions.py

    r3725 r3740  
    3030def generate_intrinsic_function_expression(args, nargs, name, fcn):
    3131    def _clone_if_needed(obj):
    32         count = sys.getrefcount(obj) - generate_intrinsic_function_expression.UNREFERENCED_EXPR_COUNT
     32        count = sys.getrefcount(obj) - \
     33                generate_intrinsic_function_expression.UNREFERENCED_EXPR_COUNT
    3334        if generate_intrinsic_function_expression.clone_if_needed_callback:
    3435            generate_intrinsic_function_expression.clone_if_needed_callback(count)
     
    3940            return obj.clone()
    4041        else:
    41             raise RuntimeError, "Expression entered generate_expression() " \
     42            raise RuntimeError, "Expression entered " \
     43                "generate_intrinsic_function_expression() " \
    4244                "with too few references (%s<0); this is indicative of a " \
    4345                "SERIOUS ERROR in the expression reuse detection scheme." \
  • coopr.pyomo/trunk/coopr/pyomo/base/numvalue.py

    r3577 r3740  
    131131        return False
    132132
     133    def is_relational(self):
     134        return False
     135
    133136    def is_indexed(self):
    134137        return False
     
    217220        (Called in response to 'self < other' or 'other > self'.)
    218221        """
    219         return plugin.ExpressionFactory('<', (self,as_numeric(other)))
     222        return expr.generate_relational_expression('<', self, as_numeric(other))
    220223
    221224    def __gt__(self,other):
     
    224227        (Called in response to 'self > other' or 'other < self'.)
    225228        """
    226         return plugin.ExpressionFactory('>', (self,as_numeric(other)))
     229        return expr.generate_relational_expression('<', as_numeric(other), self)
    227230
    228231    def __le__(self,other):
     
    231234        (Called in response to 'self <= other' or 'other >= self'.)
    232235        """
    233         return plugin.ExpressionFactory('<=', (self,as_numeric(other)))
     236        return expr.generate_relational_expression('<=', self, as_numeric(other))
    234237
    235238    def __ge__(self,other):
     
    238241        (Called in response to 'self >= other' or 'other <= self'.)
    239242        """
    240         return plugin.ExpressionFactory('>=', (self,as_numeric(other)))
     243        return expr.generate_relational_expression('<=', as_numeric(other), self)
    241244
    242245    def __eq__(self,other):
     
    245248        (Called in response to 'self = other'.)
    246249        """
    247         return plugin.ExpressionFactory('=', (self,as_numeric(other)))
     250        return expr.generate_relational_expression('==', self, as_numeric(other))
    248251
    249252    def __add__(self,other):
  • coopr.pyomo/trunk/coopr/pyomo/tests/examples/test10.txt

    r3692 r3740  
    988988
    98998916 Declarations: N Locations P_domain P M Customers d_index d x_index x y obj single_x bound_y_index bound_y num_facilities
    990 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 240, construct
     990DEBUG: "[base]/coopr/pyomo/base/constraint.py", 250, construct
    991991        Constructing constraint single_x
    992 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     992DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    993993        Constructing constraint index 1
    994 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     994DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    995995        Constructing constraint index 2
    996 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     996DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    997997        Constructing constraint index 3
    998 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     998DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    999999        Constructing constraint index 4
    1000 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1000DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    10011001        Constructing constraint index 5
    1002 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1002DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    10031003        Constructing constraint index 6
    10041004About to generate 'bound_y_index' with data: None
     
    11161116   single_x :   Size=6  Index= Customers
    11171117        1
    1118                 identity( 1.0 )
     1118                1.0
    11191119                <=
    11201120                sum( x[1,1] , x[2,1] , x[3,1] , x[4,1] , x[5,1] )
    11211121                <=
    1122                 identity( 1.0 )
     1122                1.0
    11231123        2
    1124                 identity( 1.0 )
     1124                1.0
    11251125                <=
    11261126                sum( x[1,2] , x[2,2] , x[3,2] , x[4,2] , x[5,2] )
    11271127                <=
    1128                 identity( 1.0 )
     1128                1.0
    11291129        3
    1130                 identity( 1.0 )
     1130                1.0
    11311131                <=
    11321132                sum( x[1,3] , x[2,3] , x[3,3] , x[4,3] , x[5,3] )
    11331133                <=
    1134                 identity( 1.0 )
     1134                1.0
    11351135        4
    1136                 identity( 1.0 )
     1136                1.0
    11371137                <=
    11381138                sum( x[1,4] , x[2,4] , x[3,4] , x[4,4] , x[5,4] )
    11391139                <=
    1140                 identity( 1.0 )
     1140                1.0
    11411141        5
    1142                 identity( 1.0 )
     1142                1.0
    11431143                <=
    11441144                sum( x[1,5] , x[2,5] , x[3,5] , x[4,5] , x[5,5] )
    11451145                <=
    1146                 identity( 1.0 )
     1146                1.0
    11471147        6
    1148                 identity( 1.0 )
     1148                1.0
    11491149                <=
    11501150                sum( x[1,6] , x[2,6] , x[3,6] , x[4,6] , x[5,6] )
    11511151                <=
    1152                 identity( 1.0 )
     1152                1.0
    11531153
    115411540 Block Declarations
     
    12711271   single_x :   Size=6  Index= Customers
    12721272        1
    1273                 identity( 1.0 )
     1273                1.0
    12741274                <=
    12751275                sum( x[1,1] , x[2,1] , x[3,1] , x[4,1] , x[5,1] )
    12761276                <=
    1277                 identity( 1.0 )
     1277                1.0
    12781278        2
    1279                 identity( 1.0 )
     1279                1.0
    12801280                <=
    12811281                sum( x[1,2] , x[2,2] , x[3,2] , x[4,2] , x[5,2] )
    12821282                <=
    1283                 identity( 1.0 )
     1283                1.0
    12841284        3
    1285                 identity( 1.0 )
     1285                1.0
    12861286                <=
    12871287                sum( x[1,3] , x[2,3] , x[3,3] , x[4,3] , x[5,3] )
    12881288                <=
    1289                 identity( 1.0 )
     1289                1.0
    12901290        4
    1291                 identity( 1.0 )
     1291                1.0
    12921292                <=
    12931293                sum( x[1,4] , x[2,4] , x[3,4] , x[4,4] , x[5,4] )
    12941294                <=
    1295                 identity( 1.0 )
     1295                1.0
    12961296        5
    1297                 identity( 1.0 )
     1297                1.0
    12981298                <=
    12991299                sum( x[1,5] , x[2,5] , x[3,5] , x[4,5] , x[5,5] )
    13001300                <=
    1301                 identity( 1.0 )
     1301                1.0
    13021302        6
    1303                 identity( 1.0 )
     1303                1.0
    13041304                <=
    13051305                sum( x[1,6] , x[2,6] , x[3,6] , x[4,6] , x[5,6] )
    13061306                <=
    1307                 identity( 1.0 )
     1307                1.0
    13081308
    130913090 Block Declarations
    13101310
    1311131116 Declarations: N Locations P_domain P M Customers d_index d x_index x y obj single_x bound_y_index bound_y num_facilities
    1312 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 240, construct
     1312DEBUG: "[base]/coopr/pyomo/base/constraint.py", 250, construct
    13131313        Constructing constraint bound_y
    1314 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1314DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13151315        Constructing constraint index (1, 1)
    1316 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1316DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13171317        Constructing constraint index (1, 2)
    1318 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1318DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13191319        Constructing constraint index (1, 3)
    1320 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1320DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13211321        Constructing constraint index (1, 4)
    1322 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1322DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13231323        Constructing constraint index (1, 5)
    1324 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1324DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13251325        Constructing constraint index (1, 6)
    1326 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1326DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13271327        Constructing constraint index (2, 1)
    1328 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1328DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13291329        Constructing constraint index (2, 2)
    1330 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1330DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13311331        Constructing constraint index (2, 3)
    1332 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1332DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13331333        Constructing constraint index (2, 4)
    1334 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1334DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13351335        Constructing constraint index (2, 5)
    1336 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1336DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13371337        Constructing constraint index (2, 6)
    1338 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1338DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13391339        Constructing constraint index (3, 1)
    1340 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1340DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13411341        Constructing constraint index (3, 2)
    1342 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1342DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13431343        Constructing constraint index (3, 3)
    1344 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1344DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13451345        Constructing constraint index (3, 4)
    1346 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1346DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13471347        Constructing constraint index (3, 5)
    1348 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1348DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13491349        Constructing constraint index (3, 6)
    1350 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1350DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13511351        Constructing constraint index (4, 1)
    1352 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1352DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13531353        Constructing constraint index (4, 2)
    1354 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1354DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13551355        Constructing constraint index (4, 3)
    1356 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1356DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13571357        Constructing constraint index (4, 4)
    1358 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1358DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13591359        Constructing constraint index (4, 5)
    1360 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1360DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13611361        Constructing constraint index (4, 6)
    1362 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1362DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13631363        Constructing constraint index (5, 1)
    1364 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1364DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13651365        Constructing constraint index (5, 2)
    1366 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1366DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13671367        Constructing constraint index (5, 3)
    1368 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1368DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13691369        Constructing constraint index (5, 4)
    1370 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1370DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13711371        Constructing constraint index (5, 5)
    1372 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
     1372DEBUG: "[base]/coopr/pyomo/base/constraint.py", 290, construct
    13731373        Constructing constraint index (5, 6)
    13741374About to generate 'num_facilities' with data: None
     
    14881488                sum( x[1,3] , -1 *  y[1] )
    14891489                <=
    1490                 identity( 0.0 )
     1490                0.0
    14911491        (5, 6)
    14921492                -Inf
     
    14941494                sum( x[5,6] , -1 *  y[5] )
    14951495                <=
    1496                 identity( 0.0 )
     1496                0.0
    14971497        (5, 4)
    14981498                -Inf
     
    15001500                sum( x[5,4] , -1 *  y[5] )
    15011501                <=
    1502                 identity( 0.0 )
     1502                0.0
    15031503        (2, 1)
    15041504                -Inf
     
    15061506                sum( x[2,1] , -1 *  y[2] )
    15071507                <=
    1508                 identity( 0.0 )
     1508                0.0
    15091509        (1, 6)
    15101510                -Inf
     
    15121512                sum( x[1,6] , -1 *  y[1] )
    15131513                <=
    1514                 identity( 0.0 )
     1514                0.0
    15151515        (5, 1)
    15161516                -Inf
     
    15181518                sum( x[5,1] , -1 *  y[5] )
    15191519                <=
    1520                 identity( 0.0 )
     1520                0.0
    15211521        (2, 5)
    15221522                -Inf
     
    15241524                sum( x[2,5] , -1 *  y[2] )
    15251525                <=
    1526                 identity( 0.0 )
     1526                0.0
    15271527        (1, 2)
    15281528                -Inf
     
    15301530                sum( x[1,2] , -1 *  y[1] )
    15311531                <=
    1532                 identity( 0.0 )
     1532                0.0
    15331533        (3, 3)
    15341534                -Inf
     
    15361536                sum( x[3,3] , -1 *  y[3] )
    15371537                <=
    1538                 identity( 0.0 )
     1538                0.0
    15391539        (4, 4)
    15401540                -Inf
     
    15421542                sum( x[4,4] , -1 *  y[4] )
    15431543                <=
    1544                 identity( 0.0 )
     1544                0.0
    15451545        (1, 5)
    15461546                -Inf
     
    15481548                sum( x[1,5] , -1 *  y[1] )
    15491549                <=
    1550                 identity( 0.0 )
     1550                0.0
    15511551        (3, 6)
    15521552                -Inf
     
    15541554                sum( x[3,6] , -1 *  y[3] )
    15551555                <=
    1556                 identity( 0.0 )
     1556                0.0
    15571557        (2, 2)
    15581558                -Inf
     
    15601560                sum( x[2,2] , -1 *  y[2] )
    15611561                <=
    1562                 identity( 0.0 )
     1562                0.0
    15631563        (5, 3)
    15641564                -Inf
     
    15661566                sum( x[5,3] , -1 *  y[5] )
    15671567                <=
    1568                 identity( 0.0 )
     1568                0.0
    15691569        (4, 1)
    15701570                -Inf
     
    15721572                sum( x[4,1] , -1 *  y[4] )
    15731573                <=
    1574                 identity( 0.0 )
     1574                0.0
    15751575        (1, 1)
    15761576                -Inf
     
    15781578                sum( x[1,1] , -1 *  y[1] )
    15791579                <=
    1580                 identity( 0.0 )
     1580                0.0
    15811581        (3, 2)
    15821582                -Inf
     
    15841584                sum( x[3,2] , -1 *  y[3] )
    15851585                <=
    1586                 identity( 0.0 )
     1586                0.0
    15871587        (2, 6)
    15881588                -Inf
     
    15901590                sum( x[2,6] , -1 *  y[2] )
    15911591                <=
    1592                 identity( 0.0 )
     1592                0.0
    15931593        (4, 5)
    15941594                -Inf
     
    15961596                sum( x[4,5] , -1 *  y[4] )
    15971597                <=
    1598                 identity( 0.0 )
     1598                0.0
    15991599        (5, 5)
    16001600                -Inf
     
    16021602                sum( x[5,5] , -1 *  y[5] )
    16031603                <=
    1604                 identity( 0.0 )
     1604                0.0
    16051605        (1, 4)
    16061606                -Inf
     
    16081608                sum( x[1,4] , -1 *  y[1] )
    16091609                <=
    1610                 identity( 0.0 )
     1610                0.0
    16111611        (2, 3)
    16121612                -Inf
     
    16141614                sum( x[2,3] , -1 *  y[2] )
    16151615                <=
    1616                 identity( 0.0 )
     1616                0.0
    16171617        (4, 2)
    16181618                -Inf
     
    16201620                sum( x[4,2] , -1 *  y[4] )
    16211621                <=
    1622                 identity( 0.0 )
     1622                0.0
    16231623        (3, 5)
    16241624                -Inf
     
    16261626                sum( x[3,5] , -1 *  y[3] )
    16271627                <=
    1628                 identity( 0.0 )
     1628                0.0
    16291629        (4, 6)
    16301630                -Inf
     
    16321632                sum( x[4,6] , -1 *  y[4] )
    16331633                <=
    1634                 identity( 0.0 )
     1634                0.0
    16351635        (5, 2)
    16361636                -Inf
     
    16381638                sum( x[5,2] , -1 *  y[5] )
    16391639                <=
    1640                 identity( 0.0 )
     1640                0.0
    16411641        (3, 1)
    16421642                -Inf
     
    16441644                sum( x[3,1] , -1 *  y[3] )
    16451645                <=
    1646                 identity( 0.0 )
     1646                0.0
    16471647        (4, 3)
    16481648                -Inf
     
    16501650                sum( x[4,3] , -1 *  y[4] )
    16511651                <=
    1652                 identity( 0.0 )
     1652                0.0
    16531653        (3, 4)
    16541654                -Inf
     
    16561656                sum( x[3,4] , -1 *  y[3] )
    16571657                <=
    1658                 identity( 0.0 )
     1658                0.0
    16591659        (2, 4)
    16601660                -Inf
     
    16621662                sum( x[2,4] , -1 *  y[2] )
    16631663                <=
    1664                 identity( 0.0 )
     1664                0.0
    16651665   num_facilities :     Size=0
    16661666   single_x :   Size=6  Index= Customers
    16671667        1
    1668                 identity( 1.0 )
     1668                1.0
    16691669                <=
    16701670                sum( x[1,1] , x[2,1] , x[3,1] , x[4,1] , x[5,1] )
    16711671                <=
    1672                 identity( 1.0 )
     1672                1.0
    16731673        2
    1674                 identity( 1.0 )
     1674                1.0
    16751675                <=
    16761676                sum( x[1,2] , x[2,2] , x[3,2] , x[4,2] , x[5,2] )
    16771677                <=
    1678                 identity( 1.0 )
     1678                1.0
    16791679        3
    1680                 identity( 1.0 )
     1680                1.0
    16811681                <=
    16821682                sum( x[1,3] , x[2,3] , x[3,3] , x[4,3] , x[5,3] )
    16831683                <=
    1684                 identity( 1.0 )
     1684                1.0
    16851685        4
    1686                 identity( 1.0 )
     1686                1.0
    16871687                <=
    16881688                sum( x[1,4] , x[2,4] , x[3,4] , x[4,4] , x[5,4] )
    16891689                <=
    1690                 identity( 1.0 )
     1690                1.0
    16911691        5
    1692                 identity( 1.0 )
     1692                1.0
    16931693                <=
    16941694                sum( x[1,5] , x[2,5] , x[3,5] , x[4,5] , x[5,5] )
    16951695                <=
    1696                 identity( 1.0 )
     1696                1.0
    16971697        6
    1698                 identity( 1.0 )
     1698                1.0
    16991699                <=
    17001700                sum( x[1,6] , x[2,6] , x[3,6] , x[4,6] , x[5,6] )
    17011701                <=
    1702                 identity( 1.0 )
     1702                1.0
    17031703
    170417040 Block Declarations
    17051705
    1706170616 Declarations: N Locations P_domain P M Customers d_index d x_index x y obj single_x bound_y_index bound_y num_facilities
    1707 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 240, construct
     1707DEBUG: "[base]/coopr/pyomo/base/constraint.py", 250, construct
    17081708        Constructing constraint num_facilities
    1709 DEBUG: "[base]/coopr/pyomo/base/constraint.py", 272, construct
    1710         Constructing constraint index None
    1711 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1709DEBUG: "[base]/coopr/pyomo/base/constraint.py", 277, construct
     1710        Constructing single constraint (index=None)
     1711INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17121712        Generating expression for Objective 'obj
    1713 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1713INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17141714        Generating expression for Constraint 'single_x
    1715 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1715INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17161716        Generating expression for Constraint 'single_x
    1717 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1717INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17181718        Generating expression for Constraint 'single_x
    1719 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1719INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17201720        Generating expression for Constraint 'single_x
    1721 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1721INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17221722        Generating expression for Constraint 'single_x
    1723 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1723INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17241724        Generating expression for Constraint 'single_x
    1725 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1725INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17261726        Generating expression for Constraint 'num_facilities
    1727 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1728         Generating expression for Constraint 'bound_y
    1729 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1730         Generating expression for Constraint 'bound_y
    1731 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1732         Generating expression for Constraint 'bound_y
    1733 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1734         Generating expression for Constraint 'bound_y
    1735 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1736         Generating expression for Constraint 'bound_y
    1737 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1738         Generating expression for Constraint 'bound_y
    1739 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1740         Generating expression for Constraint 'bound_y
    1741 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1742         Generating expression for Constraint 'bound_y
    1743 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1744         Generating expression for Constraint 'bound_y
    1745 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1746         Generating expression for Constraint 'bound_y
    1747 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1748         Generating expression for Constraint 'bound_y
    1749 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1750         Generating expression for Constraint 'bound_y
    1751 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1752         Generating expression for Constraint 'bound_y
    1753 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1754         Generating expression for Constraint 'bound_y
    1755 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1756         Generating expression for Constraint 'bound_y
    1757 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1758         Generating expression for Constraint 'bound_y
    1759 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1760         Generating expression for Constraint 'bound_y
    1761 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1762         Generating expression for Constraint 'bound_y
    1763 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1764         Generating expression for Constraint 'bound_y
    1765 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1766         Generating expression for Constraint 'bound_y
    1767 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1768         Generating expression for Constraint 'bound_y
    1769 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1770         Generating expression for Constraint 'bound_y
    1771 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1772         Generating expression for Constraint 'bound_y
    1773 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1774         Generating expression for Constraint 'bound_y
    1775 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1776         Generating expression for Constraint 'bound_y
    1777 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1778         Generating expression for Constraint 'bound_y
    1779 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1780         Generating expression for Constraint 'bound_y
    1781 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1782         Generating expression for Constraint 'bound_y
    1783 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
    1784         Generating expression for Constraint 'bound_y
    1785 INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 87, generate_canonical_repn
     1727INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1728        Generating expression for Constraint 'bound_y
     1729INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1730        Generating expression for Constraint 'bound_y
     1731INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1732        Generating expression for Constraint 'bound_y
     1733INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1734        Generating expression for Constraint 'bound_y
     1735INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1736        Generating expression for Constraint 'bound_y
     1737INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1738        Generating expression for Constraint 'bound_y
     1739INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1740        Generating expression for Constraint 'bound_y
     1741INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1742        Generating expression for Constraint 'bound_y
     1743INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1744        Generating expression for Constraint 'bound_y
     1745INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1746        Generating expression for Constraint 'bound_y
     1747INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1748        Generating expression for Constraint 'bound_y
     1749INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1750        Generating expression for Constraint 'bound_y
     1751INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1752        Generating expression for Constraint 'bound_y
     1753INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1754        Generating expression for Constraint 'bound_y
     1755INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1756        Generating expression for Constraint 'bound_y
     1757INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1758        Generating expression for Constraint 'bound_y
     1759INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1760        Generating expression for Constraint 'bound_y
     1761INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1762        Generating expression for Constraint 'bound_y
     1763INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1764        Generating expression for Constraint 'bound_y
     1765INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1766        Generating expression for Constraint 'bound_y
     1767INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1768        Generating expression for Constraint 'bound_y
     1769INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1770        Generating expression for Constraint 'bound_y
     1771INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1772        Generating expression for Constraint 'bound_y
     1773INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1774        Generating expression for Constraint 'bound_y
     1775INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1776        Generating expression for Constraint 'bound_y
     1777INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1778        Generating expression for Constraint 'bound_y
     1779INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1780        Generating expression for Constraint 'bound_y
     1781INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1782        Generating expression for Constraint 'bound_y
     1783INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
     1784        Generating expression for Constraint 'bound_y
     1785INFO: "[base]/coopr/pyomo/expr/canonical_repn.py", 89, generate_canonical_repn
    17861786        Generating expression for Constraint 'bound_y
    17871787MODEL INSTANCE
     
    19011901                sum( x[1,3] , -1 *  y[1] )
    19021902                <=
    1903                 identity( 0.0 )
     1903                0.0
    19041904        (5, 6)
    19051905                -Inf
     
    19071907                sum( x[5,6] , -1 *  y[5] )
    19081908                <=
    1909                 identity( 0.0 )
     1909                0.0
    19101910        (5, 4)
    19111911                -Inf
     
    19131913                sum( x[5,4] , -1 *  y[5] )
    19141914                <=
    1915                 identity( 0.0 )
     1915                0.0
    19161916        (2, 1)
    19171917                -Inf
     
    19191919                sum( x[2,1] , -1 *  y[2] )
    19201920                <=
    1921                 identity( 0.0 )
     1921                0.0
    19221922        (1, 6)
    19231923                -Inf
     
    19251925                sum( x[1,6] , -1 *  y[1] )
    19261926                <=
    1927                 identity( 0.0 )
     1927                0.0
    19281928        (5, 1)
    19291929                -Inf
     
    19311931                sum( x[5,1] , -1 *  y[5] )
    19321932                <=
    1933                 identity( 0.0 )
     1933                0.0
    19341934        (2, 5)
    19351935                -Inf
     
    19371937                sum( x[2,5] , -1 *  y[2] )
    19381938                <=
    1939                 identity( 0.0 )
     1939                0.0
    19401940        (1, 2)
    19411941                -Inf
     
    19431943                sum( x[1,2] , -1 *  y[1] )
    19441944                <=
    1945                 identity( 0.0 )
     1945                0.0
    19461946        (3, 3)
    19471947                -Inf
     
    19491949                sum( x[3,3] , -1 *  y[3] )
    19501950                <=
    1951                 identity( 0.0 )
     1951                0.0
    19521952        (4, 4)
    19531953                -Inf
     
    19551955                sum( x[4,4] , -1 *  y[4] )
    19561956                <=
    1957                 identity( 0.0 )
     1957                0.0
    19581958        (1, 5)
    19591959                -Inf
     
    19611961                sum( x[1,5] , -1 *  y[1] )
    19621962                <=
    1963                 identity( 0.0 )
     1963                0.0
    19641964        (3, 6)
    19651965                -Inf
     
    19671967                sum( x[3,6] , -1 *  y[3] )
    19681968                <=
    1969                 identity( 0.0 )
     1969                0.0
    19701970        (2, 2)
    19711971                -Inf
     
    19731973                sum( x[2,2] , -1 *  y[2] )
    19741974                <=
    1975                 identity( 0.0 )
     1975                0.0
    19761976        (5, 3)
    19771977                -Inf
     
    19791979                sum( x[5,3] , -1 *  y[5] )
    19801980                <=
    1981                 identity( 0.0 )
     1981                0.0
    19821982        (4, 1)
    19831983                -Inf
     
    19851985                sum( x[4,1] , -1 *  y[4] )
    19861986                <=
    1987                 identity( 0.0 )
     1987                0.0
    19881988        (1, 1)
    19891989                -Inf
     
    19911991                sum( x[1,1] , -1 *  y[1] )
    19921992                <=
    1993                 identity( 0.0 )
     1993                0.0
    19941994        (3, 2)
    19951995                -Inf
     
    19971997                sum( x[3,2] , -1 *  y[3] )
    19981998                <=
    1999                 identity( 0.0 )
     1999                0.0
    20002000        (2, 6)
    20012001                -Inf
     
    20032003                sum( x[2,6] , -1 *  y[2] )
    20042004                <=
    2005                 identity( 0.0 )
     2005                0.0
    20062006        (4, 5)
    20072007                -Inf
     
    20092009                sum( x[4,5] , -1 *  y[4] )
    20102010                <=
    2011                 identity( 0.0 )
     2011                0.0
    20122012        (5, 5)
    20132013                -Inf
     
    20152015                sum( x[5,5] , -1 *  y[5] )
    20162016                <=
    2017                 identity( 0.0 )
     2017                0.0
    20182018        (1, 4)
    20192019                -Inf
     
    20212021                sum( x[1,4] , -1 *  y[1] )
    20222022                <=
    2023                 identity( 0.0 )
     2023                0.0
    20242024        (2, 3)
    20252025                -Inf
     
    20272027                sum( x[2,3] , -1 *  y[2] )
    20282028                <=
    2029                 identity( 0.0 )
     2029                0.0
    20302030        (4, 2)
    20312031                -Inf
     
    20332033                sum( x[4,2] , -1 *  y[4] )
    20342034                <=
    2035                 identity( 0.0 )
     2035                0.0
    20362036        (3, 5)
    20372037                -Inf
     
    20392039                sum( x[3,5] , -1 *  y[3] )
    20402040                <=
    2041                 identity( 0.0 )
     2041                0.0
    20422042        (4, 6)
    20432043                -Inf
     
    20452045                sum( x[4,6] , -1 *  y[4] )
    20462046                <=
    2047                 identity( 0.0 )
     2047                0.0
    20482048        (5, 2)
    20492049                -Inf
     
    20512051                sum( x[5,2] , -1 *  y[5] )
    20522052                <=
    2053                 identity( 0.0 )
     2053                0.0
    20542054        (3, 1)
    20552055                -Inf
     
    20572057                sum( x[3,1] , -1 *  y[3] )
    20582058                <=
    2059                 identity( 0.0 )
     2059                0.0
    20602060        (4, 3)
    20612061                -Inf
     
    20632063                sum( x[4,3] , -1 *  y[4] )
    20642064                <=
    2065                 identity( 0.0 )
     2065                0.0
    20662066        (3, 4)
    20672067                -Inf
     
    20692069                sum( x[3,4] , -1 *  y[3] )
    20702070                <=
    2071                 identity( 0.0 )
     2071                0.0
    20722072        (2, 4)
    20732073                -Inf
     
    20752075                sum( x[2,4] , -1 *  y[2] )
    20762076                <=
    2077                 identity( 0.0 )
     2077                0.0
    20782078   num_facilities :     Size=1
    2079                 identity( 0.0 )
     2079                0.0
    20802080                <=
    20812081                sum( y[1] , y[2] , y[3] , y[4] , y[5] , -1 *  P )
    20822082                <=
    2083                 identity( 0.0 )
     2083                0.0
    20842084   single_x :   Size=6  Index= Customers
    20852085        1
    2086                 identity( 1.0 )
     2086                1.0
    20872087                <=
    20882088                sum( x[1,1] , x[2,1] , x[3,1] , x[4,1] , x[5,1] )
    20892089                <=
    2090                 identity( 1.0 )
     2090                1.0
    20912091        2
    2092                 identity( 1.0 )
     2092                1.0
    20932093                <=
    20942094                sum( x[1,2] , x[2,2] , x[3,2] , x[4,2] , x[5,2] )
    20952095                <=
    2096                 identity( 1.0 )
     2096                1.0
    20972097        3
    2098                 identity( 1.0 )
     2098                1.0
    20992099                <=
    21002100                sum( x[1,3] , x[2,3] , x[3,3] , x[4,3] , x[5,3] )
    21012101                <=
    2102                 identity( 1.0 )
     2102                1.0
    21032103        4
    2104                 identity( 1.0 )
     2104                1.0
    21052105                <=
    21062106                sum( x[1,4] , x[2,4] , x[3,4] , x[4,4] , x[5,4] )
    21072107                <=
    2108                 identity( 1.0 )
     2108                1.0
    21092109        5
    2110                 identity( 1.0 )
     2110                1.0
    21112111                <=
    21122112                sum( x[1,5] , x[2,5] , x[3,5] , x[4,5] , x[5,5] )
    21132113                <=
    2114                 identity( 1.0 )
     2114                1.0
    21152115        6
    2116                 identity( 1.0 )
     2116                1.0
    21172117                <=
    21182118                sum( x[1,6] , x[2,6] , x[3,6] , x[4,6] , x[5,6] )
    21192119                <=
    2120                 identity( 1.0 )
     2120                1.0
    21212121
    212221220 Block Declarations
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/display.txt

    r3554 r3740  
    2020    Constraint con2 :   Size=3
    2121                Lower   Body            Upper
    22       1 :       1.0     3       2.0
    23       2 :       1.0     4       2.0
    24       3 :       1.0     5       2.0
     22      1 :       1       3       2
     23      2 :       1       4       2
     24      3 :       1       5       2
    2525    Constraint con :   Size=1
    2626      Value=2
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_con.py

    r3646 r3740  
    2626    def construct(self,filename):
    2727        self.instance = self.model.create(filename)
     28
     29
     30class TestConstraintCreation(unittest.TestCase):
     31    def setUp(self):
     32        self.model = AbstractModel()
     33        self.model.x = Var()
     34        self.model.y = Var()
     35        self.model.z = Var()
     36
     37    def test_tuple_construct_equality1(self):
     38        def rule(model):
     39            return (0.0, model.x)
     40        self.model.c = Constraint(rule=rule)
     41        instance=self.model.create()
     42        self.assertEqual(instance.c[None].lower, 0)
     43        self.assertIs(instance.c[None].body, instance.x)
     44        self.assertEqual(instance.c[None].upper, 0)
     45        self.assertEqual(instance.c[None].lower_ineq_strict, False)
     46        self.assertEqual(instance.c[None].upper_ineq_strict, False)
     47
     48    def test_tuple_construct_equality2(self):
     49        def rule(model):
     50            return (model.x, 0.0)
     51        self.model.c = Constraint(rule=rule)
     52        instance=self.model.create()
     53        self.assertEqual(instance.c[None].lower, 0)
     54        self.assertIs(instance.c[None].body, instance.x)
     55        self.assertEqual(instance.c[None].upper, 0)
     56        self.assertEqual(instance.c[None].lower_ineq_strict, False)
     57        self.assertEqual(instance.c[None].upper_ineq_strict, False)
     58       
     59    def test_tuple_construct_inequality(self):
     60        def rule(model):
     61            return (0, model.y, 1)
     62        self.model.c = Constraint(rule=rule)
     63        instance=self.model.create()
     64        self.assertEqual(instance.c[None].lower, 0)
     65        self.assertIs(instance.c[None].body, instance.y)
     66        self.assertEqual(instance.c[None].upper, 1)
     67        self.assertEqual(instance.c[None].lower_ineq_strict, False)
     68        self.assertEqual(instance.c[None].upper_ineq_strict, False)
     69       
     70    def test_tuple_construct_invalid_inequality1(self):
     71        def rule(model):
     72            return (model.x, model.y, 1)
     73        self.model.c = Constraint(rule=rule)
     74        self.assertRaises(ValueError, self.model.create)
     75
     76    def test_tuple_construct_invalid_inequality2(self):
     77        def rule(model):
     78            return (0, model.y, model.z)
     79        self.model.c = Constraint(rule=rule)
     80        self.assertRaises(ValueError, self.model.create)
     81       
    2882
    2983
     
    66120    def test_set_expr_undefined_univariate(self):
    67121        """Test expr= option (univariate expression)"""
    68         model = ConcreteModel()
     122        model = AbstractModel()
    69123        model.x = Var()
    70124        ans = model.x >= 0
     
    72126        model.c = Constraint(expr=ans)
    73127        instance = model.create()
    74         try:
    75           self.failUnlessEqual(instance.c(), 8)
    76         except ValueError:
    77           pass
    78         else:
    79           self.fail("Expected ValueError evaluating expression with x==None")
     128        self.assertRaises(ValueError, instance.c)
    80129        instance.x = 2
    81130        self.failUnlessEqual(instance.c(), 2)
     
    214263        def f(i,model):
    215264          if i%2 == 0:
    216                 return 0
     265                return None
    217266          ans=0
    218267          for j in model.x.keys():
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/test_expr.py

    r3728 r3740  
    946946            pass
    947947       
    948     def test_constructor_coverage(self):
     948    def test_tuple_constraint_create(self):
    949949        def rule1(model):
    950950            return (0.0,model.x)
     
    963963        model.z = Var()
    964964        model.o = Constraint(rule=rule1)
    965         instance=model.create()
    966         #
     965        self.assertRaises(ValueError, model.create)
     966        #
     967
     968    def test_expression_constructor_coverage(self):
    967969        def rule1(model):
    968970            expr=model.x
     
    975977        model.z = Var()
    976978        model.o = Constraint(rule=rule1)
    977         try:
    978             instance=model.create()
    979             self.fail("bad constraint formulation")
    980         except ValueError:
    981             pass
     979        self.assertRaises(ValueError, model.create)
    982980        #
    983981        def rule1(model):
     
    1001999        model.z = Var()
    10021000        model.o = Constraint(rule=rule1)
    1003         instance=model.create()
     1001        self.assertRaises(ValueError, model.create)
    10041002        #
    10051003        def rule1(model):
     
    10121010        model.z = Var()
    10131011        model.o = Constraint(rule=rule1)
    1014         instance=model.create()
     1012        self.assertRaises(ValueError, model.create)
    10151013        #
    10161014        def rule1(model):
     
    10221020        model.y = Var()
    10231021        model.o = Constraint(rule=rule1)
    1024         instance=model.create()
     1022        self.assertRaises(ValueError, model.create)
    10251023        #
    10261024        def rule1(model):
     
    10531051        model.z = Var()
    10541052        model.o = Constraint(rule=rule1)
    1055         try:
    1056             instance=model.create()
    1057             self.fail("bad constraint formulation")
    1058         except ValueError:
    1059             pass
     1053        self.assertRaises(ValueError, model.create)
    10601054        #
    10611055        def rule1(model):
     
    10791073        model.z = Var()
    10801074        model.o = Constraint(rule=rule1)
    1081         instance=model.create()
     1075        self.assertRaises(ValueError, model.create)
    10821076        #
    10831077        def rule1(model):
     
    10901084        model.z = Var()
    10911085        model.o = Constraint(rule=rule1)
    1092         instance=model.create()
     1086        self.assertRaises(ValueError, model.create)
    10931087        #
    10941088        def rule1(model):
     
    11001094        model.y = Var()
    11011095        model.o = Constraint(rule=rule1)
    1102         instance=model.create()
     1096        self.assertRaises(ValueError, model.create)
    11031097        #
    11041098        def rule1(model):
     
    14101404
    14111405
     1406    def test_cloneCount_relationalExpression(self):
     1407        # relational expression of a simple expression
     1408        count = generate_relational_expression.clone_counter
     1409        expr = self.model.c < self.model.a
     1410        self.assertEqual( generate_relational_expression.clone_counter,
     1411                          count )
     1412
     1413        # relational expression of a referenced expression
     1414        count = generate_relational_expression.clone_counter
     1415        expr = self.model.c < self.model.a
     1416        expr1 = expr < self.model.d
     1417        self.assertEqual( generate_relational_expression.clone_counter,
     1418                          count+1 )
     1419
     1420
    14121421class TestCloneExpression(pyutilib.th.TestCase):
    14131422    def setUp(self):
  • coopr.pyomo/trunk/coopr/pyomo/tests/unit/varpprint.txt

    r3646 r3740  
    454524 Constraint Declarations
    4646   c1 :         Size=1
    47                 identity( 1.0 )
    48                 <=
    49                 identity( b[1] )
     47                1.0
     48                <=
     49                b[1]
    5050                <
    5151                Inf
     
    5353                -Inf
    5454                <
    55                 identity( c )
     55                c
    5656                <=
    5757                sum( B , B )
     
    5959                -Inf
    6060                <
    61                 identity( c )
     61                c
    6262                <
    6363                sum( B , B )
     
    6565                sum( A , B )
    6666                <=
    67                 identity( c )
     67                c
    6868                <=
    6969                sum( A , B )
    7070   c12 :        Size=1
    71                 identity( 0.0 )
     71                0
    7272                <=
    7373                sum( c , -1 *  d )
    7474                <=
    75                 identity( 0.0 )
     75                0
    7676   c13a :       Size=1
    7777                -Inf
     
    7979                sum( c , -1 *  d )
    8080                <=
    81                 identity( 0.0 )
     81                0
    8282   c13b :       Size=1
    8383                -Inf
     
    8585                sum( c , -1 *  d )
    8686                <
    87                 identity( 0.0 )
     87                0
    8888   c14a :       Size=1
    8989                -Inf
     
    9191                sum( d , -1 *  c )
    9292                <=
    93                 identity( 0.0 )
     93                0
    9494   c14b :       Size=1
    9595                -Inf
     
    9797                sum( d , -1 *  c )
    9898                <
    99                 identity( 0.0 )
     99                0
    100100   c15a :       Size=1
    101                 identity( A )
     101                A
    102102                <=
    103103                prod( num=( A , d ) )
     
    105105                Inf
    106106   c15b :       Size=1
    107                 identity( A )
     107                A
    108108                <
    109109                prod( num=( A , d ) )
     
    115115                prod( num=( A , d ) )
    116116                <=
    117                 identity( B )
     117                B
    118118   c16b :       Size=1
    119119                -Inf
     
    121121                prod( num=( A , d ) )
    122122                <
    123                 identity( B )
     123                B
    124124   c2 :         Size=1
    125125                -Inf
    126126                <
    127                 identity( b[1] )
    128                 <=
    129                 identity( 0.0 )
     127                b[1]
     128                <=
     129                0.0
    130130   c3 :         Size=1
    131                 identity( 0.0 )
    132                 <=
    133                 identity( b[1] )
    134                 <=
    135                 identity( 1.0 )
     131                0.0
     132                <=
     133                b[1]
     134                <=
     135                1.0
    136136   c4 :         Size=1
    137                 identity( 3.0 )
    138                 <=
    139                 identity( b[1] )
    140                 <=
    141                 identity( 3.0 )
     137                3.0
     138                <=
     139                b[1]
     140                <=
     141                3.0
    142142   c5 :         Size=3  Index= a
    143143        1
    144                 identity( 0.0 )
    145                 <=
    146                 identity( b[1] )
    147                 <=
    148                 identity( 0.0 )
     144                0.0
     145                <=
     146                b[1]
     147                <=
     148                0.0
    149149        2
    150                 identity( 0.0 )
    151                 <=
    152                 identity( b[2] )
    153                 <=
    154                 identity( 0.0 )
     150                0.0
     151                <=
     152                b[2]
     153                <=
     154                0.0
    155155        3
    156                 identity( 0.0 )
    157                 <=
    158                 identity( b[3] )
    159                 <=
    160                 identity( 0.0 )
     156                0.0
     157                <=
     158                b[3]
     159                <=
     160                0.0
    161161   c6a :        Size=1
    162                 identity( 0.0 )
    163                 <=
    164                 identity( c )
     162                0.0
     163                <=
     164                c
    165165                <
    166166                Inf
    167167   c6b :        Size=1
    168                 identity( 0.0 )
    169                 <
    170                 identity( c )
     168                0.0
     169                <
     170                c
    171171                <
    172172                Inf
     
    174174                -Inf
    175175                <
    176                 identity( c )
    177                 <=
    178                 identity( 1.0 )
     176                c
     177                <=
     178                1.0
    179179   c7b :        Size=1
    180180                -Inf
    181181                <
    182                 identity( c )
    183                 <
    184                 identity( 1.0 )
     182                c
     183                <
     184                1.0
    185185   c8 :         Size=1
    186                 identity( 2.0 )
    187                 <=
    188                 identity( c )
    189                 <=
    190                 identity( 2.0 )
     186                2.0
     187                <=
     188                c
     189                <=
     190                2.0
    191191   c9a :        Size=1
    192192                sum( A , A )
    193193                <=
    194                 identity( c )
     194                c
    195195                <
    196196                Inf
     
    198198                sum( A , A )
    199199                <
    200                 identity( c )
     200                c
    201201                <
    202202                Inf
     
    211211                sum( d , -1 *  c )
    212212                <
    213                 identity( 0.0 )
     213                0
    214214        2
    215215                -Inf
     
    217217                sum( d , -2 *  c )
    218218                <
    219                 identity( 0.0 )
     219                0
    220220        3
    221221                -Inf
     
    223223                sum( d , -3 *  c )
    224224                <
    225                 identity( 0.0 )
     225                0
    226226        4
    227227                -Inf
     
    229229                sum( d , -4 *  c )
    230230                <
    231                 identity( 0.0 )
     231                0
    232232        5
    233233                -Inf
     
    235235                sum( d , -5 *  c )
    236236                <
    237                 identity( 0.0 )
     237                0
    238238        6
    239239                -Inf
     
    241241                sum( d , -6 *  c )
    242242                <
    243                 identity( 0.0 )
     243                0
    244244        7
    245245                -Inf
     
    247247                sum( d , -7 *  c )
    248248                <
    249                 identity( 0.0 )
     249                0
    250250        8
    251251                -Inf
     
    253253                sum( d , -8 *  c )
    254254                <
    255                 identity( 0.0 )
     255                0
    256256        9
    257257                -Inf
     
    259259                sum( d , -9 *  c )
    260260                <
    261                 identity( 0.0 )
     261                0
    262262        10
    263263                -Inf
     
    265265                sum( d , -10 *  c )
    266266                <
    267                 identity( 0.0 )
     267                0
    268268
    26926936 Declarations: a b c d e A B o2 o3_index o3 c1 c2 c3 c4 c5 c6a c6b c7a c7b c8 c9a c9b c10a c10b c11 c15a c15b c16a c16b c12 c13a c13b c14a c14b cl_index cl
Note: See TracChangeset for help on using the changeset viewer.