IsingBPState#
- class graph_tool.dynamics.IsingBPState(g, x=1, theta=0, m=None, 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:
- g
Graph
Graph to be used for the dynamics.
- x
float
orEdgePropertyMap
(optional, default:1
) Edge coupling weights. If a
EdgePropertyMap
is given, it needs to be of typedouble
. If a scalar is given, this will be determine the value for every edge.- theta
float
or iterable orVertexPropertyMap
(optional, default:0.
) Vertex fields. If
VertexPropertyMap
, this needs to be of typedouble
. If a scalar is given, this will be determine the value for every vertex.- m
EdgePropertyMap
(optional, default:None
) If provided, it should be an
EdgePropertyMap
of typevector<double>
, containing the edge messages.- em
EdgePropertyMap
(optional, default:None
) If provided, it should be an
EdgePropertyMap
of typevector<double>
, containing the edge marginals.- vm
VertexPropertyMap
(optional, default:None
) If provided, it should be an
VertexPropertyMap
of typevector<double>
, containing the node marginals.- marginal_init
boolean
(optional, default:False
) If
True
, the messages will be initialized from the node marginals.- frozen
VertexPropertyMap
(optional, default:None
) If provided, it should be an
VertexPropertyMap
of typebool
, where a value True means that a vertex is not a variable, but a fixed field.- converge
boolean
(optional, default:True
) If
True
, the functionGenPottsBPState.converge()
will be called just after construction.
- g
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") <...>
Marginal sample of an Ising model.#
Methods
Obtains the Bethe approximation of the log-probability of state
s
(aVertexPropertyMap
), based on node and edge marginals, i.e.converge
([epsilon, max_niter, update_marginals])Calls
iterate()
until delta falls belowepsilon
or the number of iterations exceedsmax_niter
.copy
(**kwargs)Return a copy of the state.
energy
()Obtains the average energy from the current messages.
entropy
()Obtains the entropy from the current messages.
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 (a.k.a.
log_prob
(s)Obtains the log-probability of state
s
(aVertexPropertyMap
), computed as the negative energy ofs`
minus the logarithm of the partition function.mag
()Obtains the average magnetization from the current messages.
Obtains the marginal entropy from the current messages.
Obtains the marginal log-probability of state
s
(aVertexPropertyMap
).Obtains the marginal mean from the current messages.
marginal_pair_log_prob
(u, v, r, s)Obtains the marginal joint log-probability of node pairs \(u\) and \(v\) with values \(s_u = r\) and \(s_v = s\).
marginal_sample
([update_marginals, val_type])Samples a state from the marignal distribution.
sample
(**kwargs)Sample from the joint distribution by repeatedly conditioning and marginalizing using the BP equations.
Obtains the energy (Hamiltonean) of state
s
(aVertexPropertyMap
).to_spin
(s)Update the node marginals from the current messages.
- bethe_log_prob(s)[source]#
Obtains the Bethe approximation of the log-probability of state
s
(aVertexPropertyMap
), based on node and edge marginals, i.e.\[\ln P(\boldsymbol s | \boldsymbol A, \boldsymbol x) = \sum_i(1-k_i)\ln P_i(s_i) + \sum_{i<j}A_{ij}\ln P_{ij}(s_i,s_j)\]where the node and edge marginals are obtained from the messages, and \(k_i\) is the degree of node \(i\).
Warning
The results of
bethe_log_prob()
andlog_prob()
will be the same only for trees. The value ofbethe_log_prob()
, even when approximate (i.e. for loopy graphs), is nevertheless more consistent with the BP ansatz.
- converge(epsilon=1e-08, max_niter=1000, update_marginals=True, **kwargs)#
Calls
iterate()
until delta falls belowepsilon
or the number of iterations exceedsmax_niter
.If
update_marignals=True
, this function callsupdate_marginals()
at the end.The remaining keyword arguments are passed to
iterate()
.
- copy(**kwargs)#
Return a copy of the state. The keyword arguments override the constructor parameters.
- energy()#
Obtains the average energy from the current messages.
This is given by
\[U = -\sum_{i<j}A_{ij}\sum_{s_i,s_j}x_{ij}f_{s_i,s_j}P_{ij}(s_i,s_j) -\sum_i\sum_{s_i}P_i(s_i)\theta_{i,s_i}\]with \(P_{ij}(s_i,s_j)\) and \(P_i(s_i)\) being the marginal edge and node distributions, respectively.
- entropy()#
Obtains the entropy from the current messages.
This is given by
\[S = -\sum_i(1-k_i)\sum_{s_i}P_i(s_i)\ln P_i(s_i) -\sum_{i<j}A_{ij}\sum_{s_i,s_j}P_{ij}(s_i,s_j)\ln P_{ij}(s_i,s_j)\]with \(P_i(s_i)\) and \(P_{ij}(s_i,s_j)\) being the marginal node and edge distributions, respectively, and \(k_i\) is the degree of node i.
- 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 callsupdate_marginals()
at the end.Parallel implementation.
If enabled during compilation, this algorithm will run in parallel using OpenMP. See the parallel algorithms section for information about how to control several aspects of parallelization.
- log_Z()#
Obtains the log-partition function (a.k.a. free entropy) from the current messages.
- log_prob(s)[source]#
Obtains the log-probability of state
s
(aVertexPropertyMap
), computed as the negative energy ofs`
minus the logarithm of the partition function.If
s
is vector valued, it’s assumed to correspond to multiple states, and the total log-probability sum is returned.
- marginal_entropy()#
Obtains the marginal entropy from the current messages.
- marginal_log_prob(s)[source]#
Obtains the marginal log-probability of state
s
(aVertexPropertyMap
).If
s
is vector valued, it’s assumed to correspond to multiple states, and the total marginal log-probability sum is returned.
- marginal_mean()#
Obtains the marginal mean from the current messages.
- marginal_pair_log_prob(u, v, r, s)[source]#
Obtains the marginal joint log-probability of node pairs \(u\) and \(v\) with values \(s_u = r\) and \(s_v = s\).
- marginal_sample(update_marginals=True, val_type='int')[source]#
Samples a state from the marignal distribution. This functio returns a
VertexPropertyMap
of type given byval_type
.If
update_marignals=True
, this function callsupdate_marginals()
before sampling.
- sample(**kwargs)[source]#
Sample from the joint distribution by repeatedly conditioning and marginalizing using the BP equations.
The optional parameter
vorder
is a list of vertices giving the marginalization order.The remaining parameters control the BP convergence; see
GenPottsBPState.converge()
.Warning
This algorithm has a quadratic complexity \(O(NE)\), where \(N\) and \(E\) are the number of nodes and edges, respectively.
- sample_energy(s)[source]#
Obtains the energy (Hamiltonean) of state
s
(aVertexPropertyMap
).If
s
is vector valued, it’s assumed to correspond to multiple states, and the total energy sum is returned.
- update_marginals()#
Update the node marginals from the current messages.