Use smaller datatypes to avoid overflowing memory
This commit is contained in:
+17
-16
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user