supplynetpy 0.2.0__tar.gz → 0.2.2__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 (89) hide show
  1. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/CHANGELOG.md +235 -181
  2. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/PKG-INFO +1 -1
  3. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/pyproject.toml +13 -1
  4. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/src/SupplyNetPy/Components/core.py +377 -213
  5. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/src/SupplyNetPy/Components/logger.py +14 -2
  6. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/src/SupplyNetPy/Components/utilities.py +882 -842
  7. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/tests/test_core.py +308 -6
  8. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/tests/test_utilities.py +48 -2
  9. supplynetpy-0.2.0/.github/workflows/ci.yml +0 -32
  10. supplynetpy-0.2.0/.github/workflows/deploy-docs.yml +0 -30
  11. supplynetpy-0.2.0/CLAUDE.md +0 -153
  12. supplynetpy-0.2.0/REVIEW.md +0 -1152
  13. supplynetpy-0.2.0/docs/EOQ_est.md +0 -273
  14. supplynetpy-0.2.0/docs/about.md +0 -85
  15. supplynetpy-0.2.0/docs/api-reference/api-intro.md +0 -80
  16. supplynetpy-0.2.0/docs/api-reference/api-ref-core.md +0 -9
  17. supplynetpy-0.2.0/docs/api-reference/api-ref-logger.md +0 -7
  18. supplynetpy-0.2.0/docs/api-reference/api-ref-utilities.md +0 -16
  19. supplynetpy-0.2.0/docs/case-studies/milk-india/profit_surface_alpha_beta_nbackup_2.html +0 -7
  20. supplynetpy-0.2.0/docs/case-studies/milk-india/profit_surface_beta_alpha_pfail_005.html +0 -7
  21. supplynetpy-0.2.0/docs/case-studies/milk-india/retailer_profit_heatmap.html +0 -207012
  22. supplynetpy-0.2.0/docs/case-studies/milk-india/supply_chain_map.html +0 -100745
  23. supplynetpy-0.2.0/docs/case-studies/milk-supply-chain-india.md +0 -95
  24. supplynetpy-0.2.0/docs/case_study_pharma.md +0 -333
  25. supplynetpy-0.2.0/docs/changelog.md +0 -6
  26. supplynetpy-0.2.0/docs/css/extra.css +0 -20
  27. supplynetpy-0.2.0/docs/example-complex.md +0 -59
  28. supplynetpy-0.2.0/docs/example-newvendor.md +0 -109
  29. supplynetpy-0.2.0/docs/example.md +0 -80
  30. supplynetpy-0.2.0/docs/glossary.md +0 -133
  31. supplynetpy-0.2.0/docs/google054ce296ecdefa6a.html +0 -1
  32. supplynetpy-0.2.0/docs/img/EOQ_est_files/EOQ_est_1_1.png +0 -0
  33. supplynetpy-0.2.0/docs/img/EOQ_est_files/EOQ_est_1_2.png +0 -0
  34. supplynetpy-0.2.0/docs/img/EOQ_est_files/EOQ_est_lot_size.png +0 -0
  35. supplynetpy-0.2.0/docs/img/EOQ_est_files/EOQ_est_sc_net.png +0 -0
  36. supplynetpy-0.2.0/docs/img/bread_sc.png +0 -0
  37. supplynetpy-0.2.0/docs/img/case_study_pharma_files/case_study_pharma_4_0.png +0 -0
  38. supplynetpy-0.2.0/docs/img/case_study_pharma_files/case_study_pharma_5_1.png +0 -0
  39. supplynetpy-0.2.0/docs/img/case_study_pharma_files/case_study_pharma_6_0.png +0 -0
  40. supplynetpy-0.2.0/docs/img/case_study_pharma_files/case_study_pharma_fin.png +0 -0
  41. supplynetpy-0.2.0/docs/img/case_study_pharma_files/case_study_pharma_flow.png +0 -0
  42. supplynetpy-0.2.0/docs/img/case_study_pharma_files/case_study_pharma_sc.png +0 -0
  43. supplynetpy-0.2.0/docs/img/github.png +0 -0
  44. supplynetpy-0.2.0/docs/img/img_newsvendor_Q.png +0 -0
  45. supplynetpy-0.2.0/docs/img/img_six_node_sc.png +0 -0
  46. supplynetpy-0.2.0/docs/img/img_two_node_sc.png +0 -0
  47. supplynetpy-0.2.0/docs/img/newsvendor.png +0 -0
  48. supplynetpy-0.2.0/docs/img/profile-user.png +0 -0
  49. supplynetpy-0.2.0/docs/img/safety_inv_est_files/safety_inv_est_2_1.png +0 -0
  50. supplynetpy-0.2.0/docs/img/safety_inv_est_files/safety_inv_est_6_1.png +0 -0
  51. supplynetpy-0.2.0/docs/img/safety_inv_est_files/safety_inv_est_6_2.png +0 -0
  52. supplynetpy-0.2.0/docs/img/safety_inv_est_files/safety_inv_est_6_3.png +0 -0
  53. supplynetpy-0.2.0/docs/img/safety_inv_est_files/safety_inv_est_profile.png +0 -0
  54. supplynetpy-0.2.0/docs/img/safety_inv_est_files/safety_inv_est_sc.png +0 -0
  55. supplynetpy-0.2.0/docs/index.md +0 -14
  56. supplynetpy-0.2.0/docs/known-issues.md +0 -21
  57. supplynetpy-0.2.0/docs/license.md +0 -23
  58. supplynetpy-0.2.0/docs/requirements.txt +0 -7
  59. supplynetpy-0.2.0/docs/safety_inv_est.md +0 -280
  60. supplynetpy-0.2.0/docs/ten_min.md +0 -167
  61. supplynetpy-0.2.0/examples/notebooks/EOQ_est.ipynb +0 -315
  62. supplynetpy-0.2.0/examples/notebooks/case_study_pharma.ipynb +0 -507
  63. supplynetpy-0.2.0/examples/notebooks/data/benchmark_performance.py +0 -175
  64. supplynetpy-0.2.0/examples/notebooks/data/perform_n_raw.csv +0 -271
  65. supplynetpy-0.2.0/examples/notebooks/data/perform_n_summary.csv +0 -10
  66. supplynetpy-0.2.0/examples/notebooks/data/perform_sim_l_raw.csv +0 -301
  67. supplynetpy-0.2.0/examples/notebooks/data/perform_sim_l_summary.csv +0 -11
  68. supplynetpy-0.2.0/examples/notebooks/different_replenish_policies_anylogistix.ipynb +0 -539
  69. supplynetpy-0.2.0/examples/notebooks/newsvendor.ipynb +0 -257
  70. supplynetpy-0.2.0/examples/notebooks/performance_ana.ipynb +0 -660
  71. supplynetpy-0.2.0/examples/notebooks/safety_inv_est.ipynb +0 -382
  72. supplynetpy-0.2.0/examples/notebooks/simple_supplier_n_factory.ipynb +0 -151
  73. supplynetpy-0.2.0/examples/py/hybrid_big_sc.py +0 -232
  74. supplynetpy-0.2.0/examples/py/intro_simple.py +0 -186
  75. supplynetpy-0.2.0/examples/py/newsvendor.py +0 -69
  76. supplynetpy-0.2.0/examples/py/sc_with_factory.py +0 -207
  77. supplynetpy-0.2.0/mkdocs.yml +0 -73
  78. supplynetpy-0.2.0/overrides/breadcrumbs.html +0 -36
  79. supplynetpy-0.2.0/requirements.txt +0 -4
  80. supplynetpy-0.2.0/validation/README.md +0 -166
  81. supplynetpy-0.2.0/validation/RESULT_summary.md +0 -61
  82. supplynetpy-0.2.0/validation/validation_snp_anylogistix_cmp.csv +0 -43
  83. supplynetpy-0.2.0/validation/validation_snp_anylogistix_cmp.ods +0 -0
  84. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/.gitignore +0 -0
  85. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/LICENSE +0 -0
  86. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/README.md +0 -0
  87. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/src/SupplyNetPy/Components/__init__.py +0 -0
  88. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/src/SupplyNetPy/__init__.py +0 -0
  89. {supplynetpy-0.2.0 → supplynetpy-0.2.2}/tests/conftest.py +0 -0
@@ -1,181 +1,235 @@
1
- # Release history
2
-
3
- Changes to SupplyNetPy, newest first. The library was first published on PyPI
4
- on 2025-08-21 (version 0.1.0).
5
-
6
- Each entry is tagged: **[NEW]** a new feature, **[FIX]** a bug fix,
7
- **[CHANGE]** a change in behavior, **[BREAKING]** a change that may need
8
- action from you, and **[DOCS]** documentation only.
9
-
10
- ## 0.2.0 (2026-10-11)
11
-
12
- Most of these fixes come from
13
- [issue #1](https://github.com/SupplyChainSimulation/SupplyNetPy/issues/1), reported by
14
- [@ashwingaikwadiby](https://github.com/ashwingaikwadiby). Results
15
- change for networks with manufacturers, raw-material suppliers with finite
16
- inventory, perishable goods, customers who wait, or replenishment orders that
17
- have to wait at a supplier. Simple networks, such as the quickstart example,
18
- give the same results as before.
19
-
20
- * **[FIX]** A replenishment order that has to wait at its supplier is now a
21
- backorder there only while it waits, and is no longer counted twice in the
22
- supplier's inventory position. Before, the supplier ordered too much, kept
23
- the extra units for the rest of the run, and its backorders were never
24
- cleared.
25
- * **[FIX]** A manufacturer now keeps making production batches until every
26
- planned unit is made, orders raw material for every planned unit, and carries
27
- on when units leave its full inventory. Before, it could stop producing for
28
- good, with raw material left unused or with orders waiting forever.
29
- * **[FIX]** A raw-material supplier with finite inventory starts mining again as
30
- soon as its inventory drops. Before, once its inventory had been full it never
31
- mined again, and manufacturers buying from it waited forever.
32
- * **[FIX]** Perishable goods. An order now gets the batches that are really in
33
- inventory when it is filled, oldest first. Expired units are thrown away at
34
- once and are no longer shipped to an order that was waiting, and destroyed
35
- units are removed at once too. Before, an order that had to wait could lose
36
- units, and expired units could be shipped.
37
- * **[FIX]** Customers who wait (`tolerance` above 0) now leave as soon as their
38
- tolerance runs out, and their backorders are cleared when they leave. All
39
- waiting customers are woken when units arrive, two waiting customers can no
40
- longer take the same units, and a partial delivery of 0 units no longer
41
- crashes.
42
- * **[FIX]** A waiting customer's shortage is recorded once, when the order
43
- arrives. Before, it was recorded again at every check, so shortage figures
44
- were too high.
45
- * **[FIX]** A supplier whose site is disrupted is no longer counted as short for
46
- orders it never receives.
47
- * **[FIX]** `Inventory.destroy()` now wakes a raw-material supplier (to mine
48
- again) and a manufacturer (to make more). It still does not wake a
49
- replenishment policy.
50
- * **[NEW]** `Inventory.get()` takes a `site_order` argument, and
51
- `Inventory.waiting_orders()` and `Inventory.waiting_site_orders()` report the
52
- units asked for by orders still waiting at an inventory.
53
- * **[DOCS]** The (R, Q) policy (`RQReplenishment`) never used `safety_stock`, so
54
- passing it had no effect. The documentation no longer says that it does.
55
- * **[DOCS]** A new Glossary page defines one word for each idea, and the
56
- documentation, docstrings and code comments now use those words. The API
57
- reference now lists every result of `simulate_sc_net`, and no longer shows
58
- raw markup from the docstrings.
59
- * **[DOCS]** Several documentation pages described their examples wrongly, and
60
- are corrected. The complex network example now has the links shown in its
61
- picture, lead times that differ as intended, and a fixed seed.
62
-
63
- ## 0.1.12 (2026-05-31)
64
-
65
- - **[FIX]** Replenishment orders that were bigger than the free space on the
66
- shelf no longer throw away the extra units. Previously, a node with waiting
67
- customers could order enough to refill the shelf and also cover them, and any
68
- units that did not fit were silently lost even though they had been paid for.
69
- In some cases this also pushed the node's inventory position below zero.
70
- - **[CHANGE]** When arriving units are dropped because the shelf is full, a
71
- warning is now logged suggesting that the node's capacity may be too small.
72
- - **[CHANGE]** A customer order that is bigger than the node's whole shelf,
73
- with no partial delivery accepted, is now recorded as lost demand right away.
74
- Before, it triggered a replenishment order that could never be served.
75
- - **[DOCS]** Code comments and docstrings were rewritten in plainer language.
76
-
77
- ## 0.1.11 (2026-05-09)
78
-
79
- - **[FIX]** Random node and link disruptions set with `failure_p` no longer
80
- happen almost immediately at time 0. The failure chance is now applied once
81
- per time unit, as documented.
82
-
83
- ## 0.1.10 (2026-05-06)
84
-
85
- - **[NEW]** `Inventory.destroy()` removes stock (all of it, a fraction, or a
86
- custom amount) when a node is disrupted. Nodes accept a matching
87
- `disruption_impact` option. Destroyed units and their value appear in the
88
- node's statistics and count towards its cost.
89
- - **[FIX]** Expiry of perishable stock (`Inventory.remove_expired`) now works
90
- correctly.
91
- - **[DOCS]** Documentation wording was simplified throughout.
92
-
93
- ## 0.1.9 (2026-04-28)
94
-
95
- - **[NEW]** `Network` wrapper around the supply-chain dictionary, with named
96
- access to nodes and results. The dictionary-based way of working still works.
97
- - **[NEW]** `NodeType`, a list of the valid node types. Node types can be given
98
- either as text (`"retailer"`) or as a `NodeType` member.
99
- - **[NEW]** `log_window=(start, stop)` option on `simulate_sc_net` to log only
100
- part of a run.
101
- - **[BREAKING]** Python 3.9 or newer is now required. `networkx` and
102
- `matplotlib` are now declared as dependencies.
103
- - **[CHANGE]** Logging is now opt-in. Creating nodes no longer opens (or
104
- overwrites) the trace file. `simulate_sc_net(logging=True)` turns it on for
105
- you.
106
- - **[CHANGE]** The shortage statistic is now called `shortage`. The old name,
107
- `orders_shortage`, still works as an alias.
108
- - **[CHANGE]** Expiry of perishable stock is now driven by the batches' expiry
109
- times instead of repeated checks, which makes large simulations faster.
110
- - **[CHANGE]** The remaining items from the code review (see `REVIEW.md`) were
111
- resolved, and the test suite was expanded.
112
-
113
- ## 0.1.8 (2026-04-24)
114
-
115
- - **[NEW]** `set_seed()` makes random disruptions repeatable.
116
- - **[BREAKING]** `SupplyNetPy.Components` now exposes a fixed, documented list
117
- of names. Modules that used to be reachable by accident (such as
118
- `scm.simpy`) are no longer available through it.
119
- - **[FIX]** A full code review fixed a set of correctness problems, including:
120
- - Expired perishable stock was not always removed correctly, so holding
121
- cost could keep being charged on stock that no longer existed.
122
- - A manufacturer could place duplicate orders for the same raw materials.
123
- - A customer's "demand fulfilled" figure was inflated when an order arrived
124
- in several partial shipments.
125
- - Cost totals could pick up unrelated values whose names happened to
126
- contain the word "cost".
127
- - Disrupted links were still used for new shipments, and
128
- supplier-selection policies did not take link status into account.
129
- - Adding stock to a full shelf could leave the inventory records out of
130
- step.
131
- - **[CHANGE]** Misspelled node parameters (for example `shelf_live`) are now
132
- reported as an error instead of being silently ignored.
133
- - **[CHANGE]** A much larger test suite was added.
134
-
135
- ## 0.1.7 (2026-03-13)
136
-
137
- - **[NEW]** `record_inv_levels` option on `Inventory` to switch recording of
138
- inventory levels over time on or off (off by default).
139
- - **[FIX]** Adding stock to an inventory that is already full is now handled
140
- safely.
141
-
142
- ## 0.1.6 (2025-11-19)
143
-
144
- - **[FIX]** When adding stock would go over capacity, only the amount that fits
145
- is now added, instead of failing.
146
-
147
- ## 0.1.5 (2025-11-08)
148
-
149
- - **[NEW]** `name` is now included in node statistics.
150
- - **[CHANGE]** The minimum required Python version was relaxed.
151
-
152
- ## 0.1.2 to 0.1.4 (2025-09-15)
153
-
154
- - **[FIX]** The wheel build target was added so the package builds correctly.
155
- - **[CHANGE]** Package metadata (classifiers and author details) was corrected.
156
-
157
- ## 0.1.1 (2025-09-02)
158
-
159
- - **[CHANGE]** Parameters that expect a "callable" (lead times, arrival
160
- intervals, and so on) now also accept a plain number such as `2` or `1.5`.
161
-
162
- ## 0.1.0 (2025-08-21)
163
-
164
- First public release on PyPI. It included:
165
-
166
- - Supply-chain building blocks: suppliers, manufacturers, inventory nodes
167
- (distributors and retailers), demand nodes, and links.
168
- - Replenishment policies: (s, S), (R, Q), and periodic review (with or without
169
- safety stock).
170
- - Supplier-selection policies: first, available, cheapest, and fastest.
171
- - Perishable inventory, disruptions of nodes and links, and backorders with
172
- partial fulfilment.
173
- - Node-level and network-level results (cost, revenue, profit, shortage), plus
174
- `create_sc_net` and `simulate_sc_net`.
175
- - A documentation site, worked examples, and a unit-test suite.
176
-
177
- ## Before the first release
178
-
179
- Development began in May 2024; the repository was moved from its earlier home
180
- in July 2024. Internal versions 0.0.11 to 0.0.69 were used during development
181
- and were never published on PyPI.
1
+ # Release history
2
+
3
+ Changes to SupplyNetPy, newest first. The library was first published on PyPI
4
+ on 2025-08-21 (version 0.1.0).
5
+
6
+ Each entry is tagged: **[NEW]** a new feature, **[FIX]** a bug fix,
7
+ **[CHANGE]** a change in behavior, **[BREAKING]** a change that may need
8
+ action from you, and **[DOCS]** documentation only.
9
+
10
+ ## 0.2.2 (2026-10-13)
11
+
12
+ Simulation results are the same as in 0.2.1. This release adds warnings for
13
+ mistakes in how a model is set up, and makes the source package smaller.
14
+
15
+ * **[NEW]** A replenishment policy now warns about keys in `policy_param`
16
+ that it does not use, and asks whether another policy was meant. For
17
+ example, `'T'` is read only by the periodic policy, so passing it to the
18
+ (s, S) policy now gives a warning instead of being silently ignored.
19
+ * **[CHANGE]** Problems in how a model is set up are now shown with Python's
20
+ warnings, so they appear even when logging is off. They are still written to
21
+ the trace log. This covers the unused policy parameters above, a manufacturer
22
+ without a supplier for every raw material, an unknown statistic name passed
23
+ to `update_stats`, and these `simulate_sc_net` calls: a `sim_time` that is not
24
+ later than the current time, `logging=(start, stop)` (deprecated, now a
25
+ `FutureWarning`), and `logging=(start, stop)` together with `log_window`.
26
+ Events during a run, such as a delivery that does not fit in the inventory,
27
+ are still only logged.
28
+ * **[CHANGE]** The source archive on PyPI now carries only the library, its
29
+ tests, README, LICENSE and CHANGELOG, so it is about 115 KB instead of over
30
+ 4 MB. The docs and examples stay in the repository. The wheel is unchanged.
31
+ * **[DOCS]** The docs now say that a run stops just before its end time, so
32
+ events due at exactly `sim_time` do not happen. This is how SimPy works. To
33
+ include them, run to a slightly later time, such as `sim_time + 1`.
34
+
35
+ ## 0.2.1 (2026-10-12)
36
+
37
+ Results change for networks with disruptions. Networks without disruptions,
38
+ such as the quickstart example, give the same results as before.
39
+
40
+ * **[FIX]** A site whose replenishment order was blocked by a disruption now
41
+ orders as soon as its supplier, or the link to it, recovers. Before, a
42
+ replenishment policy without a review period could stop ordering for good. If
43
+ the site had no units left, nothing woke the policy again, even after the
44
+ supplier recovered.
45
+ * **[FIX]** Supplier-selection policies now skip a supplier whose site is
46
+ disrupted, not only one whose link is disrupted. Before, a site with two
47
+ suppliers could send its order to the disrupted one and lose it, while the
48
+ other supplier was working.
49
+ * **[CHANGE]** `place_order` now checks that some supplier can take the order
50
+ before choosing one. If none can, no order is placed. New methods
51
+ `Link.can_take_order`, `Node.can_place_order`, `Node.wake_replenishment` and
52
+ `Node.add_buyer_link`, and a new list `Node.buyers` of the links to a node's
53
+ buyers.
54
+ * **[FIX]** The performance table (`get_node_wise_performance`,
55
+ `format_node_wise_performance`, `print_node_wise_performance`) now shows
56
+ every metric that any node has. Before, it showed only the metrics of the
57
+ first node in the list, so a raw-material supplier's mining figures were left
58
+ out when another node came first. Two nodes with the same name now each get
59
+ a column; the second is told apart by its ID.
60
+ * **[FIX]** `disable_logging` and `set_log_file` now close the log file they
61
+ stop writing to. Before, the file stayed open until the program ended, which
62
+ caused a `ResourceWarning` and, on Windows, kept the file locked.
63
+
64
+ ## 0.2.0 (2026-10-11)
65
+
66
+ Most of these fixes come from
67
+ [issue #1](https://github.com/SupplyChainSimulation/SupplyNetPy/issues/1), reported by
68
+ [@ashwingaikwadiby](https://github.com/ashwingaikwadiby). Results
69
+ change for networks with manufacturers, raw-material suppliers with finite
70
+ inventory, perishable goods, customers who wait, or replenishment orders that
71
+ have to wait at a supplier. Simple networks, such as the quickstart example,
72
+ give the same results as before.
73
+
74
+ * **[FIX]** A replenishment order that has to wait at its supplier is now a
75
+ backorder there only while it waits, and is no longer counted twice in the
76
+ supplier's inventory position. Before, the supplier ordered too much, kept
77
+ the extra units for the rest of the run, and its backorders were never
78
+ cleared.
79
+ * **[FIX]** A manufacturer now keeps making production batches until every
80
+ planned unit is made, orders raw material for every planned unit, and carries
81
+ on when units leave its full inventory. Before, it could stop producing for
82
+ good, with raw material left unused or with orders waiting forever.
83
+ * **[FIX]** A raw-material supplier with finite inventory starts mining again as
84
+ soon as its inventory drops. Before, once its inventory had been full it never
85
+ mined again, and manufacturers buying from it waited forever.
86
+ * **[FIX]** Perishable goods. An order now gets the batches that are really in
87
+ inventory when it is filled, oldest first. Expired units are thrown away at
88
+ once and are no longer shipped to an order that was waiting, and destroyed
89
+ units are removed at once too. Before, an order that had to wait could lose
90
+ units, and expired units could be shipped.
91
+ * **[FIX]** Customers who wait (`tolerance` above 0) now leave as soon as their
92
+ tolerance runs out, and their backorders are cleared when they leave. All
93
+ waiting customers are woken when units arrive, two waiting customers can no
94
+ longer take the same units, and a partial delivery of 0 units no longer
95
+ crashes.
96
+ * **[FIX]** A waiting customer's shortage is recorded once, when the order
97
+ arrives. Before, it was recorded again at every check, so shortage figures
98
+ were too high.
99
+ * **[FIX]** A supplier whose site is disrupted is no longer counted as short for
100
+ orders it never receives.
101
+ * **[FIX]** `Inventory.destroy()` now wakes a raw-material supplier (to mine
102
+ again) and a manufacturer (to make more). It still does not wake a
103
+ replenishment policy.
104
+ * **[NEW]** `Inventory.get()` takes a `site_order` argument, and
105
+ `Inventory.waiting_orders()` and `Inventory.waiting_site_orders()` report the
106
+ units asked for by orders still waiting at an inventory.
107
+ * **[DOCS]** The (R, Q) policy (`RQReplenishment`) never used `safety_stock`, so
108
+ passing it had no effect. The documentation no longer says that it does.
109
+ * **[DOCS]** A new Glossary page defines one word for each idea, and the
110
+ documentation, docstrings and code comments now use those words. The API
111
+ reference now lists every result of `simulate_sc_net`, and no longer shows
112
+ raw markup from the docstrings.
113
+ * **[DOCS]** Several documentation pages described their examples wrongly, and
114
+ are corrected. The complex network example now has the links shown in its
115
+ picture, lead times that differ as intended, and a fixed seed.
116
+
117
+ ## 0.1.12 (2026-05-31)
118
+
119
+ - **[FIX]** Replenishment orders that were bigger than the free space on the
120
+ shelf no longer throw away the extra units. Previously, a node with waiting
121
+ customers could order enough to refill the shelf and also cover them, and any
122
+ units that did not fit were silently lost even though they had been paid for.
123
+ In some cases this also pushed the node's inventory position below zero.
124
+ - **[CHANGE]** When arriving units are dropped because the shelf is full, a
125
+ warning is now logged suggesting that the node's capacity may be too small.
126
+ - **[CHANGE]** A customer order that is bigger than the node's whole shelf,
127
+ with no partial delivery accepted, is now recorded as lost demand right away.
128
+ Before, it triggered a replenishment order that could never be served.
129
+ - **[DOCS]** Code comments and docstrings were rewritten in plainer language.
130
+
131
+ ## 0.1.11 (2026-05-09)
132
+
133
+ - **[FIX]** Random node and link disruptions set with `failure_p` no longer
134
+ happen almost immediately at time 0. The failure chance is now applied once
135
+ per time unit, as documented.
136
+
137
+ ## 0.1.10 (2026-05-06)
138
+
139
+ - **[NEW]** `Inventory.destroy()` removes stock (all of it, a fraction, or a
140
+ custom amount) when a node is disrupted. Nodes accept a matching
141
+ `disruption_impact` option. Destroyed units and their value appear in the
142
+ node's statistics and count towards its cost.
143
+ - **[FIX]** Expiry of perishable stock (`Inventory.remove_expired`) now works
144
+ correctly.
145
+ - **[DOCS]** Documentation wording was simplified throughout.
146
+
147
+ ## 0.1.9 (2026-04-28)
148
+
149
+ - **[NEW]** `Network` wrapper around the supply-chain dictionary, with named
150
+ access to nodes and results. The dictionary-based way of working still works.
151
+ - **[NEW]** `NodeType`, a list of the valid node types. Node types can be given
152
+ either as text (`"retailer"`) or as a `NodeType` member.
153
+ - **[NEW]** `log_window=(start, stop)` option on `simulate_sc_net` to log only
154
+ part of a run.
155
+ - **[BREAKING]** Python 3.9 or newer is now required. `networkx` and
156
+ `matplotlib` are now declared as dependencies.
157
+ - **[CHANGE]** Logging is now opt-in. Creating nodes no longer opens (or
158
+ overwrites) the trace file. `simulate_sc_net(logging=True)` turns it on for
159
+ you.
160
+ - **[CHANGE]** The shortage statistic is now called `shortage`. The old name,
161
+ `orders_shortage`, still works as an alias.
162
+ - **[CHANGE]** Expiry of perishable stock is now driven by the batches' expiry
163
+ times instead of repeated checks, which makes large simulations faster.
164
+ - **[CHANGE]** The remaining items from the code review (see `REVIEW.md`) were
165
+ resolved, and the test suite was expanded.
166
+
167
+ ## 0.1.8 (2026-04-24)
168
+
169
+ - **[NEW]** `set_seed()` makes random disruptions repeatable.
170
+ - **[BREAKING]** `SupplyNetPy.Components` now exposes a fixed, documented list
171
+ of names. Modules that used to be reachable by accident (such as
172
+ `scm.simpy`) are no longer available through it.
173
+ - **[FIX]** A full code review fixed a set of correctness problems, including:
174
+ - Expired perishable stock was not always removed correctly, so holding
175
+ cost could keep being charged on stock that no longer existed.
176
+ - A manufacturer could place duplicate orders for the same raw materials.
177
+ - A customer's "demand fulfilled" figure was inflated when an order arrived
178
+ in several partial shipments.
179
+ - Cost totals could pick up unrelated values whose names happened to
180
+ contain the word "cost".
181
+ - Disrupted links were still used for new shipments, and
182
+ supplier-selection policies did not take link status into account.
183
+ - Adding stock to a full shelf could leave the inventory records out of
184
+ step.
185
+ - **[CHANGE]** Misspelled node parameters (for example `shelf_live`) are now
186
+ reported as an error instead of being silently ignored.
187
+ - **[CHANGE]** A much larger test suite was added.
188
+
189
+ ## 0.1.7 (2026-03-13)
190
+
191
+ - **[NEW]** `record_inv_levels` option on `Inventory` to switch recording of
192
+ inventory levels over time on or off (off by default).
193
+ - **[FIX]** Adding stock to an inventory that is already full is now handled
194
+ safely.
195
+
196
+ ## 0.1.6 (2025-11-19)
197
+
198
+ - **[FIX]** When adding stock would go over capacity, only the amount that fits
199
+ is now added, instead of failing.
200
+
201
+ ## 0.1.5 (2025-11-08)
202
+
203
+ - **[NEW]** `name` is now included in node statistics.
204
+ - **[CHANGE]** The minimum required Python version was relaxed.
205
+
206
+ ## 0.1.2 to 0.1.4 (2025-09-15)
207
+
208
+ - **[FIX]** The wheel build target was added so the package builds correctly.
209
+ - **[CHANGE]** Package metadata (classifiers and author details) was corrected.
210
+
211
+ ## 0.1.1 (2025-09-02)
212
+
213
+ - **[CHANGE]** Parameters that expect a "callable" (lead times, arrival
214
+ intervals, and so on) now also accept a plain number such as `2` or `1.5`.
215
+
216
+ ## 0.1.0 (2025-08-21)
217
+
218
+ First public release on PyPI. It included:
219
+
220
+ - Supply-chain building blocks: suppliers, manufacturers, inventory nodes
221
+ (distributors and retailers), demand nodes, and links.
222
+ - Replenishment policies: (s, S), (R, Q), and periodic review (with or without
223
+ safety stock).
224
+ - Supplier-selection policies: first, available, cheapest, and fastest.
225
+ - Perishable inventory, disruptions of nodes and links, and backorders with
226
+ partial fulfilment.
227
+ - Node-level and network-level results (cost, revenue, profit, shortage), plus
228
+ `create_sc_net` and `simulate_sc_net`.
229
+ - A documentation site, worked examples, and a unit-test suite.
230
+
231
+ ## Before the first release
232
+
233
+ Development began in May 2024; the repository was moved from its earlier home
234
+ in July 2024. Internal versions 0.0.11 to 0.0.69 were used during development
235
+ and were never published on PyPI.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: supplynetpy
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Python Library for Modeling and Discrete Event Simulation of Supply Chains
5
5
  Project-URL: Homepage, https://supplychainsimulation.github.io/SupplyNetPy/
6
6
  Author-email: Tushar Lone <tusharlone28@gmail.com>, Neha Karanjkar <nehak@iitgoa.ac.in>, Lekshmi P <Lekshmi20231101@iitgoa.ac.in>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "supplynetpy"
7
- version = "0.2.0"
7
+ version = "0.2.2"
8
8
  dependencies = [
9
9
  "simpy",
10
10
  "networkx",
@@ -42,5 +42,17 @@ classifiers = [
42
42
  [tool.hatch.build.targets.wheel]
43
43
  packages = ["src/SupplyNetPy"]
44
44
 
45
+ # The source archive carries the library, its tests and the top-level files.
46
+ # The docs, examples, case-study data and validation files stay in the
47
+ # repository only; they are large and are not needed to build or test the package.
48
+ [tool.hatch.build.targets.sdist]
49
+ include = [
50
+ "/src/SupplyNetPy",
51
+ "/tests",
52
+ "/README.md",
53
+ "/LICENSE",
54
+ "/CHANGELOG.md",
55
+ ]
56
+
45
57
  [project.urls]
46
58
  Homepage = "https://supplychainsimulation.github.io/SupplyNetPy/"