packingsolver 0.1.1236__tar.gz → 0.1.1237__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 (302) hide show
  1. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/PKG-INFO +1 -1
  2. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/box/instance.hpp +16 -7
  3. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/box/instance_builder.hpp +13 -0
  4. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/box/optimize.hpp +26 -0
  5. packingsolver-0.1.1237/include/packingsolver/box/post_process.hpp +56 -0
  6. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/box/solution.hpp +32 -0
  7. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/boxstacks/instance.hpp +25 -0
  8. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/boxstacks/instance_builder.hpp +3 -0
  9. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/boxstacks/optimize.hpp +12 -0
  10. packingsolver-0.1.1237/include/packingsolver/boxstacks/post_process.hpp +56 -0
  11. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/boxstacks/solution.hpp +33 -0
  12. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangle/instance.hpp +8 -0
  13. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangle/instance_builder.hpp +3 -0
  14. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangle/optimize.hpp +12 -0
  15. packingsolver-0.1.1237/include/packingsolver/rectangle/post_process.hpp +56 -0
  16. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangle/solution.hpp +33 -0
  17. packingsolver-0.1.1237/python/packingsolver/_version.py +1 -0
  18. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/box.cpp +1 -0
  19. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/boxstacks.cpp +1 -0
  20. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/rectangle.cpp +1 -0
  21. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_box.py +2 -0
  22. packingsolver-0.1.1237/src/algorithms/staircase.hpp +142 -0
  23. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/CMakeLists.txt +1 -0
  24. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/instance.cpp +2 -0
  25. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/instance_builder.cpp +31 -0
  26. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/main.cpp +6 -0
  27. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/optimize.cpp +206 -11
  28. packingsolver-0.1.1237/src/box/post_process.cpp +109 -0
  29. packingsolver-0.1.1237/src/box/sequential_feasibility.cpp +239 -0
  30. packingsolver-0.1.1237/src/box/sequential_feasibility.hpp +47 -0
  31. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/solution.cpp +78 -40
  32. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/tree_search.cpp +80 -7
  33. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/tree_search.hpp +47 -0
  34. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/tree_search_maximal_spaces.cpp +42 -0
  35. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/instance.cpp +3 -0
  36. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/instance_builder.cpp +4 -0
  37. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/main.cpp +6 -0
  38. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/optimize.cpp +91 -0
  39. packingsolver-0.1.1237/src/boxstacks/post_process.cpp +110 -0
  40. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/solution.cpp +71 -35
  41. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/tree_search.cpp +74 -9
  42. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/tree_search.hpp +40 -0
  43. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/CMakeLists.txt +1 -0
  44. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/instance.cpp +4 -1
  45. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/instance_builder.cpp +4 -0
  46. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/main.cpp +6 -0
  47. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/optimize.cpp +70 -84
  48. packingsolver-0.1.1237/src/rectangle/post_process.cpp +109 -0
  49. packingsolver-0.1.1237/src/rectangle/sequential_feasibility.cpp +227 -0
  50. packingsolver-0.1.1237/src/rectangle/sequential_feasibility.hpp +45 -0
  51. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/solution.cpp +80 -40
  52. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/tree_search.cpp +67 -3
  53. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/tree_search.hpp +34 -0
  54. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/tree_search_maximal_spaces.cpp +41 -0
  55. packingsolver-0.1.1236/include/packingsolver/box/post_process.hpp +0 -25
  56. packingsolver-0.1.1236/include/packingsolver/boxstacks/post_process.hpp +0 -25
  57. packingsolver-0.1.1236/include/packingsolver/rectangle/post_process.hpp +0 -25
  58. packingsolver-0.1.1236/python/packingsolver/_version.py +0 -1
  59. packingsolver-0.1.1236/src/box/post_process.cpp +0 -13
  60. packingsolver-0.1.1236/src/boxstacks/post_process.cpp +0 -13
  61. packingsolver-0.1.1236/src/rectangle/post_process.cpp +0 -13
  62. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/CMakeLists.txt +0 -0
  63. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/LICENSE +0 -0
  64. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/README.md +0 -0
  65. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/extern/CMakeLists.txt +0 -0
  66. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/algorithms/common.hpp +0 -0
  67. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/algorithms/truck.hpp +0 -0
  68. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/box/algorithm_formatter.hpp +0 -0
  69. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/box/reduction.hpp +0 -0
  70. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/boxstacks/algorithm_formatter.hpp +0 -0
  71. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/boxstacks/reduction.hpp +0 -0
  72. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/irregular/algorithm_formatter.hpp +0 -0
  73. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/irregular/instance.hpp +0 -0
  74. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/irregular/instance_builder.hpp +0 -0
  75. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/irregular/optimize.hpp +0 -0
  76. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/irregular/post_process.hpp +0 -0
  77. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/irregular/reduction.hpp +0 -0
  78. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/irregular/solution.hpp +0 -0
  79. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/onedimensional/algorithm_formatter.hpp +0 -0
  80. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/onedimensional/instance.hpp +0 -0
  81. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/onedimensional/instance_builder.hpp +0 -0
  82. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/onedimensional/optimize.hpp +0 -0
  83. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/onedimensional/post_process.hpp +0 -0
  84. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/onedimensional/reduction.hpp +0 -0
  85. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/onedimensional/solution.hpp +0 -0
  86. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangle/algorithm_formatter.hpp +0 -0
  87. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangle/reduction.hpp +0 -0
  88. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangleguillotine/algorithm_formatter.hpp +0 -0
  89. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangleguillotine/instance.hpp +0 -0
  90. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangleguillotine/instance_builder.hpp +0 -0
  91. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangleguillotine/optimize.hpp +0 -0
  92. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangleguillotine/post_process.hpp +0 -0
  93. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangleguillotine/reduction.hpp +0 -0
  94. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/include/packingsolver/rectangleguillotine/solution.hpp +0 -0
  95. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/pyproject.toml +0 -0
  96. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/CMakeLists.txt +0 -0
  97. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/__init__.py +0 -0
  98. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/_visualize.py +0 -0
  99. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/box.py +0 -0
  100. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/boxstacks.py +0 -0
  101. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/irregular.py +0 -0
  102. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/onedimensional.py +0 -0
  103. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/rectangle.py +0 -0
  104. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/rectangleguillotine.py +0 -0
  105. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/visualize/__init__.py +0 -0
  106. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/visualize/box.py +0 -0
  107. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/visualize/boxstacks.py +0 -0
  108. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/visualize/irregular.py +0 -0
  109. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/visualize/onedimensional.py +0 -0
  110. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/visualize/rectangle.py +0 -0
  111. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/packingsolver/visualize/rectangleguillotine.py +0 -0
  112. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/common.cpp +0 -0
  113. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/common.hpp +0 -0
  114. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/irregular.cpp +0 -0
  115. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/module.cpp +0 -0
  116. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/onedimensional.cpp +0 -0
  117. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/src/rectangleguillotine.cpp +0 -0
  118. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_bin_cost.py +0 -0
  119. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_boxstacks.py +0 -0
  120. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_boxstacks_json.py +0 -0
  121. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_copies_min.py +0 -0
  122. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_doc_examples.py +0 -0
  123. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_group_weight_constraints.py +0 -0
  124. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_infeasibility.py +0 -0
  125. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_instance.py +0 -0
  126. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_irregular.py +0 -0
  127. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_item_fits.py +0 -0
  128. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_leftover_modes.py +0 -0
  129. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_onedimensional.py +0 -0
  130. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_parameters.py +0 -0
  131. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_rectangle.py +0 -0
  132. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_rectangleguillotine.py +0 -0
  133. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_visualize.py +0 -0
  134. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_visualize_box.py +0 -0
  135. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_visualize_boxstacks.py +0 -0
  136. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_visualize_irregular.py +0 -0
  137. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_visualize_onedimensional.py +0 -0
  138. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_visualize_rectangle.py +0 -0
  139. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/python/tests/test_visualize_rectangleguillotine.py +0 -0
  140. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/CMakeLists.txt +0 -0
  141. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/CMakeLists.txt +0 -0
  142. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/column_generation.hpp +0 -0
  143. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/common.cpp +0 -0
  144. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/dichotomic_search.hpp +0 -0
  145. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/dominated_items.hpp +0 -0
  146. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/meet_in_the_middle.hpp +0 -0
  147. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/sequential_value_correction.hpp +0 -0
  148. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/subset_sum_bound.hpp +0 -0
  149. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/algorithms/thread_pool.hpp +0 -0
  150. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/algorithm_formatter.cpp +0 -0
  151. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/block.cpp +0 -0
  152. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/block.hpp +0 -0
  153. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/dual_feasible_functions.cpp +0 -0
  154. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/dual_feasible_functions.hpp +0 -0
  155. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/instance_flipper.cpp +0 -0
  156. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/instance_flipper.hpp +0 -0
  157. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/reduction.cpp +0 -0
  158. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/solution_builder.cpp +0 -0
  159. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/solution_builder.hpp +0 -0
  160. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/tree_search_maximal_spaces.hpp +0 -0
  161. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/trivial.cpp +0 -0
  162. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/box/trivial.hpp +0 -0
  163. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/CMakeLists.txt +0 -0
  164. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/algorithm_formatter.cpp +0 -0
  165. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/instance_flipper.cpp +0 -0
  166. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/instance_flipper.hpp +0 -0
  167. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/reduction.cpp +0 -0
  168. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/sequential_onedimensional_rectangle.cpp +0 -0
  169. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/sequential_onedimensional_rectangle.hpp +0 -0
  170. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/solution_builder.cpp +0 -0
  171. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/boxstacks/solution_builder.hpp +0 -0
  172. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/CMakeLists.txt +0 -0
  173. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/algorithm_formatter.cpp +0 -0
  174. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/black_box_optimization/no_fit_polygon.cpp +0 -0
  175. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/black_box_optimization/no_fit_polygon.hpp +0 -0
  176. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/black_box_optimization/separator.cpp +0 -0
  177. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/black_box_optimization/separator.hpp +0 -0
  178. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/convert.cpp +0 -0
  179. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/convert.hpp +0 -0
  180. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/convert_main.cpp +0 -0
  181. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/direct_trigonometry/polygon.cpp +0 -0
  182. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/direct_trigonometry/polygon.hpp +0 -0
  183. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/direct_trigonometry/separator.cpp +0 -0
  184. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/direct_trigonometry/separator.hpp +0 -0
  185. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/fill_solution_file_main.cpp +0 -0
  186. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/instance.cpp +0 -0
  187. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/instance_builder.cpp +0 -0
  188. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/large_item_first.cpp +0 -0
  189. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/large_item_first.hpp +0 -0
  190. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/leftover.cpp +0 -0
  191. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/leftover.hpp +0 -0
  192. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/linear_programming/anchor.cpp +0 -0
  193. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/linear_programming/anchor.hpp +0 -0
  194. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/linear_programming/separation_model.cpp +0 -0
  195. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/linear_programming/separation_model.hpp +0 -0
  196. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/linear_programming/separator.cpp +0 -0
  197. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/linear_programming/separator.hpp +0 -0
  198. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/local_search.cpp +0 -0
  199. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/local_search.hpp +0 -0
  200. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/main.cpp +0 -0
  201. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/milp_raster.cpp +0 -0
  202. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/milp_raster.hpp +0 -0
  203. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/nonlinear_programming/separating_line.cpp +0 -0
  204. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/nonlinear_programming/separating_line.hpp +0 -0
  205. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/nonlinear_programming/separation_model.cpp +0 -0
  206. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/nonlinear_programming/separation_model.hpp +0 -0
  207. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/nonlinear_programming/separator.cpp +0 -0
  208. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/nonlinear_programming/separator.hpp +0 -0
  209. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/optimize.cpp +0 -0
  210. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/periodic_packing.cpp +0 -0
  211. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/periodic_packing.hpp +0 -0
  212. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/post_process.cpp +0 -0
  213. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/reduction.cpp +0 -0
  214. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/rotations.cpp +0 -0
  215. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/rotations.hpp +0 -0
  216. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/sequential_feasibility.cpp +0 -0
  217. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/sequential_feasibility.hpp +0 -0
  218. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/shape_simplification.cpp +0 -0
  219. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/shape_simplification.hpp +0 -0
  220. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/solution.cpp +0 -0
  221. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/solution_builder.cpp +0 -0
  222. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/solution_builder.hpp +0 -0
  223. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/tree_search.cpp +0 -0
  224. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/tree_search.hpp +0 -0
  225. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/tree_search_periodic_packing.cpp +0 -0
  226. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/tree_search_periodic_packing.hpp +0 -0
  227. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/trivial.cpp +0 -0
  228. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/trivial.hpp +0 -0
  229. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/irregular/utils.hpp +0 -0
  230. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/CMakeLists.txt +0 -0
  231. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/algorithm_formatter.cpp +0 -0
  232. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/dual_feasible_functions.cpp +0 -0
  233. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/dual_feasible_functions.hpp +0 -0
  234. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/dynamic_programming.cpp +0 -0
  235. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/dynamic_programming.hpp +0 -0
  236. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/instance.cpp +0 -0
  237. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/instance_builder.cpp +0 -0
  238. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/main.cpp +0 -0
  239. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/milp_assignment.cpp +0 -0
  240. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/milp_assignment.hpp +0 -0
  241. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/optimize.cpp +0 -0
  242. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/post_process.cpp +0 -0
  243. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/reduction.cpp +0 -0
  244. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/solution.cpp +0 -0
  245. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/solution_builder.cpp +0 -0
  246. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/solution_builder.hpp +0 -0
  247. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/tree_search.cpp +0 -0
  248. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/onedimensional/tree_search.hpp +0 -0
  249. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/algorithm_formatter.cpp +0 -0
  250. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/bar_relaxation.cpp +0 -0
  251. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/bar_relaxation.hpp +0 -0
  252. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/benders_decomposition.cpp +0 -0
  253. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/benders_decomposition.hpp +0 -0
  254. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/benders_decomposition_contiguity.cpp +0 -0
  255. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/benders_decomposition_contiguity.hpp +0 -0
  256. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/block.cpp +0 -0
  257. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/block.hpp +0 -0
  258. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/conservative_scales.cpp +0 -0
  259. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/conservative_scales.hpp +0 -0
  260. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/dual_feasible_functions.cpp +0 -0
  261. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/dual_feasible_functions.hpp +0 -0
  262. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/instance_flipper.cpp +0 -0
  263. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/instance_flipper.hpp +0 -0
  264. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/item_subset_incompatibility.cpp +0 -0
  265. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/item_subset_incompatibility.hpp +0 -0
  266. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/onedimentional_contiguity/milp.cpp +0 -0
  267. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/onedimentional_contiguity/milp.hpp +0 -0
  268. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/onedimentional_contiguity/tree_search.cpp +0 -0
  269. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/onedimentional_contiguity/tree_search.hpp +0 -0
  270. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/reduction.cpp +0 -0
  271. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/solution_builder.cpp +0 -0
  272. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/solution_builder.hpp +0 -0
  273. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangle/tree_search_maximal_spaces.hpp +0 -0
  274. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/CMakeLists.txt +0 -0
  275. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/algorithm_formatter.cpp +0 -0
  276. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/block.cpp +0 -0
  277. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/block.hpp +0 -0
  278. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/column_generation_strips.cpp +0 -0
  279. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/column_generation_strips.hpp +0 -0
  280. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/instance.cpp +0 -0
  281. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/instance_builder.cpp +0 -0
  282. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/instance_flipper.cpp +0 -0
  283. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/instance_flipper.hpp +0 -0
  284. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/main.cpp +0 -0
  285. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/optimize.cpp +0 -0
  286. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/post_process.cpp +0 -0
  287. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/reduction.cpp +0 -0
  288. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/sequential_feasibility.cpp +0 -0
  289. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/sequential_feasibility.hpp +0 -0
  290. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/sequential_strips_onedimensional.cpp +0 -0
  291. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/sequential_strips_onedimensional.hpp +0 -0
  292. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/solution.cpp +0 -0
  293. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/solution_builder.cpp +0 -0
  294. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/solution_builder.hpp +0 -0
  295. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/tree_search.cpp +0 -0
  296. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/tree_search.hpp +0 -0
  297. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/tree_search_hypergraph.cpp +0 -0
  298. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/tree_search_hypergraph.hpp +0 -0
  299. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/tree_search_hypergraph_infinite_copies.cpp +0 -0
  300. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/tree_search_hypergraph_infinite_copies.hpp +0 -0
  301. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/src/rectangleguillotine/tree_search_maximal_spaces.cpp +0 -0
  302. {packingsolver-0.1.1236 → packingsolver-0.1.1237}/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.1236
3
+ Version: 0.1.1237
4
4
  Summary: A solver for geometrical packing and cutting-stock problems
5
5
  Author: Florian Fontan
6
6
  License-Expression: MIT
@@ -140,11 +140,11 @@ struct Box
140
140
  };
141
141
 
142
142
  /**
143
- * Get the volume used in a bin of dimensions 'bin' whose items end at
144
- * 'x_max', 'y_max', 'z_max', for a leftover mode (see 'LeftoverMode'): the
145
- * leftover is the volume of the bin minus this volume.
143
+ * Get the box used in a bin of dimensions 'bin' whose items end at 'x_max',
144
+ * 'y_max', 'z_max', for a leftover mode (see 'LeftoverMode'): the leftover is
145
+ * the volume of the bin minus the volume of this box.
146
146
  */
147
- inline Volume leftover_mode_used_volume(
147
+ inline Box leftover_mode_used_box(
148
148
  LeftoverMode leftover_mode,
149
149
  const Box& bin,
150
150
  Length x_max,
@@ -163,9 +163,10 @@ inline Volume leftover_mode_used_volume(
163
163
  || leftover_mode == LeftoverMode::XZ
164
164
  || leftover_mode == LeftoverMode::YZ
165
165
  || leftover_mode == LeftoverMode::XYZ);
166
- return (Volume)(along_x? x_max: bin.x)
167
- * (along_y? y_max: bin.y)
168
- * (along_z? z_max: bin.z);
166
+ return {
167
+ (along_x? x_max: bin.x),
168
+ (along_y? y_max: bin.y),
169
+ (along_z? z_max: bin.z)};
169
170
  }
170
171
 
171
172
  inline bool operator==(const Box& box_1, const Box& box_2) { return box_1.x == box_2.x && box_1.y == box_2.y && box_1.z == box_2.z; }
@@ -326,6 +327,14 @@ struct Parameters
326
327
 
327
328
  /** Leftover mode (see 'LeftoverMode'). */
328
329
  LeftoverMode leftover_mode = LeftoverMode::XYZ;
330
+
331
+ /**
332
+ * For the BinPackingWithLeftovers objective, also compare the solutions
333
+ * on the sum of the leftover values of the bins and on the sum of their
334
+ * staircase leftover values, after the leftover value and the staircase
335
+ * leftover value of the last bin.
336
+ */
337
+ bool leftover_all_bins = true;
329
338
  };
330
339
 
331
340
  ////////////////////////////////////////////////////////////////////////////////
@@ -64,6 +64,9 @@ public:
64
64
  /** Set the leftover mode (see 'LeftoverMode'). */
65
65
  void set_leftover_mode(LeftoverMode leftover_mode) { instance_.parameters_.leftover_mode = leftover_mode; }
66
66
 
67
+ /** Set whether the leftover values of all the bins are compared. */
68
+ void set_leftover_all_bins(bool leftover_all_bins) { instance_.parameters_.leftover_all_bins = leftover_all_bins; }
69
+
67
70
  /** Set the feasibility callback. */
68
71
  void set_feasibility_callback(const FeasibilityCallback& feasibility_callback) { instance_.feasibility_callback_ = feasibility_callback; }
69
72
 
@@ -82,6 +85,16 @@ public:
82
85
  BinTypeId bin_type_id,
83
86
  Profit cost);
84
87
 
88
+ /**
89
+ * Set the dimensions of a bin type, overriding whatever 'add_bin_type'
90
+ * gave it. Used by the sequential feasibility algorithm to shrink a bin.
91
+ */
92
+ void set_bin_type_box(
93
+ BinTypeId bin_type_id,
94
+ Length x,
95
+ Length y,
96
+ Length z);
97
+
85
98
  /** Set the maximum weight of a bin type. */
86
99
  void set_bin_type_maximum_weight(
87
100
  BinTypeId bin_type_id,
@@ -214,12 +214,38 @@ struct OptimizeParameters: packingsolver::Parameters<Instance, Solution, Output>
214
214
  /** Guides used in the tree search algorithm. */
215
215
  std::vector<GuideId> tree_search_guides;
216
216
 
217
+ /** Directions used in the tree search algorithm; see 'TreeSearchParameters::directions'. */
218
+ std::vector<Direction> tree_search_directions;
219
+
220
+ /**
221
+ * Re-optimize the bins of the best solution at the end, for the
222
+ * BinPackingWithLeftovers objective in a not-anytime mode.
223
+ */
224
+ bool post_process = true;
225
+
226
+ /**
227
+ * The last bin is re-optimized in the post-process only if it contains
228
+ * (strictly) fewer items than this threshold.
229
+ */
230
+ ItemPos post_process_last_bin_maximum_number_of_items = 32;
231
+
217
232
  /** Threshold to consider that a bin contains "many" items. */
218
233
  Counter many_items_in_bins_threshold = 16;
219
234
 
220
235
  /** Threshold to consider that a bin contains "many" items. */
221
236
  Counter many_items_in_bins_threshold_2 = 64;
222
237
 
238
+ /**
239
+ * Threshold to consider that a bin x (resp. y, z) section - a slice of
240
+ * the bin as long along x (resp. y, z) as the mean item - contains
241
+ * "many" items, i.e. mean bin y-z (resp. x-z, x-y) area / mean item y-z
242
+ * (resp. x-z, x-y) area. Used to choose between 'tree_search' (whose
243
+ * skyline branching factor grows with how many items pack into a single
244
+ * such section) and 'tree_search_maximal_spaces' (higher overhead per
245
+ * node, but does not degrade the same way).
246
+ */
247
+ Counter many_items_in_section_threshold = 8;
248
+
223
249
  /** Factor to consider that the number of copies of items is "high". */
224
250
  Counter many_item_type_copies_factor = 1;
225
251
 
@@ -0,0 +1,56 @@
1
+ #pragma once
2
+
3
+ #include "packingsolver/box/optimize.hpp"
4
+
5
+ namespace packingsolver
6
+ {
7
+ namespace box
8
+ {
9
+
10
+ struct GroupIdenticalBinsOutput: packingsolver::Output<Instance, Solution>
11
+ {
12
+ GroupIdenticalBinsOutput(const Instance& instance):
13
+ packingsolver::Output<Instance, Solution>(instance) { }
14
+ };
15
+
16
+ /**
17
+ * Group identical bins of a solution together.
18
+ *
19
+ * Bins with the same bin type and the same items at the same positions are
20
+ * merged into a single entry with the combined copy count.
21
+ */
22
+ GroupIdenticalBinsOutput group_identical_bins(const Solution& solution);
23
+
24
+ /**
25
+ * Re-optimize the bin at 'bin_pos' of a solution, as its own single-bin
26
+ * BinPackingWithLeftovers instance, with 'optimize' and 'parameters' (its
27
+ * output and its post-process being disabled).
28
+ *
29
+ * Return the solution with that bin replaced by the re-optimized one, or the
30
+ * solution itself if the re-optimization didn't pack all the items of the
31
+ * bin.
32
+ */
33
+ Solution reoptimize_bin(
34
+ const Solution& solution,
35
+ BinPos bin_pos,
36
+ const OptimizeParameters& parameters = {});
37
+
38
+ /**
39
+ * Re-optimize each bin of a solution except the last one (see
40
+ * 'reoptimize_bin'), and keep a re-optimized bin if its leftover value is
41
+ * greater, or if its leftover value is the same and its staircase leftover
42
+ * value is greater.
43
+ *
44
+ * With the algorithms selected as for any instance, a bin with many items
45
+ * found quickly is re-optimized quickly too.
46
+ *
47
+ * The leftover values of the other bins only come after the ones of the last
48
+ * bin in the objective, so the algorithms hardly try to keep the free space
49
+ * of the other bins in a single region.
50
+ */
51
+ Solution reoptimize_non_last_bins(
52
+ const Solution& solution,
53
+ const OptimizeParameters& parameters = {});
54
+
55
+ }
56
+ }
@@ -41,6 +41,17 @@ struct SolutionBin
41
41
 
42
42
  /** Resource consumption, indexed by resource_id. */
43
43
  std::vector<double> resource_consumption;
44
+
45
+ /** Leftover value of the bin (see 'LeftoverMode'). */
46
+ Volume leftover_value = 0;
47
+
48
+ /**
49
+ * Staircase leftover value of the bin: the volume of the bin which is not
50
+ * dominated by an item. An item dominates the points of the box between
51
+ * the origin of the bin and its opposite corner (see 'LeftoverMode' for
52
+ * the dimensions of the bin which are not considered).
53
+ */
54
+ Volume staircase_leftover_value = 0;
44
55
  };
45
56
 
46
57
  bool operator==(const SolutionBin& solution_bin_1, const SolutionBin& solution_bin_2);
@@ -203,6 +214,18 @@ public:
203
214
  /** Get the area of the solution. */
204
215
  inline Profit leftover_value() const { return leftover_value_; }
205
216
 
217
+ /** Get the staircase leftover value of the last bin of the solution. */
218
+ inline Volume staircase_leftover_value() const { return staircase_leftover_value_; }
219
+
220
+ /** Get the sum of the leftover values of the bins of the solution. */
221
+ inline Volume total_leftover_value() const { return total_leftover_value_; }
222
+
223
+ /**
224
+ * Get the sum of the staircase leftover values of the bins of the
225
+ * solution.
226
+ */
227
+ inline Volume total_staircase_leftover_value() const { return total_staircase_leftover_value_; }
228
+
206
229
  /** Get the volume of the solution. */
207
230
  inline Volume volume() const { return volume_; }
208
231
 
@@ -306,6 +329,15 @@ private:
306
329
  /** Value of the leftover. */
307
330
  Profit leftover_value_ = 0.0;
308
331
 
332
+ /** Staircase leftover value of the last bin. */
333
+ Volume staircase_leftover_value_ = 0;
334
+
335
+ /** Sum of the leftover values of the bins. */
336
+ Volume total_leftover_value_ = 0;
337
+
338
+ /** Sum of the staircase leftover values of the bins. */
339
+ Volume total_staircase_leftover_value_ = 0;
340
+
309
341
  /** Total volume of the bins of the solution. */
310
342
  Volume bin_volume_ = 0;
311
343
 
@@ -111,6 +111,23 @@ std::ostream& operator<<(
111
111
  std::ostream& os,
112
112
  Box box);
113
113
 
114
+ /**
115
+ * Get the box used in a bin of dimensions 'bin' whose stacks end at 'x_max'
116
+ * and 'y_max', for a leftover mode (see 'LeftoverMode'): the leftover is the
117
+ * volume of the bin minus the volume of this box.
118
+ */
119
+ inline Box leftover_mode_used_box(
120
+ LeftoverMode leftover_mode,
121
+ const Box& bin,
122
+ Length x_max,
123
+ Length y_max)
124
+ {
125
+ return {
126
+ (leftover_mode == LeftoverMode::Y)? bin.x: x_max,
127
+ (leftover_mode == LeftoverMode::X)? bin.y: y_max,
128
+ bin.z};
129
+ }
130
+
114
131
  ////////////////////////////////////////////////////////////////////////////////
115
132
  ///////////////////////// Item type, Bin type, Defect //////////////////////////
116
133
  ////////////////////////////////////////////////////////////////////////////////
@@ -357,6 +374,14 @@ struct Parameters
357
374
  /** Leftover mode (see 'LeftoverMode'). */
358
375
  LeftoverMode leftover_mode = LeftoverMode::XY;
359
376
 
377
+ /**
378
+ * For the BinPackingWithLeftovers objective, also compare the solutions
379
+ * on the sum of the leftover values of the bins and on the sum of their
380
+ * staircase leftover values, after the leftover value and the staircase
381
+ * leftover value of the last bin.
382
+ */
383
+ bool leftover_all_bins = true;
384
+
360
385
  /**
361
386
  * 'true' iff weight constraints must be satisfied for all items belonging
362
387
  * to a larger or equal group.
@@ -78,6 +78,9 @@ public:
78
78
  /** Set the leftover mode (see 'LeftoverMode'). */
79
79
  void set_leftover_mode(LeftoverMode leftover_mode) { instance_.parameters_.leftover_mode = leftover_mode; }
80
80
 
81
+ /** Set whether the leftover values of all the bins are compared. */
82
+ void set_leftover_all_bins(bool leftover_all_bins) { instance_.parameters_.leftover_all_bins = leftover_all_bins; }
83
+
81
84
  /*
82
85
  * Set bin types
83
86
  */
@@ -186,6 +186,18 @@ struct OptimizeParameters: packingsolver::Parameters<Instance, Solution, Output>
186
186
  /** Guides used in the tree search algorithm. */
187
187
  std::vector<GuideId> tree_search_guides;
188
188
 
189
+ /**
190
+ * Re-optimize the bins of the best solution at the end, for the
191
+ * BinPackingWithLeftovers objective in a not-anytime mode.
192
+ */
193
+ bool post_process = true;
194
+
195
+ /**
196
+ * The last bin is re-optimized in the post-process only if it contains
197
+ * (strictly) fewer items than this threshold.
198
+ */
199
+ ItemPos post_process_last_bin_maximum_number_of_items = 32;
200
+
189
201
  /**
190
202
  * Threshold to consider that a bin contains "many" items - see the
191
203
  * automatic selection between 'use_sequential_single_knapsack' and
@@ -0,0 +1,56 @@
1
+ #pragma once
2
+
3
+ #include "packingsolver/boxstacks/optimize.hpp"
4
+
5
+ namespace packingsolver
6
+ {
7
+ namespace boxstacks
8
+ {
9
+
10
+ struct GroupIdenticalBinsOutput: packingsolver::Output<Instance, Solution>
11
+ {
12
+ GroupIdenticalBinsOutput(const Instance& instance):
13
+ packingsolver::Output<Instance, Solution>(instance) { }
14
+ };
15
+
16
+ /**
17
+ * Group identical bins of a solution together.
18
+ *
19
+ * Bins with the same bin type and the same stacks at the same positions are
20
+ * merged into a single entry with the combined copy count.
21
+ */
22
+ GroupIdenticalBinsOutput group_identical_bins(const Solution& solution);
23
+
24
+ /**
25
+ * Re-optimize the bin at 'bin_pos' of a solution, as its own single-bin
26
+ * BinPackingWithLeftovers instance, with 'optimize' and 'parameters' (its
27
+ * output and its post-process being disabled).
28
+ *
29
+ * Return the solution with that bin replaced by the re-optimized one, or the
30
+ * solution itself if the re-optimization didn't pack all the items of the
31
+ * bin.
32
+ */
33
+ Solution reoptimize_bin(
34
+ const Solution& solution,
35
+ BinPos bin_pos,
36
+ const OptimizeParameters& parameters = {});
37
+
38
+ /**
39
+ * Re-optimize each bin of a solution except the last one (see
40
+ * 'reoptimize_bin'), and keep a re-optimized bin if its leftover value is
41
+ * greater, or if its leftover value is the same and its staircase leftover
42
+ * value is greater.
43
+ *
44
+ * With the algorithms selected as for any instance, a bin with many items
45
+ * found quickly is re-optimized quickly too.
46
+ *
47
+ * The leftover values of the other bins only come after the ones of the last
48
+ * bin in the objective, so the algorithms hardly try to keep the free space
49
+ * of the other bins in a single region.
50
+ */
51
+ Solution reoptimize_non_last_bins(
52
+ const Solution& solution,
53
+ const OptimizeParameters& parameters = {});
54
+
55
+ }
56
+ }
@@ -84,6 +84,18 @@ struct SolutionBin
84
84
 
85
85
  /** Profit. */
86
86
  Profit profit = 0.0;
87
+
88
+ /** Leftover value of the bin (see 'LeftoverMode'). */
89
+ Volume leftover_value = 0;
90
+
91
+ /**
92
+ * Staircase leftover value of the bin: the volume of the bin which is not
93
+ * dominated by a stack. A stack dominates the points of the box between
94
+ * the origin of the bin and its opposite corner, over the whole height
95
+ * of the bin (see 'LeftoverMode' for the dimensions of the bin which are
96
+ * not considered).
97
+ */
98
+ Volume staircase_leftover_value = 0;
87
99
  };
88
100
 
89
101
  bool operator==(const SolutionBin& solution_bin_1, const SolutionBin& solution_bin_2);
@@ -277,6 +289,18 @@ public:
277
289
  */
278
290
  inline Volume leftover_value() const { return bin_volume_ - volume_; }
279
291
 
292
+ /** Get the staircase leftover value of the last bin of the solution. */
293
+ inline Volume staircase_leftover_value() const { return staircase_leftover_value_; }
294
+
295
+ /** Get the sum of the leftover values of the bins of the solution. */
296
+ inline Volume total_leftover_value() const { return total_leftover_value_; }
297
+
298
+ /**
299
+ * Get the sum of the staircase leftover values of the bins of the
300
+ * solution.
301
+ */
302
+ inline Volume total_staircase_leftover_value() const { return total_staircase_leftover_value_; }
303
+
280
304
  /** Get the fraction of waste of the solution. */
281
305
  inline double waste_percentage() const { return (volume() == 0)? 0: (double)waste() / volume(); }
282
306
 
@@ -397,6 +421,15 @@ private:
397
421
  /** Total volume of the solution. */
398
422
  Volume volume_ = 0;
399
423
 
424
+ /** Staircase leftover value of the last bin. */
425
+ Volume staircase_leftover_value_ = 0;
426
+
427
+ /** Sum of the leftover values of the bins. */
428
+ Volume total_leftover_value_ = 0;
429
+
430
+ /** Sum of the staircase leftover values of the bins. */
431
+ Volume total_staircase_leftover_value_ = 0;
432
+
400
433
  /** Total volume of the bins of the solution. */
401
434
  Volume bin_volume_ = 0;
402
435
 
@@ -314,6 +314,14 @@ struct Parameters
314
314
  /** How the leftover value is defined for BinPackingWithLeftovers. */
315
315
  LeftoverMode leftover_mode = LeftoverMode::Area;
316
316
 
317
+ /**
318
+ * For the BinPackingWithLeftovers objective, also compare the solutions
319
+ * on the sum of the leftover values of the bins and on the sum of their
320
+ * staircase leftover values, after the leftover value and the staircase
321
+ * leftover value of the last bin.
322
+ */
323
+ bool leftover_all_bins = true;
324
+
317
325
  /**
318
326
  * 'true' iff weight constraints must be satisfied for all items belonging
319
327
  * to a larger or equal group.
@@ -76,6 +76,9 @@ public:
76
76
 
77
77
  void set_leftover_mode(LeftoverMode leftover_mode) { instance_.parameters_.leftover_mode = leftover_mode; }
78
78
 
79
+ /** Set whether the leftover values of all the bins are compared. */
80
+ void set_leftover_all_bins(bool leftover_all_bins) { instance_.parameters_.leftover_all_bins = leftover_all_bins; }
81
+
79
82
  /*
80
83
  * Set bin types
81
84
  */
@@ -226,6 +226,18 @@ struct OptimizeParameters: packingsolver::Parameters<Instance, Solution, Output>
226
226
  /** Guides used in the tree search algorithm. */
227
227
  std::vector<GuideId> tree_search_guides;
228
228
 
229
+ /**
230
+ * Re-optimize the bins of the best solution at the end, for the
231
+ * BinPackingWithLeftovers objective in a not-anytime mode.
232
+ */
233
+ bool post_process = true;
234
+
235
+ /**
236
+ * The last bin is re-optimized with the tree search in the post-process
237
+ * only if it contains (strictly) fewer items than this threshold.
238
+ */
239
+ ItemPos post_process_last_bin_maximum_number_of_items = 32;
240
+
229
241
  /** Directions used in the tree search algorithm; see 'TreeSearchParameters::directions'. */
230
242
  std::vector<Direction> tree_search_directions;
231
243
 
@@ -0,0 +1,56 @@
1
+ #pragma once
2
+
3
+ #include "packingsolver/rectangle/optimize.hpp"
4
+
5
+ namespace packingsolver
6
+ {
7
+ namespace rectangle
8
+ {
9
+
10
+ struct GroupIdenticalBinsOutput: packingsolver::Output<Instance, Solution>
11
+ {
12
+ GroupIdenticalBinsOutput(const Instance& instance):
13
+ packingsolver::Output<Instance, Solution>(instance) { }
14
+ };
15
+
16
+ /**
17
+ * Group identical bins of a solution together.
18
+ *
19
+ * Bins with the same bin type and the same items at the same positions are
20
+ * merged into a single entry with the combined copy count.
21
+ */
22
+ GroupIdenticalBinsOutput group_identical_bins(const Solution& solution);
23
+
24
+ /**
25
+ * Re-optimize the bin at 'bin_pos' of a solution, as its own single-bin
26
+ * BinPackingWithLeftovers instance, with 'optimize' and 'parameters' (its
27
+ * output and its post-process being disabled).
28
+ *
29
+ * Return the solution with that bin replaced by the re-optimized one, or the
30
+ * solution itself if the re-optimization didn't pack all the items of the
31
+ * bin.
32
+ */
33
+ Solution reoptimize_bin(
34
+ const Solution& solution,
35
+ BinPos bin_pos,
36
+ const OptimizeParameters& parameters = {});
37
+
38
+ /**
39
+ * Re-optimize each bin of a solution except the last one (see
40
+ * 'reoptimize_bin'), and keep a re-optimized bin if its leftover value is
41
+ * greater, or if its leftover value is the same and its staircase leftover
42
+ * value is greater.
43
+ *
44
+ * With the algorithms selected as for any instance, a bin with many items
45
+ * found quickly is re-optimized quickly too.
46
+ *
47
+ * The leftover values of the other bins only come after the ones of the last
48
+ * bin in the objective, so the algorithms hardly try to keep the free space
49
+ * of the other bins in a single region.
50
+ */
51
+ Solution reoptimize_non_last_bins(
52
+ const Solution& solution,
53
+ const OptimizeParameters& parameters = {});
54
+
55
+ }
56
+ }
@@ -46,6 +46,18 @@ struct SolutionBin
46
46
 
47
47
  /** Resource consumption, indexed by resource_id. */
48
48
  std::vector<double> resource_consumption;
49
+
50
+ /** Leftover value of the bin (see 'LeftoverMode'). */
51
+ Area leftover_value = 0;
52
+
53
+ /**
54
+ * Staircase leftover value of the bin: the area of the bin which is not
55
+ * dominated by an item. An item dominates the points of the rectangle
56
+ * between the bottom-left corner of the bin and its top-right corner
57
+ * (see 'LeftoverMode' for the sides of the bin which are not
58
+ * considered).
59
+ */
60
+ Area staircase_leftover_value = 0;
49
61
  };
50
62
 
51
63
  bool operator==(const SolutionBin& solution_bin_1, const SolutionBin& solution_bin_2);
@@ -192,6 +204,18 @@ public:
192
204
  */
193
205
  inline Profit leftover_value() const { return leftover_value_; }
194
206
 
207
+ /** Get the staircase leftover value of the last bin of the solution. */
208
+ inline Area staircase_leftover_value() const { return staircase_leftover_value_; }
209
+
210
+ /** Get the sum of the leftover values of the bins of the solution. */
211
+ inline Area total_leftover_value() const { return total_leftover_value_; }
212
+
213
+ /**
214
+ * Get the sum of the staircase leftover values of the bins of the
215
+ * solution.
216
+ */
217
+ inline Area total_staircase_leftover_value() const { return total_staircase_leftover_value_; }
218
+
195
219
  /**
196
220
  * Get the area used by the solution: the area of the bins minus the
197
221
  * leftover.
@@ -293,6 +317,15 @@ private:
293
317
  /** Value of the leftover: an area (see 'LeftoverMode'). */
294
318
  Profit leftover_value_ = 0.0;
295
319
 
320
+ /** Staircase leftover value of the last bin. */
321
+ Area staircase_leftover_value_ = 0;
322
+
323
+ /** Sum of the leftover values of the bins. */
324
+ Area total_leftover_value_ = 0;
325
+
326
+ /** Sum of the staircase leftover values of the bins. */
327
+ Area total_staircase_leftover_value_ = 0;
328
+
296
329
  /** Total area of the bins of the solution. */
297
330
  Area bin_area_ = 0;
298
331
 
@@ -0,0 +1 @@
1
+ __version__ = "0.1.1237"
@@ -145,6 +145,7 @@ void bind_box(nb::module_& m)
145
145
  .def("read_item_types", &InstanceBuilder::read_item_types, nb::arg("items_path"))
146
146
  .def("set_weight_tolerance", &InstanceBuilder::set_weight_tolerance, nb::arg("weight_tolerance"))
147
147
  .def("set_leftover_mode", &InstanceBuilder::set_leftover_mode, nb::arg("leftover_mode"))
148
+ .def("set_leftover_all_bins", &InstanceBuilder::set_leftover_all_bins, nb::arg("leftover_all_bins"))
148
149
  // Bin types.
149
150
  .def("add_bin_type",
150
151
  [](InstanceBuilder& instance_builder,
@@ -214,6 +214,7 @@ void bind_boxstacks(nb::module_& m)
214
214
  nb::arg("group_id"), nb::arg("check_weight_constraints"))
215
215
  .def("set_unloading_constraint", &InstanceBuilder::set_unloading_constraint, nb::arg("unloading_constraint"))
216
216
  .def("set_leftover_mode", &InstanceBuilder::set_leftover_mode, nb::arg("leftover_mode"))
217
+ .def("set_leftover_all_bins", &InstanceBuilder::set_leftover_all_bins, nb::arg("leftover_all_bins"))
217
218
  // Bin types.
218
219
  .def("add_bin_type",
219
220
  [](InstanceBuilder& instance_builder,
@@ -115,6 +115,7 @@ void bind_rectangle(nb::module_& m)
115
115
  nb::arg("group_id"), nb::arg("check_weight_constraints"))
116
116
  .def("set_unloading_constraint", &InstanceBuilder::set_unloading_constraint, nb::arg("unloading_constraint"))
117
117
  .def("set_leftover_mode", &InstanceBuilder::set_leftover_mode, nb::arg("leftover_mode"))
118
+ .def("set_leftover_all_bins", &InstanceBuilder::set_leftover_all_bins, nb::arg("leftover_all_bins"))
118
119
  // Bin types.
119
120
  .def("add_bin_type",
120
121
  [](InstanceBuilder& instance_builder,
@@ -217,6 +217,8 @@ RENAMED = {
217
217
  NOT_BOUND = {
218
218
  "add_bin_type_resource":
219
219
  "creates a resource with its own id; kept as a builder method",
220
+ "set_bin_type_box":
221
+ "the dimensions are the positional arguments of add_bin_type",
220
222
  "set_item_type_box":
221
223
  "the dimensions are the positional arguments of add_item_type",
222
224
  }