From 9d9e1cd92f0098dbb219d833d2e5c28b7857542b Mon Sep 17 00:00:00 2001 From: Rohan Mali Date: Fri, 19 Sep 2025 11:35:01 +0530 Subject: [PATCH] add helper function to normalize cost savings --- src/decider/gatewaydecider/flow_new.rs | 5 +++++ src/decider/network_decider/helpers.rs | 28 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/decider/gatewaydecider/flow_new.rs b/src/decider/gatewaydecider/flow_new.rs index e89439a7..749cee51 100644 --- a/src/decider/gatewaydecider/flow_new.rs +++ b/src/decider/gatewaydecider/flow_new.rs @@ -756,6 +756,11 @@ pub async fn runSuperRouterFlow( saving_percentage: 0.0, }] }; + + logger::debug!("Networks to process for SUPER_ROUTER before normalization: {:?}", networks_to_process); + + // normalize the cost savings within range [0, 1] + let networks_to_process = network_decider::helpers::normalize_cost_savings(networks_to_process); logger::debug!("Networks to process for SUPER_ROUTER: {:?}", networks_to_process); diff --git a/src/decider/network_decider/helpers.rs b/src/decider/network_decider/helpers.rs index 00d266e7..fb7bcdc0 100644 --- a/src/decider/network_decider/helpers.rs +++ b/src/decider/network_decider/helpers.rs @@ -252,3 +252,31 @@ impl gateway_decider_types::NETWORK { } } } + +// Using max normalization strategy +// min cost saving will always be 0. So, max normalization is equivalent to min-max normalization +pub fn normalize_cost_savings( + network_cost_savings: Vec +) -> Vec { + let mut max_saving = f64::NEG_INFINITY; + + for network_cost in &network_cost_savings { + max_saving = max_saving.max(network_cost.saving_percentage); + } + + // If all the cost savings are 0, return the original array. + // This avoids division by zero in next code segment while normalizing cost savings. + if (max_saving - 0.0).abs() < f64::EPSILON { + return network_cost_savings; + } + + network_cost_savings.iter() + .map(|network_cost| { + let normalized_cost_saving = network_cost.saving_percentage / max_saving; + types::NetworkSavingInfo { + network: network_cost.network.clone(), + saving_percentage: normalized_cost_saving, + } + }) + .collect() +}