[−][src]Trait qmc::sse::qmc_traits::semi_classical::ClassicalLoopUpdater
This does an SSE equivalent of the classical dimer loop update. Requires ising symmetry and a set of bonds which are equivalent but either sat or broken.
Required methods
fn var_ever_flips(&self, var: usize) -> bool
Check if variable is ever flipped by an offdiagonal op.
Provided methods
fn run_semiclassical_edge_update<R: Rng, EN: EdgeNavigator>(
&mut self,
edges: &EN,
state: &mut [bool],
rng: R
) -> (usize, bool)
&mut self,
edges: &EN,
state: &mut [bool],
rng: R
) -> (usize, bool)
Perform an edge update, return size of cluster and whether it was flipped.
fn run_semiclassical_update<R: Rng, EN: EdgeNavigator, F>(
&mut self,
edges: &EN,
bond_select: F,
state: &mut [bool],
rng: R
) -> (usize, bool) where
F: Fn(&mut Self, &[bool], &mut [bool], &mut BondContainer<usize>, &mut BondContainer<usize>, &mut R) -> usize,
&mut self,
edges: &EN,
bond_select: F,
state: &mut [bool],
rng: R
) -> (usize, bool) where
F: Fn(&mut Self, &[bool], &mut [bool], &mut BondContainer<usize>, &mut BondContainer<usize>, &mut R) -> usize,
Use a function bond_select to select a region of variables and the bordering bonds, then
perform a semiclassical update on those variables by flipping them and rearranging ops on
the bonds. The function bond_select must take the current state, a mutable array giving
whether variables are in the cluster to be flipped, and two mutable BondContainers which
should be filled with bonds on the border of the cluster which are broken or unbroken and
of equal weight, then must return the size of the cluster.
See run_semiclassical_edge_update
for an implementation.
fn count_ops_on_border(
&self,
sat_set: &BondContainer<usize>,
broken_set: &BondContainer<usize>
) -> (usize, usize)
&self,
sat_set: &BondContainer<usize>,
broken_set: &BondContainer<usize>
) -> (usize, usize)
Count the number of bonds on border which belong to set_set and broken_set.
fn post_semiclassical_update_hook(&mut self)
Called after an update.
Implementors
impl<O: Op + Clone> ClassicalLoopUpdater for FastOpsTemplate<O>
[src]
fn var_ever_flips(&self, var: usize) -> bool
[src]
fn count_ops_on_border(
&self,
sat_set: &BondContainer<usize>,
broken_set: &BondContainer<usize>
) -> (usize, usize)
[src]
&self,
sat_set: &BondContainer<usize>,
broken_set: &BondContainer<usize>
) -> (usize, usize)