diff options
author | fonsinchen <fonsinchen@openttd.org> | 2013-06-09 13:01:23 +0000 |
---|---|---|
committer | fonsinchen <fonsinchen@openttd.org> | 2013-06-09 13:01:23 +0000 |
commit | 575cabe90a56a23fa13ca24962b12a4ff2216386 (patch) | |
tree | b0ac380fa899cfaf13cece03d08c19ac647074c1 /src/linkgraph/flowmapper.cpp | |
parent | 9824d53d6a7d96e0a7182fa5bae5c05218b6a730 (diff) | |
download | openttd-575cabe90a56a23fa13ca24962b12a4ff2216386.tar.xz |
(svn r25357) -Add: flow mapper for link graph
Diffstat (limited to 'src/linkgraph/flowmapper.cpp')
-rw-r--r-- | src/linkgraph/flowmapper.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/linkgraph/flowmapper.cpp b/src/linkgraph/flowmapper.cpp new file mode 100644 index 000000000..70779e8ec --- /dev/null +++ b/src/linkgraph/flowmapper.cpp @@ -0,0 +1,62 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. + */ + +/** @file flowmapper.cpp Definition of flowmapper. */ + +#include "../stdafx.h" +#include "flowmapper.h" + +/** + * Map the paths generated by the MCF solver into flows associated with nodes. + * @param component the link graph component to be used. + */ +void FlowMapper::Run(LinkGraphJob &job) const +{ + /* Time the graph has been running without being compressed. */ + uint runtime = job.JoinDate() - job.Settings().recalc_time - job.LastCompression(); + + for (NodeID node_id = 0; node_id < job.Size(); ++node_id) { + Node prev_node = job[node_id]; + StationID prev = prev_node.Station(); + PathList &paths = prev_node.Paths(); + for (PathList::iterator i = paths.begin(); i != paths.end(); ++i) { + Path *path = *i; + uint flow = path->GetFlow(); + if (flow == 0) continue; + /* compress to monthly value */ + flow = max(1U, flow * 30 / runtime); + Node node = job[path->GetNode()]; + StationID via = node.Station(); + StationID origin = job[path->GetOrigin()].Station(); + assert(prev != via && via != origin); + /* Mark all of the flow for local consumption at "first". */ + node.Flows().AddFlow(origin, via, flow); + if (prev != origin) { + /* Pass some of the flow marked for local consumption at "prev" on + * to this node. */ + prev_node.Flows().PassOnFlow(origin, via, flow); + } else { + /* Prev node is origin. Simply add flow. */ + prev_node.Flows().AddFlow(origin, via, flow); + } + } + } + + for (NodeID node_id = 0; node_id < job.Size(); ++node_id) { + /* Remove local consumption shares marked as invalid. */ + Node node = job[node_id]; + node.Flows().FinalizeLocalConsumption(node.Station()); + /* Clear paths. */ + PathList &paths = node.Paths(); + for (PathList::iterator i = paths.begin(); i != paths.end(); ++i) { + delete *i; + } + paths.clear(); + } +} |