/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.math.stats"]){
dojo._hasResource["dojox.math.stats"]=true;
dojo.provide("dojox.math.stats");
(function(){
var st=dojox.math.stats;
dojo.mixin(st,{sd:function(a){
return Math.sqrt(st.variance(a));
},variance:function(a){
var _1=0,_2=0;
dojo.forEach(a,function(_3){
_1+=_3;
_2+=Math.pow(_3,2);
});
return (_2/a.length)-Math.pow(_1/a.length,2);
},bestFit:function(a,_4,_5){
_4=_4||"x",_5=_5||"y";
if(a[0]!==undefined&&typeof (a[0])=="number"){
a=dojo.map(a,function(_6,_7){
return {x:_7,y:_6};
});
}
var sx=0,sy=0,_8=0,_9=0,_a=0,_b=0,_c=0,n=a.length,t;
for(var i=0;i<n;i++){
sx+=a[i][_4];
sy+=a[i][_5];
_8+=Math.pow(a[i][_4],2);
_9+=Math.pow(a[i][_5],2);
_a+=a[i][_4]*a[i][_5];
}
for(i=0;i<n;i++){
t=a[i][_4]-sx/n;
_b+=t*t;
_c+=t*a[i][_5];
}
var _d=_c/(_b||1);
var d=Math.sqrt((_8-Math.pow(sx,2)/n)*(_9-Math.pow(sy,2)/n));
if(d===0){
throw new Error("dojox.math.stats.bestFit: the denominator for Pearson's R is 0.");
}
var r=(_a-(sx*sy/n))/d;
var r2=Math.pow(r,2);
if(_d<0){
r=-r;
}
return {slope:_d,intercept:(sy-sx*_d)/(n||1),r:r,r2:r2};
},forecast:function(a,x,_e,_f){
var fit=st.bestFit(a,_e,_f);
return (fit.slope*x)+fit.intercept;
},mean:function(a){
var t=0;
dojo.forEach(a,function(v){
t+=v;
});
return t/Math.max(a.length,1);
},min:function(a){
return Math.min.apply(null,a);
},max:function(a){
return Math.max.apply(null,a);
},median:function(a){
var t=a.slice(0).sort(function(a,b){
return a-b;
});
return (t[Math.floor(a.length/2)]+t[Math.ceil(a.length/2)])/2;
},mode:function(a){
var o={},r=0,m=Number.MIN_VALUE;
dojo.forEach(a,function(v){
(o[v]!==undefined)?o[v]++:o[v]=1;
});
for(var p in o){
if(m<o[p]){
m=o[p],r=p;
}
}
return r;
},sum:function(a){
var sum=0;
dojo.forEach(a,function(n){
sum+=n;
});
return sum;
},approxLin:function(a,pos){
var p=pos*(a.length-1),t=Math.ceil(p),f=t-1;
if(f<0){
return a[0];
}
if(t>=a.length){
return a[a.length-1];
}
return a[f]*(t-p)+a[t]*(p-f);
},summary:function(a,_10){
if(!_10){
a=a.slice(0);
a.sort(function(a,b){
return a-b;
});
}
var l=st.approxLin,_11={min:a[0],p25:l(a,0.25),med:l(a,0.5),p75:l(a,0.75),max:a[a.length-1],p10:l(a,0.1),p90:l(a,0.9)};
return _11;
}});
})();
}
