7 #include "../safeguards.h"
9 typedef std::queue<NodeID> NodeList;
72 return (to.
Supply() == 0 || to.UndeliveredSupply() > 0) && to.
Demand() > 0;
133 if (job[from_id].Demand() > 0) {
134 uint demand_back = demand_forw * this->
mod_size / 100;
135 uint undelivered = job[to_id].UndeliveredSupply();
136 if (demand_back > undelivered) {
137 demand_back = undelivered;
138 demand_forw =
max(1U, demand_back * 100 / this->
mod_size);
156 job[from_id].DeliverSupply(to_id, demand_forw);
164 template<
class Tscaler>
169 uint num_supplies = 0;
170 uint num_demands = 0;
172 for (NodeID node = 0; node < job.
Size(); node++) {
173 scaler.AddNode(job[node]);
174 if (job[node].Supply() > 0) {
178 if (job[node].Demand() > 0) {
184 if (num_supplies == 0 || num_demands == 0)
return;
189 scaler.SetDemandPerNode(num_demands);
192 while (!supplies.empty() && !demands.empty()) {
193 NodeID from_id = supplies.front();
196 for (uint i = 0; i < num_demands; ++i) {
197 assert(!demands.empty());
198 NodeID to_id = demands.front();
200 if (from_id == to_id) {
202 if (demands.empty() && supplies.empty())
return;
208 int32 supply = scaler.EffectiveSupply(job[from_id], job[to_id]);
222 uint demand_forw = 0;
223 if (divisor <= supply) {
227 demand_forw = supply / divisor;
228 }
else if (++chance > this->
accuracy * num_demands * num_supplies) {
234 demand_forw =
min(demand_forw, job[from_id].UndeliveredSupply());
236 scaler.SetDemands(job, from_id, to_id, demand_forw);
238 if (scaler.HasDemandLeft(job[to_id])) {
244 if (job[from_id].UndeliveredSupply() == 0)
break;
247 if (job[from_id].UndeliveredSupply() != 0) {
248 supplies.push(from_id);
270 this->
mod_dist = 100 + over100 * over100;
273 switch (settings.GetDistributionType(cargo)) {