1#ifndef UTIL_AUTO_CORR_ARRAY_H
2#define UTIL_AUTO_CORR_ARRAY_H
11#include <util/param/ParamComposite.h>
12#include <util/containers/DArray.h>
13#include <util/containers/RingBuffer.h>
15#include <util/accumulators/setToZero.h>
16#include <util/accumulators/product.h>
17#include <util/containers/Array.h>
18#include <util/space/Vector.h>
19#include <util/format/Int.h>
20#include <util/format/Dbl.h>
28 template <
typename>
class Array;
56 template <
typename Data,
typename Product>
128 void output(std::ostream& out);
136 template <
class Archive>
137 void serialize(Archive& ar,
const unsigned int version);
179 int ensembleCapacity_;
204 template <
typename Data,
typename Product>
209 ensembleCapacity_(0),
221 template <
typename Data,
typename Product>
228 template <
typename Data,
typename Product>
231 read<int>(in,
"ensembleCapacity", ensembleCapacity_);
232 read<int>(in,
"bufferCapacity", bufferCapacity_);
233 nEnsemble_ = ensembleCapacity_;
240 template <
typename Data,
typename Product>
243 ensembleCapacity_ = ensembleCapacity;
244 bufferCapacity_ = bufferCapacity;
246 nEnsemble_ = ensembleCapacity;
252 template <
typename Data,
typename Product>
255 loadParameter<int>(ar,
"ensembleCapacity", ensembleCapacity_);
256 loadParameter<int>(ar,
"bufferCapacity", bufferCapacity_);
268 template <
typename Data,
typename Product>
275 template <
typename Data,
typename Product>
278 if (ensembleCapacity_ == 0) {
279 UTIL_THROW(
"No memory has been allocated: ensembleCapacity_ == 0");
281 if (nEnsemble > ensembleCapacity_) {
284 nEnsemble_ = nEnsemble;
290 template <
typename Data,
typename Product>
295 if (bufferCapacity_ > 0) {
297 for (i = 0; i < bufferCapacity_; ++i) {
301 for (i = 0; i < ensembleCapacity_; ++i) {
310 template <
typename Data,
typename Product>
313 if (bufferCapacity_ > 0) {
315 corr_.allocate(bufferCapacity_);
316 nCorr_.allocate(bufferCapacity_);
319 buffers_.allocate(ensembleCapacity_);
320 for (
int i=0; i < ensembleCapacity_; ++i) {
321 buffers_[i].allocate(bufferCapacity_);
330 template <
typename Data,
typename Product>
336 for (i = 0; i < nEnsemble_; ++i) {
338 buffers_[i].append(values[i]);
341 int bufferSize = buffers_[0].size();
342 for (j=0; j < bufferSize; ++j) {
343 for (i = 0; i < nEnsemble_; ++i) {
344 corr_[j] +=
product(buffers_[i][j], values[i]);
353 template <
typename Data,
typename Product>
355 {
return bufferCapacity_; }
360 template <
typename Data,
typename Product>
362 {
return nEnsemble_; }
367 template <
typename Data,
typename Product>
374 template <
typename Data,
typename Product>
378 ave /= double(nSample_*nEnsemble_);
385 template <
typename Data,
typename Product>
394 int bufferSize = buffers_[0].size();
395 for (
int i = 0; i < bufferSize; ++i) {
396 autocorr = corr_[i]/double(nCorr_[i]*nEnsemble_);
399 outFile <<
Int(i) <<
Dbl(autocorr) << std::endl;
406 template <
typename Data,
typename Product>
410 Product aveSq, variance, autocorr, sum;
411 int bufferSize = buffers_[0].size();
415 ave /= double(nSample_*nEnsemble_);
417 variance = corr_[0]/double(nCorr_[0]*nEnsemble_);
418 variance = variance - aveSq;
422 for (
int i = 1; i < bufferSize/2; ++i) {
423 autocorr = corr_[i]/double(nCorr_[i]*nEnsemble_);
424 autocorr = autocorr - aveSq;
434 template <
typename Data,
typename Product>
435 template <
class Archive>
437 const unsigned int version)
439 ar & ensembleCapacity_;
440 ar & bufferCapacity_;
Array container class template.
Auto-correlation function for an ensemble of sequences.
double corrTime() const
Numerical integral of autocorrelation function.
int nEnsemble() const
Return nEnsemble.
~AutoCorrArray()
Default destructor.
void output(std::ostream &out)
Output the autocorrelation function.
void serialize(Archive &ar, const unsigned int version)
Serialize this AutoCorrArray to/from an archive.
int bufferCapacity() const
Return maximum number of samples in history for each sequence.
void setNEnsemble(int nEnsemble)
Set actual number of sequences in ensemble.
void setParam(int ensembleCapacity, int bufferCapacity)
Allocate memory, and clear history.
Data average() const
Return average of sampled values.
int nSample() const
Return the total number of samples per sequence thus far.
void sample(const Array< Data > &values)
Sample an array of current values.
virtual void readParameters(std::istream &in)
Read parameters, allocate memory and clear history.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
AutoCorrArray()
Default constructor.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
void clear()
Reset to empty state.
Saving archive for binary istream.
Saving / output archive for binary ostream.
Dynamically allocatable contiguous array template.
Wrapper for a double precision number, for formatted ostream output.
Wrapper for an int, for formatted ostream output.
An object that can read multiple parameters from file.
void setClassName(const char *className)
Set class name string.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
Utility classes for scientific computation.
void setToZero(int &value)
Set an int variable to zero.
float product(float a, float b)
Product for float Data.