Mercurial > octave
diff liboctave/numeric/oct-rand.h @ 25433:49e0447413ad
use templates and move rand functions inside octave namespace
* oct-rand.h, oct-rand.cc (rand): Move class inside octave namespace
and rename from octave_rand. Use templates to eliminate duplicate
code. Change all uses.
* randgamma.h, randgamma.cc, randmtzig.h, randmtzig.cc, randpoisson.h,
randpoisson.cc: Move functions inside Octave namespace.
Use templates to eliminate duplicate code. Change all uses.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 17 Mar 2018 07:02:30 -0500 |
parents | 6652d3823428 |
children | f23f27e78aa2 00f796120a6d |
line wrap: on
line diff
--- a/liboctave/numeric/oct-rand.h Wed Jun 06 14:07:04 2018 +0200 +++ b/liboctave/numeric/oct-rand.h Sat Mar 17 07:02:30 2018 -0500 @@ -36,247 +36,262 @@ //class dim_vector; -class -OCTAVE_API -octave_rand +namespace octave { -protected: - - octave_rand (void); - -public: - - ~octave_rand (void) = default; - - static bool instance_ok (void); - - // Return the current seed. - static double seed (void) - { - return instance_ok () ? instance->do_seed () - : octave::numeric_limits<double>::NaN (); - } - - // Set the seed. - static void seed (double s) - { - if (instance_ok ()) - instance->do_seed (s); - } - - // Reset the seed. - static void reset (void) - { - if (instance_ok ()) - instance->do_reset (); - } - - // Return the current state. - static uint32NDArray state (const std::string& d = "") - { - return instance_ok () ? instance->do_state (d) : uint32NDArray (); - } - - // Set the current state/ - static void state (const uint32NDArray& s, - const std::string& d = "") - { - if (instance_ok ()) - instance->do_state (s, d); - } - - // Reset the current state/ - static void reset (const std::string& d) - { - if (instance_ok ()) - instance->do_reset (d); - } - - // Return the current distribution. - static std::string distribution (void) + class OCTAVE_API rand { - return instance_ok () ? instance->do_distribution () : ""; - } + protected: + + rand (void); + + public: + + ~rand (void) = default; + + static bool instance_ok (void); - // Set the current distribution. May be either "uniform" (the - // default), "normal", "exponential", "poisson", or "gamma". - static void distribution (const std::string& d) - { - if (instance_ok ()) - instance->do_distribution (d); - } + // Return the current seed. + static double seed (void) + { + return instance_ok () ? instance->do_seed () + : octave::numeric_limits<double>::NaN (); + } + + // Set the seed. + static void seed (double s) + { + if (instance_ok ()) + instance->do_seed (s); + } - static void uniform_distribution (void) - { - if (instance_ok ()) - instance->do_uniform_distribution (); - } + // Reset the seed. + static void reset (void) + { + if (instance_ok ()) + instance->do_reset (); + } + + // Return the current state. + static uint32NDArray state (const std::string& d = "") + { + return instance_ok () ? instance->do_state (d) : uint32NDArray (); + } - static void normal_distribution (void) - { - if (instance_ok ()) - instance->do_normal_distribution (); - } + // Set the current state/ + static void state (const uint32NDArray& s, + const std::string& d = "") + { + if (instance_ok ()) + instance->do_state (s, d); + } - static void exponential_distribution (void) - { - if (instance_ok ()) - instance->do_exponential_distribution (); - } + // Reset the current state/ + static void reset (const std::string& d) + { + if (instance_ok ()) + instance->do_reset (d); + } + + // Return the current distribution. + static std::string distribution (void) + { + return instance_ok () ? instance->do_distribution () : ""; + } - static void poisson_distribution (void) - { - if (instance_ok ()) - instance->do_poisson_distribution (); - } + // Set the current distribution. May be either "uniform" (the + // default), "normal", "exponential", "poisson", or "gamma". + static void distribution (const std::string& d) + { + if (instance_ok ()) + instance->do_distribution (d); + } + + static void uniform_distribution (void) + { + if (instance_ok ()) + instance->do_uniform_distribution (); + } - static void gamma_distribution (void) - { - if (instance_ok ()) - instance->do_gamma_distribution (); - } + static void normal_distribution (void) + { + if (instance_ok ()) + instance->do_normal_distribution (); + } + + static void exponential_distribution (void) + { + if (instance_ok ()) + instance->do_exponential_distribution (); + } + + static void poisson_distribution (void) + { + if (instance_ok ()) + instance->do_poisson_distribution (); + } - // Return the next number from the sequence. - static double scalar (double a = 1.0) - { - return instance_ok () ? instance->do_scalar (a) - : octave::numeric_limits<double>::NaN (); - } + static void gamma_distribution (void) + { + if (instance_ok ()) + instance->do_gamma_distribution (); + } + + // Return the next number from the sequence. + static double scalar (double a = 1.0) + { + return instance_ok () ? instance->do_scalar (a) + : octave::numeric_limits<double>::NaN (); + } - // Return the next number from the sequence. - static float float_scalar (float a = 1.0) - { - return instance_ok () ? instance->do_float_scalar (a) - : octave::numeric_limits<float>::NaN (); - } + // Return the next number from the sequence. + static float float_scalar (float a = 1.0) + { + return instance_ok () ? instance->do_scalar (a) + : octave::numeric_limits<float>::NaN (); + } - // Return an array of numbers from the sequence. - static Array<double> vector (octave_idx_type n, double a = 1.0) - { - return instance_ok () ? instance->do_vector (n, a) : Array<double> (); - } + // Return an array of numbers from the sequence. + static Array<double> vector (octave_idx_type n, double a = 1.0) + { + return instance_ok () ? instance->do_vector (n, a) : Array<double> (); + } + + // Return an array of numbers from the sequence. + static Array<float> float_vector (octave_idx_type n, float a = 1.0) + { + return instance_ok () ? instance->do_vector (n, a) : Array<float> (); + } - // Return an array of numbers from the sequence. - static Array<float> float_vector (octave_idx_type n, float a = 1.0) - { - return instance_ok () ? instance->do_float_vector (n, a) : Array<float> (); - } + // Return an N-dimensional array of numbers from the sequence, + // filled in column major order. + static NDArray nd_array (const dim_vector& dims, double a = 1.0) + { + return instance_ok () ? instance->do_nd_array (dims, a) : NDArray (); + } - // Return an N-dimensional array of numbers from the sequence, - // filled in column major order. - static NDArray nd_array (const dim_vector& dims, double a = 1.0) - { - return instance_ok () ? instance->do_nd_array (dims, a) : NDArray (); - } + // Return an N-dimensional array of numbers from the sequence, + // filled in column major order. + static FloatNDArray float_nd_array (const dim_vector& dims, float a = 1.0) + { + return instance_ok () ? instance->do_float_nd_array (dims, a) + : FloatNDArray (); + } - // Return an N-dimensional array of numbers from the sequence, - // filled in column major order. - static FloatNDArray float_nd_array (const dim_vector& dims, float a = 1.0) - { - return instance_ok () ? instance->do_float_nd_array (dims, a) - : FloatNDArray (); - } + private: + + static rand *instance; + + static void cleanup_instance (void) { delete instance; instance = nullptr; } -private: - - static octave_rand *instance; - - static void cleanup_instance (void) { delete instance; instance = nullptr; } + enum + { + unknown_dist, + uniform_dist, + normal_dist, + expon_dist, + poisson_dist, + gamma_dist + }; - enum - { - unknown_dist, - uniform_dist, - normal_dist, - expon_dist, - poisson_dist, - gamma_dist - }; + // Current distribution of random numbers. + int current_distribution; - // Current distribution of random numbers. - int current_distribution; + // If TRUE, use old RANLIB generators. Otherwise, use Mersenne + // Twister generator. + bool use_old_generators; + + // Saved MT states. + std::map<int, uint32NDArray> rand_states; + + // Return the current seed. + double do_seed (void); - // If TRUE, use old RANLIB generators. Otherwise, use Mersenne - // Twister generator. - bool use_old_generators; + // Set the seed. + void do_seed (double s); - // Saved MT states. - std::map<int, uint32NDArray> rand_states; + // Reset the seed. + void do_reset (); + + // Return the current state. + uint32NDArray do_state (const std::string& d); - // Return the current seed. - double do_seed (void); - - // Set the seed. - void do_seed (double s); + // Set the current state/ + void do_state (const uint32NDArray& s, const std::string& d); - // Reset the seed. - void do_reset (); + // Reset the current state/ + void do_reset (const std::string& d); - // Return the current state. - uint32NDArray do_state (const std::string& d); + // Return the current distribution. + std::string do_distribution (void); - // Set the current state/ - void do_state (const uint32NDArray& s, const std::string& d); + // Set the current distribution. May be either "uniform" (the + // default), "normal", "exponential", "poisson", or "gamma". + void do_distribution (const std::string& d); - // Reset the current state/ - void do_reset (const std::string& d); + void do_uniform_distribution (void); - // Return the current distribution. - std::string do_distribution (void); + void do_normal_distribution (void); + + void do_exponential_distribution (void); - // Set the current distribution. May be either "uniform" (the - // default), "normal", "exponential", "poisson", or "gamma". - void do_distribution (const std::string& d); + void do_poisson_distribution (void); - void do_uniform_distribution (void); + void do_gamma_distribution (void); - void do_normal_distribution (void); - - void do_exponential_distribution (void); + // The following templates only make sense for double and float + // types. - void do_poisson_distribution (void); + template <typename T> T uniform (void); - void do_gamma_distribution (void); + template <typename T> T normal (void); + + template <typename T> T exponential (void); - // Return the next number from the sequence. - double do_scalar (double a = 1.); + template <typename T> T poisson (T a); + + template <typename T> T gamma (T a); - // Return the next number from the sequence. - float do_float_scalar (float a = 1.); + // Return the next number from the sequence. + template <typename T> T do_scalar (T a = 1); - // Return an array of numbers from the sequence. - Array<double> do_vector (octave_idx_type n, double a = 1.); + // Return an array of numbers from the sequence. + template <typename T> Array<T> do_vector (octave_idx_type n, T a = 1); - // Return an array of numbers from the sequence. - Array<float> do_float_vector (octave_idx_type n, float a = 1.); + // Return an N-dimensional array of numbers from the sequence, + // filled in column major order. + NDArray do_nd_array (const dim_vector& dims, double a = 1.); - // Return an N-dimensional array of numbers from the sequence, - // filled in column major order. - NDArray do_nd_array (const dim_vector& dims, double a = 1.); + // Return an N-dimensional array of numbers from the sequence, + // filled in column major order. + FloatNDArray do_float_nd_array (const dim_vector& dims, float a = 1.); - // Return an N-dimensional array of numbers from the sequence, - // filled in column major order. - FloatNDArray do_float_nd_array (const dim_vector& dims, float a = 1.); + // Some helper functions. + + void initialize_ranlib_generators (void); - // Some helper functions. + void initialize_mersenne_twister (void); - void initialize_ranlib_generators (void); + uint32NDArray get_internal_state (void); - void initialize_mersenne_twister (void); + void save_state (void); - uint32NDArray get_internal_state (void); + int get_dist_id (const std::string& d); - void save_state (void); + void set_internal_state (const uint32NDArray& s); - int get_dist_id (const std::string& d); + void switch_to_generator (int dist); - void set_internal_state (const uint32NDArray& s); - - void switch_to_generator (int dist); + void fill (octave_idx_type len, double *v, double a); - void fill (octave_idx_type len, double *v, double a); + void fill (octave_idx_type len, float *v, float a); + }; +} - void fill (octave_idx_type len, float *v, float a); -}; +#if defined (OCTAVE_USE_DEPRECATED_FUNCTIONS) + +OCTAVE_DEPRECATED (4.4, "use 'octave::rand' instead") +typedef octave::rand octave_rand; #endif + +#endif