testsuite_random.h: New.
2011-03-18 Paolo Carlini <paolo.carlini@oracle.com> * testsuite/util/testsuite_random.h: New. * testsuite/lib/libstdc++.exp (check_v3_target_c99_math, dg-require-c99_math): Add. * testsuite/26_numerics/random/bernoulli_distribution/ operators/values.cc: New. * testsuite/26_numerics/random/binomial_distribution/ operators/values.cc: Likewise. * testsuite/26_numerics/random/geometric_distribution/ operators/values.cc: Likewise. From-SVN: r171133
This commit is contained in:
parent
30a49b23ed
commit
294eab8c10
|
@ -1,3 +1,15 @@
|
||||||
|
2011-03-18 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
|
* testsuite/util/testsuite_random.h: New.
|
||||||
|
* testsuite/lib/libstdc++.exp (check_v3_target_c99_math,
|
||||||
|
dg-require-c99_math): Add.
|
||||||
|
* testsuite/26_numerics/random/bernoulli_distribution/
|
||||||
|
operators/values.cc: New.
|
||||||
|
* testsuite/26_numerics/random/binomial_distribution/
|
||||||
|
operators/values.cc: Likewise.
|
||||||
|
* testsuite/26_numerics/random/geometric_distribution/
|
||||||
|
operators/values.cc: Likewise.
|
||||||
|
|
||||||
2011-03-16 Benjamin Kosnik <bkoz@redhat.com>
|
2011-03-16 Benjamin Kosnik <bkoz@redhat.com>
|
||||||
|
|
||||||
* config/abi/pre/gnu.ver: Add base destructors for stdexcept classes.
|
* config/abi/pre/gnu.ver: Add base destructors for stdexcept classes.
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
// { dg-require-cstdint "" }
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// 26.5.8.2.1 Class template bernoulli_distribution [rand.dist.bern.bernoulli]
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include <functional>
|
||||||
|
#include <testsuite_random.h>
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
using namespace __gnu_test;
|
||||||
|
|
||||||
|
std::mt19937 eng;
|
||||||
|
|
||||||
|
std::bernoulli_distribution bd1(0.25);
|
||||||
|
auto bbd1 = std::bind(bd1, eng);
|
||||||
|
testDiscreteDist(bbd1, [](int n) { return bernoulli_pdf(n, 0.25); } );
|
||||||
|
|
||||||
|
std::bernoulli_distribution bd2(0.5);
|
||||||
|
auto bbd2 = std::bind(bd2, eng);
|
||||||
|
testDiscreteDist(bbd2, [](int n) { return bernoulli_pdf(n, 0.5); } );
|
||||||
|
|
||||||
|
std::bernoulli_distribution bd3(0.75);
|
||||||
|
auto bbd3 = std::bind(bd3, eng);
|
||||||
|
testDiscreteDist(bbd3, [](int n) { return bernoulli_pdf(n, 0.75); } );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
// { dg-require-cstdint "" }
|
||||||
|
// { dg-require-c99_math "" }
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// 26.5.8.2.2 Class template binomial_distribution [rand.dist.bern.bin]
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include <functional>
|
||||||
|
#include <testsuite_random.h>
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
using namespace __gnu_test;
|
||||||
|
|
||||||
|
std::mt19937 eng;
|
||||||
|
|
||||||
|
std::binomial_distribution<> bd1(5, 0.3);
|
||||||
|
auto bbd1 = std::bind(bd1, eng);
|
||||||
|
testDiscreteDist(bbd1, [](int n) { return binomial_pdf(n, 0.3, 5); } );
|
||||||
|
|
||||||
|
std::binomial_distribution<> bd2(55, 0.3);
|
||||||
|
auto bbd2 = std::bind(bd2, eng);
|
||||||
|
testDiscreteDist(bbd2, [](int n) { return binomial_pdf(n, 0.3, 55); } );
|
||||||
|
|
||||||
|
// libstdc++/48114
|
||||||
|
std::binomial_distribution<> bd3(10, 0.75);
|
||||||
|
auto bbd3 = std::bind(bd3, eng);
|
||||||
|
testDiscreteDist(bbd3, [](int n) { return binomial_pdf(n, 0.75, 10); } );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
// { dg-require-cstdint "" }
|
||||||
|
//
|
||||||
|
// Copyright (C) 2011 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 3, 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 General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
// 26.5.8.2.3 Class template geometric_distribution [rand.dist.bern.geom]
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
#include <functional>
|
||||||
|
#include <testsuite_random.h>
|
||||||
|
|
||||||
|
void test01()
|
||||||
|
{
|
||||||
|
using namespace __gnu_test;
|
||||||
|
|
||||||
|
std::mt19937 eng;
|
||||||
|
|
||||||
|
std::geometric_distribution<> gd1(0.5);
|
||||||
|
auto bgd1 = std::bind(gd1, eng);
|
||||||
|
testDiscreteDist(bgd1, [](int n) { return geometric_pdf(n, 0.5); } );
|
||||||
|
|
||||||
|
std::geometric_distribution<> gd2(0.75);
|
||||||
|
auto bgd2 = std::bind(gd2, eng);
|
||||||
|
testDiscreteDist(bgd2, [](int n) { return geometric_pdf(n, 0.75); } );
|
||||||
|
|
||||||
|
// libstdc++/48114
|
||||||
|
std::geometric_distribution<> gd3(0.25);
|
||||||
|
auto bgd3 = std::bind(gd3, eng);
|
||||||
|
testDiscreteDist(bgd3, [](int n) { return geometric_pdf(n, 0.25); } );
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test01();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
# Handlers for additional dg-xxx keywords in tests.
|
# Handlers for additional dg-xxx keywords in tests.
|
||||||
|
|
||||||
# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -107,6 +107,15 @@ proc dg-require-cstdint { args } {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc dg-require-c99_math { args } {
|
||||||
|
if { ![ check_v3_target_c99_math ] } {
|
||||||
|
upvar dg-do-what dg-do-what
|
||||||
|
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
proc dg-require-atomic-builtins { args } {
|
proc dg-require-atomic-builtins { args } {
|
||||||
if { ![ check_v3_target_atomic_builtins ] } {
|
if { ![ check_v3_target_atomic_builtins ] } {
|
||||||
upvar dg-do-what dg-do-what
|
upvar dg-do-what dg-do-what
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# libstdc++ "tool init file" for DejaGNU
|
# libstdc++ "tool init file" for DejaGNU
|
||||||
|
|
||||||
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
||||||
|
# 2009, 2010, 2011
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -1145,12 +1146,70 @@ proc check_v3_target_cstdint { } {
|
||||||
return $et_cstdint
|
return $et_cstdint
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc check_v3_target_c99_math { } {
|
||||||
|
global cxxflags
|
||||||
|
global DEFAULT_CXXFLAGS
|
||||||
|
global et_c99_math
|
||||||
|
|
||||||
|
global tool
|
||||||
|
|
||||||
|
if { ![info exists et_c99_math_target_name] } {
|
||||||
|
set et_c99_math_target_name ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the target has changed since we set the cached value, clear it.
|
||||||
|
set current_target [current_target_name]
|
||||||
|
if { $current_target != $et_c99_math_target_name } {
|
||||||
|
verbose "check_v3_target_c99_math: `$et_c99_math_target_name'" 2
|
||||||
|
set et_c99_math_target_name $current_target
|
||||||
|
if [info exists et_c99_math] {
|
||||||
|
verbose "check_v3_target_c99_math: removing cached result" 2
|
||||||
|
unset et_c99_math
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if [info exists et_c99_math] {
|
||||||
|
verbose "check_v3_target_c99_math: using cached result" 2
|
||||||
|
} else {
|
||||||
|
set et_c99_math 0
|
||||||
|
|
||||||
|
# Set up and compile a C++0x test program that depends
|
||||||
|
# on the C99 math facilities to be available.
|
||||||
|
set src c99_math[pid].cc
|
||||||
|
set exe c99_math[pid].exe
|
||||||
|
|
||||||
|
set f [open $src "w"]
|
||||||
|
puts $f "#include <tr1/cmath>"
|
||||||
|
puts $f "int main()"
|
||||||
|
puts $f "#ifdef _GLIBCXX_USE_C99_MATH_TR1"
|
||||||
|
puts $f "{ return 0; }"
|
||||||
|
puts $f "#endif"
|
||||||
|
close $f
|
||||||
|
|
||||||
|
set cxxflags_saved $cxxflags
|
||||||
|
set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror"
|
||||||
|
|
||||||
|
set lines [v3_target_compile $src $exe executable ""]
|
||||||
|
set cxxflags $cxxflags_saved
|
||||||
|
file delete $src
|
||||||
|
|
||||||
|
if [string match "" $lines] {
|
||||||
|
# No error message, compilation succeeded.
|
||||||
|
set et_c99_math 1
|
||||||
|
} else {
|
||||||
|
verbose "check_v3_target_c99_math: compilation failed" 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
verbose "check_v3_target_c99_math: $et_c99_math" 2
|
||||||
|
return $et_c99_math
|
||||||
|
}
|
||||||
|
|
||||||
proc check_v3_target_atomic_builtins { } {
|
proc check_v3_target_atomic_builtins { } {
|
||||||
global cxxflags
|
global cxxflags
|
||||||
global DEFAULT_CXXFLAGS
|
global DEFAULT_CXXFLAGS
|
||||||
global et_cstdint
|
global et_atomic_builtins
|
||||||
|
|
||||||
global tool
|
global tool
|
||||||
|
|
||||||
if { ![info exists et_atomic_builtins_target_name] } {
|
if { ![info exists et_atomic_builtins_target_name] } {
|
||||||
set et_atomic_builtins_target_name ""
|
set et_atomic_builtins_target_name ""
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
// Copyright (C) 2011 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the terms
|
||||||
|
// of the GNU General Public License as published by the Free Software
|
||||||
|
// Foundation; either version 3, 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
|
||||||
|
// General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this library; see the file COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file testsuite_random.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _GLIBCXX_TESTSUITE_RANDOM_H
|
||||||
|
#define _GLIBCXX_TESTSUITE_RANDOM_H
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <testsuite_hooks.h>
|
||||||
|
|
||||||
|
namespace __gnu_test
|
||||||
|
{
|
||||||
|
// Adapted for libstdc++ from GNU gsl-1.14/randist/test.c
|
||||||
|
// Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007, 2010
|
||||||
|
// James Theiler, Brian Gough
|
||||||
|
template<unsigned long BINS = 100,
|
||||||
|
unsigned long N = 100000,
|
||||||
|
typename Distribution, typename Pdf>
|
||||||
|
void
|
||||||
|
testDiscreteDist(Distribution& f, Pdf pdf)
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
double count[BINS], p[BINS];
|
||||||
|
|
||||||
|
for (unsigned long i = 0; i < BINS; i++)
|
||||||
|
count[i] = 0;
|
||||||
|
|
||||||
|
for (unsigned long i = 0; i < N; i++)
|
||||||
|
{
|
||||||
|
auto r = f();
|
||||||
|
if (r >= 0 && r < BINS)
|
||||||
|
count[r]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned long i = 0; i < BINS; i++)
|
||||||
|
p[i] = pdf(i);
|
||||||
|
|
||||||
|
for (unsigned long i = 0; i < BINS; i++)
|
||||||
|
{
|
||||||
|
bool status_i;
|
||||||
|
double d = std::abs(count[i] - N * p[i]);
|
||||||
|
|
||||||
|
if (p[i] != 0)
|
||||||
|
{
|
||||||
|
double s = d / std::sqrt(N * p[i]);
|
||||||
|
status_i = (s > 5) && (d > 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
status_i = (count[i] != 0);
|
||||||
|
|
||||||
|
VERIFY( !status_i );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline double
|
||||||
|
bernoulli_pdf(int k, double p)
|
||||||
|
{
|
||||||
|
if (k == 0)
|
||||||
|
return 1 - p;
|
||||||
|
else if (k == 1)
|
||||||
|
return p;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _GLIBCXX_USE_C99_MATH_TR1
|
||||||
|
inline double
|
||||||
|
binomial_pdf(int k, double p, int n)
|
||||||
|
{
|
||||||
|
if (k < 0 || k > n)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double q;
|
||||||
|
|
||||||
|
if (p == 0)
|
||||||
|
q = (k == 0) ? 1 : 0;
|
||||||
|
else if (p == 1)
|
||||||
|
q = (k == n) ? 1 : 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double ln_Cnk = (std::lgamma(n + 1) - std::lgamma(k + 1)
|
||||||
|
- std::lgamma(n - k + 1));
|
||||||
|
q = ln_Cnk + k * std::log(p) + (n - k) * std::log1p(-p);
|
||||||
|
q = std::exp(q);
|
||||||
|
}
|
||||||
|
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
inline double
|
||||||
|
geometric_pdf(int k, double p)
|
||||||
|
{
|
||||||
|
if (k < 0)
|
||||||
|
return 0;
|
||||||
|
else if (k == 0)
|
||||||
|
return p;
|
||||||
|
else
|
||||||
|
return p * std::pow(1 - p, k);
|
||||||
|
}
|
||||||
|
} // namespace __gnu_test
|
||||||
|
|
||||||
|
#endif // #ifndef _GLIBCXX_TESTSUITE_RANDOM_H
|
Loading…
Reference in New Issue