mirror of
https://github.com/Doctorado-ML/FImdlp.git
synced 2025-08-16 16:05:52 +00:00
Add google test and fix metrics
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "Metrics.h"
|
||||
#include <set>
|
||||
namespace mdlp
|
||||
{
|
||||
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 nClasses = 1;
|
||||
int yAnt = y.at(start);
|
||||
std::set<int> 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<int> &y, std::vector<size_t> &indices, size_t start, size_t end, int nClasses)
|
||||
{
|
||||
float entropy = 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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
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