OSDN Git Service

implemented parsing optimization
authorYordan Manolov <yordan.manolov@rwth-aachen.de>
Sun, 19 Jul 2020 11:28:52 +0000 (13:28 +0200)
committerYordan Manolov <yordan.manolov@rwth-aachen.de>
Sun, 19 Jul 2020 11:28:52 +0000 (13:28 +0200)
Latex/presentation/benchmarks/ep/ep_debug.log
src/inform-or/inform_or_experiments/split_model.py
src/inform-or/inform_or_parser/parse_csv_extreme_points.py
src/inform-or/inform_or_parser/parse_generated_csv.py
src/inform-runner/run_ep_heuristic.py
src/inform-runner/run_gabm_heuristic.py

index e2bdb3a..42188ad 100644 (file)
@@ -252,3 +252,33 @@ Number of boxes : 34
 Avg. number of boxes : 11 
 Free volume (total) : 1414306 
 Avg. free volume: 30.671274509803922 percent
+2020-07-19 13:04:27,287 Details for Category from O1 to O3 : 
+Total time (in seconds) : 0.005005072000130895 
+Number of boxes : 31 
+Avg. number of boxes : 10 
+Free volume (total) : 1220826 
+Avg. free volume: 34.3641935483871 percent
+2020-07-19 13:04:53,589 Details for Category from O1 to O3 : 
+Total time (in seconds) : 0.00504950499998813 
+Number of boxes : 31 
+Avg. number of boxes : 10 
+Free volume (total) : 1220826 
+Avg. free volume: 34.3641935483871 percent
+2020-07-19 13:06:08,634 Details for Category from O0 to O10 : 
+Total time (in seconds) : 0.01787604100036333 
+Number of boxes : 112 
+Avg. number of boxes : 10 
+Free volume (total) : 4389886 
+Avg. free volume: 34.67431547619047 percent
+2020-07-19 13:09:23,472 Details for Category from O0 to O100059 : 
+Total time (in seconds) : 116.31860341499987 
+Number of boxes : 755151 
+Avg. number of boxes : 7 
+Free volume (total) : 30402133137 
+Avg. free volume: 32.900668570480164 percent
+2020-07-19 13:20:24,549 Details for Category from 5 to 10 : 
+Total time (in seconds) : 1.5173372700000982 
+Number of boxes : 64 
+Avg. number of boxes : 12 
+Free volume (total) : 2491080 
+Avg. free volume: 35.128125 percent
index a81773b..e8d0255 100644 (file)
@@ -1,12 +1,13 @@
 # Copyright (c) 2020 Janos Piddubnij 
 # Copyright (c) 2020 Moritz Dedderichs
 
+
 from inform_or_models.assign_items_by_volume import assign_items_by_volume
 from inform_or_parser.parse_generated_csv import parse_generated_csv
 from inform_or_models.place_items_in_box import place_items_in_box
 from inform_or_parser.parse_boxes import parse_boxes
 from typing import Dict, Tuple
-
+import sys
 
 class SplitModel:
     def __init__(self, input_file: str, boxes_file: str):
@@ -17,7 +18,7 @@ class SplitModel:
         input_file: str
             The CSV file created by the INFORM-Generator to be processed.
         """
-        self.orders, self.length_items, self.width_items, self.height_items, self.weight_items = parse_generated_csv(input_file)
+        self.orders, self.length_items, self.width_items, self.height_items, self.weight_items = parse_generated_csv(input_file, ";", "utf-16", 0, sys.maxsize)
         boxes_dict = parse_boxes(boxes_file)
         self.boxes = list(boxes_dict.keys())
         self.length_boxes = {k: v[0] for k, v in boxes_dict.items()}
index c4f0003..9e67a98 100644 (file)
@@ -5,14 +5,15 @@ Parser specific to the EP heuristic.
 """
 
 #  Copyright (c) 2020.  Yordan Manolov <yordan DOT manolov AT rwth DASH aachen DOT de >
-#
+#  Copyright (c) 2020.  Moritz Dedderichs
 
+import argparse
 import csv
-from typing import List
+from typing import List, Generator
 
-from inform_or_parser.parse_generated_csv import parse_generated_csv
 from inform_or_ep_objects.item import Item
 from inform_or_ep_objects.order import Order
+from inform_or_parser.parse_generated_csv import parse_generated_csv
 
 ORDER_COLUMN = "Order ID"
 ARTICLE_COLUMN = "Article ID"
@@ -52,34 +53,42 @@ def verify_input(name, delimiter=';', encoding='utf-16') -> bool:
         return True
 
 
-def parse_file_as_objects(name: str, delimiter: str = ";", encoding: str = "utf-16") -> List[Order]:
+def parse_file_as_objects(args: argparse.Namespace,
+                          delimiter: str = ";",
+                          encoding: str = "utf-16") -> Generator[Order, None, None]:
     """
     Wrapper for the original parser.
     Outputs objects instead of dictionaries. Fast.
 
     Parameters
     ----------
-    name : str
-        Filename.
+    args:
+        Basic arguments, especially file name, first and last order to process
     delimiter : str, optional
         The default is ";".
     encoding : str, optional
-        The default is "utf-16".
+        The default is "utf-16"
 
     Returns
     -------
-    List[Order]
-        A list of order (objects).
+    Generator[Order]
+        Order (objects).
     """
+    name = args.input
+    file_beginning = args.first
+    file_end = args.last
     verify_input(name, delimiter, encoding)
-    result = list()
-    orders, lengths, widths, heights, weights = parse_generated_csv(name, delimiter, encoding)
+    orders, lengths, widths, heights, weights = parse_generated_csv(name,
+                                                                    delimiter,
+                                                                    encoding,
+                                                                    file_beginning,
+                                                                    file_end)
 
     for key, item_list in orders.items():
         order = Order(key, list())
         for item_id, count in item_list:
             order.itemlist.append(
-                Item(item_id, count, lengths[item_id], widths[item_id], heights[item_id], weights[item_id]))
-        result.append(order)
+                Item(item_id, count, lengths[item_id], widths[item_id],
+                     heights[item_id], weights[item_id]))
+        yield order
 
-    return result
index 13f7d64..143a0d9 100644 (file)
@@ -1,13 +1,36 @@
 # Copyright (c) 2020 Moritz Dedderichs
-
+# Copyright (c) 2020 Yordan Manolov
 
 import csv
 from typing import Tuple, Dict, Any, DefaultDict
 from collections import defaultdict
 
 
-def parse_generated_csv(csv_file: str, delimiter: str = ';', encoding: str = 'utf-16') -> Tuple[
-        DefaultDict[Any, list], Dict[str, int], Dict[str, int], Dict[str, int], Dict[str, int]]:
+def name_to_number(order_name: str) -> int:
+    """
+
+    Parameters
+    ----------
+    order_name
+    The full name of the current order
+
+    Returns
+    -------
+    The name without non-numerals, stripped of leading zeroes
+
+    """
+    return int("".join(c for c in order_name if c.isdigit()))
+
+
+def parse_generated_csv(csv_file: str,
+                        delimiter: str = ';',
+                        encoding: str = 'utf-16',
+                        first: int = None,
+                        last: int = None) -> Tuple[DefaultDict[Any, list],
+                                                   Dict[str, int],
+                                                   Dict[str, int],
+                                                   Dict[str, int],
+                                                   Dict[str, int]]:
     """ This functions reads the given csv file and returns a gurobi like data collection to use in the optimisation process
 
     Parameters
@@ -45,7 +68,12 @@ def parse_generated_csv(csv_file: str, delimiter: str = ';', encoding: str = 'ut
         next(reader)
         for row in reader:
             order_name = row[0].strip()
+            order_nr = name_to_number(order_name)
             item_name = row[6].strip()
+
+            if first and last:
+                if order_nr < first or order_nr > last:
+                    continue
             orders[order_name].append((item_name, int(row[12])))
             length_items[item_name] = int(row[8])
             width_items[item_name] = int(row[9])
index ad1b985..6074333 100644 (file)
@@ -36,16 +36,10 @@ def run_experiment(arguments: argparse.Namespace):
     """
     instruction = os.path.join(arguments.output, 'instructions_ep.txt')
     print_instruction_description_to_file(instruction)
-    orders = parse_csv_extreme_points.parse_file_as_objects(arguments.input)
-    order_from = arguments.first
-    order_until = arguments.last
-    if isinstance(order_until, int):
-        order_until += 1
-    orders = orders[order_from:order_until]
     processed_orders = list()
     start_all_orders = time.perf_counter()
 
-    for order in orders:
+    for order in parse_csv_extreme_points.parse_file_as_objects(arguments):
         start_current_order = time.perf_counter()
         result = extreme_points(order, instruction, arguments)
         processed_orders.append(result)
@@ -62,9 +56,9 @@ def run_experiment(arguments: argparse.Namespace):
 
     end_all_orders = time.perf_counter()
     time_all_orders = end_all_orders - start_all_orders
-    stat_me("Category from " + str(orders[0].identifier) +
-            " to " + str(orders[-1].identifier),
-            len(orders),
+    stat_me("Category from " + str(args.first) +
+            " to " + str(args.last),
+            abs(args.first - args.last),
             time_all_orders,
             processed_orders)
 
index d3f9dde..a748344 100644 (file)
@@ -110,12 +110,7 @@ def run_experiment(input_file_path, boxes_files, output_file_path, first, last,
         width_box[box] = boxes_dict[box][1]
         height_box[box] = boxes_dict[box][2]
 
-    orders, length_item, width_item, height_item, weight_item = parse_generated_csv(input_file_path)
-
-    if first is None:
-        first = 0
-    if last is None:
-        last = len(orders)
+    orders, length_item, width_item, height_item, weight_item = parse_generated_csv(input_file_path, ";", "utf-16", first, last)
 
     complete_solution_dictionary = dict()