Loading solver_python/Makefile.arm 0 → 100755 +14 −0 Changes for solver_python/Makefile.arm: 14 added lines, 0 removed lines. Original line number Diff line number Diff line TARGET = sim OBJS = $(CPPS:.cpp=.o) CPPS = main.cpp io.cpp solver.cpp tools.cpp CXX = arm-linux-gnueabihf-g++ CXXFLAGS = -std=c++11 -O3 all: $(TARGET) $(TARGET): $(OBJS) $(CXX) -o $@ $(OBJS) clean: rm *.o rm $(TARGET) solver_python/param.hpp +1 −1 Changes for solver_python/param.hpp: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ #define RI 3 #define BO 4 #define SA_O 1000 #define SA_O 100 #define SA_I 100000 #define TEMP_S 500 #define TEMP_E 0.1 Loading solver_python/py_wrapper.cpp +80 −5 Changes for solver_python/py_wrapper.cpp: 80 added lines, 5 removed lines. Original line number Diff line number Diff line /// py_wrapper.cpp /// // #include <Python.h> #include "/usr/include/python3.5m/Python.h" #include "/usr/include/python3.5m/numpy/arrayobject.h" #include "/usr/include/python3.5m/numpy/arrayscalars.h" #include "/usr/include/python3.6m/Python.h" #include "/usr/include/python3.6m/numpy/arrayobject.h" #include "/usr/include/python3.6m/numpy/arrayscalars.h" #include <iostream> #include <fstream> Loading Loading @@ -199,6 +199,80 @@ static PyObject* check_problem_wrapper(PyObject* self, PyObject* args) { return dict; } static PyObject* placer_wrapper(PyObject* self, PyObject* args) { uint32_t seed[3]; short int W, H, blocks, line_num; short int block_info[MAX_BLOCKS+1][5][3]; short int line_info[MAX_LINES+1][2][5]; PyObject* a_seed; PyObject* a_block_info; PyObject* a_line_info; // PyObject (ndarray, short int, short int, short int, short int, ndarray, ndarray) if(!PyArg_ParseTuple(args, "O!hhhhO!O!", &PyArray_Type, &a_seed, &W, &H, &blocks, &line_num, &PyArray_Type, &a_block_info, &PyArray_Type, &a_line_info)) { return NULL; } seed[0] = *(uint32_t*)PyArray_GETPTR1(a_seed, 0); seed[1] = *(uint32_t*)PyArray_GETPTR1(a_seed, 1); seed[2] = *(uint32_t*)PyArray_GETPTR1(a_seed, 2); for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { for(npy_intp j = 0; j < 5; j++) { for(npy_intp k = 0; k < 3; k++) { block_info[i][j][k] = *(short int*)PyArray_GETPTR3(a_block_info, i, j, k); } } } for(npy_intp i = 0; i < MAX_LINES+1; i++) { for(npy_intp j = 0; j < 2; j++) { for(npy_intp k = 0; k < 5; k++) { line_info[i][j][k] = *(short int*)PyArray_GETPTR3(a_line_info, i, j, k); } } } // block positions on slot matrix short int block_place_global[MAX_BLOCKS+1][2]; placer(seed, W, H, blocks, line_num, block_info, line_info, block_place_global); // create dictionary PyObject* dict = PyDict_New(); // seed // PyObject* seed_key = PyUnicode_FromString("seed"); *(uint32_t*)PyArray_GETPTR1(a_seed, 0) = seed[0]; *(uint32_t*)PyArray_GETPTR1(a_seed, 1) = seed[1]; *(uint32_t*)PyArray_GETPTR1(a_seed, 2) = seed[2]; PyDict_SetItem(dict, seed_key, a_seed); // block_info // PyObject* block_place_key = PyUnicode_FromString("block_place"); int ndim = 2; npy_intp *s = (npy_intp*)malloc(ndim * sizeof(npy_intp)); s[0] = MAX_BLOCKS+1; s[1] = 2; PyObject* block_place_list = PyArray_SimpleNew(ndim, s, NPY_INT16); // ndarray free(s); for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { *(short int*)PyArray_GETPTR2(block_place_list, i, 0) = block_place_global[i][0]; *(short int*)PyArray_GETPTR2(block_place_list, i, 1) = block_place_global[i][1]; } PyDict_SetItem(dict, block_place_key, block_place_list); // PyObject (dictionary) return dict; } static PyObject* solver_wrapper(PyObject* self, PyObject* args) { uint32_t seed[3]; Loading Loading @@ -329,7 +403,7 @@ static PyObject* show_result_wrapper(PyObject* self, PyObject* args) { } } } for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { for(npy_intp i = 0; i < MAX_CELLS; i++) { opt_result[i] = *(short int*)PyArray_GETPTR1(a_opt_result, i); } Loading Loading @@ -366,7 +440,7 @@ static PyObject* output_to_file_wrapper(PyObject* self, PyObject* args) { } } } for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { for(npy_intp i = 0; i < MAX_CELLS; i++) { opt_result[i] = *(short int*)PyArray_GETPTR1(a_opt_result, i); } Loading @@ -385,6 +459,7 @@ static PyMethodDef mySolverMethods[] = { {"test_func", test_func_wrapper, METH_VARARGS, "test function"}, {"seed_generator", seed_generator_wrapper, METH_VARARGS, "generate seed values"}, {"check_problem", check_problem_wrapper, METH_VARARGS, "read problem"}, {"placer", placer_wrapper, METH_VARARGS, "placer"}, {"solver", solver_wrapper, METH_VARARGS, "solver"}, {"show_result", show_result_wrapper, METH_VARARGS, "show result"}, {"output_to_file", output_to_file_wrapper, METH_VARARGS, "output result to file"}, Loading solver_python/solver.cpp +38 −26 Changes for solver_python/solver.cpp: 38 added lines, 26 removed lines. Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ int solver(uint32_t seed[3], short int W, short int H, short int blocks, short i lfsr_random_init(seed[0], seed[1], seed[2]); // block positions on slot matrix pair<short int,short int> block_place_global[MAX_BLOCKS+1]; short int block_place_global[MAX_BLOCKS+1][2]; while(1) { global_placement(W, H, line_num, blocks, block_info, line_info, block_place_global); Loading @@ -19,6 +19,18 @@ int solver(uint32_t seed[3], short int W, short int H, short int blocks, short i return 0; } int placer(uint32_t seed[3], short int W, short int H, short int blocks, short int line_num, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]) { lfsr_random_init(seed[0], seed[1], seed[2]); global_placement(W, H, line_num, blocks, block_info, line_info, block_place_global); seed[0] = lfsr; seed[1] = lfsr_x; seed[2] = lfsr_y; return 0; } void lfsr_random_init(uint32_t seed, uint32_t seed_x, uint32_t seed_y) { lfsr = seed; lfsr_x = seed_x; Loading Loading @@ -59,7 +71,7 @@ uint32_t lfsr_y_random() { return lfsr_y; } float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short int,short int> block_place_global[]) { float calcPlaceCost(short int line_num, short int line_info[][2][5], short int block_place_global[][2]) { short int block1, block2; // block idx short int x1, y1; // 1st block Loading @@ -77,10 +89,10 @@ float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short for(int l = 1; l <= line_num; l++) { // Calc cost block1 = line_info[l][0][0]; // 1st block including line#L block2 = line_info[l][1][0]; // 2nd block including line#L x1 = block_place_global[block1].first; y1 = block_place_global[block1].second; x2 = block_place_global[block2].first; y2 = block_place_global[block2].second; x1 = block_place_global[block1][0]; y1 = block_place_global[block1][1]; x2 = block_place_global[block2][0]; y2 = block_place_global[block2][1]; delta_x = x1 - x2; delta_y = y1 - y2; dist_x = abs(delta_x); Loading Loading @@ -112,7 +124,7 @@ float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short return cost; } void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], pair<short int,short int> block_place_global[]) { void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]) { cout << "== Global placement ==" << endl; short int sx_sum = 0, sy_sum = 0; Loading @@ -136,9 +148,9 @@ void global_placement(short int W, short int H, short int line_num, short int bl for(short int q = 0; q <= max_y; q++) { for(short int p = 0; p <= max_x; p++) { if(i <= blocks) { block_place_global[i] = make_pair(p, q); block_place_global[i][0] = p; block_place_global[i][1] = q; global_slot[q][p] = i; //cout << "Block#" << i << ": (" << block_place_global[i].first << ", " << block_place_global[i].second << ")" << endl; i++; } else { Loading @@ -164,28 +176,28 @@ void global_placement(short int W, short int H, short int line_num, short int bl // i_x, i_y, j_x, j_y for(int counter_in = 0; counter_in < SA_I; counter_in++) { short int trgt_i = lfsr_random() % blocks + 1; short int i_x = block_place_global[trgt_i].first; short int i_y = block_place_global[trgt_i].second; short int i_x = block_place_global[trgt_i][0]; short int i_y = block_place_global[trgt_i][1]; short int j_x = lfsr_x_random() % SLOT_MAX_SIZE; short int j_y = lfsr_y_random() % SLOT_MAX_SIZE; if(j_x > max_x || j_y > max_y) continue; short int trgt_j = global_slot[j_y][j_x]; // slot -> block block_place_global[trgt_i].first = j_x; block_place_global[trgt_i].second = j_y; block_place_global[trgt_i][0] = j_x; block_place_global[trgt_i][1] = j_y; global_slot[j_y][j_x] = trgt_i; block_place_global[trgt_j].first = i_x; block_place_global[trgt_j].second = i_y; block_place_global[trgt_j][0] = i_x; block_place_global[trgt_j][1] = i_y; global_slot[i_y][i_x] = trgt_j; float new_cost = calcPlaceCost(line_num, line_info, block_place_global); if(new_cost > cost && (float)lfsr_random()/LFSR_RAND_MAX > expf(-(new_cost-cost)/temperature)) { block_place_global[trgt_i].first = i_x; block_place_global[trgt_i].second = i_y; block_place_global[trgt_i][0] = i_x; block_place_global[trgt_i][1] = i_y; global_slot[i_y][i_x] = trgt_i; block_place_global[trgt_j].first = j_x; block_place_global[trgt_j].second = j_y; block_place_global[trgt_j][0] = j_x; block_place_global[trgt_j][1] = j_y; global_slot[j_y][j_x] = trgt_j; } else if(new_cost != cost) { Loading Loading @@ -215,7 +227,7 @@ pair<short int,short int> sub_pair(pair<short int,short int> x, pair<short int,s return make_pair(x.first-y.first, x.second-y.second); } bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], pair<short int,short int> block_place_global[], short int opt_result[]) { bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], short int block_place_global[][2], short int opt_result[]) { short int wi, hi; // board size (w, h) Loading @@ -234,8 +246,8 @@ bool local_placement_with_routing_1(short int line_num, short int blocks, short // load a placement result short int min_x = SLOT_MAX_SIZE, min_y = SLOT_MAX_SIZE, max_x = 0, max_y = 0; for(int i = 1; i <= blocks; i++) { short int p = block_place_global[i].first; short int q = block_place_global[i].second; short int p = block_place_global[i][0]; short int q = block_place_global[i][1]; if(p < min_x) { min_x = p; } if(q < min_y) { min_y = q; } if(p > max_x) { max_x = p; } Loading @@ -250,8 +262,8 @@ bool local_placement_with_routing_1(short int line_num, short int blocks, short for(int i = 1; i <= blocks; i++) { short int sx = block_info[i][0][0]; short int sy = block_info[i][0][1]; short int p = block_place_global[i].first; short int q = block_place_global[i].second; short int p = block_place_global[i][0]; short int q = block_place_global[i][1]; if(sx > slot_w[p]) { slot_w[p] = sx; } if(sy > slot_h[q]) { slot_h[q] = sy; } } Loading @@ -273,8 +285,8 @@ bool local_placement_with_routing_1(short int line_num, short int blocks, short for(int i = 1; i <= blocks; i++) { short int sx = block_info[i][0][0]; short int sy = block_info[i][0][1]; short int p = block_place_global[i].first; short int q = block_place_global[i].second; short int p = block_place_global[i][0]; short int q = block_place_global[i][1]; block_place_basis[i] = make_pair(slot_w_t[p], slot_h_t[q]); block_place_slack[i][0] = slot_w[p] - sx; block_place_slack[i][1] = slot_h[q] - sy; Loading solver_python/solver.hpp +5 −4 Changes for solver_python/solver.hpp: 5 added lines, 4 removed lines. Original line number Diff line number Diff line #ifndef __SOLVER_HPP__ #define __SOLVER_HPP__ #include "/usr/include/python3.5m/Python.h" #include "/usr/include/python3.6m/Python.h" #include <iostream> #include <math.h> Loading @@ -12,15 +12,16 @@ using namespace std; int solver(uint32_t seed[3], short int W, short int H, short int blocks, short int line_num, short int block_info[][5][3], short int line_info[][2][5], short int *pwi, short int *phi, short int opt_result[]); int placer(uint32_t seed[3], short int W, short int H, short int blocks, short int line_num, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]); void lfsr_random_init(uint32_t seed, uint32_t seed_x, uint32_t seed_y); uint32_t lfsr_random(); uint32_t lfsr_x_random(); uint32_t lfsr_y_random(); void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], pair<short int,short int> block_place_global[]); float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short int,short int> block_place_global[]); bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], pair<short int,short int> block_place_global[], short int opt_result[]); void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]); float calcPlaceCost(short int line_num, short int line_info[][2][5], short int block_place_global[][2]); bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], short int block_place_global[][2], short int opt_result[]); bool local_placement_with_routing_2(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], short int opt_result[]); pair<short int,short int> add_pair(pair<short int,short int> x, pair<short int,short int> y); pair<short int,short int> sub_pair(pair<short int,short int> x, pair<short int,short int> y); Loading Loading
solver_python/Makefile.arm 0 → 100755 +14 −0 Changes for solver_python/Makefile.arm: 14 added lines, 0 removed lines. Original line number Diff line number Diff line TARGET = sim OBJS = $(CPPS:.cpp=.o) CPPS = main.cpp io.cpp solver.cpp tools.cpp CXX = arm-linux-gnueabihf-g++ CXXFLAGS = -std=c++11 -O3 all: $(TARGET) $(TARGET): $(OBJS) $(CXX) -o $@ $(OBJS) clean: rm *.o rm $(TARGET)
solver_python/param.hpp +1 −1 Changes for solver_python/param.hpp: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ #define RI 3 #define BO 4 #define SA_O 1000 #define SA_O 100 #define SA_I 100000 #define TEMP_S 500 #define TEMP_E 0.1 Loading
solver_python/py_wrapper.cpp +80 −5 Changes for solver_python/py_wrapper.cpp: 80 added lines, 5 removed lines. Original line number Diff line number Diff line /// py_wrapper.cpp /// // #include <Python.h> #include "/usr/include/python3.5m/Python.h" #include "/usr/include/python3.5m/numpy/arrayobject.h" #include "/usr/include/python3.5m/numpy/arrayscalars.h" #include "/usr/include/python3.6m/Python.h" #include "/usr/include/python3.6m/numpy/arrayobject.h" #include "/usr/include/python3.6m/numpy/arrayscalars.h" #include <iostream> #include <fstream> Loading Loading @@ -199,6 +199,80 @@ static PyObject* check_problem_wrapper(PyObject* self, PyObject* args) { return dict; } static PyObject* placer_wrapper(PyObject* self, PyObject* args) { uint32_t seed[3]; short int W, H, blocks, line_num; short int block_info[MAX_BLOCKS+1][5][3]; short int line_info[MAX_LINES+1][2][5]; PyObject* a_seed; PyObject* a_block_info; PyObject* a_line_info; // PyObject (ndarray, short int, short int, short int, short int, ndarray, ndarray) if(!PyArg_ParseTuple(args, "O!hhhhO!O!", &PyArray_Type, &a_seed, &W, &H, &blocks, &line_num, &PyArray_Type, &a_block_info, &PyArray_Type, &a_line_info)) { return NULL; } seed[0] = *(uint32_t*)PyArray_GETPTR1(a_seed, 0); seed[1] = *(uint32_t*)PyArray_GETPTR1(a_seed, 1); seed[2] = *(uint32_t*)PyArray_GETPTR1(a_seed, 2); for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { for(npy_intp j = 0; j < 5; j++) { for(npy_intp k = 0; k < 3; k++) { block_info[i][j][k] = *(short int*)PyArray_GETPTR3(a_block_info, i, j, k); } } } for(npy_intp i = 0; i < MAX_LINES+1; i++) { for(npy_intp j = 0; j < 2; j++) { for(npy_intp k = 0; k < 5; k++) { line_info[i][j][k] = *(short int*)PyArray_GETPTR3(a_line_info, i, j, k); } } } // block positions on slot matrix short int block_place_global[MAX_BLOCKS+1][2]; placer(seed, W, H, blocks, line_num, block_info, line_info, block_place_global); // create dictionary PyObject* dict = PyDict_New(); // seed // PyObject* seed_key = PyUnicode_FromString("seed"); *(uint32_t*)PyArray_GETPTR1(a_seed, 0) = seed[0]; *(uint32_t*)PyArray_GETPTR1(a_seed, 1) = seed[1]; *(uint32_t*)PyArray_GETPTR1(a_seed, 2) = seed[2]; PyDict_SetItem(dict, seed_key, a_seed); // block_info // PyObject* block_place_key = PyUnicode_FromString("block_place"); int ndim = 2; npy_intp *s = (npy_intp*)malloc(ndim * sizeof(npy_intp)); s[0] = MAX_BLOCKS+1; s[1] = 2; PyObject* block_place_list = PyArray_SimpleNew(ndim, s, NPY_INT16); // ndarray free(s); for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { *(short int*)PyArray_GETPTR2(block_place_list, i, 0) = block_place_global[i][0]; *(short int*)PyArray_GETPTR2(block_place_list, i, 1) = block_place_global[i][1]; } PyDict_SetItem(dict, block_place_key, block_place_list); // PyObject (dictionary) return dict; } static PyObject* solver_wrapper(PyObject* self, PyObject* args) { uint32_t seed[3]; Loading Loading @@ -329,7 +403,7 @@ static PyObject* show_result_wrapper(PyObject* self, PyObject* args) { } } } for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { for(npy_intp i = 0; i < MAX_CELLS; i++) { opt_result[i] = *(short int*)PyArray_GETPTR1(a_opt_result, i); } Loading Loading @@ -366,7 +440,7 @@ static PyObject* output_to_file_wrapper(PyObject* self, PyObject* args) { } } } for(npy_intp i = 0; i < MAX_BLOCKS+1; i++) { for(npy_intp i = 0; i < MAX_CELLS; i++) { opt_result[i] = *(short int*)PyArray_GETPTR1(a_opt_result, i); } Loading @@ -385,6 +459,7 @@ static PyMethodDef mySolverMethods[] = { {"test_func", test_func_wrapper, METH_VARARGS, "test function"}, {"seed_generator", seed_generator_wrapper, METH_VARARGS, "generate seed values"}, {"check_problem", check_problem_wrapper, METH_VARARGS, "read problem"}, {"placer", placer_wrapper, METH_VARARGS, "placer"}, {"solver", solver_wrapper, METH_VARARGS, "solver"}, {"show_result", show_result_wrapper, METH_VARARGS, "show result"}, {"output_to_file", output_to_file_wrapper, METH_VARARGS, "output result to file"}, Loading
solver_python/solver.cpp +38 −26 Changes for solver_python/solver.cpp: 38 added lines, 26 removed lines. Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ int solver(uint32_t seed[3], short int W, short int H, short int blocks, short i lfsr_random_init(seed[0], seed[1], seed[2]); // block positions on slot matrix pair<short int,short int> block_place_global[MAX_BLOCKS+1]; short int block_place_global[MAX_BLOCKS+1][2]; while(1) { global_placement(W, H, line_num, blocks, block_info, line_info, block_place_global); Loading @@ -19,6 +19,18 @@ int solver(uint32_t seed[3], short int W, short int H, short int blocks, short i return 0; } int placer(uint32_t seed[3], short int W, short int H, short int blocks, short int line_num, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]) { lfsr_random_init(seed[0], seed[1], seed[2]); global_placement(W, H, line_num, blocks, block_info, line_info, block_place_global); seed[0] = lfsr; seed[1] = lfsr_x; seed[2] = lfsr_y; return 0; } void lfsr_random_init(uint32_t seed, uint32_t seed_x, uint32_t seed_y) { lfsr = seed; lfsr_x = seed_x; Loading Loading @@ -59,7 +71,7 @@ uint32_t lfsr_y_random() { return lfsr_y; } float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short int,short int> block_place_global[]) { float calcPlaceCost(short int line_num, short int line_info[][2][5], short int block_place_global[][2]) { short int block1, block2; // block idx short int x1, y1; // 1st block Loading @@ -77,10 +89,10 @@ float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short for(int l = 1; l <= line_num; l++) { // Calc cost block1 = line_info[l][0][0]; // 1st block including line#L block2 = line_info[l][1][0]; // 2nd block including line#L x1 = block_place_global[block1].first; y1 = block_place_global[block1].second; x2 = block_place_global[block2].first; y2 = block_place_global[block2].second; x1 = block_place_global[block1][0]; y1 = block_place_global[block1][1]; x2 = block_place_global[block2][0]; y2 = block_place_global[block2][1]; delta_x = x1 - x2; delta_y = y1 - y2; dist_x = abs(delta_x); Loading Loading @@ -112,7 +124,7 @@ float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short return cost; } void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], pair<short int,short int> block_place_global[]) { void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]) { cout << "== Global placement ==" << endl; short int sx_sum = 0, sy_sum = 0; Loading @@ -136,9 +148,9 @@ void global_placement(short int W, short int H, short int line_num, short int bl for(short int q = 0; q <= max_y; q++) { for(short int p = 0; p <= max_x; p++) { if(i <= blocks) { block_place_global[i] = make_pair(p, q); block_place_global[i][0] = p; block_place_global[i][1] = q; global_slot[q][p] = i; //cout << "Block#" << i << ": (" << block_place_global[i].first << ", " << block_place_global[i].second << ")" << endl; i++; } else { Loading @@ -164,28 +176,28 @@ void global_placement(short int W, short int H, short int line_num, short int bl // i_x, i_y, j_x, j_y for(int counter_in = 0; counter_in < SA_I; counter_in++) { short int trgt_i = lfsr_random() % blocks + 1; short int i_x = block_place_global[trgt_i].first; short int i_y = block_place_global[trgt_i].second; short int i_x = block_place_global[trgt_i][0]; short int i_y = block_place_global[trgt_i][1]; short int j_x = lfsr_x_random() % SLOT_MAX_SIZE; short int j_y = lfsr_y_random() % SLOT_MAX_SIZE; if(j_x > max_x || j_y > max_y) continue; short int trgt_j = global_slot[j_y][j_x]; // slot -> block block_place_global[trgt_i].first = j_x; block_place_global[trgt_i].second = j_y; block_place_global[trgt_i][0] = j_x; block_place_global[trgt_i][1] = j_y; global_slot[j_y][j_x] = trgt_i; block_place_global[trgt_j].first = i_x; block_place_global[trgt_j].second = i_y; block_place_global[trgt_j][0] = i_x; block_place_global[trgt_j][1] = i_y; global_slot[i_y][i_x] = trgt_j; float new_cost = calcPlaceCost(line_num, line_info, block_place_global); if(new_cost > cost && (float)lfsr_random()/LFSR_RAND_MAX > expf(-(new_cost-cost)/temperature)) { block_place_global[trgt_i].first = i_x; block_place_global[trgt_i].second = i_y; block_place_global[trgt_i][0] = i_x; block_place_global[trgt_i][1] = i_y; global_slot[i_y][i_x] = trgt_i; block_place_global[trgt_j].first = j_x; block_place_global[trgt_j].second = j_y; block_place_global[trgt_j][0] = j_x; block_place_global[trgt_j][1] = j_y; global_slot[j_y][j_x] = trgt_j; } else if(new_cost != cost) { Loading Loading @@ -215,7 +227,7 @@ pair<short int,short int> sub_pair(pair<short int,short int> x, pair<short int,s return make_pair(x.first-y.first, x.second-y.second); } bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], pair<short int,short int> block_place_global[], short int opt_result[]) { bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], short int block_place_global[][2], short int opt_result[]) { short int wi, hi; // board size (w, h) Loading @@ -234,8 +246,8 @@ bool local_placement_with_routing_1(short int line_num, short int blocks, short // load a placement result short int min_x = SLOT_MAX_SIZE, min_y = SLOT_MAX_SIZE, max_x = 0, max_y = 0; for(int i = 1; i <= blocks; i++) { short int p = block_place_global[i].first; short int q = block_place_global[i].second; short int p = block_place_global[i][0]; short int q = block_place_global[i][1]; if(p < min_x) { min_x = p; } if(q < min_y) { min_y = q; } if(p > max_x) { max_x = p; } Loading @@ -250,8 +262,8 @@ bool local_placement_with_routing_1(short int line_num, short int blocks, short for(int i = 1; i <= blocks; i++) { short int sx = block_info[i][0][0]; short int sy = block_info[i][0][1]; short int p = block_place_global[i].first; short int q = block_place_global[i].second; short int p = block_place_global[i][0]; short int q = block_place_global[i][1]; if(sx > slot_w[p]) { slot_w[p] = sx; } if(sy > slot_h[q]) { slot_h[q] = sy; } } Loading @@ -273,8 +285,8 @@ bool local_placement_with_routing_1(short int line_num, short int blocks, short for(int i = 1; i <= blocks; i++) { short int sx = block_info[i][0][0]; short int sy = block_info[i][0][1]; short int p = block_place_global[i].first; short int q = block_place_global[i].second; short int p = block_place_global[i][0]; short int q = block_place_global[i][1]; block_place_basis[i] = make_pair(slot_w_t[p], slot_h_t[q]); block_place_slack[i][0] = slot_w[p] - sx; block_place_slack[i][1] = slot_h[q] - sy; Loading
solver_python/solver.hpp +5 −4 Changes for solver_python/solver.hpp: 5 added lines, 4 removed lines. Original line number Diff line number Diff line #ifndef __SOLVER_HPP__ #define __SOLVER_HPP__ #include "/usr/include/python3.5m/Python.h" #include "/usr/include/python3.6m/Python.h" #include <iostream> #include <math.h> Loading @@ -12,15 +12,16 @@ using namespace std; int solver(uint32_t seed[3], short int W, short int H, short int blocks, short int line_num, short int block_info[][5][3], short int line_info[][2][5], short int *pwi, short int *phi, short int opt_result[]); int placer(uint32_t seed[3], short int W, short int H, short int blocks, short int line_num, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]); void lfsr_random_init(uint32_t seed, uint32_t seed_x, uint32_t seed_y); uint32_t lfsr_random(); uint32_t lfsr_x_random(); uint32_t lfsr_y_random(); void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], pair<short int,short int> block_place_global[]); float calcPlaceCost(short int line_num, short int line_info[][2][5], pair<short int,short int> block_place_global[]); bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], pair<short int,short int> block_place_global[], short int opt_result[]); void global_placement(short int W, short int H, short int line_num, short int blocks, short int block_info[][5][3], short int line_info[][2][5], short int block_place_global[][2]); float calcPlaceCost(short int line_num, short int line_info[][2][5], short int block_place_global[][2]); bool local_placement_with_routing_1(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], short int block_place_global[][2], short int opt_result[]); bool local_placement_with_routing_2(short int line_num, short int blocks, short int *pwi, short int *phi, short int block_info[][5][3], short int opt_result[]); pair<short int,short int> add_pair(pair<short int,short int> x, pair<short int,short int> y); pair<short int,short int> sub_pair(pair<short int,short int> x, pair<short int,short int> y); Loading