Labels.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 "features/Labels.h"
00013 #include "lib/common.h"
00014 #include "lib/File.h"
00015 #include "lib/io.h"
00016 #include "lib/Mathematics.h"
00017 
00018 CLabels::CLabels()
00019 : CSGObject()
00020 {
00021     labels = NULL;
00022     num_labels = 0;
00023 }
00024 
00025 CLabels::CLabels(int32_t num_lab)
00026 : CSGObject(), num_labels(num_lab)
00027 {
00028     labels=new float64_t[num_lab];
00029     for (int32_t i=0; i<num_lab; i++)
00030         labels[i]=0;
00031 }
00032 
00033 CLabels::CLabels(float64_t* p_labels, int32_t len)
00034 : CSGObject()
00035 {
00036     labels = NULL;
00037     num_labels = 0;
00038 
00039     set_labels(p_labels, len);
00040 }
00041 
00042 CLabels::CLabels(char* fname)
00043 : CSGObject()
00044 {
00045     num_labels=0;
00046     labels=NULL;
00047 
00048     load(fname);
00049 }
00050 
00051 CLabels::~CLabels()
00052 {
00053     delete[] labels;
00054     num_labels=0;
00055     labels=NULL;
00056 }
00057 
00058 void CLabels::set_labels(float64_t* p_labels, int32_t len)
00059 {
00060     ASSERT(len>0);
00061     num_labels=len;
00062 
00063     delete[] labels;
00064     labels=new float64_t[len];
00065 
00066     for (int32_t i=0; i<len; i++)
00067         labels[i]=p_labels[i];
00068 }
00069 
00070 bool CLabels::is_two_class_labeling()
00071 {
00072     ASSERT(labels);
00073 
00074     for (int32_t i=0; i<num_labels; i++)
00075     {
00076         if  ( !( labels[i]==+1.0 || labels[i]==-1.0) )
00077         {
00078             SG_ERROR("Not a two class labeling label[%d]=%f (only +1/-1 allowed)\n", i, labels[i]);
00079             return false;
00080         }
00081     }
00082     return true;
00083 }
00084 
00085 int32_t CLabels::get_num_classes()
00086 {
00087     int32_t n=-1;
00088     int32_t* lab=get_int_labels(n);
00089 
00090     int32_t num_classes=0;
00091     for (int32_t i=0; i<n; i++)
00092         num_classes=CMath::max(num_classes,lab[i]);
00093 
00094     delete[] lab;
00095 
00096     return num_classes+1;
00097 }
00098 
00099 float64_t* CLabels::get_labels(int32_t &len)
00100 {
00101     len=num_labels;
00102 
00103     if (num_labels>0)
00104     {
00105         float64_t* _labels=new float64_t[num_labels] ;
00106         for (int32_t i=0; i<len; i++)
00107             _labels[i]=get_label(i) ;
00108         return _labels ;
00109     }
00110     else 
00111         return NULL;
00112 }
00113 
00114 void CLabels::get_labels(float64_t** p_labels, int32_t* len)
00115 {
00116     ASSERT(p_labels && len);
00117     *p_labels=NULL;
00118     *len=num_labels;
00119 
00120     if (num_labels>0)
00121     {
00122         *p_labels=(float64_t*) malloc(sizeof(float64_t)*num_labels);
00123 
00124         for (int32_t i=0; i<num_labels; i++)
00125             (*p_labels)[i]=get_label(i);
00126     }
00127 }
00128 
00129 int32_t* CLabels::get_int_labels(int32_t &len)
00130 {
00131     len=num_labels;
00132 
00133     if (num_labels>0)
00134     {
00135         int32_t* _labels=new int32_t[num_labels] ;
00136         for (int32_t i=0; i<len; i++)
00137             _labels[i]= (int32_t) get_label(i) ;
00138         return _labels ;
00139     }
00140     else 
00141         return NULL;
00142 }
00143 
00144 void CLabels::set_int_labels(int32_t * mylabels, int32_t len)
00145 {
00146     num_labels = len ;
00147     delete[] labels ;
00148     
00149     labels = new float64_t[num_labels] ;
00150     for (int32_t i=0; i<num_labels; i++)
00151         set_int_label(i, mylabels[i]) ;
00152 }
00153 
00154 bool CLabels::load(char* fname)
00155 {
00156     bool status=false;
00157 
00158     delete[] labels;
00159     num_labels=0;
00160 
00161     CFile f(fname, 'r', F_DREAL);
00162     int64_t num_lab=0;
00163     labels=f.load_real_data(NULL, num_lab);
00164     num_labels=num_lab;
00165 
00166     if (!f.is_ok()) {
00167       SG_ERROR( "loading file \"%s\" failed", fname);
00168     }
00169     else
00170     {
00171         SG_INFO( "%ld labels successfully read\n", num_labels);
00172         status=true;
00173     }
00174 
00175     return status;
00176 }
00177 
00178 bool CLabels::save(char* fname)
00179 {
00180     return false;
00181 }

SHOGUN Machine Learning Toolbox - Documentation