/***************************************************************************
* Copyright (C) 2014 by Paul Lutus *
* lutusp@arachnoid.com *
* *
* 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 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
function addEvent(o,e,f) {
if (o.addEventListener) {
o.addEventListener(e,f,false);
return true;
}
else if (o.attachEvent) {
return o.attachEvent("on"+e,f);
}
else {
return false;
}
}
var Stats = Stats || {}
Stats.epsilon = 1e-16;
Stats.mu = false;
Stats.sigma = false;
Stats.id = function(s) {
return document.getElementById(s);
}
Stats.idv = function(f) {
return parseFloat(f);
}
Stats.radioValue = function(rg) {
for(var i = 0;i < rg.length;i++) {
if(rg[i].checked) {
return rg[i].value;
}
}
return "";
}
Stats.erfc = function(z) {
if (z == 0.0) {
return 1.0;
}
if (Math.abs(z) < 2.2) {
return 1.0 - Stats.erf(z);
}
if (z < 0.0) {
return 2.0 - Stats.erfc(-z);
}
var n1 = 1.0;
var d1 = z;
var n2 = z;
var d2 = z * z + 0.5;
var v = d1 / d2;
var n = 1.0;
var t;
var ov;
do { // use continued fraction method
t = n1 * n + d1 * z;
n1 = d1;
d1 = t;
t = n2 * n + d2 * z;
n2 = d2;
d2 = t;
n += 0.5;
ov = v;
v = d1 / d2;
} while (Math.abs(ov - v) >= Stats.epsilon);
return v * Math.exp(-(z * z)) / Math.sqrt(Math.PI);
}
Stats.erf = function(z) {
if (z == 0.0) {
return z;
}
if (Math.abs(z) > 2.2) {
return 1.0 - Stats.erfc(z);
}
var sgn = (z < 0) ? -1.0 : 1.0;
z = Math.abs(z);
var t = z;
var v = z;
var zsq = z * z;
var ov;
var i = 1;
do {
ov = v;
t = -t * zsq / i;
v += t / (2 * i + 1);
i++;
} while (Math.abs(ov - v) >= Stats.epsilon);
return sgn * v * 2.0 / Math.sqrt(Math.PI);
}
// lower bound, upper bound, mean, standard deviation, population size
Stats.erfint = function(a, b, m, sd, p) {
if (sd == 0) {
// FIXME
}
var q = Math.sqrt(2.0) * sd;
var av = Stats.erf((a - m) / q);
var bv = Stats.erf((b - m) / q);
return p * 0.5 * (bv - av);
}
Stats.numformat = function(v,fmt) {
if(fmt == 'comp' || fmt == 'sci') {
v = v.toExponential();
}
sv = v.toString();
if(fmt == 'sci') {
sv = sv.replace(/(.*)(e)([+-]\d+)/,"$1·10$3");
sv = sv.replace(/\+/,"");
}
return sv;
}
Stats.calc = function() {
var form = Stats.id('calc');
var a = Stats.idv(form.elements.a.value);
var b = Stats.idv(form.elements.b.value);
var mu = Stats.idv(form.elements.mu.value);
var sigma = Stats.idv(form.elements.sigma.value);
var p = Stats.idv(form.elements.p.value);
var r,ir;
if(sigma == 0) {
Stats.id('r').innerHTML = 'Error: σ = 0'
Stats.id('ir').innerHTML = 'Error: σ = 0'
return;
}
else {
r = Stats.erfint(a,b,mu,sigma,1);
ir = (1-r) * p;
r *= p;
}
var fmt = Stats.radioValue(form.elements.format);
Stats.id('r').innerHTML = Stats.numformat(r,fmt);
Stats.id('ir').innerHTML = Stats.numformat(ir,fmt);
}
Stats.define = function(a,b,mu,sigma,p) {
var form = Stats.id('calc');
form.elements.a.value = a;
form.elements.b.value = b;
form.elements.mu.value = mu;
form.elements.sigma.value = sigma;
form.elements.p.value = p;
Stats.calc();
Stats.id('calc_bottom').scrollIntoView(false);
}
Stats.fmtout = function(s,v,fmt) {
while(s.length < 32) {
s += " ";
}
sv = Stats.numformat(v,fmt);
return (s + ": " + sv + "
");
}
Stats.process = function() {
var form = Stats.id('process');
var data = Stats.id('data').value;
console.log(data);
// split data on sequences that aren't numerical
var list = data.split(/[^0-9.Ee+-]+/);
console.log(list);
var vals = new Array();
var sum = 0;
var n = 0;
for (var i = 0;i .5)?-delta:delta;
}
Stats.positions[Math.floor(x)] += .05;
Stats.walks += 1;
}
Stats.drawPositions(Stats.ctx);
}
Stats.drawFrame = function() {
Stats.drawStones(Stats.ctx);
Stats.canvas = Stats.id("walks_readout").innerHTML = Stats.ldgchars(Stats.walks,'0',5);
if(Stats.total < 2300) {
Stats.timer = setTimeout(Stats.drawFrame,Stats.frameDelay,false);
}
}
Stats.animate = function() {
Stats.canvas = Stats.id("canvas_disp");
Stats.ctx = Stats.canvas.getContext("2d");
Stats.xs = Stats.ctx.canvas.width;
Stats.ys = Stats.ctx.canvas.height;
Stats.ctx.fillStyle = "#fffff0";
Stats.ctx.fillRect(0,0,Stats.xs,Stats.ys);
Stats.yctr = Math.floor(Stats.ys / 2);
Stats.xctr = Math.floor(Stats.xs / 2);
Stats.xlow = 0;
Stats.xhigh = 80;
Stats.rectXSide = Stats.xs / Stats.xhigh;
Stats.rectYSide = Stats.ys / Stats.xhigh;
Stats.xCenter = ((Stats.xlow+Stats.xhigh)/2);
Stats.yhigh = 80;
Stats.ylow = 0;
Stats.walks = 0;
Stats.positions = new Array();
Stats.oldpositions = new Array();
for(var i = Stats.xlow;i < Stats.xhigh;i++) {
Stats.positions[i] = 0;
Stats.oldpositions[i] = -1;
}
Stats.drawGcurve(Stats.ctx);
Stats.frameDelay = 25;
Stats.drawFrame();
}
Stats.setup = function() {
Stats.id('transfer_button').disabled = true;
Stats.calc();
Stats.animate();
}
addEvent(window,'load',Stats.setup);