57 unsigned maxsweeps = 40,
59 unsigned npanels = 2000) {
60 const std::size_t N = shape.size();
62 throw InputError(
"fj_delay_opt: shape and rate must have the same length");
63 if (N < 1)
throw InputError(
"fj_delay_opt: at least one branch is required");
68 out.
d.assign(N, zero);
77 T mmax = zero, smax = zero;
78 for (std::size_t i = 0; i < N; ++i) {
81 if (mi > mmax) mmax = mi;
82 if (si > smax) smax = si;
89 for (
unsigned sweep = 0; sweep < maxsweeps; ++sweep) {
91 for (std::size_t i = 0; i < N; ++i) {
94 T c = b - invphi * (b - a), dd = a + invphi * (b - a);
95 std::vector<T> probe = out.
d;
100 for (
unsigned it = 0; it < 60; ++it) {
102 b = dd; dd = c; fd = fc;
103 c = b - invphi * (b - a);
107 a = c; c = dd; fc = fd;
108 dd = a + invphi * (b - a);
112 if ((b - a) <= dtol * (ub > one ? ub : one))
break;
114 out.
d[i] = (fc < fd) ? c : dd;
118 for (std::size_t i = 1; i < N; ++i)
119 if (out.
d[i] < dmin) dmin = out.
d[i];
120 for (std::size_t i = 0; i < N; ++i) out.
d[i] -= dmin;
122 const T gap = (fprev > fcur) ? (fprev - fcur) : (fcur - fprev);
123 const T mag = (fprev > one || fprev < -one) ? (fprev > zero ? fprev : -fprev) : one;
124 if (gap <= dtol * mag)
break;
FJDelayOptResult< T > fj_delay_opt(const std::vector< unsigned > &shape, const std::vector< T > &rate, unsigned maxsweeps=40, const T &dtol=num_traits< T >::from_double(1e-8), unsigned npanels=2000)
Deterministic subtask delays that minimise mean dispersion.
FJDispersionResult< T > fj_dispersion(const std::vector< unsigned > &shape, const std::vector< T > &rate, const std::vector< T > &d, const T &tol=num_traits< T >::from_double(1e-10), unsigned npanels=4000)
Mean subtask dispersion of a split-merge system with Erlang branches.