outcome_in_range

negmas.outcomes.outcome_in_range(outcome: Union[negmas.outcomes.OutcomeType, Tuple[Union[int, float, str, list]], Dict[Union[int, str], Union[int, float, str, list]]], outcome_range: Mapping[Union[int, str], Union[int, float, str, List[int], List[float], List[str], Tuple[int, int], Tuple[float, float], List[Tuple[Union[int, float], Union[int, float]]]]], *, strict=False, fail_incomplete=False)bool[source]

Tests that the outcome is contained within the given range of outcomes.

An outcome range defines a value or a range of values for each issue.

Parameters
  • outcome – “Outcome” being tested

  • outcome_range – “Outcome” range being tested against

  • strict – Whether to enforce that all issues in the outcome must be mentioned in the outcome_range

  • fail_incomplete – If True then outcomes that do not sepcify a value for all keys in the outcome_range

  • be considered not falling within it. If False then these outcomes will be considered falling (will) –

  • the range given that the values for the issues mentioned in the outcome satisfy the range (within) –

  • constraints.

Examples

>>> outcome_range = {'price': (0.0, 2.0), 'distance': [0.3, 0.4], 'type': ['a', 'b'], 'area': 3}
>>> outcome_range_2 = {'price': [(0.0, 1.0), (1.5, 2.0)], 'area': [(3, 4), (7, 9)]}
>>> outcome_in_range({'price':3.0}, outcome_range)
False
>>> outcome_in_range({'date': '2018.10.4'}, outcome_range)
True
>>> outcome_in_range({'date': '2018.10.4'}, outcome_range, strict=True)
False
>>> outcome_in_range({'area': 3}, outcome_range, fail_incomplete=True)
False
>>> outcome_in_range({'area': 3}, outcome_range)
True
>>> outcome_in_range({'type': 'c'}, outcome_range)
False
>>> outcome_in_range({'type': 'a'}, outcome_range)
True
>>> outcome_in_range({'date': '2018.10.4'}, outcome_range_2)
True
>>> outcome_in_range({'area': 3.1}, outcome_range_2)
True
>>> outcome_in_range({'area': 3}, outcome_range_2)
False
>>> outcome_in_range({'area': 5}, outcome_range_2)
False
>>> outcome_in_range({'price': 0.4}, outcome_range_2)
True
>>> outcome_in_range({'price': 0.4}, outcome_range_2, fail_incomplete=True)
False
>>> outcome_in_range({'price': 1.2}, outcome_range_2)
False
>>> outcome_in_range({'price': 0.4, 'area': 3.9}, outcome_range_2)
True
>>> outcome_in_range({'price': 0.4, 'area': 10}, outcome_range_2)
False
>>> outcome_in_range({'price': 1.2, 'area': 10}, outcome_range_2)
False
>>> outcome_in_range({'price': 1.2, 'area': 4}, outcome_range_2)
False
>>> outcome_in_range({'type': 'a'}, outcome_range_2)
True
>>> outcome_in_range({'type': 'a'}, outcome_range_2, strict=True)
False
>>> outcome_range = {'price': 10}
>>> outcome_in_range({'price': 10}, outcome_range)
True
>>> outcome_in_range({'price': 11}, outcome_range)
False
Returns

Success or failure

Return type

bool

Remarks:

Outcome ranges specify regions in an outcome space. They can have any of the following conditions:

  • A key/issue not mentioned in the outcome range does not add any constraints meaning that All values are acceptable except if strict == True. If strict == True then NO value will be accepted for issues not in the outcome_range.

  • A key/issue with the value None in the outcome range means All values on this issue are acceptable. This is the same as having this key/issue removed from the outcome space

  • A key/issue withe the value [] (empty list) accepts NO outcomes

  • A key/issue with a single value means that it is the only one acceptable

  • A key/issue with a single 2-items tuple (min, max) means that any value within that range is acceptable.

  • A key/issue with a list of values means an output is acceptable if it falls within the condition specified by any of the values in the list (list == union). Each such value can be a single value, a 2-items tuple or another list. Notice that lists of lists can always be combined into a single list of values