From 1c121f81ca1444d5b672283a2db3eb230c140e03 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Tue, 20 Sep 2022 22:48:16 -0700 Subject: [PATCH 01/24] Remove submodule --- .gitmodules | 3 --- lightgbm-sys/lightgbm | 1 - 2 files changed, 4 deletions(-) delete mode 160000 lightgbm-sys/lightgbm diff --git a/.gitmodules b/.gitmodules index 412666b..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "lightgbm-sys/lightgbm"] - path = lightgbm-sys/lightgbm - url = https://github.com/vaaaaanquish/LightGBM.git diff --git a/lightgbm-sys/lightgbm b/lightgbm-sys/lightgbm deleted file mode 160000 index 3cf764e..0000000 --- a/lightgbm-sys/lightgbm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3cf764e438347d1aa12a1f1c464a6295cf7a6134 From fa9bd40aa8bc47d6eba2cba390aef43bf8e381e4 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Tue, 20 Sep 2022 22:50:29 -0700 Subject: [PATCH 02/24] hmm --- .gitmodules | 3 +++ lightgbm-sys/lightgbm | 1 + 2 files changed, 4 insertions(+) create mode 160000 lightgbm-sys/lightgbm diff --git a/.gitmodules b/.gitmodules index e69de29..db0ef17 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lightgbm-sys/lightgbm"] + path = lightgbm-sys/lightgbm + url = https://github.com/microsoft/LightGBM/ diff --git a/lightgbm-sys/lightgbm b/lightgbm-sys/lightgbm new file mode 160000 index 0000000..3cf764e --- /dev/null +++ b/lightgbm-sys/lightgbm @@ -0,0 +1 @@ +Subproject commit 3cf764e438347d1aa12a1f1c464a6295cf7a6134 From 8aed8618f0f0130633e9e9c1f3f7da7ed669d5a8 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Tue, 20 Sep 2022 22:50:43 -0700 Subject: [PATCH 03/24] gone --- .gitmodules | 3 --- lightgbm-sys/lightgbm | 1 - 2 files changed, 4 deletions(-) delete mode 160000 lightgbm-sys/lightgbm diff --git a/.gitmodules b/.gitmodules index db0ef17..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "lightgbm-sys/lightgbm"] - path = lightgbm-sys/lightgbm - url = https://github.com/microsoft/LightGBM/ diff --git a/lightgbm-sys/lightgbm b/lightgbm-sys/lightgbm deleted file mode 160000 index 3cf764e..0000000 --- a/lightgbm-sys/lightgbm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3cf764e438347d1aa12a1f1c464a6295cf7a6134 From bbedcb66f3d05cb630ccb769f9e1c9342b7c4326 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Tue, 20 Sep 2022 22:53:59 -0700 Subject: [PATCH 04/24] Move to upstream --- .gitmodules | 3 +++ lightgbm-sys/lightgbm | 1 + 2 files changed, 4 insertions(+) create mode 160000 lightgbm-sys/lightgbm diff --git a/.gitmodules b/.gitmodules index e69de29..c5376a7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lightgbm-upstream"] + path = lightgbm-sys/lightgbm + url = https://github.com/microsoft/LightGBM/ diff --git a/lightgbm-sys/lightgbm b/lightgbm-sys/lightgbm new file mode 160000 index 0000000..dce7e58 --- /dev/null +++ b/lightgbm-sys/lightgbm @@ -0,0 +1 @@ +Subproject commit dce7e58b020bc14b69eefc31546c366971ecb2d9 From 1434e70b443c486e65dab4b9ad5f81b67e7a4ef2 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Wed, 21 Sep 2022 15:16:01 -0700 Subject: [PATCH 05/24] Create datasets from one-dim vec --- src/dataset.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/dataset.rs b/src/dataset.rs index b6e1d6f..33596b1 100644 --- a/src/dataset.rs +++ b/src/dataset.rs @@ -43,6 +43,51 @@ impl Dataset { Self { handle } } + /// Create a new `Dataset` from a dense array in row-major order + /// without allocating rows in memory. + /// + /// Example + /// ``` + /// use lightgbm::Dataset; + /// + /// let data = vec![1.0, 0.1, 0.2, 0.1, + /// 0.7, 0.4, 0.5, 0.1, + /// 0.9, 0.8, 0.5, 0.1, + /// 0.2, 0.2, 0.8, 0.7, + /// 0.1, 0.7, 1.0, 0.9]; + /// let label = vec![0.0, 0.0, 0.0, 1.0, 1.0]; + /// let dataset = Dataset::from_vec(&data, &label, 4).unwrap(); + /// ``` + pub fn from_vec(data: &[f32], labels: &[f32], num_features: i32) -> Result { + let data_length = data.len() as i32; + let feature_length = num_features; + let params = CString::new("").unwrap(); + let label_str = CString::new("label").unwrap(); + let reference = std::ptr::null_mut(); // not use + let mut handle = std::ptr::null_mut(); + + lgbm_call!(lightgbm_sys::LGBM_DatasetCreateFromMat( + data.as_ptr() as *const c_void, + lightgbm_sys::C_API_DTYPE_FLOAT32 as i32, + data_length, + feature_length, + 1_i32, + params.as_ptr() as *const c_char, + reference, + &mut handle + ))?; + + lgbm_call!(lightgbm_sys::LGBM_DatasetSetField( + handle, + label_str.as_ptr() as *const c_char, + labels.as_ptr() as *const c_void, + data_length as i32, + lightgbm_sys::C_API_DTYPE_FLOAT32 as i32 + ))?; + + Ok(Self::new(handle)) + } + /// Create a new `Dataset` from dense array in row-major order. /// /// Example @@ -225,6 +270,19 @@ mod tests { assert!(dataset.is_ok()); } + #[test] + fn from_vec() { + let data = vec![ + 1.0, 0.1, 0.2, 0.1, 0.7, 0.4, 0.5, 0.1, 0.9, 0.8, 0.5, 0.1, 0.2, 0.2, 0.8, 0.7, 0.1, + 0.7, 1.0, 0.9, + ]; + + let labels = vec![0.0, 0.0, 0.0, 1.0, 1.0]; + + let dataset = Dataset::from_vec(&data, &labels, 4); + assert!(dataset.is_ok()); + } + #[cfg(feature = "dataframe")] #[test] fn from_dataframe() { From b4e777852e3d40ec537fb19897a033dd245f4e12 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Wed, 21 Sep 2022 16:06:17 -0700 Subject: [PATCH 06/24] Use single-dim vector for predictions --- src/booster.rs | 53 +++++++++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/src/booster.rs b/src/booster.rs index bd1732b..7272a6e 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -95,21 +95,20 @@ impl Booster { /// /// Input data example /// ``` - /// let data = vec![vec![1.0, 0.1, 0.2], - /// vec![0.7, 0.4, 0.5], - /// vec![0.1, 0.7, 1.0]]; + /// let data = vec![1.0, 0.1, 0.2, + /// 0.7, 0.4, 0.5, + /// 0.1, 0.7, 1.0]; /// ``` /// /// Output data example /// ``` - /// let output = vec![vec![1.0, 0.109, 0.433]]; + /// let output = vec![1.0, 0.109, 0.433]; /// ``` - pub fn predict(&self, data: Vec>) -> Result>> { + pub fn predict(&self, data: &[f32], num_features: i32) -> Result> { let data_length = data.len(); - let feature_length = data[0].len(); + let num_rows = data_length / num_features as usize; let params = CString::new("").unwrap(); let mut out_length: c_longlong = 0; - let flat_data = data.into_iter().flatten().collect::>(); // get num_class let mut num_class = 0; @@ -118,33 +117,24 @@ impl Booster { &mut num_class ))?; - let out_result: Vec = vec![Default::default(); data_length * num_class as usize]; + let out_result: Vec = vec![Default::default(); num_rows * num_class as usize]; lgbm_call!(lightgbm_sys::LGBM_BoosterPredictForMat( self.handle, - flat_data.as_ptr() as *const c_void, - lightgbm_sys::C_API_DTYPE_FLOAT64 as i32, - data_length as i32, - feature_length as i32, + data.as_ptr() as *const c_void, + lightgbm_sys::C_API_DTYPE_FLOAT32 as i32, + num_rows as i32, + num_features, 1_i32, - 0_i32, + lightgbm_sys::C_API_PREDICT_NORMAL as i32, 0_i32, -1_i32, params.as_ptr() as *const c_char, &mut out_length, - out_result.as_ptr() as *mut c_double + out_result.as_ptr() as *mut c_double, ))?; - // reshape for multiclass [1,2,3,4,5,6] -> [[1,2,3], [4,5,6]] # 3 class - let reshaped_output = if num_class > 1 { - out_result - .chunks(num_class as usize) - .map(|x| x.to_vec()) - .collect() - } else { - vec![out_result] - }; - Ok(reshaped_output) + Ok(out_result) } /// Get Feature Num. @@ -257,13 +247,14 @@ mod tests { } }; let bst = _train_booster(¶ms); - let feature = vec![vec![0.5; 28], vec![0.0; 28], vec![0.9; 28]]; - let result = bst.predict(feature).unwrap(); - let mut normalized_result = Vec::new(); - for r in &result[0] { - normalized_result.push(if r > &0.5 { 1 } else { 0 }); - } - assert_eq!(normalized_result, vec![0, 0, 1]); + let mut features = Vec::new(); + features.extend(vec![0.5; 28]); + features.extend(vec![0.0; 28]); + features.extend(vec![0.9; 28]); + + assert_eq!(features.len(), 28 * 3); + let result = bst.predict(&features, 28).unwrap(); + assert_eq!(result.len(), 3); } #[test] From 61c1ce14356848218ac679db37157f4f524e8810 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Thu, 22 Sep 2022 08:42:23 -0700 Subject: [PATCH 07/24] Fix segfault --- src/booster.rs | 38 +++++++++++++++++++++----------------- src/dataset.rs | 25 +++++++++++++------------ 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/booster.rs b/src/booster.rs index 7272a6e..d7148a2 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -104,11 +104,13 @@ impl Booster { /// ``` /// let output = vec![1.0, 0.109, 0.433]; /// ``` - pub fn predict(&self, data: &[f32], num_features: i32) -> Result> { - let data_length = data.len(); - let num_rows = data_length / num_features as usize; - let params = CString::new("").unwrap(); - let mut out_length: c_longlong = 0; + pub fn predict(&self, data: &[f32], num_features: i32) -> Result> { + let ncol = num_features; + let nrow = data.len() as i32 / ncol; + let is_row_major = 1 as i32; + let start_iteration = 0 as i32; + let num_iteration = -1 as i32; // no limit + let parameters = CString::new("").unwrap(); // get num_class let mut num_class = 0; @@ -117,19 +119,20 @@ impl Booster { &mut num_class ))?; - let out_result: Vec = vec![Default::default(); num_rows * num_class as usize]; + let mut out_length: c_longlong = 0; + let out_result: Vec = vec![Default::default(); (nrow * num_class) as usize]; lgbm_call!(lightgbm_sys::LGBM_BoosterPredictForMat( self.handle, data.as_ptr() as *const c_void, lightgbm_sys::C_API_DTYPE_FLOAT32 as i32, - num_rows as i32, - num_features, - 1_i32, + nrow, + ncol, + is_row_major, lightgbm_sys::C_API_PREDICT_NORMAL as i32, - 0_i32, - -1_i32, - params.as_ptr() as *const c_char, + start_iteration, + num_iteration, + parameters.as_ptr() as *const c_char, &mut out_length, out_result.as_ptr() as *mut c_double, ))?; @@ -248,13 +251,14 @@ mod tests { }; let bst = _train_booster(¶ms); let mut features = Vec::new(); - features.extend(vec![0.5; 28]); - features.extend(vec![0.0; 28]); - features.extend(vec![0.9; 28]); - assert_eq!(features.len(), 28 * 3); + for _ in 0..2500 { + features.extend(vec![0.5; 28]); + } + + assert_eq!(features.len(), 28 * 2500); let result = bst.predict(&features, 28).unwrap(); - assert_eq!(result.len(), 3); + assert_eq!(result.len(), 2500); } #[test] diff --git a/src/dataset.rs b/src/dataset.rs index 33596b1..e32b788 100644 --- a/src/dataset.rs +++ b/src/dataset.rs @@ -59,29 +59,30 @@ impl Dataset { /// let dataset = Dataset::from_vec(&data, &label, 4).unwrap(); /// ``` pub fn from_vec(data: &[f32], labels: &[f32], num_features: i32) -> Result { - let data_length = data.len() as i32; - let feature_length = num_features; - let params = CString::new("").unwrap(); - let label_str = CString::new("label").unwrap(); - let reference = std::ptr::null_mut(); // not use + let nrows = data.len() as i32 / num_features as i32; + let ncol = num_features; + let is_row_major = 1 as i32; // row-major + let parameters = CString::new("").unwrap(); + let label_name = CString::new("label").unwrap(); + let mut handle = std::ptr::null_mut(); lgbm_call!(lightgbm_sys::LGBM_DatasetCreateFromMat( data.as_ptr() as *const c_void, lightgbm_sys::C_API_DTYPE_FLOAT32 as i32, - data_length, - feature_length, - 1_i32, - params.as_ptr() as *const c_char, - reference, + nrows, + ncol, + is_row_major, + parameters.as_ptr() as *const c_char, + std::ptr::null_mut(), &mut handle ))?; lgbm_call!(lightgbm_sys::LGBM_DatasetSetField( handle, - label_str.as_ptr() as *const c_char, + label_name.as_ptr() as *const c_char, labels.as_ptr() as *const c_void, - data_length as i32, + nrows as i32, lightgbm_sys::C_API_DTYPE_FLOAT32 as i32 ))?; From 96a10a59c0ea6599e815bf3298ae0fbb1e236b4d Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Thu, 22 Sep 2022 10:47:51 -0700 Subject: [PATCH 08/24] Add num_class method --- src/booster.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/booster.rs b/src/booster.rs index d7148a2..70ab7df 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -140,6 +140,17 @@ impl Booster { Ok(out_result) } + /// Get number of classes. + pub fn num_class(&self) -> Result { + let mut num_class = 0; + lgbm_call!(lightgbm_sys::LGBM_BoosterGetNumClasses( + self.handle, + &mut num_class + ))?; + + Ok(num_class) + } + /// Get Feature Num. pub fn num_feature(&self) -> Result { let mut out_len = 0; @@ -269,6 +280,14 @@ mod tests { assert_eq!(num_feature, 28); } + #[test] + fn num_class() { + let params = _default_params(); + let bst = _train_booster(¶ms); + let num_class = bst.num_class().unwrap(); + assert_eq!(num_class, 1); + } + #[test] fn feature_importance() { let params = _default_params(); From 33f0ab55b0e03eaa9764f1bef86466bdb8744f18 Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 26 Oct 2022 11:00:20 -0700 Subject: [PATCH 09/24] make cuda a feature --- Cargo.toml | 1 + lightgbm-sys/Cargo.toml | 3 +++ lightgbm-sys/build.rs | 25 ++++++++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4a3f2b2..b2dfd3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,4 @@ polars = {version = "0.16.0", optional = true} [features] default = [] dataframe = ["polars"] +cuda = ["lightgbm-sys/cuda"] diff --git a/lightgbm-sys/Cargo.toml b/lightgbm-sys/Cargo.toml index 8f837fe..5f9c4fd 100644 --- a/lightgbm-sys/Cargo.toml +++ b/lightgbm-sys/Cargo.toml @@ -9,6 +9,9 @@ description = "Native bindings to the LightGBM library" readme = "README.md" exclude = ["README.md", ".gitlab-ci.yml", ".hgeol", ".gitignore", ".appveyor.yml", ".coveralls.yml", ".travis.yml", ".github", ".gitmodules", ".nuget", "**/*.md", "lightgbm/compute/doc", "lightgbm/compute/example", "lightgbm/compute/index.html", "lightgbm/compute/perf", "lightgbm/compute/test", "lightgbm/eigen/debug", "lightgbm/eigen/demos", "lightgbm/eigen/doc", "lightgbm/eigen/failtest", "lightgbm/eigen/test", "lightgbm/examples", "lightgbm/external_libs/fast_double_parser/benchmarks", "lightgbm/external_libs/fmt/doc", "lightgbm/external_libs/fmt/test"] +[features] +cuda = [] + [dependencies] libc = "0.2.81" diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index 7c4d7d6..ae2967c 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -36,6 +36,15 @@ fn main() { } // CMake + #[cfg(feature = "cuda")] + let dst = Config::new(&lgbm_root) + .profile("Release") + .uses_cxx11() + .define("BUILD_STATIC_LIB", "ON") + .define("USE_CUDA_EXP", "1") + .build(); + + #[cfg(not(feature = "cuda"))] let dst = Config::new(&lgbm_root) .profile("Release") .uses_cxx11() @@ -46,9 +55,15 @@ fn main() { let bindings = bindgen::Builder::default() .header("wrapper.h") .clang_args(&["-x", "c++", "-std=c++11"]) - .clang_arg(format!("-I{}", lgbm_root.join("include").display())) + .clang_arg(format!("-I{}", lgbm_root.join("include").display())); + + #[cfg(feature = "cuda")] + let bindings = bindings.clang_arg("-I/usr/local/cuda/include"); + + let bindings = bindings .generate() .expect("Unable to generate bindings"); + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings .write_to_file(out_path.join("bindings.rs")) @@ -70,4 +85,12 @@ fn main() { } else { println!("cargo:rustc-link-lib=static=_lightgbm"); } + + #[cfg(feature = "cuda")] + { + println!("cargo:rustc-link-search={}", "/usr/local/cuda/lib64"); + println!("cargo:rustc-link-search={}", "/usr/local/cuda/lib64/stubs"); + println!("cargo:rustc-link-lib=dylib=cuda"); + println!("cargo:rustc-link-lib=dylib=cudart"); + } } From 8af3dcb0cfdbf26d7032e89400355eaf0f3663cb Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 26 Oct 2022 16:16:03 -0700 Subject: [PATCH 10/24] static link cuda --- lightgbm-sys/build.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index ae2967c..c0dc457 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -89,8 +89,6 @@ fn main() { #[cfg(feature = "cuda")] { println!("cargo:rustc-link-search={}", "/usr/local/cuda/lib64"); - println!("cargo:rustc-link-search={}", "/usr/local/cuda/lib64/stubs"); - println!("cargo:rustc-link-lib=dylib=cuda"); - println!("cargo:rustc-link-lib=dylib=cudart"); + println!("cargo:rustc-link-lib=static=cudart_static"); } } From b867ac8bc8e527ca9c44de0cff6c66648af0ee45 Mon Sep 17 00:00:00 2001 From: Montana Low Date: Wed, 26 Oct 2022 16:40:21 -0700 Subject: [PATCH 11/24] use cuda --- lightgbm-sys/build.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index c0dc457..fca0275 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -41,6 +41,7 @@ fn main() { .profile("Release") .uses_cxx11() .define("BUILD_STATIC_LIB", "ON") + .define("USE_CUDA", "1") .define("USE_CUDA_EXP", "1") .build(); From 06b27de1c46895f325d6fbd6482d54231d573cd1 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Mon, 1 May 2023 10:23:55 -0700 Subject: [PATCH 12/24] Fix linux build --- lightgbm-sys/build.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index fca0275..ebc16e2 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -58,6 +58,11 @@ fn main() { .clang_args(&["-x", "c++", "-std=c++11"]) .clang_arg(format!("-I{}", lgbm_root.join("include").display())); + #[cfg(target_os = "linux")] + let bindings = bindings + .clang_arg(format!("-I/usr/include/c++/11")) + .clang_arg(format!("-I/usr/include/x86_64-linux-gnu/c++/11")); + #[cfg(feature = "cuda")] let bindings = bindings.clang_arg("-I/usr/local/cuda/include"); From 262dc88a3a08258fe6f8dcacaf2ee68101f80173 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Wed, 19 Jul 2023 23:23:34 -0700 Subject: [PATCH 13/24] help mac --- lightgbm-sys/build.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index ebc16e2..81cb53e 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -35,22 +35,32 @@ fn main() { } } + let mut dst = Config::new(&lgbm_root); + // CMake #[cfg(feature = "cuda")] - let dst = Config::new(&lgbm_root) + let dst = dst .profile("Release") .uses_cxx11() .define("BUILD_STATIC_LIB", "ON") .define("USE_CUDA", "1") - .define("USE_CUDA_EXP", "1") - .build(); + .define("USE_CUDA_EXP", "1"); #[cfg(not(feature = "cuda"))] - let dst = Config::new(&lgbm_root) + let dst = dst .profile("Release") .uses_cxx11() - .define("BUILD_STATIC_LIB", "ON") - .build(); + .define("BUILD_STATIC_LIB", "ON"); + + #[cfg(target_os = "macos")] + let dst = + dst + .define("CMAKE_C_COMPILER", "/opt/homebrew/opt/llvm/bin/clang") + .define("CMAKE_CXX_COMPILER", "/opt/homebrew/opt/llvm/bin/clang++") + .define("OPENMP_LIBRARIES", "/opt/homebrew/opt/llvm/lib") + .define("OPENMP_INCLUDES", "/opt/homebrew/opt/llvm/include"); + + let dst = dst.build(); // bindgen build let bindings = bindgen::Builder::default() From 6db2e75ecaf243bffc8a4db513515df94a633c37 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Tue, 19 Sep 2023 11:21:06 -0700 Subject: [PATCH 14/24] Updated bindgen version to fix build bug --- lightgbm-sys/Cargo.toml | 2 +- src/booster.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lightgbm-sys/Cargo.toml b/lightgbm-sys/Cargo.toml index 5f9c4fd..c3f504a 100644 --- a/lightgbm-sys/Cargo.toml +++ b/lightgbm-sys/Cargo.toml @@ -16,5 +16,5 @@ cuda = [] libc = "0.2.81" [build-dependencies] -bindgen = "0.56.0" +bindgen = "0.68" cmake = "0.1" diff --git a/src/booster.rs b/src/booster.rs index 70ab7df..be6c29a 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -178,7 +178,7 @@ impl Booster { self.handle, feature_name_length as i32, &mut num_feature_names, - num_feature as u64, + num_feature as usize, &mut out_buffer_len, out_strs.as_ptr() as *mut *mut c_char ))?; From 978dd69f6c7aafb8500ecb255f2248fde80ebc97 Mon Sep 17 00:00:00 2001 From: Lev Kokotov Date: Tue, 14 May 2024 09:22:46 -0700 Subject: [PATCH 15/24] update bindgen --- lightgbm-sys/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lightgbm-sys/Cargo.toml b/lightgbm-sys/Cargo.toml index c3f504a..2f20b2f 100644 --- a/lightgbm-sys/Cargo.toml +++ b/lightgbm-sys/Cargo.toml @@ -16,5 +16,5 @@ cuda = [] libc = "0.2.81" [build-dependencies] -bindgen = "0.68" +bindgen = "0.69" cmake = "0.1" From 24877730f72643a04eb960d04b1192541a9846b2 Mon Sep 17 00:00:00 2001 From: Patsakula Nikita Date: Thu, 12 Oct 2023 12:40:59 +0300 Subject: [PATCH 16/24] [*] lightgbm updated. --- .gitmodules | 2 +- Cargo.toml | 6 +++--- lightgbm-sys/Cargo.toml | 4 ++-- src/dataset.rs | 7 +++---- src/lib.rs | 1 - 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.gitmodules b/.gitmodules index c5376a7..ff70a2d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "lightgbm-upstream"] path = lightgbm-sys/lightgbm - url = https://github.com/microsoft/LightGBM/ + url = https://github.com/microsoft/LightGBM.git diff --git a/Cargo.toml b/Cargo.toml index b2dfd3f..9375eb2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,9 +11,9 @@ exclude = [".gitignore", ".gitmodules", "examples", "lightgbm-sys"] [dependencies] lightgbm-sys = { path = "lightgbm-sys", version = "0.3.0" } libc = "0.2.81" -derive_builder = "0.5.1" -serde_json = "1.0.59" -polars = {version = "0.16.0", optional = true} +derive_builder = "0.12" +serde_json = "1" +polars = {version = "0.33", optional = true} [features] diff --git a/lightgbm-sys/Cargo.toml b/lightgbm-sys/Cargo.toml index 2f20b2f..c4b89ad 100644 --- a/lightgbm-sys/Cargo.toml +++ b/lightgbm-sys/Cargo.toml @@ -13,8 +13,8 @@ exclude = ["README.md", ".gitlab-ci.yml", ".hgeol", ".gitignore", ".appveyor.yml cuda = [] [dependencies] -libc = "0.2.81" +libc = "0.2" [build-dependencies] -bindgen = "0.69" +bindgen = "0.71" cmake = "0.1" diff --git a/src/dataset.rs b/src/dataset.rs index e32b788..5a25f87 100644 --- a/src/dataset.rs +++ b/src/dataset.rs @@ -37,7 +37,6 @@ pub struct Dataset { pub(crate) handle: lightgbm_sys::DatasetHandle, } -#[link(name = "c")] impl Dataset { fn new(handle: lightgbm_sys::DatasetHandle) -> Self { Self { handle } @@ -199,13 +198,13 @@ impl Dataset { let (m, n) = dataframe.shape(); - let label_series = &dataframe.select_series(label_col_name)?[0].cast::()?; + let label_series = &dataframe.select_series([label_col_name])?[0].cast(&DataType::Float32)?; if label_series.null_count() != 0 { panic!("Cannot create a dataset with null values, encountered nulls when creating the label array") } - dataframe.drop_in_place(label_col_name)?; + let _ = dataframe.drop_in_place(label_col_name)?; let mut label_values = Vec::with_capacity(m); @@ -228,7 +227,7 @@ impl Dataset { panic!("Cannot create a dataset with null values, encountered nulls when creating the features array") } - let series = series.cast::()?; + let series = series.cast(&DataType::Float64)?; let ca = series.unpack::()?; ca.into_no_null_iter() diff --git a/src/lib.rs b/src/lib.rs index 2867d47..60af0b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,6 @@ extern crate serde_json; #[cfg(feature = "dataframe")] extern crate polars; -#[macro_use] macro_rules! lgbm_call { ($x:expr) => { Error::check_return_value(unsafe { $x }) From 04ab0de419b320d2e738bd5b2ff97ed33bdf1264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=9F=D0=B0=D1=86?= =?UTF-8?q?=D0=B0=D0=BA=D1=83=D0=BB=D0=B0?= Date: Thu, 12 Oct 2023 20:02:07 +0300 Subject: [PATCH 17/24] [*] Bump version. --- Cargo.toml | 4 ++-- lightgbm-sys/Cargo.toml | 2 +- src/booster.rs | 8 ++++---- src/dataset.rs | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9375eb2..bc42a26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lightgbm" -version = "0.2.3" +version = "0.2.4" authors = ["vaaaaanquish <6syun9@gmail.com>"] license = "MIT" repository = "https://github.com/vaaaaanquish/LightGBM" @@ -9,7 +9,7 @@ readme = "README.md" exclude = [".gitignore", ".gitmodules", "examples", "lightgbm-sys"] [dependencies] -lightgbm-sys = { path = "lightgbm-sys", version = "0.3.0" } +lightgbm-sys = { path = "lightgbm-sys", version = "0.3.1" } libc = "0.2.81" derive_builder = "0.12" serde_json = "1" diff --git a/lightgbm-sys/Cargo.toml b/lightgbm-sys/Cargo.toml index c4b89ad..32bf575 100644 --- a/lightgbm-sys/Cargo.toml +++ b/lightgbm-sys/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lightgbm-sys" -version = "0.3.0" +version = "0.3.1" authors = ["vaaaaanquish <6syun9@gmail.com>"] build = "build.rs" license = "MIT" diff --git a/src/booster.rs b/src/booster.rs index be6c29a..319ab46 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -230,12 +230,12 @@ mod tests { use std::path::Path; fn _read_train_file() -> Result { - Dataset::from_file(&"lightgbm-sys/lightgbm/examples/binary_classification/binary.train") + Dataset::from_file("lightgbm-sys/lightgbm/examples/binary_classification/binary.train") } fn _train_booster(params: &Value) -> Booster { let dataset = _read_train_file().unwrap(); - Booster::train(dataset, ¶ms).unwrap() + Booster::train(dataset, params).unwrap() } fn _default_params() -> Value { @@ -309,13 +309,13 @@ mod tests { fn save_file() { let params = _default_params(); let bst = _train_booster(¶ms); - assert_eq!(bst.save_file(&"./test/test_save_file.output"), Ok(())); + assert_eq!(bst.save_file("./test/test_save_file.output"), Ok(())); assert!(Path::new("./test/test_save_file.output").exists()); let _ = fs::remove_file("./test/test_save_file.output"); } #[test] fn from_file() { - let _ = Booster::from_file(&"./test/test_from_file.input"); + let _ = Booster::from_file("./test/test_from_file.input"); } } diff --git a/src/dataset.rs b/src/dataset.rs index 5a25f87..8ee6549 100644 --- a/src/dataset.rs +++ b/src/dataset.rs @@ -248,7 +248,7 @@ impl Drop for Dataset { mod tests { use super::*; fn read_train_file() -> Result { - Dataset::from_file(&"lightgbm-sys/lightgbm/examples/binary_classification/binary.train") + Dataset::from_file("lightgbm-sys/lightgbm/examples/binary_classification/binary.train") } #[test] From 5aef3bf20e03af4ecc94de0fbf320f0c5f467701 Mon Sep 17 00:00:00 2001 From: Patsakula Nikita Date: Mon, 23 Oct 2023 14:28:07 +0300 Subject: [PATCH 18/24] [*] Booster::from_bytes implemented. --- src/booster.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/booster.rs b/src/booster.rs index 319ab46..62b744c 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -18,6 +18,20 @@ impl Booster { Booster { handle } } + /// Initialize model from bytes. + pub fn from_bytes(bytes: &[u8]) -> Result { + let booster_str = CString::new(bytes).unwrap(); + let mut out_num_iteration = 0; + let mut handle = std::ptr::null_mut(); + lgbm_call!(lightgbm_sys::LGBM_BoosterLoadModelFromString( + booster_str.as_ptr().cast(), + &mut out_num_iteration, + &mut handle + ))?; + + Ok(Booster::new(handle)) + } + /// Init from model file. pub fn from_file(filename: &str) -> Result { let filename_str = CString::new(filename).unwrap(); From 02f87dbbe50ff93e802949cd99a915f1cfc7b8f7 Mon Sep 17 00:00:00 2001 From: Patsakula Nikita Date: Tue, 31 Oct 2023 12:02:54 +0300 Subject: [PATCH 19/24] [+] Boster::predict_row implemented. --- src/booster.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/booster.rs b/src/booster.rs index 62b744c..1a3da88 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -165,6 +165,35 @@ impl Booster { Ok(num_class) } + /// Predict for single row. + pub fn predict_row(&self, data: Vec) -> Result> { + let feature_length = data.len(); + let params = CString::new("").unwrap(); + + let mut num_class = 0; + lgbm_call!(lightgbm_sys::LGBM_BoosterGetNumClasses( + self.handle, + &mut num_class + ))?; + let mut out_result = vec![Default::default(); num_class as usize]; + + lgbm_call!(lightgbm_sys::LGBM_BoosterPredictForMatSingleRow( + self.handle, + data.as_ptr().cast(), + lightgbm_sys::C_API_DTYPE_FLOAT64 as _, + feature_length as _, + 1, + lightgbm_sys::C_API_PREDICT_NORMAL as _, + 0, + -1, + params.as_ptr().cast(), + &mut 0, + out_result.as_mut_ptr(), + ))?; + + Ok(out_result) + } + /// Get Feature Num. pub fn num_feature(&self) -> Result { let mut out_len = 0; @@ -286,6 +315,26 @@ mod tests { assert_eq!(result.len(), 2500); } + #[test] + fn predict_single_row() { + let params = json! { + { + "num_iterations": 10, + "objective": "binary", + "metric": "auc", + "data_random_seed": 0 + } + }; + let bst = _train_booster(¶ms); + let feature = vec![0.9; 28]; + let result = bst.predict_row(feature).unwrap(); + let mut normalized_result = Vec::new(); + for r in &result { + normalized_result.push(if r > &0.5 { 1 } else { 0 }); + } + assert_eq!(normalized_result, vec![1]); + } + #[test] fn num_feature() { let params = _default_params(); From 749203d36d9b4c5502f81e1cfe0c276276c52f48 Mon Sep 17 00:00:00 2001 From: Patsakula Nikita Date: Tue, 31 Oct 2023 12:03:26 +0300 Subject: [PATCH 20/24] [*] Bump version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index bc42a26..d2071d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lightgbm" -version = "0.2.4" +version = "0.2.5" authors = ["vaaaaanquish <6syun9@gmail.com>"] license = "MIT" repository = "https://github.com/vaaaaanquish/LightGBM" From 14717992288884256223e865f33e1bfdf25d4aef Mon Sep 17 00:00:00 2001 From: Montana Low Date: Fri, 3 Jan 2025 17:35:00 -0800 Subject: [PATCH 21/24] update dependencies and build system --- Cargo.toml | 6 +++--- lightgbm-sys/build.rs | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d2071d3..4b8d537 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,10 +10,10 @@ exclude = [".gitignore", ".gitmodules", "examples", "lightgbm-sys"] [dependencies] lightgbm-sys = { path = "lightgbm-sys", version = "0.3.1" } -libc = "0.2.81" -derive_builder = "0.12" +libc = "0.2.169" +derive_builder = "0.20" serde_json = "1" -polars = {version = "0.33", optional = true} +polars = {version = "0.45", optional = true} [features] diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index 81cb53e..028fd97 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -15,7 +15,7 @@ fn main() { if !lgbm_root.exists() { let status = if target.contains("windows") { Command::new("cmd") - .args(&[ + .args([ "/C", "echo D | xcopy /S /Y lightgbm", lgbm_root.to_str().unwrap(), @@ -23,7 +23,7 @@ fn main() { .status() } else { Command::new("cp") - .args(&["-r", "lightgbm", lgbm_root.to_str().unwrap()]) + .args(["-r", "lightgbm", lgbm_root.to_str().unwrap()]) .status() }; if let Some(err) = status.err() { @@ -41,7 +41,6 @@ fn main() { #[cfg(feature = "cuda")] let dst = dst .profile("Release") - .uses_cxx11() .define("BUILD_STATIC_LIB", "ON") .define("USE_CUDA", "1") .define("USE_CUDA_EXP", "1"); @@ -49,7 +48,6 @@ fn main() { #[cfg(not(feature = "cuda"))] let dst = dst .profile("Release") - .uses_cxx11() .define("BUILD_STATIC_LIB", "ON"); #[cfg(target_os = "macos")] From b1b714bcfe0429560737d9c229bb7aa288ea7678 Mon Sep 17 00:00:00 2001 From: Montana Low Date: Fri, 3 Jan 2025 22:11:27 -0800 Subject: [PATCH 22/24] updates for lightgbm most recent version --- Cargo.toml | 1 + lightgbm-sys/.cargo/{config => config.toml} | 0 lightgbm-sys/Cargo.toml | 1 + lightgbm-sys/build.rs | 40 ++++++++++----------- lightgbm-sys/lightgbm | 2 +- src/booster.rs | 6 ++-- src/dataset.rs | 9 ++--- 7 files changed, 31 insertions(+), 28 deletions(-) rename lightgbm-sys/.cargo/{config => config.toml} (100%) diff --git a/Cargo.toml b/Cargo.toml index 4b8d537..6b81c30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ repository = "https://github.com/vaaaaanquish/LightGBM" description = "Machine learning using LightGBM" readme = "README.md" exclude = [".gitignore", ".gitmodules", "examples", "lightgbm-sys"] +edition = "2021" [dependencies] lightgbm-sys = { path = "lightgbm-sys", version = "0.3.1" } diff --git a/lightgbm-sys/.cargo/config b/lightgbm-sys/.cargo/config.toml similarity index 100% rename from lightgbm-sys/.cargo/config rename to lightgbm-sys/.cargo/config.toml diff --git a/lightgbm-sys/Cargo.toml b/lightgbm-sys/Cargo.toml index 32bf575..3dae385 100644 --- a/lightgbm-sys/Cargo.toml +++ b/lightgbm-sys/Cargo.toml @@ -8,6 +8,7 @@ repository = "https://github.com/vaaaaanquish/LightGBM" description = "Native bindings to the LightGBM library" readme = "README.md" exclude = ["README.md", ".gitlab-ci.yml", ".hgeol", ".gitignore", ".appveyor.yml", ".coveralls.yml", ".travis.yml", ".github", ".gitmodules", ".nuget", "**/*.md", "lightgbm/compute/doc", "lightgbm/compute/example", "lightgbm/compute/index.html", "lightgbm/compute/perf", "lightgbm/compute/test", "lightgbm/eigen/debug", "lightgbm/eigen/demos", "lightgbm/eigen/doc", "lightgbm/eigen/failtest", "lightgbm/eigen/test", "lightgbm/examples", "lightgbm/external_libs/fast_double_parser/benchmarks", "lightgbm/external_libs/fmt/doc", "lightgbm/external_libs/fmt/test"] +edition = "2021" [features] cuda = [] diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index 028fd97..73494fb 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -35,36 +35,38 @@ fn main() { } } - let mut dst = Config::new(&lgbm_root); - // CMake - #[cfg(feature = "cuda")] + let mut dst = Config::new(&lgbm_root); let dst = dst .profile("Release") .define("BUILD_STATIC_LIB", "ON") - .define("USE_CUDA", "1") - .define("USE_CUDA_EXP", "1"); + .define("CMAKE_POSITION_INDEPENDENT_CODE", "ON"); - #[cfg(not(feature = "cuda"))] - let dst = dst - .profile("Release") - .define("BUILD_STATIC_LIB", "ON"); + #[cfg(feature = "cuda")] + let dst = dst.define("USE_CUDA", "1").define("USE_CUDA_EXP", "1"); #[cfg(target_os = "macos")] - let dst = - dst - .define("CMAKE_C_COMPILER", "/opt/homebrew/opt/llvm/bin/clang") - .define("CMAKE_CXX_COMPILER", "/opt/homebrew/opt/llvm/bin/clang++") - .define("OPENMP_LIBRARIES", "/opt/homebrew/opt/llvm/lib") - .define("OPENMP_INCLUDES", "/opt/homebrew/opt/llvm/include"); + let dst = dst + .define("CMAKE_C_COMPILER", "/opt/homebrew/opt/llvm/bin/clang") + .define("CMAKE_CXX_COMPILER", "/opt/homebrew/opt/llvm/bin/clang++") + .define("OPENMP_LIBRARIES", "/opt/homebrew/opt/llvm/lib") + .define("OPENMP_INCLUDES", "/opt/homebrew/opt/llvm/include"); let dst = dst.build(); // bindgen build let bindings = bindgen::Builder::default() .header("wrapper.h") - .clang_args(&["-x", "c++", "-std=c++11"]) - .clang_arg(format!("-I{}", lgbm_root.join("include").display())); + .opaque_type("std::.*") + .blocklist_type("std::.*") + .opaque_type("size_type") + .allowlist_type("LGBM_.*") + .allowlist_function("LGBM_.*") + .allowlist_type("C_API_.*") + .allowlist_var("C_API_.*") + .clang_args(&["-x", "c++", "-std=c++11", "-flto=thin"]) + .clang_arg(format!("-I{}", lgbm_root.join("include").display())) + .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())); #[cfg(target_os = "linux")] let bindings = bindings @@ -74,9 +76,7 @@ fn main() { #[cfg(feature = "cuda")] let bindings = bindings.clang_arg("-I/usr/local/cuda/include"); - let bindings = bindings - .generate() - .expect("Unable to generate bindings"); + let bindings = bindings.generate().expect("Unable to generate bindings"); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings diff --git a/lightgbm-sys/lightgbm b/lightgbm-sys/lightgbm index dce7e58..e0c34e7 160000 --- a/lightgbm-sys/lightgbm +++ b/lightgbm-sys/lightgbm @@ -1 +1 @@ -Subproject commit dce7e58b020bc14b69eefc31546c366971ecb2d9 +Subproject commit e0c34e7b2f68793bbf46854b85fd750be134446d diff --git a/src/booster.rs b/src/booster.rs index 1a3da88..94d7dad 100644 --- a/src/booster.rs +++ b/src/booster.rs @@ -121,9 +121,9 @@ impl Booster { pub fn predict(&self, data: &[f32], num_features: i32) -> Result> { let ncol = num_features; let nrow = data.len() as i32 / ncol; - let is_row_major = 1 as i32; - let start_iteration = 0 as i32; - let num_iteration = -1 as i32; // no limit + let is_row_major = 1_i32; + let start_iteration = 0_i32; + let num_iteration = -1_i32; // no limit let parameters = CString::new("").unwrap(); // get num_class diff --git a/src/dataset.rs b/src/dataset.rs index 8ee6549..254a8b0 100644 --- a/src/dataset.rs +++ b/src/dataset.rs @@ -58,9 +58,9 @@ impl Dataset { /// let dataset = Dataset::from_vec(&data, &label, 4).unwrap(); /// ``` pub fn from_vec(data: &[f32], labels: &[f32], num_features: i32) -> Result { - let nrows = data.len() as i32 / num_features as i32; + let nrows = data.len() as i32 / num_features; let ncol = num_features; - let is_row_major = 1 as i32; // row-major + let is_row_major = 1_i32; // row-major let parameters = CString::new("").unwrap(); let label_name = CString::new("label").unwrap(); @@ -81,7 +81,7 @@ impl Dataset { handle, label_name.as_ptr() as *const c_char, labels.as_ptr() as *const c_void, - nrows as i32, + nrows, lightgbm_sys::C_API_DTYPE_FLOAT32 as i32 ))?; @@ -198,7 +198,8 @@ impl Dataset { let (m, n) = dataframe.shape(); - let label_series = &dataframe.select_series([label_col_name])?[0].cast(&DataType::Float32)?; + let label_series = + &dataframe.select_series([label_col_name])?[0].cast(&DataType::Float32)?; if label_series.null_count() != 0 { panic!("Cannot create a dataset with null values, encountered nulls when creating the label array") From ae554c4ff8d31399948e9703e4f3bf8cd17a2096 Mon Sep 17 00:00:00 2001 From: Silas Marvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 23 Jan 2025 12:45:59 -0800 Subject: [PATCH 23/24] Bump to c++17 --- lightgbm-sys/build.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index 73494fb..0c852a6 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -64,14 +64,14 @@ fn main() { .allowlist_function("LGBM_.*") .allowlist_type("C_API_.*") .allowlist_var("C_API_.*") - .clang_args(&["-x", "c++", "-std=c++11", "-flto=thin"]) + .clang_args(&["-x", "c++", "-std=c++17", "-flto=thin"]) .clang_arg(format!("-I{}", lgbm_root.join("include").display())) .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())); #[cfg(target_os = "linux")] let bindings = bindings - .clang_arg(format!("-I/usr/include/c++/11")) - .clang_arg(format!("-I/usr/include/x86_64-linux-gnu/c++/11")); + .clang_arg(format!("-I/usr/include/c++/17")) + .clang_arg(format!("-I/usr/include/x86_64-linux-gnu/c++/17")); #[cfg(feature = "cuda")] let bindings = bindings.clang_arg("-I/usr/local/cuda/include"); From e02fc645acd746d1d75d48ac7a68948fded23545 Mon Sep 17 00:00:00 2001 From: Montana Low Date: Tue, 28 Jan 2025 17:56:29 -0800 Subject: [PATCH 24/24] handle old os x --- lightgbm-sys/build.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lightgbm-sys/build.rs b/lightgbm-sys/build.rs index 73494fb..f49919b 100644 --- a/lightgbm-sys/build.rs +++ b/lightgbm-sys/build.rs @@ -37,20 +37,25 @@ fn main() { // CMake let mut dst = Config::new(&lgbm_root); - let dst = dst + let mut dst = dst .profile("Release") .define("BUILD_STATIC_LIB", "ON") .define("CMAKE_POSITION_INDEPENDENT_CODE", "ON"); #[cfg(feature = "cuda")] - let dst = dst.define("USE_CUDA", "1").define("USE_CUDA_EXP", "1"); + let mut dst = dst.define("USE_CUDA", "1").define("USE_CUDA_EXP", "1"); #[cfg(target_os = "macos")] - let dst = dst - .define("CMAKE_C_COMPILER", "/opt/homebrew/opt/llvm/bin/clang") - .define("CMAKE_CXX_COMPILER", "/opt/homebrew/opt/llvm/bin/clang++") - .define("OPENMP_LIBRARIES", "/opt/homebrew/opt/llvm/lib") - .define("OPENMP_INCLUDES", "/opt/homebrew/opt/llvm/include"); + { + let path = PathBuf::from("/opt/homebrew/"); // check for m1 vs intel config + if let Ok(_dir) = std::fs::read_dir(&path) { + dst = dst + .define("CMAKE_C_COMPILER", "/opt/homebrew/opt/llvm/bin/clang") + .define("CMAKE_CXX_COMPILER", "/opt/homebrew/opt/llvm/bin/clang++") + .define("OPENMP_LIBRARIES", "/opt/homebrew/opt/llvm/lib") + .define("OPENMP_INCLUDES", "/opt/homebrew/opt/llvm/include"); + }; + } let dst = dst.build();