Main Page | Modules | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

Analyzer.cpp

Go to the documentation of this file.
00001 #include "Analyzer.h"
00002 #include <log.h>
00003 
00004 using namespace model;
00005 
00009 Analyzer::Analyzer()
00010 {
00011         log::write("Analyzer Init");
00012 }
00013 
00029 Analyzer::~Analyzer()
00030 {
00031         m_ExampleData = 0;
00032         m_mean = 0;
00033         m_AdjustedData = 0;
00034         m_Covariance = 0;
00035         m_EigenValues = 0;
00036         m_EigenVectors = 0;
00037 }
00038 
00060 void Analyzer::mergeData(ReferenceModel refModel, vector<ExampleModel*> lmodels) {
00061         mergeData(refModel, lmodels,(int)lmodels.size());
00062 }
00063 
00088 void Analyzer::mergeData(ReferenceModel refModel, vector<ExampleModel*> lmodels, int size)
00089 {
00090         log::write("Analyzer merge data");
00091         log::write("Number of models",size);
00092         m_refModel = refModel;
00093         for(int i=0;i<size;i++) {
00094                 Matrix mv = lmodels[i]->getModelVertexs();
00095                 if(i==0) {
00096                         m_ExampleData = mv;
00097                 } else {
00098                         m_ExampleData = m_ExampleData | mv;
00099                 }
00100         }
00101         N = m_ExampleData.Ncols();
00102         M = m_ExampleData.Nrows();
00103         log::write("N",N);
00104         log::write("M",M);
00105         log::write("Example Data",m_ExampleData);
00106 }
00107 
00126 void Analyzer::setData(Matrix data)
00127 {
00128         m_ExampleData = data;
00129 }
00130 
00131 
00150 void Analyzer::mean()
00151 {
00152         log::write("Analyzer mean");
00153         m_mean = Matrix(M,1); //[M x 1]
00154         for(int i=1;i <= M; i++)
00155         {
00156                 /*    printf("Integer %d\n", i);
00157                 printf("Cols: %d\n", data.Ncols()); 
00158                 printf("Sum: %f\n", data.Row(i).Sum());*/
00159                 m_mean(i,1) = 1.0/N * m_ExampleData.Row(i).Sum();
00160         }
00161         log::write("Mean",m_mean);
00162 }
00163 
00179 void Analyzer::adjust()
00180 {
00181         log::write("Analyzer adjust");
00182         Matrix h = Matrix(1,N);
00183         h = 1;
00184         /*cout << setw(10) << setprecision(5) << m_ExampleData;
00185         cout << setw(10) << setprecision(5) << m_mean;
00186         cout << setw(10) << setprecision(5) << h;
00187         cout << setw(10) << setprecision(5) << (m_mean * h);*/
00188         m_AdjustedData = m_ExampleData - (m_mean * h);
00189         log::write("Adjusted Data",m_AdjustedData);
00190 }
00191 
00207 void Analyzer::covariance()
00208 {
00209         log::write("Analyzer covariance");
00210         m_Covariance = m_AdjustedData/(N-1) * m_AdjustedData.t();
00211         log::write("Covariance",m_Covariance);
00212 }
00213 
00229 void Analyzer::findComponents()
00230 {
00231   findComponents(JACOBI);
00232 }
00233 
00252 void Analyzer::findComponents(e_PCAMode mode)
00253 {
00254         log::write("Analyzer find components");
00255         DiagonalMatrix dm(M);
00256         SymmetricMatrix test;
00257         test << m_Covariance;
00258         
00259         switch (mode)
00260         {
00261           case JACOBI:
00262             log::write("Calculating with Jacobi");
00263             Jacobi(test, dm, m_EigenVectors);
00264             break;
00265           case HOUSEHOLDER:
00266             log::write("Calculating with Householder");
00267             EigenValues(test, dm, m_EigenVectors);
00268             break;
00269           case OTHER:
00270             log::write("Calculating with Jacobi (matched OTHER)");
00271             Jacobi(test, dm, m_EigenVectors);
00272             break;
00273           default:
00274             log::write("Calculating with Jacobi (matched default)");
00275             Jacobi(test, dm, m_EigenVectors);
00276             break;
00277         }
00278         //Jacobi(test, dm, m_EigenVectors);
00279         //EigenValues(test, dm, m_EigenVectors);
00280         m_EigenValues << dm;
00281 
00282         log::write("Eigen Vectors",m_EigenVectors);
00283         log::write("Eigen Values",m_EigenValues);
00284 }
00285 
00301 void Analyzer::computeEnergy()
00302 {
00303         log::write("Analyzer compute energy");
00304         //Requires that EigenVectors and Values are sorted pair-wise. Should be done
00305         //by the matrix library i believe (this should be tested somehow)
00306 
00307         m_TotalEnergy = Matrix(M,1); // [ M x 1 ]
00308         m_EigenValues = m_EigenValues.Reverse();
00309         m_TotalEnergy(1,1) = m_EigenValues(1,1);
00310         for(int i=2;i<=M;i++)
00311         {
00312                 m_TotalEnergy(i,1) = m_TotalEnergy(i-1,1) + m_EigenValues(i,i);
00313         }
00314         log::write("Total Energy",m_TotalEnergy);
00315 }
00316 
00317 
00333 void Analyzer::selectComponents()
00334 {
00335         log::write("Analyzer select Components");
00336         int index = 1;
00337         float percent = 0.0;
00338 
00339         do
00340         {
00341                 percent = ((m_TotalEnergy(1,m_TotalEnergy.Ncols()) - m_TotalEnergy(1,index)) * m_TotalEnergy(1,m_TotalEnergy.Ncols()))/100.0;
00342                 log::write("Percent calc",percent);
00343                 index++;
00344         }
00345         while(percent <= 90.0 && percent > 0.0);
00346 
00347         m_Components = m_EigenVectors.Reverse().Columns(1,index-1).Reverse();
00348         log::write("Components",m_Components);
00349 }
00350 
00351 
00367 void Analyzer::transformation()
00368 {
00369         log::write("Analyzer Transformation Matrix");
00370         // m_Covariance should perhaps be normalized - see wikipedia for info.
00371         m_Transformation = m_Components.t() * m_AdjustedData;
00372         log::write("Transformation",m_Transformation);
00373 }
00374 
00393 ReferenceModel Analyzer::getModel() {
00394         Matrix h = Matrix(1,N);
00395         h = 1;
00396         m_refModel.updateVertices(m_Components*m_Transformation+(m_mean*h));
00397         return m_refModel;
00398 }
00399 
00421 ReferenceModel Analyzer::getModel(Matrix input) {
00422     log::write("Analyzer::getModel\n");
00423         Matrix h = Matrix(1,N);
00424         h = 1;
00425         Matrix in = m_Components*input+(m_mean * h);
00426         log::write("Analyzer-in",in);
00427         m_refModel.updateVertices(in);
00428         log::write("Analyzer-refModel",m_refModel);
00429         return m_refModel;
00430 }
00431 
00450 int Analyzer::getInputDimension() {
00451         return m_Components.Ncols();
00452 }
00453 
00475 bool Analyzer::save(char* filename) {
00476         ofstream saveFile(filename);
00477         if(saveFile.is_open()) {
00478                 saveFile << "Mean Dim\n";
00479                 saveFile << m_mean.Nrows() << "," << m_mean.Ncols() << "\n";
00480                 saveFile << m_mean << "\n";
00481                 saveFile << "Components Dim\n";
00482                 saveFile << m_Components.Nrows() << "," << m_Components.Ncols() << "\n";
00483                 saveFile << m_Components << "\n";
00484                 m_refModel.save(&saveFile);
00485                 saveFile.close();
00486                 return true;
00487         } else {
00488                 return false;
00489         }
00490 }
00491 
00513 bool Analyzer::load(char* filename) {
00514         m_mean.CleanUp();
00515         m_Components.CleanUp();
00516         m_refModel = model::ReferenceModel();
00517 
00518         string line;
00519         vector<string> tokens;
00520         vector<string> coords;
00521 
00522         ifstream loadFile(filename);
00523         if(loadFile.is_open()) {
00524                 getline(loadFile,line);//Mean Dim
00525                 getline(loadFile,line);//Dim
00526                 tokens.clear();
00527                 Tokenize(line,tokens,",");
00528                 m_mean = Matrix(convertTo<int>(tokens[0]),convertTo<int>(tokens[1]));
00529 
00530                 for(int i=0;i<m_mean.Nrows();i++) {
00531                         getline(loadFile,line);//Data
00532                         tokens.clear();
00533                         Tokenize(line,tokens," ");
00534                         for(int n=0;n<m_mean.Ncols();n++) {
00535                                 m_mean(i+1,n+1) = convertTo<float>(tokens[n]);
00536                         }
00537                 }
00538 
00539                 getline(loadFile,line);//
00540                 getline(loadFile,line);//Components Dim
00541                 getline(loadFile,line);//Dim
00542                 tokens.clear();
00543                 Tokenize(line,tokens,",");
00544                 m_Components = Matrix(convertTo<int>(tokens[0]),convertTo<int>(tokens[1]));
00545 
00546                 for(int i=0;i<m_Components.Nrows();i++) {
00547                         getline(loadFile,line);//Data
00548                         tokens.clear();
00549                         Tokenize(line,tokens," ");
00550                         for(int n=0;n<m_Components.Ncols();n++) {
00551                                 m_Components(i+1,n+1) = convertTo<float>(tokens[n]);
00552                         }
00553                 }
00554                 
00555                 getline(loadFile,line);//
00556                 m_refModel.load(&loadFile);
00557                 loadFile.close();
00558                 return true;
00559         } else {
00560                 return false;
00561         }
00562 }
00563 
00564 
00583 Analyzer::Analyzer(const Analyzer& other) {
00584         m_ExampleData = other.m_ExampleData;
00585         m_mean = other.m_mean;
00586         m_AdjustedData = other.m_AdjustedData;
00587         m_Covariance = other.m_Covariance;
00588         m_EigenValues = other.m_EigenValues;
00589         m_EigenVectors = other.m_EigenVectors;
00590         m_TotalEnergy = other.m_TotalEnergy;
00591         m_Components = other.m_Components;
00592         m_Transformation = other.m_Transformation;
00593         N = other.N;
00594         M = other.M;
00595         m_refModel = other.m_refModel;
00596 }  
00597 
00598 
00620 Analyzer& Analyzer::operator=(const Analyzer& other)
00621 {
00622     // if same object
00623     if ( this == &other )
00624         return *this;
00625         
00626         m_ExampleData = other.m_ExampleData;
00627         m_mean = other.m_mean;
00628         m_AdjustedData = other.m_AdjustedData;
00629         m_Covariance = other.m_Covariance;
00630         m_EigenValues = other.m_EigenValues;
00631         m_EigenVectors = other.m_EigenVectors;
00632         m_TotalEnergy = other.m_TotalEnergy;
00633         m_Components = other.m_Components;
00634         m_Transformation = other.m_Transformation;
00635         N = other.N;
00636         M = other.M;
00637         m_refModel = other.m_refModel;
00638 
00639     return *this;
00640 }
00641  

Generated on Tue Apr 17 09:39:11 2007 for PCG Library by  doxygen 1.3.9.1