コード例 #1
0
ファイル: multiclans.py プロジェクト: edwardt/algebraixlib
def is_regular(mclan, _checked=True) -> bool:
    """Return whether ``mclan`` is (left-)regular.

    :return: ``True`` if ``mclan`` is :term:`regular`, ``False`` if not, or `Undef()` if ``mclan``
        is not a :term:`multiclan`.
    """
    if _checked:
        if not is_member(mclan):
            return _undef.make_or_raise_undef2(mclan)
    else:
        assert is_member_or_undef(mclan)
        if mclan is _undef.Undef():
            return _undef.make_or_raise_undef(2)
    if mclan.cached_regular == _mo.CacheStatus.UNKNOWN:
        # The empty set is already handled in Set().__init__ via flags initialization.
        if mclan.cached_is_not_functional:
            mclan.cache_regular(_mo.CacheStatus.IS_NOT)
            return False
        itr = iter(mclan.data)
        rel = next(itr)
        if not _relations.is_functional(rel):
            mclan.cache_regular(_mo.CacheStatus.IS_NOT)
            return False
        left_set = rel.get_left_set()
        regular = all(
            _relations.is_functional(rel) and left_set == rel.get_left_set() for rel in itr)
        mclan.cache_regular(_mo.CacheStatus.from_bool(regular))
    return mclan.cached_is_regular
コード例 #2
0
ファイル: multiclans.py プロジェクト: jmcgonnell/algebraixlib
def is_regular(mclan, _checked=True) -> bool:
    """Return whether ``mclan`` is (left-)regular.

    :return: ``True`` if ``mclan`` is :term:`regular`, ``False`` if not, or `Undef()` if ``mclan``
        is not a :term:`multiclan`.
    """
    if _checked:
        if not is_member(mclan):
            return _undef.make_or_raise_undef2(mclan)
    else:
        assert is_member_or_undef(mclan)
        if mclan is _undef.Undef():
            return _undef.make_or_raise_undef(2)
    if mclan.cached_regular == _mo.CacheStatus.UNKNOWN:
        # The empty set is already handled in Set().__init__ via flags initialization.
        if mclan.cached_is_not_functional:
            mclan.cache_regular(_mo.CacheStatus.IS_NOT)
            return False
        itr = iter(mclan.data)
        rel = next(itr)
        if not _relations.is_functional(rel):
            mclan.cache_regular(_mo.CacheStatus.IS_NOT)
            return False
        left_set = rel.get_left_set()
        regular = all(
            _relations.is_functional(rel) and left_set == rel.get_left_set()
            for rel in itr)
        mclan.cache_regular(_mo.CacheStatus.from_bool(regular))
    return mclan.cached_is_regular
コード例 #3
0
ファイル: multiclans.py プロジェクト: Libardo1/algebraixlib
def is_functional(mclan, _checked=True) -> bool:
    """Return whether ``mclan`` is functional.

    :return: ``True`` if every :term:`relation` in ``mclan`` is :term:`functional` (is a
        :term:`function`), ``False`` if not, or `Undef()` if ``mclan`` is not a :term:`multiclan`.
    """
    if _checked:
        if not is_member(mclan):
            return _undef.make_or_raise_undef()
    else:
        assert is_member(mclan)

    if mclan.cached_functional == _mo.CacheStatus.UNKNOWN:
        # The empty set is already handled in Set().__init__ via flags initialization.
        functional = all(_relations.is_functional(rel, _checked=False) for rel in mclan.data)
        mclan.cache_functional(_mo.CacheStatus.from_bool(functional))
    return mclan.cached_is_functional
コード例 #4
0
ファイル: clans.py プロジェクト: jmcgonnell/algebraixlib
def is_functional(clan, _checked=True) -> bool:
    """Return whether ``clan`` is functional.

    :return: ``True`` if every :term:`relation` in ``clan`` is :term:`functional` (is a
        :term:`function`), ``False`` if not, or `Undef()` if ``clan`` is not a :term:`clan`.
    """
    if _checked:
        if not is_member(clan):
            return _undef.make_or_raise_undef2(clan)
    else:
        assert is_member_or_undef(clan)
        if clan is _undef.Undef():
            return _undef.make_or_raise_undef(2)
    if clan.cached_functional == _mo.CacheStatus.UNKNOWN:
        # The empty set is already handled in Set().__init__ via flags initialization.
        functional = all(
            _relations.is_functional(rel, _checked=False) for rel in clan)
        clan.cache_functional(_mo.CacheStatus.from_bool(functional))
    return clan.cached_is_functional
コード例 #5
0
def is_functional(mo: _mo.MathObject, _checked: bool = True) -> bool:
    r"""Return whether ``mo`` is :term:`functional` or `Undef()` if not applicable.

    Is implemented for :term:`relation`\s, :term:`clan`\s, :term:`multiclan`\s and :term:`set`\s
    of (sets of ...) clans. Is also defined (but not yet implemented) for any combination of sets
    or :term:`multiset`\s of relations.
    """
    # pylint: disable=too-many-return-statements
    if _checked:
        if not isinstance(mo, _mo.MathObject):
            return _undef.make_or_raise_undef()

    # Check cache status.
    if mo.cached_functional == _mo.CacheStatus.IS:
        return True
    if mo.cached_functional == _mo.CacheStatus.IS_NOT:
        return False
    if mo.cached_functional == _mo.CacheStatus.N_A:
        return _undef.make_or_raise_undef(2)

    # Check type (functional is only defined on Sets and Multisets) and algebra memberships.
    if not mo.is_set and not mo.is_multiset:
        mo.cache_functional(_mo.CacheStatus.N_A)
        return _undef.make_or_raise_undef(2)
    if _relations.is_member(mo):
        return _relations.is_functional(mo, _checked=False)
    if _clans.is_member(mo):
        return _clans.is_functional(mo, _checked=False)
    if _multiclans.is_member(mo):
        return _multiclans.is_functional(mo, _checked=False)

    # Check higher (not yet defined) algebras.
    functional = _is_powerset_property(mo, _clans.get_ground_set(),
                                       is_functional)
    if functional is not _undef.Undef():
        mo.cache_functional(_mo.CacheStatus.from_bool(functional))
        return functional

    # Nothing applied: 'functional' is not defined.
    mo.cache_functional(_mo.CacheStatus.N_A)
    return _undef.make_or_raise_undef(2)
コード例 #6
0
ファイル: properties.py プロジェクト: edwardt/algebraixlib
def is_functional(mo: _mo.MathObject, _checked: bool=True) -> bool:
    r"""Return whether ``mo`` is :term:`functional` or `Undef()` if not applicable.

    Is implemented for :term:`relation`\s, :term:`clan`\s, :term:`multiclan`\s and :term:`set`\s
    of (sets of ...) clans. Is also defined (but not yet implemented) for any combination of sets
    or :term:`multiset`\s of relations.
    """
    # pylint: disable=too-many-return-statements
    if _checked:
        if not isinstance(mo, _mo.MathObject):
            return _undef.make_or_raise_undef()

    # Check cache status.
    if mo.cached_functional == _mo.CacheStatus.IS:
        return True
    if mo.cached_functional == _mo.CacheStatus.IS_NOT:
        return False
    if mo.cached_functional == _mo.CacheStatus.N_A:
        return _undef.make_or_raise_undef(2)

    # Check type (functional is only defined on Sets and Multisets) and algebra memberships.
    if not mo.is_set and not mo.is_multiset:
        mo.cache_functional(_mo.CacheStatus.N_A)
        return _undef.make_or_raise_undef(2)
    if _relations.is_member(mo):
        return _relations.is_functional(mo, _checked=False)
    if _clans.is_member(mo):
        return _clans.is_functional(mo, _checked=False)
    if _multiclans.is_member(mo):
        return _multiclans.is_functional(mo, _checked=False)

    # Check higher (not yet defined) algebras.
    functional = _is_powerset_property(mo, _clans.get_ground_set(), is_functional)
    if functional is not _undef.Undef():
        mo.cache_functional(_mo.CacheStatus.from_bool(functional))
        return functional

    # Nothing applied: 'functional' is not defined.
    mo.cache_functional(_mo.CacheStatus.N_A)
    return _undef.make_or_raise_undef(2)