diff --git a/src/calculation_budget_constrains/service.py b/src/calculation_budget_constrains/service.py index 6906fce..3f3ee19 100644 --- a/src/calculation_budget_constrains/service.py +++ b/src/calculation_budget_constrains/service.py @@ -45,11 +45,10 @@ async def get_all_budget_constrains( eq_results = calc_result if isinstance(calc_result, list) else [calc_result] equipments_eaf_contribution = calculate_asset_eaf_contributions( - plant_result=plant_result, - eq_results=eq_results, - ) - - + plant_result=plant_result, + eq_results=eq_results, +) + # Create result array of dictionaries result = [ { @@ -62,8 +61,20 @@ async def get_all_budget_constrains( for equipment in equipments ] - # Sort by EAF contribution (highest to lowest) - result.sort(key=lambda x: x["eaf_contribution"], reverse=True) + # Calculate composite priority score for fair sorting + max_cost = max(eq["total_cost"] for eq in result) if result else 1 + + for equipment in result: + # Normalize cost (0-1) - higher cost = higher priority + normalized_cost = equipment["total_cost"] / max_cost if max_cost > 0 else 0 + + # Composite score: 70% EAF contribution + 30% cost impact + # EAF contribution is already relative, so use directly + equipment["priority_score"] = (0.7 * equipment["eaf_contribution"]) + (0.3 * normalized_cost) + + # Sort by composite priority score (highest to lowest) + result.sort(key=lambda x: x["priority_score"], reverse=True) + # Filter equipment up to threshold cumulative_cost = 0 @@ -95,7 +106,7 @@ def calculate_asset_eaf_contributions(plant_result, eq_results): for asset in eq_results: - results[asset['aeros_node']['node_name']] = asset['contribution'] * 100.0 + results[asset['aeros_node']['node_name']] = asset['contribution'] # Sort by contribution (worst contributors first) # results = sorted(results.items(), key=lambda x: x[1], reverse=True) diff --git a/src/calculation_target_reliability/service.py b/src/calculation_target_reliability/service.py index 9244a69..91e7cfc 100644 --- a/src/calculation_target_reliability/service.py +++ b/src/calculation_target_reliability/service.py @@ -104,7 +104,7 @@ async def get_simulation_results(*, simulation_id: str, token: str): # return results -def calculate_asset_eaf_contributions(plant_result, eq_results): +def calculate_asset_eaf_contributions(plant_result, eq_results, standard_scope): """ Calculate each asset's negative contribution to plant EAF Higher contribution = more impact on reducing plant EAF @@ -117,6 +117,9 @@ def calculate_asset_eaf_contributions(plant_result, eq_results): for asset in eq_results: # # Weight based on production capacity (just for seri) # capacity_weight = asset.get('total_downtime', 0) / plant_production if plant_production > 0 else 0 + if asset.get('aeros_node').get('node_name') not in standard_scope: + continue + # # Get asset EAF and downtime plant_eaf_minus = 100 - plant_eaf @@ -137,7 +140,6 @@ def calculate_asset_eaf_contributions(plant_result, eq_results): ) results.append(contribution) - # Sort by contribution (worst contributors first) results.sort(key=lambda x: x.contribution, reverse=True) return results @@ -170,23 +172,25 @@ async def identify_worst_eaf_contributors(*, simulation_result, target_eaf: floa # Get equipment results from calc_result eq_results = calc_result if isinstance(calc_result, list) else [calc_result] - - asset_contributions = calculate_asset_eaf_contributions(plant_result, eq_results) current_plant_eaf = plant_result.get("eaf", 0) eaf_gap = target_eaf - current_plant_eaf + - # Verify our calculation by summing contributions - total_calculated_downtime = sum(contrib.eaf_impact for contrib in asset_contributions) - calculated_plant_eaf = 100 - total_calculated_downtime + + # # Verify our calculation by summing contributions + # total_calculated_downtime = sum(contrib.eaf_impact for contrib in asset_contributions) + # calculated_plant_eaf = 100 - total_calculated_downtime standard_scope = await get_standard_scope_by_session_id( db_session=db_session, overhaul_session_id=oh_session_id, collector_db=collector_db ) - + standard_scope_location_tags = [tag.location_tag for tag in standard_scope] - + + asset_contributions = calculate_asset_eaf_contributions(plant_result, eq_results, standard_scope_location_tags) + project_eaf_improvement = 0.0 selected_eq = []