def __init__(self, model, var_value_map=None, obj=None, blended_obj_by_priority=None, name=None, solved_by=None, keep_zeros=True): """ SolveSolution(model, var_value_map, obj, name) Creates a new solution object, associated to a a model. Args: model: The model to which the solution is associated. This model cannot be changed. obj: The value of the objective in the solution. A value of None means the objective is not defined at the time the solution is created, and will be set later. blended_obj_by_priority: For multi-objective models: the value of sub-problems' objectives (each sub-problem groups objectives having same priority). var_value_map: a Python dictionary containing associations of variables to values. name: a name for the solution. The default is None, in which case the solution is named after the model name. :return: A solution object. """ assert model is not None assert solved_by is None or is_string(solved_by) assert obj is None or is_number(obj) or is_indexable(obj) assert blended_obj_by_priority is None or is_indexable( blended_obj_by_priority) self._model = model self._name = name self._problem_objective_expr = model.objective_expr if model.has_objective( ) else None self._objective = self.NO_OBJECTIVE_VALUE if obj is None else obj self._blended_objective_by_priority = [self.NO_OBJECTIVE_VALUE] if blended_obj_by_priority is None else \ blended_obj_by_priority self._solved_by = solved_by self._var_value_map = {} # attributes self._reduced_costs = None self._dual_values = None self._slack_values = None self._infeasibilities = {} self._basis_statuses = None self._solve_status = None self._keep_zeros = keep_zeros self._solve_details = None if var_value_map is not None: self._store_var_value_map(var_value_map, keep_zeros=keep_zeros)
def multi_objective_values(self): """ This property is used to get the list of objective values of the solution. In case of single objective this property returns the value for the objective as a singleton list When the objective value has not been defined, a special value `NO_SOLUTION` is returned. To check whether the objective has been set, use :func:`has_objective`. """ self_obj = self._objective return self_obj if is_indexable(self_obj) else [self_obj]
def objective_value(self): """ This property is used to get the objective value of the solution. In case of multi-objective this property returns the value for the first objective When the objective value has not been defined, a special value `NO_SOLUTION` is returned. To check whether the objective has been set, use :func:`has_objective`. """ if is_indexable(self._objective): return self._objective[0] return self._objective
def docplex_sum(x_seq): if is_iterable(x_seq): if not x_seq: return 0 elif isinstance(x_seq, dict): return _docplex_sum_with_seq(x_seq.values()) elif is_indexable(x_seq): return _docplex_sum_with_seq(x_seq) else: return _docplex_sum_with_seq(list(x_seq)) elif x_seq: mdl = _docplex_extract_model(x_seq, do_raise=False) return mdl.to_linear_expr(x_seq) if mdl else x_seq else: return 0