Ultra 0.9.4
Loading...
Searching...
No Matches
dataframe.tcc
Go to the documentation of this file.
1
12
13#if !defined(ULTRA_DATAFRAME_H)
14# error "Don't include this file directly, include the specific .h instead"
15#endif
16
17#if !defined(ULTRA_DATAFRAME_TCC)
18#define ULTRA_DATAFRAME_TCC
19
20namespace internal
21{
22
23[[nodiscard]] inline value_t lexical_cast(value_t v, domain_t d)
24{
25 switch (d)
26 {
27 case d_int: return lexical_cast<D_INT>(v);
28 case d_double: return lexical_cast<D_DOUBLE>(v);
29 case d_string: return lexical_cast<D_STRING>(v);
30 default: throw exception::data_format("Invalid domain for lexical_cast");
31 }
32}
33
34template<class T>
35void inplace_trim(T &v)
36{
37 if constexpr (std::same_as<T, std::string>)
38 v = trim(v);
39
40 if constexpr (std::same_as<T, value_t>)
41 if (auto *p = std::get_if<D_STRING>(&v))
42 *p = trim(*p);
43}
44
45} // namespace internal
46
51template<std::ranges::range R>
52example dataframe::to_example(const R &r) const
53{
54 Expects(!std::ranges::empty(r));
55 Expects(static_cast<std::size_t>(std::ranges::distance(r)) == columns.size());
56
57 example ret;
58 ret.input.reserve(columns.size() - 1);
59
60 for (std::size_t i(0); auto feature : r)
61 {
62 if (const auto domain(columns[i].domain()); domain != d_void)
63 {
64 assert(basic_data_type(domain));
65 internal::inplace_trim(feature);
66
67 if (i == 0)
68 {
69 if (task() == task_t::classification)
70 ret.output = feature;
71 else
72 ret.output = internal::lexical_cast(feature, domain);
73 }
74 else // input value
75 ret.input.push_back(internal::lexical_cast(feature, domain));
76 }
77
78 ++i;
79 }
80
81 return ret;
82}
83
91template<DataframeRow R>
92bool dataframe::read_record(R r, std::optional<std::size_t> output_index,
93 bool add_instance)
94{
95 Expects(!std::ranges::empty(r));
96
97 const std::size_t row_size(std::ranges::distance(r));
98
99 if (output_index && *output_index >= row_size)
100 {
101 ultraWARNING("Malformed example {} skipped (wrong column count)",
102 size());
103 return false;
104 }
105
106 const auto logical_size(
107 internal::normalised_column_count(row_size, output_index));
108
109 if (logical_size != columns.size())
110 {
111 ultraWARNING("Malformed example {} skipped (wrong column count)",
112 size());
113 return false;
114 }
115
116 const internal::normalised_row_view normalised(r, output_index);
117
118 push_back(to_example(normalised), add_instance);
119 return true;
120}
121
134template<DataframeMatrix R>
135std::size_t dataframe::read(const R &container, params p)
136{
137 columns.data_typing(p.data_typing);
138
139 clear();
140
141 if (std::ranges::size(container) <= 1)
142 return 0;
143
144 auto first(std::ranges::begin(container));
145
146 if (p.output_index == params::index::back)
147 p.output_index = std::ranges::size(*first) - 1;
148
149 columns.build(container, p.output_index);
150
151 for (auto it(std::next(first)); it != std::ranges::end(container); ++it)
152 read_record(*it, p.output_index, true);
153
154 if (!is_valid())
155 throw exception::insufficient_data("Empty / invalid data table");
156
157 return size();
158}
159
160template<DataframeMatrix R> std::size_t dataframe::read(const R &container)
161{
162 return read(container, {});
163}
164
177template<DataframeMatrix R> dataframe::dataframe(const R &t, params p)
178{
179 read(t, p);
180 Ensures(is_valid());
181}
182
193template<DataframeMatrix R> dataframe::dataframe(const R &t)
194 : dataframe(t, {})
195{
196}
197
198#endif // include guard
Definition exceptions.h:32
void clear()
Definition dataframe.cc:165
std::size_t size() const noexcept
Definition dataframe.cc:242
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
bool basic_data_type(domain_t d) noexcept
Definition value.cc:40
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
Definition dataframe.h:187
std::optional< std::size_t > output_index
Definition dataframe.h:205
typing data_typing
See typing for details.
Definition dataframe.h:192
Definition dataframe.h:54
value_t output
Definition dataframe.h:57
std::vector< value_t > input
Definition dataframe.h:60