[][src]Trait qmc::sse::qmc_traits::semi_classical::ClassicalLoopUpdater

pub trait ClassicalLoopUpdater: DiagonalUpdater + Factory<Vec<bool>> + Factory<Vec<usize>> + Factory<BondContainer<usize>> {
    fn var_ever_flips(&self, var: usize) -> bool;

    fn run_semiclassical_edge_update<R: Rng, EN: EdgeNavigator>(
        &mut self,
        edges: &EN,
        state: &mut [bool],
        rng: R
    ) -> (usize, bool) { ... }
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
, { ... }
fn count_ops_on_border(
        &self,
        sat_set: &BondContainer<usize>,
        broken_set: &BondContainer<usize>
    ) -> (usize, usize) { ... }
fn post_semiclassical_update_hook(&mut self) { ... } }

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.

Loading content...

Provided methods

fn run_semiclassical_edge_update<R: Rng, EN: EdgeNavigator>(
    &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

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)

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.

Loading content...

Implementors

impl ClassicalLoopUpdater for SimpleOpDiagonal[src]

impl<O: Op + Clone> ClassicalLoopUpdater for FastOpsTemplate<O>[src]

Loading content...