SHOGUN
v3.2.0
|
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) 2011 Abhinav Maurya 00008 * Copyright (C) 2011 Berlin Institute of Technology and Max-Planck-Society 00009 * Copyright (C) 2011 Indian Institute of Technology Bombay 00010 */ 00011 00012 #include <shogun/kernel/CircularKernel.h> 00013 #include <shogun/mathematics/Math.h> 00014 00015 using namespace shogun; 00016 00017 CCircularKernel::CCircularKernel(): CKernel(0), distance(NULL) 00018 { 00019 init(); 00020 set_sigma(1.0); 00021 } 00022 00023 CCircularKernel::CCircularKernel(int32_t size, float64_t sig, CDistance* dist) 00024 : CKernel(size), distance(dist) 00025 { 00026 ASSERT(distance) 00027 SG_REF(distance); 00028 00029 set_sigma(sig); 00030 init(); 00031 } 00032 00033 CCircularKernel::CCircularKernel( 00034 CFeatures *l, CFeatures *r, float64_t sig, CDistance* dist) 00035 : CKernel(10), distance(dist) 00036 { 00037 ASSERT(distance) 00038 SG_REF(distance); 00039 set_sigma(sig); 00040 init(); 00041 init(l, r); 00042 } 00043 00044 CCircularKernel::~CCircularKernel() 00045 { 00046 cleanup(); 00047 SG_UNREF(distance); 00048 } 00049 00050 bool CCircularKernel::init(CFeatures* l, CFeatures* r) 00051 { 00052 ASSERT(distance) 00053 CKernel::init(l,r); 00054 distance->init(l,r); 00055 return init_normalizer(); 00056 } 00057 00058 void CCircularKernel::load_serializable_post() throw (ShogunException) 00059 { 00060 CKernel::load_serializable_post(); 00061 } 00062 00063 void CCircularKernel::init() 00064 { 00065 SG_ADD((CSGObject**) &distance, "distance", "Distance to be used.", 00066 MS_AVAILABLE); 00067 SG_ADD(&sigma, "sigma", "Sigma kernel parameter.", MS_AVAILABLE); 00068 } 00069 00070 float64_t CCircularKernel::compute(int32_t idx_a, int32_t idx_b) 00071 { 00072 float64_t dist=distance->distance(idx_a, idx_b); 00073 float64_t ds_ratio=dist/sigma; 00074 00075 if (dist < sigma) 00076 return (2/M_PI)*acos(-ds_ratio) - (2/M_PI)*ds_ratio*sqrt(1-ds_ratio*ds_ratio); 00077 else 00078 return 0; 00079 }