Coverage for o2/actions/batching_actions/modify_size_rule_by_cost_action.py: 96%

23 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-05-16 11:18 +0000

1from o2.actions.base_actions.add_size_rule_base_action import ( 

2 AddSizeRuleAction, 

3 AddSizeRuleBaseActionParamsType, 

4) 

5from o2.actions.base_actions.base_action import ( 

6 RateSelfReturnType, 

7) 

8from o2.actions.base_actions.modify_size_rule_base_action import ( 

9 ModifySizeRuleBaseAction, 

10 ModifySizeRuleBaseActionParamsType, 

11) 

12from o2.models.self_rating import RATING 

13from o2.models.solution import Solution 

14from o2.models.timetable import RULE_TYPE 

15from o2.store import Store 

16from o2.util.helper import select_variants 

17 

18 

19class ModifySizeRuleByCostActionParamsType(ModifySizeRuleBaseActionParamsType): 

20 """Parameter for ModifySizeRuleByCostAction.""" 

21 

22 pass 

23 

24 

25class ModifySizeRuleByCostAction(ModifySizeRuleBaseAction): 

26 """An Action to modify size batching rules based on cost. 

27 

28 1. Gets the tasks with the most cost 

29 2. Looks if theres a size rule for that task 

30 3. If there is, it increments the size by 1 

31 """ 

32 

33 params: ModifySizeRuleByCostActionParamsType 

34 

35 @staticmethod 

36 def rate_self( 

37 store: "Store", input: "Solution" 

38 ) -> RateSelfReturnType["ModifySizeRuleByCostAction | AddSizeRuleAction"]: 

39 """Generate a best set of parameters & self-evaluates this action.""" 

40 timetable = input.state.timetable 

41 

42 sorted_tasks = sorted( 

43 store.current_evaluation.get_avg_cost_per_task().items(), 

44 key=lambda x: x[1], 

45 reverse=True, 

46 ) 

47 

48 for task_id, _ in sorted_tasks: 

49 duration_fn = store.constraints.get_duration_fn_for_task(task_id) 

50 selectors = timetable.get_firing_rule_selectors_for_task(task_id, rule_type=RULE_TYPE.SIZE) 

51 if not selectors: 

52 yield ( 

53 RATING.LOW, 

54 AddSizeRuleAction( 

55 AddSizeRuleBaseActionParamsType(task_id=task_id, size=2, duration_fn=duration_fn) 

56 ), 

57 ) 

58 for selector in select_variants(store, selectors): 

59 yield ( 

60 ModifySizeRuleBaseAction.get_default_rating(), 

61 ModifySizeRuleByCostAction( 

62 ModifySizeRuleByCostActionParamsType( 

63 rule=selector, 

64 size_increment=1, 

65 duration_fn=duration_fn, 

66 ) 

67 ), 

68 )