#pragma once
#include <map>
#include <memory>
#include <string>
#include <variant>
#include "ellpack_page_source.h"
#include "gradient_index_page_source.h"
#include "quantile_dmatrix.h"
#include "xgboost/base.h"
#include "xgboost/c_api.h"
#include "xgboost/context.h"
#include "xgboost/data.h"
namespace xgboost::data {
class ExtMemQuantileDMatrix : public QuantileDMatrix {
public:
ExtMemQuantileDMatrix(DataIterHandle iter_handle, DMatrixHandle proxy,
std::shared_ptr<DMatrix> ref, DataIterResetCallback *reset,
XGDMatrixCallbackNext *next, bst_bin_t max_bin,
std::int64_t max_quantile_blocks, ExtMemConfig const &config);
~ExtMemQuantileDMatrix() override;
[[nodiscard]] std::int32_t NumBatches() const override { return n_batches_; }
private:
void InitFromCPU(
Context const *ctx,
std::shared_ptr<DataIterProxy<DataIterResetCallback, XGDMatrixCallbackNext>> iter,
DMatrixHandle proxy, BatchParam const &p, float missing, std::shared_ptr<DMatrix> ref);
void InitFromCUDA(
Context const *ctx,
std::shared_ptr<DataIterProxy<DataIterResetCallback, XGDMatrixCallbackNext>> iter,
DMatrixHandle proxy_handle, BatchParam const &p, std::shared_ptr<DMatrix> ref,
std::int64_t max_quantile_blocks,
ExtMemConfig const &config);
[[nodiscard]] BatchSet<GHistIndexMatrix> GetGradientIndexImpl();
BatchSet<GHistIndexMatrix> GetGradientIndex(Context const *ctx, BatchParam const ¶m) override;
[[nodiscard]] BatchSet<EllpackPage> GetEllpackPageImpl();
BatchSet<EllpackPage> GetEllpackBatches(Context const *ctx, const BatchParam ¶m) override;
[[nodiscard]] bool EllpackExists() const override {
return std::visit([](auto &&v) { return static_cast<bool>(v); }, ellpack_page_source_);
}
[[nodiscard]] bool GHistIndexExists() const override {
return static_cast<bool>(ghist_index_source_);
}
[[nodiscard]] BatchSet<ExtSparsePage> GetExtBatches(Context const *ctx,
BatchParam const ¶m) override;
std::map<std::string, std::shared_ptr<Cache>> cache_info_;
std::string cache_prefix_;
bool const on_host_;
BatchParam batch_;
bst_idx_t n_batches_{0};
using EllpackDiskPtr = std::shared_ptr<ExtEllpackPageSource>;
using EllpackHostPtr = std::shared_ptr<ExtEllpackPageHostSource>;
std::variant<EllpackDiskPtr, EllpackHostPtr> ellpack_page_source_;
std::shared_ptr<ExtGradientIndexPageSource> ghist_index_source_;
};
}