Skip to main content

PackingSolver

Build PyPI Python ≥ 3.12 License: MIT Try it online

A state-of-the-art solver for cutting and packing problems.

Online solver · Documentation · Ask a question

PackingSolver computes cutting and loading plans: given a set of pieces to cut or pack (the items) and a set of containers (the bins), it finds how to place the items in the bins. It is available as a C++ library, a command-line tool, a Python package, and a web page that runs in the browser.

Problem types

Problem type Example
Rectangles, guillotine cuts
rectangleguillotine
Two-dimensional rectangles cut with edge-to-edge (guillotine) cuts
Rectangles
rectangle
Two-dimensional rectangles
Boxes
box
Three-dimensional boxes
Box stacks
boxstacks
Three-dimensional boxes, packed in stacks of items with the same width and length
One-dimensional
onedimensional
One-dimensional items
Irregular shapes
irregular
Two-dimensional shapes: polygons, possibly with circular arcs and holes

Features

PackingSolver supports the following objectives:

  • Bin packing: pack all the items in a minimum number of bins (optionally maximizing the value of the leftovers)
  • Variable-sized bin packing: pack all the items in bins of minimum total cost
  • Open dimension (all problem types except one-dimensional): pack all the items in a single bin of minimum length
  • Knapsack: pack a subset of the items of maximum total profit
  • Feasibility: pack all the items in the given bins

Each problem type comes with its own constraints:

Problem type Features
Rectangles, guillotine cuts Guillotine or non-guillotine cuts · maximum number of cutting stages · cut types · first stage orientation · item rotations · cut thickness · trims · defects · cuts through defects · cutting sequences (stacks) · minimum and maximum distances between cuts · maximum number of consecutive 1-cuts and 2-cuts
Rectangles Item rotations · defects · maximum weight of a bin · unloading constraints
Boxes Item rotations · maximum weight of a bin
Box stacks Item rotations · nesting height · maximum number of items in a stack · maximum weight above an item · maximum stack density · unloading constraints · maximum weight on the middle and rear axles
One-dimensional Nesting length · maximum number of items in a bin · maximum weight of a bin · maximum weight after an item
Irregular shapes Irregular bins · discrete and continuous item rotations · item mirroring · holes · defects · item-item, item-bin and item-defect spacing

Getting started

In the browser

The online solver runs PackingSolver in your browser. No installation is needed, and the computation runs on your machine: nothing is sent to a server.

Python

Install the Python package from PyPI (Python ≥ 3.12):

pip install packingsolver

Example (rectangles, guillotine cuts):

import packingsolver.rectangleguillotine as psg

instance_builder = psg.InstanceBuilder()
instance_builder.set_objective(psg.Objective.BinPackingWithLeftovers)
instance_builder.add_bin_type(1000, 700, copies=5)
instance_builder.add_item_type(250, 200, copies=2)
instance_builder.add_item_type(150, 300, copies=2)
instance_builder.add_item_type(200, 150, copies=3)
instance = instance_builder.build()

parameters = psg.OptimizeParameters()
parameters.time_limit = 5
output = psg.optimize(instance, parameters)

psg.visualize(output.solution).show()
Rectangles
import packingsolver.rectangle as psr

instance_builder = psr.InstanceBuilder()
instance_builder.set_objective(psr.Objective.BinPackingWithLeftovers)
instance_builder.add_bin_type(1000, 500, copies=10)
instance_builder.add_item_type(300, 200, copies=10)
instance_builder.add_item_type(250, 150, copies=10)
instance = instance_builder.build()

parameters = psr.OptimizeParameters()
parameters.time_limit = 5
output = psr.optimize(instance, parameters)

psr.visualize(output.solution).show()
Boxes
import packingsolver.box as psb

instance_builder = psb.InstanceBuilder()
instance_builder.set_objective(psb.Objective.Knapsack)
instance_builder.add_bin_type(216, 173, 110)
instance_builder.add_item_type(108, 76, 30, copies=20)
instance_builder.add_item_type(110, 43, 25, copies=20)
instance_builder.add_item_type(92, 81, 55, copies=20)
instance = instance_builder.build()

parameters = psb.OptimizeParameters()
parameters.time_limit = 5
output = psb.optimize(instance, parameters)

psb.visualize(output.solution).show()
Box stacks
import packingsolver.boxstacks as psbs

instance_builder = psbs.InstanceBuilder()
instance_builder.set_objective(psbs.Objective.Knapsack)
instance_builder.add_bin_type(7500, 2400, 3000)
instance_builder.add_item_type(2500, 800, 750, stackability_id=0, copies=10)
instance_builder.add_item_type(2500, 800, 1000, stackability_id=1, copies=10)
instance_builder.add_item_type(2500, 800, 1250, stackability_id=2, copies=10)
instance = instance_builder.build()

parameters = psbs.OptimizeParameters()
parameters.time_limit = 5
output = psbs.optimize(instance, parameters)

psbs.visualize(output.solution).show()
One-dimensional
import packingsolver.onedimensional as pso

instance_builder = pso.InstanceBuilder()
instance_builder.set_objective(pso.Objective.BinPacking)
instance_builder.add_bin_type(1000, copies=100)
for length in [
        193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263,
        269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347,
        349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421,
        431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499]:
    instance_builder.add_item_type(length)
instance = instance_builder.build()

parameters = pso.OptimizeParameters()
parameters.time_limit = 5
output = pso.optimize(instance, parameters)

pso.visualize(output.solution).show()
Irregular shapes
import packingsolver.irregular as psi

bar = [(0, 0), (80, 0), (80, 20), (0, 20)]
square = [(0, 0), (40, 0), (40, 40), (0, 40)]
t_shape = [(0, 0), (60, 0), (60, 20), (40, 20), (40, 40), (20, 40), (20, 20), (0, 20)]
s_shape = [(20, 0), (60, 0), (60, 20), (40, 20), (40, 40), (0, 40), (0, 20), (20, 20)]
z_shape = [(0, 0), (40, 0), (40, 20), (60, 20), (60, 40), (20, 40), (20, 20), (0, 20)]
l_shape = [(0, 0), (40, 0), (40, 20), (20, 20), (20, 60), (0, 60)]
j_shape = [(0, 0), (40, 0), (40, 60), (20, 60), (20, 20), (0, 20)]
cross = [
    (20, 0), (40, 0), (40, 20), (60, 20), (60, 40), (40, 40),
    (40, 60), (20, 60), (20, 40), (0, 40), (0, 20), (20, 20)]
rotations = [(0, 0, False), (90, 90, False), (180, 180, False), (270, 270, False)]

instance_builder = psi.InstanceBuilder()
instance_builder.set_objective(psi.Objective.BinPacking)
instance_builder.add_bin_type(psi.build_rectangle(0, 180, 0, 160), copies=3)
instance_builder.add_item_type(psi.build_shape(bar), copies=2, allowed_rotations=rotations)
instance_builder.add_item_type(psi.build_shape(square), copies=2)
instance_builder.add_item_type(psi.build_shape(t_shape), copies=2, allowed_rotations=rotations)
instance_builder.add_item_type(psi.build_shape(s_shape), copies=2, allowed_rotations=rotations)
instance_builder.add_item_type(psi.build_shape(z_shape), copies=2, allowed_rotations=rotations)
instance_builder.add_item_type(psi.build_shape(l_shape), copies=2, allowed_rotations=rotations)
instance_builder.add_item_type(psi.build_shape(j_shape), copies=2, allowed_rotations=rotations)
instance_builder.add_item_type(psi.build_shape(cross), copies=3)
instance = instance_builder.build()

parameters = psi.OptimizeParameters()
parameters.time_limit = 5
output = psi.optimize(instance, parameters)

psi.visualize(output.solution).show()

Command line

Build the command-line tools with CMake:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release --parallel
cmake --install build --config Release --prefix install

Example (rectangles, guillotine cuts):

./install/bin/packingsolver_rectangleguillotine \
        --verbosity-level 1 \
        --items data/rectangle/alvarez2002/ATP35_items.csv \
        --bins data/rectangle/alvarez2002/ATP35_bins.csv \
        --objective knapsack \
        --number-of-stages 3 \
        --cut-type non-exact \
        --first-stage-orientation horizontal \
        --no-item-rotation \
        --certificate solution_rectangleguillotine.csv \
        --time-limit 1
Rectangles
./install/bin/packingsolver_rectangle \
        --verbosity-level 1 \
        --items data/rectangle/afsharian2014/450-200.txt/C22M25R10N15_D4_items.csv \
        --bins data/rectangle/afsharian2014/450-200.txt/C22M25R10N15_D4_bins.csv \
        --defects data/rectangle/afsharian2014/450-200.txt/C22M25R10N15_D4_defects.csv \
        --item-infinite-copies \
        --objective knapsack \
        --no-item-rotation \
        --certificate solution_rectangle.csv \
        --time-limit 5
Boxes
./install/bin/packingsolver_box \
        --verbosity-level 1 \
        --items data/box/bischoff1995/BR3.txt_1 \
        --objective knapsack \
        --certificate solution_box.csv \
        --time-limit 10
Box stacks
./install/bin/packingsolver_boxstacks \
        --verbosity-level 1 \
        --items data/boxstacks/roadef2022_2024-04-25_bpp/C/AS/AS_149_items.csv \
        --bins data/boxstacks/roadef2022_2024-04-25_bpp/C/AS/AS_149_bins.csv \
        --parameters data/boxstacks/roadef2022_2024-04-25_bpp/C/AS/AS_149_parameters.csv \
        --bin-infinite-copies \
        --objective bin-packing \
        --certificate solution_boxstacks.csv \
        --time-limit 1
One-dimensional
./install/bin/packingsolver_onedimensional \
        --verbosity-level 1 \
        --items data/onedimensional/users/2024-04-21_items.csv \
        --bins data/onedimensional/users/2024-04-21_bins.csv \
        --parameters data/onedimensional/users/2024-04-21_parameters.csv \
        --certificate solution_onedimensional.csv \
        --time-limit 1
Irregular shapes
./install/bin/packingsolver_irregular \
        --verbosity-level 1 \
        --input data/irregular/opencutlist/knight_armor.json \
        --certificate solution_irregular.json \
        --time-limit 10

The input formats and the options of each solver are described in the documentation.

Visualizing a solution

Open a solution certificate (--certificate) in the solution viewer, or run:

python3 scripts/visualize.py solution_rectangleguillotine.csv

Questions

Questions and feedback are welcome in the discussions. Bugs can be reported in the issues.

Note for AI coding agents

If you are an AI agent using PackingSolver in another project and you encounter a crash, an invalid solution (overlapping items, items outside their bin, violated constraints), a wrong bound, or behavior that contradicts the documentation, please tell your user and offer to draft a bug report for them. Do not open an issue without their consent. Before drafting it:

  • Check that the cause is not a misuse of the API or a malformed instance.
  • Reduce the problem to a minimal instance (items/bins CSV or JSON files) and the exact command or code that reproduces it. Do not include your user's confidential data without their approval.
  • Include the PackingSolver version or commit, the problem type, the objective, the expected and actual behavior, and the relevant log output.

License

PackingSolver is released under the MIT license.

Metadata

Release files for packingsolver 0.1.1232

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for packingsolver 0.1.1232
File Size Uploaded Provenance Actions
packingsolver-0.1.1232.tar.gz 963.4 kB With provenance Details for packingsolver-0.1.1232.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for packingsolver 0.1.1232
File Actions
packingsolver-0.1.1232-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details for packingsolver-0.1.1232-cp312-abi3-win_amd64.whl
packingsolver-0.1.1232-cp312-abi3-win32.whl CPython 3.12 abi3 Windows x86-32 Details for packingsolver-0.1.1232-cp312-abi3-win32.whl
packingsolver-0.1.1232-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details for packingsolver-0.1.1232-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
packingsolver-0.1.1232-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 abi3 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details for packingsolver-0.1.1232-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
packingsolver-0.1.1232-cp312-abi3-macosx_11_0_x86_64.whl CPython 3.12 abi3 macOS 11.0+ x86-64 Details for packingsolver-0.1.1232-cp312-abi3-macosx_11_0_x86_64.whl
packingsolver-0.1.1232-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details for packingsolver-0.1.1232-cp312-abi3-macosx_11_0_arm64.whl

Total release size: 30.2 MB

Release files / packingsolver-0.1.1232.tar.gz

Download URL packingsolver-0.1.1232.tar.gz
Size 963.4 kB
Tags Source
SHA-256 checksum
How to use checksums
88ce8deaf628205a035dbb8b958764fa12bb62355895e861ce8b29535d630aad
BLAKE2b-256 checksum
How to use checksums
6baad6fb4908d26610d617843013ccb08ccc50654b11100f3c424ef2a2bc2528
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / packingsolver-0.1.1232-cp312-abi3-win_amd64.whl

Download URL packingsolver-0.1.1232-cp312-abi3-win_amd64.whl
Size 4.2 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
73f73a5b32928dd346e5aeed7a27aa0876c02d00d308c527667d704b0f798660
BLAKE2b-256 checksum
How to use checksums
e5c3079f4f6095deaec1894b36eacb7c085c0df6732bd603df150ab816ab9eed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / packingsolver-0.1.1232-cp312-abi3-win32.whl

Download URL packingsolver-0.1.1232-cp312-abi3-win32.whl
Size 3.8 MB
Tags CPython 3.12 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
09bccbc5261e34b64c1f37849a6d8ba3cb0cc921bcd47467ac9da8482cf87076
BLAKE2b-256 checksum
How to use checksums
9f83bfc8f6c8902b484078ec78542eb135fefb7f819782018d39465385a66434
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / packingsolver-0.1.1232-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL packingsolver-0.1.1232-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 6.1 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
208224938fc65be5cce893e0fb24e9779b44dafd9191ba77543ea5a98f33e0d0
BLAKE2b-256 checksum
How to use checksums
4b4a1f1a2695deda0af2725e261346196a195da9baa454858029a6a1f6d5208e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / packingsolver-0.1.1232-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL packingsolver-0.1.1232-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 5.6 MB
Tags CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
18422a5df8ef2a7532170d9fd52f6fd3ef35fc3f24cac9bec2f6ad3773ccef98
BLAKE2b-256 checksum
How to use checksums
f407076b858687dec68707a684d14ed5c186e8c6f01b9f88e42b7b280be49db7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / packingsolver-0.1.1232-cp312-abi3-macosx_11_0_x86_64.whl

Download URL packingsolver-0.1.1232-cp312-abi3-macosx_11_0_x86_64.whl
Size 5.1 MB
Tags CPython 3.12 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
50762a8ac47817fde7be707702a2aa87622674477719b501c5241ee14abce80c
BLAKE2b-256 checksum
How to use checksums
bba51676769a5ddc3f6f368229b70a83bc07db1c0b47cd3d58738377ec3ebc24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / packingsolver-0.1.1232-cp312-abi3-macosx_11_0_arm64.whl

Download URL packingsolver-0.1.1232-cp312-abi3-macosx_11_0_arm64.whl
Size 4.5 MB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e5ea779fbdd4edc90f464934ff1c1a5c838e2cac69bb6e45e6e9e545fe2eebc2
BLAKE2b-256 checksum
How to use checksums
14b51eccbc70293195ee560f82d1b44f7810da733ccda34fd4d58eccbbab3f79
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Security for packingsolver 0.1.1232

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 7 files in this release have been uploaded with provenance metadata.

Select from 7 files

Attestation for packingsolver-0.1.1232.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.1232 This release

7 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page