Skip to content

Commit

Permalink
add swig interface for tags
Browse files Browse the repository at this point in the history
  • Loading branch information
sanuj committed Jul 6, 2016
1 parent 5964c85 commit 999447f
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 0 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Expand Up @@ -929,6 +929,7 @@ ELSEIF (LINALG_EIGENSOLVER_LIB STREQUAL "VIENNACL")
ENDIF ()

#SWIG Interfaces
add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/modular)
LIST(APPEND CMAKE_SWIG_FLAGS "-w473")
LIST(APPEND CMAKE_SWIG_FLAGS "-w454")
LIST(APPEND CMAKE_SWIG_FLAGS "-w312")
Expand Down
16 changes: 16 additions & 0 deletions src/interfaces/modular/CMakeLists.txt
@@ -0,0 +1,16 @@
# Generate automatic shogun-base.i from jinja2 templates
if(SYSTEM_INCLUDES)
INCLUDE_DIRECTORIES(SYSTEM ${SYSTEM_INCLUDES})
endif()
include_directories(${source_dir}/include ${INCLUDES} ${CMAKE_CURRENT_SOURCE_DIR})

# Generate automatic shogun-base.i from jinja2 templates
ADD_CUSTOM_COMMAND(OUTPUT shogun-base.i
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/shogun-base.i.py
${CMAKE_CURRENT_SOURCE_DIR}/shogun-base.i.jinja2
shogun-base.i
${CMAKE_CURRENT_SOURCE_DIR}/shogun-base-list.txt
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/shogun-base.i.py
${CMAKE_CURRENT_SOURCE_DIR}/shogun-base.i.jinja2
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating shogun-base.i")
11 changes: 11 additions & 0 deletions src/interfaces/modular/shogun-base-list.txt
@@ -0,0 +1,11 @@
\\ Contains list of shogun base classes. The list format is
\\ "'CLASS/TEMPLATE', 'new name for class/template', 'name of class/template in c++'",

CLASS, String, std::string
CLASS, Int, int32_t
CLASS, Float, float64_t
CLASS, Kernel, CKernel
CLASS, Machine, CMachine
CLASS, Labels, CLabels
CLASS, Features, CFeatures
TEMPLATE, DenseFeatures, CDenseFeatures
21 changes: 21 additions & 0 deletions src/interfaces/modular/shogun-base.i.jinja2
@@ -0,0 +1,21 @@
/*
* THIS IS A GENERATED FILE! DO NOT CHANGE THIS FILE! CHANGE THE
* CORRESPONDING TEMPLATE FILE, PLEASE!
*/

using namespace shogun;

{% for class in classes %}
{% if class[0] == 'CLASS' %}
%template(Tag{{class[1]}}) Tag<{{class[2]}}>;
%template(set) CSGObject::set<{{class[2]}}>;
%template(set{{class[1]}}) CSGObject::set<{{class[2]}}, void>;
%template(get) CSGObject::get<{{class[2]}}>;
%template(get{{class[1]}}) CSGObject::get<{{class[2]}}, void>;
%template(has) CSGObject::has<{{class[2]}}>;
%template(has{{class[1]}}) CSGObject::has<{{class[2]}}, void>;

{% else %}
// TODO: TEMPLATE
{% endif %}
{% endfor %}
51 changes: 51 additions & 0 deletions src/interfaces/modular/shogun-base.i.py
@@ -0,0 +1,51 @@
#!/usr/bin/env python

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Written (W) 2016 Sanuj Sharma

def entry(templateFile, class_list_file):
templateLoader = jinja2.FileSystemLoader(searchpath="/")
templateEnv = jinja2.Environment(loader=templateLoader)

template = templateEnv.get_template(templateFile)

classes = []
with open(class_list_file) as f:
for line in f:
if line[0] is 'C' or line[0] is 'T':
temp = [elt.strip() for elt in line.split(',')]
classes.append(temp)


types = ['PT_BOOL', 'PT_CHAR', 'PT_INT8', 'PT_UINT8', 'PT_INT16', 'PT_UINT16', 'PT_INT32',
'PT_UINT32', 'PT_INT64', 'PT_UINT64', 'PT_FLOAT32', 'PT_FLOAT64', 'PT_FLOATMAX']

templateVars = {"classes" : classes, "types" : types}

return template.render(templateVars)

# execution
# ./shogun-base.i.py <template file> <output file name> <extra args...>

import sys
TEMPLATE_FILE = sys.argv[1]
output_file = sys.argv[2]
class_list_file = sys.argv[3]

try:
import jinja2
outputText = entry(TEMPLATE_FILE, class_list_file)
except ImportError:
import os
basename = os.path.basename(output_file)
basename = basename.replace('.cc', '')
print("Please install jinja2 for shogun-base.i");
outputText = ['Please install jinja2 to auto-generate content for this file.']

f = open(output_file, 'w')
f.writelines(outputText)
f.close()

0 comments on commit 999447f

Please sign in to comment.