use crate::model::cost::{network::NetworkCostRate, VehicleCostRate};
#[derive(Clone, Debug)]
pub struct CostFeature {
pub name: String,
pub weight: f64,
pub vehicle_cost_rate: VehicleCostRate,
pub network_cost_rate: NetworkCostRate,
pub is_accumulator: bool,
}
impl CostFeature {
pub fn zero(name: String) -> CostFeature {
CostFeature {
name,
weight: f64::default(),
vehicle_cost_rate: VehicleCostRate::default(),
network_cost_rate: NetworkCostRate::default(),
is_accumulator: false,
}
}
pub fn new(
name: String,
weight: Option<&f64>,
vehicle_rate: Option<&VehicleCostRate>,
network_rate: Option<&NetworkCostRate>,
is_accumulator: bool,
) -> CostFeature {
match (weight, vehicle_rate, network_rate) {
(None, _, _) => CostFeature::zero(name),
(Some(_), None, None) => CostFeature::zero(name),
(Some(w), None, Some(n)) => CostFeature {
name,
weight: *w,
vehicle_cost_rate: VehicleCostRate::default(),
network_cost_rate: n.clone(),
is_accumulator,
},
(Some(w), Some(v), None) => CostFeature {
name,
weight: *w,
vehicle_cost_rate: v.clone(),
network_cost_rate: NetworkCostRate::default(),
is_accumulator,
},
(Some(w), Some(v), Some(n)) => CostFeature {
name,
weight: *w,
vehicle_cost_rate: v.clone(),
network_cost_rate: n.clone(),
is_accumulator,
},
}
}
}