browsergym-workarena 0.2.1__py3-none-any.whl → 0.3.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. browsergym/workarena/__init__.py +13 -1
  2. browsergym/workarena/api/category.py +74 -0
  3. browsergym/workarena/api/change_request.py +87 -0
  4. browsergym/workarena/api/computer_asset.py +90 -0
  5. browsergym/workarena/api/cost_center.py +19 -0
  6. browsergym/workarena/api/expense_line.py +89 -0
  7. browsergym/workarena/api/incident.py +45 -0
  8. browsergym/workarena/api/knowledge.py +29 -0
  9. browsergym/workarena/api/problem.py +90 -0
  10. browsergym/workarena/api/report.py +183 -0
  11. browsergym/workarena/api/requested_items.py +63 -0
  12. browsergym/workarena/api/user.py +11 -8
  13. browsergym/workarena/api/utils.py +47 -3
  14. browsergym/workarena/config.py +21 -1
  15. browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json +1 -1
  16. browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json +1 -0
  17. browsergym/workarena/data_files/setup_files/knowledge/protocols.json +46 -0
  18. browsergym/workarena/data_files/setup_files/knowledge/test.html +1 -0
  19. browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json +2 -24
  20. browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json +4 -40
  21. browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json +12 -0
  22. browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json +1 -42
  23. browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json +2 -18
  24. browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json +12 -0
  25. browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json +12 -0
  26. browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json +2 -19
  27. browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json +3 -50
  28. browsergym/workarena/data_files/task_configs/all_menu.json +1 -1
  29. browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json +1 -1
  30. browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json +1 -1
  31. browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +1 -1
  32. browsergym/workarena/data_files/task_configs/impersonation_users.json +1 -1
  33. browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json +1 -1
  34. browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json +1 -1
  35. browsergym/workarena/human_eval/console.js +176 -0
  36. browsergym/workarena/human_eval/tool.py +366 -0
  37. browsergym/workarena/install.py +81 -20
  38. browsergym/workarena/tasks/base.py +55 -20
  39. browsergym/workarena/tasks/comp_building_block.py +4 -0
  40. browsergym/workarena/tasks/compositional/__init__.py +76 -0
  41. browsergym/workarena/tasks/compositional/base.py +364 -0
  42. browsergym/workarena/tasks/compositional/dash_do_base.py +1366 -0
  43. browsergym/workarena/tasks/compositional/dash_do_catalog.py +1127 -0
  44. browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py +2047 -0
  45. browsergym/workarena/tasks/compositional/dash_do_create_incident.py +403 -0
  46. browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py +278 -0
  47. browsergym/workarena/tasks/compositional/dash_do_create_problem.py +336 -0
  48. browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py +235 -0
  49. browsergym/workarena/tasks/compositional/dash_do_filter.py +1600 -0
  50. browsergym/workarena/tasks/compositional/dash_do_request_item.py +1315 -0
  51. browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py +693 -0
  52. browsergym/workarena/tasks/compositional/delete_record.py +341 -0
  53. browsergym/workarena/tasks/compositional/edit_knowledge_base.py +457 -0
  54. browsergym/workarena/tasks/compositional/expense_management.py +598 -0
  55. browsergym/workarena/tasks/compositional/filter_and_do.py +139 -0
  56. browsergym/workarena/tasks/compositional/find_and_order_item.py +345 -0
  57. browsergym/workarena/tasks/compositional/manage_change_request_schedule.py +1417 -0
  58. browsergym/workarena/tasks/compositional/mark_duplicate_problems.py +499 -0
  59. browsergym/workarena/tasks/compositional/maximize_investment_return.py +1763 -0
  60. browsergym/workarena/tasks/compositional/navigate_and_do.py +1151 -0
  61. browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py +2100 -0
  62. browsergym/workarena/tasks/compositional/offboard_user.py +207 -0
  63. browsergym/workarena/tasks/compositional/onboard_user.py +226 -0
  64. browsergym/workarena/tasks/compositional/update_task.py +145 -0
  65. browsergym/workarena/tasks/compositional/utils/curriculum.py +215 -0
  66. browsergym/workarena/tasks/compositional/utils/infeasible_configs.py +151 -0
  67. browsergym/workarena/tasks/compositional/utils/knapsack.py +192 -0
  68. browsergym/workarena/tasks/compositional/warranty_check.py +227 -0
  69. browsergym/workarena/tasks/compositional/work_assignment.py +804 -0
  70. browsergym/workarena/tasks/compositional/workload_balancing.py +396 -0
  71. browsergym/workarena/tasks/dashboard.py +194 -12
  72. browsergym/workarena/tasks/form.py +1024 -232
  73. browsergym/workarena/tasks/knowledge.py +216 -25
  74. browsergym/workarena/tasks/list.py +519 -102
  75. browsergym/workarena/tasks/mark_duplicate_problem.py +171 -0
  76. browsergym/workarena/tasks/navigation.py +55 -13
  77. browsergym/workarena/tasks/scripts/extract_all_menu_items.py +9 -2
  78. browsergym/workarena/tasks/scripts/generate_dashboard_configs.py +6 -5
  79. browsergym/workarena/tasks/scripts/service_catalog.py +2 -1
  80. browsergym/workarena/tasks/scripts/validate.py +8 -2
  81. browsergym/workarena/tasks/send_chat_message.py +90 -0
  82. browsergym/workarena/tasks/service_catalog.py +94 -26
  83. browsergym/workarena/tasks/utils/form.py +1 -4
  84. browsergym/workarena/tasks/utils/private_tasks.py +63 -0
  85. browsergym/workarena/tasks/utils/utils.py +13 -0
  86. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/METADATA +19 -18
  87. browsergym_workarena-0.3.1.dist-info/RECORD +138 -0
  88. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/entry_points.txt +1 -0
  89. browsergym_workarena-0.2.1.dist-info/RECORD +0 -85
  90. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/WHEEL +0 -0
  91. {browsergym_workarena-0.2.1.dist-info → browsergym_workarena-0.3.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1417 @@
1
+ import re
2
+
3
+ from datetime import datetime, timedelta
4
+ from faker import Faker
5
+ from typing import List, Tuple
6
+
7
+ fake = Faker()
8
+
9
+ from playwright.sync_api._generated import Page
10
+
11
+ from browsergym.workarena.tasks.form import (
12
+ EditChangeRequestScheduleTask,
13
+ )
14
+
15
+ from .base import HumanEvalTask
16
+ from .filter_and_do import FilterAndDoTask
17
+
18
+ from ..base import AbstractServiceNowTask
19
+
20
+ from ...api.change_request import create_change_request
21
+ from ...api.utils import table_api_call, db_delete_from_table
22
+ from ...config import (
23
+ # Expected columns for the different lists
24
+ EXPECTED_CHANGE_REQUEST_COLUMNS_PATH,
25
+ )
26
+ from ...instance import SNowInstance
27
+
28
+
29
+ class ManageChangeRequestScheduleTask(FilterAndDoTask):
30
+ """Task to schedule change requests.
31
+ Args:
32
+
33
+ goal_type: str
34
+ The type of goal to set. Choices are "base", "priority", "tight", "tight priority". Used for validation
35
+ wide_schedule: bool
36
+ Whether or not the change requests should be scheduled in a 'wide' schedule. If set to True, the change requests
37
+ will have a period of 2 longer than the optimal schedule to be fitted in. Otherwise, they will have
38
+ a period of 2 days longer than the optimal schedule.
39
+ uniform_risk: bool
40
+ whether to use uniform risk for the change requests. The risk is between 2 (high) and 4 (low) and sets the
41
+ duration of the change request (high) risk=2 -> 3 days, (medium) risk=3 -> 2 days, (low) risk=4 -> 1 day
42
+ num_change_requests: int
43
+ The number of change requests to create a schedule for
44
+ pre_existing_schedule: bool
45
+ Whether to create a pre-existing schedule for the change requests. If set to True, the change requests created
46
+ will all overlap and have durations of one day.
47
+ """
48
+
49
+ # mapping between risk and duration
50
+ risk_to_duration = {2: 3, 3: 2, 4: 1}
51
+
52
+ def __init__(
53
+ self,
54
+ seed: int,
55
+ instance: SNowInstance = None,
56
+ fixed_config: list[AbstractServiceNowTask] = None,
57
+ goal_type: str = "base",
58
+ wide_schedule: bool = False,
59
+ uniform_risk: bool = True,
60
+ num_change_requests: int = 2,
61
+ pre_existing_schedule: bool = False,
62
+ level: int = 2,
63
+ ) -> None:
64
+ super().__init__(
65
+ seed=seed,
66
+ instance=instance,
67
+ fixed_config=fixed_config,
68
+ navigation_config={
69
+ "module": "All",
70
+ "application": "Change",
71
+ },
72
+ level=level,
73
+ protocol_name="Scheduling Your Change Requests",
74
+ )
75
+ self.goal_type = goal_type
76
+ self.wide_schedule = wide_schedule
77
+ self.uniform_risk = uniform_risk
78
+ self.num_change_requests = num_change_requests
79
+ self.pre_existing_schedule = pre_existing_schedule
80
+ self.change_request_sys_ids = []
81
+ self.change_request_numbers = []
82
+ self.change_request_impacts = [2] * num_change_requests # Medium priorities by default
83
+
84
+ # start and end dates of the schedule
85
+ self.schedule_start_date = fake.date_time_this_decade(
86
+ after_now=True, before_now=False, tzinfo=None
87
+ ).replace(microsecond=0)
88
+ self.schedule_end_date = None
89
+ self.schedule_bounds_goal = None # Part of the goal to append at the end of the goal to indicate the start and end of the schedule. Used in L2 tasks
90
+
91
+ if self.uniform_risk:
92
+ self.risks = [4] * num_change_requests
93
+ else:
94
+ self.risks = list(self.random.randint(2, 4, num_change_requests))
95
+
96
+ self.change_request_hashtag = "#SERIES-" + self.unique_id[:10]
97
+ if not self.pre_existing_schedule:
98
+ schedule_type = "tight schedule" if "tight" in self.goal_type else "schedule"
99
+ self.short_description = f"Scheduling Your Change Requests"
100
+ self.task_description = f'Referring to company protocol "{self.protocol_name}" (located in the "Company Protocols" knowledge base) create a {schedule_type} for your change requests for those with hashtag {self.change_request_hashtag}.'
101
+ else:
102
+ self.short_description = f"Re-scheduling Your Change Requests"
103
+ self.task_description = f'The schedule for your change requests with hashtag {self.change_request_hashtag} is currently broken. Please refer to company protocol "{self.protocol_name}" (located in the company protocols knowledge base) to fix it.'
104
+ if "tight" in self.goal_type:
105
+ self.task_description += " The change requests should be scheduled according to the tight schedule setting."
106
+ self.tasks = []
107
+
108
+ def setup_goal(self, page: Page) -> tuple[str, dict]:
109
+ goal, info = super().setup_goal(page=page)
110
+
111
+ if self.level == 2:
112
+ goal += self.schedule_bounds_goal
113
+
114
+ return goal, info
115
+
116
+ def _setup_list(self) -> None:
117
+ self.filter_config = {
118
+ "list_url": "/now/nav/ui/classic/params/target/change_request_list.do",
119
+ "expected_fields_path": EXPECTED_CHANGE_REQUEST_COLUMNS_PATH,
120
+ "filter_columns": [
121
+ "short_description",
122
+ ],
123
+ "filter_kind": "AND",
124
+ "filter_operators": ["contains"],
125
+ "filter_values": [
126
+ f"{self.change_request_hashtag}",
127
+ ],
128
+ }
129
+ self.change_request_impacts.sort() # Sort the impacts to make sure the the top impact requests are scheduled first
130
+
131
+ start_date = self.schedule_start_date
132
+
133
+ for risk, impact in zip(self.risks, self.change_request_impacts):
134
+ if self.pre_existing_schedule:
135
+ change_request_start_date = start_date + timedelta(hours=self.random.randint(1, 4))
136
+ change_request_end_date = change_request_start_date + timedelta(days=1)
137
+ else:
138
+ change_request_start_date = ""
139
+ change_request_end_date = ""
140
+ change_request_sys_id, change_request_number = create_change_request(
141
+ instance=self.instance,
142
+ user_sys_id=self._base_user_sysid,
143
+ risk=risk,
144
+ start_date=str(change_request_start_date),
145
+ end_date=str(change_request_end_date),
146
+ impact=impact,
147
+ hashtag=self.change_request_hashtag,
148
+ random=self.random,
149
+ )
150
+ self.change_request_sys_ids.append(change_request_sys_id)
151
+ self.change_request_numbers.append(change_request_number)
152
+
153
+ for i, risk in enumerate(self.risks):
154
+ skip_description = i > 0
155
+ duration = self.risk_to_duration[risk]
156
+ end_date = start_date + timedelta(days=duration)
157
+ self.tasks.append(
158
+ EditChangeRequestScheduleTask(
159
+ instance=self.instance,
160
+ is_validated=False,
161
+ used_in_level_2=True,
162
+ record_sys_id=self.change_request_sys_ids[i],
163
+ record_number=self.change_request_numbers[i],
164
+ # Here the values will only be used by the cheat; the goal will be over-ridden to explain the task
165
+ # at a high level only; see the get_pretty_printed_description method
166
+ new_values={"start_date": str(start_date), "end_date": str(end_date)},
167
+ level=self.level,
168
+ goal_type=self.goal_type,
169
+ skip_description=skip_description,
170
+ )
171
+ )
172
+ start_date = end_date + timedelta(minutes=1)
173
+
174
+ if self.wide_schedule:
175
+ self.schedule_end_date = end_date + timedelta(weeks=2)
176
+ else:
177
+ self.schedule_end_date = end_date + timedelta(days=2)
178
+
179
+ self.schedule_bounds_goal = f" All the change requests should be scheduled between {self.schedule_start_date} and {self.schedule_end_date}, inclusively. "
180
+ # Add the schedule bounds to the task description
181
+ self.task_description += self.schedule_bounds_goal
182
+
183
+ def validate(self, page: Page, chat_messages: list[str]) -> Tuple[float, bool, str, dict]:
184
+ change_requests = table_api_call(
185
+ instance=self.instance,
186
+ table="change_request",
187
+ params={
188
+ "sysparm_query": f"short_descriptionLIKE{self.change_request_hashtag}",
189
+ "sysparm_fields": "impact,start_date,end_date,risk",
190
+ },
191
+ )["result"]
192
+ change_requests = sorted(change_requests, key=lambda x: x["start_date"])
193
+
194
+ # max difference is 1 day if not tight, 1 hour if tight
195
+ max_difference = 1 if self.goal_type == "tight" else 24
196
+
197
+ for i, change_request in enumerate(change_requests):
198
+ # Check that the change request has start/end dates
199
+ if (
200
+ not change_request["start_date"]
201
+ or not change_request["end_date"]
202
+ or (i > 0 and not change_requests[i - 1]["end_date"])
203
+ ):
204
+ return (
205
+ 0,
206
+ False,
207
+ "",
208
+ {"message": "Change request start date or end date is missing."},
209
+ )
210
+ # Confirm that the change request has appropriate duration (within 20% of expected duration)
211
+ current_start_date = datetime.strptime(
212
+ change_request["start_date"], "%Y-%m-%d %H:%M:%S"
213
+ )
214
+ current_end_date = datetime.strptime(change_request["end_date"], "%Y-%m-%d %H:%M:%S")
215
+
216
+ # Check that the bounds of the schedule are respected
217
+ if (
218
+ current_start_date < self.schedule_start_date
219
+ or current_end_date > self.schedule_end_date
220
+ ):
221
+ return (
222
+ 0,
223
+ False,
224
+ "",
225
+ {
226
+ "message": "Change request start date or end date is outside of the target schedule."
227
+ },
228
+ )
229
+
230
+ difference = current_end_date - current_start_date
231
+ # Expected duration is 3 days for high risk, 2 days for medium risk, 1 day for low risk
232
+ duration = self.risk_to_duration[int(change_request["risk"])]
233
+ expected_duration = timedelta(days=duration)
234
+
235
+ if difference < expected_duration * 0.95 or difference > expected_duration * 1.05:
236
+ return (
237
+ 0,
238
+ False,
239
+ "",
240
+ {
241
+ "message": "Change request duration is not within 5% of the expected duration."
242
+ },
243
+ )
244
+
245
+ if i == 0:
246
+ continue
247
+ # Confirm change requests are not overlapping and respect maximum spacing (1 day if not tight, 1h if tight)
248
+ previous_end_date = datetime.strptime(
249
+ change_requests[i - 1]["end_date"], "%Y-%m-%d %H:%M:%S"
250
+ )
251
+ difference = current_start_date - previous_end_date
252
+ if difference > timedelta(hours=max_difference) or difference < timedelta(0):
253
+ return (
254
+ 0,
255
+ False,
256
+ "",
257
+ {
258
+ "message": "Change requests are overlapping or not respecting the maximum spacing."
259
+ },
260
+ )
261
+ # Confirm change requests are ordered by impact - lower number being more impactful
262
+ if change_request["impact"] > change_requests[i - 1]["impact"]:
263
+ return (
264
+ 0,
265
+ False,
266
+ "",
267
+ {"message": "Change requests are not ordered by priority."},
268
+ )
269
+
270
+ # Validate final_l3 tasks
271
+ reward, done, message, info = super().validate(page, chat_messages)
272
+ return reward, done, message, info
273
+
274
+ def teardown(self) -> None:
275
+ for change_request_sys_id in self.change_request_sys_ids:
276
+ record_exists = table_api_call(
277
+ instance=self.instance,
278
+ table="change_request",
279
+ params={"sysparm_query": f"sys_id={change_request_sys_id}"},
280
+ )["result"]
281
+ if record_exists:
282
+ db_delete_from_table(
283
+ instance=self.instance,
284
+ table="change_request",
285
+ sys_id=change_request_sys_id,
286
+ )
287
+ super().teardown()
288
+
289
+
290
+ class TwoChangesBasicUniformRiskChangeRequestSchedulingTask(
291
+ ManageChangeRequestScheduleTask, HumanEvalTask
292
+ ):
293
+ def __init__(
294
+ self,
295
+ seed: int,
296
+ instance: SNowInstance = None,
297
+ fixed_config: List[AbstractServiceNowTask] = None,
298
+ num_change_requests: int = 2,
299
+ level: int = 2,
300
+ ) -> None:
301
+ super().__init__(
302
+ seed=seed,
303
+ instance=instance,
304
+ fixed_config=fixed_config,
305
+ goal_type="base",
306
+ num_change_requests=num_change_requests,
307
+ level=level,
308
+ )
309
+
310
+
311
+ class TwoChangesWideBasicUniformRiskChangeRequestSchedulingTask(
312
+ ManageChangeRequestScheduleTask, HumanEvalTask
313
+ ):
314
+ def __init__(
315
+ self,
316
+ seed: int,
317
+ instance: SNowInstance = None,
318
+ fixed_config: List[AbstractServiceNowTask] = None,
319
+ num_change_requests: int = 2,
320
+ level: int = 2,
321
+ ) -> None:
322
+ super().__init__(
323
+ seed=seed,
324
+ instance=instance,
325
+ fixed_config=fixed_config,
326
+ goal_type="base",
327
+ wide_schedule=True,
328
+ num_change_requests=num_change_requests,
329
+ level=level,
330
+ )
331
+
332
+
333
+ class TwoChangesFixBasicUniformRiskChangeRequestSchedulingTask(
334
+ ManageChangeRequestScheduleTask, HumanEvalTask
335
+ ):
336
+ def __init__(
337
+ self,
338
+ seed: int,
339
+ instance: SNowInstance = None,
340
+ fixed_config: List[AbstractServiceNowTask] = None,
341
+ num_change_requests: int = 2,
342
+ level: int = 2,
343
+ ) -> None:
344
+ super().__init__(
345
+ seed=seed,
346
+ instance=instance,
347
+ fixed_config=fixed_config,
348
+ goal_type="base",
349
+ num_change_requests=num_change_requests,
350
+ pre_existing_schedule=True,
351
+ level=level,
352
+ )
353
+
354
+
355
+ class TwoChangesFixWideBasicUniformRiskChangeRequestSchedulingTask(
356
+ ManageChangeRequestScheduleTask, HumanEvalTask
357
+ ):
358
+ def __init__(
359
+ self,
360
+ seed: int,
361
+ instance: SNowInstance = None,
362
+ fixed_config: List[AbstractServiceNowTask] = None,
363
+ num_change_requests: int = 2,
364
+ level: int = 2,
365
+ ) -> None:
366
+ super().__init__(
367
+ seed=seed,
368
+ instance=instance,
369
+ fixed_config=fixed_config,
370
+ goal_type="base",
371
+ wide_schedule=True,
372
+ num_change_requests=num_change_requests,
373
+ pre_existing_schedule=True,
374
+ level=level,
375
+ )
376
+
377
+
378
+ class TwoChangesBasicVariedRiskChangeRequestSchedulingTask(
379
+ ManageChangeRequestScheduleTask, HumanEvalTask
380
+ ):
381
+ def __init__(
382
+ self,
383
+ seed: int,
384
+ instance: SNowInstance = None,
385
+ fixed_config: List[AbstractServiceNowTask] = None,
386
+ num_change_requests: int = 2,
387
+ level: int = 2,
388
+ ) -> None:
389
+ super().__init__(
390
+ seed=seed,
391
+ instance=instance,
392
+ fixed_config=fixed_config,
393
+ goal_type="base",
394
+ uniform_risk=False,
395
+ num_change_requests=num_change_requests,
396
+ level=level,
397
+ )
398
+
399
+
400
+ class TwoChangesWideBasicVariedRiskChangeRequestSchedulingTask(
401
+ ManageChangeRequestScheduleTask, HumanEvalTask
402
+ ):
403
+ def __init__(
404
+ self,
405
+ seed: int,
406
+ instance: SNowInstance = None,
407
+ fixed_config: List[AbstractServiceNowTask] = None,
408
+ num_change_requests: int = 2,
409
+ level: int = 2,
410
+ ) -> None:
411
+ super().__init__(
412
+ seed=seed,
413
+ instance=instance,
414
+ fixed_config=fixed_config,
415
+ goal_type="base",
416
+ wide_schedule=True,
417
+ uniform_risk=False,
418
+ num_change_requests=num_change_requests,
419
+ level=level,
420
+ )
421
+
422
+
423
+ class TwoChangesFixBasicVariedRiskChangeRequestSchedulingTask(
424
+ ManageChangeRequestScheduleTask, HumanEvalTask
425
+ ):
426
+ def __init__(
427
+ self,
428
+ seed: int,
429
+ instance: SNowInstance = None,
430
+ fixed_config: List[AbstractServiceNowTask] = None,
431
+ num_change_requests: int = 2,
432
+ level: int = 2,
433
+ ) -> None:
434
+ super().__init__(
435
+ seed=seed,
436
+ instance=instance,
437
+ fixed_config=fixed_config,
438
+ goal_type="base",
439
+ uniform_risk=False,
440
+ num_change_requests=num_change_requests,
441
+ pre_existing_schedule=True,
442
+ level=level,
443
+ )
444
+
445
+
446
+ class TwoChangesFixWideBasicVariedRiskChangeRequestSchedulingTask(
447
+ ManageChangeRequestScheduleTask, HumanEvalTask
448
+ ):
449
+ def __init__(
450
+ self,
451
+ seed: int,
452
+ instance: SNowInstance = None,
453
+ fixed_config: List[AbstractServiceNowTask] = None,
454
+ num_change_requests: int = 2,
455
+ level: int = 2,
456
+ ) -> None:
457
+ super().__init__(
458
+ seed=seed,
459
+ instance=instance,
460
+ fixed_config=fixed_config,
461
+ goal_type="base",
462
+ wide_schedule=True,
463
+ uniform_risk=False,
464
+ num_change_requests=num_change_requests,
465
+ pre_existing_schedule=True,
466
+ level=level,
467
+ )
468
+
469
+
470
+ class TwoChangesPriorityUniformRiskChangeRequestSchedulingTask(
471
+ ManageChangeRequestScheduleTask, HumanEvalTask
472
+ ):
473
+ def __init__(
474
+ self,
475
+ seed: int,
476
+ instance: SNowInstance = None,
477
+ fixed_config: List[AbstractServiceNowTask] = None,
478
+ num_change_requests: int = 2,
479
+ level: int = 2,
480
+ ) -> None:
481
+ super().__init__(
482
+ seed=seed,
483
+ instance=instance,
484
+ fixed_config=fixed_config,
485
+ goal_type="priority",
486
+ num_change_requests=num_change_requests,
487
+ level=level,
488
+ )
489
+
490
+
491
+ class TwoChangesWidePriorityUniformRiskChangeRequestSchedulingTask(
492
+ ManageChangeRequestScheduleTask, HumanEvalTask
493
+ ):
494
+ def __init__(
495
+ self,
496
+ seed: int,
497
+ instance: SNowInstance = None,
498
+ fixed_config: List[AbstractServiceNowTask] = None,
499
+ num_change_requests: int = 2,
500
+ level: int = 2,
501
+ ) -> None:
502
+ super().__init__(
503
+ seed=seed,
504
+ instance=instance,
505
+ fixed_config=fixed_config,
506
+ goal_type="priority",
507
+ wide_schedule=True,
508
+ num_change_requests=num_change_requests,
509
+ level=level,
510
+ )
511
+
512
+
513
+ class TwoChangesFixPriorityUniformRiskChangeRequestSchedulingTask(
514
+ ManageChangeRequestScheduleTask, HumanEvalTask
515
+ ):
516
+ def __init__(
517
+ self,
518
+ seed: int,
519
+ instance: SNowInstance = None,
520
+ fixed_config: List[AbstractServiceNowTask] = None,
521
+ num_change_requests: int = 2,
522
+ level: int = 2,
523
+ ) -> None:
524
+ super().__init__(
525
+ seed=seed,
526
+ instance=instance,
527
+ fixed_config=fixed_config,
528
+ goal_type="priority",
529
+ num_change_requests=num_change_requests,
530
+ pre_existing_schedule=True,
531
+ level=level,
532
+ )
533
+
534
+
535
+ class TwoChangesFixWidePriorityUniformRiskChangeRequestSchedulingTask(
536
+ ManageChangeRequestScheduleTask, HumanEvalTask
537
+ ):
538
+ def __init__(
539
+ self,
540
+ seed: int,
541
+ instance: SNowInstance = None,
542
+ fixed_config: List[AbstractServiceNowTask] = None,
543
+ num_change_requests: int = 2,
544
+ level: int = 2,
545
+ ) -> None:
546
+ super().__init__(
547
+ seed=seed,
548
+ instance=instance,
549
+ fixed_config=fixed_config,
550
+ goal_type="priority",
551
+ wide_schedule=True,
552
+ num_change_requests=num_change_requests,
553
+ pre_existing_schedule=True,
554
+ level=level,
555
+ )
556
+
557
+
558
+ class TwoChangesPriorityVariedRiskChangeRequestSchedulingTask(
559
+ ManageChangeRequestScheduleTask, HumanEvalTask
560
+ ):
561
+ def __init__(
562
+ self,
563
+ seed: int,
564
+ instance: SNowInstance = None,
565
+ fixed_config: List[AbstractServiceNowTask] = None,
566
+ num_change_requests: int = 2,
567
+ level: int = 2,
568
+ ) -> None:
569
+ super().__init__(
570
+ seed=seed,
571
+ instance=instance,
572
+ fixed_config=fixed_config,
573
+ goal_type="priority",
574
+ uniform_risk=False,
575
+ num_change_requests=num_change_requests,
576
+ level=level,
577
+ )
578
+
579
+
580
+ class TwoChangesWidePriorityVariedRiskChangeRequestSchedulingTask(
581
+ ManageChangeRequestScheduleTask, HumanEvalTask
582
+ ):
583
+ def __init__(
584
+ self,
585
+ seed: int,
586
+ instance: SNowInstance = None,
587
+ fixed_config: List[AbstractServiceNowTask] = None,
588
+ num_change_requests: int = 2,
589
+ level: int = 2,
590
+ ) -> None:
591
+ super().__init__(
592
+ seed=seed,
593
+ instance=instance,
594
+ fixed_config=fixed_config,
595
+ goal_type="priority",
596
+ wide_schedule=True,
597
+ uniform_risk=False,
598
+ num_change_requests=num_change_requests,
599
+ level=level,
600
+ )
601
+
602
+
603
+ class TwoChangesFixPriorityVariedRiskChangeRequestSchedulingTask(
604
+ ManageChangeRequestScheduleTask, HumanEvalTask
605
+ ):
606
+ def __init__(
607
+ self,
608
+ seed: int,
609
+ instance: SNowInstance = None,
610
+ fixed_config: List[AbstractServiceNowTask] = None,
611
+ num_change_requests: int = 2,
612
+ level: int = 2,
613
+ ) -> None:
614
+ super().__init__(
615
+ seed=seed,
616
+ instance=instance,
617
+ fixed_config=fixed_config,
618
+ goal_type="priority",
619
+ uniform_risk=False,
620
+ num_change_requests=num_change_requests,
621
+ pre_existing_schedule=True,
622
+ level=level,
623
+ )
624
+
625
+
626
+ class TwoChangesFixWidePriorityVariedRiskChangeRequestSchedulingTask(
627
+ ManageChangeRequestScheduleTask, HumanEvalTask
628
+ ):
629
+ def __init__(
630
+ self,
631
+ seed: int,
632
+ instance: SNowInstance = None,
633
+ fixed_config: List[AbstractServiceNowTask] = None,
634
+ num_change_requests: int = 2,
635
+ level: int = 2,
636
+ ) -> None:
637
+ super().__init__(
638
+ seed=seed,
639
+ instance=instance,
640
+ fixed_config=fixed_config,
641
+ goal_type="priority",
642
+ wide_schedule=True,
643
+ uniform_risk=False,
644
+ num_change_requests=num_change_requests,
645
+ pre_existing_schedule=True,
646
+ level=level,
647
+ )
648
+
649
+
650
+ class TwoChangesTightUniformRiskChangeRequestSchedulingTask(
651
+ ManageChangeRequestScheduleTask, HumanEvalTask
652
+ ):
653
+ def __init__(
654
+ self,
655
+ seed: int,
656
+ instance: SNowInstance = None,
657
+ fixed_config: List[AbstractServiceNowTask] = None,
658
+ num_change_requests: int = 2,
659
+ level: int = 2,
660
+ ) -> None:
661
+ super().__init__(
662
+ seed=seed,
663
+ instance=instance,
664
+ fixed_config=fixed_config,
665
+ goal_type="tight",
666
+ num_change_requests=num_change_requests,
667
+ level=level,
668
+ )
669
+
670
+
671
+ class TwoChangesWideScheduleTightUniformRiskChangeRequestSchedulingTask(
672
+ ManageChangeRequestScheduleTask, HumanEvalTask
673
+ ):
674
+ def __init__(
675
+ self,
676
+ seed: int,
677
+ instance: SNowInstance = None,
678
+ fixed_config: List[AbstractServiceNowTask] = None,
679
+ num_change_requests: int = 2,
680
+ level: int = 2,
681
+ ) -> None:
682
+ super().__init__(
683
+ seed=seed,
684
+ instance=instance,
685
+ fixed_config=fixed_config,
686
+ goal_type="tight",
687
+ wide_schedule=True,
688
+ num_change_requests=num_change_requests,
689
+ level=level,
690
+ )
691
+
692
+
693
+ class TwoChangesFixTightUniformRiskChangeRequestSchedulingTask(
694
+ ManageChangeRequestScheduleTask, HumanEvalTask
695
+ ):
696
+ def __init__(
697
+ self,
698
+ seed: int,
699
+ instance: SNowInstance = None,
700
+ fixed_config: List[AbstractServiceNowTask] = None,
701
+ num_change_requests: int = 2,
702
+ level: int = 2,
703
+ ) -> None:
704
+ super().__init__(
705
+ seed=seed,
706
+ instance=instance,
707
+ fixed_config=fixed_config,
708
+ goal_type="tight",
709
+ num_change_requests=num_change_requests,
710
+ pre_existing_schedule=True,
711
+ level=level,
712
+ )
713
+
714
+
715
+ class TwoChangesFixWideScheduleTightUniformRiskChangeRequestSchedulingTask(
716
+ ManageChangeRequestScheduleTask, HumanEvalTask
717
+ ):
718
+ def __init__(
719
+ self,
720
+ seed: int,
721
+ instance: SNowInstance = None,
722
+ fixed_config: List[AbstractServiceNowTask] = None,
723
+ num_change_requests: int = 2,
724
+ level: int = 2,
725
+ ) -> None:
726
+ super().__init__(
727
+ seed=seed,
728
+ instance=instance,
729
+ fixed_config=fixed_config,
730
+ goal_type="tight",
731
+ wide_schedule=True,
732
+ num_change_requests=num_change_requests,
733
+ pre_existing_schedule=True,
734
+ level=level,
735
+ )
736
+
737
+
738
+ class TwoChangesTightPriorityVariedRiskChangeRequestSchedulingTask(
739
+ ManageChangeRequestScheduleTask, HumanEvalTask
740
+ ):
741
+ def __init__(
742
+ self,
743
+ seed: int,
744
+ instance: SNowInstance = None,
745
+ fixed_config: List[AbstractServiceNowTask] = None,
746
+ num_change_requests: int = 2,
747
+ level: int = 2,
748
+ ) -> None:
749
+ super().__init__(
750
+ seed=seed,
751
+ instance=instance,
752
+ fixed_config=fixed_config,
753
+ goal_type="tight priority",
754
+ uniform_risk=False,
755
+ num_change_requests=num_change_requests,
756
+ level=level,
757
+ )
758
+
759
+
760
+ class TwoChangesWideTightPriorityVariedRiskChangeRequestSchedulingTask(
761
+ ManageChangeRequestScheduleTask, HumanEvalTask
762
+ ):
763
+ def __init__(
764
+ self,
765
+ seed: int,
766
+ instance: SNowInstance = None,
767
+ fixed_config: List[AbstractServiceNowTask] = None,
768
+ num_change_requests: int = 2,
769
+ level: int = 2,
770
+ ) -> None:
771
+ super().__init__(
772
+ seed=seed,
773
+ instance=instance,
774
+ fixed_config=fixed_config,
775
+ goal_type="tight priority",
776
+ wide_schedule=True,
777
+ uniform_risk=False,
778
+ num_change_requests=num_change_requests,
779
+ level=level,
780
+ )
781
+
782
+
783
+ class TwoChangesFixTightPriorityVariedRiskChangeRequestSchedulingTask(
784
+ ManageChangeRequestScheduleTask, HumanEvalTask
785
+ ):
786
+ def __init__(
787
+ self,
788
+ seed: int,
789
+ instance: SNowInstance = None,
790
+ fixed_config: List[AbstractServiceNowTask] = None,
791
+ num_change_requests: int = 2,
792
+ level: int = 2,
793
+ ) -> None:
794
+ super().__init__(
795
+ seed=seed,
796
+ instance=instance,
797
+ fixed_config=fixed_config,
798
+ goal_type="tight priority",
799
+ uniform_risk=False,
800
+ num_change_requests=num_change_requests,
801
+ pre_existing_schedule=True,
802
+ level=level,
803
+ )
804
+
805
+
806
+ class TwoChangesFixWideTightPriorityVariedRiskChangeRequestSchedulingTask(
807
+ ManageChangeRequestScheduleTask, HumanEvalTask
808
+ ):
809
+ def __init__(
810
+ self,
811
+ seed: int,
812
+ instance: SNowInstance = None,
813
+ fixed_config: List[AbstractServiceNowTask] = None,
814
+ num_change_requests: int = 2,
815
+ level: int = 2,
816
+ ) -> None:
817
+ super().__init__(
818
+ seed=seed,
819
+ instance=instance,
820
+ fixed_config=fixed_config,
821
+ goal_type="tight priority",
822
+ uniform_risk=False,
823
+ wide_schedule=True,
824
+ num_change_requests=num_change_requests,
825
+ pre_existing_schedule=True,
826
+ level=level,
827
+ )
828
+
829
+
830
+ class ThreeChangesBasicUniformRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
831
+ def __init__(
832
+ self,
833
+ seed: int,
834
+ instance: SNowInstance = None,
835
+ fixed_config: List[AbstractServiceNowTask] = None,
836
+ num_change_requests: int = 3,
837
+ level: int = 2,
838
+ ) -> None:
839
+ super().__init__(
840
+ seed=seed,
841
+ instance=instance,
842
+ fixed_config=fixed_config,
843
+ goal_type="base",
844
+ num_change_requests=num_change_requests,
845
+ level=level,
846
+ )
847
+
848
+
849
+ class ThreeChangesWideBasicUniformRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
850
+ def __init__(
851
+ self,
852
+ seed: int,
853
+ instance: SNowInstance = None,
854
+ fixed_config: List[AbstractServiceNowTask] = None,
855
+ num_change_requests: int = 3,
856
+ level: int = 2,
857
+ ) -> None:
858
+ super().__init__(
859
+ seed=seed,
860
+ instance=instance,
861
+ fixed_config=fixed_config,
862
+ goal_type="base",
863
+ wide_schedule=True,
864
+ num_change_requests=num_change_requests,
865
+ level=level,
866
+ )
867
+
868
+
869
+ class ThreeChangesFixBasicUniformRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
870
+ def __init__(
871
+ self,
872
+ seed: int,
873
+ instance: SNowInstance = None,
874
+ fixed_config: List[AbstractServiceNowTask] = None,
875
+ num_change_requests: int = 3,
876
+ level: int = 2,
877
+ ) -> None:
878
+ super().__init__(
879
+ seed=seed,
880
+ instance=instance,
881
+ fixed_config=fixed_config,
882
+ goal_type="base",
883
+ num_change_requests=num_change_requests,
884
+ pre_existing_schedule=True,
885
+ level=level,
886
+ )
887
+
888
+
889
+ class ThreeChangesFixWideBasicUniformRiskChangeRequestSchedulingTask(
890
+ ManageChangeRequestScheduleTask
891
+ ):
892
+ def __init__(
893
+ self,
894
+ seed: int,
895
+ instance: SNowInstance = None,
896
+ fixed_config: List[AbstractServiceNowTask] = None,
897
+ num_change_requests: int = 3,
898
+ level: int = 2,
899
+ ) -> None:
900
+ super().__init__(
901
+ seed=seed,
902
+ instance=instance,
903
+ fixed_config=fixed_config,
904
+ goal_type="base",
905
+ wide_schedule=True,
906
+ num_change_requests=num_change_requests,
907
+ pre_existing_schedule=True,
908
+ level=level,
909
+ )
910
+
911
+
912
+ class ThreeChangesBasicVariedRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
913
+ def __init__(
914
+ self,
915
+ seed: int,
916
+ instance: SNowInstance = None,
917
+ fixed_config: List[AbstractServiceNowTask] = None,
918
+ num_change_requests: int = 3,
919
+ level: int = 2,
920
+ ) -> None:
921
+ super().__init__(
922
+ seed=seed,
923
+ instance=instance,
924
+ fixed_config=fixed_config,
925
+ goal_type="base",
926
+ uniform_risk=False,
927
+ num_change_requests=num_change_requests,
928
+ level=level,
929
+ )
930
+
931
+
932
+ class ThreeChangesWideBasicVariedRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
933
+ def __init__(
934
+ self,
935
+ seed: int,
936
+ instance: SNowInstance = None,
937
+ fixed_config: List[AbstractServiceNowTask] = None,
938
+ num_change_requests: int = 3,
939
+ level: int = 2,
940
+ ) -> None:
941
+ super().__init__(
942
+ seed=seed,
943
+ instance=instance,
944
+ fixed_config=fixed_config,
945
+ goal_type="base",
946
+ wide_schedule=True,
947
+ uniform_risk=False,
948
+ num_change_requests=num_change_requests,
949
+ level=level,
950
+ )
951
+
952
+
953
+ class ThreeChangesFixBasicVariedRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
954
+ def __init__(
955
+ self,
956
+ seed: int,
957
+ instance: SNowInstance = None,
958
+ fixed_config: List[AbstractServiceNowTask] = None,
959
+ num_change_requests: int = 3,
960
+ level: int = 2,
961
+ ) -> None:
962
+ super().__init__(
963
+ seed=seed,
964
+ instance=instance,
965
+ fixed_config=fixed_config,
966
+ goal_type="base",
967
+ uniform_risk=False,
968
+ num_change_requests=num_change_requests,
969
+ pre_existing_schedule=True,
970
+ level=level,
971
+ )
972
+
973
+
974
+ class ThreeChangesFixWideBasicVariedRiskChangeRequestSchedulingTask(
975
+ ManageChangeRequestScheduleTask
976
+ ):
977
+ def __init__(
978
+ self,
979
+ seed: int,
980
+ instance: SNowInstance = None,
981
+ fixed_config: List[AbstractServiceNowTask] = None,
982
+ num_change_requests: int = 3,
983
+ level: int = 2,
984
+ ) -> None:
985
+ super().__init__(
986
+ seed=seed,
987
+ instance=instance,
988
+ fixed_config=fixed_config,
989
+ goal_type="base",
990
+ wide_schedule=True,
991
+ uniform_risk=False,
992
+ num_change_requests=num_change_requests,
993
+ pre_existing_schedule=True,
994
+ level=level,
995
+ )
996
+
997
+
998
+ class ThreeChangesPriorityUniformRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
999
+ def __init__(
1000
+ self,
1001
+ seed: int,
1002
+ instance: SNowInstance = None,
1003
+ fixed_config: List[AbstractServiceNowTask] = None,
1004
+ num_change_requests: int = 3,
1005
+ level: int = 2,
1006
+ ) -> None:
1007
+ super().__init__(
1008
+ seed=seed,
1009
+ instance=instance,
1010
+ fixed_config=fixed_config,
1011
+ goal_type="priority",
1012
+ num_change_requests=num_change_requests,
1013
+ level=level,
1014
+ )
1015
+
1016
+
1017
+ class ThreeChangesWidePriorityUniformRiskChangeRequestSchedulingTask(
1018
+ ManageChangeRequestScheduleTask
1019
+ ):
1020
+ def __init__(
1021
+ self,
1022
+ seed: int,
1023
+ instance: SNowInstance = None,
1024
+ fixed_config: List[AbstractServiceNowTask] = None,
1025
+ num_change_requests: int = 3,
1026
+ level: int = 2,
1027
+ ) -> None:
1028
+ super().__init__(
1029
+ seed=seed,
1030
+ instance=instance,
1031
+ fixed_config=fixed_config,
1032
+ goal_type="priority",
1033
+ wide_schedule=True,
1034
+ num_change_requests=num_change_requests,
1035
+ level=level,
1036
+ )
1037
+
1038
+
1039
+ class ThreeChangesFixPriorityUniformRiskChangeRequestSchedulingTask(
1040
+ ManageChangeRequestScheduleTask
1041
+ ):
1042
+ def __init__(
1043
+ self,
1044
+ seed: int,
1045
+ instance: SNowInstance = None,
1046
+ fixed_config: List[AbstractServiceNowTask] = None,
1047
+ num_change_requests: int = 3,
1048
+ level: int = 2,
1049
+ ) -> None:
1050
+ super().__init__(
1051
+ seed=seed,
1052
+ instance=instance,
1053
+ fixed_config=fixed_config,
1054
+ goal_type="priority",
1055
+ num_change_requests=num_change_requests,
1056
+ pre_existing_schedule=True,
1057
+ level=level,
1058
+ )
1059
+
1060
+
1061
+ class ThreeChangesFixWidePriorityUniformRiskChangeRequestSchedulingTask(
1062
+ ManageChangeRequestScheduleTask
1063
+ ):
1064
+ def __init__(
1065
+ self,
1066
+ seed: int,
1067
+ instance: SNowInstance = None,
1068
+ fixed_config: List[AbstractServiceNowTask] = None,
1069
+ num_change_requests: int = 3,
1070
+ level: int = 2,
1071
+ ) -> None:
1072
+ super().__init__(
1073
+ seed=seed,
1074
+ instance=instance,
1075
+ fixed_config=fixed_config,
1076
+ goal_type="priority",
1077
+ wide_schedule=True,
1078
+ num_change_requests=num_change_requests,
1079
+ pre_existing_schedule=True,
1080
+ level=level,
1081
+ )
1082
+
1083
+
1084
+ class ThreeChangesPriorityVariedRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
1085
+ def __init__(
1086
+ self,
1087
+ seed: int,
1088
+ instance: SNowInstance = None,
1089
+ fixed_config: List[AbstractServiceNowTask] = None,
1090
+ num_change_requests: int = 3,
1091
+ level: int = 2,
1092
+ ) -> None:
1093
+ super().__init__(
1094
+ seed=seed,
1095
+ instance=instance,
1096
+ fixed_config=fixed_config,
1097
+ goal_type="priority",
1098
+ uniform_risk=False,
1099
+ num_change_requests=num_change_requests,
1100
+ level=level,
1101
+ )
1102
+
1103
+
1104
+ class ThreeChangesWidePriorityVariedRiskChangeRequestSchedulingTask(
1105
+ ManageChangeRequestScheduleTask
1106
+ ):
1107
+ def __init__(
1108
+ self,
1109
+ seed: int,
1110
+ instance: SNowInstance = None,
1111
+ fixed_config: List[AbstractServiceNowTask] = None,
1112
+ num_change_requests: int = 3,
1113
+ level: int = 2,
1114
+ ) -> None:
1115
+ super().__init__(
1116
+ seed=seed,
1117
+ instance=instance,
1118
+ fixed_config=fixed_config,
1119
+ goal_type="priority",
1120
+ wide_schedule=True,
1121
+ uniform_risk=False,
1122
+ num_change_requests=num_change_requests,
1123
+ level=level,
1124
+ )
1125
+
1126
+
1127
+ class ThreeChangesFixPriorityVariedRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
1128
+ def __init__(
1129
+ self,
1130
+ seed: int,
1131
+ instance: SNowInstance = None,
1132
+ fixed_config: List[AbstractServiceNowTask] = None,
1133
+ num_change_requests: int = 3,
1134
+ level: int = 2,
1135
+ ) -> None:
1136
+ super().__init__(
1137
+ seed=seed,
1138
+ instance=instance,
1139
+ fixed_config=fixed_config,
1140
+ goal_type="priority",
1141
+ uniform_risk=False,
1142
+ num_change_requests=num_change_requests,
1143
+ pre_existing_schedule=True,
1144
+ level=level,
1145
+ )
1146
+
1147
+
1148
+ class ThreeChangesFixWidePriorityVariedRiskChangeRequestSchedulingTask(
1149
+ ManageChangeRequestScheduleTask
1150
+ ):
1151
+ def __init__(
1152
+ self,
1153
+ seed: int,
1154
+ instance: SNowInstance = None,
1155
+ fixed_config: List[AbstractServiceNowTask] = None,
1156
+ num_change_requests: int = 3,
1157
+ level: int = 2,
1158
+ ) -> None:
1159
+ super().__init__(
1160
+ seed=seed,
1161
+ instance=instance,
1162
+ fixed_config=fixed_config,
1163
+ goal_type="priority",
1164
+ wide_schedule=True,
1165
+ uniform_risk=False,
1166
+ num_change_requests=num_change_requests,
1167
+ pre_existing_schedule=True,
1168
+ level=level,
1169
+ )
1170
+
1171
+
1172
+ class ThreeChangesTightUniformRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
1173
+ def __init__(
1174
+ self,
1175
+ seed: int,
1176
+ instance: SNowInstance = None,
1177
+ fixed_config: List[AbstractServiceNowTask] = None,
1178
+ num_change_requests: int = 3,
1179
+ level: int = 2,
1180
+ ) -> None:
1181
+ super().__init__(
1182
+ seed=seed,
1183
+ instance=instance,
1184
+ fixed_config=fixed_config,
1185
+ goal_type="tight",
1186
+ num_change_requests=num_change_requests,
1187
+ level=level,
1188
+ )
1189
+
1190
+
1191
+ class ThreeChangesWideScheduleTightUniformRiskChangeRequestSchedulingTask(
1192
+ ManageChangeRequestScheduleTask
1193
+ ):
1194
+ def __init__(
1195
+ self,
1196
+ seed: int,
1197
+ instance: SNowInstance = None,
1198
+ fixed_config: List[AbstractServiceNowTask] = None,
1199
+ num_change_requests: int = 3,
1200
+ level: int = 2,
1201
+ ) -> None:
1202
+ super().__init__(
1203
+ seed=seed,
1204
+ instance=instance,
1205
+ fixed_config=fixed_config,
1206
+ goal_type="tight",
1207
+ wide_schedule=True,
1208
+ num_change_requests=num_change_requests,
1209
+ level=level,
1210
+ )
1211
+
1212
+
1213
+ class ThreeChangesFixTightUniformRiskChangeRequestSchedulingTask(ManageChangeRequestScheduleTask):
1214
+ def __init__(
1215
+ self,
1216
+ seed: int,
1217
+ instance: SNowInstance = None,
1218
+ fixed_config: List[AbstractServiceNowTask] = None,
1219
+ num_change_requests: int = 3,
1220
+ level: int = 2,
1221
+ ) -> None:
1222
+ super().__init__(
1223
+ seed=seed,
1224
+ instance=instance,
1225
+ fixed_config=fixed_config,
1226
+ goal_type="tight",
1227
+ num_change_requests=num_change_requests,
1228
+ pre_existing_schedule=True,
1229
+ level=level,
1230
+ )
1231
+
1232
+
1233
+ class ThreeChangesFixWideScheduleTightUniformRiskChangeRequestSchedulingTask(
1234
+ ManageChangeRequestScheduleTask
1235
+ ):
1236
+ def __init__(
1237
+ self,
1238
+ seed: int,
1239
+ instance: SNowInstance = None,
1240
+ fixed_config: List[AbstractServiceNowTask] = None,
1241
+ num_change_requests: int = 3,
1242
+ level: int = 2,
1243
+ ) -> None:
1244
+ super().__init__(
1245
+ seed=seed,
1246
+ instance=instance,
1247
+ fixed_config=fixed_config,
1248
+ goal_type="tight",
1249
+ wide_schedule=True,
1250
+ num_change_requests=num_change_requests,
1251
+ pre_existing_schedule=True,
1252
+ level=level,
1253
+ )
1254
+
1255
+
1256
+ class ThreeChangesTightPriorityVariedRiskChangeRequestSchedulingTask(
1257
+ ManageChangeRequestScheduleTask
1258
+ ):
1259
+ def __init__(
1260
+ self,
1261
+ seed: int,
1262
+ instance: SNowInstance = None,
1263
+ fixed_config: List[AbstractServiceNowTask] = None,
1264
+ num_change_requests: int = 3,
1265
+ level: int = 2,
1266
+ ) -> None:
1267
+ super().__init__(
1268
+ seed=seed,
1269
+ instance=instance,
1270
+ fixed_config=fixed_config,
1271
+ goal_type="tight priority",
1272
+ uniform_risk=False,
1273
+ num_change_requests=num_change_requests,
1274
+ level=level,
1275
+ )
1276
+
1277
+
1278
+ class ThreeChangesWideTightPriorityVariedRiskChangeRequestSchedulingTask(
1279
+ ManageChangeRequestScheduleTask
1280
+ ):
1281
+ def __init__(
1282
+ self,
1283
+ seed: int,
1284
+ instance: SNowInstance = None,
1285
+ fixed_config: List[AbstractServiceNowTask] = None,
1286
+ num_change_requests: int = 3,
1287
+ level: int = 2,
1288
+ ) -> None:
1289
+ super().__init__(
1290
+ seed=seed,
1291
+ instance=instance,
1292
+ fixed_config=fixed_config,
1293
+ goal_type="tight priority",
1294
+ wide_schedule=True,
1295
+ uniform_risk=False,
1296
+ num_change_requests=num_change_requests,
1297
+ level=level,
1298
+ )
1299
+
1300
+
1301
+ class ThreeChangesFixTightPriorityVariedRiskChangeRequestSchedulingTask(
1302
+ ManageChangeRequestScheduleTask
1303
+ ):
1304
+ def __init__(
1305
+ self,
1306
+ seed: int,
1307
+ instance: SNowInstance = None,
1308
+ fixed_config: List[AbstractServiceNowTask] = None,
1309
+ num_change_requests: int = 3,
1310
+ level: int = 2,
1311
+ ) -> None:
1312
+ super().__init__(
1313
+ seed=seed,
1314
+ instance=instance,
1315
+ fixed_config=fixed_config,
1316
+ goal_type="tight priority",
1317
+ uniform_risk=False,
1318
+ num_change_requests=num_change_requests,
1319
+ pre_existing_schedule=True,
1320
+ level=level,
1321
+ )
1322
+
1323
+
1324
+ class ThreeChangesFixWideTightPriorityVariedRiskChangeRequestSchedulingTask(
1325
+ ManageChangeRequestScheduleTask
1326
+ ):
1327
+ def __init__(
1328
+ self,
1329
+ seed: int,
1330
+ instance: SNowInstance = None,
1331
+ fixed_config: List[AbstractServiceNowTask] = None,
1332
+ num_change_requests: int = 3,
1333
+ level: int = 2,
1334
+ ) -> None:
1335
+ super().__init__(
1336
+ seed=seed,
1337
+ instance=instance,
1338
+ fixed_config=fixed_config,
1339
+ goal_type="tight priority",
1340
+ uniform_risk=False,
1341
+ wide_schedule=True,
1342
+ num_change_requests=num_change_requests,
1343
+ pre_existing_schedule=True,
1344
+ level=level,
1345
+ )
1346
+
1347
+
1348
+ local_vars = locals().copy()
1349
+
1350
+
1351
+ SMALL_BASE_SCHEDULING_TASKS = [
1352
+ TwoChangesBasicUniformRiskChangeRequestSchedulingTask,
1353
+ TwoChangesWideBasicUniformRiskChangeRequestSchedulingTask,
1354
+ TwoChangesFixBasicUniformRiskChangeRequestSchedulingTask,
1355
+ TwoChangesFixWideBasicUniformRiskChangeRequestSchedulingTask,
1356
+ TwoChangesBasicVariedRiskChangeRequestSchedulingTask,
1357
+ TwoChangesWideBasicVariedRiskChangeRequestSchedulingTask,
1358
+ TwoChangesFixBasicVariedRiskChangeRequestSchedulingTask,
1359
+ TwoChangesFixWideBasicVariedRiskChangeRequestSchedulingTask,
1360
+ ]
1361
+ SMALL_TIGHT_SCHEDULING_TASKS = [
1362
+ TwoChangesPriorityUniformRiskChangeRequestSchedulingTask,
1363
+ TwoChangesWidePriorityUniformRiskChangeRequestSchedulingTask,
1364
+ TwoChangesFixPriorityUniformRiskChangeRequestSchedulingTask,
1365
+ TwoChangesFixWidePriorityUniformRiskChangeRequestSchedulingTask,
1366
+ TwoChangesPriorityVariedRiskChangeRequestSchedulingTask,
1367
+ TwoChangesWidePriorityVariedRiskChangeRequestSchedulingTask,
1368
+ TwoChangesFixPriorityVariedRiskChangeRequestSchedulingTask,
1369
+ TwoChangesFixWidePriorityVariedRiskChangeRequestSchedulingTask,
1370
+ TwoChangesTightUniformRiskChangeRequestSchedulingTask,
1371
+ TwoChangesWideScheduleTightUniformRiskChangeRequestSchedulingTask,
1372
+ TwoChangesFixTightUniformRiskChangeRequestSchedulingTask,
1373
+ TwoChangesFixWideScheduleTightUniformRiskChangeRequestSchedulingTask,
1374
+ TwoChangesTightPriorityVariedRiskChangeRequestSchedulingTask,
1375
+ TwoChangesWideTightPriorityVariedRiskChangeRequestSchedulingTask,
1376
+ TwoChangesFixTightPriorityVariedRiskChangeRequestSchedulingTask,
1377
+ TwoChangesFixWideTightPriorityVariedRiskChangeRequestSchedulingTask,
1378
+ ]
1379
+
1380
+ LARGE_BASE_SCHEDULING_TASKS = [
1381
+ ThreeChangesBasicUniformRiskChangeRequestSchedulingTask,
1382
+ ThreeChangesWideBasicUniformRiskChangeRequestSchedulingTask,
1383
+ ThreeChangesFixBasicUniformRiskChangeRequestSchedulingTask,
1384
+ ThreeChangesFixWideBasicUniformRiskChangeRequestSchedulingTask,
1385
+ ThreeChangesBasicVariedRiskChangeRequestSchedulingTask,
1386
+ ThreeChangesWideBasicVariedRiskChangeRequestSchedulingTask,
1387
+ ThreeChangesFixBasicVariedRiskChangeRequestSchedulingTask,
1388
+ ThreeChangesFixWideBasicVariedRiskChangeRequestSchedulingTask,
1389
+ ]
1390
+
1391
+ LARGE_TIGHT_SCHEDULING_TASKS = [
1392
+ ThreeChangesPriorityUniformRiskChangeRequestSchedulingTask,
1393
+ ThreeChangesWidePriorityUniformRiskChangeRequestSchedulingTask,
1394
+ ThreeChangesFixPriorityUniformRiskChangeRequestSchedulingTask,
1395
+ ThreeChangesFixWidePriorityUniformRiskChangeRequestSchedulingTask,
1396
+ ThreeChangesPriorityVariedRiskChangeRequestSchedulingTask,
1397
+ ThreeChangesWidePriorityVariedRiskChangeRequestSchedulingTask,
1398
+ ThreeChangesFixPriorityVariedRiskChangeRequestSchedulingTask,
1399
+ ThreeChangesFixWidePriorityVariedRiskChangeRequestSchedulingTask,
1400
+ ThreeChangesTightUniformRiskChangeRequestSchedulingTask,
1401
+ ThreeChangesWideScheduleTightUniformRiskChangeRequestSchedulingTask,
1402
+ ThreeChangesFixTightUniformRiskChangeRequestSchedulingTask,
1403
+ ThreeChangesFixWideScheduleTightUniformRiskChangeRequestSchedulingTask,
1404
+ ThreeChangesTightPriorityVariedRiskChangeRequestSchedulingTask,
1405
+ ThreeChangesWideTightPriorityVariedRiskChangeRequestSchedulingTask,
1406
+ ThreeChangesFixTightPriorityVariedRiskChangeRequestSchedulingTask,
1407
+ ThreeChangesFixWideTightPriorityVariedRiskChangeRequestSchedulingTask,
1408
+ ]
1409
+
1410
+ __TASKS__ = [
1411
+ var
1412
+ for var in local_vars.values()
1413
+ if isinstance(var, type)
1414
+ and issubclass(var, FilterAndDoTask)
1415
+ and var is not FilterAndDoTask
1416
+ and var is not ManageChangeRequestScheduleTask
1417
+ ]