00001
00002
00003 #include "PhysicsTools/StatPatternRecognition/interface/SprExperiment.hh"
00004 #include "PhysicsTools/StatPatternRecognition/interface/SprData.hh"
00005 #include "PhysicsTools/StatPatternRecognition/interface/SprPoint.hh"
00006 #include "PhysicsTools/StatPatternRecognition/interface/SprClass.hh"
00007
00008 #include <cassert>
00009 #include <utility>
00010 #include <functional>
00011 #include <algorithm>
00012
00013 using namespace std;
00014
00015
00016 SprData::~SprData()
00017 {
00018 this->clear();
00019 }
00020
00021
00022 void SprData::clear()
00023 {
00024 if( ownPoints_ ) {
00025 for( int i=0;i<data_.size();i++ )
00026 delete data_[i];
00027 }
00028 data_.clear();
00029 }
00030
00031
00032 SprPoint* SprData::insert(unsigned index, int cls,
00033 const std::vector<double>& v)
00034 {
00035
00036 assert( !v.empty() );
00037 if( data_.empty() && dim_==0 )
00038 dim_ = v.size();
00039 else {
00040 if( dim_ != v.size() ) {
00041 cerr << "Dimensionality of input vector does not match dimensionality "
00042 << "of space: " << v.size() << " " << dim_ << endl;
00043 return 0;
00044 }
00045 }
00046
00047
00048 SprPoint* p = new SprPoint(index,cls,v);
00049 data_.push_back(p);
00050
00051
00052 return p;
00053 }
00054
00055 SprPoint* SprData::insert(SprPoint* p)
00056 {
00057
00058 assert( !p->empty() );
00059 if( data_.empty() && dim_==0 )
00060 dim_ = p->dim();
00061 else {
00062 if( dim_ != p->dim() ) {
00063 cerr << "Dimensionality of input vector does not match dimensionality "
00064 << "of space: " << p->dim() << " " << dim_ << endl;
00065 return 0;
00066 }
00067 }
00068
00069
00070 data_.push_back(p);
00071
00072
00073 return p;
00074 }
00075
00076
00077 SprPoint* SprData::insert(int cls, const std::vector<double>& v)
00078 {
00079 return this->insert(data_.size(),cls,v);
00080 }
00081
00082
00083 bool SprData::setVars(const std::vector<std::string>& vars)
00084 {
00085 assert( !vars.empty() );
00086 if( dim_ == 0 )
00087 dim_ = vars.size();
00088 else {
00089 if( dim_ != vars.size() ) {
00090 cerr << "Number of variables does not match dimensionality "
00091 << "of space: " << vars.size() << " " << dim_ << endl;
00092 return false;
00093 }
00094 }
00095 vars_ = vars;
00096 return true;
00097 }
00098
00099
00100 unsigned SprData::ptsInClass(const SprClass& cls) const
00101 {
00102 return count_if(data_.begin(),data_.end(),
00103 bind2nd(mem_fun(&SprPoint::class_eq),cls));
00104 }
00105
00106
00107 SprPoint* SprData::find(unsigned index) const
00108 {
00109 vector<SprPoint*>::const_iterator iter
00110 = find_if(data_.begin(),data_.end(),
00111 bind2nd(mem_fun(&SprPoint::index_eq),index));
00112 if( iter == data_.end() )
00113 return 0;
00114 return *iter;
00115 }
00116
00117
00118 int SprData::dimIndex(const char* var) const
00119 {
00120 vector<string>::const_iterator iter = ::find(vars_.begin(),vars_.end(),var);
00121 if( iter == vars_.end() )
00122 return -1;
00123 return (iter-vars_.begin());
00124 }
00125
00126
00127 SprData* SprData::emptyCopy() const
00128 {
00129 SprData* copy = new SprData(false);
00130 copy->setDim(dim_);
00131 copy->setVars(vars_);
00132 copy->setLabel(label_.c_str());
00133 return copy;
00134 }
00135
00136
00137 SprData* SprData::copy() const
00138 {
00139 SprData* copy = this->emptyCopy();
00140 copy->data_ = data_;
00141 return copy;
00142 }
00143