mirror of
https://github.com/boostorg/random.git
synced 2026-01-19 04:22:17 +00:00
23
.codecov.yml
Normal file
23
.codecov.yml
Normal file
@@ -0,0 +1,23 @@
|
||||
# Copyright 2019 - 2021 Alexander Grund
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
#
|
||||
# Sample codecov configuration file. Edit as required
|
||||
|
||||
codecov:
|
||||
max_report_age: off
|
||||
require_ci_to_pass: yes
|
||||
notify:
|
||||
# Increase this if you have multiple coverage collection jobs
|
||||
after_n_builds: 1
|
||||
wait_for_ci: yes
|
||||
|
||||
# Change how pull request comments look
|
||||
comment:
|
||||
layout: "reach,diff,flags,files,footer"
|
||||
|
||||
# Ignore specific files or folders. Glob patterns are supported.
|
||||
# See https://docs.codecov.com/docs/ignoring-paths
|
||||
ignore:
|
||||
- extra/**/*
|
||||
# - test/**/*
|
||||
66
.github/workflows/ci.yml
vendored
66
.github/workflows/ci.yml
vendored
@@ -184,31 +184,31 @@ jobs:
|
||||
- clang-11
|
||||
- toolset: clang
|
||||
compiler: clang++-12
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
cxxstd: "11,14,17,20"
|
||||
os: ubuntu-22.04
|
||||
install:
|
||||
- clang-12
|
||||
- toolset: clang
|
||||
compiler: clang++-13
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
cxxstd: "11,14,17,20"
|
||||
os: ubuntu-22.04
|
||||
install:
|
||||
- clang-13
|
||||
- toolset: clang
|
||||
compiler: clang++-14
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
cxxstd: "11,14,17,20"
|
||||
os: ubuntu-22.04
|
||||
install:
|
||||
- clang-14
|
||||
- toolset: clang
|
||||
compiler: clang++-14
|
||||
cxxstd: "11-gnu,14-gnu,17-gnu,20-gnu,2b-gnu"
|
||||
cxxstd: "11-gnu,14-gnu,17-gnu,20-gnu"
|
||||
os: ubuntu-22.04
|
||||
install:
|
||||
- clang-14
|
||||
- toolset: clang
|
||||
compiler: clang++-15
|
||||
cxxstd: "11,14,17,20,2b"
|
||||
cxxstd: "11,14,17,20"
|
||||
os: ubuntu-22.04
|
||||
install:
|
||||
- clang-15
|
||||
@@ -495,3 +495,59 @@ jobs:
|
||||
run: |
|
||||
cd ../boost-root
|
||||
b2 -j3 libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=release link=static,shared embed-manifest-via=linker
|
||||
|
||||
posix-cmake-test:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-20.04
|
||||
- os: ubuntu-22.04
|
||||
- os: macos-11
|
||||
- os: macos-12
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install packages
|
||||
if: matrix.install
|
||||
run: sudo apt install ${{matrix.install}}
|
||||
|
||||
- name: Setup Boost
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
|
||||
LIBRARY=${GITHUB_REPOSITORY#*/}
|
||||
echo LIBRARY: $LIBRARY
|
||||
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
|
||||
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
|
||||
echo GITHUB_REF: $GITHUB_REF
|
||||
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
|
||||
REF=${REF#refs/heads/}
|
||||
echo REF: $REF
|
||||
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
|
||||
echo BOOST_BRANCH: $BOOST_BRANCH
|
||||
cd ..
|
||||
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
mkdir -p libs/$LIBRARY
|
||||
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
cd ../boost-root
|
||||
mkdir __build__ && cd __build__
|
||||
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON ..
|
||||
|
||||
- name: Build tests
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
cmake --build . --target tests
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
ctest --output-on-failure --no-tests=error
|
||||
|
||||
186
.github/workflows/codecov.yml
vendored
Normal file
186
.github/workflows/codecov.yml
vendored
Normal file
@@ -0,0 +1,186 @@
|
||||
# Copyright 2020-2021 Peter Dimov
|
||||
# Copyright 2021 Andrey Semashev
|
||||
# Copyright 2021 Alexander Grund
|
||||
# Copyright 2022 James E. King III
|
||||
# Copyright 2023 Matt Borland
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
---
|
||||
name: codecov
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
- bugfix/**
|
||||
- feature/**
|
||||
- fix/**
|
||||
- pr/**
|
||||
|
||||
env:
|
||||
GIT_FETCH_JOBS: 8
|
||||
NET_RETRY_COUNT: 5
|
||||
B2_CI_VERSION: 1
|
||||
B2_VARIANT: debug,release
|
||||
B2_LINK: shared,static
|
||||
LCOV_BRANCH_COVERAGE: 0
|
||||
CODECOV_NAME: Github Actions
|
||||
|
||||
jobs:
|
||||
posix:
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- { name: Collect coverage, coverage: yes,
|
||||
compiler: gcc-12, cxxstd: '20', os: ubuntu-22.04, install: 'g++-12-multilib', address-model: '32,64' }
|
||||
|
||||
timeout-minutes: 120
|
||||
runs-on: ${{matrix.os}}
|
||||
container: ${{matrix.container}}
|
||||
env: {B2_USE_CCACHE: 1}
|
||||
|
||||
steps:
|
||||
- name: Setup environment
|
||||
run: |
|
||||
if [ -f "/etc/debian_version" ]; then
|
||||
echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
fi
|
||||
if [ -n "${{matrix.container}}" ] && [ -f "/etc/debian_version" ]; then
|
||||
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
|
||||
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common curl
|
||||
# Need (newer) git, and the older Ubuntu container may require requesting the key manually using port 80
|
||||
curl -sSL --retry ${NET_RETRY_COUNT:-5} 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xE1DD270288B4E6030699E45FA1715D88E1DF1F24' | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/git-core_ubuntu_ppa.gpg
|
||||
for i in {1..${NET_RETRY_COUNT:-3}}; do sudo -E add-apt-repository -y ppa:git-core/ppa && break || sleep 10; done
|
||||
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
|
||||
osver=$(lsb_release -sr | cut -f1 -d.)
|
||||
pkgs="g++ git"
|
||||
# Ubuntu 22+ has only Python 3 in the repos
|
||||
if [ -n "$osver" ] && [ "$osver" -ge "22" ]; then
|
||||
pkgs+=" python-is-python3 libpython3-dev"
|
||||
else
|
||||
pkgs+=" python libpython-dev"
|
||||
fi
|
||||
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs
|
||||
fi
|
||||
# For jobs not compatible with ccache, use "ccache: no" in the matrix
|
||||
if [[ "${{ matrix.ccache }}" == "no" ]]; then
|
||||
echo "B2_USE_CCACHE=0" >> $GITHUB_ENV
|
||||
fi
|
||||
git config --global pack.threads 0
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
# For coverage builds fetch the whole history, else only 1 commit using a 'fake ternary'
|
||||
fetch-depth: ${{ matrix.coverage && '0' || '1' }}
|
||||
|
||||
- name: Cache ccache
|
||||
uses: actions/cache@v3
|
||||
if: env.B2_USE_CCACHE
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{github.sha}}
|
||||
restore-keys: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-
|
||||
|
||||
- name: Fetch Boost.CI
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: boostorg/boost-ci
|
||||
ref: master
|
||||
path: boost-ci-cloned
|
||||
|
||||
- name: Get CI scripts folder
|
||||
run: |
|
||||
# Copy ci folder if not testing Boost.CI
|
||||
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
|
||||
rm -rf boost-ci-cloned
|
||||
|
||||
- name: Install packages
|
||||
if: startsWith(matrix.os, 'ubuntu')
|
||||
run: |
|
||||
SOURCE_KEYS=(${{join(matrix.source_keys, ' ')}})
|
||||
SOURCES=(${{join(matrix.sources, ' ')}})
|
||||
# Add this by default
|
||||
SOURCES+=(ppa:ubuntu-toolchain-r/test)
|
||||
for key in "${SOURCE_KEYS[@]}"; do
|
||||
for i in {1..$NET_RETRY_COUNT}; do
|
||||
keyfilename=$(basename -s .key $key)
|
||||
curl -sSL --retry ${NET_RETRY_COUNT:-5} "$key" | sudo gpg --dearmor > /etc/apt/trusted.gpg.d/${keyfilename} && break || sleep 10
|
||||
done
|
||||
done
|
||||
for source in "${SOURCES[@]}"; do
|
||||
for i in {1..$NET_RETRY_COUNT}; do
|
||||
sudo add-apt-repository $source && break || sleep 10
|
||||
done
|
||||
done
|
||||
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
|
||||
if [[ -z "${{matrix.install}}" ]]; then
|
||||
pkgs="${{matrix.compiler}}"
|
||||
pkgs="${pkgs/gcc-/g++-}"
|
||||
else
|
||||
pkgs="${{matrix.install}}"
|
||||
fi
|
||||
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs
|
||||
|
||||
- name: Setup GCC Toolchain
|
||||
if: matrix.gcc_toolchain
|
||||
run: |
|
||||
GCC_TOOLCHAIN_ROOT="$HOME/gcc-toolchain"
|
||||
echo "GCC_TOOLCHAIN_ROOT=$GCC_TOOLCHAIN_ROOT" >> $GITHUB_ENV
|
||||
if ! command -v dpkg-architecture; then
|
||||
apt-get install -y dpkg-dev
|
||||
fi
|
||||
MULTIARCH_TRIPLET="$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
|
||||
mkdir -p "$GCC_TOOLCHAIN_ROOT"
|
||||
ln -s /usr/include "$GCC_TOOLCHAIN_ROOT/include"
|
||||
ln -s /usr/bin "$GCC_TOOLCHAIN_ROOT/bin"
|
||||
mkdir -p "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET"
|
||||
ln -s "/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}"
|
||||
|
||||
- name: Setup multiarch
|
||||
if: matrix.multiarch
|
||||
run: |
|
||||
sudo apt-get install --no-install-recommends -y binfmt-support qemu-user-static
|
||||
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||
git clone https://github.com/jeking3/bdde.git
|
||||
echo "$(pwd)/bdde/bin/linux" >> ${GITHUB_PATH}
|
||||
echo "BDDE_DISTRO=${{ matrix.distro }}" >> ${GITHUB_ENV}
|
||||
echo "BDDE_EDITION=${{ matrix.edition }}" >> ${GITHUB_ENV}
|
||||
echo "BDDE_ARCH=${{ matrix.arch }}" >> ${GITHUB_ENV}
|
||||
echo "B2_WRAPPER=bdde" >> ${GITHUB_ENV}
|
||||
|
||||
- name: Setup Boost
|
||||
env:
|
||||
B2_ADDRESS_MODEL: ${{matrix.address-model}}
|
||||
B2_COMPILER: ${{matrix.compiler}}
|
||||
B2_CXXSTD: ${{matrix.cxxstd}}
|
||||
B2_SANITIZE: ${{matrix.sanitize}}
|
||||
B2_STDLIB: ${{matrix.stdlib}}
|
||||
# More entries can be added in the same way, see the B2_ARGS assignment in ci/enforce.sh for the possible keys.
|
||||
# B2_DEFINES: ${{matrix.defines}}
|
||||
# Variables set here (to non-empty) will override the top-level environment variables, e.g.
|
||||
# B2_VARIANT: ${{matrix.variant}}
|
||||
# Set the (B2) target(s) to build, defaults to the test folder of the current library
|
||||
# Can alternatively be done like this in the build step or in the build command of the build step, e.g. `run: B2_TARGETS=libs/$SELF/doc ci/build.sh`
|
||||
# B2_TARGETS: libs/foo/test//bar
|
||||
run: source ci/github/install.sh
|
||||
|
||||
- name: Setup coverage collection
|
||||
if: matrix.coverage
|
||||
run: ci/github/codecov.sh "setup"
|
||||
|
||||
- name: Run tests
|
||||
if: '!matrix.coverity'
|
||||
run: ci/build.sh
|
||||
|
||||
- name: Upload coverage
|
||||
if: matrix.coverage
|
||||
run: ci/codecov.sh "upload"
|
||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,3 +1,12 @@
|
||||
/doc/html
|
||||
/doc/reference.xml
|
||||
/test/rng.saved
|
||||
|
||||
# Cmake build options
|
||||
Makefile
|
||||
*.cmake
|
||||
CMakeFiles/**
|
||||
|
||||
# Editor Options
|
||||
.vscode
|
||||
.idea
|
||||
|
||||
@@ -83,6 +83,7 @@ numbers mean faster random number generation.
|
||||
[[__ranlux64_4_01] [~10[sup 171]] [`24*sizeof(double)`] [[ranlux64_4_speed]] [-]]
|
||||
[[__ranlux24] [~10[sup 171]] [`24*sizeof(uint32_t)`] [[ranlux24_speed]] [-]]
|
||||
[[__ranlux48] [~10[sup 171]] [`12*sizeof(uint64_t)`] [[ranlux48_speed]] [-]]
|
||||
[[__splitmix64] [2[sup 64]] [`sizeof(uint64_t)`] [[-]] [-]]
|
||||
]
|
||||
|
||||
As observable from the table, there is generally a quality/performance/memory
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include <boost/random/subtract_with_carry.hpp>
|
||||
#include <boost/random/taus88.hpp>
|
||||
#include <boost/random/xor_combine.hpp>
|
||||
#include <boost/random/splitmix64.hpp>
|
||||
|
||||
// misc
|
||||
#include <boost/random/generate_canonical.hpp>
|
||||
|
||||
203
include/boost/random/splitmix64.hpp
Normal file
203
include/boost/random/splitmix64.hpp
Normal file
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
* Copyright Sebastiano Vigna 2015.
|
||||
* Copyright Matt Borland 2022.
|
||||
* Distributed under the Boost Software License, Version 1.0. (See
|
||||
* accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef BOOST_RANDOM_SPLITMIX64_HPP
|
||||
#define BOOST_RANDOM_SPLITMIX64_HPP
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <limits>
|
||||
#include <array>
|
||||
#include <string>
|
||||
#include <ios>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost { namespace random {
|
||||
|
||||
/**
|
||||
* This is a fixed-increment version of Java 8's SplittableRandom generator
|
||||
* See http://dx.doi.org/10.1145/2714064.2660195 and
|
||||
* http://docs.oracle.com/javase/8/docs/api/java/util/SplittableRandom.html
|
||||
* It is a very fast generator passing BigCrush, and it can be useful if
|
||||
* for some reason you absolutely want 64 bits of state; otherwise, we
|
||||
* rather suggest to use a xoroshiro128+ (for moderately parallel
|
||||
* computations) or xorshift1024* (for massively parallel computations)
|
||||
* generator.
|
||||
*/
|
||||
class splitmix64
|
||||
{
|
||||
private:
|
||||
std::uint64_t state_;
|
||||
|
||||
inline std::uint64_t concatenate(std::uint32_t word1, std::uint32_t word2) noexcept
|
||||
{
|
||||
return static_cast<std::uint64_t>(word1) << 32 | word2;
|
||||
}
|
||||
|
||||
public:
|
||||
using result_type = std::uint64_t;
|
||||
using seed_type = std::uint64_t;
|
||||
|
||||
// Required for old Boost.Random concept
|
||||
static constexpr bool has_fixed_range {false};
|
||||
|
||||
/** Seeds the generator with the default seed. */
|
||||
void seed(result_type value = 0) noexcept
|
||||
{
|
||||
if (value == 0)
|
||||
{
|
||||
state_ = UINT64_C(0xA164B43C8F634A13);
|
||||
}
|
||||
else
|
||||
{
|
||||
state_ = value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Seeds the generator with 32-bit values produced by @c seq.generate().
|
||||
*/
|
||||
template <typename Sseq, typename std::enable_if<!std::is_convertible<Sseq, std::uint64_t>::value, bool>::type = true>
|
||||
void seed(Sseq& seq)
|
||||
{
|
||||
std::array<std::uint32_t, 2> seeds;
|
||||
seq.generate(seeds.begin(), seeds.end());
|
||||
|
||||
state_ = concatenate(seeds[0], seeds[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Seeds the generator with 64-bit values produced by @c seq.generate().
|
||||
*/
|
||||
template <typename Sseq, typename std::enable_if<!std::is_convertible<Sseq, splitmix64>::value, bool>::type = true>
|
||||
explicit splitmix64(Sseq& seq)
|
||||
{
|
||||
seed(seq);
|
||||
}
|
||||
|
||||
/** Seeds the generator with a user provided seed. */
|
||||
template <typename T, typename std::enable_if<std::is_convertible<T, std::uint64_t>::value, bool>::type = true>
|
||||
void seed(T value = 0) noexcept
|
||||
{
|
||||
seed(static_cast<std::uint64_t>(value));
|
||||
}
|
||||
|
||||
/** Seeds the generator with a user provided seed. */
|
||||
explicit splitmix64(std::uint64_t state = 0) noexcept
|
||||
{
|
||||
seed(state);
|
||||
}
|
||||
|
||||
splitmix64(const splitmix64& other) = default;
|
||||
splitmix64& operator=(const splitmix64& other) = default;
|
||||
|
||||
/** Returns the next value of the generator. */
|
||||
inline result_type next() noexcept
|
||||
{
|
||||
std::uint64_t z {state_ += UINT64_C(0x9E3779B97F4A7C15)};
|
||||
z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4E5B9);
|
||||
z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB);
|
||||
|
||||
return z ^ (z >> 31);
|
||||
}
|
||||
|
||||
/** Returns the next value of the generator. */
|
||||
inline result_type operator()() noexcept
|
||||
{
|
||||
return next();
|
||||
}
|
||||
|
||||
/** Advances the state of the generator by @c z. */
|
||||
inline void discard(std::uint64_t z) noexcept
|
||||
{
|
||||
for (std::uint64_t i {}; i < z; ++i)
|
||||
{
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the two generators will produce identical
|
||||
* sequences of values.
|
||||
*/
|
||||
inline friend bool operator==(const splitmix64& lhs, const splitmix64& rhs) noexcept
|
||||
{
|
||||
return lhs.state_ == rhs.state_;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the two generators will produce different
|
||||
* sequences of values.
|
||||
*/
|
||||
inline friend bool operator!=(const splitmix64& lhs, const splitmix64& rhs) noexcept
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
/** Writes a @c splitmix64 to a @c std::ostream. */
|
||||
template <typename CharT, typename Traits>
|
||||
inline friend std::basic_ostream<CharT,Traits>& operator<<(std::basic_ostream<CharT,Traits>& ost,
|
||||
const splitmix64& e)
|
||||
{
|
||||
ost << e.state_;
|
||||
return ost;
|
||||
}
|
||||
|
||||
/** Writes a @c splitmix64 to a @c std::istream. */
|
||||
template <typename CharT, typename Traits>
|
||||
inline friend std::basic_istream<CharT,Traits>& operator>>(std::basic_istream<CharT,Traits>& ist,
|
||||
splitmix64& e)
|
||||
{
|
||||
std::string sstate;
|
||||
CharT val;
|
||||
while (ist >> val)
|
||||
{
|
||||
if (std::isdigit(val))
|
||||
{
|
||||
sstate.push_back(val);
|
||||
}
|
||||
}
|
||||
|
||||
e.state_ = std::strtoull(sstate.c_str(), nullptr, 10);
|
||||
|
||||
return ist;
|
||||
}
|
||||
|
||||
/** Fills a range with random values */
|
||||
template <typename FIter>
|
||||
inline void generate(FIter first, FIter last) noexcept
|
||||
{
|
||||
while (first != last)
|
||||
{
|
||||
*first++ = next();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the largest value that the @c splitmix64
|
||||
* can produce.
|
||||
*/
|
||||
static constexpr result_type (max)() noexcept
|
||||
{
|
||||
return (std::numeric_limits<std::uint64_t>::max)();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smallest value that the @c splitmix64
|
||||
* can produce.
|
||||
*/
|
||||
static constexpr result_type (min)() noexcept
|
||||
{
|
||||
return (std::numeric_limits<std::uint64_t>::min)();
|
||||
}
|
||||
};
|
||||
|
||||
}} // Namespace boost::random
|
||||
|
||||
#endif // BOOST_RANDOM_SPLITMIX64_HPP
|
||||
@@ -12,7 +12,8 @@
|
||||
"Math"
|
||||
],
|
||||
"maintainers": [
|
||||
"Steven Watanabe <watanabesj -at- gmail.com>"
|
||||
"Steven Watanabe <watanabesj -at- gmail.com>",
|
||||
"Matt Borland <matt -at- mattborland.com>"
|
||||
],
|
||||
"cxxstd": "03"
|
||||
"cxxstd": "11"
|
||||
}
|
||||
|
||||
78
performance/splitmix_speed.cpp
Normal file
78
performance/splitmix_speed.cpp
Normal file
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright Matt Borland 2022.
|
||||
* Distributed under the Boost Software License, Version 1.0. (See
|
||||
* accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
#include <random>
|
||||
#include <boost/random/random_device.hpp>
|
||||
#include <boost/random/mersenne_twister.hpp>
|
||||
#include <benchmark/benchmark.h>
|
||||
#include "../include/boost/random/splitmix64.hpp"
|
||||
|
||||
template <typename T>
|
||||
void stl_mt19937_64(benchmark::State& state)
|
||||
{
|
||||
std::random_device rd;
|
||||
std::mt19937_64 gen{rd()};
|
||||
for (auto _ : state)
|
||||
{
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void boost_mt19937_64(benchmark::State& state)
|
||||
{
|
||||
boost::random::random_device rd;
|
||||
boost::random::mt19937_64 gen{rd()};
|
||||
for (auto _ : state)
|
||||
{
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
benchmark::DoNotOptimize(gen());
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void boost_splitmix64(benchmark::State& state)
|
||||
{
|
||||
boost::random::splitmix64 rd;
|
||||
for (auto _ : state)
|
||||
{
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
benchmark::DoNotOptimize(rd());
|
||||
}
|
||||
}
|
||||
|
||||
BENCHMARK_TEMPLATE(stl_mt19937_64, std::uint64_t);
|
||||
BENCHMARK_TEMPLATE(boost_mt19937_64, std::uint64_t);
|
||||
BENCHMARK_TEMPLATE(boost_splitmix64, std::uint64_t);
|
||||
|
||||
BENCHMARK_MAIN();
|
||||
31
test/CMakeLists.txt
Normal file
31
test/CMakeLists.txt
Normal file
@@ -0,0 +1,31 @@
|
||||
# Copyright 2018, 2019 Peter Dimov
|
||||
# Copyright 2023 Matt Borland
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
include(BoostTestJamfile OPTIONAL RESULT_VARIABLE HAVE_BOOST_TEST)
|
||||
|
||||
if(HAVE_BOOST_TEST)
|
||||
|
||||
boost_test_jamfile(FILE Jamfile.v2 LINK_LIBRARIES
|
||||
Boost::random
|
||||
Boost::array
|
||||
Boost::assert
|
||||
Boost::config
|
||||
Boost::core
|
||||
Boost::dynamic_bitset
|
||||
Boost::exception
|
||||
Boost::integer
|
||||
Boost::io
|
||||
Boost::lexical_cast
|
||||
Boost::math
|
||||
Boost::multiprecision
|
||||
Boost::numeric_conversion
|
||||
Boost::range
|
||||
Boost::static_assert
|
||||
Boost::system
|
||||
Boost::throw_exception
|
||||
Boost::type_traits
|
||||
Boost::utility)
|
||||
|
||||
endif()
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
# bring in rules for testing
|
||||
import testing ;
|
||||
import ../../config/checks/config : requires ;
|
||||
|
||||
project /boost/random/test : requirements <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS ;
|
||||
|
||||
@@ -55,6 +56,7 @@ run test_lagged_fibonacci19937.cpp /boost//unit_test_framework ;
|
||||
run test_lagged_fibonacci23209.cpp /boost//unit_test_framework ;
|
||||
run test_lagged_fibonacci44497.cpp /boost//unit_test_framework ;
|
||||
run test_zero_seed.cpp /boost//unit_test_framework ;
|
||||
run test_splitmix64.cpp /boost//unit_test_framework ;
|
||||
|
||||
run niederreiter_base2_validate.cpp /boost//unit_test_framework ;
|
||||
run sobol_validate.cpp /boost//unit_test_framework ;
|
||||
@@ -143,6 +145,6 @@ explicit statistic_tests ;
|
||||
#
|
||||
# Multiprecision tests:
|
||||
#
|
||||
run multiprecision_int_test.cpp /boost//unit_test_framework ;
|
||||
# This one runs too slow in debug mode, we really need inline expansions turned on amonst other things:
|
||||
run multiprecision_float_test.cpp /boost//unit_test_framework : : : release ;
|
||||
run multiprecision_int_test.cpp /boost//unit_test_framework : : : [ requires cxx14_decltype_auto cxx14_generic_lambdas cxx14_return_type_deduction cxx14_variable_templates cxx14_constexpr ] ;
|
||||
# This one runs too slow in debug mode, we really need inline expansions turned on amongst other things:
|
||||
run multiprecision_float_test.cpp /boost//unit_test_framework : : : [ requires cxx14_decltype_auto cxx14_generic_lambdas cxx14_return_type_deduction cxx14_variable_templates cxx14_constexpr ] release ;
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#include <boost/random/detail/seed.hpp>
|
||||
#include <boost/random/detail/seed_impl.hpp>
|
||||
#include <boost/concept_archetype.hpp>
|
||||
#include <boost/concept/requires.hpp>
|
||||
#include <boost/mpl/assert.hpp>
|
||||
@@ -141,8 +143,10 @@ public:
|
||||
e.discard(z);
|
||||
|
||||
// extension
|
||||
#if 0
|
||||
(void)E(sb, se);
|
||||
e.seed(sb, se);
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -150,7 +154,7 @@ private:
|
||||
E v;
|
||||
const E x;
|
||||
seed_seq_archetype<> q;
|
||||
typename detail::seed_type<result_type>::type s;
|
||||
typename boost::random::detail::seed_type<result_type>::type s;
|
||||
uintmax_t z;
|
||||
|
||||
input_iterator_archetype<boost::uint32_t> sb, se;
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
#include "concepts.hpp"
|
||||
#include <boost/random/seed_seq.hpp>
|
||||
#include <boost/random/detail/seed.hpp>
|
||||
#include <boost/random/detail/seed_impl.hpp>
|
||||
|
||||
#define BOOST_TEST_MAIN
|
||||
#include <boost/test/unit_test.hpp>
|
||||
@@ -90,7 +92,8 @@ BOOST_AUTO_TEST_CASE(test_arithmetic_seed)
|
||||
test_seed(static_cast<seed_type>(539157235));
|
||||
test_seed(static_cast<seed_type>(~0u));
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
BOOST_AUTO_TEST_CASE(test_iterator_seed)
|
||||
{
|
||||
const std::vector<int> v((std::max)(std::size_t(9999u), sizeof(BOOST_RANDOM_URNG) / 4), 0x41);
|
||||
@@ -122,6 +125,7 @@ BOOST_AUTO_TEST_CASE(test_iterator_seed)
|
||||
BOOST_CHECK_THROW(urng.seed(it, it_end), std::invalid_argument);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_seed_seq_seed)
|
||||
{
|
||||
@@ -261,6 +265,7 @@ BOOST_AUTO_TEST_CASE(validate_seed_seq)
|
||||
BOOST_CHECK_EQUAL(urng(), BOOST_RANDOM_SEED_SEQ_VALIDATION_VALUE);
|
||||
}
|
||||
|
||||
#if 0
|
||||
BOOST_AUTO_TEST_CASE(validate_iter)
|
||||
{
|
||||
const std::vector<int> v((std::max)(std::size_t(9999u), sizeof(BOOST_RANDOM_URNG) / 4), 0x41);
|
||||
@@ -282,3 +287,4 @@ BOOST_AUTO_TEST_CASE(test_generate)
|
||||
urng.generate(&actual[0], &actual[0] + N);
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(actual, actual + N, expected, expected + N);
|
||||
}
|
||||
#endif
|
||||
|
||||
23
test/test_splitmix64.cpp
Normal file
23
test/test_splitmix64.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
/* test_splitmix64.cpp
|
||||
*
|
||||
* Copyright Steven Watanabe 2011
|
||||
* Copyright Matt Borland 2022
|
||||
* Distributed under the Boost Software License, Version 1.0. (See
|
||||
* accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include <boost/random/splitmix64.hpp>
|
||||
#include <cstdint>
|
||||
#include <cmath>
|
||||
|
||||
#define BOOST_RANDOM_URNG boost::random::splitmix64
|
||||
|
||||
// principal operation validated with CLHEP, values by experiment
|
||||
#define BOOST_RANDOM_VALIDATION_VALUE UINT64_C(542758903869407163)
|
||||
#define BOOST_RANDOM_SEED_SEQ_VALIDATION_VALUE UINT64_C(7044339178176046395)
|
||||
|
||||
#include "test_generator.ipp"
|
||||
Reference in New Issue
Block a user