def eval(self, offer: Optional[Outcome]) -> Optional[UtilityValue]: # noinspection PyBroadException if offer is None: return self.reserved_value try: if isinstance(offer, dict) and isinstance(self.mapping, dict): m = gmap(self.mapping, outcome_as_tuple(offer)) else: m = gmap(self.mapping, offer) except Exception: return self.default return m
def eval(self, offer: Optional["Outcome"]) -> Optional[UtilityValue]: if offer is None: return self.reserved_value u = ExactUtilityValue(0.0) for weight, outcome_range, mapping in zip( self.weights, self.outcome_ranges, self.mappings): # type: ignore # fail on any outcome_range that constrains issues not in the presented outcome if outcome_range is not None and set(ikeys(outcome_range)) - set( ikeys(offer)) != set([]): if self.ignore_issues_not_in_input: continue return None elif outcome_range is None or outcome_in_range( offer, outcome_range): if isinstance(mapping, float): u += weight * mapping else: # fail if any outcome_range utility_function cannot be calculated from the input try: # noinspection PyTypeChecker u += weight * gmap(mapping, offer) except KeyError: if self.ignore_failing_range_utilities: continue return None return u
def eval(self, offer: Optional["Outcome"]) -> Optional[UtilityValue]: if offer is None: return self.reserved_value if not isinstance(self.hypervolumes, Iterable): raise ValueError( "Hypervolumes are not set. Call set_params() or pass them through the constructor." ) u = [] for hypervolume, mapping in zip(self.hypervolumes, self.mappings): if outcome_in_range(offer, hypervolume): u.append(gmap(mapping, offer)) return self.f(u)
def eval(self, offer: Optional["Outcome"]) -> Optional[UtilityValue]: if offer is None: return self.reserved_value if self.issue_utilities is None: raise ValueError( "No issue utilities were set. Call set_params() or use the constructor" ) u = {} for k in ikeys(self.issue_utilities): v = iget(offer, k) u[k] = gmap(iget(self.issue_utilities, k), v) return self.f(u)
def eval(self, offer: Optional["Outcome"]) -> Optional[UtilityValue]: if offer is None: return self.reserved_value u = ExactUtilityValue(0.0) for k in ikeys(self.issue_utilities): if isinstance(offer, tuple): v = iget(offer, self.issue_indices[k]) else: v = iget(offer, k) current_utility = gmap(iget(self.issue_utilities, k), v) if current_utility is None: return None w = iget(self.weights, k) # type: ignore if w is None: return None try: u += w * current_utility except FloatingPointError: continue return u
def xml(self, issues: List[Issue]) -> str: """Generates an XML string representing the utility function Args: issues: Examples: >>> from negmas.utilities.nonlinear import MappingUtilityFunction >>> issues = [Issue(values=10, name='i1'), Issue(values=['delivered', 'not delivered'], name='i2') ... , Issue(values=4, name='i3')] >>> f = LinearUtilityAggregationFunction([lambda x: 2.0*x ... , {'delivered': 10, 'not delivered': -10} ... , MappingUtilityFunction(lambda x: x-3)] ... , weights=[1.0, 2.0, 4.0]) >>> print(f.xml(issues)) <issue index="1" etype="discrete" type="discrete" vtype="discrete" name="i1"> <item index="1" value="0" evaluation="0.0" /> <item index="2" value="1" evaluation="2.0" /> <item index="3" value="2" evaluation="4.0" /> <item index="4" value="3" evaluation="6.0" /> <item index="5" value="4" evaluation="8.0" /> <item index="6" value="5" evaluation="10.0" /> <item index="7" value="6" evaluation="12.0" /> <item index="8" value="7" evaluation="14.0" /> <item index="9" value="8" evaluation="16.0" /> <item index="10" value="9" evaluation="18.0" /> </issue> <issue index="2" etype="discrete" type="discrete" vtype="discrete" name="i2"> <item index="1" value="delivered" evaluation="10" /> <item index="2" value="not delivered" evaluation="-10" /> </issue> <issue index="3" etype="discrete" type="discrete" vtype="discrete" name="i3"> <item index="1" value="0" evaluation="-3" /> <item index="2" value="1" evaluation="-2" /> <item index="3" value="2" evaluation="-1" /> <item index="4" value="3" evaluation="0" /> </issue> <weight index="1" value="1.0"> </weight> <weight index="2" value="2.0"> </weight> <weight index="3" value="4.0"> </weight> <BLANKLINE> >>> print(f.xml({i:_ for i, _ in enumerate(issues)})) <issue index="1" etype="discrete" type="discrete" vtype="discrete" name="i1"> <item index="1" value="0" evaluation="0.0" /> <item index="2" value="1" evaluation="2.0" /> <item index="3" value="2" evaluation="4.0" /> <item index="4" value="3" evaluation="6.0" /> <item index="5" value="4" evaluation="8.0" /> <item index="6" value="5" evaluation="10.0" /> <item index="7" value="6" evaluation="12.0" /> <item index="8" value="7" evaluation="14.0" /> <item index="9" value="8" evaluation="16.0" /> <item index="10" value="9" evaluation="18.0" /> </issue> <issue index="2" etype="discrete" type="discrete" vtype="discrete" name="i2"> <item index="1" value="delivered" evaluation="10" /> <item index="2" value="not delivered" evaluation="-10" /> </issue> <issue index="3" etype="discrete" type="discrete" vtype="discrete" name="i3"> <item index="1" value="0" evaluation="-3" /> <item index="2" value="1" evaluation="-2" /> <item index="3" value="2" evaluation="-1" /> <item index="4" value="3" evaluation="0" /> </issue> <weight index="1" value="1.0"> </weight> <weight index="2" value="2.0"> </weight> <weight index="3" value="4.0"> </weight> <BLANKLINE> """ output = "" keys = list(ikeys(issues)) for i, k in enumerate(keys): issue = iget(issues, k) issue_name = issue.name if issue.is_float(): output += f'<issue index="{i + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n' output += f'<range lowerbound = {issue.min_value} upperbound = {issue.max_value} ></range>' # elif issue.is_integer(): # output += f'<issue index="{i + 1}" etype="integer" type="integer" vtype="integer" name="{issue_name}">\n' # output += f'<range lowerbound = {issue.min_value} upperbound = {issue.max_value} ></range>' else: output += f'<issue index="{i+1}" etype="discrete" type="discrete" vtype="discrete" name="{issue_name}">\n' vals = iget(issues, k).all for indx, v in enumerate(vals): try: u = gmap(iget(self.issue_utilities, issue_name), v) except: u = gmap(iget(self.issue_utilities, k), v) v_ = (v if not (isinstance(v, tuple) or isinstance(v, list)) else "-".join([str(_) for _ in v])) output += ( f' <item index="{indx+1}" value="{v_}" evaluation="{u}" />\n' ) output += "</issue>\n" if isinstance(issues, dict): if isinstance(self.weights, dict): weights = self.weights else: weights = {k: v for k, v in zip(ikeys(issues), self.weights)} else: if isinstance(self.weights, list): weights = self.weights else: weights = list(self.weights.get(i.name, 1.0) for i in issues) for i, k in enumerate(keys): output += f'<weight index="{i+1}" value="{iget(weights, k)}">\n</weight>\n' return output