/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*globals onmessage */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*globals onmessage */
The probabilities
function computes the likelihood of shipping
all of N
locales, given the likelihood of a single locale
loclikely
, the maximum number of string-frozen cycles
, and
the maximum number of locales maxloc
.
function probabilities(loclikely, cycles, maxloc) {
var locales, fails, c, rv = [[1]], _rv;
The return value probs
is a matrix, where each row consists of the
likelyhood of shipping all of N locales, starting with 0,
which always passes, thus the first column is 1.
var probs = [[1]];
Without string freeze, the likelyhood is just the likelyhood of one locale to the power of N.
for (locales=1; locales <= maxloc; ++locales) {
probs[0][locales] = Math.pow(loclikely, locales);
}
generate string freeze cycles
for (c=0; c < cycles; ++c) {
For each cycle, see how much we can recover.
locales
is the number of locales in the full release.
probs[c+1] = [1];
for (locales=1; locales <= maxloc; ++locales) {
partition the 1: for fails
out of locales
locales failing,
pick up how likely we can fix that remaining task
with one cycle less
probs[c+1][locales] = 0;
for (fails=0; fails <=locales; ++fails) {
how likely is this case?
p^(locales-fails)*(1-p)^(fails)*binomial(locales, fails)
_rv = Math.pow(loclikely, locales-fails)
* Math.pow(1-loclikely, fails)
* binomial(locales, fails);
and now compute how likely it is to fix the fails later and multiplicate that
_rv *= probs[c][fails];
The likelyhood of success is the sum over all likelyhoods in the partitioned 1. Right?
probs[c+1][locales] += _rv;
}
}
}
return probs;
}
var _bins = {};
function binomial(n, k) {
if (n === 0) return 0;
if (k === 0) return 1;
if (_bins[n] === undefined) {
_bins[n] = {};
}
else if (_bins[n][k] !== undefined) {
return _bins[n][k];
}
var i, rv = 1;
for (i = 1; i <= k; ++i) {
rv = rv * (n - (k - i))/i;
}
_bins[n][k] = rv;
return rv;
}
onmessage = function (event) {
var params = event.data;
postMessage(probabilities(params.likely, params.cycles, params.maxloc));
}