solverforge-fsr / src /data /bergamo_catalog.rs
blackopsrepl's picture
feat(core): scale Bergamo routing model
610cbd2
use crate::domain::Location;
#[derive(Clone, Copy)]
pub(super) struct LocationSeed {
pub id: &'static str,
pub label: &'static str,
pub lat: f64,
pub lng: f64,
pub territory: &'static str,
}
impl LocationSeed {
pub(super) fn to_location(self, kind: &'static str) -> Location {
Location::new(
self.id,
self.label,
self.label.to_string(),
coord_e6(self.lat),
coord_e6(self.lng),
kind.to_string(),
)
}
}
#[derive(Clone, Copy)]
pub(super) struct VisitProfile {
pub name: &'static str,
pub duration_minutes: i32,
pub earliest_minute: i32,
pub latest_minute: i32,
pub required_skill_mask: i64,
pub required_parts_mask: i64,
pub priority: i32,
}
#[derive(Clone, Copy)]
pub(super) struct TechnicianSeed {
pub id: &'static str,
pub name: &'static str,
pub color: &'static str,
pub start_location_idx: usize,
pub end_location_idx: usize,
pub skill_mask: i64,
pub inventory_mask: i64,
pub territory: &'static str,
}
pub(super) const SKILL_HVAC: i64 = 0b0001;
pub(super) const SKILL_ELECTRICAL: i64 = 0b0010;
pub(super) const SKILL_PLUMBING: i64 = 0b0100;
pub(super) const SKILL_ELEVATOR: i64 = 0b1000;
pub(super) const PART_FILTERS: i64 = 0b0001;
pub(super) const PART_RELAYS: i64 = 0b0010;
pub(super) const PART_VALVES: i64 = 0b0100;
pub(super) const PART_SENSORS: i64 = 0b1000;
fn coord_e6(value: f64) -> i32 {
(value * 1_000_000.0).round() as i32
}