Changeset 1982 for coopr.plugins


Ignore:
Timestamp:
Dec 12, 2009 1:37:41 AM (10 years ago)
Author:
jwatson
Message:

Added MIP solution read capability to GLPK plugin. Now able to read MIP solutions in via Pyomo and display attributes!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • coopr.plugins/trunk/coopr/plugins/mip/GLPK.py

    r1981 r1982  
    210210    def process_soln_file(self,results):
    211211
    212         lp_solution = True
     212        lp_solution = True # if false, we're dealing with a MIP!
    213213        if not os.path.exists(self.soln_file):
    214214           return
     
    239239             elif len(tokens) == 2 and tokens[0] == "Rows:":
    240240                results.problem.number_of_constraints = eval(tokens[1])
    241              elif len(tokens) >= 2 and tokens[0] == "Columns:":
     241             elif len(tokens) == 2 and tokens[0] == "Columns:":
     242                lp_solution = True
    242243                results.problem.number_of_variables = eval(tokens[1])
     244             elif len(tokens) > 2 and tokens[0] == "Columns:":
     245                lp_solution = False
     246                results.problem.number_of_variables = eval(tokens[1])               
    243247             elif len(tokens) == 2 and tokens[0] == "Non-zeros:":
    244248                results.problem.number_of_nonzeros = eval(tokens[1])
     
    300304                 
    301305                index_string = line[0:6].strip()
    302                 name_string = line[7:19].strip()               
    303                 state_string = line[20:22].strip()
     306                name_string = line[7:19].strip()
    304307                activity_string = line[23:36].strip()
    305308                lower_bound_string = line[37:50].strip()
    306309                upper_bound_string = line[51:64].strip()
    307                 marginal_string = line[65:78].strip()
     310
     311                state_string = None               
     312                marginal_string = None
    308313
    309314                # skip any headers
    310315                if (index_string == "------") or (index_string == "No."):
    311                    continue                               
     316                   continue
    312317
    313318                if len(index_string) > 0:
    314                    index = eval(index_string)
    315                 if (activity_string != "< eps") and (len(activity_string) > 0):
    316                    activity = eval(activity_string)
    317                 else:
    318                    activity = 0.0
    319                 if (lower_bound_string != "< eps") and (len(lower_bound_string) > 0):
    320                    lower_bound = eval(lower_bound_string)
    321                 else:
    322                    lower_bound = 0.0
    323                 if state_string != "NS":                   
    324                    if (upper_bound_string != "< eps") and (len(upper_bound_string) > 0):
    325                       upper_bound = eval(upper_bound_string)
    326                    else:
    327                       upper_bound = 0.0
    328                 if (marginal_string != "< eps") and (len(marginal_string) > 0):
    329                    marginal = eval(marginal_string)
    330                 else:
    331                    marginal = 0.0
    332 
     319                   index = eval(index_string)               
     320
     321                if lp_solution is True:
     322                   state_string = line[20:22].strip()
     323                   marginal_string = line[65:78].strip()
     324                   if (activity_string != "< eps") and (len(activity_string) > 0):
     325                      activity = eval(activity_string)
     326                   else:
     327                      activity = 0.0
     328                   if (lower_bound_string != "< eps") and (len(lower_bound_string) > 0):
     329                      lower_bound = eval(lower_bound_string)
     330                   else:
     331                      lower_bound = 0.0
     332                   if state_string != "NS":                   
     333                      if (upper_bound_string != "< eps") and (len(upper_bound_string) > 0):
     334                         upper_bound = eval(upper_bound_string)
     335                      else:
     336                         upper_bound = 0.0
     337                   if (marginal_string != "< eps") and (len(marginal_string) > 0):
     338                      marginal = eval(marginal_string)
     339                   else:
     340                      marginal = 0.0
     341
     342                else:
     343                    # no constraint-related attributes/values are extracted currently for MIPs.
     344                    pass
     345               
    333346                constraint_name = None
    334347                if len(active_constraint_name) > 0:
     
    346359                      raise ValueError,"***ERROR: Unexpected constraint index encountered on line="+line+"; expected value="+str(number_of_constraints_read)+"; actual value="+str(index)
    347360
    348                 # GLPK doesn't report slacks directly.
    349                 constraint_dual = activity
    350                 if state_string == "B":
    351                    constraint_dual = 0.0
    352                 elif (state_string == "NS") or (state_string == "NL") or (state_string == "NU"):
    353                    constraint_dual = marginal
    354                 else:
    355                    raise ValueError, "Unknown status="+tokens[0]+" encountered for constraint="+active_constraint_name+" in line="+line+" of solution file="+self.soln_file
    356 
    357                 soln.constraint[constraint_name].dual = constraint_dual
     361                if lp_solution is True:
     362                   # GLPK doesn't report slacks directly.
     363                   constraint_dual = activity
     364                   if state_string == "B":
     365                      constraint_dual = 0.0
     366                   elif (state_string == "NS") or (state_string == "NL") or (state_string == "NU"):
     367                      constraint_dual = marginal
     368                   else:
     369                      raise ValueError, "Unknown status="+tokens[0]+" encountered for constraint="+active_constraint_name+" in line="+line+" of solution file="+self.soln_file
     370
     371                   soln.constraint[constraint_name].dual = constraint_dual
     372                 
     373                else:
     374                   # there isn't anything interesting to do with constraints in the MIP case.
     375                   pass
    358376
    359377                # if all of the constraints have been read, exit.
     
    392410                index_string = line[0:6].strip()
    393411                name_string = line[7:19].strip()
    394                 state_string = line[20:22].strip()
    395412                activity_string = line[23:36].strip()
    396413                lower_bound_string = line[37:50].strip()
    397414                upper_bound_string = line[51:64].strip()
    398                 marginal_string = line[65:78].strip()
     415
     416                state_string = None
     417                marginal_string = None
    399418
    400419                # skip any headers
    401420                if (index_string == "------") or (index_string == "No."):
    402                    continue               
     421                   continue
    403422
    404423                if len(index_string) > 0:
    405424                   index = eval(index_string)
    406                 if (activity_string != "< eps") and (len(activity_string) > 0):
    407                    activity = eval(activity_string)
    408                 else:
    409                    activity = 0.0
    410                 if (lower_bound_string != "< eps") and (len(lower_bound_string) > 0):
    411                    lower_bound = eval(lower_bound_string)
    412                 else:
    413                    lower_bound = 0.0
    414                 if state_string != "NS":                   
    415                    if (upper_bound_string != "< eps") and (len(upper_bound_string) > 0):
    416                       upper_bound = eval(upper_bound_string)
    417                    else:
    418                       upper_bound = 0.0
    419                 if (marginal_string != "< eps") and (len(marginal_string) > 0):
    420                    marginal = eval(marginal_string)
    421                 else:
    422                    marginal = 0.0
     425
     426                if lp_solution is True:
     427                   state_string = line[20:22].strip()
     428                   marginal_string = line[65:78].strip()                               
     429
     430                   if (activity_string != "< eps") and (len(activity_string) > 0):
     431                      activity = eval(activity_string)
     432                   else:
     433                      activity = 0.0
     434                   if (lower_bound_string != "< eps") and (len(lower_bound_string) > 0):
     435                      lower_bound = eval(lower_bound_string)
     436                   else:
     437                      lower_bound = 0.0
     438                   if state_string != "NS":                   
     439                      if (upper_bound_string != "< eps") and (len(upper_bound_string) > 0):
     440                         upper_bound = eval(upper_bound_string)
     441                      else:
     442                         upper_bound = 0.0
     443                   if (marginal_string != "< eps") and (len(marginal_string) > 0):
     444                      marginal = eval(marginal_string)
     445                   else:
     446                      marginal = 0.0
     447
     448                else:
     449
     450                   if (activity_string != "< eps") and (len(activity_string) > 0):
     451                      activity = eval(activity_string)
     452                   else:
     453                      activity = 0.0                   
    423454
    424455                variable_name = None
     
    435466                   # sanity check - the indices should be in sequence.
    436467                   if index != number_of_variables_read:
    437                       raise ValueError,"***ERROR: Unexpected variable index encountered on line="+line+"; expected value="+str(number_of_variables_read)+"; actual value="+str(index)                                           
    438                    
    439                 # the "activity" column always specifies the variable value.
    440                 # embedding the if-then-else to validate the basis status.
    441                 # we are currently ignoring all bound-related information.
    442                 variable_value = None
    443                 if state_string == "B":
    444                    variable_value = activity
    445                 elif (state_string == "NL") or (state_string == "NS") or (state_string == "NU"):
    446                    variable_value = activity
    447                 else:
    448                    raise ValueError, "Unknown status="+state_string+" encountered for variable="+active_variable_name+" in line="+line+" of solution file="+self.soln_file
     468                      raise ValueError,"***ERROR: Unexpected variable index encountered on line="+line+"; expected value="+str(number_of_variables_read)+"; actual value="+str(index)
     469
     470                if lp_solution is True:
     471                   # the "activity" column always specifies the variable value.
     472                   # embedding the if-then-else to validate the basis status.
     473                   # we are currently ignoring all bound-related information.
     474                   variable_value = None
     475                   if state_string == "B":
     476                      variable_value = activity
     477                   elif (state_string == "NL") or (state_string == "NS") or (state_string == "NU"):
     478                      variable_value = activity
     479                   else:
     480                      raise ValueError, "Unknown status="+state_string+" encountered for variable="+active_variable_name+" in line="+line+" of solution file="+self.soln_file
    449481               
    450                 soln.variable[variable_name].value = variable_value
     482                   soln.variable[variable_name].value = variable_value
     483                else:
     484                   soln.variable[variable_name].value = activity
    451485               
    452486             # if all of the variables have been read, exit.
Note: See TracChangeset for help on using the changeset viewer.