khive-fold 0.14.0

Cognitive primitives — Fold, Anchor, Objective, Selector
Documentation
#[test]
fn test_deterministic_select_basic() {
    let objective = objective_fn(|c: &TestCandidate, _ctx: &ObjectiveContext| c.value as f64);

    let candidates = vec![
        TestCandidate::new(1),
        TestCandidate::new(5),
        TestCandidate::new(3),
    ];

    let selection = objective
        .select_deterministic(&candidates, &ObjectiveContext::new())
        .unwrap();

    assert_eq!(selection.item.value, 5);
    assert_eq!(selection.score, 5.0);
}

#[test]
fn test_deterministic_select_equal_scores_uses_uuid_tiebreaker() {
    let objective = objective_fn(|_c: &TestCandidate, _ctx: &ObjectiveContext| 1.0);

    let id1 = Uuid::parse_str("00000000-0000-0000-0000-000000000001").unwrap();
    let id2 = Uuid::parse_str("00000000-0000-0000-0000-000000000002").unwrap();
    let id3 = Uuid::parse_str("00000000-0000-0000-0000-000000000003").unwrap();

    let candidates = vec![
        TestCandidate::with_id(id2, 100),
        TestCandidate::with_id(id3, 200),
        TestCandidate::with_id(id1, 300),
    ];

    let selection = objective
        .select_deterministic(&candidates, &ObjectiveContext::new())
        .unwrap();

    assert_eq!(selection.item.id, id1);
    assert_eq!(selection.item.value, 300);
}

#[test]
fn test_deterministic_select_top_ordering() {
    let objective = objective_fn(|_c: &TestCandidate, _ctx: &ObjectiveContext| 1.0);

    let id1 = Uuid::parse_str("00000000-0000-0000-0000-000000000001").unwrap();
    let id2 = Uuid::parse_str("00000000-0000-0000-0000-000000000002").unwrap();
    let id3 = Uuid::parse_str("00000000-0000-0000-0000-000000000003").unwrap();

    let candidates = vec![
        TestCandidate::with_id(id3, 300),
        TestCandidate::with_id(id1, 100),
        TestCandidate::with_id(id2, 200),
    ];

    let top = objective.select_top_deterministic(&candidates, 3, &ObjectiveContext::new());

    assert_eq!(top.len(), 3);
    assert_eq!(top[0].item.id, id1);
    assert_eq!(top[1].item.id, id2);
    assert_eq!(top[2].item.id, id3);
}

#[test]
fn test_deterministic_reproducibility() {
    let objective = objective_fn(|_c: &TestCandidate, _ctx: &ObjectiveContext| 1.0);

    let id1 = Uuid::parse_str("00000000-0000-0000-0000-000000000001").unwrap();
    let id2 = Uuid::parse_str("00000000-0000-0000-0000-000000000002").unwrap();
    let id3 = Uuid::parse_str("00000000-0000-0000-0000-000000000003").unwrap();

    let candidates = vec![
        TestCandidate::with_id(id2, 1),
        TestCandidate::with_id(id3, 2),
        TestCandidate::with_id(id1, 3),
    ];

    for _ in 0..100 {
        let selection = objective
            .select_deterministic(&candidates, &ObjectiveContext::new())
            .unwrap();
        assert_eq!(selection.item.id, id1, "Determinism violated!");

        let top = objective.select_top_deterministic(&candidates, 3, &ObjectiveContext::new());
        assert_eq!(top[0].item.id, id1);
        assert_eq!(top[1].item.id, id2);
        assert_eq!(top[2].item.id, id3);
    }
}