diff --git a/lib/App/FrameUtils.pm b/lib/App/FrameUtils.pm index 2656681ebc78a142f7a506c006f26e7ba2d13bb5..5026e6855a7a95d94b22a9301a6ecd2719a2207f 100644 --- a/lib/App/FrameUtils.pm +++ b/lib/App/FrameUtils.pm @@ -39,52 +39,6 @@ sub get_destination ->{'ekimei'}; } -sub get_patterns_at_sta -{ - my ($master, $rosen_id, $eki) = @_; - my $rosen = MasterUtils::get_rosen_frame $master, $rosen_id; - my $pos_down = MasterUtils::get_eki_position $master, $rosen_id, $eki; - my $pos_up = $rosen->{'eki_num'} - $pos_down - 1; - my @services_down = @{ $rosen->{'dia'}->{'kudari'} }; - my @services_up = @{ $rosen->{'dia'}->{'nobori'} }; - my %stopping_patterns; - - foreach my $ressya (@services_down) - { - my @jikoku = @{ $ressya->{'jikoku'} }; - my $pos = 0; - while ($pos != $pos_down) { shift @jikoku; $pos++; } - if (!defined $jikoku[0]) { next; } - - my $ts = $jikoku[0]; - my $time = $ts->{'hatsu'}; - # Timestamp has no dep time (only arrival time for ex) - if (!defined $time) { next; } - # This service does not stop here - if ($ts->{'mode'} != 1) { next; } - - $stopping_patterns{$ressya->{'syubetsu'}}++; - } - foreach my $ressya (@services_up) - { - my @jikoku = @{ $ressya->{'jikoku'} }; - my $pos = 0; - while ($pos != $pos_up) { shift @jikoku; $pos++; } - if (!defined $jikoku[0]) { next; } - - my $ts = $jikoku[0]; - my $time = $ts->{'hatsu'}; - # Timestamp has no dep time (only arrival time for ex) - if (!defined $time) { next; } - # This service does not stop here - if ($ts->{'mode'} != 1) { next; } - - $stopping_patterns{$ressya->{'syubetsu'}}++; - } - - return scalar keys %stopping_patterns; -} - sub hassya_hyou { my $master = $_[0]; diff --git a/lib/App/MasterUtils.pm b/lib/App/MasterUtils.pm index 6fc00e272ea979d483733629a57ab3b55e82dbae..4ba65ee1f16d960767c35713b9d2c9211a8bb487 100644 --- a/lib/App/MasterUtils.pm +++ b/lib/App/MasterUtils.pm @@ -141,4 +141,71 @@ sub get_routes @res ? return @res : Log::e "$id has no routes"; } +sub get_patterns_at_sta +{ + my ($master, $rosen_id, $eki) = @_; + my $rosen = get_rosen_frame $master, $rosen_id; + my $pos_down = get_eki_position $master, $rosen_id, $eki; + my $pos_up = $rosen->{'eki_num'} - $pos_down - 1; + my @services_down = @{ $rosen->{'dia'}->{'kudari'} }; + my @services_up = @{ $rosen->{'dia'}->{'nobori'} }; + my %stopping_patterns; + + foreach my $ressya (@services_down) + { + my @jikoku = @{ $ressya->{'jikoku'} }; + my $pos = 0; + while ($pos != $pos_down) { shift @jikoku; $pos++; } + if (!defined $jikoku[0]) { next; } + + my $ts = $jikoku[0]; + my $time = $ts->{'hatsu'}; + # Timestamp has no dep time (only arrival time for ex) + if (!defined $time) { next; } + # This service does not stop here + if ($ts->{'mode'} != 1) { next; } + + $stopping_patterns{$ressya->{'syubetsu'}}++; + } + foreach my $ressya (@services_up) + { + my @jikoku = @{ $ressya->{'jikoku'} }; + my $pos = 0; + while ($pos != $pos_up) { shift @jikoku; $pos++; } + if (!defined $jikoku[0]) { next; } + + my $ts = $jikoku[0]; + my $time = $ts->{'hatsu'}; + # Timestamp has no dep time (only arrival time for ex) + if (!defined $time) { next; } + # This service does not stop here + if ($ts->{'mode'} != 1) { next; } + + $stopping_patterns{$ressya->{'syubetsu'}}++; + } + + return scalar keys %stopping_patterns; +} + +sub build_metadata +{ + my ($master) = @_; + my $metadata = {}; + foreach my $rosen (keys %{ $master->{'rosen'} }) + { + my $frame = {}; + + # Add number of stopping patterns for each station / route + my $patterns = {}; + foreach my $eki (@{ $master->{'rosen'}->{$rosen}->{'eki'} }) + { + $patterns->{$eki} = get_patterns_at_sta $master, $rosen, $eki; + } + $frame->{'stopping_patterns'} = $patterns; + + $metadata->{$rosen} = $frame; + } + $master->{'metadata'} = $metadata; +} + 1; diff --git a/lib/App/Navi.pm b/lib/App/Navi.pm index 92e9bb467f796fbff273865f6a662db8396f35a8..b6455f57fe1397fbc136d819f2d49988f4cec1ef 100644 --- a/lib/App/Navi.pm +++ b/lib/App/Navi.pm @@ -194,7 +194,7 @@ sub Raptor_simple # This will most likely save a lot of time on routes with a great amount of stops / services (e.g. high-frequency lines) my $all_patterns = MasterUtils::get_patterns $master, $r; # TODO maybe move these computations to a "metadata" frame - my $stopping_patterns = FrameUtils::get_patterns_at_sta $master, $r, $pi; + my $stopping_patterns = $master->{'metadata'}->{$r}->{$pi}; if ($stopping_patterns < 2 && $all_patterns >= 3) { $mark = 0; diff --git a/src/oud2_parser.pl b/src/oud2_parser.pl index eefe008475483afc27742f98b2bc86b4b2765689..867daff4e521cfd33c08be06c3e2dd29caf68080 100644 --- a/src/oud2_parser.pl +++ b/src/oud2_parser.pl @@ -416,6 +416,8 @@ foreach my $frame (values %{ $master{'rosen'} }) $frame->{'eki'} = \@new_ekis; } +MasterUtils::build_metadata \%master; + # Parse transfer times my $recce = Marpa::R2::Scanless::R->new( { @@ -449,11 +451,11 @@ $master{'transfer_times'} = $transfers; # FrameUtils::hassya_hyou \%master, 'sekihoku1_28'; -my $d = MasterUtils::search_eki \%master, '石北大通'; -my $a = MasterUtils::search_eki \%master, '一区下'; +my $d = MasterUtils::search_eki \%master, '帯広'; +my $a = MasterUtils::search_eki \%master, '釧路'; sub eki { return MasterUtils::search_eki \%master, $_[0]; } -Navi::Raptor_simple \%master, $d, $a, 1120; +Navi::Raptor_simple \%master, $d, $a, 525; # FrameUtils::hassya_hyou \%master, (eki '古瀬');