Ultra 0.9.4
Loading...
Searching...
No Matches
dataframe.h
Go to the documentation of this file.
1
12
13#if !defined(ULTRA_DATAFRAME_H)
14#define ULTRA_DATAFRAME_H
15
16#include "kernel/distribution.h"
17#include "kernel/exceptions.h"
18#include "kernel/problem.h"
21#include "utility/pocket_csv.h"
22
23#include <filesystem>
24#include <functional>
25#include <map>
26#include <optional>
27#include <set>
28#include <string>
29#include <vector>
30
31namespace tinyxml2 { class XMLDocument; }
32
33namespace ultra::src
34{
35
41using record_t = std::vector<value_t>;
42
43using raw_data = std::vector<record_t>;
44
53struct example
54{
60 std::vector<value_t> input {};
61
62 [[nodiscard]] bool operator==(const example &) const noexcept = default;
63};
64
65[[nodiscard]] class_t label(const src::example &);
66
75class dataframe
76{
77public:
78 // ---- Structures ----
79 struct params;
80
81 // ---- Aliases ----
82 using examples_t = std::vector<src::example>;
83 using value_type = examples_t::value_type;
84
85 // ---- Constructors ----
86 dataframe() = default;
87 explicit dataframe(std::istream &);
88 dataframe(std::istream &, const params &);
89 explicit dataframe(const std::filesystem::path &);
90 dataframe(const std::filesystem::path &, const params &);
91 template<DataframeMatrix R> dataframe(const R &);
92 template<DataframeMatrix R> dataframe(const R &, params);
93
94 // ---- Iterators ----
95 using iterator = examples_t::iterator;
96 using const_iterator = examples_t::const_iterator;
97 using difference_type = examples_t::difference_type;
98
99 [[nodiscard]] iterator begin() noexcept;
100 [[nodiscard]] const_iterator begin() const noexcept;
101 [[nodiscard]] iterator end() noexcept;
102 [[nodiscard]] const_iterator end() const noexcept;
103
104 // ---- Element access ----
105 [[nodiscard]] const value_type &front() const;
106 [[nodiscard]] value_type &front();
107
108 // ---- Modifiers ----
109 void clear();
110 iterator erase(iterator, iterator);
111 void push_back(src::example, bool = false);
112 template<std::input_iterator InputIt> iterator insert(const_iterator,
113 InputIt, InputIt);
114 void swap(dataframe &);
115
116 // ---- Convenience ----
117 std::size_t read(const std::filesystem::path &);
118 std::size_t read(const std::filesystem::path &, const params &);
119 std::size_t read(std::istream &);
120 std::size_t read(std::istream &, params);
121 template<DataframeMatrix R> std::size_t read(const R &);
122 template<DataframeMatrix R> std::size_t read(const R &, params);
123 [[nodiscard]] bool operator!() const noexcept;
124
125 bool clone_schema(const dataframe &);
126 bool set_schema(const std::vector<std::pair<std::string, domain_t>> &);
127
128 // ---- Capacity ----
129 [[nodiscard]] std::size_t size() const noexcept;
130 [[nodiscard]] bool empty() const noexcept;
131
132 [[nodiscard]] class_t classes() const noexcept;
133 [[nodiscard]] unsigned variables() const;
134
135 // ---- Misc ----
136 [[nodiscard]] std::string class_name(class_t) const noexcept;
137 [[nodiscard]] task_t task() const noexcept;
138
139 [[nodiscard]] bool is_valid() const;
140
141 // ---- Public data members ----
142 src::columns_info columns {};
143
144private:
145 template<DataframeRow R> bool read_record(R, std::optional<std::size_t>,
146 bool);
147
148 template<std::ranges::range R>
149 [[nodiscard]] example to_example(const R &) const;
150
151 [[nodiscard]] class_t encode(const value_t &);
152
153 std::size_t read_csv(const std::filesystem::path &, const params &);
154 std::size_t read_csv(std::istream &);
155 std::size_t read_csv(std::istream &, params);
156
157 std::size_t read_xrff(const std::filesystem::path &, const params &);
158 std::size_t read_xrff(std::istream &, params);
159 std::size_t read_xrff(tinyxml2::XMLDocument &, const params &);
160
161 // Integer are simpler to manage than textual data, so, when appropriate,
162 // input strings are converted into integers by this map and the `encode`
163 // static function.
164 std::map<std::string, class_t> classes_map_ {};
165
166 // Available data.
167 examples_t dataset_ {};
168};
169
170[[nodiscard]] domain_t from_weka(const std::string &);
171
178///
179///
180template<class T>
181[[nodiscard]] T label_as(const src::example &e)
182{
183 return lexical_cast<T>(e.output);
184}
185
187{
188 enum index : std::size_t {front = 0,
189 back = std::numeric_limits<std::size_t>::max() };
190
192 typing data_typing {typing::weak};
193
194 /// \remark
195 /// Used only when reading CSV files.
196 pocket_csv::dialect dialect {};
197
198
200 pocket_csv::parser::filter_hook_t filter {nullptr};
201
205 std::optional<std::size_t> output_index {0};
206
207 params &header() noexcept
208 { dialect.has_header = pocket_csv::dialect::HAS_HEADER; return *this; }
209 params &no_header() noexcept
210 { dialect.has_header = pocket_csv::dialect::NO_HEADER; return *this; }
211
212 params &output(std::size_t o) { output_index = o; return *this; }
213 params &no_output() noexcept { output_index = std::nullopt; return *this; }
214
215 params &strong_data_typing() noexcept
216 { data_typing = typing::strong; return *this; }
217 params &weak_data_typing() noexcept
218 { data_typing = typing::weak; return *this; }
219};
220
221std::ostream &operator<<(std::ostream &, const dataframe &);
222
242template<std::input_iterator InputIt>
243dataframe::iterator dataframe::insert(dataframe::const_iterator pos,
244 InputIt first, InputIt last)
245{
246 return dataset_.insert(pos, first, last);
247}
248
250
251} // namespace ultra::src
252
253#endif // include guard
std::size_t class_t
The type used as class ID in classification tasks.
Definition classification_result.h:22
Definition columns_info.h:110
Definition dataframe.h:76
unsigned variables() const
Definition dataframe.cc:273
class_t classes() const noexcept
Definition dataframe.cc:259
void clear()
Definition dataframe.cc:165
iterator erase(iterator, iterator)
Definition dataframe.cc:706
iterator begin() noexcept
Definition dataframe.cc:186
bool empty() const noexcept
Definition dataframe.cc:250
std::size_t size() const noexcept
Definition dataframe.cc:242
bool operator!() const noexcept
Definition dataframe.cc:694
bool set_schema(const std::vector< std::pair< std::string, domain_t > > &)
Definition dataframe.cc:740
const value_type & front() const
Definition dataframe.cc:222
iterator insert(const_iterator, InputIt, InputIt)
Definition dataframe.h:243
task_t task() const noexcept
Definition dataframe.cc:178
bool is_valid() const
Definition dataframe.cc:774
void push_back(src::example, bool=false)
Definition dataframe.cc:288
void swap(dataframe &)
Definition dataframe.cc:761
iterator end() noexcept
Definition dataframe.cc:202
bool clone_schema(const dataframe &)
Definition dataframe.cc:720
std::string class_name(class_t) const noexcept
Definition dataframe.cc:337
typing
Definition columns_info.h:49
task_t
Definition columns_info.h:58
domain_t from_weka(const std::string &n)
Definition dataframe.cc:98
T label_as(const src::example &e)
Definition dataframe.h:181
std::vector< value_t > record_t
Definition dataframe.h:41
std::variant< D_VOID, D_INT, D_DOUBLE, D_STRING, const D_NULLARY *, D_ADDRESS, const D_VARIABLE *, D_IVECTOR > value_t
Definition value.h:54
domain_t
Definition value.h:38
Definition dataframe.h:187
pocket_csv::dialect dialect
Definition dataframe.h:196
std::optional< std::size_t > output_index
Definition dataframe.h:205
typing data_typing
See typing for details.
Definition dataframe.h:192
pocket_csv::parser::filter_hook_t filter
Definition dataframe.h:200
Definition dataframe.h:54
value_t output
Definition dataframe.h:57
std::vector< value_t > input
Definition dataframe.h:60