Beispiel #1
0
def _get_effective_context(**kwargs):
    """ Build a effective context from a variable list of arguments that may specify changes to default.

    Args:
        context (optional):   Source context, if not default.
        params (optional):    Solving parameters (CpoParameters) that overwrite those in the solving context
        (others) (optional):  All other context parameters that can be changed.
    Returns:
        Updated (cloned) context
    """
    # If 'url' and 'key' are defined, force agent to be docloud
    if ('agent' not in kwargs) and not ENVIRONMENT_PRESENT:
        url = kwargs.get('url')
        key = kwargs.get('key')
        if url and key and is_string(url) and is_string(key) and url.startswith('http'):
            kwargs['agent'] = 'docloud'

    # Determine source context
    ctx = kwargs.get('context')
    if (ctx is None) or (ctx in DEFAULT_VALUES):
        ctx = context
    ctx = ctx.clone()
    # print("\n*** Source context");
    # ctx.print_context()

    # First set parameters if given
    prms = kwargs.get('params')
    if prms is not None:
        ctx.params.add(prms)

    # Process other changes
    rplist = []  # List of replacements to be done in solving parameters
    for k, v in kwargs.items():
        if (k != 'context') and (k != 'params') and (v not in DEFAULT_VALUES):
            rp = ctx.search_and_replace_attribute(k, v)
            # If not found, set in solving parameters
            if (rp is None):
                rplist.append((k, v))

     # Replace or set remaining fields in parameters
    if rplist:
        params = ctx.params
        chkparams = not ctx.solver.enable_undocumented_params
        if isinstance(params, CpoParameters):
            for k, v in rplist:
                if chkparams and not k in ALL_PARAMETER_NAMES:
                    raise CpoException("CPO solver does not accept a parameter named '{}'".format(k))
                setattr(params, k, v)

    # Return
    # print("\n*** Result context");
    # ctx.print_context()
    return ctx
Beispiel #2
0
    def _add_listener_from_class(self, lstnr):
        """ Add a solver listener from its class (instance is created).

        Args:
            lstnr:  Solver listener class, or string identifying the class
        """
        if is_string(lstnr):
            # Get listener class from string
            try:
                lclass = utils.get_module_element_from_path(lstnr)
            except Exception as e:
                raise CpoException("Unable to retrieve solver listener class '{}': {}".format(lstnr, e))
            if not inspect.isclass(lclass):
                raise CpoException("Solver listener '{}' is not a class.".format(lstnr))
            if not issubclass(lclass, CpoSolverListener):
                raise CpoException("Solver listener class '{}' should extend CpoSolverListener.".format(lstnr))
        else:
            # Listener is assumed to directly be a class
            lclass = lstnr
            if not inspect.isclass(lclass):
                raise CpoException("Solver listener '{}' is not a class.".format(lclass))
            if not issubclass(lclass, CpoSolverListener):
                raise CpoException("Solver listener class '{}' should extend CpoSolverListener.".format(lclass))
        # Add listener
        self.add_listener(lclass())
Beispiel #3
0
    def _get_solver_agent(self):
        """ Get the solver agent instance that is used to solve the model.

        Returns:
            Solver agent instance
        Raises:
            CpoException:  Agent creation error
        """
        # Determine selectable agent(s)
        sctx = self.context.solver

        alist = sctx.agent
        if alist is None:
            alist = 'docloud'
        elif not (is_string(alist) or is_array(alist)):
            raise CpoException("Agent identifier in config.context.solver.agent should be a string or a list of strings.")

        # Create agent
        if is_string(alist):
            aname = alist
            agent = self._create_solver_agent(alist)
        else:
            # Search first available agent in the list
            agent = None
            aname = None
            errors = []
            for aname in alist:
                try:
                    agent = self._create_solver_agent(aname)
                    break
                except Exception as e:
                    errors.append((aname, str(e)))
                # Agent not found
                errstr = ', '.join(a + ": " + str(e) for (a, e) in errors)
                raise CpoException("Agent creation error: " + errstr)

        # Log solver agent
        sctx.log(1, "Solve model '", self.model.get_name(), "' with agent '", aname, "'")
        agent.process_infos[CpoProcessInfos.SOLVER_AGENT] = aname
        return agent
Beispiel #4
0
    def __init__(self, name, input):
        """ Create a new tokenizer
        Args:
            input: Input stream or string
        """
        super(Tokenizer, self).__init__()
        self.name = name
        if is_string(input):
            self.input = StringIO(input)
        else:
            self.input = input
        self.line = self.input.readline()
        self.line_length = len(self.line)
        self.read_index = 0
        self.line_number = 1
        self.token_start = 0
        self.skip_comments = True

        # Initialize symbols table (allows use of 'is' instead of '==')
        self.symbols = {}

        # Initialize array of character processors
        self.char_handlers = [None] * 127
        for c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
            self.add_char_handler(c, self._read_symbol)
        for c in "0123456789":
            self.add_char_handler(c, self._read_number)
        self.add_char_handler('"', self._read_string)
        self.add_char_handler('>', self._read_greater)
        self.add_char_handler('<', self._read_lower)
        self.add_char_handler('=', self._read_equal)
        self.add_char_handler('!', self._read_bang)

        self.add_char_handler('+', lambda: TOKEN_PLUS)
        self.add_char_handler('-', lambda: TOKEN_MINUS)
        self.add_char_handler('*', lambda: TOKEN_STAR)
        self.add_char_handler('/', lambda: TOKEN_SLASH)
        self.add_char_handler('%', lambda: TOKEN_PERCENT)
        self.add_char_handler('^', lambda: TOKEN_CIRCUMFLEX)
        self.add_char_handler(',', lambda: TOKEN_COMMA)
        self.add_char_handler('.', lambda: TOKEN_DOT)
        self.add_char_handler(':', lambda: TOKEN_COLON)
        self.add_char_handler(';', lambda: TOKEN_SEMICOLON)
        self.add_char_handler('(', lambda: TOKEN_PARENT_OPEN)
        self.add_char_handler(')', lambda: TOKEN_PARENT_CLOSE)
        self.add_char_handler('[', lambda: TOKEN_HOOK_OPEN)
        self.add_char_handler(']', lambda: TOKEN_HOOK_CLOSE)
        self.add_char_handler('{', lambda: TOKEN_BRACE_OPEN)
        self.add_char_handler('}', lambda: TOKEN_BRACE_CLOSE)
        self.add_char_handler('|', lambda: TOKEN_PIPE)
        self.add_char_handler('#', lambda: TOKEN_HASH)
Beispiel #5
0
 def __init__(self, name, input):
     """ Create a new tokenizer 
     Args:
         input: Input stream or string
     """
     super(CpoTokenizer, self).__init__()
     self.name = name
     if is_string(input):
         self.input = None 
         self.line = input
     else:
         self.input = input 
         self.line = ""
     self.read_index = 0
     self.line_number = 1
     self.token = []
    def __init__(self, name=None, input=None, file=None, encoding='utf-8-sig'):
        """ Create a new tokenizer
        Args:
            name:     (Optional) Name of the stream
            input:    (Optional) Input stream or string
            file:     (Optional) Input file
            encoding: (Optional) Character encoding, utf-8 by default
        """
        super(Tokenizer, self).__init__()

        # Open file if any
        if file is not None:
            self.input = TextFileLineReader(file, encoding)
        # Or get input if any
        elif input is not None:
            if is_string(input):
                self.input = StringIO(input)
            else:
                self.input = input
        # Set name
        self.name = name
        if name is None:
            self.name = file

        # Initialize reading
        self.line = ""
        self.current_char = ''
        self.line_length = 0
        self.read_index = 0
        self.line_number = 0
        self.token_start = 0
        self.skip_comments = True
        self.default_char_handler = None

        # Initialize symbols table (allows use of 'is' instead of '==')
        self.symbols = {}

        # Initialize array of character processors
        self.char_handlers = [None] * 128
        for c in _SYMBOL_START_CHARS:
            self.add_char_handler(c, self._read_symbol)
        for c in "0123456789":
            self.add_char_handler(c, self._read_number)
        self.add_char_handler('"', self._read_string)
        self.add_char_handler('>', self._read_greater)
        self.add_char_handler('<', self._read_lower)
        self.add_char_handler('=', self._read_equal)
        self.add_char_handler('!', self._read_bang)

        self.add_char_handler('+', lambda: TOKEN_PLUS)
        self.add_char_handler('-', lambda: TOKEN_MINUS)
        self.add_char_handler('*', lambda: TOKEN_STAR)
        self.add_char_handler('/', lambda: TOKEN_SLASH)
        self.add_char_handler('%', lambda: TOKEN_PERCENT)
        self.add_char_handler('^', lambda: TOKEN_CIRCUMFLEX)
        self.add_char_handler(',', lambda: TOKEN_COMMA)
        self.add_char_handler('.', lambda: TOKEN_DOT)
        self.add_char_handler(':', lambda: TOKEN_COLON)
        self.add_char_handler(';', lambda: TOKEN_SEMICOLON)
        self.add_char_handler('(', lambda: TOKEN_PARENT_OPEN)
        self.add_char_handler(')', lambda: TOKEN_PARENT_CLOSE)
        self.add_char_handler('[', lambda: TOKEN_HOOK_OPEN)
        self.add_char_handler(']', lambda: TOKEN_HOOK_CLOSE)
        self.add_char_handler('{', lambda: TOKEN_BRACE_OPEN)
        self.add_char_handler('}', lambda: TOKEN_BRACE_CLOSE)
        self.add_char_handler('|', lambda: TOKEN_PIPE)
        self.add_char_handler('#', lambda: TOKEN_HASH)