diff --git a/lib/catch2 b/lib/catch2 index cd8f97e..4e8d92b 160000 --- a/lib/catch2 +++ b/lib/catch2 @@ -1 +1 @@ -Subproject commit cd8f97e6c7f6aaf332992f83bf9d7ee7f357f85e +Subproject commit 4e8d92bf02f7d1c8006a0e7a5ecabd8e62d98502 diff --git a/lib/json b/lib/json index 377c767..8c391e0 160000 --- a/lib/json +++ b/lib/json @@ -1 +1 @@ -Subproject commit 377c767aa19da7159cf537490bc33da96edf8803 +Subproject commit 8c391e04fe4195d8be862c97f38cfe10e2a3472e diff --git a/lib/mdlp b/lib/mdlp index 5708dc3..236d1b2 160000 --- a/lib/mdlp +++ b/lib/mdlp @@ -1 +1 @@ -Subproject commit 5708dc3de944fc22d61a2dd071b63aa338e04db3 +Subproject commit 236d1b2f8be185039493fe7fce04a83e02ed72e5 diff --git a/pyclfs/PyClassifier.cc b/pyclfs/PyClassifier.cc index aeb3798..9ab656a 100644 --- a/pyclfs/PyClassifier.cc +++ b/pyclfs/PyClassifier.cc @@ -21,10 +21,22 @@ namespace pywrap { Xn = Xn.transpose(); return Xn; } + np::ndarray tensorInt2numpy(torch::Tensor& X) + { + int m = X.size(0); + int n = X.size(1); + auto Xn = np::from_data(X.data_ptr(), np::dtype::get_builtin(), bp::make_tuple(m, n), bp::make_tuple(sizeof(X.dtype()) * 2 * n, sizeof(X.dtype()) * 2), bp::object()); + Xn = Xn.transpose(); + //std::cout << "Transposed array:\n" << boost::python::extract(boost::python::str(Xn)) << std::endl; + return Xn; + } std::pair tensors2numpy(torch::Tensor& X, torch::Tensor& y) { int n = X.size(1); auto yn = np::from_data(y.data_ptr(), np::dtype::get_builtin(), bp::make_tuple(n), bp::make_tuple(sizeof(y.dtype()) * 2), bp::object()); + if (X.dtype() == torch::kInt32) { + return { tensorInt2numpy(X), yn }; + } return { tensor2numpy(X), yn }; } std::string PyClassifier::version() @@ -65,8 +77,14 @@ namespace pywrap { torch::Tensor PyClassifier::predict(torch::Tensor& X) { int dimension = X.size(1); - auto Xn = tensor2numpy(X); - CPyObject Xp = bp::incref(bp::object(Xn).ptr()); + CPyObject Xp; + if (X.dtype() == torch::kInt32) { + auto Xn = tensorInt2numpy(X); + Xp = bp::incref(bp::object(Xn).ptr()); + } else { + auto Xn = tensor2numpy(X); + Xp = bp::incref(bp::object(Xn).ptr()); + } PyObject* incoming = pyWrap->predict(id, Xp); bp::handle<> handle(incoming); bp::object object(handle); diff --git a/tests/TestPythonClassifiers.cc b/tests/TestPythonClassifiers.cc index e72c4b1..b1ea6c2 100644 --- a/tests/TestPythonClassifiers.cc +++ b/tests/TestPythonClassifiers.cc @@ -13,7 +13,7 @@ #include "pyclfs/ODTE.h" #include "TestUtils.h" -const std::string ACTUAL_VERSION = "1.0.4"; +const std::string ACTUAL_VERSION = "1.0.5"; TEST_CASE("Test Python Classifiers score", "[PyClassifiers]") { @@ -60,19 +60,27 @@ TEST_CASE("Test Python Classifiers score", "[PyClassifiers]") } TEST_CASE("Classifiers features", "[PyClassifiers]") { - auto raw = RawDatasets("iris", true); + auto raw = RawDatasets("iris", false); auto clf = pywrap::STree(); clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); - REQUIRE(clf.getNumberOfNodes() == 3); - REQUIRE(clf.getNumberOfEdges() == 2); + REQUIRE(clf.getNumberOfNodes() == 5); + REQUIRE(clf.getNumberOfEdges() == 3); } TEST_CASE("Get num features & num edges", "[PyClassifiers]") { - auto raw = RawDatasets("iris", true); + auto raw = RawDatasets("iris", false); auto clf = pywrap::ODTE(); clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); - REQUIRE(clf.getNumberOfNodes() == 10); - REQUIRE(clf.getNumberOfEdges() == 10); + REQUIRE(clf.getNumberOfNodes() == 50); + REQUIRE(clf.getNumberOfEdges() == 30); +} +TEST_CASE("Classifier with discretized dataset", "[PyClassifiers]") +{ + auto raw = RawDatasets("iris", true); + auto clf = pywrap::SVC(); + clf.fit(raw.Xt, raw.yt, raw.featurest, raw.classNamet, raw.statest); + auto score = clf.score(raw.Xt, raw.yt); + REQUIRE(score == Catch::Approx(0.96667f).epsilon(raw.epsilon)); } // TEST_CASE("XGBoost", "[PyClassifiers]") // {