Source code for docplex.mp.with_funcs

# --------------------------------------------------------------------------
# Source file provided under Apache License, Version 2.0, January 2004,
# http://www.apache.org/licenses/
# (c) Copyright IBM Corp. 2020, 2022
# --------------------------------------------------------------------------

from contextlib import contextmanager

from docplex.mp.constants import ObjectiveSense


[docs]@contextmanager def model_parameters(mdl, temp_parameters): """ This contextual function is used to override a model's parameters. As a contextual function, it is intended to be used with the `with` construct, for example: >>> with model_parameters(mdl, {"timelimit": 30, "empahsis.mip": 4}) as mdl2: >>> mdl2.solve() The new model returned from the `with` has temporary parameters overriding those of the initial model. when exiting the with block, initial parameters are restored. :param mdl: an instance of `:class:Model`. :param temp_parameters: accepts either a dictionary of qualified names to values, for example {"mip.tolernaces.mipgap": 0.03, "emphasis.mip": 4}, or a dictionary from parameter objects to values. :return: the same model, with overridden parameters. See Also: - :func:`docplex.mp.params.Parameter.qualified_name` *New in version 2.21* """ if not temp_parameters: try: yield mdl finally: pass else: ctx = mdl.context saved_context = ctx temp_ctx = ctx.copy() try: temp_ctx.update_cplex_parameters(temp_parameters) mdl.context = temp_ctx yield mdl finally: mdl.context = saved_context return mdl
[docs]@contextmanager def model_objective(mdl, temp_obj, temp_sense=None): """ This contextual function is used to temporarily override the objective of a model. As a contextual function, it is intended to be used with the `with` construct, for example: >>> with model_objective(mdl, x+y) as mdl2: >>> mdl2.solve() The new model returned from the `with` has a temporary objective overriding the initial objective. when exiting the with block, the initial objective and sense are restored. :param mdl: an instance of `:class:Model`. :param temp_obj: an expression. :param temp_sense: an optional objective sense to override the model's. Default is None (keep same objective). Accepts either an instance of enumerated value `:class:docplex.mp.constants.ObjectiveSense` or a string 'min' or 'max'. :return: the same model, with overridden objective. *New in version 2.21* """ saved_obj = mdl.objective_expr saved_sense = mdl.objective_sense new_sense_ = ObjectiveSense.parse(temp_sense, mdl) if temp_sense is not None else None try: mdl.set_objective_expr(temp_obj) if new_sense_: mdl.set_objective_sense(new_sense_) yield mdl finally: mdl.set_objective_expr(saved_obj) if new_sense_: mdl.set_objective_sense(saved_sense)
[docs]@contextmanager def model_solvefixed(mdl): """ This contextual function is used to temporarily change the type of the model to "solveFixed". As a contextual function, it is intended to be used with the `with` construct, for example: >>> with model_solvefixed(mdl) as mdl2: >>> mdl2.solve() The model returned from the `with` has a temporary problem type set to "solveFixex overriding the actual problem type. This function is useful for MIP models which have been successfully solved; the modified model can be solved as a LP, with all discrete values fixed to their solutions in the previous solve. when exiting the with block, the actual problem type is restored. :param mdl: an instance of `:class:Model`. :return: the same model, with overridden problem type. Note: - an exception is raised if the model has not been solved - LP models are returned unchanged, as this mfunction has no use. *New in version 2.22* """ cpx = mdl._get_cplex(do_raise=True, msgfn=lambda: "model_solvefixed requires CPLEX runtime") # save initial problem type, to be restored. saved_problem_type = cpx.get_problem_type() if saved_problem_type == 0: mdl.warning("Model {0} is a LP model, solvefixed does nothing".format(mdl.name)) return mdl if mdl.solution is None: # a solution is required. mdl.fatal(f"model_solvefixed requires that the model has been solved successfully") try: cpx.set_problem_type(3) # 3 is constant fixed_MILP yield mdl finally: cpx.set_problem_type(saved_problem_type)