* Extend array interface to handle ndarray. The `ArrayInterface` class is extended to support multi-dim array inputs. Previously this class handles only 2-dim (vector is also matrix). This PR specifies the expected dimension at compile-time and the array interface can perform various checks automatically for input data. Also, adapters like CSR are more rigorous about their input. Lastly, row vector and column vector are handled without intervention from the caller.
86 lines
2.7 KiB
C++
86 lines
2.7 KiB
C++
// Copyright (c) 2019 by Contributors
|
|
#include <gtest/gtest.h>
|
|
#include <xgboost/data.h>
|
|
#include <xgboost/json.h>
|
|
#include <thrust/device_vector.h>
|
|
|
|
#include <memory>
|
|
#include "../../../src/common/bitfield.h"
|
|
#include "../../../src/common/device_helpers.cuh"
|
|
|
|
namespace xgboost {
|
|
|
|
template <typename T>
|
|
Json GenerateDenseColumn(std::string const& typestr, size_t kRows,
|
|
thrust::device_vector<T>* out_d_data) {
|
|
auto& d_data = *out_d_data;
|
|
d_data.resize(kRows);
|
|
Json column { Object() };
|
|
std::vector<Json> j_shape {Json(Integer(static_cast<Integer::Int>(kRows)))};
|
|
column["shape"] = Array(j_shape);
|
|
column["strides"] = Array(std::vector<Json>{Json(Integer(static_cast<Integer::Int>(sizeof(T))))});
|
|
column["stream"] = nullptr;
|
|
|
|
d_data.resize(kRows);
|
|
thrust::sequence(thrust::device, d_data.begin(), d_data.end(), 0.0f, 2.0f);
|
|
|
|
auto p_d_data = d_data.data().get();
|
|
|
|
std::vector<Json> j_data {
|
|
Json(Integer(reinterpret_cast<Integer::Int>(p_d_data))),
|
|
Json(Boolean(false))};
|
|
column["data"] = j_data;
|
|
|
|
column["version"] = 3;
|
|
column["typestr"] = String(typestr);
|
|
return column;
|
|
}
|
|
|
|
template <typename T>
|
|
Json GenerateSparseColumn(std::string const& typestr, size_t kRows,
|
|
thrust::device_vector<T>* out_d_data) {
|
|
auto& d_data = *out_d_data;
|
|
Json column { Object() };
|
|
std::vector<Json> j_shape {Json(Integer(static_cast<Integer::Int>(kRows)))};
|
|
column["shape"] = Array(j_shape);
|
|
column["strides"] = Array(std::vector<Json>{Json(Integer(static_cast<Integer::Int>(sizeof(T))))});
|
|
column["stream"] = nullptr;
|
|
|
|
d_data.resize(kRows);
|
|
for (size_t i = 0; i < d_data.size(); ++i) {
|
|
d_data[i] = i * 2.0;
|
|
}
|
|
|
|
auto p_d_data = d_data.data().get();
|
|
|
|
std::vector<Json> j_data {
|
|
Json(Integer(reinterpret_cast<Integer::Int>(p_d_data))),
|
|
Json(Boolean(false))};
|
|
column["data"] = j_data;
|
|
|
|
column["version"] = 3;
|
|
column["typestr"] = String(typestr);
|
|
return column;
|
|
}
|
|
|
|
template <typename T>
|
|
Json Generate2dArrayInterface(int rows, int cols, std::string typestr,
|
|
thrust::device_vector<T> *p_data) {
|
|
auto& data = *p_data;
|
|
thrust::sequence(data.begin(), data.end());
|
|
|
|
Json array_interface{Object()};
|
|
std::vector<Json> shape = {Json(static_cast<Integer::Int>(rows)),
|
|
Json(static_cast<Integer::Int>(cols))};
|
|
array_interface["shape"] = Array(shape);
|
|
std::vector<Json> j_data{
|
|
Json(Integer(reinterpret_cast<Integer::Int>(data.data().get()))),
|
|
Json(Boolean(false))};
|
|
array_interface["data"] = j_data;
|
|
array_interface["version"] = 3;
|
|
array_interface["typestr"] = String(typestr);
|
|
array_interface["stream"] = nullptr;
|
|
return array_interface;
|
|
}
|
|
} // namespace xgboost
|