///|
pub fn default_scenario_config() -> ScenarioConfig {
{
steps: 12,
interval_seconds: 45.0,
base_speed: 10.0,
congestion: 0.35,
noise_stride: 4,
noise_magnitude: 65.0,
}
}
///|
fn scenario_speed(config : ScenarioConfig, index : Int) -> Double {
let wave = if index % 3 == 0 {
0.92
} else if index % 3 == 1 {
1.08
} else {
1.0
}
let congestion_factor = 1.0 - clamp(config.congestion, 0.0, 0.9) * 0.55
clamp(config.base_speed * wave * congestion_factor, 0.5, 60.0)
}
///|
fn scenario_noise(config : ScenarioConfig, index : Int) -> Double {
if config.noise_stride <= 0 {
0.0
} else if index % config.noise_stride == 0 {
config.noise_magnitude
} else if index % config.noise_stride == config.noise_stride - 1 {
0.0 - config.noise_magnitude * 0.45
} else {
0.0
}
}
///|
pub fn generate_scenario(
route : RouteProfile,
config : ScenarioConfig,
) -> ScenarioTrace {
let observations : Array[Observation] = []
let actual_remaining : Array[Double] = []
let route_distance = route.total_distance()
let mut distance = 0.0
let mut elapsed = 0.0
for i in 0.. ScenarioTrace {
generate_scenario(demo_route(), default_scenario_config())
}