aboutsummaryrefslogtreecommitdiffstats
path: root/interface/pyfunc_obj.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'interface/pyfunc_obj.hpp')
-rw-r--r--interface/pyfunc_obj.hpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/interface/pyfunc_obj.hpp b/interface/pyfunc_obj.hpp
new file mode 100644
index 0000000..db2775a
--- /dev/null
+++ b/interface/pyfunc_obj.hpp
@@ -0,0 +1,71 @@
+#ifndef PYFUNC_OBJ_HPP
+#define PYFUNC_OBJ_HPP
+#include <boost/python.hpp>
+#include <core/optimizer.hpp>
+#include <core/opt_traits.hpp>
+
+
+namespace opt_utilities
+{
+
+ template <typename Ty,typename Tx>
+ class pyfunc_obj
+ :public func_obj<Ty,Tx>
+ {
+ private:
+ boost::python::object pyfunc;
+ public:
+ pyfunc_obj()
+ {
+ if(!Py_IsInitialized())
+ {
+ Py_Initialize();
+ }
+ }
+
+ pyfunc_obj(const pyfunc_obj& rhs)
+ :pyfunc(rhs.pyfunc)
+ {}
+
+ pyfunc_obj& operator=(const pyfunc_obj& rhs)
+ {
+ pyfunc=rhs.pyfunc;
+ }
+
+ ~pyfunc_obj()
+ {}
+
+ public:
+ void attach(const std::string module_name,
+ const std::string func_name)
+ {
+ boost::python::object mod(boost::python::import(module_name.c_str()));
+ pyfunc=mod.attr(func_name.c_str());
+
+ }
+ private:
+ func_obj<Ty,Tx>* do_clone()const
+ {
+ return new pyfunc_obj(*this);
+ }
+
+ void do_destroy()
+ {
+ delete this;
+ }
+
+ Ty do_eval(const Tx& x)
+ {
+ boost::python::list args;
+ for(size_t i=0;i<get_size(x);++i)
+ {
+ args.append(get_element(x,i));
+ }
+ return boost::python::extract<Ty>(pyfunc(args));
+ }
+ };
+}
+
+
+#endif
+//EOF