Add google test and fix metrics

This commit is contained in:
2022-12-01 01:36:51 +01:00
parent a982dbd5ca
commit edb1cb8524
6 changed files with 66 additions and 30 deletions

View File

@@ -1,4 +1,5 @@
#include "Metrics.h" #include "Metrics.h"
#include <set>
namespace mdlp namespace mdlp
{ {
Metrics::Metrics() Metrics::Metrics()
@@ -6,33 +7,29 @@ namespace mdlp
} }
int Metrics::numClasses(std::vector<int> &y, std::vector<size_t> indices, size_t start, size_t end) int Metrics::numClasses(std::vector<int> &y, std::vector<size_t> indices, size_t start, size_t end)
{ {
int nClasses = 1; std::set<int> numClasses;
int yAnt = y.at(start);
for (auto i = start; i < end; ++i) for (auto i = start; i < end; ++i)
{ {
if (y.at(i) != yAnt) numClasses.insert(y[indices[i]]);
{
nClasses++;
yAnt = y.at(i);
} }
} return numClasses.size();
return nClasses;
} }
float Metrics::entropy(std::vector<int> &y, std::vector<size_t> &indices, size_t start, size_t end, int nClasses) float Metrics::entropy(std::vector<int> &y, std::vector<size_t> &indices, size_t start, size_t end, int nClasses)
{ {
float entropy = 0; float entropy = 0;
int nElements = 0; int nElements = 0;
std::vector<int> counts(nClasses, 0); std::vector<int> counts(nClasses + 1, 0);
for (auto i = &indices[start]; i != &indices[end]; ++i) for (auto i = &indices[start]; i != &indices[end]; ++i)
{ {
counts[y[*i]]++; counts[y[*i]]++;
nElements++; 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); entropy -= p * log2(p);
} }
} }

Binary file not shown.

View File

@@ -1,18 +0,0 @@
#include "CPPFImdlp.h"
#include <iostream>
using namespace mdlp;
int main(int argc, char *argv[], char *envp[])
{
{
CPPFImdlp fimdlp = CPPFImdlp(true);
std::vector<float> X = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> 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;
}
}

View File

@@ -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)

View File

@@ -0,0 +1,23 @@
#include "gtest/gtest.h"
#include "../Metrics.h"
namespace
{
TEST(MetricTest, NumClasses)
{
std::vector<int> y = {1, 1, 1, 1, 1, 1, 1, 1, 2, 1};
std::vector<size_t> 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<int> y = {1, 1, 1, 1, 1, 2, 2, 2, 2, 2};
std::vector<size_t> 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<int> 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);
}
}

4
fimdlp/test/test.sh Executable file
View File

@@ -0,0 +1,4 @@
cmake -S . -B build
cmake --build build
cd build
ctest --output-on-failure