1 | initial version |

You can also notice that your property defining the set B is a property that is tested on pairs of elements of A. Hence, you can construct the graph corresponding to admissible pairs:

```
sage: G = Graph()
sage: G.add_vertices(A)
for u,v in CartesianProduct(A,A):
if u != v and max(u,v) - min(u,v) <=3:
G.add_edge(u,v)
```

What you are looking for is the set of maximal cliques of G:

```
sage: G.cliques_maximal()
[[0, 3], [9, 10], [17], [33, 30]]
```

I let you benchmark between the two methods and tell us which is better in which cases !

To understand the link between the cliques of the graph G and the simplicial complex C, you could read about "Rips complex".

2 | No.2 Revision |

You can also notice that your property defining the set B is a property that is tested on pairs of elements of A. Hence, you can construct the graph corresponding to admissible pairs:

```
sage: A = Set([0,3,9,10,17,30,33])
sage: G = Graph()
sage: G.add_vertices(A)
for u,v in CartesianProduct(A,A):
if u != v and max(u,v) - min(u,v) <=3:
G.add_edge(u,v)
```

What you are looking for is the set of maximal cliques of G:

```
sage: G.cliques_maximal()
[[0, 3], [9, 10], [17], [33, 30]]
```

I let you benchmark between the two methods and tell us which is better in which cases !

To understand the link between the cliques of the graph G and the simplicial complex C, you could read about "Rips complex".

3 | No.3 Revision |

You can also notice that your property defining the set B is a property that is tested on pairs of elements of A. Hence, you can construct the graph corresponding to admissible pairs:

```
sage: A = Set([0,3,9,10,17,30,33])
sage: G = Graph()
sage: G.add_vertices(A)
sage: for u,v in CartesianProduct(A,A):
```~~ ~~....: if u != v and max(u,v) - min(u,v) <=3:
~~ ~~....: G.add_edge(u,v)

What you are looking for is the set of maximal cliques of G:

```
sage: G.cliques_maximal()
[[0, 3], [9, 10], [17], [33, 30]]
```

I let you benchmark between the two methods and tell us which is better in which cases !

To understand the link between the cliques of the graph G and the simplicial complex C, you could read about "Rips complex".

4 | No.4 Revision |

```
sage: A = Set([0,3,9,10,17,30,33])
sage: G = Graph()
sage: G.add_vertices(A)
sage: for u,v in CartesianProduct(A,A):
....: if u != v and max(u,v) - min(u,v) <=3:
....: G.add_edge(u,v)
```

What you are looking for is the set of maximal cliques of G:

```
sage: G.cliques_maximal()
[[0, 3], [9, 10], [17], [33, 30]]
```

I let you benchmark between the two methods and tell us which is better in which cases !

To understand the link between the cliques of the graph G and the simplicial complex ~~C, ~~C in my previous answer, you ~~could ~~can read about "Rips complex".

5 | No.5 Revision |

```
sage: A = Set([0,3,9,10,17,30,33])
sage: G = Graph()
sage: G.add_vertices(A)
sage: for u,v in CartesianProduct(A,A):
....: if u != v and max(u,v) - min(u,v) <=3:
....: G.add_edge(u,v)
```

What you are looking for is the set of maximal cliques of G:

```
sage: G.cliques_maximal()
[[0, 3], [9, 10], [17], [33, 30]]
```

I let you benchmark between the two methods and tell us which is better in which cases !

To understand the link between the cliques of the graph G and the simplicial complex C in my previous answer, you can read about "Rips complex".

**EDIT :** The previous method works, but there is a Sage bug when the set is made of RDF elements (see the following discussion and trac ticket 14853). Here is a dirty workaround until the bug is fixed: we replace a RDF element by a tuple made of a single RDF element.

```
sage: A = Set([RDF(0),RDF(3),RDF(9),RDF(10),RDF(17),RDF(30),RDF(33)])
sage: Atuple = map(lambda x:(x,), A)
sage: G = Graph()
sage: G.add_vertices(Atuple)
sage: for u,v in CartesianProduct(Atuple, Atuple):
....: if u != v and max(u[0],v[0]) - min(u[0],v[0]) <=3:
....: G.add_edge(u,v)
```

Then,

```
sage: C = [[c[0] for c in clique] for clique in G.cliques_maximal()] ; C
[[0.0, 3.0], [9.0, 10.0], [17.0], [33.0, 30.0]]
```

6 | No.6 Revision |

```
sage: A = Set([0,3,9,10,17,30,33])
sage: G = Graph()
sage: G.add_vertices(A)
sage: for u,v in CartesianProduct(A,A):
....: if u != v and max(u,v) - min(u,v) <=3:
....: G.add_edge(u,v)
```

What you are looking for is the set of maximal cliques of G:

```
sage: G.cliques_maximal()
[[0, 3], [9, 10], [17], [33, 30]]
```

I let you benchmark between the two methods and tell us which is better in which cases !

To understand the link between the cliques of the graph G and the simplicial complex C in my previous answer, you can read about "Rips complex".

**EDIT :** ~~The previous ~~This method works, but there is a Sage bug when the set is made of RDF elements (see the following discussion and trac ticket 14853). Here is a dirty workaround until the bug is fixed: we replace a RDF element by a tuple made of a single RDF element.

```
sage: A = Set([RDF(0),RDF(3),RDF(9),RDF(10),RDF(17),RDF(30),RDF(33)])
sage: Atuple = map(lambda x:(x,), A)
sage: G = Graph()
sage: G.add_vertices(Atuple)
sage: for u,v in CartesianProduct(Atuple, Atuple):
....: if u != v and max(u[0],v[0]) - min(u[0],v[0]) <=3:
....: G.add_edge(u,v)
```

Then,

```
sage: C = [[c[0] for c in clique] for clique in G.cliques_maximal()] ; C
[[0.0, 3.0], [9.0, 10.0], [17.0], [33.0, 30.0]]
```

7 | No.7 Revision |

```
sage: A = Set([0,3,9,10,17,30,33])
sage: G = Graph()
sage: G.add_vertices(A)
sage: for u,v in CartesianProduct(A,A):
....: if u != v and max(u,v) - min(u,v) <=3:
....: G.add_edge(u,v)
```

What you are looking for is the set of maximal cliques of G:

```
sage: G.cliques_maximal()
[[0, 3], [9, 10], [17], [33, 30]]
```

I let you benchmark between the two methods and tell us which is better in which cases !

To understand the link between the cliques of the graph G and the simplicial complex C in my previous answer, you can read about "Rips complex".

**EDIT :** This method works, but there is a Sage bug when the set is made of RDF elements (see the following discussion and trac ticket 14853). Here is a dirty workaround until the bug is fixed: we replace a RDF element by a tuple made of a single RDF element.

```
sage: A = Set([RDF(0),RDF(3),RDF(9),RDF(10),RDF(17),RDF(30),RDF(33)])
sage: Atuple = map(lambda x:(x,), A)
sage: G = Graph()
sage: G.add_vertices(Atuple)
sage: for u,v in CartesianProduct(Atuple, Atuple):
....: if u != v and max(u[0],v[0]) - min(u[0],v[0]) <=3:
....: G.add_edge(u,v)
```

Then,

```
sage: C = [[c[0] for c in clique] for clique in G.cliques_maximal()] ; C
[[0.0, 3.0], [9.0, 10.0], [17.0], [33.0, 30.0]]
```

**EDIT :** The bug has been fixed in sage 5.12, so you can now use this method as well without having to use the workaround, even with vertices in `RDF`

.

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.