1#ifndef FSTDATAACCESSORSPLITTINGMEM_H
2#define FSTDATAACCESSORSPLITTINGMEM_H
100template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
108 typedef std::shared_ptr<Data_Scaler<DATATYPE> >
PScaler;
161 virtual std::ostream&
print(std::ostream& os)
const override;
199 std::shared_ptr<DATATYPE>
data;
210template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
216 {std::ostringstream sos; sos << std::endl <<
"Scaling data (per-feature, over all classes) using " << *
dsc <<
"...";
syncout::print(std::cout,sos);}
220 bool keep_transforms=
true;
221 for(IDXTYPE f=0;f<_features;f++) {
222 for(
bool b=
dsc->startFirstLoop(); b==
true; b=
dsc->startNextLoop())
234 dsc->scale_inplace(
data.get()[idx]);
237 if(keep_transforms) {
242 {std::ostringstream sos; sos <<
"done." << std::endl << std::endl;
syncout::print(std::cout,sos);}
245template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
257 const unsigned int _classes=(
unsigned int)
DAS::classes.size();
259 bool keep_transforms=
true;
260 for(
unsigned int f=0;f<_features;f++)
262 for(
bool b=
dsc->startFirstLoop(); b==
true; b=
dsc->startNextLoop())
264 for(
unsigned int c=0;c<_classes;c++)
266 const INTERVALCONTAINER &train=*(
DAS::splits[0][c]._train);
267 for(
typename INTERVALCONTAINER::const_iterator iter=train.begin();iter!=train.end();++iter)
269 IDXTYPE idx=
_class_offset[c]+((IDXTYPE)iter->startidx)*_features+f;
270 for(IDXTYPE p=0;p<(IDXTYPE)iter->count;p++,idx+=_features)
dsc->learn(
data_raw.get()[idx]);
276 for(
unsigned int c=0;c<_classes;c++)
for(IDXTYPE p=0;p<(IDXTYPE)
DAS::classes[c];p++,idx+=_features)
278 if(keep_transforms) {
285template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
290 throw fst_error(
"Data_Accessor_Splitting_Mem::scale_sample_inplace(): no per-feature scaler transform available (initialize() not called yet, or the scaler does not implement duplicate())");
294template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
302template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
310template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
318 {std::ostringstream sos; sos <<
"Opening file: " <<
filename << std::endl;
syncout::print(std::cout,sos);}
321 std::ostringstream sos;
333 std::ostringstream sos;
334 sos <<
"Splitting depth: " <<
DAS::dsp->size() << std::endl;
347 data.reset(
new DATATYPE[
datasize], std::default_delete<DATATYPE[]>());
356 data.reset(
new DATATYPE[
datasize], std::default_delete<DATATYPE[]>());
358 {std::ostringstream sos; sos << std::endl <<
"Per-split scaling enabled (fit on each depth-0 TRAIN part) using " << *
dsc <<
"." << std::endl;
syncout::print(std::cout,sos);}
362 notify(
"Data_Accessor_Splitting_Mem::initialize() failed.");
367template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
378template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
389template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
402 if(!damt.
dsc)
throw fst_error(
"Data_Accessor_Splitting_Mem weak cc: scaler_fit_train mode requires a scaler instance in the source.");
403 data.reset(
new DATATYPE[
datasize], std::default_delete<DATATYPE[]>());
405 dsc.reset(damt.
dsc->duplicate());
408 notify(
"Data_Accessor_Splitting_Mem weak copy-constructor.");
411template<
typename DATATYPE,
typename IDXTYPE,
class INTERVALCONTAINER>
415 os << std::endl <<
"Data_Accessor_Splitting_Mem(file=" <<
filename <<
")";
bool is_sharing_clone() const
true if this instance is BOTH a clone and sharing – i.e. specifically a sharing_clone() result,...
Definition clonable.hpp:127
Implements data access to data cached entirely in memory, concrete file type support is delegated to ...
Definition data_accessor_splitting_mem.hpp:102
virtual unsigned int file_getNoOfFeatures() const =0
data dimensionality as reported by the underlying file (valid only after initial_file_prepare())
Data_Accessor_Splitting_Mem * clone() const override
Definition data_accessor_splitting_mem.hpp:157
Data_Accessor_Splitting_Mem * stateless_clone() const override
Definition data_accessor_splitting_mem.hpp:159
Data_Accessor_Splitting_Mem(const Data_Accessor_Splitting_Mem &damt, int)
weak (referencing) copy-constructor to be used in sharing_clone()
Definition data_accessor_splitting_mem.hpp:390
bool scaler_fit_train
Definition data_accessor_splitting_mem.hpp:203
IDXTYPE datasize
Definition data_accessor_splitting_mem.hpp:198
virtual bool getFirstBlock(const DataPart ofwhat, PPattern &firstpattern, IDXTYPE &patterns, const unsigned int loopdepth=0) override
returns pointer to first consecutive block of data of requested DataPart type in the current split (a...
Definition data_accessor_splitting_mem.hpp:368
virtual unsigned int file_getNoOfClasses() const =0
number of classes as reported by the underlying file (valid only after initial_file_prepare())
Data_Accessor_Splitting_Mem * sharing_clone() const override=0
Data_Accessor_Splitting_Mem(const std::string _filename, const PSplitters _dsp, const PScaler _dsc)
Definition data_accessor_splitting_mem.hpp:113
DAS::PSplitters PSplitters
Definition data_accessor_splitting_mem.hpp:110
bool get_scaler_fit_train() const
see set_scaler_fit_train()
Definition data_accessor_splitting_mem.hpp:138
std::shared_ptr< DATATYPE > data_raw
Definition data_accessor_splitting_mem.hpp:201
DAS::PPattern PPattern
Definition data_accessor_splitting_mem.hpp:109
virtual std::ostream & print(std::ostream &os) const override
writes the splitter stack's print() output (or "Data_Accessor_Splitting()" if the stack is empty) to ...
Definition data_accessor_splitting_mem.hpp:412
PScaler dsc
Definition data_accessor_splitting_mem.hpp:187
void set_scaler_fit_train(const bool b)
Switches on per-split scaling: the scaler learns its transform on the current depth-0 split's TRAIN p...
Definition data_accessor_splitting_mem.hpp:137
void initial_data_scaling()
Definition data_accessor_splitting_mem.hpp:211
virtual void initial_file_prepare()=0
opens/prepares the underlying file for reading; called once by initialize() before initial_data_read(...
virtual void initialize()
to be called after object creation (for initialization of data file access etc.)
Definition data_accessor_splitting_mem.hpp:311
virtual bool getNextBlock(const DataPart ofwhat, PPattern &firstpattern, IDXTYPE &patterns, const unsigned int loopdepth=0) override
returns pointer to next consecutive block of data of requested DataPart type in the current split (ac...
Definition data_accessor_splitting_mem.hpp:379
void scale_sample_inplace(DATATYPE *sample) const
Applies the learned per-feature transform to sample, a caller-owned vector of getNoOfFeatures() value...
Definition data_accessor_splitting_mem.hpp:286
virtual bool getNextSplit() override
data access iteration (to support, e.g., loops in cross-validation)
Definition data_accessor_splitting_mem.hpp:303
std::shared_ptr< DATATYPE > data
Definition data_accessor_splitting_mem.hpp:199
virtual void initial_data_read()=0
fills the already-allocated data array with the file's samples; called once by initialize() after the...
std::string filename
Definition data_accessor_splitting_mem.hpp:196
virtual bool getFirstSplit() override
data access iteration (to support, e.g., loops in cross-validation)
Definition data_accessor_splitting_mem.hpp:295
virtual IDXTYPE file_getClassSize(unsigned int cls) const =0
number of samples of class cls as reported by the underlying file (valid only after initial_file_prep...
Data_Accessor_Splitting< DATATYPE, IDXTYPE, INTERVALLER > DAS
Definition data_accessor_splitting_mem.hpp:107
void per_split_data_scaling()
re-learns the scaler transform on the current depth-0 TRAIN part and re-scales the whole working buff...
Definition data_accessor_splitting_mem.hpp:246
std::shared_ptr< Data_Scaler< DATATYPE > > PScaler
Definition data_accessor_splitting_mem.hpp:108
std::vector< IDXTYPE > _class_offset
Definition data_accessor_splitting_mem.hpp:205
std::vector< PScaler > feature_scalers
Definition data_accessor_splitting_mem.hpp:194
PSplitters dsp
the splitter stack this accessor was constructed with, one Data_Splitter per nested splitting depth
Definition data_accessor_splitting.hpp:219
std::shared_ptr< std::vector< PSplitter > > PSplitters
shared pointer to the ordered list of splitters, one per nested splitting depth (depth 0 = outermost)
Definition data_accessor_splitting.hpp:154
std::vector< std::vector< DataSplit > > splits
one set of splitters per each splitting depth and class
Definition data_accessor_splitting.hpp:240
std::vector< unsigned int > CLASSSIZES
per-class pattern counts, indexed by class index; the format initialize() takes
Definition data_accessor_splitting.hpp:203
virtual bool getNextSplit() override
data access iteration (to support, e.g., loops in cross-validation)
Definition data_accessor_splitting.hpp:364
virtual std::ostream & print(std::ostream &os) const override
writes the splitter stack's print() output (or "Data_Accessor_Splitting()" if the stack is empty) to ...
Definition data_accessor_splitting.hpp:661
virtual bool getFirstSplit() override
data access iteration (to support, e.g., loops in cross-validation)
Definition data_accessor_splitting.hpp:330
const Data_Interval< IDXTYPE > * DATAINTERVAL
Definition data_accessor_splitting.hpp:220
virtual bool getFirstBlock(const DataPart ofwhat, PPattern &firstpattern, IDXTYPE &patterns, const unsigned int loopdepth=0) override=0
returns pointer to first consecutive block of data of requested DataPart type in the current split (a...
const DATATYPE * PPattern
Definition data_accessor_splitting.hpp:155
int active_class
denotes from which class the get*Train* get*Validate* get*Test* methods return patterns,...
Definition data_accessor_splitting.hpp:248
Data_Accessor_Splitting(const PSplitters _dsp)
Constructs an (uninitialized) accessor bound to the splitter stack _dsp; concrete subclasses must sti...
Definition data_accessor_splitting.hpp:262
virtual bool getNextBlock(const DataPart ofwhat, PPattern &firstpattern, IDXTYPE &patterns, const unsigned int loopdepth=0) override=0
returns pointer to next consecutive block of data of requested DataPart type in the current split (ac...
unsigned int features
data dimensionality, as passed to initialize()
Definition data_accessor_splitting.hpp:209
unsigned int getSplittingDepth() const
the nested splitting level last set via setSplittingDepth()
Definition data_accessor_splitting.hpp:172
CLASSSIZES classes
pattern count per class, as passed to initialize()
Definition data_accessor_splitting.hpp:208
void initialize(const unsigned int _features, const CLASSSIZES &_classes)
Definition data_accessor_splitting.hpp:503
FST4 specific error passing class.
Definition error.hpp:61
static void print(std::ostream &os, std::ostringstream &sos)
Writes sos's buffered content to os, serializing concurrent writers under FST_THREADED via a shared m...
Definition global.hpp:86
Defines support for data splitting.
Defines interface for data scaling implementations (for use in data accessors).
FST4 specific error passing class.
The Feature Selection Toolbox 4 library: every library component – data access, criteria and classifi...
Definition data_accessor.hpp:80
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
DataPart
Selects which part of a split's data a block-access call reads.
Definition data_accessor.hpp:83
IDXTYPE startidx
index of the interval's first sample
Definition data_intervaller.hpp:89
IDXTYPE count
number of samples in the interval
Definition data_intervaller.hpp:90