Compare commits

...

7 Commits

Author SHA1 Message Date
Hyunsu Cho
74e2f652de Enforce only major version in JSON model schema 2020-02-21 07:57:45 +00:00
Hyunsu Cho
e02fff53f2 Change version_config.h too 2020-02-21 07:50:41 +00:00
Hyunsu Cho
fcb2efbadd Fix a unit test that mistook MINOR ver for PATCH ver 2020-02-21 07:11:59 +00:00
Hyunsu Cho
f4621f09c7 Release 1.0.1 to add #5330 2020-02-20 22:56:32 -08:00
Philip Hyunsu Cho
bf1b2cbfa2 Remove f-string, since it's not supported by Python 3.5 (#5330)
* Remove f-string, since it's not supported by Python 3.5

* Add Python 3.5 to CI, to ensure compatibility

* Remove duplicated matplotlib

* Show deprecation notice for Python 3.5

* Fix lint

* Fix lint
2020-02-20 22:47:05 -08:00
Hyunsu Cho
d90e7b3117 Change version to 1.0.0 2020-02-20 05:02:47 +00:00
Jiaming Yuan
088c43d666 Fix changing locale. (#5314)
* Fix changing locale.

* Don't use locale guard.

As number parsing is implemented in house, we don't need locale.

* Update doc.
2020-02-17 13:01:48 +08:00
19 changed files with 87 additions and 67 deletions

View File

@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.12) cmake_minimum_required(VERSION 3.12)
project(xgboost LANGUAGES CXX C VERSION 1.0.0) project(xgboost LANGUAGES CXX C VERSION 1.0.1)
include(cmake/Utils.cmake) include(cmake/Utils.cmake)
list(APPEND CMAKE_MODULE_PATH "${xgboost_SOURCE_DIR}/cmake/modules") list(APPEND CMAKE_MODULE_PATH "${xgboost_SOURCE_DIR}/cmake/modules")
cmake_policy(SET CMP0022 NEW) cmake_policy(SET CMP0022 NEW)

1
Jenkinsfile vendored
View File

@@ -273,6 +273,7 @@ def TestPythonCPU() {
def docker_binary = "docker" def docker_binary = "docker"
sh """ sh """
${dockerRun} ${container_type} ${docker_binary} tests/ci_build/test_python.sh cpu ${dockerRun} ${container_type} ${docker_binary} tests/ci_build/test_python.sh cpu
${dockerRun} ${container_type} ${docker_binary} tests/ci_build/test_python.sh cpu-py35
""" """
deleteDir() deleteDir()
} }

View File

@@ -1 +1 @@
@xgboost_VERSION_MAJOR@.@xgboost_VERSION_MINOR@.@xgboost_VERSION_PATCH@rc2 @xgboost_VERSION_MAJOR@.@xgboost_VERSION_MINOR@.@xgboost_VERSION_PATCH@

View File

@@ -195,12 +195,22 @@
"properties": { "properties": {
"version": { "version": {
"type": "array", "type": "array",
"const": [ "items": [
1, {
0, "type": "number",
0 "const": 1
},
{
"type": "number",
"minimum": 0
},
{
"type": "number",
"minimum": 0
}
], ],
"additionalItems": false "minItems": 3,
"maxItems": 3
}, },
"learner": { "learner": {
"type": "object", "type": "object",

View File

@@ -195,7 +195,9 @@ You can load it back to the model generated by same version of XGBoost by:
bst.load_config(config) bst.load_config(config)
This way users can study the internal representation more closely. This way users can study the internal representation more closely. Please note that some
JSON generators make use of locale dependent floating point serialization methods, which
is not supported by XGBoost.
************ ************
Future Plans Future Plans

View File

@@ -6,6 +6,6 @@
#define XGBOOST_VER_MAJOR 1 #define XGBOOST_VER_MAJOR 1
#define XGBOOST_VER_MINOR 0 #define XGBOOST_VER_MINOR 0
#define XGBOOST_VER_PATCH 0 #define XGBOOST_VER_PATCH 1
#endif // XGBOOST_VERSION_CONFIG_H_ #endif // XGBOOST_VERSION_CONFIG_H_

View File

@@ -6,7 +6,7 @@
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost-jvm_2.12</artifactId> <artifactId>xgboost-jvm_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>XGBoost JVM Package</name> <name>XGBoost JVM Package</name>
<description>JVM Package for XGBoost</description> <description>JVM Package for XGBoost</description>

View File

@@ -6,10 +6,10 @@
<parent> <parent>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost-jvm_2.12</artifactId> <artifactId>xgboost-jvm_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</parent> </parent>
<artifactId>xgboost4j-example_2.12</artifactId> <artifactId>xgboost4j-example_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<build> <build>
<plugins> <plugins>
@@ -26,7 +26,7 @@
<dependency> <dependency>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost4j-spark_${scala.binary.version}</artifactId> <artifactId>xgboost4j-spark_${scala.binary.version}</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.spark</groupId> <groupId>org.apache.spark</groupId>
@@ -37,7 +37,7 @@
<dependency> <dependency>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost4j-flink_${scala.binary.version}</artifactId> <artifactId>xgboost4j-flink_${scala.binary.version}</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>

View File

@@ -6,10 +6,10 @@
<parent> <parent>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost-jvm_2.12</artifactId> <artifactId>xgboost-jvm_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</parent> </parent>
<artifactId>xgboost4j-flink_2.12</artifactId> <artifactId>xgboost4j-flink_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
@@ -26,7 +26,7 @@
<dependency> <dependency>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost4j_${scala.binary.version}</artifactId> <artifactId>xgboost4j_${scala.binary.version}</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost-jvm_2.12</artifactId> <artifactId>xgboost-jvm_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</parent> </parent>
<artifactId>xgboost4j-spark_2.12</artifactId> <artifactId>xgboost4j-spark_2.12</artifactId>
<build> <build>
@@ -24,7 +24,7 @@
<dependency> <dependency>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost4j_${scala.binary.version}</artifactId> <artifactId>xgboost4j_${scala.binary.version}</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.spark</groupId> <groupId>org.apache.spark</groupId>

View File

@@ -6,10 +6,10 @@
<parent> <parent>
<groupId>ml.dmlc</groupId> <groupId>ml.dmlc</groupId>
<artifactId>xgboost-jvm_2.12</artifactId> <artifactId>xgboost-jvm_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
</parent> </parent>
<artifactId>xgboost4j_2.12</artifactId> <artifactId>xgboost4j_2.12</artifactId>
<version>1.0.0-RC2</version> <version>1.0.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<dependencies> <dependencies>

View File

@@ -1 +1 @@
1.0.0rc2 1.0.1

View File

@@ -5,6 +5,8 @@ Contributors: https://github.com/dmlc/xgboost/blob/master/CONTRIBUTORS.md
""" """
import os import os
import sys
import warnings
from .core import DMatrix, Booster from .core import DMatrix, Booster
from .training import train, cv from .training import train, cv
@@ -19,6 +21,12 @@ try:
except ImportError: except ImportError:
pass pass
if sys.version_info[:2] == (3, 5):
warnings.warn(
'Python 3.5 support is deprecated; XGBoost will require Python 3.6+ in the near future. ' +
'Consider upgrading to Python 3.6+.',
FutureWarning)
VERSION_FILE = os.path.join(os.path.dirname(__file__), 'VERSION') VERSION_FILE = os.path.join(os.path.dirname(__file__), 'VERSION')
with open(VERSION_FILE) as f: with open(VERSION_FILE) as f:
__version__ = f.read().strip() __version__ = f.read().strip()

View File

@@ -434,8 +434,8 @@ class XGBModel(XGBModelBase):
self.classes_ = np.array(v) self.classes_ = np.array(v)
continue continue
if k == 'type' and type(self).__name__ != v: if k == 'type' and type(self).__name__ != v:
msg = f'Current model type: {type(self).__name__}, ' + \ msg = 'Current model type: {}, '.format(type(self).__name__) + \
f'type of model in file: {v}' 'type of model in file: {}'.format(v)
raise TypeError(msg) raise TypeError(msg)
if k == 'type': if k == 'type':
continue continue

View File

@@ -2,6 +2,7 @@
* Copyright (c) by Contributors 2019 * Copyright (c) by Contributors 2019
*/ */
#include <cctype> #include <cctype>
#include <locale>
#include <sstream> #include <sstream>
#include <limits> #include <limits>
#include <cmath> #include <cmath>
@@ -692,47 +693,23 @@ Json JsonReader::ParseBoolean() {
return Json{JsonBoolean{result}}; return Json{JsonBoolean{result}};
} }
// This is an ad-hoc solution for writing numeric value in standard way. We need to add
// a locale independent way of writing stream like `std::{from, to}_chars' from C++-17.
// FIXME(trivialfis): Remove this.
class GlobalCLocale {
std::locale ori_;
public:
GlobalCLocale() : ori_{std::locale()} {
std::string const name {"C"};
try {
std::locale::global(std::locale(name.c_str()));
} catch (std::runtime_error const& e) {
LOG(FATAL) << "Failed to set locale: " << name;
}
}
~GlobalCLocale() {
std::locale::global(ori_);
}
};
Json Json::Load(StringView str) { Json Json::Load(StringView str) {
GlobalCLocale guard;
JsonReader reader(str); JsonReader reader(str);
Json json{reader.Load()}; Json json{reader.Load()};
return json; return json;
} }
Json Json::Load(JsonReader* reader) { Json Json::Load(JsonReader* reader) {
GlobalCLocale guard;
Json json{reader->Load()}; Json json{reader->Load()};
return json; return json;
} }
void Json::Dump(Json json, std::ostream *stream, bool pretty) { void Json::Dump(Json json, std::ostream *stream, bool pretty) {
GlobalCLocale guard;
JsonWriter writer(stream, pretty); JsonWriter writer(stream, pretty);
writer.Save(json); writer.Save(json);
} }
void Json::Dump(Json json, std::string* str, bool pretty) { void Json::Dump(Json json, std::string* str, bool pretty) {
GlobalCLocale guard;
std::stringstream ss; std::stringstream ss;
JsonWriter writer(&ss, pretty); JsonWriter writer(&ss, pretty);
writer.Save(json); writer.Save(json);

View File

@@ -3,6 +3,7 @@ ARG CMAKE_VERSION=3.12
# Environment # Environment
ENV DEBIAN_FRONTEND noninteractive ENV DEBIAN_FRONTEND noninteractive
SHELL ["/bin/bash", "-c"] # Use Bash as shell
# Install all basic requirements # Install all basic requirements
RUN \ RUN \
@@ -19,10 +20,16 @@ ENV PATH=/opt/python/bin:$PATH
ENV GOSU_VERSION 1.10 ENV GOSU_VERSION 1.10
# Install Python packages # Create new Conda environment with Python 3.5
RUN conda create -n py35 python=3.5 && \
source activate py35 && \
pip install numpy pytest scipy scikit-learn pandas matplotlib wheel kubernetes urllib3 graphviz && \
source deactivate
# Install Python packages in default env
RUN \ RUN \
pip install pyyaml cpplint pylint astroid sphinx numpy scipy pandas matplotlib sh \ pip install pyyaml cpplint pylint astroid sphinx numpy scipy pandas matplotlib sh \
recommonmark guzzle_sphinx_theme mock breathe matplotlib graphviz \ recommonmark guzzle_sphinx_theme mock breathe graphviz \
pytest scikit-learn wheel kubernetes urllib3 jsonschema boto3 && \ pytest scikit-learn wheel kubernetes urllib3 jsonschema boto3 && \
pip install https://h2o-release.s3.amazonaws.com/datatable/stable/datatable-0.7.0/datatable-0.7.0-cp37-cp37m-linux_x86_64.whl && \ pip install https://h2o-release.s3.amazonaws.com/datatable/stable/datatable-0.7.0/datatable-0.7.0-cp37-cp37m-linux_x86_64.whl && \
pip install "dask[complete]" pip install "dask[complete]"

View File

@@ -5,31 +5,35 @@ set -x
suite=$1 suite=$1
# Install XGBoost Python package # Install XGBoost Python package
wheel_found=0 function install_xgboost {
for file in python-package/dist/*.whl wheel_found=0
do for file in python-package/dist/*.whl
if [ -e "${file}" ] do
if [ -e "${file}" ]
then
pip install --user "${file}"
wheel_found=1
break # need just one
fi
done
if [ "$wheel_found" -eq 0 ]
then then
pip install --user "${file}" pushd .
wheel_found=1 cd python-package
break # need just one python setup.py install --user
popd
fi fi
done }
if [ "$wheel_found" -eq 0 ]
then
pushd .
cd python-package
python setup.py install --user
popd
fi
# Run specified test suite # Run specified test suite
case "$suite" in case "$suite" in
gpu) gpu)
install_xgboost
pytest -v -s --fulltrace -m "not mgpu" tests/python-gpu pytest -v -s --fulltrace -m "not mgpu" tests/python-gpu
;; ;;
mgpu) mgpu)
install_xgboost
pytest -v -s --fulltrace -m "mgpu" tests/python-gpu pytest -v -s --fulltrace -m "mgpu" tests/python-gpu
cd tests/distributed cd tests/distributed
./runtests-gpu.sh ./runtests-gpu.sh
@@ -39,17 +43,25 @@ case "$suite" in
cudf) cudf)
source activate cudf_test source activate cudf_test
install_xgboost
pytest -v -s --fulltrace -m "not mgpu" tests/python-gpu/test_from_columnar.py tests/python-gpu/test_from_cupy.py pytest -v -s --fulltrace -m "not mgpu" tests/python-gpu/test_from_columnar.py tests/python-gpu/test_from_cupy.py
;; ;;
cpu) cpu)
install_xgboost
pytest -v -s --fulltrace tests/python pytest -v -s --fulltrace tests/python
cd tests/distributed cd tests/distributed
./runtests.sh ./runtests.sh
;; ;;
cpu-py35)
source activate py35
install_xgboost
pytest -v -s --fulltrace tests/python
;;
*) *)
echo "Usage: $0 {gpu|mgpu|cudf|cpu}" echo "Usage: $0 {gpu|mgpu|cudf|cpu|cpu-py35}"
exit 1 exit 1
;; ;;
esac esac

View File

@@ -54,7 +54,7 @@ TEST(Version, Basic) {
ptr = 0; ptr = 0;
v = std::stoi(str, &ptr); v = std::stoi(str, &ptr);
ASSERT_EQ(v, XGBOOST_VER_MINOR) << "patch: " << v;; ASSERT_EQ(v, XGBOOST_VER_PATCH) << "patch: " << v;;
str = str.substr(ptr); str = str.substr(ptr);
ASSERT_EQ(str.size(), 0); ASSERT_EQ(str.size(), 0);

View File

@@ -5,6 +5,7 @@ import os
import json import json
import testing as tm import testing as tm
import pytest import pytest
import locale
dpath = 'demo/data/' dpath = 'demo/data/'
dtrain = xgb.DMatrix(dpath + 'agaricus.txt.train') dtrain = xgb.DMatrix(dpath + 'agaricus.txt.train')
@@ -300,6 +301,7 @@ class TestModels(unittest.TestCase):
'reg_loss_param']['scale_pos_weight']) == 0.5 'reg_loss_param']['scale_pos_weight']) == 0.5
def test_model_json_io(self): def test_model_json_io(self):
loc = locale.getpreferredencoding(False)
model_path = 'test_model_json_io.json' model_path = 'test_model_json_io.json'
parameters = {'tree_method': 'hist', 'booster': 'gbtree'} parameters = {'tree_method': 'hist', 'booster': 'gbtree'}
j_model = json_model(model_path, parameters) j_model = json_model(model_path, parameters)
@@ -313,6 +315,7 @@ class TestModels(unittest.TestCase):
assert isinstance(j_model['learner'], dict) assert isinstance(j_model['learner'], dict)
os.remove(model_path) os.remove(model_path)
assert locale.getpreferredencoding(False) == loc
@pytest.mark.skipif(**tm.no_json_schema()) @pytest.mark.skipif(**tm.no_json_schema())
def test_json_schema(self): def test_json_schema(self):