コード例 #1
0
    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
コード例 #2
0
    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