diff --git a/main.cpp b/main.cpp index ff16e53..dc04157 100644 --- a/main.cpp +++ b/main.cpp @@ -4,94 +4,91 @@ #include "tools/math.h" #include "simplex.h" -void _printInitialInputs(Vector& C, Matrix& A, Vector& b, double eps, bool maximize) { - std::cout << "Running for the following inputs:" << std::endl << std::endl; +void _printInitialInputs(Vector &C, Matrix &A, Vector &b, double eps, bool maximize) +{ + std::cout << "Running for the following inputs:" << std::endl + << std::endl; std::cout << "epsilon: " << eps << std::endl; if (maximize) { std::cout << "Maximize" << std::endl; } - else { + else + { std::cout << "Minimize" << std::endl; } std::cout << "z = "; - bool previousIsNegative = false; - for (size_t i = 0; i < C.size(); i++) + for (int i = 0; i < C.size(); i++) { bool isNegative = false; - if (C[i] != 0){ - if (i != 0 && !previousIsNegative){ - std::cout << " + "; + if (i != 0) + { + std::cout << " + "; + } + if (C[i] != 1) + { + if (C[i] < 0) + { + isNegative = true; + std::cout << "("; } - if (C[i] != 1) { - if (C[i] < 0){ - isNegative = true; - std::cout << "("; - } - std::cout << C[i] << " * "; - } - - std::cout << "x" << i + 1; - if (isNegative){ - std::cout << ")"; - } - - }else { - previousIsNegative = true; + std::cout << C[i] << " * "; + } + + std::cout << "x" << i + 1; + if (isNegative) + { + std::cout << ")"; } - } - std::cout << std::endl << "subject to the constrains:" << std::endl; - std::cout<< std::endl; - for (size_t i = 0; i < b.size(); i++) + std::cout << std::endl + << "subject to the constrains:" << std::endl; + std::cout << std::endl; + for (int i = 0; i < b.size(); i++) { - bool previousIsZero = false; - for (size_t j = 0; j < A.getColumns(); j++) + for (int j = 0; j < A.getColumns(); j++) { bool isNegative = false; - - if (A[i][j] != 0) { - if (j != 0 && !previousIsZero){ - std::cout << " + "; - previousIsZero = false; + + if (j != 0) + { + std::cout << " + "; + } + if (A[i][j] != 1) + { + if (A[i][j] < 0) + { + isNegative = true; + std::cout << "("; } - if (A[i][j] != 1) { - if (A[i][j] < 0) { - isNegative = true; - std::cout << "("; - } - std::cout << A[i][j] << " * "; - } - std::cout << "x" << j + 1; - if (isNegative) { - std::cout << ")"; - } - - }else { - previousIsZero = true; + std::cout << A[i][j] << " * "; + } + std::cout << "x" << j + 1; + if (isNegative) + { + std::cout << ")"; } - } std::cout << " <= " << b[i] << std::endl; - } - - - } +int printResult(Result result) +{ -int printResult(Result result) { - - if (result.state == unsolvable) { + if (result.state == unsolvable) + { std::cout << "The method is not applicable!" << std::endl; - }else { + } + else + { std::cout << "SOLVED!" << std::endl; std::cout << "Decision variables: ["; - for (size_t i = 0; i < result.solution.size(); i++) + for (int i = 0; i < result.solution.size(); i++) { std::cout << result.solution[i]; - if (i != result.solution.size()-1){ + if (i != result.solution.size() - 1) + { std::cout << ", "; } } @@ -100,16 +97,19 @@ int printResult(Result result) { if (result.maximize) { std::cout << "Maximum "; - }else{ + } + else + { std::cout << "Minimum "; } std::cout << "objective function value: " << result.objective_function_value << std::endl; } - + return 0; } -bool check_eq(double a, double b, double relativeEpsilon = 0.0001) { +bool check_eq(double a, double b, double relativeEpsilon = 0.0001) +{ double diff = std::abs(a - b); a = std::abs(a); b = std::abs(b); @@ -118,7 +118,8 @@ bool check_eq(double a, double b, double relativeEpsilon = 0.0001) { return diff <= largest * relativeEpsilon; } -int TEST_GENERAL_CASE() { +int TEST_GENERAL_CASE() +{ std::cout << "----------------------------RUNNING_TEST_GENERAL_CASE----------------------------" << std::endl; Vector C = {5, 4}; @@ -126,16 +127,17 @@ int TEST_GENERAL_CASE() { {6, 4}, {1, 2}, {-1, 1}, - {0, 1} - }; + {0, 1}}; Vector b = {24, 6, 1, 2}; _printInitialInputs(C, A, b, 0.01, true); auto result = simplex(C, A, b); - if (!(result.state == bounded)) { + if (!(result.state == bounded)) + { std::string state_name; - switch (result.state) { + switch (result.state) + { case unsolvable: state_name = "unsolvable"; break; @@ -150,40 +152,44 @@ int TEST_GENERAL_CASE() { return 0; } - if (!check_eq(result.objective_function_value, 21)) { - std::cout << "Incorrect objective function value. Expected 21. Got " //ЭТО УДАЛИТЬ? + if (!check_eq(result.objective_function_value, 21)) + { + std::cout << "Incorrect objective function value. Expected 21. Got " // ЭТО УДАЛИТЬ? << result.objective_function_value << std::endl; return 0; } - if (!( check_eq(result.solution[0],3) && check_eq(result.solution[1], 1.5) )) { - std::cout << "Incorrect desire variables. Expected 3 and 1.5. Got " //ЭТО УДАЛИТЬ? + if (!(check_eq(result.solution[0], 3) && check_eq(result.solution[1], 1.5))) + { + std::cout << "Incorrect desire variables. Expected 3 and 1.5. Got " // ЭТО УДАЛИТЬ? << result.solution; return 0; } printResult(result); - + return 1; } -int TEST_MINIMIZE_CASE() { +int TEST_MINIMIZE_CASE() +{ std::cout << "----------------------------RUNNING_TEST_MINIMIZE_CASE----------------------------" << std::endl; Vector C = {-2, 2, -6}; Matrix A = { {2, 1, -2}, {1, 2, 4}, - {1, -1, 2} - }; + {1, -1, 2}}; Vector b = {24, 23, 10}; _printInitialInputs(C, A, b, 0.01, false); auto result = simplex(C, A, b, 0.01, false); - if (!(result.state == bounded)) { + if (!(result.state == bounded)) + { std::string state_name; - switch (result.state) { + switch (result.state) + { case unsolvable: state_name = "unsolvable"; break; @@ -198,15 +204,15 @@ int TEST_MINIMIZE_CASE() { return 0; } - if (!check_eq(result.objective_function_value, -30.75)) { + if (!check_eq(result.objective_function_value, -30.75)) + { std::cout << "Incorrect objective function value. Expected -30.75. Got " << result.objective_function_value << std::endl; return 0; } - if (!( check_eq(result.solution[0], 0) && check_eq(result.solution[1], 0.75) - && check_eq(result.solution[2],5.375) - )) { + if (!(check_eq(result.solution[0], 0) && check_eq(result.solution[1], 0.75) && check_eq(result.solution[2], 5.375))) + { std::cout << "Incorrect desire variables. Expected 3 and 1.5. Got " << result.solution; return 0; @@ -217,25 +223,26 @@ int TEST_MINIMIZE_CASE() { return 1; } -int TEST_WITH_SLACK_CASE() { +int TEST_WITH_SLACK_CASE() +{ std::cout << "----------------------------RUNNING_TEST_WITH_SLACK_CASE----------------------------" << std::endl; - Vector C = {5, 4}; + Vector C = {2, -1, 0, -1}; Matrix A = { - {6, 4, 1}, - {1, 2, 0}, - {-1, 1, 0}, - {0, 1, 0} - }; - Vector b = {24, 6, 1, 2}; + {1, -2, 1, 0}, + {-2, -1, 0, -2}, + {3, 2, 0, 1}}; + Vector b = {10, 18, 36}; _printInitialInputs(C, A, b, 0.01, true); auto result = simplex(C, A, b); - if (!(result.state == bounded)) { + if (!(result.state == bounded)) + { std::string state_name; - switch (result.state) { + switch (result.state) + { case unsolvable: state_name = "unsolvable"; break; @@ -250,41 +257,45 @@ int TEST_WITH_SLACK_CASE() { return 0; } - if (result.objective_function_value != 21) { - std::cout << "Incorrect objective function value. Expected 21. Got " + if (result.objective_function_value != 22.25) + { + std::cout << "Incorrect objective function value. Expected 22.25. Got " << result.objective_function_value << std::endl; return 0; } - if (!((result.solution[0] == 3) || (result.solution[1] == 1.5))) { - std::cout << "Incorrect desire variables. Expected 3 and 1.5. Got " - << result.solution[0] << result.solution[1]; + if (!((result.solution[0] == 11.5) || (result.solution[1] == 0.75) || + (result.solution[2] == 0) || (result.solution[3] == 0))) + { + std::cout << "Incorrect desire variables. Expected 11.5, 0.75, 0, and 0. Got " + << result.solution; return 0; } - - printResult(result); + printResult(result); return 1; } -int TEST_UNBOUNDED_CASE() { +int TEST_UNBOUNDED_CASE() +{ std::cout << "----------------------------RUNNING_TEST_UNBOUNDED_CASE----------------------------" << std::endl; Vector C = {2, 1}; Matrix A = { {1, -1}, - {2, 0} - }; + {2, 0}}; Vector b = {10, 40}; - + _printInitialInputs(C, A, b, 0.01, true); auto result = simplex(C, A, b); - if (!(result.state == unbounded)) { + if (!(result.state == unbounded)) + { std::string state_name; - switch (result.state) { + switch (result.state) + { case unsolvable: state_name = "unsolvable"; break; @@ -298,31 +309,33 @@ int TEST_UNBOUNDED_CASE() { std::cout << "Incorrect state type. Expected unbounded. Got " << state_name << std::endl; return 0; } - + printResult(result); return 1; } -int TEST_UNSOLVABLE_CASE() { +int TEST_UNSOLVABLE_CASE() +{ std::cout << "----------------------------RUNNING_TEST_UNSOLVABLE_CASE----------------------------" << std::endl; - Vector C = {5, 4}; + Vector C = {5, 4, 0, -5, 13}; Matrix A = { - {6, 4}, - {1, 2}, - {-1, 1}, - {0, 1} - }; + {6, 4, 1, 3, 4}, + {1, 2, 0, 0, 2}, + {-1, 0, 0, 10, 0}, + {0, 1, 1, -5, 1}}; Vector b = {-24, 6, 1, 2}; _printInitialInputs(C, A, b, 0.01, true); auto result = simplex(C, A, b); - if (!(result.state == unsolvable)) { + if (!(result.state == unsolvable)) + { std::string state_name; - switch (result.state) { + switch (result.state) + { case unsolvable: state_name = "unsolvable"; break; @@ -336,27 +349,26 @@ int TEST_UNSOLVABLE_CASE() { std::cout << "Incorrect state type. Expected unsolvable. Got " << state_name << std::endl; return 0; } - + printResult(result); return 1; } - - -int main() { +int main() +{ std::vector> tests = { TEST_GENERAL_CASE, TEST_MINIMIZE_CASE, TEST_WITH_SLACK_CASE, TEST_UNBOUNDED_CASE, - TEST_UNSOLVABLE_CASE - }; + TEST_UNSOLVABLE_CASE}; int counter = 0; - for (auto& test : tests) { + for (auto &test : tests) + { counter += test(); } @@ -366,5 +378,3 @@ int main() { return 0; } - - diff --git a/simplex.cpp b/simplex.cpp index d6dae65..4303a35 100644 --- a/simplex.cpp +++ b/simplex.cpp @@ -4,39 +4,48 @@ #include "tools/math.h" #include "tools/elimination.h" -enum solver_state { +enum solver_state +{ unbounded, bounded, unsolvable }; -struct Result { +struct Result +{ solver_state state; Vector solution; double objective_function_value; bool maximize; }; -void _stopIterating(Matrix& generalMatrix, Vector& C, std::vector& basicVars, solver_state state, Result& result) { +void _stopIterating(Matrix &generalMatrix, Vector &C, std::vector &basicVars, solver_state state, Result &result) +{ DestroyMatrix destroyedGeneralMatrix = disassembleGeneralMatrix(generalMatrix); Matrix _A = destroyedGeneralMatrix.A; Vector _C = destroyedGeneralMatrix.C; Vector _b = destroyedGeneralMatrix.b; result.state = state; - if (state == bounded) { + if (state == bounded) + { result.solution = Vector(C.size()); - for (int i = 0; i < C.size(); i++) { + for (int i = 0; i < C.size(); i++) + { result.solution[i] = 0; } - for (size_t i = 1; i < basicVars.size(); i++) { - if (basicVars[i] < C.size()) { + for (size_t i = 1; i < basicVars.size(); i++) + { + if (basicVars[i] < C.size()) + { result.solution[basicVars[i]] = _b[i]; } } result.objective_function_value = _b[0]; - } else { + } + else + { result.solution = Vector({0}); result.objective_function_value = 0; } @@ -45,76 +54,90 @@ void _stopIterating(Matrix& generalMatrix, Vector& C, std::vector& basicVar /* Implementation of the Simplex method. */ -Result simplex(Vector& C, Matrix& A, Vector& b, double eps = 0.01, bool maximize=true) { +Result simplex(Vector &C, Matrix &A, Vector &b, double eps = 0.01, bool maximize = true) +{ - if (maximize == true) { - for (int i = 0; i < C.size(); i++) { - C[i] = -C[i]; + if (maximize == true) + { + for (int i = 0; i < C.size(); i++) + { + C[i] = -C[i]; } } - Result result{}; + Result result{}; result.maximize = maximize; - - Matrix generalMatrix = createGeneralMatrix(A, C, b); + + Matrix generalMatrix = createGeneralMatrix(A, C, b); std::cout << generalMatrix; std::vector basicVars(generalMatrix.getRows()); basicVars[0] = -1; - for (int i = 0; i < b.size(); ++i) { - if (b[i] < 0) { + for (int i = 0; i < b.size(); ++i) + { + if (b[i] < 0) + { _stopIterating(generalMatrix, C, basicVars, unsolvable, result); return result; } } - for (size_t i = 1; i < basicVars.size(); i++) { + for (size_t i = 1; i < basicVars.size(); i++) + { basicVars[i] = static_cast(basicVars.size()) + i; } int iterationCount = 0; - while (true) { - //3 + while (true) + { + // 3 iterationCount++; int pivot_column_index = 0; - + pivot_column_index = min_index(generalMatrix[0]); - if (generalMatrix[0][pivot_column_index] >= 0) { + if (generalMatrix[0][pivot_column_index] >= 0) + { _stopIterating(generalMatrix, C, basicVars, bounded, result); - if (!maximize) { + if (!maximize) + { result.objective_function_value = -result.objective_function_value; } return result; } - - - //4 + // 4 Vector ratio_vector(generalMatrix.getRows()); - for (int i = 1; i < generalMatrix.getRows(); i++) { - if (generalMatrix[i][pivot_column_index] != 0) { - ratio_vector[i] = generalMatrix[i][generalMatrix.getColumns() - 1] / generalMatrix[i][pivot_column_index]; - if (std::abs(ratio_vector[i]) < eps) { + for (int i = 1; i < generalMatrix.getRows(); i++) + { + if (generalMatrix[i][pivot_column_index] != 0) + { + ratio_vector[i] = generalMatrix[i][generalMatrix.getColumns() - 1] / generalMatrix[i][pivot_column_index]; + if (std::abs(ratio_vector[i]) < eps) + { ratio_vector[i] = 0; } - } else { - ratio_vector[i] = 0; - } + } + else + { + ratio_vector[i] = 0; + } } ratio_vector[0] = 0; int pivot_row_index = min_index_positive(ratio_vector); // No leaving variable exists - if (pivot_row_index == -1) { + if (pivot_row_index == -1) + { _stopIterating(generalMatrix, C, basicVars, unbounded, result); return result; } basicVars[pivot_row_index] = pivot_column_index; - //5 + // 5 elimination(generalMatrix, pivot_row_index, pivot_column_index); - std::cout << "Iteration "<< iterationCount << " " << std::endl;; + std::cout << "Iteration " << iterationCount << " " << std::endl; + ; std::cout << generalMatrix; } return result; @@ -133,10 +156,10 @@ Steps: 1. Print the optimization problem: - max (or min) z = C[0] * x1 + C[1] * x2 + ... + C[n] * xn - subject to the constraints: - - A[0] * x <= b[0] - - A[1] * x <= b[1] - - ... - - A[m] * x <= b[m] + - A[0] * x <= b[0] + - A[1] * x <= b[1] + - ... + - A[m] * x <= b[m] 2. Initialize: - Form the initial tableau by introducing slack variables to convert inequalities into equalities. diff --git a/simplex.h b/simplex.h index cdd5f12..2b561b7 100644 --- a/simplex.h +++ b/simplex.h @@ -4,21 +4,23 @@ #include #include "tools/matrix.h" -enum solver_state { +enum solver_state +{ unbounded, bounded, unsolvable }; -struct Result { +struct Result +{ solver_state state; Vector solution; double objective_function_value; bool maximize; }; -void _printInitialInputs(Vector& C, Matrix& A, Vector& b); -void _stopIterating(Matrix& generalMatrix, std::vector& basicVars, Result& result); -Result simplex(Vector& C, Matrix& A, Vector& b, double eps = 0.01, bool maximize = true); +void _printInitialInputs(Vector &C, Matrix &A, Vector &b); +void _stopIterating(Matrix &generalMatrix, std::vector &basicVars, Result &result); +Result simplex(Vector &C, Matrix &A, Vector &b, double eps = 0.01, bool maximize = true); #endif // SIMPLEX_H \ No newline at end of file diff --git a/tools/elimination.cpp b/tools/elimination.cpp index 4bd322f..037533a 100644 --- a/tools/elimination.cpp +++ b/tools/elimination.cpp @@ -1,9 +1,10 @@ #include "elimination.h" #include "math.h" -FracturedMatrix::FracturedMatrix(const FracturedMatrix& other) : A(other.A), C(other.C), b(other.b), pivot_column_index(other.pivot_column_index), pivot_row_index(other.pivot_row_index) {} +FracturedMatrix::FracturedMatrix(const FracturedMatrix &other) : A(other.A), C(other.C), b(other.b), pivot_column_index(other.pivot_column_index), pivot_row_index(other.pivot_row_index) {} FracturedMatrix::FracturedMatrix(Matrix A, Vector C, Vector b, int pivot_column_index, int pivot_row_index) : A(A), C(C), b(b), pivot_column_index(pivot_column_index), pivot_row_index(pivot_row_index) {} -FracturedMatrix& FracturedMatrix::operator=(const FracturedMatrix& other) { +FracturedMatrix &FracturedMatrix::operator=(const FracturedMatrix &other) +{ A = other.A; C = other.C; b = other.b; @@ -12,7 +13,8 @@ FracturedMatrix& FracturedMatrix::operator=(const FracturedMatrix& other) { return *this; } -DestroyMatrix disassembleGeneralMatrix(Matrix& generalMatrix) { +DestroyMatrix disassembleGeneralMatrix(Matrix &generalMatrix) +{ int rows = generalMatrix.getRows(); int cols = generalMatrix.getColumns(); @@ -20,16 +22,20 @@ DestroyMatrix disassembleGeneralMatrix(Matrix& generalMatrix) { Vector C(cols - 1); Vector b(rows); - for (int j = 0; j < cols - 1; ++j) { + for (int j = 0; j < cols - 1; ++j) + { C[j] = generalMatrix[0][j]; } - for (int i = 0; i < rows; ++i) { + for (int i = 0; i < rows; ++i) + { b[i] = generalMatrix[i][cols - 1]; } - for (int i = 1; i < rows; ++i) { - for (int j = 0; j < cols - 1; ++j) { + for (int i = 1; i < rows; ++i) + { + for (int j = 0; j < cols - 1; ++j) + { A[i - 1][j] = generalMatrix[i][j]; } } @@ -37,89 +43,76 @@ DestroyMatrix disassembleGeneralMatrix(Matrix& generalMatrix) { return {A, C, b}; } -Matrix createGeneralMatrix(Matrix& A, Vector& C, Vector& b) { +Matrix createGeneralMatrix(Matrix &A, Vector &C, Vector &b) +{ int m = A.getRows() + 1; - int n = A.getColumns() + 1; - - // States if equation has a slack variable - std::vector has_slack(A.getColumns(), false); - int number_of_slack = 0; - - for (int j = 0; j < A.getColumns(); ++j) { - int basic_var_index = 0; - int ones = 0; - int zeros = 0; - - for (int i = 0; i < A.getRows(); ++i) { - if (A[i][j] == 1) { - basic_var_index = i; - ++ones; - } else if (A[i][j] == 0) { - ++zeros; - } - } - - if (ones + zeros == A.getRows()) { - has_slack[basic_var_index] = true; - number_of_slack += 1; - } - } - - n = n + A.getRows() - number_of_slack; + int n = A.getColumns() + A.getRows() + 1; Matrix generalMatrix(m, n); - for (int i = 0; i < n; i++) { - if (i < C.size()) { + + for (int i = 0; i < n; i++) + { + if (i < C.size()) + { generalMatrix[0][i] = C[i]; - } else { + } + else + { generalMatrix[0][i] = 0; } } // For objective function (j=0) the value is set to zero one step before - for (int j = 1; j < m; j++) { - generalMatrix[j][n-1] = b[j-1]; + for (int j = 1; j < m; j++) + { + generalMatrix[j][n - 1] = b[j - 1]; } int k = 0; - for (int i = 0; i < m - 1; i++) { - for (int j = 0; j < n - 1; j++) { - if (j < A.getColumns()) { + for (int i = 0; i < m - 1; i++) + { + for (int j = 0; j < n - 1; j++) + { + if (j < A.getColumns()) + { generalMatrix[i + 1][j] = A[i][j]; - } else { + } + else + { generalMatrix[i + 1][j] = 0; } } - if (!has_slack[i]) { - generalMatrix[i + 1][A.getColumns() + k] = 1; - ++k; - } + generalMatrix[i + 1][A.getColumns() + k] = 1; + ++k; } return generalMatrix; } -void elimination(Matrix& generalMatrix, int pivot_row_index, int pivot_column_index) { +void elimination(Matrix &generalMatrix, int pivot_row_index, int pivot_column_index) +{ int rows = generalMatrix.getRows(); int cols = generalMatrix.getColumns(); double pivotElement = generalMatrix[pivot_row_index][pivot_column_index]; - for (int j = 0; j < cols; ++j) { + for (int j = 0; j < cols; ++j) + { generalMatrix[pivot_row_index][j] /= pivotElement; } - for (int i = 0; i < rows; ++i) { - if (i == pivot_row_index) + for (int i = 0; i < rows; ++i) + { + if (i == pivot_row_index) continue; double pivotColumnCoefficient = generalMatrix[i][pivot_column_index]; - for (int j = 0; j < cols; ++j) { + for (int j = 0; j < cols; ++j) + { generalMatrix[i][j] -= pivotColumnCoefficient * generalMatrix[pivot_row_index][j]; } } } - diff --git a/tools/elimination.h b/tools/elimination.h index 2c71100..ebdb7b3 100644 --- a/tools/elimination.h +++ b/tools/elimination.h @@ -3,28 +3,28 @@ #include "matrix.h" - -struct FracturedMatrix { +struct FracturedMatrix +{ Matrix A; Vector C; Vector b; int pivot_column_index; int pivot_row_index; FracturedMatrix() = default; - FracturedMatrix(const FracturedMatrix& other); + FracturedMatrix(const FracturedMatrix &other); FracturedMatrix(Matrix A, Vector C, Vector b, int pivot_column_index, int pivot_row_index); - FracturedMatrix& operator=(const FracturedMatrix& other); + FracturedMatrix &operator=(const FracturedMatrix &other); }; -struct DestroyMatrix { - Matrix A; - Vector C; - Vector b; +struct DestroyMatrix +{ + Matrix A; + Vector C; + Vector b; }; -DestroyMatrix disassembleGeneralMatrix(Matrix& generalMatrix); -void elimination(Matrix&, int pivot_row_index, int pivot_column_index); -Matrix createGeneralMatrix(Matrix& A, Vector& C, Vector& b); +DestroyMatrix disassembleGeneralMatrix(Matrix &generalMatrix); +void elimination(Matrix &, int pivot_row_index, int pivot_column_index); +Matrix createGeneralMatrix(Matrix &A, Vector &C, Vector &b); - -#endif //ELIMINATION_H +#endif // ELIMINATION_H diff --git a/tools/math.cpp b/tools/math.cpp index 384fd8f..00d1996 100644 --- a/tools/math.cpp +++ b/tools/math.cpp @@ -1,39 +1,50 @@ #include "math.h" -double min(Vector vector) { +double min(Vector vector) +{ double temp = vector[0]; - for (int j = 0; j < vector.size(); j++) { - if (vector[j] < temp) { + for (int j = 0; j < vector.size(); j++) + { + if (vector[j] < temp) + { temp = vector[j]; } } return temp; } -double max(Vector vector) { +double max(Vector vector) +{ double temp = vector[0]; - for (int j = 0; j < vector.size(); j++) { - if (vector[j] > temp) { + for (int j = 0; j < vector.size(); j++) + { + if (vector[j] > temp) + { temp = vector[j]; } } return temp; } -int min_index_positive(Vector vector) { +int min_index_positive(Vector vector) +{ int i = 0; - while (i < vector.size() && vector[i] <= 0) { + while (i < vector.size() && vector[i] <= 0) + { ++i; } - if (i >= vector.size()) { + if (i >= vector.size()) + { // No positive value found -> iterations stop return -1; } int temp_index = i; double temp = vector[i]; - for (int j = i + 1; j < vector.size(); j++) { - if (vector[j] < temp && vector[j] > 0) { + for (int j = i + 1; j < vector.size(); j++) + { + if (vector[j] < temp && vector[j] > 0) + { temp_index = j; temp = vector[j]; } @@ -41,11 +52,14 @@ int min_index_positive(Vector vector) { return temp_index; } -int min_index(Vector vector) { +int min_index(Vector vector) +{ int temp_index = 0; double temp = vector[0]; - for (int j = 0; j < vector.size(); j++) { - if (vector[j] < temp) { + for (int j = 0; j < vector.size(); j++) + { + if (vector[j] < temp) + { temp_index = j; temp = vector[j]; } @@ -53,11 +67,14 @@ int min_index(Vector vector) { return temp_index; } -int max_index(Vector vector) { +int max_index(Vector vector) +{ int temp_index = 0; double temp = vector[0]; - for (int j = 0; j < vector.size(); j++) { - if (vector[j] > temp) { + for (int j = 0; j < vector.size(); j++) + { + if (vector[j] > temp) + { temp_index = j; temp = vector[j]; } @@ -65,31 +82,40 @@ int max_index(Vector vector) { return temp_index; } -double min(std::vector array) { +double min(std::vector array) +{ double temp = array[0]; - for (size_t i = 1; i < array.size(); i++) { - if (array[i] < temp) { + for (size_t i = 1; i < array.size(); i++) + { + if (array[i] < temp) + { temp = array[i]; } } return temp; } -double max(std::vector array) { +double max(std::vector array) +{ double temp = array[0]; - for (size_t i = 1; i < array.size(); i++) { - if (array[i] > temp) { + for (size_t i = 1; i < array.size(); i++) + { + if (array[i] > temp) + { temp = array[i]; } } return temp; } -int min_index(std::vector array) { +int min_index(std::vector array) +{ int temp_index = 0; double temp = array[0]; - for (size_t i = 1; i < array.size(); i++) { - if (array[i] < temp) { + for (size_t i = 1; i < array.size(); i++) + { + if (array[i] < temp) + { temp_index = i; temp = array[i]; } @@ -97,12 +123,14 @@ int min_index(std::vector array) { return temp_index; } - -int max_index(std::vector array) { +int max_index(std::vector array) +{ int temp_index = 0; double temp = array[0]; - for (size_t i = 1; i < array.size(); i++) { - if (array[i] > temp) { + for (size_t i = 1; i < array.size(); i++) + { + if (array[i] > temp) + { temp_index = i; temp = array[i]; } diff --git a/tools/matrix.cpp b/tools/matrix.cpp index 0766414..93f8e6c 100644 --- a/tools/matrix.cpp +++ b/tools/matrix.cpp @@ -1,142 +1,175 @@ #include "matrix.h" -Vector::Vector(int n) { +Vector::Vector(int n) +{ rows = n; columns = 1; vector.resize(n); } -Vector::Vector(const Vector& other) { +Vector::Vector(const Vector &other) +{ rows = other.rows; columns = other.columns; vector = other.vector; } -Vector::Vector(std::initializer_list init) { +Vector::Vector(std::initializer_list init) +{ rows = init.size(); columns = 1; vector = std::vector(rows); auto it = init.begin(); - - for (size_t i = 0; i < init.size(); ++i) { + + for (size_t i = 0; i < init.size(); ++i) + { vector[i] = *it++; } } -int Vector::size() const { +int Vector::size() const +{ return rows; } -double& Vector::operator[](int row) { +double &Vector::operator[](int row) +{ return vector[row]; } -Vector& Vector::operator=(const Vector& other) { +Vector &Vector::operator=(const Vector &other) +{ rows = other.rows; columns = other.columns; vector = other.vector; return *this; } -Vector Vector::operator+(Vector& other) { - if (rows != other.rows) { +Vector Vector::operator+(Vector &other) +{ + if (rows != other.rows) + { throw std::runtime_error("Error: the dimensional problem occurred"); } Vector result(rows); - for (int i = 0; i < rows; ++i) { + for (int i = 0; i < rows; ++i) + { result[i] = vector[i] + other[i]; } return result; } -Vector Vector::operator-(Vector& other) { - if (rows != other.rows) { +Vector Vector::operator-(Vector &other) +{ + if (rows != other.rows) + { throw std::runtime_error("Error: the dimensional problem occurred"); } Vector result(rows); - for (int i = 0; i < rows; ++i) { + for (int i = 0; i < rows; ++i) + { result[i] = vector[i] - other[i]; } return result; } -std::istream& operator>>(std::istream& cin, Vector& vectorObj) { - for (int i = 0; i < vectorObj.rows; ++i) { +std::istream &operator>>(std::istream &cin, Vector &vectorObj) +{ + for (int i = 0; i < vectorObj.rows; ++i) + { cin >> vectorObj[i]; } return cin; } -std::ostream& operator<<(std::ostream& cout, Vector& vectorObj) { - for (int i = 0; i < vectorObj.rows; ++i) { - if (i == vectorObj.rows - 1) { +std::ostream &operator<<(std::ostream &cout, Vector &vectorObj) +{ + for (int i = 0; i < vectorObj.rows; ++i) + { + if (i == vectorObj.rows - 1) + { cout << vectorObj[i] << std::endl; } - else { + else + { cout << vectorObj[i] << ' '; } } return cout; } -Matrix::Matrix(int n, int m) { +Matrix::Matrix(int n, int m) +{ rows = n; columns = m; matrix.resize(n, Vector(m)); - for (auto& row : matrix) { + for (auto &row : matrix) + { row = Vector(m); } } -Matrix::Matrix(const Matrix& other) { +Matrix::Matrix(const Matrix &other) +{ rows = other.rows; columns = other.columns; matrix = other.matrix; } -Matrix::Matrix(std::initializer_list> init) { +Matrix::Matrix(std::initializer_list> init) +{ rows = init.size(); auto it = init.begin(); columns = it->size(); matrix = std::vector(rows, Vector(columns)); - for (int i = 0; i < rows; ++i) { - for (int j = 0; j < columns; ++j) { + for (int i = 0; i < rows; ++i) + { + for (int j = 0; j < columns; ++j) + { matrix[i][j] = it->operator[](j); } ++it; } } -int Matrix::getRows() const { +int Matrix::getRows() const +{ return rows; } -int Matrix::getColumns() const { +int Matrix::getColumns() const +{ return columns; } -Vector& Matrix::operator[](int row) { +Vector &Matrix::operator[](int row) +{ return matrix[row]; } -Matrix& Matrix::operator=(const Matrix& other) { +Matrix &Matrix::operator=(const Matrix &other) +{ rows = other.rows; columns = other.columns; matrix = other.matrix; return *this; } -Matrix Matrix::operator+(Matrix& other) const { - if (rows != other.rows || columns != other.columns) { +Matrix Matrix::operator+(Matrix &other) const +{ + if (rows != other.rows || columns != other.columns) + { throw std::runtime_error("Error: the dimensional problem occurred"); } Matrix result(rows, columns); - for (int i = 0; i < rows; ++i) { - for (int j = 0; j < columns; ++j) { + for (int i = 0; i < rows; ++i) + { + for (int j = 0; j < columns; ++j) + { auto x = matrix[i]; auto y = other[i]; result[i][j] = x[j] + y[j]; @@ -146,13 +179,17 @@ Matrix Matrix::operator+(Matrix& other) const { return result; } -Matrix Matrix::operator-(Matrix& other) const { - if (rows != other.rows || columns != other.columns) { +Matrix Matrix::operator-(Matrix &other) const +{ + if (rows != other.rows || columns != other.columns) + { throw std::runtime_error("Error: the dimensional problem occurred"); } Matrix result(rows, columns); - for (int i = 0; i < rows; ++i) { - for (int j = 0; j < columns; ++j) { + for (int i = 0; i < rows; ++i) + { + for (int j = 0; j < columns; ++j) + { auto x = matrix[i]; auto y = other[i]; result[i][j] = x[j] - y[j]; @@ -162,16 +199,21 @@ Matrix Matrix::operator-(Matrix& other) const { return result; } -Matrix Matrix::operator*(Matrix& other) const { - if (columns != other.rows) { +Matrix Matrix::operator*(Matrix &other) const +{ + if (columns != other.rows) + { throw std::runtime_error("Error: the dimensional problem occurred"); } Matrix result(rows, other.columns); - for (int i = 0; i < rows; ++i) { - for (int j = 0; j < other.columns; ++j) { + for (int i = 0; i < rows; ++i) + { + for (int j = 0; j < other.columns; ++j) + { result[i][j] = 0; - for (int k = 0; k < columns; ++k) { + for (int k = 0; k < columns; ++k) + { auto x = matrix[i]; auto y = other[k]; result[i][j] += x[k] * y[j]; @@ -182,15 +224,19 @@ Matrix Matrix::operator*(Matrix& other) const { return result; } -Vector Matrix::operator*(Vector other) const { - if (columns != other.size()) { +Vector Matrix::operator*(Vector other) const +{ + if (columns != other.size()) + { throw std::runtime_error("Error: the dimensional problem occurred"); } Vector result(rows); - for (int i = 0; i < rows; ++i) { + for (int i = 0; i < rows; ++i) + { result[i] = 0; - for (int k = 0; k < columns; ++k) { + for (int k = 0; k < columns; ++k) + { auto x = matrix[i]; result[i] += x[k] * other[k]; } @@ -199,10 +245,13 @@ Vector Matrix::operator*(Vector other) const { return result; } -Matrix Matrix::transpose() const { +Matrix Matrix::transpose() const +{ Matrix result(columns, rows); - for (int i = 0; i < rows; ++i) { - for (int j = 0; j < columns; ++j) { + for (int i = 0; i < rows; ++i) + { + for (int j = 0; j < columns; ++j) + { auto x = matrix[i]; result[j][i] = x[j]; } @@ -211,51 +260,65 @@ Matrix Matrix::transpose() const { return result; } -std::istream& operator>>(std::istream& cin, Matrix& matrixObj) { - for (int i = 0; i < matrixObj.rows; ++i) { - for (int j = 0; j < matrixObj.columns; ++j) { +std::istream &operator>>(std::istream &cin, Matrix &matrixObj) +{ + for (int i = 0; i < matrixObj.rows; ++i) + { + for (int j = 0; j < matrixObj.columns; ++j) + { cin >> matrixObj[i][j]; } } return cin; } -std::ostream& operator<<(std::ostream& cout, Matrix& matrixObj) { +std::ostream &operator<<(std::ostream &cout, Matrix &matrixObj) +{ size_t maxNumberLength = 1; - for (int y = 0; y < matrixObj.getRows(); y++) { - for (int x = 0; x < matrixObj.getColumns(); x++) { - if (std::to_string(matrixObj[y][x]).length() > maxNumberLength) { + for (int y = 0; y < matrixObj.getRows(); y++) + { + for (int x = 0; x < matrixObj.getColumns(); x++) + { + if (std::to_string(matrixObj[y][x]).length() > maxNumberLength) + { maxNumberLength = std::to_string(matrixObj[y][x]).length(); } } } - //std::cout << maxNumberLength << std::endl; + // std::cout << maxNumberLength << std::endl; std::cout << std::endl; - for (int y = 0; y < matrixObj.getRows(); y++) { + for (int y = 0; y < matrixObj.getRows(); y++) + { std::string row = ""; - for (int x = 0; x < matrixObj.getColumns(); x++) { + for (int x = 0; x < matrixObj.getColumns(); x++) + { std::string strNumber = std::to_string(matrixObj[y][x]); bool spaceRight = true; - while (strNumber.length() < maxNumberLength) { - if (spaceRight) { + while (strNumber.length() < maxNumberLength) + { + if (spaceRight) + { strNumber += " "; } - else { + else + { strNumber = " " + strNumber; } spaceRight = !spaceRight; strNumber = "" + strNumber; - } - if (matrixObj[y][x] == 0) { + if (matrixObj[y][x] == 0) + { row += "[\033[0m" + strNumber + "\033[0m] "; } - else if(matrixObj[y][x] > 0) { + else if (matrixObj[y][x] > 0) + { row += "[\033[32m" + strNumber + "\033[0m] "; - }else { + } + else + { row += "[\033[31m" + strNumber + "\033[0m] "; } - } std::cout << row << std::endl; } diff --git a/tools/matrix.h b/tools/matrix.h index d05dcd5..df56352 100644 --- a/tools/matrix.h +++ b/tools/matrix.h @@ -6,12 +6,12 @@ #include /** -* Vector is a class to represent -* a column vector with n rows. -*/ + * Vector is a class to represent + * a column vector with n rows. + */ - -class Vector { +class Vector +{ protected: // Number of rows in vector int rows; @@ -19,39 +19,41 @@ protected: int columns; // Matrix representation as vector of vectors of integers std::vector vector; + public: Vector(int n); - Vector(const Vector& other); + Vector(const Vector &other); Vector(std::initializer_list); /* Getter for the number of rows */ int size() const; - double& operator[](int row); + double &operator[](int row); - Vector& operator=(const Vector& other); + Vector &operator=(const Vector &other); - Vector operator+(Vector& other); + Vector operator+(Vector &other); - Vector operator-(Vector& other); + Vector operator-(Vector &other); /* Input operator reads element of vector */ - friend std::istream& operator>>(std::istream& cin, Vector& vectorObj); + friend std::istream &operator>>(std::istream &cin, Vector &vectorObj); /* Output operator prints elements of the vector - * in a row separated with a space (no space at the end of the line) - */ - friend std::ostream& operator<<(std::ostream& cout, Vector& vectorObj); + * in a row separated with a space (no space at the end of the line) + */ + friend std::ostream &operator<<(std::ostream &cout, Vector &vectorObj); }; /** -* Class Matrix represents -* a matrix of size n x m -* of type integer. -*/ -class Matrix { + * Class Matrix represents + * a matrix of size n x m + * of type integer. + */ +class Matrix +{ protected: // Number of rows in matrix int rows; @@ -59,10 +61,11 @@ protected: int columns; // Matrix representation as vector of vectors of integers std::vector matrix; + public: Matrix(int n, int m); - Matrix(const Matrix& other); + Matrix(const Matrix &other); Matrix(std::initializer_list>); @@ -72,15 +75,15 @@ public: /* Getter for the number of columns */ int getColumns() const; - Vector& operator[](int row); + Vector &operator[](int row); - Matrix& operator=(const Matrix& other); + Matrix &operator=(const Matrix &other); - Matrix operator+(Matrix& other) const; + Matrix operator+(Matrix &other) const; - Matrix operator-(Matrix& other) const; + Matrix operator-(Matrix &other) const; - Matrix operator*(Matrix& other) const; + Matrix operator*(Matrix &other) const; /* Matrix-Vector multiplication */ Vector operator*(Vector other) const; @@ -89,12 +92,12 @@ public: Matrix transpose() const; /* Input operator reads element of matrix row by row */ - friend std::istream& operator>>(std::istream& cin, Matrix& matrixObj); + friend std::istream &operator>>(std::istream &cin, Matrix &matrixObj); /* Output operator prints elements of the matrix - * row by row separated with a space (no space at the end of each line) - */ - friend std::ostream& operator<<(std::ostream& cout, Matrix& matrixObj); + * row by row separated with a space (no space at the end of each line) + */ + friend std::ostream &operator<<(std::ostream &cout, Matrix &matrixObj); }; -#endif // TOOLS_MATRIX_H +#endif // TOOLS_MATRIX_H