Follow-up from #37, which split the pooled eu_farmers list into one agent per consumer entity.
Problem 1 — declared impacts are not read
livestock_pressure declares supply: -9% and price: +20% against poultry_farms, conditional on feed_price_spike.active. The simulation reads neither.
Since #37 each consumer is its own roster entry with its own ("<eid>", "supply") capacity binding, so the wiring is in place — but _step_consumer() never calls effective("capacity"), and consumers carry no unit_price for a price impact to land on. Before the split this was excusable: the consumers were one anonymous pool with no entity identity to bind to. That is no longer true.
The shock is tracked, shock_scales is seeded from the event registry rather than the roster, so ("poultry_farms", "supply") already has a live scale every step. Nothing consumes it.
Open questions, to settle before implementing:
- What should a supply impact on a livestock farm mean — reduced capacity to take feed, or reduced livestock output from the feed it did receive? The two produce different downstream behaviour.
price: +20% has nowhere to land at all, since consumers do not price. Either consumers gain a price, or consumer-side price impacts are explicitly declared out of model scope and documented as such.
Problem 2 — the feed share assumes one shared upstream
_step_consumer() divides by the count of all active consumer agents across every consumer list, but sums feed only from its own upstream.
Exact in the shipped PDL, where all three consumers are fed by eu_feed_trader. In a PDL where one consumer has a different or missing upstream, the feed-less consumer still occupies a share and the others are left short. The divisor and the numerator come from different sets.
Any weighting by dependency criticality, by entity size is a modelling decision the PDL does not currently state, so this needs a decision as much as an implementation.
Scope
src/provider_simenv/agents/farmer.py — _step_consumer()
- possibly
data_collector.py, if consumers gain a recorded price
Acceptance
- A PDL supply impact targeting a consumer changes that consumer's recorded output
- A PDL where consumers have different upstreams conserves feed: each consumer's
feed_received sums to what its own upstream actually holds
- The chosen semantics for a consumer-side supply impact are written down, and consumer-side price impacts are either implemented or explicitly declared out of scope
Follow-up from #37, which split the pooled
eu_farmerslist into one agent per consumer entity.Problem 1 — declared impacts are not read
livestock_pressuredeclaressupply: -9%andprice: +20%againstpoultry_farms, conditional onfeed_price_spike.active. The simulation reads neither.Since #37 each consumer is its own roster entry with its own
("<eid>", "supply")capacity binding, so the wiring is in place — but_step_consumer()never callseffective("capacity"), and consumers carry nounit_pricefor a price impact to land on. Before the split this was excusable: the consumers were one anonymous pool with no entity identity to bind to. That is no longer true.The shock is tracked,
shock_scalesis seeded from the event registry rather than the roster, so("poultry_farms", "supply")already has a live scale every step. Nothing consumes it.Open questions, to settle before implementing:
price: +20%has nowhere to land at all, since consumers do not price. Either consumers gain a price, or consumer-side price impacts are explicitly declared out of model scope and documented as such.Problem 2 — the feed share assumes one shared upstream
_step_consumer()divides by the count of all active consumer agents across every consumer list, but sums feed only from its own upstream.Exact in the shipped PDL, where all three consumers are fed by
eu_feed_trader. In a PDL where one consumer has a different or missing upstream, the feed-less consumer still occupies a share and the others are left short. The divisor and the numerator come from different sets.Any weighting by dependency criticality, by entity size is a modelling decision the PDL does not currently state, so this needs a decision as much as an implementation.
Scope
src/provider_simenv/agents/farmer.py—_step_consumer()data_collector.py, if consumers gain a recorded priceAcceptance
feed_receivedsums to what its own upstream actually holds