use crate::assignment::{AssignmentConfig, BprFunction};
use crate::trip_distribution::furness::FurnessConfig;
use crate::verbose::VerboseLevel;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssignmentMethodType {
FrankWolfe,
Msa,
GradientProjection,
}
impl std::fmt::Display for AssignmentMethodType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
AssignmentMethodType::FrankWolfe => "frank_wolfe",
AssignmentMethodType::Msa => "msa",
AssignmentMethodType::GradientProjection => "gradient_projection",
};
write!(f, "{}", s)
}
}
#[derive(Debug, Clone)]
pub struct ModelConfig {
pub assignment_method: AssignmentMethodType,
pub bpr: BprFunction,
pub assignment_config: AssignmentConfig,
pub furness_config: FurnessConfig,
pub feedback_iterations: usize,
pub verbose_level: VerboseLevel,
pub gp_step_scale: f64,
}
impl Default for ModelConfig {
fn default() -> Self {
ModelConfig {
assignment_method: AssignmentMethodType::FrankWolfe,
bpr: BprFunction::default(),
assignment_config: AssignmentConfig::default(),
furness_config: FurnessConfig::default(),
feedback_iterations: 3,
verbose_level: VerboseLevel::None,
gp_step_scale: 0.1,
}
}
}
impl ModelConfig {
pub fn new() -> ModelConfigBuilder {
ModelConfigBuilder {
instance: ModelConfig::default(),
}
}
}
pub struct ModelConfigBuilder {
instance: ModelConfig,
}
impl ModelConfigBuilder {
pub fn with_assignment_method(mut self, method: AssignmentMethodType) -> Self {
self.instance.assignment_method = method;
self
}
pub fn with_bpr(mut self, alpha: f64, beta: f64) -> Self {
self.instance.bpr = BprFunction::new(alpha, beta);
self
}
pub fn with_max_iterations(mut self, max_iter: usize) -> Self {
self.instance.assignment_config.max_iterations = max_iter;
self
}
pub fn with_convergence_gap(mut self, gap: f64) -> Self {
self.instance.assignment_config.convergence_gap = gap;
self
}
pub fn with_furness_max_iterations(mut self, max_iter: usize) -> Self {
self.instance.furness_config.max_iterations = max_iter;
self
}
pub fn with_furness_tolerance(mut self, tol: f64) -> Self {
self.instance.furness_config.tolerance = tol;
self
}
pub fn with_feedback_iterations(mut self, n: usize) -> Self {
self.instance.feedback_iterations = n;
self
}
pub fn with_verbose_level(mut self, level: VerboseLevel) -> Self {
self.instance.verbose_level = level;
self
}
pub fn with_gp_step_scale(mut self, scale: f64) -> Self {
self.instance.gp_step_scale = scale;
self
}
pub fn build(self) -> ModelConfig {
self.instance
}
}