65 "map_mmpp2 inverts the moment equations through radicals");
66 using fitdetail::num_sqrt;
70 const double FEASTOLD = std::pow(10.0, -
static_cast<double>(
map_feastol()));
74 const T E2 = T((one + SCV_in) * E1 * E1);
76 SKEW * num_sqrt(T(pw(T(E2 - E1 * E1), 3)))));
78 if (SCV_in < one - FEASTOL)
80 "map_mmpp2: the SCV is infeasible, the inter-arrival times of an MMPP(2) are "
81 "over-dispersed (SCV >= 1)");
82 if (
num_abs(T(SCV_in - one)) <= FEASTOL)
84 "map_mmpp2: SCV = 1 is the Poisson boundary, where the MMPP(2) fit is degenerate: "
85 "the decay rate G2 = ACF1/(1 - 1/SCV)/0.5 divides by zero and every rate comes back "
86 "NaN. Use map_exponential_mean for a Poisson process");
93 "map_mmpp2: a negative ACF1 is infeasible, an MMPP(2) cannot be negatively "
94 "autocorrelated. Pass ACF1 = -1 to request the maximum feasible autocorrelation");
95 if (ACF1 > RHO0MAX + FEASTOL)
97 "map_mmpp2: ACF1 exceeds the maximum lag-1 autocorrelation feasible at this SCV. "
98 "Pass ACF1 = -1 to request it");
108 if (E3 < E3MIN - FEASTOL)
110 "map_mmpp2: the requested skewness gives a third moment below the minimum feasible at "
111 "this SCV. Pass SKEW = -1 for the minimum-skewness fit");
114 const T SCV = T((E2 - E1 * E1) / (E1 * E1));
116 T mu00v, mu11v, q01v, q10v;
122 const T cse1 = (cse2 - E3);
139 const T cse35 = (cse45 * G2);
141 const T cse39 = (cse49 * G2);
145 const T cse24 = (((((((((((pw(E3, 2) - ((cse43 * SCV) * E3)) + (cse39 * E3)) - ((cse44 * pw(E1, 3)) * E3)) + (((
num_traits<T>::from_int(18) * G2) * pw(SCV, 3)) * pw(E1, 6))) - (cse35 * pw(SCV, 2))) + (cse50 * pw(G2, 2))) + ((
num_traits<T>::from_int(36) * pw(E1, 6)) * pw(SCV, 2))) + (cse35 * SCV)) - ((cse45 * SCV) * pw(G2, 2))) + ((cse50 * pw(SCV, 2)) * pw(G2, 2))) - cse35);
146 const T cse34 = (cse49 * SCV);
148 const T cse38 = (cse48 * G2);
150 const T cse23 = (((((cse42 * G2) + (cse38 * SCV)) - cse34) + E3) + num_sqrt(cse24));
152 const T cse11 = ((cse43 * cse23) / cse25);
153 const T cse0 = (cse11 * pw(G2, 2));
154 const T cse1 = (cse11 * pw(G2, 3));
157 const T cse3 = (cse13 * pw(G2, 2));
160 const T cse5 = (cse18 * pw(G2, 2));
162 const T cse6 = (((cse46 * cse23) / cse25) * G2);
165 const T cse8 = (cse17 * G2);
167 const T cse9 = (((cse22 * pw(E1, 5)) / cse25) * G2);
168 const T cse15 = ((cse48 * cse23) / cse25);
169 const T cse10 = (cse15 * G2);
172 const T cse14 = ((cse51 * cse23) / cse25);
173 const T cse16 = ((cse49 * cse23) / cse25);
175 const T cse20 = ((cse23 / cse25) * E3);
176 const T cse21 = ((cse23 / E1) / cse25);
177 const T cse27 = (cse43 * pw(G2, 2));
178 const T cse26 = (cse27 * SCV);
179 const T cse28 = (cse43 * pw(G2, 3));
180 const T cse29 = (cse46 * pw(G2, 2));
182 const T cse30 = (cse47 * pw(G2, 3));
186 const T cse41 = (cse52 * G2);
187 const T cse33 = (cse41 * E3);
188 const T cse36 = (cse43 * G2);
189 const T cse37 = (cse47 * G2);
190 const T cse40 = (cse51 * G2);
192 const T mu00 = (((G2 * (((((((((((((((((-
num_traits<T>::from_int(4)) * E3) * G2) + (cse19 * G2)) - cse6) - (cse6 * pw(SCV, 2))) - cse27) - (cse0 * SCV)) + ((cse11 * G2) * SCV)) + (cse36 * pw(SCV, 2))) - (cse14 * SCV)) + cse15) + cse26) + (cse14 * pw(SCV, 2))) + cse36) + cse0) - (cse15 * pw(SCV, 3)))) / ((((((((((((((((((((((((((cse28 * SCV) + ((cse48 * pw(SCV, 3)) * G2)) - cse28) + (cse29 * pw(SCV, 2))) - cse38) + (cse7 * pw(SCV, 2))) - (cse40 * pw(SCV, 2))) + cse29) - cse26) + (cse40 * SCV)) - (cse1 * SCV)) - ((cse14 * pw(SCV, 3)) * G2)) - (cse2 * pw(SCV, 2))) - (cse20 * pw(SCV, 2))) + (cse19 * pw(G2, 2))) + cse1) - cse20) + ((((
num_traits<T>::from_int(2) * cse23) / cse25) * E3) * SCV)) + (cse14 * G2)) + (cse2 * SCV)) - (cse7 * SCV)) + (cse16 * SCV)) - (cse11 * pw(SCV, 2))) - cse2) + (cse16 * pw(SCV, 3))) - ((
num_traits<T>::from_int(4) * E3) * pw(G2, 2)))) / E1);
194 const T mu11 = cse21;
196 const T q01 = ((((-
num_traits<T>::from_int(3)) * pw(E1, 2)) * ((((((((((((((((((((((-
num_traits<T>::from_int(6)) * cse23) * pw(E1, 2)) / cse25) * SCV) + ((cse12 * G2) * SCV)) - (cse44 * pw(E1, 2))) - cse8) + (cse21 * E3)) + cse41) + (cse18 * pw(SCV, 2))) - ((((cse22 * pw(E1, 2)) / cse25) * pw(SCV, 2)) * G2)) + (cse41 * pw(SCV, 2))) - ((((E3 * cse23) / E1) / cse25) * SCV)) - (cse5 * SCV)) + (cse32 * SCV)) + (cse17 * pw(G2, 2))) - ((((G2 * cse23) / E1) / cse25) * E3)) - (cse52 * pw(G2, 2))) + ((cse17 * pw(SCV, 2)) * pw(G2, 2))) - ((cse52 * pw(SCV, 2)) * pw(G2, 2))) + (((((G2 * SCV) * cse23) / E1) / cse25) * E3))) / ((((((((((((((((((((((((((((((-
num_traits<T>::from_int(45)) * cse23) * pw(E1, 5)) / cse25) * G2) * pw(SCV, 2)) + (((
num_traits<T>::from_int(18) * pw(G2, 2)) * pw(E1, 5)) * SCV)) + cse30) - (cse31 * pw(SCV, 2))) + (cse32 * E3)) - cse31) - (cse30 * SCV)) - (cse37 * SCV)) + (cse37 * pw(SCV, 2))) + cse33) - (cse33 * SCV)) + (cse21 * pw(E3, 2))) + ((cse8 * SCV) * E3)) - (cse3 * SCV)) + cse3) + (cse13 * pw(SCV, 2))) + (((((
num_traits<T>::from_int(45) * cse23) * pw(E1, 5)) / cse25) * G2) * SCV)) - ((cse12 * SCV) * E3)) - (cse8 * E3)) + (cse9 * pw(SCV, 3))) + (cse3 * pw(SCV, 2))) - (cse5 * E3)) + (cse4 * SCV)) - cse4) - cse9));
198 const T q10 = ((((
num_traits<T>::from_int(3) * ((((((((((((((((((cse42 * cse23) / cse25) * pw(SCV, 3)) - (cse10 * pw(SCV, 2))) + (cse49 * pw(SCV, 2))) + (cse38 * pw(SCV, 2))) + (cse15 * pw(SCV, 2))) + ((cse16 * G2) * SCV)) - (E3 * SCV)) - cse34) + (cse20 * SCV)) - (cse39 * SCV)) - (cse15 * SCV)) - cse20) + cse38) - cse10) + cse15) + E3)) * pw(E1, 2)) * ((-
num_traits<T>::from_int(1)) + G2)) / cse24);
206 const T rates[4] = {mu00v, mu11v, q01v, q10v};
207 for (
int i = 0; i < 4; ++i) {
209 if (std::isnan(v) || v < -FEASTOLD)
211 "map_mmpp2: the requested (MEAN, SCV, SKEW, ACF1) is not MMPP(2)-feasible; the "
212 "fit gives a rate that is not a MAP");
215 const T a = mu00v > zero ? mu00v : zero;
216 const T b = mu11v > zero ? mu11v : zero;
217 const T c = q01v > zero ? q01v : zero;
218 const T d = q10v > zero ? q10v : zero;
223 m.
D0(0, 0) = T(-a - c);
226 m.
D0(1, 1) = T(-b - d);