Fix parsing empty vector in parameter. (#5087)
This commit is contained in:
parent
f5e13dcb9b
commit
df9bdbbcb9
@ -45,6 +45,7 @@
|
|||||||
|
|
||||||
// tress
|
// tress
|
||||||
#include "../src/tree/split_evaluator.cc"
|
#include "../src/tree/split_evaluator.cc"
|
||||||
|
#include "../src/tree/param.cc"
|
||||||
#include "../src/tree/tree_model.cc"
|
#include "../src/tree/tree_model.cc"
|
||||||
#include "../src/tree/tree_updater.cc"
|
#include "../src/tree/tree_updater.cc"
|
||||||
#include "../src/tree/updater_colmaker.cc"
|
#include "../src/tree/updater_colmaker.cc"
|
||||||
|
|||||||
81
src/tree/param.cc
Normal file
81
src/tree/param.cc
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright by Contributors 2019
|
||||||
|
*/
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "param.h"
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
std::istream &operator>>(std::istream &is, std::vector<int> &t) {
|
||||||
|
t.clear();
|
||||||
|
// get (
|
||||||
|
while (true) {
|
||||||
|
char ch = is.peek();
|
||||||
|
if (isdigit(ch)) {
|
||||||
|
int idx;
|
||||||
|
if (is >> idx) {
|
||||||
|
t.emplace_back(idx);
|
||||||
|
}
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
is.get();
|
||||||
|
if (ch == '(') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!isspace(ch)) {
|
||||||
|
is.setstate(std::ios::failbit);
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int idx;
|
||||||
|
std::vector<int> tmp;
|
||||||
|
while (true) {
|
||||||
|
char ch = is.peek();
|
||||||
|
if (isspace(ch)) {
|
||||||
|
is.get();
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is.peek() == ')') {
|
||||||
|
is.get();
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
while (is >> idx) {
|
||||||
|
tmp.push_back(idx);
|
||||||
|
char ch;
|
||||||
|
do {
|
||||||
|
ch = is.get();
|
||||||
|
} while (isspace(ch));
|
||||||
|
if (ch == 'L') {
|
||||||
|
ch = is.get();
|
||||||
|
}
|
||||||
|
if (ch == ',') {
|
||||||
|
while (true) {
|
||||||
|
ch = is.peek();
|
||||||
|
if (isspace(ch)) {
|
||||||
|
is.get();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ch == ')') {
|
||||||
|
is.get();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ch == ')') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (ch == ')') {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
is.setstate(std::ios::failbit);
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t = std::move(tmp);
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
} // namespace std
|
||||||
@ -495,63 +495,7 @@ inline std::ostream &operator<<(std::ostream &os, const std::vector<int> &t) {
|
|||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::istream &operator>>(std::istream &is, std::vector<int> &t) {
|
std::istream &operator>>(std::istream &is, std::vector<int> &t);
|
||||||
// get (
|
|
||||||
while (true) {
|
|
||||||
char ch = is.peek();
|
|
||||||
if (isdigit(ch)) {
|
|
||||||
int idx;
|
|
||||||
if (is >> idx) {
|
|
||||||
t.assign(&idx, &idx + 1);
|
|
||||||
}
|
|
||||||
return is;
|
|
||||||
}
|
|
||||||
is.get();
|
|
||||||
if (ch == '(') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!isspace(ch)) {
|
|
||||||
is.setstate(std::ios::failbit);
|
|
||||||
return is;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int idx;
|
|
||||||
std::vector<int> tmp;
|
|
||||||
while (is >> idx) {
|
|
||||||
tmp.push_back(idx);
|
|
||||||
char ch;
|
|
||||||
do {
|
|
||||||
ch = is.get();
|
|
||||||
} while (isspace(ch));
|
|
||||||
if (ch == 'L') {
|
|
||||||
ch = is.get();
|
|
||||||
}
|
|
||||||
if (ch == ',') {
|
|
||||||
while (true) {
|
|
||||||
ch = is.peek();
|
|
||||||
if (isspace(ch)) {
|
|
||||||
is.get();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (ch == ')') {
|
|
||||||
is.get();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ch == ')') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (ch == ')') {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
is.setstate(std::ios::failbit);
|
|
||||||
return is;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
t.assign(tmp.begin(), tmp.end());
|
|
||||||
return is;
|
|
||||||
}
|
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
#endif // XGBOOST_TREE_PARAM_H_
|
#endif // XGBOOST_TREE_PARAM_H_
|
||||||
|
|||||||
@ -74,6 +74,12 @@ TEST(Param, VectorStreamRead) {
|
|||||||
ss << "(3,2,1";
|
ss << "(3,2,1";
|
||||||
ss >> vals_in;
|
ss >> vals_in;
|
||||||
EXPECT_NE(vals_in, vals);
|
EXPECT_NE(vals_in, vals);
|
||||||
|
|
||||||
|
vals_in.clear(); ss.flush(); ss.clear(); ss.str("");
|
||||||
|
vals_in.emplace_back(3);
|
||||||
|
ss << "( )";
|
||||||
|
ss >> vals_in;
|
||||||
|
ASSERT_TRUE(ss.good());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(Param, SplitEntry) {
|
TEST(Param, SplitEntry) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user