Changeset 2799


Ignore:
Timestamp:
Jul 14, 2010 4:19:26 PM (9 years ago)
Author:
khunter
Message:

Refs #3881: "CPlex LP line length enforcement"

Formally enforce CPlex's arbitrary 510 char line length limit CPlex.
This still fails to test or properly mangle 255-character
identifiers, but that might be enforceable at a different layer.
Haven't completely through that one out yet.

Of note, this commit also assumes that if people are going to want
to read the LP files, it tries its best to stick to 80 characters
wide (good for screen reading and printing to paper).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • coopr.pyomo/trunk/coopr/pyomo/io/cpxlp.py

    r2796 r2799  
    9292           return None
    9393
    94     def _print_bound(self, exp, OUTPUT, offset=0.0):
    95         if isinstance(exp,expr._IdentityExpression):
    96            self._print_bound(exp._args[0], OUTPUT, offset)
    97         elif exp.is_constant():
    98            print >>OUTPUT, exp()+offset
    99         else:
    100            # TODO: Bundle the following into a single string and pass with
    101            #       thrown exception
    102            print "ERROR: nonconstant constraint bound"
    103            print "Expression type=" + exp.__class__.__name__
    104            if not exp is None:
    105                 print "Offending expression:"
    106                 exp.pprint()
    107            raise ValueError
    108 
    109     def _collect_key(self, a):
     94
     95    @staticmethod
     96    def _collect_key ( a ):
    11097        return a[0]
    11198
     
    121108
    122109
    123     def _print_expr ( self, x, OUTPUT, **kwargs ):
     110    def _print_expr ( self, x, **kwargs ):
    124111        """
    125         Write an expression in LP format.
     112        Return a expression as a string in LP format.
    126113
    127114        Note that this function does not handle any differences in LP format
     
    131118        required arguments:
    132119          x: A Pyomo canonical expression to write in LP format
    133 
    134           OUTPUT: an open file handle to which to write
    135120
    136121        optional keyword arguments:
     
    227212            output.append('ONE_VAR_CONSTANT')
    228213
    229         output = ' '.join( output ) # convert expression parts to a single str
     214        expr = ' '.join( output ) # convert expression parts to a single str
    230215
    231216        # finally, actually write expression, taking care to not break the
    232217        # arbitrary 510 character line length limit of CPlex.
    233         print >>OUTPUT, self.wrapper.fill( output )
     218        #print >>OUTPUT, self.wrapper.fill( expr )
    234219        #
    235220        # Return constant offset
    236221        #
    237         return offset
     222        return expr, offset
    238223
    239224
     
    310295                raise ValueError, msg % `arg`
    311296
     297
    312298    @staticmethod
    313299    def printSOS(con, OUTPUT, name, index=None):
     
    354340
    355341        # Print to CPLEX file
    356         print >>OUTPUT, "    " + str(name) + conNameIndex + ": S" + \
    357                           str(con.sos_level()) + ":: " + resultStr
     342        line = str(name) + conNameIndex + ": S" + str(con.sos_level()) +      \
     343               ":: " + resultStr
     344        return line
     345
    358346
    359347    def _print_model_LP(self, model, OUTPUT):
     
    376364           else:
    377365              print >>OUTPUT, "min "
    378            print >>OUTPUT, "obj: ",
     366
    379367           obj = _obj[ _obj.keys()[0] ]
    380368           for key in obj:
     
    394382                    raise ValueError, msg % ( str(obj), str(key) )
    395383
    396                 self._print_expr( obj[key].repn, OUTPUT,
     384                expr, offset = self._print_expr( obj[key].repn,
    397385                  print_offset=True, is_objective=True
    398386                )
     387
     388                line = 'obj: ' + expr + '\n'
     389                print >>OUTPUT, self.wrapper.fill( line )
    399390
    400391           if obj._quad_subexpr is not None:
     
    466457                        prefix = C.model.name+"_"
    467458
     459                    expr, offset = self._print_expr(C[cndx].repn)
     460                    con_name = convert_name(C._data[cndx].label)
     461                    fmt = '%s%%s%s_: %s %%s %%s' % ( prefix, con_name, expr )
     462                    con = list()
     463
    468464                    if C._data[cndx]._equality:
    469                          #
    470                          # Equality constraint
    471                          #
    472                          print >>OUTPUT, prefix + "c_e_" + \
    473                                     convert_name(C._data[cndx].label) + "_: ",
    474                          offset = self._print_expr(C[cndx].repn, OUTPUT)
    475                          print >>OUTPUT, "=",
    476                          self._print_bound(C._data[cndx].lower, OUTPUT, -offset)
    477                          print >>OUTPUT, ""
    478                          i=i+1
     465                        bound = C._data[cndx].lower
     466                        bound = str(self._get_bound(bound) - offset)
     467                        cfmt = fmt % ( 'c_e_', '=', bound )
     468                        con.append( cfmt )
    479469                    else:
    480                          #
    481                          # Inequality constraint
    482                          #
    483470                         if C._data[cndx].lower is not None:
    484                             print >>OUTPUT, prefix + "c_l_" + \
    485                                      convert_name(C._data[cndx].label) + "_: ",
    486                             offset = self._print_expr(C[cndx].repn, OUTPUT)
    487                             print >>OUTPUT, ">=",
    488                             self._print_bound(C._data[cndx].lower,
    489                                   OUTPUT, -offset)
    490                             print >>OUTPUT, ""
    491                             i=i+1
     471                             bound = C._data[cndx].lower
     472                             bound = str(self._get_bound(bound) - offset)
     473                             cfmt = fmt % ( 'c_l_', '>=', bound )
     474                             con.append( cfmt )
     475
    492476                         if C._data[cndx].upper is not None:
    493                             print >>OUTPUT, prefix + "c_u_" + \
    494                                     convert_name(C._data[cndx].label) + "_: ",
    495                             offset = self._print_expr(C[cndx].repn, OUTPUT)
    496                             print >>OUTPUT, "<=",
    497                             self._print_bound(C._data[cndx].upper,
    498                                   OUTPUT, -offset)
    499                             print >>OUTPUT, ""
    500                             i=i+1
     477                             bound = C._data[cndx].upper
     478                             bound = str(self._get_bound(bound) - offset)
     479                             cfmt = fmt % ( 'c_u_', '<=', bound )
     480                             con.append( cfmt )
     481
     482                    for line in con:
     483                        print >>OUTPUT, self.wrapper.fill( line ) + '\n'
     484                    i += 1
    501485               except ValueError, e:
    502486                   print e
     
    517501           if self._output_prefixes is True:
    518502              prefix = model.name + "_"
    519            print >>OUTPUT, '%sc_e_ONE_VAR_CONSTANT:%sONE_VAR_CONSTANT = '     \
     503           print >>OUTPUT, '%sc_e_ONE_VAR_CONSTANT: %sONE_VAR_CONSTANT = '    \
    520504                           '1.0\n' % (prefix, prefix)
    521505
     
    595579                for ndx in var.integer_keys():
    596580                   if not var[ndx].active:
    597                         continue
     581                       continue
    598582                   if var[ndx].id != -1: # skip if variable not referenced
    599                       print >>OUTPUT, "   ", \
    600                                       prefix+convert_name(var[ndx].label)
     583                       var_name = prefix+convert_name(var[ndx].label)
     584                       print >>OUTPUT, ' ', var_name
    601585
    602586           if (nbv > 0) and (self._output_binary_variables is True):
     
    615599                for ndx in var.binary_keys():
    616600                   if not var[ndx].active:
    617                         continue
     601                       continue
    618602                   if var[ndx].id != -1: # skip if variable not referenced
    619                       print >>OUTPUT, "   ", \
    620                                       prefix+convert_name(var[ndx].label)
     603                       var_name = prefix+convert_name(var[ndx].label)
     604                       print >>OUTPUT, ' ', var_name
     605
    621606
    622607        # SOS constraints
     
    656641                        # A series of indexed constraints
    657642                        for index in masterIndex:
    658                             self.printSOS(con, OUTPUT, name, index)
     643                            line = self.printSOS(con, OUTPUT, name, index)
     644                            print >>OUTPUT, self.wrapper.fill( line )
    659645
    660646        #
Note: See TracChangeset for help on using the changeset viewer.