<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>docplex.cp.config — DOcplex.CP: Constraint Programming Modeling for Python V2.25 documentation</title> <link rel="stylesheet" href="../../../_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" /> <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script> <script type="text/javascript" src="../../../_static/jquery.js"></script> <script type="text/javascript" src="../../../_static/underscore.js"></script> <script type="text/javascript" src="../../../_static/doctools.js"></script> <script type="text/javascript" src="../../../_static/language_data.js"></script> <script type="text/javascript" src="../../../_static/bizstyle.js"></script> <link rel="index" title="Index" href="../../../genindex.html" /> <link rel="search" title="Search" href="../../../search.html" /> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <!--[if lt IE 9]> <script type="text/javascript" src="_static/css3-mediaqueries.js"></script> <![endif]--> </head><body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../../../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="nav-item nav-item-0"><a href="../../../index.html">DOcplex.CP: Constraint Programming Modeling for Python V2.25 documentation</a> »</li> <li class="nav-item nav-item-1"><a href="../../index.html" accesskey="U">Module code</a> »</li> </ul> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <div class="searchformwrapper"> <form class="search" action="../../../search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <h1>Source code for docplex.cp.config</h1><div class="highlight"><pre> <span></span><span class="c1"># --------------------------------------------------------------------------</span> <span class="c1"># Source file provided under Apache License, Version 2.0, January 2004,</span> <span class="c1"># http://www.apache.org/licenses/</span> <span class="c1"># (c) Copyright IBM Corp. 2015 - 2022</span> <span class="c1"># --------------------------------------------------------------------------</span> <span class="sd">"""</span> <span class="sd">Configuration of the CP Optimizer Python API</span> <span class="sd">This module is the top-level handler of the configuration parameters for</span> <span class="sd">the CP Optimizer Python API. It contains the default values of the different</span> <span class="sd">configuration parameters.</span> <span class="sd">It should NOT be changed directly.</span> <span class="sd">The preferable way is to add at least one of the following files that contain the changes</span> <span class="sd">to be performed:</span> <span class="sd"> * *cpo_config.py*, a local set of changes on these parameters,</span> <span class="sd"> * *cpo_config_<hostname>.py*, a hostname dependent set of changes.</span> <span class="sd">Each of these files is searched first in the directory where the Pyton main file is located,</span> <span class="sd">then in the current directory, and finally in the *PYTHONPATH*. The first one that is found is read.</span> <span class="sd">Final set of parameters is obtained by reading first this module, and then those listed above.</span> <span class="sd">If called as main, this module prints the actual configuration on standard output, including</span> <span class="sd">all customizations made using the mechanism described above.</span> <span class="sd">Following sections describe the most important parameters that can be easily modified to customize</span> <span class="sd">the behavior of the Python API.</span> <span class="sd">All available parameters are available by consulting the source code of this module.</span> <span class="sd">General parameters</span> <span class="sd">------------------</span> <span class="sd">*context.log_output = sys.stdout*</span> <span class="sd"> This parameter contains the default log stream.</span> <span class="sd"> By default it is set to the standard output.</span> <span class="sd"> A value of *None* can be used to disable all logs.</span> <span class="sd">*context.verbose = 0*</span> <span class="sd"> This parameter controls the verbosity level of the log, between 0 and 9, if *log_output* is not None.</span> <span class="sd"> The default value of 0 means no log.</span> <span class="sd">*context.model.add_source_location = True*</span> <span class="sd"> This parameter indicates that when the model is transformed into CPO format, additional information is added</span> <span class="sd"> to correlate expressions with the Python file and line where it has been generated.</span> <span class="sd"> If any error is raised by the solver during the solve, this information is provided in the</span> <span class="sd"> error description, which allows for easier debugging.</span> <span class="sd">*context.model.length_for_alias = None*</span> <span class="sd"> This parameter allows to associate a shorter alias to variables whose name is longer than the given length.</span> <span class="sd"> In the CPO representation of the model, variable is declared with its original name and an alias is created</span> <span class="sd"> to use it with a shorter name in model expressions, allowing to reduce the size of the generated CPO format.</span> <span class="sd"> In the returned solution, variable can be still retrieved with their original names.</span> <span class="sd"> By default, the value is None, which indicates to always keep original variable names.</span> <span class="sd">*context.model.name_all_constraints = False*</span> <span class="sd"> This parameter enables the naming of all constraints when the model is generated in CPO format.</span> <span class="sd"> It is mandatory only if the *refine conflict* function is called.</span> <span class="sd"> Anyway, if the *refine conflict* function is called, and if the CPO format of the model has already been generated,</span> <span class="sd"> it is generated again with this option set in order to allow proper completion of the request.</span> <span class="sd"> Setting it to *True* is preferable only if *refine conflict* function is called on a big model.</span> <span class="sd">*context.model.factorize_expressions = True*</span> <span class="sd"> This parameter indicates to factorize common expressions when generating the model in CPO file format.</span> <span class="sd">*context.model.dump_directory = None*</span> <span class="sd"> This parameter gives the name of a directory where the CPO files that are generated for solving models are stored</span> <span class="sd"> for logging purpose.</span> <span class="sd"> If not None, the directory is created and generated models are stored in files named `<model_name>.cpo`.</span> <span class="sd">*context.model.sort_names = None*</span> <span class="sd"> This parameter precise how the variables are sorted when declared in the CPO file.</span> <span class="sd"> The value can be None for no sort, 'alphabetical' to sort in alphabetical order, or 'natural' to sort in natural order</span> <span class="sd"> (meaning for example that X11 will be declared after X2, which is not the case in alphabetical order).</span> <span class="sd">*context.model.cache.size = 10000*</span> <span class="sd"> This parameter gives the maximum capacity of the internal cache used to speed-up conversion of Python expressions</span> <span class="sd"> into CPO expressions.</span> <span class="sd">*context.model.cache.active = True*</span> <span class="sd"> This parameter allows to enable or disable the expression cache mechanism.</span> <span class="sd"> Value os a boolean (True or False). Default value is True.</span> <span class="sd">*context.params.xxx*</span> <span class="sd"> The parameter `context.params` is an instance of the class</span> <span class="sd"> :class:`~docplex.cp.parameters.CpoParameters` (in :doc:`parameters.py</docplex.cp.parameters.py>`)</span> <span class="sd"> which describes all of the public solver parameters as properties.</span> <span class="sd">Configuration of the model solving</span> <span class="sd">----------------------------------</span> <span class="sd">*context.solver.trace_log = False*</span> <span class="sd"> This parameter indicates to trace the log generated by the solver when solving the CPO model.</span> <span class="sd"> The log is printed on the `context.log_output` stream, if given.</span> <span class="sd"> The default value of this parameter is True for a local solve, but is set to False if remote solve or if the</span> <span class="sd"> Python interpreter is considered as running in a notebook (if module `ipykernel` is detected in system modules).</span> <span class="sd">*context.solver.trace_cpo = False*</span> <span class="sd"> This parameter indicates to trace the CPO model that is generated before submitting it for solving.</span> <span class="sd"> The model is printed on the `context.log_output stream`, if given.</span> <span class="sd">*context.solver.enable_undocumented_params = False*</span> <span class="sd"> This parameter allows to enable the possibility to set solving parameters that are not in the public parameters</span> <span class="sd"> detailed in the class</span> <span class="sd"> :class:`~docplex.cp.parameters.CpoParameters` (in :doc:`parameters.py</docplex.cp.parameters.py>`).</span> <span class="sd">*context.solver.add_log_to_solution = True*</span> <span class="sd"> This parameter indicates to add the solver log content to the solution object.</span> <span class="sd"> By default, this parameter is True but it can be set to False if the log is very big or of no interest.</span> <span class="sd">*context.solver.add_conflict_as_cpo = True*</span> <span class="sd"> This parameter indicates to include the conflict in CPO format in the conflict refiner result</span> <span class="sd"> By default, this parameter is True.</span> <span class="sd">*context.solver.agent = 'local'*</span> <span class="sd"> This parameter specifies the name of the solver agent that is used to solve the model.</span> <span class="sd"> The value of this parameter is the name of a child context of `context.solver`, which contains necessary attributes</span> <span class="sd"> that allow to create and run the required agent.</span> <span class="sd">*context.solver.log_prefix = "[Solver] "*</span> <span class="sd"> Prefix that is added to every message that is logged by the solver component.</span> <span class="sd">Configuration of the `local` solving agent</span> <span class="sd">------------------------------------------</span> <span class="sd">*context.solver.local.execfile*</span> <span class="sd"> Name or full path of the CP Optimizer Interactive executable file.</span> <span class="sd"> By default, it is set to *"cpoptimizer(.exe)"*, and is searched in the file system using the strategy described below.</span> <span class="sd">Configuration of the `lib` solving agent</span> <span class="sd">----------------------------------------</span> <span class="sd">*context.solver.lib.libfile*</span> <span class="sd"> Name or full path of the CP Optimizer library file.</span> <span class="sd"> By default, it is set to *"lib_cpo_solver_\*(.dll)"*, and is searched in the file system using the strategy described below.</span> <span class="sd">Search for executable or library files</span> <span class="sd">--------------------------------------</span> <span class="sd">If an executable or library file is not given with its full path, it is searched in the file system in a list of</span> <span class="sd">directories that is built in this order:</span> <span class="sd"> * the directory where the main Python file is located,</span> <span class="sd"> * the current directory,</span> <span class="sd"> * all directories of the environment variables 'LD_LIBRARY_PATH' or 'DYLD_LIBRARY_PATH' if defined,</span> <span class="sd"> * all directories of the environment variable 'PATH'.</span> <span class="sd">If the file name contains an "\*", and if there are multiple files matching the pattern, the most recent is selected.</span> <span class="sd">Configuration for best performances</span> <span class="sd">-----------------------------------</span> <span class="sd">To configure the CP Python API for best performances, the following configuration settings may be used.</span> <span class="sd">Obviously, this performance is won at the cost of the loss of some features that may be useful in other cases.</span> <span class="sd">::</span> <span class="sd"> context.verbose = 0</span> <span class="sd"> context.model.add_source_location = False</span> <span class="sd"> context.model.length_for_alias = 10</span> <span class="sd"> context.model.name_all_constraints = False</span> <span class="sd"> context.model.dump_directory = None</span> <span class="sd"> context.model.sort_names = None</span> <span class="sd"> context.solver.trace_cpo = False</span> <span class="sd"> context.solver.trace_log = False</span> <span class="sd"> context.solver.add_log_to_solution = False</span> <span class="sd">Detailed description</span> <span class="sd">--------------------</span> <span class="sd">"""</span> <span class="kn">from</span> <span class="nn">docplex.cp.utils</span> <span class="kn">import</span> <span class="o">*</span> <span class="kn">from</span> <span class="nn">docplex.cp.parameters</span> <span class="kn">import</span> <span class="n">CpoParameters</span><span class="p">,</span> <span class="n">ALL_PARAMETER_NAMES</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="nn">socket</span> <span class="kn">import</span> <span class="nn">os</span> <span class="kn">import</span> <span class="nn">traceback</span> <span class="kn">import</span> <span class="nn">platform</span> <span class="kn">import</span> <span class="nn">fnmatch</span> <span class="c1"># Check if running in a worker environment</span> <span class="k">try</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">docplex_wml.version</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1">#from docplex_wml.worker.environment import WorkerEnvironment</span> <span class="c1">#import docplex.util.environment as runenv</span> <span class="kn">from</span> <span class="nn">docplex_wml</span> <span class="kn">import</span> <span class="n">_in_ws_nb</span> <span class="k">if</span> <span class="n">_in_ws_nb</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span> <span class="n">IS_IN_WORKER</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">else</span><span class="p">:</span> <span class="n">IS_IN_WORKER</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">except</span><span class="p">:</span> <span class="n">IS_IN_WORKER</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># CP Optimizer Interactive executable name</span> <span class="n">CPO_EXEC_INTERACTIVE</span> <span class="o">=</span> <span class="s2">"cpoptimizer"</span> <span class="o">+</span> <span class="p">(</span><span class="s2">".exe"</span> <span class="k">if</span> <span class="n">IS_WINDOWS</span> <span class="k">else</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># CP Optimizer Interactive executable name</span> <span class="n">CPO_LIBRARY</span> <span class="o">=</span> <span class="s2">"lib_cpo_solver_*"</span> <span class="o">+</span> <span class="p">(</span><span class="s2">".dll"</span> <span class="k">if</span> <span class="n">IS_WINDOWS</span> <span class="k">else</span> <span class="s2">".so"</span><span class="p">)</span> <span class="c1"># Environment variable for context changes</span> <span class="n">CONTEXT_ENVIRONMENT</span> <span class="o">=</span> <span class="s2">"DOCPLEX_CP_CONTEXT"</span> <span class="c1">#=============================================================================</span> <span class="c1"># Definition of the default context</span> <span class="c1">#=============================================================================</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Global context</span> <span class="c1"># Create default context infrastructure</span> <span class="n">context</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Default log output</span> <span class="n">context</span><span class="o">.</span><span class="n">log_output</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="c1"># Default log verbosity</span> <span class="n">context</span><span class="o">.</span><span class="n">verbose</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Visu enable indicator (internal, can be disabled for testing purpose)</span> <span class="n">context</span><span class="o">.</span><span class="n">visu_enabled</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Indicator to log catched exceptions</span> <span class="n">context</span><span class="o">.</span><span class="n">log_exceptions</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># CPLEX Optimization Studio context</span> <span class="n">context</span><span class="o">.</span><span class="n">cos</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Location of CPLEX Optimization Studio, used to search for executables if needed.</span> <span class="c1"># Default value is None, meaning that configuration searches for the most recent</span> <span class="c1"># CPLEX_STUDIO_DIRxxx environment variable</span> <span class="n">context</span><span class="o">.</span><span class="n">cos</span><span class="o">.</span><span class="n">location</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Modeling context</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Indicate to add source location in model</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">add_source_location</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Minimal variable name length that trigger use of shorter alias. None for no alias.</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">length_for_alias</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Automatically add a name to every top-level constraint</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">name_all_constraints</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Model format generation version that is used by default if no format version is given in the model.</span> <span class="c1"># If None, latest format is used without specifying it explicitly.</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Name of the directory where store copy of the generated CPO files. None for no dump.</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">dump_directory</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Flag to indicate to the compiler to factorize expressions used more than ones</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">factorize_expressions</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Flag to generate short model output (internal)</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">short_output</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Type of sort for model variables. Value is in {None, 'alphabetical', 'natural')</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">sort_names</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Expression cache, global to all models</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">cache</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">cache</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">10000</span> <span class="n">context</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">cache</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Parsing context</span> <span class="n">context</span><span class="o">.</span><span class="n">parser</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Enable CPO parser to automatically generate blackboxes for unknown functions</span> <span class="n">context</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">auto_blackbox</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Indicate to print warning messages (for example for unknown blackbox functions) at the end of parsing</span> <span class="n">context</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">print_warnings</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Indicate to check format version and raise an exception if out of range</span> <span class="n">context</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">check_format_version</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Indicate to FZN parser to reduce model when possible</span> <span class="n">context</span><span class="o">.</span><span class="n">parser</span><span class="o">.</span><span class="n">fzn_reduce</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Solving parameters</span> <span class="n">context</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="n">CpoParameters</span><span class="p">()</span> <span class="c1"># Default time limit in seconds (None for no limit)</span> <span class="n">context</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">TimeLimit</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Workers count (None for number of cores)</span> <span class="n">context</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">Workers</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Solving context</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Indicate to trace CPO model before solving</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">trace_cpo</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Indicate to trace solver log on log_output.</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">trace_log</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">is_in_notebook</span><span class="p">():</span> <span class="c1"># In notebooks, no traces by default because it may crash the environment</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">trace_log</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Enable undocumented parameters</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">enable_undocumented_params</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Max number of threads allowed for model solving</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">max_threads</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Indicate to add solver log to the solution</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">add_log_to_solution</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Indicate to add the conflict in CPO format to conflict refiner result</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">add_conflict_as_cpo</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Indicate to replace simple solve by a search_next loop</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">solve_with_search_next</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Log prefix</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">log_prefix</span> <span class="o">=</span> <span class="s2">"[Solver] "</span> <span class="c1"># Name of the agent to be used for solving. Value is name of one of this context child context.</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">agent</span> <span class="o">=</span> <span class="s1">'local'</span> <span class="c1"># Auto-publish parameters</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Indicate to auto-publish solve details in environment</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span><span class="o">.</span><span class="n">solve_details</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Indicate to auto-publish results in environment</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span><span class="o">.</span><span class="n">result_output</span> <span class="o">=</span> <span class="s2">"solution.json"</span> <span class="c1"># Indicate to auto-publish kpis in environment</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span><span class="o">.</span><span class="n">kpis_output</span> <span class="o">=</span> <span class="s2">"kpis.csv"</span> <span class="c1"># For KPIs output, name of the kpi name column</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span><span class="o">.</span><span class="n">kpis_output_field_name</span> <span class="o">=</span> <span class="s2">"Name"</span> <span class="c1"># For KPIs output, name of the kpi value column</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span><span class="o">.</span><span class="n">kpis_output_field_value</span> <span class="o">=</span> <span class="s2">"Value"</span> <span class="c1"># Indicate to auto-publish conflicts in environment</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span><span class="o">.</span><span class="n">conflicts_output</span> <span class="o">=</span> <span class="s2">"conflicts.csv"</span> <span class="c1"># Indicate to enable auto-publish also with local environment</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">auto_publish</span><span class="o">.</span><span class="n">local_publish</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Default solver listeners</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">listeners</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"docplex.cp.solver.environment_client.EnvSolverListener"</span><span class="p">]</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Local solving using CP Interactive executable</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Python class implementing the agent</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">class_name</span> <span class="o">=</span> <span class="s2">"docplex.cp.solver.solver_local.CpoSolverLocal"</span> <span class="c1"># Name or path of the CP Optimizer Interactive program</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">execfile</span> <span class="o">=</span> <span class="n">CPO_EXEC_INTERACTIVE</span> <span class="c1"># Parameters of the exec file (mandatory, do not change)</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">parameters</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'-angel'</span><span class="p">]</span> <span class="c1"># Agent log prefix</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">log_prefix</span> <span class="o">=</span> <span class="s2">"[Local] "</span> <span class="c1"># Local sub-process start timeout in seconds</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">process_start_timeout</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Local solving with CPO library (internal)</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">lib</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Python class implementing the agent</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="n">class_name</span> <span class="o">=</span> <span class="s2">"docplex.cp.solver.solver_lib.CpoSolverLib"</span> <span class="c1"># Name or path of the CPO library</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="n">libfile</span> <span class="o">=</span> <span class="n">CPO_LIBRARY</span> <span class="c1"># Agent log prefix</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="n">log_prefix</span> <span class="o">=</span> <span class="s2">"[PyLib] "</span> <span class="c1"># Check if library has been installed with workers specific package</span> <span class="k">try</span><span class="p">:</span> <span class="kn">from</span> <span class="nn">docplex_cpo_solver</span> <span class="kn">import</span> <span class="n">get_library_path</span> <span class="n">lfile</span> <span class="o">=</span> <span class="n">get_library_path</span><span class="p">()</span> <span class="k">if</span> <span class="n">lfile</span><span class="p">:</span> <span class="c1"># Force solver to use lib by default</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="n">libfile</span> <span class="o">=</span> <span class="n">lfile</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">agent</span> <span class="o">=</span> <span class="s1">'lib'</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Solver simulators</span> <span class="c1"># Solver simulator that always fails</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">simulatorfail</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">simulatorfail</span><span class="o">.</span><span class="n">class_name</span> <span class="o">=</span> <span class="s2">"docplex.cp.solver.solver_simulator.CpoSolverSimulatorFail"</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">simulatorfail</span><span class="o">.</span><span class="n">log_prefix</span> <span class="o">=</span> <span class="s2">"[SimulatorFail] "</span> <span class="c1"># Solver simulator generating a random solution</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">simulatorrandom</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">class_name</span> <span class="o">=</span> <span class="s2">"docplex.cp.solver.solver_simulator.CpoSolverSimulatorRandom"</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">log_prefix</span> <span class="o">=</span> <span class="s2">"[SimulatorRandom] "</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Parameters for solver interactive monitor</span> <span class="n">context</span><span class="o">.</span><span class="n">interactive</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="c1"># Confirm solver monitor window closing</span> <span class="n">context</span><span class="o">.</span><span class="n">interactive</span><span class="o">.</span><span class="n">user_preferences_file</span> <span class="o">=</span> <span class="s2">"DocplexCpUserPreferences.prf"</span> <span class="c1"># Confirm solver monitor window closing</span> <span class="n">context</span><span class="o">.</span><span class="n">interactive</span><span class="o">.</span><span class="n">window_confirm_exit</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Abort solve when closing window</span> <span class="n">context</span><span class="o">.</span><span class="n">interactive</span><span class="o">.</span><span class="n">solver_abort_on_exit</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Daemon display thread (avoid tk exception if listener)</span> <span class="n">context</span><span class="o">.</span><span class="n">interactive</span><span class="o">.</span><span class="n">daemon_thread</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Apply special changes if running in a worker</span> <span class="k">if</span> <span class="n">IS_IN_WORKER</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">max_threads</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"CORE_NUMBERS"</span><span class="p">])</span> <span class="k">except</span><span class="p">:</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">max_threads</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1">#context.solver.max_threads = runenv.get_environment().get_available_core_count()</span> <span class="c1">#-----------------------------------------------------------------------------</span> <span class="c1"># Create context variable</span> <span class="c1"># Create a local context variable</span> <span class="c1"># Now useless, comes from a time where there was LOCAL_CONTEXT and DOCLOUD_CONTEXT.</span> <span class="c1"># Kept for ascending compatibility</span> <span class="n">LOCAL_CONTEXT</span> <span class="o">=</span> <span class="n">context</span> <span class="c1">#=============================================================================</span> <span class="c1"># Public functions</span> <span class="c1">#=============================================================================</span> <div class="viewcode-block" id="get_default"><a class="viewcode-back" href="../../../docplex.cp.config.py.html#docplex.cp.config.get_default">[docs]</a><span class="k">def</span> <span class="nf">get_default</span><span class="p">():</span> <span class="sd">""" Get the default context</span> <span class="sd"> Default context is also accessible with the global variable 'context' in this module.</span> <span class="sd"> Returns:</span> <span class="sd"> Current default context</span> <span class="sd"> """</span> <span class="k">return</span> <span class="n">context</span></div> <div class="viewcode-block" id="set_default"><a class="viewcode-back" href="../../../docplex.cp.config.py.html#docplex.cp.config.set_default">[docs]</a><span class="k">def</span> <span class="nf">set_default</span><span class="p">(</span><span class="n">ctx</span><span class="p">):</span> <span class="sd">""" Set the default context.</span> <span class="sd"> Default context becomes accessible in the global variable 'context' in this module.</span> <span class="sd"> Args:</span> <span class="sd"> ctx: New default context</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">ctx</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">Context</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">Context</span><span class="p">),</span> <span class="s2">"Context object must be of class Context"</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="vm">__name__</span><span class="p">]</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="n">ctx</span></div> <span class="c1">#=============================================================================</span> <span class="c1"># Private functions</span> <span class="c1">#=============================================================================</span> <span class="k">def</span> <span class="nf">_get_port_name</span><span class="p">():</span> <span class="sd">""" Get the COS port name for the calling environment</span> <span class="sd"> Returns:</span> <span class="sd"> COS port name, None if not found</span> <span class="sd"> """</span> <span class="n">sstm</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="k">if</span> <span class="n">sstm</span> <span class="o">==</span> <span class="s1">'Windows'</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'x64_win64'</span> <span class="k">if</span> <span class="n">sstm</span> <span class="o">==</span> <span class="s1">'Darwin'</span><span class="p">:</span> <span class="k">return</span> <span class="s1">'x86-64_osx'</span> <span class="k">if</span> <span class="n">sstm</span> <span class="o">==</span> <span class="s1">'Linux'</span><span class="p">:</span> <span class="n">machine</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">machine</span><span class="p">()</span> <span class="k">if</span> <span class="n">machine</span> <span class="o">==</span> <span class="s1">'x86_64'</span><span class="p">:</span> <span class="n">machine</span> <span class="o">=</span> <span class="s1">'x86-64'</span> <span class="k">return</span> <span class="n">machine</span> <span class="o">+</span> <span class="s1">'_linux'</span> <span class="k">return</span> <span class="kc">None</span> <span class="c1"># List of system properties identifying candidate COS root directories</span> <span class="n">_COS_ROOT_DIRS_ENV_VARS</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"CPLEX_STUDIO_DIR201"</span><span class="p">,</span> <span class="s2">"CPLEX_STUDIO_DIR1210"</span><span class="p">,</span> <span class="s2">"CPLEX_STUDIO_DIR129"</span><span class="p">,</span> <span class="s2">"CPLEX_STUDIO_DIR128"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_build_search_path</span> <span class="p">(</span><span class="n">ctx</span><span class="p">):</span> <span class="sd">""" Build the path where search for executables</span> <span class="sd"> Args:</span> <span class="sd"> ctx: Context to get information from</span> <span class="sd"> """</span> <span class="c1"># Initialize search path</span> <span class="n">path</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># Set it to COS location if provided</span> <span class="n">cosloc</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">get_by_path</span><span class="p">(</span><span class="s1">'cos.location'</span><span class="p">)</span> <span class="k">if</span> <span class="n">cosloc</span><span class="p">:</span> <span class="c1"># Check existence of the directory</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">cosloc</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"COS location directory '</span><span class="si">{}</span><span class="s2">' does not exists."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">cosloc</span><span class="p">))</span> <span class="c1"># As explicitly defined, add it in front of search path</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cosloc</span> <span class="o">+</span> <span class="s2">"/bin/"</span> <span class="o">+</span> <span class="n">_get_port_name</span><span class="p">())</span> <span class="c1"># Add directory where python main is located</span> <span class="n">mpfile</span> <span class="o">=</span> <span class="n">get_main_file</span><span class="p">()</span> <span class="k">if</span> <span class="n">mpfile</span><span class="p">:</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">mpfile</span><span class="p">))</span> <span class="c1"># Add current directory</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span> <span class="c1"># Add all system path</span> <span class="n">path</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">get_system_path</span><span class="p">())</span> <span class="c1"># Append docplex install directory</span> <span class="n">python_home</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">))</span> <span class="k">if</span> <span class="n">IS_WINDOWS</span><span class="p">:</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">python_home</span><span class="p">,</span> <span class="s2">"Scripts"</span><span class="p">))</span> <span class="n">appdata</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'APPDATA'</span><span class="p">)</span> <span class="k">if</span> <span class="n">appdata</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">appdata</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">'Python'</span><span class="p">,</span> <span class="s1">'Scripts'</span><span class="p">)))</span> <span class="k">else</span><span class="p">:</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"~/.local/bin"</span><span class="p">)</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">python_home</span><span class="p">,</span> <span class="s2">"bin"</span><span class="p">))</span> <span class="c1"># Add all COS locations if not already forced</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">cosloc</span><span class="p">:</span> <span class="c1"># Add all existing installed COS starting from the most recent</span> <span class="k">for</span> <span class="n">cnv</span> <span class="ow">in</span> <span class="n">_COS_ROOT_DIRS_ENV_VARS</span><span class="p">:</span> <span class="n">cdir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="n">cnv</span><span class="p">)</span> <span class="k">if</span> <span class="n">cdir</span><span class="p">:</span> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cdir</span> <span class="o">+</span> <span class="s2">"/cpoptimizer/bin/"</span> <span class="o">+</span> <span class="n">_get_port_name</span><span class="p">())</span> <span class="k">return</span> <span class="n">path</span> <span class="k">def</span> <span class="nf">_search_exec_file</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span> <span class="sd">""" Search the first occurrence of an executable.</span> <span class="sd"> Args:</span> <span class="sd"> file: Executable file name</span> <span class="sd"> ctx: Context to get information from</span> <span class="sd"> Returns:</span> <span class="sd"> Full path of the first executable file found, given file if not found</span> <span class="sd"> """</span> <span class="c1"># Check null</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">file</span><span class="p">:</span> <span class="k">return</span> <span class="kc">None</span> <span class="c1"># Check if given file is directly executable</span> <span class="k">if</span> <span class="n">is_exe_file</span><span class="p">(</span><span class="n">file</span><span class="p">):</span> <span class="k">return</span> <span class="n">file</span> <span class="c1"># Check if file contains a path</span> <span class="n">fname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> <span class="k">if</span> <span class="n">fname</span> <span class="o">==</span> <span class="n">file</span><span class="p">:</span> <span class="c1"># Build full search path</span> <span class="n">path</span> <span class="o">=</span> <span class="n">_build_search_path</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Keep file path as single path</span> <span class="n">path</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">file</span><span class="p">)]</span> <span class="c1"># Check if file contains a pattern</span> <span class="k">if</span> <span class="s2">"*"</span> <span class="ow">in</span> <span class="n">fname</span><span class="p">:</span> <span class="c1"># Check in the path</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">path</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">d</span><span class="p">):</span> <span class="k">continue</span> <span class="n">lf</span> <span class="o">=</span> <span class="p">[</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="k">if</span> <span class="n">fnmatch</span><span class="o">.</span><span class="n">fnmatch</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">fname</span><span class="p">)]</span> <span class="k">if</span> <span class="n">lf</span><span class="p">:</span> <span class="c1"># Take most recent executable file</span> <span class="n">lf</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">lf</span> <span class="k">if</span> <span class="n">is_exe_file</span><span class="p">(</span><span class="n">f</span><span class="p">)]</span> <span class="k">if</span> <span class="n">lf</span><span class="p">:</span> <span class="c1"># Skip "ai" files if any</span> <span class="n">nlf</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">lf</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">f</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">"ai"</span><span class="p">)]</span> <span class="k">if</span> <span class="n">nlf</span><span class="p">:</span> <span class="n">lf</span> <span class="o">=</span> <span class="n">nlf</span> <span class="n">lf</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getmtime</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> <span class="k">return</span> <span class="n">lf</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Check directly</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">path</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">d</span><span class="p">):</span> <span class="k">continue</span> <span class="n">nf</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">fname</span><span class="p">)</span> <span class="k">if</span> <span class="n">is_exe_file</span><span class="p">(</span><span class="n">nf</span><span class="p">):</span> <span class="k">return</span> <span class="n">nf</span> <span class="k">return</span> <span class="n">file</span> <span class="c1"># Attribute values denoting a default value</span> <span class="n">DEFAULT_VALUES</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"ENTER YOUR KEY HERE"</span><span class="p">,</span> <span class="s2">"ENTER YOUR URL HERE"</span><span class="p">,</span> <span class="s2">"default"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_is_defined</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">):</span> <span class="k">return</span> <span class="p">(</span><span class="n">arg</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">)</span> <span class="ow">and</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="ow">and</span> <span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">DEFAULT_VALUES</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_change_context_attribute</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="n">rp</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">search_and_replace_attribute</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="c1"># If not found, set in solving parameters</span> <span class="k">if</span> <span class="n">rp</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">params</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">params</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">CpoParameters</span><span class="p">):</span> <span class="k">raise</span> <span class="n">CpoException</span><span class="p">(</span><span class="s2">"Invalid configuration attribute '</span><span class="si">{}</span><span class="s2">' (no 'params' section where put it)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="p">))</span> <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">ALL_PARAMETER_NAMES</span> <span class="ow">or</span> <span class="n">ctx</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">enable_undocumented_params</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="n">CpoException</span><span class="p">(</span><span class="s2">"CPO solver does not accept a parameter named '</span><span class="si">{}</span><span class="s2">'"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">key</span><span class="p">))</span> <span class="k">def</span> <span class="nf">_get_effective_context</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="sd">""" Build a effective context from a variable list of arguments that may specify changes to default.</span> <span class="sd"> Args:</span> <span class="sd"> context (optional): Source context, if not default.</span> <span class="sd"> params (optional): Solving parameters (CpoParameters) that overwrite those in the solving context</span> <span class="sd"> (others) (optional): All other context parameters that can be changed.</span> <span class="sd"> Returns:</span> <span class="sd"> Updated (cloned) context</span> <span class="sd"> """</span> <span class="c1"># Determine source context</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'context'</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="n">ctx</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">ctx</span> <span class="ow">in</span> <span class="n">DEFAULT_VALUES</span><span class="p">):</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">context</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span> <span class="c1"># print("\n*** Source context");</span> <span class="c1"># ctx.write()</span> <span class="c1"># First set parameters if given</span> <span class="n">prms</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'params'</span><span class="p">)</span> <span class="k">if</span> <span class="n">prms</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">ctx</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">set_other</span><span class="p">(</span><span class="n">prms</span><span class="p">)</span> <span class="c1"># Process other changes, check first if undocumented params are enabled (or not)</span> <span class="n">uk</span> <span class="o">=</span> <span class="s1">'enable_undocumented_params'</span> <span class="k">if</span> <span class="n">uk</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span> <span class="n">_change_context_attribute</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">uk</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">uk</span><span class="p">])</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="c1"># Replace obsolete solve_with_start_next attribute</span> <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="s1">'solve_with_start_next'</span><span class="p">:</span> <span class="n">k</span> <span class="o">=</span> <span class="s1">'solve_with_search_next'</span> <span class="k">if</span> <span class="p">(</span><span class="n">k</span> <span class="o">!=</span> <span class="s1">'context'</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">k</span> <span class="o">!=</span> <span class="s1">'params'</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">k</span> <span class="o">!=</span> <span class="n">uk</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">v</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">DEFAULT_VALUES</span><span class="p">):</span> <span class="n">_change_context_attribute</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="c1"># Get solver execfile</span> <span class="k">try</span><span class="p">:</span> <span class="k">if</span> <span class="n">ctx</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">agent</span> <span class="o">==</span> <span class="s1">'local'</span><span class="p">:</span> <span class="n">ctx</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">execfile</span> <span class="o">=</span> <span class="n">_search_exec_file</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">execfile</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span> <span class="k">elif</span> <span class="n">ctx</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">agent</span> <span class="o">==</span> <span class="s1">'lib'</span><span class="p">:</span> <span class="n">ctx</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="n">libfile</span> <span class="o">=</span> <span class="n">_search_exec_file</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="n">libfile</span><span class="p">,</span> <span class="n">ctx</span><span class="p">)</span> <span class="k">except</span><span class="p">:</span> <span class="k">pass</span> <span class="c1"># Return</span> <span class="k">return</span> <span class="n">ctx</span> <span class="c1">#=============================================================================</span> <span class="c1"># Overload default context with optional customizations</span> <span class="c1">#=============================================================================</span> <span class="c1"># Compute config files search path</span> <span class="n">_CONFIG_SEARCH_PATH</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">mpfile</span> <span class="o">=</span> <span class="n">get_main_file</span><span class="p">()</span> <span class="c1"># Add directory of the main file if any</span> <span class="k">if</span> <span class="n">mpfile</span><span class="p">:</span> <span class="n">_CONFIG_SEARCH_PATH</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">mpfile</span><span class="p">))</span> <span class="n">_CONFIG_SEARCH_PATH</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span> <span class="c1"># Add current directory</span> <span class="n">_CONFIG_SEARCH_PATH</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="c1"># Add all PYTHONPATH</span> <span class="k">def</span> <span class="nf">_eval_file</span><span class="p">(</span><span class="n">file</span><span class="p">):</span> <span class="sd">""" If found in python path, evaluate the content of a python module in this module.</span> <span class="sd"> Args:</span> <span class="sd"> file: Python file to evaluate</span> <span class="sd"> """</span> <span class="k">for</span> <span class="nb">dir</span> <span class="ow">in</span> <span class="n">_CONFIG_SEARCH_PATH</span><span class="p">:</span> <span class="n">f</span> <span class="o">=</span> <span class="nb">dir</span> <span class="o">+</span> <span class="s2">"/"</span> <span class="o">+</span> <span class="n">file</span> <span class="k">if</span> <span class="nb">dir</span> <span class="k">else</span> <span class="n">file</span> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">f</span><span class="p">):</span> <span class="c1"># print("Loading configuration file '{}'".format(f))</span> <span class="k">try</span><span class="p">:</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="k">as</span> <span class="n">fin</span><span class="p">:</span> <span class="n">fcont</span> <span class="o">=</span> <span class="n">fin</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> <span class="n">exec</span><span class="p">(</span><span class="n">fcont</span><span class="p">)</span> <span class="k">return</span> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="k">if</span> <span class="n">context</span><span class="o">.</span><span class="n">log_exceptions</span><span class="p">:</span> <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Error while loading config file </span><span class="si">{}</span><span class="s2">: </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span> <span class="c1"># Load all config changes</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"cpo_config.py"</span><span class="p">,</span> <span class="s2">"cpo_config_"</span> <span class="o">+</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span> <span class="o">+</span> <span class="s2">".py"</span><span class="p">,):</span> <span class="n">_eval_file</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="c1"># Check particular case of renamed solve_with_start_next</span> <span class="n">ov</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">solve_with_start_next</span> <span class="k">if</span> <span class="n">ov</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">context</span><span class="o">.</span><span class="n">solver</span><span class="o">.</span><span class="n">solve_with_search_next</span> <span class="o">=</span> <span class="n">ov</span> <span class="c1"># Overwrite with environment definitions if any</span> <span class="n">envchg</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">CONTEXT_ENVIRONMENT</span><span class="p">)</span> <span class="k">if</span> <span class="n">envchg</span><span class="p">:</span> <span class="k">for</span> <span class="n">chg</span> <span class="ow">in</span> <span class="n">envchg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">';'</span><span class="p">):</span> <span class="n">cx</span> <span class="o">=</span> <span class="n">chg</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">'='</span><span class="p">)</span> <span class="k">if</span> <span class="n">cx</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Invalid context change in environment variable </span><span class="si">{}</span><span class="s2">: '</span><span class="si">{}</span><span class="s2">'"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">CONTEXT_ENVIRONMENT</span><span class="p">,</span> <span class="n">chg</span><span class="p">))</span> <span class="k">try</span><span class="p">:</span> <span class="n">context</span><span class="o">.</span><span class="n">set_by_path</span><span class="p">(</span><span class="n">chg</span><span class="p">[:</span><span class="n">cx</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="n">chg</span><span class="p">[</span><span class="n">cx</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span> <span class="k">except</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Error when applying change from environment variable </span><span class="si">{}</span><span class="s2">: '</span><span class="si">{}</span><span class="s2">'"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">CONTEXT_ENVIRONMENT</span><span class="p">,</span> <span class="n">chg</span><span class="p">))</span> <span class="c1">#=============================================================================</span> <span class="c1"># Print configuration when called as main</span> <span class="c1">#=============================================================================</span> <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> <span class="c1"># Instanciate executable files if needed</span> <span class="n">ctx</span> <span class="o">=</span> <span class="n">_get_effective_context</span><span class="p">()</span> <span class="n">ctx</span><span class="o">.</span><span class="n">write</span><span class="p">()</span> </pre></div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../../../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../../../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="nav-item nav-item-0"><a href="../../../index.html">DOcplex.CP: Constraint Programming Modeling for Python V2.25 documentation</a> »</li> <li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li> </ul> </div> <div class="footer" role="contentinfo"> © Copyright 2022, IBM. </div> </body> </html>