i'm trying use scikit learn in c++ project. here code i'm using:
#include <python.h> pyobject* loadmodule(char* name)// { pyobject* pname = pystring_fromstring(name); pyobject* pmodule = pyimport_import(pname); py_decref(pname); return pmodule; } void displaypyobject(pyobject* object) { pyobject* objectsrepresentation = pyobject_repr(object); pyerr_print(); const char* s = pystring_asstring(objectsrepresentation); pyerr_print(); std::cout << "[ pyobject ]" << s << std::endl; } //load functions/ attributes module pyobject* loadcomponentfrommodule(char* module, char* component) { pyobject* pmodule = loadmodule(module); pyobject* pycomponent = pyobject_getattrstring(pmodule, component); py_decref(pmodule); return pycomponent; } //wrapper kmeans clustering scikit-learn class kmeans { public: kmeans(int nclusters) { pyobject* kmeansclass = loadcomponentfrommodule("sklearn.cluster", "kmeans"); pyobject* pname2 = pyint_fromlong((long) nclusters); pyobject* pargs = pytuple_new(1); pytuple_setitem(pargs, 0, pname2); _kcluster = pyobject_callobject(kmeansclass, pargs); _closestor = loadcomponentfrommodule("sklearn.metrics","pairwise_distances_argmin_min"); py_decref(kmeansclass); py_decref(pname2); py_decref(pargs); } ~kmeans() { py_decref(_kcluster); py_decref(_closestor); } void setnumclusters(int nclusters) { std::cout << "change number cluster: " << nclusters << "\n"; pyobject* ncluster = pyint_fromlong((long) nclusters); int code = pyobject_setattrstring(_kcluster,"n_clusters", ncluster); pyerr_print(); if (code == -1) { std::cout << "[error] kmeans.setnumclusters() failed!! - number of clusters didn't change!!\n"; } py_decref(ncluster); } void info() { displaypyobject(_kcluster); } private: pyobject* _kcluster; //pyobject* _result; pyobject* _closestor; }; pyobject* loadclassifier() { pyobject* loader = loadcomponentfrommodule("sklearn.externals.joblib", "load"); pyobject* pname2 = pystring_fromstring("lda.pkl"); pyobject* pargs = pytuple_new(1); pytuple_setitem(pargs, 0, pname2); pyobject* clf = pyobject_callobject(loader, pargs); py_decref(loader); py_decref(pname2); py_decref(pargs); // displaypyobject(clf); return clf; } void produce_error() { std::cout << "============================= line 0 =========================================\n"; pyobject* clf = loadclassifier();//"sklearn.externals.joblib", "load"); std::cout << "============================= line 1 =========================================\n"; kmeans cluster(8); std::cout << "============================= line 2 =========================================\n"; cluster.setnumclusters(5); std::cout << "============================= line 3 =========================================\n"; cluster.info(); std::cout << "============================= line 4 =========================================\n"; } int main(int argc, char *argv[]) { py_initialize(); produce_error(); py_finalize(); return 0; }
every time run program, error:
============================= line 0 ========================================= ============================= line 1 ========================================= segmentation fault (core dumped)
as far understand, without calling classifier, don't error whenever call (loadclassifier()) , create instance of kmeans, error showed up. sometime error inside constructor of kmeans load module, same code in function (which isn't here), error inside pyobject_repr() (inside displaypyobject()).
anyone same problem before? know how solve it? in advance.
problem solved. figured out. answer here future if needs. becareful when use py_decref(). problem comes line inside constructor of kmeans:
py_decref(pname2);
because when run py_decref(pargs); try free pname2 freed. create unpredictable behavior. after commented line, everythings run ok.
Comments
Post a Comment