IsingBPState#

class graph_tool.dynamics.IsingBPState(g, x=1, theta=0, em=None, vm=None, marginal_init=False, frozen=None, has_zero=False, converge=True)[source]#

Bases: GenPottsBPState

Belief-propagation equations for the Ising model.

Parameters:
gGraph

Graph to be used for the dynamics.

xfloat or EdgePropertyMap (optional, default: 1)

Edge coupling weights. If a EdgePropertyMap is given, it needs to be of type double. If a scalar is given, this will be determine the value for every edge.

thetafloat or iterable or VertexPropertyMap (optional, default: 0.)

Vertex fields. If VertexPropertyMap, this needs to be of type double. If a scalar is given, this will be determine the value for every vertex.

emEdgePropertyMap (optional, default: None)

If provided, it should be an EdgePropertyMap of type vector<double>, containing the edge messages.

vmVertexPropertyMap (optional, default: None)

If provided, it should be an VertexPropertyMap of type vector<double>, containing the node marginals.

marginal_initboolean (optional, default: False)

If True, the messages will be initialized from the node marginals.

frozenVertexPropertyMap (optional, default: None)

If provided, it should be an VertexPropertyMap of type bool, where a value True means that a vertex is not a variable, but a fixed field.

convergeboolean (optional, default: True)

If True, the function GenPottsBPState.converge() will be called just after construction.

Notes

This implements BP equations [mezard_information_2009] for the Ising model given by

\[P(\boldsymbol \sigma | \boldsymbol A, \boldsymbol x, \boldsymbol\theta) = \frac{\exp\left(\sum_{i<j}A_{ij}x_{ij}\sigma_i\sigma_j + \sum_i\theta_{i}\sigma_i\right)} {Z(\boldsymbol A, \boldsymbol x, \boldsymbol\theta)}\]

where \(\sigma_i\in\{-1,1\}\) and \(Z(\boldsymbol A, \boldsymbol x, \boldsymbol\theta)\) is the partition function. This is equivalent to a gereralized Potts model with \(s_i=(\sigma_i + 1)/2\) and \(f_{rs} = -(2r-1)(2s-1)\). See GenPottsBPState for more details.

If has_zero == True, then it is assumed \(\sigma_i\in\{-1,0,1\}\).

References

[mezard_information_2009]

Marc Mézard, and Andrea Montanari, “Information, physics, and computation”, Oxford University Press, 2009. https://web.stanford.edu/~montanar/RESEARCH/book.html

Examples

>>> g = gt.GraphView(gt.collection.data["polblogs"].copy(), directed=False)
>>> gt.remove_parallel_edges(g)
>>> g = gt.extract_largest_component(g, prune=True)
>>> state = gt.IsingBPState(g, x=1/20,
...                         theta=g.vp.value.t(lambda x: np.arctanh((2*x-1)*.9)))
>>> s = state.sample()
>>> gt.graph_draw(g, g.vp.pos, vertex_fill_color=s,
...               output="bp-ising.svg")
<...>
../_images/bp-ising.svg

Marginal sample of an Ising model.#

Methods

converge([epsilon, max_niter, update_marginals])

Calls iterate() until delta falls below epsilon or the number of iterations exceeds max_niter.

copy()

Return a copy of the state.

energy(s)

Obtains the energy (Hamiltonean) of state s (a VertexPropertyMap).

from_spin(s)

iterate([niter, parallel, update_marginals])

Updates meassages synchronously (or asyncrhonously if parallel=False), niter number of times.

log_Z()

Obtains the log-partition function from the current messages.

log_prob(s)

Obtains the log-probability of state s (a VertexPropertyMap).

marginal_log_prob(s)

Obtains the marginal log-probability of state s (a VertexPropertyMap).

sample([update_marginals, val_type])

Samples a state from the marignal distribution.

to_spin(s)

update_marginals()

Update the node marginals from the current messages.

converge(epsilon=1e-08, max_niter=1000, update_marginals=True, **kwargs)#

Calls iterate() until delta falls below epsilon or the number of iterations exceeds max_niter.

If update_marignals=True, this function calls update_marginals() at the end.

The remaining keyword arguments are passed to iterate().

copy()#

Return a copy of the state.

energy(s)[source]#

Obtains the energy (Hamiltonean) of state s (a VertexPropertyMap).

If s is vector valued, it’s assumed to correspond to multiple states, and the total energy sum is returned.

from_spin(s)[source]#
iterate(niter=1, parallel=True, update_marginals=True)#

Updates meassages synchronously (or asyncrhonously if parallel=False), niter number of times. This function returns the interation delta of the last iteration.

If update_marignals=True, this function calls update_marginals() at the end.

If enabled during compilation, this algorithm runs in parallel (i.e. using more than one thread.)

log_Z()#

Obtains the log-partition function from the current messages.

log_prob(s)[source]#

Obtains the log-probability of state s (a VertexPropertyMap).

If s is vector valued, it’s assumed to correspond to multiple states, and the total log-probability sum is returned.

marginal_log_prob(s)[source]#

Obtains the marginal log-probability of state s (a VertexPropertyMap).

If s is vector valued, it’s assumed to correspond to multiple states, and the total marginal log-probability sum is returned.

sample(update_marginals=True, val_type='int')[source]#

Samples a state from the marignal distribution. This functio returns a VertexPropertyMap of type given by val_type.

If update_marignals=True, this function calls update_marginals() before sampling.

to_spin(s)[source]#
update_marginals()#

Update the node marginals from the current messages.