# A Python Implementation of the Newman–Ziff algorithm¶

The *pypercolate* Python package implements the Newman–Ziff algorithm for bond
percolation on graphs.

The elementary unit of computation is the sample state:
This is one particular realization with a given number of edges—one member of
the microcanonical ensemble.
As Newman & Ziff suggest [NZ01], the package evolves a sample
state by successively adding edges, in a random but predetermined order.
This is implemented as a generator function
`percolate.percolate.sample_states()`

to iterate over.
Each step of the iteration adds one edge.

A collection of sample states (realizations) evolved in parallel form a
microcanonical ensemble at each iteration step.
A microcanonical ensemble is hence a collection of different sample states
(realizations) but with the same number of edges (occupation number).
The `percolate.percolate.microcanonical_averages()`

generator function
evolves a microcanonical ensemble.
At each step, it calculates the cluster statistics over all realizations in the
ensemble.
The `percolate.percolate.microcanonical_averages_arrays()`

helper function
collects these statistics over all iteration steps into single numpy arrays.

Finally, the `percolate.percolate.canonical_averages()`

function calculates
the statistics of the canonical ensemble from the microcanonical ensembles.

The `percolate.percolate.sample_states()`

generator handles cluster joining
by the networkx.utils.union_find.UnionFind data structure.