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; } }
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); }
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); }
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); }
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); }