SkillAgentSearch skills...

Spyrrow

Python wrapper of Sparrow, State-of-the-art Nesting for 2D irregular strip packing

Install / Use

/learn @PaulDL-RS/Spyrrow

README

Spyrrow

spyrrow is a Python wrapper on the Rust project sparrow. It enables to solve 2D Strip packing problems.

The documentation is hosted here.

Installation

Spyrrow is hosted on PyPI.

You can install with the package manager of your choice, using the PyPI package index.

For example, with pip, the default Python package:

pip install spyrrow

Examples

import spyrrow

rectangle1 = spyrrow.Item(
    "rectangle", [(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)], demand=4, allowed_orientations=[0]
)
triangle1 = spyrrow.Item(
    "triangle",
    [(0, 0), (1, 0), (1, 1), (0, 0)],
    demand=6,
    allowed_orientations=[0, 90, 180, -90],
)

instance = spyrrow.StripPackingInstance(
    "test", strip_height=2.001, items=[rectangle1, triangle1]
)
config = spyrrow.StripPackingConfig(early_termination=False,total_computation_time=60,num_wokers=3,seed=0)
sol = instance.solve(config)
print(sol.width) # 4.0 +/- 5%
print(sol.density)
print("\n")
for pi in sol.placed_items:
    print(pi.id)
    print(pi.rotation)
    print(pi.translation)
    print("\n")

Progress Monitoring

You can monitor the solver's progress in real time using a ProgressQueue. Since solve() releases the GIL internally, the main thread is free to drain the queue while the solver runs:

import threading
import spyrrow

# ... set up instance and config ...

queue = spyrrow.ProgressQueue()
result = [None]

def run():
    result[0] = instance.solve(config, progress=queue)

thread = threading.Thread(target=run)
thread.start()
while thread.is_alive():
    for report_type, solution in queue.drain():
        print(f"{report_type.phase_name()}: width={solution.width:.1f}, density={solution.density:.1%}")
    thread.join(timeout=0.5)

solution = result[0]

Each report includes a ReportType enum value (ExplFeas, ExplInfeas, ExplImproving, CmprFeas, Final) along with a full StripPackingSolution containing width, density, and placed items. Use report_type.phase_name() for a grouped label ("exploring", "compressing", "final") or match on the specific variant for finer control.

Contributing

Spyrrow is open to contributions. The first target should be to reach Python open sources packages standards and practices. Second, a easier integration with the package shapely is envsionned.

Please use GitHub issues to request features. They will be considered relative to what is already implemented in the parent library sparrow. If necessary, they can be forwarded to it.

View on GitHub
GitHub Stars29
CategoryDevelopment
Updated11d ago
Forks9

Languages

Python

Security Score

95/100

Audited on Mar 16, 2026

No findings