246 #ifndef __libfbm_hpp__
247 #define __libfbm_hpp__
252 #include <gsl/gsl_rng.h>
258 #define LIBFBM_MAX_DIM 8
268 virtual void setSeed(
unsigned long int seed) = 0;
269 virtual double next() = 0;
292 void setSeed(
unsigned long int seed);
315 void setSeed(
unsigned long int seed);
330 _Cache(
const std::string& cacheDir,
const std::string& cacheName,
size_t cacheSize);
334 void store(
const std::vector<double>& data);
336 size_t size()
const {
return cacheSize; }
338 bool inMemory()
const {
return !data.empty(); }
341 std::vector<double> data;
343 std::string cacheDir;
344 std::string cacheName;
347 _Cache(
const _Cache& copy);
348 const _Cache& operator=(
const _Cache& copy);
350 friend class _CacheReader;
358 _CacheReader(_Cache& cache,
size_t bufferSize);
360 inline double operator[](
size_t i)
362 if ( !buf.empty() && (i < bufpos || i - bufpos >= buf.size()) )
364 return data[i - bufpos];
369 std::vector<double> buf;
382 inline zvec(
size_t dim) : clen(dim) { }
385 inline const int&
operator[](
size_t i)
const {
return c[i]; }
387 inline size_t size()
const {
return clen; }
393 for (
size_t i = 0; i <
size(); i++ )
395 if ( c[i] < base - 1 )
397 for (
size_t j = 0; j < i; j++ )
411 for (
size_t i = 0; i <
size(); i++ )
413 if ( c[i] < dim[i] - 1 )
415 for (
size_t j = 0; j < i; j++ )
429 for (
size_t i = 0; i <
size(); i++ )
433 if ( c[i] < dim[i] - 1 )
435 for (
size_t j = 0; j < i; j++ )
445 inline size_t index(
size_t base)
const
449 for (
size_t i = 0; i <
size(); i++ )
462 for (
size_t i = 0; i <
size(); i++ )
473 for (
size_t i = 0; i <
size(); i++ )
480 for (
size_t i = 0; i < l.
size(); i++ )
481 ret[i] = l[i] + r[i];
488 for (
size_t i = 0; i < l.
size(); i++ )
489 ret[i] = l[i] - r[i];
496 for (
size_t i = 0; i < v.
size(); i++ )
504 for (
size_t i = 0; i < v.
size(); i++ )
510 int c[LIBFBM_MAX_DIM];
538 virtual double cov(
const zvec& p) = 0;
561 void initCache(
bool forceRecalc =
false);
578 zvec fieldDim, userDim;
580 std::string cacheDir;
581 std::string cacheName;
670 size_t index = (size_t)2 * p[0];
671 for (
size_t i = 1; i < p.
size(); i++ )
672 index += muls[i] * p[i];
676 {
return datap[2 * x]; }
678 {
return datap[2 * x + muls[1] * y]; }
680 {
return datap[2 * x + muls[1] * y + muls[2] * z]; }
681 inline double operator()(
size_t x,
size_t y,
size_t z,
size_t u)
const
682 {
return datap[2 * x + muls[1] * y + muls[2] * z + muls[3] * u]; }
683 inline double operator()(
size_t x,
size_t y,
size_t z,
size_t u,
size_t v)
const
684 {
return datap[2 * x + muls[1] * y + muls[2] * z + muls[3] * u + muls[4] * v]; }
699 size_t index = 2 * p[0];
700 for (
size_t i = 1; i < p.
size(); i++ )
701 index += muls[i] * p[i];
705 inline const double&
at(
const zvec& p)
const
707 size_t index = 2 * p[0];
708 for (
size_t i = 1; i < p.
size(); i++ )
709 index += muls[i] * p[i];
722 bool allowCorrelated;
724 std::vector<double> Z;
727 size_t muls[LIBFBM_MAX_DIM];
764 FBMSteinContext(
double H,
size_t dim,
size_t size,
double Rhint = -1,
bool mapDim =
true);
775 double getR()
const {
return R; }
792 static double getRForH(
double H,
double Rhint = -1);
803 #endif // !__libfbm_hpp__