Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
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 }