What the model found: almost exactly the tonnage the plant actually produced
(—), from — less raw sand. The gain comes from
redistributing the quarry mix, not from adding capacity.
Input
Every parameter the model consumes, held as a plain dataset. Figures originate in KUMSAN's production forms — ÜRT.F.02, ÜRT.F.03, ÜRT.F.04 and KAB.F.54.
Quarries
I = 6
Editable — change a figure and solve again to see what it does to the plan.
Quarry
c TL/t
F TL/mo
L t/mo
S t/mo
Products
J = 12
Editable — price and opening stock drive revenue and the stock floor.
Product
AFS
p TL/t
I₀ t
D t
Global parameters
shared
Editable — λ, e and π apply to every quarry and product.
Parameter
Value
Unit
Values in orange are assumptions still awaiting company data: extraction cost, fixed cost, minimum draw, and the price of 10 products.
φ — sieve distribution by quarry
6 × 11
What share of each quarry's sand falls in each fraction. Rows sum to 100. Hover any cell for the exact figure.
0 value(s) changed
Monthly demand
D · tons
Derived from realized sales: opening stock + production − closing stock
Capacity and plant limit
S, R
S = highest monthly shipment on record · R = peak daily feed × 25 days
Solve
One routine solves either dataset. The stream is the real run, the panel tracks each stage, and the code highlights the lines executing at that moment.
kumsan — solver0.00s
Sessionidle
0Variables
0Constraints
solver.py — model corehover a symbol for its value in this runidle
Output
The returned plan: which quarry runs in which month and at what rate, how much of each product gets made, and how Z is built up. Every chart responds to hover.
How Z is built
TL
Sales revenue less the three cost terms
Extraction plan
x · tons
Monthly raw sand drawn per quarry. A closed quarry means δ = 0.
Model plan against actual extraction
period total · tons
The same output from less raw sand — the model pulls back from 23 Dönüm and shifts volume to 25 and 17,5 Dönüm.
Production and demand
y / D · tons
Period totals. Sales cannot exceed demand (K8); closing stock cannot fall below opening stock (K9).
Product
Produced
Demand
Sold
End stock
Fill
Extraction to production
tons
Raw sand drawn, and the share that survives hydrosizer loss and the sieve specification
Forecast
Demand forecasting for 65-70 AFS. Five methods trained on Jan–Dec 2024 and scored against Jan–Apr 2025. Every method was worked by hand and checked against the Python model.
best: MA-12
Best method
—
lowest error on every metric
MAE
0t
mean absolute error
WAPE
0%
weighted absolute percentage
Test demand
0t
average actual, test months
Demand history and forecast
tonnes
Training actuals, the held-out test months, and each method's projection. Pick a method to bring it forward; hover the chart for the month.
Method comparison
lower is better
Every metric on the same held-out fold. Hover a bar for its figures.
Month by month
MA-12
Forecast against actual for the selected method, with the signed error
Month
Actual
Forecast
Error
|Error|
All methods, all metrics
held-out fold
MAE and RMSE in tonnes, nRMSE and WAPE in percent
Method
Jan 2025
MAE t
RMSE t
nRMSE %
WAPE %
Architecture
The solver is a compiled binary — it cannot run in a browser or on a phone. The computation lives on a server; the interface runs on every device.
Request path
one solve
What happens between pressing Solve and the plan appearing on screen. Hover a stage to read it.
Licensing
OSI approved
Every piece of the solving stack is open source and installs from pip — none of it is licensed per seat or per solve
HiGHSMILP engine · native arm64MIT
CBC · COIN-ORsecond engine, ships with PuLPEPL-2.0
PuLPmodel builder · pip install pulpBSD-3
FastAPI · Uvicornservice layerMIT / BSD
Python 3.12runtimePSF-2.0
Commercial use, modification and redistribution are all permitted; attribution is the only obligation. The binding limit sits on the other side — Excel's Solver stops at 200 decision variables, and the 2026 model has 540.
Solver behaviour at scale
gap = 0
The same model over a longer horizon. Difficulty tracks the binary count, not total variables.
Horizon
Variables
Binary
CBC
HiGHS
At 12 months the solver hits a wall — 404 s. Finding the optimum is cheap; proving it is optimal is what costs.
What the optimality gap buys
12 months
The effect of a one-per-mille concession on solve time — decisive for the 12-month 2027 plan
Horizon
Gap
Symmetry
Time
Z
Z given up
A 0.1% gap turns 404 seconds into 0.6 — a 670× speedup, for 0.008% of Z. Reference runs stay at gap 0; long-horizon planning can afford 0.1%.