Unverified Commit 676c95fb authored by James Lamb's avatar James Lamb Committed by GitHub
Browse files

[R-package] manage Dataset and Booster handles as R external pointers (fixes #3016) (#4265)



* started converting handles

* more changes

* sort of working for Dataset

* yay all the tests are passing for Dataset handle changes

* working for other handle types

* remove debugging logging

* remove unnecessary spaces

* fix null logic

* more NULL

* updates

* Apply suggestions from code review
Co-authored-by: default avatarNikita Titov <nekit94-08@mail.ru>

* consolidate steps
Co-authored-by: default avatarNikita Titov <nekit94-08@mail.ru>
parent 0a172d9e
...@@ -37,7 +37,7 @@ Booster <- R6::R6Class( ...@@ -37,7 +37,7 @@ Booster <- R6::R6Class(
# Create parameters and handle # Create parameters and handle
params <- append(params, list(...)) params <- append(params, list(...))
handle <- lgb.null.handle() handle <- NULL
# Attempts to create a handle for the dataset # Attempts to create a handle for the dataset
try({ try({
...@@ -52,11 +52,10 @@ Booster <- R6::R6Class( ...@@ -52,11 +52,10 @@ Booster <- R6::R6Class(
params <- modifyList(params, train_set$get_params()) params <- modifyList(params, train_set$get_params())
params_str <- lgb.params2str(params = params) params_str <- lgb.params2str(params = params)
# Store booster handle # Store booster handle
.Call( handle <- .Call(
LGBM_BoosterCreate_R LGBM_BoosterCreate_R
, train_set_handle , train_set_handle
, params_str , params_str
, handle
) )
# Create private booster information # Create private booster information
...@@ -88,10 +87,9 @@ Booster <- R6::R6Class( ...@@ -88,10 +87,9 @@ Booster <- R6::R6Class(
} }
# Create booster from model # Create booster from model
.Call( handle <- .Call(
LGBM_BoosterCreateFromModelfile_R LGBM_BoosterCreateFromModelfile_R
, modelfile , modelfile
, handle
) )
} else if (!is.null(model_str)) { } else if (!is.null(model_str)) {
...@@ -102,10 +100,9 @@ Booster <- R6::R6Class( ...@@ -102,10 +100,9 @@ Booster <- R6::R6Class(
} }
# Create booster from model # Create booster from model
.Call( handle <- .Call(
LGBM_BoosterLoadModelFromString_R LGBM_BoosterLoadModelFromString_R
, model_str , model_str
, handle
) )
} else { } else {
......
...@@ -192,7 +192,6 @@ Dataset <- R6::R6Class( ...@@ -192,7 +192,6 @@ Dataset <- R6::R6Class(
if (!is.null(private$reference)) { if (!is.null(private$reference)) {
ref_handle <- private$reference$.__enclos_env__$private$get_handle() ref_handle <- private$reference$.__enclos_env__$private$get_handle()
} }
handle <- lgb.null.handle()
# Not subsetting # Not subsetting
if (is.null(private$used_indices)) { if (is.null(private$used_indices)) {
...@@ -200,25 +199,23 @@ Dataset <- R6::R6Class( ...@@ -200,25 +199,23 @@ Dataset <- R6::R6Class(
# Are we using a data file? # Are we using a data file?
if (is.character(private$raw_data)) { if (is.character(private$raw_data)) {
.Call( handle <- .Call(
LGBM_DatasetCreateFromFile_R LGBM_DatasetCreateFromFile_R
, private$raw_data , private$raw_data
, params_str , params_str
, ref_handle , ref_handle
, handle
) )
} else if (is.matrix(private$raw_data)) { } else if (is.matrix(private$raw_data)) {
# Are we using a matrix? # Are we using a matrix?
.Call( handle <- .Call(
LGBM_DatasetCreateFromMat_R LGBM_DatasetCreateFromMat_R
, private$raw_data , private$raw_data
, nrow(private$raw_data) , nrow(private$raw_data)
, ncol(private$raw_data) , ncol(private$raw_data)
, params_str , params_str
, ref_handle , ref_handle
, handle
) )
} else if (methods::is(private$raw_data, "dgCMatrix")) { } else if (methods::is(private$raw_data, "dgCMatrix")) {
...@@ -226,7 +223,7 @@ Dataset <- R6::R6Class( ...@@ -226,7 +223,7 @@ Dataset <- R6::R6Class(
stop("Cannot support large CSC matrix") stop("Cannot support large CSC matrix")
} }
# Are we using a dgCMatrix (sparsed matrix column compressed) # Are we using a dgCMatrix (sparsed matrix column compressed)
.Call( handle <- .Call(
LGBM_DatasetCreateFromCSC_R LGBM_DatasetCreateFromCSC_R
, private$raw_data@p , private$raw_data@p
, private$raw_data@i , private$raw_data@i
...@@ -236,7 +233,6 @@ Dataset <- R6::R6Class( ...@@ -236,7 +233,6 @@ Dataset <- R6::R6Class(
, nrow(private$raw_data) , nrow(private$raw_data)
, params_str , params_str
, ref_handle , ref_handle
, handle
) )
} else { } else {
...@@ -257,13 +253,12 @@ Dataset <- R6::R6Class( ...@@ -257,13 +253,12 @@ Dataset <- R6::R6Class(
} }
# Construct subset # Construct subset
.Call( handle <- .Call(
LGBM_DatasetGetSubset_R LGBM_DatasetGetSubset_R
, ref_handle , ref_handle
, c(private$used_indices) # Adding c() fixes issue in R v3.5 , c(private$used_indices) # Adding c() fixes issue in R v3.5
, length(private$used_indices) , length(private$used_indices)
, params_str , params_str
, handle
) )
} }
......
...@@ -30,17 +30,15 @@ Predictor <- R6::R6Class( ...@@ -30,17 +30,15 @@ Predictor <- R6::R6Class(
initialize = function(modelfile, ...) { initialize = function(modelfile, ...) {
params <- list(...) params <- list(...)
private$params <- lgb.params2str(params = params) private$params <- lgb.params2str(params = params)
# Create new lgb handle handle <- NULL
handle <- lgb.null.handle()
# Check if handle is a character # Check if handle is a character
if (is.character(modelfile)) { if (is.character(modelfile)) {
# Create handle on it # Create handle on it
.Call( handle <- .Call(
LGBM_BoosterCreateFromModelfile_R LGBM_BoosterCreateFromModelfile_R
, modelfile , modelfile
, handle
) )
private$need_free_handle <- TRUE private$need_free_handle <- TRUE
......
...@@ -6,16 +6,13 @@ lgb.is.Dataset <- function(x) { ...@@ -6,16 +6,13 @@ lgb.is.Dataset <- function(x) {
return(lgb.check.r6.class(object = x, name = "lgb.Dataset")) return(lgb.check.r6.class(object = x, name = "lgb.Dataset"))
} }
lgb.null.handle <- function() {
if (.Machine$sizeof.pointer == 8L) {
return(NA_real_)
} else {
return(NA_integer_)
}
}
lgb.is.null.handle <- function(x) { lgb.is.null.handle <- function(x) {
return(is.null(x) || is.na(x)) if (is.null(x)) {
return(TRUE)
}
return(
isTRUE(.Call(LGBM_HandleIsNull_R, x))
)
} }
# [description] Get the most recent error stored on the C++ side and raise it # [description] Get the most recent error stored on the C++ side and raise it
......
/*!
* Copyright (c) 2017 Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE file in the project root for license information.
*
* \brief A simple wrapper for accessing data in R object.
*
* \note
* We previously did not want to use R's headers because of license concerns. This is no longer a concern:
* https://github.com/microsoft/LightGBM/issues/629#issuecomment-474995635
* For now, this wrapper is LightGBM's interface from R to C.
* If R changes the way it defines objects, this file will need to be updated as well.
*/
#ifndef R_OBJECT_HELPER_H_
#define R_OBJECT_HELPER_H_
#include <cstdint>
#define NAMED_BITS 16
struct lgbm_sxpinfo {
unsigned int type : 5;
unsigned int scalar : 1;
unsigned int obj : 1;
unsigned int alt : 1;
unsigned int gp : 16;
unsigned int mark : 1;
unsigned int debug : 1;
unsigned int trace : 1;
unsigned int spare : 1;
unsigned int gcgen : 1;
unsigned int gccls : 3;
unsigned int named : NAMED_BITS;
unsigned int extra : 32 - NAMED_BITS;
};
struct lgbm_primsxp {
int offset;
};
struct lgbm_symsxp {
struct LGBM_SER *pname;
struct LGBM_SER *value;
struct LGBM_SER *internal;
};
struct lgbm_listsxp {
struct LGBM_SER *carval;
struct LGBM_SER *cdrval;
struct LGBM_SER *tagval;
};
struct lgbm_envsxp {
struct LGBM_SER *frame;
struct LGBM_SER *enclos;
struct LGBM_SER *hashtab;
};
struct lgbm_closxp {
struct LGBM_SER *formals;
struct LGBM_SER *body;
struct LGBM_SER *env;
};
struct lgbm_promsxp {
struct LGBM_SER *value;
struct LGBM_SER *expr;
struct LGBM_SER *env;
};
typedef struct LGBM_SER {
struct lgbm_sxpinfo sxpinfo;
struct LGBM_SER* attrib;
struct LGBM_SER* gengc_next_node, *gengc_prev_node;
union {
struct lgbm_primsxp primsxp;
struct lgbm_symsxp symsxp;
struct lgbm_listsxp listsxp;
struct lgbm_envsxp envsxp;
struct lgbm_closxp closxp;
struct lgbm_promsxp promsxp;
} u;
} LGBM_SER, *LGBM_SE;
struct lgbm_vecsxp {
R_xlen_t length;
R_xlen_t truelength;
};
typedef struct VECTOR_SER {
struct lgbm_sxpinfo sxpinfo;
struct LGBM_SER* attrib;
struct LGBM_SER* gengc_next_node, *gengc_prev_node;
struct lgbm_vecsxp vecsxp;
} VECTOR_SER, *VECSE;
typedef union { VECTOR_SER s; double align; } SEXPREC_ALIGN;
#define DATAPTR(x) ((reinterpret_cast<SEXPREC_ALIGN*>(x)) + 1)
#define R_IS_NULL(x) ((*reinterpret_cast<LGBM_SE>(x)).sxpinfo.type == 0)
// 64bit pointer
#if INTPTR_MAX == INT64_MAX
#define R_ADDR(x) (reinterpret_cast<int64_t*> DATAPTR(x))
inline void R_SET_PTR(LGBM_SE x, void* ptr) {
if (ptr == nullptr) {
R_ADDR(x)[0] = (int64_t)(NULL);
} else {
R_ADDR(x)[0] = (int64_t)(ptr);
}
}
inline void* R_GET_PTR(LGBM_SE x) {
if (R_IS_NULL(x)) {
return nullptr;
} else {
auto ret = reinterpret_cast<void*>(R_ADDR(x)[0]);
if (ret == NULL) {
ret = nullptr;
}
return ret;
}
}
#else
#define R_ADDR(x) (reinterpret_cast<int32_t*> DATAPTR(x))
inline void R_SET_PTR(LGBM_SE x, void* ptr) {
if (ptr == nullptr) {
R_ADDR(x)[0] = (int32_t)(NULL);
} else {
R_ADDR(x)[0] = (int32_t)(ptr);
}
}
inline void* R_GET_PTR(LGBM_SE x) {
if (R_IS_NULL(x)) {
return nullptr;
} else {
auto ret = reinterpret_cast<void*>(R_ADDR(x)[0]);
if (ret == NULL) {
ret = nullptr;
}
return ret;
}
}
#endif // INTPTR_MAX == INT64_MAX
#endif // R_OBJECT_HELPER_H_
This diff is collapsed.
...@@ -11,14 +11,21 @@ ...@@ -11,14 +11,21 @@
#define R_USE_C99_IN_CXX #define R_USE_C99_IN_CXX
#include <Rinternals.h> #include <Rinternals.h>
#include "R_object_helper.h"
/*! /*!
* \brief get string message of the last error * \brief get string message of the last error
* \return err_msg string with error information * \return err_msg string with error information
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_GetLastError_R(); LIGHTGBM_C_EXPORT SEXP LGBM_GetLastError_R();
/*!
* \brief check if an R external pointer (like a Booster or Dataset handle) is a null pointer
* \param handle handle for a Booster, Dataset, or Predictor
* \return R logical, TRUE if the handle is a null pointer
*/
LIGHTGBM_C_EXPORT SEXP LGBM_HandleIsNull_R(
SEXP handle
);
// --- start Dataset interface // --- start Dataset interface
/*! /*!
...@@ -26,14 +33,12 @@ LIGHTGBM_C_EXPORT SEXP LGBM_GetLastError_R(); ...@@ -26,14 +33,12 @@ LIGHTGBM_C_EXPORT SEXP LGBM_GetLastError_R();
* \param filename the name of the file * \param filename the name of the file
* \param parameters additional parameters * \param parameters additional parameters
* \param reference used to align bin mapper with other Dataset, nullptr means not used * \param reference used to align bin mapper with other Dataset, nullptr means not used
* \param out created Dataset * \return Dataset handle
* \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromFile_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromFile_R(
SEXP filename, SEXP filename,
SEXP parameters, SEXP parameters,
LGBM_SE reference, SEXP reference
LGBM_SE out
); );
/*! /*!
...@@ -46,8 +51,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromFile_R( ...@@ -46,8 +51,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromFile_R(
* \param num_row number of rows * \param num_row number of rows
* \param parameters additional parameters * \param parameters additional parameters
* \param reference used to align bin mapper with other Dataset, nullptr means not used * \param reference used to align bin mapper with other Dataset, nullptr means not used
* \param out created Dataset * \return Dataset handle
* \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromCSC_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromCSC_R(
SEXP indptr, SEXP indptr,
...@@ -57,8 +61,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromCSC_R( ...@@ -57,8 +61,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromCSC_R(
SEXP nelem, SEXP nelem,
SEXP num_row, SEXP num_row,
SEXP parameters, SEXP parameters,
LGBM_SE reference, SEXP reference
LGBM_SE out
); );
/*! /*!
...@@ -68,16 +71,14 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromCSC_R( ...@@ -68,16 +71,14 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromCSC_R(
* \param num_col number columns * \param num_col number columns
* \param parameters additional parameters * \param parameters additional parameters
* \param reference used to align bin mapper with other Dataset, nullptr means not used * \param reference used to align bin mapper with other Dataset, nullptr means not used
* \param out created Dataset * \return Dataset handle
* \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromMat_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromMat_R(
SEXP data, SEXP data,
SEXP num_row, SEXP num_row,
SEXP num_col, SEXP num_col,
SEXP parameters, SEXP parameters,
LGBM_SE reference, SEXP reference
LGBM_SE out
); );
/*! /*!
...@@ -86,15 +87,13 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromMat_R( ...@@ -86,15 +87,13 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetCreateFromMat_R(
* \param used_row_indices Indices used in subset * \param used_row_indices Indices used in subset
* \param len_used_row_indices length of Indices used in subset * \param len_used_row_indices length of Indices used in subset
* \param parameters additional parameters * \param parameters additional parameters
* \param out created Dataset * \return Dataset handle
* \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetSubset_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetSubset_R(
LGBM_SE handle, SEXP handle,
SEXP used_row_indices, SEXP used_row_indices,
SEXP len_used_row_indices, SEXP len_used_row_indices,
SEXP parameters, SEXP parameters
LGBM_SE out
); );
/*! /*!
...@@ -104,7 +103,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetSubset_R( ...@@ -104,7 +103,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetSubset_R(
* \return R character vector of feature names * \return R character vector of feature names
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetFeatureNames_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetFeatureNames_R(
LGBM_SE handle, SEXP handle,
SEXP feature_names SEXP feature_names
); );
...@@ -114,7 +113,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetFeatureNames_R( ...@@ -114,7 +113,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetFeatureNames_R(
* \return an R character vector with feature names from the Dataset or NULL if no feature names * \return an R character vector with feature names from the Dataset or NULL if no feature names
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFeatureNames_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFeatureNames_R(
LGBM_SE handle SEXP handle
); );
/*! /*!
...@@ -124,7 +123,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFeatureNames_R( ...@@ -124,7 +123,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFeatureNames_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSaveBinary_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSaveBinary_R(
LGBM_SE handle, SEXP handle,
SEXP filename SEXP filename
); );
...@@ -134,7 +133,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSaveBinary_R( ...@@ -134,7 +133,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSaveBinary_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetFree_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetFree_R(
LGBM_SE handle SEXP handle
); );
/*! /*!
...@@ -148,7 +147,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetFree_R( ...@@ -148,7 +147,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetFree_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetField_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetField_R(
LGBM_SE handle, SEXP handle,
SEXP field_name, SEXP field_name,
SEXP field_data, SEXP field_data,
SEXP num_element SEXP num_element
...@@ -162,7 +161,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetField_R( ...@@ -162,7 +161,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetSetField_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFieldSize_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFieldSize_R(
LGBM_SE handle, SEXP handle,
SEXP field_name, SEXP field_name,
SEXP out SEXP out
); );
...@@ -175,7 +174,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFieldSize_R( ...@@ -175,7 +174,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetFieldSize_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetField_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetField_R(
LGBM_SE handle, SEXP handle,
SEXP field_name, SEXP field_name,
SEXP field_data SEXP field_data
); );
...@@ -199,7 +198,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetUpdateParamChecking_R( ...@@ -199,7 +198,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetUpdateParamChecking_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumData_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumData_R(
LGBM_SE handle, SEXP handle,
SEXP out SEXP out
); );
...@@ -210,7 +209,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumData_R( ...@@ -210,7 +209,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumData_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumFeature_R( LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumFeature_R(
LGBM_SE handle, SEXP handle,
SEXP out SEXP out
); );
...@@ -220,13 +219,11 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumFeature_R( ...@@ -220,13 +219,11 @@ LIGHTGBM_C_EXPORT SEXP LGBM_DatasetGetNumFeature_R(
* \brief create a new boosting learner * \brief create a new boosting learner
* \param train_data training Dataset * \param train_data training Dataset
* \param parameters format: 'key1=value1 key2=value2' * \param parameters format: 'key1=value1 key2=value2'
* \param out handle of created Booster * \return Booster handle
* \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCreate_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCreate_R(
LGBM_SE train_data, SEXP train_data,
SEXP parameters, SEXP parameters
LGBM_SE out
); );
/*! /*!
...@@ -235,29 +232,25 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCreate_R( ...@@ -235,29 +232,25 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCreate_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterFree_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterFree_R(
LGBM_SE handle SEXP handle
); );
/*! /*!
* \brief load an existing Booster from model file * \brief load an existing Booster from model file
* \param filename filename of model * \param filename filename of model
* \param out handle of created Booster * \return Booster handle
* \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCreateFromModelfile_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCreateFromModelfile_R(
SEXP filename, SEXP filename
LGBM_SE out
); );
/*! /*!
* \brief load an existing Booster from a string * \brief load an existing Booster from a string
* \param model_str string containing the model * \param model_str string containing the model
* \param out handle of created Booster * \return Booster handle
* \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterLoadModelFromString_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterLoadModelFromString_R(
SEXP model_str, SEXP model_str
LGBM_SE out
); );
/*! /*!
...@@ -267,8 +260,8 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterLoadModelFromString_R( ...@@ -267,8 +260,8 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterLoadModelFromString_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterMerge_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterMerge_R(
LGBM_SE handle, SEXP handle,
LGBM_SE other_handle SEXP other_handle
); );
/*! /*!
...@@ -278,8 +271,8 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterMerge_R( ...@@ -278,8 +271,8 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterMerge_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterAddValidData_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterAddValidData_R(
LGBM_SE handle, SEXP handle,
LGBM_SE valid_data SEXP valid_data
); );
/*! /*!
...@@ -289,8 +282,8 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterAddValidData_R( ...@@ -289,8 +282,8 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterAddValidData_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetTrainingData_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetTrainingData_R(
LGBM_SE handle, SEXP handle,
LGBM_SE train_data SEXP train_data
); );
/*! /*!
...@@ -300,7 +293,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetTrainingData_R( ...@@ -300,7 +293,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetTrainingData_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetParameter_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetParameter_R(
LGBM_SE handle, SEXP handle,
SEXP parameters SEXP parameters
); );
...@@ -311,7 +304,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetParameter_R( ...@@ -311,7 +304,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterResetParameter_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumClasses_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumClasses_R(
LGBM_SE handle, SEXP handle,
SEXP out SEXP out
); );
...@@ -321,7 +314,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumClasses_R( ...@@ -321,7 +314,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumClasses_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIter_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIter_R(
LGBM_SE handle SEXP handle
); );
/*! /*!
...@@ -334,7 +327,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIter_R( ...@@ -334,7 +327,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIter_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIterCustom_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIterCustom_R(
LGBM_SE handle, SEXP handle,
SEXP grad, SEXP grad,
SEXP hess, SEXP hess,
SEXP len SEXP len
...@@ -346,7 +339,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIterCustom_R( ...@@ -346,7 +339,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterUpdateOneIterCustom_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterRollbackOneIter_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterRollbackOneIter_R(
LGBM_SE handle SEXP handle
); );
/*! /*!
...@@ -356,7 +349,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterRollbackOneIter_R( ...@@ -356,7 +349,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterRollbackOneIter_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetCurrentIteration_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetCurrentIteration_R(
LGBM_SE handle, SEXP handle,
SEXP out SEXP out
); );
...@@ -367,7 +360,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetCurrentIteration_R( ...@@ -367,7 +360,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetCurrentIteration_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetUpperBoundValue_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetUpperBoundValue_R(
LGBM_SE handle, SEXP handle,
SEXP out_result SEXP out_result
); );
...@@ -378,7 +371,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetUpperBoundValue_R( ...@@ -378,7 +371,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetUpperBoundValue_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetLowerBoundValue_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetLowerBoundValue_R(
LGBM_SE handle, SEXP handle,
SEXP out_result SEXP out_result
); );
...@@ -388,7 +381,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetLowerBoundValue_R( ...@@ -388,7 +381,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetLowerBoundValue_R(
* \return R character vector with names of eval metrics * \return R character vector with names of eval metrics
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEvalNames_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEvalNames_R(
LGBM_SE handle SEXP handle
); );
/*! /*!
...@@ -399,7 +392,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEvalNames_R( ...@@ -399,7 +392,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEvalNames_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEval_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEval_R(
LGBM_SE handle, SEXP handle,
SEXP data_idx, SEXP data_idx,
SEXP out_result SEXP out_result
); );
...@@ -412,7 +405,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEval_R( ...@@ -412,7 +405,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetEval_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumPredict_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumPredict_R(
LGBM_SE handle, SEXP handle,
SEXP data_idx, SEXP data_idx,
SEXP out SEXP out
); );
...@@ -426,7 +419,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumPredict_R( ...@@ -426,7 +419,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetNumPredict_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetPredict_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetPredict_R(
LGBM_SE handle, SEXP handle,
SEXP data_idx, SEXP data_idx,
SEXP out_result SEXP out_result
); );
...@@ -448,7 +441,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetPredict_R( ...@@ -448,7 +441,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterGetPredict_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForFile_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForFile_R(
LGBM_SE handle, SEXP handle,
SEXP data_filename, SEXP data_filename,
SEXP data_has_header, SEXP data_has_header,
SEXP is_rawscore, SEXP is_rawscore,
...@@ -475,7 +468,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForFile_R( ...@@ -475,7 +468,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForFile_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCalcNumPredict_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCalcNumPredict_R(
LGBM_SE handle, SEXP handle,
SEXP num_row, SEXP num_row,
SEXP is_rawscore, SEXP is_rawscore,
SEXP is_leafidx, SEXP is_leafidx,
...@@ -509,7 +502,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCalcNumPredict_R( ...@@ -509,7 +502,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterCalcNumPredict_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForCSC_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForCSC_R(
LGBM_SE handle, SEXP handle,
SEXP indptr, SEXP indptr,
SEXP indices, SEXP indices,
SEXP data, SEXP data,
...@@ -546,7 +539,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForCSC_R( ...@@ -546,7 +539,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForCSC_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForMat_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForMat_R(
LGBM_SE handle, SEXP handle,
SEXP data, SEXP data,
SEXP num_row, SEXP num_row,
SEXP num_col, SEXP num_col,
...@@ -568,7 +561,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForMat_R( ...@@ -568,7 +561,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterPredictForMat_R(
* \return R NULL value * \return R NULL value
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModel_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModel_R(
LGBM_SE handle, SEXP handle,
SEXP num_iteration, SEXP num_iteration,
SEXP feature_importance_type, SEXP feature_importance_type,
SEXP filename SEXP filename
...@@ -582,7 +575,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModel_R( ...@@ -582,7 +575,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModel_R(
* \return R character vector (length=1) with model string * \return R character vector (length=1) with model string
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModelToString_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModelToString_R(
LGBM_SE handle, SEXP handle,
SEXP num_iteration, SEXP num_iteration,
SEXP feature_importance_type SEXP feature_importance_type
); );
...@@ -595,7 +588,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModelToString_R( ...@@ -595,7 +588,7 @@ LIGHTGBM_C_EXPORT SEXP LGBM_BoosterSaveModelToString_R(
* \return R character vector (length=1) with model JSON * \return R character vector (length=1) with model JSON
*/ */
LIGHTGBM_C_EXPORT SEXP LGBM_BoosterDumpModel_R( LIGHTGBM_C_EXPORT SEXP LGBM_BoosterDumpModel_R(
LGBM_SE handle, SEXP handle,
SEXP num_iteration, SEXP num_iteration,
SEXP feature_importance_type SEXP feature_importance_type
); );
......
...@@ -73,16 +73,14 @@ test_that("lgb.Dataset: nrow is correct for a very sparse matrix", { ...@@ -73,16 +73,14 @@ test_that("lgb.Dataset: nrow is correct for a very sparse matrix", {
test_that("lgb.Dataset: Dataset should be able to construct from matrix and return non-null handle", { test_that("lgb.Dataset: Dataset should be able to construct from matrix and return non-null handle", {
rawData <- matrix(runif(1000L), ncol = 10L) rawData <- matrix(runif(1000L), ncol = 10L)
handle <- lgb.null.handle()
ref_handle <- NULL ref_handle <- NULL
.Call( handle <- .Call(
LGBM_DatasetCreateFromMat_R LGBM_DatasetCreateFromMat_R
, rawData , rawData
, nrow(rawData) , nrow(rawData)
, ncol(rawData) , ncol(rawData)
, lightgbm:::lgb.params2str(params = list()) , lightgbm:::lgb.params2str(params = list())
, ref_handle , ref_handle
, handle
) )
expect_false(is.na(handle)) expect_false(is.na(handle))
.Call(LGBM_DatasetFree_R, handle) .Call(LGBM_DatasetFree_R, handle)
......
...@@ -324,7 +324,7 @@ result <- file.copy( ...@@ -324,7 +324,7 @@ result <- file.copy(
, overwrite = TRUE , overwrite = TRUE
) )
.handle_result(result) .handle_result(result)
for (src_file in c("lightgbm_R.cpp", "lightgbm_R.h", "R_object_helper.h")) { for (src_file in c("lightgbm_R.cpp", "lightgbm_R.h")) {
result <- file.copy( result <- file.copy(
from = file.path(TEMP_SOURCE_DIR, src_file) from = file.path(TEMP_SOURCE_DIR, src_file)
, to = file.path(TEMP_SOURCE_DIR, "src", src_file) , to = file.path(TEMP_SOURCE_DIR, "src", src_file)
...@@ -386,11 +386,6 @@ dynlib_line <- grep( ...@@ -386,11 +386,6 @@ dynlib_line <- grep(
c_api_contents <- readLines(file.path(TEMP_SOURCE_DIR, "src", "lightgbm_R.h")) c_api_contents <- readLines(file.path(TEMP_SOURCE_DIR, "src", "lightgbm_R.h"))
c_api_contents <- c_api_contents[grepl("^LIGHTGBM_C_EXPORT", c_api_contents)] c_api_contents <- c_api_contents[grepl("^LIGHTGBM_C_EXPORT", c_api_contents)]
c_api_contents <- gsub(
pattern = "LIGHTGBM_C_EXPORT LGBM_SE "
, replacement = ""
, x = c_api_contents
)
c_api_contents <- gsub( c_api_contents <- gsub(
pattern = "LIGHTGBM_C_EXPORT SEXP " pattern = "LIGHTGBM_C_EXPORT SEXP "
, replacement = "" , replacement = ""
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment