26 #ifndef DOXYGEN_SHOULD_SKIP_THIS 34 template <
template <
typename >
class ALLOC >
38 __setInputRow_performed(alloc) {
44 template <
template <
typename >
class ALLOC >
46 const DBRowGeneratorSet< ALLOC >& from,
48 __generators(from.__nb_generators, nullptr, alloc),
49 __nb_generators(from.__nb_generators),
50 __setInputRow_performed(from.__nb_generators, 0, alloc) {
52 for (std::size_t i = std::size_t(0); i < __nb_generators; ++i)
53 __generators[i] = from.__generators[i]->clone(alloc);
60 template <
template <
typename >
class ALLOC >
62 const DBRowGeneratorSet< ALLOC >& from) :
67 template <
template <
typename >
class ALLOC >
69 DBRowGeneratorSet< ALLOC >&& from,
71 __generators(
std::move(from.__generators), alloc),
72 __nb_generators(from.__nb_generators), __output_row(from.__output_row),
73 __setInputRow_performed(
std::move(from.__setInputRow_performed), alloc) {
79 template <
template <
typename >
class ALLOC >
81 DBRowGeneratorSet< ALLOC >&& from) :
85 template <
template <
typename >
class ALLOC >
88 ALLOC< DBRowGeneratorSet< ALLOC > > allocator(alloc);
89 DBRowGeneratorSet< ALLOC >* generators = allocator.allocate(1);
91 allocator.construct(generators, *
this, alloc);
93 allocator.deallocate(generators, 1);
101 template <
template <
typename >
class ALLOC >
108 template <
template <
typename >
class ALLOC >
111 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
112 for (
auto gen : __generators) {
113 allocator.destroy(gen);
114 allocator.deallocate(gen, 1);
118 __generators.clear();
119 __nb_generators = std::size_t(0);
120 __output_row =
nullptr;
121 __setInputRow_performed.clear();
126 template <
template <
typename >
class ALLOC >
134 template <
template <
typename >
class ALLOC >
136 operator=(
const DBRowGeneratorSet< ALLOC >& from) {
139 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
140 std::vector< DBRowGenerator< ALLOC >*, ALLOC< DBRowGenerator< ALLOC >* > >
141 new_generators(from.__nb_generators,
nullptr, allocator);
142 for (std::size_t i = std::size_t(0); i < from.__nb_generators; ++i) {
144 new_generators[i] = from.__generators[i]->clone(allocator);
146 for (std::size_t j = std::size_t(0); j < i; ++j) {
147 allocator.destroy(new_generators[j]);
148 allocator.deallocate(new_generators[j], 1);
155 std::vector< int, ALLOC< int > > setInputDBrow_performed(
160 __generators = std::move(new_generators);
161 __nb_generators = from.__nb_generators;
162 __output_row =
nullptr;
163 __setInputRow_performed = std::move(setInputDBrow_performed);
171 template <
template <
typename >
class ALLOC >
173 operator=(DBRowGeneratorSet< ALLOC >&& from) {
177 __generators = std::move(from.__generators);
178 __nb_generators = from.__nb_generators;
179 __output_row = from.__output_row;
180 __setInputRow_performed = std::move(from.__setInputRow_performed);
187 template <
template <
typename >
class ALLOC >
190 return *(__generators[i]);
195 template <
template <
typename >
class ALLOC >
198 return *(__generators[i]);
203 template <
template <
typename >
class ALLOC >
204 template <
template <
template <
typename >
class >
class Generator >
206 const Generator< ALLOC >& generator) {
208 if (__output_row !=
nullptr)
210 "you cannot insert a new generator while a generation is " 211 "still being processed");
213 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
214 __generators.push_back(generator.clone(allocator));
217 __setInputRow_performed.push_back(0);
219 allocator.destroy(__generators.back());
220 allocator.deallocate(__generators.back(), 1);
225 __output_row =
nullptr;
230 template <
template <
typename >
class ALLOC >
231 template <
template <
template <
typename >
class >
class Generator >
233 const Generator< ALLOC >& generator, const std::size_t i) {
235 if (__output_row !=
nullptr)
237 "you cannot insert a new generator while a generation is " 238 "still being processed");
240 ALLOC< DBRowGenerator< ALLOC > > allocator(this->
getAllocator());
241 __generators.insert(__generators.begin() + i, generator.clone(allocator));
244 __setInputRow_performed.push_back(0);
246 allocator.destroy(*(__generators.begin() + i));
247 allocator.deallocate(*(__generators.begin() + i));
252 __output_row =
nullptr;
257 template <
template <
typename >
class ALLOC >
259 return __nb_generators;
264 template <
template <
typename >
class ALLOC >
265 template <
typename GUM_SCALAR >
267 const BayesNet< GUM_SCALAR >& new_bn) {
268 HashTable< DBRowGeneratorWithBN< GUM_SCALAR, ALLOC >*,
269 const BayesNet< GUM_SCALAR >* >
272 for (
auto xgen : __generators) {
274 DBRowGeneratorWithBN< GUM_SCALAR, ALLOC >* gen =
nullptr;
276 gen =
dynamic_cast< DBRowGeneratorWithBN< GUM_SCALAR, ALLOC >*
>(xgen);
277 }
catch (std::bad_cast&) {}
279 if (gen !=
nullptr) {
282 const BayesNet< GUM_SCALAR >* bn = &(gen->getBayesNet());
283 old_bns.insert(gen, bn);
284 gen->setBayesNet(new_bn);
289 for (
auto& generator : old_bns) {
290 generator.first->setBayesNet(*(generator.second));
300 template <
template <
typename >
class ALLOC >
302 return __nb_generators;
307 template <
template <
typename >
class ALLOC >
309 return __output_row !=
nullptr;
314 template <
template <
typename >
class ALLOC >
315 bool DBRowGeneratorSet< ALLOC >::__produceNextRow(
316 const DBRow< DBTranslatedValue, ALLOC >* input_row, std::size_t i) {
336 const DBRow< DBTranslatedValue, ALLOC >* row = input_row;
337 while (i != __nb_generators) {
338 auto generator = __generators[i];
342 if (__setInputRow_performed[i] == 0) {
344 const bool has_rows = generator->setInputRow(*row);
348 if (i > std::size_t(0)) {
353 __output_row =
nullptr;
359 row = &(generator->generate());
360 __setInputRow_performed[i] = 1;
369 if (generator->hasRows()) {
371 row = &(generator->generate());
378 __setInputRow_performed[i] = 0;
379 if (i > std::size_t(0)) {
384 __output_row =
nullptr;
399 template <
template <
typename >
class ALLOC >
401 const DBRow< DBTranslatedValue, ALLOC >& input_row) {
404 for (
auto& performed : __setInputRow_performed)
408 return __produceNextRow(&input_row, std::size_t(0));
413 template <
template <
typename >
class ALLOC >
414 INLINE
const DBRow< DBTranslatedValue, ALLOC >&
417 const auto row = __output_row;
420 __produceNextRow(__output_row, __nb_generators - 1);
427 template <
template <
typename >
class ALLOC >
429 for (
auto gen : __generators)
431 for (
auto& performed : __setInputRow_performed)
433 __output_row =
nullptr;
439 template <
template <
typename >
class ALLOC >
441 const std::vector< std::size_t, ALLOC< std::size_t > >& cols_of_interest) {
443 if (__output_row !=
nullptr)
445 "you cannot change the columns of interest while a " 446 "generation is still being processed");
447 for (
auto gen : __generators)
448 gen->setColumnsOfInterest(cols_of_interest);
454 template <
template <
typename >
class ALLOC >
456 std::vector< std::size_t, ALLOC< std::size_t > >&& cols_of_interest) {
457 if (__output_row !=
nullptr)
459 "you cannot change the columns of interest while a " 460 "generation is still being processed");
461 for (
auto gen : __generators)
462 gen->setColumnsOfInterest(cols_of_interest);
467 template <
template <
typename >
class ALLOC >
468 INLINE
const std::vector< std::size_t, ALLOC< std::size_t > >&
470 if (__nb_generators == std::size_t(0)) {
472 "there are no generators yet in the generator set, so " 473 "there are no columns of interest");
475 return __generators[0]->columnsOfInterest();
480 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
gum is the global namespace for all aGrUM entities
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