diff --git a/demo/c-api/Makefile b/demo/c-api/Makefile new file mode 100644 index 000000000..345079fa9 --- /dev/null +++ b/demo/c-api/Makefile @@ -0,0 +1,19 @@ +SRC=c-api-demo.c +TGT=c-api-demo + +cc=cc +CFLAGS ?=-O3 +XGBOOST_ROOT ?=../.. +INCLUDE_DIR=-I$(XGBOOST_ROOT)/include -I$(XGBOOST_ROOT)/dmlc-core/include -I$(XGBOOST_ROOT)/rabit/include +LIB_DIR=-L$(XGBOOST_ROOT)/lib + +build: $(TGT) + +$(TGT): $(SRC) Makefile + $(cc) $(CFLAGS) $(INCLUDE_DIR) $(LIB_DIR) -o $(TGT) $(SRC) -lxgboost + +run: $(TGT) + LD_LIBRARY_PATH=$(XGBOOST_ROOT)/lib ./$(TGT) + +clean: + rm -f $(TGT) diff --git a/demo/c-api/c-api-demo.c b/demo/c-api/c-api-demo.c new file mode 100644 index 000000000..e107876cb --- /dev/null +++ b/demo/c-api/c-api-demo.c @@ -0,0 +1,89 @@ +/*! + * Copyright 2019 XGBoost contributors + * + * \file c-api-demo.c + * \brief A simple example of using xgboost C API. + */ + +#include +#include +#include + +#define safe_xgboost(call) { \ +int err = (call); \ +if (err != 0) { \ + fprintf(stderr, "%s:%d: error in %s: %s\n", __FILE__, __LINE__, #call, XGBGetLastError()); \ + exit(1); \ +} \ +} + +int main(int argc, char** argv) { + int silent = 0; + int use_gpu = 0; // set to 1 to use the GPU for training + + // load the data + DMatrixHandle dtrain, dtest; + safe_xgboost(XGDMatrixCreateFromFile("../data/agaricus.txt.train", silent, &dtrain)); + safe_xgboost(XGDMatrixCreateFromFile("../data/agaricus.txt.test", silent, &dtest)); + + // create the booster + BoosterHandle booster; + DMatrixHandle eval_dmats[2] = {dtrain, dtest}; + safe_xgboost(XGBoosterCreate(eval_dmats, 2, &booster)); + + // configure the training + // available parameters are described here: + // https://xgboost.readthedocs.io/en/latest/parameter.html + safe_xgboost(XGBoosterSetParam(booster, "tree_method", use_gpu ? "gpu_hist" : "hist")); + if (use_gpu) { + // set the number of GPUs and the first GPU to use; + // this is not necessary, but provided here as an illustration + safe_xgboost(XGBoosterSetParam(booster, "n_gpus", "1")); + safe_xgboost(XGBoosterSetParam(booster, "gpu_id", "0")); + } else { + // avoid evaluating objective and metric on a GPU + safe_xgboost(XGBoosterSetParam(booster, "n_gpus", "0")); + } + + safe_xgboost(XGBoosterSetParam(booster, "objective", "binary:logistic")); + safe_xgboost(XGBoosterSetParam(booster, "min_child_weight", "1")); + safe_xgboost(XGBoosterSetParam(booster, "gamma", "0.1")); + safe_xgboost(XGBoosterSetParam(booster, "max_depth", "3")); + safe_xgboost(XGBoosterSetParam(booster, "verbosity", silent ? "0" : "1")); + + // train and evaluate for 10 iterations + int n_trees = 10; + const char* eval_names[2] = {"train", "test"}; + const char* eval_result = NULL; + for (int i = 0; i < n_trees; ++i) { + safe_xgboost(XGBoosterUpdateOneIter(booster, i, dtrain)); + safe_xgboost(XGBoosterEvalOneIter(booster, i, eval_dmats, eval_names, 2, &eval_result)); + printf("%s\n", eval_result); + } + + // predict + bst_ulong out_len = 0; + const float* out_result = NULL; + int n_print = 10; + + safe_xgboost(XGBoosterPredict(booster, dtest, 0, 0, &out_len, &out_result)); + printf("y_pred: "); + for (int i = 0; i < n_print; ++i) { + printf("%1.4f ", out_result[i]); + } + printf("\n"); + + // print true labels + safe_xgboost(XGDMatrixGetFloatInfo(dtest, "label", &out_len, &out_result)); + printf("y_test: "); + for (int i = 0; i < n_print; ++i) { + printf("%1.4f ", out_result[i]); + } + printf("\n"); + + // free everything + safe_xgboost(XGBoosterFree(booster)); + safe_xgboost(XGDMatrixFree(dtrain)); + safe_xgboost(XGDMatrixFree(dtest)); + return 0; +}