зеркало из https://github.com/microsoft/CBM.git
Build fixes (#1)
* fix build * fix dependencies * fix more dependencies * pytest? * fix pip? * more fixing? * remove apt install * pybind11 * add to toml * fix mac/windows * just linux * use codecov token * enable windows * fix coverage * fix codecov, remove mac for publish * fix windows build * fix build * fix setup.py * more fixes * fix more build * removed windows
This commit is contained in:
Родитель
cfd6287f58
Коммит
43927d2f42
|
@ -0,0 +1,43 @@
|
||||||
|
name: Build
|
||||||
|
on: [push]
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest] # , windows-latest]
|
||||||
|
python: [3.7, 3.8]
|
||||||
|
env:
|
||||||
|
OS: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@master
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python }}
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: python -m pip install pytest pytest-cov pybind11 numpy pandas scikit-learn lightgbm interpret
|
||||||
|
|
||||||
|
- name: Install dependency for lightgbm
|
||||||
|
if: matrix.os == 'macos-latest'
|
||||||
|
run: brew install libomp
|
||||||
|
|
||||||
|
- name: Install package
|
||||||
|
run: python -m pip install -e .
|
||||||
|
|
||||||
|
- name: Generate coverage report
|
||||||
|
run: pytest --cov=./ --cov-report=xml tests/
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
directory: ./coverage/reports/
|
||||||
|
env_vars: OS,PYTHON
|
||||||
|
fail_ci_if_error: true
|
||||||
|
files: ./coverage.xml
|
||||||
|
flags: unittests
|
||||||
|
name: codecov-umbrella
|
||||||
|
path_to_write_report: ./coverage/codecov_report.txt
|
||||||
|
verbose: true
|
|
@ -1,34 +0,0 @@
|
||||||
name: Generate Codecov
|
|
||||||
on: [push]
|
|
||||||
jobs:
|
|
||||||
run:
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
||||||
env:
|
|
||||||
OS: ${{ matrix.os }}
|
|
||||||
PYTHON: '3.8'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@master
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@master
|
|
||||||
with:
|
|
||||||
python-version: 3.8
|
|
||||||
- name: Generate coverage report
|
|
||||||
run: |
|
|
||||||
pip install pytest
|
|
||||||
pip install pytest-cov
|
|
||||||
pytest --cov=./ --cov-report=xml
|
|
||||||
- name: Upload coverage to Codecov
|
|
||||||
uses: codecov/codecov-action@v2
|
|
||||||
with:
|
|
||||||
# token: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
directory: ./coverage/reports/
|
|
||||||
env_vars: OS,PYTHON
|
|
||||||
fail_ci_if_error: true
|
|
||||||
files: ./coverage1.xml,./coverage2.xml
|
|
||||||
flags: unittests
|
|
||||||
name: codecov-umbrella
|
|
||||||
path_to_write_report: ./coverage/codecov_report.txt
|
|
||||||
verbose: true
|
|
|
@ -3,9 +3,31 @@ name: Publish Python 🐍 distributions 📦 to PyPI and TestPyPI
|
||||||
on: push
|
on: push
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-n-publish:
|
# build-windows:
|
||||||
name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
|
# name: Build on Windows
|
||||||
runs-on: ubuntu-18.04
|
# runs-on: windows-latest
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@master
|
||||||
|
# - name: Set up Python 3.8
|
||||||
|
# uses: actions/setup-python@v1
|
||||||
|
# with:
|
||||||
|
# python-version: 3.8
|
||||||
|
|
||||||
|
# - name: Install pypa/build
|
||||||
|
# run: python -m pip install build --user
|
||||||
|
|
||||||
|
# - name: Build a binary wheel and a source tarball (Windows)
|
||||||
|
# run: python -m build --sdist --wheel --outdir dist/ .
|
||||||
|
|
||||||
|
# - name: Store the binary wheel
|
||||||
|
# uses: actions/upload-artifact@v2
|
||||||
|
# with:
|
||||||
|
# name: python-package-distributions
|
||||||
|
# path: dist
|
||||||
|
|
||||||
|
build-linux:
|
||||||
|
name: Build on Linux
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
- name: Set up Python 3.8
|
- name: Set up Python 3.8
|
||||||
|
@ -14,20 +36,29 @@ jobs:
|
||||||
python-version: 3.8
|
python-version: 3.8
|
||||||
|
|
||||||
- name: Install pypa/build
|
- name: Install pypa/build
|
||||||
run: >-
|
run: python -m pip install build --user
|
||||||
python -m
|
|
||||||
pip install
|
|
||||||
build
|
|
||||||
--user
|
|
||||||
|
|
||||||
- name: Build a binary wheel and a source tarball
|
- name: Build a source tarball
|
||||||
run: >-
|
run: python -m build --sdist --outdir dist/ .
|
||||||
python -m
|
|
||||||
build
|
- name: Store the binary wheel
|
||||||
--sdist
|
uses: actions/upload-artifact@v2
|
||||||
--wheel
|
with:
|
||||||
--outdir dist/
|
name: python-package-distributions
|
||||||
.
|
path: dist
|
||||||
|
|
||||||
|
publish:
|
||||||
|
name: Publish to PyPI and TestPyPI
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
needs:
|
||||||
|
# - build-windows
|
||||||
|
- build-linux
|
||||||
|
steps:
|
||||||
|
- name: Download all the dists
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: python-package-distributions
|
||||||
|
path: dist/
|
||||||
|
|
||||||
- name: Publish distribution 📦 to Test PyPI
|
- name: Publish distribution 📦 to Test PyPI
|
||||||
uses: pypa/gh-action-pypi-publish@master
|
uses: pypa/gh-action-pypi-publish@master
|
||||||
|
|
|
@ -1,12 +1,18 @@
|
||||||
# Cyclic Boosting Machines
|
# Cyclic Boosting Machines
|
||||||
|
|
||||||
[![PyPI version](https://badge.fury.io/py/pysarplus.svg)](https://badge.fury.io/py/cyclicbm)
|
![Build](https://github.com/Microsoft/cbm/actions/workflows/build.yml/badge.svg)
|
||||||
|
[![codecov](https://codecov.io/gh/microsoft/CBM/branch/main/graph/badge.svg?token=VRppFx2o8v)](https://codecov.io/gh/microsoft/CBM)
|
||||||
|
[![PyPI version](https://badge.fury.io/py/cyclicbm.svg)](https://badge.fury.io/py/cyclicbm)
|
||||||
[![Academic Paper](https://img.shields.io/badge/academic-paper-7fdcf7)](https://arxiv.org/abs/2002.03425)
|
[![Academic Paper](https://img.shields.io/badge/academic-paper-7fdcf7)](https://arxiv.org/abs/2002.03425)
|
||||||
|
|
||||||
This is an efficient and Scikit-learn compatible implementation of the machine learning algorithm [Cyclic Boosting -- an explainable supervised machine learning algorithm](https://arxiv.org/abs/2002.03425), specifically for predicting count-data, such as sales and demand.
|
This is an efficient and Scikit-learn compatible implementation of the machine learning algorithm [Cyclic Boosting -- an explainable supervised machine learning algorithm](https://arxiv.org/abs/2002.03425), specifically for predicting count-data, such as sales and demand.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install cyclicbm
|
||||||
|
```
|
||||||
|
|
||||||
```python
|
```python
|
||||||
import cbm
|
import cbm
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[build-system]
|
[build-system]
|
||||||
# These are the assumed default build requirements from pip:
|
# These are the assumed default build requirements from pip:
|
||||||
# https://pip.pypa.io/en/stable/reference/pip/#pep-517-and-518-support
|
# https://pip.pypa.io/en/stable/reference/pip/#pep-517-and-518-support
|
||||||
requires = ["setuptools>=40.8.0", "wheel"]
|
requires = ["setuptools>=40.8.0", "wheel", "pybind11", "numpy", "pandas", "scikit-learn", "lightgbm", "interpret"]
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
31
setup.py
31
setup.py
|
@ -2,7 +2,7 @@ import sysconfig
|
||||||
|
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
from setuptools.extension import Extension
|
from setuptools.extension import Extension
|
||||||
|
import platform
|
||||||
|
|
||||||
class get_pybind_include(object):
|
class get_pybind_include(object):
|
||||||
def __init__(self, user=False):
|
def __init__(self, user=False):
|
||||||
|
@ -13,11 +13,33 @@ class get_pybind_include(object):
|
||||||
|
|
||||||
return pybind11.get_include(self.user)
|
return pybind11.get_include(self.user)
|
||||||
|
|
||||||
|
def get_extra_compile_args():
|
||||||
|
if platform.system() == "Windows":
|
||||||
|
return ""
|
||||||
|
|
||||||
|
cflags = sysconfig.get_config_var("CFLAGS")
|
||||||
|
if cflags is None:
|
||||||
|
cflags = ""
|
||||||
|
|
||||||
|
return cflags.split() \
|
||||||
|
+ ["-std=c++11", "-Wall", "-Wextra", "-march=native", "-msse2", "-ffast-math", "-mfpmath=sse"]
|
||||||
|
|
||||||
|
def get_libraries():
|
||||||
|
if platform.system() == "Windows":
|
||||||
|
return []
|
||||||
|
|
||||||
|
return ["stdc++"]
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
this_directory = Path(__file__).parent
|
||||||
|
long_description = (this_directory / "README.md").read_text()
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="cyclicbm",
|
name="cyclicbm",
|
||||||
version="0.0.1",
|
version="0.0.2",
|
||||||
description="Cyclic Boosting Machines",
|
description="Cyclic Boosting Machines",
|
||||||
|
long_description=long_description,
|
||||||
|
long_description_content_type='text/markdown',
|
||||||
url="https://github.com/Microsoft/CBM",
|
url="https://github.com/Microsoft/CBM",
|
||||||
author="Markus Cozowicz",
|
author="Markus Cozowicz",
|
||||||
author_email="marcozo@microsoft.com",
|
author_email="marcozo@microsoft.com",
|
||||||
|
@ -41,9 +63,8 @@ setup(
|
||||||
"cbm_cpp",
|
"cbm_cpp",
|
||||||
["src/pycbm.cpp", "src/cbm.cpp"],
|
["src/pycbm.cpp", "src/cbm.cpp"],
|
||||||
include_dirs=[get_pybind_include(), get_pybind_include(user=True)],
|
include_dirs=[get_pybind_include(), get_pybind_include(user=True)],
|
||||||
extra_compile_args=sysconfig.get_config_var("CFLAGS").split()
|
extra_compile_args=get_extra_compile_args(),
|
||||||
+ ["-std=c++11", "-Wall", "-Wextra", "-march=native", "-msse2", "-ffast-math", "-mfpmath=sse"],
|
libraries=get_libraries(),
|
||||||
libraries=["stdc++"],
|
|
||||||
language="c++11",
|
language="c++11",
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
|
@ -20,24 +20,25 @@ namespace cbm {
|
||||||
double epsilon_early_stopping,
|
double epsilon_early_stopping,
|
||||||
bool single_update_per_iteration) {
|
bool single_update_per_iteration) {
|
||||||
|
|
||||||
// TODO: fix error messages
|
|
||||||
py::buffer_info y_info = y_b.request();
|
py::buffer_info y_info = y_b.request();
|
||||||
|
|
||||||
|
// this is broken on windows
|
||||||
if (y_info.format != py::format_descriptor<uint32_t>::format())
|
if (y_info.format != py::format_descriptor<uint32_t>::format())
|
||||||
throw std::runtime_error("Incompatible format: expected a y array!");
|
throw std::runtime_error("Incompatible format: expected a uint32 array for y!");
|
||||||
|
|
||||||
if (y_info.ndim != 1)
|
if (y_info.ndim != 1)
|
||||||
throw std::runtime_error("Incompatible buffer dimension!");
|
throw std::runtime_error("y must be 1-dimensional!");
|
||||||
|
|
||||||
py::buffer_info x_info = x_b.request();
|
py::buffer_info x_info = x_b.request();
|
||||||
if (x_info.format != py::format_descriptor<uint8_t>::format())
|
if (x_info.format != py::format_descriptor<uint8_t>::format())
|
||||||
throw std::runtime_error("Incompatible format: expected a x array!");
|
throw std::runtime_error("Incompatible format: expected a uint8 array x!");
|
||||||
|
|
||||||
if (x_info.ndim != 2)
|
if (x_info.ndim != 2)
|
||||||
throw std::runtime_error("Incompatible buffer dimension!");
|
throw std::runtime_error("Incompatible buffer dimension!");
|
||||||
|
|
||||||
py::buffer_info x_max_info = x_max_b.request();
|
py::buffer_info x_max_info = x_max_b.request();
|
||||||
if (x_max_info.format != py::format_descriptor<uint8_t>::format())
|
if (x_max_info.format != py::format_descriptor<uint8_t>::format())
|
||||||
throw std::runtime_error("Incompatible format: expected a x array!");
|
throw std::runtime_error("Incompatible format: expected a uint8 array for x_max!");
|
||||||
|
|
||||||
if (x_max_info.ndim != 1)
|
if (x_max_info.ndim != 1)
|
||||||
throw std::runtime_error("Incompatible buffer dimension!");
|
throw std::runtime_error("Incompatible buffer dimension!");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче