CombinedFeatures.cpp

Go to the documentation of this file.
00001 /*
00002  * This program is free software; you can redistribute it and/or modify
00003  * it under the terms of the GNU General Public License as published by
00004  * the Free Software Foundation; either version 3 of the License, or
00005  * (at your option) any later version.
00006  *
00007  * Written (W) 1999-2009 Soeren Sonnenburg
00008  * Written (W) 1999-2008 Gunnar Raetsch
00009  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
00010  */
00011 
00012 #include <shogun/features/CombinedFeatures.h>
00013 #include <shogun/io/SGIO.h>
00014 
00015 using namespace shogun;
00016 
00017 CCombinedFeatures::CCombinedFeatures()
00018 : CFeatures(0)
00019 {
00020     init();
00021 
00022     feature_list=new CList(true);
00023     num_vec=0;
00024 }
00025 
00026 CCombinedFeatures::CCombinedFeatures(const CCombinedFeatures & orig)
00027 : CFeatures(0)
00028 {
00029     init();
00030 
00031     feature_list=new CList(true);
00032     //todo copy features
00033     num_vec=orig.num_vec;
00034 }
00035 
00036 CFeatures* CCombinedFeatures::duplicate() const
00037 {
00038     return new CCombinedFeatures(*this);
00039 }
00040 
00041 CCombinedFeatures::~CCombinedFeatures()
00042 {
00043     SG_UNREF(feature_list);
00044 }
00045 
00046 int32_t CCombinedFeatures::get_size()
00047 {
00048     CFeatures* f=(CFeatures*) feature_list
00049         ->get_current_element();
00050     if (f)
00051     {
00052         int32_t s=f->get_size();
00053         SG_UNREF(f)
00054             return s;
00055     }
00056     else 
00057         return 0;
00058 }
00059 
00060 void CCombinedFeatures::list_feature_objs()
00061 {
00062     SG_INFO( "BEGIN COMBINED FEATURES LIST - ");
00063     this->list_feature_obj();
00064 
00065     CListElement* current = NULL ;
00066     CFeatures* f=get_first_feature_obj(current);
00067 
00068     while (f)
00069     {
00070         f->list_feature_obj();
00071         SG_UNREF(f);
00072         f=get_next_feature_obj(current);
00073     }
00074 
00075     SG_INFO( "END COMBINED FEATURES LIST - ");
00076 }
00077 
00078 bool CCombinedFeatures::check_feature_obj_compatibility(CCombinedFeatures* comb_feat)
00079 {
00080     bool result=false;
00081 
00082     if (comb_feat && (this->get_num_feature_obj() == comb_feat->get_num_feature_obj()) )
00083     {
00084         CFeatures* f1=this->get_first_feature_obj();
00085         CFeatures* f2=comb_feat->get_first_feature_obj();
00086 
00087         if (f1 && f2 && f1->check_feature_compatibility(f2))
00088         {
00089             SG_UNREF(f1);
00090             SG_UNREF(f2);
00091             while( ( (f1=this->get_next_feature_obj()) != NULL )  && 
00092                    ( (f2=comb_feat->get_next_feature_obj()) != NULL) )
00093             {
00094                 if (!f1->check_feature_compatibility(f2))
00095                 {
00096                     SG_UNREF(f1);
00097                     SG_UNREF(f2);
00098                     SG_INFO( "not compatible, combfeat\n");
00099                     comb_feat->list_feature_objs();
00100                     SG_INFO( "vs this\n");
00101                     this->list_feature_objs();
00102                     return false;
00103                 }
00104                 SG_UNREF(f1);
00105                 SG_UNREF(f2);
00106             }
00107 
00108             SG_DEBUG( "features are compatible\n");
00109             result=true;
00110         }
00111         else
00112             SG_WARNING( "first 2 features not compatible\n");
00113     }
00114     else
00115     {
00116         SG_WARNING( "number of features in combined feature objects differs (%d != %d)\n", this->get_num_feature_obj(), comb_feat->get_num_feature_obj());
00117         SG_INFO( "compare\n");
00118         comb_feat->list_feature_objs();
00119         SG_INFO( "vs this\n");
00120         this->list_feature_objs();
00121     }
00122 
00123     return result;
00124 }
00125 
00126 CFeatures* CCombinedFeatures::get_first_feature_obj()
00127 {
00128     return (CFeatures*) feature_list->get_first_element();
00129 }
00130 
00131 CFeatures* CCombinedFeatures::get_first_feature_obj(CListElement*& current)
00132 {
00133     return (CFeatures*) feature_list->get_first_element(current);
00134 }
00135 
00136 CFeatures* CCombinedFeatures::get_next_feature_obj()
00137 {
00138     return (CFeatures*) feature_list->get_next_element();
00139 }
00140 
00141 CFeatures* CCombinedFeatures::get_next_feature_obj(CListElement*& current)
00142 {
00143     return (CFeatures*) feature_list->get_next_element(current);
00144 }
00145 
00146 CFeatures* CCombinedFeatures::get_last_feature_obj()
00147 {
00148     return (CFeatures*) feature_list->get_last_element();
00149 }
00150 
00151 bool CCombinedFeatures::insert_feature_obj(CFeatures* obj)
00152 {
00153     ASSERT(obj);
00154     int32_t n=obj->get_num_vectors();
00155 
00156     if (num_vec>0 && n!=num_vec)
00157         SG_ERROR("Number of feature vectors does not match (expected %d, obj has %d)\n", num_vec, n);
00158 
00159     num_vec=n;
00160     return feature_list->insert_element(obj);
00161 }
00162 
00163 bool CCombinedFeatures::append_feature_obj(CFeatures* obj)
00164 {
00165     ASSERT(obj);
00166     int32_t n=obj->get_num_vectors();
00167 
00168     if (num_vec>0 && n!=num_vec)
00169         SG_ERROR("Number of feature vectors does not match (expected %d, obj has %d)\n", num_vec, n);
00170 
00171     num_vec=n;
00172     return feature_list->append_element(obj);
00173 }
00174 
00175 bool CCombinedFeatures::delete_feature_obj()
00176 {
00177     CFeatures* f=(CFeatures*)feature_list->delete_element();
00178     if (f)
00179     {
00180         SG_UNREF(f);
00181         return true;
00182     }
00183     else
00184         return false;
00185 }
00186 
00187 int32_t CCombinedFeatures::get_num_feature_obj()
00188 {
00189     return feature_list->get_num_elements();
00190 }
00191 
00192 void CCombinedFeatures::init()
00193 {
00194     m_parameters->add(&num_vec, "num_vec",
00195                       "Number of vectors.");
00196     m_parameters->add((CSGObject**) &feature_list,
00197                       "feature_list", "Feature list.");
00198 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation