walopy 0.2.5__tar.gz → 0.2.7__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 (40) hide show
  1. {walopy-0.2.5/src/walopy.egg-info → walopy-0.2.7}/PKG-INFO +317 -20
  2. {walopy-0.2.5 → walopy-0.2.7}/README.md +316 -19
  3. {walopy-0.2.5 → walopy-0.2.7}/pyproject.toml +1 -1
  4. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/__init__.py +53 -0
  5. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/inventory.py +722 -0
  6. walopy-0.2.7/src/walopy/reliability.py +298 -0
  7. walopy-0.2.7/src/walopy/scheduling.py +315 -0
  8. {walopy-0.2.5 → walopy-0.2.7/src/walopy.egg-info}/PKG-INFO +317 -20
  9. {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/SOURCES.txt +6 -1
  10. walopy-0.2.7/tests/test_exchange_curve.py +147 -0
  11. walopy-0.2.7/tests/test_safety_stock_curve.py +172 -0
  12. walopy-0.2.7/tests/test_v026.py +276 -0
  13. {walopy-0.2.5 → walopy-0.2.7}/LICENSE +0 -0
  14. {walopy-0.2.5 → walopy-0.2.7}/setup.cfg +0 -0
  15. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/__main__.py +0 -0
  16. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/_utils.py +0 -0
  17. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/advanced.py +0 -0
  18. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/bottleneck.py +0 -0
  19. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/fitting.py +0 -0
  20. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/kpi.py +0 -0
  21. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/network.py +0 -0
  22. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/operations.py +0 -0
  23. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/plotting.py +0 -0
  24. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/queuing.py +0 -0
  25. {walopy-0.2.5 → walopy-0.2.7}/src/walopy/solver.py +0 -0
  26. {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/dependency_links.txt +0 -0
  27. {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/requires.txt +0 -0
  28. {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/top_level.txt +0 -0
  29. {walopy-0.2.5 → walopy-0.2.7}/tests/test_advanced.py +0 -0
  30. {walopy-0.2.5 → walopy-0.2.7}/tests/test_bottleneck.py +0 -0
  31. {walopy-0.2.5 → walopy-0.2.7}/tests/test_fitting.py +0 -0
  32. {walopy-0.2.5 → walopy-0.2.7}/tests/test_inventory.py +0 -0
  33. {walopy-0.2.5 → walopy-0.2.7}/tests/test_inventory_new.py +0 -0
  34. {walopy-0.2.5 → walopy-0.2.7}/tests/test_kpi.py +0 -0
  35. {walopy-0.2.5 → walopy-0.2.7}/tests/test_mg1.py +0 -0
  36. {walopy-0.2.5 → walopy-0.2.7}/tests/test_network.py +0 -0
  37. {walopy-0.2.5 → walopy-0.2.7}/tests/test_new_models.py +0 -0
  38. {walopy-0.2.5 → walopy-0.2.7}/tests/test_operations.py +0 -0
  39. {walopy-0.2.5 → walopy-0.2.7}/tests/test_queuing.py +0 -0
  40. {walopy-0.2.5 → walopy-0.2.7}/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.7
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,18 @@ 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. [Curvas de intercambio](#12-curvas-de-intercambio)
67
+ 13. [Programación de producción (scheduling)](#13-programación-de-producción-scheduling)
68
+ 14. [Confiabilidad](#14-confiabilidad--reliability)
69
+ 15. [Árboles de KPI](#15-árboles-de-kpi)
70
+ 16. [Solvers y optimización](#16-solvers-y-optimización)
71
+ 17. [Análisis de sensibilidad](#17-análisis-de-sensibilidad)
72
+ 18. [Escenarios en lote (batch_model)](#18-escenarios-en-lote-batch_model)
73
+ 19. [Comparar múltiples resultados](#19-comparar-múltiples-resultados)
74
+ 20. [Gráficas](#20-gráficas)
75
+ 21. [CLI](#21-cli)
76
+ 22. [Referencia de módulos](#22-referencia-de-módulos)
77
+ 23. [Requisitos](#23-requisitos)
75
78
 
76
79
  ---
77
80
 
@@ -1055,7 +1058,7 @@ print(r.margin_of_safety_pct) # 0.375 — porcentaje del margen de seguridad
1055
1058
 
1056
1059
  ---
1057
1060
 
1058
- ## 12. Árboles de KPI
1061
+ ## 15. Árboles de KPI
1059
1062
 
1060
1063
  Los árboles de KPI crean jerarquías interactivas visualizadas como **treemap** o **sunburst** con Plotly.
1061
1064
 
@@ -1108,7 +1111,7 @@ fig.show()
1108
1111
 
1109
1112
  ---
1110
1113
 
1111
- ## 13. Solvers y optimización
1114
+ ## 16. Solvers y optimización
1112
1115
 
1113
1116
  ### `solve_lam(metric, target, *, mu, model)` — Máxima tasa de llegada
1114
1117
 
@@ -1155,7 +1158,7 @@ r.plot() # gráfica de costo vs número de servidores
1155
1158
 
1156
1159
  ---
1157
1160
 
1158
- ## 14. Análisis de sensibilidad
1161
+ ## 17. Análisis de sensibilidad
1159
1162
 
1160
1163
  ### `sensitivity(model_fn, param, values, **fixed_kwargs)` — Barrido paramétrico
1161
1164
 
@@ -1186,7 +1189,7 @@ fig.show()
1186
1189
 
1187
1190
  ---
1188
1191
 
1189
- ## 15. Escenarios en lote (batch_model)
1192
+ ## 18. Escenarios en lote (batch_model)
1190
1193
 
1191
1194
  ### `batch_model(model_fn, df, **fixed_kwargs)` — Aplicar modelo a un DataFrame
1192
1195
 
@@ -1221,7 +1224,7 @@ print(resultado[resultado["_error"].notna()]) # filas fallidas
1221
1224
 
1222
1225
  ---
1223
1226
 
1224
- ## 16. Comparar múltiples resultados
1227
+ ## 19. Comparar múltiples resultados
1225
1228
 
1226
1229
  ### `compare(*results, labels)` — DataFrame comparativo
1227
1230
 
@@ -1246,7 +1249,7 @@ df2 = wl.compare(wl.mm1(1, 5), wl.mm1(2, 5), wl.mm1(3, 5))
1246
1249
 
1247
1250
  ---
1248
1251
 
1249
- ## 17. Gráficas
1252
+ ## 20. Gráficas
1250
1253
 
1251
1254
  Todos los resultados exponen `.plot()` que devuelve una figura de Matplotlib o Plotly. También se pueden llamar directamente desde `walopy.plotting`.
1252
1255
 
@@ -1282,7 +1285,7 @@ fig.show()
1282
1285
 
1283
1286
  ---
1284
1287
 
1285
- ## 18. CLI
1288
+ ## 21. CLI
1286
1289
 
1287
1290
  walopy incluye una interfaz de línea de comandos para uso rápido sin escribir código.
1288
1291
 
@@ -1324,14 +1327,308 @@ Wq : 0.3 (avg wait time in queue)
1324
1327
 
1325
1328
  ---
1326
1329
 
1327
- ## 19. Referencia de módulos
1330
+ ## 12. Curvas de intercambio
1331
+
1332
+ Herramientas para tomar decisiones de política agregada en familias de artículos.
1333
+
1334
+ ### Tipo 1 — ciclo: `exchange_curve`
1335
+
1336
+ Traza la hipérbola entre número de pedidos por año (N) e inversión promedio en inventario de ciclo (I):
1337
+
1338
+ ```
1339
+ N(k) = N* / k I(k) = k · I* → N · I = N* · I* (constante)
1340
+ ```
1341
+
1342
+ Dado un target de N o de I, resuelve el multiplicador k óptimo y recalcula Q para cada artículo.
1343
+
1344
+ ```python
1345
+ import walopy as wl
1346
+
1347
+ items = [
1348
+ {"name": "A", "demand": 1000, "ordering_cost": 50, "holding_cost": 2, "unit_value": 10},
1349
+ {"name": "B", "demand": 500, "ordering_cost": 30, "holding_cost": 1, "unit_value": 5},
1350
+ {"name": "C", "demand": 2000, "ordering_cost": 100, "holding_cost": 4, "unit_value": 8},
1351
+ ]
1352
+
1353
+ # Sin target → punto EOQ (k = 1)
1354
+ r = wl.exchange_curve(items)
1355
+ print(r)
1356
+ ```
1357
+
1358
+ ```
1359
+ Target : eoq
1360
+ Multiplier k : 1.0000
1361
+ N orders/yr (EOQ) : 87.27
1362
+ N orders/yr (optimal) : 87.27
1363
+ Investment (EOQ) : 5430
1364
+ Investment (optimal) : 5430
1365
+ ```
1366
+
1367
+ ```python
1368
+ # Reducir a 20 pedidos/año (k > 1 → Q más grandes → más inversión)
1369
+ r = wl.exchange_curve(items, target_orders=20)
1370
+
1371
+ # Limitar inversión a 3 000 (k < 1 → Q más pequeños → más pedidos)
1372
+ r = wl.exchange_curve(items, target_investment=3000)
1373
+
1374
+ # Tabla por artículo
1375
+ df = r.to_frame()
1376
+ # columnas: name | Q_eoq | Q_optimal | n_orders | investment
1377
+
1378
+ # Hipérbola para graficar
1379
+ curve = r.curve_to_frame()
1380
+ # columnas: N | I
1381
+ ```
1382
+
1383
+ **Parámetros de cada artículo**
1384
+
1385
+ | Clave | Requerido | Descripción |
1386
+ |-------|-----------|-------------|
1387
+ | `demand` | ✓ | Demanda anual Di |
1388
+ | `ordering_cost` | ✓ | Costo de pedido Ki |
1389
+ | `holding_cost` | ✓ | Costo de mantenimiento hi |
1390
+ | `unit_value` | — | Valor unitario vi (default 1) |
1391
+ | `name` | — | Etiqueta (default I1, I2, …) |
1392
+
1393
+ ---
1394
+
1395
+ ### Tipo 2 — seguridad: `safety_stock_curve`
1396
+
1397
+ Traza la curva entre inversión en stock de seguridad e nivel de servicio por ciclo usando una **política z común** para toda la familia:
1398
+
1399
+ ```
1400
+ SS_i(z) = z · σᵢ_DLT · vᵢ σᵢ_DLT = √(Lᵢ·σ²_Di + D²ᵢ·σ²_Li)
1401
+ SS_total(z) = z · Σ σᵢ_DLT · vᵢ SL(z) = Φ(z)
1402
+ ```
1403
+
1404
+ ```python
1405
+ items = [
1406
+ {"name": "A", "demand_rate": 100, "demand_std": 10, "lead_time": 2, "unit_value": 10},
1407
+ {"name": "B", "demand_rate": 50, "demand_std": 5, "lead_time": 1, "unit_value": 5},
1408
+ {"name": "C", "demand_rate": 200, "demand_std": 20, "lead_time": 3, "unit_value": 8},
1409
+ ]
1410
+
1411
+ # Target: nivel de servicio 95%
1412
+ r = wl.safety_stock_curve(items, target_service_level=0.95)
1413
+ print(r)
1414
+ ```
1415
+
1416
+ ```
1417
+ Target : service_level=95.0000%
1418
+ z : 1.6449
1419
+ Service level : 95.0000%
1420
+ SS investment : 1 847
1421
+ ```
1422
+
1423
+ ```python
1424
+ # Target: presupuesto máximo de SS
1425
+ r = wl.safety_stock_curve(items, target_ss_investment=1000)
1426
+
1427
+ # Tabla por artículo (incluye punto de reorden cuando se da demand_rate)
1428
+ df = r.to_frame()
1429
+ # columnas: name | sigma_dlt | safety_stock | investment | reorder_point
1430
+
1431
+ # Curva completa (z de −2 a 4)
1432
+ curve = r.curve_to_frame()
1433
+ # columnas: z | service_level | ss_investment
1434
+ ```
1435
+
1436
+ **Parámetros de cada artículo**
1437
+
1438
+ | Clave | Requerido | Descripción |
1439
+ |-------|-----------|-------------|
1440
+ | `demand_std` | ✓ | Desviación estándar de la demanda |
1441
+ | `lead_time` | ✓ | Lead time medio |
1442
+ | `demand_rate` | — | Demanda media; activa columna `reorder_point` |
1443
+ | `lead_time_std` | — | Desviación estándar del lead time (default 0) |
1444
+ | `unit_value` | — | Valor unitario (default 1) |
1445
+ | `name` | — | Etiqueta (default I1, I2, …) |
1446
+
1447
+ ---
1448
+
1449
+ ### Relación entre ambas curvas
1450
+
1451
+ | | Tipo 1 (ciclo) | Tipo 2 (seguridad) |
1452
+ |---|---|---|
1453
+ | **Función** | `exchange_curve` | `safety_stock_curve` |
1454
+ | **Decide** | Tamaño de lote Q | Punto de reorden r |
1455
+ | **Tradeoff** | N pedidos/año ↔ Inversión ciclo | Nivel de servicio ↔ SS |
1456
+ | **Resultado** | `ExchangeCurveResult` | `SafetyStockCurveResult` |
1457
+ | **Parámetro** | Multiplicador k | Factor z |
1458
+
1459
+ Usadas juntas cubren la política completa `(Q, r)` para toda la familia.
1460
+
1461
+ ---
1462
+
1463
+ ## 13. Programación de producción (scheduling)
1464
+
1465
+ ### Máquina única — `schedule_single`
1466
+
1467
+ Asigna *n* trabajos a una sola máquina según una regla de prioridad.
1468
+
1469
+ ```python
1470
+ import walopy as wl
1471
+
1472
+ p = [3, 1, 4, 1, 5] # tiempos de proceso
1473
+ d = [8, 3, 10, 4, 12] # fechas de entrega
1474
+ w = [2, 5, 1, 4, 1] # pesos de importancia
1475
+
1476
+ r = wl.schedule_single(p, rule="SPT", due_dates=d, weights=w,
1477
+ names=["A","B","C","D","E"])
1478
+ print(r)
1479
+ ```
1480
+
1481
+ ```
1482
+ Rule : SPT
1483
+ Sequence : B → D → A → C → E
1484
+ Makespan (Cmax) : 14
1485
+ Total completion ΣCj : 37
1486
+ Weighted completion ΣwCj: 89
1487
+ Max lateness : 2
1488
+ Total tardiness ΣTj : 2
1489
+ Tardy jobs : 1
1490
+ ```
1491
+
1492
+ **Reglas disponibles**
1493
+
1494
+ | `rule` | Criterio minimizado | Datos requeridos |
1495
+ |--------|---------------------|-----------------|
1496
+ | `'SPT'` | ΣCj (tiempo total de completación) | — |
1497
+ | `'EDD'` | Lmax (máxima tardanza) | `due_dates` |
1498
+ | `'WSPT'` | ΣwjCj (completación ponderada) | `weights` |
1499
+ | `'CR'` | Ratio crítico dj/pj | `due_dates` |
1500
+ | `'FIFO'` | Orden de llegada (línea base) | — |
1501
+
1502
+ **Atributos de `ScheduleResult`**
1503
+
1504
+ | Atributo | Descripción |
1505
+ |----------|-------------|
1506
+ | `rule` | Regla utilizada |
1507
+ | `sequence` | Lista de nombres en orden de procesamiento |
1508
+ | `jobs` | Lista de `JobSchedule` (por trabajo) |
1509
+ | `makespan` | Cmax = suma de tiempos de proceso |
1510
+ | `total_completion_time` | ΣCj |
1511
+ | `total_weighted_completion_time` | ΣwjCj |
1512
+ | `max_lateness` | max(Lj) |
1513
+ | `total_tardiness` | ΣTj |
1514
+ | `n_tardy` | Número de trabajos tarde |
1515
+
1516
+ ```python
1517
+ df = r.to_frame() # columnas: Name, p, d, w, Start, C, L, T, Tardy
1518
+ ```
1519
+
1520
+ ---
1521
+
1522
+ ### Flow-shop de 2 máquinas — `johnson_flowshop`
1523
+
1524
+ El algoritmo de Johnson encuentra la secuencia óptima que minimiza el makespan cuando todos los trabajos pasan primero por M1 y luego por M2.
1525
+
1526
+ ```python
1527
+ m1 = [3, 8, 5, 7, 2] # tiempos en máquina 1
1528
+ m2 = [5, 2, 8, 4, 6] # tiempos en máquina 2
1529
+
1530
+ r = wl.johnson_flowshop(m1, m2)
1531
+ print(r)
1532
+ ```
1533
+
1534
+ ```
1535
+ Sequence : J1 → J5 → J4 → J3 → J2
1536
+ Makespan : 34
1537
+ ```
1538
+
1539
+ ```python
1540
+ df = r.to_frame()
1541
+ # columnas: Job | M1 start | M1 end | M2 start | M2 end
1542
+ ```
1543
+
1544
+ ---
1545
+
1546
+ ## 14. Confiabilidad — `reliability`
1547
+
1548
+ Modelos de confiabilidad con distribución exponencial (tasa de falla constante).
1549
+
1550
+ ### Componente individual — `mtbf_analysis`
1551
+
1552
+ ```python
1553
+ r = wl.mtbf_analysis(failure_rate=0.01, mttr=5.0, t=100)
1554
+ print(r)
1555
+ ```
1556
+
1557
+ ```
1558
+ Topology : component
1559
+ Components : 1
1560
+ Failure rates λ : ['0.01']
1561
+ MTBF : 100
1562
+ R(t=100) : 0.367879
1563
+ Availability : 95.2381%
1564
+ ```
1565
+
1566
+ ### Sistema en serie — `series_system`
1567
+
1568
+ El sistema falla si **cualquier** componente falla. λ_sys = Σλi.
1569
+
1570
+ ```python
1571
+ r = wl.series_system([0.01, 0.02, 0.03], t=10)
1572
+ print(r.mtbf) # 1/0.06 ≈ 16.67
1573
+ print(r.R_t) # e^{-0.06·10} ≈ 0.549
1574
+ ```
1575
+
1576
+ ### Sistema en paralelo — `parallel_system`
1577
+
1578
+ El sistema opera si **al menos uno** de los componentes opera.
1579
+ R_sys(t) = 1 − ∏(1 − e^{−λi·t}). MTBF calculado numéricamente.
1580
+
1581
+ ```python
1582
+ r = wl.parallel_system([0.01, 0.02], t=50)
1583
+ print(r.R_t) # mayor que el sistema en serie
1584
+ print(r.mtbf) # mayor que cualquier componente individual
1585
+ ```
1586
+
1587
+ ### Sistema k-de-n — `koon_system`
1588
+
1589
+ Opera si al menos **k** de **n** componentes idénticos están en servicio.
1590
+ MTBF exacto = (1/λ) · Σ_{j=k}^{n} (1/j).
1591
+
1592
+ ```python
1593
+ # 2-de-3: requiere al menos 2 de 3 componentes idénticos
1594
+ r = wl.koon_system(n=3, k=2, failure_rate=0.01, t=50)
1595
+ print(r.mtbf) # (1/0.01) * (1/2 + 1/3) ≈ 83.33
1596
+ print(r.R_t)
1597
+ ```
1598
+
1599
+ **Casos especiales**
1600
+ - `k=1` → equivale a `parallel_system` con n componentes idénticos.
1601
+ - `k=n` → equivale a `series_system` con n componentes idénticos.
1602
+
1603
+ **Atributos de `ReliabilityResult`**
1604
+
1605
+ | Atributo | Descripción |
1606
+ |----------|-------------|
1607
+ | `topology` | `'component'`, `'series'`, `'parallel'`, `'k-of-n'` |
1608
+ | `n_components` | Número de componentes |
1609
+ | `failure_rates` | Lista de λi |
1610
+ | `mtbf` | MTBF del sistema |
1611
+ | `R_t` | Confiabilidad R(t) si se proporcionó `t` |
1612
+ | `availability` | Disponibilidad estacionaria A si se proporcionó `mttr` |
1613
+ | `mttr` | Tiempo medio de reparación (si se proporcionó) |
1614
+
1615
+ ```python
1616
+ df = r.to_frame() # columnas: Topology, Components, MTBF[, R(t), Availability]
1617
+ r.R(t=200) # evalúa R(t) en cualquier tiempo posterior
1618
+ ```
1619
+
1620
+ ---
1621
+
1622
+ ## 22. Referencia de módulos
1328
1623
 
1329
1624
  | Módulo | Funciones y clases principales |
1330
1625
  |---|---|
1331
1626
  | `queuing` | `mm1`, `mmc`, `md1`, `kingman`, `mg1`, `littles_law`, `QueueResult`, `cv2_normal`, `cv2_triangular`, `cv2_uniform`, `cv2_erlang`, `cv2_gamma`, `cv2_lognormal`, `cv2_weibull` |
1332
1627
  | `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
1628
  | `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` |
1629
+ | `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `wagner_whitin`, `rq_policy`, `rs_policy`, `exchange_curve`, `safety_stock_curve`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult`, `RQPolicyResult`, `RSPolicyResult`, `ExchangeCurveResult`, `SafetyStockCurveResult` |
1630
+ | `scheduling` | `schedule_single`, `johnson_flowshop`, `ScheduleResult`, `JobSchedule`, `FlowShopResult` |
1631
+ | `reliability` | `mtbf_analysis`, `series_system`, `parallel_system`, `koon_system`, `ReliabilityResult` |
1335
1632
  | `network` | `jackson_network`, `JacksonResult`, `StationMetrics` |
1336
1633
  | `operations` | `oee`, `utilization_efficiency`, `unit_cost`, `OEEResult`, `UtilizationResult`, `UnitCostResult` |
1337
1634
  | `bottleneck` | `bottleneck_analysis`, `BottleneckResult`, `StationResult` |
@@ -1341,7 +1638,7 @@ Wq : 0.3 (avg wait time in queue)
1341
1638
 
1342
1639
  ---
1343
1640
 
1344
- ## 20. Requisitos
1641
+ ## 23. Requisitos
1345
1642
 
1346
1643
  ```
1347
1644
  Python ≥ 3.9