diff --git a/fimdlp/Metrics.cpp b/fimdlp/Metrics.cpp index 372d4fb..85c418d 100644 --- a/fimdlp/Metrics.cpp +++ b/fimdlp/Metrics.cpp @@ -1,4 +1,5 @@ #include "Metrics.h" +#include namespace mdlp { Metrics::Metrics() @@ -6,33 +7,29 @@ namespace mdlp } int Metrics::numClasses(std::vector &y, std::vector indices, size_t start, size_t end) { - int nClasses = 1; - int yAnt = y.at(start); + std::set numClasses; for (auto i = start; i < end; ++i) { - if (y.at(i) != yAnt) - { - nClasses++; - yAnt = y.at(i); - } + numClasses.insert(y[indices[i]]); } - return nClasses; + return numClasses.size(); } float Metrics::entropy(std::vector &y, std::vector &indices, size_t start, size_t end, int nClasses) { float entropy = 0; int nElements = 0; - std::vector counts(nClasses, 0); + std::vector counts(nClasses + 1, 0); for (auto i = &indices[start]; i != &indices[end]; ++i) { counts[y[*i]]++; nElements++; } - for (auto i = 0; i < nClasses; i++) + for (auto count : counts) { - if (counts[i] > 0) + if (count > 0) { - float p = (float)counts[i] / nElements; + + float p = (float)count / nElements; entropy -= p * log2(p); } } diff --git a/fimdlp/test b/fimdlp/test deleted file mode 100755 index aeaf513..0000000 Binary files a/fimdlp/test and /dev/null differ diff --git a/fimdlp/test.cpp b/fimdlp/test.cpp deleted file mode 100644 index b722339..0000000 --- a/fimdlp/test.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "CPPFImdlp.h" -#include - -using namespace mdlp; -int main(int argc, char *argv[], char *envp[]) -{ - { - CPPFImdlp fimdlp = CPPFImdlp(true); - std::vector X = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - std::vector y = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; - fimdlp.computeCutPoints(X, y); - for (struct CutPointBody cutPt : fimdlp.getCutPoints()) - { - std::cout << cutPt << std::endl; - } - return 0; - } -} \ No newline at end of file diff --git a/fimdlp/test/CMakeLists.txt b/fimdlp/test/CMakeLists.txt new file mode 100644 index 0000000..6177fbe --- /dev/null +++ b/fimdlp/test/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.14) +project(FImdlp) + +# GoogleTest requires at least C++14 +set(CMAKE_CXX_STANDARD 14) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +add_executable( + Metrics_unittest + ../Metrics.cpp + Metrics_unittest.cc +) +target_link_libraries( + Metrics_unittest + GTest::gtest_main +) + +include(GoogleTest) +gtest_discover_tests(Metrics_unittest) + diff --git a/fimdlp/test/Metrics_unittest.cc b/fimdlp/test/Metrics_unittest.cc new file mode 100644 index 0000000..7619577 --- /dev/null +++ b/fimdlp/test/Metrics_unittest.cc @@ -0,0 +1,23 @@ +#include "gtest/gtest.h" +#include "../Metrics.h" +namespace +{ + TEST(MetricTest, NumClasses) + { + std::vector y = {1, 1, 1, 1, 1, 1, 1, 1, 2, 1}; + std::vector indices = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + EXPECT_EQ(1, mdlp::Metrics::numClasses(y, indices, 4, 8)); + EXPECT_EQ(2, mdlp::Metrics::numClasses(y, indices, 0, 10)); + EXPECT_EQ(2, mdlp::Metrics::numClasses(y, indices, 8, 10)); + } + TEST(MetricTest, Entropy) + { + std::vector y = {1, 1, 1, 1, 1, 2, 2, 2, 2, 2}; + std::vector indices = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + EXPECT_EQ(1, mdlp::Metrics::entropy(y, indices, 0, 10, 2)); + EXPECT_EQ(0, mdlp::Metrics::entropy(y, indices, 0, 5, 1)); + std::vector yz = {1, 1, 1, 1, 1, 1, 1, 1, 2, 1}; + ASSERT_NEAR(0.468996, mdlp::Metrics::entropy(yz, indices, 0, 10, 2), 0.000001); + } + +} \ No newline at end of file diff --git a/fimdlp/test/test.sh b/fimdlp/test/test.sh new file mode 100755 index 0000000..f01c0de --- /dev/null +++ b/fimdlp/test/test.sh @@ -0,0 +1,4 @@ +cmake -S . -B build +cmake --build build +cd build +ctest --output-on-failure