#ifndef _CUCACHE_H_ #define _CUCACHE_H_ #include "Matrix.h" namespace TNet { /** * The feature-target pair cache */ class Cache { typedef enum { EMPTY, INTAKE, FULL, EXHAUST } State; public: Cache(); ~Cache(); /// Initialize the cache void Init(size_t cachesize, size_t bunchsize, long int seed = 0); /// Add data to cache, returns number of added vectors void AddData(const Matrix& rFeatures, const Matrix& rDesired); /// Randomizes the cache void Randomize(); /// Get the bunch of training data void GetBunch(Matrix& rFeatures, Matrix& rDesired); /// Returns true if the cache was completely filled bool Full() { return (mState == FULL); } /// Returns true if the cache is empty bool Empty() { return (mState == EMPTY || mIntakePos < mBunchsize); } /// Number of discarded frames int Discarded() { return mDiscarded; } /// Set the trace message level void Trace(int trace) { mTrace = trace; } private: static long int GenerateRandom(int max) { return lrand48() % max; } State mState; ///< Current state of the cache size_t mIntakePos; ///< Number of intaken vectors by AddData size_t mExhaustPos; ///< Number of exhausted vectors by GetBunch size_t mCachesize; ///< Size of cache size_t mBunchsize; ///< Size of bunch int mDiscarded; ///< Number of discarded frames Matrix mFeatures; ///< Feature cache Matrix mFeaturesRandom; ///< Feature cache Matrix mFeaturesLeftover; ///< Feature cache Matrix mDesired; ///< Desired vector cache Matrix mDesiredRandom; ///< Desired vector cache Matrix mDesiredLeftover; ///< Desired vector cache bool mRandomized; int mTrace; }; } #endif