Observables

When possible we implement observables for different formulations. Since the equivalence between formulations is link-by-link, when measured on the same size lattice the different formulations should give equal results in the infinite-statistics limit. Which formulation is more efficient of course depends on the action parameters and on the lattice size.

Internal Energy Density

class supervillain.observable.InternalEnergyDensity[source]

Bases: Scalar, Observable

If we think of \(\kappa\) like a thermodynamic \(\beta\), then we may compute the internal energy \(U\)

\[\begin{split}\begin{align} U &= - \partial_\kappa \log Z \\ &= \left\langle - \partial_\kappa (-S) \right\rangle \\ &= \left\langle \partial_\kappa S \right\rangle \end{align}\end{split}\]

It is extensive in the spacetime volume, so we calculate the density

\[\texttt{InternalEnergyDensity} = U / \Lambda\]

where \(\Lambda\) is the number of sites in our spacetime.

static Villain(S, phi, n)[source]

In the Villain case differentiating the action \(S_0\) is the same as dividing it by \(\kappa\)!

static Worldline(S, Links)[source]

In the Worldline formulation we differentiate to find

\[\begin{align} U &= \left\langle \partial_\kappa S \right\rangle = - \frac{1}{2\kappa^2} \sum_{\ell} (m-\delta v/W)_\ell^2 + \frac{|\ell|}{2 \kappa}. \end{align}\]
class supervillain.observable.InternalEnergyDensitySquared[source]

Bases: Scalar, Observable

If we think of \(\kappa\) as a thermodynamic \(\beta\), then we may compute the expectation value of the square of the internal energy \(U\)

\[\begin{align} \langle U^2 \rangle &= \frac{1}{Z} \partial^2_\kappa Z = \left\langle (\partial_\kappa S)^2 - \partial^2_\kappa S \right\rangle \end{align}\]

and to the intensive density squared is

\[\texttt{InternalEnergyDensitySquared} = \langle U^2 \rangle / \Lambda^2\]

where \(\Lambda\) is the number of sites in our spacetime.

static Villain(S, phi, n)[source]

In the Villain case,

\[\begin{align} \partial_\kappa S &= S/\kappa & \partial^2_\kappa S &= 0 \end{align}\]
static Worldline(S, Links)[source]

In the Worldline formulation we differentiate to find

\[\begin{align} \partial_\kappa S &= - \frac{1}{2\kappa^2} \sum_{\ell} (m-\delta v/W)_\ell^2 + \frac{|\ell|}{2 \kappa} & \partial^2_\kappa S &= \frac{1}{\kappa^3} \sum_{\ell} (m-\delta v/W)_\ell^2 - \frac{|\ell|}{2\kappa^2}. \end{align}\]
class supervillain.observable.InternalEnergyDensityVariance[source]

Bases: DerivedQuantity

\[\begin{align} \texttt{InternalEnergyDensityVariance} &= \left\langle U^2/\Lambda^2 \right\rangle - \left\langle U/\Lambda \right\rangle^2 \end{align}\]

which can be computed from expectation values of InternalEnergyDensitySquared and InternalEnergyDensity.

static default(S, InternalEnergyDensitySquared, InternalEnergyDensity)[source]
class supervillain.observable.SpecificHeatCapacity[source]

Bases: DerivedQuantity

The (intensive) specific heat capacity \(c\) is given by

\[c = \frac{\langle U^2 \rangle - \langle U \rangle^2}{\Lambda T^2} = \kappa^2 \Lambda \times \texttt{InternalEnergyDensityVariance}.\]

Naively, since both \(\langle U^2 \rangle\) and \(\langle U \rangle^2\) scale like \(\Lambda^2\) their difference ought to also scale like \(\Lambda^2\). However, we learn from thermodynamics that actually their difference is one order lower, which explains the division by one power of \(\Lambda\).

static default(S, InternalEnergyDensityVariance)[source]

Action

class supervillain.observable.ActionDensity[source]

Bases: Scalar, Observable

The expectation value of the action density can be calculated as

\[\begin{split}\begin{align} \mathcal{S} &= - \kappa \partial_\kappa \log Z \\ &= \left\langle - \kappa \partial_\kappa (-S) \right\rangle \\ &= \left\langle \kappa \partial_\kappa S \right\rangle \end{align}\end{split}\]

It is extensive in the spacetime volume, so we calculate the density

\[\texttt{ActionDensity} = \mathcal{S} / \Lambda\]

where \(\Lambda\) is the number of sites in our spacetime.

static Villain(S, phi, n)[source]

In the Villain case differentiating and then multiplying by \(\kappa\) gives the action \(S_0\) itself!

static Worldline(S, Links)[source]

In the Worldline formulation we differentiate to find

\[\begin{align} \mathcal{S} &= \left\langle \kappa \partial_\kappa S \right\rangle = - \frac{1}{2\kappa} \sum_{\ell} (m-\delta v/W)_\ell^2 + \frac{|\ell|}{2}. \end{align}\]
class supervillain.observable.Action_Action[source]

Bases: DerivedQuantity

If we imagine rewriting the actions’ sums over links as a sum over sites and a sum over directions we can associate a value of κ with each site. Then we may compute the correlations of the action density by evaluating

\[\begin{split}\begin{align} \mathcal{S}_{x,y} =& \left.\left(-\kappa_y \frac{\delta}{\delta \kappa_y}\right) \left(-\kappa_x \frac{\delta}{\delta \kappa_x}\right) \log Z\right|_{\kappa_{x,y} = \kappa} \\ =& \left.\left\langle (\kappa_y \partial_{\kappa_y} S) (\kappa_x \partial_{\kappa_x} S) - \kappa_y \kappa_x \partial_{\kappa_y} \partial_{\kappa_x} S - \kappa_y \delta_{yx} \partial_{\kappa_x} S \right\rangle\right|_{\kappa_{x,y} = \kappa} \\ & - \left.\left\langle \kappa_x \partial_{\kappa_x} S \right\rangle\right|_{\kappa_x = \kappa} \left.\left\langle \kappa_y \partial_{\kappa_y} S \right\rangle\right|_{\kappa_y = \kappa}. \end{align}\end{split}\]

Using translational invariance the quantum-disconnected piece is independent of \(x\) and \(y\) and can be replaced by \(\left\langle\texttt{ActionDensity}\right\rangle^2\). So, we find the simplification

\[\begin{split}\begin{align} \mathcal{S}_{x,y} = & \left\langle (\kappa_y \partial_{\kappa_y} S) (\kappa_x \partial_{\kappa_x} S) - \kappa_y \kappa_x \partial_{\kappa_y} \partial_{\kappa_x} S - \delta_{xy} \kappa_x \partial_{\kappa_x} S\right\rangle \\ & - \left\langle \texttt{ActionDensity} \right\rangle^2 \end{align}\end{split}\]

We define the spacetime-dependent correlator

\[S^2_{x,y} = \left\langle (\kappa_y \partial_{\kappa_y} S) (\kappa_x \partial_{\kappa_x} S) - \kappa_y \kappa_x \partial_{\kappa_y} \partial_{\kappa_x} S - \delta_{xy} \kappa_x \partial_{\kappa_x} S \right\rangle\]

so that \(\mathcal{S}_{x,y} = S^2_{xy} - \left\langle \texttt{ActionDensity} \right\rangle^2\)

We can reduce to a function of a single relative coordinate,

\[\begin{align} \texttt{Action_Action}_{\Delta x} = \mathcal{S}_{\Delta x} = \frac{1}{\Lambda} \sum_{x} \mathcal{S}_{x, x-\Delta x} \end{align}\]

and define a primary observable ActionTwoPoint

\[\begin{align} \texttt{ActionTwoPoint}_{\Delta x} = \frac{1}{\Lambda} \sum_{x} S^2_{x,x-\Delta x}. \end{align}\]

The quantum-disconnected term is \(\Delta x\) independent, so

\[\texttt{Action_Action}_{\Delta x} = \texttt{ActionTwoPoint}_{\Delta x} - \left\langle \texttt{ActionDensity} \right\rangle^2.\]
static default(S, ActionTwoPoint, ActionDensity)[source]
class supervillain.observable.ActionTwoPoint[source]

Bases: Observable

In Action_Action we need the translation-averaged

\[S^2_{x,y} = \left.\left\langle (\kappa_y \partial_{\kappa_y} S) (\kappa_x \partial_{\kappa_x} S) - \kappa_y \kappa_x \partial_{\kappa_y} \partial_{\kappa_x} S - \delta_{xy} \kappa_x \partial_{\kappa_x} S \right\rangle\right|_{\kappa_{x,y} = \kappa}\]

given by

\[\texttt{ActionTwoPoint} = \frac{1}{\Lambda} \sum_x S^2_{x, x-\Delta x}.\]
static Villain(S, Links)[source]

In the Villain formulation one finds

\[\left.\kappa_y \kappa_x \partial_{\kappa_y} \partial_{\kappa_x} S\right|_{\kappa_{x,y} = \kappa} = 0\]

while

\[\left.\delta_{xy} \kappa_x \partial_{\kappa_x} S \right|_{\kappa_x = \kappa} = \delta_{xy} \frac{\kappa}{2} \sum_{\ell \text{ from } x} (d\phi - 2\pi n)_\ell^2\]

and

\[\left.(\kappa_y \partial_{\kappa_y} S) (\kappa_x \partial_{\kappa_x} S)\right|_{\kappa_{x,y} = \kappa} = \left(\frac{\kappa}{2} \sum_{\ell \text{ from }y} (d\phi - 2\pi n)^2_{\ell}\right) \left(\frac{\kappa}{2} \sum_{\ell \text{ from }x} (d\phi - 2\pi n)^2_{\ell}\right)\]
static Worldline(S, Links)[source]

In the Worldline formulation one has to carefully treat the \(|\ell|/2 \log 2\pi \kappa\) contribution. We should really imagine \(|\ell|/2\) as arising from a sum over sites of independent \(\log 2\pi \kappa\)s. That term contributes constant pieces,

\[\left.(\kappa_y \partial_{\kappa_y} S) (\kappa_x \partial_{\kappa_x} S)\right|_{\kappa_{x,y} = \kappa} = \left(1 - \frac{1}{2\kappa} \sum_{\ell \text{ from } y} (m-\delta v/W)_\ell^2 \right) \left(1 - \frac{1}{2\kappa} \sum_{\ell \text{ from } x} (m-\delta v/W)_\ell^2 \right)\]

while

\[\left.\delta_{xy} \kappa_x \partial_{\kappa_x} S \right|_{\kappa_x = \kappa} = \delta_{xy} \left( 1 - \frac{1}{2\kappa} \sum_{\ell \text{ from } x} (m-\delta v/W)_\ell^2 \right)\]

and

\[\left.\kappa_y \kappa_x \partial_{\kappa_y} \partial_{\kappa_x} S\right|_{\kappa_{x,y} = \kappa} = \delta_{xy} \left(-1 + \frac{1}{\kappa} \sum_{\ell \text{ from } x} (m-\delta v/W)_\ell^2\right).\]

Winding

class supervillain.observable.WindingSquared[source]

Bases: Scalar, Observable

Given periodic boundary conditions the total topological charge vanishes \(\partial_J Z = 0\). Translational invariance is strong enough to conclude that in expectation the winding number on any plaquette also vanishes.

However we can treat \(J\) as a local source and ask about the square of the winding number on any plaquette

\[w_p^2 = -\frac{\delta^2 \log Z}{\delta J_p^2}\]

and we can drop the quantum-disconnected pieces because \(\delta Z / \delta J_p = 0\) for any \(p\) when \(J=0\).

To increase statistics we calculate the local winding number squared and average over the lattice

\[\texttt{WindingSquared} = \frac{1}{\Lambda} \sum_p w_p^2\]

where \(\Lambda\) is the number of plaquettes in the lattice.

static Villain(S, n)[source]

Differentiating with respect to \(J_p\) gives a \(-i\,dn_p\); differentiating twice gives \(-dn_p^2\), so that \(w_p = dn_p^2\).

static Worldline(S, Links)[source]

Reusing the derivation from Winding_Winding and setting \(p=q\) we get

\[w_p = \frac{1}{\pi^2 \kappa}-\frac{1}{(2\pi \kappa)^2}\left\langle [d(m-\delta v/W)]_p^2 \right\rangle.\]

because \(\delta / \delta J_p ( d \delta J_p) = 4\).

class supervillain.observable.Winding_Winding[source]

Bases: Observable

Beyond just the same-site-squared we can compute correlations of the plaquette winding number.

\[W_{p,q} = -\frac{\delta^2 \log Z}{\delta J_p \delta J_q}\]

By translation invariance we can average so that only the separation remains

\[W_{\Delta p} = \frac{1}{\Lambda} \sum_{p} W_{p, p-\Delta p}.\]

Note

You can check that \(\texttt{Winding_Winding[0,0]} = \texttt{WindingSquared}\) configuration by configurations.

static Villain(S, n)[source]

Differentiating twice gives \(W_{p,q} = \left\langle dn_p dn_q \right\rangle\); the quantum-disconnected piece vanishes when \(J=0\).

static Worldline(S, Links)[source]
The Worldline observable is trickier.

Expanding the Worldline action (and grouping the irrelevant contants)

\[\begin{split}\begin{align} S_J[m, v] &= \frac{1}{2\kappa} \sum_\ell \left((m-\delta v/W) - \frac{\delta J}{2\pi}\right)_\ell^2 + \text{constants} \\ &= \frac{1}{2\kappa} \sum_\ell \left((m-\delta v/W)_\ell^2 - \frac{1}{\pi} (m-\delta v/W)_\ell (\delta J)_\ell + \frac{1}{4\pi^2} (\delta J)_\ell^2 \right)+ \text{constants} \\ &= \frac{1}{2\kappa} \left(\sum_\ell (m-\delta v/W)_\ell^2 + \sum_p - \frac{1}{\pi} (d(m-\delta v/W))_p J_p + \frac{1}{4\pi^2} J_p (d \delta J)_p \right)+ \text{constants} \end{align}\end{split}\]

where we integrated two terms by parts to get \(J\) undecorated.

Differentiating \(\log Z\) once gives

\[\begin{split}\begin{align} \frac{\delta}{\delta J_p} \log Z &= -\frac{1}{Z} \sum Dm\; Dv\; [\delta m = 0] e^{-S_J[m, v]} \frac{\delta S}{\delta J_p} \\ &= \frac{1}{Z} \sum Dm\; Dv\; [\delta m = 0] e^{-S_J[m, v]} \frac{-1}{2\kappa}\left( -\frac{1}{\pi} (d(m-\delta v/W))_p + \frac{2}{4\pi^2} (d\delta J)_p \right) \end{align}\end{split}\]

where the factor of 2 on the \(d \delta J\) term comes from the fact that \(J d \delta J\) is quadratic in \(J\).

Differentiating again we must hit both the \(1/Z\) term and the path integral upstairs giving two terms,

\[\begin{split}\begin{align} \frac{\delta}{\delta J_q}\frac{\delta}{\delta J_p} \log Z =& \frac{\delta}{\delta J_q} \left[\frac{1}{Z} \sum Dm\; Dv\; [\delta m = 0] e^{-S_J[m,v]} \frac{-1}{2\kappa}\left( -\frac{1}{\pi} (d(m-\delta v/W))_p + \frac{1}{2\pi^2} (d\delta J)_p \right) \right] \\ =& -\frac{1}{Z^2} \left[\sum Dm\; Dv\; [\delta m = 0] e^{-S_J[m,v]} \frac{-1}{2\kappa}\left( -\frac{1}{\pi} (d(m-\delta v/W))_p + \frac{1}{2\pi^2} (d\delta J)_p \right) \right] \\ & \phantom{-\frac{1}{Z^2}}\times \left[\sum Dm\; Dv\; [\delta m = 0] e^{-S_J[m,v]} \frac{-1}{2\kappa}\left( -\frac{1}{\pi} (d(m-\delta v/W))_q + \frac{1}{2\pi^2} (d\delta J)_q \right) \right] \\ &+ \frac{1}{Z} \sum Dm\; Dv\; [\delta m = 0] e^{-S_J[m,v]} \Bigg[ \\ & \phantom{-\frac{1}{Z^2}} \left(\frac{-1}{2\kappa}\right)^2\left( -\frac{1}{\pi} (d(m-\delta v/W))_q + \frac{1}{2\pi^2} (d\delta J)_q \right) \\ & \phantom{-\frac{1}{Z^2}} \times\left( -\frac{1}{\pi} (d(m-\delta v/W))_p + \frac{1}{2\pi^2} (d\delta J)_p \right) \\ & \phantom{-\frac{1}{Z^2}} +\frac{-1}{4\pi^2 \kappa}\frac{\delta}{\delta J_q} (d \delta J)_p \Bigg] \\ \end{align}\end{split}\]

In the second term we differentiate both the action [the first term in the brackets] and what was already brought down [the second]. Plugging in \(J=0\) gives

\[\begin{split}\begin{align} -\left.\frac{\delta}{\delta J_q}\frac{\delta}{\delta J_p} \log Z \right|_{J=0} = \left(\frac{1}{2\pi \kappa}\right)^2\Bigg\{& \left\langle (d(m-\delta v/W))_p \right\rangle \left\langle (d(m-\delta v/W))_q \right\rangle \\ &- \left\langle (d(m-\delta v/W))_p (d(m-\delta v/W))_q \right\rangle \\ & + \kappa \left.\frac{\delta}{\delta J_q} (d \delta J)_p\right|_{J=0} \Bigg\} \end{align}\end{split}\]

because \(d\delta 0 = 0\).

When \(J=0\) the first (quantum-disconnected) term is proportional \(\left\langle d(m-\delta v/W)_p \right\rangle \left\langle d(m-\delta v/W)_q \right\rangle\) and the individual expectation values vanish by symmetry so we are left with

\[\begin{align} -\left.\frac{\delta}{\delta J_q}\frac{\delta}{\delta J_p} \log Z \right|_{J=0} = \left(\frac{1}{2\pi \kappa}\right)^2\Bigg\{& \kappa \left.\frac{\delta}{\delta J_q} (d \delta J)_p \right|_{J=0} - \left\langle (d(m-\delta v/W))_p (d(m-\delta v/W))_q \right\rangle\Bigg\} \end{align}\]

The remaining functional derivative is a displacement-dependent constant.

At the end of the day all we are left with is

\[- \frac{\delta}{\delta J_p} \frac{\delta}{\delta J_q}\log Z = \frac{1}{(2\pi \kappa)^2}\left\{\kappa\left.\frac{\delta}{\delta J_q}(d \delta J_p)\right|_{J=0} - \left\langle (d(m-\delta v/W))_p (d(m-\delta v/W)_q) \right\rangle\right\}\]

when \(J=0\). In 2D \(\left.\frac{\delta}{\delta J_q}(d \delta J_p)\right|_{J=0} = 4 \delta_{pq} - \sum_{\hat{\mu}} \delta_{p+\hat{\mu},q}\) where \(\hat{\mu}\) runs over the 4 cardinal directions, reproducing (minus) the standard 2D five-point Laplacian stencil.

Wrapping

class supervillain.observable.TorusWrapping[source]

Bases: Observable

Both the Villain and Worldline formulations have integer-valued numbers that wrap the spatial torus.

Warning

Unlike most observables these will NOT match\({}^*\) between the different formulations. However, since they are both related to the global topology, we expect them to evolve quite slowly and suffer the longest autocorrelation times.

\({}^*\)They both have 0 expectation value by the discrete rotational lattice symmetries, but they don’t have related physical motivation.

static Villain(S, phi, n)[source]

The total wrapping in direction \(\mu\) is given by the gauge holonomy

\[\texttt{TorusWrapping}_{\mu} = \sum n_\mu\]
static Worldline(S, m)[source]

The total wrapping in direction \(\mu\) is given by the net particle flux in that direction

\[\texttt{TorusWrapping}_{\mu} = \frac{1}{|\mu|} \sum m_\mu\]

where we divide by the length of the dimension because a torus-wrapping \(m\) will get contributions from every μ-slice.

Calculations of the autocorrelation_time() are easiest for scalars. These decouple the two components of the wrapping.

Warning

Like TorusWrapping these are motivated differently for the different formulations.

class supervillain.observable.TWrapping[source]

Bases: Scalar, Observable

Just the time component of TorusWrapping.

static default(S, TorusWrapping)[source]
class supervillain.observable.XWrapping[source]

Bases: Scalar, Observable

Just the space component of TorusWrapping.

static default(S, TorusWrapping)[source]

Spin Correlations

class supervillain.observable.Spin_Spin[source]

Bases: Observable

We can deform \(Z_J \rightarrow Z_{J}[x,y]\) to include the creation of a boson at \(y\) and the destruction of a boson at \(x\) in the action. We define the expectation value

\[S_{x,y} = \frac{1}{Z_J} Z_J[x,y]\]

and reduce to a single relative coordinate

\[\texttt{Spin_Spin}_{\Delta x} = S_{\Delta x} = \frac{1}{\Lambda} \sum_x S_{x,x-\Delta x}\]

See also

The Worldline formulation of this observable is the trickiest observable we supply, and its implementation is nontrivial.

If you need a simpler-to-understand implementation see the reference implementation Spin_SpinSlow.

static Villain(S, phi)[source]

In the Villain formulation the correlator is just

\[S_{xy} = \left\langle e^{i(\phi_x - \phi_y)} \right\rangle\]
static Worldline(S, Links)[source]

By starting in the Villain formulation with a modified action

\[S' = \frac{\kappa}{2} \sum_{\ell} (d\phi - 2\pi n)_{\ell}^2 + i \sum_p J_p dn_p + i \phi_x - i \phi_y\]

we can Poisson resum \(n \rightarrow m\) as usual but the offset by the operator changes the constraint. Rather than requiring \(\delta m = 0\) everywhere we get \((\delta m)_z = \delta_{y,z} - \delta_{x,z}\),

\[\begin{split}\begin{align} Z_J[x,y] &= \sum Dm\; e^{-S_J[m]} \left[\delta m = 0 \text{ not on }x, y\right]\left[(\delta m)_x = -1 \right]\left[(\delta m)_y = +1 \right] \\ S_J[m] &= \frac{1}{2\kappa} \sum_\ell \left(m - \frac{\delta J}{2\pi}\right)_\ell^2 + \frac{|\ell|}{2} \ln (2\pi \kappa) - |x| \ln 2\pi \end{align}\end{split}\]

Now define \(\hat{m}_\ell = m_{\ell} - [P_{xy}]_\ell\) where \(P_{xy}\) traces any fixed path at all whatsoever from \(x\) to \(y\) and on any link \(P\) accumulates \(+1\) for every time the path traces along the link and \(-1\) every time the path traces against the link. For sites visited in the middle of the path \(P\) the constraint is maintained while at the endpoints it is violated in exactly the desired way.

Then we can change the integration variables from \(m\) to \(\hat{m}\) as long as we also change the action,

\[\begin{align} Z_J[x,y] &= \sum D\hat{m}\; e^{-S_J[\hat{m} + P_{xy}]} \left[\delta \hat{m} = 0 \text{ not on }x, y\right]\left[(\delta \hat{m})_x = 0 \right]\left[(\delta \hat{m})_y = 0 \right] \end{align}\]

with the same \(S_J\). Since in the hatted variables the constraint is satisfied, we can calculate this using constraint-obeying configurations (setting \(J=2\pi v/W\) for the constraint) and measuring the operator

\[\hat{S}_{xy} = \exp{\left[ - \frac{1}{2\kappa} \sum_{\ell \in P_{xy}} \left\{(\hat{m} - \delta v / W + P_{xy})_\ell^2 - (\hat{m} - \delta v / W)_\ell^2 \right\}\right]}\]

which is what we need to reweight to sampling according to \(S[\hat{m}]\) with no defect.

Note

The actual path \(P_{xy}\) used is irrelevant in expectation, though of course on a fixed configuration you get different measurements if you pick different paths. An implementation detail is that the fixed chosen path is the taxicab path that first covers the whole time separation and then the whole space separation. The point is that any other path can be reached by making a combination of PlaquetteUpdates and WrappingUpdates.

Clearly \(S_{xx}=1\), and we can normalize so that \(\texttt{Spin_Spin}_{\Delta x = 0} = 1\). The method provided in this observable are already naturally normalized. However, inline measurements like those provided by the worm are not, and can only be normalized after the bootstrap, which is why anything that depends on this observable is a DerivedQuantity.

static CriticalScalingDimension(S)[source]

Setting the scaling dimension \((WR)^2 / 2\) of a charge-W vortex operator to 2 yields \(R=2/W\). The corresponding scaling dimension of the spin operator \(e^{i\phi}\) is \(\Delta = (1R)^{-2}/2 = W^2/8\).

This is the critical scaling dimension of a single insertion, so the two-point Spin_Spin scales with twice this dimension at the critical point.

When \(W=\infty\) every \(\kappa>0\) is critical and \(\Delta_S = 2/R^2 = 2/2\pi \kappa = 1/\pi \kappa\).

class supervillain.observable.SpinSusceptibility[source]

Bases: DerivedQuantity

The spin susceptibility is the spacetime integral of the Spin_Spin correlator \(S_{\Delta x}\),

\[\texttt{SpinSusceptibility} = \chi_S = \int d^2r\; S(r).\]
static default(S, Spin_Spin)[source]
class supervillain.observable.SpinSusceptibilityScaled[source]

Bases: SpinSusceptibility

At the critical point and in the CFT the SpinSusceptibility has a known expected scaling that comes from the scaling dimension \(\Delta\) of \(e^{i\phi}\)

\[\chi_S \sim L^{2-2\Delta(\kappa)}.\]

where the scaling dimension at the critical coupling \(\kappa_c\) is known and depends on the constraint integer \(W\).

So, we scale the susceptibility by the CriticalScalingDimension(),

\[\texttt{SpinSusceptibilityScaled} = \chi_S / L^{2-2\Delta(\kappa_c)}\]

so that at the critical coupling the infinite-volume limit of SpinSusceptibilityScaled will be a constant.

Note

The 2 depends on being in 2 dimensions, while the \(2\Delta\) comes from the fact that the Spin_Spin is a two-point function.

static default(S, SpinSusceptibility)[source]
class supervillain.observable.SpinCriticalMoment[source]

Bases: DerivedQuantity

The critical moment of the spin correlator \(C_S\) is the volume-average of the correlator multiplied by its long-distance critical behavior,

\[C_S = \frac{1}{L^2} \int d^2r\; r^{2\Delta_S(\kappa_c, W)}\; S(r)\]

At the critical \(\kappa\) the long-distance behavior of the Spin_Spin correlator \(S\) decays with exactly the required power to cancel the explicit power of \(r\) and the integral cancels the normalization, giving 1 in the large-\(L\) limit.

In the gapped phase \(S\) decays exponentially with \(r\) and the integral converges, so \(C_S\) goes to 0 in the large-\(L\) limit.

In the CFT, \(S\) decays polynomially, but slower than the weight from the moment grows. The integral scales with a power larger than 2 and \(C_S\) diverges in the large-\(L\) limit.

static default(S, Spin_Spin)[source]

Vortex Correlations

class supervillain.observable.Vortex_Vortex[source]

Bases: Constrained, Observable

In the constrained model the vortex correlations are given by

\[V_{x,y} = \left\langle e^{2\pi i (v_x - v_y) / W}\right\rangle\]

and we can use translational invariance to reduce to a single relative coordinate

\[\texttt{Vortex_Vortex}_{\Delta x} = V_{\Delta x} = \frac{1}{\Lambda} \sum_x V_{x,x-\Delta x}\]
static Worldline(S, v)[source]

\(v\) is accessible only in the Worldline formulation.

static CriticalScalingDimension(S)[source]

The critical scaling dimension of the winding-\(w\) operator is \(R^2 w^2 / 2\). With the constraint that only charge \(W\) vortices are allowed as propagating excitations, at the phase transition \(R^2 W^2 / 2 = 2\), so that the critical \(R=2/W\).

What we want to know is the scaling dimension of the \(w=1\) operator, which at the phase transition is \(\Delta = (1R)^2/2 = 2/W^2\).

This is the critical scaling dimension of a single insertion, so the two-point Vortex_Vortex scales with twice this dimension at the critical point.

When \(W=\infty\) every \(\kappa>0\) is critical, and \(\Delta_V = 2R^2 = 2\times 2\pi \kappa = 4\pi \kappa\).

static Villain(S, Links)[source]

We can write \(V_{x,y}\) as the ratio of two partition functions,

\[\begin{split}\begin{align} V_{x,y} &= Z_0[x,y] / Z_0 \\ Z_J[x,y] &= \sum\hspace{-1.33em}\int D\phi\; Dn\; Dv\; e^{-S_J[\phi, n, v]} e^{2\pi i (v_x - v_y) / W} \\ S_J[\phi, n, v] &= \frac{\kappa}{2} \sum_{\ell} (d\phi - 2\pi n)_\ell^2 + 2\pi i \sum_p \left(v/W + J/2\pi \right)_p (dn)_p \end{align}\end{split}\]

where \(Z\) is the standard Villain partition function with action \(S\). The difference between \(Z[x,y]\) and \(Z\) is the insertion of the two-point exponential. We can absorb that difference into the \(v\) term in \(S\),

\[\begin{split}\begin{align} S_0'[\phi, n, v] &= \frac{\kappa}{2} \sum_{\ell} (d\phi - 2\pi n)_\ell^2 + 2\pi i \sum_p \left(v/W\right)_p (dn)_p + 2\pi i (v_x-v_y)/W \\ &= \frac{\kappa}{2} \sum_{\ell} (d\phi - 2\pi n)_\ell^2 + 2\pi i \sum_p \left(v/W\right)_p (dn_p + \delta_{xp} - \delta_{yp} ) \end{align}\end{split}\]

so integrating out \(v\) would now change the winding constraint to \([dn_p \equiv \delta_{yp} - \delta_{xp} \text{ mod } W]\).

Now define \(\hat{n} = n_{\ell} - [P_{xy}]_{\ell}\) for \(n\) satisfying the modified constraint and \(P\) defined as follows. Let \([\mathcal{P}_{xy}]_{\tilde{\ell}}\) trace any fixed path at all whatsoever on the dual lattice from \(\star y\) to \(\star x\), accumulating +1 when it traces along a dual link and -1 when it traces against a dual link. Then \([P_{xy}]_{\star\tilde{\ell}} = [\star\mathcal{P}_{xy}]_{\tilde{\ell}}\) and \(\hat{n}\) satisfies the original constraint.

Then we can change the integration variables from \(n\) to \(\hat{n}\) as long as we also change the action,

\[\begin{align} Z_J[x,y] &= \sum\hspace{-1.33em}\int D\phi\; D\hat{n}\; e^{-S_J[\phi, \hat{n} + P]} [d\hat{n} \equiv 0 \text{ mod } W] \end{align}\]

with the same \(S_J\). Since in the hatted variables the constraint is satisfied, we can calculate this using constraint-obeying configurations by reweighting,

\[\begin{align} Z_J[x,y] &= \sum\hspace{-1.33em}\int D\phi\; D\hat{n}\; e^{-S_J[\phi, \hat{n}]} e^{-(S_J[\phi, \hat{n} + P]-S_J[\phi, \hat{n}])} [d\hat{n} \equiv 0 \text{ mod } W] \end{align}\]

Or, in other words, we measure

\[ \begin{align} V_{x,y} &= \left\langle \hat{V}_{x,y} = e^{-(S_J[\phi, \hat{n} + P_{xy}]-S_J[\phi, \hat{n}])} \right\rangle \end{align}\]

in our standard ensemble.

Note

The actual path \(P_{xy}\) used is irrelevant in expectation, though of course on a fixed configuration you get different measurements if you pick different paths. An implementation detail is that the fixed chosen path is the taxicab path that first covers the whole time separation and then the whole space separation. The point is that any other path can be reached by making a combination of ExactUpdates and HolonomyUpdates.

Clearly \(V_{x,x}=1\), and we can normalize so that \(\texttt{Vortex_Vortex}_{\Delta x = 0} = 1\). The methods provided in this observable are already normalized. However, inline measurements like those provided by a worm are not, and can only be normalized after the bootstrap, which is why anything that depends on this observable is a DerivedQuantity.

class supervillain.observable.VortexSusceptibility[source]

Bases: DerivedQuantity

The vortex susceptibility is the spacetime integral of the Vortex_Vortex correlator \(V_{\Delta x}\),

\[\texttt{VortexSusceptibility} = \chi_V = \int d^2r\; V(r).\]
static default(S, Vortex_Vortex)[source]
class supervillain.observable.VortexSusceptibilityScaled[source]

Bases: VortexSusceptibility

At the critical point and in the CFT the VortexSusceptibility has a known expected scaling that comes from the scaling dimension \(\Delta\) of \(e^{2\pi i v/W}\).

\[\chi_V \sim L^{2-2\Delta(\kappa, W)}\]

where the scaling at the critical coupling \(\kappa_c\) is known and depends on the constraint integer \(W\).

So, we scale the susceptibility,

\[\texttt{VortexSusceptibilityScaled} = \chi_V / L^{2-2\Delta(\kappa_c, W)}\]

so that at the critical coupling the infinite-volume limit of VortexSusceptibilityScaled will be a constant.

Note

The 2 depends on being in 2 dimensions, while the \(2\Delta\) comes from the fact that the Vortex_Vortex correlator is a two-point function.

static default(S, VortexSusceptibility)[source]
class supervillain.observable.VortexCriticalMoment[source]

Bases: DerivedQuantity

The critical moment of the vortex correlator \(C_V\) is the volume-average of the correlator multiplied by its long-distance critical behavior,

\[C_V = \frac{1}{L^2} \int d^2r\; r^{2\Delta_V(\kappa_c, W)}\; V(r)\]

At the critical \(\kappa\) the long-distance behavior of the Vortex_Vortex correlator \(V\) decays with exactly the required power to cancel the explicit power of \(r\) and the integral cancels the normalization, giving 1 in the large-\(L\) limit.

In the gapped phase \(V\) decays exponentially with \(r\) and the integral converges, so \(C_V\) goes to 0 in the large-\(L\) limit.

In the CFT, \(V\) decays polynomially, but faster than the weight from the moment grows. The integral scales with a power less than 2 and \(C_V\) again goes to 0 in the large-\(L\) limit.

static default(S, Vortex_Vortex)[source]