mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
syncing this fork with upstream
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# generate split test header file only if it does not yet exist
|
||||
# in order to prevent a rebuild everytime cmake is configured
|
||||
# in order to prevent a rebuild every time cmake is configured
|
||||
if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h)
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/split_test_helper.h "")
|
||||
foreach(i RANGE 1 999)
|
||||
|
||||
@@ -81,7 +81,7 @@ void check_limits_specialization()
|
||||
typedef std::numeric_limits<AD> A;
|
||||
typedef std::numeric_limits<Scalar> B;
|
||||
|
||||
// workaround "unsed typedef" warning:
|
||||
// workaround "unused typedef" warning:
|
||||
VERIFY(!bool(internal::is_same<B, A>::value));
|
||||
|
||||
#if EIGEN_HAS_CXX11
|
||||
|
||||
@@ -180,6 +180,64 @@ static void test_fixed_size_broadcasting()
|
||||
#endif
|
||||
}
|
||||
|
||||
template <int DataLayout>
|
||||
static void test_simple_broadcasting_one_by_n()
|
||||
{
|
||||
Tensor<float, 4, DataLayout> tensor(1,13,5,7);
|
||||
tensor.setRandom();
|
||||
array<ptrdiff_t, 4> broadcasts;
|
||||
broadcasts[0] = 9;
|
||||
broadcasts[1] = 1;
|
||||
broadcasts[2] = 1;
|
||||
broadcasts[3] = 1;
|
||||
Tensor<float, 4, DataLayout> broadcast;
|
||||
broadcast = tensor.broadcast(broadcasts);
|
||||
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(0), 9);
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(1), 13);
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(2), 5);
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(3), 7);
|
||||
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
for (int j = 0; j < 13; ++j) {
|
||||
for (int k = 0; k < 5; ++k) {
|
||||
for (int l = 0; l < 7; ++l) {
|
||||
VERIFY_IS_EQUAL(tensor(i%1,j%13,k%5,l%7), broadcast(i,j,k,l));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <int DataLayout>
|
||||
static void test_simple_broadcasting_n_by_one()
|
||||
{
|
||||
Tensor<float, 4, DataLayout> tensor(7,3,5,1);
|
||||
tensor.setRandom();
|
||||
array<ptrdiff_t, 4> broadcasts;
|
||||
broadcasts[0] = 1;
|
||||
broadcasts[1] = 1;
|
||||
broadcasts[2] = 1;
|
||||
broadcasts[3] = 19;
|
||||
Tensor<float, 4, DataLayout> broadcast;
|
||||
broadcast = tensor.broadcast(broadcasts);
|
||||
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(0), 7);
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(1), 3);
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(2), 5);
|
||||
VERIFY_IS_EQUAL(broadcast.dimension(3), 19);
|
||||
|
||||
for (int i = 0; i < 7; ++i) {
|
||||
for (int j = 0; j < 3; ++j) {
|
||||
for (int k = 0; k < 5; ++k) {
|
||||
for (int l = 0; l < 19; ++l) {
|
||||
VERIFY_IS_EQUAL(tensor(i%7,j%3,k%5,l%1), broadcast(i,j,k,l));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void test_cxx11_tensor_broadcasting()
|
||||
{
|
||||
@@ -191,4 +249,8 @@ void test_cxx11_tensor_broadcasting()
|
||||
CALL_SUBTEST(test_static_broadcasting<RowMajor>());
|
||||
CALL_SUBTEST(test_fixed_size_broadcasting<ColMajor>());
|
||||
CALL_SUBTEST(test_fixed_size_broadcasting<RowMajor>());
|
||||
CALL_SUBTEST(test_simple_broadcasting_one_by_n<RowMajor>());
|
||||
CALL_SUBTEST(test_simple_broadcasting_n_by_one<RowMajor>());
|
||||
CALL_SUBTEST(test_simple_broadcasting_one_by_n<ColMajor>());
|
||||
CALL_SUBTEST(test_simple_broadcasting_n_by_one<ColMajor>());
|
||||
}
|
||||
|
||||
@@ -1318,6 +1318,157 @@ void test_cuda_i1e()
|
||||
cudaFree(d_out);
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void test_cuda_igamma_der_a()
|
||||
{
|
||||
Tensor<Scalar, 1> in_x(30);
|
||||
Tensor<Scalar, 1> in_a(30);
|
||||
Tensor<Scalar, 1> out(30);
|
||||
Tensor<Scalar, 1> expected_out(30);
|
||||
out.setZero();
|
||||
|
||||
Array<Scalar, 1, Dynamic> in_a_array(30);
|
||||
Array<Scalar, 1, Dynamic> in_x_array(30);
|
||||
Array<Scalar, 1, Dynamic> expected_out_array(30);
|
||||
|
||||
// See special_functions.cpp for the Python code that generates the test data.
|
||||
|
||||
in_a_array << 0.01, 0.01, 0.01, 0.01, 0.01, 0.1, 0.1, 0.1, 0.1, 0.1, 1.0, 1.0,
|
||||
1.0, 1.0, 1.0, 10.0, 10.0, 10.0, 10.0, 10.0, 100.0, 100.0, 100.0, 100.0,
|
||||
100.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0;
|
||||
|
||||
in_x_array << 1.25668890405e-26, 1.17549435082e-38, 1.20938905072e-05,
|
||||
1.17549435082e-38, 1.17549435082e-38, 5.66572070696e-16, 0.0132865061065,
|
||||
0.0200034203853, 6.29263709118e-17, 1.37160367764e-06, 0.333412038288,
|
||||
1.18135687766, 0.580629033777, 0.170631439426, 0.786686768458,
|
||||
7.63873279537, 13.1944344379, 11.896042354, 10.5830172417, 10.5020942233,
|
||||
92.8918587747, 95.003720371, 86.3715926467, 96.0330217672, 82.6389930677,
|
||||
968.702906754, 969.463546828, 1001.79726022, 955.047416547, 1044.27458568;
|
||||
|
||||
expected_out_array << -32.7256441441, -36.4394150514, -9.66467612263,
|
||||
-36.4394150514, -36.4394150514, -1.0891900302, -2.66351229645,
|
||||
-2.48666868596, -0.929700494428, -3.56327722764, -0.455320135314,
|
||||
-0.391437214323, -0.491352055991, -0.350454834292, -0.471773162921,
|
||||
-0.104084440522, -0.0723646747909, -0.0992828975532, -0.121638215446,
|
||||
-0.122619605294, -0.0317670267286, -0.0359974812869, -0.0154359225363,
|
||||
-0.0375775365921, -0.00794899153653, -0.00777303219211, -0.00796085782042,
|
||||
-0.0125850719397, -0.00455500206958, -0.00476436993148;
|
||||
|
||||
for (int i = 0; i < 30; ++i) {
|
||||
in_x(i) = in_x_array(i);
|
||||
in_a(i) = in_a_array(i);
|
||||
expected_out(i) = expected_out_array(i);
|
||||
}
|
||||
|
||||
std::size_t bytes = in_x.size() * sizeof(Scalar);
|
||||
|
||||
Scalar* d_a;
|
||||
Scalar* d_x;
|
||||
Scalar* d_out;
|
||||
cudaMalloc((void**)(&d_a), bytes);
|
||||
cudaMalloc((void**)(&d_x), bytes);
|
||||
cudaMalloc((void**)(&d_out), bytes);
|
||||
|
||||
cudaMemcpy(d_a, in_a.data(), bytes, cudaMemcpyHostToDevice);
|
||||
cudaMemcpy(d_x, in_x.data(), bytes, cudaMemcpyHostToDevice);
|
||||
|
||||
Eigen::CudaStreamDevice stream;
|
||||
Eigen::GpuDevice gpu_device(&stream);
|
||||
|
||||
Eigen::TensorMap<Eigen::Tensor<Scalar, 1> > gpu_a(d_a, 30);
|
||||
Eigen::TensorMap<Eigen::Tensor<Scalar, 1> > gpu_x(d_x, 30);
|
||||
Eigen::TensorMap<Eigen::Tensor<Scalar, 1> > gpu_out(d_out, 30);
|
||||
|
||||
gpu_out.device(gpu_device) = gpu_a.igamma_der_a(gpu_x);
|
||||
|
||||
assert(cudaMemcpyAsync(out.data(), d_out, bytes, cudaMemcpyDeviceToHost,
|
||||
gpu_device.stream()) == cudaSuccess);
|
||||
assert(cudaStreamSynchronize(gpu_device.stream()) == cudaSuccess);
|
||||
|
||||
for (int i = 0; i < 30; ++i) {
|
||||
VERIFY_IS_APPROX(out(i), expected_out(i));
|
||||
}
|
||||
|
||||
cudaFree(d_a);
|
||||
cudaFree(d_x);
|
||||
cudaFree(d_out);
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void test_cuda_gamma_sample_der_alpha()
|
||||
{
|
||||
Tensor<Scalar, 1> in_alpha(30);
|
||||
Tensor<Scalar, 1> in_sample(30);
|
||||
Tensor<Scalar, 1> out(30);
|
||||
Tensor<Scalar, 1> expected_out(30);
|
||||
out.setZero();
|
||||
|
||||
Array<Scalar, 1, Dynamic> in_alpha_array(30);
|
||||
Array<Scalar, 1, Dynamic> in_sample_array(30);
|
||||
Array<Scalar, 1, Dynamic> expected_out_array(30);
|
||||
|
||||
// See special_functions.cpp for the Python code that generates the test data.
|
||||
|
||||
in_alpha_array << 0.01, 0.01, 0.01, 0.01, 0.01, 0.1, 0.1, 0.1, 0.1, 0.1, 1.0,
|
||||
1.0, 1.0, 1.0, 1.0, 10.0, 10.0, 10.0, 10.0, 10.0, 100.0, 100.0, 100.0,
|
||||
100.0, 100.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0;
|
||||
|
||||
in_sample_array << 1.25668890405e-26, 1.17549435082e-38, 1.20938905072e-05,
|
||||
1.17549435082e-38, 1.17549435082e-38, 5.66572070696e-16, 0.0132865061065,
|
||||
0.0200034203853, 6.29263709118e-17, 1.37160367764e-06, 0.333412038288,
|
||||
1.18135687766, 0.580629033777, 0.170631439426, 0.786686768458,
|
||||
7.63873279537, 13.1944344379, 11.896042354, 10.5830172417, 10.5020942233,
|
||||
92.8918587747, 95.003720371, 86.3715926467, 96.0330217672, 82.6389930677,
|
||||
968.702906754, 969.463546828, 1001.79726022, 955.047416547, 1044.27458568;
|
||||
|
||||
expected_out_array << 7.42424742367e-23, 1.02004297287e-34, 0.0130155240738,
|
||||
1.02004297287e-34, 1.02004297287e-34, 1.96505168277e-13, 0.525575786243,
|
||||
0.713903991771, 2.32077561808e-14, 0.000179348049886, 0.635500453302,
|
||||
1.27561284917, 0.878125852156, 0.41565819538, 1.03606488534,
|
||||
0.885964824887, 1.16424049334, 1.10764479598, 1.04590810812,
|
||||
1.04193666963, 0.965193152414, 0.976217589464, 0.93008035061,
|
||||
0.98153216096, 0.909196397698, 0.98434963993, 0.984738050206,
|
||||
1.00106492525, 0.97734200649, 1.02198794179;
|
||||
|
||||
for (int i = 0; i < 30; ++i) {
|
||||
in_alpha(i) = in_alpha_array(i);
|
||||
in_sample(i) = in_sample_array(i);
|
||||
expected_out(i) = expected_out_array(i);
|
||||
}
|
||||
|
||||
std::size_t bytes = in_alpha.size() * sizeof(Scalar);
|
||||
|
||||
Scalar* d_alpha;
|
||||
Scalar* d_sample;
|
||||
Scalar* d_out;
|
||||
cudaMalloc((void**)(&d_alpha), bytes);
|
||||
cudaMalloc((void**)(&d_sample), bytes);
|
||||
cudaMalloc((void**)(&d_out), bytes);
|
||||
|
||||
cudaMemcpy(d_alpha, in_alpha.data(), bytes, cudaMemcpyHostToDevice);
|
||||
cudaMemcpy(d_sample, in_sample.data(), bytes, cudaMemcpyHostToDevice);
|
||||
|
||||
Eigen::CudaStreamDevice stream;
|
||||
Eigen::GpuDevice gpu_device(&stream);
|
||||
|
||||
Eigen::TensorMap<Eigen::Tensor<Scalar, 1> > gpu_alpha(d_alpha, 30);
|
||||
Eigen::TensorMap<Eigen::Tensor<Scalar, 1> > gpu_sample(d_sample, 30);
|
||||
Eigen::TensorMap<Eigen::Tensor<Scalar, 1> > gpu_out(d_out, 30);
|
||||
|
||||
gpu_out.device(gpu_device) = gpu_alpha.gamma_sample_der_alpha(gpu_sample);
|
||||
|
||||
assert(cudaMemcpyAsync(out.data(), d_out, bytes, cudaMemcpyDeviceToHost,
|
||||
gpu_device.stream()) == cudaSuccess);
|
||||
assert(cudaStreamSynchronize(gpu_device.stream()) == cudaSuccess);
|
||||
|
||||
for (int i = 0; i < 30; ++i) {
|
||||
VERIFY_IS_APPROX(out(i), expected_out(i));
|
||||
}
|
||||
|
||||
cudaFree(d_alpha);
|
||||
cudaFree(d_sample);
|
||||
cudaFree(d_out);
|
||||
}
|
||||
|
||||
void test_cxx11_tensor_cuda()
|
||||
{
|
||||
@@ -1396,5 +1547,11 @@ void test_cxx11_tensor_cuda()
|
||||
|
||||
CALL_SUBTEST_6(test_cuda_i1e<float>());
|
||||
CALL_SUBTEST_6(test_cuda_i1e<double>());
|
||||
|
||||
CALL_SUBTEST_6(test_cuda_igamma_der_a<float>());
|
||||
CALL_SUBTEST_6(test_cuda_igamma_der_a<double>());
|
||||
|
||||
CALL_SUBTEST_6(test_cuda_gamma_sample_der_alpha<float>());
|
||||
CALL_SUBTEST_6(test_cuda_gamma_sample_der_alpha<double>());
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@
|
||||
|
||||
using Eigen::Tensor;
|
||||
|
||||
// Inflation Defenition for each dimention the inflated val would be
|
||||
// Inflation Definition for each dimension the inflated val would be
|
||||
//((dim-1)*strid[dim] +1)
|
||||
|
||||
// for 1 dimnention vector of size 3 with value (4,4,4) with the inflated stride value of 3 would be changed to
|
||||
// for 1 dimension vector of size 3 with value (4,4,4) with the inflated stride value of 3 would be changed to
|
||||
// tensor of size (2*3) +1 = 7 with the value of
|
||||
// (4, 0, 0, 4, 0, 0, 4).
|
||||
|
||||
|
||||
@@ -247,7 +247,7 @@ void test_cuda_trancendental() {
|
||||
}
|
||||
for (int i = 0; i < num_elem; ++i) {
|
||||
std::cout << "Checking elemwise log " << i << " input = " << input2(i) << " full = " << full_prec2(i) << " half = " << half_prec2(i) << std::endl;
|
||||
if(std::abs(input2(i)-1.f)<0.05f) // log lacks accurary nearby 1
|
||||
if(std::abs(input2(i)-1.f)<0.05f) // log lacks accuracy nearby 1
|
||||
VERIFY_IS_APPROX(full_prec2(i)+Eigen::half(0.1f), half_prec2(i)+Eigen::half(0.1f));
|
||||
else
|
||||
VERIFY_IS_APPROX(full_prec2(i), half_prec2(i));
|
||||
|
||||
@@ -37,7 +37,7 @@ void test_cuda_random_uniform()
|
||||
assert(cudaMemcpyAsync(out.data(), d_out, out_bytes, cudaMemcpyDeviceToHost, gpu_device.stream()) == cudaSuccess);
|
||||
assert(cudaStreamSynchronize(gpu_device.stream()) == cudaSuccess);
|
||||
|
||||
// For now we just check thes code doesn't crash.
|
||||
// For now we just check this code doesn't crash.
|
||||
// TODO: come up with a valid test of randomness
|
||||
}
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ void test_forward_adolc()
|
||||
}
|
||||
|
||||
{
|
||||
// simple instanciation tests
|
||||
// simple instantiation tests
|
||||
Matrix<adtl::adouble,2,1> x;
|
||||
foo(x);
|
||||
Matrix<adtl::adouble,Dynamic,Dynamic> A(4,4);;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
|
||||
// import basic and product tests for deprectaed DynamicSparseMatrix
|
||||
// import basic and product tests for deprecated DynamicSparseMatrix
|
||||
#define EIGEN_NO_DEPRECATED_WARNING
|
||||
#include "sparse_basic.cpp"
|
||||
#include "sparse_product.cpp"
|
||||
|
||||
@@ -335,6 +335,7 @@ template<typename ArrayType> void array_special_functions()
|
||||
ArrayType test = betainc(a, b + one, x) + eps;
|
||||
verify_component_wise(test, expected););
|
||||
}
|
||||
#endif // EIGEN_HAS_C99_MATH
|
||||
|
||||
// Test Bessel function i0e. Reference results obtained with SciPy.
|
||||
{
|
||||
@@ -375,7 +376,100 @@ template<typename ArrayType> void array_special_functions()
|
||||
CALL_SUBTEST(res = i1e(x);
|
||||
verify_component_wise(res, expected););
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Code to generate the data for the following two test cases.
|
||||
N = 5
|
||||
np.random.seed(3)
|
||||
|
||||
a = np.logspace(-2, 3, 6)
|
||||
a = np.ravel(np.tile(np.reshape(a, [-1, 1]), [1, N]))
|
||||
x = np.random.gamma(a, 1.0)
|
||||
x = np.maximum(x, np.finfo(np.float32).tiny)
|
||||
|
||||
def igamma(a, x):
|
||||
return mpmath.gammainc(a, 0, x, regularized=True)
|
||||
|
||||
def igamma_der_a(a, x):
|
||||
res = mpmath.diff(lambda a_prime: igamma(a_prime, x), a)
|
||||
return np.float64(res)
|
||||
|
||||
def gamma_sample_der_alpha(a, x):
|
||||
igamma_x = igamma(a, x)
|
||||
def igammainv_of_igamma(a_prime):
|
||||
return mpmath.findroot(lambda x_prime: igamma(a_prime, x_prime) -
|
||||
igamma_x, x, solver='newton')
|
||||
return np.float64(mpmath.diff(igammainv_of_igamma, a))
|
||||
|
||||
v_igamma_der_a = np.vectorize(igamma_der_a)(a, x)
|
||||
v_gamma_sample_der_alpha = np.vectorize(gamma_sample_der_alpha)(a, x)
|
||||
*/
|
||||
|
||||
#if EIGEN_HAS_C99_MATH
|
||||
// Test igamma_der_a
|
||||
{
|
||||
ArrayType a(30);
|
||||
ArrayType x(30);
|
||||
ArrayType res(30);
|
||||
ArrayType v(30);
|
||||
|
||||
a << 0.01, 0.01, 0.01, 0.01, 0.01, 0.1, 0.1, 0.1, 0.1, 0.1, 1.0, 1.0, 1.0,
|
||||
1.0, 1.0, 10.0, 10.0, 10.0, 10.0, 10.0, 100.0, 100.0, 100.0, 100.0,
|
||||
100.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0;
|
||||
|
||||
x << 1.25668890405e-26, 1.17549435082e-38, 1.20938905072e-05,
|
||||
1.17549435082e-38, 1.17549435082e-38, 5.66572070696e-16,
|
||||
0.0132865061065, 0.0200034203853, 6.29263709118e-17, 1.37160367764e-06,
|
||||
0.333412038288, 1.18135687766, 0.580629033777, 0.170631439426,
|
||||
0.786686768458, 7.63873279537, 13.1944344379, 11.896042354,
|
||||
10.5830172417, 10.5020942233, 92.8918587747, 95.003720371,
|
||||
86.3715926467, 96.0330217672, 82.6389930677, 968.702906754,
|
||||
969.463546828, 1001.79726022, 955.047416547, 1044.27458568;
|
||||
|
||||
v << -32.7256441441, -36.4394150514, -9.66467612263, -36.4394150514,
|
||||
-36.4394150514, -1.0891900302, -2.66351229645, -2.48666868596,
|
||||
-0.929700494428, -3.56327722764, -0.455320135314, -0.391437214323,
|
||||
-0.491352055991, -0.350454834292, -0.471773162921, -0.104084440522,
|
||||
-0.0723646747909, -0.0992828975532, -0.121638215446, -0.122619605294,
|
||||
-0.0317670267286, -0.0359974812869, -0.0154359225363, -0.0375775365921,
|
||||
-0.00794899153653, -0.00777303219211, -0.00796085782042,
|
||||
-0.0125850719397, -0.00455500206958, -0.00476436993148;
|
||||
|
||||
CALL_SUBTEST(res = igamma_der_a(a, x); verify_component_wise(res, v););
|
||||
}
|
||||
|
||||
// Test gamma_sample_der_alpha
|
||||
{
|
||||
ArrayType alpha(30);
|
||||
ArrayType sample(30);
|
||||
ArrayType res(30);
|
||||
ArrayType v(30);
|
||||
|
||||
alpha << 0.01, 0.01, 0.01, 0.01, 0.01, 0.1, 0.1, 0.1, 0.1, 0.1, 1.0, 1.0,
|
||||
1.0, 1.0, 1.0, 10.0, 10.0, 10.0, 10.0, 10.0, 100.0, 100.0, 100.0, 100.0,
|
||||
100.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0;
|
||||
|
||||
sample << 1.25668890405e-26, 1.17549435082e-38, 1.20938905072e-05,
|
||||
1.17549435082e-38, 1.17549435082e-38, 5.66572070696e-16,
|
||||
0.0132865061065, 0.0200034203853, 6.29263709118e-17, 1.37160367764e-06,
|
||||
0.333412038288, 1.18135687766, 0.580629033777, 0.170631439426,
|
||||
0.786686768458, 7.63873279537, 13.1944344379, 11.896042354,
|
||||
10.5830172417, 10.5020942233, 92.8918587747, 95.003720371,
|
||||
86.3715926467, 96.0330217672, 82.6389930677, 968.702906754,
|
||||
969.463546828, 1001.79726022, 955.047416547, 1044.27458568;
|
||||
|
||||
v << 7.42424742367e-23, 1.02004297287e-34, 0.0130155240738,
|
||||
1.02004297287e-34, 1.02004297287e-34, 1.96505168277e-13, 0.525575786243,
|
||||
0.713903991771, 2.32077561808e-14, 0.000179348049886, 0.635500453302,
|
||||
1.27561284917, 0.878125852156, 0.41565819538, 1.03606488534,
|
||||
0.885964824887, 1.16424049334, 1.10764479598, 1.04590810812,
|
||||
1.04193666963, 0.965193152414, 0.976217589464, 0.93008035061,
|
||||
0.98153216096, 0.909196397698, 0.98434963993, 0.984738050206,
|
||||
1.00106492525, 0.97734200649, 1.02198794179;
|
||||
|
||||
CALL_SUBTEST(res = gamma_sample_der_alpha(alpha, sample);
|
||||
verify_component_wise(res, v););
|
||||
}
|
||||
#endif // EIGEN_HAS_C99_MATH
|
||||
}
|
||||
|
||||
void test_special_functions()
|
||||
|
||||
Reference in New Issue
Block a user