5 Commits
imgui ... 1.1.0

Author SHA1 Message Date
413ff4fce4 add project license
Some checks failed
Linux arm64 / Build (push) Failing after 40m2s
2024-05-23 17:32:01 +02:00
49e4d4b1e2 working linear system gui
Some checks failed
Linux arm64 / Build (push) Has been cancelled
2024-05-23 17:18:22 +02:00
9b84b9bf59 maybe fix test
Some checks failed
Linux arm64 / Build (push) Failing after 33m25s
2024-05-23 15:17:21 +02:00
bb650e4f2d gui refactor 2024-05-23 15:16:29 +02:00
e784a7b471 reduce solver random matrix size
Some checks failed
Linux arm64 / Build (push) Failing after 38m45s
2024-05-23 14:34:22 +02:00
5 changed files with 210 additions and 52 deletions

21
LICENSE.txt Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 Simon Pribylski, Thibaut Alessi, Houssem Zammali, Julien Chataigner
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -8,6 +8,38 @@
static std::string equationsResultImage; static std::string equationsResultImage;
struct GuiMatrix {
std::vector<std::vector<int>> matrixValues;
int matrixSizeX = 4;
int matrixSizeY = 4;
};
static void ResizeGuiMatrix(bool refresh, GuiMatrix& guiMatrix) {
if (refresh) {
guiMatrix.matrixValues.resize(guiMatrix.matrixSizeY);
for (auto& row : guiMatrix.matrixValues) {
row.resize(guiMatrix.matrixSizeX, 0);
}
}
}
static void RenderMatrix(bool& refresh, GuiMatrix& guiMatrix) {
ResizeGuiMatrix(refresh, guiMatrix);
for (int y = 0; y < guiMatrix.matrixSizeY; y++) {
for (int x = 0; x < guiMatrix.matrixSizeX; x++) {
if (x > 0)
ImGui::SameLine();
ImGui::PushID((guiMatrix.matrixSizeX * 20 + guiMatrix.matrixSizeY * 50) + y * guiMatrix.matrixSizeX + x);
ImGui::PushItemWidth(60); // Adjust this value to change the cell size
if (ImGui::InputInt("", &guiMatrix.matrixValues[y][x], 0, 0, ImGuiInputTextFlags_CharsDecimal))
refresh = true;
ImGui::PopItemWidth();
ImGui::PopID();
}
}
}
static Matrix LoadMatrixFromStdVect(const std::vector<std::vector<int>>& data) { static Matrix LoadMatrixFromStdVect(const std::vector<std::vector<int>>& data) {
Matrix result {data.size(), data.empty() ? 0 : data[0].size()}; Matrix result {data.size(), data.empty() ? 0 : data[0].size()};
for (std::size_t i = 0; i < result.GetRawCount(); i++) { for (std::size_t i = 0; i < result.GetRawCount(); i++) {
@@ -24,6 +56,19 @@ static std::string ElementToString(Matrix::Element e) {
return ss.str(); return ss.str();
} }
static std::string PrintRawMatrix(const Matrix& mat) {
if (mat.GetRawCount() == 0)
return "";
std::string result = " ( ";
for (std::size_t j = 0; j < mat.GetRawCount(); j++) {
result += ElementToString(mat.at(j, 0)) + ", ";
}
result = result.substr(0, result.size() - 2);
result += " )";
return result;
}
static std::string PrintVect(const Vect& vect) { static std::string PrintVect(const Vect& vect) {
if (vect.GetCardinal() == 0) if (vect.GetCardinal() == 0)
return "{0}"; return "{0}";
@@ -31,12 +76,8 @@ static std::string PrintVect(const Vect& vect) {
std::string result = "Vect( "; std::string result = "Vect( ";
for (std::size_t i = 0; i < vect.GetCardinal(); i++) { for (std::size_t i = 0; i < vect.GetCardinal(); i++) {
Matrix vector = vect.GetVector(i); Matrix vector = vect.GetVector(i);
result += " ("; result += PrintRawMatrix(vector);
for (std::size_t j = 0; j < vect.GetDimension(); j++) { result += ", ";
result += ElementToString(vector.at(j, 0)) + ", ";
}
result = result.substr(0, result.size() - 2);
result += " ), ";
} }
result = result.substr(0, result.size() - 2); result = result.substr(0, result.size() - 2);
result += " )"; result += " )";
@@ -45,41 +86,105 @@ static std::string PrintVect(const Vect& vect) {
void PivotGui::Init() {} void PivotGui::Init() {}
void PivotGui::Render() { static void RenderLeftSystemChild(bool& refresh, GuiMatrix& system, GuiMatrix& origin) {
ImGuiIO& io = ImGui::GetIO(); ImVec2 topLeftWindowSize(ImGui::GetContentRegionAvail().x * 0.5f, 0);
ImGui::BeginChild("Left Child", topLeftWindowSize, ImGuiChildFlags_Border);
ImGui::Text("Système de la forme AX=B");
ImGui::Separator();
ImGui::Text("Taille matrice A :");
if (ImGui::InputInt("##RowsMatriceInitiale", &system.matrixSizeY))
refresh = true;
system.matrixSizeY = std::max(1, system.matrixSizeY);
ImGui::SameLine();
ImGui::Text("Lignes");
if (ImGui::InputInt("##ColumnsMatriceInitiale", &system.matrixSizeX))
refresh = true;
system.matrixSizeX = std::max(1, system.matrixSizeX);
ImGui::SameLine();
ImGui::Text("Colonnes");
ImGui::NewLine();
RenderMatrix(refresh, system);
if (refresh) {
origin.matrixSizeX = 1;
origin.matrixSizeY = system.matrixSizeY;
}
ImGui::NewLine();
ImGui::Separator();
ImGui::Text("Matrice B :");
ImGui::NewLine();
RenderMatrix(refresh, origin);
ImGui::EndChild();
}
static void RenderRightSystemChild(bool& refresh, GuiMatrix& system, GuiMatrix& origin) {
ImGui::BeginChild("Right Child", {0, 0}, ImGuiChildFlags_Border);
static std::string result = "";
static std::vector<std::vector<int>> matrixValues;
static int matrixSizeX = 4;
static int matrixSizeY = 4;
static Solver solver; static Solver solver;
if (refresh) {
VectAffine solutions =
solver.RectangularSystem(LoadMatrixFromStdVect(system.matrixValues), LoadMatrixFromStdVect(origin.matrixValues));
result = "Solutions :\n";
result += PrintVect(solutions.GetBase());
result += "\n\n+\n\n";
result += PrintRawMatrix(solutions.GetOrigin());
}
ImGui::TextWrapped("%s", result.c_str());
ImGui::EndChild();
}
static void RenderSystemTab() {
static GuiMatrix guiMatrix, originMatrix;
static bool refresh = true; static bool refresh = true;
RenderLeftSystemChild(refresh, guiMatrix, originMatrix);
ImGui::SameLine();
RenderRightSystemChild(refresh, guiMatrix, originMatrix);
}
static void RenderLeftGaussChild(bool& refresh, GuiMatrix& guiMatrix) {
// divisions des fenetres // divisions des fenetres
ImVec2 topLeftWindowSize(io.DisplaySize.x * 0.5f, io.DisplaySize.y); ImVec2 topLeftWindowSize(ImGui::GetContentRegionAvail().x * 0.5f, 0);
ImVec2 topRightWindowSize(io.DisplaySize.x * 0.5f, io.DisplaySize.y);
// Begin fenetre top left // Begin fenetre top left
ImGui::SetNextWindowSize(topLeftWindowSize); // ImGui::SetNextWindowPos(ImVec2(0, 0)); // Position at the top-left corner
ImGui::SetNextWindowPos(ImVec2(0, 0)); // Position at the top-left corner ImGui::BeginChild("Left Top Window", topLeftWindowSize, ImGuiChildFlags_Border);
ImGui::Begin("Left Top Window", nullptr, /*ImGui::Begin(, nullptr,
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar); ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar);
*/
// ImGui::BeginTabBar("MainMenu");
// Get window position // Get window position
ImVec2 windowPos = ImGui::GetWindowPos(); ImVec2 windowPos = ImGui::GetWindowPos();
ImGui::Text("Matrice initiale:"); ImGui::Text("Matrice initiale:");
if (ImGui::InputInt("##RowsMatriceInitiale", &matrixSizeY)) if (ImGui::InputInt("##RowsMatriceInitiale", &guiMatrix.matrixSizeY))
refresh = true; refresh = true;
matrixSizeY = std::max(1, matrixSizeY); guiMatrix.matrixSizeY = std::max(1, guiMatrix.matrixSizeY);
ImGui::SameLine(); ImGui::SameLine();
ImGui::Text("Lignes"); ImGui::Text("Lignes");
if (ImGui::InputInt("##ColumnsMatriceInitiale", &matrixSizeX)) if (ImGui::InputInt("##ColumnsMatriceInitiale", &guiMatrix.matrixSizeX))
refresh = true; refresh = true;
matrixSizeX = std::max(1, matrixSizeX); guiMatrix.matrixSizeX = std::max(1, guiMatrix.matrixSizeX);
ImGui::SameLine(); ImGui::SameLine();
ImGui::Text("Colonnes"); ImGui::Text("Colonnes");
@@ -89,25 +194,7 @@ void PivotGui::Render() {
// Resize matrixValues and initialize new elements to 0 // Resize matrixValues and initialize new elements to 0
if (refresh) { RenderMatrix(refresh, guiMatrix);
matrixValues.resize(matrixSizeY);
for (auto& row : matrixValues) {
row.resize(matrixSizeX, 0);
}
}
for (int y = 0; y < matrixSizeY; y++) {
for (int x = 0; x < matrixSizeX; x++) {
if (x > 0)
ImGui::SameLine();
ImGui::PushID(y * matrixSizeX + x);
ImGui::PushItemWidth(60); // Adjust this value to change the cell size
if (ImGui::InputInt("", &matrixValues[y][x], 0, 0, ImGuiInputTextFlags_CharsDecimal))
refresh = true;
ImGui::PopItemWidth();
ImGui::PopID();
}
}
// ImGui::EndChild(); // End Matrice initiale // ImGui::EndChild(); // End Matrice initiale
@@ -116,7 +203,7 @@ void PivotGui::Render() {
ImGui::Text("Matrice échelonnée:"); ImGui::Text("Matrice échelonnée:");
// Convert the "result" string back to a matrix // Convert the "result" string back to a matrix
Matrix resultMatrix = LoadMatrixFromStdVect(matrixValues); Matrix resultMatrix = LoadMatrixFromStdVect(guiMatrix.matrixValues);
// Apply the Gauss-Jordan elimination to the matrix // Apply the Gauss-Jordan elimination to the matrix
Gauss::GaussJordan(resultMatrix, true, true); // Assuming you want to reduce and normalize the matrix Gauss::GaussJordan(resultMatrix, true, true); // Assuming you want to reduce and normalize the matrix
@@ -134,13 +221,17 @@ void PivotGui::Render() {
} }
} }
ImGui::End(); // End fenetre top left ImGui::EndChild();
}
static void RenderRightGaussChild(bool& refresh, GuiMatrix& guiMatrix) {
static Solver solver;
// Begin fenetre top right // Begin fenetre top right
ImGui::SetNextWindowSize(topRightWindowSize); // ImGui::SetNextWindowSize(topRightWindowSize);
ImGui::SetNextWindowPos(ImVec2(windowPos.x + topLeftWindowSize.x, 0)); // Position at the top-right corner // ImGui::SetNextWindowPos(ImVec2(windowPos.x + topLeftWindowSize.x, 0)); // Position at the top-right corner
ImGui::Begin("Right Top Window", nullptr, ImGui::BeginChild("Right Top Window", {0, 0}, ImGuiChildFlags_Border);
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar); // ImGui::Begin("Right Top Window", nullptr,
// ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar);
// rajouter le code pour la partie top right // rajouter le code pour la partie top right
@@ -149,7 +240,7 @@ void PivotGui::Render() {
if (refresh) { if (refresh) {
// Calculate the kernel and image // Calculate the kernel and image
Vect image = solver.Image(LoadMatrixFromStdVect(matrixValues)); Vect image = solver.Image(LoadMatrixFromStdVect(guiMatrix.matrixValues));
Matrix linearSystem = image.GetLinearSystem(); Matrix linearSystem = image.GetLinearSystem();
// Store the equationsResult strings in the global variable // Store the equationsResult strings in the global variable
@@ -162,9 +253,9 @@ void PivotGui::Render() {
equationsResultImage = equationsResultImage.substr(0, equationsResultImage.size() - 3) + " = 0\n"; equationsResultImage = equationsResultImage.substr(0, equationsResultImage.size() - 3) + " = 0\n";
} }
result = std::string("Noyau: ") + "\n" + PrintVect(solver.Kernel(LoadMatrixFromStdVect(matrixValues))) + "\n" + "\n" + result = "\nNoyau: \n" + PrintVect(solver.Kernel(LoadMatrixFromStdVect(guiMatrix.matrixValues))) + "\n" +
"Rang: " + "\n" + std::to_string(solver.Rank(LoadMatrixFromStdVect(matrixValues))) + "\n" + "\n" + "Image: " + "\n" + "\n" + "Rang: " + "\n" + std::to_string(solver.Rank(LoadMatrixFromStdVect(guiMatrix.matrixValues))) + "\n" + "\n" +
PrintVect(image); "Image: " + "\n" + PrintVect(image);
} }
refresh = false; refresh = false;
@@ -176,7 +267,45 @@ void PivotGui::Render() {
ImGui::TextWrapped("%s", result.c_str()); ImGui::TextWrapped("%s", result.c_str());
ImGui::End(); // End fenetre top right ImGui::EndChild(); // End fenetre top right
}
static void RenderGaussTab() {
static GuiMatrix guiMatrix;
static bool refresh = true;
RenderLeftGaussChild(refresh, guiMatrix);
ImGui::SameLine();
RenderRightGaussChild(refresh, guiMatrix);
}
static void RenderMainWindow() {
ImGuiIO& io = ImGui::GetIO();
ImGui::SetNextWindowSize(io.DisplaySize);
ImGui::SetNextWindowPos({0, 0});
ImGui::Begin("MainWindow", nullptr,
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar);
ImGui::BeginTabBar("MainBar");
if (ImGui::BeginTabItem("Noyau et Image")) {
RenderGaussTab();
ImGui::EndTabItem();
}
if (ImGui::BeginTabItem("Systèmes")) {
RenderSystemTab();
ImGui::EndTabItem();
}
ImGui::EndTabBar();
ImGui::End();
}
void PivotGui::Render() {
RenderMainWindow();
#ifndef NDEBUG
ImGui::ShowDemoWindow(nullptr);
#endif
} }
void PivotGui::Destroy() {} void PivotGui::Destroy() {}

View File

@@ -10,7 +10,7 @@
namespace fs = std::filesystem; namespace fs = std::filesystem;
const static int EXECUTION_COUNT = 10000; const static int EXECUTION_COUNT = 10000;
static constexpr int MATRIX_MAX_SIZE = 7; static constexpr int MATRIX_MAX_SIZE = 5;
static int GetRandomSize() { static int GetRandomSize() {
return rand() % MATRIX_MAX_SIZE + 1; return rand() % MATRIX_MAX_SIZE + 1;

View File

@@ -4,7 +4,7 @@
#include <algorithm> #include <algorithm>
const static int EXECUTION_COUNT = 100000; const static int EXECUTION_COUNT = 100000;
static constexpr int MATRIX_MAX_SIZE = 7; static constexpr int MATRIX_MAX_SIZE = 5;
static int GetRandomSize() { static int GetRandomSize() {
return rand() % MATRIX_MAX_SIZE + 1; return rand() % MATRIX_MAX_SIZE + 1;

View File

@@ -1,3 +1,10 @@
set_project("Pivot")
set_description("Solutionneur de matrice par le pivot de Gauss")
set_license("MIT")
set_xmakever("2.8.5")
add_rules("mode.debug", "mode.release") add_rules("mode.debug", "mode.release")
add_requires("imgui", {configs = {sdl2_no_renderer = true, opengl3 = true}}) add_requires("imgui", {configs = {sdl2_no_renderer = true, opengl3 = true}})
@@ -6,6 +13,7 @@ set_languages("c++20")
set_warnings("all") set_warnings("all")
add_includedirs("include") add_includedirs("include")
-- Solver Library -- Solver Library
target("Pivot") target("Pivot")
set_kind("static") set_kind("static")