# Conflicts: # src/console_gui.cpp # src/lang/korean.txt # src/video/sdl2_v.cpp # src/video/sdl2_v.h # src/window.cpp # src/window_gui.h
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * 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"
 | 
						|
 | 
						|
#include "../safeguards.h"
 | 
						|
 | 
						|
/**
 | 
						|
 * Map the paths generated by the MCF solver into flows associated with nodes.
 | 
						|
 * @param job the link graph component to be used.
 | 
						|
 */
 | 
						|
void FlowMapper::Run(LinkGraphJob &job) const
 | 
						|
{
 | 
						|
	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::reverse_iterator i = paths.rbegin(); i != paths.rend(); ++i) {
 | 
						|
			Path *path = *i;
 | 
						|
			if (!path) continue;
 | 
						|
			uint flow = path->GetFlow();
 | 
						|
			if (flow == 0) break;
 | 
						|
			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];
 | 
						|
		FlowStatMap &flows = node.Flows();
 | 
						|
		flows.FinalizeLocalConsumption(node.Station());
 | 
						|
		if (this->scale) {
 | 
						|
			/* Scale by time the graph has been running without being compressed. Add 1 to avoid
 | 
						|
			 * division by 0 if spawn date == last compression date. This matches
 | 
						|
			 * LinkGraph::Monthly(). */
 | 
						|
			uint runtime = (job.StartDateTicks() / DAY_TICKS) - job.LastCompression() + 1;
 | 
						|
			for (FlowStatMap::iterator i = flows.begin(); i != flows.end(); ++i) {
 | 
						|
				i->ScaleToMonthly(runtime);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		/* Clear paths. */
 | 
						|
		node.Paths().clear();
 | 
						|
	}
 | 
						|
	job.path_allocator.ResetArena();
 | 
						|
}
 |