job-shop-lib 1.1.3__tar.gz → 1.2.0__tar.gz

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 (73) hide show
  1. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/PKG-INFO +1 -1
  2. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/__init__.py +1 -1
  3. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/__init__.py +3 -0
  4. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_start_time_calculators.py +49 -0
  5. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/generation/_instance_generator.py +3 -3
  6. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/pyproject.toml +2 -2
  7. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/LICENSE +0 -0
  8. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/README.md +0 -0
  9. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/_base_solver.py +0 -0
  10. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/_job_shop_instance.py +0 -0
  11. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/_operation.py +0 -0
  12. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/_schedule.py +0 -0
  13. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/_scheduled_operation.py +0 -0
  14. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/benchmarking/__init__.py +0 -0
  15. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/benchmarking/_load_benchmark.py +0 -0
  16. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/benchmarking/benchmark_instances.json +0 -0
  17. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/constraint_programming/__init__.py +0 -0
  18. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/constraint_programming/_ortools_solver.py +0 -0
  19. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_dispatcher.py +0 -0
  20. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_dispatcher_observer_config.py +0 -0
  21. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_factories.py +0 -0
  22. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_history_observer.py +0 -0
  23. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_optimal_operations_observer.py +0 -0
  24. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_ready_operation_filters.py +0 -0
  25. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/_unscheduled_operations_observer.py +0 -0
  26. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/__init__.py +0 -0
  27. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_composite_feature_observer.py +0 -0
  28. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_duration_observer.py +0 -0
  29. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_earliest_start_time_observer.py +0 -0
  30. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_factory.py +0 -0
  31. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_feature_observer.py +0 -0
  32. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_is_completed_observer.py +0 -0
  33. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_is_ready_observer.py +0 -0
  34. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_is_scheduled_observer.py +0 -0
  35. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_position_in_job_observer.py +0 -0
  36. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/feature_observers/_remaining_operations_observer.py +0 -0
  37. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/rules/__init__.py +0 -0
  38. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/rules/_dispatching_rule_factory.py +0 -0
  39. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/rules/_dispatching_rule_solver.py +0 -0
  40. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/rules/_dispatching_rules_functions.py +0 -0
  41. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/rules/_machine_chooser_factory.py +0 -0
  42. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/dispatching/rules/_utils.py +0 -0
  43. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/exceptions.py +0 -0
  44. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/generation/__init__.py +0 -0
  45. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/generation/_general_instance_generator.py +0 -0
  46. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/generation/_utils.py +0 -0
  47. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/__init__.py +0 -0
  48. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/_build_disjunctive_graph.py +0 -0
  49. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/_build_resource_task_graphs.py +0 -0
  50. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/_constants.py +0 -0
  51. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/_job_shop_graph.py +0 -0
  52. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/_node.py +0 -0
  53. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/graph_updaters/__init__.py +0 -0
  54. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/graph_updaters/_disjunctive_graph_updater.py +0 -0
  55. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/graph_updaters/_graph_updater.py +0 -0
  56. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/graph_updaters/_residual_graph_updater.py +0 -0
  57. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/graphs/graph_updaters/_utils.py +0 -0
  58. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/py.typed +0 -0
  59. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/reinforcement_learning/__init__.py +0 -0
  60. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/reinforcement_learning/_multi_job_shop_graph_env.py +0 -0
  61. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/reinforcement_learning/_resource_task_graph_observation.py +0 -0
  62. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/reinforcement_learning/_reward_observers.py +0 -0
  63. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/reinforcement_learning/_single_job_shop_graph_env.py +0 -0
  64. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/reinforcement_learning/_types_and_constants.py +0 -0
  65. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/reinforcement_learning/_utils.py +0 -0
  66. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/__init__.py +0 -0
  67. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/gantt/__init__.py +0 -0
  68. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/gantt/_gantt_chart_creator.py +0 -0
  69. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/gantt/_gantt_chart_video_and_gif_creation.py +0 -0
  70. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/gantt/_plot_gantt_chart.py +0 -0
  71. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/graphs/__init__.py +0 -0
  72. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/graphs/_plot_disjunctive_graph.py +0 -0
  73. {job_shop_lib-1.1.3 → job_shop_lib-1.2.0}/job_shop_lib/visualization/graphs/_plot_resource_task_graph.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: job-shop-lib
3
- Version: 1.1.3
3
+ Version: 1.2.0
4
4
  Summary: An easy-to-use and modular Python library for the Job Shop Scheduling Problem (JSSP)
5
5
  License: MIT
6
6
  Author: Pabloo22
@@ -19,7 +19,7 @@ from job_shop_lib._schedule import Schedule
19
19
  from job_shop_lib._base_solver import BaseSolver, Solver
20
20
 
21
21
 
22
- __version__ = "1.1.3"
22
+ __version__ = "1.2.0"
23
23
 
24
24
  __all__ = [
25
25
  "Operation",
@@ -24,6 +24,7 @@ Problem step-by-step.
24
24
  get_matrix_setup_time_calculator
25
25
  get_breakdown_calculator
26
26
  get_job_dependent_setup_calculator
27
+ get_arrival_calculator
27
28
 
28
29
  Dispatching refers to the decision-making process of selecting which job
29
30
  should be processed next on a particular machine when that machine becomes
@@ -53,6 +54,7 @@ from ._start_time_calculators import (
53
54
  get_breakdown_calculator,
54
55
  get_job_dependent_setup_calculator,
55
56
  get_matrix_setup_time_calculator,
57
+ get_arrival_calculator,
56
58
  )
57
59
  from ._dispatcher_observer_config import DispatcherObserverConfig
58
60
  from ._factories import (
@@ -84,4 +86,5 @@ __all__ = [
84
86
  "get_matrix_setup_time_calculator",
85
87
  "get_breakdown_calculator",
86
88
  "get_job_dependent_setup_calculator",
89
+ "get_arrival_calculator",
87
90
  ]
@@ -193,3 +193,52 @@ def get_job_dependent_setup_calculator(
193
193
  return default_start + setup_time
194
194
 
195
195
  return calculator
196
+
197
+
198
+ def get_arrival_calculator(
199
+ arrival_times: Sequence[Sequence[int]] | NDArray[np.integer] | None = None,
200
+ ) -> StartTimeCalculator:
201
+ """Returns a start time calculator that respects operation arrival times.
202
+
203
+ This calculator uses a predefined matrix of arrival times to
204
+ ensure that no operation begins before its specified arrival
205
+ time. If the ``arrival_times`` matrix isn't provided directly,
206
+ the calculator attempts to retrieve it from the dispatcher's
207
+ instance metadata using the key ``"arrival_times_matrix"``.
208
+
209
+ Args:
210
+ arrival_times:
211
+ A 2D matrix where ``arrival_times[i][j]`` is the
212
+ arrival time for the operation at index ``j`` of
213
+ job ``i``. If ``None``, the calculator will
214
+ attempt to retrieve it from the dispatcher metadata.
215
+
216
+ Returns:
217
+ A start time calculator function that uses the arrival times.
218
+
219
+ Example:
220
+ >>> arrival_calc = get_arrival_calculator([[0, 2], [1, 0]])
221
+ >>> dispatcher = Dispatcher(
222
+ ... instance, start_time_calculator=arrival_calc
223
+ ... )
224
+ """
225
+
226
+ def calculator(
227
+ dispatcher: Dispatcher, operation: Operation, machine_id: int
228
+ ) -> int:
229
+ default_start_time = no_setup_time_calculator(
230
+ dispatcher, operation, machine_id
231
+ )
232
+ arrival_matrix = arrival_times
233
+ if arrival_matrix is None:
234
+ arrival_matrix = dispatcher.instance.metadata.get(
235
+ "arrival_times_matrix"
236
+ )
237
+ if arrival_matrix is None:
238
+ return default_start_time
239
+ operation_arrival_time = arrival_matrix[operation.job_id][
240
+ operation.position_in_job
241
+ ]
242
+ return max(default_start_time, operation_arrival_time)
243
+
244
+ return calculator
@@ -1,6 +1,6 @@
1
1
  """Home of the `InstanceGenerator` class."""
2
2
 
3
- import abc
3
+ from abc import ABC, abstractmethod
4
4
 
5
5
  import random
6
6
  from typing import Iterator
@@ -9,7 +9,7 @@ from job_shop_lib import JobShopInstance
9
9
  from job_shop_lib.exceptions import UninitializedAttributeError
10
10
 
11
11
 
12
- class InstanceGenerator(abc.ABC):
12
+ class InstanceGenerator(ABC):
13
13
  """Common interface for all generators.
14
14
 
15
15
  The class supports both single instance generation and iteration over
@@ -75,7 +75,7 @@ class InstanceGenerator(abc.ABC):
75
75
  self._current_iteration = 0
76
76
  self._iteration_limit = iteration_limit
77
77
 
78
- @abc.abstractmethod
78
+ @abstractmethod
79
79
  def generate(
80
80
  self,
81
81
  num_jobs: int | None = None,
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "job-shop-lib"
3
- version = "1.1.3"
3
+ version = "1.2.0"
4
4
  description = "An easy-to-use and modular Python library for the Job Shop Scheduling Problem (JSSP)"
5
5
  authors = ["Pabloo22 <pablete.arino@gmail.com>"]
6
6
  license = "MIT"
@@ -64,7 +64,7 @@ ipython = "^8.31.0"
64
64
  pygraphviz = ["pygraphviz"]
65
65
 
66
66
  [build-system]
67
- requires = ["poetry-core"]
67
+ requires = ["poetry-core==1.8.2"] # Enforces specific Poetry version
68
68
  build-backend = "poetry.core.masonry.api"
69
69
 
70
70
  [tool.black]
File without changes
File without changes