Skip to main content

oreblocks

CI License Version DOI

Software note (CC-BY-4.0): "oreblocks: License-Free Synthetic Ore-Body Block Models with a Stamped Exact Ultimate-Pit Optimum", concept DOI 10.5281/zenodo.21512088 (source in manuscripts/ore-body-twins/). It gives the deposit archetypes, the exact max-closure ultimate-pit solver, and an independent LP cross-check to machine precision (~1e-15).

Synthetic 3-D ore-body block models of the MineLib nature, and their scheduling — seeded deposit archetypes with per-block grades, bench (level) structure, slope precedence, UPIT economics with per-block optimal destination, an exact max-closure solver, extraction states with loading faces, MineLib .blocks/.prec/.upit/.cpit/.pcpsp read/write, the certified CPIT LP bound by the critical multiplier algorithm, the TopoSort rounding heuristics, and spatial-coherence metrics. Deterministic given a seed; every generated instance is clearly labelled SYNTHETIC.

Why: per-block ground truth on real mines is licensed or proprietary (MineLib grants academic download only, no redistribution). oreblocks generates instances of the same nature — 3-D benches, grades, precedence, net values — with a stamped exact optimum, so solvers, dispatch simulators and teaching apps get license-free realistic instances with known-by-construction answers.

Install

pip install oreblocks

Quickstart — a MineLib-format twin with a stamped optimum

from oreblocks import make_twin

twin = make_twin("porphyry", dims=(20, 20, 10), seed=42)
print(twin.upit.pit_value, twin.upit.n_in_pit)   # the EXACT optimum, stamped
twin.write("out/")   # -> twin-*.blocks / .prec / .upit / .meta.json (MineLib format)

The emitted triplet is byte-consumable by any MineLib UPIT reader. Cross-validated against an independent TypeScript min-cut engine (CAOS PitForge, which reproduces the published newman1 / zuck_small / kd optima): relative disagreement ~1e-11 on a 4,000-block twin.

Scheduling: which blocks, and WHEN

The ultimate pit says which blocks are worth mining. The constrained pit limit problem (CPIT) says when: assign every block a period so slope precedence holds in every period, per-period capacities hold, and discounted value is maximised. It is NP-hard, so what ships is a certified upper bound plus feasible schedules, with the gap between them reported rather than hidden.

import oreblocks as ob

inst = ob.read_cpit("newman1.cpit")                    # periods, discount rate, capacities
prec = ob.read_prec("newman1.prec", inst.n_blocks)
result, relaxations = ob.solve_cpit(inst, prec)        # bound, schedule, local search
print(f"{result.npv:,.0f}  bound {result.bound:,.0f}  gap {result.gap_pct:.2f}%")

controls = ob.run_controls(inst, prec, result)         # duality, bound, order invariance
assert controls.all_pass

The bound needs no LP solver. Chicoisne et al. 2012 (Operations Research 60(3):517-528, doi:10.1287/opre.1120.1050, Theorem 3.1) show the CPIT LP relaxation is solved exactly in O(mn log n) for one resource per period, as a sequence of parametric nested pits, which are maximum closures, which this package already computes exactly.

On the published newman1.cpit this implementation returns a certified bound of 24 487 410 against the published LP bound of 24 486 549 (relative difference 3.5e-5, and the residual is in the right direction because the single-resource relaxation is looser than the joint bound).

Full detail, including the three file-format traps and the explicit list of what is not implemented (stockpiles, blending, minimum-production constraints, the exact C-PIT[D] local search, stochastic scheduling): docs/scheduling.md.

Pieces

Module What
BlockGrid regular grid; LEVELS increase upward (the MineLib convention)
make_deposit seeded archetypes: porphyry, vein, layered, core_halo (trend + correlated noise)
Econ / block_values UPIT net value at the optimal destination (floating cutoff = the max)
build_precedence slope-cone template one level up (45° cubic → the classic 9-point), CSR
solve_upit exact Picard max-closure → Dinic min-cut; closure + value-identity self-checks
extraction_state / loading_faces top-down bench extraction + seeded k-means shovel faces (grade at face, ore fraction, tonnes) — the bridge to haulage simulators
write_minelib / read_* the .blocks/.prec/.upit triplet + a meta sidecar with the stamped optimum

Convention notes

  • Levels (z) increase upward: level 0 is the deepest bench — exactly how published MineLib instances index (verified against newman1). Depth-down viewers flip with z_down = nz-1-level.
  • .blocks free columns written by oreblocks are documented in the meta sidecar: grade (mass fraction) · tonnage (t) · density (t/m³).
  • Nothing here downloads or redistributes published MineLib data.

Used by

  • minehaulsim (haulage DES) — geology-grounded scenarios: loading faces with grade/bench.
  • CAOS PitForge — license-free synthetic twins next to the published-instance lane.

License

Apache-2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oreblocks-0.3.0.tar.gz (65.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oreblocks-0.3.0-py3-none-any.whl (61.7 kB view details)

Uploaded Python 3

File details

Details for the file oreblocks-0.3.0.tar.gz.

File metadata

  • Download URL: oreblocks-0.3.0.tar.gz
  • Upload date:
  • Size: 65.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for oreblocks-0.3.0.tar.gz
Algorithm Hash digest
SHA256 4b5b1113fcb0350307b495ce8206d6e1d3ff7214ceb27af30eaef6c8426bb50e
MD5 f522a6fe422cda4982a4380994edc93f
BLAKE2b-256 7efedc5e866d2cb46755dd259fb3f368c611bbc4681e6e8379a4b613655e107b

See more details on using hashes here.

Provenance

The following attestation bundles were made for oreblocks-0.3.0.tar.gz:

Publisher: publish-pypi.yml on fsantibanezleal/CAOS_OreBlocks

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file oreblocks-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: oreblocks-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 61.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for oreblocks-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e06cf61fbb47a6182102b690d5365008ffb93d642fd96a74bfa217c16bbc0b8d
MD5 73c5e251b246e09e2019f88816e9d1d4
BLAKE2b-256 56a183c3defc786ec666196223d5b9b608af2c2c072ea7acd938e862b6f1abcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for oreblocks-0.3.0-py3-none-any.whl:

Publisher: publish-pypi.yml on fsantibanezleal/CAOS_OreBlocks

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page