def context_has_docloud_credentials(context, do_warn=True): have_credentials = False if context.solver.docloud: have_credentials, error_message = check_credentials(context.solver.docloud) if error_message is not None and do_warn: warnings.warn(error_message, stacklevel=2) return have_credentials
def refine_conflict(self, mdl, preferences=None, groups=None, display=False, **kwargs): """ Starts the conflict refiner on the model. Args: mdl: The model to be relaxed. preferences: A dictionary defining constraint preferences. groups: A list of ConstraintsGroups. display: a boolean flag (default is True); if True, displays the result at the end. kwargs: Accepts named arguments similar to solve. Returns: An object of type `ConflictRefinerResut` which holds all information about the minimal conflict. See Also: :class:`ConflictRefinerResult` """ if mdl.has_multi_objective(): mdl.fatal("Conflict refiner is not supported for multi-objective") # take into account local argument overrides context = mdl.prepare_actual_context(**kwargs) # log stuff saved_context_log_output = mdl.context.solver.log_output saved_log_output_stream = mdl.log_output try: mdl.set_log_output(context.solver.log_output) forced_docloud = context_must_use_docloud(context, **kwargs) results = None have_credentials = False if context.solver.docloud: have_credentials, error_message = check_credentials(context.solver.docloud) if error_message is not None: warnings.warn(error_message, stacklevel=2) if forced_docloud: if have_credentials: results = self._refine_conflict_cloud(mdl, context, preferences, groups) else: mdl.fatal("DOcplexcloud context has no valid credentials: {0!s}", context.solver.docloud) # from now on docloud_context is None elif mdl.environment.has_cplex: # if CPLEX is installed go for it results = self._refine_conflict_local(mdl, context, preferences, groups) elif have_credentials: # no context passed as argument, no Cplex installed, try model's own context results = self._refine_conflict_cloud(mdl, context, preferences, groups) else: # no way to solve.. really return mdl.fatal("CPLEX DLL not found: please provide DOcplexcloud credentials") # write conflicts table.write_output_table() handles everything related to # whether the table should be published etc... if self.is_publishing_output_table(mdl.context): self.write_output_table(results.as_output_table(self.output_table_using_df), mdl.context) if display: results.display_stats() return results finally: if saved_log_output_stream != mdl.log_output: mdl.set_log_output_as_stream(saved_log_output_stream) if saved_context_log_output != mdl.context.solver.log_output: mdl.context.solver.log_output = saved_context_log_output
def refine_conflict(self, mdl, preferences=None, groups=None, **kwargs): """ Starts the conflict refiner on the model. Args: mdl: The model to be relaxed. preferences: A dictionary defining constraint preferences. groups: A list of ConstraintsGroups. kwargs: Accepts named arguments similar to solve. Returns: A list of ``TConflictConstraint`` namedtuples, each tuple corresponding to a constraint that is involved in the conflict. The fields of the ``TConflictConstraint`` namedtuple are: - the name of the constraint or None if the constraint corresponds to a variable lower or upper bound. - a reference to the constraint or to a wrapper representing a Var upper or lower bound. - a ``docplex.mp.constants.ConflictStatus`` object that indicates the conflict status type (Excluded, Possible_member, Member...). This list is empty if no conflict is found by the conflict refiner. """ if mdl.has_multi_objective(): mdl.fatal("Conflict refiner is not supported for multi-objective") # take into account local argument overrides context = mdl.prepare_actual_context(**kwargs) # log stuff saved_context_log_output = mdl.context.solver.log_output saved_log_output_stream = mdl.log_output try: mdl.set_log_output(context.solver.log_output) forced_docloud = context_must_use_docloud(context, **kwargs) results = None have_credentials = False if context.solver.docloud: have_credentials, error_message = check_credentials( context.solver.docloud) if error_message is not None: warnings.warn(error_message, stacklevel=2) if forced_docloud: if have_credentials: results = self._refine_conflict_cloud( mdl, context, preferences, groups) else: mdl.fatal( "DOcplexcloud context has no valid credentials: {0!s}", context.solver.docloud) # from now on docloud_context is None elif mdl.environment.has_cplex: # if CPLEX is installed go for it results = self._refine_conflict_local(mdl, context, preferences, groups) elif have_credentials: # no context passed as argument, no Cplex installed, try model's own context results = self._refine_conflict_cloud(mdl, context, preferences, groups) else: # no way to solve.. really return mdl.fatal( "CPLEX DLL not found: please provide DOcplexcloud credentials" ) # write conflicts table.write_output_table() handles everything related to # whether the table should be published etc... if self.is_publishing_output_table(mdl.context): self.write_output_table( to_output_table(results, self.output_table_using_df), mdl.context) return results finally: if saved_log_output_stream != mdl.log_output: mdl.set_log_output_as_stream(saved_log_output_stream) if saved_context_log_output != mdl.context.solver.log_output: mdl.context.solver.log_output = saved_context_log_output