packingsolver 0.1.1237__tar.gz → 0.1.1245__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/PKG-INFO +1 -1
  2. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/optimize.hpp +9 -0
  3. packingsolver-0.1.1245/python/packingsolver/_version.py +1 -0
  4. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/irregular.cpp +2 -0
  5. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/CMakeLists.txt +4 -0
  6. packingsolver-0.1.1245/src/irregular/empty_spaces.cpp +156 -0
  7. packingsolver-0.1.1245/src/irregular/empty_spaces.hpp +82 -0
  8. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/main.cpp +6 -0
  9. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/optimize.cpp +43 -0
  10. packingsolver-0.1.1245/src/irregular/trapezoid_set.cpp +665 -0
  11. packingsolver-0.1.1245/src/irregular/trapezoid_set.hpp +212 -0
  12. packingsolver-0.1.1245/src/irregular/trapezoid_slider.cpp +154 -0
  13. packingsolver-0.1.1245/src/irregular/trapezoid_slider.hpp +233 -0
  14. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search.cpp +114 -1049
  15. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search.hpp +3 -138
  16. packingsolver-0.1.1245/src/irregular/tree_search_maximal_spaces.cpp +1017 -0
  17. packingsolver-0.1.1245/src/irregular/tree_search_maximal_spaces.hpp +499 -0
  18. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search_periodic_packing.cpp +2 -81
  19. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search_periodic_packing.hpp +3 -46
  20. packingsolver-0.1.1237/python/packingsolver/_version.py +0 -1
  21. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/CMakeLists.txt +0 -0
  22. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/LICENSE +0 -0
  23. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/README.md +0 -0
  24. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/extern/CMakeLists.txt +0 -0
  25. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/algorithms/common.hpp +0 -0
  26. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/algorithms/truck.hpp +0 -0
  27. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/algorithm_formatter.hpp +0 -0
  28. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/instance.hpp +0 -0
  29. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/instance_builder.hpp +0 -0
  30. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/optimize.hpp +0 -0
  31. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/post_process.hpp +0 -0
  32. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/reduction.hpp +0 -0
  33. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/solution.hpp +0 -0
  34. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/algorithm_formatter.hpp +0 -0
  35. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/instance.hpp +0 -0
  36. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/instance_builder.hpp +0 -0
  37. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/optimize.hpp +0 -0
  38. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/post_process.hpp +0 -0
  39. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/reduction.hpp +0 -0
  40. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/solution.hpp +0 -0
  41. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/algorithm_formatter.hpp +0 -0
  42. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/instance.hpp +0 -0
  43. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/instance_builder.hpp +0 -0
  44. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/post_process.hpp +0 -0
  45. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/reduction.hpp +0 -0
  46. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/solution.hpp +0 -0
  47. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/algorithm_formatter.hpp +0 -0
  48. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/instance.hpp +0 -0
  49. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/instance_builder.hpp +0 -0
  50. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/optimize.hpp +0 -0
  51. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/post_process.hpp +0 -0
  52. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/reduction.hpp +0 -0
  53. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/solution.hpp +0 -0
  54. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/algorithm_formatter.hpp +0 -0
  55. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/instance.hpp +0 -0
  56. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/instance_builder.hpp +0 -0
  57. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/optimize.hpp +0 -0
  58. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/post_process.hpp +0 -0
  59. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/reduction.hpp +0 -0
  60. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/solution.hpp +0 -0
  61. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/algorithm_formatter.hpp +0 -0
  62. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/instance.hpp +0 -0
  63. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/instance_builder.hpp +0 -0
  64. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/optimize.hpp +0 -0
  65. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/post_process.hpp +0 -0
  66. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/reduction.hpp +0 -0
  67. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/solution.hpp +0 -0
  68. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/pyproject.toml +0 -0
  69. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/CMakeLists.txt +0 -0
  70. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/__init__.py +0 -0
  71. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/_visualize.py +0 -0
  72. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/box.py +0 -0
  73. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/boxstacks.py +0 -0
  74. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/irregular.py +0 -0
  75. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/onedimensional.py +0 -0
  76. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/rectangle.py +0 -0
  77. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/rectangleguillotine.py +0 -0
  78. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/__init__.py +0 -0
  79. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/box.py +0 -0
  80. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/boxstacks.py +0 -0
  81. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/irregular.py +0 -0
  82. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/onedimensional.py +0 -0
  83. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/rectangle.py +0 -0
  84. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/rectangleguillotine.py +0 -0
  85. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/box.cpp +0 -0
  86. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/boxstacks.cpp +0 -0
  87. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/common.cpp +0 -0
  88. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/common.hpp +0 -0
  89. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/module.cpp +0 -0
  90. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/onedimensional.cpp +0 -0
  91. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/rectangle.cpp +0 -0
  92. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/rectangleguillotine.cpp +0 -0
  93. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_bin_cost.py +0 -0
  94. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_box.py +0 -0
  95. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_boxstacks.py +0 -0
  96. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_boxstacks_json.py +0 -0
  97. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_copies_min.py +0 -0
  98. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_doc_examples.py +0 -0
  99. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_group_weight_constraints.py +0 -0
  100. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_infeasibility.py +0 -0
  101. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_instance.py +0 -0
  102. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_irregular.py +0 -0
  103. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_item_fits.py +0 -0
  104. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_leftover_modes.py +0 -0
  105. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_onedimensional.py +0 -0
  106. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_parameters.py +0 -0
  107. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_rectangle.py +0 -0
  108. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_rectangleguillotine.py +0 -0
  109. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize.py +0 -0
  110. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_box.py +0 -0
  111. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_boxstacks.py +0 -0
  112. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_irregular.py +0 -0
  113. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_onedimensional.py +0 -0
  114. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_rectangle.py +0 -0
  115. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_rectangleguillotine.py +0 -0
  116. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/CMakeLists.txt +0 -0
  117. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/CMakeLists.txt +0 -0
  118. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/column_generation.hpp +0 -0
  119. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/common.cpp +0 -0
  120. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/dichotomic_search.hpp +0 -0
  121. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/dominated_items.hpp +0 -0
  122. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/meet_in_the_middle.hpp +0 -0
  123. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/sequential_value_correction.hpp +0 -0
  124. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/staircase.hpp +0 -0
  125. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/subset_sum_bound.hpp +0 -0
  126. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/thread_pool.hpp +0 -0
  127. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/CMakeLists.txt +0 -0
  128. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/algorithm_formatter.cpp +0 -0
  129. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/block.cpp +0 -0
  130. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/block.hpp +0 -0
  131. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/dual_feasible_functions.cpp +0 -0
  132. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/dual_feasible_functions.hpp +0 -0
  133. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance.cpp +0 -0
  134. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance_builder.cpp +0 -0
  135. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance_flipper.cpp +0 -0
  136. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance_flipper.hpp +0 -0
  137. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/main.cpp +0 -0
  138. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/optimize.cpp +0 -0
  139. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/post_process.cpp +0 -0
  140. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/reduction.cpp +0 -0
  141. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/sequential_feasibility.cpp +0 -0
  142. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/sequential_feasibility.hpp +0 -0
  143. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/solution.cpp +0 -0
  144. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/solution_builder.cpp +0 -0
  145. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/solution_builder.hpp +0 -0
  146. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search.cpp +0 -0
  147. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search.hpp +0 -0
  148. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search_maximal_spaces.cpp +0 -0
  149. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search_maximal_spaces.hpp +0 -0
  150. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/trivial.cpp +0 -0
  151. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/trivial.hpp +0 -0
  152. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/CMakeLists.txt +0 -0
  153. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/algorithm_formatter.cpp +0 -0
  154. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance.cpp +0 -0
  155. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance_builder.cpp +0 -0
  156. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance_flipper.cpp +0 -0
  157. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance_flipper.hpp +0 -0
  158. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/main.cpp +0 -0
  159. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/optimize.cpp +0 -0
  160. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/post_process.cpp +0 -0
  161. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/reduction.cpp +0 -0
  162. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/sequential_onedimensional_rectangle.cpp +0 -0
  163. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/sequential_onedimensional_rectangle.hpp +0 -0
  164. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/solution.cpp +0 -0
  165. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/solution_builder.cpp +0 -0
  166. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/solution_builder.hpp +0 -0
  167. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/tree_search.cpp +0 -0
  168. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/tree_search.hpp +0 -0
  169. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/algorithm_formatter.cpp +0 -0
  170. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/no_fit_polygon.cpp +0 -0
  171. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/no_fit_polygon.hpp +0 -0
  172. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/separator.cpp +0 -0
  173. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/separator.hpp +0 -0
  174. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/convert.cpp +0 -0
  175. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/convert.hpp +0 -0
  176. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/convert_main.cpp +0 -0
  177. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/polygon.cpp +0 -0
  178. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/polygon.hpp +0 -0
  179. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/separator.cpp +0 -0
  180. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/separator.hpp +0 -0
  181. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/fill_solution_file_main.cpp +0 -0
  182. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/instance.cpp +0 -0
  183. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/instance_builder.cpp +0 -0
  184. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/large_item_first.cpp +0 -0
  185. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/large_item_first.hpp +0 -0
  186. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/leftover.cpp +0 -0
  187. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/leftover.hpp +0 -0
  188. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/anchor.cpp +0 -0
  189. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/anchor.hpp +0 -0
  190. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separation_model.cpp +0 -0
  191. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separation_model.hpp +0 -0
  192. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separator.cpp +0 -0
  193. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separator.hpp +0 -0
  194. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/local_search.cpp +0 -0
  195. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/local_search.hpp +0 -0
  196. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/milp_raster.cpp +0 -0
  197. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/milp_raster.hpp +0 -0
  198. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separating_line.cpp +0 -0
  199. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separating_line.hpp +0 -0
  200. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separation_model.cpp +0 -0
  201. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separation_model.hpp +0 -0
  202. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separator.cpp +0 -0
  203. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separator.hpp +0 -0
  204. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/periodic_packing.cpp +0 -0
  205. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/periodic_packing.hpp +0 -0
  206. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/post_process.cpp +0 -0
  207. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/reduction.cpp +0 -0
  208. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/rotations.cpp +0 -0
  209. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/rotations.hpp +0 -0
  210. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/sequential_feasibility.cpp +0 -0
  211. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/sequential_feasibility.hpp +0 -0
  212. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/shape_simplification.cpp +0 -0
  213. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/shape_simplification.hpp +0 -0
  214. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/solution.cpp +0 -0
  215. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/solution_builder.cpp +0 -0
  216. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/solution_builder.hpp +0 -0
  217. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/trivial.cpp +0 -0
  218. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/trivial.hpp +0 -0
  219. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/utils.hpp +0 -0
  220. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/CMakeLists.txt +0 -0
  221. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/algorithm_formatter.cpp +0 -0
  222. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dual_feasible_functions.cpp +0 -0
  223. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dual_feasible_functions.hpp +0 -0
  224. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dynamic_programming.cpp +0 -0
  225. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dynamic_programming.hpp +0 -0
  226. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/instance.cpp +0 -0
  227. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/instance_builder.cpp +0 -0
  228. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/main.cpp +0 -0
  229. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/milp_assignment.cpp +0 -0
  230. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/milp_assignment.hpp +0 -0
  231. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/optimize.cpp +0 -0
  232. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/post_process.cpp +0 -0
  233. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/reduction.cpp +0 -0
  234. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/solution.cpp +0 -0
  235. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/solution_builder.cpp +0 -0
  236. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/solution_builder.hpp +0 -0
  237. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/tree_search.cpp +0 -0
  238. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/tree_search.hpp +0 -0
  239. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/CMakeLists.txt +0 -0
  240. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/algorithm_formatter.cpp +0 -0
  241. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/bar_relaxation.cpp +0 -0
  242. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/bar_relaxation.hpp +0 -0
  243. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition.cpp +0 -0
  244. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition.hpp +0 -0
  245. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition_contiguity.cpp +0 -0
  246. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition_contiguity.hpp +0 -0
  247. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/block.cpp +0 -0
  248. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/block.hpp +0 -0
  249. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/conservative_scales.cpp +0 -0
  250. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/conservative_scales.hpp +0 -0
  251. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/dual_feasible_functions.cpp +0 -0
  252. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/dual_feasible_functions.hpp +0 -0
  253. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance.cpp +0 -0
  254. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance_builder.cpp +0 -0
  255. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance_flipper.cpp +0 -0
  256. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance_flipper.hpp +0 -0
  257. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/item_subset_incompatibility.cpp +0 -0
  258. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/item_subset_incompatibility.hpp +0 -0
  259. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/main.cpp +0 -0
  260. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/milp.cpp +0 -0
  261. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/milp.hpp +0 -0
  262. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/tree_search.cpp +0 -0
  263. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/tree_search.hpp +0 -0
  264. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/optimize.cpp +0 -0
  265. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/post_process.cpp +0 -0
  266. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/reduction.cpp +0 -0
  267. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/sequential_feasibility.cpp +0 -0
  268. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/sequential_feasibility.hpp +0 -0
  269. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/solution.cpp +0 -0
  270. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/solution_builder.cpp +0 -0
  271. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/solution_builder.hpp +0 -0
  272. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search.cpp +0 -0
  273. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search.hpp +0 -0
  274. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search_maximal_spaces.cpp +0 -0
  275. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search_maximal_spaces.hpp +0 -0
  276. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/CMakeLists.txt +0 -0
  277. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/algorithm_formatter.cpp +0 -0
  278. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/block.cpp +0 -0
  279. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/block.hpp +0 -0
  280. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/column_generation_strips.cpp +0 -0
  281. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/column_generation_strips.hpp +0 -0
  282. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance.cpp +0 -0
  283. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance_builder.cpp +0 -0
  284. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance_flipper.cpp +0 -0
  285. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance_flipper.hpp +0 -0
  286. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/main.cpp +0 -0
  287. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/optimize.cpp +0 -0
  288. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/post_process.cpp +0 -0
  289. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/reduction.cpp +0 -0
  290. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_feasibility.cpp +0 -0
  291. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_feasibility.hpp +0 -0
  292. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_strips_onedimensional.cpp +0 -0
  293. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_strips_onedimensional.hpp +0 -0
  294. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/solution.cpp +0 -0
  295. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/solution_builder.cpp +0 -0
  296. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/solution_builder.hpp +0 -0
  297. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search.cpp +0 -0
  298. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search.hpp +0 -0
  299. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph.cpp +0 -0
  300. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph.hpp +0 -0
  301. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph_infinite_copies.cpp +0 -0
  302. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph_infinite_copies.hpp +0 -0
  303. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_maximal_spaces.cpp +0 -0
  304. {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_maximal_spaces.hpp +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: packingsolver
3
- Version: 0.1.1237
3
+ Version: 0.1.1245
4
4
  Summary: A solver for geometrical packing and cutting-stock problems
5
5
  Author: Florian Fontan
6
6
  License-Expression: MIT
@@ -210,6 +210,12 @@ struct OptimizeParameters: packingsolver::Parameters<Instance, Solution, Output>
210
210
  /** Use tree search periodic packing algorithm. */
211
211
  bool use_tree_search_periodic_packing = false;
212
212
 
213
+ /**
214
+ * Use tree search maximal spaces algorithm (only for instances with a
215
+ * single bin; never selected automatically).
216
+ */
217
+ bool use_tree_search_maximal_spaces = false;
218
+
213
219
  /**
214
220
  * Use local search algorithm with the linear programming engine (the
215
221
  * items are shrunk to remove the overlaps).
@@ -350,6 +356,9 @@ struct OptimizeParameters: packingsolver::Parameters<Instance, Solution, Output>
350
356
  /** Size of the queue in the tree search periodic packing algorithm. */
351
357
  NodeId not_anytime_tree_search_periodic_packing_queue_size = 16;
352
358
 
359
+ /** Size of the queue in the tree search maximal spaces algorithm. */
360
+ NodeId not_anytime_tree_search_maximal_spaces_queue_size = 4;
361
+
353
362
  /**
354
363
  * Size of the queue in the single knapsack subproblem of the sequential
355
364
  * single knapsack algorithm.
@@ -0,0 +1 @@
1
+ __version__ = "0.1.1245"
@@ -661,6 +661,7 @@ void bind_irregular(nb::module_& m)
661
661
  .def_rw("linear_programming_solver_name", &OptimizeParameters::linear_programming_solver_name)
662
662
  .def_rw("use_tree_search", &OptimizeParameters::use_tree_search)
663
663
  .def_rw("use_tree_search_periodic_packing", &OptimizeParameters::use_tree_search_periodic_packing)
664
+ .def_rw("use_tree_search_maximal_spaces", &OptimizeParameters::use_tree_search_maximal_spaces)
664
665
  .def_rw("use_local_search_linear_programming", &OptimizeParameters::use_local_search_linear_programming)
665
666
  .def_rw("use_local_search_nonlinear_programming", &OptimizeParameters::use_local_search_nonlinear_programming)
666
667
  .def_rw("use_local_search_direct_trigonometry", &OptimizeParameters::use_local_search_direct_trigonometry)
@@ -682,6 +683,7 @@ void bind_irregular(nb::module_& m)
682
683
  .def_rw("not_anytime_maximum_approximation_ratio", &OptimizeParameters::not_anytime_maximum_approximation_ratio)
683
684
  .def_rw("not_anytime_tree_search_queue_size", &OptimizeParameters::not_anytime_tree_search_queue_size)
684
685
  .def_rw("not_anytime_tree_search_periodic_packing_queue_size", &OptimizeParameters::not_anytime_tree_search_periodic_packing_queue_size)
686
+ .def_rw("not_anytime_tree_search_maximal_spaces_queue_size", &OptimizeParameters::not_anytime_tree_search_maximal_spaces_queue_size)
685
687
  .def_rw("not_anytime_sequential_single_knapsack_subproblem_tree_search_queue_size", &OptimizeParameters::not_anytime_sequential_single_knapsack_subproblem_tree_search_queue_size)
686
688
  .def_rw("not_anytime_sequential_value_correction_number_of_iterations", &OptimizeParameters::not_anytime_sequential_value_correction_number_of_iterations)
687
689
  .def_rw("not_anytime_local_search_maximum_number_of_failed_separations", &OptimizeParameters::not_anytime_local_search_maximum_number_of_failed_separations)
@@ -12,8 +12,12 @@ target_sources(PackingSolver_irregular PRIVATE
12
12
  shape_simplification.cpp
13
13
  rotations.cpp
14
14
  periodic_packing.cpp
15
+ empty_spaces.cpp
16
+ trapezoid_set.cpp
17
+ trapezoid_slider.cpp
15
18
  tree_search.cpp
16
19
  tree_search_periodic_packing.cpp
20
+ tree_search_maximal_spaces.cpp
17
21
  linear_programming/anchor.cpp
18
22
  linear_programming/separation_model.cpp
19
23
  linear_programming/separator.cpp
@@ -0,0 +1,156 @@
1
+ #include "irregular/empty_spaces.hpp"
2
+
3
+ using namespace packingsolver;
4
+ using namespace packingsolver::irregular;
5
+
6
+ bool packingsolver::irregular::overlaps(
7
+ const EmptySpace& space,
8
+ Point bl_corner,
9
+ LengthDbl bx,
10
+ LengthDbl by)
11
+ {
12
+ return shape::strictly_lesser(bl_corner.x, space.xe())
13
+ && shape::strictly_greater(bl_corner.x + bx, space.xs())
14
+ && shape::strictly_lesser(bl_corner.y, space.ye())
15
+ && shape::strictly_greater(bl_corner.y + by, space.ys());
16
+ }
17
+
18
+ void packingsolver::irregular::add_empty_space(
19
+ std::vector<EmptySpace>& spaces,
20
+ const EmptySpace& new_space)
21
+ {
22
+ if (!shape::strictly_greater(new_space.bx, 0.0) || !shape::strictly_greater(new_space.by, 0.0))
23
+ return;
24
+ for (const EmptySpace& existing: spaces)
25
+ if (existing.contains(new_space))
26
+ return;
27
+ spaces.push_back(new_space);
28
+ }
29
+
30
+ void packingsolver::irregular::cut_empty_spaces(
31
+ std::vector<EmptySpace>& spaces,
32
+ Point bl_corner,
33
+ LengthDbl bx,
34
+ LengthDbl by)
35
+ {
36
+ for (ItemPos i = 0; i < (ItemPos)spaces.size(); ) {
37
+ if (!overlaps(spaces[i], bl_corner, bx, by)) {
38
+ ++i;
39
+ continue;
40
+ }
41
+ EmptySpace space = spaces[i];
42
+ spaces[i] = spaces.back();
43
+ spaces.pop_back();
44
+
45
+ // Left (x-)
46
+ if (shape::strictly_greater(bl_corner.x, space.xs())) {
47
+ EmptySpace sub;
48
+ sub.bl_corner.x = space.bl_corner.x;
49
+ sub.bl_corner.y = space.bl_corner.y;
50
+ sub.bx = bl_corner.x - space.bl_corner.x;
51
+ sub.by = space.by;
52
+ add_empty_space(spaces, sub);
53
+ }
54
+ // Right (x+)
55
+ if (shape::strictly_lesser(bl_corner.x + bx, space.xe())) {
56
+ EmptySpace sub;
57
+ sub.bl_corner.x = bl_corner.x + bx;
58
+ sub.bl_corner.y = space.bl_corner.y;
59
+ sub.bx = space.xe() - (bl_corner.x + bx);
60
+ sub.by = space.by;
61
+ add_empty_space(spaces, sub);
62
+ }
63
+ // Bottom (y-)
64
+ if (shape::strictly_greater(bl_corner.y, space.ys())) {
65
+ EmptySpace sub;
66
+ sub.bl_corner.x = space.bl_corner.x;
67
+ sub.bl_corner.y = space.bl_corner.y;
68
+ sub.bx = space.bx;
69
+ sub.by = bl_corner.y - space.bl_corner.y;
70
+ add_empty_space(spaces, sub);
71
+ }
72
+ // Top (y+)
73
+ if (shape::strictly_lesser(bl_corner.y + by, space.ye())) {
74
+ EmptySpace sub;
75
+ sub.bl_corner.x = space.bl_corner.x;
76
+ sub.bl_corner.y = bl_corner.y + by;
77
+ sub.bx = space.bx;
78
+ sub.by = space.ye() - (bl_corner.y + by);
79
+ add_empty_space(spaces, sub);
80
+ }
81
+ // Do not increment i: the element swapped into position i must be checked.
82
+ }
83
+ }
84
+
85
+ void packingsolver::irregular::cut_empty_spaces(
86
+ std::vector<EmptySpace>& spaces,
87
+ const std::vector<AxisAlignedBoundingBox>& rectangles,
88
+ LengthDbl minimum_width,
89
+ LengthDbl minimum_height)
90
+ {
91
+ if (rectangles.empty())
92
+ return;
93
+ AxisAlignedBoundingBox rectangles_aabb;
94
+ for (const AxisAlignedBoundingBox& rectangle: rectangles)
95
+ rectangles_aabb = merge(rectangles_aabb, rectangle);
96
+
97
+ // Cut each empty space overlapping a rectangle by all the rectangles,
98
+ // on its own: the containment checks are then only made between its own
99
+ // parts, and its final parts are checked against all the empty spaces
100
+ // once.
101
+ std::vector<EmptySpace> new_spaces;
102
+ std::vector<EmptySpace> parts;
103
+ for (ItemPos space_pos = 0; space_pos < (ItemPos)spaces.size(); ) {
104
+ const EmptySpace& space = spaces[space_pos];
105
+ bool cut = false;
106
+ if (overlaps(
107
+ space,
108
+ {rectangles_aabb.x_min, rectangles_aabb.y_min},
109
+ rectangles_aabb.x_max - rectangles_aabb.x_min,
110
+ rectangles_aabb.y_max - rectangles_aabb.y_min)) {
111
+ for (const AxisAlignedBoundingBox& rectangle: rectangles) {
112
+ if (overlaps(
113
+ space,
114
+ {rectangle.x_min, rectangle.y_min},
115
+ rectangle.x_max - rectangle.x_min,
116
+ rectangle.y_max - rectangle.y_min)) {
117
+ cut = true;
118
+ break;
119
+ }
120
+ }
121
+ }
122
+ if (!cut) {
123
+ ++space_pos;
124
+ continue;
125
+ }
126
+ parts = {space};
127
+ spaces[space_pos] = spaces.back();
128
+ spaces.pop_back();
129
+ for (const AxisAlignedBoundingBox& rectangle: rectangles) {
130
+ cut_empty_spaces(
131
+ parts,
132
+ {rectangle.x_min, rectangle.y_min},
133
+ rectangle.x_max - rectangle.x_min,
134
+ rectangle.y_max - rectangle.y_min);
135
+ }
136
+ for (const EmptySpace& part: parts) {
137
+ if (shape::strictly_lesser(part.bx, minimum_width)
138
+ || shape::strictly_lesser(part.by, minimum_height)) {
139
+ continue;
140
+ }
141
+ new_spaces.push_back(part);
142
+ }
143
+ }
144
+
145
+ // Add the largest parts first, so that a part is never added before a
146
+ // part containing it.
147
+ std::sort(
148
+ new_spaces.begin(),
149
+ new_spaces.end(),
150
+ [](const EmptySpace& space_1, const EmptySpace& space_2)
151
+ {
152
+ return space_1.area() > space_2.area();
153
+ });
154
+ for (const EmptySpace& new_space: new_spaces)
155
+ add_empty_space(spaces, new_space);
156
+ }
@@ -0,0 +1,82 @@
1
+ #pragma once
2
+
3
+ #include "packingsolver/irregular/instance.hpp"
4
+
5
+ namespace packingsolver
6
+ {
7
+ namespace irregular
8
+ {
9
+
10
+ /**
11
+ * A maximal empty space: the largest axis-aligned rectangle that can be placed
12
+ * at a given position without overlapping any placed block or the bin walls.
13
+ * All lengths are in scaled coordinates.
14
+ */
15
+ struct EmptySpace
16
+ {
17
+ Point bl_corner = {0.0, 0.0};
18
+ LengthDbl bx = 0.0;
19
+ LengthDbl by = 0.0;
20
+
21
+ inline LengthDbl xs() const { return bl_corner.x; }
22
+ inline LengthDbl ys() const { return bl_corner.y; }
23
+ inline LengthDbl xe() const { return bl_corner.x + bx; }
24
+ inline LengthDbl ye() const { return bl_corner.y + by; }
25
+
26
+ /** Returns true iff this space fully contains other. */
27
+ inline bool contains(const EmptySpace& other) const
28
+ {
29
+ return !strictly_greater(xs(), other.xs())
30
+ && !strictly_greater(ys(), other.ys())
31
+ && !strictly_lesser(xe(), other.xe())
32
+ && !strictly_lesser(ye(), other.ye());
33
+ }
34
+
35
+ inline AreaDbl area() const { return bx * by; }
36
+ };
37
+
38
+ /**
39
+ * Return 'true' iff the rectangle of bottom-left corner 'bl_corner' and of
40
+ * dimensions 'bx' x 'by' overlaps the empty space.
41
+ */
42
+ bool overlaps(
43
+ const EmptySpace& space,
44
+ Point bl_corner,
45
+ LengthDbl bx,
46
+ LengthDbl by);
47
+
48
+ /**
49
+ * Add an empty space to a list of maximal empty spaces, unless it is empty or
50
+ * contained in one of them.
51
+ */
52
+ void add_empty_space(
53
+ std::vector<EmptySpace>& spaces,
54
+ const EmptySpace& new_space);
55
+
56
+ /**
57
+ * Update a list of maximal empty spaces when the rectangle of bottom-left
58
+ * corner 'bl_corner' and of dimensions 'bx' x 'by' gets occupied: each empty
59
+ * space it overlaps is replaced by its (up to four) parts on the left, on the
60
+ * right, below and above the rectangle.
61
+ */
62
+ void cut_empty_spaces(
63
+ std::vector<EmptySpace>& spaces,
64
+ Point bl_corner,
65
+ LengthDbl bx,
66
+ LengthDbl by);
67
+
68
+ /**
69
+ * Update a list of maximal empty spaces when a set of rectangles gets
70
+ * occupied.
71
+ *
72
+ * The new empty spaces narrower than 'minimum_width' or lower than
73
+ * 'minimum_height' are discarded.
74
+ */
75
+ void cut_empty_spaces(
76
+ std::vector<EmptySpace>& spaces,
77
+ const std::vector<AxisAlignedBoundingBox>& rectangles,
78
+ LengthDbl minimum_width = 0.0,
79
+ LengthDbl minimum_height = 0.0);
80
+
81
+ }
82
+ }
@@ -85,6 +85,7 @@ int main(int argc, char *argv[])
85
85
  ("optimization-mode,", po::value<OptimizationMode>(), "set optimization mode")
86
86
  ("use-tree-search,", po::value<bool>(), "enable tree search algorithm")
87
87
  ("use-tree-search-periodic-packing,", po::value<bool>(), "enable tree search periodic packing algorithm")
88
+ ("use-tree-search-maximal-spaces,", po::value<bool>(), "enable tree search maximal spaces algorithm")
88
89
  ("use-milp-raster,", po::value<bool>(), "enable MILP raster algorithm")
89
90
  ("use-local-search-linear-programming,", po::value<bool>(), "enable local search algorithm with the linear programming engine")
90
91
  ("use-local-search-nonlinear-programming,", po::value<bool>(), "enable local search algorithm with the nonlinear programming engine (requires Knitro)")
@@ -104,6 +105,7 @@ int main(int argc, char *argv[])
104
105
  ("not-anytime-maximum-approximation-ratio,", po::value<double>(), "")
105
106
  ("not-anytime-tree-search-queue-size,", po::value<Counter>(), "")
106
107
  ("not-anytime-tree-search-periodic-packing-queue-size,", po::value<Counter>(), "")
108
+ ("not-anytime-tree-search-maximal-spaces-queue-size,", po::value<Counter>(), "")
107
109
  ("not-anytime-sequential-single-knapsack-subproblem-tree-search-queue-size,", po::value<Counter>(), "")
108
110
  ("not-anytime-sequential-value-correction-number-of-iterations,", po::value<Counter>(), "")
109
111
  ("not-anytime-local-search-maximum-number-of-failed-separations,", po::value<Counter>(), "")
@@ -177,6 +179,8 @@ int main(int argc, char *argv[])
177
179
  parameters.use_tree_search = vm["use-tree-search"].as<bool>();
178
180
  if (vm.count("use-tree-search-periodic-packing"))
179
181
  parameters.use_tree_search_periodic_packing = vm["use-tree-search-periodic-packing"].as<bool>();
182
+ if (vm.count("use-tree-search-maximal-spaces"))
183
+ parameters.use_tree_search_maximal_spaces = vm["use-tree-search-maximal-spaces"].as<bool>();
180
184
  if (vm.count("use-milp-raster"))
181
185
  parameters.use_milp_raster = vm["use-milp-raster"].as<bool>();
182
186
  if (vm.count("use-local-search-linear-programming"))
@@ -214,6 +218,8 @@ int main(int argc, char *argv[])
214
218
  parameters.not_anytime_tree_search_queue_size = vm["not-anytime-tree-search-queue-size"].as<Counter>();
215
219
  if (vm.count("not-anytime-tree-search-periodic-packing-queue-size"))
216
220
  parameters.not_anytime_tree_search_periodic_packing_queue_size = vm["not-anytime-tree-search-periodic-packing-queue-size"].as<Counter>();
221
+ if (vm.count("not-anytime-tree-search-maximal-spaces-queue-size"))
222
+ parameters.not_anytime_tree_search_maximal_spaces_queue_size = vm["not-anytime-tree-search-maximal-spaces-queue-size"].as<Counter>();
217
223
  if (vm.count("not-anytime-sequential-single-knapsack-subproblem-tree-search-queue-size"))
218
224
  parameters.not_anytime_sequential_single_knapsack_subproblem_tree_search_queue_size = vm["not-anytime-sequential-single-knapsack-subproblem-tree-search-queue-size"].as<Counter>();
219
225
  if (vm.count("not-anytime-sequential-value-correction-number-of-iterations"))
@@ -6,6 +6,7 @@
6
6
  #include "irregular/trivial.hpp"
7
7
  #include "irregular/tree_search.hpp"
8
8
  #include "irregular/tree_search_periodic_packing.hpp"
9
+ #include "irregular/tree_search_maximal_spaces.hpp"
9
10
  #include "irregular/milp_raster.hpp"
10
11
  #include "irregular/local_search.hpp"
11
12
  #include "algorithms/dichotomic_search.hpp"
@@ -765,6 +766,30 @@ void optimize_tree_search_periodic_packing(
765
766
  tree_search_periodic_packing(instance, ts_pp_parameters);
766
767
  }
767
768
 
769
+ void optimize_tree_search_maximal_spaces(
770
+ const Instance& instance,
771
+ const OptimizeParameters& parameters,
772
+ AlgorithmFormatter& algorithm_formatter)
773
+ {
774
+ TreeSearchMaximalSpacesParameters ts_ms_parameters;
775
+ ts_ms_parameters.verbosity_level = 0;
776
+ ts_ms_parameters.timer = parameters.timer;
777
+ ts_ms_parameters.timer.add_end_boolean(&algorithm_formatter.end_boolean());
778
+ ts_ms_parameters.optimization_mode = parameters.optimization_mode;
779
+ ts_ms_parameters.not_anytime_tree_search_queue_size
780
+ = parameters.not_anytime_tree_search_maximal_spaces_queue_size;
781
+ ts_ms_parameters.maximum_approximation_ratio
782
+ = parameters.not_anytime_maximum_approximation_ratio;
783
+ ts_ms_parameters.new_solution_callback = [&algorithm_formatter](
784
+ const packingsolver::Output<Instance, Solution>& ts_output)
785
+ {
786
+ algorithm_formatter.update_solution(
787
+ ts_output.solution_pool.best(),
788
+ "TSMS " + ts_output.solution_pool.best_label());
789
+ };
790
+ tree_search_maximal_spaces(instance, ts_ms_parameters);
791
+ }
792
+
768
793
  void optimize_milp_raster(
769
794
  const Instance& instance,
770
795
  const OptimizeParameters& parameters,
@@ -970,6 +995,7 @@ packingsolver::irregular::Output packingsolver::irregular::optimize(
970
995
  = largest_bin_space(instance) / mean_item_space(instance);
971
996
  bool use_tree_search = parameters.use_tree_search;
972
997
  bool use_tree_search_periodic_packing = parameters.use_tree_search_periodic_packing;
998
+ bool use_tree_search_maximal_spaces = parameters.use_tree_search_maximal_spaces;
973
999
  bool use_local_search_linear_programming = parameters.use_local_search_linear_programming;
974
1000
  bool use_local_search_nonlinear_programming = parameters.use_local_search_nonlinear_programming;
975
1001
  bool use_local_search_direct_trigonometry = parameters.use_local_search_direct_trigonometry;
@@ -996,6 +1022,7 @@ packingsolver::irregular::Output packingsolver::irregular::optimize(
996
1022
  // Automatic selection.
997
1023
  if (!use_tree_search
998
1024
  && !use_tree_search_periodic_packing
1025
+ && !use_tree_search_maximal_spaces
999
1026
  && !use_local_search_linear_programming
1000
1027
  && !use_local_search_nonlinear_programming
1001
1028
  && !use_local_search_direct_trigonometry
@@ -1196,6 +1223,9 @@ packingsolver::irregular::Output packingsolver::irregular::optimize(
1196
1223
  }
1197
1224
  }
1198
1225
  }
1226
+ // tree_search_maximal_spaces only supports a single bin.
1227
+ if (instance.number_of_bins() > 1)
1228
+ use_tree_search_maximal_spaces = false;
1199
1229
 
1200
1230
  // Run selected algorithms.
1201
1231
  // In 'NotAnytimeDeterministic' mode, algorithms still run in parallel, but
@@ -1271,6 +1301,19 @@ packingsolver::irregular::Output packingsolver::irregular::optimize(
1271
1301
  *context.second);
1272
1302
  });
1273
1303
  }
1304
+ // Tree search maximal spaces.
1305
+ if (use_tree_search_maximal_spaces) {
1306
+ exception_ptr_list.push_front(std::exception_ptr());
1307
+ std::exception_ptr& exception_ptr = exception_ptr_list.front();
1308
+ auto context = task_context();
1309
+ tasks.push_back([&exception_ptr, &instance, context]() {
1310
+ wrapper<decltype(&optimize_tree_search_maximal_spaces), optimize_tree_search_maximal_spaces>(
1311
+ exception_ptr,
1312
+ instance,
1313
+ *context.first,
1314
+ *context.second);
1315
+ });
1316
+ }
1274
1317
  // Tree search periodic packing.
1275
1318
  if (use_tree_search_periodic_packing) {
1276
1319
  exception_ptr_list.push_front(std::exception_ptr());