18 namespace neural_net {
24 virtual ~float_array() =
default;
30 virtual const float* data()
const = 0;
35 virtual size_t size()
const = 0;
39 virtual const size_t* shape()
const = 0;
42 virtual size_t dim()
const = 0;
48 class external_float_array:
public float_array {
50 external_float_array(
const float* data,
size_t size,
const size_t* shape,
53 explicit external_float_array(
const float_array& array)
54 : external_float_array(array.data(), array.size(), array.shape(),
58 const float* data()
const override {
return data_; }
59 size_t size()
const override {
return size_; }
61 const size_t* shape()
const override {
return shape_; }
62 size_t dim()
const override {
return dim_; }
65 const float* data_ =
nullptr;
68 const size_t* shape_ =
nullptr;
74 class float_buffer:
public float_array {
77 float_buffer(
const float* data, std::vector<size_t> shape);
81 float_buffer(std::vector<float> data, std::vector<size_t> shape);
84 float_buffer(
const float_array& other)
85 : float_buffer(other.data(),
86 std::vector<size_t>(other.shape(),
87 other.shape() + other.dim()))
90 const float* data()
const override {
return data_.data(); }
91 size_t size()
const override {
return size_; }
93 const size_t* shape()
const override {
return shape_.data(); }
94 size_t dim()
const override {
return shape_.size(); }
97 std::vector<size_t> shape_;
99 std::vector<float> data_;
103 class float_scalar:
public float_array {
105 float_scalar() =
default;
107 float_scalar(
float value): value_(value) {}
109 const float* data()
const override {
return &value_; }
110 size_t size()
const override {
return 1; }
112 const size_t* shape()
const override {
return nullptr; }
113 size_t dim()
const override {
return 0; }
123 class shared_float_array:
public float_array {
126 static shared_float_array
copy(
const float* data, std::vector<size_t> shape) {
127 return shared_float_array(
128 std::make_shared<float_buffer>(data, std::move(shape)));
130 static shared_float_array
copy(
const float_array& other) {
131 return shared_float_array(std::make_shared<float_buffer>(other));
133 static shared_float_array wrap(std::vector<float> data,
134 std::vector<size_t> shape) {
135 return shared_float_array(
136 std::make_shared<float_buffer>(std::move(data), std::move(shape)));
138 static shared_float_array wrap(
float value) {
139 return shared_float_array(std::make_shared<float_scalar>(value));
143 explicit shared_float_array(std::shared_ptr<float_array> impl)
144 : shared_float_array(impl, 0, impl->shape(), impl->dim())
148 shared_float_array(): shared_float_array(default_value()) {}
150 const float* data()
const override {
return impl_->data() + offset_; }
151 size_t size()
const override {
return size_; }
153 const size_t* shape()
const override {
return shape_; }
154 size_t dim()
const override {
return dim_; }
157 shared_float_array operator[](
size_t idx)
const;
162 shared_float_array(std::shared_ptr<float_array> impl,
size_t offset,
163 const size_t* shape,
size_t dim);
166 static std::shared_ptr<float_array> default_value();
168 std::shared_ptr<float_array> impl_;
171 const size_t* shape_ =
nullptr;
177 class deferred_float_array:
public float_array {
181 deferred_float_array(std::shared_future<shared_float_array> data_future,
182 std::vector<size_t> shape);
185 deferred_float_array(shared_float_array params);
188 const float* data()
const override;
191 size_t size()
const override {
return size_; }
192 const size_t* shape()
const override {
return shape_.data(); }
193 size_t dim()
const override {
return shape_.size(); }
196 std::shared_future<shared_float_array> data_future_;
197 std::vector<size_t> shape_;
202 using float_array_map = std::map<std::string, shared_float_array>;
204 std::ostream &operator<<(std::ostream &out,
const float_array &arr);
void copy(Iterator begin, Iterator end, SWriter &&writer)