1#ifndef FSTDATASPLITTERRANDRAND_H
2#define FSTDATASPLITTERRANDRAND_H
106template<
class INTERVALCONTAINER,
typename IDXTYPE,
typename BINTYPE>
119 virtual std::ostream&
print(std::ostream& os)
const override {os <<
"Data_Splitter_RandomRandom(splits=" <<
splits <<
", %train=" <<
perctrain <<
", %test=" <<
perctest <<
")";
return os;}
123 virtual void makeRandomSplit(
const IDXTYPE n,
const std::shared_ptr<INTERVALCONTAINER> list_train,
const std::shared_ptr<INTERVALCONTAINER> list_test);
128 virtual const char*
splitter_name()
const override {
return "Data_Splitter_RandomRandom";}
151 void fill_randomly(
const IDXTYPE n,
const BINTYPE id_empty,
const BINTYPE id_fill,
const IDXTYPE count,
const IDXTYPE minidx,
const IDXTYPE maxidx);
153 void fill(
const IDXTYPE n,
const BINTYPE id_empty,
const BINTYPE id_fill,
const IDXTYPE minidx,
const IDXTYPE maxidx);
155 void translate(
const IDXTYPE n,
const BINTYPE id_fill,
const std::shared_ptr<INTERVALCONTAINER> lst);
168template<
class INTERVALCONTAINER,
typename IDXTYPE,
typename BINTYPE>
173 assert(maxidx>=minidx);
175 assert(count<=maxidx-minidx+1);
179 for(IDXTYPE dbg_i=minidx;dbg_i<=maxidx;dbg_i++)
if(
_data[dbg_i]==id_empty) ++dbg_cnt;
180 assert(count<=dbg_cnt);
183 for(IDXTYPE i=0;i<count;i++)
185 if(
_randomize) piv=minidx+(IDXTYPE)std::uniform_int_distribution<long>(0,(
long)(maxidx-minidx))(
_rng);
186 else piv=minidx+(IDXTYPE)
fst_rand_below((
unsigned long)(maxidx-minidx+1));
187 assert(minidx<=piv && piv<=maxidx);
188 while(
_data[piv]!=id_empty) {piv++;
if(piv>maxidx) piv=minidx;}
193template<
class INTERVALCONTAINER,
typename IDXTYPE,
typename BINTYPE>
198 assert(maxidx>=minidx);
200 for(IDXTYPE i=minidx;i<=maxidx;i++)
if(
_data[i]==id_empty)
_data[i]=id_fill;
203template<
class INTERVALCONTAINER,
typename IDXTYPE,
typename BINTYPE>
208 IDXTYPE piv=0, count=0;
209 while(piv<n &&
_data[piv]!=id_fill) piv++;
213 while(piv+count<n &&
_data[piv+count]==id_fill) ++count;
217 while(piv<n &&
_data[piv]!=id_fill) piv++;
221template<
class INTERVALCONTAINER,
typename IDXTYPE,
typename BINTYPE>
232 const BINTYPE id_empty = 0;
233 const BINTYPE id_train = 1;
234 const BINTYPE id_test = 2;
236 const IDXTYPE tesiz=(n *
perctest)/100;
237 assert(trsiz+tesiz<=n);
239 for(i=0;i<n;i++)
_data[i]=id_empty;
252 fill(n,id_empty,id_train,0,n-1);
256 fill(n,id_empty,id_test,0,n-1);
260 fill(n,id_empty,id_test,0,n-1);
269 throw fst_error(
"Data_Splitter_RandomRandom::makeRandomSplit() error.");
CRTP mixin implementing the Clonable protocol for a concrete class.
Definition clonable.hpp:184
Implements train/test data splitting: use randomly chosen x% of data samples for training and another...
Definition data_splitter_randrand.hpp:107
virtual std::ostream & print(std::ostream &os) const override
writes a human-readable identification of the splitter and its configuration; base default writes not...
Definition data_splitter_randrand.hpp:119
Data_Splitter_RandomRandom(const Data_Splitter_RandomRandom &dsp)
Copy constructor. It deliberately does NOT inherit RNG state: in the randomize==true mode each copy s...
Definition data_splitter_randrand.hpp:115
std::unique_ptr< BINTYPE[]> _data
Definition data_splitter_randrand.hpp:158
const IDXTYPE perctest
Definition data_splitter_randrand.hpp:161
const IDXTYPE splits
Definition data_splitter_randrand.hpp:162
std::mt19937 _rng
Definition data_splitter_randrand.hpp:164
Data_Splitter< INTERVALLER, IDXTYPE > TCC
Definition data_splitter_randrand.hpp:121
virtual void splitClassFirst(typename TCC::ClassIterator c, const unsigned int) override
write first-split train/test intervals of class cidx (c is that class's entry in csplit)
Definition data_splitter_randrand.hpp:144
virtual bool prepareNextSplit() override
advance split-sequence state; false = no more splits
Definition data_splitter_randrand.hpp:139
IDXTYPE current_split
Definition data_splitter_randrand.hpp:165
Clonable_Impl< Data_Splitter_RandomRandom, Data_Splitter< INTERVALLER, IDXTYPE >, CLONE_INHERIT, CLONE_INHERIT, CLONE_DEEP > parent_impl
Definition data_splitter_randrand.hpp:109
virtual void splitClassNext(typename TCC::ClassIterator c, const unsigned int) override
write next-split train/test intervals of class cidx (a single-split splitter never gets here,...
Definition data_splitter_randrand.hpp:145
IDXTYPE _n_max
Definition data_splitter_randrand.hpp:157
void translate(const IDXTYPE n, const BINTYPE id_fill, const std::shared_ptr< INTERVALCONTAINER > lst)
Converts the binary _data labeling (id_fill vs. everything else) over indices [0,n) into lst's list o...
Definition data_splitter_randrand.hpp:204
const bool _randomize
Definition data_splitter_randrand.hpp:163
virtual bool prepareFirstSplit() override
set up split-sequence state; false = no split can be made
Definition data_splitter_randrand.hpp:129
virtual void makeRandomSplit(const IDXTYPE n, const std::shared_ptr< INTERVALCONTAINER > list_train, const std::shared_ptr< INTERVALCONTAINER > list_test)
Generates one class's non-overlapping random train/test split of n samples into list_train / list_tes...
Definition data_splitter_randrand.hpp:222
Data_Splitter_RandomRandom(const IDXTYPE _splits, const IDXTYPE _perctrain, const IDXTYPE _perctest, const bool randomize=false)
_splits splits, each drawing _perctrain % of each class for training and _perctest % for testing (non...
Definition data_splitter_randrand.hpp:111
void fill_randomly(const IDXTYPE n, const BINTYPE id_empty, const BINTYPE id_fill, const IDXTYPE count, const IDXTYPE minidx, const IDXTYPE maxidx)
Randomly relabels count of the still-id_empty slots of _data (within [minidx,maxidx]) to id_fill; dra...
Definition data_splitter_randrand.hpp:169
virtual IDXTYPE getNoOfSplits() const override
Definition data_splitter_randrand.hpp:117
virtual const char * splitter_name() const override
class name, used in error messages
Definition data_splitter_randrand.hpp:128
void fill(const IDXTYPE n, const BINTYPE id_empty, const BINTYPE id_fill, const IDXTYPE minidx, const IDXTYPE maxidx)
Relabels every still-id_empty slot of _data (within [minidx,maxidx]) to id_fill, unconditionally (no ...
Definition data_splitter_randrand.hpp:194
const IDXTYPE perctrain
Definition data_splitter_randrand.hpp:160
Abstract class, defines interface for data splitting implementations (for use in data accessors).
Definition data_splitter.hpp:124
std::vector< PClassSplitter >::const_iterator ClassIterator
iterator over csplit, as passed to the per-class splitClassFirst()/splitClassNext() hooks
Definition data_splitter.hpp:174
FST4 specific error passing class.
Definition error.hpp:61
Defines interface for data splitting implementations (for use in data accessors).
FST4 specific error passing class.
FST4-owned pseudo-random number generator (UCRT-compatible LCG), replacing platform-specific std::ran...
The Feature Selection Toolbox 4 library: every library component – data access, criteria and classifi...
Definition data_accessor.hpp:80
@ CLONE_DEEP
new Derived(*this), then set_cloned()
Definition clonable.hpp:149
@ CLONE_INHERIT
do not add behavior; defer to the Base class body (typically a family-level throwing default)
Definition clonable.hpp:147
unsigned long fst_rand_below(const unsigned long n)
Returns a pseudo-random index in 0..n-1 (n >= 1); use instead of fst_rand()n.
Definition fst_rand.hpp:112
void notify(const std::string msg)
Prints msg followed by a newline via syncout::print(); a no-op unless the preprocessor macro DEBUG is...
Definition global.hpp:112
Support structure to hold data interval (referring into data held by data accessor).
Definition data_intervaller.hpp:88