Use smaller datatypes to avoid overflowing memory

This commit is contained in:
Martin Asprusten
2026-08-29 09:31:20 +02:00
parent 5f04b7ad6f
commit b9d28cbea3
+17 -16
View File
@@ -1,3 +1,4 @@
#include <cstdint>
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
#include <emscripten/bind.h> #include <emscripten/bind.h>
#include <emscripten/val.h> #include <emscripten/val.h>
@@ -15,9 +16,9 @@ struct City {
}; };
struct State{ struct State{
double** weights; float** weights;
int** adjacencyMatrix; uint8_t** adjacencyMatrix;
double lowerBound; float lowerBound;
bool finished = false; bool finished = false;
std::vector<std::pair<int, int>> paths; std::vector<std::pair<int, int>> paths;
}; };
@@ -29,7 +30,7 @@ struct SplitState {
}; };
double reduceWeights(double** weights, int numberOfCities) { double reduceWeights(float** weights, int numberOfCities) {
double totalReduced = 0; double totalReduced = 0;
for (int row = 0; row < numberOfCities; row++) { for (int row = 0; row < numberOfCities; row++) {
@@ -73,7 +74,7 @@ double reduceWeights(double** weights, int numberOfCities) {
return totalReduced; return totalReduced;
} }
std::pair<int, int> findPivotPoint(double** weights, int numberOfCities) { std::pair<int, int> findPivotPoint(float** weights, int numberOfCities) {
int bestRow = -1; int bestRow = -1;
int bestColumn = -1; int bestColumn = -1;
double bestIncrease = -1; double bestIncrease = -1;
@@ -120,7 +121,7 @@ std::pair<int, int> findPivotPoint(double** weights, int numberOfCities) {
return std::pair<int, int>(bestRow, bestColumn); return std::pair<int, int>(bestRow, bestColumn);
} }
int getDegreeOfNode(int nodeNumber, int** adjacencyMatrix, int numberOfCities) { int getDegreeOfNode(int nodeNumber, uint8_t** adjacencyMatrix, int numberOfCities) {
int degree = 0; int degree = 0;
for (int column = 0; column < numberOfCities; column++) { for (int column = 0; column < numberOfCities; column++) {
degree += adjacencyMatrix[nodeNumber][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) { State createNewStateOnPivot(int pivotRow, int pivotColumn, State originalState, int numberOfCities) {
int** adjacencyMatrixCopy = new int*[numberOfCities]; uint8_t** adjacencyMatrixCopy = new uint8_t*[numberOfCities];
double** weightsCopy = new double*[numberOfCities]; float** weightsCopy = new float*[numberOfCities];
for (int row = 0; row < numberOfCities; row++) { for (int row = 0; row < numberOfCities; row++) {
adjacencyMatrixCopy[row] = new int[numberOfCities]; adjacencyMatrixCopy[row] = new uint8_t[numberOfCities];
weightsCopy[row] = new double[numberOfCities]; weightsCopy[row] = new float[numberOfCities];
for (int column = 0; column < numberOfCities; column++) { for (int column = 0; column < numberOfCities; column++) {
adjacencyMatrixCopy[row][column] = originalState.adjacencyMatrix[row][column]; adjacencyMatrixCopy[row][column] = originalState.adjacencyMatrix[row][column];
weightsCopy[row][column] = originalState.weights[row][column]; weightsCopy[row][column] = originalState.weights[row][column];
@@ -285,7 +286,7 @@ SplitState splitState(State state, int numberOfCities) {
return splitState; return splitState;
} }
double getActualWeight(int** adjacencyMatrix, double** weights, int numberOfCities) { double getActualWeight(uint8_t** adjacencyMatrix, double** weights, int numberOfCities) {
double totalWeight = 0; double totalWeight = 0;
for (int row = 0; row < numberOfCities; row++) { for (int row = 0; row < numberOfCities; row++) {
for (int column = 0; column < numberOfCities; column++) { for (int column = 0; column < numberOfCities; column++) {
@@ -321,11 +322,11 @@ std::vector<int> findShortestPath(std::vector<std::vector<double>> jsWeights) {
// Create a state // Create a state
State initialState; State initialState;
initialState.weights = new double*[numberOfCities]; initialState.weights = new float*[numberOfCities];
initialState.adjacencyMatrix = new int*[numberOfCities]; initialState.adjacencyMatrix = new uint8_t*[numberOfCities];
for (int row = 0; row < numberOfCities; row++) { for (int row = 0; row < numberOfCities; row++) {
initialState.weights[row] = new double[numberOfCities]; initialState.weights[row] = new float[numberOfCities];
initialState.adjacencyMatrix[row] = new int[numberOfCities]; initialState.adjacencyMatrix[row] = new uint8_t[numberOfCities];
for (int column = 0; column < numberOfCities; column++) { for (int column = 0; column < numberOfCities; column++) {
initialState.adjacencyMatrix[row][column] = 0; initialState.adjacencyMatrix[row][column] = 0;
initialState.weights[row][column] = weights[row][column]; initialState.weights[row][column] = weights[row][column];
@@ -337,7 +338,7 @@ std::vector<int> findShortestPath(std::vector<std::vector<double>> jsWeights) {
queue.push(initialState); queue.push(initialState);
double currentBest = 1e100; double currentBest = 1e100;
int** bestAdjacenyMatrix = NULL; uint8_t** bestAdjacenyMatrix = NULL;
while (!queue.empty()) { while (!queue.empty()) {
State nextState = queue.top(); State nextState = queue.top();