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;
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_) {
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) {
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_;
void sample(const Array< Data > &values)
Sample an array of current values.
float product(float a, float b)
Product for float Data.
void setParam(int ensembleCapacity, int bufferCapacity)
Allocate memory, and clear history.
Wrapper for a double precision number, for formatted ostream output.
Array container class template.
~AutoCorrArray()
Default destructor.
Saving / output archive for binary ostream.
Auto-correlation function for an ensemble of sequences.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
void output(std::ostream &out)
Output the autocorrelation function.
int nSample() const
Return the total number of samples per sequence thus far.
void setToZero(int &value)
Set an int variable to zero.
Utility classes for scientific computation.
AutoCorrArray()
Default constructor.
void serialize(Archive &ar, const unsigned int version)
Serialize this AutoCorrArray to/from an archive.
Wrapper for an int, for formatted ostream output.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
virtual void readParameters(std::istream &in)
Read parameters, allocate memory and clear history.
void clear()
Reset to empty state.
int bufferCapacity() const
Return maximum number of samples in history for each sequence.
Dynamically allocatable contiguous array template.
Saving archive for binary istream.
double corrTime() const
Numerical integral of autocorrelation function.
Data average() const
Return average of sampled values.
void setClassName(const char *className)
Set class name string.
void allocate(int capacity)
Allocate the underlying C array.
int nEnsemble() const
Return nEnsemble.
An object that can read multiple parameters from file.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
void setNEnsemble(int nEnsemble)
Set actual number of sequences in ensemble.