///|
pub fn SegmentProfile::expected_speed(
self : SegmentProfile,
congestion~ : Double,
) -> Double {
let c = clamp(congestion, 0.0, 1.0)
let normal = self.free_flow_speed * (1.0 - c) + self.rush_hour_speed * c
normal * self.reliability + self.typical_speed * (1.0 - self.reliability)
}
///|
pub fn SegmentProfile::expected_seconds(
self : SegmentProfile,
congestion~ : Double,
) -> Double {
safe_div(self.distance, self.expected_speed(congestion~), 0.0)
}
///|
pub fn RouteProfile::total_distance(self : RouteProfile) -> Double {
let mut total = 0.0
for segment in self.segments {
total += segment.distance
}
total
}
///|
pub fn RouteProfile::historical_eta(
self : RouteProfile,
congestion~ : Double,
) -> Double {
let mut total = 0.0
for segment in self.segments {
total += segment.expected_seconds(congestion~)
}
total
}
///|
pub fn RouteProfile::average_reliability(self : RouteProfile) -> Double {
if self.segments.length() == 0 {
0.0
} else {
let mut total = 0.0
for segment in self.segments {
total += segment.reliability
}
total / self.segments.length().to_double()
}
}
///|
pub fn demo_route() -> RouteProfile {
{
segments: [
{
segment_id: "origin-ramp",
distance: 1600.0,
free_flow_speed: 18.0,
typical_speed: 13.0,
rush_hour_speed: 6.0,
reliability: 0.86,
},
{
segment_id: "arterial-1",
distance: 2800.0,
free_flow_speed: 16.0,
typical_speed: 10.5,
rush_hour_speed: 4.5,
reliability: 0.72,
},
{
segment_id: "last-mile",
distance: 950.0,
free_flow_speed: 11.0,
typical_speed: 7.5,
rush_hour_speed: 3.0,
reliability: 0.68,
},
],
}
}