diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..1f968f32f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,106 @@ +cmake_minimum_required(VERSION 3.23) + +project(ranger + DESCRIPTION "A Fast Implementation of Random Forests" + HOMEPAGE_URL "https://github.com/imbs-hl/ranger" + LANGUAGES C CXX + VERSION 0.18.0) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +set(CMAKE_THREAD_PREFER_PTHREAD TRUE) +set(THREADS_PREFER_PTHREAD_FLAG TRUE) +find_package(Threads REQUIRED) + +add_library(ranger) +add_library(Ranger::ranger ALIAS ranger) + +target_compile_features(ranger PUBLIC cxx_std_14) + +target_sources(ranger + PRIVATE + src/Data.cpp + src/Forest.cpp + src/ForestClassification.cpp + src/ForestProbability.cpp + src/ForestRegression.cpp + src/ForestSurvival.cpp + src/Tree.cpp + src/TreeClassification.cpp + src/TreeProbability.cpp + src/TreeRegression.cpp + src/TreeSurvival.cpp + src/utility.cpp + src/utility/ArgumentHandler.cpp + PUBLIC + FILE_SET HEADERS + BASE_DIRS include + FILES + include/ranger/ArgumentHandler.h + include/ranger/Data.h + include/ranger/DataChar.h + include/ranger/DataDouble.h + include/ranger/DataFloat.h + include/ranger/Forest.h + include/ranger/ForestClassification.h + include/ranger/ForestProbability.h + include/ranger/ForestRegression.h + include/ranger/ForestSurvival.h + include/ranger/Tree.h + include/ranger/TreeClassification.h + include/ranger/TreeProbability.h + include/ranger/TreeRegression.h + include/ranger/TreeSurvival.h + include/ranger/getopt.h + include/ranger/globals.h + include/ranger/utility.h + include/ranger/version.h +) + +target_include_directories(ranger + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/include/ranger +) + +target_link_libraries(ranger PUBLIC Threads::Threads) + +add_executable(ranger-cli src/cli/main.cpp) +set_target_properties(ranger-cli PROPERTIES OUTPUT_NAME ranger) +target_include_directories(ranger-cli PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/ranger) +target_link_libraries(ranger-cli PRIVATE Ranger::ranger) + +install(TARGETS ranger ranger-cli + EXPORT RangerTargets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) + +install(EXPORT RangerTargets + FILE RangerTargets.cmake + NAMESPACE Ranger:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Ranger +) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/RangerConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) + +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RangerConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/RangerConfig.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Ranger +) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/RangerConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/RangerConfigVersion.cmake" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Ranger +) diff --git a/cmake/RangerConfig.cmake.in b/cmake/RangerConfig.cmake.in new file mode 100644 index 000000000..c2f368521 --- /dev/null +++ b/cmake/RangerConfig.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/RangerTargets.cmake") diff --git a/cpp_version/.cproject b/cpp_version/.cproject deleted file mode 100644 index b4e456f7f..000000000 --- a/cpp_version/.cproject +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cpp_version/.gitignore b/cpp_version/.gitignore deleted file mode 100644 index 2f08f906f..000000000 --- a/cpp_version/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -build/* -.settings/* -.idea/* diff --git a/cpp_version/.project b/cpp_version/.project deleted file mode 100644 index 9116a9256..000000000 --- a/cpp_version/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - ranger - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/cpp_version/CMakeLists.txt b/cpp_version/CMakeLists.txt deleted file mode 100644 index fb16e4e53..000000000 --- a/cpp_version/CMakeLists.txt +++ /dev/null @@ -1,82 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(ranger) -include (GNUInstallDirs) - -## ======================================================================================## -## Check for C++14 -## ======================================================================================## -set (CMAKE_CXX_STANDARD 14) -set (CMAKE_CXX_STANDARD_REQUIRED TRUE) - -## ======================================================================================## -## Compiler flags -## ======================================================================================## -include (CheckCXXCompilerFlag) -check_cxx_compiler_flag ("-Wall" COMPILER_SUPPORTS_WALL) -if (COMPILER_SUPPORTS_WALL) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") -endif () - -## ======================================================================================## -## Threads -## ======================================================================================## -set(CMAKE_THREAD_PREFER_PTHREAD TRUE) -set(THREADS_PREFER_PTHREAD_FLAG TRUE) -find_package(Threads REQUIRED) - -## ======================================================================================## -## Subdirectories and source files -## ======================================================================================## -include_directories(src src/utility src/Forest src/Tree) -file(GLOB_RECURSE SOURCES src/*.cpp) - -## ======================================================================================## -## Debug and release targets -## ======================================================================================## -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() -ADD_CUSTOM_TARGET(debug - COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all - COMMENT "Switch CMAKE_BUILD_TYPE to Debug" - ) -ADD_CUSTOM_TARGET(release - COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release ${CMAKE_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all - COMMENT "Switch CMAKE_BUILD_TYPE to Release" - ) - -## ======================================================================================## -## Library -## ======================================================================================## -file(GLOB_RECURSE SOURCES src/utility/*.cpp src/Forest/*.cpp src/Tree/*.cpp) -if (MSVC) - list(APPEND SOURCES src/getopt/getopt.c) -endif () -option(BUILD_SHARED_LIBS "shared/static lib" OFF) -add_library(ranger ${SOURCES}) -target_include_directories(ranger PUBLIC src/utility src/Forest src/Tree src) -if (MSVC) - target_include_directories(ranger PRIVATE src/getopt) -endif () -target_link_libraries(ranger Threads::Threads) -install(TARGETS ranger RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -file(GLOB_RECURSE HEADERS src/*.h) -install (FILES ${HEADERS} DESTINATION include/ranger) - -## ======================================================================================## -## Executable -## ======================================================================================## -add_executable(ranger-cli src/main.cpp) -set_target_properties(ranger-cli PROPERTIES OUTPUT_NAME ranger) -target_link_libraries(ranger-cli ranger) -install(TARGETS ranger-cli DESTINATION ${CMAKE_INSTALL_BINDIR}) - -## ======================================================================================## -## Test -## ======================================================================================## -enable_testing() -add_test(NAME help COMMAND ranger --help) diff --git a/cpp_version/COPYING b/cpp_version/COPYING deleted file mode 100644 index e073cef02..000000000 --- a/cpp_version/COPYING +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) [2014-2018] [Marvin N. Wright] - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/cpp_version/cross_compile/build_all b/cpp_version/cross_compile/build_all deleted file mode 100755 index 6eb6115af..000000000 --- a/cpp_version/cross_compile/build_all +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -rm -r ../build -mkdir ../build -cd ../build -cmake -DCMAKE_TOOLCHAIN_FILE=../cross_compile/toolchain_win64.cmake .. -make -cp ranger.exe ../../ranger64.exe -cd ../cross_compile - -rm -r ../build -mkdir ../build -cd ../build -cmake -DCMAKE_TOOLCHAIN_FILE=../cross_compile/toolchain_win32.cmake .. -make -cp ranger.exe ../../ranger32.exe -cd ../cross_compile diff --git a/cpp_version/cross_compile/toolchain_win32.cmake b/cpp_version/cross_compile/toolchain_win32.cmake deleted file mode 100644 index 61731bf84..000000000 --- a/cpp_version/cross_compile/toolchain_win32.cmake +++ /dev/null @@ -1,20 +0,0 @@ -# the name of the target operating system -SET(CMAKE_SYSTEM_NAME Windows) - -# which compilers to use for C and C++ -SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc) -SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix) -SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres) - -# here is the target environment located -SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) - -# adjust the default behaviour of the FIND_XXX() commands: -# search headers and libraries in the target environment, search -# programs in the host environment -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -# static linking -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static") diff --git a/cpp_version/cross_compile/toolchain_win64.cmake b/cpp_version/cross_compile/toolchain_win64.cmake deleted file mode 100644 index 4f0270e56..000000000 --- a/cpp_version/cross_compile/toolchain_win64.cmake +++ /dev/null @@ -1,20 +0,0 @@ -# the name of the target operating system -SET(CMAKE_SYSTEM_NAME Windows) - -# which compilers to use for C and C++ -SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) -SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++-posix) -SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) - -# here is the target environment located -SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) - -# adjust the default behaviour of the FIND_XXX() commands: -# search headers and libraries in the target environment, search -# programs in the host environment -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -# static linking -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static") \ No newline at end of file diff --git a/cpp_version/src/.gitignore b/cpp_version/src/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/cpp_version/src/Forest/.gitignore b/cpp_version/src/Forest/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/cpp_version/src/Forest/Forest.cpp b/cpp_version/src/Forest/Forest.cpp deleted file mode 120000 index ec0b51236..000000000 --- a/cpp_version/src/Forest/Forest.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/Forest.cpp \ No newline at end of file diff --git a/cpp_version/src/Forest/Forest.h b/cpp_version/src/Forest/Forest.h deleted file mode 120000 index a334fda4a..000000000 --- a/cpp_version/src/Forest/Forest.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/Forest.h \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestClassification.cpp b/cpp_version/src/Forest/ForestClassification.cpp deleted file mode 120000 index 4cc54861f..000000000 --- a/cpp_version/src/Forest/ForestClassification.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestClassification.cpp \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestClassification.h b/cpp_version/src/Forest/ForestClassification.h deleted file mode 120000 index f90e23cc6..000000000 --- a/cpp_version/src/Forest/ForestClassification.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestClassification.h \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestProbability.cpp b/cpp_version/src/Forest/ForestProbability.cpp deleted file mode 120000 index 51a8e788e..000000000 --- a/cpp_version/src/Forest/ForestProbability.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestProbability.cpp \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestProbability.h b/cpp_version/src/Forest/ForestProbability.h deleted file mode 120000 index 586dc7ed3..000000000 --- a/cpp_version/src/Forest/ForestProbability.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestProbability.h \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestRegression.cpp b/cpp_version/src/Forest/ForestRegression.cpp deleted file mode 120000 index dc498910c..000000000 --- a/cpp_version/src/Forest/ForestRegression.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestRegression.cpp \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestRegression.h b/cpp_version/src/Forest/ForestRegression.h deleted file mode 120000 index 42797b1d3..000000000 --- a/cpp_version/src/Forest/ForestRegression.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestRegression.h \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestSurvival.cpp b/cpp_version/src/Forest/ForestSurvival.cpp deleted file mode 120000 index 1d2d0b57b..000000000 --- a/cpp_version/src/Forest/ForestSurvival.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestSurvival.cpp \ No newline at end of file diff --git a/cpp_version/src/Forest/ForestSurvival.h b/cpp_version/src/Forest/ForestSurvival.h deleted file mode 120000 index 9a4d35c58..000000000 --- a/cpp_version/src/Forest/ForestSurvival.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/ForestSurvival.h \ No newline at end of file diff --git a/cpp_version/src/Tree/.gitignore b/cpp_version/src/Tree/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/cpp_version/src/Tree/Tree.cpp b/cpp_version/src/Tree/Tree.cpp deleted file mode 120000 index 7719780d1..000000000 --- a/cpp_version/src/Tree/Tree.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/Tree.cpp \ No newline at end of file diff --git a/cpp_version/src/Tree/Tree.h b/cpp_version/src/Tree/Tree.h deleted file mode 120000 index 98086234c..000000000 --- a/cpp_version/src/Tree/Tree.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/Tree.h \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeClassification.cpp b/cpp_version/src/Tree/TreeClassification.cpp deleted file mode 120000 index 8036d54a8..000000000 --- a/cpp_version/src/Tree/TreeClassification.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeClassification.cpp \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeClassification.h b/cpp_version/src/Tree/TreeClassification.h deleted file mode 120000 index e191d06ee..000000000 --- a/cpp_version/src/Tree/TreeClassification.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeClassification.h \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeProbability.cpp b/cpp_version/src/Tree/TreeProbability.cpp deleted file mode 120000 index 88b38531b..000000000 --- a/cpp_version/src/Tree/TreeProbability.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeProbability.cpp \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeProbability.h b/cpp_version/src/Tree/TreeProbability.h deleted file mode 120000 index 5e8c4e22d..000000000 --- a/cpp_version/src/Tree/TreeProbability.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeProbability.h \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeRegression.cpp b/cpp_version/src/Tree/TreeRegression.cpp deleted file mode 120000 index 6b8393281..000000000 --- a/cpp_version/src/Tree/TreeRegression.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeRegression.cpp \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeRegression.h b/cpp_version/src/Tree/TreeRegression.h deleted file mode 120000 index 50c2bddff..000000000 --- a/cpp_version/src/Tree/TreeRegression.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeRegression.h \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeSurvival.cpp b/cpp_version/src/Tree/TreeSurvival.cpp deleted file mode 120000 index fdc913945..000000000 --- a/cpp_version/src/Tree/TreeSurvival.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeSurvival.cpp \ No newline at end of file diff --git a/cpp_version/src/Tree/TreeSurvival.h b/cpp_version/src/Tree/TreeSurvival.h deleted file mode 120000 index eb0640368..000000000 --- a/cpp_version/src/Tree/TreeSurvival.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/TreeSurvival.h \ No newline at end of file diff --git a/cpp_version/src/globals.h b/cpp_version/src/globals.h deleted file mode 120000 index 1ddd2b494..000000000 --- a/cpp_version/src/globals.h +++ /dev/null @@ -1 +0,0 @@ -../../src/globals.h \ No newline at end of file diff --git a/cpp_version/src/utility/Data.cpp b/cpp_version/src/utility/Data.cpp deleted file mode 120000 index a6868a3c7..000000000 --- a/cpp_version/src/utility/Data.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/Data.cpp \ No newline at end of file diff --git a/cpp_version/src/utility/Data.h b/cpp_version/src/utility/Data.h deleted file mode 120000 index 6abe8f118..000000000 --- a/cpp_version/src/utility/Data.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/Data.h \ No newline at end of file diff --git a/cpp_version/src/utility/DataChar.h b/cpp_version/src/utility/DataChar.h deleted file mode 120000 index adb6d3e19..000000000 --- a/cpp_version/src/utility/DataChar.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/DataChar.h \ No newline at end of file diff --git a/cpp_version/src/utility/DataDouble.h b/cpp_version/src/utility/DataDouble.h deleted file mode 120000 index 440f7d9f8..000000000 --- a/cpp_version/src/utility/DataDouble.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/DataDouble.h \ No newline at end of file diff --git a/cpp_version/src/utility/DataFloat.h b/cpp_version/src/utility/DataFloat.h deleted file mode 120000 index 457ad0301..000000000 --- a/cpp_version/src/utility/DataFloat.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/DataFloat.h \ No newline at end of file diff --git a/cpp_version/src/utility/utility.cpp b/cpp_version/src/utility/utility.cpp deleted file mode 120000 index 90b3c1617..000000000 --- a/cpp_version/src/utility/utility.cpp +++ /dev/null @@ -1 +0,0 @@ -../../../src/utility.cpp \ No newline at end of file diff --git a/cpp_version/src/utility/utility.h b/cpp_version/src/utility/utility.h deleted file mode 120000 index 76bf57ba5..000000000 --- a/cpp_version/src/utility/utility.h +++ /dev/null @@ -1 +0,0 @@ -../../../src/utility.h \ No newline at end of file diff --git a/cpp_version/test/.gitignore b/cpp_version/test/.gitignore deleted file mode 100644 index 30e89231c..000000000 --- a/cpp_version/test/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/gtest-1.7.0 -/build -/.settings -build/* diff --git a/cpp_version/test/CMakeLists.txt b/cpp_version/test/CMakeLists.txt deleted file mode 100644 index 82ea6d51c..000000000 --- a/cpp_version/test/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -project(ranger_test) -cmake_minimum_required(VERSION 2.0) - -## ======================================================================================## -## Compiler flags -## ======================================================================================## -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14") -set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -pthread) - -## ======================================================================================## -## Dependencies -## ======================================================================================## -include_directories(../src ../src/utility ../src/Forest ../src/Tree) -add_subdirectory(../ ranger_build) - -## ======================================================================================## -## Subdirectories and source files -## ======================================================================================## -file(GLOB TEST_SOURCES *.cpp) -file(GLOB_RECURSE RG_SOURCES ../src/*.cpp) - -## Remove main file from ranger -get_filename_component(MAIN_FILE . ABSOLUTE) -SET(MAIN_FILE "${MAIN_FILE}/../src/main.cpp") -list(REMOVE_ITEM RG_SOURCES "${MAIN_FILE}") -## - -set(SOURCES "${RG_SOURCES};${TEST_SOURCES}") - -## ======================================================================================## -## Google test -## ======================================================================================## -ADD_SUBDIRECTORY (gtest-1.7.0) -enable_testing() -include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR}) -add_test(runUnitTests runUnitTests) - -## ======================================================================================## -## Executable -## ======================================================================================## -add_executable(runUnitTests ${SOURCES}) -add_dependencies(runUnitTests ranger) -target_link_libraries(runUnitTests gtest gtest_main) - diff --git a/cpp_version/test/README.md b/cpp_version/test/README.md deleted file mode 100644 index 0fdede6ba..000000000 --- a/cpp_version/test/README.md +++ /dev/null @@ -1,13 +0,0 @@ -To test the utility functions in C++, first install the google test framework (in this directory): - - wget https://github.com/google/googletest/archive/release-1.7.0.tar.gz - tar xf release-1.7.0.tar.gz - mv googletest-release-1.7.0 gtest-1.7.0 - -Then run the usual cmake commands: - - mkdir build - cd build - cmake .. - make - ./runUnitTests diff --git a/cpp_version/test/test_all.cpp b/cpp_version/test/test_all.cpp deleted file mode 100644 index 8e8aad53f..000000000 --- a/cpp_version/test/test_all.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "gtest/gtest.h" - - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} - - diff --git a/cpp_version/test/testthat.R b/cpp_version/test/testthat.R deleted file mode 100644 index 5aea37d66..000000000 --- a/cpp_version/test/testthat.R +++ /dev/null @@ -1,28 +0,0 @@ - -library(ranger) -library(data.table) -library(testthat) -library(survival) - -# Function to call C++ version from R -ranger_cpp <- function(data, ...) { - if (is.data.frame(data) && any(sapply(data, is.numeric))) { - idx_numeric <- sapply(data, is.numeric) - data[, !idx_numeric] <- lapply(data[, !idx_numeric, drop = FALSE], as.numeric) - } - fwrite(data, "temp_data.csv") - ret <- system2("../../build/ranger", - args = c("--verbose", "--file temp_data.csv", paste0("--", names(list(...)), " ", list(...))), - stdout = TRUE, stderr = TRUE) - if (length(ret) == 1 && nchar(ret) >= 5 && substr(ret, 1, 5) == "Error") { - stop(ret) - } - unlink("temp_data.csv") - ret -} - -test_dir("testthat") - - - - diff --git a/cpp_version/test/testthat/.gitignore b/cpp_version/test/testthat/.gitignore deleted file mode 100644 index b1873686f..000000000 --- a/cpp_version/test/testthat/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ranger_out.* \ No newline at end of file diff --git a/cpp_version/test/testthat/test_arguments.R b/cpp_version/test/testthat/test_arguments.R deleted file mode 100644 index 23a1786d2..000000000 --- a/cpp_version/test/testthat/test_arguments.R +++ /dev/null @@ -1,11 +0,0 @@ - -context("ranger_cpp_arguments") - -test_that("Error if sample fraction is 0 or >1", { - expect_warning( - expect_error(ranger_cpp(data = iris, depvarname = "Species", ntree = 5, fraction = 0), - "Error: Illegal argument for option 'fraction'\\. Please give a value in \\(0,1\\]\\. See '--help' for details\\. Ranger will EXIT now\\.")) - expect_warning( - expect_error(ranger_cpp(data = iris, depvarname = "Species", ntree = 5, fraction = 1.1), - "Error: Illegal argument for option 'fraction'\\. Please give a value in \\(0,1\\]\\. See '--help' for details\\. Ranger will EXIT now\\.")) -}) diff --git a/cpp_version/test/testthat/test_classification.R b/cpp_version/test/testthat/test_classification.R deleted file mode 100644 index b48ede461..000000000 --- a/cpp_version/test/testthat/test_classification.R +++ /dev/null @@ -1,49 +0,0 @@ - -context("ranger_cpp_classification") - -test_that("Prediction is equal to R version", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Species", ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = iris, predict = "ranger_out.forest", seed = 20) - preds_cpp <- as.data.frame(fread("ranger_out.prediction"))[, 1] - - # R version - rf <- ranger(Species ~ ., iris, num.trees = 5, seed = 10) - preds_r <- as.numeric(predict(rf, iris, seed = 20)$predictions) - - expect_equal(preds_cpp, preds_r) -}) - -test_that("Predictions are positive numbers", { - rf <- ranger_cpp(data = iris, depvarname = "Species", ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = iris, predict = "ranger_out.forest") - preds_cpp <- as.data.frame(fread("ranger_out.prediction"))[, 1] - expect_is(preds_cpp, "integer") - expect_true(all(preds_cpp > 0)) -}) - -test_that("Same result with default splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Species", ntree = 5, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Species ~ ., iris, num.trees = 5, seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with extratrees splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Species", ntree = 5, splitrule = 5, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Species ~ ., iris, num.trees = 5, splitrule = "extratrees", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) diff --git a/cpp_version/test/testthat/test_probability.R b/cpp_version/test/testthat/test_probability.R deleted file mode 100644 index a2a2c0b3a..000000000 --- a/cpp_version/test/testthat/test_probability.R +++ /dev/null @@ -1,53 +0,0 @@ - -context("ranger_cpp_probability") - -test_that("Prediction is equal to R version", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Species", probability = "", ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = iris, predict = "ranger_out.forest", probability = "", seed = 20) - preds_cpp <- as.matrix(fread("ranger_out.prediction")) - colnames(preds_cpp) <- NULL - - # R version - rf <- ranger(Species ~ ., iris, probability = TRUE, num.trees = 5, seed = 10) - preds_r <- predict(rf, iris, seed = 20)$predictions - colnames(preds_r) <- NULL - - expect_equal(round(preds_cpp, 4), round(preds_r, 4)) -}) - -test_that("Predictions are probabilites", { - rf <- ranger_cpp(data = iris, depvarname = "Species", probability = "", ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = iris, predict = "ranger_out.forest", probability = "") - preds_cpp <- as.matrix(fread("ranger_out.prediction")) - expect_is(preds_cpp, "matrix") - expect_equal(dim(preds_cpp), c(150, 3)) - expect_true(all(preds_cpp >= 0)) - expect_true(all(preds_cpp <= 1)) -}) - -test_that("Same result with default splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Species", probability = "", ntree = 5, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Species ~ ., iris, probability = TRUE, num.trees = 5, seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with extratrees splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Species", probability = "", ntree = 5, splitrule = 5, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Species ~ ., iris, probability = TRUE, num.trees = 5, splitrule = "extratrees", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) diff --git a/cpp_version/test/testthat/test_regression.R b/cpp_version/test/testthat/test_regression.R deleted file mode 100644 index 015955bc0..000000000 --- a/cpp_version/test/testthat/test_regression.R +++ /dev/null @@ -1,98 +0,0 @@ - -context("ranger_cpp_regression") - -test_that("Prediction is equal to R version", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Sepal.Length", treetype = 3, ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = iris, treetype = 3, predict = "ranger_out.forest", seed = 20) - preds_cpp <- as.data.frame(fread("ranger_out.prediction"))[, 1] - - # R version - rf <- ranger(Sepal.Length ~ ., iris, num.trees = 5, seed = 10) - preds_r <- as.numeric(predict(rf, iris, seed = 20)$predictions) - - expect_equal(round(preds_cpp, 4), round(preds_r, 4)) -}) - -test_that("Predictions are in range of original data", { - rf <- ranger_cpp(data = iris, depvarname = "Sepal.Width", treetype = 3, ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = iris, predict = "ranger_out.forest", treetype = 3) - preds_cpp <- as.data.frame(fread("ranger_out.prediction"))[, 1] - expect_is(preds_cpp, "numeric") - expect_true(all(preds_cpp >= min(iris$Sepal.Width))) - expect_true(all(preds_cpp <= max(iris$Sepal.Width))) -}) - -test_that("Same result with default splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Petal.Length", treetype = 3, ntree = 5, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Petal.Length ~ ., iris, num.trees = 5, seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with extratrees splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Sepal.Length", treetype = 3, ntree = 5, splitrule = 5, catvars = "Species", seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Sepal.Length ~ ., iris, num.trees = 5, splitrule = "extratrees", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with maxstat splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Sepal.Length", treetype = 3, ntree = 5, splitrule = 4, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Sepal.Length ~ ., iris, num.trees = 5, splitrule = "maxstat", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with beta splitting", { - # Generate data with 0..1 outcome - n <- 100 - p <- 4 - beta <- c(0, 1, 2, 3) - x <- round(replicate(p, runif(n)), 3) - y <- as.vector(x %*% beta) - y <- round((y-min(y))/(max(y)-min(y)), 3) - dat <- data.frame(y = y, x) - - # C++ version - rf <- ranger_cpp(data = dat, depvarname = "y", treetype = 3, ntree = 5, splitrule = 6, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(y ~ ., dat, num.trees = 5, splitrule = "beta", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with unordered splitting", { - # C++ version - rf <- ranger_cpp(data = iris, depvarname = "Sepal.Length", treetype = 3, ntree = 5, catvars = "Species", seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Sepal.Length ~ ., iris, num.trees = 5, respect.unordered.factors = "partition", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) diff --git a/cpp_version/test/testthat/test_survival.R b/cpp_version/test/testthat/test_survival.R deleted file mode 100644 index 0beb0e20d..000000000 --- a/cpp_version/test/testthat/test_survival.R +++ /dev/null @@ -1,76 +0,0 @@ - -context("ranger_cpp_regression") - -test_that("Prediction is equal to R version", { - # C++ version - rf <- ranger_cpp(data = veteran, depvarname = "time", statusvarname = "status", treetype = 5, ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = veteran, treetype = 5, predict = "ranger_out.forest", seed = 20) - preds_cpp <- as.matrix(fread("ranger_out.prediction", skip = 4)) - dimnames(preds_cpp) <- NULL - - # R version - rf <- ranger(Surv(time, status) ~ ., veteran, num.trees = 5, seed = 10) - preds_r <- predict(rf, veteran, seed = 20)$chf - - expect_equal(round(preds_cpp, 2), round(preds_r, 2)) -}) - -test_that("Predictions are positive numerics", { - rf <- ranger_cpp(data = veteran, depvarname = "time", statusvarname = "status", treetype = 5, ntree = 5, write = "", seed = 10) - pred <- ranger_cpp(data = veteran, predict = "ranger_out.forest", treetype = 5) - preds_cpp <- as.matrix(fread("ranger_out.prediction", skip = 4)) - expect_is(preds_cpp, "matrix") - expect_true(all(preds_cpp >= 0)) -}) - -test_that("Same result with default splitting", { - # C++ version - rf <- ranger_cpp(data = veteran, depvarname = "time", statusvarname = "status", treetype = 5, ntree = 5, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Surv(time, status) ~ ., veteran, num.trees = 5, seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with extratrees splitting", { - # C++ version - rf <- ranger_cpp(data = veteran, depvarname = "time", statusvarname = "status", treetype = 5, ntree = 5, splitrule = 5, catvars = "celltype", seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Surv(time, status) ~ ., veteran, num.trees = 5, splitrule = "extratrees", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with maxstat splitting", { - # C++ version - rf <- ranger_cpp(data = veteran, depvarname = "time", statusvarname = "status", treetype = 5, ntree = 5, splitrule = 4, seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Surv(time, status) ~ ., veteran, num.trees = 5, splitrule = "maxstat", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) - -test_that("Same result with unordered splitting", { - # C++ version - rf <- ranger_cpp(data = veteran, depvarname = "time", statusvarname = "status", treetype = 5, ntree = 5, catvars = "celltype", seed = 10) - err_cpp <- grep("Overall OOB prediction error", rf, value = TRUE) - err_cpp <- as.numeric(gsub("[^0-9.]", "", err_cpp)) - - # R version - rf <- ranger(Surv(time, status) ~ ., veteran, num.trees = 5, respect.unordered.factors = "partition", seed = 10) - err_r <- rf$prediction.error - - expect_equal(round(err_cpp, 4), round(err_r, 4)) -}) diff --git a/cpp_version/test/utility_test.cpp b/cpp_version/test/utility_test.cpp deleted file mode 100644 index 1b663d79e..000000000 --- a/cpp_version/test/utility_test.cpp +++ /dev/null @@ -1,1476 +0,0 @@ -#include -#include -#include - -#include "gtest/gtest.h" -#include "utility.h" - -using namespace ranger; - -// Split 0..9 in 1 part -TEST(equalSplit, onePart) { - std::vector test; - equalSplit(test, 0, 9, 1); - EXPECT_EQ(std::vector( { 0, 10 }), test); -} - -// Split 0..7 in 4 parts -TEST(equalSplit, perfectSplit0) { - std::vector test; - equalSplit(test, 0, 7, 4); - EXPECT_EQ(std::vector( { 0, 2, 4, 6, 8 }), test); -} - -// Split 2..7 in 2 parts -TEST(equalSplit, perfectSplit2) { - std::vector test; - equalSplit(test, 2, 7, 2); - EXPECT_EQ(std::vector( { 2, 5, 8 }), test); -} - -// Split 13..24 in 3 parts -TEST(equalSplit, perfectSplit13) { - std::vector test; - equalSplit(test, 13, 24, 3); - EXPECT_EQ(std::vector( { 13, 17, 21, 25 }), test); -} - -// Split 0..6 in 4 parts -TEST(equalSplit, nonPerfectSplit0) { - std::vector test; - equalSplit(test, 0, 6, 4); - EXPECT_EQ(std::vector( { 0, 2, 4, 6, 7 }), test); -} - -// Split 2..12 in 5 parts -TEST(equalSplit, nonPerfectSplit2) { - std::vector test; - equalSplit(test, 2, 12, 5); - EXPECT_EQ(std::vector( { 2, 5, 7, 9, 11, 13 }), test); -} - -// Split 15..19 in 2 parts -TEST(equalSplit, nonPerfectSplit15) { - std::vector test; - equalSplit(test, 15, 19, 2); - EXPECT_EQ(std::vector( { 15, 18, 20 }), test); -} - -// Split 30..35 in 1 parts -TEST(equalSplit, nonPerfectSplit30) { - std::vector test; - equalSplit(test, 30, 35, 1); - EXPECT_EQ(std::vector( { 30, 36 }), test); -} - -// Split 0..2 in 6 parts -// Result should contain only 3 parts -TEST(equalSplit, moreParts1) { - std::vector test; - equalSplit(test, 0, 2, 6); - EXPECT_EQ(std::vector( { 0, 1, 2, 3 }), test); -} - -// Split 0..2 in 4 parts -// Result should contain only 3 parts -TEST(equalSplit, moreParts2) { - std::vector test; - equalSplit(test, 0, 2, 4); - EXPECT_EQ(std::vector( { 0, 1, 2, 3 }), test); -} - -// Split 0..2 in 3 parts -// Result should contain only 3 parts -TEST(equalSplit, moreParts3) { - std::vector test; - equalSplit(test, 0, 2, 3); - EXPECT_EQ(std::vector( { 0, 1, 2, 3 }), test); -} - -TEST(readWrite1D, int1) { - std::ofstream outfile = std::ofstream(); - outfile.open("testfile1d", std::ios::binary); - if (!outfile.good()) { - throw std::runtime_error("Could not write to output file: "); - } - std::vector expect = std::vector( { 1, 2, 3, 4, 5, 6 }); - saveVector1D(expect, outfile); - outfile.close(); - - std::ifstream infile = std::ifstream(); - infile.open("testfile1d", std::ios::binary); - if (!infile.good()) { - throw std::runtime_error("Could not read from input file: "); - } - std::vector test; - readVector1D(test, infile); - infile.close(); - - EXPECT_EQ(expect, test); -} - -TEST(readWrite1D, double1) { - std::ofstream outfile = std::ofstream(); - outfile.open("testfile1d", std::ios::binary); - if (!outfile.good()) { - throw std::runtime_error("Could not write to output file: "); - } - std::vector expect = std::vector( { 1.5, 4.5, 10.2, 0.0, -5.9 }); - saveVector1D(expect, outfile); - outfile.close(); - - std::ifstream infile = std::ifstream(); - infile.open("testfile1d", std::ios::binary); - if (!infile.good()) { - throw std::runtime_error("Could not read from input file: "); - } - std::vector test; - readVector1D(test, infile); - infile.close(); - - EXPECT_EQ(expect, test); -} - -TEST(readWrite2D, int1) { - std::ofstream outfile = std::ofstream(); - outfile.open("testfile2d", std::ios::binary); - if (!outfile.good()) { - throw std::runtime_error("Could not write to output file: "); - } - std::vector expect1 = std::vector( { 1, 2, 3, 4, 5, 6 }); - std::vector expect2 = std::vector( { 7, 8, 9, 10 }); - std::vector expect3 = std::vector( { 11, 12, 13, 14, 15 }); - std::vector> expect; - expect.push_back(expect1); - expect.push_back(expect2); - expect.push_back(expect3); - - saveVector2D(expect, outfile); - outfile.close(); - - std::ifstream infile = std::ifstream(); - infile.open("testfile2d", std::ios::binary); - if (!infile.good()) { - throw std::runtime_error("Could not read from input file: "); - } - std::vector> test; - readVector2D(test, infile); - infile.close(); - - EXPECT_EQ(expect, test); -} - -TEST(readWrite2D, double1) { - std::ofstream outfile = std::ofstream(); - outfile.open("testfile2d", std::ios::binary); - if (!outfile.good()) { - throw std::runtime_error("Could not write to output file: "); - } - std::vector expect1 = std::vector( { 1.1, 2.4, 3.0, 4.3, 5.9, 6.7 }); - std::vector expect2 = std::vector( { 7.2, 8.1, 9.0, 10.1 }); - std::vector expect3 = std::vector( { 11.3, 12.4, 13.2, 14.7, 15.8 }); - std::vector> expect; - expect.push_back(expect1); - expect.push_back(expect2); - expect.push_back(expect3); - - saveVector2D(expect, outfile); - outfile.close(); - - std::ifstream infile = std::ifstream(); - infile.open("testfile2d", std::ios::binary); - if (!infile.good()) { - throw std::runtime_error("Could not read from input file: "); - } - std::vector> test; - readVector2D(test, infile); - infile.close(); - - EXPECT_EQ(expect, test); -} - -TEST(drawWithoutReplacementSkip, small_small1) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 9; - std::vector skip = std::vector( { 7 }); - size_t num_samples = 4; - size_t num_replicates = 10000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(drawWithoutReplacementSkip, small_small2) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 9; - std::vector skip = std::vector( { 0 }); - size_t num_samples = 4; - size_t num_replicates = 10000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(drawWithoutReplacementSkip, small_small3) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 9; - std::vector skip = std::vector( { 9 }); - size_t num_samples = 4; - size_t num_replicates = 10000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(drawWithoutReplacementSkip, small_small4) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 9; - std::vector skip = std::vector({0, 1, 3, 7}); - size_t num_samples = 4; - size_t num_replicates = 10000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(drawWithoutReplacementSkip, small_small5) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 9; - std::vector skip = std::vector({}); - size_t num_samples = 4; - size_t num_replicates = 10000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(drawWithoutReplacementSkip, small_large1) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 1000; - std::vector skip = std::vector( { 7 }); - size_t num_samples = 50; - size_t num_replicates = 100000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(drawWithoutReplacementSkip, small_large2) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 1000; - std::vector skip = std::vector({0, 1, 7, 138}); - size_t num_samples = 50; - size_t num_replicates = 100000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(drawWithoutReplacementSkip, large_large1) { - - std::vector result; - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - std::map counts; - - size_t max = 1000; - std::vector skip = std::vector( { 7 }); - size_t num_samples = 500; - size_t num_replicates = 10000; - - size_t expected_count = num_samples * num_replicates / (max + 1 - skip.size()); - - for (size_t i = 0; i < num_replicates; ++i) { - result.clear(); - drawWithoutReplacementSkip(result, random_number_generator, max + 1, skip, num_samples); - EXPECT_EQ(num_samples, result.size()); - for (auto& idx : result) { - EXPECT_LE(idx, max); - ++counts[idx]; - } - } - - // Check if counts are expected +- 5% - for (size_t c = 0; c <= max; ++c) { - if (std::find(skip.begin(), skip.end(), c) == skip.end()) { - // c should not be skipped - EXPECT_NEAR(expected_count, counts[c], expected_count * 0.05); - } else { - // c should be skipped - EXPECT_EQ(0, counts[c]); - } - } -} - -TEST(mostFrequentClass, notEqual1) { - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector class_count = std::vector( { 0, 4, 7, 3, 2, 1, 8 }); - - EXPECT_EQ(6, mostFrequentClass(class_count, random_number_generator)); -} - -TEST(mostFrequentClass, notEqual2) { - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector class_count = std::vector( { 5, 4, 3, 2, 1 }); - - EXPECT_EQ(0, mostFrequentClass(class_count, random_number_generator)); -} - -TEST(mostFrequentClass, equal1) { - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector class_count = std::vector( { 5, 5, 5, 5 }); - - EXPECT_LE(0, mostFrequentClass(class_count, random_number_generator)); - EXPECT_GE(3, mostFrequentClass(class_count, random_number_generator)); -} - -TEST(mostFrequentClass, equal2) { - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector class_count = std::vector( { 4, 5, 5, 4 }); - - EXPECT_LE(1, mostFrequentClass(class_count, random_number_generator)); - EXPECT_GE(2, mostFrequentClass(class_count, random_number_generator)); -} - -TEST(mostFrequentValue, notEqual1) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::unordered_map class_count; - class_count[1] = 5; - class_count[2] = 7; - class_count[3] = 10; - - EXPECT_EQ(3, mostFrequentValue(class_count, random_number_generator)); -} - -TEST(mostFrequentValue, notEqual2) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::unordered_map class_count; - class_count[10.1] = 15; - class_count[2.5] = 12; - class_count[30] = 10; - - EXPECT_EQ(10.1, mostFrequentValue(class_count, random_number_generator)); -} - -TEST(mostFrequentValue, equal1) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::unordered_map class_count; - class_count[1] = 10; - class_count[2] = 15; - class_count[3] = 15; - - EXPECT_LE(2, mostFrequentValue(class_count, random_number_generator)); - EXPECT_GE(3, mostFrequentValue(class_count, random_number_generator)); -} - -TEST(mostFrequentValue, equal2) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::unordered_map class_count; - class_count[10] = 30; - class_count[11] = 30; - class_count[15] = 29; - - EXPECT_LE(10, mostFrequentValue(class_count, random_number_generator)); - EXPECT_GE(11, mostFrequentValue(class_count, random_number_generator)); -} - -TEST(mostFrequentValue, equal3) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::unordered_map class_count; - class_count[3] = 10; - class_count[5] = 500; - class_count[6] = 500; - - EXPECT_LE(5, mostFrequentValue(class_count, random_number_generator)); - EXPECT_GE(6, mostFrequentValue(class_count, random_number_generator)); -} - -TEST(beautifyTime, seconds1) { - EXPECT_EQ("0 seconds", beautifyTime(0)); -} - -TEST(beautifyTime, seconds2) { - EXPECT_EQ("30 seconds", beautifyTime(30)); -} - -TEST(beautifyTime, minutes1) { - EXPECT_EQ("1 minute, 0 seconds", beautifyTime(60)); -} - -TEST(beautifyTime, minutes2) { - EXPECT_EQ("38 minutes, 37 seconds", beautifyTime(2317)); -} - -TEST(beautifyTime, hours1) { - EXPECT_EQ("1 hour, 0 minutes, 0 seconds", beautifyTime(3600)); -} - -TEST(beautifyTime, hours2) { - EXPECT_EQ("3 hours, 44 minutes, 58 seconds", beautifyTime(13498)); -} - -TEST(beautifyTime, days1) { - EXPECT_EQ("1 day, 0 hours, 0 minutes, 0 seconds", beautifyTime(86400)); -} - -TEST(beautifyTime, days2) { - EXPECT_EQ("3 days, 7 hours, 49 minutes, 5 seconds", beautifyTime(287345)); -} - -TEST(roundToNextMultiple, test0) { - EXPECT_EQ(0, roundToNextMultiple(0, 4)); -} - -TEST(roundToNextMultiple, test1) { - EXPECT_EQ(4, roundToNextMultiple(1, 4)); -} - -TEST(roundToNextMultiple, test2) { - EXPECT_EQ(4, roundToNextMultiple(2, 4)); -} - -TEST(roundToNextMultiple, test3) { - EXPECT_EQ(4, roundToNextMultiple(3, 4)); -} - -TEST(roundToNextMultiple, test4) { - EXPECT_EQ(4, roundToNextMultiple(4, 4)); -} - -TEST(roundToNextMultiple, test5) { - EXPECT_EQ(8, roundToNextMultiple(5, 4)); -} - -TEST(roundToNextMultiple, test6) { - EXPECT_EQ(8, roundToNextMultiple(6, 4)); -} - -TEST(roundToNextMultiple, test7) { - EXPECT_EQ(8, roundToNextMultiple(7, 4)); -} - -TEST(roundToNextMultiple, test8) { - EXPECT_EQ(8, roundToNextMultiple(8, 4)); -} - -TEST(roundToNextMultiple, test9) { - EXPECT_EQ(12, roundToNextMultiple(9, 4)); -} - -TEST(splitString, test1) { - std::string test_string = "abc,def,ghi"; - std::vector splitted_string; - splitString(splitted_string, test_string, ','); - std::vector expect = std::vector( { "abc", "def", "ghi" }); - - EXPECT_EQ(expect, splitted_string); -} - -TEST(splitString, test2) { - std::string test_string = "abc"; - std::vector splitted_string; - splitString(splitted_string, test_string, ','); - std::vector expect = std::vector( { "abc" }); - - EXPECT_EQ(expect, splitted_string); -} - -TEST(splitString, test3) { - std::string test_string = "a-b-c"; - std::vector splitted_string; - splitString(splitted_string, test_string, '-'); - std::vector expect = std::vector( { "a", "b", "c" }); - - EXPECT_EQ(expect, splitted_string); -} - -TEST(splitString, test4) { - std::string test_string = ""; - std::vector splitted_string; - splitString(splitted_string, test_string, ','); - std::vector expect = std::vector(); - - EXPECT_EQ(expect, splitted_string); -} - -TEST(shuffleAndSplit, test1) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector first_part; - std::vector second_part; - - shuffleAndSplit(first_part, second_part, 10, 3, random_number_generator); - - EXPECT_EQ(3, first_part.size()); - EXPECT_EQ(7, second_part.size()); -} - -TEST(shuffleAndSplit, test2) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector first_part; - std::vector second_part; - - shuffleAndSplit(first_part, second_part, 100, 63, random_number_generator); - - EXPECT_EQ(63, first_part.size()); - EXPECT_EQ(37, second_part.size()); -} - -TEST(shuffleAndSplit, test3) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector first_part; - std::vector second_part; - - shuffleAndSplit(first_part, second_part, 1, 1, random_number_generator); - - EXPECT_EQ(1, first_part.size()); - EXPECT_EQ(0, second_part.size()); -} - -TEST(shuffleAndSplit, test4) { - - std::mt19937_64 random_number_generator; - std::random_device random_device; - random_number_generator.seed(random_device()); - - std::vector first_part; - std::vector second_part; - - shuffleAndSplit(first_part, second_part, 3, 0, random_number_generator); - - EXPECT_EQ(0, first_part.size()); - EXPECT_EQ(3, second_part.size()); -} - -TEST(maxstatPValueLau92, test1) { - - // From R call dput(sapply(seq(0.5, 10, by = 0.5), maxstat::pLausen92, minprop = 0.1, maxprop = 0.9)) - const std::vector p_expect = std::vector( { 1.0, 0.967882898076573, 0.819678995766699, - 0.463872768757117, 0.189802453892004, 0.0578438845691903, 0.0133240079314344, 0.00233924318507284, - 0.00031467775847682, 3.25492795226314e-05, 2.59527010078785e-06, 1.59801511710768e-07, 7.6090999589879e-09, - 2.80479710245055e-10, 8.01032048074225e-12, 1.77366479130538e-13, 3.04652951223938e-15, 4.06114941874027e-17, - 4.20307813816918e-19, 3.37831711514353e-21 }); - - // Create sequence 0.5..10 - std::vector test_b(20); - double x = 0; - std::generate(test_b.begin(), test_b.end(), [&]() {return x += 0.5;}); - - // Compute approximation - double minprop = 0.1; - std::vector p; - for (auto& x : test_b) { - p.push_back(maxstatPValueLau92(x, minprop, 1 - minprop)); - } - - // Compare with expectation - for (size_t i = 0; i < p.size(); ++i) { - EXPECT_NEAR(p[i], p_expect[i], fabs(p[i] * 0.05)); - } -} - -TEST(maxstatPValueLau94, test1) { - - // From R call: -// set.seed(123) -// N <- 50 -// m <- which(!duplicated(sort(sample(seq(0.5,10,0.5), N, replace = TRUE)))) - 1 -// dput(m) -// dput(sapply(seq(0.5,10,0.5), maxstat::pLausen94, N = N, minprop = 0.1, maxprop = 0.1, m = m)) - std::vector m = std::vector( { 0, 3, 7, 8, 12, 15, 17, 18, 21, 25, 27, 30, 31, 35, 36, 39, 44, 46 }); - const std::vector p_expect = std::vector( { 3.24640516569147, 2.10411448384791, 1.07190625979408, - 0.426066236447909, 0.131558039703021, 0.0314590549699589, 0.00581093458428213, 0.000826972741261553, - 9.03968770946711e-05, 7.55926672751076e-06, 4.80774063093186e-07, 2.30447718702542e-08, 8.19448285148733e-10, - 2.09519635709089e-11, 3.56382497736666e-13, 3.02490041849519e-15, -4.80261133649249e-17, -1.6110288577566e-18, - -2.62248821317204e-20, -2.84175352170915e-22 }); - - // Create sequence 0.5..10 - std::vector test_b(20); - double x = 0; - std::generate(test_b.begin(), test_b.end(), [&]() {return x += 0.5;}); - - // Compute approximation - double minprop = 0.1; - size_t N = 50; - std::vector p; - for (auto& x : test_b) { - p.push_back(maxstatPValueLau94(x, minprop, 1 - minprop, N, m)); - } - - // Compare with expectation - for (size_t i = 0; i < p.size(); ++i) { - EXPECT_NEAR(p[i], p_expect[i], fabs(p[i] * 0.05)); - } -} - -TEST(dstdnorm, test1) { - - // From R call: - // dput(dnorm(seq(-4, 4, by = 0.5))) - - const std::vector expect = std::vector( { 0.000133830225764885, 0.00087268269504576, - 0.00443184841193801, 0.0175283004935685, 0.0539909665131881, 0.129517595665892, 0.241970724519143, - 0.3520653267643, 0.398942280401433, 0.3520653267643, 0.241970724519143, 0.129517595665892, 0.0539909665131881, - 0.0175283004935685, 0.00443184841193801, 0.00087268269504576, 0.000133830225764885 }); - - // Create sequence -4, 4, by=0.5 - std::vector test_x(17); - double x = -4.5; - std::generate(test_x.begin(), test_x.end(), [&]() {return x += 0.5;}); - - // Compute density - std::vector density; - for (auto& x : test_x) { - density.push_back(dstdnorm(x)); - } - - // Compare with expectation - for (size_t i = 0; i < density.size(); ++i) { - EXPECT_NEAR(density[i], expect[i], fabs(density[i] * 0.05)); - } -} - -TEST(pstdnorm, test1) { - - // From R call: - // dput(pnorm(seq(-4, 4, by = 0.5))) - - const std::vector expect = std::vector( { 3.16712418331199e-05, 0.000232629079035525, - 0.00134989803163009, 0.00620966532577613, 0.0227501319481792, 0.0668072012688581, 0.158655253931457, - 0.308537538725987, 0.5, 0.691462461274013, 0.841344746068543, 0.933192798731142, 0.977249868051821, - 0.993790334674224, 0.99865010196837, 0.999767370920964, 0.999968328758167 }); - - // Create sequence -4, 4, by=0.5 - std::vector test_x(17); - double x = -4.5; - std::generate(test_x.begin(), test_x.end(), [&]() {return x += 0.5;}); - - // Compute distribution - std::vector dist; - for (auto& x : test_x) { - dist.push_back(pstdnorm(x)); - } - - // Compare with expectation - for (size_t i = 0; i < dist.size(); ++i) { - EXPECT_NEAR(dist[i], expect[i], fabs(dist[i] * 0.05)); - } -} - -TEST(adjustPvalues, test1) { - - // From R call: -// set.seed(123) -// x <- rnorm(50, mean = c(rep(0, 25), rep(3, 25))) -// p <- 2*pnorm(-abs(x)) -// dput(p) -// dput(p.adjust(p, method = "BH")) - - std::vector p = std::vector( { 0.575155046407955, 0.817953853056094, 0.119065433061771, - 0.943789021783783, 0.897129975905795, 0.086333312789587, 0.644858724286655, 0.205849377808347, 0.492175460488491, - 0.655841439284439, 0.220921371984431, 0.718986362304244, 0.688588400057994, 0.911867952434092, 0.578319462345744, - 0.0739515289321684, 0.618589434095213, 0.0492273640304203, 0.483080935233713, 0.636362004751351, - 0.285600042559897, 0.827448656690798, 0.304889487308354, 0.466068200259841, 0.531945286062773, 0.189079625396729, - 0.000124148072892801, 0.00161395372907077, 0.0626223946736039, 2.10159024072429e-05, 0.000611494315340942, - 0.0068319089314331, 9.81478332360736e-05, 0.000105260958830543, 0.000132598801923585, 0.000225455732762676, - 0.0003795380309271, 0.00330242962313738, 0.00705922565893261, 0.00880512860101142, 0.0211501681388388, - 0.00523699658057458, 0.0828110328240387, 2.35405350797934e-07, 2.57684187404011e-05, 0.0605329775053071, - 0.00940103983967277, 0.0112979808322889, 0.000156850331255678, 0.00353834177611007 }); - - const std::vector expect = std::vector( { 0.741435208135569, 0.880264528394466, 0.212616844753163, - 0.943789021783783, 0.930477502483768, 0.159876505165902, 0.762606324749347, 0.343082296347245, 0.683577028456238, - 0.762606324749347, 0.356324793523276, 0.798873735893604, 0.782486818247721, 0.930477502483768, 0.741435208135569, - 0.147903057864337, 0.762606324749347, 0.11188037279641, 0.683577028456238, 0.762606324749347, 0.446250066499839, - 0.880264528394466, 0.461953768649021, 0.683577028456238, 0.718844981165909, 0.325999354132291, - 0.000947134299454175, 0.00672480720446156, 0.130463322236675, 0.000429473645673352, 0.0027795196151861, - 0.0207624284086253, 0.000947134299454175, 0.000947134299454175, 0.000947134299454175, 0.00125253184868153, - 0.0018976901546355, 0.0126369349146788, 0.0207624284086253, 0.0244586905583651, 0.0503575431877115, - 0.0174566552685819, 0.159251986200075, 1.17702675398967e-05, 0.000429473645673352, 0.130463322236675, - 0.0247395785254547, 0.0282449520807222, 0.000980314570347985, 0.0126369349146788 }); - - // Adjust p-values - std::vector adjusted = adjustPvalues(p); - - // Compare with expectation - for (size_t i = 0; i < p.size(); ++i) { - EXPECT_NEAR(adjusted[i], expect[i], fabs(adjusted[i] * 0.05)); - } -} - -TEST(order, test1) { - - // From R call: - // set.seed(123) - // x <- runif(50) - // dput(x) - // dput(order(x, decreasing = FALSE) - 1, control = NULL) - // dput(order(x, decreasing = TRUE) - 1, control = NULL) - - std::vector x = std::vector( { 0.287577520124614, 0.788305135443807, 0.4089769218117, - 0.883017404004931, 0.940467284293845, 0.0455564993899316, 0.528105488047004, 0.892419044394046, 0.551435014465824, - 0.456614735303447, 0.956833345349878, 0.453334156190977, 0.677570635452867, 0.572633401956409, 0.102924682665616, - 0.899824970401824, 0.24608773435466, 0.0420595335308462, 0.327920719282702, 0.954503649147227, 0.889539316063747, - 0.6928034061566, 0.640506813768297, 0.994269776623696, 0.655705799115822, 0.708530468167737, 0.544066024711356, - 0.59414202044718, 0.28915973729454, 0.147113647311926, 0.963024232536554, 0.902299045119435, 0.690705278422683, - 0.795467417687178, 0.0246136845089495, 0.477795971091837, 0.758459537522867, 0.216407935833558, 0.318181007634848, - 0.231625785352662, 0.142800022382289, 0.414546335814521, 0.413724326295778, 0.368845450924709, 0.152444747742265, - 0.13880606344901, 0.233034099452198, 0.465962450252846, 0.265972640365362, 0.857827715342864 }); - - const std::vector expect_inc = std::vector( { 34, 17, 5, 14, 45, 40, 29, 44, 37, 39, 46, 16, 48, 0, - 28, 38, 18, 43, 2, 42, 41, 11, 9, 47, 35, 6, 26, 8, 13, 27, 22, 24, 12, 32, 21, 25, 36, 1, 33, 49, 3, 20, 7, 15, - 31, 4, 19, 10, 30, 23 }); - - const std::vector expect_dec = std::vector( { 23, 30, 10, 19, 4, 31, 15, 7, 20, 3, 49, 33, 1, 36, 25, - 21, 32, 12, 24, 22, 27, 13, 8, 26, 6, 35, 47, 9, 11, 41, 42, 2, 43, 18, 38, 28, 0, 48, 16, 46, 39, 37, 44, 29, 40, - 45, 14, 5, 17, 34 }); - - // Order - std::vector inc = order(x, false); - std::vector dec = order(x, true); - - // Compare with expectation - for (size_t i = 0; i < x.size(); ++i) { - EXPECT_NEAR(inc[i], expect_inc[i], fabs(inc[i] * 0.05)); - EXPECT_NEAR(dec[i], expect_dec[i], fabs(dec[i] * 0.05)); - } -} - -TEST(rank, test1) { - - std::vector x = std::vector( { 1, 3, 2 }); - - const std::vector expect = std::vector( { 1, 3, 2 }); - - // Order - std::vector ranks = rank(x); - - // Compare with expectation - for (size_t i = 0; i < x.size(); ++i) { - EXPECT_EQ(ranks[i], expect[i]); - } -} - -TEST(rank, test2) { - - std::vector x = std::vector( { 1.5, 3.2, 1.1, 2.2 }); - - const std::vector expect = std::vector( { 2, 4, 1, 3 }); - - // Order - std::vector ranks = rank(x); - - // Compare with expectation - for (size_t i = 0; i < x.size(); ++i) { - EXPECT_EQ(ranks[i], expect[i]); - } -} - -TEST(rank, test3) { - - // From R call: - // set.seed(123) - // x <- round(runif(50, 1, 10)) - // dput(x) - // dput(rank(x), control = NULL) - - std::vector x = std::vector( { 4, 8, 5, 9, 9, 1, 6, 9, 6, 5, 10, 5, 7, 6, 2, 9, 3, 1, 4, 10, - 9, 7, 7, 10, 7, 7, 6, 6, 4, 2, 10, 9, 7, 8, 1, 5, 8, 3, 4, 3, - 2, 5, 5, 4, 2, 2, 3, 5, 3, 9 }); - - const std::vector expect = std::vector( { 16, 38, 22, 43, 43, 2, 28, 43, 28, 22, 48.5, 22, 33.5, 28, - 6, 43, 11, 2, 16, 48.5, 43, 33.5, 33.5, 48.5, 33.5, 33.5, 28, - 28, 16, 6, 48.5, 43, 33.5, 38, 2, 22, 38, 11, 16, 11, 6, 22, - 22, 16, 6, 6, 11, 22, 11, 43 }); - - // Order - std::vector ranks = rank(x); - - // Compare with expectation - for (size_t i = 0; i < x.size(); ++i) { - EXPECT_EQ(ranks[i], expect[i]); - } -} - - - -TEST(logrankScores, test1) { - - // From R call: - // library(survival) - // library(exactRankTests) - // y <- Surv(veteran$time, veteran$status) - // dput(y[, 1], control = NULL) - // dput(y[, 2], control = NULL) - // dput(exactRankTests::cscores(y), control = NULL) - - std::vector time = std::vector( { 72, 411, 228, 126, 118, 10, 82, 110, 314, 100, 42, 8, 144, 25, 11, - 30, 384, 4, 54, 13, 123, 97, 153, 59, 117, 16, 151, 22, 56, 21, 18, 139, 20, 31, 52, 287, 18, 51, 122, 27, 54, 7, - 63, 392, 10, 8, 92, 35, 117, 132, 12, 162, 3, 95, 177, 162, 216, 553, 278, 12, 260, 200, 156, 182, 143, 105, 103, - 250, 100, 999, 112, 87, 231, 242, 991, 111, 1, 587, 389, 33, 25, 357, 467, 201, 1, 30, 44, 283, 15, 25, 103, 21, - 13, 87, 2, 20, 7, 24, 99, 8, 99, 61, 25, 95, 80, 51, 29, 24, 18, 83, 31, 51, 90, 52, 73, 8, 36, 48, 7, 140, 186, - 84, 19, 45, 80, 52, 164, 19, 53, 15, 43, 340, 133, 111, 231, 378, 49 }); - - std::vector status = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 }); - - const std::vector expect = std::vector( { 0.338662090461661, -2.02010051669164, -0.705694192881291, - -0.108471626927477, -0.0608255690715493, 0.891953239598987, 0.280039238335736, 0.0692894105115154, - -1.20022317181429, -0.87187197712046, 0.578363772221272, 0.908082271857051, -0.26880467541842, -0.315498831477494, - 0.883823158298174, 0.64336274345551, -1.58557670716783, 0.962905226680006, 0.407180963376637, 0.850487509989263, - -1.08408138302504, -0.817639172887656, -0.328519470427333, 0.38033411652979, -0.0380982963442766, - 0.824772803240074, -0.298216440124302, 0.733731937753275, 0.393847630043303, 0.743165900017426, 0.798224130673702, - -0.185428442042187, 0.761857488802473, 0.622086147710829, 0.446317265670834, -1.12330009489122, 0.798224130673702, - 0.484291949215137, -0.0840813830250378, 0.674400158421496, 0.407180963376637, 0.939828303603083, - 0.352746597503915, -1.85343385002497, 0.891953239598987, 0.908082271857051, 0.216259132197089, 0.600463894321395, - -0.0380982963442766, -0.133471626927477, 0.867294232678339, -0.426436137093999, 0.970424023672487, - 0.182360827112344, -0.496633181428975, -0.426436137093999, -0.660239647426745, -2.47010051669164, - -0.985204856795979, 0.867294232678339, -0.922704856795979, -0.575094719890513, -0.359769470427333, - -1.49663318142897, -0.240233246846991, 0.0892894105115153, 0.10889725364877, -0.863881327384215, 0.12812802287954, - -4.30343385002497, 0.00634614810016787, -0.751218392921895, -1.75569419288129, -0.808325771828659, - -3.30343385002497, 0.0276227438448486, 0.985294117647059, -2.80343385002497, -1.71057670716783, 0.611333459538786, - 0.684501168522506, -1.37446559605672, -2.22010051669164, -0.61676138655718, 0.985294117647059, 0.64336274345551, - 0.555764180801456, -1.05187152346265, 0.833393492895246, 0.684501168522506, -0.89110274635123, 0.743165900017426, - 0.850487509989263, 0.248781607078105, 0.977886710239651, 0.761857488802473, 0.939828303603083, 0.714501168522506, - 0.146646541398058, 0.908082271857051, 0.146646541398058, 0.366635486392803, 0.684501168522506, 0.182360827112344, - 0.294964611470064, 0.484291949215137, 0.664196076788843, 0.714501168522506, 0.798224130673702, -0.719960761664264, - 0.622086147710829, 0.484291949215137, 0.23265257482004, 0.446317265670834, 0.324376376175947, 0.908082271857051, - 0.589474883332384, 0.532642020951149, 0.939828303603083, -0.212455469069214, -0.535094719890513, - 0.264654622951121, 0.780206112655684, 0.544269927927893, 0.294964611470064, 0.446317265670834, -0.460918895714689, - 0.780206112655684, 0.433496752850321, 0.833393492895246, 0.567127817165093, -1.28355650514763, -0.159112652568502, - 0.0276227438448486, -0.75569419288129, -1.47446559605672, 0.520877315068796 }); - - // Order - std::vector scores = logrankScores(time, status); - - // Compare with expectation - for (size_t i = 0; i < time.size(); ++i) { - EXPECT_NEAR(scores[i], expect[i], fabs(scores[i] * 0.05)); - } -} - -TEST(maxstat, trt) { - - // From R call: - // library(survival) - // library(maxstat) - // y <- Surv(veteran$time, veteran$status) - // x <- veteran$trt - // m <- maxstat(y, x, pmethod = "Lau92", smethod = "LogRank") - // dput(y[, 1], control = NULL) - // dput(y[, 2], control = NULL) - // dput(x, control = NULL) - // dput(m$statistic, control = NULL) - // dput(m$estimate, control = NULL) - - std::vector time = std::vector( { 72, 411, 228, 126, 118, 10, 82, 110, 314, 100, 42, 8, 144, 25, 11, - 30, 384, 4, 54, 13, 123, 97, 153, 59, 117, 16, 151, 22, 56, 21, 18, 139, 20, 31, 52, 287, 18, 51, 122, 27, 54, 7, - 63, 392, 10, 8, 92, 35, 117, 132, 12, 162, 3, 95, 177, 162, 216, 553, 278, 12, 260, 200, 156, 182, 143, 105, 103, - 250, 100, 999, 112, 87, 231, 242, 991, 111, 1, 587, 389, 33, 25, 357, 467, 201, 1, 30, 44, 283, 15, 25, 103, 21, - 13, 87, 2, 20, 7, 24, 99, 8, 99, 61, 25, 95, 80, 51, 29, 24, 18, 83, 31, 51, 90, 52, 73, 8, 36, 48, 7, 140, 186, - 84, 19, 45, 80, 52, 164, 19, 53, 15, 43, 340, 133, 111, 231, 378, 49 }); - - std::vector status = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 }); - - std::vector x = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }); - - const double expect_maxstat = 0.095071135385996; - const double expect_split = 1.5; - - // Order - std::vector indices = order(x, false); - - // Scores - std::vector scores = logrankScores(time, status); - - double best_maxstat; - double best_split_value; - maxstat(scores, x, indices, best_maxstat, best_split_value, 0.1, 0.9); - - // Compare with expectation - EXPECT_NEAR(best_maxstat, expect_maxstat, fabs(best_maxstat * 0.05)); - EXPECT_NEAR(best_split_value, expect_split, fabs(best_split_value * 0.05)); -} - -TEST(maxstat, celltype) { - - // From R call: - // library(survival) - // library(maxstat) - // y <- Surv(veteran$time, veteran$status) - // x <- veteran$celltype - // m <- maxstat(y, x, pmethod = "Lau92", smethod = "LogRank") - // dput(y[, 1], control = NULL) - // dput(y[, 2], control = NULL) - // dput(x, control = NULL) - // dput(m$statistic, control = NULL) - // dput(m$estimate, control = NULL) - - std::vector time = std::vector( { 72, 411, 228, 126, 118, 10, 82, 110, 314, 100, 42, 8, 144, 25, 11, - 30, 384, 4, 54, 13, 123, 97, 153, 59, 117, 16, 151, 22, 56, 21, 18, 139, 20, 31, 52, 287, 18, 51, 122, 27, 54, 7, - 63, 392, 10, 8, 92, 35, 117, 132, 12, 162, 3, 95, 177, 162, 216, 553, 278, 12, 260, 200, 156, 182, 143, 105, 103, - 250, 100, 999, 112, 87, 231, 242, 991, 111, 1, 587, 389, 33, 25, 357, 467, 201, 1, 30, 44, 283, 15, 25, 103, 21, - 13, 87, 2, 20, 7, 24, 99, 8, 99, 61, 25, 95, 80, 51, 29, 24, 18, 83, 31, 51, 90, 52, 73, 8, 36, 48, 7, 140, 186, - 84, 19, 45, 80, 52, 164, 19, 53, 15, 43, 340, 133, 111, 231, 378, 49 }); - - std::vector status = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 }); - - std::vector x = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }); - - const double expect_maxstat = 3.44263138354529; - const double expect_split = 1.5; - - // Order - std::vector indices = order(x, false); - - // Scores - std::vector scores = logrankScores(time, status); - - double best_maxstat; - double best_split_value; - maxstat(scores, x, indices, best_maxstat, best_split_value, 0.1, 0.9); - - // Compare with expectation - EXPECT_NEAR(best_maxstat, expect_maxstat, fabs(best_maxstat * 0.05)); - EXPECT_NEAR(best_split_value, expect_split, fabs(best_split_value * 0.05)); -} - -TEST(maxstat, karno) { - - // From R call: - // library(survival) - // library(maxstat) - // y <- Surv(veteran$time, veteran$status) - // x <- veteran$karno - // m <- maxstat(y, x, pmethod = "Lau92", smethod = "LogRank") - // dput(y[, 1], control = NULL) - // dput(y[, 2], control = NULL) - // dput(x, control = NULL) - // dput(m$statistic, control = NULL) - // dput(m$estimate, control = NULL) - - std::vector time = std::vector( { 72, 411, 228, 126, 118, 10, 82, 110, 314, 100, 42, 8, 144, 25, 11, - 30, 384, 4, 54, 13, 123, 97, 153, 59, 117, 16, 151, 22, 56, 21, 18, 139, 20, 31, 52, 287, 18, 51, 122, 27, 54, 7, - 63, 392, 10, 8, 92, 35, 117, 132, 12, 162, 3, 95, 177, 162, 216, 553, 278, 12, 260, 200, 156, 182, 143, 105, 103, - 250, 100, 999, 112, 87, 231, 242, 991, 111, 1, 587, 389, 33, 25, 357, 467, 201, 1, 30, 44, 283, 15, 25, 103, 21, - 13, 87, 2, 20, 7, 24, 99, 8, 99, 61, 25, 95, 80, 51, 29, 24, 18, 83, 31, 51, 90, 52, 73, 8, 36, 48, 7, 140, 186, - 84, 19, 45, 80, 52, 164, 19, 53, 15, 43, 340, 133, 111, 231, 378, 49 }); - - std::vector status = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 }); - - std::vector x = std::vector( { 60, 70, 60, 60, 70, 20, 40, 80, 50, 70, 60, 40, 30, 80, 70, 60, 60, 40, - 80, 60, 40, 60, 60, 30, 80, 30, 50, 60, 80, 40, 20, 80, 30, 75, 70, 60, 30, 60, 80, 60, 70, 50, 50, 40, 40, 20, - 70, 40, 80, 80, 50, 80, 30, 80, 50, 80, 50, 70, 60, 40, 80, 80, 70, 90, 90, 80, 80, 70, 60, 90, 80, 80, 50, 50, - 70, 70, 20, 60, 90, 30, 20, 70, 90, 80, 50, 70, 60, 90, 50, 30, 70, 20, 30, 60, 40, 30, 20, 60, 70, 80, 85, 70, - 70, 70, 50, 30, 40, 40, 40, 99, 80, 60, 60, 60, 60, 50, 70, 10, 40, 70, 90, 80, 50, 40, 40, 60, 70, 30, 60, 30, - 60, 80, 75, 60, 70, 80, 30 }); - - const double expect_maxstat = 4.61806159115936; - const double expect_split = 45; - - // Order - std::vector indices = order(x, false); - - // Scores - std::vector scores = logrankScores(time, status); - - double best_maxstat; - double best_split_value; - maxstat(scores, x, indices, best_maxstat, best_split_value, 0.1, 0.9); - - // Compare with expectation - EXPECT_NEAR(best_maxstat, expect_maxstat, fabs(best_maxstat * 0.05)); - EXPECT_NEAR(best_split_value, expect_split, fabs(best_split_value * 0.05)); -} - -TEST(maxstat, diagtime) { - - // From R call: - // library(survival) - // library(maxstat) - // y <- Surv(veteran$time, veteran$status) - // x <- veteran$diagtime - // m <- maxstat(y, x, pmethod = "Lau92", smethod = "LogRank") - // dput(y[, 1], control = NULL) - // dput(y[, 2], control = NULL) - // dput(x, control = NULL) - // dput(m$statistic, control = NULL) - // dput(m$estimate, control = NULL) - - std::vector time = std::vector( { 72, 411, 228, 126, 118, 10, 82, 110, 314, 100, 42, 8, 144, 25, 11, - 30, 384, 4, 54, 13, 123, 97, 153, 59, 117, 16, 151, 22, 56, 21, 18, 139, 20, 31, 52, 287, 18, 51, 122, 27, 54, 7, - 63, 392, 10, 8, 92, 35, 117, 132, 12, 162, 3, 95, 177, 162, 216, 553, 278, 12, 260, 200, 156, 182, 143, 105, 103, - 250, 100, 999, 112, 87, 231, 242, 991, 111, 1, 587, 389, 33, 25, 357, 467, 201, 1, 30, 44, 283, 15, 25, 103, 21, - 13, 87, 2, 20, 7, 24, 99, 8, 99, 61, 25, 95, 80, 51, 29, 24, 18, 83, 31, 51, 90, 52, 73, 8, 36, 48, 7, 140, 186, - 84, 19, 45, 80, 52, 164, 19, 53, 15, 43, 340, 133, 111, 231, 378, 49 }); - - std::vector status = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 }); - - std::vector x = std::vector( { 7, 5, 3, 9, 11, 5, 10, 29, 18, 6, 4, 58, 4, 9, 11, 3, 9, 2, 4, 4, 3, 5, - 14, 2, 3, 4, 12, 4, 12, 2, 15, 2, 5, 3, 2, 25, 4, 1, 28, 8, 1, 7, 11, 4, 23, 19, 10, 6, 2, 5, 4, 5, 3, 4, 16, 5, - 15, 2, 12, 12, 5, 12, 2, 2, 8, 11, 5, 8, 13, 12, 6, 3, 8, 1, 7, 3, 21, 3, 2, 6, 36, 13, 2, 28, 7, 11, 13, 2, 13, - 2, 22, 4, 2, 2, 36, 9, 11, 8, 3, 2, 4, 2, 2, 1, 17, 87, 8, 2, 5, 3, 3, 5, 22, 3, 3, 5, 8, 4, 4, 3, 3, 4, 10, 3, 4, - 4, 15, 4, 12, 5, 11, 10, 1, 5, 18, 4, 3 }); - - const double expect_maxstat = 0.800489478294775; - const double expect_split = 3.5; - - // Order - std::vector indices = order(x, false); - - // Scores - std::vector scores = logrankScores(time, status); - - double best_maxstat; - double best_split_value; - maxstat(scores, x, indices, best_maxstat, best_split_value, 0.1, 0.9); - - // Compare with expectation - EXPECT_NEAR(best_maxstat, expect_maxstat, fabs(best_maxstat * 0.05)); - EXPECT_NEAR(best_split_value, expect_split, fabs(best_split_value * 0.05)); -} - -TEST(maxstat, age) { - - // From R call: - // library(survival) - // library(maxstat) - // y <- Surv(veteran$time, veteran$status) - // x <- veteran$age - // m <- maxstat(y, x, pmethod = "Lau92", smethod = "LogRank") - // dput(y[, 1], control = NULL) - // dput(y[, 2], control = NULL) - // dput(x, control = NULL) - // dput(m$statistic, control = NULL) - // dput(m$estimate, control = NULL) - - std::vector time = std::vector( { 72, 411, 228, 126, 118, 10, 82, 110, 314, 100, 42, 8, 144, 25, 11, - 30, 384, 4, 54, 13, 123, 97, 153, 59, 117, 16, 151, 22, 56, 21, 18, 139, 20, 31, 52, 287, 18, 51, 122, 27, 54, 7, - 63, 392, 10, 8, 92, 35, 117, 132, 12, 162, 3, 95, 177, 162, 216, 553, 278, 12, 260, 200, 156, 182, 143, 105, 103, - 250, 100, 999, 112, 87, 231, 242, 991, 111, 1, 587, 389, 33, 25, 357, 467, 201, 1, 30, 44, 283, 15, 25, 103, 21, - 13, 87, 2, 20, 7, 24, 99, 8, 99, 61, 25, 95, 80, 51, 29, 24, 18, 83, 31, 51, 90, 52, 73, 8, 36, 48, 7, 140, 186, - 84, 19, 45, 80, 52, 164, 19, 53, 15, 43, 340, 133, 111, 231, 378, 49 }); - - std::vector status = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 }); - - std::vector x = std::vector( { 69, 64, 38, 63, 65, 49, 69, 68, 43, 70, 81, 63, 63, 52, 48, 61, 42, 35, - 63, 56, 55, 67, 63, 65, 46, 53, 69, 68, 43, 55, 42, 64, 65, 65, 55, 66, 60, 67, 53, 62, 67, 72, 48, 68, 67, 61, - 60, 62, 38, 50, 63, 64, 43, 34, 66, 62, 52, 47, 63, 68, 45, 41, 66, 62, 60, 66, 38, 53, 37, 54, 60, 48, 52, 70, - 50, 62, 65, 58, 62, 64, 63, 58, 64, 52, 35, 63, 70, 51, 40, 69, 36, 71, 62, 60, 44, 54, 66, 49, 72, 68, 62, 71, - 70, 61, 71, 59, 67, 60, 69, 57, 39, 62, 50, 43, 70, 66, 61, 81, 58, 63, 60, 62, 42, 69, 63, 45, 68, 39, 66, 63, - 49, 64, 65, 64, 67, 65, 37 }); - - const double expect_maxstat = 1.7992993341166; - const double expect_split = 58.5; - - // Order - std::vector indices = order(x, false); - - // Scores - std::vector scores = logrankScores(time, status); - - double best_maxstat; - double best_split_value; - maxstat(scores, x, indices, best_maxstat, best_split_value, 0.1, 0.9); - - // Compare with expectation - EXPECT_NEAR(best_maxstat, expect_maxstat, fabs(best_maxstat * 0.05)); - EXPECT_NEAR(best_split_value, expect_split, fabs(best_split_value * 0.05)); -} - -TEST(maxstat, prior) { - - // From R call: - // library(survival) - // library(maxstat) - // y <- Surv(veteran$time, veteran$status) - // x <- veteran$prior - // m <- maxstat(y, x, pmethod = "Lau92", smethod = "LogRank") - // dput(y[, 1], control = NULL) - // dput(y[, 2], control = NULL) - // dput(x, control = NULL) - // dput(m$statistic, control = NULL) - // dput(m$estimate, control = NULL) - - std::vector time = std::vector( { 72, 411, 228, 126, 118, 10, 82, 110, 314, 100, 42, 8, 144, 25, 11, - 30, 384, 4, 54, 13, 123, 97, 153, 59, 117, 16, 151, 22, 56, 21, 18, 139, 20, 31, 52, 287, 18, 51, 122, 27, 54, 7, - 63, 392, 10, 8, 92, 35, 117, 132, 12, 162, 3, 95, 177, 162, 216, 553, 278, 12, 260, 200, 156, 182, 143, 105, 103, - 250, 100, 999, 112, 87, 231, 242, 991, 111, 1, 587, 389, 33, 25, 357, 467, 201, 1, 30, 44, 283, 15, 25, 103, 21, - 13, 87, 2, 20, 7, 24, 99, 8, 99, 61, 25, 95, 80, 51, 29, 24, 18, 83, 31, 51, 90, 52, 73, 8, 36, 48, 7, 140, 186, - 84, 19, 45, 80, 52, 164, 19, 53, 15, 43, 340, 133, 111, 231, 378, 49 }); - - std::vector status = std::vector( { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 }); - - std::vector x = std::vector( { 0, 10, 0, 10, 10, 0, 10, 0, 0, 0, 0, 10, 0, 10, 10, 0, 0, 0, 10, 0, 0, - 0, 10, 0, 0, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, - 0, 0, 0, 10, 0, 10, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 10, 0, 10, 0, 10, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 10, 0, - 10, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 10, 10, 0, 0, 10, 10, 0, 0, 10, 0, 0 }); - - const double expect_maxstat = 0.7158562778385; - const double expect_split = 5; - - // Order - std::vector indices = order(x, false); - - // Scores - std::vector scores = logrankScores(time, status); - - double best_maxstat; - double best_split_value; - maxstat(scores, x, indices, best_maxstat, best_split_value, 0.1, 0.9); - - // Compare with expectation - EXPECT_NEAR(best_maxstat, expect_maxstat, fabs(best_maxstat * 0.05)); - EXPECT_NEAR(best_split_value, expect_split, fabs(best_split_value * 0.05)); -} - -TEST(maxstat, regression) { - - // From R call: - // library(maxstat) - // y <- iris$Sepal.Length - // x <- iris$Sepal.Width - // m <- maxstat(y, x, pmethod = "Lau92", smethod = "LogRank") - // dput(y, control = NULL) - // dput(x, control = NULL) - // dput(m$statistic, control = NULL) - // dput(m$estimate, control = NULL) - - std::vector y = std::vector( { 5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 5, 4.4, 4.9, 5.4, 4.8, 4.8, - 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5, - 5, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5, 5.5, 4.9, 4.4, - 5.1, 5, 4.5, 4.4, 5, 5.1, 4.8, 5.1, 4.6, 5.3, 5, 7, 6.4, 6.9, - 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5, 5.9, 6, 6.1, 5.6, 6.7, - 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6, - 5.7, 5.5, 5.5, 5.8, 6, 5.4, 6, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, - 5.8, 5, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 6.3, 5.8, 7.1, 6.3, 6.5, - 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, - 7.7, 6, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, - 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6, 6.9, 6.7, 6.9, 5.8, 6.8, - 6.7, 6.7, 6.3, 6.5, 6.2, 5.9 }); - - std::vector x = std::vector( { 3.5, 3, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, - 3, 4, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3, 3.4, - 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3, 3.4, - 3.5, 2.3, 3.2, 3.5, 3.8, 3, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 3.1, - 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2, 3, 2.2, 2.9, 2.9, 3.1, - 3, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3, 2.8, 3, 2.9, 2.6, - 2.4, 2.4, 2.7, 2.7, 3, 3.4, 3.1, 2.3, 3, 2.5, 2.6, 3, 2.6, 2.3, - 2.7, 3, 2.9, 2.9, 2.5, 2.8, 3.3, 2.7, 3, 2.9, 3, 3, 2.5, 2.9, - 2.5, 3.6, 3.2, 2.7, 3, 2.5, 2.8, 3.2, 3, 3.8, 2.6, 2.2, 3.2, - 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3, 2.8, 3, 2.8, 3.8, 2.8, 2.8, - 2.6, 3, 3.4, 3.1, 3, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3, 2.5, 3, - 3.4, 3 }); - - const double expect_maxstat = 3.73535181856697; - const double expect_split = 3.35; - - // Order x - std::vector indices = order(x, false); - - // Rank scores - std::vector scores = rank(y); - - double best_maxstat; - double best_split_value; - maxstat(scores, x, indices, best_maxstat, best_split_value, 0.1, 0.9); - - // Compare with expectation - EXPECT_NEAR(best_maxstat, expect_maxstat, fabs(best_maxstat * 0.05)); - EXPECT_NEAR(best_split_value, expect_split, fabs(best_split_value * 0.05)); -} - -TEST(numSamplesLeftOfCutpoint, test1) { - - // From R call: - // library(survival) - // x <- veteran$age - // ties <- duplicated(sort(x)) - // m <- (which(!ties) - 1)[-1] - // if (ties[length(x)]) { - // m <- c(m, length(x)) - // } - // dput(x, control = NULL) - // dput(m, control = NULL) - - std::vector x = std::vector( { 69, 64, 38, 63, 65, 49, 69, 68, 43, 70, 81, 63, 63, 52, 48, 61, 42, 35, - 63, 56, 55, 67, 63, 65, 46, 53, 69, 68, 43, 55, 42, 64, 65, 65, 55, 66, 60, 67, 53, 62, 67, 72, 48, 68, 67, 61, - 60, 62, 38, 50, 63, 64, 43, 34, 66, 62, 52, 47, 63, 68, 45, 41, 66, 62, 60, 66, 38, 53, 37, 54, 60, 48, 52, 70, - 50, 62, 65, 58, 62, 64, 63, 58, 64, 52, 35, 63, 70, 51, 40, 69, 36, 71, 62, 60, 44, 54, 66, 49, 72, 68, 62, 71, - 70, 61, 71, 59, 67, 60, 69, 57, 39, 62, 50, 43, 70, 66, 61, 81, 58, 63, 60, 62, 42, 69, 63, 45, 68, 39, 66, 63, - 49, 64, 65, 64, 67, 65, 37 }); - - std::vector expect = std::vector( { 1, 3, 4, 6, 9, 11, 12, 13, 16, 20, 21, 23, 24, 25, 28, 31, 34, 35, - 39, 42, 44, 47, 48, 49, 52, 53, 60, 64, 74, 86, 93, 100, 107, 113, 119, 125, 130, 133, 135, 137 }); - - // Order - std::vector indices = order(x, false); - - std::vector m = numSamplesLeftOfCutpoint(x, indices); - - // Compare with expectation - EXPECT_EQ(m.size(), expect.size()); - for (size_t i = 0; i < expect.size(); ++i) { - EXPECT_EQ(m[i], expect[i]); - } -} - diff --git a/cpp_version/src/utility/ArgumentHandler.h b/include/ranger/ArgumentHandler.h similarity index 100% rename from cpp_version/src/utility/ArgumentHandler.h rename to include/ranger/ArgumentHandler.h diff --git a/src/Data.h b/include/ranger/Data.h similarity index 100% rename from src/Data.h rename to include/ranger/Data.h diff --git a/src/DataChar.h b/include/ranger/DataChar.h similarity index 100% rename from src/DataChar.h rename to include/ranger/DataChar.h diff --git a/src/DataDouble.h b/include/ranger/DataDouble.h similarity index 100% rename from src/DataDouble.h rename to include/ranger/DataDouble.h diff --git a/src/DataFloat.h b/include/ranger/DataFloat.h similarity index 100% rename from src/DataFloat.h rename to include/ranger/DataFloat.h diff --git a/src/DataRcpp.h b/include/ranger/DataRcpp.h similarity index 100% rename from src/DataRcpp.h rename to include/ranger/DataRcpp.h diff --git a/src/DataSparse.h b/include/ranger/DataSparse.h similarity index 100% rename from src/DataSparse.h rename to include/ranger/DataSparse.h diff --git a/src/Forest.h b/include/ranger/Forest.h similarity index 100% rename from src/Forest.h rename to include/ranger/Forest.h diff --git a/src/ForestClassification.h b/include/ranger/ForestClassification.h similarity index 100% rename from src/ForestClassification.h rename to include/ranger/ForestClassification.h diff --git a/src/ForestProbability.h b/include/ranger/ForestProbability.h similarity index 100% rename from src/ForestProbability.h rename to include/ranger/ForestProbability.h diff --git a/src/ForestRegression.h b/include/ranger/ForestRegression.h similarity index 100% rename from src/ForestRegression.h rename to include/ranger/ForestRegression.h diff --git a/src/ForestSurvival.h b/include/ranger/ForestSurvival.h similarity index 100% rename from src/ForestSurvival.h rename to include/ranger/ForestSurvival.h diff --git a/src/Tree.h b/include/ranger/Tree.h similarity index 100% rename from src/Tree.h rename to include/ranger/Tree.h diff --git a/src/TreeClassification.h b/include/ranger/TreeClassification.h similarity index 100% rename from src/TreeClassification.h rename to include/ranger/TreeClassification.h diff --git a/src/TreeProbability.h b/include/ranger/TreeProbability.h similarity index 100% rename from src/TreeProbability.h rename to include/ranger/TreeProbability.h diff --git a/src/TreeRegression.h b/include/ranger/TreeRegression.h similarity index 100% rename from src/TreeRegression.h rename to include/ranger/TreeRegression.h diff --git a/src/TreeSurvival.h b/include/ranger/TreeSurvival.h similarity index 100% rename from src/TreeSurvival.h rename to include/ranger/TreeSurvival.h diff --git a/cpp_version/src/getopt/getopt.h b/include/ranger/getopt.h similarity index 98% rename from cpp_version/src/getopt/getopt.h rename to include/ranger/getopt.h index f3f864bda..79376d2a2 100644 --- a/cpp_version/src/getopt/getopt.h +++ b/include/ranger/getopt.h @@ -13,7 +13,11 @@ #define __GETOPT_H__ /* All the headers include this file. */ +#ifdef _WIN32 #include +#else +#include +#endif #if defined( WINGETOPT_SHARED_LIB ) # if defined( BUILDING_WINGETOPT_DLL ) diff --git a/src/globals.h b/include/ranger/globals.h similarity index 100% rename from src/globals.h rename to include/ranger/globals.h diff --git a/src/utility.h b/include/ranger/utility.h similarity index 100% rename from src/utility.h rename to include/ranger/utility.h diff --git a/cpp_version/src/version.h b/include/ranger/version.h similarity index 100% rename from cpp_version/src/version.h rename to include/ranger/version.h diff --git a/cpp_version/src/main.cpp b/src/cli/main.cpp similarity index 100% rename from cpp_version/src/main.cpp rename to src/cli/main.cpp diff --git a/cpp_version/src/getopt/getopt.c b/src/getopt/getopt.c similarity index 100% rename from cpp_version/src/getopt/getopt.c rename to src/getopt/getopt.c diff --git a/cpp_version/src/utility/ArgumentHandler.cpp b/src/utility/ArgumentHandler.cpp similarity index 100% rename from cpp_version/src/utility/ArgumentHandler.cpp rename to src/utility/ArgumentHandler.cpp