It would be great to be able to just get the autocorrelation time of an ensemble. I've written code to loop over observables and take the max autocorrelation time a bunch of times, enough for it to deserve its own method.
In an ideal world probably we would just be able to do ensemble.autocorrelation_time() and have the autocorrelation computed. You could imagine specifying a cut parameter to allow for thermalization; non-thermalized samples skew the autocorrelation.
It would also be good to be able to say eg. ensemble.autocorrelation_time('InternalEnergyDensity', 'ActionDensity', 'SpinSusceptibility') and get the autocorrelation of those observables only.
There are a variety of puzzles / considerations:
For simplicity it probably makes sense to only consider scalar observables, not two-point functions.
Some observables should be omitted for certain parameter values. For example, if W=1 then the Vortex_Vortex correlator is automatically 1 independent of separation and has no fluctuations at all. But that's expected, you shouldn't say the autocorrelation time is infinite. You could never generate a W=1 ensemble with fluctuating VortexSusceptibility even given infinite computing, it's physically meaningless.
Computing the autocorrelation time probably shouldn't trigger the evaluation of all (any?) observables. For example, some reference implementations like SlowSpin_Spin would be very costly and slow, and it's pointless given that it matches the speedier Spin_Spin. Partially solved by #77.
This probably requires modifying the Observable class; and perhaps subclassing Scalar, TwoPoint, and other kinds of observables (though maybe we could just infer from the shape of a single observable).
It would be great to be able to just get the autocorrelation time of an ensemble. I've written code to loop over observables and take the max autocorrelation time a bunch of times, enough for it to deserve its own method.
In an ideal world probably we would just be able to do
ensemble.autocorrelation_time()
and have the autocorrelation computed. You could imagine specifying acut
parameter to allow for thermalization; non-thermalized samples skew the autocorrelation.It would also be good to be able to say eg.
ensemble.autocorrelation_time('InternalEnergyDensity', 'ActionDensity', 'SpinSusceptibility')
and get the autocorrelation of those observables only.There are a variety of puzzles / considerations:
VortexSusceptibility
even given infinite computing, it's physically meaningless.SlowSpin_Spin
would be very costly and slow, and it's pointless given that it matches the speedierSpin_Spin
. Partially solved by #77.This probably requires modifying the Observable class; and perhaps subclassing Scalar, TwoPoint, and other kinds of observables (though maybe we could just infer from the shape of a single observable).