Add unit test for random/Threefry
authorRoland Schulz <roland@utk.edu>
Tue, 1 Jul 2014 08:54:42 +0000 (04:54 -0400)
committerErik Lindahl <erik@kth.se>
Mon, 28 Jul 2014 16:28:36 +0000 (18:28 +0200)
Change-Id: I5f9d60c594c0d7a6925b829658119d2fdea5d113

src/gromacs/random/CMakeLists.txt
src/gromacs/random/tests/CMakeLists.txt [new file with mode: 0644]
src/gromacs/random/tests/random.cpp [new file with mode: 0644]
src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_0.xml [new file with mode: 0644]
src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_1.xml [new file with mode: 0644]
src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_2.xml [new file with mode: 0644]

index 6fb36de7b35f82f50da874f12d8dee0d5e39bbae..e819cc2ab11cbfd3244dabbdfd61b0d21d1f8300 100644 (file)
@@ -34,3 +34,6 @@
 
 file(GLOB RANDOM_SOURCES *.c)
 set(LIBGROMACS_SOURCES ${LIBGROMACS_SOURCES} ${RANDOM_SOURCES} PARENT_SCOPE)
+if (BUILD_TESTING)
+    add_subdirectory(tests)
+endif()
diff --git a/src/gromacs/random/tests/CMakeLists.txt b/src/gromacs/random/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..9ccc41f
--- /dev/null
@@ -0,0 +1,36 @@
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2014, by the GROMACS development team, led by
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+# and including many others, as listed in the AUTHORS file in the
+# top-level source directory and at http://www.gromacs.org.
+#
+# GROMACS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# GROMACS 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with GROMACS; if not, see
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+#
+# If you want to redistribute modifications to GROMACS, please
+# consider that scientific software is very special. Version
+# control is crucial - bugs must be traceable. We will be happy to
+# consider code for inclusion in the official distribution, but
+# derived work must not be called official GROMACS. Details are found
+# in the README & COPYING files - if they are missing, get the
+# official version at http://www.gromacs.org.
+#
+# To help us fund GROMACS development, we humbly ask that you cite
+# the research papers on the package. Check out http://www.gromacs.org.
+
+gmx_add_unit_test(RandomUnitTests random-test
+                  random.cpp)
diff --git a/src/gromacs/random/tests/random.cpp b/src/gromacs/random/tests/random.cpp
new file mode 100644 (file)
index 0000000..835a638
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2014, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Tests utilities for random number generation.
+ *
+ * \author Roland Schulz <roland@utk.edu>
+ * \ingroup module_random
+ */
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "external/Random123-1.08/include/Random123/threefry.h"
+
+#include "testutils/refdata.h"
+
+namespace
+{
+
+class Threefry : public ::testing::TestWithParam<std::pair<threefry2x64_ctr_t,
+                                                           threefry2x64_key_t> >
+{
+};
+
+TEST_P(Threefry, 2x64)
+{
+    gmx::test::TestReferenceData    data;
+
+    gmx::test::TestReferenceChecker checker(data.rootChecker());
+
+    const std::pair<threefry2x64_ctr_t, threefry2x64_key_t> input = GetParam();
+
+    threefry2x64_ctr_t rand = threefry2x64(input.first, input.second);
+
+    checker.checkSequenceArray(2, rand.v, "Threefry2x64");
+}
+
+//The input values are the same as the ones used by Known Answer Tests (kat) in
+//Random123. Reference values agree with those in kat_vectors
+/** input value: zero */
+const threefry2x64_ctr_t tf_zero = {{0, 0}};
+/** input value: max unit64 */
+const threefry2x64_ctr_t tf_max  = {{std::numeric_limits<gmx_uint64_t>::max(),
+                                     std::numeric_limits<gmx_uint64_t>::max()}};
+/** input value: Pi */
+const threefry2x64_ctr_t tf_pi1  = {{0x243f6a8885a308d3, 0x13198a2e03707344}};
+/** input value: More Pi */
+const threefry2x64_ctr_t tf_pi2  = {{0xa4093822299f31d0, 0x082efa98ec4e6c89}};
+
+INSTANTIATE_TEST_CASE_P(0_ff_pi, Threefry,
+                            ::testing::Values(std::make_pair(tf_zero, tf_zero),
+                                              std::make_pair(tf_max, tf_max),
+                                              std::make_pair(tf_pi1, tf_pi2)));
+
+} // namespace
diff --git a/src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_0.xml b/src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_0.xml
new file mode 100644 (file)
index 0000000..7993aef
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Sequence Name="Threefry2x64">
+    <Int Name="Length">2</Int>
+    <UInt64>14030652003081164901</UInt64>
+    <UInt64>8034964082011408461</UInt64>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_1.xml b/src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_1.xml
new file mode 100644 (file)
index 0000000..8ab9e38
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Sequence Name="Threefry2x64">
+    <Int Name="Length">2</Int>
+    <UInt64>16153488019559360378</UInt64>
+    <UInt64>15016746978262092648</UInt64>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_2.xml b/src/gromacs/random/tests/refdata/0_ff_pi_Threefry_2x64_2.xml
new file mode 100644 (file)
index 0000000..f70584c
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Sequence Name="Threefry2x64">
+    <Int Name="Length">2</Int>
+    <UInt64>2755214720294128369</UInt64>
+    <UInt64>6250577789015102758</UInt64>
+  </Sequence>
+</ReferenceData>