solverforge-solver 0.8.6

Solver engine for SolverForge
Documentation
use super::*;
use solverforge_core::score::SoftScore;

#[derive(Clone)]
struct TestSolution;

impl PlanningSolution for TestSolution {
    type Score = SoftScore;

    fn score(&self) -> Option<Self::Score> {
        None
    }

    fn set_score(&mut self, _: Option<Self::Score>) {}
}

#[test]
fn test_new_acceptor() {
    let acceptor = ValueTabuAcceptor::new(5);
    assert!(!acceptor.is_value_tabu(42));
}

#[test]
fn test_record_and_check() {
    let mut acceptor = ValueTabuAcceptor::new(5);
    Acceptor::<TestSolution>::phase_started(&mut acceptor, &SoftScore::of(0));

    acceptor.record_value_assignment(42);
    Acceptor::<TestSolution>::step_ended(&mut acceptor, &SoftScore::of(0));

    assert!(acceptor.is_value_tabu(42));
    assert!(!acceptor.is_value_tabu(99));
}

#[test]
fn test_tabu_expiration() {
    let mut acceptor = ValueTabuAcceptor::new(2);
    Acceptor::<TestSolution>::phase_started(&mut acceptor, &SoftScore::of(0));

    acceptor.record_value_assignment(1);
    Acceptor::<TestSolution>::step_ended(&mut acceptor, &SoftScore::of(0));
    assert!(acceptor.is_value_tabu(1));

    Acceptor::<TestSolution>::step_started(&mut acceptor);
    acceptor.record_value_assignment(2);
    Acceptor::<TestSolution>::step_ended(&mut acceptor, &SoftScore::of(0));
    assert!(acceptor.is_value_tabu(1));
    assert!(acceptor.is_value_tabu(2));

    Acceptor::<TestSolution>::step_started(&mut acceptor);
    acceptor.record_value_assignment(3);
    Acceptor::<TestSolution>::step_ended(&mut acceptor, &SoftScore::of(0));

    assert!(!acceptor.is_value_tabu(1));
    assert!(acceptor.is_value_tabu(2));
    assert!(acceptor.is_value_tabu(3));
}

#[test]
fn test_accepts_improving_move() {
    let mut acceptor = ValueTabuAcceptor::new(5);
    let last_score = SoftScore::of(-10);
    let move_score = SoftScore::of(-5);
    assert!(Acceptor::<TestSolution>::is_accepted(
        &mut acceptor,
        &last_score,
        &move_score
    ));
}

#[test]
fn test_accepts_equal_move() {
    let mut acceptor = ValueTabuAcceptor::new(5);
    let score = SoftScore::of(-10);
    assert!(Acceptor::<TestSolution>::is_accepted(
        &mut acceptor,
        &score,
        &score
    ));
}

#[test]
fn test_rejects_worsening_move() {
    let mut acceptor = ValueTabuAcceptor::new(5);
    let last_score = SoftScore::of(-5);
    let move_score = SoftScore::of(-10);
    assert!(!Acceptor::<TestSolution>::is_accepted(
        &mut acceptor,
        &last_score,
        &move_score
    ));
}

#[test]
fn test_phase_clears_tabu() {
    let mut acceptor = ValueTabuAcceptor::new(5);
    Acceptor::<TestSolution>::phase_started(&mut acceptor, &SoftScore::of(0));

    acceptor.record_value_assignment(42);
    Acceptor::<TestSolution>::step_ended(&mut acceptor, &SoftScore::of(0));
    assert!(acceptor.is_value_tabu(42));

    Acceptor::<TestSolution>::phase_ended(&mut acceptor);
    assert!(!acceptor.is_value_tabu(42));
}