def __init__(self, solver, params, context): """ Create a new solver using shared library. Args: solver: Parent solver params: Solving parameters context: Solver agent context Raises: CpoLibException if library is not found """ # Call super super(CpoSolverLib, self).__init__(solver, params, context) # Initialize attributes self.first_error_line = None self.lib_handler = None # (to not block end() in case of init failure) self.last_conflict_cpo = None # Connect to library self.lib_handler = self._get_lib_handler() self.context.log(2, "Solving library: '{}'".format(self.context.lib)) # Create session # CAUTION: storing callback prototype is mandatory. Otherwise, it is garbaged and the callback fails. self.notify_event_proto = _EVENT_NOTIF_PROTOTYPE(self._notify_event) self.session = self.lib_handler.createSession(self.notify_event_proto) self.context.log(5, "Solve session: {}".format(self.session)) # Check solver version if any sver = self.version_info.get('SolverVersion') mver = solver.get_model_format_version() if sver and mver and compare_natural(mver, sver) > 0: raise CpoLibException( "Solver version {} is lower than model format version {}.". format(sver, mver)) # Send CPO model to solver cpostr = self._get_cpo_model_string() self._set_cpo_model(cpostr) self.context.log(3, "Model set into solver.") # Initialize CPO callback setting self.callback_proto = None
def __init__(self, solver, params, context): """ Create a new solver that solves locally with CP Optimizer Interactive. Args: solver: Parent solver params: Solving parameters context: Solver context Raises: CpoException if proxy executable does not exists """ # Call super self.process = None self.active = True super(CpoSolverLocal, self).__init__(solver, params, context) # Check if executable file exists if context.execfile is None: raise CpoException( "Executable file should be given in 'execfile' context attribute." ) if not is_string(context.execfile): raise CpoException( "Executable file should be given in 'execfile' as a string.") #if not os.path.isfile(context.execfile): # raise CpoException("Executable file '" + str(context.execfile) + "' does not exists") # Create solving process cmd = [context.execfile] if context.parameters is not None: cmd.extend(context.parameters) context.log(2, "Solver exec command: '", ' '.join(cmd), "'") try: self.process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, universal_newlines=False) except: raise CpoException( "Can not execute command '{}'. Please check availability of required executable file." .format(' '.join(cmd))) self.pout = self.process.stdin self.pin = self.process.stdout # Read initial version info from process self.version_info = None timer = threading.Timer( 1, lambda: self.process.kill() if self.version_info is None else None) timer.start() evt, data = self._read_message() timer.cancel() if evt != EVT_VERSION_INFO: raise LocalSolverException( "Unexpected event {} received instead of version info event {}." .format(evt, EVT_VERSION_INFO)) self.version_info = verinf = json.loads(data) self.available_command = self.version_info['AvailableCommands'] # Normalize information verinf['AgentModule'] = __name__ iver = verinf.get('AngelVersion') if iver: verinf['InterfaceVersion'] = iver context.log(3, "Local solver info: '", verinf, "'") # Check solver version if any sver = self.version_info.get('SolverVersion') mver = solver.get_model_format_version() if sver and mver and compare_natural(mver, sver) > 0: raise LocalSolverException( "Solver version {} is lower than model format version {}.". format(sver, mver)) # Send CPO model to process cpostr = self._get_cpo_model_string() self._write_message(CMD_SET_CPO_MODEL, cpostr) self._wait_json_result(EVT_SUCCESS) # JSON stored context.log(3, "Model sent.") # Initialize CPO callback setting self.callback_added = False