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.
- job_shop_lib/__init__.py +1 -1
- job_shop_lib/_job_shop_instance.py +2 -2
- job_shop_lib/_operation.py +9 -3
- job_shop_lib/_scheduled_operation.py +3 -0
- job_shop_lib/benchmarking/__init__.py +1 -0
- job_shop_lib/dispatching/__init__.py +12 -10
- job_shop_lib/dispatching/_dispatcher.py +6 -13
- job_shop_lib/dispatching/_factories.py +3 -3
- job_shop_lib/dispatching/_optimal_operations_observer.py +0 -2
- job_shop_lib/dispatching/_ready_operation_filters.py +4 -4
- job_shop_lib/dispatching/feature_observers/_composite_feature_observer.py +11 -6
- job_shop_lib/dispatching/feature_observers/_factory.py +8 -3
- job_shop_lib/dispatching/feature_observers/_feature_observer.py +1 -1
- job_shop_lib/dispatching/feature_observers/_is_completed_observer.py +35 -67
- job_shop_lib/dispatching/rules/__init__.py +11 -8
- job_shop_lib/dispatching/rules/_dispatching_rule_factory.py +1 -1
- job_shop_lib/dispatching/rules/_machine_chooser_factory.py +3 -2
- job_shop_lib/generation/__init__.py +12 -1
- job_shop_lib/graphs/__init__.py +42 -8
- job_shop_lib/graphs/_build_resource_task_graphs.py +1 -1
- job_shop_lib/graphs/_job_shop_graph.py +38 -19
- job_shop_lib/graphs/graph_updaters/__init__.py +5 -1
- job_shop_lib/graphs/graph_updaters/_disjunctive_graph_updater.py +108 -0
- job_shop_lib/graphs/graph_updaters/_residual_graph_updater.py +3 -1
- job_shop_lib/graphs/graph_updaters/_utils.py +2 -2
- job_shop_lib/py.typed +0 -0
- job_shop_lib/reinforcement_learning/__init__.py +13 -7
- job_shop_lib/reinforcement_learning/_multi_job_shop_graph_env.py +1 -1
- job_shop_lib/reinforcement_learning/_resource_task_graph_observation.py +102 -24
- job_shop_lib/reinforcement_learning/_single_job_shop_graph_env.py +11 -2
- job_shop_lib/reinforcement_learning/_types_and_constants.py +11 -10
- job_shop_lib/reinforcement_learning/_utils.py +29 -0
- job_shop_lib/visualization/gantt/__init__.py +7 -3
- job_shop_lib/visualization/gantt/_gantt_chart_video_and_gif_creation.py +5 -2
- job_shop_lib/visualization/graphs/__init__.py +1 -0
- job_shop_lib/visualization/graphs/_plot_disjunctive_graph.py +53 -19
- {job_shop_lib-1.0.0b5.dist-info → job_shop_lib-1.0.2.dist-info}/METADATA +19 -18
- {job_shop_lib-1.0.0b5.dist-info → job_shop_lib-1.0.2.dist-info}/RECORD +40 -38
- {job_shop_lib-1.0.0b5.dist-info → job_shop_lib-1.0.2.dist-info}/LICENSE +0 -0
- {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:
|
@@ -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
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
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
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
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.
|
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.
|
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
|
-
|
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
|
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(
|
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
|
-
|
318
|
+
resource_task_graph = build_resource_task_graph(instance)
|
318
319
|
|
319
|
-
fig = plot_resource_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=
|
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=
|
4
|
-
job_shop_lib/_operation.py,sha256=
|
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=
|
7
|
-
job_shop_lib/benchmarking/__init__.py,sha256=
|
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=
|
13
|
-
job_shop_lib/dispatching/_dispatcher.py,sha256=
|
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=
|
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=
|
18
|
-
job_shop_lib/dispatching/_ready_operation_filters.py,sha256=
|
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=
|
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=
|
25
|
-
job_shop_lib/dispatching/feature_observers/_feature_observer.py,sha256=
|
26
|
-
job_shop_lib/dispatching/feature_observers/_is_completed_observer.py,sha256=
|
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=
|
32
|
-
job_shop_lib/dispatching/rules/_dispatching_rule_factory.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
52
|
-
job_shop_lib/graphs/graph_updaters/_utils.py,sha256=
|
53
|
-
job_shop_lib/
|
54
|
-
job_shop_lib/reinforcement_learning/
|
55
|
-
job_shop_lib/reinforcement_learning/
|
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=
|
58
|
-
job_shop_lib/reinforcement_learning/_types_and_constants.py,sha256=
|
59
|
-
job_shop_lib/reinforcement_learning/_utils.py,sha256=
|
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=
|
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=
|
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=
|
66
|
-
job_shop_lib/visualization/graphs/_plot_disjunctive_graph.py,sha256=
|
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.
|
69
|
-
job_shop_lib-1.0.
|
70
|
-
job_shop_lib-1.0.
|
71
|
-
job_shop_lib-1.0.
|
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,,
|
File without changes
|
File without changes
|