mirror of
https://github.com/Doctorado-ML/FImdlp.git
synced 2025-08-17 16:35:52 +00:00
Add google test and fix metrics
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
fimdlp/test
BIN
fimdlp/test
Binary file not shown.
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
30
fimdlp/test/CMakeLists.txt
Normal file
30
fimdlp/test/CMakeLists.txt
Normal 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)
|
||||||
|
|
23
fimdlp/test/Metrics_unittest.cc
Normal file
23
fimdlp/test/Metrics_unittest.cc
Normal 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
4
fimdlp/test/test.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
cmake -S . -B build
|
||||||
|
cmake --build build
|
||||||
|
cd build
|
||||||
|
ctest --output-on-failure
|
Reference in New Issue
Block a user