This list is closed, nobody may subscribe to it.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(10) |
Aug
(5) |
Sep
(3) |
Oct
(41) |
Nov
(41) |
Dec
(33) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(75) |
Feb
(10) |
Mar
(170) |
Apr
(174) |
May
(66) |
Jun
(11) |
Jul
(10) |
Aug
(44) |
Sep
(73) |
Oct
(28) |
Nov
(139) |
Dec
(52) |
2003 |
Jan
(35) |
Feb
(93) |
Mar
(62) |
Apr
(10) |
May
(55) |
Jun
(70) |
Jul
(37) |
Aug
(16) |
Sep
(56) |
Oct
(31) |
Nov
(57) |
Dec
(83) |
2004 |
Jan
(85) |
Feb
(67) |
Mar
(27) |
Apr
(37) |
May
(75) |
Jun
(85) |
Jul
(160) |
Aug
(68) |
Sep
(104) |
Oct
(25) |
Nov
(39) |
Dec
(23) |
2005 |
Jan
(10) |
Feb
(45) |
Mar
(43) |
Apr
(19) |
May
(108) |
Jun
(31) |
Jul
(41) |
Aug
(23) |
Sep
(65) |
Oct
(58) |
Nov
(44) |
Dec
(54) |
2006 |
Jan
(96) |
Feb
(27) |
Mar
(69) |
Apr
(59) |
May
(67) |
Jun
(35) |
Jul
(13) |
Aug
(461) |
Sep
(160) |
Oct
(399) |
Nov
(32) |
Dec
(72) |
2007 |
Jan
(316) |
Feb
(305) |
Mar
(318) |
Apr
(54) |
May
(194) |
Jun
(173) |
Jul
(282) |
Aug
(91) |
Sep
(227) |
Oct
(365) |
Nov
(168) |
Dec
(18) |
2008 |
Jan
(71) |
Feb
(111) |
Mar
(155) |
Apr
(173) |
May
(70) |
Jun
(67) |
Jul
(55) |
Aug
(83) |
Sep
(32) |
Oct
(68) |
Nov
(80) |
Dec
(29) |
2009 |
Jan
(46) |
Feb
(18) |
Mar
(95) |
Apr
(76) |
May
(140) |
Jun
(98) |
Jul
(84) |
Aug
(123) |
Sep
(94) |
Oct
(131) |
Nov
(142) |
Dec
(125) |
2010 |
Jan
(128) |
Feb
(158) |
Mar
(172) |
Apr
(134) |
May
(94) |
Jun
(84) |
Jul
(32) |
Aug
(127) |
Sep
(167) |
Oct
(109) |
Nov
(69) |
Dec
(78) |
2011 |
Jan
(39) |
Feb
(58) |
Mar
(52) |
Apr
(47) |
May
(56) |
Jun
(76) |
Jul
(55) |
Aug
(54) |
Sep
(165) |
Oct
(255) |
Nov
(328) |
Dec
(263) |
2012 |
Jan
(82) |
Feb
(147) |
Mar
(400) |
Apr
(216) |
May
(209) |
Jun
(160) |
Jul
(86) |
Aug
(141) |
Sep
(156) |
Oct
(6) |
Nov
|
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
(2) |
2016 |
Jan
|
Feb
(2) |
Mar
(2) |
Apr
(1) |
May
(1) |
Jun
(2) |
Jul
(1) |
Aug
(1) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
2019 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
(3) |
May
(4) |
Jun
(8) |
Jul
(2) |
Aug
(5) |
Sep
(9) |
Oct
|
Nov
|
Dec
|
From: <car...@us...> - 2012-03-12 15:16:33
|
Revision: 9822 http://octave.svn.sourceforge.net/octave/?rev=9822&view=rev Author: carandraug Date: 2012-03-12 15:16:22 +0000 (Mon, 12 Mar 2012) Log Message: ----------- publish: fix bug due to incorrectly named variables Modified Paths: -------------- trunk/octave-forge/main/miscellaneous/inst/publish.m Modified: trunk/octave-forge/main/miscellaneous/inst/publish.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/publish.m 2012-03-12 15:06:46 UTC (rev 9821) +++ trunk/octave-forge/main/miscellaneous/inst/publish.m 2012-03-12 15:16:22 UTC (rev 9822) @@ -311,7 +311,7 @@ if (!isempty (figures)) for nfig = 1:length (figures) figure (figures(nfig)); - print (sprintf ("%s%d.%s", iFile(1:end-2), nfig, options.imageFormat), + print (sprintf ("%s%d.%s", ifile(1:end-2), nfig, options.imageFormat), sprintf ("-d%s", options.imageFormat), "-color"); if (strcmpi (options.format, "html")); section3_title = "<h2>Generated graphics</h2>\n"; @@ -320,10 +320,10 @@ elseif (strcmpi (options.format, "latex")) section3_title = "\\section*{Generated graphics}\n"; disp_fig = strcat (disp_fig, "\\includegraphics[scale=0.6]{", ifile(1:end-2), - sprintf("%d",nFig), "}\n"); + sprintf("%d",nfig), "}\n"); endif - endfor - endif + endfor + endif endfunction % TO DO This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <car...@us...> - 2012-03-12 15:06:57
|
Revision: 9821 http://octave.svn.sourceforge.net/octave/?rev=9821&view=rev Author: carandraug Date: 2012-03-12 15:06:46 +0000 (Mon, 12 Mar 2012) Log Message: ----------- map: deprecating function in favour of cellfun or arrayfun Modified Paths: -------------- trunk/octave-forge/main/miscellaneous/NEWS trunk/octave-forge/main/miscellaneous/inst/apply.m trunk/octave-forge/main/miscellaneous/inst/map.m Modified: trunk/octave-forge/main/miscellaneous/NEWS =================================================================== --- trunk/octave-forge/main/miscellaneous/NEWS 2012-03-12 14:39:15 UTC (rev 9820) +++ trunk/octave-forge/main/miscellaneous/NEWS 2012-03-12 15:06:46 UTC (rev 9821) @@ -19,8 +19,8 @@ ** The function clip was imported from the audio package. - ** The function `apply' has been deprecated. `cellfun' and `arrayfun' from - octave core should be used instead. + ** The functions `apply' and `map' have been deprecated. `cellfun' and + `arrayfun' from octave core should be used instead. ** The function `partarray' has been removed. `mat2cell' from octave core should be used instead. Modified: trunk/octave-forge/main/miscellaneous/inst/apply.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/apply.m 2012-03-12 14:39:15 UTC (rev 9820) +++ trunk/octave-forge/main/miscellaneous/inst/apply.m 2012-03-12 15:06:46 UTC (rev 9821) @@ -59,9 +59,7 @@ if (! warned) warned = true; warning ("Octave:deprecated-function", - "apply.m has been deprecated, and will be removed in the future.") - warning ("Octave:deprecated-function", - "Use `arrayfun' or `cellfun' instead."); + "apply has been deprecated, and will be removed in the future. Use `arrayfun' or `cellfun' instead."); endif if (nargin == 0) @@ -70,7 +68,7 @@ elseif( nargin < 2) if iscell(fun_handle) for idx=1:length(fun_handle) - rval(idx)=feval(@feval,fun_handle{idx}); + rval(idx)=feval(@feval,fun_handle{idx}); end else rval=feval(@feval,fun_handle); Modified: trunk/octave-forge/main/miscellaneous/inst/map.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-12 14:39:15 UTC (rev 9820) +++ trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-12 15:06:46 UTC (rev 9821) @@ -62,6 +62,13 @@ function return_type = map (fun_handle, data_struct, varargin) + persistent warned = false; + if (! warned) + warned = true; + warning ("Octave:deprecated-function", + "map has been deprecated, and will be removed in the future. Use `arrayfun' or `cellfun' instead."); + endif + if (nargin < 2) print_usage; elseif (!(isnumeric (data_struct) || iscell (data_struct))) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mma...@us...> - 2012-03-12 14:39:24
|
Revision: 9820 http://octave.svn.sourceforge.net/octave/?rev=9820&view=rev Author: mmarzolla Date: 2012-03-12 14:39:15 +0000 (Mon, 12 Mar 2012) Log Message: ----------- Enhancements to dtmc_mtta() Modified Paths: -------------- trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf trunk/octave-forge/main/queueing/doc/summary.txi trunk/octave-forge/main/queueing/inst/dtmc_mtta.m Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-12 12:10:43 UTC (rev 9819) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-12 14:39:15 UTC (rev 9820) @@ -218,11 +218,11 @@ chains (DTMC) or continuous-time chains (CTMC): <ul> -<li>Birth-death process (DTMC and CTMC); -<li>Transient and steady-state occupancy probabilities (DTMC and CTMC); -<li>Mean time to absorption (CTMC); -<li>Time-averaged sojourn times (CTMC); -<li>First passage times (DTMC and CTMC). +<li>Birth-death process; +<li>Transient and steady-state occupancy probabilities; +<li>Mean times to absorption; +<li>Expected sojourn times and time-averaged sojourn times (CTMC only); +<li>Mean first passage times; </ul> @@ -1007,28 +1007,39 @@ <div class="defun"> — Function File: [<var>t</var> <var>B</var>] = <b>dtmc_mtta</b> (<var>P</var>)<var><a name="index-dtmc_005fmtta-16"></a></var><br> +— Function File: [<var>t</var> <var>B</var>] = <b>dtmc_mtta</b> (<var>P, p0</var>)<var><a name="index-dtmc_005fmtta-17"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-disctete-time-17"></a><a name="index-Mean-time-to-absorption-18"></a> -Compute the expected number of steps before absorption for the DTMC -described by the transition probability matrix <var>P</var>, + <p><a name="index-Markov-chain_002c-disctete-time-18"></a><a name="index-Mean-time-to-absorption-19"></a> +Compute the expected number of steps before absorption for the +DTMC with N \times N transition probability matrix <var>P</var>. <p><strong>INPUTS</strong> <dl> -<dt><var>P</var><dd>Transition probability matrix . +<dt><var>P</var><dd>Transition probability matrix. + <br><dt><var>p0</var><dd>Initial state occupancy probabilities. + </dl> <p><strong>OUTPUTS</strong> <dl> -<dt><var>t</var><dd><var>t</var><code>(i)</code> is the expected number of steps before being absorbed, -starting from state i. +<dt><var>t</var><dd>When called with a single argument, <var>t</var> is a vector such that +<var>t</var><code>(i)</code> is the expected number of steps before being +absorbed, starting from state i. When called with two +arguments, <var>t</var> is a scalar and represents the average number of +steps before absorption, given initial state occupancy probabilities +<var>p0</var>. - <br><dt><var>B</var><dd><var>B</var><code>(i,j)</code> is the probability of being absorbed in state -j, starting from state i. If j is not absorbing, -<var>B</var><code>(i,j) = 0</code>; if i is absorbing, then -<var>B</var><code>(i,i) = 1</code>.. + <br><dt><var>B</var><dd>When called with a single argument, <var>B</var> is a N \times N +matrix where <var>B</var><code>(i,j)</code> is the probability of being absorbed +in state j, starting from state i; if j is not +absorbing, <var>B</var><code>(i,j) = 0</code>; if i is absorbing, then +<var>B</var><code>(i,i) = 1</code>. When called with two arguments, <var>B</var> is a +vector with N elements where <var>B</var><code>(j)</code> is the +probability of being absorbed in state <var>j</var>, given initial state +occupancy probabilities <var>p0</var>. </dl> @@ -1062,9 +1073,9 @@ <p><a name="doc_002dctmc_005fcheck_005fQ"></a> <div class="defun"> -— Function File: [<var>result</var> <var>err</var>] = <b>ctmc_check_Q</b> (<var>Q</var>)<var><a name="index-ctmc_005fcheck_005fQ-19"></a></var><br> +— Function File: [<var>result</var> <var>err</var>] = <b>ctmc_check_Q</b> (<var>Q</var>)<var><a name="index-ctmc_005fcheck_005fQ-20"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-20"></a> + <p><a name="index-Markov-chain_002c-continuous-time-21"></a> If <var>Q</var> is a valid infinitesimal generator matrix, return the size (number of rows or columns) of <var>Q</var>. If <var>Q</var> is not an infinitesimal generator matrix, set <var>result</var> to zero, and @@ -1114,10 +1125,10 @@ <p><a name="doc_002dctmc"></a> <div class="defun"> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-21"></a></var><br> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. p0</var>)<var><a name="index-ctmc-22"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-22"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. p0</var>)<var><a name="index-ctmc-23"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-23"></a><a name="index-Continuous-time-Markov-chain-24"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-25"></a><a name="index-Stationary-probabilities-26"></a> + <p><a name="index-Markov-chain_002c-continuous-time-24"></a><a name="index-Continuous-time-Markov-chain-25"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-26"></a><a name="index-Stationary-probabilities-27"></a> With a single argument, compute the stationary state occupancy probability vector <var>p</var>(1), <small class="dots">...</small>, <var>p</var>(N) for a Continuous-Time Markov Chain with infinitesimal generator matrix @@ -1180,9 +1191,9 @@ <p><a name="doc_002dctmc_005fbd"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-27"></a></var><br> +— Function File: <var>Q</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-28"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-28"></a><a name="index-Birth_002ddeath-process-29"></a> + <p><a name="index-Markov-chain_002c-continuous-time-29"></a><a name="index-Birth_002ddeath-process-30"></a> Returns the N \times N infinitesimal generator matrix Q for a birth-death process with given rates. @@ -1242,10 +1253,10 @@ <p><a name="doc_002dctmc_005fexps"></a> <div class="defun"> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-30"></a></var><br> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-31"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-31"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-32"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-32"></a><a name="index-Expected-sojourn-time-33"></a> + <p><a name="index-Markov-chain_002c-continuous-time-33"></a><a name="index-Expected-sojourn-time-34"></a> With three arguments, compute the expected times <var>L</var><code>(i)</code> spent in each state i during the time interval [0,t], assuming that the state occupancy probabilities @@ -1325,9 +1336,9 @@ <p><a name="doc_002dctmc_005ftaexps"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-34"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-35"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-35"></a><a name="index-Time_002dalveraged-sojourn-time-36"></a> + <p><a name="index-Markov-chain_002c-continuous-time-36"></a><a name="index-Time_002dalveraged-sojourn-time-37"></a> Compute the <em>time-averaged sojourn time</em> <var>M</var><code>(i)</code>, defined as the fraction of the time interval [0,t] spent in state i, assuming that the state occupancy probabilities at @@ -1410,9 +1421,9 @@ <p><a name="doc_002dctmc_005fmtta"></a> <div class="defun"> -— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-37"></a></var><br> +— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-38"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-38"></a><a name="index-Mean-time-to-absorption-39"></a> + <p><a name="index-Markov-chain_002c-continuous-time-39"></a><a name="index-Mean-time-to-absorption-40"></a> Compute the Mean-Time to Absorption (MTTA) of the CTMC described by the infinitesimal generator matrix <var>Q</var>, starting from initial occupancy probabilities <var>p</var>. If there are no absorbing states, this @@ -1473,7 +1484,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-40"></a><a name="index-Greiner_002c-S_002e-41"></a><a name="index-de-Meer_002c-H_002e-42"></a><a name="index-Trivedi_002c-K_002e-43"></a> + <p><a name="index-Bolch_002c-G_002e-41"></a><a name="index-Greiner_002c-S_002e-42"></a><a name="index-de-Meer_002c-H_002e-43"></a><a name="index-Trivedi_002c-K_002e-44"></a> <div class="node"> <a name="First-Passage-Times"></a> <p><hr> @@ -1487,10 +1498,10 @@ <p><a name="doc_002dctmc_005ffpt"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-44"></a></var><br> -— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-45"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-45"></a></var><br> +— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-46"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-46"></a><a name="index-First-passage-times-47"></a> + <p><a name="index-Markov-chain_002c-continuous-time-47"></a><a name="index-First-passage-times-48"></a> If called with a single argument, computes the mean first passage times <var>M</var><code>(i,j)</code>, the average times before state <var>j</var> is reached, starting from state <var>i</var>, for all 1 \leq i, j \leq @@ -1596,9 +1607,9 @@ <p><a name="doc_002dqnmm1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-48"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-49"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-49"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-50"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1 queue. @@ -1643,7 +1654,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.3. - <p><a name="index-Bolch_002c-G_002e-50"></a><a name="index-Greiner_002c-S_002e-51"></a><a name="index-de-Meer_002c-H_002e-52"></a><a name="index-Trivedi_002c-K_002e-53"></a> + <p><a name="index-Bolch_002c-G_002e-51"></a><a name="index-Greiner_002c-S_002e-52"></a><a name="index-de-Meer_002c-H_002e-53"></a><a name="index-Trivedi_002c-K_002e-54"></a> <!-- M/M/m --> <div class="node"> <a name="The-M%2fM%2fm-System"></a> @@ -1669,10 +1680,10 @@ <p><a name="doc_002dqnmmm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-54"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-55"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-55"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-56"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-56"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-57"></a> Compute utilization, response time, average number of requests in service and throughput for a M/M/m queue, a queueing system with m identical service centers connected to a single queue. @@ -1724,7 +1735,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.5. - <p><a name="index-Bolch_002c-G_002e-57"></a><a name="index-Greiner_002c-S_002e-58"></a><a name="index-de-Meer_002c-H_002e-59"></a><a name="index-Trivedi_002c-K_002e-60"></a> + <p><a name="index-Bolch_002c-G_002e-58"></a><a name="index-Greiner_002c-S_002e-59"></a><a name="index-de-Meer_002c-H_002e-60"></a><a name="index-Trivedi_002c-K_002e-61"></a> <!-- M/M/inf --> <div class="node"> <a name="The-M%2fM%2finf-System"></a> @@ -1747,7 +1758,7 @@ <p><a name="doc_002dqnmminf"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-61"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-62"></a></var><br> <blockquote> <p>Compute utilization, response time, average number of requests and throughput for a M/M/\infty queue. This is a system with an @@ -1755,7 +1766,7 @@ system is always stable, regardless the values of the arrival and service rates. - <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-62"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-63"></a> <p><strong>INPUTS</strong> @@ -1773,7 +1784,7 @@ different from the utilization, which in the case of M/M/\infty centers is always zero. - <p><a name="index-traffic-intensity-63"></a> + <p><a name="index-traffic-intensity-64"></a> <br><dt><var>R</var><dd>Service center response time. <br><dt><var>Q</var><dd>Average number of requests in the system (which is equal to the @@ -1801,7 +1812,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.4. - <p><a name="index-Bolch_002c-G_002e-64"></a><a name="index-Greiner_002c-S_002e-65"></a><a name="index-de-Meer_002c-H_002e-66"></a><a name="index-Trivedi_002c-K_002e-67"></a> + <p><a name="index-Bolch_002c-G_002e-65"></a><a name="index-Greiner_002c-S_002e-66"></a><a name="index-de-Meer_002c-H_002e-67"></a><a name="index-Trivedi_002c-K_002e-68"></a> <!-- M/M/1/k --> <div class="node"> <a name="The-M%2fM%2f1%2fK-System"></a> @@ -1825,9 +1836,9 @@ <p><a name="doc_002dqnmm1k"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-68"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-69"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-69"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-70"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1/K finite capacity system. In a M/M/1/K queue there is a single server; the maximum number of @@ -1894,9 +1905,9 @@ <p><a name="doc_002dqnmmmk"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-70"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-71"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-71"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-72"></a> Compute utilization, response time, average number of requests and throughput for a M/M/m/K finite capacity system. In a M/M/m/K system there are m \geq 1 identical service @@ -1954,7 +1965,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.6. - <p><a name="index-Bolch_002c-G_002e-72"></a><a name="index-Greiner_002c-S_002e-73"></a><a name="index-de-Meer_002c-H_002e-74"></a><a name="index-Trivedi_002c-K_002e-75"></a> + <p><a name="index-Bolch_002c-G_002e-73"></a><a name="index-Greiner_002c-S_002e-74"></a><a name="index-de-Meer_002c-H_002e-75"></a><a name="index-Trivedi_002c-K_002e-76"></a> <!-- Approximate M/M/m --> <div class="node"> @@ -1976,9 +1987,9 @@ <p><a name="doc_002dqnammm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-76"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-77"></a></var><br> <blockquote> - <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-77"></a> + <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-78"></a> Compute <em>approximate</em> utilization, response time, average number of requests in service and throughput for an asymmetric M/M/m queue. In this system there are m different service centers @@ -2025,7 +2036,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998 - <p><a name="index-Bolch_002c-G_002e-78"></a><a name="index-Greiner_002c-S_002e-79"></a><a name="index-de-Meer_002c-H_002e-80"></a><a name="index-Trivedi_002c-K_002e-81"></a> + <p><a name="index-Bolch_002c-G_002e-79"></a><a name="index-Greiner_002c-S_002e-80"></a><a name="index-de-Meer_002c-H_002e-81"></a><a name="index-Trivedi_002c-K_002e-82"></a> <div class="node"> <a name="The-M%2fG%2f1-System"></a> <a name="The-M_002fG_002f1-System"></a> @@ -2041,9 +2052,9 @@ <p><a name="doc_002dqnmg1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-82"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-83"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-83"></a> + <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-84"></a> Compute utilization, response time, average number of requests and throughput for a M/G/1 system. The service time distribution is described by its mean <var>xavg</var>, and by its second moment @@ -2100,9 +2111,9 @@ <p><a name="doc_002dqnmh1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-84"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-85"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-85"></a> + <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-86"></a> Compute utilization, response time, average number of requests and throughput for a M/H_m/1 system. In this system, the customer service times have hyper-exponential distribution: @@ -2184,7 +2195,7 @@ <li><a accesskey="6" href="#Utility-functions">Utility functions</a>: Utility functions to compute miscellaneous quantities </ul> -<p><a name="index-queueing-networks-86"></a> +<p><a name="index-queueing-networks-87"></a> <!-- INTRODUCTION --> <div class="node"> <a name="Introduction-to-QNs"></a> @@ -2445,13 +2456,13 @@ <p><a name="doc_002dqnmknode"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-87"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-88"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-89"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-90"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-91"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-92"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-93"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-88"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-89"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-90"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-91"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-92"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-93"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-94"></a></var><br> <blockquote> <p>Creates a node; this function can be used together with <code>qnsolve</code>. It is possible to create either single-class nodes @@ -2520,10 +2531,10 @@ <p><a name="doc_002dqnsolve"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-94"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-95"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-96"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-97"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-95"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-96"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-97"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-98"></a></var><br> <blockquote> <p>General evaluator of QN models. Networks can be open, closed or mixed; single as well as multiclass networks are supported. @@ -2701,11 +2712,11 @@ <p><a name="doc_002dqnjackson"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-98"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-99"></a></var><br> -— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-100"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-99"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-100"></a></var><br> +— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-101"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-101"></a><a name="index-Jackson-network-102"></a> + <p><a name="index-open-network_002c-single-class-102"></a><a name="index-Jackson-network-103"></a> With three or four input parameters, this function computes the steady-state occupancy probabilities for a Jackson network. With five input parameters, this function computes the steady-state probability @@ -2787,7 +2798,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 284–287. - <p><a name="index-Bolch_002c-G_002e-103"></a><a name="index-Greiner_002c-S_002e-104"></a><a name="index-de-Meer_002c-H_002e-105"></a><a name="index-Trivedi_002c-K_002e-106"></a> + <p><a name="index-Bolch_002c-G_002e-104"></a><a name="index-Greiner_002c-S_002e-105"></a><a name="index-de-Meer_002c-H_002e-106"></a><a name="index-Trivedi_002c-K_002e-107"></a> <h4 class="subsection">6.3.2 The Convolution Algorithm</h4> @@ -2821,10 +2832,10 @@ <p><a name="doc_002dqnconvolution"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-107"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-108"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-108"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-109"></a></var><br> <blockquote> - <p><a name="index-closed-network-109"></a><a name="index-normalization-constant-110"></a><a name="index-convolution-algorithm-111"></a> + <p><a name="index-closed-network-110"></a><a name="index-normalization-constant-111"></a><a name="index-convolution-algorithm-112"></a> This function implements the <em>convolution algorithm</em> for computing steady-state performance measures of product-form, single-class closed queueing networks. Load-independent service @@ -2915,20 +2926,20 @@ 16, number 9, september 1973, pp. 527–531. <a href="http://doi.acm.org/10.1145/362342.362345">http://doi.acm.org/10.1145/362342.362345</a> - <p><a name="index-Buzen_002c-J_002e-P_002e-112"></a> + <p><a name="index-Buzen_002c-J_002e-P_002e-113"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 313–317. - <p><a name="index-Bolch_002c-G_002e-113"></a><a name="index-Greiner_002c-S_002e-114"></a><a name="index-de-Meer_002c-H_002e-115"></a><a name="index-Trivedi_002c-K_002e-116"></a> + <p><a name="index-Bolch_002c-G_002e-114"></a><a name="index-Greiner_002c-S_002e-115"></a><a name="index-de-Meer_002c-H_002e-116"></a><a name="index-Trivedi_002c-K_002e-117"></a> <!-- Convolution for load-dependent service centers --> <a name="doc_002dqnconvolutionld"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-117"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-118"></a></var><br> <blockquote> - <p><a name="index-closed-network-118"></a><a name="index-normalization-constant-119"></a><a name="index-convolution-algorithm-120"></a><a name="index-load_002ddependent-service-center-121"></a> + <p><a name="index-closed-network-119"></a><a name="index-normalization-constant-120"></a><a name="index-convolution-algorithm-121"></a><a name="index-load_002ddependent-service-center-122"></a> This function implements the <em>convolution algorithm</em> for product-form, single-class closed queueing networks with general load-dependent service centers. @@ -2988,7 +2999,7 @@ Purdue University, feb, 1981 (revised). <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf</a> - <p><a name="index-Schwetman_002c-H_002e-122"></a> + <p><a name="index-Schwetman_002c-H_002e-123"></a> M. Reiser, H. Kobayashi, <cite>On The Convolution Algorithm for Separable Queueing Networks</cite>, In Proceedings of the 1976 ACM SIGMETRICS Conference on Computer Performance Modeling Measurement and @@ -2996,7 +3007,7 @@ 1976). SIGMETRICS '76. ACM, New York, NY, pp. 109–117. <a href="http://doi.acm.org/10.1145/800200.806187">http://doi.acm.org/10.1145/800200.806187</a> - <p><a name="index-Reiser_002c-M_002e-123"></a><a name="index-Kobayashi_002c-H_002e-124"></a> + <p><a name="index-Reiser_002c-M_002e-124"></a><a name="index-Kobayashi_002c-H_002e-125"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -3008,7 +3019,7 @@ function f_i defined in Schwetman, <code>Some Computational Aspects of Queueing Network Models</code>. - <p><a name="index-Bolch_002c-G_002e-125"></a><a name="index-Greiner_002c-S_002e-126"></a><a name="index-de-Meer_002c-H_002e-127"></a><a name="index-Trivedi_002c-K_002e-128"></a> + <p><a name="index-Bolch_002c-G_002e-126"></a><a name="index-Greiner_002c-S_002e-127"></a><a name="index-de-Meer_002c-H_002e-128"></a><a name="index-Trivedi_002c-K_002e-129"></a> <h4 class="subsection">6.3.3 Open networks</h4> @@ -3016,10 +3027,10 @@ <p><a name="doc_002dqnopensingle"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-129"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-130"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-130"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-131"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-131"></a><a name="index-BCMP-network-132"></a> + <p><a name="index-open-network_002c-single-class-132"></a><a name="index-BCMP-network-133"></a> Analyze open, single class BCMP queueing networks. <p>This function works for a subset of BCMP single-class open networks @@ -3112,16 +3123,16 @@ Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-133"></a><a name="index-Greiner_002c-S_002e-134"></a><a name="index-de-Meer_002c-H_002e-135"></a><a name="index-Trivedi_002c-K_002e-136"></a> + <p><a name="index-Bolch_002c-G_002e-134"></a><a name="index-Greiner_002c-S_002e-135"></a><a name="index-de-Meer_002c-H_002e-136"></a><a name="index-Trivedi_002c-K_002e-137"></a> <!-- Open network with multiple classes --> <p><a name="doc_002dqnopenmulti"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-137"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-138"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-138"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-139"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-multiple-classes-139"></a> + <p><a name="index-open-network_002c-multiple-classes-140"></a> Exact analysis of open, multiple-class BCMP networks. The network can be made of <em>single-server</em> queueing centers (FCFS, LCFS-PR or PS) or delay centers (IS). This function assumes a network with @@ -3186,7 +3197,7 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.1 ("Open Model Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-140"></a><a name="index-Zahorjan_002c-J_002e-141"></a><a name="index-Graham_002c-G_002e-S_002e-142"></a><a name="index-Sevcik_002c-K_002e-C_002e-143"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-141"></a><a name="index-Zahorjan_002c-J_002e-142"></a><a name="index-Graham_002c-G_002e-S_002e-143"></a><a name="index-Sevcik_002c-K_002e-C_002e-144"></a> <h4 class="subsection">6.3.4 Closed Networks</h4> @@ -3194,11 +3205,11 @@ <p><a name="doc_002dqnclosedsinglemva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-144"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-145"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-146"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-145"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-146"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-147"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-147"></a><a name="index-closed-network_002c-single-class-148"></a><a name="index-normalization-constant-149"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-148"></a><a name="index-closed-network_002c-single-class-149"></a><a name="index-normalization-constant-150"></a> Analyze closed, single class queueing networks using the exact Mean Value Analysis (MVA) algorithm. The following queueing disciplines are supported: FCFS, LCFS-PR, PS and IS (Infinite Server). This @@ -3299,7 +3310,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-150"></a><a name="index-Lavenberg_002c-S_002e-S_002e-151"></a> + <p><a name="index-Reiser_002c-M_002e-151"></a><a name="index-Lavenberg_002c-S_002e-S_002e-152"></a> This implementation is described in R. Jain , <cite>The Art of Computer Systems Performance Analysis</cite>, Wiley, 1991, p. 577. Multi-server nodes <!-- and the computation of @math{G(N)}, --> @@ -3308,15 +3319,15 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 8.2.1, "Single Class Queueing Networks". - <p><a name="index-Jain_002c-R_002e-152"></a><a name="index-Bolch_002c-G_002e-153"></a><a name="index-Greiner_002c-S_002e-154"></a><a name="index-de-Meer_002c-H_002e-155"></a><a name="index-Trivedi_002c-K_002e-156"></a> + <p><a name="index-Jain_002c-R_002e-153"></a><a name="index-Bolch_002c-G_002e-154"></a><a name="index-Greiner_002c-S_002e-155"></a><a name="index-de-Meer_002c-H_002e-156"></a><a name="index-Trivedi_002c-K_002e-157"></a> <!-- MVA for single class, closed networks with load dependent servers --> <a name="doc_002dqnclosedsinglemvald"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-157"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-158"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-158"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-159"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-159"></a><a name="index-closed-network_002c-single-class-160"></a><a name="index-load_002ddependent-service-center-161"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-160"></a><a name="index-closed-network_002c-single-class-161"></a><a name="index-load_002ddependent-service-center-162"></a> Exact MVA algorithm for closed, single class queueing networks with load-dependent service centers. This function supports FCFS, LCFS-PR, PS and IS nodes. For networks with only fixed-rate @@ -3374,15 +3385,15 @@ 1998, Section 8.2.4.1, “Networks with Load-Deèpendent Service: Closed Networks”. - <p><a name="index-Bolch_002c-G_002e-162"></a><a name="index-Greiner_002c-S_002e-163"></a><a name="index-de-Meer_002c-H_002e-164"></a><a name="index-Trivedi_002c-K_002e-165"></a> + <p><a name="index-Bolch_002c-G_002e-163"></a><a name="index-Greiner_002c-S_002e-164"></a><a name="index-de-Meer_002c-H_002e-165"></a><a name="index-Trivedi_002c-K_002e-166"></a> <!-- CMVA for single class, closed networks with a single load dependent servers --> <a name="doc_002dqncmva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-166"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-167"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-167"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-168"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-168"></a><a name="index-CMVA-169"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-169"></a><a name="index-CMVA-170"></a> Implementation of the Conditional MVA (CMVA) algorithm, a numerically stable variant of MVA for load-dependent servers. CMVA is described in G. Casale, <cite>A Note on Stable Flow-Equivalent Aggregation in @@ -3436,19 +3447,19 @@ closed networks</cite>. Queueing Syst. Theory Appl., 60:193–202, December 2008. - <p><a name="index-Casale_002c-G_002e-170"></a> + <p><a name="index-Casale_002c-G_002e-171"></a> <!-- Approximate MVA for single class, closed networks --> <p><a name="doc_002dqnclosedsinglemvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-171"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-172"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-173"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-174"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-175"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-172"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-173"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-174"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-175"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-176"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-176"></a><a name="index-Approximate-MVA-177"></a><a name="index-Closed-network_002c-single-class-178"></a><a name="index-Closed-network_002c-approximate-analysis-179"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-177"></a><a name="index-Approximate-MVA-178"></a><a name="index-Closed-network_002c-single-class-179"></a><a name="index-Closed-network_002c-approximate-analysis-180"></a> Analyze closed, single class queueing networks using the Approximate Mean Value Analysis (MVA) algorithm. This function is based on approximating the number of customers seen at center k when a @@ -3527,20 +3538,20 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 6.4.2.2 ("Approximate Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-180"></a><a name="index-Zahorjan_002c-J_002e-181"></a><a name="index-Graham_002c-G_002e-S_002e-182"></a><a name="index-Sevcik_002c-K_002e-C_002e-183"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-181"></a><a name="index-Zahorjan_002c-J_002e-182"></a><a name="index-Graham_002c-G_002e-S_002e-183"></a><a name="index-Sevcik_002c-K_002e-C_002e-184"></a> <!-- MVA for multiple class, closed networks --> <p><a name="doc_002dqnclosedmultimva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-184"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-185"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-186"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-187"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-188"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-189"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-185"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-186"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-187"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-188"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-189"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-190"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-190"></a><a name="index-closed-network_002c-multiple-classes-191"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-191"></a><a name="index-closed-network_002c-multiple-classes-192"></a> Analyze closed, multiclass queueing networks with K service centers and C independent customer classes (chains) using the Mean Value Analysys (MVA) algorithm. @@ -3670,7 +3681,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-192"></a><a name="index-Lavenberg_002c-S_002e-S_002e-193"></a> + <p><a name="index-Reiser_002c-M_002e-193"></a><a name="index-Lavenberg_002c-S_002e-S_002e-194"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -3680,18 +3691,18 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.2.1 ("Exact Solution Techniques"). - <p><a name="index-Bolch_002c-G_002e-194"></a><a name="index-Greiner_002c-S_002e-195"></a><a name="index-de-Meer_002c-H_002e-196"></a><a name="index-Trivedi_002c-K_002e-197"></a><a name="index-Lazowska_002c-E_002e-D_002e-198"></a><a name="index-Zahorjan_002c-J_002e-199"></a><a name="index-Graham_002c-G_002e-S_002e-200"></a><a name="index-Sevcik_002c-K_002e-C_002e-201"></a> + <p><a name="index-Bolch_002c-G_002e-195"></a><a name="index-Greiner_002c-S_002e-196"></a><a name="index-de-Meer_002c-H_002e-197"></a><a name="index-Trivedi_002c-K_002e-198"></a><a name="index-Lazowska_002c-E_002e-D_002e-199"></a><a name="index-Zahorjan_002c-J_002e-200"></a><a name="index-Graham_002c-G_002e-S_002e-201"></a><a name="index-Sevcik_002c-K_002e-C_002e-202"></a> <!-- Approximate MVA, with Bard-Schweitzer approximation --> <a name="doc_002dqnclosedmultimvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-202"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-203"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-204"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-205"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-206"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-203"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-204"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-205"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-206"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-207"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-207"></a><a name="index-Approximate-MVA-208"></a><a name="index-Closed-network_002c-multiple-classes-209"></a><a name="index-Closed-network_002c-approximate-analysis-210"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-208"></a><a name="index-Approximate-MVA-209"></a><a name="index-Closed-network_002c-multiple-classes-210"></a><a name="index-Closed-network_002c-approximate-analysis-211"></a> Analyze closed, multiclass queueing networks with K service centers and C customer classes using the approximate Mean Value Analysys (MVA) algorithm. @@ -3776,12 +3787,12 @@ proc. 4th Int. Symp. on Modelling and Performance Evaluation of Computer Systems, feb. 1979, pp. 51–62. - <p><a name="index-Bard_002c-Y_002e-211"></a> + <p><a name="index-Bard_002c-Y_002e-212"></a> P. Schweitzer, <cite>Approximate Analysis of Multiclass Closed Networks of Queues</cite>, Proc. Int. Conf. on Stochastic Control and Optimization, jun 1979, pp. 25–29. - <p><a name="index-Schweitzer_002c-P_002e-212"></a> + <p><a name="index-Schweitzer_002c-P_002e-213"></a> This implementation is based on Edward D. Lazowska, John Zahorjan, G. Scott Graham, and Kenneth C. Sevcik, <cite>Quantitative System Performance: Computer System Analysis Using Queueing Network Models</cite>, @@ -3792,7 +3803,7 @@ described above, as it computes the average response times R instead of the residence times. - <p><a name="index-Lazowska_002c-E_002e-D_002e-213"></a><a name="index-Zahorjan_002c-J_002e-214"></a><a name="index-Graham_002c-G_002e-S_002e-215"></a><a name="index-Sevcik_002c-K_002e-C_002e-216"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-214"></a><a name="index-Zahorjan_002c-J_002e-215"></a><a name="index-Graham_002c-G_002e-S_002e-216"></a><a name="index-Sevcik_002c-K_002e-C_002e-217"></a> <h4 class="subsection">6.3.5 Mixed Networks</h4> @@ -3800,9 +3811,9 @@ <p><a name="doc_002dqnmix"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmix</b> (<var>lambda, N, S, V, m</var>)<var><a name="index-qnmix-217"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmix</b> (<var>lambda, N, S, V, m</var>)<var><a name="index-qnmix-218"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-218"></a><a name="index-mixed-network-219"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-219"></a><a name="index-mixed-network-220"></a> Solution of mixed queueing networks through MVA. The network consists of K service centers (single-server or delay centers) and C independent customer chains. Both open and closed chains @@ -3893,14 +3904,14 @@ Note that in this function we compute the mean response time R instead of the mean residence time as in the reference. - <p><a name="index-Lazowska_002c-E_002e-D_002e-220"></a><a name="index-Zahorjan_002c-J_002e-221"></a><a name="index-Graham_002c-G_002e-S_002e-222"></a><a name="index-Sevcik_002c-K_002e-C_002e-223"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-221"></a><a name="index-Zahorjan_002c-J_002e-222"></a><a name="index-Graham_002c-G_002e-S_002e-223"></a><a name="index-Sevcik_002c-K_002e-C_002e-224"></a> Herb Schwetman, <cite>Implementing the Mean Value Algorithm for the Solution of Queueing Network Models</cite>, Technical Report CSD-TR-355, Department of Computer Sciences, Purdue University, feb 15, 1982, available at <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-355.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-355.pdf</a> - <p><a name="index-Schwetman_002c-H_002e-224"></a> + <p><a name="index-Schwetman_002c-H_002e-225"></a> <div class="node"> <a name="Algorithms-for-non-Product-form-QNs"></a> @@ -3919,9 +3930,9 @@ <p><a name="doc_002dqnmvablo"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmvablo</b> (<var>N, S, M, P</var>)<var><a name="index-qnmvablo-225"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmvablo</b> (<var>N, S, M, P</var>)<var><a name="index-qnmvablo-226"></a></var><br> <blockquote> - <p><a name="index-queueing-network-with-blocking-226"></a><a name="index-blocking-queueing-network-227"></a><a name="index-closed-network_002c-finite-capacity-228"></a> + <p><a name="index-queueing-network-with-blocking-227"></a><a name="index-blocking-queueing-network-228"></a><a name="index-closed-network_002c-finite-capacity-229"></a> MVA algorithm for closed queueing networks with blocking. <samp><span class="command">qnmvablo</span></samp> computes approximate utilization, response time and mean queue length for closed, single class queueing networks with blocking. @@ -3976,16 +3987,16 @@ Networks</cite>, IEEE Transactions on Software Engineering, vol. 14, n. 2, april 1988, pp. 418–428. <a href="http://dx.doi.org/10.1109/32.4663">http://dx.doi.org/10.1109/32.4663</a> - <p><a name="index-Akyildiz_002c-I_002e-F_002e-229"></a> + <p><a name="index-Akyildiz_002c-I_002e-F_002e-230"></a> <a name="doc_002dqnmarkov"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P</var>)<var><a name="index-qnmarkov-230"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P, m</var>)<var><a name="index-qnmarkov-231"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P</var>)<var><a name="index-qnmarkov-232"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P, m</var>)<var><a name="index-qnmarkov-233"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P</var>)<var><a name="index-qnmarkov-231"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P, m</var>)<var><a name="index-qnmarkov-232"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P</var>)<var><a name="index-qnmarkov-233"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P, m</var>)<var><a name="index-qnmarkov-234"></a></var><br> <blockquote> - <p><a name="index-closed-network_002c-multiple-classes-234"></a><a name="index-closed-network_002c-finite-capacity-235"></a><a name="index-blocking-queueing-network-236"></a><a name="index-RS-blocking-237"></a> + <p><a name="index-closed-network_002c-multiple-classes-235"></a><a name="index-closed-network_002c-finite-capacity-236"></a><a name="index-blocking-queueing-network-237"></a><a name="index-RS-blocking-238"></a> Compute utilization, response time, average queue length and throughput for open or closed queueing networks with finite capacity. Blocking type is Repetitive-Service (RS). This function explicitly @@ -4095,9 +4106,9 @@ <p><a name="doc_002dqnopenab"></a> <div class="defun"> -— Function File: [<var>Xu</var>, <var>Rl</var>] = <b>qnopenab</b> (<var>lambda, D</var>)<var><a name="index-qnopenab-238"></a></var><br> +— Function File: [<var>Xu</var>, <var>Rl</var>] = <b>qnopenab</b> (<var>lambda, D</var>)<var><a name="index-qnopenab-239"></a></var><br> <blockquote> - <p><a name="index-bounds_002c-asymptotic-239"></a><a name="index-open-network-240"></a> + <p><a name="index-bounds_002c-asymptotic-240"></a><a name="index-open-network-241"></a> Compute Asymptotic Bounds for single-class, open Queueing Networks with K service centers. @@ -4137,14 +4148,14 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In parti... [truncated message content] |
From: <mma...@us...> - 2012-03-12 12:10:50
|
Revision: 9819 http://octave.svn.sourceforge.net/octave/?rev=9819&view=rev Author: mmarzolla Date: 2012-03-12 12:10:43 +0000 (Mon, 12 Mar 2012) Log Message: ----------- modifications Modified Paths: -------------- trunk/octave-forge/main/queueing/inst/dtmc_mtta.m Modified: trunk/octave-forge/main/queueing/inst/dtmc_mtta.m =================================================================== --- trunk/octave-forge/main/queueing/inst/dtmc_mtta.m 2012-03-12 10:58:39 UTC (rev 9818) +++ trunk/octave-forge/main/queueing/inst/dtmc_mtta.m 2012-03-12 12:10:43 UTC (rev 9819) @@ -100,4 +100,73 @@ %! assert( t, [0 3 4 3 0], 10*eps ); %! assert( B([2 3 4],[1 5]), [3/4 1/4; 1/2 1/2; 1/4 3/4], 10*eps ); %! assert( B(1,1), 1 ); -%! assert( B(5,5), 1 ); \ No newline at end of file +%! assert( B(5,5), 1 ); + +## Compute the probability of completing the "snakes and ladders" +## game in n steps, for various values of n. Also, computes the expected +## number of steps which are necessary to complete the game. +## Source: +## http://mapleta.emich.edu/aross15/coursepack3419/419/ch-04/chutes-and-ladders.pdf +%!demo +%! n = 6; +%! P = zeros(101,101); +%! ## setup transitions through the spinner +%! for j=0:(100-n) +%! for i=1:n +%! P(1+j,1+j+i) = 1/n; +%! endfor +%! endfor +%! for j=(101-n):100 +%! P(1+j,1+j) = (n-100+j)/n; +%! endfor +%! for j=(101-n):100 +%! for i=1:(100-j) +%! P(1+j,1+j+i) = 1/n; +%! endfor +%! endfor +%! Pstar = P; +%! ## setup snakes and ladders +%! SL = [1 38; \ +%! 4 14; \ +%! 9 31; \ +%! 16 6; \ +%! 21 42; \ +%! 28 84; \ +%! 36 44; \ +%! 47 26; \ +%! 49 11; \ +%! 51 67; \ +%! 56 53; \ +%! 62 19; \ +%! 64 60; \ +%! 71 91; \ +%! 80 100; \ +%! 87 24; \ +%! 93 73; \ +%! 95 75; \ +%! 98 78 ]; +%! for ii=SL; +%! i = ii(1); +%! j = ii(2); +%! Pstar(1+i,:) = 0; +%! for k=0:100 +%! if ( k != j ) +%! Pstar(1+k,1+j) = P(1+k,1+j) + P(1+k,1+i); +%! endif +%! endfor +%! Pstar(:,1+i) = 0; +%! endfor +%! Pstar += diag( 1-sum(Pstar,2) ); +%! +%! nsteps = 50; # number of steps +%! Pfinish = zeros(1,nsteps); # Pfinish(i) = probability of finishing after step i +%! start = zeros(1,101); start(1) = 1; +%! for i=1:nsteps +%! pn = dtmc(Pstar,i,start); +%! Pfinish(i) = pn(101); # state 101 is the ending (absorbing) state +%! endfor +%! f = dtmc_mtta(Pstar); +%! ## f(1) is the mean time to absorption starting from state 1 +%! printf("Average number of steps to complete the game: %f\n", f(1) ); +%! plot(Pfinish, ";Probability of finishing the game;"); +%! xlabel("Step number"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mma...@us...> - 2012-03-12 10:58:53
|
Revision: 9818 http://octave.svn.sourceforge.net/octave/?rev=9818&view=rev Author: mmarzolla Date: 2012-03-12 10:58:39 +0000 (Mon, 12 Mar 2012) Log Message: ----------- New function dtmc_mtta() added; removed deprecated functions Modified Paths: -------------- trunk/octave-forge/main/queueing/ChangeLog trunk/octave-forge/main/queueing/NEWS trunk/octave-forge/main/queueing/doc/markovchains.txi trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf Added Paths: ----------- trunk/octave-forge/main/queueing/inst/dtmc_mtta.m Removed Paths: ------------- trunk/octave-forge/main/queueing/inst/ctmc_solve.m trunk/octave-forge/main/queueing/inst/dtmc_solve.m Modified: trunk/octave-forge/main/queueing/ChangeLog =================================================================== --- trunk/octave-forge/main/queueing/ChangeLog 2012-03-11 20:53:31 UTC (rev 9817) +++ trunk/octave-forge/main/queueing/ChangeLog 2012-03-12 10:58:39 UTC (rev 9818) @@ -11,9 +11,12 @@ in future releases. * ctmc_bd() now returns the infinitesimal generator matrix of the birth-death process, not the steady-state solution. - * ctmc_bd_solve() has been removed - * dtmc_bd() has been added - * ctmc_check_Q() has been added + * ctmc_bd_solve() (which was deprecated) has been removed + * ctmc_solve() (which was deprecated) has been removed + * dtmc_solve() (which was deprecated) has been removed + * dtmc_bd() added + * ctmc_check_Q() added + * dtmc_mtta() added * Miscellaneous fixes/improvements to the documentation 2012-02-04 Moreno Marzolla <mar...@cs...> Modified: trunk/octave-forge/main/queueing/NEWS =================================================================== --- trunk/octave-forge/main/queueing/NEWS 2012-03-11 20:53:31 UTC (rev 9817) +++ trunk/octave-forge/main/queueing/NEWS 2012-03-12 10:58:39 UTC (rev 9818) @@ -11,11 +11,12 @@ of the birth-death process with given rates, not the steady-state solution. -** New function dtmc_bd() added +** The following new functions have been added: dtmc_bd(), dtmc_mtta(), + ctmc_check_Q() -** Function ctmc_bd_solve() has been removed +** The following deprecated functions have been removed: ctmc_bd_solve(), + ctmc_solve(), dtmc_solve() -** New function ctmc_check_Q() added Summary of important user-visible changes for queueing-1.0.0 ------------------------------------------------------------------------------ Modified: trunk/octave-forge/main/queueing/doc/markovchains.txi =================================================================== --- trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-11 20:53:31 UTC (rev 9817) +++ trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-12 10:58:39 UTC (rev 9818) @@ -145,8 +145,13 @@ @DOCSTRING(dtmc_fpt) @c +@subsection Mean Time to Absorption + +@DOCSTRING(dtmc_mtta) + @c @c +@c @node Continuous-Time Markov Chains @section Continuous-Time Markov Chains @@ -178,7 +183,7 @@ * Birth-Death process:: * Expected Sojourn Time:: * Time-Averaged Expected Sojourn Time:: -* Expected Time to Absorption:: +* Mean Time to Absorption:: * First Passage Times:: @end menu @@ -323,8 +328,8 @@ @c @c @c -@node Expected Time to Absorption -@subsection Expected Time to Absorption +@node Mean Time to Absorption +@subsection Mean Time to Absorption If we consider a Markov Chain with absorbing states, it is possible to define the @emph{expected time to absorption} as the expected time Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-11 20:53:31 UTC (rev 9817) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-12 10:58:39 UTC (rev 9818) @@ -59,6 +59,7 @@ <li><a href="#Discrete_002dTime-Markov-Chains">4.1.1 State occupancy probabilities</a> <li><a href="#Discrete_002dTime-Markov-Chains">4.1.2 Birth-Death process</a> <li><a href="#Discrete_002dTime-Markov-Chains">4.1.3 First passage times</a> +<li><a href="#Discrete_002dTime-Markov-Chains">4.1.4 Mean Time to Absorption</a> </li></ul> <li><a href="#Continuous_002dTime-Markov-Chains">4.2 Continuous-Time Markov Chains</a> <ul> @@ -66,7 +67,7 @@ <li><a href="#Birth_002dDeath-process">4.2.2 Birth-Death process</a> <li><a href="#Expected-Sojourn-Time">4.2.3 Expected Sojourn Time</a> <li><a href="#Time_002dAveraged-Expected-Sojourn-Time">4.2.4 Time-Averaged Expected Sojourn Time</a> -<li><a href="#Expected-Time-to-Absorption">4.2.5 Expected Time to Absorption</a> +<li><a href="#Mean-Time-to-Absorption">4.2.5 Mean Time to Absorption</a> <li><a href="#First-Passage-Times">4.2.6 First Passage Times</a> </li></ul> </li></ul> @@ -1000,6 +1001,39 @@ </blockquote></div> +<h4 class="subsection">4.1.4 Mean Time to Absorption</h4> + +<p><a name="doc_002ddtmc_005fmtta"></a> + +<div class="defun"> +— Function File: [<var>t</var> <var>B</var>] = <b>dtmc_mtta</b> (<var>P</var>)<var><a name="index-dtmc_005fmtta-16"></a></var><br> +<blockquote> + <p><a name="index-Markov-chain_002c-disctete-time-17"></a><a name="index-Mean-time-to-absorption-18"></a> +Compute the expected number of steps before absorption for the DTMC +described by the transition probability matrix <var>P</var>, + + <p><strong>INPUTS</strong> + + <dl> +<dt><var>P</var><dd>Transition probability matrix . + + </dl> + + <p><strong>OUTPUTS</strong> + + <dl> +<dt><var>t</var><dd><var>t</var><code>(i)</code> is the expected number of steps before being absorbed, +starting from state i. + + <br><dt><var>B</var><dd><var>B</var><code>(i,j)</code> is the probability of being absorbed in state +j, starting from state i. If j is not absorbing, +<var>B</var><code>(i,j) = 0</code>; if i is absorbing, then +<var>B</var><code>(i,i) = 1</code>.. + + </dl> + + </blockquote></div> + <div class="node"> <a name="Continuous-Time-Markov-Chains"></a> <a name="Continuous_002dTime-Markov-Chains"></a> @@ -1028,9 +1062,9 @@ <p><a name="doc_002dctmc_005fcheck_005fQ"></a> <div class="defun"> -— Function File: [<var>result</var> <var>err</var>] = <b>ctmc_check_Q</b> (<var>Q</var>)<var><a name="index-ctmc_005fcheck_005fQ-16"></a></var><br> +— Function File: [<var>result</var> <var>err</var>] = <b>ctmc_check_Q</b> (<var>Q</var>)<var><a name="index-ctmc_005fcheck_005fQ-19"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-17"></a> + <p><a name="index-Markov-chain_002c-continuous-time-20"></a> If <var>Q</var> is a valid infinitesimal generator matrix, return the size (number of rows or columns) of <var>Q</var>. If <var>Q</var> is not an infinitesimal generator matrix, set <var>result</var> to zero, and @@ -1043,7 +1077,7 @@ <li><a accesskey="2" href="#Birth_002dDeath-process">Birth-Death process</a> <li><a accesskey="3" href="#Expected-Sojourn-Time">Expected Sojourn Time</a> <li><a accesskey="4" href="#Time_002dAveraged-Expected-Sojourn-Time">Time-Averaged Expected Sojourn Time</a> -<li><a accesskey="5" href="#Expected-Time-to-Absorption">Expected Time to Absorption</a> +<li><a accesskey="5" href="#Mean-Time-to-Absorption">Mean Time to Absorption</a> <li><a accesskey="6" href="#First-Passage-Times">First Passage Times</a> </ul> @@ -1080,10 +1114,10 @@ <p><a name="doc_002dctmc"></a> <div class="defun"> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-18"></a></var><br> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. p0</var>)<var><a name="index-ctmc-19"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-21"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. p0</var>)<var><a name="index-ctmc-22"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-20"></a><a name="index-Continuous-time-Markov-chain-21"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-22"></a><a name="index-Stationary-probabilities-23"></a> + <p><a name="index-Markov-chain_002c-continuous-time-23"></a><a name="index-Continuous-time-Markov-chain-24"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-25"></a><a name="index-Stationary-probabilities-26"></a> With a single argument, compute the stationary state occupancy probability vector <var>p</var>(1), <small class="dots">...</small>, <var>p</var>(N) for a Continuous-Time Markov Chain with infinitesimal generator matrix @@ -1146,9 +1180,9 @@ <p><a name="doc_002dctmc_005fbd"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-24"></a></var><br> +— Function File: <var>Q</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-27"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-25"></a><a name="index-Birth_002ddeath-process-26"></a> + <p><a name="index-Markov-chain_002c-continuous-time-28"></a><a name="index-Birth_002ddeath-process-29"></a> Returns the N \times N infinitesimal generator matrix Q for a birth-death process with given rates. @@ -1208,10 +1242,10 @@ <p><a name="doc_002dctmc_005fexps"></a> <div class="defun"> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-27"></a></var><br> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-28"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-30"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-31"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-29"></a><a name="index-Expected-sojourn-time-30"></a> + <p><a name="index-Markov-chain_002c-continuous-time-32"></a><a name="index-Expected-sojourn-time-33"></a> With three arguments, compute the expected times <var>L</var><code>(i)</code> spent in each state i during the time interval [0,t], assuming that the state occupancy probabilities @@ -1280,7 +1314,7 @@ <a name="Time-Averaged-Expected-Sojourn-Time"></a> <a name="Time_002dAveraged-Expected-Sojourn-Time"></a> <p><hr> -Next: <a rel="next" accesskey="n" href="#Expected-Time-to-Absorption">Expected Time to Absorption</a>, +Next: <a rel="next" accesskey="n" href="#Mean-Time-to-Absorption">Mean Time to Absorption</a>, Previous: <a rel="previous" accesskey="p" href="#Expected-Sojourn-Time">Expected Sojourn Time</a>, Up: <a rel="up" accesskey="u" href="#Continuous_002dTime-Markov-Chains">Continuous-Time Markov Chains</a> @@ -1291,9 +1325,9 @@ <p><a name="doc_002dctmc_005ftaexps"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-31"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-34"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-32"></a><a name="index-Time_002dalveraged-sojourn-time-33"></a> + <p><a name="index-Markov-chain_002c-continuous-time-35"></a><a name="index-Time_002dalveraged-sojourn-time-36"></a> Compute the <em>time-averaged sojourn time</em> <var>M</var><code>(i)</code>, defined as the fraction of the time interval [0,t] spent in state i, assuming that the state occupancy probabilities at @@ -1348,7 +1382,7 @@ ylabel("Time-averaged Expected sojourn time");</pre> </pre> <div class="node"> -<a name="Expected-Time-to-Absorption"></a> +<a name="Mean-Time-to-Absorption"></a> <p><hr> Next: <a rel="next" accesskey="n" href="#First-Passage-Times">First Passage Times</a>, Previous: <a rel="previous" accesskey="p" href="#Time_002dAveraged-Expected-Sojourn-Time">Time-Averaged Expected Sojourn Time</a>, @@ -1356,7 +1390,7 @@ </div> -<h4 class="subsection">4.2.5 Expected Time to Absorption</h4> +<h4 class="subsection">4.2.5 Mean Time to Absorption</h4> <p>If we consider a Markov Chain with absorbing states, it is possible to define the <em>expected time to absorption</em> as the expected time @@ -1376,9 +1410,9 @@ <p><a name="doc_002dctmc_005fmtta"></a> <div class="defun"> -— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-34"></a></var><br> +— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-37"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-35"></a><a name="index-Mean-time-to-absorption-36"></a> + <p><a name="index-Markov-chain_002c-continuous-time-38"></a><a name="index-Mean-time-to-absorption-39"></a> Compute the Mean-Time to Absorption (MTTA) of the CTMC described by the infinitesimal generator matrix <var>Q</var>, starting from initial occupancy probabilities <var>p</var>. If there are no absorbing states, this @@ -1439,11 +1473,11 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-37"></a><a name="index-Greiner_002c-S_002e-38"></a><a name="index-de-Meer_002c-H_002e-39"></a><a name="index-Trivedi_002c-K_002e-40"></a> + <p><a name="index-Bolch_002c-G_002e-40"></a><a name="index-Greiner_002c-S_002e-41"></a><a name="index-de-Meer_002c-H_002e-42"></a><a name="index-Trivedi_002c-K_002e-43"></a> <div class="node"> <a name="First-Passage-Times"></a> <p><hr> -Previous: <a rel="previous" accesskey="p" href="#Expected-Time-to-Absorption">Expected Time to Absorption</a>, +Previous: <a rel="previous" accesskey="p" href="#Mean-Time-to-Absorption">Mean Time to Absorption</a>, Up: <a rel="up" accesskey="u" href="#Continuous_002dTime-Markov-Chains">Continuous-Time Markov Chains</a> </div> @@ -1453,10 +1487,10 @@ <p><a name="doc_002dctmc_005ffpt"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-41"></a></var><br> -— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-42"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-44"></a></var><br> +— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-45"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-43"></a><a name="index-First-passage-times-44"></a> + <p><a name="index-Markov-chain_002c-continuous-time-46"></a><a name="index-First-passage-times-47"></a> If called with a single argument, computes the mean first passage times <var>M</var><code>(i,j)</code>, the average times before state <var>j</var> is reached, starting from state <var>i</var>, for all 1 \leq i, j \leq @@ -1562,9 +1596,9 @@ <p><a name="doc_002dqnmm1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-45"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-48"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-46"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-49"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1 queue. @@ -1609,7 +1643,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.3. - <p><a name="index-Bolch_002c-G_002e-47"></a><a name="index-Greiner_002c-S_002e-48"></a><a name="index-de-Meer_002c-H_002e-49"></a><a name="index-Trivedi_002c-K_002e-50"></a> + <p><a name="index-Bolch_002c-G_002e-50"></a><a name="index-Greiner_002c-S_002e-51"></a><a name="index-de-Meer_002c-H_002e-52"></a><a name="index-Trivedi_002c-K_002e-53"></a> <!-- M/M/m --> <div class="node"> <a name="The-M%2fM%2fm-System"></a> @@ -1635,10 +1669,10 @@ <p><a name="doc_002dqnmmm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-51"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-52"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-54"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-55"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-53"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-56"></a> Compute utilization, response time, average number of requests in service and throughput for a M/M/m queue, a queueing system with m identical service centers connected to a single queue. @@ -1690,7 +1724,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.5. - <p><a name="index-Bolch_002c-G_002e-54"></a><a name="index-Greiner_002c-S_002e-55"></a><a name="index-de-Meer_002c-H_002e-56"></a><a name="index-Trivedi_002c-K_002e-57"></a> + <p><a name="index-Bolch_002c-G_002e-57"></a><a name="index-Greiner_002c-S_002e-58"></a><a name="index-de-Meer_002c-H_002e-59"></a><a name="index-Trivedi_002c-K_002e-60"></a> <!-- M/M/inf --> <div class="node"> <a name="The-M%2fM%2finf-System"></a> @@ -1713,7 +1747,7 @@ <p><a name="doc_002dqnmminf"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-58"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-61"></a></var><br> <blockquote> <p>Compute utilization, response time, average number of requests and throughput for a M/M/\infty queue. This is a system with an @@ -1721,7 +1755,7 @@ system is always stable, regardless the values of the arrival and service rates. - <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-59"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-62"></a> <p><strong>INPUTS</strong> @@ -1739,7 +1773,7 @@ different from the utilization, which in the case of M/M/\infty centers is always zero. - <p><a name="index-traffic-intensity-60"></a> + <p><a name="index-traffic-intensity-63"></a> <br><dt><var>R</var><dd>Service center response time. <br><dt><var>Q</var><dd>Average number of requests in the system (which is equal to the @@ -1767,7 +1801,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.4. - <p><a name="index-Bolch_002c-G_002e-61"></a><a name="index-Greiner_002c-S_002e-62"></a><a name="index-de-Meer_002c-H_002e-63"></a><a name="index-Trivedi_002c-K_002e-64"></a> + <p><a name="index-Bolch_002c-G_002e-64"></a><a name="index-Greiner_002c-S_002e-65"></a><a name="index-de-Meer_002c-H_002e-66"></a><a name="index-Trivedi_002c-K_002e-67"></a> <!-- M/M/1/k --> <div class="node"> <a name="The-M%2fM%2f1%2fK-System"></a> @@ -1791,9 +1825,9 @@ <p><a name="doc_002dqnmm1k"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-65"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-68"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-66"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-69"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1/K finite capacity system. In a M/M/1/K queue there is a single server; the maximum number of @@ -1860,9 +1894,9 @@ <p><a name="doc_002dqnmmmk"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-67"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-70"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-68"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-71"></a> Compute utilization, response time, average number of requests and throughput for a M/M/m/K finite capacity system. In a M/M/m/K system there are m \geq 1 identical service @@ -1920,7 +1954,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.6. - <p><a name="index-Bolch_002c-G_002e-69"></a><a name="index-Greiner_002c-S_002e-70"></a><a name="index-de-Meer_002c-H_002e-71"></a><a name="index-Trivedi_002c-K_002e-72"></a> + <p><a name="index-Bolch_002c-G_002e-72"></a><a name="index-Greiner_002c-S_002e-73"></a><a name="index-de-Meer_002c-H_002e-74"></a><a name="index-Trivedi_002c-K_002e-75"></a> <!-- Approximate M/M/m --> <div class="node"> @@ -1942,9 +1976,9 @@ <p><a name="doc_002dqnammm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-73"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-76"></a></var><br> <blockquote> - <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-74"></a> + <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-77"></a> Compute <em>approximate</em> utilization, response time, average number of requests in service and throughput for an asymmetric M/M/m queue. In this system there are m different service centers @@ -1991,7 +2025,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998 - <p><a name="index-Bolch_002c-G_002e-75"></a><a name="index-Greiner_002c-S_002e-76"></a><a name="index-de-Meer_002c-H_002e-77"></a><a name="index-Trivedi_002c-K_002e-78"></a> + <p><a name="index-Bolch_002c-G_002e-78"></a><a name="index-Greiner_002c-S_002e-79"></a><a name="index-de-Meer_002c-H_002e-80"></a><a name="index-Trivedi_002c-K_002e-81"></a> <div class="node"> <a name="The-M%2fG%2f1-System"></a> <a name="The-M_002fG_002f1-System"></a> @@ -2007,9 +2041,9 @@ <p><a name="doc_002dqnmg1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-79"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-82"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-80"></a> + <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-83"></a> Compute utilization, response time, average number of requests and throughput for a M/G/1 system. The service time distribution is described by its mean <var>xavg</var>, and by its second moment @@ -2066,9 +2100,9 @@ <p><a name="doc_002dqnmh1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-81"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-84"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-82"></a> + <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-85"></a> Compute utilization, response time, average number of requests and throughput for a M/H_m/1 system. In this system, the customer service times have hyper-exponential distribution: @@ -2150,7 +2184,7 @@ <li><a accesskey="6" href="#Utility-functions">Utility functions</a>: Utility functions to compute miscellaneous quantities </ul> -<p><a name="index-queueing-networks-83"></a> +<p><a name="index-queueing-networks-86"></a> <!-- INTRODUCTION --> <div class="node"> <a name="Introduction-to-QNs"></a> @@ -2411,13 +2445,13 @@ <p><a name="doc_002dqnmknode"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-84"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-85"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-86"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-87"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-88"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-89"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-90"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-87"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-88"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-89"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-90"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-91"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-92"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-93"></a></var><br> <blockquote> <p>Creates a node; this function can be used together with <code>qnsolve</code>. It is possible to create either single-class nodes @@ -2486,10 +2520,10 @@ <p><a name="doc_002dqnsolve"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-91"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-92"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-93"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-94"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-94"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-95"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-96"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-97"></a></var><br> <blockquote> <p>General evaluator of QN models. Networks can be open, closed or mixed; single as well as multiclass networks are supported. @@ -2667,11 +2701,11 @@ <p><a name="doc_002dqnjackson"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-95"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-96"></a></var><br> -— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-97"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-98"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-99"></a></var><br> +— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-100"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-98"></a><a name="index-Jackson-network-99"></a> + <p><a name="index-open-network_002c-single-class-101"></a><a name="index-Jackson-network-102"></a> With three or four input parameters, this function computes the steady-state occupancy probabilities for a Jackson network. With five input parameters, this function computes the steady-state probability @@ -2753,7 +2787,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 284–287. - <p><a name="index-Bolch_002c-G_002e-100"></a><a name="index-Greiner_002c-S_002e-101"></a><a name="index-de-Meer_002c-H_002e-102"></a><a name="index-Trivedi_002c-K_002e-103"></a> + <p><a name="index-Bolch_002c-G_002e-103"></a><a name="index-Greiner_002c-S_002e-104"></a><a name="index-de-Meer_002c-H_002e-105"></a><a name="index-Trivedi_002c-K_002e-106"></a> <h4 class="subsection">6.3.2 The Convolution Algorithm</h4> @@ -2787,10 +2821,10 @@ <p><a name="doc_002dqnconvolution"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-104"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-105"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-107"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-108"></a></var><br> <blockquote> - <p><a name="index-closed-network-106"></a><a name="index-normalization-constant-107"></a><a name="index-convolution-algorithm-108"></a> + <p><a name="index-closed-network-109"></a><a name="index-normalization-constant-110"></a><a name="index-convolution-algorithm-111"></a> This function implements the <em>convolution algorithm</em> for computing steady-state performance measures of product-form, single-class closed queueing networks. Load-independent service @@ -2881,20 +2915,20 @@ 16, number 9, september 1973, pp. 527–531. <a href="http://doi.acm.org/10.1145/362342.362345">http://doi.acm.org/10.1145/362342.362345</a> - <p><a name="index-Buzen_002c-J_002e-P_002e-109"></a> + <p><a name="index-Buzen_002c-J_002e-P_002e-112"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 313–317. - <p><a name="index-Bolch_002c-G_002e-110"></a><a name="index-Greiner_002c-S_002e-111"></a><a name="index-de-Meer_002c-H_002e-112"></a><a name="index-Trivedi_002c-K_002e-113"></a> + <p><a name="index-Bolch_002c-G_002e-113"></a><a name="index-Greiner_002c-S_002e-114"></a><a name="index-de-Meer_002c-H_002e-115"></a><a name="index-Trivedi_002c-K_002e-116"></a> <!-- Convolution for load-dependent service centers --> <a name="doc_002dqnconvolutionld"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-114"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-117"></a></var><br> <blockquote> - <p><a name="index-closed-network-115"></a><a name="index-normalization-constant-116"></a><a name="index-convolution-algorithm-117"></a><a name="index-load_002ddependent-service-center-118"></a> + <p><a name="index-closed-network-118"></a><a name="index-normalization-constant-119"></a><a name="index-convolution-algorithm-120"></a><a name="index-load_002ddependent-service-center-121"></a> This function implements the <em>convolution algorithm</em> for product-form, single-class closed queueing networks with general load-dependent service centers. @@ -2954,7 +2988,7 @@ Purdue University, feb, 1981 (revised). <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf</a> - <p><a name="index-Schwetman_002c-H_002e-119"></a> + <p><a name="index-Schwetman_002c-H_002e-122"></a> M. Reiser, H. Kobayashi, <cite>On The Convolution Algorithm for Separable Queueing Networks</cite>, In Proceedings of the 1976 ACM SIGMETRICS Conference on Computer Performance Modeling Measurement and @@ -2962,7 +2996,7 @@ 1976). SIGMETRICS '76. ACM, New York, NY, pp. 109–117. <a href="http://doi.acm.org/10.1145/800200.806187">http://doi.acm.org/10.1145/800200.806187</a> - <p><a name="index-Reiser_002c-M_002e-120"></a><a name="index-Kobayashi_002c-H_002e-121"></a> + <p><a name="index-Reiser_002c-M_002e-123"></a><a name="index-Kobayashi_002c-H_002e-124"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -2974,7 +3008,7 @@ function f_i defined in Schwetman, <code>Some Computational Aspects of Queueing Network Models</code>. - <p><a name="index-Bolch_002c-G_002e-122"></a><a name="index-Greiner_002c-S_002e-123"></a><a name="index-de-Meer_002c-H_002e-124"></a><a name="index-Trivedi_002c-K_002e-125"></a> + <p><a name="index-Bolch_002c-G_002e-125"></a><a name="index-Greiner_002c-S_002e-126"></a><a name="index-de-Meer_002c-H_002e-127"></a><a name="index-Trivedi_002c-K_002e-128"></a> <h4 class="subsection">6.3.3 Open networks</h4> @@ -2982,10 +3016,10 @@ <p><a name="doc_002dqnopensingle"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-126"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-127"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-129"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-130"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-128"></a><a name="index-BCMP-network-129"></a> + <p><a name="index-open-network_002c-single-class-131"></a><a name="index-BCMP-network-132"></a> Analyze open, single class BCMP queueing networks. <p>This function works for a subset of BCMP single-class open networks @@ -3078,16 +3112,16 @@ Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-130"></a><a name="index-Greiner_002c-S_002e-131"></a><a name="index-de-Meer_002c-H_002e-132"></a><a name="index-Trivedi_002c-K_002e-133"></a> + <p><a name="index-Bolch_002c-G_002e-133"></a><a name="index-Greiner_002c-S_002e-134"></a><a name="index-de-Meer_002c-H_002e-135"></a><a name="index-Trivedi_002c-K_002e-136"></a> <!-- Open network with multiple classes --> <p><a name="doc_002dqnopenmulti"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-134"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-135"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-137"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-138"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-multiple-classes-136"></a> + <p><a name="index-open-network_002c-multiple-classes-139"></a> Exact analysis of open, multiple-class BCMP networks. The network can be made of <em>single-server</em> queueing centers (FCFS, LCFS-PR or PS) or delay centers (IS). This function assumes a network with @@ -3152,7 +3186,7 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.1 ("Open Model Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-137"></a><a name="index-Zahorjan_002c-J_002e-138"></a><a name="index-Graham_002c-G_002e-S_002e-139"></a><a name="index-Sevcik_002c-K_002e-C_002e-140"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-140"></a><a name="index-Zahorjan_002c-J_002e-141"></a><a name="index-Graham_002c-G_002e-S_002e-142"></a><a name="index-Sevcik_002c-K_002e-C_002e-143"></a> <h4 class="subsection">6.3.4 Closed Networks</h4> @@ -3160,11 +3194,11 @@ <p><a name="doc_002dqnclosedsinglemva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-141"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-142"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-143"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-144"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-145"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-146"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-144"></a><a name="index-closed-network_002c-single-class-145"></a><a name="index-normalization-constant-146"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-147"></a><a name="index-closed-network_002c-single-class-148"></a><a name="index-normalization-constant-149"></a> Analyze closed, single class queueing networks using the exact Mean Value Analysis (MVA) algorithm. The following queueing disciplines are supported: FCFS, LCFS-PR, PS and IS (Infinite Server). This @@ -3265,7 +3299,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-147"></a><a name="index-Lavenberg_002c-S_002e-S_002e-148"></a> + <p><a name="index-Reiser_002c-M_002e-150"></a><a name="index-Lavenberg_002c-S_002e-S_002e-151"></a> This implementation is described in R. Jain , <cite>The Art of Computer Systems Performance Analysis</cite>, Wiley, 1991, p. 577. Multi-server nodes <!-- and the computation of @math{G(N)}, --> @@ -3274,15 +3308,15 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 8.2.1, "Single Class Queueing Networks". - <p><a name="index-Jain_002c-R_002e-149"></a><a name="index-Bolch_002c-G_002e-150"></a><a name="index-Greiner_002c-S_002e-151"></a><a name="index-de-Meer_002c-H_002e-152"></a><a name="index-Trivedi_002c-K_002e-153"></a> + <p><a name="index-Jain_002c-R_002e-152"></a><a name="index-Bolch_002c-G_002e-153"></a><a name="index-Greiner_002c-S_002e-154"></a><a name="index-de-Meer_002c-H_002e-155"></a><a name="index-Trivedi_002c-K_002e-156"></a> <!-- MVA for single class, closed networks with load dependent servers --> <a name="doc_002dqnclosedsinglemvald"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-154"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-155"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-157"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-158"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-156"></a><a name="index-closed-network_002c-single-class-157"></a><a name="index-load_002ddependent-service-center-158"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-159"></a><a name="index-closed-network_002c-single-class-160"></a><a name="index-load_002ddependent-service-center-161"></a> Exact MVA algorithm for closed, single class queueing networks with load-dependent service centers. This function supports FCFS, LCFS-PR, PS and IS nodes. For networks with only fixed-rate @@ -3340,15 +3374,15 @@ 1998, Section 8.2.4.1, “Networks with Load-Deèpendent Service: Closed Networks”. - <p><a name="index-Bolch_002c-G_002e-159"></a><a name="index-Greiner_002c-S_002e-160"></a><a name="index-de-Meer_002c-H_002e-161"></a><a name="index-Trivedi_002c-K_002e-162"></a> + <p><a name="index-Bolch_002c-G_002e-162"></a><a name="index-Greiner_002c-S_002e-163"></a><a name="index-de-Meer_002c-H_002e-164"></a><a name="index-Trivedi_002c-K_002e-165"></a> <!-- CMVA for single class, closed networks with a single load dependent servers --> <a name="doc_002dqncmva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-163"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-164"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-166"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-167"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-165"></a><a name="index-CMVA-166"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-168"></a><a name="index-CMVA-169"></a> Implementation of the Conditional MVA (CMVA) algorithm, a numerically stable variant of MVA for load-dependent servers. CMVA is described in G. Casale, <cite>A Note on Stable Flow-Equivalent Aggregation in @@ -3402,19 +3436,19 @@ closed networks</cite>. Queueing Syst. Theory Appl., 60:193–202, December 2008. - <p><a name="index-Casale_002c-G_002e-167"></a> + <p><a name="index-Casale_002c-G_002e-170"></a> <!-- Approximate MVA for single class, closed networks --> <p><a name="doc_002dqnclosedsinglemvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-168"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-169"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-170"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-171"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-172"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-171"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-172"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-173"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-174"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-175"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-173"></a><a name="index-Approximate-MVA-174"></a><a name="index-Closed-network_002c-single-class-175"></a><a name="index-Closed-network_002c-approximate-analysis-176"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-176"></a><a name="index-Approximate-MVA-177"></a><a name="index-Closed-network_002c-single-class-178"></a><a name="index-Closed-network_002c-approximate-analysis-179"></a> Analyze closed, single class queueing networks using the Approximate Mean Value Analysis (MVA) algorithm. This function is based on approximating the number of customers seen at center k when a @@ -3493,20 +3527,20 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 6.4.2.2 ("Approximate Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-177"></a><a name="index-Zahorjan_002c-J_002e-178"></a><a name="index-Graham_002c-G_002e-S_002e-179"></a><a name="index-Sevcik_002c-K_002e-C_002e-180"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-180"></a><a name="index-Zahorjan_002c-J_002e-181"></a><a name="index-Graham_002c-G_002e-S_002e-182"></a><a name="index-Sevcik_002c-K_002e-C_002e-183"></a> <!-- MVA for multiple class, closed networks --> <p><a name="doc_002dqnclosedmultimva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-181"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-182"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-183"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-184"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-185"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-186"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-184"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-185"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-186"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-187"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-188"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-189"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-187"></a><a name="index-closed-network_002c-multiple-classes-188"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-190"></a><a name="index-closed-network_002c-multiple-classes-191"></a> Analyze closed, multiclass queueing networks with K service centers and C independent customer classes (chains) using the Mean Value Analysys (MVA) algorithm. @@ -3636,7 +3670,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-189"></a><a name="index-Lavenberg_002c-S_002e-S_002e-190"></a> + <p><a name="index-Reiser_002c-M_002e-192"></a><a name="index-Lavenberg_002c-S_002e-S_002e-193"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -3646,18 +3680,18 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.2.1 ("Exact Solution Techniques"). - <p><a name="index-Bolch_002c-G_002e-191"></a><a name="index-Greiner_002c-S_002e-192"></a><a name="index-de-Meer_002c-H_002e-193"></a><a name="index-Trivedi_002c-K_002e-194"></a><a name="index-Lazowska_002c-E_002e-D_002e-195"></a><a name="index-Zahorjan_002c-J_002e-196"></a><a name="index-Graham_002c-G_002e-S_002e-197"></a><a name="index-Sevcik_002c-K_002e-C_002e-198"></a> + <p><a name="index-Bolch_002c-G_002e-194"></a><a name="index-Greiner_002c-S_002e-195"></a><a name="index-de-Meer_002c-H_002e-196"></a><a name="index-Trivedi_002c-K_002e-197"></a><a name="index-Lazowska_002c-E_002e-D_002e-198"></a><a name="index-Zahorjan_002c-J_002e-199"></a><a name="index-Graham_002c-G_002e-S_002e-200"></a><a name="index-Sevcik_002c-K_002e-C_002e-201"></a> <!-- Approximate MVA, with Bard-Schweitzer approximation --> <a name="doc_002dqnclosedmultimvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-199"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-200"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-201"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-202"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-203"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-202"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-203"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-204"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-205"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-206"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-204"></a><a name="index-Approximate-MVA-205"></a><a name="index-Closed-network_002c-multiple-classes-206"></a><a name="index-Closed-network_002c-approximate-analysis-207"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-207"></a><a name="index-Approximate-MVA-208"></a><a name="index-Closed-network_002c-multiple-classes-209"></a><a name="index-Closed-network_002c-approximate-analysis-210"></a> Analyze closed, multiclass queueing networks with K service centers and C customer classes using the approximate Mean Value Analysys (MVA) algorithm. @@ -3742,12 +3776,12 @@ proc. 4th Int. Symp. on Modelling and Performance Evaluation of Computer Systems, feb. 1979, pp. 51–62. - <p><a name="index-Bard_002c-Y_002e-208"></a> + <p><a name="index-Bard_002c-Y_002e-211"></a> P. Schweitzer, <cite>Approximate Analysis of Multiclass Closed Networks of Queues</cite>, Proc. Int. Conf. on Stochastic Control and Optimization, jun 1979, pp. 25–29. - <p><a name="index-Schweitzer_002c-P_002e-209"></a> + <p><a name="index-Schweitzer_002c-P_002e-212"></a> This implementation is based on Edward D. Lazowska, John Zahorjan, G. Scott Graham, and Kenneth C. Sevcik, <cite>Quantitative System Performance: Computer System Analysis Using Queueing Network Models</cite>, @@ -3758,7 +3792,7 @@ described above, as it computes the average response times R instead of the residence times. - <p><a name="index-Lazowska_002c-E_002e-D_002e-210"></a><a name="index-Zahorjan_002c-J_002e-211"></a><a name="index-Graham_002c-G_002e-S_002e-212"></a><a name="index-Sevcik_002c-K_002e-C_002e-213"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-213"></a><a name="index-Zahorjan_002c-J_002e-214"></a><a name="index-Graham_002c-G_002e-S_002e-215"></a><a name="index-Sevcik_002c-K_002e-C_002e-216"></a> <h4 class="subsection">6.3.5 Mixed Networks</h4> @@ -3766,9 +3800,9 @@ <p><a name="doc_002dqnmix"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmix</b> (<var>lambda, N, S, V, m</var>)<var><a name="index-qnmix-214"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmix</b> (<var>lambda, N, S, V, m</var>)<var><a name="index-qnmix-217"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-215"></a><a name="index-mixed-network-216"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-218"></a><a name="index-mixed-network-219"></a> Solution of mixed queueing networks through MVA. The network consists of K service centers (single-server or delay centers) and C independent customer chains. Both open and closed chains @@ -3859,14 +3893,14 @@ Note that in this function we compute the mean response time R instead of the mean residence time as in the reference. - <p><a name="index-Lazowska_002c-E_002e-D_002e-217"></a><a name="index-Zahorjan_002c-J_002e-218"></a><a name="index-Graham_002c-G_002e-S_002e-219"></a><a name="index-Sevcik_002c-K_002e-C_002e-220"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-220"></a><a name="index-Zahorjan_002c-J_002e-221"></a><a name="index-Graham_002c-G_002e-S_002e-222"></a><a name="index-Sevcik_002c-K_002e-C_002e-223"></a> Herb Schwetman, <cite>Implementing the Mean Value Algorithm for the Solution of Queueing Network Models</cite>, Technical Report CSD-TR-355, Department of Computer Sciences, Purdue University, feb 15, 1982, available at <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-355.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%... [truncated message content] |
From: <cde...@us...> - 2012-03-11 20:53:40
|
Revision: 9817 http://octave.svn.sourceforge.net/octave/?rev=9817&view=rev Author: cdemills Date: 2012-03-11 20:53:31 +0000 (Sun, 11 Mar 2012) Log Message: ----------- apply the emptiness test in dataframe.m only if more than one row Modified Paths: -------------- trunk/octave-forge/extra/dataframe/inst/@dataframe/cat.m trunk/octave-forge/extra/dataframe/inst/@dataframe/dataframe.m trunk/octave-forge/extra/dataframe/inst/@dataframe/display.m trunk/octave-forge/extra/dataframe/inst/@dataframe/find.m trunk/octave-forge/extra/dataframe/inst/@dataframe/fold.m trunk/octave-forge/extra/dataframe/inst/@dataframe/horzcat.m trunk/octave-forge/extra/dataframe/inst/@dataframe/inv.m trunk/octave-forge/extra/dataframe/inst/@dataframe/isfield.m trunk/octave-forge/extra/dataframe/inst/@dataframe/isscalar.m trunk/octave-forge/extra/dataframe/inst/@dataframe/isvector.m trunk/octave-forge/extra/dataframe/inst/@dataframe/ne.m trunk/octave-forge/extra/dataframe/inst/@dataframe/permute.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_allmeta.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_basecomp.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_check_char_array.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_colmeta.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_cow.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_func.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_mapper2.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_matassign.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_name2idx.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_pad.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_strjust.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_strset.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_thirddim.m trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_whole.m trunk/octave-forge/extra/dataframe/inst/@dataframe/prod.m trunk/octave-forge/extra/dataframe/inst/@dataframe/repmat.m trunk/octave-forge/extra/dataframe/inst/@dataframe/reshape.m trunk/octave-forge/extra/dataframe/inst/@dataframe/size.m trunk/octave-forge/extra/dataframe/inst/@dataframe/sort.m trunk/octave-forge/extra/dataframe/inst/@dataframe/subsasgn.m trunk/octave-forge/extra/dataframe/inst/@dataframe/subsref.m trunk/octave-forge/extra/dataframe/inst/@dataframe/sum.m trunk/octave-forge/extra/dataframe/inst/@dataframe/summary.m trunk/octave-forge/extra/dataframe/inst/@dataframe/sumsq.m trunk/octave-forge/extra/dataframe/inst/@dataframe/vertcat.m Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/cat.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/cat.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/cat.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -29,172 +29,172 @@ %# $Id$ %# - if (!isa(A, 'dataframe')), - A = dataframe(A); + if (~isa (A, 'dataframe')), + A = dataframe (A); endif switch dim case 1 resu = A; - for indi = 1:length(varargin), - B = varargin{indi}; - if !isa(B, 'dataframe'), - if iscell(B) && 2 == length(B), - B = dataframe(B{2}, 'rownames', B{1}); - else - B = dataframe(B, 'colnames', inputname(2+indi)); - endif - endif - if resu._cnt(2) != B._cnt(2), - error('Different number of columns in dataframes'); - endif - %# do not duplicate empty names - if !isempty(resu._name{1}) || !isempty(B._name{1}), - if length(resu._name{1}) < resu._cnt(1), - resu._name{1}(end+1:resu._cnt(1), 1) = {''}; - endif - if length(B._name{1}) < B._cnt(1), - B._name{1}(end+1:B._cnt(1), 1) = {''}; - endif - resu._name{1} = vertcat(resu._name{1}(:), B._name{1}(:)); - resu._over{1} = [resu._over{1} B._over{1}]; - endif - resu._cnt(1) = resu._cnt(1) + B._cnt(1); - if size(resu._ridx, 2) < size(B._ridx, 2), - resu._ridx(:, end+1:size(B._ridx, 2)) = NA; - elseif size(resu._ridx, 2) > size(B._ridx, 2), - B._ridx(:, end+1:size(resu._ridx, 2)) = NA; - endif - resu._ridx = [resu._ridx; B._ridx]; - %# find data with same column names - dummy = A._over{2} & B._over{2}; - indA = true(1, resu._cnt(2)); - indB = true(1, resu._cnt(2)); - for indj = 1:resu._cnt(2), - if (dummy(indj)), - indk = strmatch(resu._name{2}(indj), B._name{2}, 'exact'); - if (~isempty(indk)), - indk = indk(1); - if ~strcmp(resu._type{indj}, B._type{indk}), - error("Trying to mix columns of different types"); - endif - endif - else - indk = indj; - endif - resu._data{indj} = [resu._data{indj}; B._data{indk}]; - indA(indj) = false; indB(indk) = false; - endfor - if any(indA) || any(indB) - error('Different number/names of columns in dataframe'); - endif - + for indi = (1:length (varargin)) + B = varargin{indi}; + if (~isa (B, 'dataframe')) + if (iscell (B) && 2 == length (B)) + B = dataframe (B{2}, 'rownames', B{1}); + else + B = dataframe (B, 'colnames', inputname(2+indi)); + endif + endif + if (resu._cnt(2) ~= B._cnt(2)) + error ('Different number of columns in dataframes'); + endif + %# do not duplicate empty names + if (~isempty (resu._name{1}) || ~isempty (B._name{1})) + if (length (resu._name{1}) < resu._cnt(1)) + resu._name{1}(end+1:resu._cnt(1), 1) = {''}; + endif + if (length (B._name{1}) < B._cnt(1)) + B._name{1}(end+1:B._cnt(1), 1) = {''}; + endif + resu._name{1} = vertcat (resu._name{1}(:), B._name{1}(:)); + resu._over{1} = [resu._over{1} B._over{1}]; + endif + resu._cnt(1) = resu._cnt(1) + B._cnt(1); + if (size (resu._ridx, 2) < size (B._ridx, 2)) + resu._ridx(:, end+1:size(B._ridx, 2)) = NA; + elseif (size (resu._ridx, 2) > size (B._ridx, 2)) + B._ridx(:, end+1:size(resu._ridx, 2)) = NA; + endif + resu._ridx = [resu._ridx; B._ridx]; + %# find data with same column names + dummy = A._over{2} & B._over{2}; + indA = true (1, resu._cnt(2)); + indB = true (1, resu._cnt(2)); + for indj = (1:resu._cnt(2)) + if (dummy(indj)) + indk = strmatch (resu._name{2}(indj), B._name{2}, 'exact'); + if (~isempty (indk)) + indk = indk(1); + if (~strcmp (resu._type{indj}, B._type{indk})) + error ("Trying to mix columns of different types"); + endif + endif + else + indk = indj; + endif + resu._data{indj} = [resu._data{indj}; B._data{indk}]; + indA(indj) = false; indB(indk) = false; + endfor + if (any (indA) || any (indB)) + error ('Different number/names of columns in dataframe'); + endif + endfor case 2 resu = A; - for indi = 1:length(varargin), - B = varargin{indi}; - if !isa(B, 'dataframe'), - if iscell(B) && 2 == length(B), - B = dataframe(B{2}, 'colnames', B{1}); - else - B = dataframe(B, 'colnames', inputname(2+indi)); - endif - B._ridx = resu._ridx; %# make them compatibles - endif - if resu._cnt(1) != B._cnt(1), - error('Different number of rows in dataframes'); - endif - if any(resu._ridx(:) - B._ridx(:)) - error('dataframes row indexes not matched'); - endif - resu._name{2} = vertcat(resu._name{2}, B._name{2}); - resu._over{2} = [resu._over{2} B._over{2}]; - resu._data(resu._cnt(2)+(1:B._cnt(2))) = B._data; - resu._type(resu._cnt(2)+(1:B._cnt(2))) = B._type; - resu._cnt(2) = resu._cnt(2) + B._cnt(2); + for indi = (1:length (varargin)) + B = varargin{indi}; + if (~isa (B, 'dataframe')) + if (iscell (B) && 2 == length (B)) + B = dataframe (B{2}, 'colnames', B{1}); + else + B = dataframe (B, 'colnames', inputname(2+indi)); + endif + B._ridx = resu._ridx; %# make them compatibles + endif + if (resu._cnt(1) ~= B._cnt(1)) + error ('Different number of rows in dataframes'); + endif + if (any(resu._ridx(:) - B._ridx(:))) + error ('dataframes row indexes not matched'); + endif + resu._name{2} = vertcat (resu._name{2}, B._name{2}); + resu._over{2} = [resu._over{2} B._over{2}]; + resu._data(resu._cnt(2)+(1:B._cnt(2))) = B._data; + resu._type(resu._cnt(2)+(1:B._cnt(2))) = B._type; + resu._cnt(2) = resu._cnt(2) + B._cnt(2); endfor case 3 resu = A; - for indi = 1:length(varargin), - B = varargin{indi}; - if (!isa(B, 'dataframe')), - if (iscell(B) && 2 == length(B)), - B = dataframe(B{2}, 'rownames', B{1}); - else - B = dataframe(B, 'colnames', inputname(indi+2)); - endif - endif - if (resu._cnt(1) != B._cnt(1)), - error('Different number of rows in dataframes'); - endif - if (resu._cnt(2) != B._cnt(2)), - error('Different number of columns in dataframes'); - endif - %# to be merged against 3rd dim, rownames must be equals, if - %# non-empty. Columns are merged based upon their name; columns - %# with identic content are kept. + for indi = (1:length (varargin)) + B = varargin{indi}; + if (~isa (B, 'dataframe')) + if (iscell (B) && 2 == length (B)), + B = dataframe (B{2}, 'rownames', B{1}); + else + B = dataframe (B, 'colnames', inputname(indi+2)); + endif + endif + if (resu._cnt(1) ~= B._cnt(1)) + error ('Different number of rows in dataframes'); + endif + if (resu._cnt(2) ~= B._cnt(2)), + error ('Different number of columns in dataframes'); + endif + %# to be merged against 3rd dim, rownames must be equals, if + %# non-empty. Columns are merged based upon their name; columns + %# with identic content are kept. - if size(resu._ridx, 2) < size(B._ridx, 2), - resu._ridx(:, end+1:size(B._ridx, 2)) = NA; - elseif size(resu._ridx, 2) > size(B._ridx, 2), - B._ridx(:, end+1:size(resu._ridx, 2)) = NA; - endif - resu._ridx = cat(3, resu._ridx, B._ridx); - %# find data with same column names - indA = true(1, resu._cnt(2)); - indB = true(1, resu._cnt(2)); - dummy = A._over{2} & B._over{2}; - for indj = 1:resu._cnt(2), - if (dummy(indj)), - indk = strmatch(resu._name{2}(indj), B._name{2}, 'exact'); - if (~isempty(indk)), - indk = indk(1); - if (~strcmp(resu._type{indj}, B._type{indk})), - error("Trying to mix columns of different types"); - endif - endif - else - indk = indj; - endif - if (all([isnumeric(resu._data{indj}) isnumeric(B._data{indk})])), - %# iterate over the columns of resu and B - op1 = resu._data{indj}; op2 = B._data{indk}; - for ind2=1:columns(op2), - indr = false; - for ind1=1:columns(op1), - if (all(abs(op1(:, ind1) - op2(:, ind2)) <= eps)), - resu._rep{indj} = [resu._rep{indj} ind1]; - indr = true; - break; - endif - endfor - if (!indr), - %# pad in the second dim - resu._data{indj} = [resu._data{indj}, B._data{indk}]; - resu._rep{indj} = [resu._rep{indj} 1+length(resu._rep{indj})]; - endif - endfor - else - resu._data{indj} = [resu._data{indj} B._data{indk}]; - resu._rep{indj} = [resu._rep{indj} 1+length(resu._rep({indj}))]; - endif - indA(indj) = false; indB(indk) = false; - endfor - if (any(indA) || any(indB)), - error('Different number/names of columns in dataframe'); - endif + if (size(resu._ridx, 2) < size(B._ridx, 2)) + resu._ridx(:, end+1:size(B._ridx, 2)) = NA; + elseif (size(resu._ridx, 2) > size(B._ridx, 2)) + B._ridx(:, end+1:size(resu._ridx, 2)) = NA; + endif + resu._ridx = cat (3, resu._ridx, B._ridx); + %# find data with same column names + indA = true (1, resu._cnt(2)); + indB = true (1, resu._cnt(2)); + dummy = A._over{2} & B._over{2}; + for indj = (1:resu._cnt(2)) + if (dummy(indj)) + indk = strmatch (resu._name{2}(indj), B._name{2}, 'exact'); + if (~isempty (indk)), + indk = indk(1); + if (~strcmp (resu._type{indj}, B._type{indk})), + error("Trying to mix columns of different types"); + endif + endif + else + indk = indj; + endif + if (all ([isnumeric(resu._data{indj}) isnumeric(B._data{indk})])), + %# iterate over the columns of resu and B + op1 = resu._data{indj}; op2 = B._data{indk}; + for ind2 = (1:columns (op2)) + indr = false; + for ind1 = (1:columns (op1)) + if (all (abs (op1(:, ind1) - op2(:, ind2)) <= eps)), + resu._rep{indj} = [resu._rep{indj} ind1]; + indr = true; + break; + endif + endfor + if (~indr), + %# pad in the second dim + resu._data{indj} = [resu._data{indj}, B._data{indk}]; + resu._rep{indj} = [resu._rep{indj} 1+length(resu._rep{indj})]; + endif + endfor + else + resu._data{indj} = [resu._data{indj} B._data{indk}]; + resu._rep{indj} = [resu._rep{indj} 1+length(resu._rep({indj}))]; + endif + indA(indj) = false; indB(indk) = false; + endfor + if (any (indA) || any (indB)) + error ('Different number/names of columns in dataframe'); + endif endfor - resu = df_thirddim(resu); + resu = df_thirddim (resu); otherwise - error('Incorrect call to cat'); + error ('Incorrect call to cat'); endswitch %# disp('End of cat'); keyboard Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/dataframe.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/dataframe.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/dataframe.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -92,7 +92,7 @@ seeked = []; trigger =[]; unquot = true; sep = "\t,"; cmt_lines = []; locales = "C"; -if (length(varargin) > 0) +if (length (varargin) > 0) indi = 1; %# loop over possible arguments while (indi <= size (varargin, 2)) @@ -155,7 +155,7 @@ endwhile endif -if (!isempty (seeked) && !isempty (trigger)) +if (~isempty (seeked) && ~isempty (trigger)) error ('seeked and trigger are mutuallly incompatible arguments'); endif @@ -175,10 +175,10 @@ unwind_protect dummy = tilde_expand (x); fid = fopen (dummy); - if (fid != -1) + if (fid ~= -1) df._src{end+1, 1} = dummy; dummy = fgetl (fid); - if (!strcmp (dummy, UTF8_BOM)) + if (~strcmp (dummy, UTF8_BOM)) frewind (fid); endif %# slurp everything and convert doubles to char, avoiding @@ -188,10 +188,10 @@ in = []; endif unwind_protect_cleanup - if (fid != -1) fclose (fid); endif + if (fid ~= -1) fclose (fid); endif end_unwind_protect - if (!isempty (in)) + if (~isempty (in)) %# explicit list taken from 'man pcrepattern' -- we enclose all %# vertical separators in case the underlying regexp engine %# doesn't have them all. @@ -212,7 +212,7 @@ %# lines, 'UniformOutput', false); %# extract fields content = cellfun (@(x) strsplit (x, sep), lines, \ 'UniformOutput', false); %# extract fields - indl = 1; indj = 1; %# disp('line 151 '); keyboard + indl = 1; indj = 1; %#disp('line 151 '); keyboard if (~isempty (seeked)) while (indl <= length (lines)) dummy = content{indl}; @@ -246,7 +246,7 @@ endif x = cell (1+length (lines)-indl, size(dummy, 2)); empty_lines = []; cmt_lines = []; - while (indl <= length(lines)) + while (indl <= length (lines)) dummy = content{indl}; if (all (cellfun ('size', dummy, 2) == 0)) empty_lines = [empty_lines indj]; @@ -273,7 +273,7 @@ catch %# if the previous test fails, try a simpler one in = regexp (dummy{indk}, '[^'' ]+', 'match'); - if (!isempty(in)) + if (~isempty (in)) x(indj, indk) = in{1}; %# else %# x(indj, indk) = []; @@ -284,7 +284,7 @@ x(indj, indk) = regexp (dummy{indk}, '[^ ].*', 'match'); endif else - if (!isempty (regexp (dummy{indk}, '[/:]'))) + if (~isempty (regexp (dummy{indk}, '[/:]'))) %# try to convert to a date [timeval, nfields] = strptime( dummy{indk}, [char(37) 'd/' char(37) 'm/' char(37) 'Y ' char(37) 'T']); @@ -293,7 +293,7 @@ timeval); %# try to extract the usec field, if any idx = regexp (dummy{indk}, timestr, 'end'); - if (!isempty (idx)) + if (~isempty (idx)) idx = idx + 1; if (ispunct (dummy{indk}(idx))) idx = idx + 1; @@ -310,12 +310,12 @@ endfor indl = indl + 1; indj = indj + 1; endwhile - if (!isempty(empty_lines)) + if (~isempty (empty_lines)) x(empty_lines, :) = []; endif %# detect empty columns empty_lines = find (0 == sum (cellfun ('size', x, 2))); - if (!isempty(empty_lines)) + if (~isempty (empty_lines)) x(:, empty_lines) = []; endif clear UTF8_BOM fid in lines indl the_line content empty_lines @@ -326,7 +326,7 @@ %# fallback, avoiding a recursive call idx.type = '()'; - if (!isa (x, 'char')) + if (~isa (x, 'char')) indj = df._cnt(2)+(1:size (x, 2)); else %# at this point, reading some filename failed @@ -337,7 +337,7 @@ if (2 == length (x)) %# use the intermediate value as destination column [indc, ncol] = df_name2idx (df._name{2}, x{1}, df._cnt(2), "column"); - if (ncol != 1) + if (ncol ~= 1) error (["With two-elements cell, the first should resolve " ... "to a single column"]); endif @@ -362,7 +362,7 @@ %# allow overwriting of column names df._over{2}(1, indj) = true; else - if (!isempty(indj)) + if (~isempty (indj)) if (1 == length (df._name{2}) && length (df._name{2}) < \ length (indj)) [df._name{2}(indj, 1), df._over{2}(1, indj)] ... @@ -374,15 +374,15 @@ df._name{2} = genvarname (df._name{2}); endif endif - if (!isempty (indj)) + if (~isempty (indj)) %# the exact row size will be determined latter idx.subs = {'', indj}; %# use direct assignement if (ndims (x) > 2), idx.subs{3} = 1:size (x, 3); endif %# df = subsasgn(df, idx, x); <= call directly lower level - df = df_matassign (df, idx, indj, length(indj), x); - if (!isempty (cmt_lines)) - df._cmt = vertcat(df._cmt, cellstr(cmt_lines)); + df = df_matassign (df, idx, indj, length (indj), x); + if (~isempty (cmt_lines)) + df._cmt = vertcat (df._cmt, cellstr (cmt_lines)); cmt_lines = []; endif else Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/display.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/display.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/display.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -29,7 +29,7 @@ %# generate header name dummy = inputname (1); - if (isempty(dummy)) + if (isempty (dummy)) dummy = "ans"; endif @@ -41,7 +41,7 @@ dummy, df._cnt); endif - if (!isempty (df._src)) + if (~isempty (df._src)) for indi = (1:size (df._src, 1)) head = strvcat\ (head, [repmat("Src: ", size (df._src{indi, 1}, 1), 1)\ @@ -49,7 +49,7 @@ endfor endif - if (!isempty (df._cmt)) + if (~isempty (df._cmt)) for indi = (1:size(df._cmt, 1)) head = strvcat\ (head, [repmat("Comment: ", size (df._cmt{indi, 1}, 1), 1)\ @@ -58,7 +58,7 @@ endif if (all (df._cnt > 0)) %# stop for empty df - dummy=[]; vspace = repmat (' ', df._cnt(1), 1); + dummy = []; vspace = repmat (' ', df._cnt(1), 1); indi = 1; %# the real, unfolded index %# loop over columns where the corresponding _data really exists for indc = (1:min (df._cnt(2), size (df._data, 2))) @@ -85,7 +85,7 @@ tmp_str = df._data{indc}(:, indk); %#get the whole column indj = cellfun ('isprint', tmp_str, 'UniformOutput', false); indj = ~cellfun ('all', indj); - for indr = (1:length(indj)) + for indr = (1:length (indj)) if (indj(indr)), if (isna (tmp_str{indr})), tmp_str{indr} = "NA"; @@ -125,10 +125,10 @@ vspace = [' '; ' '; vspace]; %# second line content resu = []; - if (!isempty (df._ridx)) + if (~isempty (df._ridx)) for (ind1 = 1:size (df._ridx, 2)) if ((1 == size(df._ridx, 3)) && \ - (any (!isna (df._ridx(1:df._cnt(1), ind1))))) + (any (~isna (df._ridx(1:df._cnt(1), ind1))))) dummy{2, 1} = [sprintf("_%d", ind1) ; "Nr"]; dummy{3, 1} = disp (df._ridx(1:df._cnt(1), ind1)); indi = regexp (dummy{3, 1}, '\b.*\b', 'match', 'dotexceptnewline'); @@ -140,7 +140,7 @@ endif else for ind2 = (1:size (df._ridx, 3)) - if (any (!isna (df._ridx(1:df._cnt(1), ind1, ind2)))), + if (any (~isna (df._ridx(1:df._cnt(1), ind1, ind2)))), dummy{2, 1} = [sprintf("_%d.%d", ind1, ind2) ; "Nr"]; dummy{3, 1} = disp (df._ridx(1:df._cnt(1), ind1, ind2)); indi = regexp (dummy{3, 1}, '\b.*\b', 'match', 'dotexceptnewline'); @@ -165,7 +165,7 @@ endif %# insert a vertical space - if (!isempty(dummy{3, 2})) + if (~isempty (dummy{3, 2})) indi = ~cellfun ('isempty', dummy{3, 2}); if (any (indi)) try Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/find.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/find.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/find.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -26,35 +26,35 @@ switch nargout case {0, 1} - resu = []; mz = max(cellfun(@length, df._rep)); - for indc = 1:df._cnt(2), - [indr, inds] = feval(@find, df._data{indc}(:, df._rep{indc})); - %# create a vector the same size as indr - dummy = indr; dummy(:) = indc; - resu = [resu; sub2ind([df._cnt(1:2) mz], indr, dummy, inds)]; + resu = []; mz = max (cellfun (@length, df._rep)); + for indc = (1:df._cnt(2)) + [indr, inds] = feval (@find, df._data{indc}(:, df._rep{indc})); + %# create a vector the same size as indr + dummy = indr; dummy(:) = indc; + resu = [resu; sub2ind([df._cnt(1:2) mz], indr, dummy, inds)]; endfor - varargout{1} = sort(resu); + varargout{1} = sort (resu); case 2 nz = 0; idx_i = []; idx_j = []; - for indc = 1:df._cnt(2), - [dum1, dum2] = feval(@find, df._data{indc}(:, df._rep{indc})); - idx_i = [idx_i; dum1]; - idx_j = [idx_j; nz + dum2]; - nz = nz + df._cnt(1)*length(df._rep{indc}); + for indc = (1:df._cnt(2)) + [dum1, dum2] = feval (@find, df._data{indc}(:, df._rep{indc})); + idx_i = [idx_i; dum1]; + idx_j = [idx_j; nz + dum2]; + nz = nz + df._cnt(1)*length (df._rep{indc}); endfor varargout{1} = idx_i; varargout{2} = idx_j; case 3 nz = 0; idx_i = []; idx_j = []; val = []; - for indc = 1:df._cnt(2), - [dum1, dum2, dum3] = feval(@find, df._data{indc}(:, df._rep{indc})); - idx_i = [idx_i; dum1]; - idx_j = [idx_j; nz + dum2]; - val = [val; dum3]; - nz = nz + df._cnt(1)*length(df._rep{indc}); + for indc = (1:df._cnt(2)) + [dum1, dum2, dum3] = feval (@find, df._data{indc}(:, df._rep{indc})); + idx_i = [idx_i; dum1]; + idx_j = [idx_j; nz + dum2]; + val = [val; dum3]; + nz = nz + df._cnt(1)*length (df._rep{indc}); endfor varargout{1} = idx_i; varargout{2} = idx_j; varargout{3} = val; otherwise - print_usage('find'); + print_usage ('find'); endswitch endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/fold.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/fold.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/fold.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -32,65 +32,63 @@ %# switch dim case 1 - [indr, nrow] = df_name2idx(df._name{1}, indr, df._cnt(1), 'row'); - [indc, ncol] = df_name2idx(df._name{2}, indc, df._cnt(2), 'column'); + [indr, nrow] = df_name2idx (df._name{1}, indr, df._cnt(1), 'row'); + [indc, ncol] = df_name2idx (df._name{2}, indc, df._cnt(2), 'column'); - if (indr(1) > 1), + if (indr(1) > 1) slice_size = indr(1) - 1; %# we can't use directly resu = df(1:slice_size, :, :) S.type = '()'; S.subs = { 1:slice_size, ':', ':', 'dataframe'}; - resu = subsref(df, S); + resu = subsref (df, S); %# how many columns for each slice - targets = cellfun(@length, df._rep); + targets = cellfun (@length, df._rep); %# a test function to determine if the location is free - for indj = 1:df._cnt(2), - if (any(indj == indc)), - continue; - endif - switch df._type{indj} - case { 'char' } - testfunc{indj} = @(x, indr, indc) ... - !isna(x{indr, indc}); - otherwise - testfunc{indj} = @(x, indr, indc) ... - !isna(x(indr, indc)); - endswitch + for indj = (1:df._cnt(2)) + if (any (indj == indc)) + continue; + endif + switch (df._type{indj}) + case { 'char' } + testfunc{indj} = @(x, indr, indc) ... + ~isna (x{indr, indc}); + otherwise + testfunc{indj} = @(x, indr, indc) ... + ~isna (x(indr, indc)); + endswitch endfor - for indi = indr, - %# where does this line go ? - where = find(df._data{indc}(1:slice_size, 1) ... - == df._data{indc}(indi, 1)); - if (!isempty(where)), - %# transfering one line -- loop over columns - for indj = 1:df._cnt(2), - if any(indj == indc), - continue; - endif - - if (testfunc{indj}(resu._data{indj}, where, targets(indj))), - %# add one more sheet - resu = df_pad(resu, 3, 1, indj); - targets(indj) = targets(indj) + 1; - endif - %# transfer field - stop - resu._data{indj}(where, targets(indj)) = ... - df._data{indj}(indi, 1); - endfor - %# update row index - resu._ridx(where, max(targets)) = df._ridx(indi); - else - disp('line 65: FIXME'); keyboard; - endif + for indi = (indr) + %# where does this line go ? + where = find (df._data{indc}(1:slice_size, 1) ... + == df._data{indc}(indi, 1)); + if (~isempty (where)) + %# transfering one line -- loop over columns + for indj = (1:df._cnt(2)) + if (any (indj == indc)) + continue; + endif + + if (testfunc{indj}(resu._data{indj}, where, targets(indj))) + %# add one more sheet + resu = df_pad(resu, 3, 1, indj); + targets(indj) = targets(indj) + 1; + endif + %# transfer field + stop + resu._data{indj}(where, targets(indj)) = ... + df._data{indj}(indi, 1); + endfor + %# update row index + resu._ridx(where, max(targets)) = df._ridx(indi); + else + disp ('line 65: FIXME'); keyboard; + endif endfor else - - disp('line 70: FIXME '); keyboard + disp ('line 70: FIXME '); keyboard endif - endswitch Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/horzcat.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/horzcat.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/horzcat.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -24,10 +24,10 @@ %# $Id$ %# - for indi = 1:length(varargin), - varargin{indi} = dataframe(varargin{indi}, 'colnames', inputname(1+indi));, + for indi = (1:length (varargin)) + varargin{indi} = dataframe (varargin{indi}, 'colnames', inputname(1+indi));, endfor - resu = cat(2, df, varargin{:}); + resu = cat (2, df, varargin{:}); endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/inv.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/inv.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/inv.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -29,24 +29,24 @@ %# $Id$ %# - if (length(df._cnt) > 2 || (df._cnt(1) != df._cnt(2))), - error("Dataframe is not square"); + if (length (df._cnt) > 2 || (df._cnt(1) ~= df._cnt(2))) + error ("Dataframe is not square"); endif %# quick and dirty conversion - [dummy, rcond] = inv(horzcat(df._data{:})); + [dummy, rcond] = inv (horzcat (df._data{:})); resu = df_allmeta(df); - [resu._name{2}, resu._name{1}] = deal(resu._name{1}, resu._name{2}); - [resu._over{2}, resu._over{1}] = deal(resu._over{1}, resu._over{2}); - if (isempty(resu._name{2})), - resu._name{2} = cellstr(repmat('_', resu._cnt(2), 1)); - resu._over{2} = ones(1, resu._cnt(2)); + [resu._name{2}, resu._name{1}] = deal (resu._name{1}, resu._name{2}); + [resu._over{2}, resu._over{1}] = deal (resu._over{1}, resu._over{2}); + if (isempty (resu._name{2})), + resu._name{2} = cellstr (repmat('_', resu._cnt(2), 1)); + resu._over{2} = ones (1, resu._cnt(2)); endif - for indi = resu._cnt(1):-1:1, + for indi = (resu._cnt(1):-1:1) resu._data{indi} = dummy(:, indi); endfor - resu._type(:) = class(dummy); + resu._type(:) = class (dummy); endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/isfield.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/isfield.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/isfield.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -35,57 +35,57 @@ %# $Id$ %# - if !isa(df, 'dataframe'), + if (~isa (df, 'dataframe')) resu = false; return; endif - if nargin <2 || nargin > 3, - print_usage(); + if (nargin < 2 || nargin > 3) + print_usage (); resu = false; return; endif - if 2 == nargin, strict = false; endif + if (2 == nargin) strict = false; endif - if isa(name, 'char'), - if strict, %# use strmatch to get indexes - for indi = size(name, 1):-1:1, - dummy = strmatch(name(indi, :), df._name{2}, "exact"); - resu(indi, 1) = !isempty(dummy); - for indj = 1:length(dummy), - idx(indi, indj) = dummy(indj); - endfor + if (isa (name, 'char')) + if (strict) %# use strmatch to get indexes + for indi = (size (name, 1):-1:1) + dummy = strmatch (name(indi, :), df._name{2}, "exact"); + resu(indi, 1) = ~isempty (dummy); + for indj = (1:length (dummy)) + idx(indi, indj) = dummy(indj); + endfor endfor else - for indi = size(name, 1):-1:1, - try - dummy = df_name2idx(df._name{2}, name(indi, :), \ - df._cnt(2), 'column'); - resu(indi, 1) = !isempty(dummy); - for indj = 1:length(dummy), - idx(indi, indj) = dummy(indj); - endfor - catch - resu(indi, 1) = false; idx(indi, 1) = 0; - end_try_catch + for indi = (size (name, 1):-1:1) + try + dummy = df_name2idx (df._name{2}, name(indi, :), \ + df._cnt(2), 'column'); + resu(indi, 1) = ~isempty (dummy); + for indj = (1:length (dummy)) + idx(indi, indj) = dummy(indj); + endfor + catch + resu(indi, 1) = false; idx(indi, 1) = 0; + end_try_catch endfor endif - elseif isa(name, 'cell'), - if strict, %# use strmatch to get indexes - for indi = size(name, 1):-1:1, - dummy = strmatch(name{indi}, df._name{2}, "exact"); - resu{indi, 1} = !isempty(dummy); - idx{indi, 1} = dummy; + elseif (isa (name, 'cell')) + if (strict) %# use strmatch to get indexes + for indi = (size (name, 1):-1:1) + dummy = strmatch (name{indi}, df._name{2}, "exact"); + resu{indi, 1} = ~isempty (dummy); + idx{indi, 1} = dummy; endfor else - for indi = length(name):-1:1, - try - dummy = df_name2idx(df._name{2}, name{indi}, \ - df._cnt(2), 'column'); - keyboard - resu{indi, 1} = !isempty(dummy); idx{indi, 1} = dummy; - catch - resu{indi, 1} = false; cnt{indi, 1} = 0; - end_try_catch + for indi = (length (name):-1:1) + try + dummy = df_name2idx (df._name{2}, name{indi}, \ + df._cnt(2), 'column'); + keyboard + resu{indi, 1} = ~isempty (dummy); idx{indi, 1} = dummy; + catch + resu{indi, 1} = false; cnt{indi, 1} = 0; + end_try_catch endfor endif endif Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/isscalar.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/isscalar.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/isscalar.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -26,6 +26,6 @@ %# $Id$ %# - resu = ismatrix(df) & (length(find(df._cnt > 1)) < 1); + resu = ismatrix (df) & (length (find (df._cnt > 1)) < 1); endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/isvector.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/isvector.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/isvector.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -26,6 +26,6 @@ %# $Id$ %# - resu = ismatrix(df) & (length(find(df._cnt > 1)) <= 1); + resu = ismatrix (df) & (length (find (df._cnt > 1)) <= 1); endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/ne.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/ne.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/ne.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -1,7 +1,7 @@ function resu = ne(A, B); %# function resu = ne(A, B) - %# Implements the '!=' operator when at least one argument is a dataframe. + %# Implements the '~=' operator when at least one argument is a dataframe. %% Copyright (C) 2009-2012 Pascal Dupuis <Pas...@uc...> %% @@ -27,6 +27,6 @@ %# $Id$ %# - resu = df_func(@ne, A, B); + resu = df_func (@ne, A, B); endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/permute.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/permute.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/permute.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -24,21 +24,21 @@ %# $Id$ %# - resu = dataframe([]); + resu = dataframe ([]); - if (length(df._cnt) >= length(perm)), + if (length (df._cnt) >= length (perm)) resu._cnt = df._cnt(perm); else resu._cnt = [df._cnt 1](perm); endif - if (ndims(df._ridx) < 3), - resu._ridx = permute(df._ridx, [min(perm(1), 2) min(perm(2:end))]); + if (ndims (df._ridx) < 3) + resu._ridx = permute (df._ridx, [min(perm(1), 2) min(perm(2:end))]); else - resu._ridx = permute(df._ridx, perm); + resu._ridx = permute (df._ridx, perm); endif - if (size(resu._ridx, 1) < resu._cnt(1)), + if (size (resu._ridx, 1) < resu._cnt(1)) %# adjust index size, if required resu._ridx(end+1:resu._cnt(1), :, :) = NA; endif @@ -46,13 +46,13 @@ if (2 == perm(1)), resu._name{1} = df._name{2}; resu._over{1} = df._over{2}; - indc = length(resu._name{1}); + indc = length (resu._name{1}); indi = resu._cnt(1) - indc; - if (indi > 0), + if (indi > 0) %# generate a name for the new row(s) - dummy = cstrcat(repmat('_', indi, 1), ... - strjust(num2str(indc + (1:indi).'), 'left')); - resu._name{1}(indc + (1:indi)) = cellstr(dummy); + dummy = cstrcat (repmat ('_', indi, 1), ... + strjust (num2str (indc + (1:indi).'), 'left')); + resu._name{1}(indc + (1:indi)) = cellstr (dummy); resu._over{1}(1, indc + (1:indi)) = true; endif else @@ -61,7 +61,7 @@ endif - if (2 == perm(2)), + if (2 == perm(2)) resu._name{2} = df._name{2}; resu._over{2} = df._over{2}; else @@ -69,41 +69,41 @@ resu._over{2} = df._over{1}; endif - if (isempty(resu._name{2})), + if (isempty (resu._name{2})), indc = 0; else - indc = length(resu._name{2}); + indc = length (resu._name{2}); endif indi = resu._cnt(2) - indc; - if (indi > 0), + if (indi > 0) %# generate a name for the new column(s) - dummy = cstrcat(repmat('_', indi, 1), ... - strjust(num2str(indc + (1:indi).'), 'left')); - resu._name{2}(indc + (1:indi)) = cellstr(dummy); + dummy = cstrcat (repmat ('_', indi, 1), ... + strjust (num2str (indc + (1:indi).'), 'left')); + resu._name{2}(indc + (1:indi)) = cellstr (dummy); resu._over{2}(1, indc + (1:indi)) = true; endif - if (2 != perm(2)), + if (2 ~= perm(2)), %# recompute the new type - dummy = zeros(0, class(sum(cellfun(@(x) zeros(1, class(x(1))),\ - df._data)))); - resu._type(1:resu._cnt(2)) = class(dummy); - dummy = permute(df_whole(df), perm); - for indi = 1:resu._cnt(2), - resu._data{indi} = squeeze(dummy(:, indi, :)); - resu._rep{indi} = 1:size(resu._data{indi}, 2); + dummy = zeros (0, class (sum (cellfun (@(x) zeros (1, class(x(1))),\ + df._data)))); + resu._type(1:resu._cnt(2)) = class (dummy); + dummy = permute (df_whole(df), perm); + for indi = (1:resu._cnt(2)) + resu._data{indi} = squeeze (dummy(:, indi, :)); + resu._rep{indi} = 1:size (resu._data{indi}, 2); endfor else %# 2 == perm(2) - if (1 == perm(1)), %# blank operation + if (1 == perm(1)) %# blank operation resu._type = df._type; resu._data = df._data; resu._rep = df._rep; else - for indi = 1:resu._cnt(2), - unfolded = df._data{indi}(:, df._rep{indi}); - resu._data{indi} = permute(unfolded, [2 1]); - resu._rep{indi} = 1:size(resu._data{indi}, 2); - resu._type{indi} = df._type{indi}; + for indi = (1:resu._cnt(2)) + unfolded = df._data{indi}(:, df._rep{indi}); + resu._data{indi} = permute (unfolded, [2 1]); + resu._rep{indi} = 1:size (resu._data{indi}, 2); + resu._type{indi} = df._type{indi}; endfor endif endif Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_allmeta.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_allmeta.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_allmeta.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -28,33 +28,33 @@ %# $Id$ %# - resu = dataframe([]); + resu = dataframe ([]); - if (isempty(dim)), + if (isempty (dim)), dim = df._cnt(1:2); else dim = dim(1:2); %# ignore third dim, if any endif - resu._cnt(1:2) = min(dim, df._cnt(1:2)); - if (!isempty(df._name{1})), + resu._cnt(1:2) = min (dim, df._cnt(1:2)); + if (~isempty(df._name{1})) resu._name{1} = df._name{1}(1:resu._cnt(1)); resu._over{1} = df._over{1}(1:resu._cnt(1)); endif - if (!isempty(df._name{2})), + if (~isempty(df._name{2})) resu._name{2} = df._name{2}(1:resu._cnt(2)); resu._over{2} = df._over{2}(1:resu._cnt(2)); endif - if (!isempty(df._ridx)), - if (size(df._ridx, 2) >= resu._cnt(2)), + if (~isempty(df._ridx)) + if (size (df._ridx, 2) >= resu._cnt(2)), resu._ridx = df._ridx(1:resu._cnt(1), :, :); else resu._ridx = df._ridx(1:resu._cnt(1), 1, :); endif endif %# init it with the right orientation - resu._data = cell(size(df._data)); - resu._rep = cell(size(df._rep)); + resu._data = cell (size (df._data)); + resu._rep = cell (size (df._rep)); resu._type = df._type(1:resu._cnt(2)); resu._src = df._src; resu._cmt = df._cmt; Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_basecomp.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_basecomp.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_basecomp.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -30,162 +30,162 @@ %# $Id$ %# - if 1 == length(itercol), + if (1 == length (itercol)) strict = false; else strict = itercol(2); itercol = itercol(1); endif - if (iscell(A)), A = dataframe(A); endif - if (iscell(B)), B = dataframe(B); endif + if (iscell (A)), A = dataframe (A); endif + if (iscell (B)), B = dataframe (B); endif - switch (func2str(func)), + switch (func2str (func)), case 'bsxfun' %# bsxfun compatibility rule: if there is at least one singleton %# dim, the smallest is repeated to reach the size of the %# greatest. Otherwise, all dims must be equal. - if (any(size(A)(1:2) != size(B)(1:2))) - if (!any (1 == [size(A) size(B)])) - error('bsxfun: both arguments must have the same dim, of one of them must have at least one singleton dim'); - else - Csize = max([size(A)(1:2); size(B)(1:2)]); - endif + if (any (size (A)(1:2) ~= size (B)(1:2))) + if (~any (1 == [size(A) size(B)])) + error ('bsxfun: both arguments must have the same dim, of one of them must have at least one singleton dim'); + else + Csize = max ([size(A)(1:2); size(B)(1:2)]); + endif else - Csize = size(A)(1:2); + Csize = size (A)(1:2); endif case 'mldivide' - if (isscalar(A)), - Csize = size(B)(1:2); + if (isscalar (A)), + Csize = size (B)(1:2); else - if (size(A, 1) != size(B, 1)), - error("Non compatible row sizes (op1 is %dx%d, op2 is %dx%d)",\ - size(A), size(B)(1:2)); - endif - Csize = [size(A, 2) size(B, 2)]; + if (size (A, 1) ~= size (B, 1)) + error ("Non compatible row sizes (op1 is %dx%d, op2 is %dx%d)",\ + size (A), size (B)(1:2)); + endif + Csize = [size(A, 2) size(B, 2)]; endif otherwise %# if strict is set, B may not be non-scalar vs scalar - if ((!(isscalar(A) || isscalar(B)))||(strict && isscalar(A))), - if (itercol), %# requires full compatibility - Csize = size(A)(1:2); - if (any(Csize - size(B)(1:2))), - %# disp([size(A) size(B)]) - error("Non compatible row and columns sizes (op1 is %dx%d, op2 is %dx%d)",\ - Csize, size(B)); - endif - else %# compatibility with matrix product - if (size(A, 2) - size(B, 1)), - error("Non compatible columns vs. rows size (op1 is %dx%d, op2 is %dx%d)",\ - size(A)(1:2), size(B)(1:2)); - endif - Csize = [size(A, 1) size(B, 2)]; - endif + if ((~(isscalar (A) || isscalar (B)))||(strict && isscalar (A))) + if (itercol), %# requires full compatibility + Csize = size (A)(1:2); + if (any (Csize - size (B)(1:2))) + %# disp([size(A) size(B)]) + error ("Non compatible row and columns sizes (op1 is %dx%d, op2 is %dx%d)",\ + Csize, size (B)); + endif + else %# compatibility with matrix product + if (size (A, 2) - size (B, 1)), + error ("Non compatible columns vs. rows size (op1 is %dx%d, op2 is %dx%d)",\ + size (A)(1:2), size (B)(1:2)); + endif + Csize = [size(A, 1) size(B, 2)]; + endif endif endswitch - if !(isscalar(A) || isscalar(B)) + if (~(isscalar (A) || isscalar (B))) C = []; - if (isa(A, 'dataframe')) - if (nargout > 2 && all(Csize == size(A)(1:2))), - C = df_allmeta(A, Csize); + if (isa (A, 'dataframe')) + if (nargout > 2 && all (Csize == size (A)(1:2))), + C = df_allmeta (A, Csize); endif - if (isa(B, 'dataframe')) - if (nargout > 2 && isempty(C) && all(Csize == size(B)(1:2))), - C = df_allmeta(B, Csize); - endif - if (strict), - %# compare indexes if both exist - if (!isempty(A._ridx)) - if (!isempty(B._ridx) && itercol), - if (any(A._ridx-B._ridx)), - error("Non compatible indexes"); - endif - endif - else - if (nargout > 2 && itercol), C._ridx = B._ridx; endif - endif - - if (itercol), - idxB = 1; %# row-row comparison - else - idxB = 2; %# row-col comparsion - endif - - if (!isempty(A._name{1})) - if (!isempty(B._name{idxB})) - dummy = !(strcmp(cellstr(A._name{1}), cellstr(B._name{idxB}))\ - | (A._over{1}(:)) | (B._over{idxB}(:))); - if (any(dummy)), - if (itercol), - error("Incompatible row names"); - else - error("Incompatible row vs. column names"); - endif - endif - dummy = A._over{1} > B._over{idxB}; - if (any(dummy)), - C._name{1}(dummy) = B._name{idxB}(dummy); - C._over{1}(dummy) = B._over{idxB}(dummy); - endif - endif - else - if (nargout > 2), - C._name{1} = B._name{idxB}; C._over{1} = B._over{idxB}; - endif - endif - - idxB = 3-idxB; - - if (!isempty(A._name{2})) - if (!isempty(B._name{idxB})) - dummy = !(strcmp(cellstr(A._name{2}), cellstr(B._name{2}))\ - | (A._over{2}(:)) | (B._over{2}(:))); - if (any(dummy)), - if (itercol), - error("Incompatible column vs row names"); - else - error("Incompatible column names"); - endif - endif - dummy = A._over{2} > B._over{idxB}; - if (any(dummy)), - C._name{2}(dummy) = B._name{idxB}(dummy); - C._over{2}(dummy) = B._over{idxB}(dummy); - endif - endif - else - if (nargout > 2 && !isempty(B._name{idxB})), - C._name{2} = B._name{idxB}; C._over{2} = B._over{idxB}; - endif - endif - endif + if (isa (B, 'dataframe')) + if (nargout > 2 && isempty (C) && all (Csize == size (B)(1:2))), + C = df_allmeta (B, Csize); + endif + if (strict) + %# compare indexes if both exist + if (~isempty (A._ridx)) + if (~isempty(B._ridx) && itercol) + if (any (A._ridx-B._ridx)), + error ("Non compatible indexes"); + endif + endif + else + if (nargout > 2 && itercol), C._ridx = B._ridx; endif + endif + + if (itercol), + idxB = 1; %# row-row comparison + else + idxB = 2; %# row-col comparsion + endif + + if (~isempty (A._name{1})) + if (~isempty (B._name{idxB})) + dummy = ~(strcmp (cellstr (A._name{1}), cellstr (B._name{idxB}))\ + | (A._over{1}(:)) | (B._over{idxB}(:))); + if (any (dummy)) + if (itercol), + error ("Incompatible row names"); + else + error ("Incompatible row vs. column names"); + endif + endif + dummy = A._over{1} > B._over{idxB}; + if (any (dummy)), + C._name{1}(dummy) = B._name{idxB}(dummy); + C._over{1}(dummy) = B._over{idxB}(dummy); + endif + endif + else + if (nargout > 2), + C._name{1} = B._name{idxB}; C._over{1} = B._over{idxB}; + endif + endif + + idxB = 3-idxB; + + if (~isempty(A._name{2})) + if (~isempty(B._name{idxB})) + dummy = ~(strcmp (cellstr (A._name{2}), cellstr (B._name{2}))\ + | (A._over{2}(:)) | (B._over{2}(:))); + if (any (dummy)), + if (itercol), + error ("Incompatible column vs row names"); + else + error ("Incompatible column names"); + endif + endif + dummy = A._over{2} > B._over{idxB}; + if (any (dummy)), + C._name{2}(dummy) = B._name{idxB}(dummy); + C._over{2}(dummy) = B._over{idxB}(dummy); + endif + endif + else + if (nargout > 2 && ~isempty (B._name{idxB})), + C._name{2} = B._name{idxB}; C._over{2} = B._over{idxB}; + endif + endif + endif - if (isempty(A._src) && nargout > 2 && !isempty(B._src)), - C._src = B._src; - endif - if (isempty(A._cmt) && nargout > 2 && !isempty(B._cmt)), - C._cmt = B._cmt; - endif + if (isempty (A._src) && nargout > 2 && ~isempty (B._src)), + C._src = B._src; + endif + if (isempty (A._cmt) && nargout > 2 && ~isempty (B._cmt)), + C._cmt = B._cmt; + endif else %# B is not a df - if (nargout > 2 && isempty(C)), - C = df_allmeta(A); - endif + if (nargout > 2 && isempty (C)), + C = df_allmeta (A); + endif endif else %# A is not a df if (nargout > 2), - if (all(Csize==size(B)(1:2))), - C = df_allmeta(B, Csize); - else - C = df_allmeta(B); - endif + if (all (Csize == size (B)(1:2))), + C = df_allmeta (B, Csize); + else + C = df_allmeta (B); + endif endif endif else %# both arg are scalar - if (nargout > 2), - if (isa(A, 'dataframe')) - C = df_allmeta(A); + if (nargout > 2) + if (isa (A, 'dataframe')) + C = df_allmeta (A); else - C = df_allmeta(B); + C = df_allmeta (B); endif endif endif Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_check_char_array.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_check_char_array.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_check_char_array.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -26,27 +26,27 @@ %# $Id$ %# - if 2 == nargin, required = [nelem 1]; endif + if (2 == nargin) required = [nelem 1]; endif - if nelem < required(1), - error("Too many elements to assign"); + if (nelem < required(1)) + error ("Too many elements to assign"); endif %# a zero-length element is still considered as a space by char - if isempty(x), x = ' '; endif + if (isempty (x)) x = ' '; endif - if size(x, 1) < max(required(1), nelem) + if (size (x, 1) < max (required(1), nelem)) %# pad vertically - dummy = repmat(' ', nelem-size(x, 1), 1); - resu = char(x, dummy); + dummy = repmat (' ', nelem-size (x, 1), 1); + resu = char (x, dummy); else resu = x; endif - if size(resu, 2) < required(2), + if (size (resu, 2) < required(2)) %# pad horizontally - dummy = repmat(' ', nelem, required(2)-size(resu, 2)); - resu = horzcat(resu, dummy); + dummy = repmat (' ', nelem, required(2)-size (resu, 2)); + resu = horzcat (resu, dummy); endif endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_colmeta.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_colmeta.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_colmeta.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -28,15 +28,15 @@ %# $Id: df_func.m 7943 2010-11-24 15:33:54Z cdemills $ %# - resu = dataframe([]); + resu = dataframe ([]); resu._cnt(2) = df._cnt(2); resu._name{2} = df._name{2}; resu._over{2} = df._over{2}; resu._type = df._type; %# init it with the right orientation - resu._data = cell(size(df._data)); - resu._rep = cell(size(df._rep)); + resu._data = cell (size (df._data)); + resu._rep = cell (size (df._rep)); resu._src = df._src; resu._cmt = df._cmt; Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_cow.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_cow.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_cow.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -29,50 +29,50 @@ %# $Id$ %# - if length(col) > 1, - error("df_cow must work on a column-by-column basis"); + if (length (col) > 1) + error ("df_cow must work on a column-by-column basis"); endif - if (1 == length(S.subs)), + if (1 == length (S.subs)), inds = 1; else inds = S.subs{2}; endif - if (!isnumeric(inds)), - if !strcmp(inds, ':'), - error("Unknown sheet selector %s", inds); + if (~isnumeric(inds)) + if (~strcmp (inds, ':')) + error ("Unknown sheet selector %s", inds); endif - inds = 1:length(df._rep(col)); + inds = 1:length (df._rep(col)); endif - for indi = inds(:).', + for indi = (inds(:).') dummy = df._rep{col}; dummy(indi) = 0; - [t1, t2] = ismember(df._rep{col}(indi)(:), dummy); - for indj = t2(find(t2)), %# Copy-On-Write + [t1, t2] = ismember (df._rep{col}(indi)(:), dummy); + for indj = (t2(find (t2))) %# Copy-On-Write %# determines the index for the next column - t1 = 1+max(df._rep{col}); + t1 = 1 + max (df._rep{col}); %# duplicate the touched column - df._data{col} = horzcat(df._data{col}, \ - df._data{col}(:, df._rep{col}(indj))); - if (indi > 1), + df._data{col} = horzcat (df._data{col}, \ + df._data{col}(:, df._rep{col}(indj))); + if (indi > 1) %# a new column has been created df._rep{col}(indi) = t1; else %# update repetition index aliasing this one - df._rep{col}(find(dummy == indi)) = t1; + df._rep{col}(find (dummy == indi)) = t1; endif endfor endfor %# reorder S - if (length(S.subs) > 1), - if (S.subs{2} != 1 || length(S.subs{2}) > 1), + if (length (S.subs) > 1) + if (S.subs{2} ~= 1 || length (S.subs{2}) > 1), %# adapt sheet index according to df_rep S.subs{2} = df._rep{col}(S.subs{2}); endif endif - df = df_thirddim(df); + df = df_thirddim (df); endfunction Modified: trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_func.m =================================================================== --- trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_func.m 2012-03-11 20:34:47 UTC (rev 9816) +++ trunk/octave-forge/extra/dataframe/inst/@dataframe/private/df_func.m 2012-03-11 20:53:31 UTC (rev 9817) @@ -32,191 +32,191 @@ %# $Id$ %# - [A, B, resu] = df_basecomp(A, B, itercol, func); + [A, B, resu] = df_basecomp (A, B, itercol, func); itercol = itercol(1); %# drop second value - if (isa(B, 'dataframe')) - if (!isa(A, 'dataframe')), - if (isscalar(A)), - for indi = resu._cnt(2):-1:1, + if (isa (B, 'dataframe')) + if (~isa (A, 'dataframe')), + if (isscalar (A)), + for indi = (resu._cnt(2):-1:1) switch resu._type{indi} case "char" - resu._data{indi} = feval(func, A, char(B._data{indi})); + resu._data{indi} = feval (func, A, char (B._data{indi})); otherwise - resu._data{indi} = feval(func, A, B._data{indi}); + resu._data{indi} = feval (func, A, B._data{indi}); endswitch endfor resu._rep = B._rep; else - if (whole(1) && !whole(2)), - for indi = resu._cnt(2):-1:1, + if (whole(1) && ~whole(2)) + for indi = (resu._cnt(2):-1:1) switch resu._type{indi} case "char" - resu._data{indi} = feval(func, A, \ - char(B._data{indi}(:, B._rep{indi}))); + resu._data{indi} = feval (func, A, \ + char (B._data{indi}(:, B._rep{indi}))); otherwise - resu._data{indi} = feval(func, A, \ - B._data{indi}(:, B._rep{indi})); + resu._data{indi} = feval (func, A, \ + B._data{indi}(:, B._rep{indi})); endswitch - resu._rep{indi} = 1:size(resu._data{indi}, 2); + resu._rep{indi} = 1:size (resu._data{indi}, 2); endfor - elseif (itercol && !whole(2)), - for indi = resu._cnt(2):-1:1, + elseif (itercol && ~whole(2)), + for indi = (resu._cnt(2):-1:1) switch resu._type{indi} case "char" - resu._data{indi} = feval(func, squeeze(A(:, indi, :)), \ - char(B._data{indi}(:, B._rep{indi}))); + resu._data{indi} = feval (func, squeeze (A(:, indi, :)), \ + char (B._data{indi}(:, B._rep{indi}))); otherwise - resu._data{indi} = feval(func, squeeze(A(:, indi, :)), \ - B._data{indi}(:, B._rep{indi})); + resu._data{indi} = feval (func, squeeze (A(:, indi, :)), \ + B._data{indi}(:, B._rep{indi})); endswitch - resu._rep{indi} = 1:size(resu._data{indi}, 2); + resu._rep{indi} = 1:size (resu._data{indi}, 2); endfor - elseif (!whole(2)), - warning("no 3D yet"); - for indi = resu._cnt(2):-1:1, + elseif (~whole(2)), + warning ("no 3D yet"); + for indi = (resu._cnt(2):-1:1) switch resu._type{indi} case "char" - resu._data{indi} = feval(func, A(indi, :), char(B._data{indi})); + resu._data{indi} = feval (func, A(indi, :), char (B._data{indi})); otherwise - resu._data{indi} = feval(func, A(indi, :), B._data{indi}); + resu._data{indi} = feval (func, A(indi, :), B._data{indi}); endswitch endfor else - dummy = feval(func, A, df_whole(B)); - for indi = resu._cnt(2):-1:1, %# store column-wise - resu._data{indi} = sq... [truncated message content] |
From: <prn...@us...> - 2012-03-11 20:34:53
|
Revision: 9816 http://octave.svn.sourceforge.net/octave/?rev=9816&view=rev Author: prnienhuis Date: 2012-03-11 20:34:47 +0000 (Sun, 11 Mar 2012) Log Message: ----------- First version of NEWS Added Paths: ----------- trunk/octave-forge/main/io/NEWS Added: trunk/octave-forge/main/io/NEWS =================================================================== --- trunk/octave-forge/main/io/NEWS (rev 0) +++ trunk/octave-forge/main/io/NEWS 2012-03-11 20:34:47 UTC (rev 9816) @@ -0,0 +1,96 @@ +Summary of important user-visible changes for releases of the io package + +=============================================================================== +io-1.0.18 Release Date: TBA Release Manager: Philip Nienhuis +=============================================================================== + +** Bug fixes: +--- odsfinfo: fixed "wrong type argument `cell'" bug when run interactively. +--- xlsopen, odsopen: fixed messed up screen output due to UNO usage warning. + +** Adapted to internal LibreOffice-3.5-final changes. + +** Tried OpenXLS-6.0.7.jar. Reads OK, still unusable for writing .xls files. + +=============================================================================== +io-1.0.17 Release Date: 2012-02-27 Release Manager: Philip Nienhuis +=============================================================================== + +** Bug fixes: +--- oct2ods, oct2xls, odswrite default range input arg. These functions may not + have worked properly for two years (!) + +** Fixed support for odfdom v.0.8.7 (ODS). Note: the OTK interface only works + well with xercesImpl.jar 2.9.1 (Sep 14, 2009) + +** Many small bug fixes & documentation updated to actual functionality. + +** Fixed "seealso" texinfo header string in almost all functions. + +** Added formal test scripts to "internal functions" section. + +=============================================================================== +io-1.0.16 Release Date: 2012-01-19 Release Manager: Philip Nienhuis +=============================================================================== + +** Bug fixing release + +** PKG_ADD now expects Java spreadsheet class libs (.jars) in /lib/java + (for MinGW) + +=============================================================================== +io-1.0.15 Release Date: 2011-10-02 Release Manager: Philip Nienhuis +=============================================================================== + +io-1.0.15 is primarily a bug fix release and a snapshot / wrap-up of current + development status (some still a bit experimental). It mainly comprises: + +** A number of bug fixes (incl. some serious ones, notably with .ods/OOo Calc); + +** Some mainly cosmetic improvements to existing code; less verbosity; + +** pch2mat (reading & transforming Nastran PCH files, contributed by + B. Oytun Peksel); + +** object2json.m (creating a json description string of objects, contributed + by Daniel Torre). This was already silently introduced in io-1.0.14; + +** A scripted troubleshooting / classpath setup tool for spreadsheet I/O + support (chk_spreadsheet_support.m); + +** Experimental OXS support (OpenXLS) for reading Excel xls (BIFF8). + OpenXLS is -let's say- a little bit lacking: For reading it is faster than + JXL. However, while OXS write support has been coded (and works) I had to + disable it as the OXS Java classes won't release the file handle so Octave + will hang upon closing :-( I'm stuck with this so I just release it as-is; + +** Experimental UNO support, i.e. invoking OpenOffice.org (or clones like + LibreOffice) behind the scenes to read spreadsheet files, much like + ActiveX/COM for MS-Excel. This is also based on Java. The first time you + use UNO, OOo has to be loaded and you'll have to be patient, but once loaded + (and in the OS cache) you'll see the pros: + --* Very fast; + --* Much lower Java memory usage as OOo loads the spreadsheet in its own + memory chunk (not Octave's) => much bigger spreadsheet capacity; + --* You can read *all* formats supported by OOo: .ods, .xls, .csv, .xlsx, + .sxc, .dbf, Lotus wk1, Quattro Pro, ......; and it doesn't really matter + whether xlsopen of odsopen is used. + Of course all this wonderful stuff comes at a prize: + --* After closing the spreadsheet file (odsclose, xlsclose) ALL OOo + invocations will be closed, also those started outside Octave. This is + due to "the way OpenOffice works" (quoted from OOo dev forum), especially + through Java. There are other ways to close OOo but they'll hang Octave; + --* The Java UNO classes supplied with e.g. LibreOffice aren't kept quite + up-to-date with the main program. As a consequence, with e.g., + LibreOffice 3.4 the main LO window will pop up (it can't be hidden). I + filed a bug report for this + (https://bugs.freedesktop.org/show_bug.cgi?id=40991) but I haven't seen + it being picked up yet. Another example: while LO 3.3.1's row capacity + was already > 106, it took until LO 3.4 before this capacity was + implemented in the Java UNO classes. + Like with OXS, I'm a bit stuck here - all this has to be fixed upstream. + +Hint: +for older Octave versions (< 3.4.0) you can install io-1.0.15 using the -nodeps + flag. You'll then loose the old and buggy textread and csv/dlm-read/write + functions but I'd consider that as no big loss. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mma...@us...> - 2012-03-11 16:44:24
|
Revision: 9815 http://octave.svn.sourceforge.net/octave/?rev=9815&view=rev Author: mmarzolla Date: 2012-03-11 16:44:18 +0000 (Sun, 11 Mar 2012) Log Message: ----------- improvements to the documentation Modified Paths: -------------- trunk/octave-forge/main/queueing/doc/markovchains.txi trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf trunk/octave-forge/main/queueing/inst/ctmc.m Modified: trunk/octave-forge/main/queueing/doc/markovchains.txi =================================================================== --- trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-11 15:45:11 UTC (rev 9814) +++ trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-11 16:44:18 UTC (rev 9815) @@ -60,11 +60,7 @@ The transition probability matrix @math{\bf P} must satisfy the following two properties: (1) @math{P_{i, j} @geq{} 0} for all -@math{i, j}, and (2) @math{\sum_{j=1}^N P_{i,j} = 1}. We denote with -@math{{\bf \pi}(n) = (\pi_1(n), \pi_2(n), @dots{}, \pi_N(n) )} the -@emph{state occupancy probability vector} at step -@math{n}. @math{\pi_i(n)} denotes the probability that the system is -in state @math{i} at step @math{n}. +@math{i, j}, and (2) @math{\sum_{j=1}^N P_{i,j} = 1}. @c @DOCSTRING(dtmc_check_P) @@ -74,6 +70,11 @@ @c @subsection State occupancy probabilities +We denote with @math{{\bf \pi}(n) = (\pi_1(n), \pi_2(n), @dots{}, +\pi_N(n) )} the @emph{state occupancy probability vector} at step +@math{n}. @math{\pi_i(n)} denotes the probability that the system is +in state @math{i} at step @math{n}. + Given the transition probability matrix @math{\bf P} and the initial state occupancy probability vector @math{{\bf \pi}(0) = (\pi_1(0), \pi_2(0), @dots{}, \pi_N(0))} at step 0, the state occupancy @@ -97,7 +98,8 @@ occupancy probability} @math{{\bf \pi} = \lim_{n \rightarrow +\infty} {\bf \pi}(n)}, which is independent from the initial state occupancy @math{{\bf \pi}(0)}. The stationary state occupancy probability vector -@math{\bf \pi} satisfies @math{{\bf \pi} = {\bf \pi} {\bf P}}. +@math{\bf \pi} satisfies @math{{\bf \pi} = {\bf \pi} {\bf P}} +and @math{\sum_{i=1}^N \pi_i = 1} @c @DOCSTRING(dtmc) @@ -148,6 +150,27 @@ @node Continuous-Time Markov Chains @section Continuous-Time Markov Chains +A stochastic process @math{@{X(t), t @geq{} 0@}} is a continuous-time +Markov chain if, for all integers @math{n}, and for any sequence +@math{t_0, t_1 , \ldots , t_n, t_{n+1}} such that @math{t_0 < t_1 < +\ldots < t_n < t_{n+1}}, we have + +@iftex +@tex +$$P(X_{t_{n+1}} = x_{n+1}\ |\ X(t_n) = x_n, X(t_{n-1}) = x_{n-1}, \ldots, X(t_0) = x_0) = P(X(t_{n+1}) = x_{n+1}\ |\ X(t_n) = x_n)$$ +@end tex +@end iftex +@ifnottex +@math{P(X_{n+1} = x_{n+1} | X_n = x_n, X_{n-1} = x_{n-1}, ..., X_0 = x_0) = P(X_{n+1} = x_{n+1} | X_n = x_n)} +@end ifnottex + +A continuous-time Markov chain is defined according to an +@emph{infinitesimal generator matrix} @math{{\bf Q} = [Q_{i,j}]} such +that for each @math{i \neq j}, @math{Q_{i, j}} is the transition rate +from state @math{i} to state @math{j}. The elements @math{Q_{i, i}} +must be defined in such a way that the infinitesimal generator matrix +@math{\bf Q} satisfies the property @math{\sum_{j=1}^N Q_{i,j} = 0}. + @DOCSTRING(ctmc_check_Q) @menu @@ -162,6 +185,37 @@ @node State occupancy probabilities @subsection State occupancy probabilities +Similarly to the discrete case, we denote with @math{{\bf \pi}(t) = +(\pi_1(t), \pi_2(t), @dots{}, \pi_N(t) )} the @emph{state occupancy +probability vector} at time @math{t}. @math{\pi_i(t)} denotes the +probability that the system is in state @math{i} at time @math{t @geq{} 0}. + +Given the infinitesimal generator matrix @math{\bf Q} and the initial +state occupancy probability vector @math{{\bf \pi}(0) = (\pi_1(0), +\pi_2(0), @dots{}, \pi_N(0))}, the state occupancy probability vector +@math{{\bf \pi}(t)} at time @math{t} can be computed as: + +@iftex +@tex +$${\bf \pi}(t) = {\bf \pi}(0) \exp( {\bf Q} t )$$ +@end tex +@end iftex +@ifnottex +@example +@group +\pi(t) = \pi(0) exp(Qt) +@end group +@end example +@end ifnottex + +@noindent where @math{\exp( {\bf Q} t )} is the matrix exponential +of @math{{\bf Q} t}. Under certain conditions, there exists a +@emph{stationary state occupancy probability} @math{{\bf \pi} = +\lim_{t \rightarrow +\infty} {\bf \pi}(t)}, which is independent from +the initial state occupancy @math{{\bf \pi}(0)}. The stationary state +occupancy probability vector @math{\bf \pi} satisfies +@math{{\bf \pi} {\bf Q} = {\bf 0}} and @math{\sum_{i=1}^N \pi_i = 1}. + @DOCSTRING(ctmc) @noindent @strong{EXAMPLE} @@ -195,7 +249,7 @@ (L_1(t), L_2(t), \ldots L_N(t))} such that @math{L_i(t)} is the expected sojourn time in state @math{i} during the interval @math{[0,t)}, assuming that the initial occupancy probability at time -0 was @math{{\bf \pi}(0)}. Then, @math{{\bf L}(t)} is the solution of +0 was @math{{\bf \pi}(0)}. @math{{\bf L}(t)} is the solution of the following differential equation: @iftex @@ -213,10 +267,27 @@ @end example @end ifnottex -The function @code{ctmc_exps} can be used to compute @math{{\bf -L}(t)}, by using the @code{lsode} Octave function to solve the above -linear differential equation. +Alternatively, @math{{\bf L}(t)} can also be expressed in integral +form as: +@iftex +@tex +$$ {\bf L}(t) = \int_{u=0}^t {\bf \pi}(u) du$$ +@end tex +@end iftex +@ifnottex +@example +@group + / t +L(t) = | pi(u) du + / u=0 +@end group +@end example +@end ifnottex + +@noindent where @math{{\bf \pi}(t) = {\bf \pi}(0) \exp({\bf Q}t)} is +the state occupancy probability at time @math{t}. + @DOCSTRING(ctmc_exps) @noindent @strong{EXAMPLE} @@ -225,7 +296,7 @@ rate from state @math{i} to state @math{i+1} is @math{\lambda_i = i \lambda} (@math{i=1, 2, 3}), with @math{\lambda = 0.5}. The following code computes the expected sojourn time in state @math{i}, -given the initial occupancy probability @math{p_0=(1,0,0,0)}. +given the initial occupancy probability @math{{\bf \pi}_0=(1,0,0,0)}. @example @group Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-11 15:45:11 UTC (rev 9814) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-11 16:44:18 UTC (rev 9815) @@ -811,11 +811,7 @@ <p>The transition probability matrix \bf P must satisfy the following two properties: (1) P_i, j ≥ 0 for all -i, j, and (2) \sum_j=1^N P_i,j = 1. We denote with -\bf \pi(n) = (\pi_1(n), \pi_2(n), <small class="dots">...</small>, \pi_N(n) ) the -<em>state occupancy probability vector</em> at step -n. \pi_i(n) denotes the probability that the system is -in state i at step n. +i, j, and (2) \sum_j=1^N P_i,j = 1. <p><a name="doc_002ddtmc_005fcheck_005fP"></a> @@ -832,7 +828,12 @@ <h4 class="subsection">4.1.1 State occupancy probabilities</h4> -<p>Given the transition probability matrix \bf P and the initial +<p>We denote with \bf \pi(n) = (\pi_1(n), \pi_2(n), <small class="dots">...</small>, +\pi_N(n) ) the <em>state occupancy probability vector</em> at step +n. \pi_i(n) denotes the probability that the system is +in state i at step n. + + <p>Given the transition probability matrix \bf P and the initial state occupancy probability vector \bf \pi(0) = (\pi_1(0), \pi_2(0), <small class="dots">...</small>, \pi_N(0)) at step 0, the state occupancy probability vector \bf \pi(n) at step n can be @@ -844,7 +845,8 @@ occupancy probability</em> \bf \pi = \lim_n \rightarrow +\infty \bf \pi(n), which is independent from the initial state occupancy \bf \pi(0). The stationary state occupancy probability vector -\bf \pi satisfies \bf \pi = \bf \pi \bf P. +\bf \pi satisfies \bf \pi = \bf \pi \bf P +and \sum_i=1^N \pi_i = 1 <p><a name="doc_002ddtmc"></a> @@ -1009,8 +1011,22 @@ <h3 class="section">4.2 Continuous-Time Markov Chains</h3> -<p><a name="doc_002dctmc_005fcheck_005fQ"></a> +<p>A stochastic process {X(t), t ≥ 0} is a continuous-time +Markov chain if, for all integers n, and for any sequence +t_0, t_1 , \ldots , t_n, t_n+1 such that t_0 < t_1 < +\ldots < t_n < t_n+1, we have + <p>P(X_n+1 = x_n+1 | X_n = x_n, X_n-1 = x_n-1, ..., X_0 = x_0) = P(X_n+1 = x_n+1 | X_n = x_n) + + <p>A continuous-time Markov chain is defined according to an +<em>infinitesimal generator matrix</em> \bf Q = [Q_i,j] such +that for each i \neq j, Q_i, j is the transition rate +from state i to state j. The elements Q_i, i +must be defined in such a way that the infinitesimal generator matrix +\bf Q satisfies the property \sum_j=1^N Q_i,j = 0. + + <p><a name="doc_002dctmc_005fcheck_005fQ"></a> + <div class="defun"> — Function File: [<var>result</var> <var>err</var>] = <b>ctmc_check_Q</b> (<var>Q</var>)<var><a name="index-ctmc_005fcheck_005fQ-16"></a></var><br> <blockquote> @@ -1041,11 +1057,31 @@ <h4 class="subsection">4.2.1 State occupancy probabilities</h4> -<p><a name="doc_002dctmc"></a> +<p>Similarly to the discrete case, we denote with \bf \pi(t) = +(\pi_1(t), \pi_2(t), <small class="dots">...</small>, \pi_N(t) ) the <em>state occupancy +probability vector</em> at time t. \pi_i(t) denotes the +probability that the system is in state i at time t ≥ 0. + <p>Given the infinitesimal generator matrix \bf Q and the initial +state occupancy probability vector \bf \pi(0) = (\pi_1(0), +\pi_2(0), <small class="dots">...</small>, \pi_N(0)), the state occupancy probability vector +\bf \pi(t) at time t can be computed as: + +<pre class="example"> \pi(t) = \pi(0) exp(Qt) +</pre> + <p class="noindent">where \exp( \bf Q t ) is the matrix exponential +of \bf Q t. Under certain conditions, there exists a +<em>stationary state occupancy probability</em> \bf \pi = +\lim_t \rightarrow +\infty \bf \pi(t), which is independent from +the initial state occupancy \bf \pi(0). The stationary state +occupancy probability vector \bf \pi satisfies +\bf \pi \bf Q = \bf 0 and \sum_i=1^N \pi_i = 1. + + <p><a name="doc_002dctmc"></a> + <div class="defun"> — Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-18"></a></var><br> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. q0</var>)<var><a name="index-ctmc-19"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. p0</var>)<var><a name="index-ctmc-19"></a></var><br> <blockquote> <p><a name="index-Markov-chain_002c-continuous-time-20"></a><a name="index-Continuous-time-Markov-chain-21"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-22"></a><a name="index-Stationary-probabilities-23"></a> With a single argument, compute the stationary state occupancy @@ -1080,7 +1116,7 @@ satisfies the equation p\bf Q = 0 and \sum_i=1^N p_i = 1. If this function is invoked with three arguments, <var>p</var><code>(i)</code> is the probability that the system is in state i at time <var>t</var>, -given the initial occupancy probabilities <var>q0</var>. +given the initial occupancy probabilities <var>p0</var>. </dl> @@ -1152,17 +1188,23 @@ (L_1(t), L_2(t), \ldots L_N(t)) such that L_i(t) is the expected sojourn time in state i during the interval [0,t), assuming that the initial occupancy probability at time -0 was \bf \pi(0). Then, \bf L(t) is the solution of +0 was \bf \pi(0). \bf L(t) is the solution of the following differential equation: <pre class="example"> dL --(t) = L(t) Q + pi(0), L(0) = 0 dt </pre> - <p>The function <code>ctmc_exps</code> can be used to compute \bf -L(t), by using the <code>lsode</code> Octave function to solve the above -linear differential equation. + <p>Alternatively, \bf L(t) can also be expressed in integral +form as: +<pre class="example"> / t + L(t) = | pi(u) du + / u=0 +</pre> + <p class="noindent">where \bf \pi(t) = \bf \pi(0) \exp(\bf Qt) is +the state occupancy probability at time t. + <p><a name="doc_002dctmc_005fexps"></a> <div class="defun"> @@ -1212,7 +1254,7 @@ rate from state i to state i+1 is \lambda_i = i \lambda (i=1, 2, 3), with \lambda = 0.5. The following code computes the expected sojourn time in state i, -given the initial occupancy probability p_0=(1,0,0,0). +given the initial occupancy probability \bf \pi_0=(1,0,0,0). <pre class="example"><pre class="verbatim"> lambda = 0.5; N = 4; Modified: trunk/octave-forge/main/queueing/doc/queueing.pdf =================================================================== (Binary files differ) Modified: trunk/octave-forge/main/queueing/inst/ctmc.m =================================================================== --- trunk/octave-forge/main/queueing/inst/ctmc.m 2012-03-11 15:45:11 UTC (rev 9814) +++ trunk/octave-forge/main/queueing/inst/ctmc.m 2012-03-11 16:44:18 UTC (rev 9815) @@ -18,7 +18,7 @@ ## -*- texinfo -*- ## ## @deftypefn {Function File} {@var{p} =} ctmc (@var{Q}) -## @deftypefnx {Function File} {@var{p} =} ctmc (@var{Q}, @var{t}. @var{q0}) +## @deftypefnx {Function File} {@var{p} =} ctmc (@var{Q}, @var{t}. @var{p0}) ## ## @cindex Markov chain, continuous time ## @cindex Continuous time Markov chain @@ -63,7 +63,7 @@ ## satisfies the equation @math{p{\bf Q} = 0} and @math{\sum_{i=1}^N p_i = 1}. ## If this function is invoked with three arguments, @code{@var{p}(i)} ## is the probability that the system is in state @math{i} at time @var{t}, -## given the initial occupancy probabilities @var{q0}. +## given the initial occupancy probabilities @var{p0}. ## ## @end table ## @@ -72,7 +72,7 @@ ## Author: Moreno Marzolla <marzolla(at)cs.unibo.it> ## Web: http://www.moreno.marzolla.name/ -function q = ctmc( Q, t, q0 ) +function q = ctmc( Q, t, p0 ) persistent epsilon = 10*eps; @@ -91,17 +91,17 @@ endif if ( nargin > 2 ) - ( isvector(q0) && length(q0) == N && all(q0>=0) && abs(sum(q0)-1.0)<epsilon ) || \ - usage( "q0 must be a probability vector" ); - q0 = q0(:)'; # make q0 a row vector + ( isvector(p0) && length(p0) == N && all(p0>=0) && abs(sum(p0)-1.0)<epsilon ) || \ + usage( "p0 must be a probability vector" ); + p0 = p0(:)'; # make p0 a row vector else - q0 = ones(1,N) / N; + p0 = ones(1,N) / N; endif if ( nargin == 1 ) q = __ctmc_steady_state( Q ); else - q = __ctmc_transient(Q, t, q0 ); + q = __ctmc_transient(Q, t, p0 ); endif endfunction @@ -132,8 +132,8 @@ endfunction ## Helper function, compute transient probability -function q = __ctmc_transient( Q, t, q0 ) - q = q0*expm(Q*t); +function q = __ctmc_transient( Q, t, p0 ) + q = p0*expm(Q*t); endfunction %!test This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mma...@us...> - 2012-03-11 15:45:22
|
Revision: 9814 http://octave.svn.sourceforge.net/octave/?rev=9814&view=rev Author: mmarzolla Date: 2012-03-11 15:45:11 +0000 (Sun, 11 Mar 2012) Log Message: ----------- added function ctmc_check_Q() Modified Paths: -------------- trunk/octave-forge/main/queueing/ChangeLog trunk/octave-forge/main/queueing/DESCRIPTION trunk/octave-forge/main/queueing/Makefile trunk/octave-forge/main/queueing/NEWS trunk/octave-forge/main/queueing/doc/markovchains.txi trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf trunk/octave-forge/main/queueing/inst/ctmc.m trunk/octave-forge/main/queueing/inst/ctmc_exps.m trunk/octave-forge/main/queueing/inst/ctmc_fpt.m trunk/octave-forge/main/queueing/inst/ctmc_mtta.m trunk/octave-forge/main/queueing/inst/ctmc_taexps.m trunk/octave-forge/main/queueing/inst/dtmc.m trunk/octave-forge/main/queueing/inst/dtmc_check_P.m trunk/octave-forge/main/queueing/inst/dtmc_fpt.m trunk/octave-forge/main/queueing/inst/qnmvablo.m trunk/octave-forge/main/queueing/inst/qnvisits.m Added Paths: ----------- trunk/octave-forge/main/queueing/inst/ctmc_check_Q.m trunk/octave-forge/main/queueing/inst/dtmc_is_irreducible.m Modified: trunk/octave-forge/main/queueing/ChangeLog =================================================================== --- trunk/octave-forge/main/queueing/ChangeLog 2012-03-11 11:20:31 UTC (rev 9813) +++ trunk/octave-forge/main/queueing/ChangeLog 2012-03-11 15:45:11 UTC (rev 9814) @@ -1,18 +1,19 @@ -2012-02-XX Moreno Marzolla <mar...@cs...> +2012-03-XX Moreno Marzolla <mar...@cs...> * Version 1.X.0 released * Fixed bug in qnvisits() which made the function behave incorrectly under particular degenerate cases. * Fixed bug in ctmc_exps() (wrong initial value in call to lsode) - * Function ctmc_exps() can now also compute the expected sojourn time + * ctmc_exps() can now also compute the expected sojourn time until absorption for absorbing CTMCs. - * Function ctmc_exps() and ctmc_taexps() accept a scalar as second + * ctmc_exps() and ctmc_taexps() accept a scalar as second argument; the old syntax is still supported, but may be deprecated in future releases. - * Function ctmc_bd() now returns the infinitesimal generator matrix + * ctmc_bd() now returns the infinitesimal generator matrix of the birth-death process, not the steady-state solution. - * Function ctmc_bd_solve() has been removed - * New function dtmc_bd() + * ctmc_bd_solve() has been removed + * dtmc_bd() has been added + * ctmc_check_Q() has been added * Miscellaneous fixes/improvements to the documentation 2012-02-04 Moreno Marzolla <mar...@cs...> Modified: trunk/octave-forge/main/queueing/DESCRIPTION =================================================================== --- trunk/octave-forge/main/queueing/DESCRIPTION 2012-03-11 11:20:31 UTC (rev 9813) +++ trunk/octave-forge/main/queueing/DESCRIPTION 2012-03-11 15:45:11 UTC (rev 9814) @@ -1,6 +1,6 @@ Name: queueing Version: 1.X.0 -Date: 2012-02-XX +Date: 2012-03-XX Author: Moreno Marzolla <mar...@cs...> Maintainer: Moreno Marzolla <mar...@cs...> Title: Queueing networks and Markov chains analysis package for GNU Octave Modified: trunk/octave-forge/main/queueing/Makefile =================================================================== --- trunk/octave-forge/main/queueing/Makefile 2012-03-11 11:20:31 UTC (rev 9813) +++ trunk/octave-forge/main/queueing/Makefile 2012-03-11 15:45:11 UTC (rev 9814) @@ -1,5 +1,5 @@ VERSIONNUM=1.X.0 -VERSIONDATE="2012-02-XX" +VERSIONDATE="2012-03-XX" PROGNAME=queueing DISTNAME=$(PROGNAME)-$(VERSIONNUM) Modified: trunk/octave-forge/main/queueing/NEWS =================================================================== --- trunk/octave-forge/main/queueing/NEWS 2012-03-11 11:20:31 UTC (rev 9813) +++ trunk/octave-forge/main/queueing/NEWS 2012-03-11 15:45:11 UTC (rev 9814) @@ -15,6 +15,8 @@ ** Function ctmc_bd_solve() has been removed +** New function ctmc_check_Q() added + Summary of important user-visible changes for queueing-1.0.0 ------------------------------------------------------------------------------ Modified: trunk/octave-forge/main/queueing/doc/markovchains.txi =================================================================== --- trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-11 11:20:31 UTC (rev 9813) +++ trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-11 15:45:11 UTC (rev 9814) @@ -67,6 +67,11 @@ in state @math{i} at step @math{n}. @c +@DOCSTRING(dtmc_check_P) + +@c +@c +@c @subsection State occupancy probabilities Given the transition probability matrix @math{\bf P} and the initial @@ -143,6 +148,8 @@ @node Continuous-Time Markov Chains @section Continuous-Time Markov Chains +@DOCSTRING(ctmc_check_Q) + @menu * State occupancy probabilities:: * Birth-Death process:: @@ -319,5 +326,6 @@ @c @node First Passage Times @subsection First Passage Times + @DOCSTRING(ctmc_fpt) Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-11 11:20:31 UTC (rev 9813) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-11 15:45:11 UTC (rev 9814) @@ -817,6 +817,19 @@ n. \pi_i(n) denotes the probability that the system is in state i at step n. + <p><a name="doc_002ddtmc_005fcheck_005fP"></a> + +<div class="defun"> +— Function File: [<var>result</var> <var>err</var>] = <b>dtmc_check_P</b> (<var>P</var>)<var><a name="index-dtmc_005fcheck_005fP-1"></a></var><br> +<blockquote> + <p><a name="index-Markov-chain_002c-discrete-time-2"></a> +If <var>P</var> is a valid transition probability matrix, return +the size (number of rows or columns) of <var>P</var>. If <var>P</var> is not +a transition probability matrix, set <var>result</var> to zero, and +<var>err</var> to an appropriate error string. + + </blockquote></div> + <h4 class="subsection">4.1.1 State occupancy probabilities</h4> <p>Given the transition probability matrix \bf P and the initial @@ -836,10 +849,10 @@ <p><a name="doc_002ddtmc"></a> <div class="defun"> -— Function File: <var>p</var> = <b>dtmc</b> (<var>P</var>)<var><a name="index-dtmc-1"></a></var><br> -— Function File: <var>p</var> = <b>dtmc</b> (<var>P, n, p0</var>)<var><a name="index-dtmc-2"></a></var><br> +— Function File: <var>p</var> = <b>dtmc</b> (<var>P</var>)<var><a name="index-dtmc-3"></a></var><br> +— Function File: <var>p</var> = <b>dtmc</b> (<var>P, n, p0</var>)<var><a name="index-dtmc-4"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-discrete-time-3"></a><a name="index-Discrete-time-Markov-chain-4"></a><a name="index-Markov-chain_002c-stationary-probabilities-5"></a><a name="index-Stationary-probabilities-6"></a> + <p><a name="index-Markov-chain_002c-discrete-time-5"></a><a name="index-Discrete-time-Markov-chain-6"></a><a name="index-Markov-chain_002c-stationary-probabilities-7"></a><a name="index-Stationary-probabilities-8"></a> With a single argument, compute the steady-state probability vector <var>p</var><code>(1), ..., </code><var>p</var><code>(N)</code> for a Discrete-Time Markov Chain given the N \times N transition @@ -900,9 +913,9 @@ <p><a name="doc_002ddtmc_005fbd"></a> <div class="defun"> -— Function File: <var>P</var> = <b>dtmc_bd</b> (<var>birth, death</var>)<var><a name="index-dtmc_005fbd-7"></a></var><br> +— Function File: <var>P</var> = <b>dtmc_bd</b> (<var>birth, death</var>)<var><a name="index-dtmc_005fbd-9"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-discrete-time-8"></a><a name="index-Birth_002ddeath-process-9"></a> + <p><a name="index-Markov-chain_002c-discrete-time-10"></a><a name="index-Birth_002ddeath-process-11"></a> Returns the N \times N transition probability matrix P for a birth-death process with given rates. @@ -942,10 +955,10 @@ <p><a name="doc_002ddtmc_005ffpt"></a> <div class="defun"> -— Function File: <var>M</var> = <b>dtmc_fpt</b> (<var>P</var>)<var><a name="index-dtmc_005ffpt-10"></a></var><br> -— Function File: <var>m</var> = <b>dtmc_fpt</b> (<var>P, i, j</var>)<var><a name="index-dtmc_005ffpt-11"></a></var><br> +— Function File: <var>M</var> = <b>dtmc_fpt</b> (<var>P</var>)<var><a name="index-dtmc_005ffpt-12"></a></var><br> +— Function File: <var>m</var> = <b>dtmc_fpt</b> (<var>P, i, j</var>)<var><a name="index-dtmc_005ffpt-13"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-discrete-time-12"></a><a name="index-First-passage-times-13"></a> + <p><a name="index-Markov-chain_002c-discrete-time-14"></a><a name="index-First-passage-times-15"></a> If called with a single argument, computes the mean first passage times <var>M</var><code>(i,j)</code>, that are the average number of transitions before state <var>j</var> is reached, starting from state <var>i</var>, for all @@ -971,9 +984,11 @@ <p><strong>OUTPUTS</strong> <dl> -<dt><var>M</var><dd>If this function is called with a single argument, the result +<dt><var>M</var><dd>If this function is called with a single argument, <var>M</var><code>(i,j)</code> is the average number of transitions before state -<var>j</var> is reached for the first time, starting from state <var>i</var>. +<var>j</var> is reached for the first time, starting from state <var>i</var>. +<var>M</var><code>(i,i)</code> is the <em>mean recurrence time</em>, and +represents the average time needed to return to state <var>i</var>. <br><dt><var>m</var><dd>If this function is called with three arguments, the result <var>m</var> is the average number of transitions before state <var>j</var> is visited @@ -994,6 +1009,19 @@ <h3 class="section">4.2 Continuous-Time Markov Chains</h3> +<p><a name="doc_002dctmc_005fcheck_005fQ"></a> + +<div class="defun"> +— Function File: [<var>result</var> <var>err</var>] = <b>ctmc_check_Q</b> (<var>Q</var>)<var><a name="index-ctmc_005fcheck_005fQ-16"></a></var><br> +<blockquote> + <p><a name="index-Markov-chain_002c-continuous-time-17"></a> +If <var>Q</var> is a valid infinitesimal generator matrix, return +the size (number of rows or columns) of <var>Q</var>. If <var>Q</var> is not +an infinitesimal generator matrix, set <var>result</var> to zero, and +<var>err</var> to an appropriate error string. + + </blockquote></div> + <ul class="menu"> <li><a accesskey="1" href="#State-occupancy-probabilities">State occupancy probabilities</a> <li><a accesskey="2" href="#Birth_002dDeath-process">Birth-Death process</a> @@ -1016,10 +1044,10 @@ <p><a name="doc_002dctmc"></a> <div class="defun"> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-14"></a></var><br> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. q0</var>)<var><a name="index-ctmc-15"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-18"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. q0</var>)<var><a name="index-ctmc-19"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-16"></a><a name="index-Continuous-time-Markov-chain-17"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-18"></a><a name="index-Stationary-probabilities-19"></a> + <p><a name="index-Markov-chain_002c-continuous-time-20"></a><a name="index-Continuous-time-Markov-chain-21"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-22"></a><a name="index-Stationary-probabilities-23"></a> With a single argument, compute the stationary state occupancy probability vector <var>p</var>(1), <small class="dots">...</small>, <var>p</var>(N) for a Continuous-Time Markov Chain with infinitesimal generator matrix @@ -1082,9 +1110,9 @@ <p><a name="doc_002dctmc_005fbd"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-20"></a></var><br> +— Function File: <var>Q</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-24"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-21"></a><a name="index-Birth_002ddeath-process-22"></a> + <p><a name="index-Markov-chain_002c-continuous-time-25"></a><a name="index-Birth_002ddeath-process-26"></a> Returns the N \times N infinitesimal generator matrix Q for a birth-death process with given rates. @@ -1138,10 +1166,10 @@ <p><a name="doc_002dctmc_005fexps"></a> <div class="defun"> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-23"></a></var><br> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-24"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-27"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-28"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-25"></a><a name="index-Expected-sojourn-time-26"></a> + <p><a name="index-Markov-chain_002c-continuous-time-29"></a><a name="index-Expected-sojourn-time-30"></a> With three arguments, compute the expected times <var>L</var><code>(i)</code> spent in each state i during the time interval [0,t], assuming that the state occupancy probabilities @@ -1221,9 +1249,9 @@ <p><a name="doc_002dctmc_005ftaexps"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-27"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-31"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-28"></a><a name="index-Time_002dalveraged-sojourn-time-29"></a> + <p><a name="index-Markov-chain_002c-continuous-time-32"></a><a name="index-Time_002dalveraged-sojourn-time-33"></a> Compute the <em>time-averaged sojourn time</em> <var>M</var><code>(i)</code>, defined as the fraction of the time interval [0,t] spent in state i, assuming that the state occupancy probabilities at @@ -1306,9 +1334,9 @@ <p><a name="doc_002dctmc_005fmtta"></a> <div class="defun"> -— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-30"></a></var><br> +— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-34"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-31"></a><a name="index-Mean-time-to-absorption-32"></a> + <p><a name="index-Markov-chain_002c-continuous-time-35"></a><a name="index-Mean-time-to-absorption-36"></a> Compute the Mean-Time to Absorption (MTTA) of the CTMC described by the infinitesimal generator matrix <var>Q</var>, starting from initial occupancy probabilities <var>p</var>. If there are no absorbing states, this @@ -1369,7 +1397,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-33"></a><a name="index-Greiner_002c-S_002e-34"></a><a name="index-de-Meer_002c-H_002e-35"></a><a name="index-Trivedi_002c-K_002e-36"></a> + <p><a name="index-Bolch_002c-G_002e-37"></a><a name="index-Greiner_002c-S_002e-38"></a><a name="index-de-Meer_002c-H_002e-39"></a><a name="index-Trivedi_002c-K_002e-40"></a> <div class="node"> <a name="First-Passage-Times"></a> <p><hr> @@ -1383,10 +1411,10 @@ <p><a name="doc_002dctmc_005ffpt"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-37"></a></var><br> -— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-38"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-41"></a></var><br> +— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-42"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-39"></a><a name="index-First-passage-times-40"></a> + <p><a name="index-Markov-chain_002c-continuous-time-43"></a><a name="index-First-passage-times-44"></a> If called with a single argument, computes the mean first passage times <var>M</var><code>(i,j)</code>, the average times before state <var>j</var> is reached, starting from state <var>i</var>, for all 1 \leq i, j \leq @@ -1492,9 +1520,9 @@ <p><a name="doc_002dqnmm1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-41"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-45"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-42"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-46"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1 queue. @@ -1539,7 +1567,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.3. - <p><a name="index-Bolch_002c-G_002e-43"></a><a name="index-Greiner_002c-S_002e-44"></a><a name="index-de-Meer_002c-H_002e-45"></a><a name="index-Trivedi_002c-K_002e-46"></a> + <p><a name="index-Bolch_002c-G_002e-47"></a><a name="index-Greiner_002c-S_002e-48"></a><a name="index-de-Meer_002c-H_002e-49"></a><a name="index-Trivedi_002c-K_002e-50"></a> <!-- M/M/m --> <div class="node"> <a name="The-M%2fM%2fm-System"></a> @@ -1565,10 +1593,10 @@ <p><a name="doc_002dqnmmm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-47"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-48"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-51"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-52"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-49"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-53"></a> Compute utilization, response time, average number of requests in service and throughput for a M/M/m queue, a queueing system with m identical service centers connected to a single queue. @@ -1620,7 +1648,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.5. - <p><a name="index-Bolch_002c-G_002e-50"></a><a name="index-Greiner_002c-S_002e-51"></a><a name="index-de-Meer_002c-H_002e-52"></a><a name="index-Trivedi_002c-K_002e-53"></a> + <p><a name="index-Bolch_002c-G_002e-54"></a><a name="index-Greiner_002c-S_002e-55"></a><a name="index-de-Meer_002c-H_002e-56"></a><a name="index-Trivedi_002c-K_002e-57"></a> <!-- M/M/inf --> <div class="node"> <a name="The-M%2fM%2finf-System"></a> @@ -1643,7 +1671,7 @@ <p><a name="doc_002dqnmminf"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-54"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-58"></a></var><br> <blockquote> <p>Compute utilization, response time, average number of requests and throughput for a M/M/\infty queue. This is a system with an @@ -1651,7 +1679,7 @@ system is always stable, regardless the values of the arrival and service rates. - <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-55"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-59"></a> <p><strong>INPUTS</strong> @@ -1669,7 +1697,7 @@ different from the utilization, which in the case of M/M/\infty centers is always zero. - <p><a name="index-traffic-intensity-56"></a> + <p><a name="index-traffic-intensity-60"></a> <br><dt><var>R</var><dd>Service center response time. <br><dt><var>Q</var><dd>Average number of requests in the system (which is equal to the @@ -1697,7 +1725,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.4. - <p><a name="index-Bolch_002c-G_002e-57"></a><a name="index-Greiner_002c-S_002e-58"></a><a name="index-de-Meer_002c-H_002e-59"></a><a name="index-Trivedi_002c-K_002e-60"></a> + <p><a name="index-Bolch_002c-G_002e-61"></a><a name="index-Greiner_002c-S_002e-62"></a><a name="index-de-Meer_002c-H_002e-63"></a><a name="index-Trivedi_002c-K_002e-64"></a> <!-- M/M/1/k --> <div class="node"> <a name="The-M%2fM%2f1%2fK-System"></a> @@ -1721,9 +1749,9 @@ <p><a name="doc_002dqnmm1k"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-61"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-65"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-62"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-66"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1/K finite capacity system. In a M/M/1/K queue there is a single server; the maximum number of @@ -1790,9 +1818,9 @@ <p><a name="doc_002dqnmmmk"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-63"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-67"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-64"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-68"></a> Compute utilization, response time, average number of requests and throughput for a M/M/m/K finite capacity system. In a M/M/m/K system there are m \geq 1 identical service @@ -1850,7 +1878,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.6. - <p><a name="index-Bolch_002c-G_002e-65"></a><a name="index-Greiner_002c-S_002e-66"></a><a name="index-de-Meer_002c-H_002e-67"></a><a name="index-Trivedi_002c-K_002e-68"></a> + <p><a name="index-Bolch_002c-G_002e-69"></a><a name="index-Greiner_002c-S_002e-70"></a><a name="index-de-Meer_002c-H_002e-71"></a><a name="index-Trivedi_002c-K_002e-72"></a> <!-- Approximate M/M/m --> <div class="node"> @@ -1872,9 +1900,9 @@ <p><a name="doc_002dqnammm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-69"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-73"></a></var><br> <blockquote> - <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-70"></a> + <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-74"></a> Compute <em>approximate</em> utilization, response time, average number of requests in service and throughput for an asymmetric M/M/m queue. In this system there are m different service centers @@ -1921,7 +1949,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998 - <p><a name="index-Bolch_002c-G_002e-71"></a><a name="index-Greiner_002c-S_002e-72"></a><a name="index-de-Meer_002c-H_002e-73"></a><a name="index-Trivedi_002c-K_002e-74"></a> + <p><a name="index-Bolch_002c-G_002e-75"></a><a name="index-Greiner_002c-S_002e-76"></a><a name="index-de-Meer_002c-H_002e-77"></a><a name="index-Trivedi_002c-K_002e-78"></a> <div class="node"> <a name="The-M%2fG%2f1-System"></a> <a name="The-M_002fG_002f1-System"></a> @@ -1937,9 +1965,9 @@ <p><a name="doc_002dqnmg1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-75"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-79"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-76"></a> + <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-80"></a> Compute utilization, response time, average number of requests and throughput for a M/G/1 system. The service time distribution is described by its mean <var>xavg</var>, and by its second moment @@ -1996,9 +2024,9 @@ <p><a name="doc_002dqnmh1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-77"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-81"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-78"></a> + <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-82"></a> Compute utilization, response time, average number of requests and throughput for a M/H_m/1 system. In this system, the customer service times have hyper-exponential distribution: @@ -2080,7 +2108,7 @@ <li><a accesskey="6" href="#Utility-functions">Utility functions</a>: Utility functions to compute miscellaneous quantities </ul> -<p><a name="index-queueing-networks-79"></a> +<p><a name="index-queueing-networks-83"></a> <!-- INTRODUCTION --> <div class="node"> <a name="Introduction-to-QNs"></a> @@ -2341,13 +2369,13 @@ <p><a name="doc_002dqnmknode"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-80"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-81"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-82"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-83"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-84"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-85"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-86"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-84"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-85"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-86"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-87"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-88"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-89"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-90"></a></var><br> <blockquote> <p>Creates a node; this function can be used together with <code>qnsolve</code>. It is possible to create either single-class nodes @@ -2416,10 +2444,10 @@ <p><a name="doc_002dqnsolve"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-87"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-88"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-89"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-90"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-91"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-92"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-93"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-94"></a></var><br> <blockquote> <p>General evaluator of QN models. Networks can be open, closed or mixed; single as well as multiclass networks are supported. @@ -2597,11 +2625,11 @@ <p><a name="doc_002dqnjackson"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-91"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-92"></a></var><br> -— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-93"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-95"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-96"></a></var><br> +— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-97"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-94"></a><a name="index-Jackson-network-95"></a> + <p><a name="index-open-network_002c-single-class-98"></a><a name="index-Jackson-network-99"></a> With three or four input parameters, this function computes the steady-state occupancy probabilities for a Jackson network. With five input parameters, this function computes the steady-state probability @@ -2683,7 +2711,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 284–287. - <p><a name="index-Bolch_002c-G_002e-96"></a><a name="index-Greiner_002c-S_002e-97"></a><a name="index-de-Meer_002c-H_002e-98"></a><a name="index-Trivedi_002c-K_002e-99"></a> + <p><a name="index-Bolch_002c-G_002e-100"></a><a name="index-Greiner_002c-S_002e-101"></a><a name="index-de-Meer_002c-H_002e-102"></a><a name="index-Trivedi_002c-K_002e-103"></a> <h4 class="subsection">6.3.2 The Convolution Algorithm</h4> @@ -2717,10 +2745,10 @@ <p><a name="doc_002dqnconvolution"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-100"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-101"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-104"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-105"></a></var><br> <blockquote> - <p><a name="index-closed-network-102"></a><a name="index-normalization-constant-103"></a><a name="index-convolution-algorithm-104"></a> + <p><a name="index-closed-network-106"></a><a name="index-normalization-constant-107"></a><a name="index-convolution-algorithm-108"></a> This function implements the <em>convolution algorithm</em> for computing steady-state performance measures of product-form, single-class closed queueing networks. Load-independent service @@ -2811,20 +2839,20 @@ 16, number 9, september 1973, pp. 527–531. <a href="http://doi.acm.org/10.1145/362342.362345">http://doi.acm.org/10.1145/362342.362345</a> - <p><a name="index-Buzen_002c-J_002e-P_002e-105"></a> + <p><a name="index-Buzen_002c-J_002e-P_002e-109"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 313–317. - <p><a name="index-Bolch_002c-G_002e-106"></a><a name="index-Greiner_002c-S_002e-107"></a><a name="index-de-Meer_002c-H_002e-108"></a><a name="index-Trivedi_002c-K_002e-109"></a> + <p><a name="index-Bolch_002c-G_002e-110"></a><a name="index-Greiner_002c-S_002e-111"></a><a name="index-de-Meer_002c-H_002e-112"></a><a name="index-Trivedi_002c-K_002e-113"></a> <!-- Convolution for load-dependent service centers --> <a name="doc_002dqnconvolutionld"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-110"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-114"></a></var><br> <blockquote> - <p><a name="index-closed-network-111"></a><a name="index-normalization-constant-112"></a><a name="index-convolution-algorithm-113"></a><a name="index-load_002ddependent-service-center-114"></a> + <p><a name="index-closed-network-115"></a><a name="index-normalization-constant-116"></a><a name="index-convolution-algorithm-117"></a><a name="index-load_002ddependent-service-center-118"></a> This function implements the <em>convolution algorithm</em> for product-form, single-class closed queueing networks with general load-dependent service centers. @@ -2884,7 +2912,7 @@ Purdue University, feb, 1981 (revised). <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf</a> - <p><a name="index-Schwetman_002c-H_002e-115"></a> + <p><a name="index-Schwetman_002c-H_002e-119"></a> M. Reiser, H. Kobayashi, <cite>On The Convolution Algorithm for Separable Queueing Networks</cite>, In Proceedings of the 1976 ACM SIGMETRICS Conference on Computer Performance Modeling Measurement and @@ -2892,7 +2920,7 @@ 1976). SIGMETRICS '76. ACM, New York, NY, pp. 109–117. <a href="http://doi.acm.org/10.1145/800200.806187">http://doi.acm.org/10.1145/800200.806187</a> - <p><a name="index-Reiser_002c-M_002e-116"></a><a name="index-Kobayashi_002c-H_002e-117"></a> + <p><a name="index-Reiser_002c-M_002e-120"></a><a name="index-Kobayashi_002c-H_002e-121"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -2904,7 +2932,7 @@ function f_i defined in Schwetman, <code>Some Computational Aspects of Queueing Network Models</code>. - <p><a name="index-Bolch_002c-G_002e-118"></a><a name="index-Greiner_002c-S_002e-119"></a><a name="index-de-Meer_002c-H_002e-120"></a><a name="index-Trivedi_002c-K_002e-121"></a> + <p><a name="index-Bolch_002c-G_002e-122"></a><a name="index-Greiner_002c-S_002e-123"></a><a name="index-de-Meer_002c-H_002e-124"></a><a name="index-Trivedi_002c-K_002e-125"></a> <h4 class="subsection">6.3.3 Open networks</h4> @@ -2912,10 +2940,10 @@ <p><a name="doc_002dqnopensingle"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-122"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-123"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-126"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-127"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-124"></a><a name="index-BCMP-network-125"></a> + <p><a name="index-open-network_002c-single-class-128"></a><a name="index-BCMP-network-129"></a> Analyze open, single class BCMP queueing networks. <p>This function works for a subset of BCMP single-class open networks @@ -3008,16 +3036,16 @@ Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-126"></a><a name="index-Greiner_002c-S_002e-127"></a><a name="index-de-Meer_002c-H_002e-128"></a><a name="index-Trivedi_002c-K_002e-129"></a> + <p><a name="index-Bolch_002c-G_002e-130"></a><a name="index-Greiner_002c-S_002e-131"></a><a name="index-de-Meer_002c-H_002e-132"></a><a name="index-Trivedi_002c-K_002e-133"></a> <!-- Open network with multiple classes --> <p><a name="doc_002dqnopenmulti"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-130"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-131"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-134"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-135"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-multiple-classes-132"></a> + <p><a name="index-open-network_002c-multiple-classes-136"></a> Exact analysis of open, multiple-class BCMP networks. The network can be made of <em>single-server</em> queueing centers (FCFS, LCFS-PR or PS) or delay centers (IS). This function assumes a network with @@ -3082,7 +3110,7 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.1 ("Open Model Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-133"></a><a name="index-Zahorjan_002c-J_002e-134"></a><a name="index-Graham_002c-G_002e-S_002e-135"></a><a name="index-Sevcik_002c-K_002e-C_002e-136"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-137"></a><a name="index-Zahorjan_002c-J_002e-138"></a><a name="index-Graham_002c-G_002e-S_002e-139"></a><a name="index-Sevcik_002c-K_002e-C_002e-140"></a> <h4 class="subsection">6.3.4 Closed Networks</h4> @@ -3090,11 +3118,11 @@ <p><a name="doc_002dqnclosedsinglemva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-137"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-138"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-139"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-141"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-142"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-143"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-140"></a><a name="index-closed-network_002c-single-class-141"></a><a name="index-normalization-constant-142"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-144"></a><a name="index-closed-network_002c-single-class-145"></a><a name="index-normalization-constant-146"></a> Analyze closed, single class queueing networks using the exact Mean Value Analysis (MVA) algorithm. The following queueing disciplines are supported: FCFS, LCFS-PR, PS and IS (Infinite Server). This @@ -3195,7 +3223,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-143"></a><a name="index-Lavenberg_002c-S_002e-S_002e-144"></a> + <p><a name="index-Reiser_002c-M_002e-147"></a><a name="index-Lavenberg_002c-S_002e-S_002e-148"></a> This implementation is described in R. Jain , <cite>The Art of Computer Systems Performance Analysis</cite>, Wiley, 1991, p. 577. Multi-server nodes <!-- and the computation of @math{G(N)}, --> @@ -3204,15 +3232,15 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 8.2.1, "Single Class Queueing Networks". - <p><a name="index-Jain_002c-R_002e-145"></a><a name="index-Bolch_002c-G_002e-146"></a><a name="index-Greiner_002c-S_002e-147"></a><a name="index-de-Meer_002c-H_002e-148"></a><a name="index-Trivedi_002c-K_002e-149"></a> + <p><a name="index-Jain_002c-R_002e-149"></a><a name="index-Bolch_002c-G_002e-150"></a><a name="index-Greiner_002c-S_002e-151"></a><a name="index-de-Meer_002c-H_002e-152"></a><a name="index-Trivedi_002c-K_002e-153"></a> <!-- MVA for single class, closed networks with load dependent servers --> <a name="doc_002dqnclosedsinglemvald"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-150"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-151"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-154"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-155"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-152"></a><a name="index-closed-network_002c-single-class-153"></a><a name="index-load_002ddependent-service-center-154"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-156"></a><a name="index-closed-network_002c-single-class-157"></a><a name="index-load_002ddependent-service-center-158"></a> Exact MVA algorithm for closed, single class queueing networks with load-dependent service centers. This function supports FCFS, LCFS-PR, PS and IS nodes. For networks with only fixed-rate @@ -3270,15 +3298,15 @@ 1998, Section 8.2.4.1, “Networks with Load-Deèpendent Service: Closed Networks”. - <p><a name="index-Bolch_002c-G_002e-155"></a><a name="index-Greiner_002c-S_002e-156"></a><a name="index-de-Meer_002c-H_002e-157"></a><a name="index-Trivedi_002c-K_002e-158"></a> + <p><a name="index-Bolch_002c-G_002e-159"></a><a name="index-Greiner_002c-S_002e-160"></a><a name="index-de-Meer_002c-H_002e-161"></a><a name="index-Trivedi_002c-K_002e-162"></a> <!-- CMVA for single class, closed networks with a single load dependent servers --> <a name="doc_002dqncmva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-159"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-160"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-163"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-164"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-161"></a><a name="index-CMVA-162"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-165"></a><a name="index-CMVA-166"></a> Implementation of the Conditional MVA (CMVA) algorithm, a numerically stable variant of MVA for load-dependent servers. CMVA is described in G. Casale, <cite>A Note on Stable Flow-Equivalent Aggregation in @@ -3332,19 +3360,19 @@ closed networks</cite>. Queueing Syst. Theory Appl., 60:193–202, December 2008. - <p><a name="index-Casale_002c-G_002e-163"></a> + <p><a name="index-Casale_002c-G_002e-167"></a> <!-- Approximate MVA for single class, closed networks --> <p><a name="doc_002dqnclosedsinglemvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-164"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-165"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-166"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-167"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-168"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-168"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-169"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-170"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-171"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-172"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-169"></a><a name="index-Approximate-MVA-170"></a><a name="index-Closed-network_002c-single-class-171"></a><a name="index-Closed-network_002c-approximate-analysis-172"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-173"></a><a name="index-Approximate-MVA-174"></a><a name="index-Closed-network_002c-single-class-175"></a><a name="index-Closed-network_002c-approximate-analysis-176"></a> Analyze closed, single class queueing networks using the Approximate Mean Value Analysis (MVA) algorithm. This function is based on approximating the number of customers seen at center k when a @@ -3423,20 +3451,20 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 6.4.2.2 ("Approximate Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-173"></a><a name="index-Zahorjan_002c-J_002e-174"></a><a name="index-Graham_002c-G_002e-S_002e-175"></a><a name="index-Sevcik_002c-K_002e-C_002e-176"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-177"></a><a name="index-Zahorjan_002c-J_002e-178"></a><a name="index-Graham_002c-G_002e-S_002e-179"></a><a name="index-Sevcik_002c-K_002e-C_002e-180"></a> <!-- MVA for multiple class, closed networks --> <p><a name="doc_002dqnclosedmultimva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-177"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-178"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-179"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-180"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-181"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-182"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-181"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-182"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-183"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-184"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-185"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-186"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-183"></a><a name="index-closed-network_002c-multiple-classes-184"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-187"></a><a name="index-closed-network_002c-multiple-classes-188"></a> Analyze closed, multiclass queueing networks with K service centers and C independent customer classes (chains) using the Mean Value Analysys (MVA) algorithm. @@ -3566,7 +3594,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-185"></a><a name="index-Lavenberg_002c-S_002e-S_002e-186"></a> + <p><a name="index-Reiser_002c-M_002e-189"></a><a name="index-Lavenberg_002c-S_002e-S_002e-190"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -3576,18 +3604,18 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.2.1 ("Exact Solution Techniques"). - <p><a name="index-Bolch_002c-G_002e-187"></a><a name="index-Greiner_002c-S_002e-188"></a><a name="index-de-Meer_002c-H_002e-189"></a><a name="index-Trivedi_002c-K_002e-190"></a><a name="index-Lazowska_002c-E_002e-D_002e-191"></a><a name="index-Zahorjan_002c-J_002e-192"></a><a name="index-Graham_002c-G_002e-S_002e-193"></a><a name="index-Sevcik_002c-K_002e-C_002e-194"></a> + <p><a name="index-Bolch_002c-G_002e-191"></a><a name="index-Greiner_002c-S_002e-192"></a><a name="index-de-Meer_002c-H_002e-193"></a><a name="index-Trivedi_002c-K_002e-194"></a><a name="index-Lazowska_002c-E_002e-D_002e-195"></a><a name="index-Zahorjan_002c-J_002e-196"></a><a name="index-Graham_002c-G_002e-S_002e-197"></a><a name="index-Sevcik_002c-K_002e-C_002e-198"></a> <!-- Approximate MVA, with Bard-Schweitzer approximation --> <a name="doc_002dqnclosedmultimvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-195"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-196"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-197"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-198"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-199"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-199"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-200"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-201"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-202"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-203"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-200"></a><a name="index-Approximate-MVA-201"></a><a name="index-Closed-network_002c-multiple-classes-202"></a><a name="index-Closed-network_002c-approximate-analysis-203"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-204"></a><a name="index-Approximate-MVA-205"></a><a name="index-Closed-network_002c-multiple-classes-206"></a><a name="index-Closed-network_002c-approximate-analysis-207"></a> Analyze closed, multiclass queueing networks with K service centers and C customer classes using the approximate Mean Value Analysys (MVA) algorithm. @@ -3672,12 +3700,12 @@ proc. 4th Int. Symp. on Modelling and Performance Evaluation of Computer Systems, feb. 1979, pp. 51–62. - <p><a name="index-Bard_002c-Y_002e-204"></a> + <p><a name="index-Bard_002c-Y_002e-208"></a> P. Schweitzer, <cite>Approximate Analysis of Multiclass Closed Networks of Queues</cite>, Proc. Int. Conf. on Stochastic Control and Optimization, jun 1979, pp. 25–29. - <p><a name="index-Schweitzer_002c-P_002e-205"></a> + <p><a name="index-Schweitzer_002c-P_002e-209"></a> This implementation is based on Edward D. Lazowska, John Zahorjan, G. Scott Graham, and Kenneth C. Sevcik, <cite>Quantitative System Performance: Computer System Analysis Using Queueing Network Models</cite>, @@ -3688,7 +3716,7 @@ described above, as it computes the average response times R instead of the residence times. - <p><a name="index-Lazowska_002c-E_002e-D_002e-206"></a><a name="index-Zahorjan_002c-J_002e-207"></a><a name="index-Graham_002c-G_002e-S_002e-208"></a><a name="index-Sevcik_002c-K_002e-C_002e-209"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-210"></a><a name="index-Zahorjan_002c-J_002e-211"></a><a name="index-Graham_002c-G_002e-S_002e-212"></a><a name="index-Sevcik_002c-K_002e-C_002e-213"></a> <h4 class="subsection">6.3.5 Mixed Networks</h4> @@ -3696,9 +3724,9 @@ <p... [truncated message content] |
From: <mma...@us...> - 2012-03-11 11:20:42
|
Revision: 9813 http://octave.svn.sourceforge.net/octave/?rev=9813&view=rev Author: mmarzolla Date: 2012-03-11 11:20:31 +0000 (Sun, 11 Mar 2012) Log Message: ----------- New function dtmc_bd() added; misc fixes and improvements Modified Paths: -------------- trunk/octave-forge/main/queueing/ChangeLog trunk/octave-forge/main/queueing/DESCRIPTION trunk/octave-forge/main/queueing/Makefile trunk/octave-forge/main/queueing/NEWS trunk/octave-forge/main/queueing/doc/INSTALL trunk/octave-forge/main/queueing/doc/markovchains.txi trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf trunk/octave-forge/main/queueing/doc/summary.txi trunk/octave-forge/main/queueing/inst/ctmc_bd.m trunk/octave-forge/main/queueing/inst/ctmc_exps.m trunk/octave-forge/main/queueing/inst/qnmm1k.m trunk/octave-forge/main/queueing/inst/qnmmmk.m trunk/octave-forge/main/queueing/inst/qnvisits.m Added Paths: ----------- trunk/octave-forge/main/queueing/inst/dtmc_bd.m Removed Paths: ------------- trunk/octave-forge/main/queueing/inst/ctmc_bd_solve.m Modified: trunk/octave-forge/main/queueing/ChangeLog =================================================================== --- trunk/octave-forge/main/queueing/ChangeLog 2012-03-10 20:51:31 UTC (rev 9812) +++ trunk/octave-forge/main/queueing/ChangeLog 2012-03-11 11:20:31 UTC (rev 9813) @@ -1,6 +1,6 @@ 2012-02-XX Moreno Marzolla <mar...@cs...> - * Version 1.0.X released + * Version 1.X.0 released * Fixed bug in qnvisits() which made the function behave incorrectly under particular degenerate cases. * Fixed bug in ctmc_exps() (wrong initial value in call to lsode) @@ -9,6 +9,10 @@ * Function ctmc_exps() and ctmc_taexps() accept a scalar as second argument; the old syntax is still supported, but may be deprecated in future releases. + * Function ctmc_bd() now returns the infinitesimal generator matrix + of the birth-death process, not the steady-state solution. + * Function ctmc_bd_solve() has been removed + * New function dtmc_bd() * Miscellaneous fixes/improvements to the documentation 2012-02-04 Moreno Marzolla <mar...@cs...> Modified: trunk/octave-forge/main/queueing/DESCRIPTION =================================================================== --- trunk/octave-forge/main/queueing/DESCRIPTION 2012-03-10 20:51:31 UTC (rev 9812) +++ trunk/octave-forge/main/queueing/DESCRIPTION 2012-03-11 11:20:31 UTC (rev 9813) @@ -1,6 +1,6 @@ Name: queueing -Version: 1.0.0 -Date: 2012-02-04 +Version: 1.X.0 +Date: 2012-02-XX Author: Moreno Marzolla <mar...@cs...> Maintainer: Moreno Marzolla <mar...@cs...> Title: Queueing networks and Markov chains analysis package for GNU Octave Modified: trunk/octave-forge/main/queueing/Makefile =================================================================== --- trunk/octave-forge/main/queueing/Makefile 2012-03-10 20:51:31 UTC (rev 9812) +++ trunk/octave-forge/main/queueing/Makefile 2012-03-11 11:20:31 UTC (rev 9813) @@ -1,5 +1,5 @@ -VERSIONNUM=1.0.0 -VERSIONDATE="2012-02-04" +VERSIONNUM=1.X.0 +VERSIONDATE="2012-02-XX" PROGNAME=queueing DISTNAME=$(PROGNAME)-$(VERSIONNUM) Modified: trunk/octave-forge/main/queueing/NEWS =================================================================== --- trunk/octave-forge/main/queueing/NEWS 2012-03-10 20:51:31 UTC (rev 9812) +++ trunk/octave-forge/main/queueing/NEWS 2012-03-11 11:20:31 UTC (rev 9813) @@ -1,4 +1,4 @@ -Summary of important user-visible changes for queueing-1.0.X +Summary of important user-visible changes for queueing-1.X.0 ** Function ctmc_exps() can now compute the expected sojourn time until absorption for absorming CTMC @@ -7,6 +7,14 @@ the second argument (time). The old syntax is still supported, but may be deprecated in the future. +** Function ctmc_bd() now returns the infinitesimal generator matrix Q + of the birth-death process with given rates, not the steady-state + solution. + +** New function dtmc_bd() added + +** Function ctmc_bd_solve() has been removed + Summary of important user-visible changes for queueing-1.0.0 ------------------------------------------------------------------------------ Modified: trunk/octave-forge/main/queueing/doc/INSTALL =================================================================== --- trunk/octave-forge/main/queueing/doc/INSTALL 2012-03-10 20:51:31 UTC (rev 9812) +++ trunk/octave-forge/main/queueing/doc/INSTALL 2012-03-11 11:20:31 UTC (rev 9813) @@ -16,7 +16,7 @@ 1.1 Installation through Octave package management system ========================================================= -The most recent version of `queueing' is 1.0.0 and can be downloaded +The most recent version of `queueing' is 1.X.0 and can be downloaded from Octave-Forge `http://octave.sourceforge.net/queueing/' @@ -37,13 +37,13 @@ octave:1>pkg list queueing Package Name | Version | Installation directory --------------+---------+----------------------- - queueing *| 1.0.0 | /home/moreno/octave/queueing-1.0.0 + queueing *| 1.X.0 | /home/moreno/octave/queueing-1.X.0 Alternatively, you can first download `queueing' from Octave-Forge; then, to install the package in the system-wide location issue this command at the Octave prompt: - octave:1> pkg install _queueing-1.0.0.tar.gz_ + octave:1> pkg install _queueing-1.X.0.tar.gz_ (you may need to start Octave as root in order to allow the installation to copy the files to the target locations). After this, @@ -52,7 +52,7 @@ If you do not have root access, you can do a local install using: - octave:1> pkg install -local queueing-1.0.0.tar.gz + octave:1> pkg install -local queueing-1.X.0.tar.gz This will install `queueing' within your home directory, and the package will be available to your user only. *Note:* Octave version @@ -69,8 +69,8 @@ If you want to manually install `queueing' in a custom location, you can download the tarball and unpack it somewhere: - tar xvfz queueing-1.0.0.tar.gz - cd queueing-1.0.0/queueing/ + tar xvfz queueing-1.X.0.tar.gz + cd queueing-1.X.0/queueing/ Copy all `.m' files from the `inst/' directory to some target location. Then, start Octave with the `-p' option to add the target Modified: trunk/octave-forge/main/queueing/doc/markovchains.txi =================================================================== --- trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-10 20:51:31 UTC (rev 9812) +++ trunk/octave-forge/main/queueing/doc/markovchains.txi 2012-03-11 11:20:31 UTC (rev 9813) @@ -66,6 +66,9 @@ @math{n}. @math{\pi_i(n)} denotes the probability that the system is in state @math{i} at step @math{n}. +@c +@subsection State occupancy probabilities + Given the transition probability matrix @math{\bf P} and the initial state occupancy probability vector @math{{\bf \pi}(0) = (\pi_1(0), \pi_2(0), @dots{}, \pi_N(0))} at step 0, the state occupancy @@ -91,6 +94,7 @@ @math{{\bf \pi}(0)}. The stationary state occupancy probability vector @math{\bf \pi} satisfies @math{{\bf \pi} = {\bf \pi} {\bf P}}. +@c @DOCSTRING(dtmc) @noindent @strong{EXAMPLE} @@ -101,6 +105,13 @@ @end group @end example +@subsection Birth-Death process + +@c +@DOCSTRING(dtmc_bd) + +@subsection First passage times + The First Passage Time @math{M_{i j}} is defined as the average number of transitions needed to visit state @math{j} for the first time, starting from state @math{i}. Matrix @math{\bf M} satisfies the @@ -123,6 +134,7 @@ @end example @end ifnottex +@c @DOCSTRING(dtmc_fpt) @c @@ -132,16 +144,16 @@ @section Continuous-Time Markov Chains @menu -* CTMC Stationary Probability:: +* State occupancy probabilities:: * Birth-Death process:: * Expected Sojourn Time:: * Time-Averaged Expected Sojourn Time:: * Expected Time to Absorption:: -* CTMC First Passage Times:: +* First Passage Times:: @end menu -@node CTMC Stationary Probability -@subsection Stationary Probability +@node State occupancy probabilities +@subsection State occupancy probabilities @DOCSTRING(ctmc) @@ -305,7 +317,7 @@ @c @c @c -@node CTMC First Passage Times +@node First Passage Times @subsection First Passage Times @DOCSTRING(ctmc_fpt) Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-10 20:51:31 UTC (rev 9812) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-11 11:20:31 UTC (rev 9813) @@ -55,14 +55,19 @@ <li><a name="toc_Markov-Chains" href="#Markov-Chains">4 Markov Chains</a> <ul> <li><a href="#Discrete_002dTime-Markov-Chains">4.1 Discrete-Time Markov Chains</a> +<ul> +<li><a href="#Discrete_002dTime-Markov-Chains">4.1.1 State occupancy probabilities</a> +<li><a href="#Discrete_002dTime-Markov-Chains">4.1.2 Birth-Death process</a> +<li><a href="#Discrete_002dTime-Markov-Chains">4.1.3 First passage times</a> +</li></ul> <li><a href="#Continuous_002dTime-Markov-Chains">4.2 Continuous-Time Markov Chains</a> <ul> -<li><a href="#CTMC-Stationary-Probability">4.2.1 Stationary Probability</a> +<li><a href="#State-occupancy-probabilities">4.2.1 State occupancy probabilities</a> <li><a href="#Birth_002dDeath-process">4.2.2 Birth-Death process</a> <li><a href="#Expected-Sojourn-Time">4.2.3 Expected Sojourn Time</a> <li><a href="#Time_002dAveraged-Expected-Sojourn-Time">4.2.4 Time-Averaged Expected Sojourn Time</a> <li><a href="#Expected-Time-to-Absorption">4.2.5 Expected Time to Absorption</a> -<li><a href="#CTMC-First-Passage-Times">4.2.6 First Passage Times</a> +<li><a href="#First-Passage-Times">4.2.6 First Passage Times</a> </li></ul> </li></ul> <li><a name="toc_Single-Station-Queueing-Systems" href="#Single-Station-Queueing-Systems">5 Single Station Queueing Systems</a> @@ -121,7 +126,7 @@ <h2 class="unnumbered">queueing</h2> <p>This manual documents how to install and run the Queueing Toolbox. -It corresponds to version 1.0.0 of the package. +It corresponds to version 1.X.0 of the package. <!-- --> <ul class="menu"> @@ -189,8 +194,7 @@ <li>Approximate MVA for closed, single-class networks with blocking (MVABLO algorithm by F. Akyildiz); - <li>Computation of Asymptotic Bounds, Balanced System Bounds -and Geometric Bounds; + <li>Asymptotic Bounds, Balanced System Bounds and Geometric Bounds; </ul> @@ -209,15 +213,15 @@ <li>M/H_m/1 (Hyperexponential service time distribution) </ul> - <p>Functions for Markov chain analysis are also provided (discrete and -continuous time Markov chains are supported): + <p>Functions for Markov chain analysis are also provided, for discrete-time +chains (DTMC) or continuous-time chains (CTMC): <ul> -<li>Birth-death process; -<li>Computation of transient and steady-state occupancy probabilities; -<li>Computation of mean time to absorption; -<li>Computation of time-averages sojourn time. -<li>Computation of mean passage times +<li>Birth-death process (DTMC and CTMC); +<li>Transient and steady-state occupancy probabilities (DTMC and CTMC); +<li>Mean time to absorption (CTMC); +<li>Time-averaged sojourn times (CTMC); +<li>First passage times (DTMC and CTMC). </ul> @@ -308,7 +312,7 @@ <h3 class="section">2.1 Installation through Octave package management system</h3> -<p>The most recent version of <code>queueing</code> is 1.0.0 and can +<p>The most recent version of <code>queueing</code> is 1.X.0 and can be downloaded from Octave-Forge <p><a href="http://octave.sourceforge.net/queueing/">http://octave.sourceforge.net/queueing/</a> @@ -330,13 +334,13 @@ <pre class="example"> octave:1><kbd>pkg list queueing</kbd> Package Name | Version | Installation directory --------------+---------+----------------------- - queueing *| 1.0.0 | /home/moreno/octave/queueing-1.0.0 + queueing *| 1.X.0 | /home/moreno/octave/queueing-1.X.0 </pre> <p>Alternatively, you can first download <code>queueing</code> from Octave-Forge; then, to install the package in the system-wide location issue this command at the Octave prompt: -<pre class="example"> octave:1> <kbd>pkg install </kbd><em>queueing-1.0.0.tar.gz</em> +<pre class="example"> octave:1> <kbd>pkg install </kbd><em>queueing-1.X.0.tar.gz</em> </pre> <p class="noindent">(you may need to start Octave as root in order to allow the installation to copy the files to the target locations). After this, @@ -345,7 +349,7 @@ <p>If you do not have root access, you can do a local install using: -<pre class="example"> octave:1> <kbd>pkg install -local queueing-1.0.0.tar.gz</kbd> +<pre class="example"> octave:1> <kbd>pkg install -local queueing-1.X.0.tar.gz</kbd> </pre> <p>This will install <code>queueing</code> within your home directory, and the package will be available to your user only. <strong>Note:</strong> Octave @@ -371,8 +375,8 @@ <p>If you want to manually install <code>queueing</code> in a custom location, you can download the tarball and unpack it somewhere: -<pre class="example"> <kbd>tar xvfz queueing-1.0.0.tar.gz</kbd> - <kbd>cd queueing-1.0.0/queueing/</kbd> +<pre class="example"> <kbd>tar xvfz queueing-1.X.0.tar.gz</kbd> + <kbd>cd queueing-1.X.0/queueing/</kbd> </pre> <p>Copy all <code>.m</code> files from the <samp><span class="file">inst/</span></samp> directory to some target location. Then, start Octave with the <samp><span class="option">-p</span></samp> option to add @@ -813,7 +817,9 @@ n. \pi_i(n) denotes the probability that the system is in state i at step n. - <p>Given the transition probability matrix \bf P and the initial +<h4 class="subsection">4.1.1 State occupancy probabilities</h4> + +<p>Given the transition probability matrix \bf P and the initial state occupancy probability vector \bf \pi(0) = (\pi_1(0), \pi_2(0), <small class="dots">...</small>, \pi_N(0)) at step 0, the state occupancy probability vector \bf \pi(n) at step n can be @@ -889,7 +895,40 @@ T, ss(2)*ones(size(T)), "r;Steady State;" ); xlabel("Time Step");</pre> </pre> - <p>The First Passage Time M_i j is defined as the average + <h4 class="subsection">4.1.2 Birth-Death process</h4> + +<p><a name="doc_002ddtmc_005fbd"></a> + +<div class="defun"> +— Function File: <var>P</var> = <b>dtmc_bd</b> (<var>birth, death</var>)<var><a name="index-dtmc_005fbd-7"></a></var><br> +<blockquote> + <p><a name="index-Markov-chain_002c-discrete-time-8"></a><a name="index-Birth_002ddeath-process-9"></a> +Returns the N \times N transition probability matrix P +for a birth-death process with given rates. + + <p><strong>INPUTS</strong> + + <dl> +<dt><var>birth</var><dd>Vector with N-1 elements, where <var>birth</var><code>(i)</code> is the +transition probability from state i to state i+1. + + <br><dt><var>death</var><dd>Vector with N-1 elements, where <var>death</var><code>(i)</code> is the +transition probability from state i+1 to state i. + + </dl> + + <p><strong>OUTPUTS</strong> + + <dl> +<dt><var>P</var><dd>Transition probability matrix for the birth-death process. + + </dl> + + </blockquote></div> + +<h4 class="subsection">4.1.3 First passage times</h4> + +<p>The First Passage Time M_i j is defined as the average number of transitions needed to visit state j for the first time, starting from state i. Matrix \bf M satisfies the property that @@ -903,10 +942,10 @@ <p><a name="doc_002ddtmc_005ffpt"></a> <div class="defun"> -— Function File: <var>M</var> = <b>dtmc_fpt</b> (<var>P</var>)<var><a name="index-dtmc_005ffpt-7"></a></var><br> -— Function File: <var>m</var> = <b>dtmc_fpt</b> (<var>P, i, j</var>)<var><a name="index-dtmc_005ffpt-8"></a></var><br> +— Function File: <var>M</var> = <b>dtmc_fpt</b> (<var>P</var>)<var><a name="index-dtmc_005ffpt-10"></a></var><br> +— Function File: <var>m</var> = <b>dtmc_fpt</b> (<var>P, i, j</var>)<var><a name="index-dtmc_005ffpt-11"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-discrete-time-9"></a><a name="index-First-passage-times-10"></a> + <p><a name="index-Markov-chain_002c-discrete-time-12"></a><a name="index-First-passage-times-13"></a> If called with a single argument, computes the mean first passage times <var>M</var><code>(i,j)</code>, that are the average number of transitions before state <var>j</var> is reached, starting from state <var>i</var>, for all @@ -956,31 +995,31 @@ <h3 class="section">4.2 Continuous-Time Markov Chains</h3> <ul class="menu"> -<li><a accesskey="1" href="#CTMC-Stationary-Probability">CTMC Stationary Probability</a> +<li><a accesskey="1" href="#State-occupancy-probabilities">State occupancy probabilities</a> <li><a accesskey="2" href="#Birth_002dDeath-process">Birth-Death process</a> <li><a accesskey="3" href="#Expected-Sojourn-Time">Expected Sojourn Time</a> <li><a accesskey="4" href="#Time_002dAveraged-Expected-Sojourn-Time">Time-Averaged Expected Sojourn Time</a> <li><a accesskey="5" href="#Expected-Time-to-Absorption">Expected Time to Absorption</a> -<li><a accesskey="6" href="#CTMC-First-Passage-Times">CTMC First Passage Times</a> +<li><a accesskey="6" href="#First-Passage-Times">First Passage Times</a> </ul> <div class="node"> -<a name="CTMC-Stationary-Probability"></a> +<a name="State-occupancy-probabilities"></a> <p><hr> Next: <a rel="next" accesskey="n" href="#Birth_002dDeath-process">Birth-Death process</a>, Up: <a rel="up" accesskey="u" href="#Continuous_002dTime-Markov-Chains">Continuous-Time Markov Chains</a> </div> -<h4 class="subsection">4.2.1 Stationary Probability</h4> +<h4 class="subsection">4.2.1 State occupancy probabilities</h4> <p><a name="doc_002dctmc"></a> <div class="defun"> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-11"></a></var><br> -— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. q0</var>)<var><a name="index-ctmc-12"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q</var>)<var><a name="index-ctmc-14"></a></var><br> +— Function File: <var>p</var> = <b>ctmc</b> (<var>Q, t. q0</var>)<var><a name="index-ctmc-15"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-13"></a><a name="index-Continuous-time-Markov-chain-14"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-15"></a><a name="index-Stationary-probabilities-16"></a> + <p><a name="index-Markov-chain_002c-continuous-time-16"></a><a name="index-Continuous-time-Markov-chain-17"></a><a name="index-Markov-chain_002c-state-occupancy-probabilities-18"></a><a name="index-Stationary-probabilities-19"></a> With a single argument, compute the stationary state occupancy probability vector <var>p</var>(1), <small class="dots">...</small>, <var>p</var>(N) for a Continuous-Time Markov Chain with infinitesimal generator matrix @@ -1033,7 +1072,7 @@ <a name="Birth_002dDeath-process"></a> <p><hr> Next: <a rel="next" accesskey="n" href="#Expected-Sojourn-Time">Expected Sojourn Time</a>, -Previous: <a rel="previous" accesskey="p" href="#CTMC-Stationary-Probability">CTMC Stationary Probability</a>, +Previous: <a rel="previous" accesskey="p" href="#State-occupancy-probabilities">State occupancy probabilities</a>, Up: <a rel="up" accesskey="u" href="#Continuous_002dTime-Markov-Chains">Continuous-Time Markov Chains</a> </div> @@ -1043,11 +1082,11 @@ <p><a name="doc_002dctmc_005fbd"></a> <div class="defun"> -— Function File: <var>p</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-17"></a></var><br> +— Function File: <var>Q</var> = <b>ctmc_bd</b> (<var>birth, death</var>)<var><a name="index-ctmc_005fbd-20"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-18"></a><a name="index-Birth_002ddeath-process-19"></a> -Compute the steady-state solution of a birth-death process with state -space (1, <small class="dots">...</small>, N). + <p><a name="index-Markov-chain_002c-continuous-time-21"></a><a name="index-Birth_002ddeath-process-22"></a> +Returns the N \times N infinitesimal generator matrix Q +for a birth-death process with given rates. <p><strong>INPUTS</strong> @@ -1063,8 +1102,7 @@ <p><strong>OUTPUTS</strong> <dl> -<dt><var>p</var><dd><var>p</var><code>(i)</code> is the steady-state probability that the system is -in state i, i=1, <small class="dots">...</small>, N. +<dt><var>Q</var><dd>Infinitesimal generator matrix for the birth-death process. </dl> @@ -1100,10 +1138,10 @@ <p><a name="doc_002dctmc_005fexps"></a> <div class="defun"> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-20"></a></var><br> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-21"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-23"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-24"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-22"></a><a name="index-Expected-sojourn-time-23"></a> + <p><a name="index-Markov-chain_002c-continuous-time-25"></a><a name="index-Expected-sojourn-time-26"></a> With three arguments, compute the expected times <var>L</var><code>(i)</code> spent in each state i during the time interval [0,t], assuming that the state occupancy probabilities @@ -1130,9 +1168,9 @@ <dl> <dt><var>L</var><dd>If this function is called with three arguments, <var>L</var><code>(i)</code> is -the expected time spent in state j during the interval +the expected time spent in state i during the interval [0,t]. If this function is called with two arguments -<var>L</var><code>(i)</code> is the expected time spent in state i until +<var>L</var><code>(i)</code> is either the expected time spent in state i until absorption (if i is a transient state), or zero (if <var>i</var> is an absorbing state). @@ -1183,9 +1221,9 @@ <p><a name="doc_002dctmc_005ftaexps"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-24"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-27"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-25"></a><a name="index-Time_002dalveraged-sojourn-time-26"></a> + <p><a name="index-Markov-chain_002c-continuous-time-28"></a><a name="index-Time_002dalveraged-sojourn-time-29"></a> Compute the <em>time-averaged sojourn time</em> <var>M</var><code>(i)</code>, defined as the fraction of the time interval [0,t] spent in state i, assuming that the state occupancy probabilities at @@ -1242,7 +1280,7 @@ <div class="node"> <a name="Expected-Time-to-Absorption"></a> <p><hr> -Next: <a rel="next" accesskey="n" href="#CTMC-First-Passage-Times">CTMC First Passage Times</a>, +Next: <a rel="next" accesskey="n" href="#First-Passage-Times">First Passage Times</a>, Previous: <a rel="previous" accesskey="p" href="#Time_002dAveraged-Expected-Sojourn-Time">Time-Averaged Expected Sojourn Time</a>, Up: <a rel="up" accesskey="u" href="#Continuous_002dTime-Markov-Chains">Continuous-Time Markov Chains</a> @@ -1268,9 +1306,9 @@ <p><a name="doc_002dctmc_005fmtta"></a> <div class="defun"> -— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-27"></a></var><br> +— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-30"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-28"></a><a name="index-Mean-time-to-absorption-29"></a> + <p><a name="index-Markov-chain_002c-continuous-time-31"></a><a name="index-Mean-time-to-absorption-32"></a> Compute the Mean-Time to Absorption (MTTA) of the CTMC described by the infinitesimal generator matrix <var>Q</var>, starting from initial occupancy probabilities <var>p</var>. If there are no absorbing states, this @@ -1331,9 +1369,9 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-30"></a><a name="index-Greiner_002c-S_002e-31"></a><a name="index-de-Meer_002c-H_002e-32"></a><a name="index-Trivedi_002c-K_002e-33"></a> + <p><a name="index-Bolch_002c-G_002e-33"></a><a name="index-Greiner_002c-S_002e-34"></a><a name="index-de-Meer_002c-H_002e-35"></a><a name="index-Trivedi_002c-K_002e-36"></a> <div class="node"> -<a name="CTMC-First-Passage-Times"></a> +<a name="First-Passage-Times"></a> <p><hr> Previous: <a rel="previous" accesskey="p" href="#Expected-Time-to-Absorption">Expected Time to Absorption</a>, Up: <a rel="up" accesskey="u" href="#Continuous_002dTime-Markov-Chains">Continuous-Time Markov Chains</a> @@ -1345,10 +1383,10 @@ <p><a name="doc_002dctmc_005ffpt"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-34"></a></var><br> -— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-35"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-37"></a></var><br> +— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-38"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-36"></a><a name="index-First-passage-times-37"></a> + <p><a name="index-Markov-chain_002c-continuous-time-39"></a><a name="index-First-passage-times-40"></a> If called with a single argument, computes the mean first passage times <var>M</var><code>(i,j)</code>, the average times before state <var>j</var> is reached, starting from state <var>i</var>, for all 1 \leq i, j \leq @@ -1454,9 +1492,9 @@ <p><a name="doc_002dqnmm1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-38"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-41"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-39"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-42"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1 queue. @@ -1501,7 +1539,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.3. - <p><a name="index-Bolch_002c-G_002e-40"></a><a name="index-Greiner_002c-S_002e-41"></a><a name="index-de-Meer_002c-H_002e-42"></a><a name="index-Trivedi_002c-K_002e-43"></a> + <p><a name="index-Bolch_002c-G_002e-43"></a><a name="index-Greiner_002c-S_002e-44"></a><a name="index-de-Meer_002c-H_002e-45"></a><a name="index-Trivedi_002c-K_002e-46"></a> <!-- M/M/m --> <div class="node"> <a name="The-M%2fM%2fm-System"></a> @@ -1527,10 +1565,10 @@ <p><a name="doc_002dqnmmm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-44"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-45"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-47"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-48"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-46"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-49"></a> Compute utilization, response time, average number of requests in service and throughput for a M/M/m queue, a queueing system with m identical service centers connected to a single queue. @@ -1582,7 +1620,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.5. - <p><a name="index-Bolch_002c-G_002e-47"></a><a name="index-Greiner_002c-S_002e-48"></a><a name="index-de-Meer_002c-H_002e-49"></a><a name="index-Trivedi_002c-K_002e-50"></a> + <p><a name="index-Bolch_002c-G_002e-50"></a><a name="index-Greiner_002c-S_002e-51"></a><a name="index-de-Meer_002c-H_002e-52"></a><a name="index-Trivedi_002c-K_002e-53"></a> <!-- M/M/inf --> <div class="node"> <a name="The-M%2fM%2finf-System"></a> @@ -1605,7 +1643,7 @@ <p><a name="doc_002dqnmminf"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-51"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-54"></a></var><br> <blockquote> <p>Compute utilization, response time, average number of requests and throughput for a M/M/\infty queue. This is a system with an @@ -1613,7 +1651,7 @@ system is always stable, regardless the values of the arrival and service rates. - <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-52"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-55"></a> <p><strong>INPUTS</strong> @@ -1631,7 +1669,7 @@ different from the utilization, which in the case of M/M/\infty centers is always zero. - <p><a name="index-traffic-intensity-53"></a> + <p><a name="index-traffic-intensity-56"></a> <br><dt><var>R</var><dd>Service center response time. <br><dt><var>Q</var><dd>Average number of requests in the system (which is equal to the @@ -1659,7 +1697,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.4. - <p><a name="index-Bolch_002c-G_002e-54"></a><a name="index-Greiner_002c-S_002e-55"></a><a name="index-de-Meer_002c-H_002e-56"></a><a name="index-Trivedi_002c-K_002e-57"></a> + <p><a name="index-Bolch_002c-G_002e-57"></a><a name="index-Greiner_002c-S_002e-58"></a><a name="index-de-Meer_002c-H_002e-59"></a><a name="index-Trivedi_002c-K_002e-60"></a> <!-- M/M/1/k --> <div class="node"> <a name="The-M%2fM%2f1%2fK-System"></a> @@ -1683,9 +1721,9 @@ <p><a name="doc_002dqnmm1k"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-58"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-61"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-59"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-62"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1/K finite capacity system. In a M/M/1/K queue there is a single server; the maximum number of @@ -1752,9 +1790,9 @@ <p><a name="doc_002dqnmmmk"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-60"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-63"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-61"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-64"></a> Compute utilization, response time, average number of requests and throughput for a M/M/m/K finite capacity system. In a M/M/m/K system there are m \geq 1 identical service @@ -1812,7 +1850,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.6. - <p><a name="index-Bolch_002c-G_002e-62"></a><a name="index-Greiner_002c-S_002e-63"></a><a name="index-de-Meer_002c-H_002e-64"></a><a name="index-Trivedi_002c-K_002e-65"></a> + <p><a name="index-Bolch_002c-G_002e-65"></a><a name="index-Greiner_002c-S_002e-66"></a><a name="index-de-Meer_002c-H_002e-67"></a><a name="index-Trivedi_002c-K_002e-68"></a> <!-- Approximate M/M/m --> <div class="node"> @@ -1834,9 +1872,9 @@ <p><a name="doc_002dqnammm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-66"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-69"></a></var><br> <blockquote> - <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-67"></a> + <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-70"></a> Compute <em>approximate</em> utilization, response time, average number of requests in service and throughput for an asymmetric M/M/m queue. In this system there are m different service centers @@ -1883,7 +1921,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998 - <p><a name="index-Bolch_002c-G_002e-68"></a><a name="index-Greiner_002c-S_002e-69"></a><a name="index-de-Meer_002c-H_002e-70"></a><a name="index-Trivedi_002c-K_002e-71"></a> + <p><a name="index-Bolch_002c-G_002e-71"></a><a name="index-Greiner_002c-S_002e-72"></a><a name="index-de-Meer_002c-H_002e-73"></a><a name="index-Trivedi_002c-K_002e-74"></a> <div class="node"> <a name="The-M%2fG%2f1-System"></a> <a name="The-M_002fG_002f1-System"></a> @@ -1899,9 +1937,9 @@ <p><a name="doc_002dqnmg1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-72"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-75"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-73"></a> + <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-76"></a> Compute utilization, response time, average number of requests and throughput for a M/G/1 system. The service time distribution is described by its mean <var>xavg</var>, and by its second moment @@ -1958,9 +1996,9 @@ <p><a name="doc_002dqnmh1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-74"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-77"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-75"></a> + <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-78"></a> Compute utilization, response time, average number of requests and throughput for a M/H_m/1 system. In this system, the customer service times have hyper-exponential distribution: @@ -2042,7 +2080,7 @@ <li><a accesskey="6" href="#Utility-functions">Utility functions</a>: Utility functions to compute miscellaneous quantities </ul> -<p><a name="index-queueing-networks-76"></a> +<p><a name="index-queueing-networks-79"></a> <!-- INTRODUCTION --> <div class="node"> <a name="Introduction-to-QNs"></a> @@ -2303,13 +2341,13 @@ <p><a name="doc_002dqnmknode"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-77"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-78"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-79"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-80"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-81"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-82"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-83"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-80"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-81"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-82"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-83"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-84"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-85"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-86"></a></var><br> <blockquote> <p>Creates a node; this function can be used together with <code>qnsolve</code>. It is possible to create either single-class nodes @@ -2378,10 +2416,10 @@ <p><a name="doc_002dqnsolve"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-84"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-85"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-86"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-87"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-87"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-88"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-89"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-90"></a></var><br> <blockquote> <p>General evaluator of QN models. Networks can be open, closed or mixed; single as well as multiclass networks are supported. @@ -2559,11 +2597,11 @@ <p><a name="doc_002dqnjackson"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-88"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-89"></a></var><br> -— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-90"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-91"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-92"></a></var><br> +— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-93"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-91"></a><a name="index-Jackson-network-92"></a> + <p><a name="index-open-network_002c-single-class-94"></a><a name="index-Jackson-network-95"></a> With three or four input parameters, this function computes the steady-state occupancy probabilities for a Jackson network. With five input parameters, this function computes the steady-state probability @@ -2645,7 +2683,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 284–287. - <p><a name="index-Bolch_002c-G_002e-93"></a><a name="index-Greiner_002c-S_002e-94"></a><a name="index-de-Meer_002c-H_002e-95"></a><a name="index-Trivedi_002c-K_002e-96"></a> + <p><a name="index-Bolch_002c-G_002e-96"></a><a name="index-Greiner_002c-S_002e-97"></a><a name="index-de-Meer_002c-H_002e-98"></a><a name="index-Trivedi_002c-K_002e-99"></a> <h4 class="subsection">6.3.2 The Convolution Algorithm</h4> @@ -2679,10 +2717,10 @@ <p><a name="doc_002dqnconvolution"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-97"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-98"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-100"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-101"></a></var><br> <blockquote> - <p><a name="index-closed-network-99"></a><a name="index-normalization-constant-100"></a><a name="index-convolution-algorithm-101"></a> + <p><a name="index-closed-network-102"></a><a name="index-normalization-constant-103"></a><a name="index-convolution-algorithm-104"></a> This function implements the <em>convolution algorithm</em> for computing steady-state performance measures of product-form, single-class closed queueing networks. Load-independent service @@ -2773,20 +2811,20 @@ 16, number 9, september 1973, pp. 527–531. <a href="http://doi.acm.org/10.1145/362342.362345">http://doi.acm.org/10.1145/362342.362345</a> - <p><a name="index-Buzen_002c-J_002e-P_002e-102"></a> + <p><a name="index-Buzen_002c-J_002e-P_002e-105"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 313–317. - <p><a name="index-Bolch_002c-G_002e-103"></a><a name="index-Greiner_002c-S_002e-104"></a><a name="index-de-Meer_002c-H_002e-105"></a><a name="index-Trivedi_002c-K_002e-106"></a> + <p><a name="index-Bolch_002c-G_002e-106"></a><a name="index-Greiner_002c-S_002e-107"></a><a name="index-de-Meer_002c-H_002e-108"></a><a name="index-Trivedi_002c-K_002e-109"></a> <!-- Convolution for load-dependent service centers --> <a name="doc_002dqnconvolutionld"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-107"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-110"></a></var><br> <blockquote> - <p><a name="index-closed-network-108"></a><a name="index-normalization-constant-109"></a><a name="index-convolution-algorithm-110"></a><a name="index-load_002ddependent-service-center-111"></a> + <p><a name="index-closed-network-111"></a><a name="index-normalization-constant-112"></a><a name="index-convolution-algorithm-113"></a><a name="index-load_002ddependent-service-center-114"></a> This function implements the <em>convolution algorithm</em> for product-form, single-class closed queueing networks with general load-dependent service centers. @@ -2846,7 +2884,7 @@ Purdue University, feb, 1981 (revised). <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf</a> - <p><a name="index-Schwetman_002c-H_002e-112"></a> + <p><a name="index-Schwetman_002c-H_002e-115"></a> M. Reiser, H. Kobayashi, <cite>On The Convolution Algorithm for Separable Queueing Networks</cite>, In Proceedings of the 1976 ACM SIGMETRICS Conference on Computer Performance Modeling Measurement and @@ -2854,7 +2892,7 @@ 1976). SIGMETRICS '76. ACM, New York, NY, pp. 109–117. <a href="http://doi.acm.org/10.1145/800200.806187">http://doi.acm.org/10.1145/800200.806187</a> - <p><a name="index-Reiser_002c-M_002e-113"></a><a name="index-Kobayashi_002c-H_002e-114"></a> + <p><a name="index-Reiser_002c-M_002e-116"></a><a name="index-Kobayashi_002c-H_002e-117"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -2866,7 +2904,7 @@ function f_i defined in Schwetman, <code>Some Computational Aspects of Queueing Network Models</code>. - <p><a name="index-Bolch_002c-G_002e-115"></a><a name="index-Greiner_002c-S_002e-116"></a><a name="index-de-Meer_002c-H_002e-117"></a><a name="index-Trivedi_002c-K_002e-118"></a> + <p><a name="index-Bolch_002c-G_002e-118"></a><a name="index-Greiner_002c-S_002e-119"></a><a name="index-de-Meer_002c-H_002e-120"></a><a name="index-Trivedi_002c-K_002e-121"></a> <h4 class="subsection">6.3.3 Open networks</h4> @@ -2874,10 +2912,10 @@ <p><a name="doc_002dqnopensingle"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-119"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-120"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-122"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-123"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-121"></a><a name="index-BCMP-network-122"></a> + <p><a name="index-open-network_002c-single-class-124"></a><a name="index-BCMP-network-125"></a> Analyze open, single class BCMP queueing networks. <p>This function works for a subset of BCMP single-class open networks @@ -2970,16 +3008,16 @@ Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-123"></a><a name="index-Greiner_002c-S_002e-124"></a><a name="index-de-Meer_002c-H_002e-125"></a><a name="index-Trivedi_002c-K_002e-126"></a> + <p><a name="index-Bolch_002c-G_002e-126"></a><a name="index-Greiner_002c-S_002e-127"></a><a name="index-de-Meer_002c-H_002e-128"></a><a name="index-Trivedi_002c-K_002e-129"></a> <!-- Open network with multiple classes --> <p><a name="doc_002dqnopenmulti"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-127"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-128"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-130"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-131"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-multiple-classes-129"></a> + <p><a name="index-open-network_002c-multiple-classes-132"></a> Exact analysis of open, multiple-class BCMP networks. The network can be made of <em>single-server</em> queueing centers (FCFS, LCFS-PR or PS) or delay centers (IS). This function assumes a network with @@ -3044,7 +3082,7 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.1 ("Open Model Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-130"></a><a name="index-Zahorjan_002c-J_002e-131"></a><a name="index-Graham_002c-G_002e-S_002e-132"></a><a name="index-Sevcik_002c-K_002e-C_002e-133"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-133"></a><a name="index-Zahorjan_002c-J_002e-134"></a><a name="index-Graham_002c-G_002e-S_002e-135"></a><a name="index-Sevcik_002c-K_002e-C_002e-136"></a> <h4 class="subsection">6.3.4 Closed Networks</h4> @@ -3052,11 +3090,11 @@ <p><a name="doc_002dqnclosedsinglemva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-134"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-135"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-136"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-137"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-138"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-139"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-137"></a><a name="index-closed-network_002c-single-class-138"></a><a name="index-normalization-constant-139"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-140"></a><a name="index-closed-network_002c-single-class-141"></a><a name="index-normalization-constant-142"></a> Analyze closed, single class queueing networks using the exact Mean Value Analysis (MVA) algorithm. The following queueing disciplines are supported: FCFS, LCFS-PR, PS and IS (Infinite Server). This @@ -3157,7 +3195,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-140"></a><a name="index-Lavenberg_002c-S_002e-S_002e-141"></a> + <p><a name="index-Reiser_002c-M_002e-143"></a><a name="index-Lavenberg_002c-S_002e-S_002e-144"></a> This implementation is described in R. Jain , <cite>The Art of Computer Systems Performance Analysis</cite>, Wiley, 1991, p. 577. Multi-server nodes <!-- and the computation of @math{G(N)}, --> @@ -3166,15 +3204,15 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 8.2.1, "Single Class Queueing Networks". - <p><a name="index-Jain_002c-R_002e-142"></a><a name="index-Bolch_002c-G_002e-143"></a><a name="index-Greiner_002c-S_002e-144"></a><a name="index-de-Meer_002c-H_002e-145"></a><a name="index-Trivedi_002c-K_002e-146"></a> + <p><a name="index-Jain_002c-R_002e-145"></a><a name="index-Bolch_002c-G_002e-146"></a><a name="index-Greiner_002c-S_002e-147"></a><a name="index-de-Meer_002c-H_002e-148"></a><a name="index-Trivedi_002c-K_002e-149"></a> <!-- MVA for single class, closed networks with load dependent servers --> <a name="doc_002dqnclosedsinglemvald"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-147"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-148"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-150"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-151"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-149"></a><a name="index-closed-network_002c-single-class-150"></a><a name="index-load_002ddependent-service-center-151"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-152"></a><a name="index-closed-network_002c-single-class-153"></a><a name="index-load_002ddependent-service-center-154"></a> Exact MVA algorithm for closed, single class queueing networks with load-dependent service centers. This function supports FCFS, LCFS-PR, PS and IS nodes. For networks with only fixed-rate @@ -3232,15 +3270,15 @@ 1998, Section 8.2.4.1, “Networks with Load-Deèpendent Service: Closed Networks”. - <p><a name="index-Bolch_002c-G_002e-152"></a><a name="index-Greiner_002c-S_002e-153"></a><a name="index-de-Meer_002c-H_002e-154"></a><a name="index-Trivedi_002c-K_002e-155"></a> + <p><a name="index-Bolch_002c-G_002e-155"></a><a name="index-Greiner_002c-S_002e-156"></a><a name="index-de-Meer_002c-H_002e-157"></a><a name="index-Trivedi_002c-K_002e-158"></a> <!-- CMVA for single class, closed networks with a single load dependent servers --> <a name="doc_002dqncmva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-156"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-157"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-159"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-160"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-158"></a><a name="index-CMVA-159"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-161"></a><a name="index-CMVA-162"></a> Implementation of the Conditional MVA (CMVA) algorithm, a numerically stable variant of MVA for load-dependent servers. CMVA is described in G. Casale, <cite>A Note on Stable Flow-Equivalent Aggregation in @@ -3294,19 +3332,19 @@ closed networks</cite>. Queueing Syst. Theory Appl., 60:193–202, December 2008. - <p><a name="index-Casale_002c-G_002e-160"></a> + <p><a name="index-Casale_002c-G_002e-163"></a> <!-- Approximate MVA for single class, closed networks --> <p><a name="doc_002dqnclosedsinglemvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-161"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-162"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-163"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-164"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-165"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-164"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-165"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-166"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-167"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-168"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-166"></a><a name="index-Approximate-MVA-167"></a><a name="index-Closed-network_002c-single-class-168"></a><a name="index-Closed-network_002c-approximate-analysis-169"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-169"></a><a name="index-Approximate-MVA-170"></a><a name="index-Closed-n... [truncated message content] |
From: <mma...@us...> - 2012-03-10 20:51:37
|
Revision: 9812 http://octave.svn.sourceforge.net/octave/?rev=9812&view=rev Author: mmarzolla Date: 2012-03-10 20:51:31 +0000 (Sat, 10 Mar 2012) Log Message: ----------- updated documentation Modified Paths: -------------- trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-10 20:27:25 UTC (rev 9811) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-10 20:51:31 UTC (rev 9812) @@ -1154,13 +1154,16 @@ death = zeros(1,N-1); Q = diag(birth,1)+diag(death,-1); Q -= diag(sum(Q,2)); - tt = linspace(0,10,100); + t = linspace(0,10,100); p0 = zeros(1,N); p0(1)=1; - L = ctmc_exps(Q,tt,p0); - plot( tt, L(:,1), ";State 1;", "linewidth", 2, \ - tt, L(:,2), ";State 2;", "linewidth", 2, \ - tt, L(:,3), ";State 3;", "linewidth", 2, \ - tt, L(:,4), ";State 4 (absorbing);", "linewidth", 2); + L = zeros(length(t),N); + for i=1:length(t) + L(i,:) = ctmc_exps(Q,t(i),p0); + endfor + plot( t, L(:,1), ";State 1;", "linewidth", 2, \ + t, L(:,2), ";State 2;", "linewidth", 2, \ + t, L(:,3), ";State 3;", "linewidth", 2, \ + t, L(:,4), ";State 4;", "linewidth", 2 ); legend("location","northwest"); xlabel("Time"); ylabel("Expected sojourn time");</pre> @@ -1222,9 +1225,12 @@ death = zeros(1,N-1); Q = diag(birth,1)+diag(death,-1); Q -= diag(sum(Q,2)); - t = linspace(1e-3,50,500); + t = linspace(1e-5,30,100); p = zeros(1,N); p(1)=1; - M = ctmc_taexps(Q,t,p); + M = zeros(length(t),N); + for i=1:length(t) + M(i,:) = ctmc_taexps(Q,t(i),p); + endfor plot(t, M(:,1), ";State 1;", "linewidth", 2, \ t, M(:,2), ";State 2;", "linewidth", 2, \ t, M(:,3), ";State 3;", "linewidth", 2, \ @@ -1316,7 +1322,7 @@ death = [ 3 4 5 ] * mu; Q = diag(death,-1); Q -= diag(sum(Q,2)); - t = ctmc_mtta(Q,[0 0 0 1])</pre> ⇒ t = 78.333 + [t L] = ctmc_mtta(Q,[0 0 0 1])</pre> ⇒ t = 78.333 </pre> <p class="noindent"><strong>REFERENCES</strong> Modified: trunk/octave-forge/main/queueing/doc/queueing.pdf =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mma...@us...> - 2012-03-10 20:27:32
|
Revision: 9811 http://octave.svn.sourceforge.net/octave/?rev=9811&view=rev Author: mmarzolla Date: 2012-03-10 20:27:25 +0000 (Sat, 10 Mar 2012) Log Message: ----------- New signature for ctmc_exps() and ctmc_taexps() Modified Paths: -------------- trunk/octave-forge/main/queueing/ChangeLog trunk/octave-forge/main/queueing/NEWS trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf trunk/octave-forge/main/queueing/inst/ctmc_exps.m trunk/octave-forge/main/queueing/inst/ctmc_mtta.m trunk/octave-forge/main/queueing/inst/ctmc_taexps.m Modified: trunk/octave-forge/main/queueing/ChangeLog =================================================================== --- trunk/octave-forge/main/queueing/ChangeLog 2012-03-10 19:46:27 UTC (rev 9810) +++ trunk/octave-forge/main/queueing/ChangeLog 2012-03-10 20:27:25 UTC (rev 9811) @@ -6,6 +6,9 @@ * Fixed bug in ctmc_exps() (wrong initial value in call to lsode) * Function ctmc_exps() can now also compute the expected sojourn time until absorption for absorbing CTMCs. + * Function ctmc_exps() and ctmc_taexps() accept a scalar as second + argument; the old syntax is still supported, but may be deprecated + in future releases. * Miscellaneous fixes/improvements to the documentation 2012-02-04 Moreno Marzolla <mar...@cs...> Modified: trunk/octave-forge/main/queueing/NEWS =================================================================== --- trunk/octave-forge/main/queueing/NEWS 2012-03-10 19:46:27 UTC (rev 9810) +++ trunk/octave-forge/main/queueing/NEWS 2012-03-10 20:27:25 UTC (rev 9811) @@ -3,6 +3,10 @@ ** Function ctmc_exps() can now compute the expected sojourn time until absorption for absorming CTMC +** Functions ctmc_exps() and ctmc_taexps() now accept a scalar as + the second argument (time). The old syntax is still supported, + but may be deprecated in the future. + Summary of important user-visible changes for queueing-1.0.0 ------------------------------------------------------------------------------ Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-10 19:46:27 UTC (rev 9810) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-10 20:27:25 UTC (rev 9811) @@ -1100,15 +1100,15 @@ <p><a name="doc_002dctmc_005fexps"></a> <div class="defun"> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, tt, p </var>)<var><a name="index-ctmc_005fexps-20"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, t, p </var>)<var><a name="index-ctmc_005fexps-20"></a></var><br> — Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-21"></a></var><br> <blockquote> <p><a name="index-Markov-chain_002c-continuous-time-22"></a><a name="index-Expected-sojourn-time-23"></a> -With three arguments, compute the expected time <var>L</var><code>(t,j)</code> -spent in each state j during the time interval -<code>[0,</code><var>tt</var><code>(t))</code>, assuming that at time 0 the state occupancy -probability was <var>p</var>. With two arguments, compute the expected -time <var>L</var><code>(j)</code> spent in each state j until absorption. +With three arguments, compute the expected times <var>L</var><code>(i)</code> +spent in each state i during the time interval +[0,t], assuming that the state occupancy probabilities +at time 0 are <var>p</var>. With two arguments, compute the expected time +<var>L</var><code>(i)</code> spent in each state i until absorption. <p><strong>INPUTS</strong> @@ -1118,10 +1118,7 @@ ≤ i \neq j ≤ N. The matrix <var>Q</var> must also satisfy the condition \sum_j=1^N Q_ij = 0. - <br><dt><var>tt</var><dd>This parameter is a vector used for numerical integration. The first -element <var>tt</var><code>(1)</code> must be 0, and the last element -<var>tt</var><code>(end)</code> must be the upper bound of the interval -[0,t) of interest (<var>tt</var><code>(end) == t</code>). + <br><dt><var>t</var><dd>Time <br><dt><var>p</var><dd>Initial occupancy probability vector; <var>p</var><code>(i)</code> is the probability the system is in state i at time 0, i = 1, @@ -1132,14 +1129,12 @@ <p><strong>OUTPUTS</strong> <dl> -<dt><var>L</var><dd>If this function is called with three arguments, <var>L</var> is a matrix -of size <code>[length(</code><var>tt</var><code>), N]</code> where <var>L</var><code>(t,j)</code> is the -expected time spent in state j during the interval -<code>[0,</code><var>tt</var><code>(t)]</code>. If this function is called with two -arguments, <var>L</var> is a vector with N elements where -<var>L</var><code>(j)</code> is the expected time spent in state j until -absorption, if j is a transient state. If j -is an absorbing state, <var>L</var><code>(j) = 0</code>. +<dt><var>L</var><dd>If this function is called with three arguments, <var>L</var><code>(i)</code> is +the expected time spent in state j during the interval +[0,t]. If this function is called with two arguments +<var>L</var><code>(i)</code> is the expected time spent in state i until +absorption (if i is a transient state), or zero +(if <var>i</var> is an absorbing state). </dl> @@ -1185,13 +1180,13 @@ <p><a name="doc_002dctmc_005ftaexps"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, tt, p</var>)<var><a name="index-ctmc_005ftaexps-24"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, t, p</var>)<var><a name="index-ctmc_005ftaexps-24"></a></var><br> <blockquote> <p><a name="index-Markov-chain_002c-continuous-time-25"></a><a name="index-Time_002dalveraged-sojourn-time-26"></a> -Compute the <em>time-averaged sojourn time</em> <var>M</var><code>(t,j)</code>, -defined as the fraction of the time interval <code>[0,</code><var>tt</var><code>(t))</code> spent in -state j, assuming that at time 0 the state occupancy -probability was <var>p</var>. +Compute the <em>time-averaged sojourn time</em> <var>M</var><code>(i)</code>, +defined as the fraction of the time interval [0,t] spent in +state i, assuming that the state occupancy probabilities at +time 0 are <var>p</var>. <p><strong>INPUTS</strong> @@ -1199,15 +1194,9 @@ <dt><var>Q</var><dd>Infinitesimal generator matrix. <var>Q</var><code>(i,j)</code> is the transition rate from state i to state j, 1 ≤ i \neq j ≤ N. The -matrix <var>Q</var> must also satisfy the condition <code>sum(</code><var>Q</var><code>,2) == 0</code> +matrix <var>Q</var> must also satisfy the condition \sum_j=1^N Q_ij = 0 - <br><dt><var>tt</var><dd>This parameter is a vector used for numerical integration of the -sujourn time. The first element <var>tt</var><code>(1)</code> must be slightly -larger than 0, and the -last element <var>tt</var><code>(end)</code> must be the upper limit of the -interval [0,t) of interest (<var>tt</var><code>(end) == t</code>). -This vector is used by the ODE solver to compute the solution -<var>M</var>. + <br><dt><var>t</var><dd>Time <br><dt><var>p</var><dd><var>p</var><code>(i)</code> is the probability that, at time 0, the system was in state i, for all i = 1, <small class="dots">...</small>, N @@ -1217,10 +1206,9 @@ <p><strong>OUTPUTS</strong> <dl> -<dt><var>M</var><dd><var>M</var><code>(t,j)</code> is the expected fraction of time spent in state -j during the interval [0,tt(t)) assuming that the state -occupancy probability at time zero was <var>p</var>. <code>1 ≤ -</code><var>t</var><code> ≤ length(</code><var>tt</var><code>)</code> +<dt><var>M</var><dd><var>M</var><code>(i)</code> is the expected fraction of time spent in state +i during the interval [0,t] assuming that the state +occupancy probability at time zero is <var>p</var>. </dl> @@ -1279,7 +1267,7 @@ <p><a name="index-Markov-chain_002c-continuous-time-28"></a><a name="index-Mean-time-to-absorption-29"></a> Compute the Mean-Time to Absorption (MTTA) of the CTMC described by the infinitesimal generator matrix <var>Q</var>, starting from initial -occupancy probability <var>p</var>. If there are no absorbing states, this +occupancy probabilities <var>p</var>. If there are no absorbing states, this function fails with an error. <p><strong>INPUTS</strong> Modified: trunk/octave-forge/main/queueing/doc/queueing.pdf =================================================================== (Binary files differ) Modified: trunk/octave-forge/main/queueing/inst/ctmc_exps.m =================================================================== --- trunk/octave-forge/main/queueing/inst/ctmc_exps.m 2012-03-10 19:46:27 UTC (rev 9810) +++ trunk/octave-forge/main/queueing/inst/ctmc_exps.m 2012-03-10 20:27:25 UTC (rev 9811) @@ -17,17 +17,17 @@ ## -*- texinfo -*- ## -## @deftypefn {Function File} {@var{L} =} ctmc_exps (@var{Q}, @var{tt}, @var{p} ) +## @deftypefn {Function File} {@var{L} =} ctmc_exps (@var{Q}, @var{t}, @var{p} ) ## @deftypefnx {Function File} {@var{L} =} ctmc_exps (@var{Q}, @var{p}) ## ## @cindex Markov chain, continuous time ## @cindex Expected sojourn time ## -## With three arguments, compute the expected time @code{@var{L}(t,j)} -## spent in each state @math{j} during the time interval -## @code{[0,@var{tt}(t))}, assuming that at time 0 the state occupancy -## probability was @var{p}. With two arguments, compute the expected -## time @code{@var{L}(j)} spent in each state @math{j} until absorption. +## With three arguments, compute the expected times @code{@var{L}(i)} +## spent in each state @math{i} during the time interval +## @math{[0,t]}, assuming that the state occupancy probabilities +## at time 0 are @var{p}. With two arguments, compute the expected time +## @code{@var{L}(i)} spent in each state @math{i} until absorption. ## ## @strong{INPUTS} ## @@ -39,11 +39,8 @@ ## @leq{} i \neq j @leq{} N}. The matrix @var{Q} must also satisfy the ## condition @math{\sum_{j=1}^N Q_{ij} = 0}. ## -## @item tt -## This parameter is a vector used for numerical integration. The first -## element @code{@var{tt}(1)} must be 0, and the last element -## @code{@var{tt}(end)} must be the upper bound of the interval -## @math{[0,t)} of interest (@code{@var{tt}(end) == @math{t}}). +## @item t +## Time ## ## @item p ## Initial occupancy probability vector; @code{@var{p}(i)} is the @@ -57,14 +54,12 @@ ## @table @var ## ## @item L -## If this function is called with three arguments, @var{L} is a matrix -## of size @code{[length(@var{tt}), N]} where @code{@var{L}(t,j)} is the -## expected time spent in state @math{j} during the interval -## @code{[0,@var{tt}(t)]}. If this function is called with two -## arguments, @var{L} is a vector with @math{N} elements where -## @code{@var{L}(j)} is the expected time spent in state @math{j} until -## absorption, if @math{j} is a transient state. If @math{j} -## is an absorbing state, @code{@var{L}(j) = 0}. +## If this function is called with three arguments, @code{@var{L}(i)} is +## the expected time spent in state @math{j} during the interval +## @math{[0,t]}. If this function is called with two arguments +## @code{@var{L}(i)} is the expected time spent in state @math{i} until +## absorption (if @math{i} is a transient state), or zero +## (if @var{i} is an absorbing state). ## ## @end table ## @@ -85,12 +80,12 @@ usage( "Q must be a square matrix" ); ( norm( sum(Q,2), "inf" ) < epsilon ) || \ - error( "Q is not an infinitesimal generator matrix" ); + usage( "Q is not an infinitesimal generator matrix" ); if ( nargin == 2 ) p = varargin{1}; else - tt = varargin{1}; + t = varargin{1}; p = varargin{2}; endif @@ -98,15 +93,27 @@ usage( "p must be a probability vector" ); if ( nargin == 3 ) - ( isvector(tt) && abs(tt(1)) < epsilon ) || \ - usage( "tt must be a vector, and tt(1) must be 0.0" ); - tt = tt(:)'; # make tt a row vector - p = p(:)'; # make p a row vector - ff = @(x,t) (x(:)'*Q+p); - fj = @(x,t) (Q); - L = lsode( {ff, fj}, zeros(size(p)), tt ); + if ( isscalar(t) ) + (t >= 0 ) || \ + usage( "t must be >= 0" ); + ## F(x) are the transient state occupancy probabilities at time x. + ## It is known that F(x) = p*expm(Q*x) (see function ctmc()). + F = @(x) (p*expm(Q*x)); + L = quadv(F,0,t); + else + ## FIXME: deprecate this? + ( isvector(t) && abs(t(1)) < epsilon ) || \ + usage( "t must be a vector, and t(1) must be 0.0" ); + t = t(:)'; # make tt a row vector + p = p(:)'; # make p a row vector + ff = @(x,t) (x(:)'*Q+p); + fj = @(x,t) (Q); + L = lsode( {ff, fj}, zeros(size(p)), t ); + endif else #{ + ## This code is left for information only + ## F(t) are the transient state occupancy probabilities at time t. ## It is known that F(t) = p*expm(Q*t) (see function ctmc()). ## The expected times spent in each state until absorption can @@ -138,6 +145,10 @@ L(nzrows) = LN; endif endfunction +%!test +%! Q = [-1 1; 1 -1]; +%! L = ctmc_exps(Q,10,[1 0]); +%! L = ctmc_exps(Q,linspace(0,10,100),[1 0]); %!demo %! lambda = 0.5; @@ -146,18 +157,16 @@ %! death = zeros(1,N-1); %! Q = diag(birth,1)+diag(death,-1); %! Q -= diag(sum(Q,2)); -%! tt = linspace(0,10,100); +%! t = linspace(0,10,100); %! p0 = zeros(1,N); p0(1)=1; -%! L = ctmc_exps(Q,tt,p0); -%! #L2 = 0*L; -%! #for i=1:length(tt) -%! # L2(i,:) = quadv( @(t) (p0*expm(Q*t)) , 0, tt(i) ); -%! #endfor -%! plot( tt, L(:,1), ";State 1;", "linewidth", 2, \ -%! # tt, L2(:,1), "+;State 1 (quadv);", "markersize", 8, \ -%! tt, L(:,2), ";State 2;", "linewidth", 2, \ -%! tt, L(:,3), ";State 3;", "linewidth", 2, \ -%! tt, L(:,4), ";State 4 (absorbing);", "linewidth", 2); +%! L = zeros(length(t),N); +%! for i=1:length(t) +%! L(i,:) = ctmc_exps(Q,t(i),p0); +%! endfor +%! plot( t, L(:,1), ";State 1;", "linewidth", 2, \ +%! t, L(:,2), ";State 2;", "linewidth", 2, \ +%! t, L(:,3), ";State 3;", "linewidth", 2, \ +%! t, L(:,4), ";State 4;", "linewidth", 2 ); %! legend("location","northwest"); %! xlabel("Time"); %! ylabel("Expected sojourn time"); Modified: trunk/octave-forge/main/queueing/inst/ctmc_mtta.m =================================================================== --- trunk/octave-forge/main/queueing/inst/ctmc_mtta.m 2012-03-10 19:46:27 UTC (rev 9810) +++ trunk/octave-forge/main/queueing/inst/ctmc_mtta.m 2012-03-10 20:27:25 UTC (rev 9811) @@ -24,7 +24,7 @@ ## ## Compute the Mean-Time to Absorption (MTTA) of the CTMC described by ## the infinitesimal generator matrix @var{Q}, starting from initial -## occupancy probability @var{p}. If there are no absorbing states, this +## occupancy probabilities @var{p}. If there are no absorbing states, this ## function fails with an error. ## ## @strong{INPUTS} @@ -71,8 +71,8 @@ N = rows(Q); - all( abs( sum(Q,2) ) < epsilon ) || \ - usage( "Q is not an infinitesimal generator matrix" ); + ( norm( sum(Q,2), "inf" ) < epsilon ) || \ + usage( "Q must be an infinitesimal generator matrix" ); ( isvector(p) && length(p) == N && all(p>=0) && abs(sum(p)-1.0)<epsilon ) || \ usage( "p must be a probability vector" ); @@ -90,7 +90,7 @@ %!test %! Q = [0 1 0; 1 0 1; 0 0 0 ]; -%! fail( "ctmc_mtta(Q,[1 0 0])", "not an infinitesimal"); +%! fail( "ctmc_mtta(Q,[1 0 0])", "must be an infinitesimal"); %!test %! Q = [ 0 0.1 0 0; \ Modified: trunk/octave-forge/main/queueing/inst/ctmc_taexps.m =================================================================== --- trunk/octave-forge/main/queueing/inst/ctmc_taexps.m 2012-03-10 19:46:27 UTC (rev 9810) +++ trunk/octave-forge/main/queueing/inst/ctmc_taexps.m 2012-03-10 20:27:25 UTC (rev 9811) @@ -17,15 +17,15 @@ ## -*- texinfo -*- ## -## @deftypefn {Function File} {@var{M} =} ctmc_taexps (@var{Q}, @var{tt}, @var{p}) +## @deftypefn {Function File} {@var{M} =} ctmc_taexps (@var{Q}, @var{t}, @var{p}) ## ## @cindex Markov chain, continuous time ## @cindex Time-alveraged sojourn time ## -## Compute the @emph{time-averaged sojourn time} @code{@var{M}(t,j)}, -## defined as the fraction of the time interval @code{[0,@var{tt}(t))} spent in -## state @math{j}, assuming that at time 0 the state occupancy -## probability was @var{p}. +## Compute the @emph{time-averaged sojourn time} @code{@var{M}(i)}, +## defined as the fraction of the time interval @math{[0,t]} spent in +## state @math{i}, assuming that the state occupancy probabilities at +## time 0 are @var{p}. ## ## @strong{INPUTS} ## @@ -35,16 +35,10 @@ ## Infinitesimal generator matrix. @code{@var{Q}(i,j)} is the transition ## rate from state @math{i} to state @math{j}, ## @math{1 @leq{} i \neq j @leq{} N}. The -## matrix @var{Q} must also satisfy the condition @code{sum(@var{Q},2) == 0} +## matrix @var{Q} must also satisfy the condition @math{\sum_{j=1}^N Q_{ij} = 0} ## -## @item tt -## This parameter is a vector used for numerical integration of the -## sujourn time. The first element @code{@var{tt}(1)} must be slightly -## larger than 0, and the -## last element @code{@var{tt}(end)} must be the upper limit of the -## interval @math{[0,t)} of interest (@code{@var{tt}(end) == @math{t}}). -## This vector is used by the ODE solver to compute the solution -## @var{M}. +## @item t +## Time ## ## @item p ## @code{@var{p}(i)} is the probability that, at time 0, the system was in @@ -57,10 +51,9 @@ ## @table @var ## ## @item M -## @code{@var{M}(t,j)} is the expected fraction of time spent in state -## @math{j} during the interval @math{[0,tt(t))} assuming that the state -## occupancy probability at time zero was @var{p}. @code{1 @leq{} -## @var{t} @leq{} length(@var{tt})} +## @code{@var{M}(i)} is the expected fraction of time spent in state +## @math{i} during the interval @math{[0,t]} assuming that the state +## occupancy probability at time zero is @var{p}. ## ## @end table ## @@ -87,11 +80,19 @@ ( isvector(p) && length(p) == N && all(p>=0) && abs(sum(p)-1.0)<epsilon ) || \ usage( "p must be a probability vector" ); - t = t(:)'; # make t a row vector - p = p(:)'; # make p a row vector - ff = @(x,t) (((x')*(Q-eye(N)/t).+p/t)'); - fj = @(x,t) (Q-eye(N)/t); - M = lsode( {ff, fj}, zeros(size(p)), t ); + if ( isscalar(t) ) + (t >= 0) || \ + usage( "t must be >= 0" ); + F = @(x) (p*expm(Q*x)); + M = quadv(F,0,t) / t; + else + ## FIXME: deprecate this? + t = t(:)'; # make t a row vector + p = p(:)'; # make p a row vector + ff = @(x,t) (((x')*(Q-eye(N)/t).+p/t)'); + fj = @(x,t) (Q-eye(N)/t); + M = lsode( {ff, fj}, zeros(size(p)), t ); + endif endfunction %!demo @@ -101,9 +102,12 @@ %! death = zeros(1,N-1); %! Q = diag(birth,1)+diag(death,-1); %! Q -= diag(sum(Q,2)); -%! t = linspace(1e-3,50,500); +%! t = linspace(1e-5,30,100); %! p = zeros(1,N); p(1)=1; -%! M = ctmc_taexps(Q,t,p); +%! M = zeros(length(t),N); +%! for i=1:length(t) +%! M(i,:) = ctmc_taexps(Q,t(i),p); +%! endfor %! plot(t, M(:,1), ";State 1;", "linewidth", 2, \ %! t, M(:,2), ";State 2;", "linewidth", 2, \ %! t, M(:,3), ";State 3;", "linewidth", 2, \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-03-10 19:46:33
|
Revision: 9810 http://octave.svn.sourceforge.net/octave/?rev=9810&view=rev Author: paramaniac Date: 2012-03-10 19:46:27 +0000 (Sat, 10 Mar 2012) Log Message: ----------- control-devel: use recursion instead of for-loop, fix subsref tsam Modified Paths: -------------- trunk/octave-forge/extra/control-devel/inst/@iddata/subsref.m Modified: trunk/octave-forge/extra/control-devel/inst/@iddata/subsref.m =================================================================== --- trunk/octave-forge/extra/control-devel/inst/@iddata/subsref.m 2012-03-10 19:45:06 UTC (rev 9809) +++ trunk/octave-forge/extra/control-devel/inst/@iddata/subsref.m 2012-03-10 19:46:27 UTC (rev 9810) @@ -21,36 +21,31 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: February 2012 -## Version: 0.1 +## Version: 0.2 function a = subsref (a, s) - if (isempty (s)) - error ("iddata: subsref: missing index"); + if (numel (s) == 0) + return; endif - for k = 1 : numel (s) - if (isa (a, "iddata")) - switch (s(k).type) - case "()" - idx = s(k).subs; - if (numel (idx) > 4) - error ("iddata: subsref: need four or less indices"); - else - a = __dat_prune__ (a, idx{:}); - endif - case "." - fld = s(k).subs; - a = get (a, fld); - otherwise - error ("iddata: subsref: invalid subscript type"); - endswitch - else # not an iddata set - a = subsref (a, s(k:end)); - return; - endif - endfor + switch (s(1).type) + case "()" + idx = s(1).subs; + if (numel (idx) > 4) + error ("iddata: subsref: need four or less indices"); + else + a = __dat_prune__ (a, idx{:}); + endif + case "." + fld = s(1).subs; + a = get (a, fld); + otherwise + error ("iddata: subsref: invalid subscript type"); + endswitch + a = subsref (a, s(2:end)); + endfunction @@ -69,5 +64,6 @@ endif dat.expname = dat.expname(exp_idx); + dat.tsam = dat.tsam(exp_idx); -endfunction \ No newline at end of file +endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-03-10 19:45:12
|
Revision: 9809 http://octave.svn.sourceforge.net/octave/?rev=9809&view=rev Author: paramaniac Date: 2012-03-10 19:45:06 +0000 (Sat, 10 Mar 2012) Log Message: ----------- control: use recursion instead of for-loop for subs ref Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/subsref.m Modified: trunk/octave-forge/main/control/inst/@lti/subsref.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/subsref.m 2012-03-10 16:03:47 UTC (rev 9808) +++ trunk/octave-forge/main/control/inst/@lti/subsref.m 2012-03-10 19:45:06 UTC (rev 9809) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2012 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -21,37 +21,32 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.2 +## Version: 0.3 function a = subsref (a, s) - if (isempty (s)) - error ("lti: subsref: missing index"); + if (numel (s) == 0) + return; endif - for k = 1 : numel (s) - if (isa (a, "lti")) - switch (s(k).type) - case "()" - idx = s(k).subs; - if (numel (idx) == 2) - a = __sys_prune__ (a, idx{1}, idx{2}); - elseif (numel (idx) == 1) - a = __freqresp__ (a, idx{1}); - else - error ("lti: subsref: need one or two indices"); - endif - case "." - fld = s(k).subs; - a = get (a, fld); - ## warning ("lti: subsref: do not use subsref for development"); - otherwise - error ("lti: subsref: invalid subscript type"); - endswitch - else # not an LTI model - a = subsref (a, s(k:end)); - return; - endif - endfor + switch (s(1).type) + case "()" + idx = s(1).subs; + if (numel (idx) == 2) + a = __sys_prune__ (a, idx{1}, idx{2}); + elseif (numel (idx) == 1) + a = __freqresp__ (a, idx{1}); + else + error ("lti: subsref: need one or two indices"); + endif + case "." + fld = s(1).subs; + a = get (a, fld); + ## warning ("lti: subsref: do not use subsref for development"); + otherwise + error ("lti: subsref: invalid subscript type"); + endswitch + + a = subsref (a, s(2:end)); -endfunction \ No newline at end of file +endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mma...@us...> - 2012-03-10 16:03:56
|
Revision: 9808 http://octave.svn.sourceforge.net/octave/?rev=9808&view=rev Author: mmarzolla Date: 2012-03-10 16:03:47 +0000 (Sat, 10 Mar 2012) Log Message: ----------- fixed bug in texinfo documentation Modified Paths: -------------- trunk/octave-forge/main/queueing/doc/queueing.html trunk/octave-forge/main/queueing/doc/queueing.pdf trunk/octave-forge/main/queueing/inst/ctmc_exps.m Modified: trunk/octave-forge/main/queueing/doc/queueing.html =================================================================== --- trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-10 16:00:45 UTC (rev 9807) +++ trunk/octave-forge/main/queueing/doc/queueing.html 2012-03-10 16:03:47 UTC (rev 9808) @@ -1100,36 +1100,46 @@ <p><a name="doc_002dctmc_005fexps"></a> <div class="defun"> -— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, tt, p</var>)<var><a name="index-ctmc_005fexps-20"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, tt, p </var>)<var><a name="index-ctmc_005fexps-20"></a></var><br> +— Function File: <var>L</var> = <b>ctmc_exps</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fexps-21"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-21"></a><a name="index-Expected-sojourn-time-22"></a> -Compute the expected total time <var>L</var><code>(t,j)</code> spent in state -j during the time interval <code>[0,</code><var>tt</var><code>(t))</code>, assuming -that at time 0 the state occupancy probability was <var>p</var>. + <p><a name="index-Markov-chain_002c-continuous-time-22"></a><a name="index-Expected-sojourn-time-23"></a> +With three arguments, compute the expected time <var>L</var><code>(t,j)</code> +spent in each state j during the time interval +<code>[0,</code><var>tt</var><code>(t))</code>, assuming that at time 0 the state occupancy +probability was <var>p</var>. With two arguments, compute the expected +time <var>L</var><code>(j)</code> spent in each state j until absorption. <p><strong>INPUTS</strong> <dl> -<dt><var>Q</var><dd>Infinitesimal generator matrix. <var>Q</var><code>(i,j)</code> is the transition -rate from state i to state j, -1 ≤ i \neq j ≤ N. The matrix <var>Q</var> must also satisfy the -condition <code>sum(</code><var>Q</var><code>,2) == 0</code> +<dt><var>Q</var><dd>N \times N infinitesimal generator matrix. <var>Q</var><code>(i,j)</code> +is the transition rate from state i to state j, 1 +≤ i \neq j ≤ N. The matrix <var>Q</var> must also satisfy the +condition \sum_j=1^N Q_ij = 0. <br><dt><var>tt</var><dd>This parameter is a vector used for numerical integration. The first element <var>tt</var><code>(1)</code> must be 0, and the last element <var>tt</var><code>(end)</code> must be the upper bound of the interval [0,t) of interest (<var>tt</var><code>(end) == t</code>). - <br><dt><var>p</var><dd><var>p</var><code>(i)</code> is the probability that at time 0 the system was in -state i, for all i = 1, <small class="dots">...</small>, N + <br><dt><var>p</var><dd>Initial occupancy probability vector; <var>p</var><code>(i)</code> is the +probability the system is in state i at time 0, i = 1, +<small class="dots">...</small>, N </dl> <p><strong>OUTPUTS</strong> <dl> -<dt><var>L</var><dd><var>L</var><code>(t,j)</code> is the expected time spent in state j -during the interval <code>[0,</code><var>tt</var><code>(t))</code>. <code>1 ≤ </code><var>t</var><code> ≤ length(</code><var>tt</var><code>)</code> +<dt><var>L</var><dd>If this function is called with three arguments, <var>L</var> is a matrix +of size <code>[length(</code><var>tt</var><code>), N]</code> where <var>L</var><code>(t,j)</code> is the +expected time spent in state j during the interval +<code>[0,</code><var>tt</var><code>(t)]</code>. If this function is called with two +arguments, <var>L</var> is a vector with N elements where +<var>L</var><code>(j)</code> is the expected time spent in state j until +absorption, if j is a transient state. If j +is an absorbing state, <var>L</var><code>(j) = 0</code>. </dl> @@ -1175,9 +1185,9 @@ <p><a name="doc_002dctmc_005ftaexps"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, tt, p</var>)<var><a name="index-ctmc_005ftaexps-23"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_taexps</b> (<var>Q, tt, p</var>)<var><a name="index-ctmc_005ftaexps-24"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-24"></a><a name="index-Time_002dalveraged-sojourn-time-25"></a> + <p><a name="index-Markov-chain_002c-continuous-time-25"></a><a name="index-Time_002dalveraged-sojourn-time-26"></a> Compute the <em>time-averaged sojourn time</em> <var>M</var><code>(t,j)</code>, defined as the fraction of the time interval <code>[0,</code><var>tt</var><code>(t))</code> spent in state j, assuming that at time 0 the state occupancy @@ -1264,12 +1274,13 @@ <p><a name="doc_002dctmc_005fmtta"></a> <div class="defun"> -— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-26"></a></var><br> +— Function File: <var>t</var> = <b>ctmc_mtta</b> (<var>Q, p</var>)<var><a name="index-ctmc_005fmtta-27"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-27"></a><a name="index-Mean-time-to-absorption-28"></a> -Compute the Mean-Time to Absorption (MTTA) starting from initial -occupancy probability <var>p</var> at time 0. If there are no absorbing -states, this function fails with an error. + <p><a name="index-Markov-chain_002c-continuous-time-28"></a><a name="index-Mean-time-to-absorption-29"></a> +Compute the Mean-Time to Absorption (MTTA) of the CTMC described by +the infinitesimal generator matrix <var>Q</var>, starting from initial +occupancy probability <var>p</var>. If there are no absorbing states, this +function fails with an error. <p><strong>INPUTS</strong> @@ -1326,7 +1337,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-29"></a><a name="index-Greiner_002c-S_002e-30"></a><a name="index-de-Meer_002c-H_002e-31"></a><a name="index-Trivedi_002c-K_002e-32"></a> + <p><a name="index-Bolch_002c-G_002e-30"></a><a name="index-Greiner_002c-S_002e-31"></a><a name="index-de-Meer_002c-H_002e-32"></a><a name="index-Trivedi_002c-K_002e-33"></a> <div class="node"> <a name="CTMC-First-Passage-Times"></a> <p><hr> @@ -1340,10 +1351,10 @@ <p><a name="doc_002dctmc_005ffpt"></a> <div class="defun"> -— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-33"></a></var><br> -— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-34"></a></var><br> +— Function File: <var>M</var> = <b>ctmc_fpt</b> (<var>Q</var>)<var><a name="index-ctmc_005ffpt-34"></a></var><br> +— Function File: <var>m</var> = <b>ctmc_fpt</b> (<var>Q, i, j</var>)<var><a name="index-ctmc_005ffpt-35"></a></var><br> <blockquote> - <p><a name="index-Markov-chain_002c-continuous-time-35"></a><a name="index-First-passage-times-36"></a> + <p><a name="index-Markov-chain_002c-continuous-time-36"></a><a name="index-First-passage-times-37"></a> If called with a single argument, computes the mean first passage times <var>M</var><code>(i,j)</code>, the average times before state <var>j</var> is reached, starting from state <var>i</var>, for all 1 \leq i, j \leq @@ -1449,9 +1460,9 @@ <p><a name="doc_002dqnmm1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-37"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmm1</b> (<var>lambda, mu</var>)<var><a name="index-qnmm1-38"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-38"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_007d-system-39"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1 queue. @@ -1496,7 +1507,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.3. - <p><a name="index-Bolch_002c-G_002e-39"></a><a name="index-Greiner_002c-S_002e-40"></a><a name="index-de-Meer_002c-H_002e-41"></a><a name="index-Trivedi_002c-K_002e-42"></a> + <p><a name="index-Bolch_002c-G_002e-40"></a><a name="index-Greiner_002c-S_002e-41"></a><a name="index-de-Meer_002c-H_002e-42"></a><a name="index-Trivedi_002c-K_002e-43"></a> <!-- M/M/m --> <div class="node"> <a name="The-M%2fM%2fm-System"></a> @@ -1522,10 +1533,10 @@ <p><a name="doc_002dqnmmm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-43"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-44"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu</var>)<var><a name="index-qnmmm-44"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pm</var>] = <b>qnmmm</b> (<var>lambda, mu, m</var>)<var><a name="index-qnmmm-45"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-45"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_007d-system-46"></a> Compute utilization, response time, average number of requests in service and throughput for a M/M/m queue, a queueing system with m identical service centers connected to a single queue. @@ -1577,7 +1588,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.5. - <p><a name="index-Bolch_002c-G_002e-46"></a><a name="index-Greiner_002c-S_002e-47"></a><a name="index-de-Meer_002c-H_002e-48"></a><a name="index-Trivedi_002c-K_002e-49"></a> + <p><a name="index-Bolch_002c-G_002e-47"></a><a name="index-Greiner_002c-S_002e-48"></a><a name="index-de-Meer_002c-H_002e-49"></a><a name="index-Trivedi_002c-K_002e-50"></a> <!-- M/M/inf --> <div class="node"> <a name="The-M%2fM%2finf-System"></a> @@ -1600,7 +1611,7 @@ <p><a name="doc_002dqnmminf"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-50"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmminf</b> (<var>lambda, mu</var>)<var><a name="index-qnmminf-51"></a></var><br> <blockquote> <p>Compute utilization, response time, average number of requests and throughput for a M/M/\infty queue. This is a system with an @@ -1608,7 +1619,7 @@ system is always stable, regardless the values of the arrival and service rates. - <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-51"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f_007dinf-system-52"></a> <p><strong>INPUTS</strong> @@ -1626,7 +1637,7 @@ different from the utilization, which in the case of M/M/\infty centers is always zero. - <p><a name="index-traffic-intensity-52"></a> + <p><a name="index-traffic-intensity-53"></a> <br><dt><var>R</var><dd>Service center response time. <br><dt><var>Q</var><dd>Average number of requests in the system (which is equal to the @@ -1654,7 +1665,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.4. - <p><a name="index-Bolch_002c-G_002e-53"></a><a name="index-Greiner_002c-S_002e-54"></a><a name="index-de-Meer_002c-H_002e-55"></a><a name="index-Trivedi_002c-K_002e-56"></a> + <p><a name="index-Bolch_002c-G_002e-54"></a><a name="index-Greiner_002c-S_002e-55"></a><a name="index-de-Meer_002c-H_002e-56"></a><a name="index-Trivedi_002c-K_002e-57"></a> <!-- M/M/1/k --> <div class="node"> <a name="The-M%2fM%2f1%2fK-System"></a> @@ -1678,9 +1689,9 @@ <p><a name="doc_002dqnmm1k"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-57"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmm1k</b> (<var>lambda, mu, K</var>)<var><a name="index-qnmm1k-58"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-58"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002f1_002fK_007d-system-59"></a> Compute utilization, response time, average number of requests and throughput for a M/M/1/K finite capacity system. In a M/M/1/K queue there is a single server; the maximum number of @@ -1747,9 +1758,9 @@ <p><a name="doc_002dqnmmmk"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-59"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>, <var>pK</var>] = <b>qnmmmk</b> (<var>lambda, mu, m, K</var>)<var><a name="index-qnmmmk-60"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-60"></a> + <p><a name="index-g_t_0040math_007bM_002fM_002fm_002fK_007d-system-61"></a> Compute utilization, response time, average number of requests and throughput for a M/M/m/K finite capacity system. In a M/M/m/K system there are m \geq 1 identical service @@ -1807,7 +1818,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 6.6. - <p><a name="index-Bolch_002c-G_002e-61"></a><a name="index-Greiner_002c-S_002e-62"></a><a name="index-de-Meer_002c-H_002e-63"></a><a name="index-Trivedi_002c-K_002e-64"></a> + <p><a name="index-Bolch_002c-G_002e-62"></a><a name="index-Greiner_002c-S_002e-63"></a><a name="index-de-Meer_002c-H_002e-64"></a><a name="index-Trivedi_002c-K_002e-65"></a> <!-- Approximate M/M/m --> <div class="node"> @@ -1829,9 +1840,9 @@ <p><a name="doc_002dqnammm"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-65"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnammm</b> (<var>lambda, mu</var>)<var><a name="index-qnammm-66"></a></var><br> <blockquote> - <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-66"></a> + <p><a name="index-Asymmetric-_0040math_007bM_002fM_002fm_007d-system-67"></a> Compute <em>approximate</em> utilization, response time, average number of requests in service and throughput for an asymmetric M/M/m queue. In this system there are m different service centers @@ -1878,7 +1889,7 @@ and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998 - <p><a name="index-Bolch_002c-G_002e-67"></a><a name="index-Greiner_002c-S_002e-68"></a><a name="index-de-Meer_002c-H_002e-69"></a><a name="index-Trivedi_002c-K_002e-70"></a> + <p><a name="index-Bolch_002c-G_002e-68"></a><a name="index-Greiner_002c-S_002e-69"></a><a name="index-de-Meer_002c-H_002e-70"></a><a name="index-Trivedi_002c-K_002e-71"></a> <div class="node"> <a name="The-M%2fG%2f1-System"></a> <a name="The-M_002fG_002f1-System"></a> @@ -1894,9 +1905,9 @@ <p><a name="doc_002dqnmg1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-71"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmg1</b> (<var>lambda, xavg, x2nd</var>)<var><a name="index-qnmg1-72"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-72"></a> + <p><a name="index-g_t_0040math_007bM_002fG_002f1_007d-system-73"></a> Compute utilization, response time, average number of requests and throughput for a M/G/1 system. The service time distribution is described by its mean <var>xavg</var>, and by its second moment @@ -1953,9 +1964,9 @@ <p><a name="doc_002dqnmh1"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-73"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>p0</var>] = <b>qnmh1</b> (<var>lambda, mu, alpha</var>)<var><a name="index-qnmh1-74"></a></var><br> <blockquote> - <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-74"></a> + <p><a name="index-g_t_0040math_007bM_002fH_005fm_002f1_007d-system-75"></a> Compute utilization, response time, average number of requests and throughput for a M/H_m/1 system. In this system, the customer service times have hyper-exponential distribution: @@ -2037,7 +2048,7 @@ <li><a accesskey="6" href="#Utility-functions">Utility functions</a>: Utility functions to compute miscellaneous quantities </ul> -<p><a name="index-queueing-networks-75"></a> +<p><a name="index-queueing-networks-76"></a> <!-- INTRODUCTION --> <div class="node"> <a name="Introduction-to-QNs"></a> @@ -2298,13 +2309,13 @@ <p><a name="doc_002dqnmknode"></a> <div class="defun"> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-76"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-77"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-78"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-79"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-80"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-81"></a></var><br> -— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-82"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S</var>)<var><a name="index-qnmknode-77"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/m-fcfs", S, m</var>)<var><a name="index-qnmknode-78"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"m/m/1-lcfs-pr", S</var>)<var><a name="index-qnmknode-79"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S</var>)<var><a name="index-qnmknode-80"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/1-ps", S, s2</var>)<var><a name="index-qnmknode-81"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S</var>)<var><a name="index-qnmknode-82"></a></var><br> +— Function File: <var>Q</var> = <b>qnmknode</b> (<var>"-/g/inf", S, s2</var>)<var><a name="index-qnmknode-83"></a></var><br> <blockquote> <p>Creates a node; this function can be used together with <code>qnsolve</code>. It is possible to create either single-class nodes @@ -2373,10 +2384,10 @@ <p><a name="doc_002dqnsolve"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-83"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-84"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-85"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-86"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V</var>)<var><a name="index-qnsolve-84"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"closed", N, QQ, V, Z</var>)<var><a name="index-qnsolve-85"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"open", lambda, QQ, V</var>)<var><a name="index-qnsolve-86"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnsolve</b> (<var>"mixed", lambda, N, QQ, V</var>)<var><a name="index-qnsolve-87"></a></var><br> <blockquote> <p>General evaluator of QN models. Networks can be open, closed or mixed; single as well as multiclass networks are supported. @@ -2554,11 +2565,11 @@ <p><a name="doc_002dqnjackson"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-87"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-88"></a></var><br> -— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-89"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P </var>)<var><a name="index-qnjackson-88"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnjackson</b> (<var>lambda, S, P, m </var>)<var><a name="index-qnjackson-89"></a></var><br> +— Function File: <var>pr</var> = <b>qnjackson</b> (<var>lambda, S, P, m, k</var>)<var><a name="index-qnjackson-90"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-90"></a><a name="index-Jackson-network-91"></a> + <p><a name="index-open-network_002c-single-class-91"></a><a name="index-Jackson-network-92"></a> With three or four input parameters, this function computes the steady-state occupancy probabilities for a Jackson network. With five input parameters, this function computes the steady-state probability @@ -2640,7 +2651,7 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 284–287. - <p><a name="index-Bolch_002c-G_002e-92"></a><a name="index-Greiner_002c-S_002e-93"></a><a name="index-de-Meer_002c-H_002e-94"></a><a name="index-Trivedi_002c-K_002e-95"></a> + <p><a name="index-Bolch_002c-G_002e-93"></a><a name="index-Greiner_002c-S_002e-94"></a><a name="index-de-Meer_002c-H_002e-95"></a><a name="index-Trivedi_002c-K_002e-96"></a> <h4 class="subsection">6.3.2 The Convolution Algorithm</h4> @@ -2674,10 +2685,10 @@ <p><a name="doc_002dqnconvolution"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-96"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-97"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V</var>)<var><a name="index-qnconvolution-97"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolution</b> (<var>N, S, V, m</var>)<var><a name="index-qnconvolution-98"></a></var><br> <blockquote> - <p><a name="index-closed-network-98"></a><a name="index-normalization-constant-99"></a><a name="index-convolution-algorithm-100"></a> + <p><a name="index-closed-network-99"></a><a name="index-normalization-constant-100"></a><a name="index-convolution-algorithm-101"></a> This function implements the <em>convolution algorithm</em> for computing steady-state performance measures of product-form, single-class closed queueing networks. Load-independent service @@ -2768,20 +2779,20 @@ 16, number 9, september 1973, pp. 527–531. <a href="http://doi.acm.org/10.1145/362342.362345">http://doi.acm.org/10.1145/362342.362345</a> - <p><a name="index-Buzen_002c-J_002e-P_002e-101"></a> + <p><a name="index-Buzen_002c-J_002e-P_002e-102"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, pp. 313–317. - <p><a name="index-Bolch_002c-G_002e-102"></a><a name="index-Greiner_002c-S_002e-103"></a><a name="index-de-Meer_002c-H_002e-104"></a><a name="index-Trivedi_002c-K_002e-105"></a> + <p><a name="index-Bolch_002c-G_002e-103"></a><a name="index-Greiner_002c-S_002e-104"></a><a name="index-de-Meer_002c-H_002e-105"></a><a name="index-Trivedi_002c-K_002e-106"></a> <!-- Convolution for load-dependent service centers --> <a name="doc_002dqnconvolutionld"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-106"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnconvolutionld</b> (<var>N, S, V</var>)<var><a name="index-qnconvolutionld-107"></a></var><br> <blockquote> - <p><a name="index-closed-network-107"></a><a name="index-normalization-constant-108"></a><a name="index-convolution-algorithm-109"></a><a name="index-load_002ddependent-service-center-110"></a> + <p><a name="index-closed-network-108"></a><a name="index-normalization-constant-109"></a><a name="index-convolution-algorithm-110"></a><a name="index-load_002ddependent-service-center-111"></a> This function implements the <em>convolution algorithm</em> for product-form, single-class closed queueing networks with general load-dependent service centers. @@ -2841,7 +2852,7 @@ Purdue University, feb, 1981 (revised). <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-354.pdf</a> - <p><a name="index-Schwetman_002c-H_002e-111"></a> + <p><a name="index-Schwetman_002c-H_002e-112"></a> M. Reiser, H. Kobayashi, <cite>On The Convolution Algorithm for Separable Queueing Networks</cite>, In Proceedings of the 1976 ACM SIGMETRICS Conference on Computer Performance Modeling Measurement and @@ -2849,7 +2860,7 @@ 1976). SIGMETRICS '76. ACM, New York, NY, pp. 109–117. <a href="http://doi.acm.org/10.1145/800200.806187">http://doi.acm.org/10.1145/800200.806187</a> - <p><a name="index-Reiser_002c-M_002e-112"></a><a name="index-Kobayashi_002c-H_002e-113"></a> + <p><a name="index-Reiser_002c-M_002e-113"></a><a name="index-Kobayashi_002c-H_002e-114"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -2861,7 +2872,7 @@ function f_i defined in Schwetman, <code>Some Computational Aspects of Queueing Network Models</code>. - <p><a name="index-Bolch_002c-G_002e-114"></a><a name="index-Greiner_002c-S_002e-115"></a><a name="index-de-Meer_002c-H_002e-116"></a><a name="index-Trivedi_002c-K_002e-117"></a> + <p><a name="index-Bolch_002c-G_002e-115"></a><a name="index-Greiner_002c-S_002e-116"></a><a name="index-de-Meer_002c-H_002e-117"></a><a name="index-Trivedi_002c-K_002e-118"></a> <h4 class="subsection">6.3.3 Open networks</h4> @@ -2869,10 +2880,10 @@ <p><a name="doc_002dqnopensingle"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-118"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-119"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V</var>)<var><a name="index-qnopensingle-119"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopensingle</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopensingle-120"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-single-class-120"></a><a name="index-BCMP-network-121"></a> + <p><a name="index-open-network_002c-single-class-121"></a><a name="index-BCMP-network-122"></a> Analyze open, single class BCMP queueing networks. <p>This function works for a subset of BCMP single-class open networks @@ -2965,16 +2976,16 @@ Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998. - <p><a name="index-Bolch_002c-G_002e-122"></a><a name="index-Greiner_002c-S_002e-123"></a><a name="index-de-Meer_002c-H_002e-124"></a><a name="index-Trivedi_002c-K_002e-125"></a> + <p><a name="index-Bolch_002c-G_002e-123"></a><a name="index-Greiner_002c-S_002e-124"></a><a name="index-de-Meer_002c-H_002e-125"></a><a name="index-Trivedi_002c-K_002e-126"></a> <!-- Open network with multiple classes --> <p><a name="doc_002dqnopenmulti"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-126"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-127"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V</var>)<var><a name="index-qnopenmulti-127"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnopenmulti</b> (<var>lambda, S, V, m</var>)<var><a name="index-qnopenmulti-128"></a></var><br> <blockquote> - <p><a name="index-open-network_002c-multiple-classes-128"></a> + <p><a name="index-open-network_002c-multiple-classes-129"></a> Exact analysis of open, multiple-class BCMP networks. The network can be made of <em>single-server</em> queueing centers (FCFS, LCFS-PR or PS) or delay centers (IS). This function assumes a network with @@ -3039,7 +3050,7 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.1 ("Open Model Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-129"></a><a name="index-Zahorjan_002c-J_002e-130"></a><a name="index-Graham_002c-G_002e-S_002e-131"></a><a name="index-Sevcik_002c-K_002e-C_002e-132"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-130"></a><a name="index-Zahorjan_002c-J_002e-131"></a><a name="index-Graham_002c-G_002e-S_002e-132"></a><a name="index-Sevcik_002c-K_002e-C_002e-133"></a> <h4 class="subsection">6.3.4 Closed Networks</h4> @@ -3047,11 +3058,11 @@ <p><a name="doc_002dqnclosedsinglemva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-133"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-134"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-135"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemva-134"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemva-135"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>, <var>G</var>] = <b>qnclosedsinglemva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemva-136"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-136"></a><a name="index-closed-network_002c-single-class-137"></a><a name="index-normalization-constant-138"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-137"></a><a name="index-closed-network_002c-single-class-138"></a><a name="index-normalization-constant-139"></a> Analyze closed, single class queueing networks using the exact Mean Value Analysis (MVA) algorithm. The following queueing disciplines are supported: FCFS, LCFS-PR, PS and IS (Infinite Server). This @@ -3097,8 +3108,11 @@ <var>X</var><code>(k)*</code><var>S</var><code>(k)</code>. <br><dt><var>R</var><dd><var>R</var><code>(k)</code> is the response time at center k. +The <em>Residence Time</em> at center k is +<var>R</var><code>(k) * </code><var>V</var><code>(k)</code>. The system response time <var>Rsys</var> -can be computed as <var>Rsys</var><code> = </code><var>N</var><code>/</code><var>Xsys</var><code> - Z</code> +can be computed either as <var>Rsys</var><code> = </code><var>N</var><code>/</code><var>Xsys</var><code> - Z</code> +or as <var>Rsys</var><code> = dot(</code><var>R</var><code>,</code><var>V</var><code>)</code> <br><dt><var>Q</var><dd><var>Q</var><code>(k)</code> is the average number of requests at center k. The number of requests in the system can be computed @@ -3149,7 +3163,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-139"></a><a name="index-Lavenberg_002c-S_002e-S_002e-140"></a> + <p><a name="index-Reiser_002c-M_002e-140"></a><a name="index-Lavenberg_002c-S_002e-S_002e-141"></a> This implementation is described in R. Jain , <cite>The Art of Computer Systems Performance Analysis</cite>, Wiley, 1991, p. 577. Multi-server nodes <!-- and the computation of @math{G(N)}, --> @@ -3158,15 +3172,15 @@ Performance Evaluation with Computer Science Applications</cite>, Wiley, 1998, Section 8.2.1, "Single Class Queueing Networks". - <p><a name="index-Jain_002c-R_002e-141"></a><a name="index-Bolch_002c-G_002e-142"></a><a name="index-Greiner_002c-S_002e-143"></a><a name="index-de-Meer_002c-H_002e-144"></a><a name="index-Trivedi_002c-K_002e-145"></a> + <p><a name="index-Jain_002c-R_002e-142"></a><a name="index-Bolch_002c-G_002e-143"></a><a name="index-Greiner_002c-S_002e-144"></a><a name="index-de-Meer_002c-H_002e-145"></a><a name="index-Trivedi_002c-K_002e-146"></a> <!-- MVA for single class, closed networks with load dependent servers --> <a name="doc_002dqnclosedsinglemvald"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-146"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-147"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvald-147"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvald</b> (<var>N, S, V, Z</var>)<var><a name="index-qnclosedsinglemvald-148"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-148"></a><a name="index-closed-network_002c-single-class-149"></a><a name="index-load_002ddependent-service-center-150"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-149"></a><a name="index-closed-network_002c-single-class-150"></a><a name="index-load_002ddependent-service-center-151"></a> Exact MVA algorithm for closed, single class queueing networks with load-dependent service centers. This function supports FCFS, LCFS-PR, PS and IS nodes. For networks with only fixed-rate @@ -3224,15 +3238,15 @@ 1998, Section 8.2.4.1, “Networks with Load-Deèpendent Service: Closed Networks”. - <p><a name="index-Bolch_002c-G_002e-151"></a><a name="index-Greiner_002c-S_002e-152"></a><a name="index-de-Meer_002c-H_002e-153"></a><a name="index-Trivedi_002c-K_002e-154"></a> + <p><a name="index-Bolch_002c-G_002e-152"></a><a name="index-Greiner_002c-S_002e-153"></a><a name="index-de-Meer_002c-H_002e-154"></a><a name="index-Trivedi_002c-K_002e-155"></a> <!-- CMVA for single class, closed networks with a single load dependent servers --> <a name="doc_002dqncmva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-155"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-156"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V</var>)<var><a name="index-qncmva-156"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qncmva</b> (<var>N, S, Sld, V, Z</var>)<var><a name="index-qncmva-157"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-157"></a><a name="index-CMVA-158"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-158"></a><a name="index-CMVA-159"></a> Implementation of the Conditional MVA (CMVA) algorithm, a numerically stable variant of MVA for load-dependent servers. CMVA is described in G. Casale, <cite>A Note on Stable Flow-Equivalent Aggregation in @@ -3286,19 +3300,19 @@ closed networks</cite>. Queueing Syst. Theory Appl., 60:193–202, December 2008. - <p><a name="index-Casale_002c-G_002e-159"></a> + <p><a name="index-Casale_002c-G_002e-160"></a> <!-- Approximate MVA for single class, closed networks --> <p><a name="doc_002dqnclosedsinglemvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-160"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-161"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-162"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-163"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-164"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedsinglemvaapprox-161"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedsinglemvaapprox-162"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedsinglemvaapprox-163"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedsinglemvaapprox-164"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedsinglemvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedsinglemvaapprox-165"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-165"></a><a name="index-Approximate-MVA-166"></a><a name="index-Closed-network_002c-single-class-167"></a><a name="index-Closed-network_002c-approximate-analysis-168"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-166"></a><a name="index-Approximate-MVA-167"></a><a name="index-Closed-network_002c-single-class-168"></a><a name="index-Closed-network_002c-approximate-analysis-169"></a> Analyze closed, single class queueing networks using the Approximate Mean Value Analysis (MVA) algorithm. This function is based on approximating the number of customers seen at center k when a @@ -3377,20 +3391,20 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 6.4.2.2 ("Approximate Solution Techniques"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-169"></a><a name="index-Zahorjan_002c-J_002e-170"></a><a name="index-Graham_002c-G_002e-S_002e-171"></a><a name="index-Sevcik_002c-K_002e-C_002e-172"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-170"></a><a name="index-Zahorjan_002c-J_002e-171"></a><a name="index-Graham_002c-G_002e-S_002e-172"></a><a name="index-Sevcik_002c-K_002e-C_002e-173"></a> <!-- MVA for multiple class, closed networks --> <p><a name="doc_002dqnclosedmultimva"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-173"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-174"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-175"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-176"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-177"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-178"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S </var>)<var><a name="index-qnclosedmultimva-174"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimva-175"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimva-176"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimva-177"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P</var>)<var><a name="index-qnclosedmultimva-178"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimva</b> (<var>N, S, P, m</var>)<var><a name="index-qnclosedmultimva-179"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-179"></a><a name="index-closed-network_002c-multiple-classes-180"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-180"></a><a name="index-closed-network_002c-multiple-classes-181"></a> Analyze closed, multiclass queueing networks with K service centers and C independent customer classes (chains) using the Mean Value Analysys (MVA) algorithm. @@ -3477,8 +3491,10 @@ defined as <var>U</var><code>(c,k) = </code><var>X</var><code>(c,k)*</code><var>S</var><code>(c,k)</code>. <br><dt><var>R</var><dd><var>R</var><code>(c,k)</code> is the class c response time at -center k. The total class c system response time -can be computed as <code>dot(</code><var>R</var><code>, </code><var>V</var><code>, 2)</code>. +center k. The class c <em>residence time</em> +at center k is <var>R</var><code>(c,k) * </code><var>C</var><code>(c,k)</code>. +The total class c system response time +is <code>dot(</code><var>R</var><code>, </code><var>V</var><code>, 2)</code>. <br><dt><var>Q</var><dd><var>Q</var><code>(c,k)</code> is the average number of class c requests at center k. The total number of @@ -3518,7 +3534,7 @@ Multichain Queuing Networks</cite>, Journal of the ACM, vol. 27, n. 2, April 1980, pp. 313–322. <a href="http://doi.acm.org/10.1145/322186.322195">http://doi.acm.org/10.1145/322186.322195</a> - <p><a name="index-Reiser_002c-M_002e-181"></a><a name="index-Lavenberg_002c-S_002e-S_002e-182"></a> + <p><a name="index-Reiser_002c-M_002e-182"></a><a name="index-Lavenberg_002c-S_002e-S_002e-183"></a> This implementation is based on G. Bolch, S. Greiner, H. de Meer and K. Trivedi, <cite>Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications</cite>, Wiley, @@ -3528,18 +3544,18 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 7.4.2.1 ("Exact Solution Techniques"). - <p><a name="index-Bolch_002c-G_002e-183"></a><a name="index-Greiner_002c-S_002e-184"></a><a name="index-de-Meer_002c-H_002e-185"></a><a name="index-Trivedi_002c-K_002e-186"></a><a name="index-Lazowska_002c-E_002e-D_002e-187"></a><a name="index-Zahorjan_002c-J_002e-188"></a><a name="index-Graham_002c-G_002e-S_002e-189"></a><a name="index-Sevcik_002c-K_002e-C_002e-190"></a> + <p><a name="index-Bolch_002c-G_002e-184"></a><a name="index-Greiner_002c-S_002e-185"></a><a name="index-de-Meer_002c-H_002e-186"></a><a name="index-Trivedi_002c-K_002e-187"></a><a name="index-Lazowska_002c-E_002e-D_002e-188"></a><a name="index-Zahorjan_002c-J_002e-189"></a><a name="index-Graham_002c-G_002e-S_002e-190"></a><a name="index-Sevcik_002c-K_002e-C_002e-191"></a> <!-- Approximate MVA, with Bard-Schweitzer approximation --> <a name="doc_002dqnclosedmultimvaapprox"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-191"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-192"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-193"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-194"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-195"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V</var>)<var><a name="index-qnclosedmultimvaapprox-192"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m</var>)<var><a name="index-qnclosedmultimvaapprox-193"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z</var>)<var><a name="index-qnclosedmultimvaapprox-194"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol</var>)<var><a name="index-qnclosedmultimvaapprox-195"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnclosedmultimvaapprox</b> (<var>N, S, V, m, Z, tol, iter_max</var>)<var><a name="index-qnclosedmultimvaapprox-196"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-196"></a><a name="index-Approximate-MVA-197"></a><a name="index-Closed-network_002c-multiple-classes-198"></a><a name="index-Closed-network_002c-approximate-analysis-199"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029_002c-approximate-197"></a><a name="index-Approximate-MVA-198"></a><a name="index-Closed-network_002c-multiple-classes-199"></a><a name="index-Closed-network_002c-approximate-analysis-200"></a> Analyze closed, multiclass queueing networks with K service centers and C customer classes using the approximate Mean Value Analysys (MVA) algorithm. @@ -3624,12 +3640,12 @@ proc. 4th Int. Symp. on Modelling and Performance Evaluation of Computer Systems, feb. 1979, pp. 51–62. - <p><a name="index-Bard_002c-Y_002e-200"></a> + <p><a name="index-Bard_002c-Y_002e-201"></a> P. Schweitzer, <cite>Approximate Analysis of Multiclass Closed Networks of Queues</cite>, Proc. Int. Conf. on Stochastic Control and Optimization, jun 1979, pp. 25–29. - <p><a name="index-Schweitzer_002c-P_002e-201"></a> + <p><a name="index-Schweitzer_002c-P_002e-202"></a> This implementation is based on Edward D. Lazowska, John Zahorjan, G. Scott Graham, and Kenneth C. Sevcik, <cite>Quantitative System Performance: Computer System Analysis Using Queueing Network Models</cite>, @@ -3640,7 +3656,7 @@ described above, as it computes the average response times R instead of the residence times. - <p><a name="index-Lazowska_002c-E_002e-D_002e-202"></a><a name="index-Zahorjan_002c-J_002e-203"></a><a name="index-Graham_002c-G_002e-S_002e-204"></a><a name="index-Sevcik_002c-K_002e-C_002e-205"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-203"></a><a name="index-Zahorjan_002c-J_002e-204"></a><a name="index-Graham_002c-G_002e-S_002e-205"></a><a name="index-Sevcik_002c-K_002e-C_002e-206"></a> <h4 class="subsection">6.3.5 Mixed Networks</h4> @@ -3648,9 +3664,9 @@ <p><a name="doc_002dqnmix"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmix</b> (<var>lambda, N, S, V, m</var>)<var><a name="index-qnmix-206"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmix</b> (<var>lambda, N, S, V, m</var>)<var><a name="index-qnmix-207"></a></var><br> <blockquote> - <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-207"></a><a name="index-mixed-network-208"></a> + <p><a name="index-Mean-Value-Analysys-_0028MVA_0029-208"></a><a name="index-mixed-network-209"></a> Solution of mixed queueing networks through MVA. The network consists of K service centers (single-server or delay centers) and C independent customer chains. Both open and closed chains @@ -3741,14 +3757,14 @@ Note that in this function we compute the mean response time R instead of the mean residence time as in the reference. - <p><a name="index-Lazowska_002c-E_002e-D_002e-209"></a><a name="index-Zahorjan_002c-J_002e-210"></a><a name="index-Graham_002c-G_002e-S_002e-211"></a><a name="index-Sevcik_002c-K_002e-C_002e-212"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-210"></a><a name="index-Zahorjan_002c-J_002e-211"></a><a name="index-Graham_002c-G_002e-S_002e-212"></a><a name="index-Sevcik_002c-K_002e-C_002e-213"></a> Herb Schwetman, <cite>Implementing the Mean Value Algorithm for the Solution of Queueing Network Models</cite>, Technical Report CSD-TR-355, Department of Computer Sciences, Purdue University, feb 15, 1982, available at <a href="http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-355.pdf">http://www.cs.purdue.edu/research/technical_reports/1980/TR%2080-355.pdf</a> - <p><a name="index-Schwetman_002c-H_002e-213"></a> + <p><a name="index-Schwetman_002c-H_002e-214"></a> <div class="node"> <a name="Algorithms-for-non-Product-form-QNs"></a> @@ -3767,9 +3783,9 @@ <p><a name="doc_002dqnmvablo"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmvablo</b> (<var>N, S, M, P</var>)<var><a name="index-qnmvablo-214"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmvablo</b> (<var>N, S, M, P</var>)<var><a name="index-qnmvablo-215"></a></var><br> <blockquote> - <p><a name="index-queueing-network-with-blocking-215"></a><a name="index-blocking-queueing-network-216"></a><a name="index-closed-network_002c-finite-capacity-217"></a> + <p><a name="index-queueing-network-with-blocking-216"></a><a name="index-blocking-queueing-network-217"></a><a name="index-closed-network_002c-finite-capacity-218"></a> MVA algorithm for closed queueing networks with blocking. <samp><span class="command">qnmvablo</span></samp> computes approximate utilization, response time and mean queue length for closed, single class queueing networks with blocking. @@ -3824,16 +3840,16 @@ Networks</cite>, IEEE Transactions on Software Engineering, vol. 14, n. 2, april 1988, pp. 418–428. <a href="http://dx.doi.org/10.1109/32.4663">http://dx.doi.org/10.1109/32.4663</a> - <p><a name="index-Akyildiz_002c-I_002e-F_002e-218"></a> + <p><a name="index-Akyildiz_002c-I_002e-F_002e-219"></a> <a name="doc_002dqnmarkov"></a> <div class="defun"> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P</var>)<var><a name="index-qnmarkov-219"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P, m</var>)<var><a name="index-qnmarkov-220"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P</var>)<var><a name="index-qnmarkov-221"></a></var><br> -— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P, m</var>)<var><a name="index-qnmarkov-222"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P</var>)<var><a name="index-qnmarkov-220"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>lambda, S, C, P, m</var>)<var><a name="index-qnmarkov-221"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P</var>)<var><a name="index-qnmarkov-222"></a></var><br> +— Function File: [<var>U</var>, <var>R</var>, <var>Q</var>, <var>X</var>] = <b>qnmarkov</b> (<var>N, S, C, P, m</var>)<var><a name="index-qnmarkov-223"></a></var><br> <blockquote> - <p><a name="index-closed-network_002c-multiple-classes-223"></a><a name="index-closed-network_002c-finite-capacity-224"></a><a name="index-blocking-queueing-network-225"></a><a name="index-RS-blocking-226"></a> + <p><a name="index-closed-network_002c-multiple-classes-224"></a><a name="index-closed-network_002c-finite-capacity-225"></a><a name="index-blocking-queueing-network-226"></a><a name="index-RS-blocking-227"></a> Compute utilization, response time, average queue length and throughput for open or closed queueing networks with finite capacity. Blocking type is Repetitive-Service (RS). This function explicitly @@ -3943,9 +3959,9 @@ <p><a name="doc_002dqnopenab"></a> <div class="defun"> -— Function File: [<var>Xu</var>, <var>Rl</var>] = <b>qnopenab</b> (<var>lambda, D</var>)<var><a name="index-qnopenab-227"></a></var><br> +— Function File: [<var>Xu</var>, <var>Rl</var>] = <b>qnopenab</b> (<var>lambda, D</var>)<var><a name="index-qnopenab-228"></a></var><br> <blockquote> - <p><a name="index-bounds_002c-asymptotic-228"></a><a name="index-open-network-229"></a> + <p><a name="index-bounds_002c-asymptotic-229"></a><a name="index-open-network-230"></a> Compute Asymptotic Bounds for single-class, open Queueing Networks with K service centers. @@ -3985,14 +4001,14 @@ 1984. <a href="http://www.cs.washington.edu/homes/lazowska/qsp/">http://www.cs.washington.edu/homes/lazowska/qsp/</a>. In particular, see section 5.2 ("Asymptotic Bounds"). - <p><a name="index-Lazowska_002c-E_002e-D_002e-230"></a><a name="index-Zahorjan_002c-J_002e-231"></a><a name="index-Graham_002c-G_002e-S_002e-232"></a><a name="index-Sevcik_002c-K_002e-C_002e-233"></a> + <p><a name="index-Lazowska_002c-E_002e-D_002e-231"></a><a name="index-Zahorjan_002c-J_002e-232"></a><a name="index-Graham_002c-G_002e-S_002e-233"></a><a name="index-Sevcik_002c-K_002e-C_002e-234"></a> <a name="doc_002dqnclosedab"></a> <div class="defun"> -— Function File: [<var>Xl</var>, <var>Xu</var>, <var>Rl</var>, <var>Ru</var>] = <b>qnclosedab</b> (<var>N, D</var>)<var><a name="index-qnclosedab-234"></a></var><br> -— Function File: [<var>Xl</var>, <var>Xu</var>, <var>Rl</var>, <var>Ru</var>] = <b>qnclosedab</b> (<var>N, D, Z</var>)<var><a name="index-qnclosedab-235"></a></var><br> +— Function File: [<var>Xl</var>, <var>Xu</var>, <var>Rl</var>, <var>Ru</var>] = <b>qnclosedab</b> (<var>N, D</var>)<var><a name="index-qnclosedab-235"></a></var><br> +— Function File: [<var>Xl</var>, <var>Xu</var>, <var>Rl</var>, <var>Ru</var>] = <b>qnclosedab</b> (<var>N, D, Z</var>)<var><a name="index-qnclosedab-236"></a></var><br> <blockquote> - <p><a name="index-bounds_002c-asymptotic-236"></a><a name="index-closed-network-237"></a> + <p><a name="index-bounds_002c-asymptotic-237"></a><a name="index-closed-network-238"></a> Compute Asymptotic Bounds for single-class, closed Queueing Networks wit... [truncated message content] |
From: <mma...@us...> - 2012-03-10 16:00:52
|
Revision: 9807 http://octave.svn.sourceforge.net/octave/?rev=9807&view=rev Author: mmarzolla Date: 2012-03-10 16:00:45 +0000 (Sat, 10 Mar 2012) Log Message: ----------- Bug fix and enhancements in ctmc_exps() Modified Paths: -------------- trunk/octave-forge/main/queueing/ChangeLog trunk/octave-forge/main/queueing/NEWS trunk/octave-forge/main/queueing/inst/ctmc_exps.m trunk/octave-forge/main/queueing/inst/ctmc_mtta.m Modified: trunk/octave-forge/main/queueing/ChangeLog =================================================================== --- trunk/octave-forge/main/queueing/ChangeLog 2012-03-10 12:44:08 UTC (rev 9806) +++ trunk/octave-forge/main/queueing/ChangeLog 2012-03-10 16:00:45 UTC (rev 9807) @@ -1,3 +1,13 @@ +2012-02-XX Moreno Marzolla <mar...@cs...> + + * Version 1.0.X released + * Fixed bug in qnvisits() which made the function behave incorrectly + under particular degenerate cases. + * Fixed bug in ctmc_exps() (wrong initial value in call to lsode) + * Function ctmc_exps() can now also compute the expected sojourn time + until absorption for absorbing CTMCs. + * Miscellaneous fixes/improvements to the documentation + 2012-02-04 Moreno Marzolla <mar...@cs...> * Version 1.0.0 released under the name "queueing" (initial Modified: trunk/octave-forge/main/queueing/NEWS =================================================================== --- trunk/octave-forge/main/queueing/NEWS 2012-03-10 12:44:08 UTC (rev 9806) +++ trunk/octave-forge/main/queueing/NEWS 2012-03-10 16:00:45 UTC (rev 9807) @@ -1,3 +1,8 @@ +Summary of important user-visible changes for queueing-1.0.X + +** Function ctmc_exps() can now compute the expected sojourn time + until absorption for absorming CTMC + Summary of important user-visible changes for queueing-1.0.0 ------------------------------------------------------------------------------ Modified: trunk/octave-forge/main/queueing/inst/ctmc_exps.m =================================================================== --- trunk/octave-forge/main/queueing/inst/ctmc_exps.m 2012-03-10 12:44:08 UTC (rev 9806) +++ trunk/octave-forge/main/queueing/inst/ctmc_exps.m 2012-03-10 16:00:45 UTC (rev 9807) @@ -17,24 +17,27 @@ ## -*- texinfo -*- ## -## @deftypefn {Function File} {@var{L} =} ctmc_exps (@var{Q}, @var{tt}, @var{p}) +## @deftypefn {Function File} {@var{L} =} ctmc_exps (@var{Q}, @var{tt}, @var{p} ) +## @deftypefnx {Function File} {@var{L} =} ctmc_exps (@var{Q}, @var{p}) ## ## @cindex Markov chain, continuous time ## @cindex Expected sojourn time ## -## Compute the expected total time @code{@var{L}(t,j)} spent in state -## @math{j} during the time interval @code{[0,@var{tt}(t))}, assuming -## that at time 0 the state occupancy probability was @var{p}. +## With three arguments, compute the expected time @code{@var{L}(t,j)} +## spent in each state @math{j} during the time interval +## @code{[0,@var{tt}(t))}, assuming that at time 0 the state occupancy +## probability was @var{p}. With two arguments, compute the expected +## time @code{@var{L}(j}} spent in each state @math{j} until absorption. ## ## @strong{INPUTS} ## ## @table @var ## ## @item Q -## Infinitesimal generator matrix. @code{@var{Q}(i,j)} is the transition -## rate from state @math{i} to state @math{j}, -## @math{1 @leq{} i \neq j @leq{} N}. The matrix @var{Q} must also satisfy the -## condition @code{sum(@var{Q},2) == 0} +## @math{N \times N} infinitesimal generator matrix. @code{@var{Q}(i,j)} +## is the transition rate from state @math{i} to state @math{j}, @math{1 +## @leq{} i \neq j @leq{} N}. The matrix @var{Q} must also satisfy the +## condition @math{\sum_{j=1}^N Q_{ij} = 0}. ## ## @item tt ## This parameter is a vector used for numerical integration. The first @@ -43,8 +46,9 @@ ## @math{[0,t)} of interest (@code{@var{tt}(end) == @math{t}}). ## ## @item p -## @code{@var{p}(i)} is the probability that at time 0 the system was in -## state @math{i}, for all @math{i = 1, @dots{}, N} +## Initial occupancy probability vector; @code{@var{p}(i)} is the +## probability the system is in state @math{i} at time 0, @math{i = 1, +## @dots{}, N} ## ## @end table ## @@ -53,8 +57,14 @@ ## @table @var ## ## @item L -## @code{@var{L}(t,j)} is the expected time spent in state @math{j} -## during the interval @code{[0,@var{tt}(t))}. @code{1 @leq{} @var{t} @leq{} length(@var{tt})} +## If this function is called with three arguments, @var{L} is a matrix +## of size @code{[length(@var{tt}), N]} where @code{@var{L}(t,j)} is the +## expected time spent in state @math{j} during the interval +## @code{[0,@var{tt}(t)]}. If this function is called with two +## arguments, @var{L} is a vector with @math{N} elements where +## @code{@var{L}(j)} is the expected time spent in state @math{j} until +## absorption, if @math{j} is a transient state. If @math{j} +## is an absorbing state, @code{@var{L}(j) = 0}. ## ## @end table ## @@ -63,11 +73,11 @@ ## Author: Moreno Marzolla <marzolla(at)cs.unibo.it> ## Web: http://www.moreno.marzolla.name/ -function L = ctmc_exps( Q, tt, p ) +function L = ctmc_exps( Q, varargin ) persistent epsilon = 10*eps; - if ( nargin != 3 ) + if ( nargin < 2 || nargin > 3 ) print_usage(); endif @@ -77,16 +87,56 @@ ( norm( sum(Q,2), "inf" ) < epsilon ) || \ error( "Q is not an infinitesimal generator matrix" ); + if ( nargin == 2 ) + p = varargin{1}; + else + tt = varargin{1}; + p = varargin{2}; + endif + ( isvector(p) && length(p) == size(Q,1) && all(p>=0) && abs(sum(p)-1.0)<epsilon ) || \ usage( "p must be a probability vector" ); - ( isvector(tt) && abs(tt(1)) < epsilon ) || \ - usage( "tt must be a vector, and tt(1) must be 0.0" ); - tt = tt(:)'; # make tt a row vector - p = p(:)'; # make p a row vector - ff = @(x,t) (x(:)'*Q+p); - fj = @(x,t) (Q); - L = lsode( {ff, fj}, p, tt ); + if ( nargin == 3 ) + ( isvector(tt) && abs(tt(1)) < epsilon ) || \ + usage( "tt must be a vector, and tt(1) must be 0.0" ); + tt = tt(:)'; # make tt a row vector + p = p(:)'; # make p a row vector + ff = @(x,t) (x(:)'*Q+p); + fj = @(x,t) (Q); + L = lsode( {ff, fj}, zeros(size(p)), tt ); + else +#{ + ## F(t) are the transient state occupancy probabilities at time t. + ## It is known that F(t) = p*expm(Q*t) (see function ctmc()). + ## The expected times spent in each state until absorption can + ## be computed as the integral of F(t) from t=0 to t=inf + F = @(t) (p*expm(Q*t)); ## FIXME: this must be restricted to transient states ONLY!!!! + + ## Since function quadv does not support infinite integration + ## limits, we define a new function G(u) = F(tan(pi/2*u)) such that + ## the integral of G(u) on [0,1] is the integral of F(t) on [0, + ## +inf]. + G = @(u) (F(tan(pi/2*u))*pi/2*(1+tan(pi/2*u)**2)); + + L = quadv(G,0,1); +#} + ## Find nonzero rows. Nonzero rows correspond to transient states, + ## while zero rows are absorbing states. If there are no zero rows, + ## then the Markov chain does not contain absorbing states and we + ## raise an error + N = rows(Q); + nzrows = find( any( abs(Q) > epsilon, 2 ) ); + if ( length( nzrows ) == N ) + error( "There are no absorbing states" ); + endif + + QN = Q(nzrows,nzrows); + pN = p(nzrows); + LN = -pN*inv(QN); + L = zeros(1,N); + L(nzrows) = LN; + endif endfunction %!demo @@ -99,10 +149,25 @@ %! tt = linspace(0,10,100); %! p0 = zeros(1,N); p0(1)=1; %! L = ctmc_exps(Q,tt,p0); +%! #L2 = 0*L; +%! #for i=1:length(tt) +%! # L2(i,:) = quadv( @(t) (p0*expm(Q*t)) , 0, tt(i) ); +%! #endfor %! plot( tt, L(:,1), ";State 1;", "linewidth", 2, \ +%! # tt, L2(:,1), "+;State 1 (quadv);", "markersize", 8, \ %! tt, L(:,2), ";State 2;", "linewidth", 2, \ %! tt, L(:,3), ";State 3;", "linewidth", 2, \ %! tt, L(:,4), ";State 4 (absorbing);", "linewidth", 2); %! legend("location","northwest"); %! xlabel("Time"); %! ylabel("Expected sojourn time"); + +%!demo +%! lambda = 0.5; +%! N = 4; +%! birth = lambda*linspace(1,N-1,N-1); +%! death = 0*birth; +%! Q = diag(birth,1)+diag(death,-1); +%! Q -= diag(sum(Q,2)); +%! p0 = zeros(1,N); p0(1)=1; +%! L = ctmc_exps(Q,p0) Modified: trunk/octave-forge/main/queueing/inst/ctmc_mtta.m =================================================================== --- trunk/octave-forge/main/queueing/inst/ctmc_mtta.m 2012-03-10 12:44:08 UTC (rev 9806) +++ trunk/octave-forge/main/queueing/inst/ctmc_mtta.m 2012-03-10 16:00:45 UTC (rev 9807) @@ -22,9 +22,10 @@ ## @cindex Markov chain, continuous time ## @cindex Mean time to absorption ## -## Compute the Mean-Time to Absorption (MTTA) starting from initial -## occupancy probability @var{p} at time 0. If there are no absorbing -## states, this function fails with an error. +## Compute the Mean-Time to Absorption (MTTA) of the CTMC described by +## the infinitesimal generator matrix @var{Q}, starting from initial +## occupancy probability @var{p}. If there are no absorbing states, this +## function fails with an error. ## ## @strong{INPUTS} ## @@ -76,18 +77,7 @@ ( isvector(p) && length(p) == N && all(p>=0) && abs(sum(p)-1.0)<epsilon ) || \ usage( "p must be a probability vector" ); - ## Find nonzero rows. Nonzero rows correspond to transient states, - ## while zero rows are absorbing states. If there are no zero rows, - ## then the Markov chain does not contain absorbing states and we - ## raise an error - nzrows = find( any( abs(Q) > epsilon, 2 ) ); - if ( length( nzrows ) == N ) - error( "There are no absorbing states" ); - endif - - QN = Q(nzrows,nzrows); - pN = p(nzrows); - L = -pN*inv(QN); + L = ctmc_exps(Q,p); t = sum(L); endfunction %!test @@ -122,7 +112,7 @@ %! death = [ 3 4 5 ] * mu; %! Q = diag(death,-1); %! Q -= diag(sum(Q,2)); -%! t = ctmc_mtta(Q,[0 0 0 1]) +%! [t L] = ctmc_mtta(Q,[0 0 0 1]) %!demo %! N = 100; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpi...@us...> - 2012-03-10 12:44:14
|
Revision: 9806 http://octave.svn.sourceforge.net/octave/?rev=9806&view=rev Author: jpicarbajal Date: 2012-03-10 12:44:08 +0000 (Sat, 10 Mar 2012) Log Message: ----------- signal: adding tolerance to test of transposed. Potntially a bug. Modified Paths: -------------- trunk/octave-forge/main/signal/inst/rceps.m Modified: trunk/octave-forge/main/signal/inst/rceps.m =================================================================== --- trunk/octave-forge/main/signal/inst/rceps.m 2012-03-10 12:40:15 UTC (rev 9805) +++ trunk/octave-forge/main/signal/inst/rceps.m 2012-03-10 12:44:08 UTC (rev 9806) @@ -73,8 +73,9 @@ %! x=randn(256,1); %! [y, xm] = rceps(x); %! [yt, xmt] = rceps(x.'); -%! assert(yt.', y); -%! assert(xmt.', xm); +%! tol = 1e-14; +%! assert(yt.', y, tol); +%! assert(xmt.', xm, tol); %!demo %! f0=70; Fs=10000; # 100 Hz fundamental, 10kHz sampling rate @@ -87,7 +88,7 @@ %! figure(1); %! subplot(311); %! auplot(x,Fs,'b',';signal;'); -%! hold on; auplot(xm,Fs,'g',';reconstruction;'); +%! hold on; auplot(xm,Fs,'g',';reconstruction;'); %! hold off; %! subplot(312); %! axis("ticy"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpi...@us...> - 2012-03-10 12:40:23
|
Revision: 9805 http://octave.svn.sourceforge.net/octave/?rev=9805&view=rev Author: jpicarbajal Date: 2012-03-10 12:40:15 +0000 (Sat, 10 Mar 2012) Log Message: ----------- signal: Applying patches from devian packaging group. Generator Rafael Laboissiere ra...@la... Modified Paths: -------------- trunk/octave-forge/main/signal/inst/filtfilt.m trunk/octave-forge/main/signal/inst/fir1.m trunk/octave-forge/main/signal/inst/fir2.m trunk/octave-forge/main/signal/inst/impinvar.m trunk/octave-forge/main/signal/inst/invimpinvar.m trunk/octave-forge/main/signal/inst/residued.m Modified: trunk/octave-forge/main/signal/inst/filtfilt.m =================================================================== --- trunk/octave-forge/main/signal/inst/filtfilt.m 2012-03-10 04:18:08 UTC (rev 9804) +++ trunk/octave-forge/main/signal/inst/filtfilt.m 2012-03-10 12:40:15 UTC (rev 9805) @@ -105,11 +105,11 @@ %! y = filtfilt(b, a, r+s); %! assert (size(r), size(y)); %! assert (mean(abs(y)) < 1e3); -%! assert (corrcoef(s(250:750), y(250:750)) > .95) +%! assert (corr(s(250:750), y(250:750)) > .95) %! [b,a] = butter(2, [4e-4 8e-2]); %! yb = filtfilt(b, a, r+s); %! assert (mean(abs(yb)) < 1e3); -%! assert (corrcoef(y, yb) > .99) +%! assert (corr(y, yb) > .99) %!test %! randn('state',0); Modified: trunk/octave-forge/main/signal/inst/fir1.m =================================================================== --- trunk/octave-forge/main/signal/inst/fir1.m 2012-03-10 04:18:08 UTC (rev 9804) +++ trunk/octave-forge/main/signal/inst/fir1.m 2012-03-10 12:40:15 UTC (rev 9805) @@ -92,7 +92,7 @@ if rem(n,2)==1 && m(2*bands)==1, warning("n must be even for highpass and bandstop filters. Incrementing."); n = n+1; - if isvector(window) && isreal(window) + if isvector(window) && isreal(window) && !ischar(window) ## Extend the window using interpolation M = length(window); if M == 1, Modified: trunk/octave-forge/main/signal/inst/fir2.m =================================================================== --- trunk/octave-forge/main/signal/inst/fir2.m 2012-03-10 04:18:08 UTC (rev 9804) +++ trunk/octave-forge/main/signal/inst/fir2.m 2012-03-10 12:40:15 UTC (rev 9805) @@ -72,7 +72,7 @@ if length(ramp_n)>1, w=ramp_n; ramp_n=grid_n/20; endif if nargin < 6, window=w; endif if isempty(window), window=hamming(n+1); endif - if !isreal(window), window=feval(window, n+1); endif + if !isreal(window) || ischar(window), window=feval(window, n+1); endif if length(window) != n+1, usage("window must be of length n+1"); endif ## make sure grid is big enough for the window Modified: trunk/octave-forge/main/signal/inst/impinvar.m =================================================================== --- trunk/octave-forge/main/signal/inst/impinvar.m 2012-03-10 04:18:08 UTC (rev 9804) +++ trunk/octave-forge/main/signal/inst/impinvar.m 2012-03-10 12:40:15 UTC (rev 9805) @@ -123,7 +123,7 @@ %! %! % calculate impulse response of continuous time system %! % at discrete time intervals 1/fs -%! ys=impulse(s,1,(n-1)/fs,n); +%! ys=impulse(s,(n-1)/fs,1/fs)'; %! %! % impulse response of discrete time system %! yz=filter(bz,az,[1 zeros(1,n-1)]); Modified: trunk/octave-forge/main/signal/inst/invimpinvar.m =================================================================== --- trunk/octave-forge/main/signal/inst/invimpinvar.m 2012-03-10 04:18:08 UTC (rev 9804) +++ trunk/octave-forge/main/signal/inst/invimpinvar.m 2012-03-10 12:40:15 UTC (rev 9805) @@ -126,7 +126,7 @@ %! %! % calculate impulse response of continuous time system %! % at discrete time intervals 1/fs -%! ys=impulse(s,1,(n-1)/fs,n); +%! ys=impulse(s,(n-1)/fs,1/fs)'; %! %! % impulse response of discrete time system %! yz=filter(bz,az,[1 zeros(1,n-1)]); Modified: trunk/octave-forge/main/signal/inst/residued.m =================================================================== --- trunk/octave-forge/main/signal/inst/residued.m 2012-03-10 04:18:08 UTC (rev 9804) +++ trunk/octave-forge/main/signal/inst/residued.m 2012-03-10 12:40:15 UTC (rev 9805) @@ -15,9 +15,9 @@ %% -*- texinfo -*- %% @deftypefn {Function File} {[@var{r}, @var{p}, @var{f}, @var{m}] =} residued (@var{B}, @var{A}) -%% Compute the partial fraction expansion (PFE) of filter +%% Compute the partial fraction expansion (PFE) of filter %% @math{H(z) = B(z)/A(z)}. -%% In the usual PFE function @code{residuez}, +%% In the usual PFE function @code{residuez}, %% the IIR part (poles @var{p} and residues %% @var{r}) is driven @emph{in parallel} with the FIR part (@var{f}). %% In this variant (@code{residued}) the IIR part is driven @@ -26,7 +26,7 @@ %% %% INPUTS: %% @var{B} and @var{A} are vectors specifying the digital filter @math{H(z) = B(z)/A(z)}. -%% Say @code{help filter} for documentation of the @var{B} and @var{A} +%% Say @code{help filter} for documentation of the @var{B} and @var{A} %% filter coefficients. %% %% RETURNED: @@ -42,9 +42,9 @@ %% Say @code{test residued verbose} to see a number of examples. %% @end example %% -%% For the theory of operation, see +%% For the theory of operation, see %% @indicateurl{http://ccrma.stanford.edu/~jos/filters/residued.html} -%% +%% %% @seealso{residue residued} %% @end deftypefn @@ -60,21 +60,21 @@ % % This is the same result as returned by RESIDUEZ. % Otherwise, the FIR part f will be nonempty, - % and the returned filter is + % and the returned filter is % % H(z) = f(1) + f(2)/z + f(3)/z^2 + ... + f(nf)/z^M + R(z)/z^M % % where R(z) is the parallel one-pole filter bank defined above, % and M is the order of F(z) = length(f)-1 = nb-na. - % + % % Note, in particular, that the impulse-response of the parallel % (complex) one-pole filter bank starts AFTER that of the the FIR part. % In the result returned by RESIDUEZ, R(z) is not divided by z^M, % so its impulse response starts at time 0 in parallel with f(n). % % J.O. Smith, 9/19/05 - - if nargin==3, + + if nargin==3, warning("tolerance ignored"); end NUM = b(:)'; @@ -91,7 +91,7 @@ if f2, error('f2 not empty as expected'); end end -%!test +%!test %! B=1; A=[1 -1]; %! [r,p,f,m] = residued(B,A); %! assert({r,p,f,m},{1,1,[],1},100*eps); @@ -99,38 +99,38 @@ %! assert({r,p,f,m},{r2,p2,f2,m2},100*eps); % residuez and residued should be identical when length(B)<length(A) -%!test +%!test %! B=[1 -2 1]; A=[1 -1]; %! [r,p,f,m] = residued(B,A); %! assert({r,p,f,m},{0,1,[1 -1],1},100*eps); -%!test +%!test %! B=[1 -2 1]; A=[1 -0.5]; %! [r,p,f,m] = residued(B,A); %! assert({r,p,f,m},{0.25,0.5,[1 -1.5],1},100*eps); -%!test +%!test %! B=1; A=[1 -0.75 0.125]; %! [r,p,f,m] = residued(B,A); %! [r2,p2,f2,m2] = residuez(B,A); %! assert({r,p,f,m},{r2,p2,f2,m2},100*eps); % residuez and residued should be identical when length(B)<length(A) -%!test +%!test %! B=1; A=[1 -2 1]; %! [r,p,f,m] = residued(B,A); %! [r2,p2,f2,m2] = residuez(B,A); %! assert({r,p,f,m},{r2,p2,f2,m2},100*eps); % residuez and residued should be identical when length(B)<length(A) -%!test +%!test %! B=[6,2]; A=[1 -2 1]; %! [r,p,f,m] = residued(B,A); %! [r2,p2,f2,m2] = residuez(B,A); %! assert({r,p,f,m},{r2,p2,f2,m2},100*eps); % residuez and residued should be identical when length(B)<length(A) -%!test +%!test %! B=[1 1 1]; A=[1 -2 1]; %! [r,p,f,m] = residued(B,A); %! assert(r,[0;3],1e-7); @@ -138,7 +138,7 @@ %! assert(f,1,100*eps); %! assert(m,[1;2],100*eps); -%!test +%!test %! B=[2 6 6 2]; A=[1 -2 1]; %! [r,p,f,m] = residued(B,A); %! assert(r,[8;16],3e-7); @@ -146,7 +146,7 @@ %! assert(f,[2,10],100*eps); %! assert(m,[1;2],100*eps); -%!test +%!test %! B=[1,6,2]; A=[1 -2 1]; %! [r,p,f,m] = residued(B,A); %! assert(r,[-1;9],3e-7); @@ -154,8 +154,8 @@ %! assert(f,1,100*eps); %! assert(m,[1;2],100*eps); -%!test +%!test %! B=[1 0 0 0 1]; A=[1 0 0 0 -1]; %! [r,p,f,m] = residued(B,A); -%! assert({r,p,f,m},{[-1/2;1/2;-j/2;j/2],[-1;1;-j;j],1,[1;1;1;1]},100*eps); +%! assert({r,p,f,m},{[-j/2;j/2;1/2;-1/2],[-j;j;1;-1],1,[1;1;1;1]},100*eps); % Verified in maxima: ratsimp(%I/2/(1-%I * d) - %I/2/(1+%I * d)); etc. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpi...@us...> - 2012-03-10 04:18:15
|
Revision: 9804 http://octave.svn.sourceforge.net/octave/?rev=9804&view=rev Author: jpicarbajal Date: 2012-03-10 04:18:08 +0000 (Sat, 10 Mar 2012) Log Message: ----------- geometry: write points in mesh file with higher resolution Modified Paths: -------------- trunk/octave-forge/main/geometry/inst/io/private/pointGeo.m Modified: trunk/octave-forge/main/geometry/inst/io/private/pointGeo.m =================================================================== --- trunk/octave-forge/main/geometry/inst/io/private/pointGeo.m 2012-03-09 20:03:49 UTC (rev 9803) +++ trunk/octave-forge/main/geometry/inst/io/private/pointGeo.m 2012-03-10 04:18:08 UTC (rev 9804) @@ -1,5 +1,5 @@ %% Copyright (c) 2010 Juan Pablo Carbajal <car...@if...> -%% +%% %% This program is free software: you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation, either version 3 of the License, or @@ -17,9 +17,9 @@ %% @deftypefn {Function File} @var{str} = poointGeo (@var{n}, @var{xyz}, @var{l}) %% Generates a string for Gmsh Point format. %% -%% Gmsh's simplest `elementary entity', a `Point'. A Point is defined by a list -%% of five numbers: @var{n} the identificator, @var{xyz} three coordinates (X, Y -%% and Z), and a characteristic length @var{l} that sets the target element size +%% Gmsh's simplest `elementary entity', a `Point'. A Point is defined by a list +%% of five numbers: @var{n} the identificator, @var{xyz} three coordinates (X, Y +%% and Z), and a characteristic length @var{l} that sets the target element size %% at the point: %% The distribution of the mesh element sizes is then obtained by %% interpolation of these characteristic lengths throughout the @@ -28,5 +28,5 @@ %% @end deftypefn function str = pointGeo(n,xyz,l) - str = sprintf('Point(%d) = {%f,%f,%f,%f};\n',n,xyz,l); + str = sprintf('Point(%d) = {%.16g,%.16g,%.16g,%.16g};\n',n,xyz,l); end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sch...@us...> - 2012-03-09 20:03:56
|
Revision: 9803 http://octave.svn.sourceforge.net/octave/?rev=9803&view=rev Author: schloegl Date: 2012-03-09 20:03:49 +0000 (Fri, 09 Mar 2012) Log Message: ----------- explain relationship to corrcoef in help text Modified Paths: -------------- trunk/octave-forge/extra/NaN/inst/cov.m Property Changed: ---------------- trunk/octave-forge/extra/NaN/inst/cov.m Modified: trunk/octave-forge/extra/NaN/inst/cov.m =================================================================== --- trunk/octave-forge/extra/NaN/inst/cov.m 2012-03-09 16:13:10 UTC (rev 9802) +++ trunk/octave-forge/extra/NaN/inst/cov.m 2012-03-09 20:03:49 UTC (rev 9803) @@ -4,6 +4,14 @@ % NaN's are skipped, NaN do not result in a NaN output. % The output gives NaN only if there are insufficient input data % The mean is removed from the data. +% +% Remark: for data contains missing values, the resulting +% matrix might not be positiv definite, and its elements have magnitudes +% larger than one. This ill-behavior is more likely for small sample +% sizes, but there is no garantee that the result "behaves well" for larger +% sample sizes. If you want the a "well behaved" result (i.e. positive +% definiteness and magnitude of elements not larger than 1), use CORRCOEF. +% However, COV is faster than CORRCOEF and might be good enough in some cases. % % C = COV(X [,Mode]); % calculates the (auto-)correlation matrix of X @@ -26,7 +34,7 @@ % http://mathworld.wolfram.com/Covariance.html % $Id$ -% Copyright (C) 2000-2003,2005,2009 by Alois Schloegl <alo...@gm...> +% Copyright (C) 2000-2003,2005,2009,2011,2012 by Alois Schloegl <alo...@is...> % This function is part of the NaN-toolbox % http://pub.ist.ac.at/~schloegl/matlab/NaN/ Property changes on: trunk/octave-forge/extra/NaN/inst/cov.m ___________________________________________________________________ Modified: svn:keywords - Id Revision + Id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2012-03-09 16:13:16
|
Revision: 9802 http://octave.svn.sourceforge.net/octave/?rev=9802&view=rev Author: paramaniac Date: 2012-03-09 16:13:10 +0000 (Fri, 09 Mar 2012) Log Message: ----------- quaternion_oo: enable subsref stuff like q(1:2,2).w(2) Modified Paths: -------------- trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/subsref.m Modified: trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/subsref.m =================================================================== --- trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/subsref.m 2012-03-09 11:51:33 UTC (rev 9801) +++ trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/subsref.m 2012-03-09 16:13:10 UTC (rev 9802) @@ -1,4 +1,4 @@ -## Copyright (C) 2010, 2011 Lukas F. Reichlin +## Copyright (C) 2010, 2011, 2012 Lukas F. Reichlin ## ## This program is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -18,10 +18,15 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: May 2010 -## Version: 0.3 +## Version: 0.4 function ret = subsref (q, s) + if (numel (s) == 0) + ret = q; + return; + endif + switch (s(1).type) case "." # q.w switch (tolower (s(1).subs)) @@ -41,11 +46,12 @@ endswitch case "()" # q(...) - w = subsref (q.w, s); - x = subsref (q.x, s); - y = subsref (q.y, s); - z = subsref (q.z, s); - ret = quaternion (w, x, y, z); + w = subsref (q.w, s(1)); + x = subsref (q.x, s(1)); + y = subsref (q.y, s(1)); + z = subsref (q.z, s(1)); + tmp = quaternion (w, x, y, z); + ret = subsref (tmp, s(2:end)); otherwise error ("quaternion: invalid subscript type '%s'", s(1).type); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpi...@us...> - 2012-03-09 11:51:44
|
Revision: 9801 http://octave.svn.sourceforge.net/octave/?rev=9801&view=rev Author: jpicarbajal Date: 2012-03-09 11:51:33 +0000 (Fri, 09 Mar 2012) Log Message: ----------- miscellaneous: Ready for release...i guess. Added note on coypright and removed old code Modified Paths: -------------- trunk/octave-forge/main/miscellaneous/inst/map.m Modified: trunk/octave-forge/main/miscellaneous/inst/map.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-09 11:21:27 UTC (rev 9800) +++ trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-09 11:51:33 UTC (rev 9801) @@ -1,6 +1,7 @@ ## Copyright (C) 2003 Tomer Altman <ta...@lb...> ## Copyright (C) 2007 Muthiah Annamalai <mut...@ma...> ## Copyright (C) 2012 Carnë Draug <car...@gm...> +## Copyright (C) 2012 Juan Pablo Carbajal <car...@if...> ## ## This program is free software; you can redistribute it and/or modify it under ## the terms of the GNU General Public License as published by the Free Software @@ -75,59 +76,10 @@ error ("fun_handle must either be a function handle or the name of a function"); endif -# nRows = rows (data_struct); -# nCols = columns (data_struct); - -# otherdata = length (varargin); -# val = cell (1, otherdata+1); -# val (:) = 0; - if (iscell (data_struct)) -# KaKiLa Fri 09 Mar 2012 09:47:52 AM CET -# Works even if varargin is empty return_type = cellfun (fun_handle, data_struct,varargin{:}); -# return_type = cell (nRows, nCols); -# if (otherdata >= 1) -# return_type = cellfun (fun_handle, data_struct,varargin{:}); -# for i = 1:nRows -# for j = 1:nCols -# val {1} = data_struct {i, j}; -# for idx = 2:otherdata+1 -# val {idx} = varargin {idx-1}{i,j}; -# endfor -# return_type {i,j} = apply (fun_handle, val); -# endfor -# endfor -# else -# return_type = cellfun (fun_handle, data_struct); -# for i = 1:nRows -# for j = 1:nCols -# return_type {i,j} = fun_handle (data_struct {i,j}); -# endfor -# endfor -# endif else -# KaKiLa Fri 09 Mar 2012 09:47:52 AM CET -# Works even if varargin is empty return_type = arrayfun (fun_handle, data_struct,varargin{:}); -# return_type = zeros (nRows, nCols); -# if (otherdata >= 1) -# for i = 1:nRows -# for j = 1:nCols -# val {1} = data_struct (i,j); -# for idx = 2:otherdata+1 -# val {idx} = varargin {idx-1}(i,j); -# endfor -# return_type (i, j) = apply (fun_handle, val); -# endfor -# endfor -# else -# for i = 1:nRows -# for j = 1:nCols -# return_type (i, j) = fun_handle (data_struct (i, j)); -# endfor -# endfor -# endif endif endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mic...@us...> - 2012-03-09 11:21:34
|
Revision: 9800 http://octave.svn.sourceforge.net/octave/?rev=9800&view=rev Author: michelemartone Date: 2012-03-09 11:21:27 +0000 (Fri, 09 Mar 2012) Log Message: ----------- sparsersb: update to the octave-sparsersb (same matrix) benchmarking script; added a comment in the .cc file. Modified Paths: -------------- trunk/octave-forge/main/sparsersb/src/octavebench.m trunk/octave-forge/main/sparsersb/src/sparsersb.cc Modified: trunk/octave-forge/main/sparsersb/src/octavebench.m =================================================================== --- trunk/octave-forge/main/sparsersb/src/octavebench.m 2012-03-09 09:03:26 UTC (rev 9799) +++ trunk/octave-forge/main/sparsersb/src/octavebench.m 2012-03-09 11:21:27 UTC (rev 9800) @@ -1,7 +1,16 @@ #!/usr/bin/octave -q # a benchmark program for octave/matlab +# TODO: fix output format +# TODO: correct symmetric / hermitian matrices handling +# TODO: sound, time-and-runs-based benchmarking criteria + n=10; +function printbenchline(matrixname,opname,sw,times,nnz,tottime,mxxops,bpnz,msstr) + printf("FIXME (temporary format)\n"); + printf("%s %s %s %d %d %.4f %10.2f %.4f %s\n",matrixname,opname,sw,times,nnz,tottime,mxxops,bpnz,msstr); +end + if nargin <= 0 # DGEMV benchmark for o=1024:1024 @@ -27,36 +36,67 @@ #matrices=ls("*.mtx")'; f=1; +uc=2; while f<=nargin MB=1024*1024; mmn=cell2mat(argv()(f))'; mn=strtrim(mmn'); tic(); - nm=mmread(mn); + #nm=mmread(mn); + [nm,nrows,ncols,entries,rep,field,symm]=mmread(mn); + #if(symm=="symmetric")uc+=2;endif + if(strcmp(symm,"symmetric"))uc+=1;endif fsz=stat(mn).size; - rnz=nnz(nm); rt=toc(); [ia,ja,va]=find(nm); - printf("%s: %.2f MBytes read in %.4f s (%10.2f MB/s)\n",mn',fsz/MB,rt,fsz/(rt*MB)); + printf("%s: %.2f MBytes read by mmread in %.4f s (%10.2f MB/s)\n",mn',fsz/MB,rt,fsz/(rt*MB)); #ia=ia'; ja=ja'; va=va'; -for ski=1:2 +for ski=1:uc + oppnz=1; # FIXME: what about symmetry ? sparsekw="sparse"; if(ski==2)sparsekw="sparsersb";endif + if(ski==3); + oppnz=2; + sparsekw="sparsersb"; + tic(); [nm]=sparsersb(mn); rt=toc(); + sparsersb(nm,"info") + printf("%s: %.2f MBytes read by librsb in %.4f s (%10.2f MB/s)\n",mn',fsz/MB,rt,fsz/(rt*MB)); + endif + if(ski==4); + nm=tril(nm); + endif + [ia,ja,va]=find(nm); + rnz=nnz(nm); + printf("benchmarking %s\n",sparsekw); + #printf("symmetry ? %s\n",issymmetric(sparse(nm))); mrc=rows(nm); mcc=columns(nm); + + + if(ski!=3); tic(); eval(["for i=1:n; om=",sparsekw,"(ia,ja,va,mrc,mcc,\"summation\"); end"]); + printf("benchmarking %s\n",sparsekw); at=toc(); mnz=nnz(om); amflops=n*2.0*mnz/(10^6 * at); printf("%s (%s) %d spBLD for %d nnz in %.4f secs, so %10.2f Mflops\n",mn',sparsekw,n,rnz,at,amflops); + else + mnz=rnz; + end + #rm=sparsersb(ia,ja,va);# UNFINISHED r=v=linspace(1,1,size(om,1))'; tic(); for i=1:n; r+=om *v; end; umt=toc(); - UMflops=n*2.0*mnz/(10^6 * umt); + UMflops=oppnz*n*2.0*mnz/(10^6 * umt); printf("%s (%s) %d spMV for %d nnz in %.4f secs, so %10.2f Mflops\n",mn',sparsekw,n,mnz,umt, UMflops); + bpnz=-1; # FIXME: bytes per nonzero! + msstr="?";# FIXME: matrix structure string! + # FIXME: finish the following! + #printbenchline(mn',"spMV",sparsekw,n,mnz,umt, UMflops,bpnz,msstr); + # tic(); for i=1:n; r+=om.'*v; end; tmt=toc(); - TMflops=n*2.0*mnz/(10^6 * tmt); + TMflops=oppnz*n*2.0*mnz/(10^6 * tmt); printf("%s (%s) %d spMVT for %d nnz in %.4f secs, so %10.2f Mflops\n",mn',sparsekw,n,mnz,tmt, TMflops); end ++f; Modified: trunk/octave-forge/main/sparsersb/src/sparsersb.cc =================================================================== --- trunk/octave-forge/main/sparsersb/src/sparsersb.cc 2012-03-09 09:03:26 UTC (rev 9799) +++ trunk/octave-forge/main/sparsersb/src/sparsersb.cc 2012-03-09 11:21:27 UTC (rev 9800) @@ -45,6 +45,7 @@ * error reporting is insufficient * elemental division support for complex matrices is incomplete * shall update to symmetric be forbidden or rather trigger a conversion ? + * after file read, shall return various structural info * * Developer notes: /usr/share/doc/octave3.2-htmldoc//interpreter/Getting-Started-with-Oct_002dFiles.html#Getting-Started-with-Oct_002dFiles This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpi...@us...> - 2012-03-09 09:03:32
|
Revision: 9799 http://octave.svn.sourceforge.net/octave/?rev=9799&view=rev Author: jpicarbajal Date: 2012-03-09 09:03:26 +0000 (Fri, 09 Mar 2012) Log Message: ----------- miscellaneous: removed apply from @seealso in doc Modified Paths: -------------- trunk/octave-forge/main/miscellaneous/inst/map.m Modified: trunk/octave-forge/main/miscellaneous/inst/map.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-09 09:02:26 UTC (rev 9798) +++ trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-09 09:03:26 UTC (rev 9799) @@ -56,7 +56,7 @@ ## [2,2] = 0.84645 ## @} ## @end example -## @seealso{reduce, match, apply} +## @seealso{reduce, match} ## @end deftypefn function return_type = map (fun_handle, data_struct, varargin) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jpi...@us...> - 2012-03-09 09:02:37
|
Revision: 9798 http://octave.svn.sourceforge.net/octave/?rev=9798&view=rev Author: jpicarbajal Date: 2012-03-09 09:02:26 +0000 (Fri, 09 Mar 2012) Log Message: ----------- miscellaneous: commenting details Modified Paths: -------------- trunk/octave-forge/main/miscellaneous/inst/map.m Modified: trunk/octave-forge/main/miscellaneous/inst/map.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-09 08:55:13 UTC (rev 9797) +++ trunk/octave-forge/main/miscellaneous/inst/map.m 2012-03-09 09:02:26 UTC (rev 9798) @@ -75,12 +75,12 @@ error ("fun_handle must either be a function handle or the name of a function"); endif - nRows = rows (data_struct); - nCols = columns (data_struct); +# nRows = rows (data_struct); +# nCols = columns (data_struct); - otherdata = length (varargin); - val = cell (1, otherdata+1); - val (:) = 0; +# otherdata = length (varargin); +# val = cell (1, otherdata+1); +# val (:) = 0; if (iscell (data_struct)) # KaKiLa Fri 09 Mar 2012 09:47:52 AM CET This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |