# Concepts

## Introduction & Motivations

• Purpose:

The purpose of this little class is too facilitate the writing and maintenance of Metropolis MonteCarlo algorithms, with several advantages :

• Easy to add new moves and measures.

• For complex MC algorithms, with 6 or 7 different moves, it helps to clearly separate the code for each move.

• Parallelism is automatic.

• The random generator is a simple parameter, it can be chosen dynamically.

• Principle

The mc_generic class is a generic version of the algorithms, with moves and measures. The user :

• writes move classes, modelling the Move concept.

• writes measure classes, modelling the Measure concepts.

• register them in a mc_generic object MC

• call MC.warmup_and_accumulate(…) … and that is (almost) it !

## The Move concept

Elements

Comment

• mc_sign_type attempt()

• First part of the Move.

• Returns the probability to accept the move. If :

• the move is $$x\rightarrow x'$$, proposed with proba $$T_{x\rightarrow x'}$$

• the probability of the $$x$$ config is denoted $$p_x$$

• then attempt should return the Metropolis ratio:

$\frac{p_{x'} T_{x'\rightarrow x}}{p_x T_{x\rightarrow x'}}$

with the sign. (The sign will be separated from the absolute value and kept by the MonteCarlo class). In other words: attempt() = move_sign * move_rate with abs(move_sign) = 1

• mc_sign_type accept()

• Called iif the Move is accepted.

• Returns a number r such that $$|r| =1$$

• There is a possibility to update the sign here as well, so that the final sign is: move_sign * accept()

• CAREFUL that we need the ratio new_sign / old_sign here just like we needed a ratio in attempt()

• void reject()

• Called iif the Move is rejected (for cleaning).

## The Measure concept

Elements

Comment

• void accumulate(std::complex<double> sign)

• Accumulation with the sign

• void collect_results ( boost::mpi::communicator const & c)

• Collects the results over the communicator, and finalize the calculation (compute average, error).