Boost logo

Boost :

Subject: [boost] [random] Major update
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2011-03-17 14:47:36


AMDG

I've nearly finished preparing Boost.Random for the
next release. Here's a summary of the changes.
I still have some minor clean-up, but it's mostly
stable. I'd greatly appreciate it if anyone wants
to take a look at it. If you have issues with any
of this, speak up now, while it can still be changed
relatively painlessly.

* Synchronized with the new standard.
   - Many new distributions added:
     chi_squared_distribution, negative_binomial_distribution,
     fisher_f_distribution, student_t_distribution,
     weibull_distribution, extreme_value_distribution,
     discrete_distribution, piecewise_constant_distribution,
     piecewise_liear_distribution
   - Renamed uniform_int and uniform_real to
     uniform_int_distribution and uniform_real_distribution.
   - Added members to all distributions:
     param_type, param, stream operators,
     comparison operators, min and max.
   - Allow distributions to be used directly with
     generators without use of variate_generator.
   - Changed the meaning of the parameters of
     geometric_distribution and lognormal_distribution.
   - Added a second parameter to gamma_distribution.
   - Added seed_seq and added the corresponding
     constructors and seed overloads the generators.
   - Added generate_canonical.
   - Renamed the engine tempates. e.g. mersenne_twister
     becomes mersenne_twister_engine.
   - New engine adapter independent_bits_engine.
   - Added new predefined engine typedefs:
     mt19937_64, ranlux[24|48][_base], knuth_b.
   - Updated seeding algorithms.
   - Added discard
   - Use unsigned types instead of signed types in all
     the predefined engines.
* Bug fixes:
   - linear_congruential_engine could assert because
     the modular arithmetic was not implemented in all
     cases. shuffle_output, now called shuffle_order_engine,
     could cause integer overflow. These cases were
     not triggered by any predefined engines.
   - uniform_small_int now actually behaves as documented.
* New efficient algorithms for binomial_distribution
   and poisson_distribution.
* Moved all features into namespace boost::random
* Complete rewrite of the tests
   - Use Boot.Test's automatic registration and
     make better use of its test tools.
   - Statistical tests of the distributions
   - Separate tests for each engine and distribution

Backwards compatibility issues:
* The seeding algorithms have changed.
     This was unavoidable for compatibility
     with the standard. Not to mention
     that some of the existing algorithms
     were weird and inconsistent.
     - Seeding with an integer:
         The behaviour should be unchanged for
         most generators except lagged_fibonacci and
         subtract_with_carry (and thus ranlux).
     - Seeding a generator with another generator:
         This has been enabled by making all
         all generators models of SeedSeq. Therefore,
         if you seed a Boost.Random generator with
         a non Boost.Random generator, your code
         will no longer compile. The algorithm
         has changed, so code using this seeding
         method will yield different values.
     - Seeding a generator from a pair of iterators:
         This implicitly assumed that the elements
         were 32-bit integers in some places, but
         not everywhere. I've added this requirement
         everywhere and updated the algorithms
         accordingly. The behaviour of generators
         with a value_type no more than 32 bits should
         be unchanged, but I have not verified this.
     I've added tests to make sure that the algorithms
     can't be changed accidentally.
* Renaming:
   - Whenever I renamed a class, I provided a wrapper
     with the old name. There are also using declarations
     in namespace boost for everything that I moved.
   - The names of a few accessors in the distributions
     changed. I left both the old and the new names in place.
* geometric_distribution and lognormal_distribution:
   - The behaviour is different at runtime.
     boost::geometric_distribution and boost::lognormal_distribution
     provide the old behaviour, boost::random::geometric_distribution
     and boost::random::lognormal_distribution provide
     the new behaviour.
* Streaming:
     gamma_distribution has a new parameter, thus
     text saved with the old version will not readable
     by the new version. I haven't tried to deal with this.
     do people consider this important?
* variate_generator:
     variate_generator is now a simple pass through wrapper.
     Code that assumes that it will adjust the generator's
     result type to match the distribution will no longer
     work. This is not an issue with any of the distributions
     provided by Boost.Random.
* Return types:
     The result_types of some generators have changed
     slightly. Hopefully no one is depending on it being
     int instead of unsigned...
* has_fixed_range:
     - This is now always false, as it doesn't appear to be very
       useful and is excessively cumbersome. Anything that
       was accessing const_min and const_max without first
       checking has_fixed_range was incorrect to begin with.

I think that covers the breaking changes. If there's
anything else, it's probably a bug, and I'll try to fix it.

A few thing I know about, but haven't changed:
* lagged_fibonacci comparison is not technically
    correct. It's possible for operator== to return
    false in some cases where the generators will
    actually produce identical (infinite) sequences.
    The probability that this will ever actually happen
    is very small. (As in 2^{-20000} for lagged_fibonacci607)
* Similarly the textual representation of lagged_fibonacci
    is inconsistent with that used by the mersenne_twister
    and subtract_with_carry. Changing this would
    make old records unreadable.

In Christ,
Steven Watanabe


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk