50#ifndef DOXYGEN_SHOULD_SKIP_THIS
63 _translators_(translators) {
64 if (translators.size()) {
66 std::vector< std::string > var_names(translators.size());
67 for (std::size_t i = std::size_t(0), size = translators.size(); i < size; ++i) {
68 var_names[i] = _translators_.translator(i).variable()->name();
70 setVariableNames(var_names,
false);
73 GUM_CONSTRUCTOR(DatabaseTable);
77 DatabaseTable::DatabaseTable(
const DBTranslatorSet& translators) :
78 IDatabaseTable< DBTranslatedValue >(
std::vector<
std::string >(),
79 std::vector<
std::string >()),
80 _translators_(translators) {
81 if (translators.size()) {
83 std::vector< std::string > var_names(translators.size());
84 for (std::size_t i = std::size_t(0), size = translators.size(); i < size; ++i) {
85 var_names[i] = _translators_.translator(i).variable()->name();
87 setVariableNames(var_names,
false);
90 GUM_CONSTRUCTOR(DatabaseTable);
94 DatabaseTable* DatabaseTable::clone()
const {
return new DatabaseTable(*
this); }
97 DatabaseTable& DatabaseTable::operator=(
const DatabaseTable& from) {
99 IDatabaseTable< DBTranslatedValue >::operator=(from);
100 _translators_ = from._translators_;
101 _ignored_cols_ = from._ignored_cols_;
108 DatabaseTable& DatabaseTable::operator=(DatabaseTable&& from)
noexcept {
110 IDatabaseTable< DBTranslatedValue >::operator=(std::move(from));
111 _translators_ = std::move(from._translators_);
112 _ignored_cols_ = std::move(from._ignored_cols_);
119 std::size_t DatabaseTable::insertTranslator(
const DBTranslator& translator,
120 const std::size_t input_column,
121 const bool unique_column) {
123 if (_ignored_cols_.exists(input_column))
125 "Column " << input_column <<
" is marked as being ignored. "
126 <<
"So it is forbidden to create a translator for that column.")
129 const
std::
size_t new_size = this->nbVariables() + 1;
134 auto reserve_lambda = [this, new_size](
std::
size_t begin,
std::
size_t end,
std::
size_t index) {
135 for (std::size_t i = begin; i < end; ++i)
136 this->rows_[i].row().reserve(new_size);
139 auto undo_reserve_lambda = [](std::size_t begin, std::size_t end, std::size_t index) {};
142 this->_threadProcessDatabase_(reserve_lambda, undo_reserve_lambda);
145 const std::size_t pos = _translators_.insertTranslator(translator, input_column, unique_column);
149 this->variable_names_.push_back(translator.variable()->name());
151 _translators_.eraseTranslator(pos);
157 if (!IDatabaseTable< DBTranslatedValue >::empty()) {
158 const DBTranslatedValue missing = _translators_[pos].missingValue();
161 auto fill_lambda = [
this, missing](std::size_t begin, std::size_t end, std::size_t index) {
162 std::size_t i = begin;
164 for (; i < end; ++i) {
165 this->rows_[i].row().push_back(missing);
166 this->has_row_missing_val_[i] = IsMissing::True;
169 for (std::size_t j = begin; j < i; ++j)
170 this->rows_[i].row().pop_back();
175 auto undo_fill_lambda = [
this](std::size_t begin, std::size_t end, std::size_t index) {
176 for (std::size_t i = begin; i < end; ++i)
177 this->rows_[i].row().pop_back();
181 this->_threadProcessDatabase_(fill_lambda, undo_fill_lambda);
188 std::size_t DatabaseTable::insertTranslator(
const Variable& var,
189 const std::size_t input_column,
190 const bool unique_column) {
192 if (_ignored_cols_.exists(input_column))
194 "Column " << input_column <<
" is marked as being ignored. "
195 <<
"So it is forbidden to create a translator for that column.")
201 if (!IDatabaseTable< DBTranslatedValue >::empty()) {
203 "inserting a new translator into a database creates a new column "
204 <<
"with missing values. However, you did not define any symbol for "
209 const std::size_t new_size = this->nbVariables() + 1;
214 auto reserve_lambda = [
this, new_size](std::size_t begin, std::size_t end, std::size_t index) {
215 for (std::size_t i = begin; i < end; ++i)
216 this->rows_[i].row().reserve(new_size);
219 auto undo_reserve_lambda = [](std::size_t begin, std::size_t end, std::size_t index) {};
222 this->_threadProcessDatabase_(reserve_lambda, undo_reserve_lambda);
225 const std::size_t pos = _translators_.insertTranslator(var, input_column, unique_column);
229 this->variable_names_.push_back(var.name());
231 _translators_.eraseTranslator(pos);
239 std::size_t DatabaseTable::insertTranslator(
const Variable& var,
240 const std::size_t input_column,
241 const std::vector< std::string >& missing_symbols,
242 const bool unique_column) {
244 if (_ignored_cols_.exists(input_column))
246 "Column " << input_column <<
" is marked as being ignored. "
247 <<
"So it is forbidden to create a translator for that column.")
250 const
std::
size_t new_size = this->nbVariables() + 1;
256 = [this, new_size](
std::
size_t begin,
std::
size_t end,
std::
size_t index) ->
void {
257 for (std::size_t i = begin; i < end; ++i)
258 this->rows_[i].row().reserve(new_size);
261 auto undo_reserve_lambda = [](std::size_t begin, std::size_t end, std::size_t index) ->
void {};
264 this->_threadProcessDatabase_(reserve_lambda, undo_reserve_lambda);
267 const std::size_t pos
268 = _translators_.insertTranslator(var, input_column, missing_symbols, unique_column);
272 this->variable_names_.push_back(var.name());
274 _translators_.eraseTranslator(pos);
280 if (!IDatabaseTable< DBTranslatedValue >::empty()) {
281 const DBTranslatedValue missing = _translators_[pos].missingValue();
285 = [
this, missing](std::size_t begin, std::size_t end, std::size_t index) ->
void {
286 std::size_t i = begin;
288 for (; i < end; ++i) {
289 this->rows_[i].row().push_back(missing);
290 this->has_row_missing_val_[i] = IsMissing::True;
293 for (std::size_t j = begin; j < i; ++j)
294 this->rows_[i].row().pop_back();
299 auto undo_fill_lambda
300 = [
this](std::size_t begin, std::size_t end, std::size_t index) ->
void {
301 for (std::size_t i = begin; i < end; ++i)
302 this->rows_[i].row().pop_back();
306 this->_threadProcessDatabase_(fill_lambda, undo_fill_lambda);
314 void DatabaseTable::eraseTranslators(
const std::size_t k,
const bool k_is_input_col) {
315 for (
const auto kk: _getKthIndices_(k, k_is_input_col)) {
319 this->variable_names_.erase(this->variable_names_.begin() + kk);
320 if (this->variable_names_.empty()) {
321 IDatabaseTable< DBTranslatedValue >::eraseAllRows();
323 const std::size_t nb_trans = _translators_.size();
326 = [
this, nb_trans, kk](std::size_t begin, std::size_t end, std::size_t index) ->
void {
327 for (std::size_t i = begin; i < end; ++i) {
328 auto& row = this->rows_[i].row();
329 if (this->_translators_.isMissingValue(row[kk], kk)) {
330 bool has_missing_val =
false;
331 for (std::size_t j = std::size_t(0); j < nb_trans; ++j) {
332 if ((j != kk) && this->_translators_.isMissingValue(row[j], j)) {
333 has_missing_val =
true;
337 if (!has_missing_val) this->has_row_missing_val_[i] = IsMissing::False;
339 row.erase(row.begin() + kk);
343 auto undo_erase_lambda
344 = [](std::size_t begin, std::size_t end, std::size_t index) ->
void {};
347 this->_threadProcessDatabase_(erase_lambda, undo_erase_lambda);
349 _translators_.eraseTranslator(kk);
354 void DatabaseTable::changeTranslator(DBTranslator& new_translator,
356 const bool k_is_input_col) {
359 const auto db_k = _getKthIndices_(k, k_is_input_col);
363 const std::size_t kk = db_k[db_k.size() - 1];
364 if (kk >= _translators_.size()) {
373 this->variable_names_[kk] = new_translator.variable()->name();
376 _translators_.changeTranslator(new_translator, kk);
384 DBTranslator& old_translator = _translators_[kk];
385 if (!old_translator.isLossless()) {
390 "Lossy translators cannot yet be substituted by other translators");
393 const std::size_t nb_threads = this->nbProcessingThreads_();
396 std::pair< DBTranslatedValue, DBTranslatedValue > miss_mapping(old_translator.missingValue(),
397 new_translator.missingValue());
420 if (!this->empty()) {
423 bool has_missing_value =
false;
425 std::vector< int > missing_values(nb_threads, 0);
428 auto get_lambda = [
this, kk, &missing_values](std::size_t begin,
430 std::size_t index) ->
void {
431 for (std::size_t i = begin; i < end; ++i) {
432 auto& row = this->rows_[i].row();
433 if (this->_translators_.isMissingValue(row[kk], kk)) {
434 missing_values[index] = 1;
440 auto undo_get_lambda = [](std::size_t begin, std::size_t end, std::size_t index) ->
void {};
443 this->_threadProcessDatabase_(get_lambda, undo_get_lambda);
446 for (
const auto x: missing_values) {
448 has_missing_value =
true;
455 const auto old_missing_symbols = old_translator.missingSymbols();
456 const auto new_missing_symbols = new_translator.missingSymbols();
457 const bool multiple_missing_symbols = old_missing_symbols.size() > 1;
458 const bool old_miss_included = old_missing_symbols.isSubsetOrEqual(new_missing_symbols);
459 if (has_missing_value && multiple_missing_symbols && !old_miss_included) {
463 "it is impossible to substitute the translator because "
464 "the database contains some missing values that cannot be "
465 "substituted unambiguously");
477 if (has_missing_value && !old_miss_included) {
479 new_translator.translate(*(old_translator.missingSymbols().begin()));
480 }
catch (Exception
const&) {
482 "it is impossible to substitute the translator because "
483 "the database contains some missing values that cannot be "
490 if (has_missing_value && !old_miss_included) {
491 miss_mapping.second = new_translator.translate(*(old_translator.missingSymbols().begin()));
499 std::vector< int > unmapped(nb_threads, 0);
503 = [
this, kk, &old_translator, &new_translator, &unmapped](std::size_t begin,
505 std::size_t index) ->
void {
506 const auto old_miss = old_translator.missingValue().discr_val;
507 for (std::size_t i = begin; i < end; ++i) {
508 const auto& row = this->rows_[i].row();
509 if (row[kk].discr_val != old_miss) {
511 new_translator.translate(old_translator.translateBack(row[kk]));
512 }
catch (Exception
const&) {
521 auto undo_check_lambda = [](std::size_t begin, std::size_t end, std::size_t index) ->
void {};
524 this->_threadProcessDatabase_(check_lambda, undo_check_lambda);
528 for (
const auto x: unmapped) {
531 "The database contains some values that cannot be translated "
532 "using the new translator");
540 = [
this, kk, &old_translator, &new_translator, miss_mapping](std::size_t begin,
542 std::size_t index) ->
void {
543 const auto old_miss = old_translator.missingValue().discr_val;
544 for (std::size_t i = begin; i < end; ++i) {
545 auto& row = this->rows_[i].row();
546 if (row[kk].discr_val == old_miss) {
547 row[kk] = miss_mapping.second;
549 row[kk] = new_translator.translate(old_translator.translateBack(row[kk]));
554 auto undo_change_lambda = [](std::size_t begin, std::size_t end, std::size_t index) ->
void {};
557 this->_threadProcessDatabase_(change_lambda, undo_change_lambda);
560 this->variable_names_[kk] = new_translator.variable()->name();
563 _translators_.changeTranslator(new_translator, kk);
567 void DatabaseTable::changeTranslator(
const Variable& var,
569 const bool k_is_input_col,
570 const std::vector< std::string >& missing_symbols,
571 const bool editable_dictionary,
572 const std::size_t max_dico_entries) {
574 std::vector< std::string > missing;
575 if (missing_symbols.empty()) {
577 const auto db_k = _getKthIndices_(k, k_is_input_col);
581 const std::size_t kk = db_k[db_k.size() - 1];
582 if (kk >= _translators_.size()) {
586 const auto& miss = _translators_[kk].missingSymbols();
587 missing.reserve(miss.size());
588 for (
const auto& m: missing) {
589 missing.push_back(m);
592 missing = missing_symbols;
596 DBTranslator* new_translator
597 = DBTranslators::create(var, missing, editable_dictionary, max_dico_entries);
600 changeTranslator(*new_translator, k, k_is_input_col);
603 delete new_translator;
608 delete new_translator;
612 std::vector< std::pair< Idx, std::shared_ptr< DBTranslator > > >
613 DatabaseTable::betterTranslators()
const {
614 std::vector< std::pair< Idx, std::shared_ptr< DBTranslator > > > better;
616 for (Idx i = 0, size = _translators_.size(); i < size; ++i) {
617 switch (_translators_[i].variable()->varType()) {
620 case VarType::CONTINUOUS :
621 case VarType::NUMERICAL :
622 case VarType::DISCRETIZED :
623 case VarType::RANGE :
break;
627 case VarType::INTEGER : {
628 const auto& var =
dynamic_cast< const IntegerVariable&
>(*(_translators_[i].variable()));
631 const auto& domain = var.integerDomain();
632 if (domain.empty())
break;
633 int prev = domain[0] - 1;
635 for (
const auto elt: domain) {
636 if (elt != prev + 1) {
647 RangeVariable new_var(var.name(),
650 domain[domain.size() - 1]);
653 const auto& missing = _translators_[i].missingSymbols();
654 std::vector< std::string > new_missing;
655 new_missing.reserve(missing.size());
656 for (
const auto& miss: missing) {
657 new_missing.push_back(miss);
659 auto new_trans =
new DBTranslator4RangeVariable(new_var, new_missing);
660 better.push_back(std::pair< Idx, std::shared_ptr< DBTranslator > >(
662 std::shared_ptr< DBTranslator >(new_trans)));
672 case VarType::LABELIZED : {
674 =
dynamic_cast< const LabelizedVariable&
>(*(_translators_[i].variable()));
675 if (!var.domainSize())
break;
678 Set< int > int_values;
679 Set< float > real_values;
681 for (Idx j = 0, s = var.domainSize(); j < s; ++j) {
682 const auto& val = var.label(j);
683 if (DBCell::isReal(val)) {
684 if (DBCell::isInteger(val)) {
685 int_values.insert(std::stoi(val));
687 real_values.insert(std::stof(val));
698 if (real_values.empty()) {
700 std::vector< int > values;
701 values.reserve(int_values.size());
702 for (
const auto val: int_values)
703 values.push_back(val);
704 std::sort(values.begin(), values.end());
708 int prev = values[0] - 1;
709 bool consecutive =
true;
710 for (
const auto elt: values) {
711 if (elt != prev + 1) {
722 RangeVariable new_var(var.name(), var.description(), values[0], values.back());
725 const auto& missing = _translators_[i].missingSymbols();
726 std::vector< std::string > new_missing;
727 new_missing.reserve(missing.size());
728 for (
const auto& miss: missing) {
729 new_missing.push_back(miss);
731 auto new_trans =
new DBTranslator4RangeVariable(new_var, new_missing);
732 better.emplace_back(i, std::shared_ptr< DBTranslator >(new_trans));
736 IntegerVariable new_var(var.name(), var.description(), values);
739 const auto& missing = _translators_[i].missingSymbols();
740 std::vector< std::string > new_missing;
741 new_missing.reserve(missing.size());
742 for (
const auto& miss: missing) {
743 new_missing.push_back(miss);
745 auto new_trans =
new DBTranslator4IntegerVariable(new_var, new_missing);
746 better.emplace_back(i, std::shared_ptr< DBTranslator >(new_trans));
750 ContinuousVariable new_var(var.name(), var.description());
753 const auto& missing = _translators_[i].missingSymbols();
754 std::vector< std::string > new_missing;
755 new_missing.reserve(missing.size());
756 for (
const auto& miss: missing) {
757 new_missing.push_back(miss);
759 auto new_trans =
new DBTranslator4ContinuousVariable(new_var, new_missing);
760 better.emplace_back(i, std::shared_ptr< DBTranslator >(new_trans));
772 const DBTranslator& DatabaseTable::translator(
const std::size_t k,
773 const bool k_is_input_col)
const {
776 const std::size_t nb_trans = _translators_.size();
777 const std::size_t kk = _getKthIndex_(k, k_is_input_col);
780 if (nb_trans <= kk) {
781 if (k_is_input_col) {
783 "there is no translator in the database table that " <<
"parses Column " << k)
786 "the database has " << nb_trans <<
" translators, so Translator #" << k
787 <<
" does not exist")
791 return _translators_.translator(kk);
795 const Variable& DatabaseTable::variable(
const std::size_t k,
const bool k_is_input_col)
const {
798 const std::size_t nb_trans = _translators_.size();
799 const std::size_t kk = _getKthIndex_(k, k_is_input_col);
802 if (nb_trans <= kk) {
803 if (k_is_input_col) {
805 "there is no variable in the database table that " <<
"corresponds to Column "
809 "the database has " << nb_trans <<
" variables, so Variable #" << k
810 <<
" does not exist")
814 return _translators_.variable(kk);
818 void DatabaseTable::setVariableNames(
const std::vector< std::string >& names,
819 const bool from_external_object) {
820 const std::size_t size = names.size();
821 const std::size_t nb_trans = _translators_.size();
822 if (!from_external_object) {
823 if (nb_trans != size) {
825 "the number of variable's names (i.e., "
826 << size <<
") does not correspond to the number of columns of the "
827 <<
"database table (i.e.," << nb_trans <<
")")
831 for (std::size_t i = std::size_t(0); i < size; ++i) {
832 _translators_.translator(i).setVariableName(names[i]);
835 if (nb_trans && (_translators_.highestInputColumn() >= size)) {
837 "the names vector has " << size <<
" elements whereas it should have at least "
838 << (_translators_.highestInputColumn() + 1)
839 <<
"elements so that each translator is assigned a name")
843 for (std::size_t i = std::size_t(0); i < nb_trans; ++i) {
844 _translators_.translator(i).setVariableName(names[_translators_.inputColumn(i)]);
849 this->variable_names_.resize(nb_trans);
850 for (std::size_t i = std::size_t(0); i < nb_trans; ++i) {
851 this->variable_names_[i] = _translators_.variable(i).name();
857 void DatabaseTable::ignoreColumn(
const std::size_t k,
const bool k_is_input_col) {
861 const std::size_t nb_trans = _translators_.size();
862 if (k_is_input_col) {
863 if (_ignored_cols_.exists(k))
return;
864 _ignored_cols_.insert(k);
867 _ignored_cols_.insert(_translators_.inputColumn(k));
870 "It is impossible to ignore the column parsed by Translator #"
871 << k <<
"because there exist only " << nb_trans <<
" translators")
876 eraseTranslators(k, k_is_input_col);
880 const typename DatabaseTable::template DBVector< std::size_t >
881 DatabaseTable::ignoredColumns()
const {
882 const std::size_t nb_trans = _translators_.size();
884 if (nb_trans == std::size_t(0)) {
return DBVector< std::size_t >{std::size_t(0)}; }
887 DBVector< std::size_t > cols(nb_trans);
888 for (std::size_t i = std::size_t(0); i < nb_trans; ++i)
889 cols[i] = _translators_.inputColumn(i);
890 std::sort(cols.begin(), cols.end());
893 const std::size_t highest = _translators_.highestInputColumn() + 1;
894 DBVector< std::size_t > ignored_cols(highest);
895 std::iota(ignored_cols.begin(), ignored_cols.end(), 0);
898 for (std::size_t i = std::size_t(0), ii = highest - 1, k = std::size_t(0), kk = nb_trans - 1;
901 if (cols[kk] == ii) {
902 ignored_cols.erase(ignored_cols.begin() + ii);
903 while ((k < nb_trans) && (cols[kk] == ii)) {
907 if (k == nb_trans)
break;
912 ignored_cols.push_back(highest);
918 const typename DatabaseTable::template DBVector< std::size_t >
919 DatabaseTable::inputColumns()
const {
920 const std::size_t nb_trans = _translators_.size();
921 if (nb_trans == std::size_t(0)) {
return DBVector< std::size_t >(); }
923 DBVector< std::size_t > input_cols(nb_trans);
924 for (std::size_t i = std::size_t(0); i < nb_trans; ++i) {
925 input_cols[i] = _translators_.inputColumn(i);
931 std::size_t DatabaseTable::domainSize(
const std::size_t k,
const bool k_is_input_col)
const {
933 const std::size_t nb_trans = _translators_.size();
934 const std::size_t kk = _getKthIndex_(k, k_is_input_col);
937 if (nb_trans <= kk) {
938 if (k_is_input_col) {
940 "there is no variable in the database table that " <<
"corresponds to Column "
944 "the database has " << nb_trans <<
" variables, so Variable #" << k
945 <<
" does not exist")
949 return _translators_.domainSize(kk);
954 bool DatabaseTable::needsReordering(
const std::size_t k,
const bool k_is_input_col)
const {
956 const std::size_t nb_trans = _translators_.size();
957 const std::size_t kk = _getKthIndex_(k, k_is_input_col);
960 if (nb_trans <= kk) {
961 if (k_is_input_col) {
963 "there is no translator in the database table that " <<
"parses Column " << k)
966 "the database has " << nb_trans <<
" translators, so Translator #" << k
967 <<
" does not exist")
971 return _translators_.needsReordering(kk);
976 void DatabaseTable::reorder(
const std::size_t k,
const bool k_is_input_col) {
978 const std::size_t nb_trans = _translators_.size();
979 const std::size_t kk = _getKthIndex_(k, k_is_input_col);
982 if (nb_trans <= kk) {
983 if (k_is_input_col) {
985 "there is no translator in the database table that " <<
"parses Column " << k)
988 "the database has " << nb_trans <<
" translators, so Translator #" << k
989 <<
" does not exist")
995 if (_translators_.translator(kk).getValType() != DBTranslatedValueType::DISCRETE)
return;
998 auto updates = _translators_.reorder(kk);
999 if (updates.empty())
return;
1001 std::size_t size = updates.size();
1002 std::vector< std::size_t > new_values(size);
1003 for (
const auto& update: updates) {
1004 if (update.first >= size) {
1005 size = update.first + 1;
1006 new_values.resize(size);
1008 new_values[update.first] = update.second;
1012 auto newtrans_lambda
1013 = [
this, kk, &new_values](std::size_t begin, std::size_t end, std::size_t index) ->
void {
1014 for (std::size_t i = begin; i < end; ++i) {
1015 auto& elt = this->rows_[i][kk].discr_val;
1016 if (elt != std::numeric_limits< std::size_t >::max()) elt = new_values[elt];
1020 auto undo_newtrans_lambda
1021 = [](std::size_t begin, std::size_t end, std::size_t index) ->
void {};
1024 this->_threadProcessDatabase_(newtrans_lambda, undo_newtrans_lambda);
1028 void DatabaseTable::insertRow(
const std::vector< std::string >& new_row) {
1031 const std::size_t row_size = new_row.size();
1032 if (row_size == std::size_t(0))
return;
1034 if (_translators_.highestInputColumn() >= row_size) {
1036 "the row #" << 1 + size() <<
" has " << row_size
1037 <<
" columns whereas the database requires at least "
1038 << (_translators_.highestInputColumn() + 1) <<
" columns")
1042 const std::size_t nb_trans = _translators_.size();
1043 Row< DBTranslatedValue > dbrow;
1044 dbrow.reserve(nb_trans);
1045 bool has_missing_val =
false;
1046 for (std::size_t i = std::size_t(0); i < nb_trans; ++i) {
1047 const DBTranslatedValue new_val(_translators_.translate(new_row, i));
1048 if (_translators_.isMissingValue(new_val, i)) has_missing_val =
true;
1049 dbrow.pushBack(std::move(new_val));
1052 this->insertRow(std::move(dbrow), has_missing_val ? IsMissing::True : IsMissing::False);
1057 bool DatabaseTable::_isRowCompatible_(
1058 const typename DatabaseTable::template Row< DBTranslatedValue >& row)
const {
1060 const std::size_t row_size = row.size();
1061 if (row_size != _translators_.size())
return false;
1063 const auto& translators = _translators_.translators();
1064 for (std::size_t i = std::size_t(0); i < row_size; ++i) {
1065 switch (translators[i]->getValType()) {
1066 case DBTranslatedValueType::DISCRETE :
1067 if ((row[i].discr_val >= translators[i]->domainSize())
1068 && (row[i].discr_val != std::numeric_limits< std::size_t >::max()))
1072 case DBTranslatedValueType::CONTINUOUS : {
1073 const IContinuousVariable& var
1074 =
static_cast< const IContinuousVariable&
>(*(translators[i]->variable()));
1075 if (((var.lowerBoundAsDouble() > (
double)row[i].cont_val)
1076 || (var.upperBoundAsDouble() < (
double)row[i].cont_val))
1077 && (row[i].cont_val != std::numeric_limits< float >::max()))
1090 void DatabaseTable::insertRow(
const typename DatabaseTable::template Row< DBCell >& new_row) {
1095 void DatabaseTable::insertRow(
typename DatabaseTable::template Row< DBCell >&& new_row) {
1100 void DatabaseTable::insertRows(
1105 for (
const auto& new_row: rows) {
1106 if (!_isRowCompatible_(new_row)) {
1107 if (new_row.size() != _translators_.size()) {
1109 "The new row has " << new_row.size()
1110 <<
" elements whereas the database table has "
1111 << _translators_.size() <<
" columns")
1118 IDatabaseTable< DBTranslatedValue >::insertRows(std::move(rows), rows_have_missing_vals);
1122 void DatabaseTable::insertRows(
1127 for (
const auto& new_row: new_rows) {
1128 if (!_isRowCompatible_(new_row)) {
1129 if (new_row.size() != _translators_.size()) {
1131 "The new row has " << new_row.size()
1132 <<
" elements whereas the database table has "
1133 << _translators_.size() <<
" columns")
1140 IDatabaseTable< DBTranslatedValue >::insertRows(new_rows, rows_have_missing_vals);
1144 void DatabaseTable::insertRows(
typename DatabaseTable::template
Matrix< DBCell >&& new_rows) {
1150 DatabaseTable::insertRows(
const typename DatabaseTable::template
Matrix< DBCell >& new_rows) {
1155 void DatabaseTable::clear() {
1156 _translators_.clear();
1157 _ignored_cols_.clear();
1158 IDatabaseTable< DBTranslatedValue >::clear();
Exception: at least one argument passed to a function is not what was expected.
Error: The database contains some missing values.
Exception : there is something wrong with an implementation.
Exception : operation not allowed.
Exception : out of bound.
Exception : problem with size.
Exception : a looked-for element could not be found.
the class for packing together the translators used to preprocess the datasets
DatabaseTable(const MissingValType &missing_symbols, const DBTranslatorSet &translators=DBTranslatorSet())
default constructor
std::vector< std::string > MissingValType
The common class for the tabular database tables.
The class representing a tabular database stored in RAM.
#define GUM_ERROR(type, msg)
include the inlined functions if necessary
The union class for storing the translated values in learning databases.