def solve(self, sense=None): """Solve problem.""" if sense is not None: self.set_objective_sense(sense) parm = swiglpk.glp_smcp() swiglpk.glp_init_smcp(parm) if self._do_presolve: parm.presolve = swiglpk.GLP_ON self._do_presolve = False else: parm.presolve = swiglpk.GLP_OFF logger.debug('Solving using glp_simplex()') r = swiglpk.glp_simplex(self._p, parm) if r in (swiglpk.GLP_ENOPFS, swiglpk.GLP_ENODFS): self._result = Result(self, r) return self._result elif r != 0: raise GLPKError('glp_simplex: {}'.format(r)) if swiglpk.glp_get_num_int(self._p) == 0: self._result = Result(self) else: # The intopt MILP solver need an optimal solution to the LP # relaxation. Therefore, glp_simplex has to run before glp_intopt # for MILP problems. logger.debug('Solving using glp_intopt()') r = swiglpk.glp_intopt(self._p, None) if r != 0: raise GLPKError('glp_intopt: {}'.format(r)) self._result = MIPResult(self) return self._result
def solve(self, sense=None): """Solve problem.""" if sense is not None: self.set_objective_sense(sense) parm = swiglpk.glp_smcp() swiglpk.glp_init_smcp(parm) parm.presolve = swiglpk.GLP_ON logger.debug('Solving using glp_simplex()') r = swiglpk.glp_simplex(self._p, parm) if r in (swiglpk.GLP_ENOPFS, swiglpk.GLP_ENODFS): self._result = Result(self, r) return self._result elif r != 0: raise GLPKError('glp_simplex: {}'.format(r)) if swiglpk.glp_get_num_int(self._p) == 0: self._result = Result(self) else: # The intopt MILP solver need an optimal solution to the LP # relaxation. Therefore, glp_simplex has to run before glp_intopt # for MILP problems. logger.debug('Solving using glp_intopt()') r = swiglpk.glp_intopt(self._p, None) if r != 0: raise GLPKError('glp_intopt: {}'.format(r)) self._result = MIPResult(self) return self._result
def solve_unchecked(self, sense=None): """Solve problem and return result. The user must manually check the status of the result to determine whether an optimal solution was found. A :class:`SolverError` may still be raised if the underlying solver raises an exception. """ if sense is not None: self.set_objective_sense(sense) parm = swiglpk.glp_smcp() swiglpk.glp_init_smcp(parm) if self._do_presolve: parm.presolve = swiglpk.GLP_ON self._do_presolve = False else: parm.presolve = swiglpk.GLP_OFF parm.tol_bnd = self._feasibility_tolerance parm.tol_dj = self._optimality_tolerance logger.debug('Solving using glp_simplex()') r = swiglpk.glp_simplex(self._p, parm) if r in (swiglpk.GLP_ENOPFS, swiglpk.GLP_ENODFS): self._result = Result(self, r) return self._result elif r != 0: raise GLPKError('glp_simplex: {}'.format(r)) if swiglpk.glp_get_num_int(self._p) == 0: self._result = Result(self) else: # The intopt MILP solver needs an optimal solution to the LP # relaxation. Therefore, glp_simplex has to run before glp_intopt # for MILP problems. logger.debug('Solving using glp_intopt()') parm = swiglpk.glp_iocp() swiglpk.glp_init_iocp(parm) parm.tol_int = self._integrality_tolerance r = swiglpk.glp_intopt(self._p, parm) if r != 0: raise GLPKError('glp_intopt: {}'.format(r)) self._result = MIPResult(self) return self._result
def _optimize(self): status = self._run_glp_simplex() if status == interface.UNDEFINED and self.configuration.presolve is True: # If presolve is on, status will be undefined if not optimal self.configuration.presolve = False status = self._run_glp_simplex() self.configuration.presolve = True if (glp_get_num_int(self.problem) + glp_get_num_bin(self.problem)) > 0: status = self._run_glp_mip() if status == 'undefined' or status == 'infeasible': # Let's see if the presolver and some scaling can fix this issue glp_scale_prob(self.problem, GLP_SF_AUTO) original_presolve_setting = self.configuration.presolve self.configuration.presolve = True status = self._run_glp_mip() self.configuration.presolve = original_presolve_setting self._status = status return status
def _optimize(self): status = self._run_glp_simplex() # Sometimes GLPK gets itself stuck with an invalid basis. This will help it get rid of it. if status == interface.UNDEFINED and self.configuration.presolve is not True: glp_adv_basis(self.problem, 0) status = self._run_glp_simplex() if status == interface.UNDEFINED and self.configuration.presolve is True: # If presolve is on, status will be undefined if not optimal self.configuration.presolve = False status = self._run_glp_simplex() self.configuration.presolve = True if (glp_get_num_int(self.problem) + glp_get_num_bin(self.problem)) > 0: status = self._run_glp_mip() if status == 'undefined' or status == 'infeasible': # Let's see if the presolver and some scaling can fix this issue glp_scale_prob(self.problem, GLP_SF_AUTO) original_presolve_setting = self.configuration.presolve self.configuration.presolve = True status = self._run_glp_mip() self.configuration.presolve = original_presolve_setting return status
def _glpk_is_mip(self): return glp_get_num_int(self.problem) > 0
def value(self): if (glp_get_num_int(self.problem.problem) + glp_get_num_bin(self.problem.problem)) > 0: return glp_mip_obj_val(self.problem.problem) else: return glp_get_obj_val(self.problem.problem)