# canonical_permutation

##### Canonical permutation of a graph

The canonical permutation brings every isomorphic graphs into the same (labeled) graph.

- Keywords
- graphs

##### Usage

`canonical_permutation(graph, sh = "fm")`

##### Arguments

- graph
- The input graph, treated as undirected.
- sh
- Type of the heuristics to use for the BLISS algorithm. See details for possible values.

##### Details

`canonical_permutation`

computes a permutation which brings the graph
into canonical form, as defined by the BLISS algorithm. All isomorphic
graphs have the same canonical form.

See the paper below for the details about BLISS. This and more information
is available at

The possible values for the `sh`

argument are: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object] See the paper in references for details
about these.

##### Value

- A list with the following members:
labeling The canonical parmutation which takes the input graph into canonical form. A numeric vector, the first element is the new label of vertex 0, the second element for vertex 1, etc. info Some information about the BLISS computation. A named list with the following members: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

##### References

Tommi Junttila and Petteri Kaski: Engineering an Efficient
Canonical Labeling Tool for Large and Sparse Graphs, *Proceedings of
the Ninth Workshop on Algorithm Engineering and Experiments and the Fourth
Workshop on Analytic Algorithms and Combinatorics.* 2007.

##### See Also

`permute`

to apply a permutation to a graph,
`graph.isomorphic`

for deciding graph isomorphism, possibly
based on canonical labels.

##### Examples

```
## Calculate the canonical form of a random graph
g1 <- sample_gnm(10, 20)
cp1 <- canonical_permutation(g1)
cf1 <- permute(g1, cp1$labeling)
## Do the same with a random permutation of it
g2 <- permute(g1, sample(vcount(g1)))
cp2 <- canonical_permutation(g2)
cf2 <- permute(g2, cp2$labeling)
## Check that they are the same
el1 <- as_edgelist(cf1)
el2 <- as_edgelist(cf2)
el1 <- el1[ order(el1[,1], el1[,2]), ]
el2 <- el2[ order(el2[,1], el2[,2]), ]
all(el1 == el2)
```

*Documentation reproduced from package igraph, version 1.0.0, License: GPL (>= 2)*