From 57ec9222145621e915a412196959604850e89474 Mon Sep 17 00:00:00 2001 From: tqchen Date: Fri, 3 Jul 2015 19:42:44 -0700 Subject: [PATCH] fix all cpp lint --- R-package/src/xgboost_R.cpp | 33 +-- R-package/src/xgboost_R.h | 32 +-- R-package/src/xgboost_assert.c | 9 +- wrapper/xgboost_wrapper.cpp | 470 +++++++++++++++++---------------- wrapper/xgboost_wrapper.h | 46 ++-- 5 files changed, 302 insertions(+), 288 deletions(-) diff --git a/R-package/src/xgboost_R.cpp b/R-package/src/xgboost_R.cpp index de6ed339f..436faaa5a 100644 --- a/R-package/src/xgboost_R.cpp +++ b/R-package/src/xgboost_R.cpp @@ -1,9 +1,10 @@ +// Copyright (c) 2014 by Contributors #include #include #include #include #include -#include +#include #include "wrapper/xgboost_wrapper.h" #include "src/utils/utils.h" #include "src/utils/omp.h" @@ -34,7 +35,7 @@ bool CheckNAN(double v) { bool LogGamma(double v) { return lgammafn(v); } -} // namespace utils +} // namespace utils namespace random { void Seed(unsigned seed) { @@ -62,7 +63,7 @@ extern "C" { SEXP XGCheckNullPtr_R(SEXP handle) { return ScalarLogical(R_ExternalPtrAddr(handle) == NULL); } - void _DMatrixFinalizer(SEXP ext) { + void _DMatrixFinalizer(SEXP ext) { if (R_ExternalPtrAddr(ext) == NULL) return; XGDMatrixFree(R_ExternalPtrAddr(ext)); R_ClearExternalPtr(ext); @@ -76,7 +77,7 @@ extern "C" { UNPROTECT(1); return ret; } - SEXP XGDMatrixCreateFromMat_R(SEXP mat, + SEXP XGDMatrixCreateFromMat_R(SEXP mat, SEXP missing) { _WrapperBegin(); SEXP dim = getAttrib(mat, R_DimSymbol); @@ -95,7 +96,7 @@ extern "C" { SEXP ret = PROTECT(R_MakeExternalPtr(handle, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); UNPROTECT(1); - return ret; + return ret; } SEXP XGDMatrixCreateFromCSC_R(SEXP indptr, SEXP indices, @@ -138,7 +139,7 @@ extern "C" { SEXP ret = PROTECT(R_MakeExternalPtr(res, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(ret, _DMatrixFinalizer, TRUE); UNPROTECT(1); - return ret; + return ret; } void XGDMatrixSaveBinary_R(SEXP handle, SEXP fname, SEXP silent) { _WrapperBegin(); @@ -152,7 +153,7 @@ extern "C" { const char *name = CHAR(asChar(field)); if (!strcmp("group", name)) { std::vector vec(len); - #pragma omp parallel for schedule(static) + #pragma omp parallel for schedule(static) for (int i = 0; i < len; ++i) { vec[i] = static_cast(INTEGER(array)[i]); } @@ -163,7 +164,7 @@ extern "C" { for (int i = 0; i < len; ++i) { vec[i] = REAL(array)[i]; } - XGDMatrixSetFloatInfo(R_ExternalPtrAddr(handle), + XGDMatrixSetFloatInfo(R_ExternalPtrAddr(handle), CHAR(asChar(field)), BeginPtr(vec), len); } @@ -187,7 +188,7 @@ extern "C" { return ScalarInteger(static_cast(nrow)); } // functions related to booster - void _BoosterFinalizer(SEXP ext) { + void _BoosterFinalizer(SEXP ext) { if (R_ExternalPtrAddr(ext) == NULL) return; XGBoosterFree(R_ExternalPtrAddr(ext)); R_ClearExternalPtr(ext); @@ -196,7 +197,7 @@ extern "C" { _WrapperBegin(); int len = length(dmats); std::vector dvec; - for (int i = 0; i < len; ++i){ + for (int i = 0; i < len; ++i) { dvec.push_back(R_ExternalPtrAddr(VECTOR_ELT(dmats, i))); } void *handle = XGBoosterCreate(BeginPtr(dvec), dvec.size()); @@ -252,7 +253,7 @@ extern "C" { const char *ret = XGBoosterEvalOneIter(R_ExternalPtrAddr(handle), asInteger(iter), - BeginPtr(vec_dmats), BeginPtr(vec_sptr), len); + BeginPtr(vec_dmats), BeginPtr(vec_sptr), len); _WrapperEnd(); return mkString(ret); } @@ -282,7 +283,7 @@ extern "C" { XGBoosterSaveModel(R_ExternalPtrAddr(handle), CHAR(asChar(fname))); _WrapperEnd(); } - void XGBoosterLoadModelFromRaw_R(SEXP handle, SEXP raw) { + void XGBoosterLoadModelFromRaw_R(SEXP handle, SEXP raw) { _WrapperBegin(); XGBoosterLoadModelFromBuffer(R_ExternalPtrAddr(handle), RAW(raw), @@ -298,7 +299,7 @@ extern "C" { if (olen != 0) { memcpy(RAW(ret), raw, olen); } - UNPROTECT(1); + UNPROTECT(1); return ret; } SEXP XGBoosterDumpModel_R(SEXP handle, SEXP fmap, SEXP with_stats) { @@ -310,10 +311,10 @@ extern "C" { asInteger(with_stats), &olen); _WrapperEnd(); - SEXP out = PROTECT(allocVector(STRSXP, olen)); - for (size_t i = 0; i < olen; ++i) { + SEXP out = PROTECT(allocVector(STRSXP, olen)); + for (size_t i = 0; i < olen; ++i) { stringstream stream; - stream << "booster["< #include @@ -19,7 +21,7 @@ extern "C" { */ SEXP XGCheckNullPtr_R(SEXP handle); /*! - * \brief load a data matrix + * \brief load a data matrix * \param fname name of the content * \param silent whether print messages * \return a loaded data matrix @@ -32,9 +34,9 @@ extern "C" { * \param missing which value to represent missing value * \return created dmatrix */ - SEXP XGDMatrixCreateFromMat_R(SEXP mat, + 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 @@ -70,26 +72,26 @@ extern "C" { * \param handle a instance of data matrix * \param field field name * \return info vector - */ + */ SEXP XGDMatrixGetInfo_R(SEXP handle, SEXP field); /*! * \brief return number of rows * \param handle a instance of data matrix */ SEXP XGDMatrixNumRow_R(SEXP handle); - /*! - * \brief create xgboost learner + /*! + * \brief create xgboost learner * \param dmats a list of dmatrix handles that will be cached - */ + */ SEXP XGBoosterCreate_R(SEXP dmats); - /*! - * \brief set parameters + /*! + * \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 @@ -132,12 +134,12 @@ extern "C" { * \brief save model into existing file * \param handle handle * \param fname file name - */ + */ void XGBoosterSaveModel_R(SEXP handle, SEXP fname); /*! * \brief load model from raw array * \param handle handle - */ + */ void XGBoosterLoadModelFromRaw_R(SEXP handle, SEXP raw); /*! * \brief save model into R's raw array @@ -153,4 +155,4 @@ extern "C" { */ SEXP XGBoosterDumpModel_R(SEXP handle, SEXP fmap, SEXP with_stats); } -#endif // XGBOOST_WRAPPER_R_H_ +#endif // XGBOOST_WRAPPER_R_H_ // NOLINT(*) diff --git a/R-package/src/xgboost_assert.c b/R-package/src/xgboost_assert.c index 20b789492..072074243 100644 --- a/R-package/src/xgboost_assert.c +++ b/R-package/src/xgboost_assert.c @@ -1,3 +1,4 @@ +// Copyright (c) 2014 by Contributors #include #include #include @@ -6,17 +7,17 @@ void XGBoostAssert_R(int exp, const char *fmt, ...) { char buf[1024]; if (exp == 0) { - va_list args; + va_list args; va_start(args, fmt); vsprintf(buf, fmt, args); va_end(args); error("AssertError:%s\n", buf); - } + } } void XGBoostCheck_R(int exp, const char *fmt, ...) { char buf[1024]; if (exp == 0) { - va_list args; + va_list args; va_start(args, fmt); vsprintf(buf, fmt, args); va_end(args); @@ -25,7 +26,7 @@ void XGBoostCheck_R(int exp, const char *fmt, ...) { } int XGBoostSPrintf_R(char *buf, size_t size, const char *fmt, ...) { int ret; - va_list args; + va_list args; va_start(args, fmt); ret = vsnprintf(buf, size, fmt, args); va_end(args); diff --git a/wrapper/xgboost_wrapper.cpp b/wrapper/xgboost_wrapper.cpp index 4d7828faf..8572316f0 100644 --- a/wrapper/xgboost_wrapper.cpp +++ b/wrapper/xgboost_wrapper.cpp @@ -1,3 +1,4 @@ +// Copyright (c) 2014 by Contributors // implementations in ctypes #define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_DEPRECATE @@ -31,9 +32,11 @@ class Booster: public learner::BoostLearner { this->init_model = false; this->SetCacheData(mats); } - inline const float *Pred(const DataMatrix &dmat, int option_mask, unsigned ntree_limit, bst_ulong *len) { + inline const float *Pred(const DataMatrix &dmat, int option_mask, + unsigned ntree_limit, bst_ulong *len) { this->CheckInitModel(); - this->Predict(dmat, (option_mask&1) != 0, &this->preds_, ntree_limit, (option_mask&2) != 0); + this->Predict(dmat, (option_mask&1) != 0, &this->preds_, + ntree_limit, (option_mask&2) != 0); *len = static_cast(this->preds_.size()); return BeginPtr(this->preds_); } @@ -57,9 +60,9 @@ class Booster: public learner::BoostLearner { this->init_model = true; } inline void LoadModelFromBuffer(const void *buf, size_t size) { - utils::MemoryFixSizeBuffer fs((void*)buf, size); + utils::MemoryFixSizeBuffer fs((void*)buf, size); // NOLINT(*) learner::BoostLearner::LoadModel(fs, true); - this->init_model = true; + this->init_model = true; } inline const char *GetModelRaw(bst_ulong *out_len) { this->CheckInitModel(); @@ -99,246 +102,247 @@ class Booster: public learner::BoostLearner { using namespace xgboost::wrapper; -extern "C"{ - void* XGDMatrixCreateFromFile(const char *fname, int silent) { - return LoadDataMatrix(fname, silent != 0, false, false); +void* XGDMatrixCreateFromFile(const char *fname, int silent) { + return LoadDataMatrix(fname, silent != 0, false, false); +} +void* XGDMatrixCreateFromCSR(const bst_ulong *indptr, + const unsigned *indices, + const float *data, + bst_ulong nindptr, + bst_ulong nelem) { + DMatrixSimple *p_mat = new DMatrixSimple(); + DMatrixSimple &mat = *p_mat; + mat.row_ptr_.resize(nindptr); + for (bst_ulong i = 0; i < nindptr; ++i) { + mat.row_ptr_[i] = static_cast(indptr[i]); } - void* XGDMatrixCreateFromCSR(const bst_ulong *indptr, - const unsigned *indices, - const float *data, - bst_ulong nindptr, - bst_ulong nelem) { - DMatrixSimple *p_mat = new DMatrixSimple(); - DMatrixSimple &mat = *p_mat; - mat.row_ptr_.resize(nindptr); - for (bst_ulong i = 0; i < nindptr; ++i) { - mat.row_ptr_[i] = static_cast(indptr[i]); - } - mat.row_data_.resize(nelem); - for (bst_ulong i = 0; i < nelem; ++i) { - mat.row_data_[i] = RowBatch::Entry(indices[i], data[i]); - mat.info.info.num_col = std::max(mat.info.info.num_col, - static_cast(indices[i]+1)); - } - mat.info.info.num_row = nindptr - 1; - return p_mat; + mat.row_data_.resize(nelem); + for (bst_ulong i = 0; i < nelem; ++i) { + mat.row_data_[i] = RowBatch::Entry(indices[i], data[i]); + mat.info.info.num_col = std::max(mat.info.info.num_col, + static_cast(indices[i]+1)); } - XGB_DLL void* XGDMatrixCreateFromCSC(const bst_ulong *col_ptr, - const unsigned *indices, - const float *data, - bst_ulong nindptr, - bst_ulong nelem) { - int nthread; - #pragma omp parallel - { - nthread = omp_get_num_threads(); - } - - DMatrixSimple *p_mat = new DMatrixSimple(); - DMatrixSimple &mat = *p_mat; - utils::ParallelGroupBuilder builder(&mat.row_ptr_, &mat.row_data_); - builder.InitBudget(0, nthread); - long ncol = static_cast(nindptr - 1); - #pragma omp parallel for schedule(static) - for (long i = 0; i < ncol; ++i) { - int tid = omp_get_thread_num(); - for (unsigned j = col_ptr[i]; j < col_ptr[i+1]; ++j) { - builder.AddBudget(indices[j], tid); - } - } - builder.InitStorage(); - #pragma omp parallel for schedule(static) - for (long i = 0; i < ncol; ++i) { - int tid = omp_get_thread_num(); - for (unsigned j = col_ptr[i]; j < col_ptr[i+1]; ++j) { - builder.Push(indices[j], - RowBatch::Entry(static_cast(i), data[j]), - tid); - } - } - mat.info.info.num_row = mat.row_ptr_.size() - 1; - mat.info.info.num_col = static_cast(ncol); - return p_mat; + mat.info.info.num_row = nindptr - 1; + return p_mat; +} +void* XGDMatrixCreateFromCSC(const bst_ulong *col_ptr, + const unsigned *indices, + const float *data, + bst_ulong nindptr, + bst_ulong nelem) { + int nthread; + #pragma omp parallel + { + nthread = omp_get_num_threads(); } - void* XGDMatrixCreateFromMat(const float *data, - bst_ulong nrow, - bst_ulong ncol, - float missing) { - bool nan_missing = utils::CheckNAN(missing); - DMatrixSimple *p_mat = new DMatrixSimple(); - DMatrixSimple &mat = *p_mat; - mat.info.info.num_row = nrow; - mat.info.info.num_col = ncol; - for (bst_ulong i = 0; i < nrow; ++i, data += ncol) { - bst_ulong nelem = 0; - for (bst_ulong j = 0; j < ncol; ++j) { - if (utils::CheckNAN(data[j])) { - utils::Check(nan_missing, - "There are NAN in the matrix, however, you did not set missing=NAN"); - } else { - if (nan_missing || data[j] != missing) { - mat.row_data_.push_back(RowBatch::Entry(j, data[j])); - ++nelem; - } + + DMatrixSimple *p_mat = new DMatrixSimple(); + DMatrixSimple &mat = *p_mat; + utils::ParallelGroupBuilder builder(&mat.row_ptr_, &mat.row_data_); + builder.InitBudget(0, nthread); + long ncol = static_cast(nindptr - 1); // NOLINT(*) + #pragma omp parallel for schedule(static) + for (long i = 0; i < ncol; ++i) { // NOLINT(*) + int tid = omp_get_thread_num(); + for (unsigned j = col_ptr[i]; j < col_ptr[i+1]; ++j) { + builder.AddBudget(indices[j], tid); + } + } + builder.InitStorage(); + #pragma omp parallel for schedule(static) + for (long i = 0; i < ncol; ++i) { // NOLINT(*) + int tid = omp_get_thread_num(); + for (unsigned j = col_ptr[i]; j < col_ptr[i+1]; ++j) { + builder.Push(indices[j], + RowBatch::Entry(static_cast(i), data[j]), + tid); + } + } + mat.info.info.num_row = mat.row_ptr_.size() - 1; + mat.info.info.num_col = static_cast(ncol); + return p_mat; +} +void* XGDMatrixCreateFromMat(const float *data, + bst_ulong nrow, + bst_ulong ncol, + float missing) { + bool nan_missing = utils::CheckNAN(missing); + DMatrixSimple *p_mat = new DMatrixSimple(); + DMatrixSimple &mat = *p_mat; + mat.info.info.num_row = nrow; + mat.info.info.num_col = ncol; + for (bst_ulong i = 0; i < nrow; ++i, data += ncol) { + bst_ulong nelem = 0; + for (bst_ulong j = 0; j < ncol; ++j) { + if (utils::CheckNAN(data[j])) { + utils::Check(nan_missing, + "There are NAN in the matrix, however, you did not set missing=NAN"); + } else { + if (nan_missing || data[j] != missing) { + mat.row_data_.push_back(RowBatch::Entry(j, data[j])); + ++nelem; } } - mat.row_ptr_.push_back(mat.row_ptr_.back() + nelem); } - return p_mat; + mat.row_ptr_.push_back(mat.row_ptr_.back() + nelem); } - void* XGDMatrixSliceDMatrix(void *handle, - const int *idxset, - bst_ulong len) { - DMatrixSimple tmp; - DataMatrix &dsrc = *static_cast(handle); - if (dsrc.magic != DMatrixSimple::kMagic) { - tmp.CopyFrom(dsrc); - } - DataMatrix &src = (dsrc.magic == DMatrixSimple::kMagic ? - *static_cast(handle): tmp); - DMatrixSimple *p_ret = new DMatrixSimple(); - DMatrixSimple &ret = *p_ret; + return p_mat; +} +void* XGDMatrixSliceDMatrix(void *handle, + const int *idxset, + bst_ulong len) { + DMatrixSimple tmp; + DataMatrix &dsrc = *static_cast(handle); + if (dsrc.magic != DMatrixSimple::kMagic) { + tmp.CopyFrom(dsrc); + } + DataMatrix &src = (dsrc.magic == DMatrixSimple::kMagic ? + *static_cast(handle): tmp); + DMatrixSimple *p_ret = new DMatrixSimple(); + DMatrixSimple &ret = *p_ret; - utils::Check(src.info.group_ptr.size() == 0, - "slice does not support group structure"); - ret.Clear(); - ret.info.info.num_row = len; - ret.info.info.num_col = src.info.num_col(); + utils::Check(src.info.group_ptr.size() == 0, + "slice does not support group structure"); + ret.Clear(); + ret.info.info.num_row = len; + ret.info.info.num_col = src.info.num_col(); - utils::IIterator *iter = src.fmat()->RowIterator(); - iter->BeforeFirst(); - utils::Assert(iter->Next(), "slice"); - const RowBatch &batch = iter->Value(); - for (bst_ulong i = 0; i < len; ++i) { - const int ridx = idxset[i]; - RowBatch::Inst inst = batch[ridx]; - utils::Check(static_cast(ridx) < batch.size, "slice index exceed number of rows"); - ret.row_data_.resize(ret.row_data_.size() + inst.length); - memcpy(&ret.row_data_[ret.row_ptr_.back()], inst.data, - sizeof(RowBatch::Entry) * inst.length); - ret.row_ptr_.push_back(ret.row_ptr_.back() + inst.length); - if (src.info.labels.size() != 0) { - ret.info.labels.push_back(src.info.labels[ridx]); - } - if (src.info.weights.size() != 0) { - ret.info.weights.push_back(src.info.weights[ridx]); - } - if (src.info.info.root_index.size() != 0) { - ret.info.info.root_index.push_back(src.info.info.root_index[ridx]); - } - if (src.info.info.fold_index.size() != 0) { - ret.info.info.fold_index.push_back(src.info.info.fold_index[ridx]); - } + utils::IIterator *iter = src.fmat()->RowIterator(); + iter->BeforeFirst(); + utils::Assert(iter->Next(), "slice"); + const RowBatch &batch = iter->Value(); + for (bst_ulong i = 0; i < len; ++i) { + const int ridx = idxset[i]; + RowBatch::Inst inst = batch[ridx]; + utils::Check(static_cast(ridx) < batch.size, "slice index exceed number of rows"); + ret.row_data_.resize(ret.row_data_.size() + inst.length); + memcpy(&ret.row_data_[ret.row_ptr_.back()], inst.data, + sizeof(RowBatch::Entry) * inst.length); + ret.row_ptr_.push_back(ret.row_ptr_.back() + inst.length); + if (src.info.labels.size() != 0) { + ret.info.labels.push_back(src.info.labels[ridx]); } - return p_ret; - } - void XGDMatrixFree(void *handle) { - delete static_cast(handle); - } - void XGDMatrixSaveBinary(void *handle, const char *fname, int silent) { - SaveDataMatrix(*static_cast(handle), fname, silent != 0); - } - void XGDMatrixSetFloatInfo(void *handle, const char *field, const float *info, bst_ulong len) { - std::vector &vec = - static_cast(handle)->info.GetFloatInfo(field); - vec.resize(len); - memcpy(BeginPtr(vec), info, sizeof(float) * len); - } - void XGDMatrixSetUIntInfo(void *handle, const char *field, const unsigned *info, bst_ulong len) { - std::vector &vec = - static_cast(handle)->info.GetUIntInfo(field); - vec.resize(len); - memcpy(BeginPtr(vec), info, sizeof(unsigned) * len); - } - void XGDMatrixSetGroup(void *handle, const unsigned *group, bst_ulong len) { - DataMatrix *pmat = static_cast(handle); - pmat->info.group_ptr.resize(len + 1); - pmat->info.group_ptr[0] = 0; - for (uint64_t i = 0; i < len; ++i) { - pmat->info.group_ptr[i+1] = pmat->info.group_ptr[i] + group[i]; + if (src.info.weights.size() != 0) { + ret.info.weights.push_back(src.info.weights[ridx]); + } + if (src.info.info.root_index.size() != 0) { + ret.info.info.root_index.push_back(src.info.info.root_index[ridx]); + } + if (src.info.info.fold_index.size() != 0) { + ret.info.info.fold_index.push_back(src.info.info.fold_index[ridx]); } } - const float* XGDMatrixGetFloatInfo(const void *handle, const char *field, bst_ulong* len) { - const std::vector &vec = - static_cast(handle)->info.GetFloatInfo(field); - *len = static_cast(vec.size()); - return BeginPtr(vec); - } - const unsigned* XGDMatrixGetUIntInfo(const void *handle, const char *field, bst_ulong* len) { - const std::vector &vec = - static_cast(handle)->info.GetUIntInfo(field); - *len = static_cast(vec.size()); - return BeginPtr(vec); - } - bst_ulong XGDMatrixNumRow(const void *handle) { - return static_cast(static_cast(handle)->info.num_row()); - } - - // xgboost implementation - void *XGBoosterCreate(void *dmats[], bst_ulong len) { - std::vector mats; - for (bst_ulong i = 0; i < len; ++i) { - DataMatrix *dtr = static_cast(dmats[i]); - mats.push_back(dtr); - } - return new Booster(mats); - } - void XGBoosterFree(void *handle) { - delete static_cast(handle); - } - void XGBoosterSetParam(void *handle, const char *name, const char *value) { - static_cast(handle)->SetParam(name, value); - } - void XGBoosterUpdateOneIter(void *handle, int iter, void *dtrain) { - Booster *bst = static_cast(handle); - DataMatrix *dtr = static_cast(dtrain); - bst->CheckInitModel(); - bst->CheckInit(dtr); - bst->UpdateOneIter(iter, *dtr); - } - void XGBoosterBoostOneIter(void *handle, void *dtrain, - float *grad, float *hess, bst_ulong len) { - Booster *bst = static_cast(handle); - DataMatrix *dtr = static_cast(dtrain); - bst->CheckInitModel(); - bst->CheckInit(dtr); - bst->BoostOneIter(*dtr, grad, hess, len); - } - const char* XGBoosterEvalOneIter(void *handle, int iter, void *dmats[], - const char *evnames[], bst_ulong len) { - Booster *bst = static_cast(handle); - std::vector names; - std::vector mats; - for (bst_ulong i = 0; i < len; ++i) { - mats.push_back(static_cast(dmats[i])); - names.push_back(std::string(evnames[i])); - } - bst->CheckInitModel(); - bst->eval_str = bst->EvalOneIter(iter, mats, names); - return bst->eval_str.c_str(); - } - const float *XGBoosterPredict(void *handle, void *dmat, int option_mask, unsigned ntree_limit, bst_ulong *len) { - return static_cast(handle)->Pred(*static_cast(dmat), option_mask, ntree_limit, len); - } - void XGBoosterLoadModel(void *handle, const char *fname) { - static_cast(handle)->LoadModel(fname); - } - void XGBoosterSaveModel(void *handle, const char *fname) { - Booster *bst = static_cast(handle); - bst->CheckInitModel(); - bst->SaveModel(fname, false); - } - void XGBoosterLoadModelFromBuffer(void *handle, const void *buf, bst_ulong len) { - static_cast(handle)->LoadModelFromBuffer(buf, len); - } - const char *XGBoosterGetModelRaw(void *handle, bst_ulong *out_len) { - return static_cast(handle)->GetModelRaw(out_len); - } - const char** XGBoosterDumpModel(void *handle, const char *fmap, int with_stats, bst_ulong *len){ - utils::FeatMap featmap; - if (strlen(fmap) != 0) { - featmap.LoadText(fmap); - } - return static_cast(handle)->GetModelDump(featmap, with_stats != 0, len); + return p_ret; +} +void XGDMatrixFree(void *handle) { + delete static_cast(handle); +} +void XGDMatrixSaveBinary(void *handle, const char *fname, int silent) { + SaveDataMatrix(*static_cast(handle), fname, silent != 0); +} +void XGDMatrixSetFloatInfo(void *handle, const char *field, const float *info, bst_ulong len) { + std::vector &vec = + static_cast(handle)->info.GetFloatInfo(field); + vec.resize(len); + memcpy(BeginPtr(vec), info, sizeof(float) * len); +} +void XGDMatrixSetUIntInfo(void *handle, const char *field, const unsigned *info, bst_ulong len) { + std::vector &vec = + static_cast(handle)->info.GetUIntInfo(field); + vec.resize(len); + memcpy(BeginPtr(vec), info, sizeof(unsigned) * len); +} +void XGDMatrixSetGroup(void *handle, const unsigned *group, bst_ulong len) { + DataMatrix *pmat = static_cast(handle); + pmat->info.group_ptr.resize(len + 1); + pmat->info.group_ptr[0] = 0; + for (uint64_t i = 0; i < len; ++i) { + pmat->info.group_ptr[i+1] = pmat->info.group_ptr[i] + group[i]; } } +const float* XGDMatrixGetFloatInfo(const void *handle, const char *field, bst_ulong* len) { + const std::vector &vec = + static_cast(handle)->info.GetFloatInfo(field); + *len = static_cast(vec.size()); + return BeginPtr(vec); +} +const unsigned* XGDMatrixGetUIntInfo(const void *handle, const char *field, bst_ulong* len) { + const std::vector &vec = + static_cast(handle)->info.GetUIntInfo(field); + *len = static_cast(vec.size()); + return BeginPtr(vec); +} +bst_ulong XGDMatrixNumRow(const void *handle) { + return static_cast(static_cast(handle)->info.num_row()); +} + +// xgboost implementation +void *XGBoosterCreate(void *dmats[], bst_ulong len) { + std::vector mats; + for (bst_ulong i = 0; i < len; ++i) { + DataMatrix *dtr = static_cast(dmats[i]); + mats.push_back(dtr); + } + return new Booster(mats); +} +void XGBoosterFree(void *handle) { + delete static_cast(handle); +} +void XGBoosterSetParam(void *handle, const char *name, const char *value) { + static_cast(handle)->SetParam(name, value); +} +void XGBoosterUpdateOneIter(void *handle, int iter, void *dtrain) { + Booster *bst = static_cast(handle); + DataMatrix *dtr = static_cast(dtrain); + bst->CheckInitModel(); + bst->CheckInit(dtr); + bst->UpdateOneIter(iter, *dtr); +} +void XGBoosterBoostOneIter(void *handle, void *dtrain, + float *grad, float *hess, bst_ulong len) { + Booster *bst = static_cast(handle); + DataMatrix *dtr = static_cast(dtrain); + bst->CheckInitModel(); + bst->CheckInit(dtr); + bst->BoostOneIter(*dtr, grad, hess, len); +} +const char* XGBoosterEvalOneIter(void *handle, int iter, void *dmats[], + const char *evnames[], bst_ulong len) { + Booster *bst = static_cast(handle); + std::vector names; + std::vector mats; + for (bst_ulong i = 0; i < len; ++i) { + mats.push_back(static_cast(dmats[i])); + names.push_back(std::string(evnames[i])); + } + bst->CheckInitModel(); + bst->eval_str = bst->EvalOneIter(iter, mats, names); + return bst->eval_str.c_str(); +} +const float *XGBoosterPredict(void *handle, void *dmat, int option_mask, + unsigned ntree_limit, bst_ulong *len) { + return static_cast(handle)->Pred(*static_cast(dmat), + option_mask, ntree_limit, len); +} +void XGBoosterLoadModel(void *handle, const char *fname) { + static_cast(handle)->LoadModel(fname); +} +void XGBoosterSaveModel(void *handle, const char *fname) { + Booster *bst = static_cast(handle); + bst->CheckInitModel(); + bst->SaveModel(fname, false); +} +void XGBoosterLoadModelFromBuffer(void *handle, const void *buf, bst_ulong len) { + static_cast(handle)->LoadModelFromBuffer(buf, len); +} +const char *XGBoosterGetModelRaw(void *handle, bst_ulong *out_len) { + return static_cast(handle)->GetModelRaw(out_len); +} +const char** XGBoosterDumpModel(void *handle, const char *fmap, + int with_stats, bst_ulong *len) { + utils::FeatMap featmap; + if (strlen(fmap) != 0) { + featmap.LoadText(fmap); + } + return static_cast(handle)->GetModelDump(featmap, with_stats != 0, len); +} diff --git a/wrapper/xgboost_wrapper.h b/wrapper/xgboost_wrapper.h index 88a327d0d..3540a3be0 100644 --- a/wrapper/xgboost_wrapper.h +++ b/wrapper/xgboost_wrapper.h @@ -1,24 +1,26 @@ -#ifndef XGBOOST_WRAPPER_H_ -#define XGBOOST_WRAPPER_H_ /*! + * Copyright (c) 2014 by Contributors * \file xgboost_wrapper.h * \author Tianqi Chen * \brief a C style wrapper of xgboost * can be used to create wrapper of other languages */ +#ifndef XGBOOST_WRAPPER_H_ +#define XGBOOST_WRAPPER_H_ + #if defined(_MSC_VER) || defined(_WIN32) #define XGB_DLL __declspec(dllexport) #else #define XGB_DLL #endif // manually define unsign long -typedef unsigned long bst_ulong; +typedef unsigned long bst_ulong; // NOLINT(*) #ifdef __cplusplus extern "C" { #endif /*! - * \brief load a data matrix + * \brief load a data matrix * \param fname the name of the file * \param silent whether print messages during loading * \return a loaded data matrix @@ -29,7 +31,7 @@ extern "C" { * \param indptr pointer to row headers * \param indices findex * \param data fvalue - * \param nindptr number of rows in the matix + 1 + * \param nindptr number of rows in the matix + 1 * \param nelem number of nonzero elements in the matrix * \return created dmatrix */ @@ -51,7 +53,7 @@ extern "C" { const unsigned *indices, const float *data, bst_ulong nindptr, - bst_ulong nelem); + bst_ulong nelem); /*! * \brief create matrix content from dense matrix * \param data pointer to the data space @@ -92,7 +94,8 @@ extern "C" { * \param array pointer to float vector * \param len length of array */ - XGB_DLL void XGDMatrixSetFloatInfo(void *handle, const char *field, const float *array, bst_ulong len); + XGB_DLL void XGDMatrixSetFloatInfo(void *handle, const char *field, + const float *array, bst_ulong len); /*! * \brief set uint32 vector to a content in info * \param handle a instance of data matrix @@ -100,7 +103,8 @@ extern "C" { * \param array pointer to float vector * \param len length of array */ - XGB_DLL void XGDMatrixSetUIntInfo(void *handle, const char *field, const unsigned *array, bst_ulong len); + XGB_DLL void XGDMatrixSetUIntInfo(void *handle, const char *field, + const unsigned *array, bst_ulong len); /*! * \brief set label of the training matrix * \param handle a instance of data matrix @@ -115,7 +119,8 @@ extern "C" { * \param out_len used to set result length * \return pointer to the result */ - XGB_DLL const float* XGDMatrixGetFloatInfo(const void *handle, const char *field, bst_ulong* out_len); + XGB_DLL const float* XGDMatrixGetFloatInfo(const void *handle, + const char *field, bst_ulong* out_len); /*! * \brief get uint32 info vector from matrix * \param handle a instance of data matrix @@ -123,31 +128,32 @@ extern "C" { * \param out_len used to set result length * \return pointer to the result */ - XGB_DLL const unsigned* XGDMatrixGetUIntInfo(const void *handle, const char *field, bst_ulong* out_len); + XGB_DLL const unsigned* XGDMatrixGetUIntInfo(const void *handle, + const char *field, bst_ulong* out_len); /*! * \brief return number of rows */ XGB_DLL bst_ulong XGDMatrixNumRow(const void *handle); // --- start XGBoost class - /*! - * \brief create xgboost learner + /*! + * \brief create xgboost learner * \param dmats matrices that are set to be cached * \param len length of dmats */ XGB_DLL void *XGBoosterCreate(void* dmats[], bst_ulong len); - /*! - * \brief free obj in handle + /*! + * \brief free obj in handle * \param handle handle to be freed */ XGB_DLL void XGBoosterFree(void* handle); - /*! - * \brief set parameters + /*! + * \brief set parameters * \param handle handle * \param name parameter name * \param val value of parameter - */ + */ XGB_DLL void XGBoosterSetParam(void *handle, const char *name, const char *value); - /*! + /*! * \brief update the model in one round using dtrain * \param handle handle * \param iter current iteration rounds @@ -188,8 +194,8 @@ extern "C" { * when the parameter is set to 0, we will use all the trees * \param len used to store length of returning result */ - XGB_DLL const float *XGBoosterPredict(void *handle, void *dmat, - int option_mask, + XGB_DLL const float *XGBoosterPredict(void *handle, void *dmat, + int option_mask, unsigned ntree_limit, bst_ulong *len); /*!