#include #include #include "serialize_pickle.h" #include using namespace dlib; using namespace std; using namespace boost::python; typedef matrix sample_type; typedef std::vector > sparse_vect; template double predict ( const decision_function& df, const typename decision_function::kernel_type::sample_type& samp ) { if (df.basis_vectors.size() == 0) { return 0; } else if (df.basis_vectors(0).size() != samp.size()) { std::ostringstream sout; sout << "Input vector should have " << df.basis_vectors(0).size() << " dimensions, not " << samp.size() << "."; PyErr_SetString( PyExc_ValueError, sout.str().c_str() ); boost::python::throw_error_already_set(); } return df(samp); } template void add_df ( const std::string name ) { typedef decision_function df_type; class_(name.c_str()) .def("predict", &predict) .def_pickle(serialize_pickle()); } template typename df_type::sample_type get_weights( const df_type& df ) { if (df.basis_vectors.size() == 0) { PyErr_SetString( PyExc_ValueError, "Decision function is empty." ); boost::python::throw_error_already_set(); } df_type temp = simplify_linear_decision_function(df); return temp.basis_vectors(0); } template typename df_type::scalar_type get_bias( const df_type& df ) { if (df.basis_vectors.size() == 0) { PyErr_SetString( PyExc_ValueError, "Decision function is empty." ); boost::python::throw_error_already_set(); } return df.b; } template void add_linear_df ( const std::string name ) { typedef decision_function df_type; class_(name.c_str()) .def("predict", predict) .def("get_weights", get_weights) .def("get_bias", get_bias) .def_pickle(serialize_pickle()); } void bind_decision_functions() { add_linear_df >("_decision_function_linear"); add_linear_df >("_decision_function_sparse_linear"); add_df >("_decision_function_histogram_intersection"); add_df >("_decision_function_sparse_histogram_intersection"); add_df >("_decision_function_polynomial"); add_df >("_decision_function_sparse_polynomial"); add_df >("_decision_function_radial_basis"); add_df >("_decision_function_sparse_radial_basis"); add_df >("_decision_function_sigmoid"); add_df >("_decision_function_sparse_sigmoid"); }