From b9d28cbea34ebd8074f9459ce0418ddbb4ade200 Mon Sep 17 00:00:00 2001 From: Martin Asprusten Date: Fri, 28 Aug 2026 21:50:39 +0200 Subject: [PATCH] Use smaller datatypes to avoid overflowing memory --- native/salesman.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/native/salesman.cpp b/native/salesman.cpp index 6796209..824fb15 100644 --- a/native/salesman.cpp +++ b/native/salesman.cpp @@ -1,3 +1,4 @@ +#include #ifdef __EMSCRIPTEN__ #include #include @@ -15,9 +16,9 @@ struct City { }; struct State{ - double** weights; - int** adjacencyMatrix; - double lowerBound; + float** weights; + uint8_t** adjacencyMatrix; + float lowerBound; bool finished = false; std::vector> paths; }; @@ -29,7 +30,7 @@ struct SplitState { }; -double reduceWeights(double** weights, int numberOfCities) { +double reduceWeights(float** weights, int numberOfCities) { double totalReduced = 0; for (int row = 0; row < numberOfCities; row++) { @@ -73,7 +74,7 @@ double reduceWeights(double** weights, int numberOfCities) { return totalReduced; } -std::pair findPivotPoint(double** weights, int numberOfCities) { +std::pair findPivotPoint(float** weights, int numberOfCities) { int bestRow = -1; int bestColumn = -1; double bestIncrease = -1; @@ -120,7 +121,7 @@ std::pair findPivotPoint(double** weights, int numberOfCities) { return std::pair(bestRow, bestColumn); } -int getDegreeOfNode(int nodeNumber, int** adjacencyMatrix, int numberOfCities) { +int getDegreeOfNode(int nodeNumber, uint8_t** adjacencyMatrix, int numberOfCities) { int degree = 0; for (int column = 0; column < numberOfCities; column++) { degree += adjacencyMatrix[nodeNumber][column]; @@ -217,12 +218,12 @@ void disallowSubloops(State &state, int pivotRow, int pivotColumn, int numberOfC } State createNewStateOnPivot(int pivotRow, int pivotColumn, State originalState, int numberOfCities) { - int** adjacencyMatrixCopy = new int*[numberOfCities]; - double** weightsCopy = new double*[numberOfCities]; + uint8_t** adjacencyMatrixCopy = new uint8_t*[numberOfCities]; + float** weightsCopy = new float*[numberOfCities]; for (int row = 0; row < numberOfCities; row++) { - adjacencyMatrixCopy[row] = new int[numberOfCities]; - weightsCopy[row] = new double[numberOfCities]; + adjacencyMatrixCopy[row] = new uint8_t[numberOfCities]; + weightsCopy[row] = new float[numberOfCities]; for (int column = 0; column < numberOfCities; column++) { adjacencyMatrixCopy[row][column] = originalState.adjacencyMatrix[row][column]; weightsCopy[row][column] = originalState.weights[row][column]; @@ -285,7 +286,7 @@ SplitState splitState(State state, int numberOfCities) { return splitState; } -double getActualWeight(int** adjacencyMatrix, double** weights, int numberOfCities) { +double getActualWeight(uint8_t** adjacencyMatrix, double** weights, int numberOfCities) { double totalWeight = 0; for (int row = 0; row < numberOfCities; row++) { for (int column = 0; column < numberOfCities; column++) { @@ -321,11 +322,11 @@ std::vector findShortestPath(std::vector> jsWeights) { // Create a state State initialState; - initialState.weights = new double*[numberOfCities]; - initialState.adjacencyMatrix = new int*[numberOfCities]; + initialState.weights = new float*[numberOfCities]; + initialState.adjacencyMatrix = new uint8_t*[numberOfCities]; for (int row = 0; row < numberOfCities; row++) { - initialState.weights[row] = new double[numberOfCities]; - initialState.adjacencyMatrix[row] = new int[numberOfCities]; + initialState.weights[row] = new float[numberOfCities]; + initialState.adjacencyMatrix[row] = new uint8_t[numberOfCities]; for (int column = 0; column < numberOfCities; column++) { initialState.adjacencyMatrix[row][column] = 0; initialState.weights[row][column] = weights[row][column]; @@ -337,7 +338,7 @@ std::vector findShortestPath(std::vector> jsWeights) { queue.push(initialState); double currentBest = 1e100; - int** bestAdjacenyMatrix = NULL; + uint8_t** bestAdjacenyMatrix = NULL; while (!queue.empty()) { State nextState = queue.top();