From 65faf0230bbe8341cace69383d4bb8d25f5b9cc2 Mon Sep 17 00:00:00 2001 From: Nikola Petrov Date: Sun, 9 Feb 2025 23:42:31 +0100 Subject: [PATCH] Show similarity in app --- CMakeLists.txt | 1 + app/inc/App.hpp | 2 + app/inc/DnaStore.hpp | 2 +- app/src/App.cpp | 31 +++++++++---- shared/src/values/Similarity.cpp | 2 +- view/inc/Vapp.hpp | 6 ++- view/src/Vapp.cpp | 76 ++++++++++++++++++++++++++++++++ 7 files changed, 109 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ef48aee..69d43c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ add_executable(app shared/src/values/Dna.cpp shared/src/values/DnaManager.cpp shared/src/values/mrand.cpp + shared/src/values/Similarity.cpp shared/src/TcpSocket.cpp ) # Add include directories diff --git a/app/inc/App.hpp b/app/inc/App.hpp index 2c43985..e9829c4 100644 --- a/app/inc/App.hpp +++ b/app/inc/App.hpp @@ -40,4 +40,6 @@ private: Rectangle likedTextBox; Rectangle genTextBox; + Rectangle simTextBox; + float simil = 100.0f; }; diff --git a/app/inc/DnaStore.hpp b/app/inc/DnaStore.hpp index 045a999..ab99650 100644 --- a/app/inc/DnaStore.hpp +++ b/app/inc/DnaStore.hpp @@ -1,4 +1,4 @@ -#include "values/DnaManager.hpp" +#include "values/Similarity.hpp" namespace DnaStore { diff --git a/app/src/App.cpp b/app/src/App.cpp index ae0735e..3835dba 100644 --- a/app/src/App.cpp +++ b/app/src/App.cpp @@ -9,7 +9,7 @@ #define TOP (1 - pos) #define BOTTOM pos -Rectangle TextInSpace(Rectangle box, float textH, float textW, float margin, bool topOrBottom) +Rectangle TextInSpace(Rectangle box, float textH, float textW, float margin, bool topOrBottom, bool leftOrRigth) { float br = box.width / box.height; float tr = textW / textH; @@ -42,8 +42,14 @@ Rectangle TextInSpace(Rectangle box, float textH, float textW, float margin, boo ret.y = box.y + box.height - hm - ret.height; } - ret.x = box.x + wm; - + if (leftOrRigth) + { + ret.x = box.x + wm; + } + else + { + ret.x = box.x + box.width - wm - ret.width; + } return ret; } @@ -68,6 +74,7 @@ void App::init(int screenWidth, int screenHeight) } DnaStore::load(&manager); + simil = Similarity::calc_similarity(manager.vector, Similarity::hamming_distance); upTex(Liked::tbd); while (!canvas.tick(canvasTexure[TOP])) { @@ -87,13 +94,19 @@ void App::init(int screenWidth, int screenHeight) 0, (float)screenWidth / 2.0f, posY}, - 20.0f, 83.0f, textMargin, false); + 20.0f, 83.0f, textMargin, false, true); genTextBox = TextInSpace({0, posY + screenWidth, (float)screenWidth, posY}, - 20.0f, 200.0f, textMargin, true); + 20.0f, 200.0f, textMargin, true, true); + + simTextBox = TextInSpace({(float)screenWidth / 2.0f, + likedTextBox.y, + (float)screenWidth / 2.0f, + likedTextBox.height}, + 20.0f, 60.0f, textMargin, false, false); destB = {0, posY, (float)screenWidth, (float)screenWidth}; destA = destB; @@ -115,6 +128,7 @@ void App::upTex(Liked liked) DnaStore::saveGen(&manager); DnaManager::newGen(&manager); DnaStore::saveVec(&manager); + simil = Similarity::calc_similarity(manager.vector, Similarity::hamming_distance); } DnaStore::saveData(&manager); } @@ -197,9 +211,10 @@ void App::draw() DrawTexturePro(canvasTexure[TOP].texture, source, destA, origin, 360 - rotation, WHITE); - const char *text = TextFormat("GEN %d: %d / %d", manager.generation, unit[TOP].index + 1, NUM_PER_GEN); - DrawText(text, genTextBox.x, genTextBox.y, genTextBox.height, BLACK); - + const char *textGen = TextFormat("GEN %d: %d / %d", manager.generation, unit[TOP].index + 1, NUM_PER_GEN); + DrawText(textGen, genTextBox.x, genTextBox.y, genTextBox.height, BLACK); + const char *textProc = TextFormat("%.1f%%", simil); + DrawText(textProc, simTextBox.x, simTextBox.y, simTextBox.height, BLACK); switch (topLiked) { case Liked::yes: diff --git a/shared/src/values/Similarity.cpp b/shared/src/values/Similarity.cpp index 7de0818..97fbae7 100644 --- a/shared/src/values/Similarity.cpp +++ b/shared/src/values/Similarity.cpp @@ -84,6 +84,6 @@ namespace Similarity } } float average_similarity = total_similarity / num_pairs; - return average_similarity; + return average_similarity * 100.0f; } } diff --git a/view/inc/Vapp.hpp b/view/inc/Vapp.hpp index 47d0457..fe6b20d 100644 --- a/view/inc/Vapp.hpp +++ b/view/inc/Vapp.hpp @@ -5,7 +5,8 @@ #include "values/Similarity.hpp" #include "canvas/Canvas.hpp" -enum DrawingStage{ +enum DrawingStage +{ setup, drawTree, drawBig, @@ -46,4 +47,7 @@ private: void setUpManager(); std::array simil; + std::vector> similTable; + + void setUpTable(); }; \ No newline at end of file diff --git a/view/src/Vapp.cpp b/view/src/Vapp.cpp index d94af93..996d049 100644 --- a/view/src/Vapp.cpp +++ b/view/src/Vapp.cpp @@ -129,6 +129,10 @@ void Vapp::draw() enableAll = false; stageOfDrawing = DrawingStage::setup; } + if (ImGui::MenuItem("CalcTable", nullptr, false, enableAll)) + { + setUpTable(); + } ImGui::EndMainMenuBar(); } @@ -173,6 +177,28 @@ void Vapp::draw() ImGui::LabelText("##sim1", "cosine_similarity: %f", simil[0]); ImGui::LabelText("##sim2", "hamming_distance: %f", simil[1]); ImGui::LabelText("##sim3", "cosine_similarity_int: %f", simil[2]); + + const ImGuiTableFlags flags = ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + const int columns = 4; + if (ImGui::BeginTable("table1", columns, flags)) + { + for (int row = 0; row < similTable.size(); row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < columns; column++) + { + ImGui::TableSetColumnIndex(column); + if (column == 0) + { + ImGui::Text("%d", row); + continue; + } + ImGui::Text("%f", similTable[row][column - 1]); + } + } + ImGui::EndTable(); + } + ImGui::End(); } @@ -232,3 +258,53 @@ void Vapp::setUpManager() sql::finalize(get_gen_stmt); } + +void Vapp::setUpTable() +{ + sqlite3_stmt *get_gen_stmt; + sql::prepare_v2(db, get_gen, -1, &get_gen_stmt, NULL); + + DnaManager::cleanUp(&manager, ids[selected_id_index]); + similTable.clear(); + while (true) + { + sql::bind_int64(get_gen_stmt, 1, manager.id); + sql::bind_int64(get_gen_stmt, 2, manager.generation); + + bool new_gen = false; + while (sql::step(get_gen_stmt) != SQL_DONE) + { + int64_t pos = sql::column_int64(get_gen_stmt, 1); + int64_t liked = sql::column_int64(get_gen_stmt, 2); + UiUnit unit = DnaManager::next(&manager); + if ((unit.index != pos)) + { + // DOTO: SET ERROR + TraceLog(LOG_ERROR, "LOADING DNA"); + sql::finalize(get_gen_stmt); + return; + } + unit.liked = (Liked)liked; + new_gen = DnaManager::like(unit, &manager); + } + + if (new_gen) + { + similTable.emplace_back(); + int s = similTable.size() - 1; + similTable[s][0] = Similarity::calc_similarity(manager.vector, Similarity::cosine_similarity); + similTable[s][1] = Similarity::calc_similarity(manager.vector, Similarity::hamming_distance); + similTable[s][2] = Similarity::calc_similarity(manager.vector, Similarity::cosine_similarity_int); + + DnaManager::newGen(&manager); + } + else + { + break; + } + + sql::reset(get_gen_stmt); + } + + sql::finalize(get_gen_stmt); +} \ No newline at end of file