Example #1
0
void TourData::Attraction_Report (void)
{
	int i, zone, attr;
	Integers totals;
	
	Table_Itr table_itr;
	Int_Map_Itr map_itr;

	Show_Message ("Zone Attractions Report -- Record");
	Set_Progress ();

	Header_Number (ATTRACTIONS);
	New_Page ();

	totals.assign (table_groups.size (), 0);

	for (map_itr = zone_map.begin (); map_itr != zone_map.end (); map_itr++) {
		zone = map_itr->first;
		Show_Progress ();

		Print (1, String ("%5d") % zone);

		for (i=0, table_itr = table_groups.begin (); table_itr != table_groups.end (); table_itr++, i++) {
			attr = table_itr->zone_wt [zone];
			Print (0, String (" %8d") % attr);
			totals [i] += attr;
		}
	}
	End_Progress ();

	Print (2, "Total");

	for (i=0, table_itr = table_groups.begin (); table_itr != table_groups.end (); table_itr++, i++) {
		Print (0, String (" %8d") % totals [i]);
	}

	Header_Number (0);
}
Example #2
0
void LinkSum::Top_100_Ratios (int type)
{
	int i, j, k, num, anode, bnode, min_ratio, ratio, tod_list, tod, lanes;
	int load, base, cap, capacity, tim, vol, time0, len;

	Link_Data *link_ptr;
	Performance_Data *perf_ptr;
	Link_Use_Data *use_ptr;
	Range_Data *range_ptr;

	//---- Top 100 Ratio Report Data ----

	typedef struct {
		int link;
		int from;
		int to;
		int period;
		int base;
		int load;
		int ratio;
	} Ratio_Data;

	Ratio_Data ratios [100], *ptr;

	Show_Message ("Creating the Top 100 Ratios Report -- Record");
	Set_Progress (10000);

	memset (ratios, '\0', 100 * sizeof (Ratio_Data));

	//---- find Top 100 Ratios ----

	min_ratio = 0;

	for (link_ptr = link_data.First (); link_ptr; link_ptr = link_data.Next ()) {
		Show_Progress ();

		if (select_flag && link_ptr->Use () == 0) continue;

		len = link_ptr->Length ();

		for (i=0; i < 2; i++) {
			if (i) {
				if (link_ptr->Use () == -1) continue;
				perf_ptr = performance_data [link_ptr->BA_Dir ()];
				anode = link_ptr->Bnode ();
				bnode = link_ptr->Anode ();
			} else {
				if (link_ptr->Use () == -2) continue;
				perf_ptr = performance_data [link_ptr->AB_Dir ()];
				anode = link_ptr->Anode ();
				bnode = link_ptr->Bnode ();
			}
			if (perf_ptr == NULL) continue;

			time0 = perf_ptr->Time0 ();
			if (time0 == 0) continue;

			capacity = cap = (int) (perf_ptr->Capacity () * cap_factor + 0.5);

			tod_list = perf_ptr->TOD_List ();

			lanes = perf_ptr->Thru ();
			if (lanes < 1) lanes = 1;

			num = perf_ptr->Periods ();

			//---- scan each time period ----
			
			for (j=1; j <= num; j++) {

				vol = perf_ptr->Volume (j);

				if (vol < min_volume) continue;

				switch (type) {
					case TOP_SPEED:
						tim = Round (perf_ptr->TTime (j));
						if (tim == 0) continue;
						base = (len * 10 + time0 / 2) / time0;
						load = (len * 10 + tim / 2) / tim;
						ratio = ((base - load) * 1000 + base / 2) / base;
						break;
					case TOP_TIME_RATIO:
						base = Resolve (time0 * 10);
						load = Resolve (Round (perf_ptr->TTime (j)) * 10);
						ratio = (load * 1000 + base / 2) / base;
						break;
					case TOP_VC_RATIO:
						if (tod_list > 0) {

							//---- get the time period ----

							range_ptr = time_periods [j];

							tod = Round ((range_ptr->High () + range_ptr->Low () + 1) / 2);
							cap = capacity;

							for (k = tod_list; k; k = use_ptr->TOD_List ()) {
								use_ptr = link_use_data [k]; 

								if (use_ptr->Start () <= tod && tod < use_ptr->End ()) {
									cap = capacity * use_ptr->Lanes () / lanes;
									break;
								}
							}
						}
						base = cap;
						if (base == 0) continue;
						load = vol;
						ratio = (load * 1000 + base / 2) / base;
						break;
					case TOP_TIME_CHANGE:
						if (perf_ptr->Volume2 (j) < min_volume) continue;
						base = Resolve (Round (perf_ptr->TTime2 (j)) * 10);
						if (base == 0) continue;
						load= Resolve (Round (perf_ptr->TTime (j)) * 10);
						ratio = ((load - base) * 1000 + base / 2) / base;
						break;
					case TOP_VOL_CHANGE:
						base = perf_ptr->Volume2 (j);
						if (base < min_volume) continue;
						load = vol;
						ratio = ((load - base) * 1000 + base / 2) / base;
						break;
				} 
				
				if (ratio > min_ratio) {
					ptr = ratios;

					for (k=0; k < 100; k++, ptr++) {
						if (ratio > ptr->ratio) {
							if (ptr->ratio > 0 && k < 99) {
								memmove (ptr+1, ptr, (99-k) * sizeof (Ratio_Data));							
								min_ratio = ratios [99].ratio;
							}
							ptr->link = link_ptr->Link ();
							ptr->from = anode;
							ptr->to = bnode;
							ptr->period = j;
							ptr->base = base;
							ptr->load = load;
							ptr->ratio = ratio;
							break;
						}
					}
				}
			}
		}
	}
	End_Progress ();

	//---- print the report ----

	Header_Number (type);
	New_Page ();

	ptr = ratios;

	for (i=0; i < 100; i++, ptr++) {
		if (ptr->ratio == 0) break;

		//---- print the data record ----

		Print (1, "%10ld%10ld%10ld  %12.12s   ",
			ptr->link, ptr->from, ptr->to, 
			time_periods.Range_Format (ptr->period));

		if (type == TOP_VC_RATIO) {
			Print (0, "%7d  %7d   %5.2lf", ptr->base, ptr->load, ptr->ratio / 1000.0);
		} else if (type == TOP_VOL_CHANGE) {
			Print (0, "%7d  %7d   %5.1lf", ptr->base, ptr->load, ptr->ratio / 10.0);
		} else {
			Print (0, "%7.1lf  %7.1lf   %5.1lf", ptr->base / 10.0, ptr->load / 10.0, ptr->ratio / 10.0);
		}
	}
	if (i) {
		Print (2, "Number of Records in the Report = %d", i);
	}
	Header_Number (0);
}
Example #3
0
void LineSum::Compare (void)
{
	int mode;
	Dtime time;
	Db_Header *fh;
	File_Itr file_itr;
	Sort_Key sort_key;

	Route_Data route_rec, *base_ptr, *alt_ptr;
	Route_Map_Itr route_itr, base_itr;
	Route_Map_Stat route_stat;
	Route_Map base_map, alt_map;

	//---- compare files ----

	Show_Message ("Reading Base Route Files -- Record");
	Set_Progress ();

	for (mode=1, file_itr = base_routes.begin (); file_itr != base_routes.end (); file_itr++, mode++) {
		fh = *file_itr;

		while (fh->Read ()) {
			Show_Progress ();

			sort_key.mode = (short) mode;	//(short) fh->Get_Integer ("MODE");
			sort_key.leg = (short) 1;
			sort_key.name = fh->Get_String ("NAME");

			time = fh->Get_Time ("HEADWAY1");
			route_rec.headway1 = (int) time.Minutes ();

			time = fh->Get_Time ("HEADWAY2");
			route_rec.headway2 = (int) time.Minutes ();

			time = fh->Get_Time ("TTIME1");
			route_rec.ttime1 = (int) time.Minutes ();

			time = fh->Get_Time ("TTIME2");
			route_rec.ttime2 = (int) time.Minutes ();

			route_rec.nodes = fh->Get_Integer ("NODES");
			route_rec.notes = fh->Get_String ("NOTES");
			route_rec.match = 0;

			route_stat = base_map.insert (Route_Map_Data (sort_key, route_rec));
			if (!route_stat.second) {
				sort_key.leg = (short) 2;
				route_stat = base_map.insert (Route_Map_Data (sort_key, route_rec));
			}
		}
	}
	End_Progress ();

	//---- compare files ----

	Show_Message ("Reading Alternative Route Files -- Record");
	Set_Progress ();
	
	New_Page ();
	Header_Number (DIFFERENCE_REPORT);
	Compare_Header ();

	for (mode=1, file_itr = alt_routes.begin (); file_itr != alt_routes.end (); file_itr++, mode++) {
		fh = *file_itr;

		while (fh->Read ()) {
			Show_Progress ();

			sort_key.mode = (short) mode;	//(short) fh->Get_Integer ("MODE");
			sort_key.leg = (short) 1;
			sort_key.name = fh->Get_String ("NAME");

			time = fh->Get_Time ("HEADWAY1");
			route_rec.headway1 = (int) time.Minutes ();

			time = fh->Get_Time ("HEADWAY2");
			route_rec.headway2 = (int) time.Minutes ();

			time = fh->Get_Time ("TTIME1");
			route_rec.ttime1 = (int) time.Minutes ();

			time = fh->Get_Time ("TTIME2");
			route_rec.ttime2 = (int) time.Minutes ();

			route_rec.nodes = fh->Get_Integer ("NODES");
			route_rec.notes = fh->Get_String ("NOTES");

			route_rec.match = 0;

			route_stat = alt_map.insert (Route_Map_Data (sort_key, route_rec));
			if (!route_stat.second) {
				sort_key.leg = (short) 2;
				route_stat = alt_map.insert (Route_Map_Data (sort_key, route_rec));
			}
		}
	}
	End_Progress ();

	for (route_itr = alt_map.begin (); route_itr != alt_map.end (); route_itr++) {
		sort_key = route_itr->first;
		alt_ptr = &route_itr->second;

		base_itr = base_map.find (route_itr->first);

		if (base_itr == base_map.end ()) {
			Print (1, String ("%3d   %-12.12s") % sort_key.mode % sort_key.name);
			Print (0, String ("  %6.1lf   %6.1lf   %6.1lf   %6.1lf  %5d    %6.1lf   %6.1lf   %6.1lf   %6.1lf  %5d  ") %
				0 % 0 % 0 % 0 % 0 %
				alt_ptr->headway1 % alt_ptr->ttime1 % alt_ptr->headway2 % alt_ptr->ttime2 % alt_ptr->nodes);
			Print (0, alt_ptr->notes);
		} else {
			base_ptr = &base_itr->second;
			base_ptr->match = 1;

			if (base_ptr->headway1 != alt_ptr->headway1 || base_ptr->headway2 != alt_ptr->headway2 ||
				base_ptr->ttime1 != alt_ptr->ttime1 || base_ptr->ttime2 != alt_ptr->ttime2 ||
				base_ptr->nodes != alt_ptr->nodes) {

				Print (1, String ("%3d   %-12.12s") % sort_key.mode % sort_key.name);
				Print (0, String ("  %6.1lf   %6.1lf   %6.1lf   %6.1lf  %5d    %6.1lf   %6.1lf   %6.1lf   %6.1lf  %5d  ") %
					base_ptr->headway1 % base_ptr->ttime1 % base_ptr->headway2 % base_ptr->ttime2 % base_ptr->nodes %
					alt_ptr->headway1 % alt_ptr->ttime1 % alt_ptr->headway2 % alt_ptr->ttime2 % alt_ptr->nodes);
				Print (0, base_ptr->notes);
			}
		}
	}

	for (base_itr = base_map.begin (); base_itr != base_map.end (); base_itr++) {
		if (base_itr->second.match == 0) {
			sort_key = base_itr->first;
			base_ptr = &base_itr->second;

			Print (1, String ("%3d   %-12.12s") % sort_key.mode % sort_key.name);
			Print (0, String ("  %6.1lf   %6.1lf   %6.1lf   %6.1lf  %5d    %6.1lf   %6.1lf   %6.1lf   %6.1lf  %5d  ") %
				base_ptr->headway1 % base_ptr->ttime1 % base_ptr->headway2 % base_ptr->ttime2 % base_ptr->nodes %
				0 % 0 % 0 % 0 % 0);
			Print (0, base_ptr->notes);
		}
	}
	Header_Number (0);
}
Example #4
0
void LinkSum::Link_Report (double min_volume)
{
	bool flag;
	int i, ab_index, ba_index, ab_flow, ba_flow, an, bn;
	double flow;
	String ab, ba;
	
	Link_Itr link_itr;
	Link_Perf_Period_Itr period_itr;
	Flow_Time_Data flow_data;

	Show_Message ("Creating a Link Event Report -- Record");
	Set_Progress ();

	//---- find volumes greater than min_volume ----

	header_value = DTOI (min_volume);

	Header_Number (LINK_REPORT);
	New_Page ();

	for (link_itr = link_array.begin (); link_itr != link_array.end (); link_itr++) {
		Show_Progress ();

		if (select_flag && link_itr->Use () == 0) continue;

		ab_index = (link_itr->Use () != -2) ? link_itr->AB_Dir () : -1;
		ba_index = (link_itr->Use () != -1) ? link_itr->BA_Dir () : -1;

		ab_flow = (ab_index >= 0) ? dir_array [ab_index].Flow_Index () : -1;
		ba_flow = (ba_index >= 0) ? dir_array [ba_index].Flow_Index () : -1;

		//---- scan each period volume ----

		for (i=0, period_itr = link_perf_array.begin (); period_itr != link_perf_array.end (); period_itr++, i++) {
			ab.clear ();
			ba.clear ();
			flag = false;

			if (ab_index >= 0) {
				flow_data = period_itr->Total_Flow_Time (ab_index, ab_flow);

				flow = flow_data.Flow ();
				if (flow >= min_volume) {
					ab = String ("%d") % DTOI (flow);
					flag = true;
				}
			}
			if (ba_index >= 0) {
				flow_data = period_itr->Total_Flow_Time (ba_index, ba_flow);

				flow = flow_data.Flow ();
				if (flow >= min_volume) {
					ba = String ("%d") % DTOI (flow);
					flag = true;
				}
			}
			if (!flag) continue;

			Show_Progress ();

			//---- print the data record ----
		
			an = node_array [link_itr->Anode ()].Node ();
			bn = node_array [link_itr->Bnode ()].Node ();

			Print (1, String ("%10d%10d%10d  %12.12s%10.10s %10.10s") % link_itr->Link () % an % 
				bn % sum_periods.Range_Format (i) % ab % ba);
		}
	}
	End_Progress ();

	if (Progress_Count ()) {
		Print (2, "Number of Records in the Report = ") << Progress_Count ();
	}
	Header_Number (0);
}
Example #5
0
void LinkSum::Top_100_Report (int type)
{
	int i, j, k, anode, bnode, an, bn, max_tim, max_an, max_bn;
	int tod_list, lanes, max_lanes, index, flow_index;
	double flow, min_flow, max_flow;
	Dtime low, high, tod;

	Link_Itr link_itr;
	Dir_Data *dir_ptr;
	Link_Perf_Period_Itr period_itr;
	Flow_Time_Data flow_time;
	Lane_Use_Period *use_ptr;

	//---- Top 100 Data ----

	typedef struct {
		int    link;
		int    from;
		int    to;
		int    period;
		double flow;
	} Flow_Data;

	Flow_Data flow_data [100], *flow_ptr;

	Show_Message ("Creating the Top 100 Flow Report -- Record");
	Set_Progress ();

	memset (flow_data, '\0', 100 * sizeof (Flow_Data));

	//---- find Top 100 Flows ----

	min_flow = 0;

	for (link_itr = link_array.begin (); link_itr != link_array.end (); link_itr++) {
		Show_Progress ();

		if (select_flag && link_itr->Use () == 0) continue;

		an = node_array [link_itr->Anode ()].Node ();
		bn = node_array [link_itr->Bnode ()].Node ();

		for (i=0; i < 2; i++) {
			if (i) {
				if (link_itr->Use () == -1) continue;
				index = link_itr->BA_Dir ();
				anode = bn;
				bnode = an;
			} else {
				if (link_itr->Use () == -2) continue;
				index = link_itr->AB_Dir ();
				anode = an;
				bnode = bn;
			}
			if (index < 0) continue;
			dir_ptr = &dir_array [index];

			max_flow = max_tim = max_an = max_bn = 0;

			max_lanes = lanes = dir_ptr->Lanes ();
			tod_list = dir_ptr->First_Lane_Use ();
			flow_index = dir_ptr->Flow_Index ();

			//---- scan each time period ----

			for (j=0, period_itr = link_perf_array.begin (); period_itr != link_perf_array.end (); period_itr++, j++) {
				flow_time = period_itr->Total_Flow_Time (index, flow_index);

				flow = flow_time.Flow ();
				if (flow < minimum_flow) continue;

				if (type == TOP_PERIOD) {
					if (flow <= min_flow) continue;

					flow_ptr = flow_data;

					for (k=0; k < 100; k++, flow_ptr++) {
						if (flow > flow_ptr->flow) {
							if (flow_ptr->flow > 0 && k < 99) {
								memmove (flow_ptr+1, flow_ptr, (99-k) * sizeof (Flow_Data));
								min_flow = flow_data [99].flow;
							}
							flow_ptr->link = link_itr->Link ();
							flow_ptr->from = anode;
							flow_ptr->to = bnode;
							flow_ptr->period = j;
							flow_ptr->flow = flow;
							break;
						}
					}
				} else {
					if (type == TOP_LANE_FLOW) {
						if (tod_list >= 0) {

							//---- get the time period ----

							sum_periods.Period_Range (j, low, high);
							tod = (low + high + 1) / 2;

							lanes = max_lanes;
							k = tod_list;

							for (use_ptr = &use_period_array [k]; ; use_ptr = &use_period_array [++k]) {
								if (use_ptr->Start () <= tod && tod < use_ptr->End ()) {
									lanes = use_ptr->Lanes0 () + use_ptr->Lanes1 ();
									break;
								}
								if (use_ptr->Periods () == 0) break;
							}
						}
						if (lanes > 1) flow /= lanes;
					}
					flow = DTOI (flow);

					if (flow > max_flow) {
						max_flow = flow;
						max_tim = j;
						max_an = anode;
						max_bn = bnode;
					}
				}
			}

			//---- add to the list ----

			if (max_flow > min_flow) {
				flow_ptr = flow_data;

				for (k=0; k < 100; k++, flow_ptr++) {
					if (max_flow > flow_ptr->flow) {
						if (flow_ptr->flow > 0 && k < 99) {
							memmove (flow_ptr+1, flow_ptr, (99-k) * sizeof (Flow_Data));							
							min_flow = flow_data [99].flow;
						}
						flow_ptr->link = link_itr->Link ();
						flow_ptr->from = max_an;
						flow_ptr->to = max_bn;
						flow_ptr->period = max_tim;
						flow_ptr->flow = max_flow;
						break;
					}
				}
			}
		}
	}
	End_Progress ();

	//---- print the report ----

	flow_ptr = flow_data;

	Header_Number (type);
	New_Page ();

	for (i=0; i < 100; i++, flow_ptr++) {
		if (flow_ptr->flow <= 0.0) break;

		//---- print the data record ----

		Print (1, String ("%10d%10d%10d  %12.12s%12.1lf") % flow_ptr->link % flow_ptr->from % flow_ptr->to % 
			sum_periods.Range_Format (flow_ptr->period) % flow_ptr->flow);
	}
	if (i) {
		Print (2, "Number of Records in the Report = ") << i;
	}
	Header_Number (0);
}
Example #6
0
void LinkSum::Top_100_Ratios (int type)
{
	int i, j, k, anode, bnode, an, bn, min_ratio, ratio, tod_list, lanes, lane;
	int load, base, cap, capacity, tim, vol, time0, len, index, flow_index;
	double flow;
	Dtime low, high, tod;

	Link_Itr link_itr;
	Dir_Data *dir_ptr;
	Link_Perf_Period_Itr period_itr;
	Link_Perf_Array *period_ptr;
	Flow_Time_Data flow_data;
	Lane_Use_Period *use_ptr;

	//---- Top 100 Ratio Report Data ----

	typedef struct {
		int link;
		int from;
		int to;
		int period;
		int base;
		int load;
		int ratio;
	} Ratio_Data;

	Ratio_Data ratios [100], *ptr;

	Show_Message ("Creating the Top 100 Ratios Report -- Record");
	Set_Progress ();

	memset (ratios, '\0', 100 * sizeof (Ratio_Data));

	//---- find Top 100 Ratios ----

	min_ratio = base = load = ratio = 0;

	for (link_itr = link_array.begin (); link_itr != link_array.end (); link_itr++) {
		Show_Progress ();

		if (select_flag && link_itr->Use () == 0) continue;

		an = node_array [link_itr->Anode ()].Node ();
		bn = node_array [link_itr->Bnode ()].Node ();

		for (i=0; i < 2; i++) {
			if (i) {
				if (link_itr->Use () == -1) continue;
				index = link_itr->BA_Dir ();
				anode = bn;
				bnode = an;
			} else {
				if (link_itr->Use () == -2) continue;
				index = link_itr->AB_Dir ();
				anode = an;
				bnode = bn;
			}
			if (index < 0) continue;
			dir_ptr = &dir_array [index];

			len = link_itr->Length ();

			lanes = dir_ptr->Lanes ();
			if (lanes < 1) lanes = 1;

			tod_list = dir_ptr->First_Lane_Use ();
			flow_index = dir_ptr->Flow_Index ();

			time0 = dir_ptr->Time0 ();
			if (time0 == 0) continue;

			capacity = cap = DTOI (dir_ptr->Capacity () * cap_factor);

			//---- scan each time period ----

			for (j=0, period_itr = link_perf_array.begin (); period_itr != link_perf_array.end (); period_itr++, j++) {
				flow_data = period_itr->Total_Flow_Time (index, flow_index);

				flow = flow_data.Flow ();
				if (flow < minimum_flow) continue;

				tim = flow_data.Time ();
				vol = DTOI (flow);

				switch (type) {
					case TOP_SPEED:
						if (tim == 0) continue;
						base = (len * 10 + time0 / 2) / time0;
						load = (len * 10 + tim / 2) / tim;
						ratio = ((base - load) * 1000 + base / 2) / base;
						break;
					case TOP_TIME_RATIO:
						base = time0;
						load = tim;
						ratio = (load * 1000 + base / 2) / base;
						break;
					case TOP_VC_RATIO:
						if (tod_list >= 0) {
							sum_periods.Period_Range (j, low, high);

							tod = (low + high + 1) / 2;
							cap = capacity;
							k = tod_list;

							for (use_ptr = &use_period_array [k]; ; use_ptr = &use_period_array [++k]) {
								if (use_ptr->Start () <= tod && tod < use_ptr->End ()) {
									lane = use_ptr->Lanes0 () + use_ptr->Lanes1 ();
									cap = capacity * lane / lanes;
									break;
								}
								if (use_ptr->Periods () == 0) break;
							}
						}
						base = cap;
						if (base == 0) continue;
						load = vol;
						ratio = (load * 1000 + base / 2) / base;
						break;
					case TOP_TIME_CHANGE:
						period_ptr = &compare_link_array [j];

						flow_data = period_ptr->Total_Flow_Time (index, flow_index);
						if (flow_data.Flow () < minimum_flow) continue;
						base = flow_data.Time ();
						if (base == 0) continue;
						load = tim;
						ratio = ((load - base) * 1000 + base / 2) / base;
						break;
					case TOP_VOL_CHANGE:
						period_ptr = &compare_link_array [j];

						flow_data = period_ptr->Total_Flow_Time (index, flow_index);
						base = DTOI (flow_data.Flow ());
						if (base < minimum_flow) continue;
						load = vol;
						ratio = ((load - base) * 1000 + base / 2) / base;
						break;
				} 
				
				if (ratio > min_ratio) {
					ptr = ratios;

					for (k=0; k < 100; k++, ptr++) {
						if (ratio > ptr->ratio) {
							if (ptr->ratio > 0 && k < 99) {
								memmove (ptr+1, ptr, (99-k) * sizeof (Ratio_Data));							
								min_ratio = ratios [99].ratio;
							}
							ptr->link = link_itr->Link ();
							ptr->from = anode;
							ptr->to = bnode;
							ptr->period = j;
							ptr->base = base;
							ptr->load = load;
							ptr->ratio = ratio;
							break;
						}
					}
				}
			}
		}
	}
	End_Progress ();

	//---- print the report ----

	Header_Number (type);
	New_Page ();

	ptr = ratios;

	for (i=0; i < 100; i++, ptr++) {
		if (ptr->ratio == 0) break;

		//---- print the data record ----

		Print (1, String ("%10ld%10ld%10ld  %12.12s   ") % ptr->link % ptr->from % ptr->to % 
			sum_periods.Range_Format (ptr->period));

		if (type == TOP_VC_RATIO) {
			Print (0, String ("%7d  %7d   %5.2lf") % ptr->base % ptr->load % (ptr->ratio / 1000.0));
		} else if (type == TOP_VOL_CHANGE) {
			Print (0, String ("%7d  %7d   %5.1lf") % ptr->base % ptr->load % (ptr->ratio / 10.0));
		} else {
			Print (0, String ("%7.1lf  %7.1lf   %5.1lf") % (ptr->base / 10.0) % (ptr->load / 10.0) % (ptr->ratio / 10.0));
		}
	}
	if (i) {
		Print (2, "Number of Records in the Report = ") << i;
	}
	Header_Number (0);
}
Example #7
0
void LinkSum::Link_Report (double min_volume)
{
	bool flag;
	int i, num;
	char ab [12], ba [12];

	Link_Data *link_ptr;
	Performance_Data *ttime_ab, *ttime_ba;

	Show_Message ("Creating a Link Event Report -- Record");
	Set_Progress (10000);

	//---- find volumes greater than min_volume ----

	header_value = (int) (min_volume + 0.5);

	Header_Number (LINK_REPORT);
	New_Page ();

	for (link_ptr = link_data.First_Key (); link_ptr; link_ptr = link_data.Next_Key ()) {

		if (select_flag && link_ptr->Use () == 0) continue;

		//---- get the directional information ----

		ttime_ab = performance_data [link_ptr->AB_Dir ()];
		ttime_ba = performance_data [link_ptr->BA_Dir ()];

		num = 0;

		if (ttime_ab != NULL) {
			num = ttime_ab->Periods ();
		} else if (ttime_ba != NULL) {
			num = ttime_ba->Periods ();
		}
		if (num == 0) continue;

		//---- scan each period volume ----

		for (i=1; i <= num; i++) {

			ab [0] = ba [0] = '\0';
			flag = false;

			if (ttime_ab != NULL && link_ptr->Use () != -2) {
				if (ttime_ab->Volume (i) > header_value) {
					str_fmt (ab, sizeof (ab), "%d", ttime_ab->Volume (i));
					flag = true;
				}
			}
			if (ttime_ba != NULL && link_ptr->Use () != -1) {
				if (ttime_ba->Volume (i) > header_value) {
					str_fmt (ba, sizeof (ba), "%d", ttime_ba->Volume (i));
					flag = true;
				}
			}
			if (!flag) continue;

			Show_Progress ();

			//---- print the data record ----

			Print (1, "%10d%10d%10d  %12.12s%10.10s %10.10s",
				link_ptr->Link (), link_ptr->Anode (), link_ptr->Bnode (), 
				time_periods.Range_Format (i), ab, ba);
		}
	}
	End_Progress ();

	if (Progress_Count ()) {
		Print (2, "Number of Records in the Report = %d", Progress_Count ());
	}
	Header_Number (0);
}
Example #8
0
void LineSum::Link_Report (Link_Report_Data &report)
{
	int i, anode, bnode, mode, dir;
	int ab_pk_tot, ab_op_tot, ba_pk_tot, ba_op_tot, ab_tot, ba_tot, pk_tot, op_tot, total;
	int ab_pk_max, ab_op_max, ba_pk_max, ba_op_max, ab_max, ba_max, pk_max, op_max, maximum;	
	int ab_pk_pmt, ab_op_pmt, ba_pk_pmt, ba_op_pmt, ab_pmt, ba_pmt, pk_pmt, op_pmt, pmt;
	int ab_pk_pht, ab_op_pht, ba_pk_pht, ba_op_pht, ab_pht, ba_pht, pk_pht, op_pht, pht;

	Leg_Data *leg_ptr;
	Line_Map_Itr map_itr;
	Str_Itr str_itr;
	Str_Map_Itr name_itr;
	String name;
	Int_Itr int_itr, b_itr;
	Range_Array_Itr range_itr;

	Link_Map link_map;
	Sort_Key sort_key;
	Link_Data link_rec, *link_ptr;
	Link_Map_Itr link_itr;
	Link_Map_Stat map_stat;

	memset (&link_rec, '\0', sizeof (link_rec));
	
	Show_Message (String ("Creating Link Report #%d -- Records") % report.number);
	Set_Progress ();

	//---- report header ----

	New_Page ();
	Print (2, "Title: ") << report.title;
	Print (1, "Links: ") << report.links;

	if (!report.all_modes) {
		Print (1, "Modes:");
		for (i=0, range_itr = report.modes.begin (); range_itr != report.modes.end (); range_itr++, i++) {
			if (!(i % 10)) {
				if (i) {
					Print (1, "       ") << range_itr->Low ();
				} else {
					Print (0, " ") << range_itr->Low ();
				}
			} else {
				Print (0, ", ") << range_itr->Low ();
			}
			if (range_itr->High () > range_itr->Low ()) {
				Print (0, "..") << range_itr->High ();
			}
		}
	}
	if (!report.all_lines) {
		Print (1, "Lines:");

		for (i=0, str_itr = report.lines.begin (); str_itr != report.lines.end (); str_itr++, i++) {
			if (!(i % 10)) {
				if (i) {
					Print (1, "       ") << *str_itr;
				} else {
					Print (0, " ") << *str_itr;
				}
			} else {
				Print (0, ", ") << *str_itr;
			}
		}
	}

	//---- flag connected links ----

	for (i=0, int_itr = report.nodes.begin (); int_itr != report.nodes.end (); int_itr += 2, i++) {
		anode = *int_itr;

		for (b_itr = report.nodes.begin (); b_itr != report.nodes.end (); b_itr++) {
			bnode = *(++b_itr);
			if (bnode == anode) {
				*(int_itr) = -anode;
				break;
			}
		}
	}

	Header_Number (LINK_REPORT);
	Link_Header ();

	ab_pk_tot = ab_op_tot = ba_pk_tot = ba_op_tot = ab_tot = ba_tot = pk_tot = op_tot = total = 0;
	ab_pk_max = ab_op_max = ba_pk_max = ba_op_max = ab_max = ba_max = pk_max = op_max = maximum = 0;	
	ab_pk_pmt = ab_op_pmt = ba_pk_pmt = ba_op_pmt = ab_pmt = ba_pmt = pk_pmt = op_pmt = pmt = 0;
	ab_pk_pht = ab_op_pht = ba_pk_pht = ba_op_pht = ab_pht = ba_pht = pk_pht = op_pht = pht = 0;

	//---- gather peak ridership ----

	for (map_itr = peak_map.begin (); map_itr != peak_map.end (); map_itr++) {
		mode = map_itr->first.mode;

		if (!report.all_modes && !report.modes.In_Range (mode)) continue;

		name = map_itr->first.name;

		if (!report.all_lines) {
			for (str_itr = report.lines.begin (); str_itr != report.lines.end (); str_itr++) {
				if (name.In_Range (*str_itr)) break;
			}
			if (str_itr == report.lines.end ()) continue;
		}
		dir = anode = bnode = 0;
		leg_ptr = &map_itr->second;
		
		for (int_itr = report.nodes.begin (); int_itr != report.nodes.end (); int_itr++) {
			anode = *int_itr;
			bnode = *(++int_itr);

			if (abs (leg_ptr->a) == abs (anode) && abs (leg_ptr->b) == bnode) {
				dir = 1;
				break;
			} else if (abs (leg_ptr->a) == bnode && abs (leg_ptr->b) == abs (anode)) {
				dir = 2;
				break;
			}
		}
		if (dir == 0) continue;

		Show_Progress ();
	
		//---- search for the link ----

		sort_key.mode = (short) mode;
		sort_key.leg = 0;
		sort_key.name = name;

		map_stat = link_map.insert (Link_Map_Data (sort_key, link_rec));

		if (dir == 1) {
			if (anode < 0) {
				map_stat.first->second.ab_pk_ride += leg_ptr->ab.on;
				ab_pk_tot += leg_ptr->ab.on;
			} else {
				map_stat.first->second.ab_pk_ride += leg_ptr->ab.ride;
				ab_pk_tot += leg_ptr->ab.ride;
			}
			ab_pk_pmt += leg_ptr->ab.ride * leg_ptr->dist;
			ab_pk_pht += leg_ptr->ab.ride * leg_ptr->time;

			if (!report.dir_flag) {
				if (anode < 0) {
					map_stat.first->second.ba_pk_ride += leg_ptr->ba.off;
					ba_pk_tot += leg_ptr->ba.off;
				} else {
					map_stat.first->second.ba_pk_ride += leg_ptr->ba.ride;
					ba_pk_tot += leg_ptr->ba.ride;
				}
				ba_pk_pmt += leg_ptr->ba.ride * leg_ptr->dist;
				ba_pk_pht += leg_ptr->ba.ride * leg_ptr->time;
			}
		} else {
			if (anode < 0) {
				map_stat.first->second.ab_pk_ride += leg_ptr->ba.on;
				ab_pk_tot += leg_ptr->ba.on;
			} else {
				map_stat.first->second.ab_pk_ride += leg_ptr->ba.ride;
				ab_pk_tot += leg_ptr->ba.ride;
			}
			ab_pk_pmt += leg_ptr->ba.ride * leg_ptr->dist;
			ab_pk_pht += leg_ptr->ba.ride * leg_ptr->time;

			if (!report.dir_flag) {
				if (anode < 0) {
					map_stat.first->second.ba_pk_ride += leg_ptr->ab.off;
					ba_pk_tot += leg_ptr->ab.off;
				} else {
					map_stat.first->second.ba_pk_ride += leg_ptr->ab.ride;
					ba_pk_tot += leg_ptr->ab.ride;
				}
				ba_pk_pmt += leg_ptr->ab.ride * leg_ptr->dist;
				ba_pk_pht += leg_ptr->ab.ride * leg_ptr->time;
			}
		}
	}

	//---- gather offpeak ridership ----

	for (map_itr = offpeak_map.begin (); map_itr != offpeak_map.end (); map_itr++) {
		mode = map_itr->first.mode;

		if (!report.all_modes && !report.modes.In_Range (mode)) continue;

		name = map_itr->first.name;

		if (!report.all_lines) {
			for (str_itr = report.lines.begin (); str_itr != report.lines.end (); str_itr++) {
				if (name.In_Range (*str_itr)) break;
			}
			if (str_itr == report.lines.end ()) continue;
		}
		dir = anode = bnode = 0;
		leg_ptr = &map_itr->second;
		
		for (int_itr = report.nodes.begin (); int_itr != report.nodes.end (); int_itr++) {
			anode = *int_itr;
			bnode = *(++int_itr);

			if (abs (leg_ptr->a) == abs (anode) && abs (leg_ptr->b) == bnode) {
				dir = 1;
				break;
			} else if (abs (leg_ptr->a) == bnode && abs (leg_ptr->b) == abs (anode)) {
				dir = 2;
				break;
			}
		}
		if (dir == 0) continue;

		Show_Progress ();
	
		//---- search for the link ----

		sort_key.mode = (short) mode;
		sort_key.leg = 0;
		sort_key.name = name;

		map_stat = link_map.insert (Link_Map_Data (sort_key, link_rec));
		
		if (dir == 1) {
			if (anode < 0) {
				map_stat.first->second.ab_op_ride += leg_ptr->ab.on;
				ab_op_tot += leg_ptr->ab.on;
			} else {
				map_stat.first->second.ab_op_ride += leg_ptr->ab.ride;
				ab_op_tot += leg_ptr->ab.ride;
			}
			ab_op_pmt += leg_ptr->ab.ride * leg_ptr->dist;
			ab_op_pht += leg_ptr->ab.ride * leg_ptr->time;

			if (!report.dir_flag) {
				if (anode < 0) {
					map_stat.first->second.ba_op_ride += leg_ptr->ba.off;
					ba_op_tot += leg_ptr->ba.off;
				} else {
					map_stat.first->second.ba_op_ride += leg_ptr->ba.ride;
					ba_op_tot += leg_ptr->ba.ride;
				}
				ba_op_pmt += leg_ptr->ba.ride * leg_ptr->dist;
				ba_op_pht += leg_ptr->ba.ride * leg_ptr->time;
			}
		} else {
			if (anode < 0) {
				map_stat.first->second.ab_op_ride += leg_ptr->ba.on;
				ab_op_tot += leg_ptr->ba.on;
			} else {
				map_stat.first->second.ab_op_ride += leg_ptr->ba.ride;
				ab_op_tot += leg_ptr->ba.ride;
			}
			ab_op_pmt += leg_ptr->ba.ride * leg_ptr->dist;
			ab_op_pht += leg_ptr->ba.ride * leg_ptr->time;

			if (!report.dir_flag) {
				if (anode < 0) {
					map_stat.first->second.ba_op_ride += leg_ptr->ab.off;
					ba_op_tot += leg_ptr->ab.off;
				} else {
					map_stat.first->second.ba_op_ride += leg_ptr->ab.ride;
					ba_op_tot += leg_ptr->ab.ride;
				}
				ba_op_pmt += leg_ptr->ab.ride * leg_ptr->dist;
				ba_op_pht += leg_ptr->ab.ride * leg_ptr->time;
			}
		}
	}

	//---- exit if no data ----

	if (link_map.size () == 0) {
		Warning ("No Link Data to Report");
		return;
	}

	//---- print the report ----

	for (link_itr = link_map.begin (); link_itr != link_map.end (); link_itr++) {
		sort_key = link_itr->first;
		link_ptr = &link_itr->second;
		
		ab_tot = link_ptr->ab_pk_ride + link_ptr->ab_op_ride;
		ba_tot = link_ptr->ba_pk_ride + link_ptr->ba_op_ride;
		pk_tot = link_ptr->ab_pk_ride + link_ptr->ba_pk_ride;
		op_tot = link_ptr->ab_op_ride + link_ptr->ba_op_ride;
		total = pk_tot + op_tot;

		Print (1, String ("%3d    %-12.12s  %7d  %7d  %7d   %7d  %7d  %7d   %7d  %7d  %7d") %
			(int) sort_key.mode % sort_key.name % link_ptr->ab_pk_ride % link_ptr->ab_op_ride % ab_tot %
			link_ptr->ba_pk_ride % link_ptr->ba_op_ride % ba_tot % pk_tot % op_tot % total);

		if (link_ptr->ab_pk_ride > ab_pk_max) ab_pk_max = link_ptr->ab_pk_ride;
		if (link_ptr->ab_op_ride > ab_op_max) ab_op_max = link_ptr->ab_op_ride;
		if (ab_tot > ab_max) ab_max = ab_tot;
		if (pk_tot > pk_max) pk_max = pk_tot;

		if (link_ptr->ba_pk_ride > ba_pk_max) ba_pk_max = link_ptr->ba_pk_ride;
		if (link_ptr->ba_op_ride > ba_op_max) ba_op_max = link_ptr->ba_op_ride;
		if (ba_tot > ba_max) ba_max = ba_tot;
		if (op_tot > op_max) op_max = op_tot;

		if (total > maximum) maximum = total;
	}

	//---- print the totals ----

	ab_tot = ab_pk_tot + ab_op_tot;
	ba_tot = ba_pk_tot + ba_op_tot;
	pk_tot = ab_pk_tot + ba_pk_tot;
	op_tot = ab_op_tot + ba_op_tot;
	total = pk_tot + op_tot;

	Print (2, String ("Total  %-3d           %7d  %7d  %7d   %7d  %7d  %7d   %7d  %7d  %7d") %
		(int) link_map.size () % ab_pk_tot % ab_op_tot % ab_tot %
		ba_pk_tot % ba_op_tot % ba_tot % pk_tot % op_tot % total);

	Print (2, String ("Maximum              %7d  %7d  %7d   %7d  %7d  %7d   %7d  %7d  %7d") %
		ab_pk_max % ab_op_max % ab_max % ba_pk_max % ba_op_max % ba_max % pk_max % op_max % maximum);

	ab_pmt = ab_pk_pmt + ab_op_pmt;
	ba_pmt = ba_pk_pmt + ba_op_pmt;
	pk_pmt = ab_pk_pmt + ba_pk_pmt;
	op_pmt = ab_op_pmt + ba_op_pmt;
	pmt = pk_pmt + op_pmt;

	ab_pk_pmt = (ab_pk_pmt + 50) / 100;
	ab_op_pmt = (ab_op_pmt + 50) / 100;
	ab_pmt = (ab_pmt + 50) / 100;
	ba_pk_pmt = (ba_pk_pmt + 50) / 100;
	ba_op_pmt = (ba_op_pmt + 50) / 100;
	ba_pmt = (ba_pmt + 50) / 100;
	pk_pmt = (pk_pmt + 50) / 100;
	op_pmt = (op_pmt + 50) / 100;
	pmt = (pmt + 50) / 100;

	Print (1, String ("Passenger Miles      %7d  %7d  %7d   %7d  %7d  %7d   %7d  %7d  %7d") %
		ab_pk_pmt % ab_op_pmt % ab_pmt % ba_pk_pmt % ba_op_pmt % ba_pmt % pk_pmt % op_pmt % pmt);
	
	ab_pht = ab_pk_pht + ab_op_pht;
	ba_pht = ba_pk_pht + ba_op_pht;
	pk_pht = ab_pk_pht + ba_pk_pht;
	op_pht = ab_op_pht + ba_op_pht;
	pht = pk_pht + op_pht;

	ab_pk_pht = (ab_pk_pht + 3000) / 6000;
	ab_op_pht = (ab_op_pht + 3000) / 6000;
	ab_pht = (ab_pht + 3000) / 6000;
	ba_pk_pht = (ba_pk_pht + 3000) / 6000;
	ba_op_pht = (ba_op_pht + 3000) / 6000;
	ba_pht = (ba_pht + 3000) / 6000;
	pk_pht = (pk_pht + 3000) / 6000;
	op_pht = (op_pht + 3000) / 6000;
	pht = (pht + 3000) / 6000;

	Print (1, String ("Passenger Hours      %7d  %7d  %7d   %7d  %7d  %7d   %7d  %7d  %7d") %
		ab_pk_pht % ab_op_pht % ab_pht % ba_pk_pht % ba_op_pht % ba_pht % pk_pht % op_pht % pht);

	End_Progress ();

	Header_Number (0);
}
Example #9
0
void LineSum::Line_Rider_Report (int number)
{
	int stop, stops, run, runs, period, per, num, time;
	int on, off, tot_on, tot_off, tot_ride, stop_id;
	bool first, last_stop_flag, stop_flag, line_flag;

	Rider_Data *rider_ptr;
	Offset_Data *offset_ptr;

	typedef struct {
		int ride;
		int tot_on;
		int tot_off;
		int tot_ride;
		int max_on;
		int max_off;
		int max_ride;
	} Period_Data;

	Period_Data *period_data, *period_ptr;

	Show_Message ("Creating a Line Ridership Report -- Record");
	Set_Progress (100);

	//---- initialize the selection sets ----

	set_ptr = select_set [number];
	if (set_ptr == NULL) return;

	Header_Number (LINE_RIDER);
	first = true;

	num = set_ptr->Num_Periods () + 1;
	period_data = new Period_Data [num];

	if (period_data == NULL) {
		Error ("Insufficient Space for %d Time Periods", num);
	}

	//---- process each route ----

	for (rider_ptr = rider_data.First_Key (); rider_ptr; rider_ptr = rider_data.Next_Key ()) {
		Show_Progress ();

		if (!set_ptr->Select_Modes (rider_ptr->Mode ())) continue;
		if (!set_ptr->Select_Routes (rider_ptr->Route ())) continue;

		stops = rider_ptr->Stops ();
		runs = rider_ptr->Runs ();

		memset (period_data, '\0', num * sizeof (Period_Data));
		line_flag = false;
		last_stop_flag = stop_flag = true;

		for (stop=1; stop <= stops; stop++) {
			stop_id = rider_ptr->Stop (stop);

			if (offset_flag && set_ptr->Subarea_Flag ()) {
				offset_ptr = stop_offset.Get (stop_id);
				if (offset_ptr == NULL) continue;

				stop_flag = set_ptr->In_Subarea (offset_ptr->X (), offset_ptr->Y ());
			}
			if (stop_flag) {
				if (!line_flag) {
					if (first) {
						New_Page ();
						first = false;
					} else {
						Break_Check (MIN ((stops - stop + 8), 15));
					}
					Print (1, "Line: %s %d  %s", Transit_Code ((Transit_Type) rider_ptr->Mode ()), 
						rider_ptr->Route (), rider_ptr->Name ());
					Print (1);
					line_flag = true;
				}
				Print (1, "%8d", stop_id);
			}
			tot_on = tot_off = tot_ride = 0;

			for (per=1; per < num; per++) {

				on = off = 0;
				period_ptr = period_data + per;

				for (run=1; run <= runs; run++) {
					switch (set_ptr->Time_Method ()) {
						case RUN_START:
							time = rider_ptr->Time (run, 1);
							break;
						case RUN_END:
							time = rider_ptr->Time (run, stops);
							break;
						case RUN_MID:
							time = (rider_ptr->Time (run, 1) + rider_ptr->Time (run, stops)) / 2;
							break;
						case SCHED_START:
							time = rider_ptr->Schedule (run, 1);
							break;
						case SCHED_END:
							time = rider_ptr->Schedule (run, stops);
							break;
						case SCHED_MID:
							time = (rider_ptr->Schedule (run, 1) + rider_ptr->Schedule (run, stops)) / 2;
							break;
					}
					period = set_ptr->Time_Period (Resolve (time));

					if (period < per) continue;
					if (period > per) break;

					on += rider_ptr->Board (run, stop);
					off += rider_ptr->Alight (run, stop);
				}
				if (stop_flag && !last_stop_flag) {
					period_ptr->tot_ride += period_ptr->ride;
				}
				period_ptr->ride += on - off;

				if (stop_flag) {
					Print (0, " %7d%7d%7d", on, off, period_ptr->ride);
				
					tot_on += on;
					tot_off += off;
					tot_ride += period_ptr->ride;

					period_ptr->tot_on += on;
					period_ptr->tot_off += off;
					period_ptr->tot_ride += on;
					if (on > period_ptr->max_on) period_ptr->max_on = on;
					if (off > period_ptr->max_off) period_ptr->max_off = off;
					if (period_ptr->ride > period_ptr->max_ride) period_ptr->max_ride = period_ptr->ride;
				}
			}
			if (stop_flag && num > 2) {
				Print (0, " %7d%7d%7d", tot_on, tot_off, tot_ride);

				period_ptr = period_data;

				period_ptr->tot_on += tot_on;
				period_ptr->tot_off += tot_off;
				period_ptr->tot_ride += tot_ride;
				if (tot_on > period_ptr->max_on) period_ptr->max_on = tot_on;
				if (tot_off > period_ptr->max_off) period_ptr->max_off = tot_off;
				if (tot_ride > period_ptr->max_ride) period_ptr->max_ride = tot_ride;
			}
			last_stop_flag = stop_flag;
		}
		if (line_flag) {
			Print (2, "   Total");

			for (per=1; per <= num; per++) {
				if (per == num) {
					if (num > 2) {
						per = 0;
					} else {
						break;
					}
				}
				period_ptr = period_data + per;

				Print (0, " %7d%7d%7d", period_ptr->tot_on, period_ptr->tot_off, period_ptr->tot_ride);
				if (per == 0) break;
			}

			Print (1, " Maximum");

			for (per=1; per <= num; per++) {
				if (per == num) {
					if (num > 2) {
						per = 0;
					} else {
						break;
					}
				}
				period_ptr = period_data + per;

				Print (0, " %7d%7d%7d", period_ptr->max_on, period_ptr->max_off, period_ptr->max_ride);
				if (per == 0) break;
			}
			Print (1);
		}
	}
	End_Progress ();

	Header_Number (0);

	if (period_data != NULL) {
		delete [] period_data;
	}
}
Example #10
0
void LineSum::Stop_Report (Stop_Report_Data &report)
{
	int i, stop, mode, dir, arrive, on, off, depart, max_arrive, max_on, max_off, max_depart;
	int pk_on, pk_off, op_on, op_off, pk_xfer, op_xfer;
	String name;

	Range_Array_Itr range_itr;
	Leg_Data *leg_ptr;
	Line_Map_Itr map_itr;
	Access_Map_Itr access_itr;
	Str_Itr str_itr;
	Str_Map_Itr name_itr;

	Sort_Key sort_key;
	Stop_Data stop_rec, *stop_ptr, max_rec, tot_rec;
	Stop_Map stop_map;
	Stop_Map_Itr stop_itr;
	Stop_Map_Stat stop_stat;
	
	memset (&stop_rec, '\0', sizeof (stop_rec));
	memset (&max_rec, '\0', sizeof (max_rec));
	memset (&tot_rec, '\0', sizeof (tot_rec));
	max_arrive = max_depart = max_off = max_on = pk_on = pk_off = op_on = op_off = pk_xfer = op_xfer = 0;

	Show_Message (String ("Creating Stop Report #%d -- Stops") % report.number);
	Set_Progress ();

	//---- report header ----

	New_Page ();
	Print (2, "Title: ") << report.title;
	Print (1, "Stops:");

	for (i=0, range_itr = report.stops.begin (); range_itr != report.stops.end (); range_itr++, i++) {
		if (!(i % 10)) {
			if (i) {
				Print (1, "       ") << range_itr->Low ();
			} else {
				Print (0, " ") << range_itr->Low ();
			}
		} else {
			Print (0, ", ") << range_itr->Low ();
		}
		if (range_itr->High () > range_itr->Low ()) {
			Print (0, "..") << range_itr->High ();
		} else {
			name_itr = stop_names.find (range_itr->Low ());

			if (name_itr != stop_names.end ()) {
				Print (0, String (" (%s)") % name_itr->second);
			}
		}
	}
	if (!report.all_modes) {
		Print (1, "Modes:");
		for (i=0, range_itr = report.modes.begin (); range_itr != report.modes.end (); range_itr++, i++) {
			if (!(i % 10)) {
				if (i) {
					Print (1, "       ") << range_itr->Low ();
				} else {
					Print (0, " ") << range_itr->Low ();
				}
			} else {
				Print (0, ", ") << range_itr->Low ();
			}
			if (range_itr->High () > range_itr->Low ()) {
				Print (0, "..") << range_itr->High ();
			}
		}
	}
	if (!report.all_lines) {
		Print (1, "Lines:");

		for (i=0, str_itr = report.lines.begin (); str_itr != report.lines.end (); str_itr++, i++) {
			if (!(i % 10)) {
				if (i) {
					Print (1, "       ") << *str_itr;
				} else {
					Print (0, " ") << *str_itr;
				}
			} else {
				Print (0, ", ") << *str_itr;
			}
		}
	}
	Header_Number (STOP_REPORT);
	Stop_Header ();

	//---- gather peak ridership ----

	for (map_itr = peak_map.begin (); map_itr != peak_map.end (); map_itr++) {
		mode = map_itr->first.mode;
	
		if (!report.all_modes && !report.modes.In_Range (mode)) continue;

		name = map_itr->first.name;

		if (!report.all_lines) {
			for (str_itr = report.lines.begin (); str_itr != report.lines.end (); str_itr++) {
				if (name.In_Range (*str_itr)) break;
			}
			if (str_itr == report.lines.end ()) continue;
		}
		dir = 0;
		leg_ptr = &map_itr->second;

		stop = abs (leg_ptr->b);

		if (report.stops.In_Range (stop)) {
			dir = 1;
		} else {
			stop = abs (leg_ptr->a);

			if (report.stops.In_Range (stop)) {
				dir = 2;
			}
		}
		if (dir == 0) continue;
		Show_Progress ();

		sort_key.mode = (short) mode;
		sort_key.leg = 0;
		sort_key.name = name;

		stop_stat = stop_map.insert (Stop_Map_Data (sort_key, stop_rec));

		stop_ptr = &stop_stat.first->second;

		if (dir == 1) {
			stop_ptr->pk.arrive += leg_ptr->ab.ride;
			stop_ptr->pk.depart += leg_ptr->ba.ride;
			stop_ptr->pk.off += leg_ptr->ab.off;
			stop_ptr->pk.on += leg_ptr->ba.on;
		} else {
			stop_ptr->pk.arrive += leg_ptr->ba.ride;
			stop_ptr->pk.depart += leg_ptr->ab.ride;
			stop_ptr->pk.off += leg_ptr->ba.off;
			stop_ptr->pk.on += leg_ptr->ab.on;
		}
	}

	//---- gather peak access data ----

	for (access_itr = access_map.begin (); access_itr != access_map.end (); access_itr++) {
		mode = access_itr->first.mode;

		if (!report.all_modes && !report.modes.In_Range (mode)) continue;

		stop = access_itr->first.stop;

		if (!report.stops.In_Range (stop)) continue;
		
		Show_Progress ();

		on = access_itr->second.pk_on;
		off = access_itr->second.pk_off;

		stop = access_itr->first.node;

		if (report.stops.In_Range (stop)) {
			on /= 2;
			off /= 2;
		}
		pk_on += on;
		pk_off += off;

		if (report.transfers.In_Range (mode)) {
			pk_xfer += (on + off) / 2;
		}
		name ("%d") % mode;

		sort_key.mode = (short) mode;
		sort_key.leg = 0;
		sort_key.name = name;

		stop_stat = stop_map.insert (Stop_Map_Data (sort_key, stop_rec));

		stop_ptr = &stop_stat.first->second;

		stop_ptr->pk.arrive += on;
		stop_ptr->pk.depart += off;
	}

	//---- gather offpeak ridership ----

	for (map_itr = offpeak_map.begin (); map_itr != offpeak_map.end (); map_itr++) {
		mode = map_itr->first.mode;

		if (!report.all_modes && !report.modes.In_Range (mode)) continue;

		name = map_itr->first.name;

		if (!report.all_lines) {
			for (str_itr = report.lines.begin (); str_itr != report.lines.end (); str_itr++) {
				if (name.In_Range (*str_itr)) break;
			}
			if (str_itr == report.lines.end ()) continue;
		}
		dir = 0;
		leg_ptr = &map_itr->second;

		stop = abs (leg_ptr->b);

		if (report.stops.In_Range (stop)) {
			dir = 1;
		} else {
			stop = abs (leg_ptr->a);

			if (report.stops.In_Range (stop)) {
				dir = 2;
			}
		}
		if (dir == 0) continue;
		Show_Progress ();

		sort_key.mode = (short) mode;
		sort_key.leg = 0;
		sort_key.name = name;

		stop_stat = stop_map.insert (Stop_Map_Data (sort_key, stop_rec));

		stop_ptr = &stop_stat.first->second;

		if (dir == 1) {
			stop_ptr->op.arrive += leg_ptr->ab.ride;
			stop_ptr->op.depart += leg_ptr->ba.ride;
			stop_ptr->op.off += leg_ptr->ab.off;
			stop_ptr->op.on += leg_ptr->ba.on;
		} else {
			stop_ptr->op.arrive += leg_ptr->ba.ride;
			stop_ptr->op.depart += leg_ptr->ab.ride;
			stop_ptr->op.off += leg_ptr->ba.off;
			stop_ptr->op.on += leg_ptr->ab.on;
		}
	}

	//---- gather offpeak access data ----

	for (access_itr = access_map.begin (); access_itr != access_map.end (); access_itr++) {
		mode = access_itr->first.mode;

		if (!report.all_modes && !report.modes.In_Range (mode)) continue;

		stop = access_itr->first.stop;

		if (!report.stops.In_Range (stop)) continue;

		Show_Progress ();

		on = access_itr->second.op_on;
		off = access_itr->second.op_off;

		stop = access_itr->first.node;

		if (report.stops.In_Range (stop)) {
			on /= 2;
			off /= 2;
		}
		op_on += on;
		op_off += off;

		if (report.transfers.In_Range (mode)) {
			op_xfer += (on + off) / 2;
		}
		name ("%d") % mode;

		sort_key.mode = (short) mode;
		sort_key.leg = 0;
		sort_key.name = name;

		stop_stat = stop_map.insert (Stop_Map_Data (sort_key, stop_rec));
		
		stop_ptr = &stop_stat.first->second;

		stop_ptr->op.arrive += on;
		stop_ptr->op.depart += off;
	}
	End_Progress ();

	//---- exit if no data ----

	if (stop_map.size () == 0) {
		Warning ("No Stops to Report");
		return;
	}

	//---- print the report ----

	for (stop_itr = stop_map.begin (); stop_itr != stop_map.end (); stop_itr++) {
		mode = stop_itr->first.mode;
		name = stop_itr->first.name;

		stop_ptr = &stop_itr->second;

		arrive = stop_ptr->pk.arrive + stop_ptr->op.arrive;
		depart = stop_ptr->pk.depart + stop_ptr->op.depart;
		off = stop_ptr->pk.off + stop_ptr->op.off;
		on = stop_ptr->pk.on + stop_ptr->op.on;

		Print (1, String ("%3d    %-12.12s") % mode % name);

		Print (0, String ("  %8d%8d%8d%8d  %8d%8d%8d%8d  %8d%8d%8d%8d") %
			stop_ptr->pk.arrive % stop_ptr->pk.off % stop_ptr->pk.on % stop_ptr->pk.depart %
			stop_ptr->op.arrive % stop_ptr->op.off % stop_ptr->op.on % stop_ptr->op.depart %
			arrive % off % on % depart);

		tot_rec.pk.arrive += stop_ptr->pk.arrive;
		tot_rec.pk.depart += stop_ptr->pk.depart;
		tot_rec.pk.off += stop_ptr->pk.off;
		tot_rec.pk.on += stop_ptr->pk.on;

		tot_rec.op.arrive += stop_ptr->op.arrive;
		tot_rec.op.depart += stop_ptr->op.depart;
		tot_rec.op.off += stop_ptr->op.off;
		tot_rec.op.on += stop_ptr->op.on;

		if (stop_ptr->pk.arrive > max_rec.pk.arrive) max_rec.pk.arrive = stop_ptr->pk.arrive;
		if (stop_ptr->pk.depart > max_rec.pk.depart) max_rec.pk.depart = stop_ptr->pk.depart;
		if (stop_ptr->pk.off > max_rec.pk.off) max_rec.pk.off = stop_ptr->pk.off;
		if (stop_ptr->pk.on > max_rec.pk.on) max_rec.pk.on = stop_ptr->pk.on;

		if (stop_ptr->op.arrive > max_rec.op.arrive) max_rec.op.arrive = stop_ptr->op.arrive;
		if (stop_ptr->op.depart > max_rec.op.depart) max_rec.op.depart = stop_ptr->op.depart;
		if (stop_ptr->op.off > max_rec.op.off) max_rec.op.off = stop_ptr->op.off;
		if (stop_ptr->op.on > max_rec.op.on) max_rec.op.on = stop_ptr->op.on;

		if (arrive > max_arrive) max_arrive = arrive;
		if (depart > max_depart) max_depart = depart;
		if (off > max_off) max_off = off;
		if (on > max_on) max_on = on;
	}

	//---- print total ----

	arrive = tot_rec.pk.arrive + tot_rec.op.arrive;
	depart = tot_rec.pk.depart + tot_rec.op.depart;
	off = tot_rec.pk.off + tot_rec.op.off;
	on = tot_rec.pk.on + tot_rec.op.on;

	Print (2, String ("Total  %-4d          %8d%8d%8d%8d  %8d%8d%8d%8d  %8d%8d%8d%8d") % stop_map.size () %
		tot_rec.pk.arrive % tot_rec.pk.off % tot_rec.pk.on % tot_rec.pk.depart %
		tot_rec.op.arrive % tot_rec.op.off % tot_rec.op.on % tot_rec.op.depart %
		arrive % off % on % depart);

	if (report.transfers.size () > 0) {
		pk_xfer += (tot_rec.pk.on - pk_on + tot_rec.pk.off - pk_off) / 2;
		op_xfer += (tot_rec.op.on - op_on + tot_rec.op.off - op_off) / 2;

		Print (1, String ("Transfers                            %8d                          %8d                          %8d") %
			pk_xfer % op_xfer % (pk_xfer + op_xfer));
	}
	Print (1, String ("Maximum              %8d%8d%8d%8d  %8d%8d%8d%8d  %8d%8d%8d%8d") %
		max_rec.pk.arrive % max_rec.pk.off % max_rec.pk.on % max_rec.pk.depart %
		max_rec.op.arrive % max_rec.op.off % max_rec.op.on % max_rec.op.depart %
		max_arrive % max_off % max_on % max_depart);

	Header_Number (0);
}