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.6.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.6.0
File Size Uploaded
bedblend-0.6.0.tar.gz 117.1 kB Details

Built distribution (wheel)

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

Total release size: 222.8 kB

Release files / bedblend-0.6.0.tar.gz

Download URL bedblend-0.6.0.tar.gz
Size 117.1 kB
Tags Source
SHA-256 checksum
How to use checksums
20264863726a7bf0ded09588e76cf33fc6caa8d79f5ec37c4c384628c57ea96a
BLAKE2b-256 checksum
How to use checksums
9d3888b11ef7914507a76172a9410078a55bb2898c779b92321add37e1be23ab
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 4, 2026.

Transparency log

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

Download URL bedblend-0.6.0-py3-none-any.whl
Size 105.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
805fbccd288260ece768ca2433245727d6f690ce41597db9383f448fc6014d59
BLAKE2b-256 checksum
How to use checksums
394f6974df4063e57f2aa0d7d22d244bc81f87b17c7fdf7bff159c1ac6bb6f07
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 4, 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

This release

0.6.0 This release

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

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