Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _DIRECTORDISTANCE_H___
00011 #define _DIRECTORDISTANCE_H___
00012
00013 #ifdef USE_SWIG_DIRECTORS
00014 #include <shogun/lib/common.h>
00015 #include <shogun/lib/DataType.h>
00016 #include <shogun/distance/Distance.h>
00017
00018 namespace shogun
00019 {
00020
00021 #define IGNORE_IN_CLASSLIST
00022 IGNORE_IN_CLASSLIST class CDirectorDistance : public CDistance
00023 {
00024 public:
00025
00026 CDirectorDistance(bool is_external_features)
00027 : CDistance(), external_features(is_external_features)
00028 {
00029
00030 }
00031
00033 virtual ~CDirectorDistance()
00034 {
00035 cleanup();
00036 }
00037
00038 virtual float64_t distance_function(int32_t x, int32_t y)
00039 {
00040 SG_ERROR("Distance function of Director Distance needs to be overridden.\n");
00041 return 0;
00042 }
00043
00051 virtual float64_t distance(int32_t idx_a, int32_t idx_b)
00052 {
00053 if (idx_a < 0 || idx_b <0)
00054 return 0;
00055
00056 if (!external_features)
00057 CDistance::distance(idx_a, idx_b);
00058 else
00059 return compute(idx_a, idx_b);
00060 }
00061
00075 virtual float64_t distance_upper_bounded(int32_t idx_a, int32_t idx_b, float64_t upper_bound)
00076 {
00077 return CDistance::distance(idx_a, idx_b);
00078 }
00079
00087 virtual float64_t* get_distance_matrix_real(int32_t &m, int32_t &n, float64_t* target)
00088 {
00089 return CDistance::get_distance_matrix_real(m, n, target);
00090 }
00091
00099 virtual float32_t* get_distance_matrix_shortreal(int32_t &m, int32_t &n, float32_t* target)
00100 {
00101 return CDistance::get_distance_matrix_shortreal(m, n, target);
00102 }
00103
00113 virtual bool init(CFeatures* lhs, CFeatures* rhs)
00114 {
00115 if (this->parallel->get_num_threads()!=1)
00116 {
00117 SG_WARNING("Enforcing to use only one thread due to restrictions of directors\n");
00118 this->parallel->set_num_threads(1);
00119 }
00120 return CDistance::init(lhs, rhs);
00121 }
00122
00124 virtual void cleanup()
00125 {
00126
00127 }
00128
00133 virtual int32_t get_num_vec_lhs()
00134 {
00135 return CDistance::get_num_vec_lhs();
00136 }
00137
00142 virtual int32_t get_num_vec_rhs()
00143 {
00144 return CDistance::get_num_vec_rhs();
00145 }
00146
00151 virtual void set_num_vec_lhs(int32_t num)
00152 {
00153 num_lhs=num;
00154 }
00155
00160 virtual void set_num_vec_rhs(int32_t num)
00161 {
00162 num_rhs=num;
00163 }
00164
00169 virtual bool has_features()
00170 {
00171 if (!external_features)
00172 return CDistance::has_features();
00173 else
00174 return true;
00175 }
00176
00178 virtual void remove_lhs_and_rhs()
00179 {
00180 CDistance::remove_lhs_and_rhs();
00181 }
00182
00184 virtual void remove_lhs()
00185 {
00186 CDistance::remove_lhs();
00187 }
00188
00190 virtual void remove_rhs()
00191 {
00192 CDistance::remove_rhs();
00193 }
00194
00199 virtual EDistanceType get_distance_type() { return D_DIRECTOR; }
00200
00205 virtual EFeatureType get_feature_type() { return F_ANY; }
00206
00211 virtual EFeatureClass get_feature_class() { return C_ANY; }
00212
00217 virtual const char* get_name() const { return "DirectorDistance"; }
00218
00224 virtual void set_precompute_matrix(bool flag)
00225 {
00226 CDistance::set_precompute_matrix(flag);
00227 }
00228
00229 protected:
00233 virtual float64_t compute(int32_t x, int32_t y)
00234 {
00235 return distance_function(x, y);
00236 }
00237
00238 protected:
00239
00240 bool external_features;
00241 };
00242
00243 }
00244
00245 #endif
00246 #endif