solverforge-solver 0.19.7

Solver engine for SolverForge
Documentation
use solverforge_core::domain::PlanningSolution;
use solverforge_scoring::Director;

use crate::heuristic::r#move::Move;

#[inline]
pub(crate) fn entity_is_pinned<S: PlanningSolution, D: Director<S>>(
    director: &D,
    descriptor_index: usize,
    entity_index: usize,
) -> bool {
    director
        .solution_descriptor()
        .entity_descriptors
        .get(descriptor_index)
        .is_some_and(|descriptor| descriptor.is_pinned(director.working_solution(), entity_index))
}

#[inline]
pub(crate) fn move_changes_pinned<S: PlanningSolution, D: Director<S>, M: Move<S>>(
    mov: &M,
    director: &D,
) -> bool {
    if !director
        .solution_descriptor()
        .entity_descriptors
        .iter()
        .any(|descriptor| descriptor.has_pin_predicate())
    {
        return false;
    }
    let mut pinned = false;
    mov.for_each_affected_entity(&mut |entity| {
        if !pinned {
            pinned = entity_is_pinned(director, entity.descriptor_index, entity.entity_index);
        }
    });
    pinned
}