Skip to main content

bedblend

CI License Version

A bed-blending stockpile engine: repose-angle deposition, Gray-Thornton kinetic size segregation, a per-cell lot ledger with provenance, and the blending metrics.

pip install bedblend

The problem it answers

A blending bed is the cheapest variance reduction available in a mineral processing plant. Material is stacked in many thin layers and reclaimed across all of them at once, so the cut delivered to the mill is an average over the layers the reclaimer crosses rather than over whichever truck arrived last.

The question a planner actually has is how much variance a given pile removes, and the honest answer is often "less than you think". The layer count is the dominant term, and it is set by the reclaim geometry rather than by the stacking geometry: a bridge reclaimer rakes the whole cross-section and crosses every layer at a station, a front-end loader takes a shallow bite and crosses a handful. This engine computes that, on a real pile, with the provenance kept.

import bedblend as bb

pad = bb.PadSpec(nx=24, ny=16, cell_m=3.0)
dumps = bb.generate_stream(n_dumps=120, seed=7)          # a correlated grade stream, not white noise
cfg = bb.RunConfig(pad=pad, stacking="chevron", reclaim="fullface",
                   n_passes=12, sr=1.0, cut_tonnes=600.0)

result = bb.simulate(cfg, dumps)
m = result.metrics
print(f"{len(result.cuts)} cuts, VRR {m.vrr:.3f} against the 1/N ideal {m.vrr_ideal:.3f}")
print(f"{m.n_layers_mean:.1f} layers per cut")
43 cuts, VRR 0.093 against the 1/N ideal 0.046
21.9 layers per cut

The ratio is variance OUT over variance IN, on a tonnage base, so lower is better and 1.0 means the bed did nothing. It is reported next to the 1/N bound because the gap between them is the interesting quantity: it is what the pile fails to recover, and it is driven by the autocorrelation of the incoming stream. Layers only average if they are independent.

What is in it

Module What it computes
heightfield Mass-conserving relaxation to an imposed angle of repose. A priority cascade with a water-filling toppling rule; the ordered transfers ARE the avalanche path.
segregation Gray-Thornton kinetic sieving in the flowing layer, dphi/dt + ... - Sr d/dz[phi(1-phi)] = 0, solved with a Godunov flux so the concentration shocks survive. Sr = 0 degenerates to a passive tracer, which is the negative control.
pile The pad, the per-cell lot stacks, and four reclaim geometries (full face, bucket wheel, end, loader). Every reclaimed tonne carries provenance fractions back to the truck loads that made it.
stacking Five build geometries: chevron, windrow, cone shell, chevcon, strata.
blending Tonnage-weighted variance, VRR, the 1/N bound, mixing effect, experimental variograms with a spherical fit.
rtd Residence-time distribution and its FIFO/LIFO character.
stream A geostatistically correlated truck stream, generated exactly from a one-step recursion.

What it does NOT claim

  • The angle of repose is imposed, not emergent. This is a continuum height-field model, not DEM. It reproduces the geometry a given repose angle produces; it does not predict that angle from particle properties.
  • The segregation number Sr is a parameter, not a measurement. Gray and Thornton's non-dimensional group is supplied, and the honest use is to sweep it and report the sensitivity.
  • It is not a blending optimizer. It evaluates a pile; it does not choose one.
  • It is not plant metal accounting. It stops at the reclaimed stream.

Determinism

A run is a pure function of (parameters, seed). The stream generator is a 32-bit xorshift feeding Box-Muller, written out explicitly rather than using random or numpy, so the same stream can be reproduced bit for bit by an implementation in another language. That is what makes an in-browser mirror of this engine checkable against it.

References

The equations and their provenance:

  • Gray, J.M.N.T. and Thornton, A.R. (2005), A theory for particle size segregation in shallow granular free-surface flows, Proc. R. Soc. A 461, 1447-1473. doi:10.1098/rspa.2004.1420
  • Bak, P., Tang, C. and Wiesenfeld, K. (1987), Self-organized criticality: an explanation of 1/f noise, Phys. Rev. Lett. 59, 381. doi:10.1103/PhysRevLett.59.381
  • Gerstner, W. and Schramm, G. — see docs/ for the blending-bed literature and the measured mixing effects the 1/N comparison is calibrated against.
  • Kumral, M. (2006), Bed blending design incorporating multiple regression modelling and genetic algorithms, J. S. Afr. Inst. Min. Metall. 106, 229-236.

Licence

MIT. See LICENSE.

Release files for bedblend 0.5.0

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

Source distribution (sdist)

Source distribution for bedblend 0.5.0
File Size Uploaded
bedblend-0.5.0.tar.gz 112.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bedblend 0.5.0
File Interpreter ABI Platform
bedblend-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 214.2 kB

Release files / bedblend-0.5.0.tar.gz

Download URL bedblend-0.5.0.tar.gz
Size 112.1 kB
Tags Source
SHA-256 checksum
How to use checksums
9fe7d0348dc42b5dac016aa49444ca6518b601826bfed67be7d13b682f3111f8
BLAKE2b-256 checksum
How to use checksums
0befb055e907383f4868d59de2891bcd46f0a82106aef7b2575bf745085b6b7c
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 Aug 3, 2026.

Transparency log

Release files / bedblend-0.5.0-py3-none-any.whl

Download URL bedblend-0.5.0-py3-none-any.whl
Size 102.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3b79d6526d95278810e2fee6a2fcc2d9ea0621fcca148aefce739baf40326fb7
BLAKE2b-256 checksum
How to use checksums
2c1c54231c1de3e1b35bc1232ebdac127cf3a15ee1b5c86ce621ef08cab17f2f
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 Aug 3, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.2

2 release files

0.5.1

2 release files

This release

0.5.0 This release

2 release files

0.4.1

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

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