job-shop-lib 1.0.0b5__py3-none-any.whl → 1.0.2__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 (40) hide show
  1. job_shop_lib/__init__.py +1 -1
  2. job_shop_lib/_job_shop_instance.py +2 -2
  3. job_shop_lib/_operation.py +9 -3
  4. job_shop_lib/_scheduled_operation.py +3 -0
  5. job_shop_lib/benchmarking/__init__.py +1 -0
  6. job_shop_lib/dispatching/__init__.py +12 -10
  7. job_shop_lib/dispatching/_dispatcher.py +6 -13
  8. job_shop_lib/dispatching/_factories.py +3 -3
  9. job_shop_lib/dispatching/_optimal_operations_observer.py +0 -2
  10. job_shop_lib/dispatching/_ready_operation_filters.py +4 -4
  11. job_shop_lib/dispatching/feature_observers/_composite_feature_observer.py +11 -6
  12. job_shop_lib/dispatching/feature_observers/_factory.py +8 -3
  13. job_shop_lib/dispatching/feature_observers/_feature_observer.py +1 -1
  14. job_shop_lib/dispatching/feature_observers/_is_completed_observer.py +35 -67
  15. job_shop_lib/dispatching/rules/__init__.py +11 -8
  16. job_shop_lib/dispatching/rules/_dispatching_rule_factory.py +1 -1
  17. job_shop_lib/dispatching/rules/_machine_chooser_factory.py +3 -2
  18. job_shop_lib/generation/__init__.py +12 -1
  19. job_shop_lib/graphs/__init__.py +42 -8
  20. job_shop_lib/graphs/_build_resource_task_graphs.py +1 -1
  21. job_shop_lib/graphs/_job_shop_graph.py +38 -19
  22. job_shop_lib/graphs/graph_updaters/__init__.py +5 -1
  23. job_shop_lib/graphs/graph_updaters/_disjunctive_graph_updater.py +108 -0
  24. job_shop_lib/graphs/graph_updaters/_residual_graph_updater.py +3 -1
  25. job_shop_lib/graphs/graph_updaters/_utils.py +2 -2
  26. job_shop_lib/py.typed +0 -0
  27. job_shop_lib/reinforcement_learning/__init__.py +13 -7
  28. job_shop_lib/reinforcement_learning/_multi_job_shop_graph_env.py +1 -1
  29. job_shop_lib/reinforcement_learning/_resource_task_graph_observation.py +102 -24
  30. job_shop_lib/reinforcement_learning/_single_job_shop_graph_env.py +11 -2
  31. job_shop_lib/reinforcement_learning/_types_and_constants.py +11 -10
  32. job_shop_lib/reinforcement_learning/_utils.py +29 -0
  33. job_shop_lib/visualization/gantt/__init__.py +7 -3
  34. job_shop_lib/visualization/gantt/_gantt_chart_video_and_gif_creation.py +5 -2
  35. job_shop_lib/visualization/graphs/__init__.py +1 -0
  36. job_shop_lib/visualization/graphs/_plot_disjunctive_graph.py +53 -19
  37. {job_shop_lib-1.0.0b5.dist-info → job_shop_lib-1.0.2.dist-info}/METADATA +19 -18
  38. {job_shop_lib-1.0.0b5.dist-info → job_shop_lib-1.0.2.dist-info}/RECORD +40 -38
  39. {job_shop_lib-1.0.0b5.dist-info → job_shop_lib-1.0.2.dist-info}/LICENSE +0 -0
  40. {job_shop_lib-1.0.0b5.dist-info → job_shop_lib-1.0.2.dist-info}/WHEEL +0 -0
@@ -1,15 +1,19 @@
1
1
  """Contains functions and classes for visualizing job shop scheduling problems.
2
2
 
3
3
  .. autosummary::
4
+ :nosignatures:
4
5
 
5
6
  plot_gantt_chart
6
- get_partial_gantt_chart_plotter
7
- PartialGanttChartPlotter
8
7
  create_gantt_chart_video
9
8
  create_gantt_chart_gif
9
+ create_gantt_chart_frames
10
+ get_partial_gantt_chart_plotter
11
+ create_gif_from_frames
12
+ create_video_from_frames
10
13
  GanttChartCreator
11
14
  GifConfig
12
15
  VideoConfig
16
+ PartialGanttChartPlotter
13
17
  PartialGanttChartPlotterConfig
14
18
 
15
19
  """
@@ -41,8 +45,8 @@ __all__ = [
41
45
  "create_gif_from_frames",
42
46
  "create_video_from_frames",
43
47
  "GanttChartCreator",
44
- "PartialGanttChartPlotterConfig",
45
48
  "GifConfig",
46
49
  "VideoConfig",
47
50
  "PartialGanttChartPlotter",
51
+ "PartialGanttChartPlotterConfig",
48
52
  ]
@@ -3,7 +3,7 @@
3
3
  import os
4
4
  import pathlib
5
5
  import shutil
6
- from typing import Sequence, Protocol, Optional, List
6
+ from typing import Sequence, Protocol, Optional, List, Any
7
7
 
8
8
  import imageio
9
9
  import matplotlib.pyplot as plt
@@ -68,6 +68,7 @@ def get_partial_gantt_chart_plotter(
68
68
  title: Optional[str] = None,
69
69
  cmap: str = "viridis",
70
70
  show_available_operations: bool = False,
71
+ **kwargs: Any,
71
72
  ) -> PartialGanttChartPlotter:
72
73
  """Returns a function that plots a Gantt chart for an unfinished schedule.
73
74
 
@@ -76,6 +77,8 @@ def get_partial_gantt_chart_plotter(
76
77
  cmap: The name of the colormap to use.
77
78
  show_available_operations:
78
79
  Whether to show the available operations in the Gantt chart.
80
+ **kwargs: Additional keyword arguments to pass to the
81
+ :func:`plot_gantt_chart` function.
79
82
 
80
83
  Returns:
81
84
  A function that plots a Gantt chart for a schedule. The function takes
@@ -97,7 +100,7 @@ def get_partial_gantt_chart_plotter(
97
100
  current_time: Optional[int] = None,
98
101
  ) -> Figure:
99
102
  fig, ax = plot_gantt_chart(
100
- schedule, title=title, cmap_name=cmap, xlim=makespan
103
+ schedule, title=title, cmap_name=cmap, xlim=makespan, **kwargs
101
104
  )
102
105
 
103
106
  if show_available_operations and available_operations is not None:
@@ -1,6 +1,7 @@
1
1
  """Contains functions and classes for visualizing job shop scheduling problems.
2
2
 
3
3
  .. autosummary::
4
+ :nosignatures:
4
5
 
5
6
  plot_disjunctive_graph
6
7
  plot_resource_task_graph
@@ -7,6 +7,7 @@ import warnings
7
7
  import copy
8
8
 
9
9
  import matplotlib
10
+ import matplotlib.colors
10
11
  import matplotlib.pyplot as plt
11
12
  import networkx as nx
12
13
  from networkx.drawing.nx_agraph import graphviz_layout
@@ -66,6 +67,9 @@ def plot_disjunctive_graph(
66
67
  alpha: float = 0.95,
67
68
  operation_node_labeler: Callable[[Node], str] = duration_labeler,
68
69
  node_font_color: str = "white",
70
+ machine_colors: Optional[
71
+ Dict[int, Tuple[float, float, float, float]]
72
+ ] = None,
69
73
  color_map: str = "Dark2_r",
70
74
  disjunctive_edge_color: str = "red",
71
75
  conjunctive_edge_color: str = "black",
@@ -114,6 +118,12 @@ def plot_disjunctive_graph(
114
118
  with their duration.
115
119
  node_font_color:
116
120
  The color of the node labels (default is ``"white"``).
121
+ machine_colors:
122
+ A dictionary that maps machine ids to colors. If not provided,
123
+ the colors are generated using the ``color_map``. If provided,
124
+ the colors are used as the base for the node colors. The
125
+ dictionary should have the form ``{machine_id: (r, g, b, a)}``.
126
+ For source and sink nodes use ``-1`` as the machine id.
117
127
  color_map:
118
128
  The color map to use for the nodes (default is ``"Dark2_r"``).
119
129
  disjunctive_edge_color:
@@ -229,12 +239,40 @@ def plot_disjunctive_graph(
229
239
 
230
240
  # Draw nodes
231
241
  # ----------
232
- node_colors = [
233
- _get_node_color(node)
234
- for node in job_shop_graph.nodes
235
- if not job_shop_graph.is_removed(node.node_id)
236
- ]
237
- cmap_func = matplotlib.colormaps.get_cmap(color_map)
242
+ operation_nodes = job_shop_graph.nodes_by_type[NodeType.OPERATION]
243
+ cmap_func: Optional[matplotlib.colors.Colormap] = None
244
+ if machine_colors is None:
245
+ machine_colors = {}
246
+ cmap_func = matplotlib.colormaps.get_cmap(color_map)
247
+ remaining_machines = job_shop_graph.instance.num_machines
248
+ for operation_node in operation_nodes:
249
+ if job_shop_graph.is_removed(operation_node.node_id):
250
+ continue
251
+ machine_id = operation_node.operation.machine_id
252
+ if machine_id not in machine_colors:
253
+ machine_colors[machine_id] = cmap_func(
254
+ (_get_node_color(operation_node) + 1)
255
+ / job_shop_graph.instance.num_machines
256
+ )
257
+ remaining_machines -= 1
258
+ if remaining_machines == 0:
259
+ break
260
+ node_colors: list[Any] = [
261
+ _get_node_color(node)
262
+ for node in job_shop_graph.nodes
263
+ if not job_shop_graph.is_removed(node.node_id)
264
+ ]
265
+ else:
266
+ node_colors = []
267
+ for node in job_shop_graph.nodes:
268
+ if job_shop_graph.is_removed(node.node_id):
269
+ continue
270
+ if node.node_type == NodeType.OPERATION:
271
+ machine_id = node.operation.machine_id
272
+ else:
273
+ machine_id = -1
274
+ node_colors.append(machine_colors[machine_id])
275
+
238
276
  nx.draw_networkx_nodes(
239
277
  job_shop_graph.graph,
240
278
  pos,
@@ -292,24 +330,20 @@ def plot_disjunctive_graph(
292
330
 
293
331
  # Draw node labels
294
332
  # ----------------
295
- operation_nodes = job_shop_graph.nodes_by_type[NodeType.OPERATION]
296
333
  labels = {}
297
- source_node = job_shop_graph.nodes_by_type[NodeType.SOURCE][0]
298
- labels[source_node] = start_node_label
299
-
300
- sink_node = job_shop_graph.nodes_by_type[NodeType.SINK][0]
301
- labels[sink_node] = end_node_label
302
- machine_colors: dict[int, Tuple[float, float, float, float]] = {}
334
+ if job_shop_graph.nodes_by_type[NodeType.SOURCE]:
335
+ source_node = job_shop_graph.nodes_by_type[NodeType.SOURCE][0]
336
+ if not job_shop_graph.is_removed(source_node.node_id):
337
+ labels[source_node] = start_node_label
338
+ if job_shop_graph.nodes_by_type[NodeType.SINK]:
339
+ sink_node = job_shop_graph.nodes_by_type[NodeType.SINK][0]
340
+ # check if the sink node is removed
341
+ if not job_shop_graph.is_removed(sink_node.node_id):
342
+ labels[sink_node] = end_node_label
303
343
  for operation_node in operation_nodes:
304
344
  if job_shop_graph.is_removed(operation_node.node_id):
305
345
  continue
306
346
  labels[operation_node] = operation_node_labeler(operation_node)
307
- machine_id = operation_node.operation.machine_id
308
- if machine_id not in machine_colors:
309
- machine_colors[machine_id] = cmap_func(
310
- (_get_node_color(operation_node) + 1)
311
- / job_shop_graph.instance.num_machines
312
- )
313
347
 
314
348
  nx.draw_networkx_labels(
315
349
  job_shop_graph.graph,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: job-shop-lib
3
- Version: 1.0.0b5
3
+ Version: 1.0.2
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
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Provides-Extra: pygraphviz
15
- Requires-Dist: gymnasium (>=0.29.1,<0.30.0)
15
+ Requires-Dist: gymnasium (>=1.0.0,<2.0.0)
16
16
  Requires-Dist: imageio[ffmpeg] (>=2.34.1,<3.0.0)
17
17
  Requires-Dist: matplotlib (>=3,<4)
18
18
  Requires-Dist: networkx (>=3,<4)
@@ -40,7 +40,11 @@ JobShopLib is a Python package for creating, solving, and visualizing job shop s
40
40
 
41
41
  It follows a modular design, allowing users to easily extend the library with new solvers, dispatching rules, visualization functions, etc.
42
42
 
43
- See the [documentation](https://job-shop-lib.readthedocs.io/en/latest/) for more details about the latest version.
43
+ There is a [documentation page](https://job-shop-lib.readthedocs.io/en/stable/) for versions 1.0.0a3 and onward. See the [latest pull requests](https://github.com/Pabloo22/job_shop_lib/pulls?q=is%3Apr+is%3Aclosed) for the latest changes.
44
+
45
+ See [`gnn_scheduler`](https://github.com/Pabloo22/gnn_scheduler/blob/main/gnn_scheduler/) for an example implementation of a graph neural network-based dispatcher trained with [PyTorch Geometric](https://pyg.org/).
46
+
47
+ See [this](https://colab.research.google.com/drive/1XV_Rvq1F2ns6DFG8uNj66q_rcowwTZ4H?usp=sharing) Google Colab notebook for a quick start guide! More advanced examples can be found [here](https://job-shop-lib.readthedocs.io/en/stable/examples.html).
44
48
 
45
49
  ## Installation :package:
46
50
 
@@ -48,23 +52,12 @@ See the [documentation](https://job-shop-lib.readthedocs.io/en/latest/) for more
48
52
 
49
53
  JobShopLib is distributed on [PyPI](https://pypi.org/project/job-shop-lib/) and it supports Python 3.10+.
50
54
 
51
- You can install the latest stable version (version 0.5.1) using `pip`:
55
+ You can install the latest stable version using `pip`:
52
56
 
53
57
  ```bash
54
58
  pip install job-shop-lib
55
59
  ```
56
60
 
57
- See [this](https://colab.research.google.com/drive/1XV_Rvq1F2ns6DFG8uNj66q_rcowwTZ4H?usp=sharing) Google Colab notebook for a quick start guide!
58
-
59
-
60
- Version 1.0.0 is currently in beta stage and can be installed with:
61
-
62
- ```bash
63
- pip install job-shop-lib==1.0.0b5
64
- ```
65
-
66
- Although this version is not stable and may contain breaking changes in subsequent releases, it is recommended to install it to access the new reinforcement learning environments and familiarize yourself with new changes (see the [latest pull requests](https://github.com/Pabloo22/job_shop_lib/pulls?q=is%3Apr+is%3Aclosed)). There is a [documentation page](https://job-shop-lib.readthedocs.io/en/latest/) for versions 1.0.0a3 and onward.
67
-
68
61
  <!-- end installation -->
69
62
 
70
63
  <!-- key features -->
@@ -258,7 +251,15 @@ Additionally, the graph includes **disjunctive edges** between operations that u
258
251
  ```python
259
252
  from job_shop_lib.visualization import plot_disjunctive_graph
260
253
 
261
- fig = plot_disjunctive_graph(instance)
254
+ fig = plot_disjunctive_graph(
255
+ instance,
256
+ figsize=(6, 4),
257
+ draw_disjunctive_edges="single_edge",
258
+ disjunctive_edges_additional_params={
259
+ "arrowstyle": "<|-|>",
260
+ "connectionstyle": "arc3,rad=0.15",
261
+ },
262
+ )
262
263
  plt.show()
263
264
  ```
264
265
 
@@ -314,9 +315,9 @@ from job_shop_lib.graphs import (
314
315
  )
315
316
  from job_shop_lib.visualization import plot_resource_task_graph
316
317
 
317
- complete_resource_task_graph = build_complete_resource_task_graph(instance)
318
+ resource_task_graph = build_resource_task_graph(instance)
318
319
 
319
- fig = plot_resource_task_graph(complete_agent_task_graph)
320
+ fig = plot_resource_task_graph(resource_task_graph)
320
321
  plt.show()
321
322
  ```
322
323
 
@@ -1,71 +1,73 @@
1
- job_shop_lib/__init__.py,sha256=3Ip52vXCTCs_JAhhNCpSs1Q2omWPbPzKzM1g47mO5eA,643
1
+ job_shop_lib/__init__.py,sha256=4PBE20akYQTdQ992Nph7py3B-5IA3hEXKgCwW7m0dmI,639
2
2
  job_shop_lib/_base_solver.py,sha256=p17XmtufNc9Y481cqZUT45pEkUmmW1HWG53dfhIBJH8,1363
3
- job_shop_lib/_job_shop_instance.py,sha256=hNQGSJj0rEQpS-YhzwWmM6QzCWp6r--89jkghSgLvUs,18380
4
- job_shop_lib/_operation.py,sha256=hx2atpP8LPj9fvxpZIfhBFr9Uq6JP-MKAX5JzTvFXso,3847
3
+ job_shop_lib/_job_shop_instance.py,sha256=WPdQ4fpXkOlMh2bn_uXNCgEMFSi4-88HVtYaRuLiSbQ,18389
4
+ job_shop_lib/_operation.py,sha256=DrnlIrmnKFT5lzMvqCMszF18WcK77AJTRDO5wWrmm7s,4273
5
5
  job_shop_lib/_schedule.py,sha256=-RdCtTTj-SdNLFucmSVnrCbjZLcBZ4yfhRBdATjAaW8,11292
6
- job_shop_lib/_scheduled_operation.py,sha256=krjGn47VwsC7bXUTqlUq8Y-DpiSE9q2z8bqwgJVpAZo,2697
7
- job_shop_lib/benchmarking/__init__.py,sha256=BYCrJUNr_uk2c0xIbDt07OnUMhQx8Dudkukx3TFWxgw,3271
6
+ job_shop_lib/_scheduled_operation.py,sha256=czrGr87EOTlO2NPolIN5CDigeiCzvQEyra5IZPwSFZc,2801
7
+ job_shop_lib/benchmarking/__init__.py,sha256=JPnCw5mK7sADAW0HctVKHEDRw22afp9caNh2eUS36Ys,3290
8
8
  job_shop_lib/benchmarking/_load_benchmark.py,sha256=Jb6HYGKkub-3uU3l3NreRPE0PU6f0n8G9Mih5vMImOI,2936
9
9
  job_shop_lib/benchmarking/benchmark_instances.json,sha256=F9EvyzFwVxiKAN6rQTsrMhsKstmyUmroyWduM7a00KQ,464841
10
10
  job_shop_lib/constraint_programming/__init__.py,sha256=kKQRUxxS_nVFUdXGnf4bQOD9mqrXxZZWElS753A4YiA,454
11
11
  job_shop_lib/constraint_programming/_ortools_solver.py,sha256=vz_Kg_CmvZ13yGgqi-hZuFkosJR1v449xNaAZV3PhsE,10501
12
- job_shop_lib/dispatching/__init__.py,sha256=SXVd0Zh6xTp-lNT7c463pii3l168NCZYf-5uOwBI1Fc,1770
13
- job_shop_lib/dispatching/_dispatcher.py,sha256=HW333xJoupufSUCg-pfaR_4KoQHjQMd4SBXJj-vgE7Y,22349
12
+ job_shop_lib/dispatching/__init__.py,sha256=dGctOuTVkj0eLfmRM1Us5x7ZtnUvtJC_M7lnZpZrxo0,1835
13
+ job_shop_lib/dispatching/_dispatcher.py,sha256=oC-1h6p83qzumynJWMzsrbsudM1tt9AebAufKEjygRI,22039
14
14
  job_shop_lib/dispatching/_dispatcher_observer_config.py,sha256=RaUkLxYCHG8Tx2tPgFyOBa8FAcbREZdKuTyLsyaYvhA,2473
15
- job_shop_lib/dispatching/_factories.py,sha256=1McCm3iJGdGDZerAe6MTWsthpbomuYb3crTKg_5lfyM,4678
15
+ job_shop_lib/dispatching/_factories.py,sha256=NzpUdxHDU_aVjHBScu8HVhSKZnTKYItHcUFS4mUp4KM,4723
16
16
  job_shop_lib/dispatching/_history_observer.py,sha256=dixJe83quzGNwG0u0k2uES7GsLw0zWCjX0MOUD4VTRU,634
17
- job_shop_lib/dispatching/_optimal_operations_observer.py,sha256=HTbmc9EaagM3UA6IIUaj7O0Fq3hCrjONhfonHIZnCE0,4376
18
- job_shop_lib/dispatching/_ready_operation_filters.py,sha256=H2-CPL0BKDvpLM2zvDGr9eC849qLgbxsVDHgPAHtNgc,5754
17
+ job_shop_lib/dispatching/_optimal_operations_observer.py,sha256=HS933mn2VlwgE7plSsth94RGlbEzfskF6TNyOM7rQrY,4246
18
+ job_shop_lib/dispatching/_ready_operation_filters.py,sha256=vzo9vfijhc-Y75GrBpxuoYKaUuSL7-picD230PdhwuI,5778
19
19
  job_shop_lib/dispatching/_unscheduled_operations_observer.py,sha256=3E0ePesDdWdNs6520znnOBW3eiegJj5bZg9Tmb0xoSA,2705
20
20
  job_shop_lib/dispatching/feature_observers/__init__.py,sha256=EuJLvSpJpoXUK8A4UuC2k6Mpa293ZR3oCnnvYivIBtU,2240
21
- job_shop_lib/dispatching/feature_observers/_composite_feature_observer.py,sha256=5njpWV1Biui931HEuik9JGjsawle8fXaU5-mFYsxhRI,7933
21
+ job_shop_lib/dispatching/feature_observers/_composite_feature_observer.py,sha256=kLYYMT7bUBu1n6IzI73oaPYw0FbfScuW4y_zKbIRMOE,8027
22
22
  job_shop_lib/dispatching/feature_observers/_duration_observer.py,sha256=fbkUIVScF1iNjdVCYr1ImQm53TfahvVnGXhsRAsgdzY,4129
23
23
  job_shop_lib/dispatching/feature_observers/_earliest_start_time_observer.py,sha256=W5Tr81Kme8N-m85jmX7yVc65_xlwNQBvVjnjlL-aq7w,11493
24
- job_shop_lib/dispatching/feature_observers/_factory.py,sha256=JRQLQ4SEXk7_beyzm0VcGQaL1j8NB1v7ZzsEh7NU3IM,3147
25
- job_shop_lib/dispatching/feature_observers/_feature_observer.py,sha256=inFim_vKRk9_MTHURkr2ZLP1aJ1AHd3OQXqYg7VvCAo,8722
26
- job_shop_lib/dispatching/feature_observers/_is_completed_observer.py,sha256=Dm67d90C-a-aZXDtRca1VakuYmLFXIl4vD9upr_1q6Q,4642
24
+ job_shop_lib/dispatching/feature_observers/_factory.py,sha256=RWrRdEDBv_0vpJNHD67_Qjov2_72yS5d7tXJiWuyobQ,3321
25
+ job_shop_lib/dispatching/feature_observers/_feature_observer.py,sha256=nxDPYoVu5nAeDuXqdkA-H8slHRSt47JyHDERNachDCA,8693
26
+ job_shop_lib/dispatching/feature_observers/_is_completed_observer.py,sha256=8nmdnlPQfuudipWcxPhUPbQvlIHLmnzoeQyWkNzB-J8,3642
27
27
  job_shop_lib/dispatching/feature_observers/_is_ready_observer.py,sha256=aP5CpwmCWP4w8J69qAC7QwGRQGMlfNbM31n-BRu92DA,1289
28
28
  job_shop_lib/dispatching/feature_observers/_is_scheduled_observer.py,sha256=OcuMUB9_By6ZMtX-1_3z-xaxGbP85a5Zv0ywAv7XxWQ,1491
29
29
  job_shop_lib/dispatching/feature_observers/_position_in_job_observer.py,sha256=WRknpQBKXs6h6cXLFJW7ZCvjtU8CPL-iXXNPw3g-mLE,1303
30
30
  job_shop_lib/dispatching/feature_observers/_remaining_operations_observer.py,sha256=5V87lCrJUabEe8AkTGXPu5yS8OGxeN8L3-xNyHmdmLs,1441
31
- job_shop_lib/dispatching/rules/__init__.py,sha256=g3PGvMLMa3WMgNhGSW3S_xkHqoHpW8hr_9JqOfR7Xrk,2140
32
- job_shop_lib/dispatching/rules/_dispatching_rule_factory.py,sha256=0Hht2i_aGS5hgwPxh_59-ZtNQxgSOwEFclukXH6Ib9U,2942
31
+ job_shop_lib/dispatching/rules/__init__.py,sha256=0Nn9FBVmxVYeDeLsd7g7WkmKFBYJqOIDzArbqsC7FAI,2187
32
+ job_shop_lib/dispatching/rules/_dispatching_rule_factory.py,sha256=0v7IcSQadvlX6tRy86Z55ruwIY70H9q9E46tdazjtkU,2942
33
33
  job_shop_lib/dispatching/rules/_dispatching_rule_solver.py,sha256=9-UE0HiHCeFXFGqB85cSfduLCEm5k5bJkmIujP-_irg,7321
34
34
  job_shop_lib/dispatching/rules/_dispatching_rules_functions.py,sha256=wfBdiKqEQQ8C5Gg_mrWWSuWncPwUkFacjeAQ8D4n9Wc,7648
35
- job_shop_lib/dispatching/rules/_machine_chooser_factory.py,sha256=QqYXQr7Cp6WsqhLa1oHvR1vnbG8IFmYvxM44dQeLeSE,2362
35
+ job_shop_lib/dispatching/rules/_machine_chooser_factory.py,sha256=AtYJGuvKlc3T4Y5NCGxgjQ-np3d1aeADAZ3r68No_WA,2383
36
36
  job_shop_lib/dispatching/rules/_utils.py,sha256=DFDpRoHb56Rtn01vfN69Bq0X3F8P1EtM6trHx9aXg3U,4643
37
37
  job_shop_lib/exceptions.py,sha256=ARzpoZJCvRIvOesCiqqFSRxkv6w9WwEXx0aBP-l2IKA,1597
38
- job_shop_lib/generation/__init__.py,sha256=tgMVhnh62lkwGKywvingFD9SLhc-vERKiWsS-41qQKA,605
38
+ job_shop_lib/generation/__init__.py,sha256=QaWwuBfBNnOiG0OPiP_CV_flBu9dX7r2o_HwL47tREM,822
39
39
  job_shop_lib/generation/_general_instance_generator.py,sha256=e-NDkH-NoCwa14oADj6n_I7BX5xWWVVzRLvb4rpJ92w,6374
40
40
  job_shop_lib/generation/_instance_generator.py,sha256=VV0OKX4JgFq3I1EY6s3LrOdPjM3v4lH6S1hkUebTkFQ,4615
41
41
  job_shop_lib/generation/_transformations.py,sha256=X-hTAJVIHZ3bmF1rqS0zCit8r5SGpHpV8Fcl92fejow,5336
42
42
  job_shop_lib/generation/_utils.py,sha256=cBhGILE0FE3TqvWoHqpaFEffO8D2fb869pF-BdMlYsg,3617
43
- job_shop_lib/graphs/__init__.py,sha256=RI9vGUR_89X34UoHpl1HYZpxT8JOWg8dwZTe5ImDCVg,1849
43
+ job_shop_lib/graphs/__init__.py,sha256=wlYIiXTuZRE6Kx3K0RpPUoZikzoegBuN2hcdqMODtGk,2433
44
44
  job_shop_lib/graphs/_build_disjunctive_graph.py,sha256=UbUYdeQaaeEqLchcKJGHEFGl4wElfGLb1o_R-u8wqnA,5120
45
- job_shop_lib/graphs/_build_resource_task_graphs.py,sha256=GHUHkUNPxVf1miScgPPMe2YqlXFEMxIy5cDhNw7OZ1E,6954
45
+ job_shop_lib/graphs/_build_resource_task_graphs.py,sha256=mWg8C-62aqvAwIKsreAHLYIq-VOc0q7BEnOnlUrywb8,6961
46
46
  job_shop_lib/graphs/_constants.py,sha256=K-GeVvh_DTWpo1KOX1clmxWS_pkUJbq19yOBmrCVIxI,1086
47
- job_shop_lib/graphs/_job_shop_graph.py,sha256=mgawDY-PlEkGeTxoF0HaZCs0K514YH6zKFB0SssbJak,10761
47
+ job_shop_lib/graphs/_job_shop_graph.py,sha256=TdpUNLv9FBuosPrhLrhQl75u_kwRX0vygKFknLT6pJY,11480
48
48
  job_shop_lib/graphs/_node.py,sha256=9TFH8C1D44W1IvOIG8MucLNQyLzasyBXVkMZTJU4rso,6075
49
- job_shop_lib/graphs/graph_updaters/__init__.py,sha256=UhnZL55e3cAv7hVetB6bRmIOn8BDhG2bsbrdRoHtxLY,516
49
+ job_shop_lib/graphs/graph_updaters/__init__.py,sha256=YOwb0RYypO9cEG-Nl3Ooj1yvAoyWDMNE_NAaUTyjzIw,658
50
+ job_shop_lib/graphs/graph_updaters/_disjunctive_graph_updater.py,sha256=-t0T8W-Jz9TJQR9-ljPkcDsDC4CwJAfs2nUF3zjEtuw,4369
50
51
  job_shop_lib/graphs/graph_updaters/_graph_updater.py,sha256=j1f7iWsa62GVszK2BPaMxnKBCEGWa9owm8g4VWUje8w,1967
51
- job_shop_lib/graphs/graph_updaters/_residual_graph_updater.py,sha256=SfgmDyMwfW56OBjJPaU76c42IsX5qx9j-eMtrv0DjKk,6047
52
- job_shop_lib/graphs/graph_updaters/_utils.py,sha256=X5YfwJA1CCgpm1r9C036Gal2CkDh2SSak7wl7TbdjHw,704
53
- job_shop_lib/reinforcement_learning/__init__.py,sha256=opqJyVJ6VPyeaQOQr4hmUTkiUAXOi5tbyCnuNw5jLTI,1421
54
- job_shop_lib/reinforcement_learning/_multi_job_shop_graph_env.py,sha256=memQefVWqatRNodt8hBXVvFcgQKJRmnuB8AWqiDl8_k,15746
55
- job_shop_lib/reinforcement_learning/_resource_task_graph_observation.py,sha256=ROu_oTsjLvuU5cdvZ2A8D5HWlEZ3NfPtjNWJYH5ilJA,9648
52
+ job_shop_lib/graphs/graph_updaters/_residual_graph_updater.py,sha256=SyQJXIJvXijO51AzPz7YbCPZZK8d8JHE63LFX_F95Gc,6102
53
+ job_shop_lib/graphs/graph_updaters/_utils.py,sha256=sdw2Vo75P9c6Fy-YBlfgpXb9gPwHUluTB1E-9WINm_g,730
54
+ job_shop_lib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ job_shop_lib/reinforcement_learning/__init__.py,sha256=6RyAQW-ps6UebHpnFHPiGAAlYyd4BiB0d7P7bRtdHOw,1532
56
+ job_shop_lib/reinforcement_learning/_multi_job_shop_graph_env.py,sha256=fwgKveAoNtO-uV4NvmfSG_ZeDPY0W2KZYcsFNHY8QY4,15749
57
+ job_shop_lib/reinforcement_learning/_resource_task_graph_observation.py,sha256=4H53fKMgxPWqFVF5WczomEcrFdq7abBgHnOYJ1m6D1c,12768
56
58
  job_shop_lib/reinforcement_learning/_reward_observers.py,sha256=iWHccnujeAKyTQn2ilQ4BhcEccoSTyJqQ5yOiP5GG_Y,2984
57
- job_shop_lib/reinforcement_learning/_single_job_shop_graph_env.py,sha256=3mljeI4k9haLDuDZZhv4NcLpb1_xOlQNdEqMoRsh6bw,16592
58
- job_shop_lib/reinforcement_learning/_types_and_constants.py,sha256=xozdM_Wabdbe9e1a769p5980OSNBwQqc9yyaSGW2ODQ,1743
59
- job_shop_lib/reinforcement_learning/_utils.py,sha256=giikAj9Xl2f_cYq_AKCrgHn79TRLfGhYNqXz7bEnKuk,4827
59
+ job_shop_lib/reinforcement_learning/_single_job_shop_graph_env.py,sha256=FCghBwfKZZg2VFJdV0ihzRJBTwMuivB-zhf9qM2OZq8,16803
60
+ job_shop_lib/reinforcement_learning/_types_and_constants.py,sha256=6FpuQkZLV2H8_dXmax49OTgAw7dWQcUEWVWWdMLR7bs,1752
61
+ job_shop_lib/reinforcement_learning/_utils.py,sha256=0jM7qPCxYbURKAQlCLt4Ah1OrmdGUUhxhOsszTdt2Zk,6049
60
62
  job_shop_lib/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- job_shop_lib/visualization/gantt/__init__.py,sha256=HGXwRgDuMAldqU0JBdiZCd5e79XBz1r96qHeDVlzE54,1145
63
+ job_shop_lib/visualization/gantt/__init__.py,sha256=xMvuNph6bfwulHYqqklCj_6SUQgRzvC92Yul75F3Zlg,1250
62
64
  job_shop_lib/visualization/gantt/_gantt_chart_creator.py,sha256=LTsVhpB1Fb_2o08HRZPPXSekwzR7fyTSC6h549XMqhU,8638
63
- job_shop_lib/visualization/gantt/_gantt_chart_video_and_gif_creation.py,sha256=CcHcvafYrTy7UaScM_wp9QlLOgKiTIKV7tFkttMgoLU,14474
65
+ job_shop_lib/visualization/gantt/_gantt_chart_video_and_gif_creation.py,sha256=KeMiTBOtJKchnKGD4av8_3x3S5h437pRymc2q2knbNc,14617
64
66
  job_shop_lib/visualization/gantt/_plot_gantt_chart.py,sha256=9-NSSNsVcW8gYLZtAuFeYURqi8cHNkVYufosKtbKFOI,6881
65
- job_shop_lib/visualization/graphs/__init__.py,sha256=282hZFg07EyQu4HVt4GzFfYnY6ZF376IMjnWZ5eg0ZQ,611
66
- job_shop_lib/visualization/graphs/_plot_disjunctive_graph.py,sha256=4VBMYiFXXkCGSnGYN9iqNtWrbLJQxAMHojPHhAbdA0s,14387
67
+ job_shop_lib/visualization/graphs/__init__.py,sha256=HUWzfgQLeklNROtjnxeJX_FIySo_baTXO6klx0zUVpQ,630
68
+ job_shop_lib/visualization/graphs/_plot_disjunctive_graph.py,sha256=wF2zaPsvg1TszP_2n3ialTTUS7IkCqu9y79kU0bGbpw,15982
67
69
  job_shop_lib/visualization/graphs/_plot_resource_task_graph.py,sha256=RgJqHS5hJh3KkyaLbtpG_bER981BFRwGpflz7I7gS64,13271
68
- job_shop_lib-1.0.0b5.dist-info/LICENSE,sha256=9mggivMGd5taAu3xbmBway-VQZMBzurBGHofFopvUsQ,1069
69
- job_shop_lib-1.0.0b5.dist-info/METADATA,sha256=NxGDA_C8w6GQlV1zcrkIawyHekRWR8VTvNwQR9s7Ci4,16424
70
- job_shop_lib-1.0.0b5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
71
- job_shop_lib-1.0.0b5.dist-info/RECORD,,
70
+ job_shop_lib-1.0.2.dist-info/LICENSE,sha256=9mggivMGd5taAu3xbmBway-VQZMBzurBGHofFopvUsQ,1069
71
+ job_shop_lib-1.0.2.dist-info/METADATA,sha256=1IZLaW0dvbF7bYPK5TKCknijd6Dwf5HicuyPky1TpyI,16460
72
+ job_shop_lib-1.0.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
73
+ job_shop_lib-1.0.2.dist-info/RECORD,,