Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <shogun/lib/common.h>
00012 #include <shogun/io/SGIO.h>
00013 #include <shogun/kernel/string/PolyMatchWordStringKernel.h>
00014 #include <shogun/kernel/normalizer/SqrtDiagKernelNormalizer.h>
00015 #include <shogun/features/Features.h>
00016 #include <shogun/features/StringFeatures.h>
00017
00018 using namespace shogun;
00019
00020 CPolyMatchWordStringKernel::CPolyMatchWordStringKernel()
00021 : CStringKernel<uint16_t>()
00022 {
00023 init();
00024 }
00025
00026 CPolyMatchWordStringKernel::CPolyMatchWordStringKernel(int32_t size, int32_t d, bool i)
00027 : CStringKernel<uint16_t>(size)
00028 {
00029 init();
00030
00031 degree=d;
00032 inhomogene=i;
00033 }
00034
00035 CPolyMatchWordStringKernel::CPolyMatchWordStringKernel(
00036 CStringFeatures<uint16_t>* l, CStringFeatures<uint16_t>* r, int32_t d, bool i)
00037 : CStringKernel<uint16_t>()
00038 {
00039 init();
00040
00041 degree=d;
00042 inhomogene=i;
00043
00044 init(l, r);
00045 }
00046
00047 CPolyMatchWordStringKernel::~CPolyMatchWordStringKernel()
00048 {
00049 cleanup();
00050 }
00051
00052 bool CPolyMatchWordStringKernel::init(CFeatures* l, CFeatures* r)
00053 {
00054 CStringKernel<uint16_t>::init(l,r);
00055 return init_normalizer();
00056 }
00057
00058 void CPolyMatchWordStringKernel::cleanup()
00059 {
00060 CKernel::cleanup();
00061 }
00062
00063 float64_t CPolyMatchWordStringKernel::compute(int32_t idx_a, int32_t idx_b)
00064 {
00065 int32_t alen, blen;
00066 bool free_avec, free_bvec;
00067
00068 uint16_t* avec=((CStringFeatures<uint16_t>*) lhs)->get_feature_vector(idx_a, alen, free_avec);
00069 uint16_t* bvec=((CStringFeatures<uint16_t>*) rhs)->get_feature_vector(idx_b, blen, free_bvec);
00070
00071 ASSERT(alen==blen);
00072
00073 int32_t sum=0;
00074
00075 for (int32_t i=0; i<alen; i++)
00076 sum+= (avec[i]==bvec[i]) ? 1 : 0;
00077
00078 if (inhomogene)
00079 sum+=1;
00080
00081 float64_t result=sum;
00082
00083 for (int32_t j=1; j<degree; j++)
00084 result*=sum;
00085
00086 ((CStringFeatures<uint16_t>*) lhs)->free_feature_vector(avec, idx_a, free_avec);
00087 ((CStringFeatures<uint16_t>*) rhs)->free_feature_vector(bvec, idx_b, free_bvec);
00088 return result;
00089 }
00090
00091 void CPolyMatchWordStringKernel::init()
00092 {
00093 degree=0;
00094 inhomogene=false;
00095 set_normalizer(new CSqrtDiagKernelNormalizer());
00096
00097 SG_ADD(°ree, "degree", "Degree of poly-kernel.", MS_AVAILABLE);
00098 SG_ADD(&inhomogene, "inhomogene", "True for inhomogene poly-kernel.",
00099 MS_NOT_AVAILABLE);
00100 }