most-queue 1.25__tar.gz → 1.27__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.

Potentially problematic release.


This version of most-queue might be problematic. Click here for more details.

Files changed (84) hide show
  1. {most_queue-1.25 → most_queue-1.27}/PKG-INFO +1 -1
  2. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/qs_sim.py +121 -65
  3. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/rand_destribution.py +62 -34
  4. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mg1_warm_calc.py +3 -2
  5. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmn_with_h2_cold_and_h2_warmup.py +7 -3
  6. {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/PKG-INFO +1 -1
  7. {most_queue-1.25 → most_queue-1.27}/pyproject.toml +1 -1
  8. {most_queue-1.25 → most_queue-1.27}/setup.py +1 -1
  9. {most_queue-1.25 → most_queue-1.27}/LICENSE +0 -0
  10. {most_queue-1.25 → most_queue-1.27}/README.md +0 -0
  11. {most_queue-1.25 → most_queue-1.27}/most_queue/__init__.py +0 -0
  12. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/__init__.py +0 -0
  13. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/batch_sim.py +0 -0
  14. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/fj_delta_sim.py +0 -0
  15. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/fj_sim.py +0 -0
  16. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/flow_sum_sim.py +0 -0
  17. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/impatient_queue_sim.py +0 -0
  18. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/priority_network.py +0 -0
  19. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/priority_queue_sim.py +0 -0
  20. {most_queue-1.25 → most_queue-1.27}/most_queue/sim/queue_finite_source_sim.py +0 -0
  21. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/__init__.py +0 -0
  22. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/ek_d_n.py +0 -0
  23. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/fj_calc.py +0 -0
  24. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/fj_im.py +0 -0
  25. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/flow_sum.py +0 -0
  26. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/gi_m_1_calc.py +0 -0
  27. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/gi_m_n_calc.py +0 -0
  28. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/m_d_n_calc.py +0 -0
  29. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/m_h2_h2warm.py +0 -0
  30. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/m_ph_n_prty.py +0 -0
  31. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mg1_calc.py +0 -0
  32. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mg1_warm_calc.py +0 -0
  33. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mgn_tt.py +0 -0
  34. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mmn3_pnz_cox_approx.py +0 -0
  35. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mmn_prty_pnz_approx.py +0 -0
  36. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/network_im_prty.py +0 -0
  37. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/smo_im.py +0 -0
  38. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/smo_im_prty.py +0 -0
  39. {most_queue-1.25 → most_queue-1.27}/most_queue/tests/weibull.py +0 -0
  40. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/__init__.py +0 -0
  41. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/batch_mm1.py +0 -0
  42. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/convolution_sum_calc.py +0 -0
  43. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/diff5dots.py +0 -0
  44. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/ek_d_n_calc.py +0 -0
  45. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/engset_model.py +0 -0
  46. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/fj_calc.py +0 -0
  47. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/flow_sum.py +0 -0
  48. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/generate_pareto_noise.py +0 -0
  49. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/gi_m_1_calc.py +0 -0
  50. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/gi_m_n_calc.py +0 -0
  51. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/impatience_calc.py +0 -0
  52. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_d_n_calc.py +0 -0
  53. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_h2_h2warm.py +0 -0
  54. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_h2_n_with_h2_cold_and_h2_warmup.py +0 -0
  55. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_ph_n_prty.py +0 -0
  56. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mg1_calc.py +0 -0
  57. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mgn_tt.py +0 -0
  58. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mgn_with_h2_delay_cold_warm.py +0 -0
  59. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmn3_pnz_cox_approx.py +0 -0
  60. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmn_prty_pnz_approx.py +0 -0
  61. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmnr_calc.py +0 -0
  62. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/network_calc.py +0 -0
  63. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/network_viewer.py +0 -0
  64. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/passage_time.py +0 -0
  65. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/priority_calc.py +0 -0
  66. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/q_poisson_arrival_calc.py +0 -0
  67. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/student_stat.py +0 -0
  68. {most_queue-1.25 → most_queue-1.27}/most_queue/theory/weibull.py +0 -0
  69. {most_queue-1.25 → most_queue-1.27}/most_queue/utils/__init__.py +0 -0
  70. {most_queue-1.25 → most_queue-1.27}/most_queue/utils/approx_cdf_make.py +0 -0
  71. {most_queue-1.25 → most_queue-1.27}/most_queue/utils/binom_probs.py +0 -0
  72. {most_queue-1.25 → most_queue-1.27}/most_queue/utils/tables.py +0 -0
  73. {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/__init__.py +0 -0
  74. {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/smo_im_vis.py +0 -0
  75. {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/__init__.py +0 -0
  76. {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/result_table.py +0 -0
  77. {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/settings_window.py +0 -0
  78. {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/splash_screen.py +0 -0
  79. {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/SOURCES.txt +0 -0
  80. {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/dependency_links.txt +0 -0
  81. {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/not-zip-safe +0 -0
  82. {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/requires.txt +0 -0
  83. {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/top_level.txt +0 -0
  84. {most_queue-1.25 → most_queue-1.27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: most_queue
3
- Version: 1.25
3
+ Version: 1.27
4
4
  Summary: Software package for calculation and simulation of queuing systems
5
5
  Home-page: https://github.com/xabarov/mps
6
6
  Author: Xabarov Roman
@@ -1,6 +1,6 @@
1
1
  import numpy as np
2
2
 
3
- import rand_destribution as rd
3
+ import most_queue.sim.rand_destribution as rd
4
4
  import math
5
5
  from tqdm import tqdm
6
6
  import time
@@ -39,6 +39,8 @@ class QueueingSystemSimulator:
39
39
  self.verbose = verbose # выводить ли текстовые сообщения о работе
40
40
  self.cuda = cuda # использование CUDA при ИМ для генерации ПСЧ
41
41
 
42
+ self.generator = np.random.default_rng()
43
+
42
44
  self.free_channels = self.n
43
45
  self.num_of_states = 100000
44
46
  self.load = 0 # коэффициент загрузки системы
@@ -85,14 +87,25 @@ class QueueingSystemSimulator:
85
87
  self.is_set_warm = False
86
88
  self.is_start_warm = False
87
89
  self.end_warm_time = 1e16
90
+ self.warm_prob = 0
91
+ self.warm_start_mom = 0
92
+ self.warm_starts_times = 0
93
+ self.warm_after_cold_starts = 0
88
94
  # Cold
89
95
  self.is_set_cold = False
90
96
  self.is_start_cold = False
91
97
  self.end_cold_time = 1e16
98
+ self.cold_start_mom = 0
99
+ self.cold_prob = 0
100
+ self.cold_starts_times = 0
92
101
  # Delay
93
102
  self.is_set_cold_delay = False
94
103
  self.is_start_cold_delay = False
95
104
  self.end_cold_delay_time = 1e16
105
+ self.cold_delay_start_mom = 0
106
+ self.cold_delay_prob = 0
107
+ self.cold_delay_starts_times = 0
108
+
96
109
 
97
110
  def set_warm(self, params, types):
98
111
  """
@@ -108,22 +121,23 @@ class QueueingSystemSimulator:
108
121
  Равномерное 'Uniform' [mean, half_interval]
109
122
  Нормальное 'Norm' [mean, standard_deviation]
110
123
  """
124
+
111
125
  if types == "M":
112
- self.warm_dist = rd.Exp_dist(params)
126
+ self.warm_dist = rd.Exp_dist(params, generator=self.generator)
113
127
  elif types == "H":
114
- self.warm_dist = rd.H2_dist(params)
128
+ self.warm_dist = rd.H2_dist(params, generator=self.generator)
115
129
  elif types == "E":
116
- self.warm_dist = rd.Erlang_dist(params)
130
+ self.warm_dist = rd.Erlang_dist(params, generator=self.generator)
117
131
  elif types == "Gamma":
118
- self.warm_dist = rd.Gamma(params)
132
+ self.warm_dist = rd.Gamma(params, generator=self.generator)
119
133
  elif types == "C":
120
- self.warm_dist = rd.Cox_dist(params)
134
+ self.warm_dist = rd.Cox_dist(params, generator=self.generator)
121
135
  elif types == "Pa":
122
- self.warm_dist = rd.Pareto_dist(params)
136
+ self.warm_dist = rd.Pareto_dist(params, generator=self.generator)
123
137
  elif types == "Unifrorm":
124
- self.warm_dist = rd.Uniform_dist(params)
138
+ self.warm_dist = rd.Uniform_dist(params, generator=self.generator)
125
139
  elif types == "Norm":
126
- self.warm_dist = rd.Normal_dist(params)
140
+ self.warm_dist = rd.Normal_dist(params, generator=self.generator)
127
141
  elif types == "D":
128
142
  self.warm_dist = rd.Det_dist(params)
129
143
  else:
@@ -150,21 +164,21 @@ class QueueingSystemSimulator:
150
164
  """
151
165
 
152
166
  if types == "M":
153
- self.cold_dist = rd.Exp_dist(params)
167
+ self.cold_dist = rd.Exp_dist(params, generator=self.generator)
154
168
  elif types == "H":
155
- self.cold_dist = rd.H2_dist(params)
169
+ self.cold_dist = rd.H2_dist(params, generator=self.generator)
156
170
  elif types == "E":
157
- self.cold_dist = rd.Erlang_dist(params)
171
+ self.cold_dist = rd.Erlang_dist(params, generator=self.generator)
158
172
  elif types == "Gamma":
159
- self.cold_dist = rd.Gamma(params)
173
+ self.cold_dist = rd.Gamma(params, generator=self.generator)
160
174
  elif types == "C":
161
- self.cold_dist = rd.Cox_dist(params)
175
+ self.cold_dist = rd.Cox_dist(params, generator=self.generator)
162
176
  elif types == "Pa":
163
- self.cold_dist = rd.Pareto_dist(params)
177
+ self.cold_dist = rd.Pareto_dist(params, generator=self.generator)
164
178
  elif types == "Unifrorm":
165
- self.cold_dist = rd.Uniform_dist(params)
179
+ self.cold_dist = rd.Uniform_dist(params, generator=self.generator)
166
180
  elif types == "Norm":
167
- self.cold_dist = rd.Normal_dist(params)
181
+ self.cold_dist = rd.Normal_dist(params, generator=self.generator)
168
182
  elif types == "D":
169
183
  self.cold_dist = rd.Det_dist(params)
170
184
  else:
@@ -195,21 +209,21 @@ class QueueingSystemSimulator:
195
209
  "Необходимо сперва задать время охлаждения. Используйте метод set_cold()")
196
210
 
197
211
  if types == "M":
198
- self.cold_delay_dist = rd.Exp_dist(params)
212
+ self.cold_delay_dist = rd.Exp_dist(params, generator=self.generator)
199
213
  elif types == "H":
200
- self.cold_delay_dist = rd.H2_dist(params)
214
+ self.cold_delay_dist = rd.H2_dist(params, generator=self.generator)
201
215
  elif types == "E":
202
- self.cold_delay_dist = rd.Erlang_dist(params)
216
+ self.cold_delay_dist = rd.Erlang_dist(params, generator=self.generator)
203
217
  elif types == "Gamma":
204
- self.cold_delay_dist = rd.Gamma(params)
218
+ self.cold_delay_dist = rd.Gamma(params, generator=self.generator)
205
219
  elif types == "C":
206
- self.cold_delay_dist = rd.Cox_dist(params)
220
+ self.cold_delay_dist = rd.Cox_dist(params, generator=self.generator)
207
221
  elif types == "Pa":
208
- self.cold_delay_dist = rd.Pareto_dist(params)
222
+ self.cold_delay_dist = rd.Pareto_dist(params, generator=self.generator)
209
223
  elif types == "Unifrorm":
210
- self.cold_delay_dist = rd.Uniform_dist(params)
224
+ self.cold_delay_dist = rd.Uniform_dist(params, generator=self.generator)
211
225
  elif types == "Norm":
212
- self.cold_delay_dist = rd.Normal_dist(params)
226
+ self.cold_delay_dist = rd.Normal_dist(params, generator=self.generator)
213
227
  elif types == "D":
214
228
  self.cold_delay_dist = rd.Det_dist(params)
215
229
  else:
@@ -239,21 +253,21 @@ class QueueingSystemSimulator:
239
253
  self.is_set_source_params = True
240
254
 
241
255
  if self.source_types == "M":
242
- self.source = rd.Exp_dist(self.source_params)
256
+ self.source = rd.Exp_dist(self.source_params, generator=self.generator)
243
257
  elif self.source_types == "H":
244
- self.source = rd.H2_dist(self.source_params)
258
+ self.source = rd.H2_dist(self.source_params, generator=self.generator)
245
259
  elif self.source_types == "E":
246
- self.source = rd.Erlang_dist(self.source_params)
260
+ self.source = rd.Erlang_dist(self.source_params, generator=self.generator)
247
261
  elif self.source_types == "C":
248
- self.source = rd.Cox_dist(self.source_params)
262
+ self.source = rd.Cox_dist(self.source_params, generator=self.generator)
249
263
  elif self.source_types == "Pa":
250
- self.source = rd.Pareto_dist(self.source_params)
264
+ self.source = rd.Pareto_dist(self.source_params, generator=self.generator)
251
265
  elif self.source_types == "Gamma":
252
- self.source = rd.Gamma(self.source_params)
266
+ self.source = rd.Gamma(self.source_params, generator=self.generator)
253
267
  elif self.source_types == "Uniform":
254
- self.source = rd.Uniform_dist(self.source_params)
268
+ self.source = rd.Uniform_dist(self.source_params, generator=self.generator)
255
269
  elif self.source_types == "Norm":
256
- self.source = rd.Normal_dist(self.source_params)
270
+ self.source = rd.Normal_dist(self.source_params, generator=self.generator)
257
271
  elif self.source_types == "D":
258
272
  self.source = rd.Det_dist(self.source_params)
259
273
  else:
@@ -281,7 +295,7 @@ class QueueingSystemSimulator:
281
295
  self.is_set_server_params = True
282
296
 
283
297
  for i in range(self.n):
284
- self.servers.append(Server(self.server_params, self.server_types))
298
+ self.servers.append(Server(self.server_params, self.server_types, generator=self.generator))
285
299
 
286
300
  def calc_load(self):
287
301
 
@@ -376,12 +390,13 @@ class QueueingSystemSimulator:
376
390
 
377
391
  return l * b1 / self.n
378
392
 
379
- def send_task_to_channel(self, is_warm_start):
393
+ def send_task_to_channel(self, is_warm_start=False):
380
394
  # Отправляет заявку в канал обслуживания
381
395
  # is_warm_start- нужен ли разогрев
382
396
  for s in self.servers:
383
397
  if s.is_free:
384
398
  self.taked += 1
399
+ self.refresh_w_stat(0)
385
400
 
386
401
  s.start_service(Task(self.ttek), self.ttek, is_warm_start)
387
402
  self.free_channels -= 1
@@ -443,7 +458,8 @@ class QueueingSystemSimulator:
443
458
  # Заявка пришла раньше окончания времени задержки начала охлаждения
444
459
  self.is_start_cold_delay = False
445
460
  self.end_cold_delay_time = 1e16
446
- self.send_task_to_channel(False)
461
+ self.cold_delay_prob += self.ttek - self.cold_delay_start_mom
462
+ self.send_task_to_channel()
447
463
  return
448
464
 
449
465
  if self.is_set_warm:
@@ -459,23 +475,37 @@ class QueueingSystemSimulator:
459
475
  # 1. В режиме разогрева -> отправляем заявку в очередь
460
476
  self.send_task_to_queue()
461
477
  else:
462
- if len(self.queue) == 0 and self.free_channels == self.n:
463
- # 2. Она пустая и была выклюбчена после охлаждения. Запускаем разогрев
478
+ if self.free_channels == self.n:
479
+ # 2. Она пустая и была выключена после охлаждения. Запускаем разогрев
464
480
  self.start_warm()
465
481
  # Отправляем заявку в очередь
466
482
  self.send_task_to_queue()
467
483
  else:
468
484
  # 3. Не пустая и разогретая -> тогда оправляем на обслуживание
469
- self.send_task_to_channel(False)
485
+ self.send_task_to_channel()
470
486
 
471
487
  else:
472
488
  # Без разогрева. Отправляем заявку в канал обслуживания
473
- self.send_task_to_channel(False)
489
+ self.send_task_to_channel()
474
490
 
475
491
  def start_warm(self):
476
492
  self.is_start_warm = True
493
+ self.warm_start_mom = self.ttek
494
+ self.warm_starts_times += 1
477
495
  self.end_warm_time = self.ttek + self.warm_dist.generate()
478
496
 
497
+ def start_cold(self):
498
+ self.is_start_cold = True
499
+ self.cold_start_mom = self.ttek
500
+ self.cold_starts_times += 1
501
+ self.end_cold_time = self.ttek + self.cold_dist.generate()
502
+
503
+ def start_cold_delay(self):
504
+ self.is_start_cold_delay = True
505
+ self.cold_delay_start_mom = self.ttek
506
+ self.cold_delay_starts_times += 1
507
+ self.end_cold_delay_time = self.ttek + self.cold_delay_dist.generate()
508
+
479
509
  def serving(self, c):
480
510
  """
481
511
  Дейтсвия по поступлению заявки на обслуживание
@@ -492,26 +522,26 @@ class QueueingSystemSimulator:
492
522
  self.total += 1
493
523
  self.free_channels += 1
494
524
  self.refresh_v_stat(self.ttek - end_ts.arr_time)
495
- self.refresh_w_stat(end_ts.wait_time)
525
+
496
526
  self.in_sys -= 1
497
527
 
528
+ # ПНЗ
498
529
  if len(self.queue) == 0 and self.free_channels == 1:
499
530
  if self.in_sys == self.n - 1:
500
531
  # Конец ПНЗ
501
532
  self.ppnz_moments += 1
502
533
  self.refresh_ppnz_stat(self.ttek - self.start_ppnz)
503
534
 
535
+ # COLD
504
536
  if self.is_set_cold:
505
537
  if len(self.queue) == 0 and self.free_channels == self.n:
506
538
  # Система стала пустой.
507
539
  # 1. Если задана задержка начала охлаждения - разыгрываем время ее окончания
508
540
  # 2. Если нет - запускаем охлаждение
509
541
  if self.is_set_cold_delay:
510
- self.is_start_cold_delay = True
511
- self.end_cold_delay_time = self.ttek + self.cold_delay_dist.generate()
542
+ self.start_cold_delay()
512
543
  else:
513
- self.is_start_cold = True
514
- self.end_cold_time = self.ttek + self.cold_dist.generate()
544
+ self.start_cold()
515
545
 
516
546
  if len(self.queue) != 0:
517
547
  self.send_head_of_queue_to_channel(c)
@@ -523,13 +553,16 @@ class QueueingSystemSimulator:
523
553
  self.start_ppnz = self.ttek
524
554
 
525
555
  self.taked += 1
556
+
526
557
  que_ts.wait_time += self.ttek - que_ts.start_waiting_time
558
+ self.refresh_w_stat(que_ts.wait_time)
559
+
527
560
  self.servers[channel_num].start_service(que_ts, self.ttek)
528
561
  self.free_channels -= 1
529
562
 
530
563
  def calc_next_event_time(self):
531
564
 
532
- serv_earl = 1e10
565
+ serv_earl = 1e16
533
566
 
534
567
  for c in range(self.n):
535
568
  if self.servers[c].time_to_end_service < serv_earl:
@@ -547,6 +580,8 @@ class QueueingSystemSimulator:
547
580
  self.ttek = self.end_warm_time
548
581
  self.t_old = self.ttek
549
582
 
583
+ self.warm_prob += self.ttek - self.warm_start_mom
584
+
550
585
  self.is_start_warm = False
551
586
  self.end_warm_time = 1e16
552
587
 
@@ -561,13 +596,17 @@ class QueueingSystemSimulator:
561
596
  self.ttek = self.end_cold_time
562
597
  self.t_old = self.ttek
563
598
 
599
+ self.cold_prob += self.ttek - self.cold_start_mom
600
+
564
601
  self.is_start_cold = False
565
602
  self.end_cold_time = 1e16
566
603
 
567
604
  if self.is_set_warm:
568
605
  if len(self.queue) != 0:
569
606
  # Запускаем разогрев только если в очереди скопились заявки.
607
+ self.warm_after_cold_starts += 1
570
608
  self.start_warm()
609
+
571
610
  else:
572
611
  # Отправляем n заявок из очереди в каналы
573
612
  for i in range(self.n):
@@ -580,6 +619,8 @@ class QueueingSystemSimulator:
580
619
  self.ttek = self.end_cold_delay_time
581
620
  self.t_old = self.ttek
582
621
 
622
+ self.cold_delay_prob += self.ttek - self.cold_delay_start_mom
623
+
583
624
  self.is_start_cold_delay = False
584
625
  self.end_cold_delay_time = 1e16
585
626
 
@@ -671,15 +712,30 @@ class QueueingSystemSimulator:
671
712
 
672
713
  self.time_spent = time.process_time() - start
673
714
 
715
+ def get_warmup_prob(self):
716
+
717
+ return self.warm_prob/self.ttek
718
+
719
+ def get_cold_prob(self):
720
+
721
+ return self.cold_prob / self.ttek
722
+
723
+ def get_cold_delay_prob(self):
724
+
725
+ return self.cold_delay_prob / self.ttek
726
+
674
727
  def refresh_ppnz_stat(self, new_a):
728
+
675
729
  for i in range(3):
676
730
  self.ppnz[i] = self.ppnz[i] * (1.0 - (1.0 / self.ppnz_moments)) + math.pow(new_a, i + 1) / self.ppnz_moments
677
731
 
678
732
  def refresh_v_stat(self, new_a):
733
+
679
734
  for i in range(3):
680
735
  self.v[i] = self.v[i] * (1.0 - (1.0 / self.served)) + math.pow(new_a, i + 1) / self.served
681
736
 
682
737
  def refresh_w_stat(self, new_a):
738
+
683
739
  for i in range(3):
684
740
  self.w[i] = self.w[i] * (1.0 - (1.0 / self.taked)) + math.pow(new_a, i + 1) / self.taked
685
741
 
@@ -754,7 +810,7 @@ class Task:
754
810
  """
755
811
  self.arr_time = arr_time
756
812
 
757
- self.start_waiting_time = -1
813
+ self.start_waiting_time = 0
758
814
 
759
815
  self.wait_time = 0
760
816
 
@@ -773,27 +829,27 @@ class Server:
773
829
  """
774
830
  id = 0
775
831
 
776
- def __init__(self, params, types):
832
+ def __init__(self, params, types, generator=None):
777
833
  """
778
834
  params - параметры распределения
779
835
  types - тип распределения
780
836
  """
781
837
  if types == "M":
782
- self.dist = rd.Exp_dist(params)
838
+ self.dist = rd.Exp_dist(params, generator=generator)
783
839
  elif types == "H":
784
- self.dist = rd.H2_dist(params)
840
+ self.dist = rd.H2_dist(params, generator=generator)
785
841
  elif types == "E":
786
- self.dist = rd.Erlang_dist(params)
842
+ self.dist = rd.Erlang_dist(params, generator=generator)
787
843
  elif types == "C":
788
- self.dist = rd.Cox_dist(params)
844
+ self.dist = rd.Cox_dist(params, generator=generator)
789
845
  elif types == "Gamma":
790
- self.dist = rd.Gamma(params)
846
+ self.dist = rd.Gamma(params, generator=generator)
791
847
  elif types == "Pa":
792
- self.dist = rd.Pareto_dist(params)
848
+ self.dist = rd.Pareto_dist(params, generator=generator)
793
849
  elif types == "Uniform":
794
- self.dist = rd.Uniform_dist(params)
850
+ self.dist = rd.Uniform_dist(params, generator=generator)
795
851
  elif types == "Norm":
796
- self.dist = rd.Normal_dist(params)
852
+ self.dist = rd.Normal_dist(params, generator=generator)
797
853
  elif types == "D":
798
854
  self.dist = rd.Det_dist(params)
799
855
  else:
@@ -809,24 +865,24 @@ class Server:
809
865
  self.types_warm = None
810
866
  self.warm_dist = None
811
867
 
812
- def set_warm(self, params, types):
868
+ def set_warm(self, params, types, generator=None):
813
869
 
814
870
  if types == "M":
815
- self.warm_dist = rd.Exp_dist(params)
871
+ self.warm_dist = rd.Exp_dist(params, generator=generator)
816
872
  elif types == "H":
817
- self.warm_dist = rd.H2_dist(params)
873
+ self.warm_dist = rd.H2_dist(params, generator=generator)
818
874
  elif types == "E":
819
- self.warm_dist = rd.Erlang_dist(params)
875
+ self.warm_dist = rd.Erlang_dist(params, generator=generator)
820
876
  elif types == "Gamma":
821
- self.warm_dist = rd.Gamma(params)
877
+ self.warm_dist = rd.Gamma(params, generator=generator)
822
878
  elif types == "C":
823
- self.warm_dist = rd.Cox_dist(params)
879
+ self.warm_dist = rd.Cox_dist(params, generator=generator)
824
880
  elif types == "Pa":
825
- self.warm_dist = rd.Pareto_dist(params)
881
+ self.warm_dist = rd.Pareto_dist(params, generator=generator)
826
882
  elif types == "Unifrorm":
827
- self.warm_dist = rd.Uniform_dist(params)
883
+ self.warm_dist = rd.Uniform_dist(params, generator=generator)
828
884
  elif types == "Norm":
829
- self.warm_dist = rd.Normal_dist(params)
885
+ self.warm_dist = rd.Normal_dist(params, generator=generator)
830
886
  elif types == "D":
831
887
  self.warm_dist = rd.Det_dist(params)
832
888
  else:
@@ -62,7 +62,7 @@ def generate_e_jit(rng_states, r, mu, out):
62
62
 
63
63
 
64
64
  class Normal_dist:
65
- def __init__(self, params):
65
+ def __init__(self, params, generator=None):
66
66
  """
67
67
  Принимает список параметров в следующей последовательности:
68
68
  mean - среднее значение
@@ -72,26 +72,28 @@ class Normal_dist:
72
72
  self.mean = params[0]
73
73
  self.sko = params[1]
74
74
  self.type = 'Normal'
75
+ self.generator = generator
75
76
 
76
77
  def generate(self):
77
78
  """
78
79
  Генерация псевдо-случайных чисел
79
80
  """
80
81
 
81
- return self.generate_static(self.mean, self.sko)
82
+ return self.generate_static(self.mean, self.sko, self.generator)
82
83
 
83
84
  @staticmethod
84
- def generate_static(mean, sko):
85
+ def generate_static(mean, sko, generator=None):
85
86
  """
86
87
  Генерация псевдо-случайных чисел
87
88
  Статический метод
88
89
  """
89
-
90
+ if generator:
91
+ return generator.normal(mean, sko)
90
92
  return np.random.normal(mean, sko)
91
93
 
92
94
 
93
95
  class Uniform_dist:
94
- def __init__(self, params):
96
+ def __init__(self, params, generator=None):
95
97
  """
96
98
  Принимает список параметров в следующей последовательности:
97
99
  mean - среднее значение
@@ -101,6 +103,7 @@ class Uniform_dist:
101
103
  self.mean = params[0]
102
104
  self.half_interval = params[1]
103
105
  self.type = 'Uniform'
106
+ self.generator = generator
104
107
 
105
108
  def generate(self):
106
109
  """
@@ -108,17 +111,17 @@ class Uniform_dist:
108
111
  Вызов из экземпляра класса
109
112
  """
110
113
 
111
- return self.generate_static(self.mean, self.half_interval)
114
+ return self.generate_static(self.mean, self.half_interval, self.generator)
112
115
 
113
116
  @staticmethod
114
- def generate_static(mean, half_interval):
117
+ def generate_static(mean, half_interval, generator=None):
115
118
  """
116
119
  Генерация псевдо-случайных чисел, подчиненных равномерному распределению
117
120
  Статический метод
118
121
  """
119
-
120
- r = np.random.uniform(mean - half_interval, mean + half_interval)
121
- return r
122
+ if generator:
123
+ return generator.uniform(mean - half_interval, mean + half_interval)
124
+ return np.random.uniform(mean - half_interval, mean + half_interval)
122
125
 
123
126
  @staticmethod
124
127
  def calc_theory_moments(mean, half_interval, num=3):
@@ -193,7 +196,7 @@ class Uniform_dist:
193
196
 
194
197
 
195
198
  class H2_dist:
196
- def __init__(self, params):
199
+ def __init__(self, params, generator=None):
197
200
  """
198
201
  Принимает список параметров в следующей последовательности - y1, mu1, mu2
199
202
  """
@@ -203,6 +206,7 @@ class H2_dist:
203
206
  self.m2 = params[2]
204
207
  self.params = params
205
208
  self.type = 'H'
209
+ self.generator = generator
206
210
 
207
211
  def generate(self):
208
212
  """
@@ -210,17 +214,22 @@ class H2_dist:
210
214
  Вызов из экземпляра класса
211
215
  """
212
216
 
213
- return self.generate_static(self.y1, self.m1, self.m2)
217
+ return self.generate_static(self.y1, self.m1, self.m2, self.generator)
214
218
 
215
219
  @staticmethod
216
- def generate_static(y1, m1, m2):
220
+ def generate_static(y1, m1, m2, generator=None):
217
221
  """
218
222
  Генерация псевдо-случайных чисел, подчиненных гиперэкспоненциальному распределению 2-го порядка.
219
223
  Статический метод
220
224
  """
221
225
 
222
- r = np.random.rand()
223
- res = -np.log(np.random.rand())
226
+ if generator:
227
+ r = generator.random()
228
+ res = -np.log(generator.random())
229
+ else:
230
+ r = np.random.rand()
231
+ res = -np.log(np.random.rand())
232
+
224
233
  if r < y1:
225
234
  if m1 != 0:
226
235
  res = res / m1
@@ -429,7 +438,7 @@ class Cox_dist:
429
438
  Распределение Кокса 2-го порядка
430
439
  """
431
440
 
432
- def __init__(self, params):
441
+ def __init__(self, params, generator=None):
433
442
  """
434
443
  Принимает список параметров в следующей последовательности - y1, mu1, mu2
435
444
  """
@@ -438,22 +447,30 @@ class Cox_dist:
438
447
  self.m2 = params[2]
439
448
  self.params = params
440
449
  self.type = 'C'
450
+ self.generator = generator
441
451
 
442
452
  def generate(self):
443
453
  """
444
454
  Генерация псевдо-случайных чисел, подчиненных распределению Кокса 2-го порядка. Вызов из экземпляра класса
445
455
  """
446
- return self.generate_static(self.y1, self.m1, self.m2)
456
+ return self.generate_static(self.y1, self.m1, self.m2, self.generator)
447
457
 
448
458
  @staticmethod
449
- def generate_static(y1, m1, m2):
459
+ def generate_static(y1, m1, m2, generator):
450
460
  """
451
461
  Генерация псевдо-случайных чисел, подчиненных распределению Кокса 2-го порядка. Статический метод
452
462
  """
453
- r = np.random.rand()
454
- res = (-1.0 / m1) * np.log(np.random.rand())
463
+ if generator:
464
+ r = generator.random()
465
+ res = (-1.0 / m1) * np.log(generator.random())
466
+ else:
467
+ r = np.random.rand()
468
+ res = (-1.0 / m1) * np.log(np.random.rand())
455
469
  if r < y1:
456
- res = res + (-1.0 / m2) * np.log(np.random.rand())
470
+ if generator:
471
+ res = res + (-1.0 / m2) * np.log(generator.random())
472
+ else:
473
+ res = res + (-1.0 / m2) * np.log(np.random.rand())
457
474
  return res
458
475
 
459
476
  @staticmethod
@@ -566,7 +583,7 @@ class Det_dist:
566
583
  class Pareto_dist:
567
584
  "Распределение Парето"
568
585
 
569
- def __init__(self, params):
586
+ def __init__(self, params, generator=None):
570
587
  """
571
588
  Принимает список параметров в следующей последовательности - alpha, K
572
589
  """
@@ -574,9 +591,10 @@ class Pareto_dist:
574
591
  self.k = params[1]
575
592
  self.params = params
576
593
  self.type = 'Pa'
594
+ self.generator = generator
577
595
 
578
596
  def generate(self):
579
- return Pareto_dist.generate_static(self.a, self.k)
597
+ return Pareto_dist.generate_static(self.a, self.k, self.generator)
580
598
 
581
599
  @staticmethod
582
600
  def get_pdf(t, a, k):
@@ -621,7 +639,9 @@ class Pareto_dist:
621
639
  return f
622
640
 
623
641
  @staticmethod
624
- def generate_static(a, k):
642
+ def generate_static(a, k, generator=None):
643
+ if generator:
644
+ return k * math.pow(generator.random(), -1 / a)
625
645
  return k * math.pow(np.random.rand(), -1 / a)
626
646
 
627
647
  @staticmethod
@@ -662,7 +682,7 @@ class Erlang_dist:
662
682
  Распределение Эрланга r-го порядка
663
683
  """
664
684
 
665
- def __init__(self, params):
685
+ def __init__(self, params, generator=None):
666
686
  """"
667
687
  Принимает список параметров в следующей последовательности - r, mu
668
688
  """
@@ -670,21 +690,25 @@ class Erlang_dist:
670
690
  self.mu = params[1]
671
691
  self.params = params
672
692
  self.type = 'E'
693
+ self.generator = generator
673
694
 
674
695
  def generate(self):
675
696
  """
676
697
  Генератор псевдо-случайных чисел
677
698
  """
678
- return self.generate_static(self.r, self.mu)
699
+ return self.generate_static(self.r, self.mu, self.generator)
679
700
 
680
701
  @staticmethod
681
- def generate_static(r, mu):
702
+ def generate_static(r, mu, generator=None):
682
703
  """
683
704
  Генератор псевдо-случайных чисел. Статический метод
684
705
  """
685
706
  prod = 1
686
707
  for i in range(r):
687
- prod *= np.random.rand()
708
+ if generator:
709
+ prod *= generator.random()
710
+ else:
711
+ prod *= np.random.rand()
688
712
 
689
713
  return -(1.0 / mu) * np.log(prod)
690
714
 
@@ -750,17 +774,18 @@ class Exp_dist:
750
774
  Экспоненциальное распределение
751
775
  """
752
776
 
753
- def __init__(self, mu):
777
+ def __init__(self, mu, generator=None):
754
778
  self.erl = Erlang_dist([1, mu])
755
779
  self.params = mu
756
780
  self.type = 'M'
781
+ self.generator = generator
757
782
 
758
783
  def generate(self):
759
784
  return self.erl.generate()
760
785
 
761
786
  @staticmethod
762
- def generate_static(mu):
763
- return Erlang_dist.generate_static(1, mu)
787
+ def generate_static(mu, generator=None):
788
+ return Erlang_dist.generate_static(1, mu, generator)
764
789
 
765
790
  @staticmethod
766
791
  def calc_theory_moments(mu, count=3):
@@ -776,7 +801,7 @@ class Gamma:
776
801
  Гамма-распределение
777
802
  """
778
803
 
779
- def __init__(self, params):
804
+ def __init__(self, params, generator=None):
780
805
  self.mu = params[0]
781
806
  self.alpha = params[1]
782
807
  self.is_corrective = False
@@ -787,6 +812,7 @@ class Gamma:
787
812
  self.g.append(params[i])
788
813
  self.params = params
789
814
  self.type = 'Gamma'
815
+ self.generator = generator
790
816
 
791
817
  @staticmethod
792
818
  def get_mu_alpha(b):
@@ -839,11 +865,13 @@ class Gamma:
839
865
  return mu, alpha
840
866
 
841
867
  def generate(self):
842
- return self.generate_static(self.mu, self.alpha)
868
+ return self.generate_static(self.mu, self.alpha, self.generator)
843
869
 
844
870
  @staticmethod
845
- def generate_static(mu, alpha):
871
+ def generate_static(mu, alpha, generator=None):
846
872
  theta = 1 / mu
873
+ if generator:
874
+ return generator.gamma(alpha, theta)
847
875
  return np.random.gamma(alpha, theta)
848
876
 
849
877
  @staticmethod
@@ -32,8 +32,9 @@ if __name__ == '__main__':
32
32
  from most_queue.utils.tables import times_print, probs_print
33
33
 
34
34
  l = 1
35
- b1 = 0.8
36
- b1_warm = 0.9
35
+ ro = 0.2 # коэфф загрузки
36
+ b1 = n * ro / l # ср время обслуживания
37
+ b1_warm = n * 0.3 / l # ср время разогрева
37
38
  coev = 1.3
38
39
  b_params = rd.H2_dist.get_params_by_mean_and_coev(b1, coev)
39
40
  b = rd.H2_dist.calc_theory_moments(*b_params, 4)
@@ -593,9 +593,9 @@ if __name__ == "__main__":
593
593
  b1_cold = n * 0.0001 / l # ср время охлаждения
594
594
  num_of_jobs = 1000000 # число обсл заявок ИМ
595
595
  b_coev_warm = 1.2 # коэфф вариации времени разогрева
596
- b_coev_cold = 1.3 # коэфф вариации времени охлаждения
596
+ b_coev_cold = 1.2 # коэфф вариации времени охлаждения
597
597
  buff = None
598
- verbose = True
598
+ verbose = False
599
599
 
600
600
  b_w = [0.0] * 3
601
601
  b_w[0] = b1_warm
@@ -618,7 +618,7 @@ if __name__ == "__main__":
618
618
 
619
619
  smo.set_servers(mu, 'M')
620
620
  smo.set_warm(gamma_params_warm, 'Gamma')
621
- smo.set_cold(gamma_params_cold, 'Gamma')
621
+ # smo.set_cold(gamma_params_cold, 'Gamma')
622
622
 
623
623
  smo.run(num_of_jobs)
624
624
  p = smo.get_p()
@@ -640,6 +640,10 @@ if __name__ == "__main__":
640
640
  tt_time = time.process_time() - tt_start
641
641
  num_of_iter = tt.num_of_iter_
642
642
 
643
+ print('warms starts', smo.warm_starts_times)
644
+ print('warms after cold starts', smo.warm_after_cold_starts)
645
+ print('cold starts', smo.cold_starts_times)
646
+
643
647
  print("\nСравнение результатов расчета методом Такахаси-Таками и ИМ.\n"
644
648
  "ИМ - M/Gamma/{0:^2d} с Gamma разогревом\nТакахаси-Таками - M/M/{0:^2d} c H2-разогревом и H2-охлаждением "
645
649
  "с комплексными параметрами\n"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: most-queue
3
- Version: 1.25
3
+ Version: 1.27
4
4
  Summary: Software package for calculation and simulation of queuing systems
5
5
  Home-page: https://github.com/xabarov/mps
6
6
  Author: Xabarov Roman
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "most_queue"
3
- version = "1.25"
3
+ version = "1.27"
4
4
  authors = [
5
5
  { name="Xabarov Roman", email="xabarov1985@gmail.com" },
6
6
  ]
@@ -1,7 +1,7 @@
1
1
  from setuptools import setup, find_packages
2
2
 
3
3
  setup(name='most-queue',
4
- version='1.25',
4
+ version='1.27',
5
5
  description="Software package for calculation and simulation of queuing systems",
6
6
  author='Xabarov Roman',
7
7
  author_email='xabarov1985@gmail.com',
File without changes
File without changes
File without changes