use std::fmt::Debug;
use solverforge_core::domain::PlanningSolution;
use solverforge_scoring::Director;
use super::MoveTabuSignature;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct MoveAffectedEntity<'a> {
pub descriptor_index: usize,
pub entity_index: usize,
pub variable_name: &'a str,
}
pub trait Move<S: PlanningSolution>: Send + Sync + Debug {
fn is_doable<D: Director<S>>(&self, score_director: &D) -> bool;
fn do_move<D: Director<S>>(&self, score_director: &mut D);
fn descriptor_index(&self) -> usize;
fn entity_indices(&self) -> &[usize];
fn variable_name(&self) -> &str;
fn requires_hard_improvement(&self) -> bool {
false
}
fn tabu_signature<D: Director<S>>(&self, score_director: &D) -> MoveTabuSignature;
fn for_each_affected_entity(&self, visitor: &mut dyn FnMut(MoveAffectedEntity<'_>)) {
let descriptor_index = self.descriptor_index();
let variable_name = self.variable_name();
for &entity_index in self.entity_indices() {
visitor(MoveAffectedEntity {
descriptor_index,
entity_index,
variable_name,
});
}
}
}