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
« 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
19class ModifySizeRuleByCostActionParamsType(ModifySizeRuleBaseActionParamsType):
20 """Parameter for ModifySizeRuleByCostAction."""
22 pass
25class ModifySizeRuleByCostAction(ModifySizeRuleBaseAction):
26 """An Action to modify size batching rules based on cost.
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 """
33 params: ModifySizeRuleByCostActionParamsType
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
42 sorted_tasks = sorted(
43 store.current_evaluation.get_avg_cost_per_task().items(),
44 key=lambda x: x[1],
45 reverse=True,
46 )
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 )