Skip to content

Commit

Permalink
Merge branch 'director_classes' of git://github.com/gsomix/shogun
Browse files Browse the repository at this point in the history
  • Loading branch information
lisitsyn committed Jun 8, 2012
2 parents a85ee05 + c983a2d commit c15f5a5
Show file tree
Hide file tree
Showing 10 changed files with 641 additions and 134 deletions.
@@ -0,0 +1,56 @@
import numpy
from shogun.Features import RealFeatures
try:
from shogun.Distance import DirectorDistance
except ImportError:
print "recompile shogun with --enable-swig-directors"
import sys
sys.exit(0)


class DirectorEuclidianDistance(DirectorDistance):
def __init__(self):
DirectorDistance.__init__(self, True)
def distance_function(self, idx_a, idx_b):
seq1 = self.get_lhs().get_feature_vector(idx_a)
seq2 = self.get_rhs().get_feature_vector(idx_b)
return numpy.linalg.norm(seq1-seq2)

traindat = numpy.random.random_sample((10,10))
testdat = numpy.random.random_sample((10,10))
parameter_list=[[traindat,testdat,1.2],[traindat,testdat,1.4]]

def distance_director_euclidian_modular (fm_train_real=traindat,fm_test_real=testdat,scale=1.2):

from shogun.Distance import EuclidianDistance
from modshogun import Time

feats_train=RealFeatures(fm_train_real)
feats_train.io.set_loglevel(0)
feats_train.parallel.set_num_threads(1)
feats_test=RealFeatures(fm_test_real)

distance=EuclidianDistance()
distance.init(feats_train, feats_test)

ddistance=DirectorEuclidianDistance()
ddistance.init(feats_train, feats_test)

print "dm_train"
t=Time()
dm_train=distance.get_distance_matrix()
t1=t.cur_time_diff(True)

print "ddm_train"
t=Time()
ddm_train=ddistance.get_distance_matrix()
t2=t.cur_time_diff(True)

print "dm_train", dm_train
print "ddm_train", ddm_train

return dm_train, ddm_train

if __name__=='__main__':
print('DirectorEuclidianDistance')
distance_director_euclidian_modular(*parameter_list[0])
@@ -1,4 +1,5 @@
import numpy
from shogun.Features import RealFeatures
try:
from shogun.Kernel import DirectorKernel
except ImportError:
Expand All @@ -9,19 +10,18 @@

class DirectorLinearKernel(DirectorKernel):
def __init__(self):
DirectorKernel.__init__(self)
def has_features(self):
return True
DirectorKernel.__init__(self, True)
def kernel_function(self, idx_a, idx_b):
return numpy.dot(traindat[:,idx_a], traindat[:,idx_b])
seq1 = self.get_lhs().get_feature_vector(idx_a)
seq2 = self.get_rhs().get_feature_vector(idx_b)
return numpy.dot(seq1, seq2)

traindat = numpy.random.random_sample((10,10))
testdat = numpy.random.random_sample((5,5))
testdat = numpy.random.random_sample((10,10))
parameter_list=[[traindat,testdat,1.2],[traindat,testdat,1.4]]

def kernel_director_linear_modular (fm_train_real=traindat,fm_test_real=testdat,scale=1.2):

from shogun.Features import RealFeatures
from shogun.Kernel import LinearKernel, AvgDiagKernelNormalizer
from modshogun import Time

Expand All @@ -36,8 +36,7 @@ def kernel_director_linear_modular (fm_train_real=traindat,fm_test_real=testdat,

dkernel=DirectorLinearKernel()
dkernel.set_normalizer(AvgDiagKernelNormalizer(scale))
dkernel.set_num_vec_lhs(traindat.shape[0])
dkernel.set_num_vec_rhs(traindat.shape[1])
dkernel.init(feats_train, feats_train)

print "km_train"
t=Time()
Expand All @@ -47,14 +46,7 @@ def kernel_director_linear_modular (fm_train_real=traindat,fm_test_real=testdat,
print "dkm_train"
t=Time()
dkm_train=dkernel.get_kernel_matrix()
t2=t.cur_time_diff(True)

#dkm_train=dkernel.get_kernel_matrix()
#dkm_train=numpy.zeros((5,5))
#for i in xrange(5):
# for j in xrange(5):
# dkm_train[i,j]=dkernel.kernel(i,j)

t2=t.cur_time_diff(True)

print "km_train", km_train
print "dkm_train", dkm_train
Expand Down
65 changes: 0 additions & 65 deletions examples/undocumented/python_modular/kernel_director_modular.py

This file was deleted.

11 changes: 11 additions & 0 deletions src/interfaces/modular/Distance.i
Expand Up @@ -12,6 +12,15 @@
%feature("autodoc", "get_distance_matrix(self) -> numpy 2dim array of float") get_distance_matrix;
#endif

#ifdef USE_SWIG_DIRECTORS
%feature("director") shogun::CDirectorDistance;
%feature("director:except") {
if ($error != NULL) {
throw Swig::DirectorMethodException();
}
}
#endif

/* Remove C Prefix */
%rename(Distance) CDistance;
%rename(CustomDistance) CCustomDistance;
Expand All @@ -33,6 +42,7 @@
%rename(CosineDistance) CCosineDistance;
%rename(TanimotoDistance) CTanimotoDistance;
%rename(MahalanobisDistance) CMahalanobisDistance;
%rename(DirectorDistance) CDirectorDistance;

/* Include Class Headers to make them visible from within the target language */
%include <shogun/distance/Distance.h>
Expand Down Expand Up @@ -114,3 +124,4 @@ namespace shogun
%include <shogun/distance/CosineDistance.h>
%include <shogun/distance/TanimotoDistance.h>
%include <shogun/distance/MahalanobisDistance.h>
%include <shogun/distance/DirectorDistance.h>
1 change: 1 addition & 0 deletions src/interfaces/modular/Distance_includes.i
Expand Up @@ -23,5 +23,6 @@
#include <shogun/distance/CosineDistance.h>
#include <shogun/distance/TanimotoDistance.h>
#include <shogun/distance/MahalanobisDistance.h>
#include <shogun/distance/DirectorDistance.h>
%}

134 changes: 131 additions & 3 deletions src/interfaces/python_modular/swig_typemaps.i
Expand Up @@ -14,6 +14,7 @@
* Written (W) 2006-2009,2011 Soeren Sonnenburg
* Copyright (C) 2006-2009 Fraunhofer Institute FIRST and Max-Planck-Society
* Copyright (C) 2011 Berlin Institute of Technology
* Copyright (C) 2012 Evgeniy Andreev (gsomix)
*/
#ifdef HAVE_PYTHON
%{
Expand Down Expand Up @@ -772,6 +773,133 @@ static bool spvector_to_numpy(PyObject* &obj, SGSparseVector<type> sg_vector, in

%}

/* CFeatures to ... */
%define FEATURES_BY_TYPECODE(obj, f, type, typecode)
switch (typecode) {
case F_BOOL:
obj=SWIG_NewPointerObj(f, $descriptor(type<bool> *), SWIG_POINTER_EXCEPTION);
break;
case F_CHAR:
obj=SWIG_NewPointerObj(f, $descriptor(type<char> *), SWIG_POINTER_EXCEPTION);
break;
case F_BYTE:
obj=SWIG_NewPointerObj(f, $descriptor(type<uint8_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_SHORT:
obj=SWIG_NewPointerObj(f, $descriptor(type<int16_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_WORD:
obj=SWIG_NewPointerObj(f, $descriptor(type<uint16_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_INT:
obj=SWIG_NewPointerObj(f, $descriptor(type<int32_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_UINT:
obj=SWIG_NewPointerObj(f, $descriptor(type<uint32_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_LONG:
obj=SWIG_NewPointerObj(f, $descriptor(type<int64_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_ULONG:
obj=SWIG_NewPointerObj(f, $descriptor(type<uint64_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_SHORTREAL:
obj=SWIG_NewPointerObj(f, $descriptor(type<float32_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_DREAL:
obj=SWIG_NewPointerObj(f, $descriptor(type<float64_t> *), SWIG_POINTER_EXCEPTION);
break;
case F_LONGREAL:
obj=SWIG_NewPointerObj(f, $descriptor(type<floatmax_t> *), SWIG_POINTER_EXCEPTION);
break;
default:
obj=SWIG_NewPointerObj(f, $descriptor(shogun::CFeatures*), SWIG_POINTER_EXCEPTION);
break;
}
%enddef

%typemap(out) shogun::CFeatures*
{
int feats_class=$1->get_feature_class();
int feats_type=$1->get_feature_type();

switch (feats_class){
case C_DENSE:
{
FEATURES_BY_TYPECODE($result, $1, shogun::CDenseFeatures, feats_type)
break;
}

case C_SPARSE:
{
FEATURES_BY_TYPECODE($result, $1, shogun::CSparseFeatures, feats_type)
break;
}

case C_STRING:
{
FEATURES_BY_TYPECODE($result, $1, shogun::CStringFeatures, feats_type)
break;
}

case C_COMBINED:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CCombinedFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_COMBINED_DOT:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CCombinedDotFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_WD:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CWDFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_SPEC:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CExplicitSpecFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_WEIGHTEDSPEC:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CImplicitWeightedSpecFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_POLY:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CPolyFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_STREAMING_DENSE:
{
FEATURES_BY_TYPECODE($result, $1, shogun::CStreamingDenseFeatures, feats_type)
break;
}

case C_STREAMING_SPARSE:
{
FEATURES_BY_TYPECODE($result, $1, shogun::CStreamingSparseFeatures, feats_type)
break;
}

case C_STREAMING_STRING:
{
FEATURES_BY_TYPECODE($result, $1, shogun::CStreamingStringFeatures, feats_type)
break;
}
case C_STREAMING_VW:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CStreamingVwFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_BINNED_DOT:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CBinnedDotFeatures*), SWIG_POINTER_EXCEPTION);
break;

case C_DIRECTOR_DOT:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CDirectorDotFeatures*), SWIG_POINTER_EXCEPTION);
break;

default:
$result=SWIG_NewPointerObj($1, $descriptor(shogun::CFeatures*), SWIG_POINTER_EXCEPTION);
break;
}
}

#ifdef PYTHON3
%typemap(typecheck) const char*
Expand All @@ -782,9 +910,9 @@ static bool spvector_to_numpy(PyObject* &obj, SGSparseVector<type> sg_vector, in
%typemap(in) const char*
{
if (PyUnicode_Check($input))
$1 = PyBytes_AsString(PyUnicode_AsASCIIString(const_cast<PyObject*>($input)));
else
SWIG_fail;
$1 = PyBytes_AsString(PyUnicode_AsASCIIString(const_cast<PyObject*>($input)));
else
SWIG_fail;
}

%typemap(freearg) const char*
Expand Down

0 comments on commit c15f5a5

Please sign in to comment.