import numpy
import itertools
import copy
from numpy.linalg import solve
def delath_kursovuyu(variant):
lambdas = variant["lambdas"]
mu = variant["mu"]
Ns = variant["Ns"]
N1s = variant["N1s"]
P = {True:[], False:[]}
lambdamus = {True:[], False:[]}
def get_lams(step, neogr):
if not neogr:
return [i * lambdas[step] for i in range(Ns[step], Ns[step]-N1s[step]-1, -1)]
else:
return [i * lambdas[step] for i in range(Ns[step], 0, -1)]
def get_mus(step, neogr):
N = Ns[step]
N1 = N1s[step]+1
if neogr:
if step >=1:
PP = P[neogr][step-1]
P0, P1 = PP[0,0], PP[1,0]
return [(1+i)*mu[step]*P0 + mu[step]*P1 for i in range(N)]
else:
return [(1+i)*mu[step] for i in range(N)]
else:
if step==0: mu1, mu2 = (mu[step], 2*mu[step])
else:
PP = P[neogr][step-1]
mP0, mP1 = mu[step]*PP[0,0], mu[step]*PP[1,0]
mu1, mu2 = (mP0+mP1, 2*mP0+mP1)
return [(mu1 if i==0 else mu2) for i in range(N1)]
def compute_probabilities(p_lambdas, p_mus):
N = len(p_lambdas)+1
lams = {k:i for k,i in enumerate(p_lambdas)}
mus = {k:i for k,i in enumerate(p_mus)}
def coeff(i,j, lams, mus):
if i == j:
return -(lams.get(j, 0) + mus.get(j-1,0))
if i == j+1:
return mus.get(j,0)
if i == j-1:
return lams.get(i,0)
else: return 0
mat = numpy.mat([
[coeff(i,j, lams, mus) for i in range(N)]
for j in range(N)
])
eigenvals, eigenvects = numpy.linalg.eig(mat)
idx = eigenvals.argsort()[::-1][0]
solnn = eigenvects[:,idx]
sol = solnn / numpy.sum(solnn)
return sol
for neogr in [False, True]:
#print("%sogranichenii:" % ("ne" if neogr else "",))
for step in range(0,len(Ns)):
#print("step: %d" % (step,))
lams = get_lams(step, neogr)
mus = get_mus(step, neogr)
lambdamus[neogr].append({"lambda":lams, "mu":mus})
#print(lams, mus)
res = compute_probabilities(lams, mus)
P[neogr].append(res)
#print(res)
Pijk = {}
PisprTmp = {}
for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):
vals = []
for neogr in [False, True]:
prod = 1
for i,v in zip(idxs, P[neogr]):
prod *= v[0,0]
Pijk[(neogr,idxs)] = prod
for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):
s,sno = (0,0)
for idxs2 in itertools.product(*map(lambda x:range(x+1), idxs)):
s += Pijk[(False,idxs2)]
sno += Pijk[(True,idxs2)]
PisprTmp[(False, idxs)] = s
PisprTmp[(True, idxs)] = sno
#print("P%d%d%d,%.10f,%.10f" % (idxs + (s,sno)) )
Pispr = PisprTmp[(False, tuple(N1s))]
PisprPrem = PisprTmp[(False, tuple(map(lambda x:x+1, N1s)))]
Kg = Pispr / PisprPrem
lotkaz = sum(l*n for l,n in zip(lambdas, Ns))
mu_eq = list(map(lambda l:l["mu"][0], lambdamus[False]))
mu_system = sum(mu_eq)
import itertools
import copy
from numpy.linalg import solve
def delath_kursovuyu(variant):
lambdas = variant["lambdas"]
mu = variant["mu"]
Ns = variant["Ns"]
N1s = variant["N1s"]
P = {True:[], False:[]}
lambdamus = {True:[], False:[]}
def get_lams(step, neogr):
if not neogr:
return [i * lambdas[step] for i in range(Ns[step], Ns[step]-N1s[step]-1, -1)]
else:
return [i * lambdas[step] for i in range(Ns[step], 0, -1)]
def get_mus(step, neogr):
N = Ns[step]
N1 = N1s[step]+1
if neogr:
if step >=1:
PP = P[neogr][step-1]
P0, P1 = PP[0,0], PP[1,0]
return [(1+i)*mu[step]*P0 + mu[step]*P1 for i in range(N)]
else:
return [(1+i)*mu[step] for i in range(N)]
else:
if step==0: mu1, mu2 = (mu[step], 2*mu[step])
else:
PP = P[neogr][step-1]
mP0, mP1 = mu[step]*PP[0,0], mu[step]*PP[1,0]
mu1, mu2 = (mP0+mP1, 2*mP0+mP1)
return [(mu1 if i==0 else mu2) for i in range(N1)]
def compute_probabilities(p_lambdas, p_mus):
N = len(p_lambdas)+1
lams = {k:i for k,i in enumerate(p_lambdas)}
mus = {k:i for k,i in enumerate(p_mus)}
def coeff(i,j, lams, mus):
if i == j:
return -(lams.get(j, 0) + mus.get(j-1,0))
if i == j+1:
return mus.get(j,0)
if i == j-1:
return lams.get(i,0)
else: return 0
mat = numpy.mat([
[coeff(i,j, lams, mus) for i in range(N)]
for j in range(N)
])
eigenvals, eigenvects = numpy.linalg.eig(mat)
idx = eigenvals.argsort()[::-1][0]
solnn = eigenvects[:,idx]
sol = solnn / numpy.sum(solnn)
return sol
for neogr in [False, True]:
#print("%sogranichenii:" % ("ne" if neogr else "",))
for step in range(0,len(Ns)):
#print("step: %d" % (step,))
lams = get_lams(step, neogr)
mus = get_mus(step, neogr)
lambdamus[neogr].append({"lambda":lams, "mu":mus})
#print(lams, mus)
res = compute_probabilities(lams, mus)
P[neogr].append(res)
#print(res)
Pijk = {}
PisprTmp = {}
for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):
vals = []
for neogr in [False, True]:
prod = 1
for i,v in zip(idxs, P[neogr]):
prod *= v[0,0]
Pijk[(neogr,idxs)] = prod
for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):
s,sno = (0,0)
for idxs2 in itertools.product(*map(lambda x:range(x+1), idxs)):
s += Pijk[(False,idxs2)]
sno += Pijk[(True,idxs2)]
PisprTmp[(False, idxs)] = s
PisprTmp[(True, idxs)] = sno
#print("P%d%d%d,%.10f,%.10f" % (idxs + (s,sno)) )
Pispr = PisprTmp[(False, tuple(N1s))]
PisprPrem = PisprTmp[(False, tuple(map(lambda x:x+1, N1s)))]
Kg = Pispr / PisprPrem
lotkaz = sum(l*n for l,n in zip(lambdas, Ns))
mu_eq = list(map(lambda l:l["mu"][0], lambdamus[False]))
mu_system = sum(mu_eq)