Exemple #1
0
void PlanSum::Page_Header (void)
{
	switch (Header_Number ()) {
		case TOP_100:			//---- Top 100 V/C Ratio Report ----
			Top_100_Header ();
			break;
		case VC_RATIO:			//---- All V/C Ratios Greater Than x.xx ---
			VC_Ratio_Header ();
			break;
		case LINK_GROUP:		//---- Link Group Report -----
			Link_Group_Header ();
			break;
		case SUM_RIDERS:		//---- Transit Ridership Report ----
			Transit_Header ();
			break;
		case SUM_STOPS:			//---- Transit Stop Report ----
			Stop_Header ();
			break;
		case SUM_TRANSFERS:		//---- Transit Transfer Report ----
		case XFER_DETAILS:		//---- Transit Transfer Details ----
			Transfer_Header ();
			break;
		case STOP_GROUP:		//---- Transit Stop Group Report ----
			Stop_Group_Header ();
			break;
		case SUM_PASSENGERS:	//---- Transit Passenger Summary ----
			Passenger_Header ();
			break;
		case RIDER_GROUP:		//---- Transit Link Group Summary ----
			Rider_Header ();
			break;
		case TRIP_TIME:			//---- Trip Time Report ----
			Trip_Time_Header ();
			break;
		case SUM_TRAVEL:		//---- Travel Summary Report ----
			Travel_Header ();
			break;
		default:
			break;
	}
}
Exemple #2
0
void PlanSum::Link_Group (double min_vc)
{
	int i, num, dir, link, cap, tod_cap, tod_cap2, lns, lanes, period, periods, index, flow_index;
	Dtime low, high;
	double flow, vc;
    string label;
	bool flag;

	Flow_Time_Period_Itr array_itr;
	Dir_Data *dir_ptr;
	Link_Data *link_ptr;
	Lane_Use_Period *period_ptr;
	Int_Set *list;
	Int_Set_Itr list_itr;
	Int_Map_Itr int_itr;

	Group_Array group_array;
	Group_Data zero, *data_ptr;

	memset (&zero, '\0', sizeof (zero));
	periods = sum_periods.Num_Periods ();

	Show_Message ("Writing the Link Group Report -- Record");
	Set_Progress ();

	minimum_vc = min_vc;

	//---- find V/C ratios for each link group ----

	num = link_equiv.Num_Groups ();

	Header_Number (LINK_GROUP);

	if (!Break_Check (num + 7)) {
		Print (1);
		Link_Group_Header ();
	}
	num = link_equiv.Max_Group ();

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

		list = link_equiv.Group_List (i);
		if (list == 0) continue;

		label = link_equiv.Group_Label (i);

		flag = false;
		group_array.assign (periods, zero);

		//---- process each link in the link group ----

		for (list_itr = list->begin (); list_itr != list->end (); list_itr++) {

			link = abs (*list_itr);
			
			int_itr = link_map.find (link);
			if (int_itr == link_map.end ()) continue;

			link_ptr = &link_array [int_itr->second];

			if (*list_itr < 0) {
				dir = link_ptr->BA_Dir ();
			} else {
				dir = link_ptr->AB_Dir ();
			}
			if (dir < 0) continue;
			
			//---- get the directional data ----

			dir_ptr = &dir_array [dir];

			cap = (int) (dir_ptr->Capacity () * cap_factor + 0.5);
			if (cap <= 0) continue;

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

			flow_index = dir_ptr->Flow_Index ();

			//---- process each time period ----

			for (period=0, array_itr = link_delay_array.begin (); array_itr != link_delay_array.end (); array_itr++, period++) {
				flow = array_itr->Flow (dir);

				//---- time-of-day capacity ----

				tod_cap = tod_cap2 = cap;
				index = dir_ptr->First_Lane_Use ();

				if (index >= 0) {
					sum_periods.Period_Range (period, low, high);
					low = (low + high) / 2;

					for (period_ptr = &use_period_array [index]; ; period_ptr = &use_period_array [++index]) {
						if (period_ptr->Start () <= low && low < period_ptr->End ()) {
							lns = period_ptr->Lanes (0);
							tod_cap = (tod_cap * lns + lanes / 2) / lanes;
							if (tod_cap == 0) tod_cap = cap / 2;

							lns = period_ptr->Lanes (1);
							tod_cap2 = (tod_cap2 * lns + lanes / 2) / lanes;
							if (tod_cap2 == 0) tod_cap2 = cap / 2;
							break;
						}
						if (period_ptr->Periods () == 0) break;
					}
				}
				if (tod_cap > 0) {
					data_ptr = &group_array [period];

					flag = true;
					data_ptr->links++;
					data_ptr->volume += DTOI (flow);
					data_ptr->capacity += tod_cap;

					if (flow_index >= 0 && tod_cap2 > 0) {
						flow = array_itr->Flow (flow_index);

						data_ptr->volume += DTOI (flow);
						data_ptr->capacity += tod_cap2;
					}
				}
			}
		}
		if (!flag) continue;

		//---- print the link group data ----

		flag = true;

		for (period=0; period < periods; period++) {
			data_ptr = &group_array [period];

			if (data_ptr->capacity <= 0) continue;

			vc = (double) data_ptr->volume / data_ptr->capacity;

			if (vc > min_vc) {
				Show_Progress ();

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

				if (flag) {
					flag = false;
					Print (1, label);
				}
				Print (1, String ("%20c%5d   %7d  %12.12s  %7d   %6.2lf") %
					BLANK % data_ptr->links % data_ptr->capacity % 
					sum_periods.Range_Format (period) % data_ptr->volume % vc);
			}
		}
	}
	End_Progress ();

	if (Progress_Count () > 0) {
		Print (2, "Number of Records in the Report = ") << Progress_Count ();
	}
	Header_Number (0);
}
Exemple #3
0
void LinkSum::Link_Group (double min_volume)
{
	int i, j, num, lnk, dir, link, use_index, group_num;
	String label;

	Link_Data *link_ptr;
	Perf_Period_Itr period_itr;
	Perf_Data perf_data;
	Int_Set *group;
	Int_Set_Itr itr;
	Int_Map_Itr map_itr;
	Doubles group_data;

	Show_Message ("Creating the Link Group Report -- Record");
	Set_Progress ();

	header_value = DTOI (min_volume);

	//---- find events for each link group ----

	num = link_equiv.Num_Groups ();

	Header_Number (LINK_GROUP);

	if (!Break_Check (num + 7)) {
		Print (1);
		Link_Group_Header ();
	}

	for (i = link_equiv.First_Group (); i > 0; i = link_equiv.Next_Group ()) {

		group = link_equiv.Group_List (i);
		if (group == 0) continue;

		label = link_equiv.Group_Label (i);

		group_num = 0;
		group_data.assign (num_inc, 0);

		//---- process each link in the link group ----

		for (itr = group->begin (); itr != group->end (); itr++) {

			link = *itr;
			lnk = abs (link);

			map_itr = link_map.find (lnk);
			if (map_itr == link_map.end ()) continue;

			link_ptr = &link_array [map_itr->second];

			if (link < 0) {
				dir = link_ptr->BA_Dir ();
			} else {
				dir = link_ptr->AB_Dir ();
			}
			if (dir < 0) continue;
			use_index = dir_array [dir].Use_Index ();

			group_num++;

			//---- get the directional data ----
		
			for (j=0, period_itr = perf_period_array.begin (); period_itr != perf_period_array.end (); period_itr++, j++) {
				perf_data = period_itr->Total_Performance (dir, use_index);

				group_data [j] += perf_data.Volume ();
			}
		}
		if (group_num == 0) continue;

		//---- print the link group data ----

		for (j=0; j < num_inc; j++) {
			if (group_data [j] < min_volume) continue;

			Show_Progress ();

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

			Print (1, String ("%4d  %-40.40s  %5d  %12.12s%9d") % 
				i % label % group_num % sum_periods.Range_Format (j) % group_data [j]);
		}
	}
	End_Progress ();

	if (Progress_Count ()) {
		Print (2, "Number of Records in the Report = ") << Progress_Count ();
	}
	Header_Number (0);
}
Exemple #4
0
void Validate::Link_Group_Stats (void)
{
	int i, n, lnk;
	String label;

	Group_Data *data;
	Group_Map_Itr map_itr;
	Statistics stats;
	Link_Data *link_ptr;
	Int_Set *list;
	Int_Set_Itr itr;
	Int_Map_Itr int_itr;

	for (i = 1; i <= link_equiv.Max_Group (); i++) {
		list = link_equiv.Group_List (i);

		if (list == 0) continue;

		for (itr = list->begin (); itr != list->end (); itr++) {
			lnk = *itr;
			int_itr = link_map.find (abs (lnk));
			if (int_itr == link_map.end ()) continue;

			link_ptr = &link_array [int_itr->second];

			if (lnk > 0 && link_ptr->AB_Dir () >= 0) {
				Sum_Group (i, link_ptr, link_ptr->AB_Dir ());
			} else if (lnk < 0 && link_ptr->BA_Dir () >= 0) {
				Sum_Group (i, link_ptr, link_ptr->BA_Dir ());
			}
		}
	}

	//---- print the page header ----
	
	Header_Number (LINK_GROUP);

	if (!Break_Check ((int) group_data.size () + 9)) {
		Print (1);
		Link_Group_Header ();
	}

	//---- print each link group ----

	for (map_itr = group_data.begin (); map_itr != group_data.end (); map_itr++) {
		data = &map_itr->second;
		n = data->number;
		if (n == 0) continue;
	
		Calc_Stats (data, stats);
		
		i = data->index;
		
		label = link_equiv.Group_Label (i);
		if (label.empty ()) {
			label = String ("Link Group %d") % i;
		}
		label = String ("%-25.25s") % label;
		Page_Check (1);
		Print (0, String (stats_format) % label % n % data->volume % data->count % 
			(data->volume - data->count) % stats.per_diff % stats.avg_error % stats.per_error % 
			stats.std_dev % stats.rmse % stats.r_sq % stats.avg_vc % data->max_vc);
	}
		
	//---- calculate the total statistics ----
	
	n = total.number;
	if (n > 0) {
		Calc_Stats (&total, stats);
		
		Page_Check (3);
		Print (0, "\n");
		label = String ("%-25.25s") % "TOTAL";
		Print (0, String (stats_format) % "TOTAL" % n % total.volume % total.count % 
			(total.volume - total.count) % stats.per_diff % stats.avg_error % stats.per_error % 
			stats.std_dev % stats.rmse % stats.r_sq % stats.avg_vc % total.max_vc);
		Print (0, "\n");
	}
	Header_Number (0);
}
Exemple #5
0
void PlanSum::Link_Group (double min_vc)
{
	int i, j, k, num, dir, lnk, link, volume, cap, tod_cap, lanes, tod, list;
	double vc;
    char *label;
	bool flag;

	Link_Data *link_ptr;
	TTime_Data *ttime_ptr;
	Link_Use_Data *use_ptr;
	Range_Data *range_ptr;
	Integer_List *group;

	typedef struct {
		int links;
		int capacity;
		int volume;
	} Group_Data;

	Group_Data *group_ptr;
	Data_Array group_data (sizeof (Group_Data));

	group_data.Num_Records (num_inc);

	Show_Message ("Writing the Link Group Report -- Record");
	Set_Progress (1000);

	minimum_vc = min_vc;

	//---- find V/C ratios for each link group ----

	num = link_equiv.Num_Groups ();

	Header_Number (LINK_GROUP);

	if (!Break_Check (num + 7)) {
		Print (1);
		Link_Group_Header ();
	}
	num = link_equiv.Max_Group ();

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

		group = link_equiv.Group_List (i);
		if (group == NULL) continue;

		label = link_equiv.Group_Label (i);

		flag = false;
		group_data.Zero_Fill ();

		//---- process each link in the link group ----

		for (link = group->First (); link != 0; link = group->Next ()) {

			lnk = abs (link);
			link_ptr = link_data.Get (lnk);

			if (link_ptr == NULL) continue;

			if (link < 0) {
				dir = link_ptr->BA_Dir ();
			} else {
				dir = link_ptr->AB_Dir ();
			}
			if (dir == 0) continue;
			
			//---- get the directional data ----

			ttime_ptr = ttime_data [dir];

			if (ttime_ptr->Periods () == 0) continue;

			cap = (int) (ttime_ptr->Capacity () * cap_factor + 0.5);
			if (cap <= 0) continue;

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

			list = ttime_ptr->TOD_List ();

			//---- process each time period ----
			
			for (j=1; j <= num_inc; j++) {

				volume = ttime_ptr->Data (j, layer);

				//---- time-of-day capacity ----

				tod_cap = cap;

				if (list > 0) {

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

					range_ptr = time_periods [j];
					tod = Round ((range_ptr->High () + range_ptr->Low () + 1) / 2);

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

						if (use_ptr->Start () <= tod && tod < use_ptr->End ()) {
							tod_cap = (tod_cap * use_ptr->Lanes () + lanes / 2) / lanes;
							break;
						}
					}
				}
				if (tod_cap > 0) {
					group_ptr = (Group_Data *) group_data [j];

					flag = true;
					group_ptr->links++;
					group_ptr->volume += volume;
					group_ptr->capacity += tod_cap;
				}
			}
		}

		if (!flag) continue;

		//---- print the link group data ----

		flag = true;

		for (j=1; j <= num_inc; j++) {
			group_ptr = (Group_Data *) group_data [j];

			if (group_ptr->capacity <= 0) continue;

			vc = (double) group_ptr->volume / group_ptr->capacity;

			if (vc > min_vc) {
				Show_Progress ();

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

				if (flag) {
					flag = false;
					Print (1, "%s", label);
				}
				Print (1, "%20c%5d   %7d  %12.12s  %7d   %6.2lf",
					BLANK, group_ptr->links, group_ptr->capacity, 
					time_periods.Range_Format (j), 
					group_ptr->volume, vc);
			}
		}
	}
	End_Progress ();

	if (Progress_Count () > 0) {
		Print (2, "Number of Records in the Report = %d", Progress_Count ());
	}
	Header_Number (0);
}