00001 #ifndef Impala_Core_Training_ApplyConceptsHelperFik_h 00002 #define Impala_Core_Training_ApplyConceptsHelperFik_h 00003 00004 #include "Core/Training/ApplyConceptsHelper.h" 00005 #include "Persistency/FeatureTableRepository.h" 00006 #include "Persistency/FikSvmRepository.h" 00007 #include "Util/SimpleMap.h" 00008 00009 namespace Impala 00010 { 00011 namespace Core 00012 { 00013 namespace Training 00014 { 00015 00016 00017 class ApplyConceptsHelperFik : public ApplyConceptsHelper 00018 { 00019 public: 00020 00021 ApplyConceptsHelperFik() 00022 { 00023 } 00024 00025 virtual 00026 ~ApplyConceptsHelperFik() 00027 { 00028 mModels.Clear(); 00029 } 00030 00031 void 00032 Initialise(Database::RawDataSet* annoSet, const ModelLocator& modelLoc) 00033 { 00034 FikSvm* svm = Persistency::FikSvmRepository().Get(modelLoc); 00035 mFeatureDefs = *(svm->GetFeatureList()); 00036 mModels.Add(modelLoc.ToString(), svm); 00037 } 00038 00039 FeatureTable* 00040 LoadFeatures(const FeatureLocator& featLoc) 00041 { 00042 typedef Persistency::FeatureTableRepository FeatureTableRepository; 00043 int sizeCheck = -1; 00044 for (int i=0 ; i<mFeatureDefs.Size() ; i++) 00045 { 00046 FeatureLocator fLoc = featLoc; 00047 fLoc.SetFeatureString(mFeatureDefs.GetFeature(i)); 00048 FeatureTable* feature = FeatureTableRepository().Get(fLoc); 00049 if (sizeCheck == -1) 00050 { 00051 sizeCheck = feature->Size(); 00052 ILOG_INFO("size of apply set is " << sizeCheck); 00053 } 00054 if (feature->Size() != sizeCheck) 00055 { 00056 ILOG_ERROR("Size mismatch in the FeatureData for the dataset to" 00057 << " apply to: have " << sizeCheck << " and " << 00058 feature->Size()); 00059 return 0; 00060 } 00061 mFeatures.push_back(feature); 00062 } 00063 return mFeatures[0]; 00064 } 00065 00066 Table::ScoreTable* 00067 Predict(const ModelLocator& loc) 00068 { 00069 FikSvm* svm = 0; 00070 if (!mModels.Get(loc.ToString(), svm)) 00071 { 00072 svm = Persistency::FikSvmRepository().Get(loc); 00073 mModels.Add(loc.ToString(), svm); 00074 } 00075 00076 Table::ScoreTable* scores = new Table::ScoreTable(); 00077 int nrVec = mFeatures[0]->Size(); 00078 for (int v=0 ; v<nrVec ; v++) 00079 { 00080 Real64 score = 0; 00081 for (int f=0 ; f<mFeatureDefs.Size() ; f++) 00082 { 00083 FeatureTable::VectorReal64 vec = mFeatures[f]->Get2(v); 00084 Real64 subScore = svm->Apply(f, vec); 00085 subScore += svm->GetRho(); // correct for incremental feature 00086 subScore *= mFeatureDefs.GetWeight(f); 00087 score += subScore; 00088 } 00089 score /= mFeatureDefs.GetTotalWeight(); 00090 score -= svm->GetRho(); // correct for incremental feature 00091 00092 score = svm->PredictProbability(score); 00093 scores->Add(mFeatures[0]->Get1(v), score); 00094 } 00095 return scores; 00096 } 00097 00098 void 00099 UnloadFeatures() 00100 { 00101 for (int i=0 ; i<mFeatures.size() ; i++) 00102 delete mFeatures[i]; 00103 mFeatures.clear(); 00104 } 00105 00106 private: 00107 00108 Feature::WeightedFeatureList mFeatureDefs; 00109 std::vector<FeatureTable*> mFeatures; 00110 Util::SimpleMapDelete<String, FikSvm*> mModels; 00111 00112 ILOG_VAR_DEC; 00113 }; 00114 00115 ILOG_VAR_INIT(ApplyConceptsHelperFik, Impala.Core.Training); 00116 00117 } //namespace 00118 } //namespace 00119 } //namespace 00120 00121 #endif