OpenTTD Source
20240919-master-gdf0233f4c2
|
Go to the documentation of this file.
10 #include "../stdafx.h"
11 #include "../core/pool_func.hpp"
12 #include "../window_func.h"
16 #include "../safeguards.h"
52 for (NodeID node_id = 0; node_id < this->
Size(); ++node_id) {
53 (*this)[node_id].flows.erase(from);
80 if (this->
thread.joinable()) {
104 uint16_t size = this->
Size();
105 for (NodeID node_id = 0; node_id < size; ++node_id) {
118 if (ge.
link_graph != this->link_graph.index || ge.
node != node_id) {
126 for (
const auto &edge : from.
edges) {
127 if (edge.Flow() == 0)
continue;
128 NodeID dest_id = edge.base.dest_node;
129 StationID to = this->
nodes[dest_id].base.station;
131 if (st2 ==
nullptr || st2->
goods[this->Cargo()].
link_graph != this->link_graph.index ||
132 st2->
goods[this->Cargo()].
node != dest_id ||
133 !(*lg)[node_id].HasEdgeTo(dest_id) ||
151 for (FlowStatMap::iterator it(ge.
flows.begin()); it != ge.
flows.end();) {
152 FlowStatMap::iterator new_it = flows.find(it->first);
153 if (new_it == flows.end()) {
155 it->second.Invalidate();
158 FlowStat shares(INVALID_STATION, 1);
159 it->second.SwapShares(shares);
160 ge.
flows.erase(it++);
161 for (FlowStat::SharesMap::const_iterator shares_it(shares.
GetShares()->begin());
162 shares_it != shares.
GetShares()->end(); ++shares_it) {
167 it->second.SwapShares(new_it->second);
172 ge.
flows.insert(flows.begin(), flows.end());
184 uint size = this->
Size();
185 this->
nodes.reserve(size);
186 for (uint i = 0; i < size; ++i) {
205 if (this->
parent != base) {
223 if (this->
parent !=
nullptr) {
225 if (max_saturation != UINT_MAX) {
226 uint usable_cap = edge.
base.
capacity * max_saturation / 100;
227 if (usable_cap > edge.
Flow()) {
228 new_flow = std::min(new_flow, usable_cap - edge.
Flow());
233 new_flow = this->
parent->
AddFlow(new_flow, job, max_saturation);
234 if (this->
flow == 0 && new_flow > 0) {
235 job[this->
parent->
node].paths.push_front(
this);
239 this->
flow += new_flow;
249 distance(source ? 0 : UINT_MAX),
250 capacity(source ? UINT_MAX : 0),
251 free_capacity(source ? INT_MAX : INT_MIN),
252 flow(0), node(n), origin(source ? n : INVALID_NODE),
253 num_children(0), parent(nullptr)
FlowStatMap flows
Planned flows to other nodes.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
Minimal stack that uses a pool to avoid pointers.
uint capacity
This capacity is min(capacity) fom all edges.
GoodsEntry goods[NUM_CARGO]
Goods at this station.
Titem Pop()
Pop an item from the stack.
A leg of a path in the link graph.
static Titem * Get(size_t index)
Returns Titem with given index.
A connected component of a link graph.
void RerouteCargo(Station *st, CargoID c, StationID avoid, StationID avoid2)
Reroute cargo of type c at station st or in any vehicles unloading there.
NodeAnnotationVector nodes
Extra node data necessary for link graph calculation.
NodeVector nodes
Nodes in the component.
static Path * invalid_path
Static instance of an invalid path.
Class for calculation jobs to be run on link graphs.
Tindex index
Index of this pool item.
~LinkGraphJob()
Join the link graph job and destroy it.
void AddFlow(uint flow)
Add some flow.
void Fork(Path *base, uint cap, int free_cap, uint dist)
Add this path as a new child to the given base path, thus making this path a "fork" of the base path.
Storage class for Economy time constants.
void JoinThread()
Join the calling thread with this job's thread if threading is enabled.
StationID station
Station ID.
NodeID origin
Link graph node this path originates from.
@ WC_STATION_VIEW
Station view; Window numbers:
Path * parent
Parent leg of this one.
uint Flow() const
Get the total flow on the edge.
NodeID Size() const
Get the size of the underlying link graph.
void RestrictFlows(StationID via)
Restrict all flows at a station for specific cargo and destination.
LinkGraphJobPool _link_graph_job_pool("LinkGraphJob")
The actual pool with link graph jobs.
Flow statistics telling how much flow should be sent along a link.
const LinkGraph::BaseNode & base
Reference to the node that is annotated.
StationIDStack DeleteFlows(StationID via)
Delete all flows at a station for specific cargo and destination.
void SpawnThread()
Spawn a thread if possible and run the link graph job in the thread.
uint capacity
Capacity of the link.
const SharesMap * GetShares() const
Get the actual shares as a const pointer so that they can be iterated over.
Annotation for a link graph edge.
NodeID node
ID of node in link graph referring to this goods entry.
const LinkGraph link_graph
Link graph to by analyzed. Is copied when job is started and mustn't be modified later.
bool StartNewThread(std::thread *thr, const char *name, TFn &&_Fx, TArgs &&... _Ax)
Start a new thread.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
std::thread thread
Thread the job is running in or a default-constructed thread if it's running in the main thread.
fluid_settings_t * settings
FluidSynth settings handle.
LinkGraphSettings linkgraph
settings for link graph calculations
LinkGraphID link_graph
Link graph this station belongs to.
uint flow
Flow the current run of the mcf solver assigns.
uint distance
Sum(distance of all legs up to this one).
@ DT_MANUAL
Manual distribution. No link graph calculations are run.
Stores station stats for a single cargo.
Base class for all pools.
Annotation for a link graph node.
bool IsJobAborted() const
Check if job has been aborted.
FlowStatMap flows
Planned flows through this station.
void AddFlow(uint f)
Increase the flow on this leg only by the specified amount.
Flow descriptions by origin stations.
static bool CleaningPool()
Returns current state of pool cleaning - yes or no.
static constexpr TimerGame< struct Economy >::Date INVALID_DATE
Representation of an invalid date.
Path(NodeID n, bool source=false)
Create a leg of a path in the link graph.
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don't get linker errors.
int free_capacity
This capacity is min(edge.capacity - edge.flow) for the current run of Dijkstra.
std::vector< EdgeAnnotation > edges
Annotations for all edges originating at this node.
bool IsEmpty() const
Check if the stack is empty.
static Station * GetIfValid(size_t index)
Returns station if the index is a valid index for this station type.
static void Run(LinkGraphJob *job)
Run all handlers for the given Job.
CargoID Cargo() const
Get the cargo of the underlying link graph.
const LinkGraph::BaseEdge & base
Reference to the edge that is annotated.
void EraseFlows(NodeID from)
Erase all flows originating at a specific node.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
void Detach()
Detach this path from its parent.
NodeID node
Link graph node this leg passes.
uint num_children
Number of child legs that have been forked from this path.
void Init()
Initialize the link graph job: Resize nodes and edges and populate them.
LinkGraphJob()
Bare constructor, only for save/load.
Timer that is increased every 27ms, and counts towards economy time units, expressed in days / months...