roma_lib 0.1.1

A Rust metaheuristics framework inspired by jMetal for optimization and experimentation.
Documentation
use roma_lib::{
    Algorithm,
    KnapsackBuilder,
    PSO,
    PSOParameters,
    SolutionSet,
    TerminationCriteria,
    TerminationCriterion,
};

#[test]
fn pso_runs_on_knapsack_and_returns_single_solution() {
    let problem = KnapsackBuilder::new()
        .with_capacity(35.0)
        .add_items(vec![(7.0, 11.0), (9.0, 16.0), (12.0, 25.0), (4.0, 7.0), (5.0, 9.0)])
        .build();

    let parameters = PSOParameters::new(
        25,
        0.7,
        1.4,
        1.4,
        TerminationCriteria::new(vec![TerminationCriterion::MaxIterations(35)]),
    )
    .with_seed(77);

    let mut algorithm = PSO::new(parameters);
    let result = algorithm.run(&problem).expect("PSO run should succeed");

    assert_eq!(result.size(), 1);
    let best = result.get(0).expect("PSO should return one best solution");
    assert!(best.quality().is_some());
    assert!(best.quality_value().is_finite());
}

#[test]
fn pso_rejects_zero_swarm_size() {
    let problem = KnapsackBuilder::new().with_capacity(10.0).add_item(5.0, 9.0).build();

    let parameters = PSOParameters::new(
        0,
        0.7,
        1.4,
        1.4,
        TerminationCriteria::new(vec![TerminationCriterion::MaxIterations(10)]),
    )
    .with_seed(7);

    let mut algorithm = PSO::new(parameters);
    let error = match algorithm.run(&problem) {
        Ok(_) => panic!("PSO with zero swarm size must fail validation"),
        Err(message) => message,
    };

    assert!(error.contains("swarm_size"));
}

#[test]
fn pso_rejects_negative_acceleration_coefficients() {
    let problem = KnapsackBuilder::new().with_capacity(10.0).add_item(5.0, 9.0).build();

    let parameters = PSOParameters::new(
        10,
        0.7,
        -1.0,
        1.4,
        TerminationCriteria::new(vec![TerminationCriterion::MaxIterations(10)]),
    )
    .with_seed(7);

    let mut algorithm = PSO::new(parameters);
    let error = match algorithm.run(&problem) {
        Ok(_) => panic!("PSO with negative coefficient must fail validation"),
        Err(message) => message,
    };

    assert!(error.contains("cognitive_coefficient"));
}