most-queue 1.39__tar.gz → 1.40__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.
- {most_queue-1.39 → most_queue-1.40}/PKG-INFO +1 -1
- {most_queue-1.39/most_queue/examples → most_queue-1.40/most_queue}/compare_fj_calc.py +7 -4
- {most_queue-1.39/most_queue/examples → most_queue-1.40/most_queue}/flow_sum.py +2 -2
- {most_queue-1.39/most_queue/utils → most_queue-1.40/most_queue/general_utils}/approx_cdf_make.py +7 -7
- most_queue-1.39/most_queue/theory/convolution_sum_calc.py → most_queue-1.40/most_queue/general_utils/conv.py +24 -23
- {most_queue-1.39/most_queue/utils → most_queue-1.40/most_queue/general_utils}/tables.py +3 -1
- {most_queue-1.39/most_queue/utils → most_queue-1.40/most_queue/general_utils}/vacations_paper_utils.py +3 -1
- most_queue-1.39/most_queue/sim/rand_destribution.py → most_queue-1.40/most_queue/rand_distribution.py +2 -1
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/batch_sim.py +1 -1
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/fj_delta_sim.py +7 -60
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/fj_sim.py +4 -49
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/flow_sum_sim.py +26 -18
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/impatient_queue_sim.py +3 -3
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/priority_network.py +9 -10
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/priority_queue_sim.py +2 -1
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/qs_sim.py +6 -93
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/queue_finite_source_sim.py +11 -38
- {most_queue-1.39/most_queue/sim → most_queue-1.40/most_queue/sim/utils}/distribution_utils.py +16 -6
- most_queue-1.40/most_queue/sim/utils/servers.py +113 -0
- most_queue-1.40/most_queue/sim/utils/tasks.py +70 -0
- {most_queue-1.39/most_queue/theory → most_queue-1.40/most_queue/tests}/__init__.py +0 -0
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_batch.py +6 -8
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_ek_d_n.py +10 -9
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_engset.py +2 -3
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_fj_delta.py +13 -13
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_fj_im.py +9 -9
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_gi_m_1_calc.py +8 -7
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_gi_m_n_calc.py +9 -7
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_impatience.py +6 -6
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_m_d_n_calc.py +3 -3
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_m_h2_h2warm.py +18 -17
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_m_ph_n_prty.py +8 -7
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_mg1_calc.py +5 -4
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_mgn_tt.py +5 -5
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_mgn_with_h2_delay_cold_warm.py +25 -19
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_mmn3_pnz_cox_approx.py +4 -4
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_mmn_h2cold_h2warm.py +22 -18
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_mmn_prty_pnz_approx.py +2 -2
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_network_im_prty.py +6 -8
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_qs_sim_prty.py +10 -10
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_qs_sim_test.py +4 -5
- {most_queue-1.39/most_queue → most_queue-1.40/most_queue/tests}/test_queue_types.py +3 -3
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/engset_model.py +2 -2
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/fj_calc.py +7 -7
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/gi_m_1_calc.py +5 -3
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/gi_m_n_calc.py +4 -4
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/m_h2_h2warm.py +7 -5
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/m_ph_n_prty.py +5 -3
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mg1_calc.py +3 -2
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mg1_warm_calc.py +2 -2
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mgn_tt.py +4 -3
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mgn_with_h2_delay_cold_warm.py +8 -4
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mmn3_pnz_cox_approx.py +7 -6
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mmn_prty_pnz_approx.py +5 -3
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mmn_with_h2_cold_and_h2_warmup.py +6 -4
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/mmnr_calc.py +3 -2
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/network_calc.py +5 -4
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/network_viewer.py +4 -2
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/priority_calc.py +4 -4
- {most_queue-1.39/most_queue/examples → most_queue-1.40/most_queue}/weibull.py +1 -1
- {most_queue-1.39 → most_queue-1.40}/most_queue.egg-info/PKG-INFO +1 -1
- {most_queue-1.39 → most_queue-1.40}/most_queue.egg-info/SOURCES.txt +34 -41
- {most_queue-1.39 → most_queue-1.40}/pyproject.toml +1 -1
- {most_queue-1.39 → most_queue-1.40}/setup.py +1 -1
- most_queue-1.39/most_queue/sim/utils/servers.py +0 -68
- most_queue-1.39/most_queue/sim/utils/sim_utils.py +0 -24
- most_queue-1.39/most_queue/theory/diff5dots.py +0 -30
- most_queue-1.39/most_queue/theory/flow_sum.py +0 -225
- most_queue-1.39/most_queue/theory/passage_time.py +0 -1032
- most_queue-1.39/most_queue/theory/q_poisson_arrival_calc.py +0 -60
- most_queue-1.39/most_queue/theory/rand_destribution.py +0 -1030
- most_queue-1.39/most_queue/theory/student_stat.py +0 -184
- most_queue-1.39/most_queue/theory/weibull.py +0 -113
- {most_queue-1.39 → most_queue-1.40}/LICENSE +0 -0
- {most_queue-1.39 → most_queue-1.40}/README.md +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/__init__.py +0 -0
- {most_queue-1.39/most_queue/examples → most_queue-1.40/most_queue/general_utils}/__init__.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/__init__.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/utils/__init__.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/utils/exceptions.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/utils/phase.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/sim/utils/qs_queue.py +0 -0
- {most_queue-1.39/most_queue/utils → most_queue-1.40/most_queue/theory}/__init__.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/batch_mm1.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/ek_d_n_calc.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/impatience_calc.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue/theory/m_d_n_calc.py +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue.egg-info/dependency_links.txt +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue.egg-info/not-zip-safe +0 -0
- {most_queue-1.39 → most_queue-1.40}/most_queue.egg-info/top_level.txt +0 -0
- {most_queue-1.39 → most_queue-1.40}/setup.cfg +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from theory import
|
|
1
|
+
from theory.fj_calc import get_v1_fj_varki_merchant, get_v1_fj_nelson_tantawi, get_v1_fj_varma
|
|
2
2
|
from sim.fj_sim import ForkJoinSim
|
|
3
3
|
import matplotlib.pyplot as plt
|
|
4
4
|
|
|
@@ -68,9 +68,9 @@ def test_fj_calc():
|
|
|
68
68
|
# расчет средних времен пребывания с помощью аппроксимаций. \
|
|
69
69
|
# На вход каждого из методов - l, mu, nn (число каналов СМО)
|
|
70
70
|
|
|
71
|
-
v_varki.append(
|
|
72
|
-
v_varma.append(
|
|
73
|
-
v_nelson.append(
|
|
71
|
+
v_varki.append(get_v1_fj_varki_merchant(l, mu, nn))
|
|
72
|
+
v_varma.append(get_v1_fj_varma(l, mu, nn))
|
|
73
|
+
v_nelson.append(get_v1_fj_nelson_tantawi(l, mu, nn))
|
|
74
74
|
|
|
75
75
|
print(str_f_v.format(v_sim[i], v_varki[i], v_varma[i], v_nelson[i]))
|
|
76
76
|
|
|
@@ -113,3 +113,6 @@ def test_fj_calc():
|
|
|
113
113
|
plt.savefig("error_from_n_with_ro = {0:^4.2f}.png".format(ro), dpi=300)
|
|
114
114
|
|
|
115
115
|
|
|
116
|
+
if __name__ == "__main__":
|
|
117
|
+
|
|
118
|
+
test_fj_calc()
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import matplotlib
|
|
2
2
|
import matplotlib.pyplot as plt
|
|
3
|
-
from
|
|
3
|
+
from . import rand_distribution as rd
|
|
4
4
|
from sim.flow_sum_sim import FlowSumSim
|
|
5
|
-
from theory.flow_sum import SummatorNumeric
|
|
5
|
+
from most_queue.theory.flow_sum import SummatorNumeric
|
|
6
6
|
|
|
7
7
|
matplotlib.use('TkAgg')
|
|
8
8
|
|
{most_queue-1.39/most_queue/utils → most_queue-1.40/most_queue/general_utils}/approx_cdf_make.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
from most_queue.rand_distribution import H2_dist, Gamma
|
|
2
2
|
import math
|
|
3
3
|
from tqdm import tqdm
|
|
4
4
|
import numpy as np
|
|
@@ -28,10 +28,10 @@ b[2] = a_s*pow(sigma, 3) + 3*b[1]*b[0] - 2*pow(b[0], 2)
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
# Гамма-аппроксимация
|
|
31
|
-
gamma_params =
|
|
31
|
+
gamma_params = Gamma.get_mu_alpha(b)
|
|
32
32
|
|
|
33
33
|
# H2-аппроксимация
|
|
34
|
-
h2_params =
|
|
34
|
+
h2_params = H2_dist.get_params(b)
|
|
35
35
|
|
|
36
36
|
n = 100000
|
|
37
37
|
|
|
@@ -39,8 +39,8 @@ b_approx_gamma = [0, 0, 0]
|
|
|
39
39
|
b_approx_h2 = [0, 0, 0]
|
|
40
40
|
|
|
41
41
|
for i in tqdm(range(n)):
|
|
42
|
-
val_gamma =
|
|
43
|
-
val_h2 =
|
|
42
|
+
val_gamma = Gamma.generate_static(gamma_params[0], gamma_params[1])
|
|
43
|
+
val_h2 = H2_dist.generate_static(*h2_params)
|
|
44
44
|
for k in range(3):
|
|
45
45
|
b_approx_gamma[k] += pow(val_gamma, k+1)
|
|
46
46
|
b_approx_h2[k] += pow(val_h2, k + 1)
|
|
@@ -63,8 +63,8 @@ y_gamma = []
|
|
|
63
63
|
y_h2 = []
|
|
64
64
|
|
|
65
65
|
for i in range(dots_num):
|
|
66
|
-
y_gamma.append(
|
|
67
|
-
y_h2.append(
|
|
66
|
+
y_gamma.append(Gamma.get_pdf(gamma_params[0], gamma_params[1], x[i]))
|
|
67
|
+
y_h2.append(H2_dist.get_pdf(h2_params, x[i]))
|
|
68
68
|
|
|
69
69
|
fig, ax = plt.subplots()
|
|
70
70
|
linestyles = ["solid", "dotted", "dashed", "dashdot"]
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
def get_moments(a, b, num=3):
|
|
2
|
-
num = min(num, 3)
|
|
3
|
-
res = [0] * num
|
|
4
|
-
res[0] = a[0] + b[0]
|
|
5
|
-
res[1] = a[1] + b[1] + 2 * a[0] * b[0]
|
|
6
|
-
res[2] = a[2] + b[2] + 3 * a[1] * b[0] + 3 * a[0] * b[1]
|
|
7
|
-
return res
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def
|
|
11
|
-
num = min(num, 3)
|
|
12
|
-
res = [0] * num
|
|
13
|
-
for i in range(n_times):
|
|
14
|
-
res = get_moments(res, b, num)
|
|
15
|
-
return res
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
res
|
|
21
|
-
res[
|
|
22
|
-
res[
|
|
23
|
-
|
|
1
|
+
def get_moments(a, b, num=3):
|
|
2
|
+
num = min(num, 3)
|
|
3
|
+
res = [0] * num
|
|
4
|
+
res[0] = a[0] + b[0]
|
|
5
|
+
res[1] = a[1] + b[1] + 2 * a[0] * b[0]
|
|
6
|
+
res[2] = a[2] + b[2] + 3 * a[1] * b[0] + 3 * a[0] * b[1]
|
|
7
|
+
return res
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def get_self_conv_moments(b, n_times, num=3):
|
|
11
|
+
num = min(num, 3)
|
|
12
|
+
res = [0] * num
|
|
13
|
+
for i in range(n_times):
|
|
14
|
+
res = get_moments(res, b, num)
|
|
15
|
+
return res
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_moments_minus(a, b, num=3):
|
|
19
|
+
num = min(num, 3)
|
|
20
|
+
res = [0] * num
|
|
21
|
+
res[0] = a[0] - b[0]
|
|
22
|
+
res[1] = a[1] - b[1] - 2 * a[0] * b[0]
|
|
23
|
+
res[2] = a[2] - b[2] - 3 * a[1] * b[0] - 3 * a[0] * b[1]
|
|
24
|
+
return res
|
|
@@ -17,8 +17,10 @@ def times_print(sim_moments, calc_moments, is_w=True):
|
|
|
17
17
|
print("{0:^15s}|{1:^15s}|{2:^15s}".format("№ момента", "Числ", "ИМ"))
|
|
18
18
|
print("-" * 45)
|
|
19
19
|
for j in range(min(len(sim_moments), len(calc_moments))):
|
|
20
|
+
calc_mom = calc_moments[j].real if isinstance(calc_moments[j], complex) else calc_moments[j]
|
|
21
|
+
sim_mom = sim_moments[j].real if isinstance(sim_moments[j], complex) else sim_moments[j]
|
|
20
22
|
print(
|
|
21
|
-
Fore.CYAN + f"{j + 1:^15d}|" + Fore.YELLOW + f"{
|
|
23
|
+
Fore.CYAN + f"{j + 1:^15d}|" + Fore.YELLOW + f"{calc_mom:^15.5g}" + Fore.CYAN + "|" + Fore.YELLOW + f"{sim_mom:^15.5g}")
|
|
22
24
|
|
|
23
25
|
print(Style.RESET_ALL)
|
|
24
26
|
|
|
@@ -37,7 +37,9 @@ def print_table(experiments_stat):
|
|
|
37
37
|
print("{0:^3s}|{1:^15s}|{2:^15s}".format("№", "Numerical", "Sim"))
|
|
38
38
|
print("-" * 32)
|
|
39
39
|
for i in range(3):
|
|
40
|
-
|
|
40
|
+
calc_mom = stat["w_tt"][i].real if isinstance(stat["w_tt"][i], complex) else stat["w_tt"][i]
|
|
41
|
+
sim_mom = stat["w_sim"][i].real if isinstance(stat["w_sim"][i], complex) else stat["w_sim"][i]
|
|
42
|
+
print(f"{i+1:^4d}|{calc_mom:^15.3g}|{sim_mom:^15.3g}")
|
|
41
43
|
|
|
42
44
|
|
|
43
45
|
def dump_stat(experiments_stat, save_name='run_stat.json'):
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import cmath
|
|
2
2
|
import math
|
|
3
|
+
|
|
3
4
|
import numpy as np
|
|
4
5
|
import scipy.special as sp
|
|
5
6
|
from scipy import stats
|
|
@@ -966,8 +967,8 @@ class Gamma:
|
|
|
966
967
|
|
|
967
968
|
if __name__ == "__main__":
|
|
968
969
|
|
|
969
|
-
import matplotlib.pyplot as plt
|
|
970
970
|
import matplotlib
|
|
971
|
+
import matplotlib.pyplot as plt
|
|
971
972
|
|
|
972
973
|
matplotlib.use('TkAgg')
|
|
973
974
|
|
|
@@ -1,63 +1,10 @@
|
|
|
1
1
|
"""
|
|
2
2
|
ForkJoin Queue with delta
|
|
3
3
|
"""
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
6
|
-
from .fj_sim import
|
|
7
|
-
from .
|
|
8
|
-
from .qs_sim import Server
|
|
9
|
-
from .utils.sim_utils import get_conv_moments, get_self_concolution_moments
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class ServerWarmUp(Server):
|
|
13
|
-
"""
|
|
14
|
-
Канал обслуживания
|
|
15
|
-
"""
|
|
16
|
-
id = 0
|
|
17
|
-
|
|
18
|
-
def __init__(self, params, types, delta=None):
|
|
19
|
-
"""
|
|
20
|
-
params - параметры распределения
|
|
21
|
-
types - тип распределения
|
|
22
|
-
"""
|
|
23
|
-
Server.__init__(self, params, types)
|
|
24
|
-
self.delta = delta
|
|
25
|
-
|
|
26
|
-
def start_service(self, ts, ttek, isWarmUp=False):
|
|
27
|
-
|
|
28
|
-
Server.start_service(self, ts, ttek)
|
|
29
|
-
if isWarmUp:
|
|
30
|
-
if not isinstance(self.delta, dict):
|
|
31
|
-
self.time_to_end_service = ttek + self.dist.generate() + self.delta
|
|
32
|
-
else:
|
|
33
|
-
b = [0, 0, 0]
|
|
34
|
-
if self.dist.type == 'M':
|
|
35
|
-
b = Exp_dist.calc_theory_moments(self.dist.params)
|
|
36
|
-
elif self.dist.type == 'H':
|
|
37
|
-
b = H2_dist.calc_theory_moments(*self.dist.params)
|
|
38
|
-
elif self.dist.type == 'C':
|
|
39
|
-
b = Cox_dist.calc_theory_moments(*self.dist.params)
|
|
40
|
-
elif self.dist.type == 'Pa':
|
|
41
|
-
b = Pareto_dist.calc_theory_moments(*self.dist.params)
|
|
42
|
-
elif self.dist.type == 'Gamma':
|
|
43
|
-
b = Gamma.calc_theory_moments(*self.dist.params)
|
|
44
|
-
|
|
45
|
-
f_summ = get_conv_moments(b, self.delta)
|
|
46
|
-
# variance = f_summ[1] - math.pow(f_summ[0], 2)
|
|
47
|
-
# coev = math.sqrt(variance)/f_summ[0]
|
|
48
|
-
params = Gamma.get_mu_alpha(f_summ)
|
|
49
|
-
self.time_to_end_service = ttek + \
|
|
50
|
-
Gamma.generate_static(*params)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class SubTaskDelta(SubTask):
|
|
54
|
-
"""
|
|
55
|
-
Позадача
|
|
56
|
-
"""
|
|
57
|
-
|
|
58
|
-
def __init__(self, arr_time, task_id):
|
|
59
|
-
SubTask.__init__(self, arr_time, task_id)
|
|
60
|
-
self.future_arr_time = 0
|
|
4
|
+
from most_queue.general_utils.conv import get_self_conv_moments
|
|
5
|
+
from most_queue.rand_distribution import Gamma
|
|
6
|
+
from most_queue.sim.fj_sim import ForkJoinSim
|
|
7
|
+
from most_queue.sim.utils.tasks import ForkJoinTask
|
|
61
8
|
|
|
62
9
|
|
|
63
10
|
class ForkJoinSimDelta(ForkJoinSim):
|
|
@@ -100,8 +47,8 @@ class ForkJoinSimDelta(ForkJoinSim):
|
|
|
100
47
|
is_dropped = True
|
|
101
48
|
|
|
102
49
|
if not is_dropped:
|
|
103
|
-
self.served_subtask_in_task[
|
|
104
|
-
t =
|
|
50
|
+
self.served_subtask_in_task[ForkJoinTask.task_id] = 0
|
|
51
|
+
t = ForkJoinTask(self.k, self.ttek)
|
|
105
52
|
self.first_subtask_arr_time[t.id] = self.ttek
|
|
106
53
|
|
|
107
54
|
self.in_sys += 1
|
|
@@ -131,7 +78,7 @@ class ForkJoinSimDelta(ForkJoinSim):
|
|
|
131
78
|
if not isinstance(self.delta, list):
|
|
132
79
|
t.subtasks[i].future_arr_time = self.ttek + i * self.delta
|
|
133
80
|
else:
|
|
134
|
-
b_delta =
|
|
81
|
+
b_delta = get_self_conv_moments(self.delta, i)
|
|
135
82
|
params_delta = Gamma.get_mu_alpha(b_delta)
|
|
136
83
|
t.subtasks[i].future_arr_time = self.ttek + \
|
|
137
84
|
Gamma.generate_static(*params_delta)
|
|
@@ -7,51 +7,12 @@ import sys
|
|
|
7
7
|
from colorama import Fore, Style, init
|
|
8
8
|
from tqdm import tqdm
|
|
9
9
|
|
|
10
|
-
from .qs_sim import QueueingSystemSimulator
|
|
10
|
+
from most_queue.sim.qs_sim import QueueingSystemSimulator
|
|
11
|
+
from most_queue.sim.utils.tasks import ForkJoinTask
|
|
11
12
|
|
|
12
13
|
init()
|
|
13
14
|
|
|
14
15
|
|
|
15
|
-
class SubTask:
|
|
16
|
-
"""
|
|
17
|
-
Позадача
|
|
18
|
-
"""
|
|
19
|
-
sub_task_id = 0
|
|
20
|
-
|
|
21
|
-
def __init__(self, arr_time, task_id):
|
|
22
|
-
self.arr_time = arr_time
|
|
23
|
-
self.task_id = task_id
|
|
24
|
-
self.id = SubTask.sub_task_id
|
|
25
|
-
SubTask.sub_task_id += 1
|
|
26
|
-
|
|
27
|
-
def __str__(self):
|
|
28
|
-
res = "\tSubTask #" + str(self.id) + \
|
|
29
|
-
" parent Task #" + str(self.task_id) + "\n"
|
|
30
|
-
res += "\t\tArrival time: " + str(self.arr_time) + "\n"
|
|
31
|
-
return res
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class Task:
|
|
35
|
-
"""
|
|
36
|
-
Задача, состоящая из subtask_num подзадач
|
|
37
|
-
"""
|
|
38
|
-
task_id = 0
|
|
39
|
-
|
|
40
|
-
def __init__(self, subtask_num, arr_time):
|
|
41
|
-
self.subtask_num = subtask_num
|
|
42
|
-
self.arr_time = arr_time
|
|
43
|
-
self.subtasks = []
|
|
44
|
-
for i in range(subtask_num):
|
|
45
|
-
self.subtasks.append(SubTask(arr_time, Task.task_id))
|
|
46
|
-
self.id = Task.task_id
|
|
47
|
-
Task.task_id += 1
|
|
48
|
-
|
|
49
|
-
def __str__(self):
|
|
50
|
-
res = "\tTask #" + str(self.id) + "\n"
|
|
51
|
-
res += "\t\tArrival time: " + str(self.arr_time) + "\n"
|
|
52
|
-
return res
|
|
53
|
-
|
|
54
|
-
|
|
55
16
|
class ForkJoinSim(QueueingSystemSimulator):
|
|
56
17
|
"""
|
|
57
18
|
Имитационная модель СМО Fork-Join, Split-Join
|
|
@@ -105,8 +66,8 @@ class ForkJoinSim(QueueingSystemSimulator):
|
|
|
105
66
|
is_dropped = True
|
|
106
67
|
|
|
107
68
|
if not is_dropped:
|
|
108
|
-
self.served_subtask_in_task[
|
|
109
|
-
t =
|
|
69
|
+
self.served_subtask_in_task[ForkJoinTask.task_id] = 0
|
|
70
|
+
t = ForkJoinTask(self.n, self.ttek)
|
|
110
71
|
self.in_sys += 1
|
|
111
72
|
self.sub_task_in_sys += self.n
|
|
112
73
|
|
|
@@ -277,9 +238,3 @@ class ForkJoinSim(QueueingSystemSimulator):
|
|
|
277
238
|
res += "\nQueue Count " + str(self.queue.size()) + "\n"
|
|
278
239
|
|
|
279
240
|
return res
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
class QueueingSystemException(Exception):
|
|
283
|
-
|
|
284
|
-
def __str__(self, text):
|
|
285
|
-
return text
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"""
|
|
2
|
+
Input flows sum simulation
|
|
3
|
+
"""
|
|
3
4
|
import copy
|
|
4
5
|
import math
|
|
5
6
|
|
|
7
|
+
from tqdm import tqdm
|
|
8
|
+
|
|
9
|
+
from most_queue.rand_distribution import Erlang_dist, Gamma, H2_dist, Pareto_dist
|
|
10
|
+
|
|
6
11
|
|
|
7
12
|
class FlowSumSim:
|
|
13
|
+
"""
|
|
14
|
+
Input flows sum simulation
|
|
15
|
+
"""
|
|
8
16
|
|
|
9
17
|
def __init__(self, a, distr="Gamma", verbose=True, num_of_moments=4, num_of_jobs=1000000):
|
|
10
18
|
self.n = len(a)
|
|
@@ -80,10 +88,10 @@ class FlowSumSim:
|
|
|
80
88
|
a2 - список из начальных моментов интервалов между соседникми заявками второго потока
|
|
81
89
|
"""
|
|
82
90
|
|
|
83
|
-
y1_mus =
|
|
84
|
-
arr1 =
|
|
85
|
-
y2_mus =
|
|
86
|
-
arr2 =
|
|
91
|
+
y1_mus = H2_dist.get_params(a1)
|
|
92
|
+
arr1 = H2_dist(y1_mus)
|
|
93
|
+
y2_mus = H2_dist.get_params(a2)
|
|
94
|
+
arr2 = H2_dist(y2_mus)
|
|
87
95
|
arrivals = []
|
|
88
96
|
time1 = arr1.generate()
|
|
89
97
|
time2 = arr2.generate()
|
|
@@ -126,10 +134,10 @@ class FlowSumSim:
|
|
|
126
134
|
a2 - список из начальных моментов интервалов между соседникми заявками второго потока
|
|
127
135
|
"""
|
|
128
136
|
|
|
129
|
-
a_K =
|
|
130
|
-
arr1 =
|
|
131
|
-
b_M =
|
|
132
|
-
arr2 =
|
|
137
|
+
a_K = Pareto_dist.get_a_k(a1)
|
|
138
|
+
arr1 = Pareto_dist(a_K)
|
|
139
|
+
b_M = Pareto_dist.get_a_k(a2)
|
|
140
|
+
arr2 = Pareto_dist(b_M)
|
|
133
141
|
arrivals = []
|
|
134
142
|
time1 = arr1.generate()
|
|
135
143
|
time2 = arr2.generate()
|
|
@@ -160,10 +168,10 @@ class FlowSumSim:
|
|
|
160
168
|
@staticmethod
|
|
161
169
|
def sum_2_Erlang_flows(a1, a2, num_of_moments=4, num_of_sim=1000000):
|
|
162
170
|
|
|
163
|
-
params1 =
|
|
164
|
-
arr1 =
|
|
165
|
-
params2 =
|
|
166
|
-
arr2 =
|
|
171
|
+
params1 = Erlang_dist.get_params(a1)
|
|
172
|
+
arr1 = Erlang_dist(params1)
|
|
173
|
+
params2 = Erlang_dist.get_params(a2)
|
|
174
|
+
arr2 = Erlang_dist(params2)
|
|
167
175
|
arrivals = []
|
|
168
176
|
time1 = arr1.generate()
|
|
169
177
|
time2 = arr2.generate()
|
|
@@ -200,10 +208,10 @@ class FlowSumSim:
|
|
|
200
208
|
a2 - список из начальных моментов интервалов между соседникми заявками второго потока
|
|
201
209
|
"""
|
|
202
210
|
|
|
203
|
-
params1 =
|
|
204
|
-
arr1 =
|
|
205
|
-
params2 =
|
|
206
|
-
arr2 =
|
|
211
|
+
params1 = Gamma.get_mu_alpha(a1)
|
|
212
|
+
arr1 = Gamma(params1)
|
|
213
|
+
params2 = Gamma.get_mu_alpha(a2)
|
|
214
|
+
arr2 = Gamma(params2)
|
|
207
215
|
arrivals = []
|
|
208
216
|
time1 = arr1.generate()
|
|
209
217
|
time2 = arr2.generate()
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
from .distribution_utils import create_distribution
|
|
2
|
-
from .qs_sim import QueueingSystemSimulator, Task
|
|
3
|
-
from .utils.exceptions import QsSourseSettingException
|
|
1
|
+
from most_queue.sim.utils.distribution_utils import create_distribution
|
|
2
|
+
from most_queue.sim.qs_sim import QueueingSystemSimulator, Task
|
|
4
3
|
|
|
5
4
|
|
|
6
5
|
class ImpatientTask(Task):
|
|
@@ -20,6 +19,7 @@ class ImpatientQueueSim(QueueingSystemSimulator):
|
|
|
20
19
|
self.impatience_types = None
|
|
21
20
|
|
|
22
21
|
self.impatience = None
|
|
22
|
+
self.is_set_impatience_params = False
|
|
23
23
|
|
|
24
24
|
def set_impatiens(self, params, types):
|
|
25
25
|
"""
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import numpy as np
|
|
2
1
|
import math
|
|
3
|
-
import time
|
|
4
2
|
import sys
|
|
3
|
+
import time
|
|
5
4
|
|
|
5
|
+
import numpy as np
|
|
6
|
+
from colorama import Fore, Style, init
|
|
6
7
|
from tqdm import tqdm
|
|
7
8
|
|
|
8
|
-
from .priority_queue_sim import PriorityQueueSimulator
|
|
9
|
-
from .
|
|
10
|
-
from .priority_queue_sim import Task
|
|
11
|
-
|
|
12
|
-
from colorama import init
|
|
13
|
-
from colorama import Fore, Style
|
|
9
|
+
from most_queue.sim.priority_queue_sim import PriorityQueueSimulator, Task
|
|
10
|
+
from most_queue.rand_distribution import Exp_dist
|
|
14
11
|
|
|
15
12
|
init()
|
|
16
13
|
|
|
@@ -143,11 +140,13 @@ class PriorityNetwork:
|
|
|
143
140
|
self.smos[next_node].arrival(next_node_class, self.ttek, ts)
|
|
144
141
|
|
|
145
142
|
def run(self, job_served, is_real_served=False):
|
|
143
|
+
"""
|
|
144
|
+
Run simulation
|
|
145
|
+
"""
|
|
146
146
|
if is_real_served:
|
|
147
147
|
while sum(self.served) < job_served:
|
|
148
148
|
self.run_one_step()
|
|
149
|
-
sys.stderr.write('\rStart simulation. Job served:
|
|
150
|
-
(sum(self.served), job_served))
|
|
149
|
+
sys.stderr.write(f'\rStart simulation. Job served: {sum(self.served)}/{job_served}')
|
|
151
150
|
sys.stderr.flush()
|
|
152
151
|
else:
|
|
153
152
|
print(Fore.GREEN + '\rStart simulation')
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import math
|
|
2
2
|
import sys
|
|
3
3
|
import time
|
|
4
|
+
|
|
4
5
|
import numpy as np
|
|
5
6
|
from colorama import Fore, Style, init
|
|
6
7
|
from tqdm import tqdm
|
|
7
8
|
|
|
8
|
-
from .distribution_utils import create_distribution
|
|
9
|
+
from most_queue.sim.utils.distribution_utils import create_distribution
|
|
9
10
|
|
|
10
11
|
init()
|
|
11
12
|
|
|
@@ -9,10 +9,12 @@ import numpy as np
|
|
|
9
9
|
from colorama import Fore, Style, init
|
|
10
10
|
from tqdm import tqdm
|
|
11
11
|
|
|
12
|
-
from .distribution_utils import calc_qs_load, create_distribution
|
|
13
|
-
from .utils.exceptions import QsSourseSettingException, QsWrongQueueTypeException
|
|
14
|
-
from .utils.phase import QsPhase
|
|
15
|
-
from .utils.qs_queue import
|
|
12
|
+
from most_queue.sim.utils.distribution_utils import calc_qs_load, create_distribution
|
|
13
|
+
from most_queue.sim.utils.exceptions import QsSourseSettingException, QsWrongQueueTypeException
|
|
14
|
+
from most_queue.sim.utils.phase import QsPhase
|
|
15
|
+
from most_queue.sim.utils.qs_queue import QsQueueDeque, QsQueueList
|
|
16
|
+
from most_queue.sim.utils.servers import Server
|
|
17
|
+
from most_queue.sim.utils.tasks import Task
|
|
16
18
|
|
|
17
19
|
init()
|
|
18
20
|
|
|
@@ -625,92 +627,3 @@ class QueueingSystemSimulator:
|
|
|
625
627
|
res += f"\nQueue Count {self.queue.size()}\n"
|
|
626
628
|
|
|
627
629
|
return res
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
class Task:
|
|
631
|
-
"""
|
|
632
|
-
Заявка
|
|
633
|
-
"""
|
|
634
|
-
id = 0
|
|
635
|
-
|
|
636
|
-
def __init__(self, arr_time):
|
|
637
|
-
"""
|
|
638
|
-
:param arr_time: Момент прибытия в СМО
|
|
639
|
-
"""
|
|
640
|
-
self.arr_time = arr_time
|
|
641
|
-
|
|
642
|
-
self.start_waiting_time = 0
|
|
643
|
-
|
|
644
|
-
self.wait_time = 0
|
|
645
|
-
|
|
646
|
-
Task.id += 1
|
|
647
|
-
self.id = Task.id
|
|
648
|
-
|
|
649
|
-
def __str__(self):
|
|
650
|
-
res = f"Task #{self.id}\n"
|
|
651
|
-
res += f"\tArrival moment: {self.arr_time:8.3f}"
|
|
652
|
-
return res
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
class Server:
|
|
656
|
-
"""
|
|
657
|
-
Канал обслуживания
|
|
658
|
-
"""
|
|
659
|
-
id = 0
|
|
660
|
-
|
|
661
|
-
def __init__(self, params, types, generator=None):
|
|
662
|
-
"""
|
|
663
|
-
params - параметры распределения
|
|
664
|
-
types - тип распределения
|
|
665
|
-
"""
|
|
666
|
-
self.dist = create_distribution(params, types, generator)
|
|
667
|
-
self.time_to_end_service = 1e10
|
|
668
|
-
self.is_free = True
|
|
669
|
-
self.tsk_on_service = None
|
|
670
|
-
Server.id += 1
|
|
671
|
-
self.id = Server.id
|
|
672
|
-
|
|
673
|
-
self.params_warm = None
|
|
674
|
-
self.types_warm = None
|
|
675
|
-
self.warm_phase = QsPhase("WarmUp", None)
|
|
676
|
-
|
|
677
|
-
def set_warm(self, params, types, generator=None):
|
|
678
|
-
"""
|
|
679
|
-
Set local warmup period distrubution on server
|
|
680
|
-
"""
|
|
681
|
-
|
|
682
|
-
self.warm_phase.set_dist(create_distribution(params, types, generator))
|
|
683
|
-
|
|
684
|
-
def start_service(self, ts: Task, ttek, is_warm=False):
|
|
685
|
-
"""
|
|
686
|
-
Starts serving
|
|
687
|
-
ttek - current time
|
|
688
|
-
is_warm - if warmUp needed
|
|
689
|
-
"""
|
|
690
|
-
|
|
691
|
-
self.tsk_on_service = ts
|
|
692
|
-
self.is_free = False
|
|
693
|
-
if not is_warm:
|
|
694
|
-
self.time_to_end_service = ttek + self.dist.generate()
|
|
695
|
-
else:
|
|
696
|
-
self.time_to_end_service = ttek + self.warm_phase.dist.generate()
|
|
697
|
-
|
|
698
|
-
def end_service(self):
|
|
699
|
-
"""
|
|
700
|
-
End service
|
|
701
|
-
"""
|
|
702
|
-
self.time_to_end_service = 1e10
|
|
703
|
-
self.is_free = True
|
|
704
|
-
ts = self.tsk_on_service
|
|
705
|
-
self.tsk_on_service = None
|
|
706
|
-
return ts
|
|
707
|
-
|
|
708
|
-
def __str__(self):
|
|
709
|
-
res = f"\nServer # {self.id}\n"
|
|
710
|
-
if self.is_free:
|
|
711
|
-
res += "\tFree"
|
|
712
|
-
else:
|
|
713
|
-
res += "\tServing.. Time to end " + \
|
|
714
|
-
f"{self.time_to_end_service:8.3f}\n"
|
|
715
|
-
res += f"\tTask on service:\n\t{self.tsk_on_service}"
|
|
716
|
-
return res
|