diff --git a/.gitignore b/.gitignore index 2620533dc..f7d420946 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,7 @@ Debug *test* .Rhistory *.dll +*i386 +*x64 +*dump +*save diff --git a/R-package/inst/examples/model.dump b/R-package/inst/examples/model.dump deleted file mode 100644 index ddeb6546d..000000000 --- a/R-package/inst/examples/model.dump +++ /dev/null @@ -1,72 +0,0 @@ -booster[0]: -0:[f28<1.00001] yes=1,no=2,missing=2 - 1:[f108<1.00001] yes=3,no=4,missing=4 - 3:leaf=1.85965 - 4:leaf=-1.94071 - 2:[f55<1.00001] yes=5,no=6,missing=6 - 5:leaf=-1.70044 - 6:leaf=1.71218 -booster[1]: -0:[f59<1.00001] yes=1,no=2,missing=2 - 1:leaf=-6.23624 - 2:[f28<1.00001] yes=3,no=4,missing=4 - 3:leaf=-0.96853 - 4:leaf=0.784718 -booster[2]: -0:[f101<1.00001] yes=1,no=2,missing=2 - 1:[f110<1.00001] yes=3,no=4,missing=4 - 3:leaf=-9.42142 - 4:leaf=-0.791407 - 2:[f66<1.00001] yes=5,no=6,missing=6 - 5:leaf=5.77229 - 6:leaf=0.658725 -booster[3]: -0:[f26<1.00001] yes=1,no=2,missing=2 - 1:leaf=1.07748 - 2:[f38<1.00001] yes=3,no=4,missing=4 - 3:leaf=-0.877906 - 4:leaf=0.614153 -booster[4]: -0:[f108<1.00001] yes=1,no=2,missing=2 - 1:leaf=2.92191 - 2:[f35<1.00001] yes=3,no=4,missing=4 - 3:leaf=0.152607 - 4:leaf=-1.26934 -booster[5]: -0:[f22<1.00001] yes=1,no=2,missing=2 - 1:[f35<1.00001] yes=3,no=4,missing=4 - 3:leaf=-1.02315 - 4:leaf=-3.02414 - 2:[f23<1.00001] yes=5,no=6,missing=6 - 5:leaf=-1.53846 - 6:leaf=0.431742 -booster[6]: -0:[f28<1.00001] yes=1,no=2,missing=2 - 1:[f108<1.00001] yes=3,no=4,missing=4 - 3:leaf=0.836115 - 4:leaf=-0.912605 - 2:[f23<1.00001] yes=5,no=6,missing=6 - 5:leaf=-1.1971 - 6:leaf=0.777142 -booster[7]: -0:[f38<1.00001] yes=1,no=2,missing=2 - 1:[f26<1.00001] yes=3,no=4,missing=4 - 3:leaf=0.890623 - 4:leaf=-0.908312 - 2:[f111<1.00001] yes=5,no=6,missing=6 - 5:leaf=1.43619 - 6:leaf=-0.0180106 -booster[8]: -0:[f22<1.00001] yes=1,no=2,missing=2 - 1:leaf=-1.01502 - 2:[f101<1.00001] yes=3,no=4,missing=4 - 3:leaf=0.568838 - 4:leaf=-0.515293 -booster[9]: -0:[f114<1.00001] yes=1,no=2,missing=2 - 1:[f60<1.00001] yes=3,no=4,missing=4 - 3:leaf=-0.609475 - 4:leaf=3.63443 - 2:[f28<1.00001] yes=5,no=6,missing=6 - 5:leaf=-0.734556 - 6:leaf=0.217203 diff --git a/R-package/src-i386/Makevars b/R-package/src-i386/Makevars deleted file mode 100644 index 10b2661d0..000000000 --- a/R-package/src-i386/Makevars +++ /dev/null @@ -1,28 +0,0 @@ -# _*_ mode: Makefile; _*_ -export CC = gcc -export CXX = g++ - -# expose these flags to R CMD SHLIB -PKG_CPPFLAGS = -O3 -Wno-unknown-pragmas -DXGBOOST_CUSTOMIZE_ERROR_ -fPIC $(SHLIB_OPENMP_CFLAGS) -PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) - -ifeq ($(no_omp),1) - PKG_CPPFLAGS += -DDISABLE_OPENMP -endif - -CXXOBJ= xgboost_wrapper.o xgboost_io.o -OBJECTS= xgboost_R.o $(CXXOBJ) - -.PHONY: all clean -all: $(SHLIB) -$(SHLIB): $(OBJECTS) - -xgboost_wrapper.o: ../../wrapper/xgboost_wrapper.cpp -xgboost_io.o: ../../src/io/io.cpp - -$(CXXOBJ) : - $(CXX) -c $(PKG_CPPFLAGS) -o $@ $(firstword $(filter %.cpp %.c, $^) ) - -clean: - rm -rf *.so *.o *~ *.dll - diff --git a/R-package/src-i386/Makevars.win b/R-package/src-i386/Makevars.win deleted file mode 100644 index 5d2261230..000000000 --- a/R-package/src-i386/Makevars.win +++ /dev/null @@ -1,32 +0,0 @@ -# _*_ mode: Makefile; _*_ -export CC = gcc -export CXX = g++ - -# expose these flags to R CMD SHLIB -PKG_CPPFLAGS = -O3 -Wno-unknown-pragmas -DXGBOOST_CUSTOMIZE_ERROR_ -fopenmp -fPIC $(SHLIB_OPENMP_CFLAGS) -PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) - -# add flag to build native code even in cross compiler -ifeq "$(WIN)" "64" - PKG_CPPFLAGS += -m64 -endif - -ifeq ($(no_omp),1) - PKG_CPPFLAGS += -DDISABLE_OPENMP -endif - -CXXOBJ= xgboost_wrapper.o xgboost_io.o -OBJECTS= xgboost_R.o $(CXXOBJ) - -.PHONY: all clean -all: $(SHLIB) -$(SHLIB): $(OBJECTS) - -xgboost_wrapper.o: ../../wrapper/xgboost_wrapper.cpp -xgboost_io.o: ../../src/io/io.cpp - -$(CXXOBJ) : - $(CXX) -c $(PKG_CPPFLAGS) -o $@ $(firstword $(filter %.cpp %.c, $^) ) - -clean: - rm -rf *.so *.o *~ *.dll diff --git a/R-package/src-i386/xgboost_R.cpp b/R-package/src-i386/xgboost_R.cpp deleted file mode 100644 index 1ca232509..000000000 --- a/R-package/src-i386/xgboost_R.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include -#include -#include -#include -#include "xgboost_R.h" -#include "../../wrapper/xgboost_wrapper.h" -#include "../../src/utils/utils.h" -#include "../../src/utils/omp.h" -#include "../../src/utils/matrix_csr.h" - -using namespace xgboost; -// implements error handling -namespace xgboost { -namespace utils { -void HandleAssertError(const char *msg) { - error("%s", msg); -} -void HandleCheckError(const char *msg) { - error("%s", msg); -} -} // namespace utils -} // namespace xgboost - -extern "C" { - void _DMatrixFinalizer(SEXP ext) { - if (R_ExternalPtrAddr(ext) == NULL) return; - XGDMatrixFree(R_ExternalPtrAddr(ext)); - R_ClearExternalPtr(ext); - } - SEXP XGDMatrixCreateFromFile_R(SEXP fname, SEXP silent) { - void *handle = XGDMatrixCreateFromFile(CHAR(asChar(fname)), asInteger(silent)); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - SEXP XGDMatrixCreateFromMat_R(SEXP mat, - SEXP missing) { - SEXP dim = getAttrib(mat, R_DimSymbol); - int nrow = INTEGER(dim)[0]; - int ncol = INTEGER(dim)[1]; - double *din = REAL(mat); - std::vector data(nrow * ncol); - #pragma omp parallel for schedule(static) - for (int i = 0; i < nrow; ++i) { - for (int j = 0; j < ncol; ++j) { - data[i * ncol +j] = din[i + nrow * j]; - } - } - void *handle = XGDMatrixCreateFromMat(&data[0], nrow, ncol, asReal(missing)); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - SEXP XGDMatrixCreateFromCSC_R(SEXP indptr, - SEXP indices, - SEXP data) { - const int *col_ptr = INTEGER(indptr); - const int *row_index = INTEGER(indices); - const double *col_data = REAL(data); - int ncol = length(indptr) - 1; - int ndata = length(data); - // transform into CSR format - std::vector row_ptr; - std::vector< std::pair > csr_data; - utils::SparseCSRMBuilder, false, bst_ulong> builder(row_ptr, csr_data); - builder.InitBudget(); - for (int i = 0; i < ncol; ++i) { - for (int j = col_ptr[i]; j < col_ptr[i+1]; ++j) { - builder.AddBudget(row_index[j]); - } - } - builder.InitStorage(); - for (int i = 0; i < ncol; ++i) { - for (int j = col_ptr[i]; j < col_ptr[i+1]; ++j) { - builder.PushElem(row_index[j], std::make_pair(i, col_data[j])); - } - } - utils::Assert(csr_data.size() == static_cast(ndata), "BUG CreateFromCSC"); - std::vector row_data(ndata); - std::vector col_index(ndata); - #pragma omp parallel for schedule(static) - for (int i = 0; i < ndata; ++i) { - col_index[i] = csr_data[i].first; - row_data[i] = csr_data[i].second; - } - void *handle = XGDMatrixCreateFromCSR(&row_ptr[0], &col_index[0], &row_data[0], row_ptr.size(), ndata ); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - void XGDMatrixSaveBinary_R(SEXP handle, SEXP fname, SEXP silent) { - XGDMatrixSaveBinary(R_ExternalPtrAddr(handle), - CHAR(asChar(fname)), asInteger(silent)); - } - void XGDMatrixSetInfo_R(SEXP handle, SEXP field, SEXP array) { - int len = length(array); - const char *name = CHAR(asChar(field)); - if (!strcmp("group", name)) { - std::vector vec(len); - #pragma omp parallel for schedule(static) - for (int i = 0; i < len; ++i) { - vec[i] = static_cast(INTEGER(array)[i]); - } - XGDMatrixSetGroup(R_ExternalPtrAddr(handle), &vec[0], len); - return; - } - { - std::vector vec(len); - #pragma omp parallel for schedule(static) - for (int i = 0; i < len; ++i) { - vec[i] = REAL(array)[i]; - } - XGDMatrixSetFloatInfo(R_ExternalPtrAddr(handle), - CHAR(asChar(field)), - &vec[0], len); - } - } - SEXP XGDMatrixGetInfo_R(SEXP handle, SEXP field) { - bst_ulong olen; - const float *res = XGDMatrixGetFloatInfo(R_ExternalPtrAddr(handle), - CHAR(asChar(field)), &olen); - SEXP ret = PROTECT(allocVector(REALSXP, olen)); - for (size_t i = 0; i < olen; ++i) { - REAL(ret)[i] = res[i]; - } - UNPROTECT(1); - return ret; - } - // functions related to booster - void _BoosterFinalizer(SEXP ext) { - if (R_ExternalPtrAddr(ext) == NULL) return; - XGBoosterFree(R_ExternalPtrAddr(ext)); - R_ClearExternalPtr(ext); - } - SEXP XGBoosterCreate_R(SEXP dmats) { - int len = length(dmats); - std::vector dvec; - for (int i = 0; i < len; ++i){ - dvec.push_back(R_ExternalPtrAddr(VECTOR_ELT(dmats, i))); - } - void *handle = XGBoosterCreate(&dvec[0], dvec.size()); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _BoosterFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - void XGBoosterSetParam_R(SEXP handle, SEXP name, SEXP val) { - XGBoosterSetParam(R_ExternalPtrAddr(handle), - CHAR(asChar(name)), - CHAR(asChar(val))); - } - void XGBoosterUpdateOneIter_R(SEXP handle, SEXP iter, SEXP dtrain) { - XGBoosterUpdateOneIter(R_ExternalPtrAddr(handle), - asInteger(iter), - R_ExternalPtrAddr(dtrain)); - } - void XGBoosterBoostOneIter_R(SEXP handle, SEXP dtrain, SEXP grad, SEXP hess) { - utils::Check(length(grad) == length(hess), "gradient and hess must have same length"); - int len = length(grad); - std::vector tgrad(len), thess(len); - #pragma omp parallel for schedule(static) - for (int j = 0; j < len; ++j) { - tgrad[j] = REAL(grad)[j]; - thess[j] = REAL(hess)[j]; - } - XGBoosterBoostOneIter(R_ExternalPtrAddr(handle), - R_ExternalPtrAddr(dtrain), - &tgrad[0], &thess[0], len); - } - SEXP XGBoosterEvalOneIter_R(SEXP handle, SEXP iter, SEXP dmats, SEXP evnames) { - utils::Check(length(dmats) == length(evnames), "dmats and evnams must have same length"); - int len = length(dmats); - std::vector vec_dmats; - std::vector vec_names; - std::vector vec_sptr; - for (int i = 0; i < len; ++i) { - vec_dmats.push_back(R_ExternalPtrAddr(VECTOR_ELT(dmats, i))); - vec_names.push_back(std::string(CHAR(asChar(VECTOR_ELT(evnames, i))))); - } - for (int i = 0; i < len; ++i) { - vec_sptr.push_back(vec_names[i].c_str()); - } - return mkString(XGBoosterEvalOneIter(R_ExternalPtrAddr(handle), - asInteger(iter), - &vec_dmats[0], &vec_sptr[0], len)); - } - SEXP XGBoosterPredict_R(SEXP handle, SEXP dmat, SEXP output_margin) { - bst_ulong olen; - const float *res = XGBoosterPredict(R_ExternalPtrAddr(handle), - R_ExternalPtrAddr(dmat), - asInteger(output_margin), - &olen); - SEXP ret = PROTECT(allocVector(REALSXP, olen)); - for (size_t i = 0; i < olen; ++i) { - REAL(ret)[i] = res[i]; - } - UNPROTECT(1); - return ret; - } - void XGBoosterLoadModel_R(SEXP handle, SEXP fname) { - XGBoosterLoadModel(R_ExternalPtrAddr(handle), CHAR(asChar(fname))); - } - void XGBoosterSaveModel_R(SEXP handle, SEXP fname) { - XGBoosterSaveModel(R_ExternalPtrAddr(handle), CHAR(asChar(fname))); - } - void XGBoosterDumpModel_R(SEXP handle, SEXP fname, SEXP fmap) { - bst_ulong olen; - const char **res = XGBoosterDumpModel(R_ExternalPtrAddr(handle), - CHAR(asChar(fmap)), - &olen); - FILE *fo = utils::FopenCheck(CHAR(asChar(fname)), "w"); - for (size_t i = 0; i < olen; ++i) { - fprintf(fo, "booster[%u]:\n", static_cast(i)); - fprintf(fo, "%s", res[i]); - } - fclose(fo); - } -} diff --git a/R-package/src-i386/xgboost_R.h b/R-package/src-i386/xgboost_R.h deleted file mode 100644 index 8e8b2728b..000000000 --- a/R-package/src-i386/xgboost_R.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef XGBOOST_WRAPPER_R_H_ -#define XGBOOST_WRAPPER_R_H_ -/*! - * \file xgboost_wrapper_R.h - * \author Tianqi Chen - * \brief R wrapper of xgboost - */ -extern "C" { -#include -} - -extern "C" { - /*! - * \brief load a data matrix - * \param fname name of the content - * \param silent whether print messages - * \return a loaded data matrix - */ - SEXP XGDMatrixCreateFromFile_R(SEXP fname, SEXP silent); - /*! - * \brief create matrix content from dense matrix - * This assumes the matrix is stored in column major format - * \param data R Matrix object - * \param missing which value to represent missing value - * \return created dmatrix - */ - SEXP XGDMatrixCreateFromMat_R(SEXP mat, - SEXP missing); - /*! - * \brief create a matrix content from CSC format - * \param indptr pointer to column headers - * \param indices row indices - * \param data content of the data - * \return created dmatrix - */ - SEXP XGDMatrixCreateFromCSC_R(SEXP indptr, - SEXP indices, - SEXP data); - /*! - * \brief load a data matrix into binary file - * \param handle a instance of data matrix - * \param fname file name - * \param silent print statistics when saving - */ - void XGDMatrixSaveBinary_R(SEXP handle, SEXP fname, SEXP silent); - /*! - * \brief set information to dmatrix - * \param handle a instance of data matrix - * \param field field name, can be label, weight - * \param array pointer to float vector - */ - void XGDMatrixSetInfo_R(SEXP handle, SEXP field, SEXP array); - /*! - * \brief get info vector from matrix - * \param handle a instance of data matrix - * \param field field name - * \return info vector - */ - SEXP XGDMatrixGetInfo_R(SEXP handle, SEXP field); - /*! - * \brief create xgboost learner - * \param dmats a list of dmatrix handles that will be cached - */ - SEXP XGBoosterCreate_R(SEXP dmats); - /*! - * \brief set parameters - * \param handle handle - * \param name parameter name - * \param val value of parameter - */ - void XGBoosterSetParam_R(SEXP handle, SEXP name, SEXP val); - /*! - * \brief update the model in one round using dtrain - * \param handle handle - * \param iter current iteration rounds - * \param dtrain training data - */ - void XGBoosterUpdateOneIter_R(SEXP ext, SEXP iter, SEXP dtrain); - /*! - * \brief update the model, by directly specify gradient and second order gradient, - * this can be used to replace UpdateOneIter, to support customized loss function - * \param handle handle - * \param dtrain training data - * \param grad gradient statistics - * \param hess second order gradient statistics - */ - void XGBoosterBoostOneIter_R(SEXP handle, SEXP dtrain, SEXP grad, SEXP hess); - /*! - * \brief get evaluation statistics for xgboost - * \param handle handle - * \param iter current iteration rounds - * \param dmats list of handles to dmatrices - * \param evname name of evaluation - * \return the string containing evaluation stati - */ - SEXP XGBoosterEvalOneIter_R(SEXP handle, SEXP iter, SEXP dmats, SEXP evnames); - /*! - * \brief make prediction based on dmat - * \param handle handle - * \param dmat data matrix - * \param output_margin whether only output raw margin value - */ - SEXP XGBoosterPredict_R(SEXP handle, SEXP dmat, SEXP output_margin); - /*! - * \brief load model from existing file - * \param handle handle - * \param fname file name - */ - void XGBoosterLoadModel_R(SEXP handle, SEXP fname); - /*! - * \brief save model into existing file - * \param handle handle - * \param fname file name - */ - void XGBoosterSaveModel_R(SEXP handle, SEXP fname); - /*! - * \brief dump model into text file - * \param handle handle - * \param fname file name of model that can be dumped into - * \param fmap name to fmap can be empty string - */ - void XGBoosterDumpModel_R(SEXP handle, SEXP fname, SEXP fmap); -}; -#endif // XGBOOST_WRAPPER_R_H_ diff --git a/R-package/src-x64/Makevars b/R-package/src-x64/Makevars deleted file mode 100644 index 10b2661d0..000000000 --- a/R-package/src-x64/Makevars +++ /dev/null @@ -1,28 +0,0 @@ -# _*_ mode: Makefile; _*_ -export CC = gcc -export CXX = g++ - -# expose these flags to R CMD SHLIB -PKG_CPPFLAGS = -O3 -Wno-unknown-pragmas -DXGBOOST_CUSTOMIZE_ERROR_ -fPIC $(SHLIB_OPENMP_CFLAGS) -PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) - -ifeq ($(no_omp),1) - PKG_CPPFLAGS += -DDISABLE_OPENMP -endif - -CXXOBJ= xgboost_wrapper.o xgboost_io.o -OBJECTS= xgboost_R.o $(CXXOBJ) - -.PHONY: all clean -all: $(SHLIB) -$(SHLIB): $(OBJECTS) - -xgboost_wrapper.o: ../../wrapper/xgboost_wrapper.cpp -xgboost_io.o: ../../src/io/io.cpp - -$(CXXOBJ) : - $(CXX) -c $(PKG_CPPFLAGS) -o $@ $(firstword $(filter %.cpp %.c, $^) ) - -clean: - rm -rf *.so *.o *~ *.dll - diff --git a/R-package/src-x64/Makevars.win b/R-package/src-x64/Makevars.win deleted file mode 100644 index 5d2261230..000000000 --- a/R-package/src-x64/Makevars.win +++ /dev/null @@ -1,32 +0,0 @@ -# _*_ mode: Makefile; _*_ -export CC = gcc -export CXX = g++ - -# expose these flags to R CMD SHLIB -PKG_CPPFLAGS = -O3 -Wno-unknown-pragmas -DXGBOOST_CUSTOMIZE_ERROR_ -fopenmp -fPIC $(SHLIB_OPENMP_CFLAGS) -PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) - -# add flag to build native code even in cross compiler -ifeq "$(WIN)" "64" - PKG_CPPFLAGS += -m64 -endif - -ifeq ($(no_omp),1) - PKG_CPPFLAGS += -DDISABLE_OPENMP -endif - -CXXOBJ= xgboost_wrapper.o xgboost_io.o -OBJECTS= xgboost_R.o $(CXXOBJ) - -.PHONY: all clean -all: $(SHLIB) -$(SHLIB): $(OBJECTS) - -xgboost_wrapper.o: ../../wrapper/xgboost_wrapper.cpp -xgboost_io.o: ../../src/io/io.cpp - -$(CXXOBJ) : - $(CXX) -c $(PKG_CPPFLAGS) -o $@ $(firstword $(filter %.cpp %.c, $^) ) - -clean: - rm -rf *.so *.o *~ *.dll diff --git a/R-package/src-x64/xgboost_R.cpp b/R-package/src-x64/xgboost_R.cpp deleted file mode 100644 index 1ca232509..000000000 --- a/R-package/src-x64/xgboost_R.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include -#include -#include -#include -#include "xgboost_R.h" -#include "../../wrapper/xgboost_wrapper.h" -#include "../../src/utils/utils.h" -#include "../../src/utils/omp.h" -#include "../../src/utils/matrix_csr.h" - -using namespace xgboost; -// implements error handling -namespace xgboost { -namespace utils { -void HandleAssertError(const char *msg) { - error("%s", msg); -} -void HandleCheckError(const char *msg) { - error("%s", msg); -} -} // namespace utils -} // namespace xgboost - -extern "C" { - void _DMatrixFinalizer(SEXP ext) { - if (R_ExternalPtrAddr(ext) == NULL) return; - XGDMatrixFree(R_ExternalPtrAddr(ext)); - R_ClearExternalPtr(ext); - } - SEXP XGDMatrixCreateFromFile_R(SEXP fname, SEXP silent) { - void *handle = XGDMatrixCreateFromFile(CHAR(asChar(fname)), asInteger(silent)); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - SEXP XGDMatrixCreateFromMat_R(SEXP mat, - SEXP missing) { - SEXP dim = getAttrib(mat, R_DimSymbol); - int nrow = INTEGER(dim)[0]; - int ncol = INTEGER(dim)[1]; - double *din = REAL(mat); - std::vector data(nrow * ncol); - #pragma omp parallel for schedule(static) - for (int i = 0; i < nrow; ++i) { - for (int j = 0; j < ncol; ++j) { - data[i * ncol +j] = din[i + nrow * j]; - } - } - void *handle = XGDMatrixCreateFromMat(&data[0], nrow, ncol, asReal(missing)); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - SEXP XGDMatrixCreateFromCSC_R(SEXP indptr, - SEXP indices, - SEXP data) { - const int *col_ptr = INTEGER(indptr); - const int *row_index = INTEGER(indices); - const double *col_data = REAL(data); - int ncol = length(indptr) - 1; - int ndata = length(data); - // transform into CSR format - std::vector row_ptr; - std::vector< std::pair > csr_data; - utils::SparseCSRMBuilder, false, bst_ulong> builder(row_ptr, csr_data); - builder.InitBudget(); - for (int i = 0; i < ncol; ++i) { - for (int j = col_ptr[i]; j < col_ptr[i+1]; ++j) { - builder.AddBudget(row_index[j]); - } - } - builder.InitStorage(); - for (int i = 0; i < ncol; ++i) { - for (int j = col_ptr[i]; j < col_ptr[i+1]; ++j) { - builder.PushElem(row_index[j], std::make_pair(i, col_data[j])); - } - } - utils::Assert(csr_data.size() == static_cast(ndata), "BUG CreateFromCSC"); - std::vector row_data(ndata); - std::vector col_index(ndata); - #pragma omp parallel for schedule(static) - for (int i = 0; i < ndata; ++i) { - col_index[i] = csr_data[i].first; - row_data[i] = csr_data[i].second; - } - void *handle = XGDMatrixCreateFromCSR(&row_ptr[0], &col_index[0], &row_data[0], row_ptr.size(), ndata ); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - void XGDMatrixSaveBinary_R(SEXP handle, SEXP fname, SEXP silent) { - XGDMatrixSaveBinary(R_ExternalPtrAddr(handle), - CHAR(asChar(fname)), asInteger(silent)); - } - void XGDMatrixSetInfo_R(SEXP handle, SEXP field, SEXP array) { - int len = length(array); - const char *name = CHAR(asChar(field)); - if (!strcmp("group", name)) { - std::vector vec(len); - #pragma omp parallel for schedule(static) - for (int i = 0; i < len; ++i) { - vec[i] = static_cast(INTEGER(array)[i]); - } - XGDMatrixSetGroup(R_ExternalPtrAddr(handle), &vec[0], len); - return; - } - { - std::vector vec(len); - #pragma omp parallel for schedule(static) - for (int i = 0; i < len; ++i) { - vec[i] = REAL(array)[i]; - } - XGDMatrixSetFloatInfo(R_ExternalPtrAddr(handle), - CHAR(asChar(field)), - &vec[0], len); - } - } - SEXP XGDMatrixGetInfo_R(SEXP handle, SEXP field) { - bst_ulong olen; - const float *res = XGDMatrixGetFloatInfo(R_ExternalPtrAddr(handle), - CHAR(asChar(field)), &olen); - SEXP ret = PROTECT(allocVector(REALSXP, olen)); - for (size_t i = 0; i < olen; ++i) { - REAL(ret)[i] = res[i]; - } - UNPROTECT(1); - return ret; - } - // functions related to booster - void _BoosterFinalizer(SEXP ext) { - if (R_ExternalPtrAddr(ext) == NULL) return; - XGBoosterFree(R_ExternalPtrAddr(ext)); - R_ClearExternalPtr(ext); - } - SEXP XGBoosterCreate_R(SEXP dmats) { - int len = length(dmats); - std::vector dvec; - for (int i = 0; i < len; ++i){ - dvec.push_back(R_ExternalPtrAddr(VECTOR_ELT(dmats, i))); - } - void *handle = XGBoosterCreate(&dvec[0], dvec.size()); - SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); - R_RegisterCFinalizerEx(ret, _BoosterFinalizer, TRUE); - UNPROTECT(1); - return ret; - } - void XGBoosterSetParam_R(SEXP handle, SEXP name, SEXP val) { - XGBoosterSetParam(R_ExternalPtrAddr(handle), - CHAR(asChar(name)), - CHAR(asChar(val))); - } - void XGBoosterUpdateOneIter_R(SEXP handle, SEXP iter, SEXP dtrain) { - XGBoosterUpdateOneIter(R_ExternalPtrAddr(handle), - asInteger(iter), - R_ExternalPtrAddr(dtrain)); - } - void XGBoosterBoostOneIter_R(SEXP handle, SEXP dtrain, SEXP grad, SEXP hess) { - utils::Check(length(grad) == length(hess), "gradient and hess must have same length"); - int len = length(grad); - std::vector tgrad(len), thess(len); - #pragma omp parallel for schedule(static) - for (int j = 0; j < len; ++j) { - tgrad[j] = REAL(grad)[j]; - thess[j] = REAL(hess)[j]; - } - XGBoosterBoostOneIter(R_ExternalPtrAddr(handle), - R_ExternalPtrAddr(dtrain), - &tgrad[0], &thess[0], len); - } - SEXP XGBoosterEvalOneIter_R(SEXP handle, SEXP iter, SEXP dmats, SEXP evnames) { - utils::Check(length(dmats) == length(evnames), "dmats and evnams must have same length"); - int len = length(dmats); - std::vector vec_dmats; - std::vector vec_names; - std::vector vec_sptr; - for (int i = 0; i < len; ++i) { - vec_dmats.push_back(R_ExternalPtrAddr(VECTOR_ELT(dmats, i))); - vec_names.push_back(std::string(CHAR(asChar(VECTOR_ELT(evnames, i))))); - } - for (int i = 0; i < len; ++i) { - vec_sptr.push_back(vec_names[i].c_str()); - } - return mkString(XGBoosterEvalOneIter(R_ExternalPtrAddr(handle), - asInteger(iter), - &vec_dmats[0], &vec_sptr[0], len)); - } - SEXP XGBoosterPredict_R(SEXP handle, SEXP dmat, SEXP output_margin) { - bst_ulong olen; - const float *res = XGBoosterPredict(R_ExternalPtrAddr(handle), - R_ExternalPtrAddr(dmat), - asInteger(output_margin), - &olen); - SEXP ret = PROTECT(allocVector(REALSXP, olen)); - for (size_t i = 0; i < olen; ++i) { - REAL(ret)[i] = res[i]; - } - UNPROTECT(1); - return ret; - } - void XGBoosterLoadModel_R(SEXP handle, SEXP fname) { - XGBoosterLoadModel(R_ExternalPtrAddr(handle), CHAR(asChar(fname))); - } - void XGBoosterSaveModel_R(SEXP handle, SEXP fname) { - XGBoosterSaveModel(R_ExternalPtrAddr(handle), CHAR(asChar(fname))); - } - void XGBoosterDumpModel_R(SEXP handle, SEXP fname, SEXP fmap) { - bst_ulong olen; - const char **res = XGBoosterDumpModel(R_ExternalPtrAddr(handle), - CHAR(asChar(fmap)), - &olen); - FILE *fo = utils::FopenCheck(CHAR(asChar(fname)), "w"); - for (size_t i = 0; i < olen; ++i) { - fprintf(fo, "booster[%u]:\n", static_cast(i)); - fprintf(fo, "%s", res[i]); - } - fclose(fo); - } -} diff --git a/R-package/src-x64/xgboost_R.h b/R-package/src-x64/xgboost_R.h deleted file mode 100644 index 8e8b2728b..000000000 --- a/R-package/src-x64/xgboost_R.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef XGBOOST_WRAPPER_R_H_ -#define XGBOOST_WRAPPER_R_H_ -/*! - * \file xgboost_wrapper_R.h - * \author Tianqi Chen - * \brief R wrapper of xgboost - */ -extern "C" { -#include -} - -extern "C" { - /*! - * \brief load a data matrix - * \param fname name of the content - * \param silent whether print messages - * \return a loaded data matrix - */ - SEXP XGDMatrixCreateFromFile_R(SEXP fname, SEXP silent); - /*! - * \brief create matrix content from dense matrix - * This assumes the matrix is stored in column major format - * \param data R Matrix object - * \param missing which value to represent missing value - * \return created dmatrix - */ - SEXP XGDMatrixCreateFromMat_R(SEXP mat, - SEXP missing); - /*! - * \brief create a matrix content from CSC format - * \param indptr pointer to column headers - * \param indices row indices - * \param data content of the data - * \return created dmatrix - */ - SEXP XGDMatrixCreateFromCSC_R(SEXP indptr, - SEXP indices, - SEXP data); - /*! - * \brief load a data matrix into binary file - * \param handle a instance of data matrix - * \param fname file name - * \param silent print statistics when saving - */ - void XGDMatrixSaveBinary_R(SEXP handle, SEXP fname, SEXP silent); - /*! - * \brief set information to dmatrix - * \param handle a instance of data matrix - * \param field field name, can be label, weight - * \param array pointer to float vector - */ - void XGDMatrixSetInfo_R(SEXP handle, SEXP field, SEXP array); - /*! - * \brief get info vector from matrix - * \param handle a instance of data matrix - * \param field field name - * \return info vector - */ - SEXP XGDMatrixGetInfo_R(SEXP handle, SEXP field); - /*! - * \brief create xgboost learner - * \param dmats a list of dmatrix handles that will be cached - */ - SEXP XGBoosterCreate_R(SEXP dmats); - /*! - * \brief set parameters - * \param handle handle - * \param name parameter name - * \param val value of parameter - */ - void XGBoosterSetParam_R(SEXP handle, SEXP name, SEXP val); - /*! - * \brief update the model in one round using dtrain - * \param handle handle - * \param iter current iteration rounds - * \param dtrain training data - */ - void XGBoosterUpdateOneIter_R(SEXP ext, SEXP iter, SEXP dtrain); - /*! - * \brief update the model, by directly specify gradient and second order gradient, - * this can be used to replace UpdateOneIter, to support customized loss function - * \param handle handle - * \param dtrain training data - * \param grad gradient statistics - * \param hess second order gradient statistics - */ - void XGBoosterBoostOneIter_R(SEXP handle, SEXP dtrain, SEXP grad, SEXP hess); - /*! - * \brief get evaluation statistics for xgboost - * \param handle handle - * \param iter current iteration rounds - * \param dmats list of handles to dmatrices - * \param evname name of evaluation - * \return the string containing evaluation stati - */ - SEXP XGBoosterEvalOneIter_R(SEXP handle, SEXP iter, SEXP dmats, SEXP evnames); - /*! - * \brief make prediction based on dmat - * \param handle handle - * \param dmat data matrix - * \param output_margin whether only output raw margin value - */ - SEXP XGBoosterPredict_R(SEXP handle, SEXP dmat, SEXP output_margin); - /*! - * \brief load model from existing file - * \param handle handle - * \param fname file name - */ - void XGBoosterLoadModel_R(SEXP handle, SEXP fname); - /*! - * \brief save model into existing file - * \param handle handle - * \param fname file name - */ - void XGBoosterSaveModel_R(SEXP handle, SEXP fname); - /*! - * \brief dump model into text file - * \param handle handle - * \param fname file name of model that can be dumped into - * \param fmap name to fmap can be empty string - */ - void XGBoosterDumpModel_R(SEXP handle, SEXP fname, SEXP fmap); -}; -#endif // XGBOOST_WRAPPER_R_H_