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.
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/PKG-INFO +1 -1
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/optimize.hpp +9 -0
- packingsolver-0.1.1245/python/packingsolver/_version.py +1 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/irregular.cpp +2 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/CMakeLists.txt +4 -0
- packingsolver-0.1.1245/src/irregular/empty_spaces.cpp +156 -0
- packingsolver-0.1.1245/src/irregular/empty_spaces.hpp +82 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/main.cpp +6 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/optimize.cpp +43 -0
- packingsolver-0.1.1245/src/irregular/trapezoid_set.cpp +665 -0
- packingsolver-0.1.1245/src/irregular/trapezoid_set.hpp +212 -0
- packingsolver-0.1.1245/src/irregular/trapezoid_slider.cpp +154 -0
- packingsolver-0.1.1245/src/irregular/trapezoid_slider.hpp +233 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search.cpp +114 -1049
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search.hpp +3 -138
- packingsolver-0.1.1245/src/irregular/tree_search_maximal_spaces.cpp +1017 -0
- packingsolver-0.1.1245/src/irregular/tree_search_maximal_spaces.hpp +499 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search_periodic_packing.cpp +2 -81
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/tree_search_periodic_packing.hpp +3 -46
- packingsolver-0.1.1237/python/packingsolver/_version.py +0 -1
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/LICENSE +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/README.md +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/extern/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/algorithms/common.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/algorithms/truck.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/algorithm_formatter.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/instance.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/instance_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/optimize.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/post_process.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/reduction.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/box/solution.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/algorithm_formatter.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/instance.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/instance_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/optimize.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/post_process.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/reduction.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/boxstacks/solution.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/algorithm_formatter.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/instance.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/instance_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/post_process.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/reduction.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/solution.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/algorithm_formatter.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/instance.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/instance_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/optimize.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/post_process.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/reduction.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/onedimensional/solution.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/algorithm_formatter.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/instance.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/instance_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/optimize.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/post_process.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/reduction.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangle/solution.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/algorithm_formatter.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/instance.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/instance_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/optimize.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/post_process.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/reduction.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/rectangleguillotine/solution.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/pyproject.toml +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/__init__.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/_visualize.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/box.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/boxstacks.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/irregular.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/onedimensional.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/rectangle.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/rectangleguillotine.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/__init__.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/box.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/boxstacks.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/irregular.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/onedimensional.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/rectangle.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/packingsolver/visualize/rectangleguillotine.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/box.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/boxstacks.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/common.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/common.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/module.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/onedimensional.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/rectangle.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/src/rectangleguillotine.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_bin_cost.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_box.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_boxstacks.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_boxstacks_json.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_copies_min.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_doc_examples.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_group_weight_constraints.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_infeasibility.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_instance.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_irregular.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_item_fits.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_leftover_modes.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_onedimensional.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_parameters.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_rectangle.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_rectangleguillotine.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_box.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_boxstacks.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_irregular.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_onedimensional.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_rectangle.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/python/tests/test_visualize_rectangleguillotine.py +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/column_generation.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/common.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/dichotomic_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/dominated_items.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/meet_in_the_middle.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/sequential_value_correction.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/staircase.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/subset_sum_bound.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/algorithms/thread_pool.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/algorithm_formatter.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/block.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/block.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/dual_feasible_functions.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/dual_feasible_functions.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance_flipper.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/instance_flipper.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/main.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/optimize.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/post_process.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/reduction.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/sequential_feasibility.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/sequential_feasibility.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/solution.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/solution_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/solution_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search_maximal_spaces.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/tree_search_maximal_spaces.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/trivial.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/box/trivial.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/algorithm_formatter.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance_flipper.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/instance_flipper.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/main.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/optimize.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/post_process.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/reduction.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/sequential_onedimensional_rectangle.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/sequential_onedimensional_rectangle.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/solution.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/solution_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/solution_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/tree_search.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/boxstacks/tree_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/algorithm_formatter.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/no_fit_polygon.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/no_fit_polygon.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/separator.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/black_box_optimization/separator.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/convert.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/convert.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/convert_main.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/polygon.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/polygon.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/separator.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/direct_trigonometry/separator.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/fill_solution_file_main.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/instance.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/instance_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/large_item_first.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/large_item_first.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/leftover.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/leftover.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/anchor.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/anchor.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separation_model.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separation_model.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separator.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/linear_programming/separator.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/local_search.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/local_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/milp_raster.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/milp_raster.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separating_line.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separating_line.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separation_model.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separation_model.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separator.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/nonlinear_programming/separator.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/periodic_packing.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/periodic_packing.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/post_process.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/reduction.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/rotations.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/rotations.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/sequential_feasibility.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/sequential_feasibility.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/shape_simplification.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/shape_simplification.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/solution.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/solution_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/solution_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/trivial.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/trivial.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/irregular/utils.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/algorithm_formatter.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dual_feasible_functions.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dual_feasible_functions.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dynamic_programming.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/dynamic_programming.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/instance.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/instance_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/main.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/milp_assignment.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/milp_assignment.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/optimize.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/post_process.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/reduction.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/solution.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/solution_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/solution_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/tree_search.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/onedimensional/tree_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/algorithm_formatter.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/bar_relaxation.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/bar_relaxation.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition_contiguity.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/benders_decomposition_contiguity.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/block.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/block.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/conservative_scales.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/conservative_scales.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/dual_feasible_functions.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/dual_feasible_functions.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance_flipper.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/instance_flipper.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/item_subset_incompatibility.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/item_subset_incompatibility.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/main.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/milp.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/milp.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/tree_search.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/onedimentional_contiguity/tree_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/optimize.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/post_process.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/reduction.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/sequential_feasibility.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/sequential_feasibility.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/solution.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/solution_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/solution_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search_maximal_spaces.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangle/tree_search_maximal_spaces.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/CMakeLists.txt +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/algorithm_formatter.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/block.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/block.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/column_generation_strips.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/column_generation_strips.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance_flipper.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/instance_flipper.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/main.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/optimize.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/post_process.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/reduction.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_feasibility.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_feasibility.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_strips_onedimensional.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/sequential_strips_onedimensional.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/solution.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/solution_builder.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/solution_builder.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph_infinite_copies.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_hypergraph_infinite_copies.hpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_maximal_spaces.cpp +0 -0
- {packingsolver-0.1.1237 → packingsolver-0.1.1245}/src/rectangleguillotine/tree_search_maximal_spaces.hpp +0 -0
{packingsolver-0.1.1237 → packingsolver-0.1.1245}/include/packingsolver/irregular/optimize.hpp
RENAMED
|
@@ -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());
|