Skip to content

Capabilities and limitations

This page separates current supported behavior from restrictions that may be removed in a later wrapper release, limits inherited from the backend or binary64 arithmetic, unsupported geometry, and architecture decisions that are still open. A limitation in one category does not imply a promise in another.

Supported v0.8 contracts

pyvoro2 supports bounded 3D boxes, partially or fully periodic orthorhombic 3D cells, fully periodic triclinic 3D cells, bounded planar boxes, and rectangular periodic planar cells. Standard and power/Laguerre compute(...) calls share an input-aligned TessellationResult, with explicit differences where a dimension or domain cannot provide the same optional geometry.

For every non-periodic axis, each generator inserted into a native container must lie in the half-open storage interval [lo, hi). Periodic coordinates are remapped before insertion. This containment rule also applies to temporary ghost generators, while locate(...) query points are not generators. It is a supported storage-domain contract for the current wrapper and backend path; it is not the mathematical claim that a generator outside a clipped domain can never affect the clipped diagram.

The mandatory duplicate floor is always enforced before native construction and cannot be disabled. The user-configurable duplicate policy is a separate, optional diagnostic layer above that floor. Periodic mandatory checks use a certified minimum image.

Separator observations support source-independent row/set identity and optional exact source binding. An explicitly supplied periodic image shift is authoritative; an omitted shift is inferred with a certified nearest-image solve. Algebraic fit, realized geometry, and the empirical active-set outer algorithm remain separate result layers.

Wrapper restrictions and stabilization candidates

Some current restrictions are properties of the v0.8 Python wrapper rather than mathematical impossibilities or permanent backend limits. Examples include radius-only power input for locate(...) and ghost_cells(...), orientation restrictions on triclinic user bases, and public-output/search conditions used by periodic boundary image reconstruction.

In particular, certified nearest/minimum-image resolution for separator observations does not make every boundary-image reconstruction path certified. The remaining periodic boundary-image and search-window limitations are candidate v0.9 functional-stabilization work. Current search controls must be read according to their individual contracts: separator image_search is only a performance seed and never a correctness radius, while current forward face/edge reconstruction controls may still bound supported reconstruction behavior.

The roadmap preserves these candidates without promising their exact issue grouping or implementation.

Backend and binary64 limits

Voro++ and the current wrappers evaluate geometry with finite binary64 arithmetic. Very large or small coordinate scales, nearly coincident sites, nearly degenerate cells, and power diagrams whose squared backend radii or true weight range overwhelm squared geometric scales can lose resolution. Finite input and successful weight-to-radius conversion are necessary preconditions, not a guarantee that the native tessellation is geometrically resolvable.

These numerical limits are distinct from Python API restrictions. pyvoro2 rejects invalid or unsafe input before native construction where it has a defined precondition, and reports structured failures where a certified periodic or scalar solve exhausts resources; it does not silently substitute an approximation. There is no universal scale cutoff that can replace problem-specific diagnostics.

Unsupported geometry

The current package does not support arbitrary wall-defined or unbounded domains, partial triclinic periodicity in 3D, oblique periodicity in 2D, anisotropic or non-Euclidean diagrams, or generators outside a non-periodic storage domain. Supporting some of these would require a new public geometry contract or substantive backend work, not merely a larger search radius.

Prescribed cell-measure inversion, mixed separator-plus-measure fitting, and moving-site optimization are also not v0.8 capabilities. They are separate future inverse families or unknown types, with prescribed measures planned for v1.1 and mixed problems for v1.2.

Open architecture decisions

The v0.8 repository currently builds one distribution containing both forward native extensions and the inverse Python layer, and it vendors the upstream Voro++ sources with a bounded accepted robustness fix. Those are current facts, not permanent governance decisions.

ADR 0017 leaves two policies for explicit pre-1.0 planning: whether to require one repository/one distribution through 1.0, and whether to adopt a formal no-persistent-functional-Voro++-fork policy. v0.8 does not decide either one.

For exact callable behavior, see Choosing an API, the API reference, and the v0.8 API inventory.