Source code for pyomo.opt.solver.ilmcmd

#  ___________________________________________________________________________
#
#  Pyomo: Python Optimization Modeling Objects
#  Copyright (c) 2008-2024
#  National Technology and Engineering Solutions of Sandia, LLC
#  Under the terms of Contract DE-NA0003525 with National Technology and
#  Engineering Solutions of Sandia, LLC, the U.S. Government retains certain
#  rights in this software.
#  This software is distributed under the 3-clause BSD License.
#  ___________________________________________________________________________

import re
import sys
import os
import subprocess

import pyomo.common
from pyomo.common.errors import ApplicationError

import pyomo.opt.solver.shellcmd
from pyomo.opt.solver.shellcmd import SystemCallSolver


[docs] class ILMLicensedSystemCallSolver(SystemCallSolver): """A command line solver that launches executables licensed with ILM"""
[docs] def __init__(self, **kwds): """Constructor""" pyomo.opt.solver.shellcmd.SystemCallSolver.__init__(self, **kwds)
[docs] def available(self, exception_flag=False): """True if the solver is available""" if self._assert_available: return True if not pyomo.opt.solver.shellcmd.SystemCallSolver.available( self, exception_flag ): return False executable = pyomo.common.Executable("ilmlist") if executable: try: cmd = [executable.path()] if sys.platform[0:3] == "win": # on windows, the ilm license manager by default # pauses after displaying the token status, so that # the window doesn't disappear and the user can # actually read it. however, if we don't suppress # this behavior, this command will stall until the # user hits Ctrl-C. cmd.append("-batch") result = subprocess.run( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, ) except OSError: msg = sys.exc_info()[1] raise ApplicationError( "Could not execute the command: ilmtest\n\tError message: " + msg ) sys.stdout.flush() for line in result.stdout.split("\n"): tokens = re.split('[\t ]+', line.strip()) if ( len(tokens) == 5 and tokens[0] == 'tokens' and tokens[1] == 'reserved:' and tokens[4] == os.environ.get('USER', None) ): if not (tokens[2] == 'none' or tokens[2] == '0'): return True return False elif ( len(tokens) == 3 and tokens[0] == 'available' and tokens[1] == 'tokens:' ): if tokens[2] == '0': return False break elif ( len(tokens) == 6 and tokens[1] == 'server' and tokens[5] == 'DOWN.' ): return False return True