diff --git a/.travis.yml b/.travis.yml index 62ca183..57ba47e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,9 @@ language: sudo: - false +dist: + - trusty + # Install packages differs for container-based infrastructure # * https://docs.travis-ci.com/user/migrating-from-legacy/#How-do-I-install-APT-sources-and-packages%3F # * http://stackoverflow.com/a/30925448/2288008 @@ -89,7 +92,7 @@ install: # Install Python package 'requests' # 'easy_install3' is not installed by 'brew install python3' on OS X 10.9 Maverick - if [[ "`uname`" == "Darwin" ]]; then pip3 install requests; fi - - if [[ "`uname`" == "Linux" ]]; then travis_retry easy_install3 --user requests==2.10.0; fi + - if [[ "`uname`" == "Linux" ]]; then travis_retry pip3 install --user requests; fi # Install latest Polly toolchains and scripts - wget https://github.com/ruslo/polly/archive/master.zip diff --git a/CMakeLists.txt b/CMakeLists.txt index bfe53fc..e940893 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,52 +10,39 @@ # TODO: Add a more recent xgboost to hunter -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.3) ### Hunter snapshot that will be used ### include("cmake/HunterGate.cmake") + HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.18.44.tar.gz" - SHA1 "a78f0b377b8e53c038f12fc18b0c02564c4534c8" - FILEPATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake" - ) + URL "https://github.com/ruslo/hunter/archive/v0.19.40.tar.gz" + SHA1 "dd4850329b2e5ed91684f964f8bbc29328898d56" + FILEPATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake" + ) set(XGBOOSTCPP_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}") project(xgboostcpp VERSION 0.1.0) # WIP! +if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) + set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) # for 3rd parties added by add_subdirectory + cmake_policy(SET CMP0069 NEW) +endif() + set_property(GLOBAL PROPERTY USE_FOLDERS ON) # make sure these are before first hunter_add_package() call option(XGBOOSTER_BUILD_TESTS "Build tests" ON) option(XGBOOSTER_BUILD_APPS "Build applications" ON) -option(XGBOOSTER_SERIALIZE_WITH_BOOST "Serialize w/ boost" OFF) # hunter update option(XGBOOSTER_SERIALIZE_WITH_CEREAL "Serialize w/ cereal" ON) # hunter update option(XGBOOSTER_ADD_TO_STRING "Add local to_string definitions" OFF) # for android +option(XGBOOSTER_DO_LEAN "Build for prediction only (size reduction)" OFF) ################### ## Dependencies ### ################### -if(XGBOOSTER_SERIALIZE_WITH_BOOST) - # boost - hunter_add_package(Boost COMPONENTS filesystem system serialization iostreams) - find_package(Boost CONFIG REQUIRED filesystem system serialization iostreams) - - # boost-pba - hunter_add_package(boost-pba) - find_package(boost-pba CONFIG REQUIRED) - - set(xgboostcpp_boost_libs - boost-pba::boost-pba - Boost::filesystem - Boost::system - Boost::serialization - Boost::iostreams - ) - -endif() - # cereal if(XGBOOSTER_SERIALIZE_WITH_CEREAL) hunter_add_package(cereal) @@ -85,4 +72,4 @@ endif() ## Project ### ############## -add_subdirectory(src) \ No newline at end of file +add_subdirectory(src) diff --git a/README.md b/README.md index c1cf372..89b5db1 100644 --- a/README.md +++ b/README.md @@ -42,4 +42,4 @@ may need to run: ``` git submodule update --init --recursive --quiet -``` \ No newline at end of file +``` diff --git a/bin/build-android.sh b/bin/build-android.sh index b6b526b..1f18b1d 100755 --- a/bin/build-android.sh +++ b/bin/build-android.sh @@ -1,16 +1,20 @@ #!/bin/bash -TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections +TOOLCHAIN=android-ndk-r10e-api-19-armeabi-v7a-neon-hid-sections-lto + +CONFIG=MinSizeRel + +INSTALL="--strip" ARGS=( --verbose - --config Release - --fwd ANDROID=TRUE - HUNTER_CONFIGURATION_TYPES=Release - XGBOOSTER_SERIALIZE_WITH_BOOST=OFF + --config ${CONFIG} + --fwd + ANDROID=TRUE + HUNTER_CONFIGURATION_TYPES=${CONFIG} XGBOOSTER_SERIALIZE_WITH_CEREAL=ON XGBOOSTER_ADD_TO_STRING=ON + XGBOOSTER_DO_LEAN=${XGBOOSTER_DO_LEAN} ) -export HUNTER_ROOT=${HOME}/devel/ruslo/hunter -build.py --toolchain ${TOOLCHAIN} ${ARGS[@]} --clear +polly.py --toolchain ${TOOLCHAIN} ${ARGS[@]} ${INSTALL} --clear diff --git a/bin/build-libcxx.sh b/bin/build-libcxx.sh index 91e4102..adb3601 100755 --- a/bin/build-libcxx.sh +++ b/bin/build-libcxx.sh @@ -1,5 +1,20 @@ #!/bin/bash -build.py --toolchain libcxx --verbose --fwd HUNTER_CONFIGURATION_TYPES=Release --jobs 8 --clear --strip +CONFIG=MinSizeRel +TOOLCHAIN=osx-10-12-lto +INSTALL=--install + +ARGS=( + --verbose + --config ${CONFIG} + --fwd + HUNTER_CONFIGURATION_TYPES=${CONFIG} + XGBOOSTER_SERIALIZE_WITH_CEREAL=ON + XGBOOSTER_ADD_TO_STRING=ON +) + +polly.py --toolchain ${TOOLCHAIN} ${ARGS[@]} --jobs 8 ${INSTALL} --reconfig # --test + + diff --git a/bin/build-xcode.sh b/bin/build-xcode.sh index d44be27..339fb57 100755 --- a/bin/build-xcode.sh +++ b/bin/build-xcode.sh @@ -1,14 +1,15 @@ #!/bin/bash +TOOLCHAIN=xcode + +CONFIG=MinSizeRel + ARGS=( --verbose - --config Release - --fwd HUNTER_CONFIGURATION_TYPES=Release - XGBOOSTER_SERIALIZE_WITH_BOOST=OFF + --config ${CONFIG} + --fwd HUNTER_CONFIGURATION_TYPES=${CONFIG} XGBOOSTER_SERIALIZE_WITH_CEREAL=ON --jobs 8 ) -export HUNTER_ROOT=${HOME}/devel/ruslo/hunter -build.py --toolchain xcode ${ARGS[@]} --reconfig --install --open --test - +build.py --toolchain ${TOOLCHAIN} ${ARGS[@]} --reconfig --install --open --test diff --git a/cmake/Hunter/config.cmake b/cmake/Hunter/config.cmake index 028bd53..dce0d64 100644 --- a/cmake/Hunter/config.cmake +++ b/cmake/Hunter/config.cmake @@ -1,9 +1,6 @@ set(XGBOOST_CMAKE_ARGS XGBOOST_USE_HALF=ON - XGBOOST_USE_BOOST=ON - XGBOOST_DO_LEAN=ON - XGBOOST_ADD_TO_STRING=${XGBOOSTER_ADD_TO_STRING} - XGBOOST_USE_BOOST=${XGBOOSTER_SERIALIZE_WITH_BOOST} + XGBOOST_DO_LEAN=${XGBOOSTER_DO_LEAN} XGBOOST_USE_CEREAL=${XGBOOSTER_SERIALIZE_WITH_CEREAL} ) @@ -11,5 +8,4 @@ if(ANDROID) list(APPEND XGBOOST_CMAKE_ARGS XGBOOST_ADD_TO_STRING=ON) endif() -hunter_config(Boost VERSION ${HUNTER_Boost_VERSION} CMAKE_ARGS IOSTREAMS_NO_BZIP2=1) -hunter_config(xgboost VERSION ${HUNTER_xgboost_VERSION} CMAKE_ARGS ${XGBOOST_CMAKE_ARGS}) +hunter_config(xgboost GIT_SUBMODULE "src/3rdparty/xgboost" CMAKE_ARGS ${XGBOOST_CMAKE_ARGS}) diff --git a/src/3rdparty/xgboost b/src/3rdparty/xgboost index eb4af79..eed22d0 160000 --- a/src/3rdparty/xgboost +++ b/src/3rdparty/xgboost @@ -1 +1 @@ -Subproject commit eb4af799dbcac4166a6241abfcf4e8b55bc1df6c +Subproject commit eed22d0a19d7afc613e3ec79541e67d9ab440721 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 874b719..694f60e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,33 +1,24 @@ +## Customize linker flags +include(CheckCCompilerFlag) +if(NOT MSVC) + check_c_compiler_flag("-Wl,-dead_strip" FLAG_dead_strip) + if(NOT FLAG_dead_strip) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections,--icf=safe") + else() + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip") + set(CMAKE_EXE_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip") + endif() +endif() + ############### ### xgboost ### ############### -option(DRISHTI_USE_LOCAL_XGBOOST "Use local xgboost" ON) -if(DRISHTI_USE_LOCAL_XGBOOST) - option(SKIP_INSTALL "Avoid installation of submodule libraries" OFF) +hunter_add_package(xgboost) +find_package(xgboost CONFIG REQUIRED) - option(SKIP_INSTALL "Skip the package install" OFF) - option(XGBOOST_USE_BOOST "Use boost serialization" ${XGBOOSTER_SERIALIZE_WITH_BOOST}) - option(XGBOOST_USE_CEREAL "Use cereal serialization" ${XGBOOSTER_SERIALIZE_WITH_CEREAL}) - option(XGBOOST_ADD_TO_STRING "Add standard library std::to_string()" ${XGBOOSTER_ADD_TO_STRING}) - option(XGBOOST_USE_HALF "Support half precision floating point storage" ON) - option(XGBOOST_DO_LEAN "Build lean library for evaluation only" OFF) - - add_subdirectory(3rdparty/xgboost) - unset(SKIP_INSTALL CACHE) - add_library(xgboost::xgboost ALIAS xgboost) - set_property(TARGET xgboost PROPERTY FOLDER "libs/3rdparty") - target_include_directories(xgboost PUBLIC "$") - -else() - hunter_add_package(xgboost) - find_package(xgboost CONFIG REQUIRED) -endif() +add_subdirectory(lib) +add_subdirectory(test) -message("XGBOOST_USE_BOOST = ${XGBOOST_USE_BOOST}") -message("XGBOOST_USE_CEREAL = ${XGBOOST_USE_CEREAL}") -message("XGBOOSTER_SERIALIZE_WITH_BOOST = ${XGBOOSTER_SERIALIZE_WITH_BOOST}") -message("XGBOOSTER_SERIALIZE_WITH_CEREAL = ${XGBOOSTER_SERIALIZE_WITH_CEREAL}") -add_subdirectory(lib) -add_subdirectory(test) diff --git a/src/lib/xgboostcpp/CMakeLists.txt b/src/lib/xgboostcpp/CMakeLists.txt index 7ee79a6..29a6123 100644 --- a/src/lib/xgboostcpp/CMakeLists.txt +++ b/src/lib/xgboostcpp/CMakeLists.txt @@ -8,10 +8,6 @@ set(xgboostcpp_SRCS to_string.h ) -if(XGBOOSTER_SERIALIZE_WITH_BOOST) - list(APPEND xgboostcpp_SRCS XGBoosterIOArchiveBoost.cpp) -endif() - if(XGBOOSTER_SERIALIZE_WITH_CEREAL) list(APPEND xgboostcpp_SRCS XGBoosterIOArchiveCereal.cpp) endif() @@ -19,18 +15,12 @@ endif() add_library(xgboostcpp "${xgboostcpp_SRCS}") target_link_libraries(xgboostcpp PRIVATE xgboost::xgboost) -if(XGBOOSTER_SERIALIZE_WITH_BOOST) - target_link_libraries(xgboostcpp PRIVATE ${xgboostcpp_boost_libs}) - target_compile_definitions(xgboostcpp PUBLIC XGBOOSTER_SERIALIZE_WITH_BOOST=1) -endif() - if(XGBOOSTER_SERIALIZE_WITH_CEREAL) target_link_libraries(xgboostcpp PRIVATE cereal::cereal) target_compile_definitions(xgboostcpp PUBLIC XGBOOSTER_SERIALIZE_WITH_CEREAL=1) endif() # Note: boost will optionally set -# * XGBOOST_USE_BOOST=1 # * XGBOOST_USE_CEREAL=1 set_property(TARGET xgboostcpp PROPERTY FOLDER "libs") @@ -52,12 +42,12 @@ if(NOT is_ios) ) endif() -if(XGBOOSTER_BUILD_TESTS) +# We can't run training if XGBOOSTER_DO_LEAN==ON +if(XGBOOSTER_BUILD_TESTS AND NOT XGBOOSTER_DO_LEAN) if(NOT (ANDROID OR IOS)) add_subdirectory(ut) endif() endif() - ################### ##### install ##### diff --git a/src/lib/xgboostcpp/XGBoosterIOArchiveBoost.cpp b/src/lib/xgboostcpp/XGBoosterIOArchiveBoost.cpp deleted file mode 100644 index 118e5b6..0000000 --- a/src/lib/xgboostcpp/XGBoosterIOArchiveBoost.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "xgboostcpp/XGBooster.h" -#include "xgboostcpp/XGBoosterImpl.h" - -#include "boost-pba/portable_binary_oarchive.hpp" -#include "boost-pba/portable_binary_iarchive.hpp" - -#include -#include - -#include -#include -#include - -// include all std functions -using namespace std; -#include "xgboost/wrapper/xgboost_wrapper.h" -#include "xgboost/src/gbm/gbm.h" -#include "xgboost/src/data.h" -#include "xgboost/src/learner/learner-inl.hpp" -#include "xgboost/src/io/io.h" -#include "xgboost/src/utils/utils.h" -#include "xgboost/src/utils/math.h" -#include "xgboost/src/utils/group_data.h" -#include "xgboost/src/io/simple_dmatrix-inl.hpp" - -//using namespace xgboost; -//using namespace xgboost::io; - -// Learner (IGradBooster): -BOOST_SERIALIZATION_ASSUME_ABSTRACT(xgboost::gbm::IGradBooster); -BOOST_CLASS_EXPORT_GUID(xgboost::gbm::IGradBooster, "IGradBooster"); -BOOST_CLASS_EXPORT_GUID(xgboost::gbm::GBLinear, "GBLinear") -BOOST_CLASS_EXPORT_GUID(xgboost::gbm::GBTree, "GBTree") - -// Tree model: -typedef xgboost::tree::RTreeNodeStat RTreeNodeStat; -typedef xgboost::tree::TreeModel TreeModel; -BOOST_SERIALIZATION_ASSUME_ABSTRACT(TreeModel); -BOOST_CLASS_EXPORT_GUID(TreeModel, "TreeModel"); -BOOST_CLASS_EXPORT_GUID(xgboost::tree::RegTree, "RegTree"); - -// Loss function: -BOOST_SERIALIZATION_ASSUME_ABSTRACT(xgboost::learner::IObjFunction); -BOOST_CLASS_EXPORT_GUID(xgboost::learner::IObjFunction, "IObjFunction"); -BOOST_CLASS_EXPORT_GUID(xgboost::learner::RegLossObj, "RegLossObj"); -BOOST_CLASS_EXPORT_GUID(xgboost::learner::PoissonRegression, "PoissonRegression"); -BOOST_CLASS_EXPORT_GUID(xgboost::learner::SoftmaxMultiClassObj, "SoftmaxMultiClassObj"); -BOOST_CLASS_EXPORT_GUID(xgboost::learner::LambdaRankObj, "LambdaRankObj"); -BOOST_CLASS_EXPORT_GUID(xgboost::learner::PairwiseRankObj, "PairwiseRankObj"); -BOOST_CLASS_EXPORT_GUID(xgboost::learner::LambdaRankObjMAP, "LambdaRankObjMAP"); - -// ################################################################## -// #################### portable_binary_*archive #################### -// ################################################################## - -typedef portable_binary_oarchive OArchive; -typedef portable_binary_iarchive IArchive; - -XGBOOSTCPP_NAMESPACE_BEGIN -template void XGBooster::serialize(OArchive &ar, const unsigned int); -template void XGBooster::Impl::serialize(OArchive &ar, const unsigned int); -template void XGBooster::Recipe::serialize(OArchive &ar, const unsigned int); - -template void XGBooster::serialize(IArchive &ar, const unsigned int); -template void XGBooster::Impl::serialize(IArchive &ar, const unsigned int); -template void XGBooster::Recipe::serialize(IArchive &ar, const unsigned int); - -XGBOOSTCPP_NAMESPACE_END - -template void xgboost::tree::RegTree::serialize(OArchive &ar, const unsigned int); -template void xgboost::tree::RegTree::serialize(IArchive &ar, const unsigned int); - -BOOST_CLASS_EXPORT_IMPLEMENT(xgboostcpp::XGBooster); -BOOST_CLASS_EXPORT_IMPLEMENT(xgboostcpp::XGBooster::Impl); - diff --git a/src/lib/xgboostcpp/XGBoosterIOArchiveCereal.cpp b/src/lib/xgboostcpp/XGBoosterIOArchiveCereal.cpp index 8764ca1..6390165 100644 --- a/src/lib/xgboostcpp/XGBoosterIOArchiveCereal.cpp +++ b/src/lib/xgboostcpp/XGBoosterIOArchiveCereal.cpp @@ -45,10 +45,6 @@ template void XGBooster::Recipe::serialize(IArchive &ar, const unsigne template void XGBooster::Impl::serialize(IArchive &ar, const unsigned int); XGBOOSTCPP_NAMESPACE_END -template void xgboost::gbm::serialize(OArchive & ar, xgboost::gbm::IGradBooster &gb, const unsigned int version); -template void xgboost::gbm::serialize(OArchive & ar, xgboost::gbm::GBTree &gbt, const unsigned int version); -template void xgboost::gbm::serialize(OArchive & ar, xgboost::gbm::GBLinear &gbt, const unsigned int version); - -template void xgboost::gbm::serialize(IArchive & ar, xgboost::gbm::IGradBooster &gb, const unsigned int version); -template void xgboost::gbm::serialize(IArchive & ar, xgboost::gbm::GBTree &gbt, const unsigned int version); -template void xgboost::gbm::serialize(IArchive & ar, xgboost::gbm::GBLinear &gbt, const unsigned int version); +template void xgboost::gbm::IGradBooster::serialize(OArchive & ar, const unsigned int version); +template void xgboost::gbm::GBTree::serialize(OArchive & ar, const unsigned int version); +template void xgboost::gbm::GBLinear::serialize(OArchive & ar, const unsigned int version); diff --git a/src/lib/xgboostcpp/ut/test-xgboostcpp-regression.cpp b/src/lib/xgboostcpp/ut/test-xgboostcpp-regression.cpp index c4be5ca..e63ac16 100644 --- a/src/lib/xgboostcpp/ut/test-xgboostcpp-regression.cpp +++ b/src/lib/xgboostcpp/ut/test-xgboostcpp-regression.cpp @@ -105,35 +105,6 @@ TEST(XGBoostCPPTest, BostonHousingRegression) ASSERT_LT(tester(), 6.6213); } -// ############## -// ### BOOST #### -// ############## - -#if defined(XGBOOSTER_SERIALIZE_WITH_BOOST) - -TEST(XGBoostCPPTest, BostonHousingRegressionBoost) -{ - TestHarness tester; - - std::string filename = "xgb.pba.z"; - - tester.writer = [&](std::shared_ptr &xgb) - { - save_pba_z(filename, xgb); - }; - - tester.reader = [&](std::shared_ptr &xgb) - { - load_pba_z(filename, xgb); - }; - - auto mse = tester(); - std::cout << "MSE (boost): " << mse << std::endl; - ASSERT_LT(mse, 6.6213); // compare to sci-kit example 6.6213 -} - -#endif // XGBOOSTER_SERIALIZE_WITH_BOOST - // ############## // ### CEREAL ### // ############## diff --git a/src/lib/xgboostcpp/xgboostcpp_serialize.h b/src/lib/xgboostcpp/xgboostcpp_serialize.h index 4f92f53..9f34d24 100644 --- a/src/lib/xgboostcpp/xgboostcpp_serialize.h +++ b/src/lib/xgboostcpp/xgboostcpp_serialize.h @@ -16,10 +16,7 @@ enum ArchiveType { -#if defined(XGBOOSTER_SERIALIZE_WITH_BOOST) - kPBA, -#endif -#if defined(XGBOOSTER_SERIALIZE_WITH_CEREAL) +#if defined(XGBOOSTER_SERIALIZE_WITH_CEREAL) kCPB, #endif kUnknown @@ -27,77 +24,15 @@ enum ArchiveType inline ArchiveType getType(const std::string &filename) { -#if defined(XGBOOSTER_SERIALIZE_WITH_BOOST) - if(filename.find(".pba.z") != std::string::npos) - { - return kPBA; - } -#endif - #if defined(XGBOOSTER_SERIALIZE_WITH_CEREAL) if(filename.find(".cpb") != std::string::npos) { return kCPB; } #endif - return kUnknown; } - -// ##################### -// ####### pba.z ####### -// ##################### - -#if defined(XGBOOSTER_SERIALIZE_WITH_BOOST) - -#include -#include - -#include -#include - -#include "boost-pba/portable_binary_oarchive.hpp" -#include "boost-pba/portable_binary_iarchive.hpp" - -template -void load_pba_z(std::istream &is, T &object) -{ - boost::iostreams::filtering_stream buffer; - buffer.push(boost::iostreams::zlib_decompressor()); - buffer.push(is); - portable_binary_iarchive ia(buffer); - ia >> object; -} - -template -void load_pba_z(const std::string &filename, T &object) -{ - std::ifstream ifs(filename, std::ios::binary); - assert(ifs); // TODO: throw - load_pba_z(ifs, object); -} - -template -void save_pba_z(std::ostream &os, T &object) -{ - boost::iostreams::filtering_stream buffer; - buffer.push(boost::iostreams::zlib_compressor(boost::iostreams::zlib::best_compression)); - buffer.push(os); - portable_binary_oarchive oa(buffer); - oa << object; -} - -template -void save_pba_z(const std::string &filename, T &object) -{ - std::ofstream ofs(filename, std::ios::binary); - assert(ofs); // TODO: throw - save_pba_z(ofs, object); -} - -#endif // XGBOOSTER_SERIALIZE_WITH_BOOST - // #################### // ####### cpb ######## // #################### @@ -142,7 +77,7 @@ void save_cpb(const std::string &filename, T &object) save_cpb(ofs, object); } -#endif // XGBOOSTER_SERIALIZE_WITH_BOOST +#endif // XGBOOSTER_SERIALIZE_WITH_CEREAL // ### load model ### template @@ -150,9 +85,6 @@ void load_model(const std::string &filename, T &object) { switch(getType(filename)) { -#if defined(XGBOOSTER_SERIALIZE_WITH_BOOST) - case kPBA: load_pba_z(filename, object); break; -#endif #if defined(XGBOOSTER_SERIALIZE_WITH_CEREAL) case kCPB: load_cpb(filename, object); break; #endif @@ -166,9 +98,6 @@ void save_model(const std::string &filename, T &object) { switch(getType(filename)) { -#if defined(XGBOOSTER_SERIALIZE_WITH_BOOST) - case kPBA: save_pba_z(filename, object); break; -#endif #if defined(XGBOOSTER_SERIALIZE_WITH_CEREAL) case kCPB: save_cpb(filename, object); break; #endif diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 1484ad0..7892b61 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -20,5 +20,13 @@ set(test_app test-xgbooster) add_executable(${test_app} test-xgbooster.cpp) target_link_libraries(${test_app} xgboostcpp cxxopts::cxxopts Boost::system) + +if(XGBOOSTER_DO_LEAN) + target_compile_definitions(${test_app} PUBLIC XGBOOSTER_DO_LEAN=1) +endif() + +# Enable this option for testing lto behavior +# target_compile_definitions(${test_app} PUBLIC XGBOOSTER_DO_LEAN=1) + set_property(TARGET ${test_app} PROPERTY FOLDER "app/console") install(TARGETS ${test_app} DESTINATION bin) diff --git a/src/test/test-xgbooster.cpp b/src/test/test-xgbooster.cpp index aecbcf0..9ac0410 100644 --- a/src/test/test-xgbooster.cpp +++ b/src/test/test-xgbooster.cpp @@ -20,14 +20,19 @@ int main(int argc, char **argv) // ############################ std::string sInput, sModel, sOutput, sArchive; + +#if !defined(XGBOOSTER_DO_LEAN) bool doTrain = false; +#endif cxxopts::Options options("test-xgboostcpp", "Command line interface for xgboostcpp."); options.add_options() ("i,input", "Input CSV file", cxxopts::value(sInput)) ("o,output", "Output directory", cxxopts::value(sOutput)) ("m,model", "Model archive: *.cpb or *.pba.z", cxxopts::value(sModel)) +#if !defined(XGBOOSTER_DO_LEAN) ("t,train", "Training mode.", cxxopts::value(doTrain)) +#endif ("h,help", "Print help message"); options.parse(argc, argv); @@ -53,6 +58,7 @@ int main(int argc, char **argv) return -1; } +#if !defined(XGBOOSTER_DO_LEAN) if(doTrain) { xgboostcpp::XGBooster::Recipe params; // default.... @@ -60,6 +66,7 @@ int main(int argc, char **argv) return xgboost_train(sInput, sModel, params); } else +#endif { std::ostream* os = &std::cout; std::ofstream ofs; @@ -116,7 +123,7 @@ bool loadCSV(Iterator first, Iterator last, Matrix32f &x, Vector32f &y) bool r = boost::spirit::qi::phrase_parse(first, last, +(qi::float_ % ','), qi::space, x); if(r) { - x.resize(x.size()); + x.resize(y.size()); for(int i = 0; i < x.size(); i++) { y[i] = x[i].back(); @@ -168,6 +175,7 @@ int xgboost_test(const std::string &input, const std::string &model, std::ostrea return 0; } +#if !defined(XGBOOSTER_DO_LEAN) int xgboost_train(const std::string &input, const std::string &model, xgboostcpp::XGBooster::Recipe ¶ms) { Matrix32f x; @@ -183,3 +191,4 @@ int xgboost_train(const std::string &input, const std::string &model, xgboostcpp return 0; } +#endif