def binary_extend(set1: 'P( M )', set2: 'P( M )', op, _checked=True) -> 'P( M )': r"""Return the :term:`binary extension` of ``op`` from one :term:`algebra` to another algebra. For this extension, the elements of the extended algebra must be :term:`set`\s of the elements of the original algebra. :param set1: A :term:`set` with elements on which ``op`` operates. :param set2: A set with elements on which ``op`` operates. :param op: A :term:`binary operation` that operates on the elements of ``set1`` and ``set2``. :return: A set that consists of the defined results of ``op`` when executed on all combinations of the elements of ``set1`` and ``set2``, or `Undef()` if either set is not a :class:`~.Set`. """ if _checked: if not _sets.is_member(set1): return _undef.make_or_raise_undef2(set1) if not _sets.is_member(set2): return _undef.make_or_raise_undef2(set2) else: assert _sets.is_member_or_undef(set1) assert _sets.is_member_or_undef(set2) if set1 is _undef.Undef() or set2 is _undef.Undef(): return _undef.make_or_raise_undef(2) def _get_values(_set1, _set2): for e1 in _set1: for e2 in _set2: result = op(e1, e2) if result is not _undef.Undef(): yield result return _mo.Set(_get_values(set1, set2), direct_load=True)
def binary_extend(set1: 'P( M )', set2: 'P( M )', op, _checked=True) -> 'P( M )': r"""Return the :term:`binary extension` of ``op`` from one :term:`algebra` to another algebra. For this extension, the elements of the extended algebra must be :term:`set`\s of the elements of the original algebra. :param set1: A :term:`set` with elements on which ``op`` operates. :param set2: A set with elements on which ``op`` operates. :param op: A :term:`binary operation` that operates on the elements of ``set1`` and ``set2``. :return: A set that consists of the defined results of ``op`` when executed on all combinations of the elements of ``set1`` and ``set2``, or `Undef()` if either set is not a :class:`~.Set`. """ if _checked: if not _sets.is_member(set1): return _undef.make_or_raise_undef2(set1) if not _sets.is_member(set2): return _undef.make_or_raise_undef2(set2) else: assert _sets.is_member_or_undef(set1) assert _sets.is_member_or_undef(set2) if set1 is _undef.Undef() or set2 is _undef.Undef(): return _undef.make_or_raise_undef(2) def _get_values(_set1, _set2): for e1 in _set1: for e2 in _set2: result = op(e1, e2) if result is not _undef.Undef(): yield result return _mo.Set(_get_values(set1, set2), direct_load=True)
def big_intersect(set_of_multisets: 'PP( M x N )', _checked=True) -> 'P( M x N )': """Return the multiset intersection of all members of ``multiset``. :return: The :term:`multiset intersection` of all members of ``set_of_multisets`` or `Undef()` if ``set_of_multisets`` is not a :class:`~.Set` or any of its members are not instances of :class:`~.Multiset`. """ if _checked: if not isinstance(set_of_multisets, _mo.Set): return _undef.make_or_raise_undef2(set_of_multisets) for element in set_of_multisets: if not is_member(element): return _undef.make_or_raise_undef2(element) else: assert _sets.is_member_or_undef(set_of_multisets) if set_of_multisets is _undef.Undef(): return _undef.make_or_raise_undef(2) return _sets.chain_binary_operation( set_of_multisets, _functools.partial(intersect, _checked=False), is_member)
def big_union(set_of_multisets: 'PP( M x N )', _checked=True) -> 'P( M x N )': """Return the set_of_multisets union of all members of ``set_of_multisets``. :return: The :term:`multiset union` of all members of ``set_of_multisets`` or `Undef()` if ``set_of_multisets`` is not a :class:`~.Set` or any of its members are not instances of :class:`~.Multiset`. """ if _checked: if not isinstance(set_of_multisets, _mo.Set): return _undef.make_or_raise_undef2(set_of_multisets) for element in set_of_multisets: if not is_member(element): return _undef.make_or_raise_undef2(element) else: assert _sets.is_member_or_undef(set_of_multisets) if set_of_multisets is _undef.Undef(): return _undef.make_or_raise_undef(2) return _sets.chain_binary_operation( set_of_multisets, _functools.partial(union, _checked=False), is_member)