LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Loading...
Searching...
No Matches
mmpp2_fit3.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2026, QORE Lab, Imperial College London
3 * All rights reserved.
4 */
5#ifndef LINE_API_MAM_MMPP2_FIT3_H
6#define LINE_API_MAM_MMPP2_FIT3_H
7
8/**
9 * @file
10 * @ingroup api_mam
11 * MMPP(2) matching three moments and the autocorrelation decay rate
12 * (matlab/lib/kpctoolbox/mmpp/mmpp2_fit3.m).
13 *
14 * G2 is the constant ratio rho(i)/rho(i-1) of consecutive lag
15 * autocorrelations. The reference is a symbolic-toolbox solution of the
16 * moment-matching system, so the four parameters mu00, mu11, q01, q10 are
17 * single rational expressions in E1, E3, SCV and G2 over the moment
18 * discriminant. They are transcribed verbatim here, with the three repeated
19 * subexpressions named:
20 *
21 * DISC = the discriminant polynomial under the square root,
22 * SQ = sqrt(DISC),
23 * pw(x, k) = x^k.
24 *
25 * A vanishing G2 degenerates to an uncorrelated MAP(1)-style fit (mu11 = 0),
26 * which the reference handles with its own closed form; that branch is
27 * reproduced exactly, including the g2tol threshold below which it fires.
28 *
29 * The resulting representation is
30 * D0 = [ -mu00-q01 q01 ; q10 -mu11-q10 ], D1 = diag(mu00, mu11).
31 *
32 * Gated on transcendental arithmetic: SQ is a square root of a moment
33 * discriminant with no exact rational counterpart.
34 */
35
38#include "line/num/number.h"
39#include "line/util/error.h"
40#include "line/util/matrix.h"
41
42namespace line {
43namespace mam {
44
45/**
46 * MMPP(2) with moments (E1, E2, E3) and autocorrelation decay rate G2.
47 * g2tol is the threshold below which the uncorrelated branch is taken
48 * (MATLAB uses 1e-6).
49 */
50template <class T>
51Map<T> mmpp2_fit3(const T& E1, const T& E2, const T& E3, const T& G2, const T& g2tol) {
53 "mmpp2_fit3 requires transcendental arithmetic");
54 using fitdetail::num_sqrt;
55 using fitdetail::pw;
56
57 const T zero = num_traits<T>::from_int(0);
58 if (E1 == zero) throw InputError("mmpp2_fit3: zero first moment");
59 const T SCV = (E2 - E1 * E1) / (E1 * E1);
60
61 T mu00, mu11, q01, q10;
62 if (G2 < g2tol || G2 == zero) {
63 mu00 = 2*(6*pw(E1,3)*SCV-E3)/E1/(6*pw(E1,3)*SCV+3*pw(E1,3)*pw(SCV,2)+3*pw(E1,3)-2*E3);
64 mu11 = zero;
65 q01 = 9*pw(E1,5)*(SCV-1)*(pw(SCV,2)-2*SCV+1)/(6*pw(E1,3)*SCV-E3)/(6*pw(E1,3)*SCV+3*pw(E1,3)*pw(SCV,2)+
66 3*pw(E1,3)-2*E3);
67 q10 = -3*(SCV-1)*pw(E1,2)/(6*pw(E1,3)*SCV-E3);
68 } else {
69 const T DISC = (pw(E3,2)-12*pw(E1,3)*SCV*E3+6*pw(E1,3)*G2*E3-6*G2*SCV*pw(E1,3)*E3+18*G2*pw(SCV,3)*pw(E1,6)-
70 18*pw(E1,6)*G2*pw(SCV,2)+9*pw(E1,6)*pw(G2,2)+36*pw(E1,6)*pw(SCV,2)+18*pw(E1,6)*G2*SCV-18*pw(E1,6)*
71 SCV*pw(G2,2)+9*pw(E1,6)*pw(SCV,2)*pw(G2,2)-18*pw(E1,6)*G2);
72 if (DISC < zero) throw NumericError("mmpp2_fit3: negative moment discriminant");
73 const T SQ = num_sqrt(DISC);
74 mu00 = G2*(-4*E3*G2+4*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-
75 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3*G2-18*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
76 SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2-18*pw(E1,3)*(-3*pw(E1,3)*
77 G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
78 2*E3)*G2*pw(SCV,2)-12*pw(E1,3)*pw(G2,2)-12*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
79 SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,2)*SCV+12*pw(E1,3)*
80 (-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-
81 3*pw(E1,3)+2*E3)*G2*SCV+12*pw(E1,3)*G2*pw(SCV,2)-9*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-
82 6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*SCV+3*pw(E1,3)*
83 (-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-
84 3*pw(E1,3)+2*E3)+12*pw(E1,3)*pw(G2,2)*SCV+9*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
85 SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(SCV,2)+12*pw(E1,3)*G2+
86 12*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-
87 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,2)-3*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
88 SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(SCV,3))/(12*pw(E1,3)*pw(G2,3)*
89 SCV+3*pw(E1,3)*pw(SCV,3)*G2-12*pw(E1,3)*pw(G2,3)+18*pw(E1,3)*pw(G2,2)*pw(SCV,2)-3*pw(E1,3)*
90 G2+27*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-
91 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2*pw(SCV,2)-9*pw(E1,3)*G2*pw(SCV,2)+18*pw(E1,3)*pw(G2,2)-12*
92 pw(E1,3)*pw(G2,2)*SCV+9*pw(E1,3)*G2*SCV-12*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
93 SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,3)*SCV-9*pw(E1,3)*(-
94 3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-
95 3*pw(E1,3)+2*E3)*pw(SCV,3)*G2-24*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+
96 E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,2)*pw(SCV,2)-(-3*pw(E1,3)*
97 G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
98 2*E3)*E3*pw(SCV,2)+4*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-
99 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3*pw(G2,2)+12*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*
100 pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,3)-(-3*pw(E1,3)*
101 G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
102 2*E3)*E3+2*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*
103 pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3*SCV+9*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
104 SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2+24*pw(E1,3)*(-3*pw(E1,3)*
105 G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
106 2*E3)*pw(G2,2)*SCV-27*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*
107 pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2*SCV+6*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*
108 G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*SCV-12*
109 pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*
110 SCV-3*pw(E1,3)+2*E3)*pw(SCV,2)-24*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+
111 E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,2)+6*pw(E1,3)*(-3*pw(E1,3)*
112 G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
113 2*E3)*pw(SCV,3)-4*E3*pw(G2,2))/E1;
114 mu11 = (-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/E1/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*
115 SCV-3*pw(E1,3)+2*E3);
116 q01 = -3*pw(E1,2)*(-6*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*
117 pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*SCV+12*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
118 SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2*SCV-6*G2*SCV*
119 pw(E1,2)-3*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-
120 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2+(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/
121 E1/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3+3*pw(E1,2)*G2+6*(-3*pw(E1,3)*G2+
122 3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
123 2*E3)*pw(SCV,2)-9*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*
124 pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(SCV,2)*G2+3*pw(E1,2)*G2*pw(SCV,2)-E3*(-3*pw(E1,3)*
125 G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/E1/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
126 2*E3)*SCV-6*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-
127 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,2)*SCV+6*pw(E1,2)*pw(G2,2)*SCV+3*(-3*pw(E1,3)*G2+3*pw(E1,3)*
128 G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*
129 pw(G2,2)-G2*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/E1/(-3*pw(E1,3)*pw(SCV,2)-
130 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3-3*pw(E1,2)*pw(G2,2)+3*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-
131 6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(SCV,2)*
132 pw(G2,2)-3*pw(E1,2)*pw(SCV,2)*pw(G2,2)+G2*SCV*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
133 SCV+E3+SQ)/E1/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3)/(-45*(-3*pw(E1,3)*
134 G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*
135 pw(E1,3)+2*E3)*G2*pw(SCV,2)+18*pw(G2,2)*pw(E1,5)*SCV+18*pw(E1,5)*pw(G2,3)-27*pw(E1,5)*pw(G2,2)*
136 pw(SCV,2)+6*pw(E1,2)*pw(G2,2)*E3-27*pw(E1,5)*pw(G2,2)-18*pw(E1,5)*pw(G2,3)*SCV-18*pw(E1,5)*
137 G2*SCV+18*pw(E1,5)*G2*pw(SCV,2)+3*pw(E1,2)*G2*E3-3*pw(E1,2)*G2*E3*SCV+(-3*pw(E1,3)*G2+3*pw(E1,3)*
138 G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/E1/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(E3,2)+
139 3*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-6*
140 pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2*SCV*E3-36*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+
141 E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,2)*SCV+36*(-3*
142 pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*
143 SCV-3*pw(E1,3)+2*E3)*pw(G2,2)+36*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/
144 (-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(SCV,2)+45*(-3*pw(E1,3)*G2+3*pw(E1,3)*
145 G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*
146 G2*SCV-12*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-
147 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*SCV*E3-3*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+
148 SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2*E3+9*(-3*pw(E1,3)*G2+
149 3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+
150 2*E3)*G2*pw(SCV,3)+36*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*
151 pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,2)*pw(SCV,2)-6*(-3*pw(E1,3)*G2+3*pw(E1,3)*
152 G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,2)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*
153 pw(G2,2)*E3+18*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*
154 pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,3)*SCV-18*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-
155 6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(G2,3)-
156 9*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)*pw(E1,5)/(-3*pw(E1,3)*pw(SCV,2)-6*
157 pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2);
158 q10 = 3*(-3*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-
159 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(SCV,3)-3*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*
160 SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2*pw(SCV,2)+6*pw(E1,3)*pw(SCV,2)+
161 3*pw(E1,3)*G2*pw(SCV,2)+3*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/
162 (-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*pw(SCV,2)+6*pw(E1,3)*(-3*pw(E1,3)*G2+
163 3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*
164 E3)*G2*SCV-E3*SCV-6*pw(E1,3)*SCV+(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-
165 3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3*SCV-6*pw(E1,3)*G2*SCV-3*pw(E1,3)*(-
166 3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-
167 3*pw(E1,3)+2*E3)*SCV-(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-
168 6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*E3+3*pw(E1,3)*G2-3*pw(E1,3)*(-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-
169 6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-3*pw(E1,3)+2*E3)*G2+3*pw(E1,3)*
170 (-3*pw(E1,3)*G2+3*pw(E1,3)*G2*SCV-6*pw(E1,3)*SCV+E3+SQ)/(-3*pw(E1,3)*pw(SCV,2)-6*pw(E1,3)*SCV-
171 3*pw(E1,3)+2*E3)+E3)*pw(E1,2)*(-1+G2)/DISC;
172 }
173
174 Map<T> m;
175 m.D0 = Matrix<T>(2, 2, zero);
176 m.D1 = Matrix<T>(2, 2, zero);
177 m.D0(0, 0) = -mu00 - q01;
178 m.D0(0, 1) = q01;
179 m.D0(1, 0) = q10;
180 m.D0(1, 1) = -mu11 - q10;
181 m.D1(0, 0) = mu00;
182 m.D1(1, 1) = mu11;
183 return m;
184}
185
186/** mmpp2_fit3 with the MATLAB default g2tol = 1e-6. */
187template <class T>
188Map<T> mmpp2_fit3(const T& E1, const T& E2, const T& E3, const T& G2) {
189 return mmpp2_fit3(E1, E2, E3, G2, T(num_traits<T>::from_double(1e-6)));
190}
191
192} // namespace mam
193} // namespace line
194
195#endif // LINE_API_MAM_MMPP2_FIT3_H
InputError(const std::string &what)
Definition error.h:39
NumericError(const std::string &what)
Definition error.h:45
The exception types the port throws.
Scalar helpers shared by the MAP/PH moment-matching headers.
Markovian arrival process descriptors: stationary vectors, rate, moments, autocorrelation and the ind...
Dense matrix and non-owning view.
Map< T > mmpp2_fit3(const T &E1, const T &E2, const T &E3, const T &G2, const T &g2tol)
MMPP(2) with moments (E1, E2, E3) and autocorrelation decay rate G2.
Definition mmpp2_fit3.h:51
Number-type abstraction for the templated API port.
A MAP as the pair of matrices (D0, D1).
Definition map_moment.h:53
Matrix< T > D1
Definition map_moment.h:55
Matrix< T > D0
Definition map_moment.h:54