29 #ifndef DOXYGEN_SHOULD_SKIP_THIS 37 template <
template <
typename >
class ALLOC >
41 __setInputRow_performed(alloc) {
47 template <
template <
typename >
class ALLOC >
49 const DBRowGeneratorSet< ALLOC >& from,
51 __generators(from.__nb_generators, nullptr, alloc),
52 __nb_generators(from.__nb_generators),
53 __setInputRow_performed(from.__nb_generators, 0, alloc) {
55 for (std::size_t i = std::size_t(0); i < __nb_generators; ++i)
56 __generators[i] = from.__generators[i]->clone(alloc);
63 template <
template <
typename >
class ALLOC >
65 const DBRowGeneratorSet< ALLOC >& from) :
70 template <
template <
typename >
class ALLOC >
72 DBRowGeneratorSet< ALLOC >&& from,
74 __generators(
std::move(from.__generators), alloc),
75 __nb_generators(from.__nb_generators), __output_row(from.__output_row),
76 __setInputRow_performed(
std::move(from.__setInputRow_performed), alloc) {
82 template <
template <
typename >
class ALLOC >
84 DBRowGeneratorSet< ALLOC >&& from) :
88 template <
template <
typename >
class ALLOC >
91 ALLOC< DBRowGeneratorSet< ALLOC > > allocator(alloc);
92 DBRowGeneratorSet< ALLOC >* generators = allocator.allocate(1);
94 allocator.construct(generators, *
this, alloc);
96 allocator.deallocate(generators, 1);
104 template <
template <
typename >
class ALLOC >
111 template <
template <
typename >
class ALLOC >
114 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
115 for (
auto gen : __generators) {
116 allocator.destroy(gen);
117 allocator.deallocate(gen, 1);
121 __generators.clear();
122 __nb_generators = std::size_t(0);
123 __output_row =
nullptr;
124 __setInputRow_performed.clear();
129 template <
template <
typename >
class ALLOC >
137 template <
template <
typename >
class ALLOC >
139 operator=(
const DBRowGeneratorSet< ALLOC >& from) {
142 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
143 std::vector< DBRowGenerator< ALLOC >*, ALLOC< DBRowGenerator< ALLOC >* > >
144 new_generators(from.__nb_generators,
nullptr, allocator);
145 for (std::size_t i = std::size_t(0); i < from.__nb_generators; ++i) {
147 new_generators[i] = from.__generators[i]->clone(allocator);
149 for (std::size_t j = std::size_t(0); j < i; ++j) {
150 allocator.destroy(new_generators[j]);
151 allocator.deallocate(new_generators[j], 1);
158 std::vector< int, ALLOC< int > > setInputDBrow_performed(
163 __generators = std::move(new_generators);
164 __nb_generators = from.__nb_generators;
165 __output_row =
nullptr;
166 __setInputRow_performed = std::move(setInputDBrow_performed);
174 template <
template <
typename >
class ALLOC >
176 operator=(DBRowGeneratorSet< ALLOC >&& from) {
180 __generators = std::move(from.__generators);
181 __nb_generators = from.__nb_generators;
182 __output_row = from.__output_row;
183 __setInputRow_performed = std::move(from.__setInputRow_performed);
190 template <
template <
typename >
class ALLOC >
193 return *(__generators[i]);
198 template <
template <
typename >
class ALLOC >
201 return *(__generators[i]);
206 template <
template <
typename >
class ALLOC >
207 template <
template <
template <
typename >
class >
class Generator >
209 const Generator< ALLOC >& generator) {
211 if (__output_row !=
nullptr)
213 "you cannot insert a new generator while a generation is " 214 "still being processed");
216 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
217 __generators.push_back(generator.clone(allocator));
220 __setInputRow_performed.push_back(0);
222 allocator.destroy(__generators.back());
223 allocator.deallocate(__generators.back(), 1);
228 __output_row =
nullptr;
233 template <
template <
typename >
class ALLOC >
234 template <
template <
template <
typename >
class >
class Generator >
236 const Generator< ALLOC >& generator, const std::size_t i) {
238 if (__output_row !=
nullptr)
240 "you cannot insert a new generator while a generation is " 241 "still being processed");
243 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
244 __generators.insert(__generators.begin() + i, generator.clone(allocator));
247 __setInputRow_performed.push_back(0);
249 allocator.destroy(*(__generators.begin() + i));
250 allocator.deallocate(*(__generators.begin() + i));
255 __output_row =
nullptr;
260 template <
template <
typename >
class ALLOC >
262 return __nb_generators;
267 template <
template <
typename >
class ALLOC >
268 template <
typename GUM_SCALAR >
270 const BayesNet< GUM_SCALAR >& new_bn) {
271 HashTable< DBRowGeneratorWithBN< GUM_SCALAR, ALLOC >*,
272 const BayesNet< GUM_SCALAR >* >
275 for (
auto xgen : __generators) {
277 DBRowGeneratorWithBN< GUM_SCALAR, ALLOC >* gen =
nullptr;
279 gen =
dynamic_cast< DBRowGeneratorWithBN< GUM_SCALAR, ALLOC >*
>(xgen);
280 }
catch (std::bad_cast&) {}
282 if (gen !=
nullptr) {
285 const BayesNet< GUM_SCALAR >* bn = &(gen->getBayesNet());
286 old_bns.insert(gen, bn);
287 gen->setBayesNet(new_bn);
292 for (
auto& generator : old_bns) {
293 generator.first->setBayesNet(*(generator.second));
303 template <
template <
typename >
class ALLOC >
305 return __nb_generators;
310 template <
template <
typename >
class ALLOC >
312 return __output_row !=
nullptr;
317 template <
template <
typename >
class ALLOC >
318 bool DBRowGeneratorSet< ALLOC >::__produceNextRow(
319 const DBRow< DBTranslatedValue, ALLOC >* input_row, std::size_t i) {
339 const DBRow< DBTranslatedValue, ALLOC >* row = input_row;
340 while (i != __nb_generators) {
341 auto generator = __generators[i];
345 if (__setInputRow_performed[i] == 0) {
347 const bool has_rows = generator->setInputRow(*row);
351 if (i > std::size_t(0)) {
356 __output_row =
nullptr;
362 row = &(generator->generate());
363 __setInputRow_performed[i] = 1;
372 if (generator->hasRows()) {
374 row = &(generator->generate());
381 __setInputRow_performed[i] = 0;
382 if (i > std::size_t(0)) {
387 __output_row =
nullptr;
402 template <
template <
typename >
class ALLOC >
404 const DBRow< DBTranslatedValue, ALLOC >& input_row) {
407 for (
auto& performed : __setInputRow_performed)
411 return __produceNextRow(&input_row, std::size_t(0));
416 template <
template <
typename >
class ALLOC >
417 INLINE
const DBRow< DBTranslatedValue, ALLOC >&
420 const auto row = __output_row;
423 __produceNextRow(__output_row, __nb_generators - 1);
430 template <
template <
typename >
class ALLOC >
432 for (
auto gen : __generators)
434 for (
auto& performed : __setInputRow_performed)
436 __output_row =
nullptr;
442 template <
template <
typename >
class ALLOC >
444 const std::vector< std::size_t, ALLOC< std::size_t > >& cols_of_interest) {
446 if (__output_row !=
nullptr)
448 "you cannot change the columns of interest while a " 449 "generation is still being processed");
450 for (
auto gen : __generators)
451 gen->setColumnsOfInterest(cols_of_interest);
457 template <
template <
typename >
class ALLOC >
459 std::vector< std::size_t, ALLOC< std::size_t > >&& cols_of_interest) {
460 if (__output_row !=
nullptr)
462 "you cannot change the columns of interest while a " 463 "generation is still being processed");
464 for (
auto gen : __generators)
465 gen->setColumnsOfInterest(cols_of_interest);
470 template <
template <
typename >
class ALLOC >
471 INLINE
const std::vector< std::size_t, ALLOC< std::size_t > >&
473 if (__nb_generators == std::size_t(0)) {
475 "there are no generators yet in the generator set, so " 476 "there are no columns of interest");
478 return __generators[0]->columnsOfInterest();
483 template <
template <
typename >
class ALLOC >
allocator_type getAllocator() const
returns the allocator used
std::size_t size() const noexcept
returns the number of generators (alias for nbGenerators)
DBRowGeneratorSet(const allocator_type &alloc=allocator_type())
default constructor
void clear()
removes all the generators
ALLOC< DBTranslatedValue > allocator_type
type for the allocators passed in arguments of methods
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
void setBayesNet(const BayesNet< GUM_SCALAR > &new_bn)
assign a new Bayes net to all the generators that depend on a BN
void setColumnsOfInterest(const std::vector< std::size_t, ALLOC< std::size_t > > &cols_of_interest)
sets the columns of interest: the output DBRow needs only contain correct values fot these columns ...
DBRowGeneratorSet< ALLOC > & operator=(const DBRowGeneratorSet< ALLOC > &from)
copy operator
const std::vector< std::size_t, ALLOC< std::size_t > > & columnsOfInterest() const
returns the current set of columns of interest
virtual DBRowGeneratorSet< ALLOC > * clone() const
virtual copy constructor
void reset()
resets all the generators
void insertGenerator(const Generator< ALLOC > &generator)
inserts a new generator at the end of the set
virtual ~DBRowGeneratorSet()
destructor
std::size_t nbGenerators() const noexcept
returns the number of generators
DBRowGenerator< ALLOC > & operator[](const std::size_t i)
returns the ith generator
const DBRow< DBTranslatedValue, ALLOC > & generate()
generates a new output row from the input row
bool setInputRow(const DBRow< DBTranslatedValue, ALLOC > &input_row)
sets the input row from which the generators will create new rows
#define GUM_ERROR(type, msg)
bool hasRows()
returns true if there are still rows that can be output by the set of generators