1#ifndef FSTRESULTTRACKERSTABILEVAL_H
2#define FSTRESULTTRACKERSTABILEVAL_H
108template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
121 virtual bool add(
const RETURNTYPE value,
const PSubset sub)
override;
123 virtual std::size_t
size()
const override {
return results.size();}
168 virtual std::ostream&
print(std::ostream& os)
const override {os <<
"Result_Tracker_Stability_Evaluator(limit=" <<
_capacity_limit <<
") size " <<
size();
return os;}
197template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
205 while(iter!=
results.end() && (value<iter->value || (value==iter->value && sub->get_d()>iter->sub->get_d()))) iter++;
212template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
215 if(
results.empty())
return false;
222template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
231template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
234 if(
results.empty())
throw fst_error(
"Result_Tracker_Stability_Evaluator::value_mean() called on empty list.");
237 return mean/(RETURNTYPE)
results.size();
240template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
243 if(
results.empty())
throw fst_error(
"Result_Tracker_Stability_Evaluator::value_stddev() called on empty list.");
247 return sqrt(sd/(RETURNTYPE)
results.size());
250template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
253 if(
results.empty())
throw fst_error(
"Result_Tracker_Stability_Evaluator::size_mean() called on empty list.");
256 return mean/(RETURNTYPE)
results.size();
259template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
262 if(
results.empty())
throw fst_error(
"Result_Tracker_Stability_Evaluator::size_stddev() called on empty list.");
265 for(
CONSTRESULTSITER iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub); sd+=(iter->sub->get_d_raw()-mean)*(iter->sub->get_d_raw()-mean);}
266 return sqrt(sd/(RETURNTYPE)
results.size());
269template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
277 DIMTYPE ss=iter->sub->get_n_raw();
285template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
291 RETURNTYPE result=0.0;
296 for(iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub);
if(iter->sub->selected_raw(f)) fcnt++;}
298 result+=(RETURNTYPE)(fcnt-1)/(RETURNTYPE)(
size-1);
302 if(count==0)
return 0.0;
303 return result/(RETURNTYPE)count;
305 else if(
size==1)
return 1.0;
309template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
315 RETURNTYPE result=0.0;
319 for(iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub); fcntsum+=iter->sub->get_d_raw();}
323 for(iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub);
if(iter->sub->selected_raw(f)) fcnt++;}
325 result+=((RETURNTYPE)(fcnt)/(RETURNTYPE)(fcntsum)) * ((RETURNTYPE)(fcnt-1)/(RETURNTYPE)(
size-1));
331 if(count==0)
return 0.0;
334 else if(
size==1)
return 1.0;
338template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
345 RETURNTYPE result=0.0;
349 for(iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub); N+=iter->sub->get_d_raw();}
351 for(DIMTYPE f=0;f<Ysiz;f++) {
353 for(iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub);
if(iter->sub->selected_raw(f)) fcnt++;}
355 result+=((RETURNTYPE)(fcnt)/(RETURNTYPE)(N)) * ((RETURNTYPE)(fcnt-1)/(RETURNTYPE)(
size-1));
359 if(count==0)
return 0.0;
367 long D=N%Y, H=N%
size;
368 RETURNTYPE CWmin=(RETURNTYPE)((RETURNTYPE)N*(RETURNTYPE)N-(RETURNTYPE)Y*(RETURNTYPE)(N-D)-D*D)/(RETURNTYPE)((RETURNTYPE)Y*(RETURNTYPE)N*(RETURNTYPE)(
size-1));
369 RETURNTYPE CWmax=(RETURNTYPE)(H*H+N*(
size-1)-H*
size)/(RETURNTYPE)(N*(
size-1));
370 if(CWmax>CWmin)
return (result-CWmin)/(CWmax-CWmin);
else return result;
372 else if(
size==1)
return 1.0;
376template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
382 RETURNTYPE result=0.0;
386 for(iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub); fcntsum+=iter->sub->get_d_raw();}
390 for(iter=
results.begin();iter!=
results.end();iter++) {assert(iter->sub);
if(iter->sub->selected_raw(f)) fcnt++;}
392 result+=fcnt * (log((
double)fcnt)/log((
double)2.0));
396 if(count==0)
return 0.0;
397 return result/(fcntsum*(log((
double)
size)/log((
double)2.0)));
399 else if(
size==1)
return 1.0;
403template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
410 RETURNTYPE result=0.0;
411 for(DIMTYPE f=0;f<Ysiz;f++) {
414 result+=((fcnt>
size-fcnt)?(RETURNTYPE)fcnt/(RETURNTYPE)
size:(RETURNTYPE)(
size-fcnt)/(RETURNTYPE)
size);
416 return 2.0*result/(RETURNTYPE)Ysiz -1.0;
418 else if(
size==1)
return 1.0;
422template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
427 const DIMTYPE Ysiz=
maxf<DIMTYPE>(sub1->get_n_raw(),sub2->get_n_raw());
430 if((DIMTYPE)TI_mask.size()<Ysiz) {
431 TI_mask.resize(Ysiz);
432 notify(
"get_ATI reallocation.");
436 for(f=0;f<Ysiz;f++) TI_mask[f]=0;
438 for(DIMTYPE fsel : sub1->selected_features()) {assert(fsel<Ysiz); TI_mask[fsel]++;}
439 for(DIMTYPE fsel : sub2->selected_features()) {assert(fsel<Ysiz); TI_mask[fsel]++;}
441 DIMTYPE SAS=0, SUS=0;
442 for(f=0;f<Ysiz;f++) {
if(TI_mask[f]==2) SAS++;
if(TI_mask[f]!=0) SUS++;}
443 if(SUS==0) {
notify(
"Warning: get_TI(): SUS==0.");
return -1.0;}
444 else return (RETURNTYPE)SAS/(RETURNTYPE)SUS;
447template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
453 RETURNTYPE result=0.0;
457 iter2=iter1; iter2++;
459 result+=
get_TI(iter1->sub,iter2->sub);
463 return (2.0/(
size*(
size-1)))*result;
465 else if(
size==1)
return 1.0;
469template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
476 if((DIMTYPE)NHI_mask.size()<Ysiz) {
477 NHI_mask.resize(Ysiz);
478 notify(
"get_ANHI reallocation.");
482 for(f=0;f<Ysiz;f++) NHI_mask[f]=0;
484 for(DIMTYPE fsel : sub1->selected_features()) {assert(fsel<Ysiz); NHI_mask[fsel]++;}
485 for(DIMTYPE fsel : sub2->selected_features()) {assert(fsel<Ysiz); NHI_mask[fsel]++;}
488 for(f=0;f<Ysiz;f++)
if(NHI_mask[f]==1) SES++;
489 return 1.0-(RETURNTYPE)SES/(RETURNTYPE)Ysiz;
492template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
499 RETURNTYPE result=0.0;
503 iter2=iter1; iter2++;
505 result+=
get_NHI(Ysiz,iter1->sub,iter2->sub);
509 return (2.0/(
size*(
size-1)))*result;
511 else if(
size==1)
return 1.0;
515template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
518 const long size1=
results.size();
519 const long size2=rtse.
results.size();
520 if(size1>0 && size2>0)
525 if((DIMTYPE)F1.size()<Ysiz) {
528 notify(
"similarity_IC reallocation.");
531 for(f=0;f<Ysiz;f++) F1[f]=F2[f]=0;
532 for(f=0;f<Ysiz;f++) {
534 for(iter1=
results.begin();iter1!=
results.end();iter1++) {assert(iter1->sub);
if(iter1->sub->selected_raw(f)) F1[f]++;}
536 for(iter2=rtse.
results.begin();iter2!=rtse.
results.end();iter2++) {assert(iter2->sub);
if(iter2->sub->selected_raw(f)) F2[f]++;}
538 RETURNTYPE result=0.0;
540 for(f=0;f<Ysiz;f++) {
541 if(F1[f]>0 || F2[f]>0) {
542 result+=fabs( (RETURNTYPE)(F1[f])/(RETURNTYPE)(size1) - (RETURNTYPE)(F2[f])/(RETURNTYPE)(size2) );
547 return 1.0 - result/(RETURNTYPE)count;
548 }
else {
notify(
"Warning: similarity_IC(): nothing to compare.");
return 0.0;}
551template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
554 const long size1=
results.size();
555 const long size2=rtse.
results.size();
556 if(size1>0 && size2>0)
561 if((DIMTYPE)F1.size()<Ysiz) {
564 notify(
"similarity_ICW reallocation.");
567 for(f=0;f<Ysiz;f++) F1[f]=F2[f]=0;
568 for(f=0;f<Ysiz;f++) {
570 for(iter1=
results.begin();iter1!=
results.end();iter1++) {assert(iter1->sub);
if(iter1->sub->selected_raw(f)) F1[f]++;}
572 for(iter2=rtse.
results.begin();iter2!=rtse.
results.end();iter2++) {assert(iter2->sub);
if(iter2->sub->selected_raw(f)) F2[f]++;}
574 RETURNTYPE fcntsum=0.0;
575 for(f=0;f<Ysiz;f++) {
576 fcntsum+=
maxf<RETURNTYPE>( (RETURNTYPE)(F1[f])/(RETURNTYPE)(size1) , (RETURNTYPE)(F2[f])/(RETURNTYPE)(size2) );
579 RETURNTYPE result=0.0;
580 for(f=0;f<Ysiz;f++) {
581 result+=(
maxf<RETURNTYPE>( (RETURNTYPE)(F1[f])/(RETURNTYPE)(size1) , (RETURNTYPE)(F2[f])/(RETURNTYPE)(size2) ) / fcntsum) * fabs( (RETURNTYPE)(F1[f])/(RETURNTYPE)(size1) - (RETURNTYPE)(F2[f])/(RETURNTYPE)(size2) );
585 else {
notify(
"Warning: similarity_ICW(): nothing to compare.");
return 0.0;}
588template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
591 const long size1=
results.size();
592 const long size2=rtse.
results.size();
593 if(size1>0 && size2>0)
595 RETURNTYPE result=0.0;
604 result+=
get_TI(iter1->sub,iter2->sub);
607 return (1.0/((RETURNTYPE)size1*(RETURNTYPE)(size2)))*result;
609 else {
notify(
"Warning: similarity_IATI(): nothing to compare.");
return 0.0;}
612template<
class RETURNTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET>
615 const long size1=
results.size();
616 const long size2=rtse.
results.size();
617 if(size1>0 && size2>0)
620 RETURNTYPE result=0.0;
629 result+=
get_NHI(Ysiz,iter1->sub,iter2->sub);
632 return (1.0/((RETURNTYPE)size1*(RETURNTYPE)(size2)))*result;
634 else {
notify(
"Warning: similarity_IANHI(): nothing to compare.");
return 0.0;}
CRTP mixin implementing the Clonable protocol for a concrete class.
Definition clonable.hpp:184
Collects multiple results to evaluate various stability measures on the collection.
Definition result_tracker_stabileval.hpp:109
virtual std::ostream & print(std::ostream &os) const override
writes a human-readable identification of the object; base default writes nothing
Definition result_tracker_stabileval.hpp:168
Result_Tracker_Stability_Evaluator(const IDXTYPE capacity_limit=0)
Definition result_tracker_stabileval.hpp:117
RETURNTYPE size_stddev() const
standard deviation of the size of ResultRec::sub subsets; throws fst_error on an empty collection
Definition result_tracker_stabileval.hpp:260
RETURNTYPE value_stddev() const
standard deviation of the ResultRec::value values; throws fst_error on an empty collection
Definition result_tracker_stabileval.hpp:241
std::list< ResultRec > results
held results, sorted descending by value (ties broken toward the smaller subset); duplicates are perm...
Definition result_tracker_stabileval.hpp:170
std::vector< int > _sim_F1
similarity_IC()/similarity_ICW() scratch: per-feature selection count over this tracker's results
Definition result_tracker_stabileval.hpp:191
std::shared_ptr< SUBSET > PSubset
Definition result_tracker_stabileval.hpp:115
RETURNTYPE size_mean() const
mean value of the size of ResultRec::sub subsets; throws fst_error on an empty collection
Definition result_tracker_stabileval.hpp:251
RETURNTYPE stability_CW() const
Definition result_tracker_stabileval.hpp:310
DIMTYPE max_features() const
size of the feature universe the held results were selected from: the largest sub->get_n_raw() over t...
Definition result_tracker_stabileval.hpp:270
Result_Tracker_Stability_Evaluator(const Result_Tracker_Stability_Evaluator &rtse)
copies the capacity limit only; the results list is NOT copied (starts empty) – this constructor back...
Definition result_tracker_stabileval.hpp:118
Clonable_Impl< Result_Tracker_Stability_Evaluator, parent, CLONE_INHERIT, CLONE_INHERIT, CLONE_DEEP > parent_impl
implements stateless_clone() via the copy-constructor (CLONE_DEEP); clone()/sharing_clone() are inher...
Definition result_tracker_stabileval.hpp:112
virtual bool add(const RETURNTYPE value, const PSubset sub) override
records one (value, subset) result; returns false if the tracker declines to keep it (concrete tracke...
Definition result_tracker_stabileval.hpp:198
std::list< ResultRec >::const_iterator CONSTRESULTSITER
read-only iterator over results, used throughout the stability/similarity measure computations
Definition result_tracker_stabileval.hpp:178
RETURNTYPE similarity_ICW(const Result_Tracker_Stability_Evaluator< RETURNTYPE, IDXTYPE, DIMTYPE, SUBSET > &rtse) const
similarity measure "ICW", the two-collection counterpart of stability_CW(); [0,1],...
Definition result_tracker_stabileval.hpp:552
std::vector< int > _sim_F2
similarity_IC()/similarity_ICW() scratch: per-feature selection count over the other tracker's result...
Definition result_tracker_stabileval.hpp:192
RETURNTYPE stability_ATI() const
Definition result_tracker_stabileval.hpp:448
RETURNTYPE similarity_IATI(const Result_Tracker_Stability_Evaluator< RETURNTYPE, IDXTYPE, DIMTYPE, SUBSET > &rtse) const
Definition result_tracker_stabileval.hpp:589
RETURNTYPE stability_CWrel(const DIMTYPE Ysiz) const
stability measure "CW_{rel}": "CW" rescaled between the minimum and maximum attainable for the observ...
Definition result_tracker_stabileval.hpp:339
RETURNTYPE get_NHI(const DIMTYPE Ysiz, const PSubset &sub1, const PSubset &sub2) const
pairwise normalized Hamming index of sub1 and sub2 over an explicit Ysiz-feature universe: 1 - (symme...
Definition result_tracker_stabileval.hpp:470
RESULTSITER getiter
iteration cursor for get_first()/get_next() (single shared cursor, not reentrant)
Definition result_tracker_stabileval.hpp:184
std::vector< int > _ti_mask
get_TI() scratch: per-feature selection count (0/1/2) over the current pair
Definition result_tracker_stabileval.hpp:189
Result_Tracker< RETURNTYPE, SUBSET > parent
the abstract Result_Tracker interface this class implements
Definition result_tracker_stabileval.hpp:111
RETURNTYPE similarity_IANHI(const DIMTYPE Ysiz, const Result_Tracker_Stability_Evaluator< RETURNTYPE, IDXTYPE, DIMTYPE, SUBSET > &rtse) const
similarity measure "IANHI": mean normalized Hamming index over all cross pairs (one subset from each ...
Definition result_tracker_stabileval.hpp:613
RETURNTYPE stability_C() const
stability measure "C" (consistency: mean over features of the relative frequency of co-occurrence in ...
Definition result_tracker_stabileval.hpp:286
parent::ResultRec ResultRec
see Result_Tracker::ResultRec
Definition result_tracker_stabileval.hpp:113
RETURNTYPE stability_ANHI(const DIMTYPE Ysiz) const
stability measure "ANHI" (average pairwise normalized Hamming index over all pairs of held subsets)....
Definition result_tracker_stabileval.hpp:493
RETURNTYPE stability_PH(const DIMTYPE Ysiz) const
stability measure "PH" (relative Hamming distance between the held subsets, expressed as agreement)....
Definition result_tracker_stabileval.hpp:404
RETURNTYPE get_TI(const PSubset &sub1, const PSubset &sub2) const
pairwise Tanimoto-style index of sub1 and sub2: (size of selected-feature intersection) / (size of se...
Definition result_tracker_stabileval.hpp:423
std::list< ResultRec >::iterator RESULTSITER
mutable iterator over results, as returned by begin()/end()
Definition result_tracker_stabileval.hpp:179
const IDXTYPE _capacity_limit
set by the constructor; 0 = unlimited
Definition result_tracker_stabileval.hpp:171
RESULTSITER end()
iterator past the last held result
Definition result_tracker_stabileval.hpp:181
RESULTSITER begin()
iterator to the best (first) held result
Definition result_tracker_stabileval.hpp:180
RETURNTYPE value_mean() const
mean value of the ResultRec::value values; throws fst_error on an empty collection
Definition result_tracker_stabileval.hpp:232
RETURNTYPE similarity_IC(const Result_Tracker_Stability_Evaluator< RETURNTYPE, IDXTYPE, DIMTYPE, SUBSET > &rtse) const
similarity measure "IC", the two-collection counterpart of stability_C(); [0,1], higher = more simila...
Definition result_tracker_stabileval.hpp:516
virtual void clear() override
discards all recorded results
Definition result_tracker_stabileval.hpp:122
RETURNTYPE stability_SH() const
Definition result_tracker_stabileval.hpp:377
virtual bool get_first(PResultRec &r) override
iterator
Definition result_tracker_stabileval.hpp:213
virtual std::size_t size() const override
number of results currently held (std::size_t rather than 'long': on LLP64 platforms 'long' is 32 bit...
Definition result_tracker_stabileval.hpp:123
std::vector< int > _nhi_mask
get_NHI() scratch: per-feature selection count (0/1/2) over the current pair
Definition result_tracker_stabileval.hpp:190
ResultRec * PResultRec
raw pointer to a ResultRec, as used by get_first()/get_next() iteration
Definition result_tracker_stabileval.hpp:114
virtual bool get_next(PResultRec &r) override
iterator
Definition result_tracker_stabileval.hpp:223
Abstract class, defines interface for classes that enable collecting multiple results.
Definition result_tracker.hpp:91
FST4 specific error passing class.
Definition error.hpp:61
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
VALUE maxf(const VALUE &x, const VALUE &y)
Returns the greater of x and y (strict '>' comparison; ties return y).
Definition global.hpp:178
Defines interface for classes that enable collecting multiple results.
Structure to hold [subset,criterion value] temporary solutions in the course of search.
Definition result_tracker.hpp:99
RETURNTYPE value
the criterion value of the recorded subset
Definition result_tracker.hpp:100
PSubset sub
the recorded subset itself
Definition result_tracker.hpp:101