xgi.classes.simplicialcomplex.SimplicialComplex

class xgi.classes.simplicialcomplex.SimplicialComplex(incoming_data=None, **attr)[source]

Bases: Hypergraph

A class to represent undirected simplicial complexes.

A simplicial complex is a collection of subsets of a set of nodes or vertices. It is a pair \((V, E)\), where \(V\) is a set of elements called nodes or vertices, and \(E\) is a set whose elements are subsets of \(V\), that is, each \(e \in E\) satisfies \(e \subset V\). The elements of \(E\) are called simplices. Additionally, if a simplex is part of a simplicial complex, all its faces must be too. This makes simplicial complexes a special case of hypergraphs.

The SimplicialComplex class allows any hashable object as a node and can associate attributes to each node, simplex, or the simplicial complex itself, in the form of key/value pairs.

Parameters:
  • incoming_data (input simplicial complex data, optional) –

    Data to initialize the simplicial complex. If None (default), an empty simplicial complex is created, i.e. one with no nodes or simplices. The data can be in the following formats:

    • simplex list

    • simplex dictionary

    • 2-column Pandas dataframe (bipartite edges)

    • Scipy/Numpy incidence matrix

    • SimplicialComplex object.

  • **attr (dict, optional) – Attributes to add to the simplicial complex as key, value pairs. By default, None.

See also

Hypergraph

Notes

Unique IDs are assigned to each node and simplex internally and are used to refer to them throughout.

The attr keyword arguments are added as simplicial complex attributes. To add node or simplex attributes see add_node() and add_simplex(). Methods such as add_simplex() replace Hypergraph methods such as add_edge() which here raise an error.

Examples

>>> import xgi
>>> S = xgi.SimplicialComplex([[1, 2, 3], [4], [5, 6], [6, 7, 8]])
>>> S.nodes
NodeView((1, 2, 3, 4, 5, 6, 7, 8))
>>> S.edges
EdgeView((0, 1, 2, 3, 4, 5, 6, 7, 8, 9))

Attributes

edges

An EdgeView of this network.

nodes

A NodeView of this network.

num_edges

The number of edges in the hypergraph.

num_nodes

The number of nodes in the hypergraph.

Methods

add_edge

Deprecated in SimplicialComplex.

add_edges_from

Deprecated in SimplicialComplex.

add_simplex

Add a simplex to the simplicial complex, and all its subfaces that do not exist yet.

add_simplices_from

Add multiple edges with optional attributes.

add_weighted_edges_from

Deprecated in SimplicialComplex.

add_weighted_simplices_from

Add weighted simplices in ebunch_to_add with specified weight attr

close

Adds all missing subfaces to the complex.

has_simplex

Whether a simplex appears in the simplicial complex.

Inherited methods that cannot be used

add_edge

Deprecated in SimplicialComplex.

add_edges_from

Deprecated in SimplicialComplex.

add_weighted_edges_from

Deprecated in SimplicialComplex.

remove_edge

Deprecated in SimplicialComplex.

remove_edges_from

Deprecated in SimplicialComplex.

remove_simplex_id

Remove a simplex with a given id.

remove_simplex_ids_from

Remove all simplicies specified in ebunch.

add_edge(edge, id=None, **attr)[source]

Deprecated in SimplicialComplex. Use add_simplex instead

add_edges_from(ebunch_to_add, max_order=None, **attr)[source]

Deprecated in SimplicialComplex. Use add_simplices_from instead

add_node_to_edge(edge, node)[source]

add_node_to_edge is not implemented in SimplicialComplex.

add_simplex(members, id=None, **attr)[source]

Add a simplex to the simplicial complex, and all its subfaces that do not exist yet.

Simplex attributes can be specified with keywords or by directly accessing the simplex’s attribute dictionary. The attributes do not propagate to the subfaces.

Parameters:
  • members (Iterable) – An iterable of the ids of the nodes contained in the new simplex.

  • id (hashable, optional) – Id of the new simplex. If None (default), a unique numeric ID will be created.

  • **attr (dict, optional) – Attributes of the new simplex.

Raises:

XGIError – If members is empty.

See also

add_simplices_from

Add a collection of simplices.

Notes

Currently cannot add empty simplices.

Examples

Add simplices with or without specifying an simplex id.

>>> import xgi
>>> S = xgi.SimplicialComplex()
>>> S.add_simplex([1, 2, 3])
>>> S.edges.members() 
[frozenset({1, 2, 3}), frozenset({2, 3}),
    frozenset({1, 2}), frozenset({1, 3})]
>>> S.add_simplex([3, 4], id='myedge')
>>> S.edges
EdgeView((0, 1, 2, 3, 'myedge'))

Access attributes using square brackets. By default no attributes are created.

>>> S.edges[0]
{}
>>> S.add_simplex([1, 4], color='red', place='peru')
>>> S.edges
EdgeView((0, 1, 2, 3, 'myedge', 4))
>>> S.edges[4]
{'color': 'red', 'place': 'peru'}
add_simplices_from(ebunch_to_add, max_order=None, **attr)[source]

Add multiple edges with optional attributes.

Parameters:
  • ebunch_to_add (Iterable) –

    An iterable of simplices. This may be an iterable of iterables (Format 1), where each element contains the members of the simplex specified as valid node IDs. Alternatively, each element could also be a tuple in any of the following formats:

    • Format 2: 2-tuple (members, simplex_id), or

    • Format 3: 2-tuple (members, attr), or

    • Format 4: 3-tuple (members, simplex_id, attr),

    where members is an iterable of node IDs, simplex_id is a hashable to use as simplex ID, and attr is a dict of attributes. Finally, ebunch_to_add may be a dict of the form {simplex_id: simplex_members} (Format 5).

    Formats 2 and 3 are unambiguous because attr dicts are not hashable, while id`s must be. In Formats 2-4, each element of `ebunch_to_add must have the same length, i.e. you cannot mix different formats. The iterables containing simplex members cannot be strings.

  • max_order (int, optional) – Maximal dimension of simplices to add. If None (default), adds all simplices. If int, and ebunch_to_add contains simplices of order > max_order, creates and adds all its subfaces up to max_order.

  • attr (**kwargs, optional) – Additional attributes to be assigned to all simplices. Attribues specified via ebunch_to_add take precedence over attr.

See also

add_simplex

add a single simplex

add_weighted_simplices_from

convenient way to add weighted simplices

Notes

Adding the same simplex twice will add it only once. Currently cannot add empty simplices; the method skips over them.

Examples

>>> import xgi
>>> S = xgi.SimplicialComplex()

When specifying simplices by their members only, numeric simplex IDs will be assigned automatically.

>>> S.add_simplices_from([[0, 1], [1, 2], [2, 3, 4]])
>>> S.edges.members(dtype=dict) 
{0: frozenset({0, 1}), 1: frozenset({1, 2}), 2: frozenset({2, 3, 4}), 3: frozenset({2, 3}), 4: frozenset({2, 4}), 5: frozenset({3, 4})}

Custom simplex ids can be specified using a dict.

>>> S = xgi.SimplicialComplex()
>>> S.add_simplices_from({'one': [0, 1], 'two': [1, 2], 'three': [2, 3, 4]})
>>> S.edges.members(dtype=dict) 
{'one': frozenset({0, 1}), 'two': frozenset({1, 2}), 'three': frozenset({2, 3, 4}), 0: frozenset({2, 3}), 1: frozenset({2, 4}), 2: frozenset({3, 4})}

You can use the dict format to easily add simplices from another simplicial complex.

>>> S2 = xgi.SimplicialComplex()
>>> S2.add_simplices_from(S.edges.members(dtype=dict))
>>> list(S.edges) == list(S2.edges)
True

Alternatively, simplex ids can be specified using an iterable of 2-tuples.

>>> S = xgi.SimplicialComplex()
>>> S.add_simplices_from([([0, 1], 'one'), ([1, 2], 'two'), ([2, 3, 4], 'three')])
>>> S.edges.members(dtype=dict) 
{'one': frozenset({0, 1}), 'two': frozenset({1, 2}), 'three': frozenset({2, 3, 4}), 0: frozenset({2, 3}), 1: frozenset({2, 4}), 2: frozenset({3, 4})}

Attributes for each simplex may be specified using a 2-tuple for each simplex. Numeric IDs will be assigned automatically.

>>> S = xgi.SimplicialComplex()
>>> simplices = [
...     ([0, 1], {'color': 'red'}),
...     ([1, 2], {'age': 30}),
...     ([2, 3, 4], {'color': 'blue', 'age': 40}),
... ]
>>> S.add_simplices_from(simplices)
>>> {e: S.edges[e] for e in S.edges}
{0: {'color': 'red'}, 1: {'age': 30}, 2: {'color': 'blue', 'age': 40}, 3: {}, 4: {}, 5: {}}

Attributes and custom IDs may be specified using a 3-tuple for each simplex.

>>> S = xgi.SimplicialComplex()
>>> simplices = [
...     ([0, 1], 'one', {'color': 'red'}),
...     ([1, 2], 'two', {'age': 30}),
...     ([2, 3, 4], 'three', {'color': 'blue', 'age': 40}),
... ]
>>> S.add_simplices_from(simplices)
>>> {e: S.edges[e] for e in S.edges}
{'one': {'color': 'red'}, 'two': {'age': 30}, 'three': {'color': 'blue', 'age': 40}, 0: {}, 1: {}, 2: {}}
add_weighted_edges_from(ebunch_to_add, max_order=None, weight='weight', **attr)[source]

Deprecated in SimplicialComplex. Use add_weighted_simplices_from instead

add_weighted_simplices_from(ebunch_to_add, max_order=None, weight='weight', **attr)[source]

Add weighted simplices in ebunch_to_add with specified weight attr

Parameters:
  • ebunch_to_add (iterable of simplices) – Each simplex given in the list or container will be added to the graph. The simplices must be given as tuples of the form (node1, node2, …, noden, weight).

  • max_order (int, optional) – The maximum order simplex to add, by default None.

  • weight (string, optional) – The attribute name for the simplex weights to be added. By default, “weight”.

  • attr (keyword arguments, optional (default= no attributes)) – simplex attributes to add/update for all simplices.

See also

add_simplex

add a single simplex

add_simplices_from

add multiple simplices

Notes

Adding the same simplex twice will add it only once.

Example

>>> import xgi
>>> S = xgi.SimplicialComplex()
>>> simplices = [(0, 1, 0.3), (0, 2, 0.8)]
>>> S.add_weighted_simplices_from(simplices)
>>> S.edges[0]
{'weight': 0.3}
close()[source]

Adds all missing subfaces to the complex.

See also

add_simplex

add a single simplex

add_weighted_simplices_from

convenient way to add weighted simplices

Notes

Adding the same simplex twice will add it only once. Currently cannot add empty simplices; the method skips over them.

has_simplex(simplex)[source]

Whether a simplex appears in the simplicial complex.

Parameters:

simplex (list or set) – An iterable of hashables that specifies an simplex

Returns:

Whether or not simplex is as a simplex in the simplicial complex.

Return type:

bool

Examples

>>> import xgi
>>> H = xgi.SimplicialComplex([[1, 2], [2, 3, 4]])
>>> H.has_simplex([1, 2])
True
>>> H.has_simplex({1, 3})
False
remove_edge(id)[source]

Deprecated in SimplicialComplex. Use remove_simplex_id instead

remove_edges_from(ebunch)[source]

Deprecated in SimplicialComplex. Use remove_simplex_ids_from instead

remove_node(n, strong=False)[source]

remove_node is not implemented in SimplicialComplex.

remove_simplex_id(id)[source]

Remove a simplex with a given id.

This also removes all simplices of which this simplex is face, to preserve the simplicial complex structure.

Parameters:

id (Hashable) – edge ID to remove

Raises:

XGIError – If no edge has that ID.

See also

remove_edges_from

remove a collection of edges

remove_simplex_ids_from(ebunch)[source]

Remove all simplicies specified in ebunch.

Parameters:

ebunch (list or iterable of hashables) – Each edge id given in the list or iterable will be removed from the Simplicialcomplex.

Raises:

xgi.exception.IDNotFound – If an id in ebunch is not part of the network.

See also

remove_simplex_id

remove a single simplex by ID.