fn effective_score(score: f32, feedback_weight: f32, feedback_influence: f32) -> f32 {
if feedback_influence <= 0.0 {
return score;
}
let fw = feedback_weight.clamp(0.0, 1.0);
let normalized_sim = (score + 1.0) / 2.0;
let blended = (1.0 - feedback_influence) * normalized_sim + feedback_influence * fw;
blended * 2.0 - 1.0
}
pub fn rank_edge_score(
source_distance: f32,
target_distance: f32,
edge_distance: f32,
feedback_influence: f32,
source_feedback_weight: f32,
target_feedback_weight: f32,
) -> f32 {
let s = effective_score(source_distance, source_feedback_weight, feedback_influence);
let t = effective_score(target_distance, target_feedback_weight, feedback_influence);
s + t + edge_distance
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sums_three_distance_components() {
let score = rank_edge_score(0.1, 0.2, 0.3, 0.0, 0.5, 0.5);
assert!((score - 0.6).abs() < 1e-6, "expected 0.6, got {score}");
}
#[test]
fn unmatched_components_use_penalty() {
let score = rank_edge_score(6.5, 6.5, 6.5, 0.0, 0.5, 0.5);
assert!((score - 19.5).abs() < 1e-6, "expected 19.5, got {score}");
}
#[test]
fn effective_score_zero_influence_returns_input() {
assert_eq!(effective_score(0.5, 0.8, 0.0), 0.5);
assert_eq!(effective_score(-0.3, 0.2, 0.0), -0.3);
}
#[test]
fn effective_score_full_influence_returns_feedback_based() {
let result = effective_score(0.0, 1.0, 1.0); assert!((result - 1.0).abs() < 1e-6);
let result2 = effective_score(0.0, 0.0, 1.0); assert!((result2 - (-1.0)).abs() < 1e-6);
}
}