diff --git a/src/gnu/CMakeLists.txt b/src/gnu/CMakeLists.txt index 3442a19f03..a8da27eb2d 100644 --- a/src/gnu/CMakeLists.txt +++ b/src/gnu/CMakeLists.txt @@ -1,5 +1,6 @@ add_library( nrngnu STATIC + Geom.cpp HypGeom.cpp MCellRan4RNG.cpp mcran4.cpp diff --git a/src/gnu/Geom.cpp b/src/gnu/Geom.cpp new file mode 100755 index 0000000000..6f90799e3b --- /dev/null +++ b/src/gnu/Geom.cpp @@ -0,0 +1,29 @@ +/* +Copyright (C) 1988 Free Software Foundation + written by Dirk Grunwald (grunwald@cs.uiuc.edu) + +This file is part of the GNU C++ Library. This library is free +software; you can redistribute it and/or modify it under the terms of +the GNU Library General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your +option) any later version. This library is distributed in the hope +that it will be useful, but WITHOUT ANY WARRANTY; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU Library General Public License for more details. +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the Free Software +Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +*/ +#ifdef __GNUG__ +#pragma implementation +#endif +#include "Random.h" +#include "Geom.h" + +double Geometric::operator()() +{ + int samples; + for (samples = 1; pGenerator -> asDouble() < pMean; samples++); + return((double) samples); +} + diff --git a/src/gnu/Geom.h b/src/gnu/Geom.h new file mode 100755 index 0000000000..cc0d8dcee6 --- /dev/null +++ b/src/gnu/Geom.h @@ -0,0 +1,44 @@ +// This may look like C code, but it is really -*- C++ -*- +/* +Copyright (C) 1988 Free Software Foundation + written by Dirk Grunwald (grunwald@cs.uiuc.edu) + +This file is part of the GNU C++ Library. This library is free +software; you can redistribute it and/or modify it under the terms of +the GNU Library General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your +option) any later version. This library is distributed in the hope +that it will be useful, but WITHOUT ANY WARRANTY; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU Library General Public License for more details. +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the Free Software +Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +*/ +#pragma once +#include "Random.h" + +class Geometric: public Random { +protected: + double pMean; +public: + Geometric(double mean, RNG *gen); + + double mean(); + double mean(double x); + + virtual double operator()(); + +}; + + +inline Geometric::Geometric(double mean, RNG *gen) : Random(gen) +{ + pMean = mean; +} + + +inline double Geometric::mean() { return pMean; } +inline double Geometric::mean(double x) { + double tmp = pMean; pMean = x; return tmp; +} diff --git a/src/gnu/distributions.hpp b/src/gnu/distributions.hpp index c633c8891c..e8669326e5 100644 --- a/src/gnu/distributions.hpp +++ b/src/gnu/distributions.hpp @@ -46,20 +46,6 @@ class Erlang: public Random { std::gamma_distribution<> d; }; -class Geometric: public Random { -public: - Geometric(double mean, RNG *gen) - : Random(gen) - , d(1 / (mean + 1)) - {} - - double operator()() override { - return 1. + d(*generator()); - } -private: - std::geometric_distribution<> d; -}; - class LogNormal: public Random { public: LogNormal(double mean, double variance, RNG *gen) diff --git a/src/ivoc/ivocrand.cpp b/src/ivoc/ivocrand.cpp index feba848244..a823de07b4 100644 --- a/src/ivoc/ivocrand.cpp +++ b/src/ivoc/ivocrand.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include