Evaluables
In addition to simply calculating the averages of some observables in your Monte Carlo simulations, sometimes you are also interested in quantities that are functions of these observables, such as the Binder cumulant which is related to the ratio of moments of the magnetization.
This presents two problems. First, estimating the errors of such quantities is not trivial due to correlations. Second, simply computing functions of quantities with errorbars incurs a bias.
Luckily, Carlo can help you with this by letting you define such quantities – we call them evaluables – in the Carlo.register_evaluables(YourMC, eval, params)
function.
This function gets an AbstractEvaluator
which can be used to
Carlo.evaluate!
— Functionevaluate!(func::Function, eval::AbstractEvaluator, name::Symbol, (ingredients::Symbol...))
Define an evaluable called name
, i.e. a quantity depending on the observable averages ingredients...
. The function func
will get the ingredients as parameters and should return the value of the evaluable. Carlo will then perform jackknifing to calculate a bias-corrected result with correct error bars that appears together with the observables in the result file.
Example
This is an example for a register_evaluables
implementation for a model of a magnet.
using Carlo
function Carlo.register_evaluables(
::Type{YourMC},
eval::AbstractEvaluator,
params::AbstractDict,
)
T = params[:T]
Lx = params[:Lx]
Ly = get(params, :Ly, Lx)
evaluate!(eval, :Susceptibility, (:Magnetization2,)) do mag2
return Lx * Ly * mag2 / T
end
evaluate!(eval, :BinderRatio, (:Magnetization2, :Magnetization4)) do mag2, mag4
return mag2 * mag2 / mag4
end
return nothing
end
Note that this code is called after the simulation is over, so there is no way to access the simulation state. However, it is possible to get the needed information about the system (e.g. temperature, system size) from the task parameters params
.