walopy 0.2.5__tar.gz → 0.2.6__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 (38) hide show
  1. {walopy-0.2.5/src/walopy.egg-info → walopy-0.2.6}/PKG-INFO +183 -20
  2. {walopy-0.2.5 → walopy-0.2.6}/README.md +182 -19
  3. {walopy-0.2.5 → walopy-0.2.6}/pyproject.toml +1 -1
  4. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/__init__.py +45 -0
  5. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/inventory.py +338 -0
  6. walopy-0.2.6/src/walopy/reliability.py +298 -0
  7. walopy-0.2.6/src/walopy/scheduling.py +315 -0
  8. {walopy-0.2.5 → walopy-0.2.6/src/walopy.egg-info}/PKG-INFO +183 -20
  9. {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/SOURCES.txt +4 -1
  10. walopy-0.2.6/tests/test_v026.py +276 -0
  11. {walopy-0.2.5 → walopy-0.2.6}/LICENSE +0 -0
  12. {walopy-0.2.5 → walopy-0.2.6}/setup.cfg +0 -0
  13. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/__main__.py +0 -0
  14. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/_utils.py +0 -0
  15. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/advanced.py +0 -0
  16. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/bottleneck.py +0 -0
  17. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/fitting.py +0 -0
  18. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/kpi.py +0 -0
  19. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/network.py +0 -0
  20. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/operations.py +0 -0
  21. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/plotting.py +0 -0
  22. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/queuing.py +0 -0
  23. {walopy-0.2.5 → walopy-0.2.6}/src/walopy/solver.py +0 -0
  24. {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/dependency_links.txt +0 -0
  25. {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/requires.txt +0 -0
  26. {walopy-0.2.5 → walopy-0.2.6}/src/walopy.egg-info/top_level.txt +0 -0
  27. {walopy-0.2.5 → walopy-0.2.6}/tests/test_advanced.py +0 -0
  28. {walopy-0.2.5 → walopy-0.2.6}/tests/test_bottleneck.py +0 -0
  29. {walopy-0.2.5 → walopy-0.2.6}/tests/test_fitting.py +0 -0
  30. {walopy-0.2.5 → walopy-0.2.6}/tests/test_inventory.py +0 -0
  31. {walopy-0.2.5 → walopy-0.2.6}/tests/test_inventory_new.py +0 -0
  32. {walopy-0.2.5 → walopy-0.2.6}/tests/test_kpi.py +0 -0
  33. {walopy-0.2.5 → walopy-0.2.6}/tests/test_mg1.py +0 -0
  34. {walopy-0.2.5 → walopy-0.2.6}/tests/test_network.py +0 -0
  35. {walopy-0.2.5 → walopy-0.2.6}/tests/test_new_models.py +0 -0
  36. {walopy-0.2.5 → walopy-0.2.6}/tests/test_operations.py +0 -0
  37. {walopy-0.2.5 → walopy-0.2.6}/tests/test_queuing.py +0 -0
  38. {walopy-0.2.5 → walopy-0.2.6}/tests/test_solver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: walopy
3
- Version: 0.2.5
3
+ Version: 0.2.6
4
4
  Summary: Queuing theory, operations analysis, OEE, bottleneck analysis and KPI trees for Python
5
5
  Author-email: LeoSanta15 <angelsanta1@gmail.com>
6
6
  License-Expression: MIT
@@ -63,15 +63,17 @@ pip install walopy
63
63
  9. [Análisis de cuellos de botella](#9-análisis-de-cuellos-de-botella)
64
64
  10. [Balance de línea y tiempo takt](#10-balance-de-línea-y-tiempo-takt)
65
65
  11. [Análisis de punto de equilibrio](#11-análisis-de-punto-de-equilibrio)
66
- 12. [Árboles de KPI](#12-árboles-de-kpi)
67
- 13. [Solvers y optimización](#13-solvers-y-optimización)
68
- 14. [Análisis de sensibilidad](#14-análisis-de-sensibilidad)
69
- 15. [Escenarios en lote (batch_model)](#15-escenarios-en-lote-batch_model)
70
- 16. [Comparar múltiples resultados](#16-comparar-múltiples-resultados)
71
- 17. [Gráficas](#17-gráficas)
72
- 18. [CLI](#18-cli)
73
- 19. [Referencia de módulos](#19-referencia-de-módulos)
74
- 20. [Requisitos](#20-requisitos)
66
+ 12. [Programación de producción (scheduling)](#12-programación-de-producción-scheduling)
67
+ 13. [Confiabilidad](#13-confiabilidad--reliability)
68
+ 14. [Árboles de KPI](#14-árboles-de-kpi)
69
+ 15. [Solvers y optimización](#15-solvers-y-optimización)
70
+ 16. [Análisis de sensibilidad](#16-análisis-de-sensibilidad)
71
+ 17. [Escenarios en lote (batch_model)](#17-escenarios-en-lote-batch_model)
72
+ 18. [Comparar múltiples resultados](#18-comparar-múltiples-resultados)
73
+ 19. [Gráficas](#19-gráficas)
74
+ 20. [CLI](#20-cli)
75
+ 21. [Referencia de módulos](#21-referencia-de-módulos)
76
+ 22. [Requisitos](#22-requisitos)
75
77
 
76
78
  ---
77
79
 
@@ -1055,7 +1057,7 @@ print(r.margin_of_safety_pct) # 0.375 — porcentaje del margen de seguridad
1055
1057
 
1056
1058
  ---
1057
1059
 
1058
- ## 12. Árboles de KPI
1060
+ ## 14. Árboles de KPI
1059
1061
 
1060
1062
  Los árboles de KPI crean jerarquías interactivas visualizadas como **treemap** o **sunburst** con Plotly.
1061
1063
 
@@ -1108,7 +1110,7 @@ fig.show()
1108
1110
 
1109
1111
  ---
1110
1112
 
1111
- ## 13. Solvers y optimización
1113
+ ## 15. Solvers y optimización
1112
1114
 
1113
1115
  ### `solve_lam(metric, target, *, mu, model)` — Máxima tasa de llegada
1114
1116
 
@@ -1155,7 +1157,7 @@ r.plot() # gráfica de costo vs número de servidores
1155
1157
 
1156
1158
  ---
1157
1159
 
1158
- ## 14. Análisis de sensibilidad
1160
+ ## 16. Análisis de sensibilidad
1159
1161
 
1160
1162
  ### `sensitivity(model_fn, param, values, **fixed_kwargs)` — Barrido paramétrico
1161
1163
 
@@ -1186,7 +1188,7 @@ fig.show()
1186
1188
 
1187
1189
  ---
1188
1190
 
1189
- ## 15. Escenarios en lote (batch_model)
1191
+ ## 17. Escenarios en lote (batch_model)
1190
1192
 
1191
1193
  ### `batch_model(model_fn, df, **fixed_kwargs)` — Aplicar modelo a un DataFrame
1192
1194
 
@@ -1221,7 +1223,7 @@ print(resultado[resultado["_error"].notna()]) # filas fallidas
1221
1223
 
1222
1224
  ---
1223
1225
 
1224
- ## 16. Comparar múltiples resultados
1226
+ ## 18. Comparar múltiples resultados
1225
1227
 
1226
1228
  ### `compare(*results, labels)` — DataFrame comparativo
1227
1229
 
@@ -1246,7 +1248,7 @@ df2 = wl.compare(wl.mm1(1, 5), wl.mm1(2, 5), wl.mm1(3, 5))
1246
1248
 
1247
1249
  ---
1248
1250
 
1249
- ## 17. Gráficas
1251
+ ## 19. Gráficas
1250
1252
 
1251
1253
  Todos los resultados exponen `.plot()` que devuelve una figura de Matplotlib o Plotly. También se pueden llamar directamente desde `walopy.plotting`.
1252
1254
 
@@ -1282,7 +1284,7 @@ fig.show()
1282
1284
 
1283
1285
  ---
1284
1286
 
1285
- ## 18. CLI
1287
+ ## 20. CLI
1286
1288
 
1287
1289
  walopy incluye una interfaz de línea de comandos para uso rápido sin escribir código.
1288
1290
 
@@ -1324,14 +1326,175 @@ Wq : 0.3 (avg wait time in queue)
1324
1326
 
1325
1327
  ---
1326
1328
 
1327
- ## 19. Referencia de módulos
1329
+ ## 12. Programación de producción (scheduling)
1330
+
1331
+ ### Máquina única — `schedule_single`
1332
+
1333
+ Asigna *n* trabajos a una sola máquina según una regla de prioridad.
1334
+
1335
+ ```python
1336
+ import walopy as wl
1337
+
1338
+ p = [3, 1, 4, 1, 5] # tiempos de proceso
1339
+ d = [8, 3, 10, 4, 12] # fechas de entrega
1340
+ w = [2, 5, 1, 4, 1] # pesos de importancia
1341
+
1342
+ r = wl.schedule_single(p, rule="SPT", due_dates=d, weights=w,
1343
+ names=["A","B","C","D","E"])
1344
+ print(r)
1345
+ ```
1346
+
1347
+ ```
1348
+ Rule : SPT
1349
+ Sequence : B → D → A → C → E
1350
+ Makespan (Cmax) : 14
1351
+ Total completion ΣCj : 37
1352
+ Weighted completion ΣwCj: 89
1353
+ Max lateness : 2
1354
+ Total tardiness ΣTj : 2
1355
+ Tardy jobs : 1
1356
+ ```
1357
+
1358
+ **Reglas disponibles**
1359
+
1360
+ | `rule` | Criterio minimizado | Datos requeridos |
1361
+ |--------|---------------------|-----------------|
1362
+ | `'SPT'` | ΣCj (tiempo total de completación) | — |
1363
+ | `'EDD'` | Lmax (máxima tardanza) | `due_dates` |
1364
+ | `'WSPT'` | ΣwjCj (completación ponderada) | `weights` |
1365
+ | `'CR'` | Ratio crítico dj/pj | `due_dates` |
1366
+ | `'FIFO'` | Orden de llegada (línea base) | — |
1367
+
1368
+ **Atributos de `ScheduleResult`**
1369
+
1370
+ | Atributo | Descripción |
1371
+ |----------|-------------|
1372
+ | `rule` | Regla utilizada |
1373
+ | `sequence` | Lista de nombres en orden de procesamiento |
1374
+ | `jobs` | Lista de `JobSchedule` (por trabajo) |
1375
+ | `makespan` | Cmax = suma de tiempos de proceso |
1376
+ | `total_completion_time` | ΣCj |
1377
+ | `total_weighted_completion_time` | ΣwjCj |
1378
+ | `max_lateness` | max(Lj) |
1379
+ | `total_tardiness` | ΣTj |
1380
+ | `n_tardy` | Número de trabajos tarde |
1381
+
1382
+ ```python
1383
+ df = r.to_frame() # columnas: Name, p, d, w, Start, C, L, T, Tardy
1384
+ ```
1385
+
1386
+ ---
1387
+
1388
+ ### Flow-shop de 2 máquinas — `johnson_flowshop`
1389
+
1390
+ El algoritmo de Johnson encuentra la secuencia óptima que minimiza el makespan cuando todos los trabajos pasan primero por M1 y luego por M2.
1391
+
1392
+ ```python
1393
+ m1 = [3, 8, 5, 7, 2] # tiempos en máquina 1
1394
+ m2 = [5, 2, 8, 4, 6] # tiempos en máquina 2
1395
+
1396
+ r = wl.johnson_flowshop(m1, m2)
1397
+ print(r)
1398
+ ```
1399
+
1400
+ ```
1401
+ Sequence : J1 → J5 → J4 → J3 → J2
1402
+ Makespan : 34
1403
+ ```
1404
+
1405
+ ```python
1406
+ df = r.to_frame()
1407
+ # columnas: Job | M1 start | M1 end | M2 start | M2 end
1408
+ ```
1409
+
1410
+ ---
1411
+
1412
+ ## 13. Confiabilidad — `reliability`
1413
+
1414
+ Modelos de confiabilidad con distribución exponencial (tasa de falla constante).
1415
+
1416
+ ### Componente individual — `mtbf_analysis`
1417
+
1418
+ ```python
1419
+ r = wl.mtbf_analysis(failure_rate=0.01, mttr=5.0, t=100)
1420
+ print(r)
1421
+ ```
1422
+
1423
+ ```
1424
+ Topology : component
1425
+ Components : 1
1426
+ Failure rates λ : ['0.01']
1427
+ MTBF : 100
1428
+ R(t=100) : 0.367879
1429
+ Availability : 95.2381%
1430
+ ```
1431
+
1432
+ ### Sistema en serie — `series_system`
1433
+
1434
+ El sistema falla si **cualquier** componente falla. λ_sys = Σλi.
1435
+
1436
+ ```python
1437
+ r = wl.series_system([0.01, 0.02, 0.03], t=10)
1438
+ print(r.mtbf) # 1/0.06 ≈ 16.67
1439
+ print(r.R_t) # e^{-0.06·10} ≈ 0.549
1440
+ ```
1441
+
1442
+ ### Sistema en paralelo — `parallel_system`
1443
+
1444
+ El sistema opera si **al menos uno** de los componentes opera.
1445
+ R_sys(t) = 1 − ∏(1 − e^{−λi·t}). MTBF calculado numéricamente.
1446
+
1447
+ ```python
1448
+ r = wl.parallel_system([0.01, 0.02], t=50)
1449
+ print(r.R_t) # mayor que el sistema en serie
1450
+ print(r.mtbf) # mayor que cualquier componente individual
1451
+ ```
1452
+
1453
+ ### Sistema k-de-n — `koon_system`
1454
+
1455
+ Opera si al menos **k** de **n** componentes idénticos están en servicio.
1456
+ MTBF exacto = (1/λ) · Σ_{j=k}^{n} (1/j).
1457
+
1458
+ ```python
1459
+ # 2-de-3: requiere al menos 2 de 3 componentes idénticos
1460
+ r = wl.koon_system(n=3, k=2, failure_rate=0.01, t=50)
1461
+ print(r.mtbf) # (1/0.01) * (1/2 + 1/3) ≈ 83.33
1462
+ print(r.R_t)
1463
+ ```
1464
+
1465
+ **Casos especiales**
1466
+ - `k=1` → equivale a `parallel_system` con n componentes idénticos.
1467
+ - `k=n` → equivale a `series_system` con n componentes idénticos.
1468
+
1469
+ **Atributos de `ReliabilityResult`**
1470
+
1471
+ | Atributo | Descripción |
1472
+ |----------|-------------|
1473
+ | `topology` | `'component'`, `'series'`, `'parallel'`, `'k-of-n'` |
1474
+ | `n_components` | Número de componentes |
1475
+ | `failure_rates` | Lista de λi |
1476
+ | `mtbf` | MTBF del sistema |
1477
+ | `R_t` | Confiabilidad R(t) si se proporcionó `t` |
1478
+ | `availability` | Disponibilidad estacionaria A si se proporcionó `mttr` |
1479
+ | `mttr` | Tiempo medio de reparación (si se proporcionó) |
1480
+
1481
+ ```python
1482
+ df = r.to_frame() # columnas: Topology, Components, MTBF[, R(t), Availability]
1483
+ r.R(t=200) # evalúa R(t) en cualquier tiempo posterior
1484
+ ```
1485
+
1486
+ ---
1487
+
1488
+ ## 21. Referencia de módulos
1328
1489
 
1329
1490
  | Módulo | Funciones y clases principales |
1330
1491
  |---|---|
1331
1492
  | `queuing` | `mm1`, `mmc`, `md1`, `kingman`, `mg1`, `littles_law`, `QueueResult`, `cv2_normal`, `cv2_triangular`, `cv2_uniform`, `cv2_erlang`, `cv2_gamma`, `cv2_lognormal`, `cv2_weibull` |
1332
1493
  | `advanced` | `mm1k`, `mmck`, `erlang_b`, `mm1_priority`, `monte_carlo_gg1`, `takt_time`, `line_balance`, `break_even`, `break_even_multi`, `break_even_sales`, `queue_length_pmf`, `sojourn_cdf`, `PriorityQueueResult`, `SimulationResult`, `LineBalanceResult`, `BreakEvenResult`, `BreakEvenMultiResult` |
1333
1494
  | `fitting` | `fit_from_data`, `FitResult` |
1334
- | `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult` |
1495
+ | `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `wagner_whitin`, `rq_policy`, `rs_policy`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult`, `RQPolicyResult`, `RSPolicyResult` |
1496
+ | `scheduling` | `schedule_single`, `johnson_flowshop`, `ScheduleResult`, `JobSchedule`, `FlowShopResult` |
1497
+ | `reliability` | `mtbf_analysis`, `series_system`, `parallel_system`, `koon_system`, `ReliabilityResult` |
1335
1498
  | `network` | `jackson_network`, `JacksonResult`, `StationMetrics` |
1336
1499
  | `operations` | `oee`, `utilization_efficiency`, `unit_cost`, `OEEResult`, `UtilizationResult`, `UnitCostResult` |
1337
1500
  | `bottleneck` | `bottleneck_analysis`, `BottleneckResult`, `StationResult` |
@@ -1341,7 +1504,7 @@ Wq : 0.3 (avg wait time in queue)
1341
1504
 
1342
1505
  ---
1343
1506
 
1344
- ## 20. Requisitos
1507
+ ## 22. Requisitos
1345
1508
 
1346
1509
  ```
1347
1510
  Python ≥ 3.9
@@ -26,15 +26,17 @@ pip install walopy
26
26
  9. [Análisis de cuellos de botella](#9-análisis-de-cuellos-de-botella)
27
27
  10. [Balance de línea y tiempo takt](#10-balance-de-línea-y-tiempo-takt)
28
28
  11. [Análisis de punto de equilibrio](#11-análisis-de-punto-de-equilibrio)
29
- 12. [Árboles de KPI](#12-árboles-de-kpi)
30
- 13. [Solvers y optimización](#13-solvers-y-optimización)
31
- 14. [Análisis de sensibilidad](#14-análisis-de-sensibilidad)
32
- 15. [Escenarios en lote (batch_model)](#15-escenarios-en-lote-batch_model)
33
- 16. [Comparar múltiples resultados](#16-comparar-múltiples-resultados)
34
- 17. [Gráficas](#17-gráficas)
35
- 18. [CLI](#18-cli)
36
- 19. [Referencia de módulos](#19-referencia-de-módulos)
37
- 20. [Requisitos](#20-requisitos)
29
+ 12. [Programación de producción (scheduling)](#12-programación-de-producción-scheduling)
30
+ 13. [Confiabilidad](#13-confiabilidad--reliability)
31
+ 14. [Árboles de KPI](#14-árboles-de-kpi)
32
+ 15. [Solvers y optimización](#15-solvers-y-optimización)
33
+ 16. [Análisis de sensibilidad](#16-análisis-de-sensibilidad)
34
+ 17. [Escenarios en lote (batch_model)](#17-escenarios-en-lote-batch_model)
35
+ 18. [Comparar múltiples resultados](#18-comparar-múltiples-resultados)
36
+ 19. [Gráficas](#19-gráficas)
37
+ 20. [CLI](#20-cli)
38
+ 21. [Referencia de módulos](#21-referencia-de-módulos)
39
+ 22. [Requisitos](#22-requisitos)
38
40
 
39
41
  ---
40
42
 
@@ -1018,7 +1020,7 @@ print(r.margin_of_safety_pct) # 0.375 — porcentaje del margen de seguridad
1018
1020
 
1019
1021
  ---
1020
1022
 
1021
- ## 12. Árboles de KPI
1023
+ ## 14. Árboles de KPI
1022
1024
 
1023
1025
  Los árboles de KPI crean jerarquías interactivas visualizadas como **treemap** o **sunburst** con Plotly.
1024
1026
 
@@ -1071,7 +1073,7 @@ fig.show()
1071
1073
 
1072
1074
  ---
1073
1075
 
1074
- ## 13. Solvers y optimización
1076
+ ## 15. Solvers y optimización
1075
1077
 
1076
1078
  ### `solve_lam(metric, target, *, mu, model)` — Máxima tasa de llegada
1077
1079
 
@@ -1118,7 +1120,7 @@ r.plot() # gráfica de costo vs número de servidores
1118
1120
 
1119
1121
  ---
1120
1122
 
1121
- ## 14. Análisis de sensibilidad
1123
+ ## 16. Análisis de sensibilidad
1122
1124
 
1123
1125
  ### `sensitivity(model_fn, param, values, **fixed_kwargs)` — Barrido paramétrico
1124
1126
 
@@ -1149,7 +1151,7 @@ fig.show()
1149
1151
 
1150
1152
  ---
1151
1153
 
1152
- ## 15. Escenarios en lote (batch_model)
1154
+ ## 17. Escenarios en lote (batch_model)
1153
1155
 
1154
1156
  ### `batch_model(model_fn, df, **fixed_kwargs)` — Aplicar modelo a un DataFrame
1155
1157
 
@@ -1184,7 +1186,7 @@ print(resultado[resultado["_error"].notna()]) # filas fallidas
1184
1186
 
1185
1187
  ---
1186
1188
 
1187
- ## 16. Comparar múltiples resultados
1189
+ ## 18. Comparar múltiples resultados
1188
1190
 
1189
1191
  ### `compare(*results, labels)` — DataFrame comparativo
1190
1192
 
@@ -1209,7 +1211,7 @@ df2 = wl.compare(wl.mm1(1, 5), wl.mm1(2, 5), wl.mm1(3, 5))
1209
1211
 
1210
1212
  ---
1211
1213
 
1212
- ## 17. Gráficas
1214
+ ## 19. Gráficas
1213
1215
 
1214
1216
  Todos los resultados exponen `.plot()` que devuelve una figura de Matplotlib o Plotly. También se pueden llamar directamente desde `walopy.plotting`.
1215
1217
 
@@ -1245,7 +1247,7 @@ fig.show()
1245
1247
 
1246
1248
  ---
1247
1249
 
1248
- ## 18. CLI
1250
+ ## 20. CLI
1249
1251
 
1250
1252
  walopy incluye una interfaz de línea de comandos para uso rápido sin escribir código.
1251
1253
 
@@ -1287,14 +1289,175 @@ Wq : 0.3 (avg wait time in queue)
1287
1289
 
1288
1290
  ---
1289
1291
 
1290
- ## 19. Referencia de módulos
1292
+ ## 12. Programación de producción (scheduling)
1293
+
1294
+ ### Máquina única — `schedule_single`
1295
+
1296
+ Asigna *n* trabajos a una sola máquina según una regla de prioridad.
1297
+
1298
+ ```python
1299
+ import walopy as wl
1300
+
1301
+ p = [3, 1, 4, 1, 5] # tiempos de proceso
1302
+ d = [8, 3, 10, 4, 12] # fechas de entrega
1303
+ w = [2, 5, 1, 4, 1] # pesos de importancia
1304
+
1305
+ r = wl.schedule_single(p, rule="SPT", due_dates=d, weights=w,
1306
+ names=["A","B","C","D","E"])
1307
+ print(r)
1308
+ ```
1309
+
1310
+ ```
1311
+ Rule : SPT
1312
+ Sequence : B → D → A → C → E
1313
+ Makespan (Cmax) : 14
1314
+ Total completion ΣCj : 37
1315
+ Weighted completion ΣwCj: 89
1316
+ Max lateness : 2
1317
+ Total tardiness ΣTj : 2
1318
+ Tardy jobs : 1
1319
+ ```
1320
+
1321
+ **Reglas disponibles**
1322
+
1323
+ | `rule` | Criterio minimizado | Datos requeridos |
1324
+ |--------|---------------------|-----------------|
1325
+ | `'SPT'` | ΣCj (tiempo total de completación) | — |
1326
+ | `'EDD'` | Lmax (máxima tardanza) | `due_dates` |
1327
+ | `'WSPT'` | ΣwjCj (completación ponderada) | `weights` |
1328
+ | `'CR'` | Ratio crítico dj/pj | `due_dates` |
1329
+ | `'FIFO'` | Orden de llegada (línea base) | — |
1330
+
1331
+ **Atributos de `ScheduleResult`**
1332
+
1333
+ | Atributo | Descripción |
1334
+ |----------|-------------|
1335
+ | `rule` | Regla utilizada |
1336
+ | `sequence` | Lista de nombres en orden de procesamiento |
1337
+ | `jobs` | Lista de `JobSchedule` (por trabajo) |
1338
+ | `makespan` | Cmax = suma de tiempos de proceso |
1339
+ | `total_completion_time` | ΣCj |
1340
+ | `total_weighted_completion_time` | ΣwjCj |
1341
+ | `max_lateness` | max(Lj) |
1342
+ | `total_tardiness` | ΣTj |
1343
+ | `n_tardy` | Número de trabajos tarde |
1344
+
1345
+ ```python
1346
+ df = r.to_frame() # columnas: Name, p, d, w, Start, C, L, T, Tardy
1347
+ ```
1348
+
1349
+ ---
1350
+
1351
+ ### Flow-shop de 2 máquinas — `johnson_flowshop`
1352
+
1353
+ El algoritmo de Johnson encuentra la secuencia óptima que minimiza el makespan cuando todos los trabajos pasan primero por M1 y luego por M2.
1354
+
1355
+ ```python
1356
+ m1 = [3, 8, 5, 7, 2] # tiempos en máquina 1
1357
+ m2 = [5, 2, 8, 4, 6] # tiempos en máquina 2
1358
+
1359
+ r = wl.johnson_flowshop(m1, m2)
1360
+ print(r)
1361
+ ```
1362
+
1363
+ ```
1364
+ Sequence : J1 → J5 → J4 → J3 → J2
1365
+ Makespan : 34
1366
+ ```
1367
+
1368
+ ```python
1369
+ df = r.to_frame()
1370
+ # columnas: Job | M1 start | M1 end | M2 start | M2 end
1371
+ ```
1372
+
1373
+ ---
1374
+
1375
+ ## 13. Confiabilidad — `reliability`
1376
+
1377
+ Modelos de confiabilidad con distribución exponencial (tasa de falla constante).
1378
+
1379
+ ### Componente individual — `mtbf_analysis`
1380
+
1381
+ ```python
1382
+ r = wl.mtbf_analysis(failure_rate=0.01, mttr=5.0, t=100)
1383
+ print(r)
1384
+ ```
1385
+
1386
+ ```
1387
+ Topology : component
1388
+ Components : 1
1389
+ Failure rates λ : ['0.01']
1390
+ MTBF : 100
1391
+ R(t=100) : 0.367879
1392
+ Availability : 95.2381%
1393
+ ```
1394
+
1395
+ ### Sistema en serie — `series_system`
1396
+
1397
+ El sistema falla si **cualquier** componente falla. λ_sys = Σλi.
1398
+
1399
+ ```python
1400
+ r = wl.series_system([0.01, 0.02, 0.03], t=10)
1401
+ print(r.mtbf) # 1/0.06 ≈ 16.67
1402
+ print(r.R_t) # e^{-0.06·10} ≈ 0.549
1403
+ ```
1404
+
1405
+ ### Sistema en paralelo — `parallel_system`
1406
+
1407
+ El sistema opera si **al menos uno** de los componentes opera.
1408
+ R_sys(t) = 1 − ∏(1 − e^{−λi·t}). MTBF calculado numéricamente.
1409
+
1410
+ ```python
1411
+ r = wl.parallel_system([0.01, 0.02], t=50)
1412
+ print(r.R_t) # mayor que el sistema en serie
1413
+ print(r.mtbf) # mayor que cualquier componente individual
1414
+ ```
1415
+
1416
+ ### Sistema k-de-n — `koon_system`
1417
+
1418
+ Opera si al menos **k** de **n** componentes idénticos están en servicio.
1419
+ MTBF exacto = (1/λ) · Σ_{j=k}^{n} (1/j).
1420
+
1421
+ ```python
1422
+ # 2-de-3: requiere al menos 2 de 3 componentes idénticos
1423
+ r = wl.koon_system(n=3, k=2, failure_rate=0.01, t=50)
1424
+ print(r.mtbf) # (1/0.01) * (1/2 + 1/3) ≈ 83.33
1425
+ print(r.R_t)
1426
+ ```
1427
+
1428
+ **Casos especiales**
1429
+ - `k=1` → equivale a `parallel_system` con n componentes idénticos.
1430
+ - `k=n` → equivale a `series_system` con n componentes idénticos.
1431
+
1432
+ **Atributos de `ReliabilityResult`**
1433
+
1434
+ | Atributo | Descripción |
1435
+ |----------|-------------|
1436
+ | `topology` | `'component'`, `'series'`, `'parallel'`, `'k-of-n'` |
1437
+ | `n_components` | Número de componentes |
1438
+ | `failure_rates` | Lista de λi |
1439
+ | `mtbf` | MTBF del sistema |
1440
+ | `R_t` | Confiabilidad R(t) si se proporcionó `t` |
1441
+ | `availability` | Disponibilidad estacionaria A si se proporcionó `mttr` |
1442
+ | `mttr` | Tiempo medio de reparación (si se proporcionó) |
1443
+
1444
+ ```python
1445
+ df = r.to_frame() # columnas: Topology, Components, MTBF[, R(t), Availability]
1446
+ r.R(t=200) # evalúa R(t) en cualquier tiempo posterior
1447
+ ```
1448
+
1449
+ ---
1450
+
1451
+ ## 21. Referencia de módulos
1291
1452
 
1292
1453
  | Módulo | Funciones y clases principales |
1293
1454
  |---|---|
1294
1455
  | `queuing` | `mm1`, `mmc`, `md1`, `kingman`, `mg1`, `littles_law`, `QueueResult`, `cv2_normal`, `cv2_triangular`, `cv2_uniform`, `cv2_erlang`, `cv2_gamma`, `cv2_lognormal`, `cv2_weibull` |
1295
1456
  | `advanced` | `mm1k`, `mmck`, `erlang_b`, `mm1_priority`, `monte_carlo_gg1`, `takt_time`, `line_balance`, `break_even`, `break_even_multi`, `break_even_sales`, `queue_length_pmf`, `sojourn_cdf`, `PriorityQueueResult`, `SimulationResult`, `LineBalanceResult`, `BreakEvenResult`, `BreakEvenMultiResult` |
1296
1457
  | `fitting` | `fit_from_data`, `FitResult` |
1297
- | `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult` |
1458
+ | `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `wagner_whitin`, `rq_policy`, `rs_policy`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult`, `RQPolicyResult`, `RSPolicyResult` |
1459
+ | `scheduling` | `schedule_single`, `johnson_flowshop`, `ScheduleResult`, `JobSchedule`, `FlowShopResult` |
1460
+ | `reliability` | `mtbf_analysis`, `series_system`, `parallel_system`, `koon_system`, `ReliabilityResult` |
1298
1461
  | `network` | `jackson_network`, `JacksonResult`, `StationMetrics` |
1299
1462
  | `operations` | `oee`, `utilization_efficiency`, `unit_cost`, `OEEResult`, `UtilizationResult`, `UnitCostResult` |
1300
1463
  | `bottleneck` | `bottleneck_analysis`, `BottleneckResult`, `StationResult` |
@@ -1304,7 +1467,7 @@ Wq : 0.3 (avg wait time in queue)
1304
1467
 
1305
1468
  ---
1306
1469
 
1307
- ## 20. Requisitos
1470
+ ## 22. Requisitos
1308
1471
 
1309
1472
  ```
1310
1473
  Python ≥ 3.9
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "walopy"
7
- version = "0.2.5"
7
+ version = "0.2.6"
8
8
  description = "Queuing theory, operations analysis, OEE, bottleneck analysis and KPI trees for Python"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -113,6 +113,33 @@ from .network import (
113
113
  jackson_network,
114
114
  )
115
115
 
116
+ # Inventory additions
117
+ from .inventory import (
118
+ RQPolicyResult,
119
+ RSPolicyResult,
120
+ rq_policy,
121
+ rs_policy,
122
+ wagner_whitin,
123
+ )
124
+
125
+ # Scheduling
126
+ from .scheduling import (
127
+ JobSchedule,
128
+ ScheduleResult,
129
+ FlowShopResult,
130
+ schedule_single,
131
+ johnson_flowshop,
132
+ )
133
+
134
+ # Reliability
135
+ from .reliability import (
136
+ ReliabilityResult,
137
+ mtbf_analysis,
138
+ series_system,
139
+ parallel_system,
140
+ koon_system,
141
+ )
142
+
116
143
  from importlib.metadata import version, PackageNotFoundError
117
144
  try:
118
145
  __version__: str = version("walopy")
@@ -205,4 +232,22 @@ __all__ = [
205
232
  "StationMetrics",
206
233
  "JacksonResult",
207
234
  "jackson_network",
235
+ # inventory additions
236
+ "RQPolicyResult",
237
+ "RSPolicyResult",
238
+ "rq_policy",
239
+ "rs_policy",
240
+ "wagner_whitin",
241
+ # scheduling
242
+ "JobSchedule",
243
+ "ScheduleResult",
244
+ "FlowShopResult",
245
+ "schedule_single",
246
+ "johnson_flowshop",
247
+ # reliability
248
+ "ReliabilityResult",
249
+ "mtbf_analysis",
250
+ "series_system",
251
+ "parallel_system",
252
+ "koon_system",
208
253
  ]