From ee071c062123e91533f35d2b4ca1fc1735bf53ae Mon Sep 17 00:00:00 2001 From: KazushiKawamura Date: Mon, 26 Aug 2019 23:42:16 +0900 Subject: [PATCH] modify python wrapper --- solver_python/Makefile.arm | 14 ++++++ solver_python/param.hpp | 2 +- solver_python/py_wrapper.cpp | 85 +++++++++++++++++++++++++++++++++--- solver_python/solver.cpp | 64 ++++++++++++++++----------- solver_python/solver.hpp | 9 ++-- 5 files changed, 138 insertions(+), 36 deletions(-) create mode 100755 solver_python/Makefile.arm diff --git a/solver_python/Makefile.arm b/solver_python/Makefile.arm new file mode 100755 index 0000000..091ac0c --- /dev/null +++ b/solver_python/Makefile.arm @@ -0,0 +1,14 @@ +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) diff --git a/solver_python/param.hpp b/solver_python/param.hpp index 34b29d3..8373074 100644 --- a/solver_python/param.hpp +++ b/solver_python/param.hpp @@ -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 diff --git a/solver_python/py_wrapper.cpp b/solver_python/py_wrapper.cpp index 2e99c5f..83d7267 100644 --- a/solver_python/py_wrapper.cpp +++ b/solver_python/py_wrapper.cpp @@ -1,9 +1,9 @@ /// py_wrapper.cpp /// // #include -#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 #include @@ -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]; @@ -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); } @@ -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); } @@ -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"}, diff --git a/solver_python/solver.cpp b/solver_python/solver.cpp index 9eb718a..732d9b9 100644 --- a/solver_python/solver.cpp +++ b/solver_python/solver.cpp @@ -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 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); @@ -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; @@ -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 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 @@ -77,10 +89,10 @@ float calcPlaceCost(short int line_num, short int line_info[][2][5], pair 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; @@ -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 { @@ -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) { @@ -215,7 +227,7 @@ pair sub_pair(pair x, pair 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) @@ -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; } @@ -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; } } @@ -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; diff --git a/solver_python/solver.hpp b/solver_python/solver.hpp index 692ea9a..9cabc1a 100644 --- a/solver_python/solver.hpp +++ b/solver_python/solver.hpp @@ -1,7 +1,7 @@ #ifndef __SOLVER_HPP__ #define __SOLVER_HPP__ -#include "/usr/include/python3.5m/Python.h" +#include "/usr/include/python3.6m/Python.h" #include #include @@ -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 block_place_global[]); -float calcPlaceCost(short int line_num, short int line_info[][2][5], pair 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 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 add_pair(pair x, pair y); pair sub_pair(pair x, pair y); -- 2.22.0