def test_membership(self):
     self.assertTrue(is_member(Multiset(Set(Couplet(1, 2)))))
     self.assertFalse(is_member(Multiset(Couplet(3, 4))))
     self.assertTrue(is_absolute_member(Multiset(Set(Couplet(1, 2)))))
     self.assertFalse(is_absolute_member(Multiset(Set(Couplet(Set([2, 3]), 4)))))
     # noinspection PyTypeChecker
     self.assertRaises(TypeError, lambda: is_member(3))
 def test_membership(self):
     self.assertTrue(is_member(Multiset(Set(Couplet(1, 2)))))
     self.assertFalse(is_member(Multiset(Couplet(3, 4))))
     self.assertTrue(is_absolute_member(Multiset(Set(Couplet(1, 2)))))
     self.assertFalse(
         is_absolute_member(Multiset(Set(Couplet(Set(2, 3), 4)))))
     self.assertFalse(is_absolute_member(Set(2, 3)))
     # noinspection PyTypeChecker
     self.assertRaises(AttributeError, lambda: is_member(3))
Exemple #3
0
def export_csv(absolute_clan: 'PP(A x A)', file_or_path, column_order=None, sort_key=None):
    """This function takes an absolute, left regular clan and produces a CSV file, where the
    left components are in the header line and the rows are the individual relations.

    :param absolute_clan: A :class:`algebraixlib.mathobjects.set.Set`. It must be an absolute and
        left-regular clan.
    :param file_or_path: Either a file path (in this case the CSV data is written to a file at this
        location) or a file object (in this case the CSV data is written to its ``.write()``
        function).
    :param column_order: The optional left set to be exported in the specified order.
    :param sort_key: The optional key to be provided to sorted (sorted not called if None).
    :return: ``True`` if the CSV export succeeded.
    """
    if not _clans.is_absolute_member(absolute_clan) \
            and not _multiclans.is_absolute_member(absolute_clan):
        return _ud.make_or_raise_undef()
    if column_order is None and not absolute_clan.is_left_regular():
        return _ud.make_or_raise_undef()

    if column_order is None:
        # Since this clan is left regular, get first relation to acquire left set.
        rel = next(iter(absolute_clan))
        # left_set is sorted to guarantee consistent iterations
        column_order = sorted([left.value for left in rel.get_left_set()])

    # Build list of dictionaries that associates left components with their right components for each relation.
    clan_as_list_of_dicts = _convert_clan_to_list_of_dicts(column_order,
                                                           (absolute_clan if sort_key is None else
                                                            sorted(absolute_clan, key=sort_key)))
    # Write that dictionary.
    _csv_dict_writer(file_or_path, column_order, clan_as_list_of_dicts)

    return True
Exemple #4
0
def export_csv(absolute_clan_or_multiclan,
               file_or_path,
               ordered_lefts=None,
               sort_key=None):
    r"""Export an absolute clan or absolute multiclan as CSV file with header row.

    The :term:`left component`\s of the :term:`clan` or term:`multiclan` are interpreted as
    column names and are exported as header row. Every :term:`relation` in the input becomes a
    data row in the CSV file.

    :param absolute_clan_or_multiclan: An :term:`absolute clan` or term:`absolute multiclan`. If
        it is not :term:`regular`, ``ordered_lefts`` must be given.
    :param file_or_path: Either a file path (in this case the CSV data is written to a file at this
        location) or a file object (in this case the CSV data is written to its ``.write()``
        function).
    :param ordered_lefts: (Optional) A ``Sequence`` of :term:`left`\s that are exported in the
        given order. Default is the sequence that is the lexically sorted :term:`left set` of the
        (multi)clan. This parameter is required if ``absolute_clan_or_multiclan`` is not
        term:`regular`.
    :param sort_key: (Optional) A function that compares two row-:term:`relation`\s and provides an
        order (for use with :func:`sorted`). The output is not sorted if ``sort_key`` is missing.
    :return: ``True`` if the CSV export succeeded, ``False`` if not.
    """
    if not _clans.is_absolute_member(absolute_clan_or_multiclan) \
            and not _multiclans.is_absolute_member(absolute_clan_or_multiclan):
        return False
    regular_clan = _clans.is_member(absolute_clan_or_multiclan) \
            and _clans.is_regular(absolute_clan_or_multiclan)
    regular_mclan = _multiclans.is_member(absolute_clan_or_multiclan) \
            and _multiclans.is_regular(absolute_clan_or_multiclan)
    if ordered_lefts is None and not (regular_clan or regular_mclan):
        return False

    if ordered_lefts is None:
        # Since this clan is regular, get first relation to acquire left set.
        rel = next(iter(absolute_clan_or_multiclan))
        # left_set is sorted to guarantee consistent iterations
        ordered_lefts = sorted([left.value for left in rel.get_left_set()])

    # Generate dictionaries that associates left components with their right components for each
    # relation.
    clan_as_list_of_dicts = _convert_clan_to_list_of_dicts(
        ordered_lefts, (absolute_clan_or_multiclan if sort_key is None else
                        sorted(absolute_clan_or_multiclan, key=sort_key)))
    # Write the dictionaries.
    _csv_dict_writer(file_or_path, ordered_lefts, clan_as_list_of_dicts)
    return True
    def test_multiset_with_one_empty_element(self):
        m = Multiset(Set())
        self.assertEqual(m.cardinality, 1)

        m_repr = repr(m)
        m_str = str(m)

        self.assertEqual(m_repr, "Multiset({Set(): 1})")
        self.assertEqual(m_str, "[{}:1]")
        self.assertEqual(m.get_multiplicity(Set()), 1)
        self.assertEqual(m.get_multiplicity(Atom('b')), 0)
        m_struct = m.get_ground_set()
        m_expected_struct = PowerSet(CartesianProduct(Structure(), GenesisSetN()))
        self.assertEqual(m_struct, m_expected_struct)

        import algebraixlib.algebras.multiclans as _multiclans
        self.assertTrue(_multiclans.is_member(m))
        self.assertTrue(_multiclans.is_absolute_member(m))
    def test_multiset_with_one_empty_element(self):
        m = Multiset(Set())
        self.assertEqual(m.cardinality, 1)

        m_repr = repr(m)
        m_str = str(m)

        self.assertEqual(m_repr, "Multiset({Set(): 1})")
        self.assertEqual(m_str, "[{}:1]")
        self.assertEqual(m.get_multiplicity(Set()), 1)
        self.assertEqual(m.get_multiplicity(Atom('b')), 0)
        m_struct = m.get_ground_set()
        m_expected_struct = PowerSet(
            CartesianProduct(Structure(), GenesisSetN()))
        self.assertEqual(m_struct, m_expected_struct)

        import algebraixlib.algebras.multiclans as _multiclans
        self.assertTrue(_multiclans.is_member(m))
        self.assertTrue(_multiclans.is_absolute_member(m))
Exemple #7
0
def export_csv(absolute_clan_or_multiclan, file_or_path, ordered_lefts=None, sort_key=None):
    r"""Export an absolute clan or absolute multiclan as CSV file with header row.

    The :term:`left component`\s of the :term:`clan` or term:`multiclan` are interpreted as
    column names and are exported as header row. Every :term:`relation` in the input becomes a
    data row in the CSV file.

    :param absolute_clan_or_multiclan: An :term:`absolute clan` or term:`absolute multiclan`. If
        it is not :term:`regular`, ``ordered_lefts`` must be given.
    :param file_or_path: Either a file path (in this case the CSV data is written to a file at this
        location) or a file object (in this case the CSV data is written to its ``.write()``
        function).
    :param ordered_lefts: (Optional) A ``Sequence`` of :term:`left`\s that are exported in the
        given order. Default is the sequence that is the lexically sorted :term:`left set` of the
        (multi)clan. This parameter is required if ``absolute_clan_or_multiclan`` is not
        term:`regular`.
    :param sort_key: (Optional) A function that compares two row-:term:`relation`\s and provides an
        order (for use with :func:`sorted`). The output is not sorted if ``sort_key`` is missing.
    :return: ``True`` if the CSV export succeeded, ``False`` if not.
    """
    if not _clans.is_absolute_member(absolute_clan_or_multiclan) \
            and not _multiclans.is_absolute_member(absolute_clan_or_multiclan):
        return False
    regular_clan = _clans.is_member(absolute_clan_or_multiclan) \
            and _clans.is_regular(absolute_clan_or_multiclan)
    regular_mclan = _multiclans.is_member(absolute_clan_or_multiclan) \
            and _multiclans.is_regular(absolute_clan_or_multiclan)
    if ordered_lefts is None and not (regular_clan or regular_mclan):
        return False

    if ordered_lefts is None:
        # Since this clan is regular, get first relation to acquire left set.
        rel = next(iter(absolute_clan_or_multiclan))
        # left_set is sorted to guarantee consistent iterations
        ordered_lefts = sorted([left.value for left in rel.get_left_set()])

    # Generate dictionaries that associates left components with their right components for each
    # relation.
    clan_as_list_of_dicts = _convert_clan_to_list_of_dicts(
        ordered_lefts, (absolute_clan_or_multiclan if sort_key is None else sorted(absolute_clan_or_multiclan, key=sort_key)))
    # Write the dictionaries.
    _csv_dict_writer(file_or_path, ordered_lefts, clan_as_list_of_dicts)
    return True