U-Nesting
A high-performance 2D/3D spatial optimization engine for nesting and bin packing problems.
Features
- 2D Nesting: Optimal placement of irregular polygons on sheets
- 3D Bin Packing: Efficient box placement in containers
- Multiple Algorithms: BLF, NFP-guided, Genetic Algorithm, BRKGA, Simulated Annealing
- High Performance: Written in Rust with Python bindings
- Type Hints: Full type annotation support
Installation
pip install u-nesting
Quick Start
2D Nesting
import u_nesting
# Define polygons to nest
geometries = [
{
"id": "part1",
"polygon": [[0, 0], [100, 0], [100, 50], [0, 50]],
"quantity": 5,
"rotations": [0, 90, 180, 270]
},
{
"id": "triangle",
"polygon": [[0, 0], [80, 0], [40, 60]],
"quantity": 3
}
]
# Define sheet boundary
boundary = {"width": 500, "height": 300}
# Configure solver
config = {
"strategy": "nfp", # Options: blf, nfp, ga, brkga, sa, gdrr, alns
"spacing": 2.0, # Gap between parts
"time_limit_ms": 30000 # 30 second timeout
}
# Solve
result = u_nesting.solve_2d(geometries, boundary, config)
print(f"Utilization: {result['utilization']:.1%}")
print(f"Placed: {len(result['placements'])} items")
for p in result['placements']:
print(f" {p['geometry_id']}[{p['instance']}]: ({p['position'][0]:.1f}, {p['position'][1]:.1f})")
3D Bin Packing
import u_nesting
# Define boxes to pack
geometries = [
{
"id": "small",
"dimensions": [20, 20, 20],
"quantity": 10
},
{
"id": "large",
"dimensions": [40, 30, 25],
"quantity": 5,
"mass": 2.5 # Optional weight
}
]
# Define container
boundary = {
"dimensions": [200, 150, 100],
"max_mass": 50.0, # Optional mass limit
"gravity": True, # Stack from bottom
"stability": True # Require stable placement
}
# Configure solver
config = {
"strategy": "ep", # Extreme Point heuristic
"time_limit_ms": 10000
}
# Solve
result = u_nesting.solve_3d(geometries, boundary, config)
print(f"Utilization: {result['utilization']:.1%}")
print(f"Containers used: {result['boundaries_used']}")
API Reference
solve_2d(geometries, boundary, config=None) -> dict
Solve a 2D nesting problem.
Parameters:
Keys are validated strictly: an unrecognized key in
geometries,boundaryorconfigraisesValueErrornaming it, rather than being ignored. A typo can therefore never silently fall back to a default.
geometries: List of geometry definitionsid(str): Unique identifierpolygon(list): Vertices as [[x, y], ...]quantity(int): Number of copies (default: 1)rotations(list): Allowed rotation angles in degreesallow_flip(bool): Allow horizontal flipholes(list): Interior holes as list of polygons
boundary: Sheet definitionwidth,height(float): Rectangle dimensions, ORpolygon(list): Custom boundary shape
config: Solver configuration (optional)strategy(str): "blf", "nfp", "ga", "brkga", "sa", "gdrr", "alns"spacing(float): Gap between geometriesmargin(float): Gap from boundarytime_limit_ms(int): Timeout in millisecondspopulation_size(int): GA/BRKGA populationmax_generations(int): GA/BRKGA generationsmulti_sheet(bool): Distribute overflow across multiple sheets (default:False). WhenTrue, parts that do not fit on one sheet spill onto extra sheets instead of becoming unplaced;boundaries_usedreports the sheet count and each placement'sboundary_indexselects its sheet with sheet-local coordinates.
Returns: Dictionary with:
success(bool): Whether solve succeededplacements(list): Placement results (instance-level)utilization(float): Area utilization ratioboundaries_used(int): Number of sheets used (>1 only whenmulti_sheet=True)total_requested(int): Σ of every geometry's quantity (instance-level total). Unplaced instance count =total_requested - len(placements)unplaced(list): Deduplicated IDs of items that couldn't be placed (not per-instance, solen(unplaced)under-reports the failed-instance count)computation_time_ms(int): Solve time
solve_3d(geometries, boundary, config=None) -> dict
Solve a 3D bin packing problem.
Parameters:
geometries: List of box definitionsid(str): Unique identifierdimensions(list): [width, depth, height]quantity(int): Number of copiesmass(float): Weight (optional)
boundary: Container definitiondimensions(list): [width, depth, height]max_mass(float): Weight limit (optional)gravity(bool): Enable gravity constraintstability(bool): Enable stability constraint
config: Same as solve_2d, plus:strategy: "blf", "ep", "ga", "brkga", "sa"
Returns: Same structure as solve_2d
Strategy Selection Guide
| Strategy | Speed | Quality | Best For |
|---|---|---|---|
blf |
Fast | Good | Large instances, quick results |
nfp |
Medium | Better | 2D with complex shapes |
ep |
Fast | Good | 3D bin packing |
ga |
Slow | Best | Small instances, max quality |
brkga |
Slow | Best | Complex constraints |
sa |
Medium | Better | Balanced speed/quality |
gdrr |
Medium | Better | 2D, ruin-and-recreate on dense layouts |
alns |
Medium | Better | 2D, adaptive neighborhood search |
Requirements
- Python 3.8+
- No additional dependencies
License
MIT License - see LICENSE for details.
Links
Metadata
Release files for u-nesting 0.12.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| u_nesting-0.12.0-cp38-abi3-win_amd64.whl | CPython 3.8 | abi3 | Windows x86-64 | Details |
| u_nesting-0.12.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| u_nesting-0.12.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| u_nesting-0.12.0-cp38-abi3-macosx_11_0_arm64.whl | CPython 3.8 | abi3 | macOS 11.0+ ARM64 | Details |
| u_nesting-0.12.0-cp38-abi3-macosx_10_12_x86_64.whl | CPython 3.8 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 3.7 MB
Release files / u_nesting-0.12.0-cp38-abi3-win_amd64.whl
| Download URL | u_nesting-0.12.0-cp38-abi3-win_amd64.whl |
|---|---|
| Size | 723.3 kB |
| Tags | CPython 3.8 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
50e8686ca3f182f75b7277748e41dec8b4426b8eb774908826a45c226e5543f8
|
|
BLAKE2b-256 checksum How to use checksums |
0994c745535bf5021bdc6709853df06cb77b725011abb7766938b82ff0718e8b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 16, 2026.
Transparency logRelease files / u_nesting-0.12.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | u_nesting-0.12.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 783.5 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
e6ea951debaecd1d6d21997f978c18daead9b73d9951f1a41fb94764639394e1
|
|
BLAKE2b-256 checksum How to use checksums |
eddd8e55f68b208952d2a2b81d29370083224ebcbe073ee462acd021ee8e958a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 16, 2026.
Transparency logRelease files / u_nesting-0.12.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | u_nesting-0.12.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 713.6 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
39a34d8959b0fcb9c60e68067bd00e955584930463aed2a4ed4b8dce142b98dc
|
|
BLAKE2b-256 checksum How to use checksums |
2f0095b8dfe8e4a7e2f6e57697f3d3914fe65c63972fd8ee5f2a846b9dd210c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 16, 2026.
Transparency logRelease files / u_nesting-0.12.0-cp38-abi3-macosx_11_0_arm64.whl
| Download URL | u_nesting-0.12.0-cp38-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 695.4 kB |
| Tags | CPython 3.8 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1152ba8543ea10aaf992af56e1f8453a16ffc0472f5295c1beed7ce01cada8bf
|
|
BLAKE2b-256 checksum How to use checksums |
05c42ce2fd4710dfa41181eeefa90159945e71e98c92f2dbf164c6a9b3a0ba25
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 16, 2026.
Transparency logRelease files / u_nesting-0.12.0-cp38-abi3-macosx_10_12_x86_64.whl
| Download URL | u_nesting-0.12.0-cp38-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 762.0 kB |
| Tags | CPython 3.8 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
d248684e0bd95fa20dbd314d731d0b01b46e2d326bbc4f6276485d70d44286df
|
|
BLAKE2b-256 checksum How to use checksums |
73d68e4bb9e309e6e1764795d9d073a0f2a2ffa5e819fecd423de4d085faf4b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 16, 2026.
Transparency log