diff --git a/mysite/plots/avl_tree.py b/mysite/plots/avl_tree.py index 6ff57d8c03bd9fdc8328c16757393673d7bd42fb..2ba973bdf9600d3ad154ab404b7f7c9c93ca58f3 100644 --- a/mysite/plots/avl_tree.py +++ b/mysite/plots/avl_tree.py @@ -164,6 +164,7 @@ class AVLTree(object): self.preOrder(root.right) def preOrder_array(self, root, array, key): + # array is an accumulator if not root: return # print("{0} ".format(root.key), end="") diff --git a/mysite/plots/dataset_creator.py b/mysite/plots/dataset_creator.py index 5ccbd19a3f7b9137e3fec0ca0f7e17af1db2d1ae..0f66237495651d5667f639795daf8e4bc6a6b50d 100644 --- a/mysite/plots/dataset_creator.py +++ b/mysite/plots/dataset_creator.py @@ -1,83 +1,97 @@ -# import pandas as pd -# from .packing_algo import ConvexPolygon, pack_polygons, truncate, RectangularContainer, plot_containers, ConvexContainer -# from .polygon_creator import voronoi_polygons_wrapper, rectangle_cutter -# -# -# # def build_aprox_factors(): -# -# -# def build_dataset_with_rectangle_cutter(rect_width: float, rect_height, repetition, angle_steps=90, cut_min=1, -# cut_max=1, cut_steps=1, intervals=[0, 0.01, 0.05, 1], weights=[0, 0, 0.5, 1]): -# if cut_min > cut_max: -# cut_max = cut_min -# data_dict_list = [] -# for cut_count in range(cut_min, cut_max + cut_steps, cut_steps): -# cutted_polygons_lists = [] -# for n in range(0, repetition): -# cutted_polygons = rectangle_cutter(rect_width, rect_height, cut_count, intervals=intervals, weights=weights) -# cutted_polygons_lists.append(cutted_polygons) -# dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps) -# data_dict_list.append(dict_data) -# return data_dict_list -# -# -# def build_dataset_with_voronoi(rect_width, rect_height, repetition, cut_min=5, cut_max=5, cut_steps=1, angle_steps=90): -# if cut_min > cut_max: -# cut_max = cut_min -# data_dict_list = [] -# for cut_count in range(cut_min, cut_max + cut_steps, cut_steps): -# cutted_polygons_lists = [] -# for n in range(0, repetition): -# cutted_polygons = voronoi_polygons_wrapper(rect_width, rect_height, cut_count) -# cutted_polygons_lists.append(cutted_polygons) -# dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps) -# data_dict_list.append(dict_data) -# return data_dict_list -# -# -# def collect_rect_containers_data(rect_width: float, rect_height: float, cutted_polygons_lists: [[ConvexPolygon]], -# angle_steps=90) -> {str, list}: -# opt_area = rect_width * rect_height -# opt_area_list = [] -# area_list = [] -# area_div_list = [] -# angle_0_area_div_list = [] -# angle_0_not_clipped_area_div_list = [] -# not_clipped_area_list = [] -# not_clipped_area_div_list = [] -# polygon_count_list = [] -# end_container_list = [] -# mini_container_count_list = [] -# for polygons in cutted_polygons_lists: -# cc = ConvexContainer(polygons, steps=angle_steps) -# end_container = cc.smallest_end_container -# end_container_angle_0 = cc.angle_0_end_container -# -# c_area = end_container.container_area -# c_not_opt_area = end_container.container_not_clipped_area -# c_not_r_area = end_container_angle_0.container_area -# c_not_r_not_opt_area = end_container_angle_0.container_not_clipped_area -# area_list.append(truncate(c_area, 1)) -# area_div_list.append(truncate(c_area / opt_area, 1)) -# not_clipped_area_list.append(truncate(c_not_opt_area, 1)) -# not_clipped_area_div_list.append(truncate(c_not_opt_area / opt_area, 1)) -# -# angle_0_area_div_list.append(truncate(c_not_r_area / opt_area, 1)) -# angle_0_not_clipped_area_div_list.append(truncate(c_not_r_not_opt_area / opt_area, 1)) -# opt_area_list.append(opt_area) -# polygon_count_list.append(len(polygons)) -# mini_container_count_list.append(len(end_container.mini_containers)) -# end_container_list.append(cc) -# rect_containers_data_dict = {'area': area_list, 'area/opt_area': area_div_list, -# 'not_clipped_area': not_clipped_area_list, -# 'not_clipped_area/opt_area': not_clipped_area_div_list, -# 'angle_0_area/opt_area': angle_0_area_div_list, -# 'angle_0_not_clipped_area/opt_area': angle_0_not_clipped_area_div_list, -# 'opt-area': opt_area_list, 'polygon count': polygon_count_list, -# 'mini-container count': mini_container_count_list, 'Rectangular-Container': end_container_list} -# return rect_containers_data_dict -# -# +import pandas as pd + +from plots.packing_algo import ConvexPolygon, pack_polygons, truncate, RectangularContainer, ConvexContainer +from plots.polygon_creator import voronoi_polygons_wrapper, rectangle_cutter + + +# def build_aprox_factors(): + + +def build_dataset_with_rectangle_cutter(rect_width: float, rect_height, repetition, cut_list=[], angle_steps=90, cut_min=1, + cut_max=1, cut_steps=1, intervals=[0, 0.01, 0.05, 1], weights=[0, 0, 0.5, 1],save_container=True): + cut_numbers=[] + data_dict_list = [] + if cut_list: + cut_numbers= cut_list + else: + if cut_min > cut_max: + cut_max = cut_min + for cut_number in range(cut_min, cut_max + 1, cut_steps): + cut_numbers.append(cut_number) + for cut_count in cut_numbers: + cutted_polygons_lists = [] + for n in range(0, repetition): + cutted_polygons = rectangle_cutter(rect_width, rect_height, cut_count, intervals=intervals, weights=weights) + cutted_polygons_lists.append(cutted_polygons) + dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps,save_container) + data_dict_list.append(dict_data) + return data_dict_list + + +def build_dataset_with_voronoi(rect_width, rect_height, repetition, cut_list=[], cut_min=5, cut_max=5, cut_steps=1, angle_steps=90, save_container=True): + cut_numbers=[] + data_dict_list = [] + if cut_list: + cut_numbers = cut_list + else: + if cut_min > cut_max: + cut_max = cut_min + for cut_number in range(cut_min, cut_max + 1, cut_steps): + cut_numbers.append(cut_number) + for cut_count in cut_numbers: + cutted_polygons_lists = [] + for n in range(0, repetition): + cutted_polygons = voronoi_polygons_wrapper(rect_width, rect_height, cut_count) + cutted_polygons_lists.append(cutted_polygons) + dict_data = collect_rect_containers_data(rect_width, rect_height, cutted_polygons_lists, angle_steps,save_container) + data_dict_list.append(dict_data) + return data_dict_list + + +def collect_rect_containers_data(rect_width: float, rect_height: float, cutted_polygons_lists: [[ConvexPolygon]], + angle_steps=90, save_container=True) -> {str, list}: + opt_area = rect_width * rect_height + opt_area_list = [] + area_list = [] + area_div_list = [] + angle_0_area_div_list = [] + angle_0_not_clipped_area_div_list = [] + not_clipped_area_list = [] + not_clipped_area_div_list = [] + polygon_count_list = [] + end_container_list_plots = [] + for polygons in cutted_polygons_lists: + cc = ConvexContainer(polygons, steps=angle_steps) + end_container = cc.smallest_rectangular_container + end_container_angle_0 = cc.angle_0_rectangular_container + + c_area = end_container.container_area + c_not_opt_area = end_container.container_not_clipped_area + c_not_r_area = end_container_angle_0.container_area + c_not_r_not_opt_area = end_container_angle_0.container_not_clipped_area + area_list.append(truncate(c_area, 1)) + area_div_list.append(truncate(c_area / opt_area, 1)) + not_clipped_area_list.append(truncate(c_not_opt_area, 1)) + not_clipped_area_div_list.append(truncate(c_not_opt_area / opt_area, 1)) + + angle_0_area_div_list.append(truncate(c_not_r_area / opt_area, 1)) + angle_0_not_clipped_area_div_list.append(truncate(c_not_r_not_opt_area / opt_area, 1)) + opt_area_list.append(opt_area) + polygon_count_list.append(len(polygons)) + if save_container: + end_container_list_plots.append(cc.plot_container(render=False)) + rect_containers_data_dict = {'area': area_list, 'area/opt_area': area_div_list, + 'not_clipped_area': not_clipped_area_list, + 'not_clipped_area/opt_area': not_clipped_area_div_list, + 'angle_0_area/opt_area': angle_0_area_div_list, + 'angle_0_not_clipped_area/opt_area': angle_0_not_clipped_area_div_list, + 'opt-area': opt_area_list, + 'polygon count': polygon_count_list} + if end_container_list_plots: + rect_containers_data_dict['End-Container']=end_container_list_plots + return rect_containers_data_dict + + # # need to update like rectangle_cutter with deviation # def find_repition_factor_rectangle_voronoi(cut, rep_high, rep_low=1, rep_steps=1, display_flag=True, # intervals=[0, 0.01, 0.05, 1], weights=[0, 0, 0.5, 1]): @@ -128,46 +142,48 @@ # return average_list # average_list.append((rep, average)) # return average_list -# -# -# def dict_list_to_ordered_panda_list(dictionary_list: [dict], ordered_by_area=True) -> [pd.DataFrame]: -# data_frame_list = [] -# for dic in dictionary_list: -# df = pd.DataFrame(dic) -# if ordered_by_area: -# data_frame_list.append(df.sort_values(by="area", ascending=False)) -# else: -# data_frame_list.append(df.sort_values(by="not_clipped_area", ascending=False)) -# return data_frame_list -# -# + + +def dict_list_to_ordered_panda_list(dictionary_list: [dict], ordered_by_area=True) -> [pd.DataFrame]: + data_frame_list = [] + for dic in dictionary_list: + df = pd.DataFrame(dic) + if ordered_by_area: + data_frame_list.append(df.sort_values(by="area", ascending=False)) + else: + data_frame_list.append(df.sort_values(by="not_clipped_area", ascending=False)) + return data_frame_list + + # def display_panda_df_list(df_list: [pd.DataFrame]) -> None: # for df in df_list: # display(df) -# -# -# def build_aprox_values(panda_data): -# mean_opt = 0 -# mean_not_clipped = 0 -# mean_angle_0 = 0 -# mean_angle_0_not_clipped = 0 -# counter = 0 -# mean_best = 0 -# mean_worst = 0 -# for data in panda_data: -# mean_opt += data["area/opt_area"].mean(axis=0) -# mean_best += data["area/opt_area"].iloc[-1] -# mean_worst += data["area/opt_area"].iloc[0] -# mean_not_clipped += data["not_clipped_area/opt_area"].mean(axis=0) -# mean_angle_0 += data["angle_0_area/opt_area"].mean(axis=0) -# mean_angle_0_not_clipped += data["angle_0_not_clipped_area/opt_area"].mean(axis=0) -# counter += 1 -# mean_opt = mean_opt / counter -# mean_best = mean_best / counter -# mean_worst = mean_worst / counter -# mean_not_clipped = mean_not_clipped / counter -# mean_angle_0 = mean_angle_0 / counter -# mean_angle_0_not_clipped = mean_angle_0_not_clipped / counter -# aprox_dict = dict(aprox=mean_opt, aprox_best=mean_best, aprox_worst=mean_worst, aprox_not_clipped=mean_not_clipped, -# aprox_angle_0=mean_angle_0, aprox_angle_0_not_clipped=mean_angle_0_not_clipped) -# return aprox_dict \ No newline at end of file + + +def build_aprox_values(panda_data): + mean_opt = 0 + mean_not_clipped = 0 + mean_angle_0 = 0 + mean_angle_0_not_clipped = 0 + counter = 0 + mean_best = 0 + mean_worst = 0 + for data in panda_data: + mean_opt += data["area/opt_area"].mean(axis=0) + mean_best += data["area/opt_area"].iloc[-1] + mean_worst += data["area/opt_area"].iloc[0] + mean_not_clipped += data["not_clipped_area/opt_area"].mean(axis=0) + mean_angle_0 += data["angle_0_area/opt_area"].mean(axis=0) + mean_angle_0_not_clipped += data["angle_0_not_clipped_area/opt_area"].mean(axis=0) + counter += 1 + mean_opt = mean_opt / counter + mean_best = mean_best / counter + mean_worst = mean_worst / counter + mean_not_clipped = mean_not_clipped / counter + mean_angle_0 = mean_angle_0 / counter + mean_angle_0_not_clipped = mean_angle_0_not_clipped / counter + aprox_dict = dict(aprox=mean_opt, aprox_best=mean_best, aprox_worst=mean_worst, aprox_not_clipped=mean_not_clipped, + aprox_angle_0=mean_angle_0, aprox_angle_0_not_clipped=mean_angle_0_not_clipped) + return aprox_dict + + diff --git a/mysite/plots/packing_algo.py b/mysite/plots/packing_algo.py index 4ae3f8703d31677c183fa0185f40d15ac447d100..33c5136cc7afc454998d5e81c8149246f551b4ef 100644 --- a/mysite/plots/packing_algo.py +++ b/mysite/plots/packing_algo.py @@ -199,7 +199,7 @@ class ConvexPolygon(object): spine_bottom, spine_top (Point_xy, Point_xy): a tuple a the lowest and highest vertex or bottom left and top left """ - y_sorted_p_p = sorted(self.__shell, key=lambda k: k[1]) # ordering the vertices to their y value + y_sorted_p_p = sorted(self.__shell[0:-1], key=lambda k: k[1]) # ordering the vertices to their y values if y_sorted_p_p[0][1] == y_sorted_p_p[1][1]: # if there are two lowest vertices take the left one if y_sorted_p_p[0][0] < y_sorted_p_p[1][0]: spine_bottom = y_sorted_p_p[0] diff --git a/mysite/plots/polygon.txt b/mysite/plots/polygon.txt index 57a6ad0083f1a246c14d564b339e882314a519cc..688a4d0ded902598826d12a23ee236bc4b44c907 100644 --- a/mysite/plots/polygon.txt +++ b/mysite/plots/polygon.txt @@ -1,9 +1,11 @@ Polygon [(686.0, 0.0), (0.0, 41.0), (289.0, 371.0), (686.0, 0.0)] -[(686.0, 0.0), (1101.9999999999995, 905.0), (1291.9999999999995, 62.0), (686.0, 0.0)] -[(1842.7583497053038, 0.0), (1286.7583497053042, 4.0), (1332.7583497053042, 513.0), (2047.7583497053038, 608.0), (2023.7583497053038, 423.0), (1842.7583497053038, 0.0)] -[(316.9999999999998, 905.0), (0.0, 1490.0), (356.9999999999998, 1527.0), (741.9999999999998, 1428.0), (724.9999999999998, 1078.0), (316.9999999999998, 905.0)] -[(586.0, 1527.0), (0.0, 1540.0), (300.0, 1762.0), (586.0, 1527.0)] -[(27.26304579339723, 1762.0), (8.413205537806178, 1763.8987341772151), (0.0, 1788.26582278481), (1.490947816826413, 1799.6582278481012), (7.8807241746538885, 1800.0801687763712), (51.43769968051117, 1795.649789029536), (27.26304579339723, 1762.0)] -[(4.1324156191531145, 1800.0801687763712), (0.0, 1810.483927967384), (13.756594100601824, 1811.809503462764), (13.267229093070533, 1804.739767487404), (4.1324156191531145, 1800.0801687763712)] -[(0.05437388972569579, 1811.809503462764), (0.0, 1817.1519743986896), (9.406682922545912, 1816.3485953105805), (8.482326797209026, 1813.6171064110094), (0.05437388972569579, 1811.809503462764)] \ No newline at end of file +[(1237.7196765498647, 0.0), (681.7196765498652, 4.0), (727.7196765498652, 513.0), (1442.7196765498647, 608.0), (1418.7196765498647, 423.0), (1237.7196765498647, 0.0)] +[(1756.7358927660807, 0.0), (1439.735892766081, 585.0), (1796.7358927660807, 622.0), (2181.7358927660807, 523.0), (2164.7358927660807, 173.0), (1756.7358927660807, 0.0)] +[(586.0, 622.0), (0.0, 635.0), (300.0, 857.0), (586.0, 622.0)] +[(10.22364217252396, 857.0), (0.8519701810436633, 891.493670886076), (0.0, 916.493670886076), (12.247071352502662, 907.9493670886076), (10.22364217252396, 857.0)] +[(22.56508289290622, 857.0), (11.7024630845995, 894.2362869198312), (13.299907174056372, 910.1645569620254), (23.09756425605852, 907.9493670886076), (22.56508289290622, 857.0)] +[(27.26304579339723, 916.493670886076), (8.413205537806178, 918.3924050632911), (0.0, 942.7594936708861), (1.490947816826413, 954.1518987341772), (7.8807241746538885, 954.5738396624472), (51.43769968051117, 950.1434599156119), (27.26304579339723, 916.493670886076)] +[(50.25001012809531, 916.493670886076), (40.25849830881026, 926.7050419270416), (40.158081104596334, 934.4428510388293), (47.63916281853338, 934.3794263739785), (50.25001012809531, 916.493670886076)] +[(4.1324156191531145, 954.5738396624472), (0.0, 964.97759885346), (13.756594100601824, 966.30317434884), (13.267229093070533, 959.2334383734799), (4.1324156191531145, 954.5738396624472)] +[(0.05437388972569579, 966.30317434884), (0.0, 971.6456452847656), (9.406682922545912, 970.8422661966565), (8.482326797209026, 968.1107772970854), (0.05437388972569579, 966.30317434884)] \ No newline at end of file