butools.queues.FluidQueue ========================= .. currentmodule:: butools.queues .. np:function:: FluidQueue .. list-table:: :widths: 25 150 * - Matlab: - :code:`Ret = FluidQueue(Q, Rin, Rout, ...)` * - Mathematica: - :code:`Ret = FluidQueue[Q, Rin, Rout, ...]` * - Python/Numpy: - :code:`Ret = FluidQueue(Q, Rin, Rout, ...)` Returns various performane measures of a fluid queue. In a fluid queue there is a background continuous time Markov chain (given by generator Q), and diagonal matrix Rin (Rout) whose ith entry provides the fluid rate at which fluid enters the queue (can be served) while the background process is in state i. Parameters ---------- Q : matrix, shape (N,N) The generator of the background Markov chain Rin : matrix, shape (N,N) Diagonal matrix containing the fluid input rates associated to the states of the background process Rout : matrix, shape (N,N) Diagonal matrix containing the fluid output rates associated to the states of the background process further parameters : The rest of the function parameters specify the options and the performance measures to be computed. The supported performance measures and options in this function are: +----------------+--------------------+--------------------------------------+ | Parameter name | Input parameters | Output | +================+====================+======================================+ | "flMoms" | Number of moments | The moments of the fluid level | +----------------+--------------------+--------------------------------------+ | "flDistr" | A vector of points | The fluid level distribution at | | | | the requested points (cdf) | +----------------+--------------------+--------------------------------------+ | "flDistrME" | None | The vector-matrix parameters of the | | | | matrix-exponentially distributed | | | | fluid level distribution | +----------------+--------------------+--------------------------------------+ | "flDistrPH" | None | The vector-matrix parameters of the | | | | matrix-exponentially distributed | | | | fluid level distribution, converted | | | | to a PH representation | +----------------+--------------------+--------------------------------------+ | "stMoms" | Number of moments | The sojourn time moments of fluid | | | | drops | +----------------+--------------------+--------------------------------------+ | "stDistr" | A vector of points | The sojourn time distribution at the | | | | requested points (cummulative, cdf) | +----------------+--------------------+--------------------------------------+ | "stDistrME" | None | The vector-matrix parameters of the | | | | matrix-exponentially distributed | | | | sojourn time distribution | +----------------+--------------------+--------------------------------------+ | "stDistrPH" | None | The vector-matrix parameters of the | | | | matrix-exponentially distributed | | | | sojourn time distribution, converted | | | | to a PH representation | +----------------+--------------------+--------------------------------------+ | "prec" | The precision | Numerical precision to check if the | | | | input is valid and it is also used | | | | as a stopping condition when solving | | | | the Riccati equation | +----------------+--------------------+--------------------------------------+ | "Q0" | Matrix, shape(N,N) | The generator of the background | | | | Markov chain when the fluid level is | | | | zero. If not given, Q0=Q is assumed | +----------------+--------------------+--------------------------------------+ Returns ------- Ret : list of the performance measures Each entry of the list corresponds to a performance measure requested. If there is just a single item, then it is not put into a list. Notes ----- "flDistrME" and "stDistrME" behave much better numerically than "flDistrPH" and "stDistrPH". Examples ======== For Matlab: >>> Q = [-9., 2., 4., 0., 1., 2.; 6., -25., 5., 3., 7., 4.; 1., 3., -4., 0., 0., 0.; 0., 0., 0., -8., 3., 5.; 7., 3., 0., 2., -13., 1.; 7., 8., 0., 3., 8., -26.]; >>> vRin = [4.,2.,1.,0.,0.,3.]; >>> vRout = [6.,2.,0.,0.,3.,2.]; >>> Rin = diag(vRin); >>> Rout = diag(vRout); >>> [fld, flm] = FluidQueue(Q, Rin, Rout, 'flDistr', (0.:0.1:1.), 'flMoms', 5); Final Residual Error for Psi: 5.3291e-15 >>> disp(fld); Columns 1 through 8 0.23662 0.39265 0.49537 0.57807 0.6469 0.70447 0.75265 0.79297 Columns 9 through 11 0.82672 0.85497 0.87861 >>> disp(flm); 0.40636 0.4546 0.76609 1.722 4.8384 >>> [alphap, Ap] = FluidQueue(Q, Rin, Rout, 'flDistrPH'); Final Residual Error for Psi: 5.3291e-15 >>> disp(alphap); 0.63124 0.13213 >>> disp(Ap); -2.0387 0.41483 12.1 -21.143 >>> [alpha, A] = FluidQueue(Q, Rin, Rout, 'flDistrME'); Final Residual Error for Psi: 5.3291e-15 >>> disp(alpha); 0.099033 0.66434 >>> disp(A); -3.8739 2.2653 16.206 -19.308 >>> fldFromPH = CdfFromPH(alphap, Ap, (0.:0.1:1.)); >>> disp(fldFromPH); Columns 1 through 8 0.23662 0.39265 0.49537 0.57807 0.6469 0.70447 0.75265 0.79297 Columns 9 through 11 0.82672 0.85497 0.87861 >>> flmFromME = MomentsFromME(alpha, A, 5); >>> disp(flmFromME); 0.40636 0.4546 0.76609 1.722 4.8384 >>> [std, stm] = FluidQueue(Q, Rin, Rout, 'stDistr', (0.:0.1:1.), 'stMoms', 5); Final Residual Error for Psi: 5.3291e-15 >>> disp(std); Columns 1 through 8 0.31678 0.57513 0.67546 0.74313 0.7949 0.83595 0.8688 0.89511 Columns 9 through 11 0.91618 0.93304 0.94652 >>> disp(stm); 0.23252 0.20069 0.26684 0.47402 1.0523 >>> [betap, Bp] = FluidQueue(Q, Rin, Rout, 'stDistrPH'); Final Residual Error for Psi: 5.3291e-15 >>> disp(betap); Columns 1 through 8 0.24893 0.030403 0.068594 0.023408 0.21436 0 0 0 Columns 9 through 12 0 0 0 0.097532 >>> disp(Bp); Columns 1 through 8 -21.232 2.489 2 0 4 0 0 0 72.6 -135.86 0 2 0 4 0 0 6 0 -29.077 0.82967 5 0 3 0 0 6 24.2 -67.286 0 5 0 3 1 0 3 0 -4 0 0 0 0 1 0 3 0 -4 0 0 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 0 -8 7 0 3 0 0 0 2 0 0 7 0 3 0 0 0 2 7 0 8 0 0 0 3 0 0 7 0 8 0 0 0 3 Columns 9 through 12 1 0 2 0 0 1 0 2 7 0 4 0 0 7 0 4 0 0 0 0 0 0 0 0 3 0 5 0 0 3 0 5 -19.116 1.2445 1 0 36.3 -76.429 0 1 8 0 -30.077 0.82967 0 8 24.2 -68.286 >>> [beta, B] = FluidQueue(Q, Rin, Rout, 'stDistrME'); Final Residual Error for Psi: 5.3291e-15 >>> disp(beta); Columns 1 through 8 6.1487e-17 0 0.078831 -0.087519 0.095339 1.1102e-16 0 -0.10977 Columns 9 through 12 0.10977 -0.10977 0.10977 0.59657 >>> disp(B); Columns 1 through 8 -22.232 -9.0243 12.676 -16.419 -10.249 30.265 0 0 -7.8856 -14 12.876 -9.097 -5.6783 16.769 0 0 -7.2098 15.443 -18.077 -16.653 4.8244 14.325 -4.9559 5.1109 -6.4942 13.91 45.225 -88.757 8.1259 15.247 -9.3289 9.6206 -5.1787 9.9439 41.788 -50.497 -22.618 13.996 -8.5637 3.0746 1.1565 9.2439 33.466 -40.969 105.27 -123.85 -13.15 9.2801 1.1143 8.9065 32.244 -39.473 97.844 -111.62 -21.67 14.098 1.0805 5.2804 29.45 -31.898 93.14 -109.17 47.142 -53.616 1.0805 3.4399 31.604 -34.29 95.746 -109.17 47.142 -45.616 1.0805 3.4399 29.45 -31.898 95.746 -109.17 44.233 -42.616 1.4204 -0.85454 34.477 -38.276 102.69 -109.17 44.233 -45.616 1.4204 -0.85454 28.732 -31.898 101.83 -108.24 37.445 -38.616 Columns 9 through 12 0 -20.594 20.594 0 0 -11.41 11.41 0 0 -13.925 13.925 0 -6.2713 -6.2713 11.288 1.2543 0 -6.9083 11.514 1.1514 0 -6.422 3.211 8.5627 0 -6.1876 3.0938 8.2501 0 -6 0 11 -8 -8 2 11 0 -16 0 13 3 3.1162 -24.622 18.505 0 -2.0893 60.013 -57.924 >>> stdFromPH = CdfFromPH(betap, Bp, (0.:0.1:1.)); >>> disp(stdFromPH); Columns 1 through 8 0.31678 0.57513 0.67546 0.74313 0.7949 0.83595 0.8688 0.89511 Columns 9 through 11 0.91618 0.93304 0.94652 >>> stmFromME = MomentsFromME(beta, B, 5); >>> disp(stmFromME); 0.23252 0.20069 0.26684 0.47402 1.0523 For Mathematica: >>> Q = {{-9., 2., 4., 0., 1., 2.},{6., -25., 5., 3., 7., 4.},{1., 3., -4., 0., 0., 0.},{0., 0., 0., -8., 3., 5.},{7., 3., 0., 2., -13., 1.},{7., 8., 0., 3., 8., -26.}}; >>> vRin = {4.,2.,1.,0.,0.,3.}; >>> vRout = {6.,2.,0.,0.,3.,2.}; >>> Rin = DiagonalMatrix[vRin]; >>> Rout = DiagonalMatrix[vRout]; >>> {fld, flm} = FluidQueue[Q, Rin, Rout, "flDistr", Range[0.,1.,0.1], "flMoms", 5]; "Final Residual Error for Psi: "3.552713678800501*^-15 >>> Print[fld]; {0.23662288834725298, 0.39264885436465424, 0.4953720074760106, 0.5780715681563571, 0.6469041669036231, 0.7044705767536769, 0.7526473904478992, 0.7929699724085515, 0.8267192438851823, 0.8549668265296148, 0.8786095927626414} >>> Print[flm]; {0.40636152724912705, 0.45459875335830063, 0.7660938906391563, 1.7219814531396151, 4.8383553122056435} >>> {alphap, Ap} = FluidQueue[Q, Rin, Rout, "flDistrPH"]; "Final Residual Error for Psi: "3.552713678800501*^-15 >>> Print[alphap]; {0.6312437949552183, 0.1321333166975293} >>> Print[Ap]; {{-2.038729227705291, 0.41483299932786355}, {12.100016650885564, -21.143102743484828}} >>> {alpha, A} = FluidQueue[Q, Rin, Rout, "flDistrME"]; "Final Residual Error for Psi: "3.552713678800501*^-15 >>> Print[alpha]; {0.09903292185295065, 0.6643441897997966} >>> Print[A]; {{-3.873888074242129, 2.265266300893395}, {16.206146825973583, -19.30794389694799}} >>> fldFromPH = CdfFromPH[alphap, Ap, Range[0.,1.,0.1]]; >>> Print[fldFromPH]; {0.2366228883472523, 0.3926488543646537, 0.49537200747600996, 0.5780715681563567, 0.6469041669036226, 0.7044705767536761, 0.752647390447899, 0.7929699724085515, 0.826719243885182, 0.8549668265296144, 0.8786095927626408} >>> flmFromME = MomentsFromME[alpha, A, 5]; >>> Print[flmFromME]; {0.406361527249127, 0.4545987533583005, 0.766093890639156, 1.7219814531396143, 4.838355312205641} >>> {std, stm} = FluidQueue[Q, Rin, Rout, "stDistr", Range[0.,1.,0.1], "stMoms", 5]; "Final Residual Error for Psi: "3.552713678800501*^-15 >>> Print[std]; {0.31678183878167165, 0.5751281366978114, 0.6754587240241274, 0.7431259359792002, 0.7948956352818286, 0.8359503921804168, 0.8687966127678342, 0.895110856527426, 0.9161817691938701, 0.9330411640536861, 0.9465218585049266} >>> Print[stm]; {0.2325226067816825, 0.20068950224745224, 0.26683979953080217, 0.47402477308795066, 1.052265707013926} >>> {betap, Bp} = FluidQueue[Q, Rin, Rout, "stDistrPH"]; "Final Residual Error for Psi: "3.552713678800501*^-15 >>> Print[betap]; {0.2489256585531655, 0.030403121047365863, 0.06859400291252453, 0.02340757153618713, 0.21435625910163925, 0., 0., 0., 0., 0., 0., 0.0975315480674464} >>> Print[Bp]; {{-21.23237536623175, 2.4889979959671824, 2., 0., 4., 0., 0., 0., 1., 0., 2., 0.}, {72.60009990531339, -135.85861646090896, 0., 2., 0., 4., 0., 0., 0., 1., 0., 2.}, {6., 0., -29.077458455410582, 0.8296659986557274, 5., 0., 3., 0., 7., 0., 4., 0.}, {0., 6., 24.20003330177113, -67.28620548696966, 0., 5., 0., 3., 0., 7., 0., 4.}, {1., 0., 3., 0., -4., 0., 0., 0., 0., 0., 0., 0.}, {0., 1., 0., 3., 0., -4., 0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0., -8., 0., 3., 0., 5., 0.}, {0., 0., 0., 0., 0., 0., 0., -8., 0., 3., 0., 5.}, {7., 0., 3., 0., 0., 0., 2., 0., -19.116187683115875, 1.2444989979835912, 1., 0.}, {0., 7., 0., 3., 0., 0., 0., 2., 36.30004995265669, -76.42930823045448, 0., 1.}, {7., 0., 8., 0., 0., 0., 3., 0., 8., 0., -30.077458455410582, 0.8296659986557274}, {0., 7., 0., 8., 0., 0., 0., 3., 0., 8., 24.20003330177113, -68.28620548696966}} >>> {beta, B} = FluidQueue[Q, Rin, Rout, "stDistrME"]; "Final Residual Error for Psi: "3.552713678800501*^-15 >>> Print[beta]; {3.264004570026444*^-17, 0., 0.078831427608686, -0.08751888856574991, 0.09533889262153328, -1.1102230246251565*^-16, 0., -0.10977187523000154, 0.10977187523000154, -0.10977187523000154, 0.10977187523000154, 0.5965667295538591} >>> Print[B]; {{-22.232375366231746, -9.024334461376778, 12.676341281041134, -16.41886435303353, -10.248515585018609, 30.264973851239237, 0., 0., 0., -20.593606234218658, 20.593606234218658, 0.}, {-7.885554013509164, -14., 12.876273100640667, -9.096994589077221, -5.678266707024877, 16.76853510958077, 0., 0., 0., -11.410041550630227, 11.410041550630227, 0.}, {-7.209828938108562, 15.44329181707263, -18.07745845541058, -16.653045216976402, 4.824361648380197, 14.325098944679178, -4.955917721818842, 5.110876056418869, 0., -13.924887390711975, 13.924887390711975, 0.}, {-6.494153631516062, 13.910331368099698, 45.22483399646519, -88.75656159121243, 8.12591699549531, 15.246825395741896, -9.328920246280369, 9.620610711320927, -6.271324797933972, -6.27132479793397, 11.288384636281148, 1.2542649595867943}, {-5.17874381712221, 9.94388397950392, 41.78794639107936, -50.49678710251786, -22.61805543038884, 13.996231507413134, -8.56373206173128, 3.0745666597174584, 0., -6.90831656703395, 11.513860945056583, 1.1513860945056584}, {1.156466847093981, 9.243874525368991, 33.46570969180691, -40.968532043409766, 105.26888080212088, -123.84766338168792, -13.15028655062144, 9.280128382401386, 0., -6.42199885465433, 3.210999427327165, 8.562665139539106}, {1.1142572671540418, 8.906484775101795, 32.24425353676651, -39.473232344457195, 97.84400096052254, -111.61936991988053, -21.670317693073674, 14.097752082035752, 0., -6.187604003897572, 3.093802001948786, 8.250138671863432}, {1.0804737340516644, 5.280411661151828, 29.449994310245835, -31.898192751799968, 93.14039968197055, -109.16943402785212, 47.141886678532906, -53.61588779389599, 0., -6., 0., 11.}, {1.0804737340516646, 3.4399275659085404, 31.604410296403845, -34.29003187404438, 95.74595485960887, -109.16943402785212, 47.141886678532906, -45.61588779389599, -8., -8.000000000000002, 2.0000000000000018, 11.}, {1.080473734051665, 3.4399275659085404, 29.449994310245838, -31.898192751799975, 95.74595485960887, -109.16943402785212, 44.23284466668765, -42.61588779389599, 0., -16., 0., 13.000000000000002}, {1.4203850599450722, -0.854535322992466, 34.47696494461453, -38.276430411118405, 102.69410199997778, -109.16943402785212, 44.23284466668765, -45.61588779389599, 3., 3.116187683115877, -24.621664222726388, 18.505476539610513}, {1.4203850599450727, -0.854535322992466, 28.731855648193164, -31.89819275179997, 101.82558360743165, -108.23514547754328, 37.44507997238203, -38.61588779389599, 0., -2.089346473248271, 60.01317816409224, -57.92383169084397}} >>> stdFromPH = CdfFromPH[betap, Bp, Range[0.,1.,0.1]]; >>> Print[stdFromPH]; {0.31678183878167143, 0.5751281366978112, 0.6754587240241272, 0.7431259359792002, 0.7948956352818284, 0.8359503921804168, 0.8687966127678343, 0.8951108565274261, 0.9161817691938701, 0.9330411640536861, 0.9465218585049268} >>> stmFromME = MomentsFromME[beta, B, 5]; >>> Print[stmFromME]; {0.23252260678168227, 0.2006895022474516, 0.26683979953080084, 0.47402477308794727, 1.0522657070139159} For Python/Numpy: >>> Q = ml.matrix([[-9., 2., 4., 0., 1., 2.],[6., -25., 5., 3., 7., 4.],[1., 3., -4., 0., 0., 0.],[0., 0., 0., -8., 3., 5.],[7., 3., 0., 2., -13., 1.],[7., 8., 0., 3., 8., -26.]]) >>> vRin = ml.matrix([[4.,2.,1.,0.,0.,3.]]) >>> vRout = ml.matrix([[6.,2.,0.,0.,3.,2.]]) >>> Rin = Diag(vRin) >>> Rout = Diag(vRout) >>> fld, flm = FluidQueue(Q, Rin, Rout, "flDistr", np.arange(0.,1.1,0.1), "flMoms", 5) Final Residual Error for G: 6.661338147750939e-15 >>> print(fld) [ 0.23662 0.39265 0.49537 0.57807 0.6469 0.70447 0.75265 0.79297 0.82672 0.85497 0.87861] >>> print(flm) [0.406361527249128, 0.45459875335830258, 0.76609389063916067, 1.7219814531396287, 4.8383553122056897] >>> alphap, Ap = FluidQueue(Q, Rin, Rout, "flDistrPH") Final Residual Error for G: 6.661338147750939e-15 >>> print(alphap) [[ 0.63124 0.13213]] >>> print(Ap) [[ -2.03873 0.41483] [ 12.10002 -21.1431 ]] >>> alpha, A = FluidQueue(Q, Rin, Rout, "flDistrME") Final Residual Error for G: 6.661338147750939e-15 >>> print(alpha) [[ 0.09903 0.66434]] >>> print(A) [[ -3.87389 2.26527] [ 16.20615 -19.30794]] >>> fldFromPH = CdfFromPH(alphap, Ap, np.arange(0.,1.1,0.1)) >>> print(fldFromPH) [ 0.23662 0.39265 0.49537 0.57807 0.6469 0.70447 0.75265 0.79297 0.82672 0.85497 0.87861] >>> flmFromME = MomentsFromME(alpha, A, 5) >>> print(flmFromME) [0.40636152724912805, 0.45459875335830258, 0.76609389063916078, 1.7219814531396285, 4.8383553122056906] >>> std, stm = FluidQueue(Q, Rin, Rout, "stDistr", np.arange(0.,1.1,0.1), "stMoms", 5) Final Residual Error for G: 6.661338147750939e-15 >>> print(std) [ 0.31678 0.57513 0.67546 0.74313 0.7949 0.83595 0.8688 0.89511 0.91618 0.93304 0.94652] >>> print(stm) [0.23252260678168307, 0.20068950224745297, 0.26683979953080317, 0.47402477308795288, 1.0522657070139314] >>> betap, Bp = FluidQueue(Q, Rin, Rout, "stDistrPH") Final Residual Error for G: 6.661338147750939e-15 >>> print(betap) [[ 0.24893 0.0304 0.06859 0.02341 0.21436 0. 0. 0. 0. 0. 0. 0.09753]] >>> print(Bp) [[ -21.23238 2.489 2. 0. 4. 0. 0. 0. 1. 0. 2. 0. ] [ 72.6001 -135.85862 0. 2. 0. 4. 0. 0. 0. 1. 0. 2. ] [ 6. 0. -29.07746 0.82967 5. 0. 3. 0. 7. 0. 4. 0. ] [ 0. 6. 24.20003 -67.28621 0. 5. 0. 3. 0. 7. 0. 4. ] [ 1. 0. 3. 0. -4. 0. 0. 0. 0. 0. 0. 0. ] [ 0. 1. 0. 3. 0. -4. 0. 0. 0. 0. 0. 0. ] [ 0. 0. 0. 0. 0. 0. -8. 0. 3. 0. 5. 0. ] [ 0. 0. 0. 0. 0. 0. 0. -8. 0. 3. 0. 5. ] [ 7. 0. 3. 0. 0. 0. 2. 0. -19.11619 1.2445 1. 0. ] [ 0. 7. 0. 3. 0. 0. 0. 2. 36.30005 -76.42931 0. 1. ] [ 7. 0. 8. 0. 0. 0. 3. 0. 8. 0. -30.07746 0.82967] [ 0. 7. 0. 8. 0. 0. 0. 3. 0. 8. 24.20003 -68.28621]] >>> beta, B = FluidQueue(Q, Rin, Rout, "stDistrME") Final Residual Error for G: 6.661338147750939e-15 >>> print(beta) [[ 0. 0. 0.07883 -0.08752 0.09534 0. 0. -0.10977 0.10977 -0.10977 0.10977 0.59657]] >>> print(B) [[ -22.23238 -9.02433 12.67634 -16.41886 -10.24852 30.26497 0. 0. 0. -20.59361 20.59361 0. ] [ -7.88555 -14. 12.87627 -9.09699 -5.67827 16.76854 0. 0. 0. -11.41004 11.41004 0. ] [ -7.20983 15.44329 -18.07746 -16.65305 4.82436 14.3251 -4.95592 5.11088 0. -13.92489 13.92489 0. ] [ -6.49415 13.91033 45.22483 -88.75656 8.12592 15.24683 -9.32892 9.62061 -6.27132 -6.27132 11.28838 1.25426] [ -5.17874 9.94388 41.78795 -50.49679 -22.61806 13.99623 -8.56373 3.07457 0. -6.90832 11.51386 1.15139] [ 1.15647 9.24387 33.46571 -40.96853 105.26888 -123.84766 -13.15029 9.28013 0. -6.422 3.211 8.56267] [ 1.11426 8.90648 32.24425 -39.47323 97.844 -111.61937 -21.67032 14.09775 0. -6.1876 3.0938 8.25014] [ 1.08047 5.28041 29.44999 -31.89819 93.1404 -109.16943 47.14189 -53.61589 0. -6. 0. 11. ] [ 1.08047 3.43993 31.60441 -34.29003 95.74595 -109.16943 47.14189 -45.61589 -8. -8. 2. 11. ] [ 1.08047 3.43993 29.44999 -31.89819 95.74595 -109.16943 44.23284 -42.61589 0. -16. 0. 13. ] [ 1.42039 -0.85454 34.47696 -38.27643 102.6941 -109.16943 44.23284 -45.61589 3. 3.11619 -24.62166 18.50548] [ 1.42039 -0.85454 28.73186 -31.89819 101.82558 -108.23515 37.44508 -38.61589 0. -2.08935 60.01318 -57.92383]] >>> stdFromPH = CdfFromPH(betap, Bp, np.arange(0.,1.1,0.1)) >>> print(stdFromPH) [ 0.31678 0.57513 0.67546 0.74313 0.7949 0.83595 0.8688 0.89511 0.91618 0.93304 0.94652] >>> stmFromME = MomentsFromME(beta, B, 5) >>> print(stmFromME) [0.23252260678168368, 0.20068950224745336, 0.2668397995308035, 0.47402477308795293, 1.0522657070139294]