def is_reflexive(rel, _checked=True) -> bool: """Return whether ``rel`` is reflexive. :return: ``True`` if ``rel`` is :term:`reflexive`, ``False`` if it is not, or `Undef()` if ``rel`` is not a :term:`relation`. """ if _checked: if not is_member(rel): return _undef.make_or_raise_undef() else: assert is_member(rel) if rel.cached_reflexive == _mo.CacheStatus.UNKNOWN: reflexive = all(_couplets.is_reflexive(couplet, _checked=False) for couplet in rel) rel.cache_reflexive(_mo.CacheStatus.from_bool(reflexive)) return rel.cached_reflexive == _mo.CacheStatus.IS
def is_reflexive(rel, _checked=True) -> bool: """Return whether ``rel`` is reflexive. :return: ``True`` if ``rel`` is :term:`reflexive`, ``False`` if it is not, or `Undef()` if ``rel`` is not a :term:`relation`. """ if _checked: if not is_member(rel): return _undef.make_or_raise_undef2(rel) else: assert is_member_or_undef(rel) if rel is _undef.Undef(): return _undef.make_or_raise_undef(2) if rel.cached_reflexive == _mo.CacheStatus.UNKNOWN: reflexive = all( _couplets.is_reflexive(couplet, _checked=False) for couplet in rel) rel.cache_reflexive(_mo.CacheStatus.from_bool(reflexive)) return rel.cached_reflexive == _mo.CacheStatus.IS
def is_reflexive(mo: _mo.MathObject, _checked: bool = True) -> bool: r"""Return whether ``mo`` is :term:`reflexive` or `Undef()` if not applicable. Is implemented for :term:`couplet`\s, :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_reflexive == _mo.CacheStatus.IS: return True if mo.cached_reflexive == _mo.CacheStatus.IS_NOT: return False if mo.cached_reflexive == _mo.CacheStatus.N_A: return _undef.make_or_raise_undef(2) # Check types and algebra memberships. if _couplets.is_member(mo): return _couplets.is_reflexive(mo, _checked=False) if not mo.is_set and not mo.is_multiset: mo.cache_reflexive(_mo.CacheStatus.N_A) return _undef.make_or_raise_undef(2) if _relations.is_member(mo): return _relations.is_reflexive(mo, _checked=False) if _clans.is_member(mo): return _clans.is_reflexive(mo, _checked=False) if _multiclans.is_member(mo): return _multiclans.is_reflexive(mo, _checked=False) # Check higher (not yet defined) algebras. reflexive = _is_powerset_property(mo, _clans.get_ground_set(), is_reflexive) if reflexive is not _undef.Undef(): mo.cache_reflexive(_mo.CacheStatus.from_bool(reflexive)) return reflexive # Nothing applied: 'reflexive' is not defined. mo.cache_reflexive(_mo.CacheStatus.N_A) return _undef.make_or_raise_undef(2)
def is_reflexive(mo: _mo.MathObject, _checked: bool=True) -> bool: r"""Return whether ``mo`` is :term:`reflexive` or `Undef()` if not applicable. Is implemented for :term:`couplet`\s, :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_reflexive == _mo.CacheStatus.IS: return True if mo.cached_reflexive == _mo.CacheStatus.IS_NOT: return False if mo.cached_reflexive == _mo.CacheStatus.N_A: return _undef.make_or_raise_undef(2) # Check types and algebra memberships. if _couplets.is_member(mo): return _couplets.is_reflexive(mo, _checked=False) if not mo.is_set and not mo.is_multiset: mo.cache_reflexive(_mo.CacheStatus.N_A) return _undef.make_or_raise_undef(2) if _relations.is_member(mo): return _relations.is_reflexive(mo, _checked=False) if _clans.is_member(mo): return _clans.is_reflexive(mo, _checked=False) if _multiclans.is_member(mo): return _multiclans.is_reflexive(mo, _checked=False) # Check higher (not yet defined) algebras. reflexive = _is_powerset_property(mo, _clans.get_ground_set(), is_reflexive) if reflexive is not _undef.Undef(): mo.cache_reflexive(_mo.CacheStatus.from_bool(reflexive)) return reflexive # Nothing applied: 'reflexive' is not defined. mo.cache_reflexive(_mo.CacheStatus.N_A) return _undef.make_or_raise_undef(2)
def test_is_reflexive(self): """Basic tests of couplets.is_reflexive().""" self.assertTrue(is_reflexive(Couplet(left='a', right='a'))) self.assertFalse(is_reflexive(_couplet_a_to_b)) self.assertIs(is_reflexive(Undef()), Undef()) self.assertIs(is_reflexive(Undef(), _checked=False), Undef())
def test_is_reflexive(self): """Basic tests of couplets.is_reflexive().""" self.assertTrue(is_reflexive(Couplet(left="a", right="a"))) self.assertFalse(is_reflexive(_couplet_a_to_b)) self.assertIs(is_reflexive(Undef()), Undef()) self.assertIs(is_reflexive(Undef(), _checked=False), Undef())