UNPKG

clmtrackr

Version:

Javascript library for precise tracking of facial features via Constrained Local Models

1 lines 1.95 MB
!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define(factory):global.clm=factory()}(this,function(){"use strict";function createCommonjsModule(fn,module){return module={exports:{}},fn(module,module.exports),module.exports}function emitEvent(eventName){var evt=new CustomEvent(eventName,{bubbles:!0,cancelable:!0});document.dispatchEvent(evt)}function FFT(){function fft(re,im,inv){for(var d,h,ik,m,tmp,wr,wi,xr,xi,n4=_n>>2,l=0;l<_n;l++)l<(m=_bitrev[l])&&(tmp=re[l],re[l]=re[m],re[m]=tmp,tmp=im[l],im[l]=im[m],im[m]=tmp);for(var k=1;k<_n;k<<=1){h=0,d=_n/(k<<1);for(var j=0;j<k;j++){wr=_cstb[h+n4],wi=inv*_cstb[h];for(var i=j;i<_n;i+=k<<1)xr=wr*re[ik=i+k]+wi*im[ik],xi=wr*im[ik]-wi*re[ik],re[ik]=re[i]-xr,re[i]+=xr,im[ik]=im[i]-xi,im[i]+=xi;h+=d}}}function _setVariables(){_bitrev="undefined"!=typeof Uint8Array?new Uint8Array(_n):new Array(_n),"undefined"!=typeof Float64Array?(_cstb=new Float64Array(1.25*_n),_tre=new Float64Array(_n*_n),_tim=new Float64Array(_n*_n)):(_cstb=new Array(1.25*_n),_tre=new Array(_n*_n),_tim=new Array(_n*_n))}function _makeBitReversal(){var i=0,j=0,k=0;for(_bitrev[0]=0;++i<_n;){for(k=_n>>1;k<=j;)j-=k,k>>=1;j+=k,_bitrev[i]=j}}function _makeCosSinTable(){var n2=_n>>1,n4=_n>>2,n8=_n>>3,n2p4=n2+n4,t=Math.sin(Math.PI/_n),dc=2*t*t,ds=Math.sqrt(dc*(2-dc)),c=_cstb[n4]=1,s=_cstb[0]=0;t=2*dc;for(var i=1;i<n8;i++)dc+=t*(c-=dc),ds-=t*(s+=ds),_cstb[i]=s,_cstb[n4-i]=c;0!==n8&&(_cstb[n8]=Math.sqrt(.5));for(var j=0;j<n4;j++)_cstb[n2-j]=_cstb[j];for(var k=0;k<n2p4;k++)_cstb[k+n2]=-_cstb[k]}var _tre,_tim,_n=0,_bitrev=null,_cstb=null;this.init=function(n){if(0===n||0!=(n&n-1))throw new Error("init: radix-2 required");_n=n,_setVariables(),_makeBitReversal(),_makeCosSinTable()},this.fft1d=function(re,im){fft(re,im,1)},this.ifft1d=function(re,im){var n=1/_n;fft(re,im,-1);for(var i=0;i<_n;i++)re[i]*=n,im[i]*=n},this.fft2d=function(re,im){for(var i=0,y=0;y<_n;y++){i=y*_n;for(var x1=0;x1<_n;x1++)_tre[x1]=re[x1+i],_tim[x1]=im[x1+i];this.fft1d(_tre,_tim);for(var x2=0;x2<_n;x2++)re[x2+i]=_tre[x2],im[x2+i]=_tim[x2]}for(var x=0;x<_n;x++){for(var y1=0;y1<_n;y1++)i=x+y1*_n,_tre[y1]=re[i],_tim[y1]=im[i];this.fft1d(_tre,_tim);for(var y2=0;y2<_n;y2++)re[i=x+y2*_n]=_tre[y2],im[i]=_tim[y2]}},this.ifft2d=function(re,im){for(var i=0,y=0;y<_n;y++){i=y*_n;for(var x1=0;x1<_n;x1++)_tre[x1]=re[x1+i],_tim[x1]=im[x1+i];this.ifft1d(_tre,_tim);for(var x2=0;x2<_n;x2++)re[x2+i]=_tre[x2],im[x2+i]=_tim[x2]}for(var x=0;x<_n;x++){for(var y1=0;y1<_n;y1++)i=x+y1*_n,_tre[y1]=re[i],_tim[y1]=im[i];this.ifft1d(_tre,_tim);for(var y2=0;y2<_n;y2++)re[i=x+y2*_n]=_tre[y2],im[i]=_tim[y2]}}}function mosseFilter(params){var _filter,_top,_bottom,_fft,_w,_h,_im_part,_arrlen,_cc,_image_array;this.psr_prev=void 0,this.peak_prev=void 0;var updateable=!1;if(params||(params={}),void 0===params.drawResponse)params.drawResponse=!1;else if("CANVAS"!=params.drawResponse.tagName)params.drawResponse=!1;else var responseContext=params.drawResponse.getContext("2d");void 0===params.psrThreshold&&(params.psrThreshold=10),void 0===params.eta&&(params.eta=.1),void 0===params.convertToGrayscale&&(params.convertToGrayscale=!0),this.load=function(filter){_w=filter.width,_h=filter.height,_arrlen=_w*_h,_filter=[filter.real,filter.imag],filter.top&&filter.bottom&&(updateable=!0,_top=[filter.top.real,filter.top.imag],_bottom=[filter.bottom.real,filter.bottom.imag]),(_fft=new FFT).init(filter.width),"undefined"!=typeof Float64Array?(_im_part=new Float64Array(_arrlen),_image_array=new Float64Array(_arrlen)):(_im_part=new Array(_arrlen),_image_array=new Array(_arrlen));var canvas=document.createElement("canvas");canvas.setAttribute("width",_w),canvas.setAttribute("height",_h),_cc=canvas.getContext("2d")},this.init=function(w,h){_arrlen=(_w=w)*(_h=h),_filter=[[],[]],_top=[[],[]],_bottom=[[],[]];for(var i=0;i<_arrlen;i++)_filter[0][i]=0,_filter[1][i]=0,_top[0][i]=0,_top[1][i]=0,_bottom[0][i]=0,_bottom[1][i]=0;updateable=!0,(_fft=new FFT).init(w),_im_part="undefined"!=typeof Float64Array?new Float64Array(_arrlen):new Array(_arrlen);var canvas=document.createElement("canvas");canvas.setAttribute("width",_w),canvas.setAttribute("height",_h),_cc=canvas.getContext("2d")},this.fft=function(array){for(var cn=new Array(_arrlen),i=0;i<_arrlen;i++)cn[i]=0;return _fft.fft2d(array,cn),[array,cn]},this.fft_inplace=function(array){for(var i=0;i<_arrlen;i++)_im_part[i]=0;return _fft.fft2d(array,_im_part),[array,_im_part]},this.ifft=function(rn,cn){return _fft.ifft2d(rn,cn),rn},this.psr=function(array){for(var val,sum=0,max=0,maxpos=[0,0],sdo=0,x=0;x<_w;x++)for(y=0;y<_h;y++)sum+=val=array[y*_w+x],sdo+=val*val,max<val&&(max=val,maxpos=[x,y]);for(x=-5;x<6;x++)for(var y=-5;y<6;y++)Math.sqrt(x*x+y*y)<5&&(sdo-=(val=array[(maxpos[1]+y)*_w+(maxpos[0]+x)])*val,sum-=val);var mean=sum/array.length;return(max-mean)/Math.sqrt(sdo/array.length-mean*mean)},this.getResponse=function(imageData){var prepImage=preprocess(imageData);prepImage=cosine_window(prepImage);var res=this.fft_inplace(prepImage);return complex_mult_inplace(res,_filter),this.ifft(res[0],res[1])},this.track=function(input,left,top,width,height,updateFilter,gaussianPrior,calcPSR){if(!_filter)return console.log("Mosse-filter needs to be initialized or trained before starting tracking."),!1;if("VIDEO"==input.tagName||"IMG"==input.tagName){var videoLeft=Math.round(left/input.width*input.videoWidth),videoTop=Math.round(top/input.height*input.videoHeight),videoWidth=Math.round(width/input.width*input.videoWidth),videoHeight=Math.round(height/input.height*input.videoHeight);_cc.drawImage(input,videoLeft,videoTop,videoWidth,videoHeight,0,0,_w,_h)}else"CANVAS"==input.tagName&&_cc.drawImage(input,left,top,width,height,0,0,_w,_h);var id=_cc.getImageData(0,0,_w,_h).data;if(params.convertToGrayscale)for(i=0;i<_arrlen;i++)_image_array[i]=.3*id[4*i],_image_array[i]+=.59*id[4*i+1],_image_array[i]+=.11*id[4*i+2];else for(i=0;i<_arrlen;i++)_image_array[i]=id[4*i];var prepImage=preprocess(_image_array);prepImage=cosine_window(prepImage);var res=this.fft_inplace(prepImage),nures=complex_mult(res,_filter),filtered=this.ifft(nures[0],nures[1]),max=0,min=0,maxpos=[0,0];if(gaussianPrior)for(var prior,dx,dy,x=0;x<_w;x++)for(y=0;y<_h;y++)dx=x-_w/2,dy=y-_h/2,prior=Math.exp(-.5*(dx*dx+dy*dy)/128),filtered[y*_w+x]*prior>max&&(max=filtered[y*_w+x]*prior,maxpos=[x,y]),filtered[y*_w+x]<min&&(min=filtered[y*_w+x]);else for(x=0;x<_w;x++)for(y=0;y<_h;y++)filtered[y*_w+x]>max&&(max=filtered[y*_w+x],maxpos=[x,y]),filtered[y*_w+x]<min&&(min=filtered[y*_w+x]);if(this.peak_prev=max,params.drawResponse){var diff=max-min,dc=document.createElement("canvas");dc.setAttribute("width",32),dc.setAttribute("height",32);for(var dcc=dc.getContext("2d"),psci=dcc.createImageData(32,32),pscidata=psci.data,j=0;j<1024;j++){var val=filtered[j];val=Math.round((val+Math.abs(min))*(255/diff)),pscidata[4*j]=val,pscidata[4*j+1]=val,pscidata[4*j+2]=val,pscidata[4*j+3]=255}dcc.putImageData(psci,0,0),responseContext.drawImage(dc,left,top,width,width)}if(calcPSR&&(this.psr_prev=this.psr(filtered)),updateFilter)if(updateable){if(calcPSR)psr=this.psr_prev;else var psr=this.psr(filtered);if(psr>params.psrThreshold){for(var target=[],nux=maxpos[0],nuy=maxpos[1],x=0;x<_w;x++)for(var y=0;y<_h;y++)target[y*_w+x]=Math.exp(-((x-nux)*(x-nux)+(y-nuy)*(y-nuy))/4);target=this.fft(target);for(var res_conj=complex_conj(res),fuTop=complex_mult(target,res_conj),fuBottom=complex_mult(res,res_conj),eta=params.eta,i=0;i<_arrlen;i++)_top[0][i]=eta*fuTop[0][i]+(1-eta)*_top[0][i],_top[1][i]=eta*fuTop[1][i]+(1-eta)*_top[1][i],_bottom[0][i]=eta*fuBottom[0][i]+(1-eta)*_bottom[0][i],_bottom[1][i]=eta*fuBottom[1][i]+(1-eta)*_bottom[1][i];_filter=complex_div(_top,_bottom)}}else console.log("The loaded filter does not support updating. Ignoring parameter 'updateFilter'.");return maxpos[0]=maxpos[0]*(width/_w),maxpos[1]=maxpos[1]*(width/_h),!(max<0)&&maxpos},this.train=function(input,left,top,width,height){if(!updateable)return console.log("The loaded filter does not support updating. Unable to do training."),!1;if("VIDEO"==input.tagName||"IMG"==input.tagName){var videoLeft=Math.round(left/input.width*input.videoWidth),videoTop=Math.round(top/input.height*input.videoHeight),videoWidth=Math.round(width/input.width*input.videoWidth),videoHeight=Math.round(height/input.height*input.videoHeight);_cc.drawImage(input,videoLeft,videoTop,videoWidth,videoHeight,0,0,_w,_h)}else"CANVAS"==input.tagName&&_cc.drawImage(input,left,top,width,height,0,0,_w,_h);for(var id=_cc.getImageData(0,0,_w,_h).data,i=0;i<_arrlen;i++)_image_array[i]=.3*id[4*i],_image_array[i]+=.59*id[4*i+1],_image_array[i]+=.11*id[4*i+2];var prepImage=preprocess(_image_array);prepImage=cosine_window(prepImage);for(var target=[],nux=_w/2,nuy=_h/2,x=0;x<_w;x++)for(var y=0;y<_h;y++)target[y*_w+x]=Math.exp(-((x-nux)*(x-nux)+(y-nuy)*(y-nuy))/4);target=this.fft(target);for(var res=this.fft(prepImage),res_conj=complex_conj(res),fuTop=complex_mult(target,res_conj),fuBottom=complex_mult(res,res_conj),eta=params.eta,i=0;i<_arrlen;i++)_top[0][i]=eta*fuTop[0][i]+(1-eta)*_top[0][i],_top[1][i]=eta*fuTop[1][i]+(1-eta)*_top[1][i],_bottom[0][i]=eta*fuBottom[0][i]+(1-eta)*_bottom[0][i],_bottom[1][i]=eta*fuBottom[1][i]+(1-eta)*_bottom[1][i];return _filter=complex_div(_top,_bottom),!0};var preprocess=function(array){for(i=0;i<_arrlen;i++)array[i]=Math.log(array[i]+1);for(var mean=0,i=0;i<_arrlen;i++)mean+=array[i];mean/=_arrlen;for(i=0;i<_arrlen;i++)array[i]-=mean;for(var norm=0,i=0;i<_arrlen;i++)norm+=array[i]*array[i];if(0!==(norm=Math.sqrt(norm)))for(i=0;i<_arrlen;i++)array[i]/=norm;return array},cosine_window=function(array){for(var pos=0,i=0;i<_w;i++)for(var j=0;j<_h;j++){var cww=Math.sin(Math.PI*i/(_w-1)),cwh=Math.sin(Math.PI*j/(_h-1));array[pos]=Math.min(cww,cwh)*array[pos],pos++}return array},complex_mult=function(cn1,cn2){for(var nucn=[new Array(_w),new Array(_w)],r=0;r<_arrlen;r++)nucn[0][r]=cn1[0][r]*cn2[0][r]-cn1[1][r]*cn2[1][r],nucn[1][r]=cn1[0][r]*cn2[1][r]+cn1[1][r]*cn2[0][r];return nucn},complex_mult_inplace=function(cn1,cn2){for(var temp1,temp2,r=0;r<_arrlen;r++)temp1=cn1[0][r]*cn2[0][r]-cn1[1][r]*cn2[1][r],temp2=cn1[0][r]*cn2[1][r]+cn1[1][r]*cn2[0][r],cn1[0][r]=temp1,cn1[1][r]=temp2},complex_conj=function(cn){for(var nucn=[[],[]],i=0;i<_arrlen;i++)nucn[0][i]=cn[0][i],nucn[1][i]=-cn[1][i];return nucn},complex_div=function(cn1,cn2){for(var nucn=[[],[]],r=0;r<_arrlen;r++)nucn[0][r]=(cn1[0][r]*cn2[0][r]+cn1[1][r]*cn2[1][r])/(cn2[0][r]*cn2[0][r]+cn2[1][r]*cn2[1][r]),nucn[1][r]=(cn1[1][r]*cn2[0][r]-cn1[0][r]*cn2[1][r])/(cn2[0][r]*cn2[0][r]+cn2[1][r]*cn2[1][r]);return nucn}}function FFT$1(){function fft(re,im,inv){for(var d,h,ik,m,tmp,wr,wi,xr,xi,n4=_n>>2,l=0;l<_n;l++)l<(m=_bitrev[l])&&(tmp=re[l],re[l]=re[m],re[m]=tmp,tmp=im[l],im[l]=im[m],im[m]=tmp);for(var k=1;k<_n;k<<=1){h=0,d=_n/(k<<1);for(var j=0;j<k;j++){wr=_cstb[h+n4],wi=inv*_cstb[h];for(var i=j;i<_n;i+=k<<1)xr=wr*re[ik=i+k]+wi*im[ik],xi=wr*im[ik]-wi*re[ik],re[ik]=re[i]-xr,re[i]+=xr,im[ik]=im[i]-xi,im[i]+=xi;h+=d}}}function _setVariables(){_bitrev="undefined"!=typeof Uint8Array?new Uint8Array(_n):new Array(_n),"undefined"!=typeof Float64Array?(_cstb=new Float64Array(1.25*_n),_tre=new Float64Array(_n),_tim=new Float64Array(_n)):(_cstb=new Array(1.25*_n),_tre=new Array(_n),_tim=new Array(_n))}function _makeBitReversal(){var i=0,j=0,k=0;for(_bitrev[0]=0;++i<_n;){for(k=_n>>1;k<=j;)j-=k,k>>=1;j+=k,_bitrev[i]=j}}function _makeCosSinTable(){var n2=_n>>1,n4=_n>>2,n8=_n>>3,n2p4=n2+n4,t=Math.sin(Math.PI/_n),dc=2*t*t,ds=Math.sqrt(dc*(2-dc)),c=_cstb[n4]=1,s=_cstb[0]=0;t=2*dc;for(var i=1;i<n8;i++)dc+=t*(c-=dc),ds-=t*(s+=ds),_cstb[i]=s,_cstb[n4-i]=c;0!==n8&&(_cstb[n8]=Math.sqrt(.5));for(var j=0;j<n4;j++)_cstb[n2-j]=_cstb[j];for(var k=0;k<n2p4;k++)_cstb[k+n2]=-_cstb[k]}var _tre,_tim,_n=0,_bitrev=null,_cstb=null;this.init=function(n){if(0===n||0!=(n&n-1))throw new Error("init: radix-2 required");_n=n,_setVariables(),_makeBitReversal(),_makeCosSinTable()},this.fft1d=function(re,im){fft(re,im,1)},this.ifft1d=function(re,im){var n=1/_n;fft(re,im,-1);for(var i=0;i<_n;i++)re[i]*=n,im[i]*=n},this.fft2d=function(re,im){for(var i=0,y=0;y<_n;y++){i=y*_n;for(var x1=0;x1<_n;x1++)_tre[x1]=re[x1+i],_tim[x1]=im[x1+i];this.fft1d(_tre,_tim);for(var x2=0;x2<_n;x2++)re[x2+i]=_tre[x2],im[x2+i]=_tim[x2]}for(var x=0;x<_n;x++){for(var y1=0;y1<_n;y1++)i=x+y1*_n,_tre[y1]=re[i],_tim[y1]=im[i];this.fft1d(_tre,_tim);for(var y2=0;y2<_n;y2++)re[i=x+y2*_n]=_tre[y2],im[i]=_tim[y2]}},this.ifft2d=function(re,im){for(var i=0,y=0;y<_n;y++){i=y*_n;for(var x1=0;x1<_n;x1++)_tre[x1]=re[x1+i],_tim[x1]=im[x1+i];this.ifft1d(_tre,_tim);for(var x2=0;x2<_n;x2++)re[x2+i]=_tre[x2],im[x2+i]=_tim[x2]}for(var x=0;x<_n;x++){for(var y1=0;y1<_n;y1++)i=x+y1*_n,_tre[y1]=re[i],_tim[y1]=im[i];this.ifft1d(_tre,_tim);for(var y2=0;y2<_n;y2++)re[i=x+y2*_n]=_tre[y2],im[i]=_tim[y2]}},this.real_ifft2d=function(re,im){for(var i2,i=0,y=0;y<_n;y++){i=y*_n;for(var x1=0;x1<_n;x1++)_tre[x1]=re[x1+i],_tim[x1]=im[x1+i];this.ifft1d(_tre,_tim);for(x2=0;x2<_n;x2++)re[x2+i]=_tre[x2],im[x2+i]=_tim[x2]}for(var halfn=_n/2,rowIdx=0,x=0;x<_n;x+=2){i=x,i2=x+1,_tre[0]=re[0+i],_tim[0]=re[0+i2],_tre[_n/2]=re[halfn*_n+i],_tim[_n/2]=re[halfn*_n+i2];for(var x2=1;x2<halfn;x2++)rowIdx=x2*_n,_tre[x2]=re[rowIdx+i]-im[rowIdx+i2],_tre[_n-x2]=re[rowIdx+i]+im[rowIdx+i2],_tim[x2]=im[rowIdx+i]+re[rowIdx+i2],_tim[_n-x2]=re[rowIdx+i2]-im[rowIdx+i];this.ifft1d(_tre,_tim);for(var y2=0;y2<_n;y2++)i2=x+1+y2*_n,re[i=x+y2*_n]=_tre[y2],re[i2]=_tim[y2]}},this.real_fft2d=function(re,im){for(var i=0,i2=0,y=0;y<_n;y+=2){i=y*_n,i2=(y+1)*_n;for(var x1=0;x1<_n;x1++)_tre[x1]=re[x1+i],_tim[x1]=re[x1+i2];this.fft1d(_tre,_tim),re[0+i]=_tre[0],re[0+i2]=_tim[0],im[0+i]=0,im[0+i2]=0,re[_n/2+i]=_tre[_n/2],re[_n/2+i2]=_tim[_n/2],im[_n/2+i]=0,im[_n/2+i2]=0;for(var x2=1;x2<_n/2;x2++)re[x2+i]=.5*(_tre[x2]+_tre[_n-x2]),im[x2+i]=.5*(_tim[x2]-_tim[_n-x2]),re[x2+i2]=.5*(_tim[x2]+_tim[_n-x2]),im[x2+i2]=-.5*(_tre[x2]-_tre[_n-x2]),re[_n-x2+i]=re[x2+i],im[_n-x2+i]=-im[x2+i],re[_n-x2+i2]=re[x2+i2],im[_n-x2+i2]=-im[x2+i2]}for(var x=0;x<_n;x++){for(var y1=0;y1<_n;y1++)i=x+y1*_n,_tre[y1]=re[i],_tim[y1]=im[i];this.fft1d(_tre,_tim);for(var y2=0;y2<_n;y2++)re[i=x+y2*_n]=_tre[y2],im[i]=_tim[y2]}}}for(var commonjsGlobal="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},numeric1_2_6=(createCommonjsModule(function(module,exports){var numeric=exports;void 0!==commonjsGlobal&&(commonjsGlobal.numeric=numeric),numeric.version="1.2.6",numeric.bench=function(f,interval){var t1,t2,n,i;for(void 0===interval&&(interval=15),n=.5,t1=new Date;;){for(i=n*=2;i>3;i-=4)f(),f(),f(),f();for(;i>0;)f(),i--;if((t2=new Date)-t1>interval)break}for(i=n;i>3;i-=4)f(),f(),f(),f();for(;i>0;)f(),i--;return t2=new Date,1e3*(3*n-1)/(t2-t1)},numeric._myIndexOf=function(w){var k,n=this.length;for(k=0;k<n;++k)if(this[k]===w)return k;return-1},numeric.myIndexOf=Array.prototype.indexOf?Array.prototype.indexOf:numeric._myIndexOf,numeric.Function=Function,numeric.precision=4,numeric.largeArray=50,numeric.prettyPrint=function(x){function fmtnum(x){if(0===x)return"0";if(isNaN(x))return"NaN";if(x<0)return"-"+fmtnum(-x);if(isFinite(x)){var scale=Math.floor(Math.log(x)/Math.log(10)),normalized=x/Math.pow(10,scale),basic=normalized.toPrecision(numeric.precision);return 10===parseFloat(basic)&&(scale++,basic=(normalized=1).toPrecision(numeric.precision)),parseFloat(basic).toString()+"e"+scale.toString()}return"Infinity"}function foo(x){var k;if(void 0===x)return ret.push(Array(numeric.precision+8).join(" ")),!1;if("string"==typeof x)return ret.push('"'+x+'"'),!1;if("boolean"==typeof x)return ret.push(x.toString()),!1;if("number"==typeof x){var a=fmtnum(x),b=x.toPrecision(numeric.precision),c=parseFloat(x.toString()).toString(),d=[a,b,c,parseFloat(b).toString(),parseFloat(c).toString()];for(k=1;k<d.length;k++)d[k].length<a.length&&(a=d[k]);return ret.push(Array(numeric.precision+8-a.length).join(" ")+a),!1}if(null===x)return ret.push("null"),!1;if("function"==typeof x){ret.push(x.toString());flag=!1;for(k in x)x.hasOwnProperty(k)&&(flag?ret.push(",\n"):ret.push("\n{"),flag=!0,ret.push(k),ret.push(": \n"),foo(x[k]));return flag&&ret.push("}\n"),!0}if(x instanceof Array){if(x.length>numeric.largeArray)return ret.push("...Large Array..."),!0;flag=!1;for(ret.push("["),k=0;k<x.length;k++)k>0&&(ret.push(","),flag&&ret.push("\n ")),flag=foo(x[k]);return ret.push("]"),!0}ret.push("{");var flag=!1;for(k in x)x.hasOwnProperty(k)&&(flag&&ret.push(",\n"),flag=!0,ret.push(k),ret.push(": \n"),foo(x[k]));return ret.push("}"),!0}var ret=[];return foo(x),ret.join("")},numeric.parseDate=function(d){function foo(d){if("string"==typeof d)return Date.parse(d.replace(/-/g,"/"));if(!(d instanceof Array))throw new Error("parseDate: parameter must be arrays of strings");var k,ret=[];for(k=0;k<d.length;k++)ret[k]=foo(d[k]);return ret}return foo(d)},numeric.parseFloat=function(d){function foo(d){if("string"==typeof d)return parseFloat(d);if(!(d instanceof Array))throw new Error("parseFloat: parameter must be arrays of strings");var k,ret=[];for(k=0;k<d.length;k++)ret[k]=foo(d[k]);return ret}return foo(d)},numeric.parseCSV=function(t){var j,k,foo=t.split("\n"),ret=[],pat=/(([^'",]*)|('[^']*')|("[^"]*")),/g,patnum=/^\s*(([+-]?[0-9]+(\.[0-9]*)?(e[+-]?[0-9]+)?)|([+-]?[0-9]*(\.[0-9]+)?(e[+-]?[0-9]+)?))\s*$/,count=0;for(k=0;k<foo.length;k++){var baz,bar=(foo[k]+",").match(pat);if(bar.length>0){for(ret[count]=[],j=0;j<bar.length;j++)baz=function(n){return n.substr(0,n.length-1)}(bar[j]),patnum.test(baz)?ret[count][j]=parseFloat(baz):ret[count][j]=baz;count++}}return ret},numeric.toCSV=function(A){var i,j,m,row,ret,s=numeric.dim(A);for(m=s[0],s[1],ret=[],i=0;i<m;i++){for(row=[],j=0;j<m;j++)row[j]=A[i][j].toString();ret[i]=row.join(", ")}return ret.join("\n")+"\n"},numeric.getURL=function(url){var client=new XMLHttpRequest;return client.open("GET",url,!1),client.send(),client},numeric.imageURL=function(img){function crc32Array(a,from,to){void 0===from&&(from=0),void 0===to&&(to=a.length);var i,table=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],crc=-1;a.length;for(i=from;i<to;i++)crc=crc>>>8^table[255&(crc^a[i])];return-1^crc}var s1,s2,k,length,a,b,i,j,adler32,crc32,h=img[0].length,w=img[0][0].length,stream=[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,w>>24&255,w>>16&255,w>>8&255,255&w,h>>24&255,h>>16&255,h>>8&255,255&h,8,2,0,0,0,-1,-2,-3,-4,-5,-6,-7,-8,73,68,65,84,8,29];for(crc32=crc32Array(stream,12,29),stream[29]=crc32>>24&255,stream[30]=crc32>>16&255,stream[31]=crc32>>8&255,stream[32]=255&crc32,s1=1,s2=0,i=0;i<h;i++){for(i<h-1?stream.push(0):stream.push(1),a=3*w+1+(0===i)&255,b=3*w+1+(0===i)>>8&255,stream.push(a),stream.push(b),stream.push(255&~a),stream.push(255&~b),0===i&&stream.push(0),j=0;j<w;j++)for(k=0;k<3;k++)s2=(s2+(s1=(s1+(a=(a=img[k][i][j])>255?255:a<0?0:Math.round(a)))%65521))%65521,stream.push(a);stream.push(0)}return adler32=(s2<<16)+s1,stream.push(adler32>>24&255),stream.push(adler32>>16&255),stream.push(adler32>>8&255),stream.push(255&adler32),length=stream.length-41,stream[33]=length>>24&255,stream[34]=length>>16&255,stream[35]=length>>8&255,stream[36]=255&length,crc32=crc32Array(stream,37),stream.push(crc32>>24&255),stream.push(crc32>>16&255),stream.push(crc32>>8&255),stream.push(255&crc32),stream.push(0),stream.push(0),stream.push(0),stream.push(0),stream.push(73),stream.push(69),stream.push(78),stream.push(68),stream.push(174),stream.push(66),stream.push(96),stream.push(130),"data:image/png;base64,"+function(A){var i,x,y,z,p,q,r,s,n=A.length,key="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",ret="";for(i=0;i<n;i+=3)p=(x=A[i])>>2,q=((3&x)<<4)+((y=A[i+1])>>4),r=((15&y)<<2)+((z=A[i+2])>>6),s=63&z,i+1>=n?r=s=64:i+2>=n&&(s=64),ret+=key.charAt(p)+key.charAt(q)+key.charAt(r)+key.charAt(s);return ret}(stream)},numeric._dim=function(x){for(var ret=[];"object"==typeof x;)ret.push(x.length),x=x[0];return ret},numeric.dim=function(x){var y,z;return"object"==typeof x?(y=x[0],"object"==typeof y?(z=y[0],"object"==typeof z?numeric._dim(x):[x.length,y.length]):[x.length]):[]},numeric.mapreduce=function(body,init){return Function("x","accum","_s","_k",'if(typeof accum === "undefined") accum = '+init+';\nif(typeof x === "number") { var xi = x; '+body+'; return accum; }\nif(typeof _s === "undefined") _s = numeric.dim(x);\nif(typeof _k === "undefined") _k = 0;\nvar _n = _s[_k];\nvar i,xi;\nif(_k < _s.length-1) {\n for(i=_n-1;i>=0;i--) {\n accum = arguments.callee(x[i],accum,_s,_k+1);\n } return accum;\n}\nfor(i=_n-1;i>=1;i-=2) { \n xi = x[i];\n '+body+";\n xi = x[i-1];\n "+body+";\n}\nif(i === 0) {\n xi = x[i];\n "+body+"\n}\nreturn accum;")},numeric.mapreduce2=function(body,setup){return Function("x","var n = x.length;\nvar i,xi;\n"+setup+";\nfor(i=n-1;i!==-1;--i) { \n xi = x[i];\n "+body+";\n}\nreturn accum;")},numeric.same=function same(x,y){var i,n;if(!(x instanceof Array&&y instanceof Array))return!1;if((n=x.length)!==y.length)return!1;for(i=0;i<n;i++)if(x[i]!==y[i]){if("object"!=typeof x[i])return!1;if(!same(x[i],y[i]))return!1}return!0},numeric.rep=function(s,v,k){void 0===k&&(k=0);var i,n=s[k],ret=Array(n);if(k===s.length-1){for(i=n-2;i>=0;i-=2)ret[i+1]=v,ret[i]=v;return-1===i&&(ret[0]=v),ret}for(i=n-1;i>=0;i--)ret[i]=numeric.rep(s,v,k+1);return ret},numeric.dotMMsmall=function(x,y){var i,j,k,p,q,r,ret,foo,bar,woo,i0;for(p=x.length,q=y.length,r=y[0].length,ret=Array(p),i=p-1;i>=0;i--){for(foo=Array(r),bar=x[i],k=r-1;k>=0;k--){for(woo=bar[q-1]*y[q-1][k],j=q-2;j>=1;j-=2)i0=j-1,woo+=bar[j]*y[j][k]+bar[i0]*y[i0][k];0===j&&(woo+=bar[0]*y[0][k]),foo[k]=woo}ret[i]=foo}return ret},numeric._getCol=function(A,j,x){var i;for(i=A.length-1;i>0;--i)x[i]=A[i][j],x[--i]=A[i][j];0===i&&(x[0]=A[0][j])},numeric.dotMMbig=function(x,y){var xj,i,j,gc=numeric._getCol,p=y.length,v=Array(p),m=x.length,n=y[0].length,A=new Array(m),VV=numeric.dotVV;for(--p,i=--m;-1!==i;--i)A[i]=Array(n);for(i=--n;-1!==i;--i)for(gc(y,i,v),j=m;-1!==j;--j)0,xj=x[j],A[j][i]=VV(xj,v);return A},numeric.dotMV=function(x,y){var i,p=x.length,ret=(y.length,Array(p)),dotVV=numeric.dotVV;for(i=p-1;i>=0;i--)ret[i]=dotVV(x[i],y);return ret},numeric.dotVM=function(x,y){var j,k,p,q,ret,woo,i0;for(p=x.length,q=y[0].length,ret=Array(q),k=q-1;k>=0;k--){for(woo=x[p-1]*y[p-1][k],j=p-2;j>=1;j-=2)i0=j-1,woo+=x[j]*y[j][k]+x[i0]*y[i0][k];0===j&&(woo+=x[0]*y[0][k]),ret[k]=woo}return ret},numeric.dotVV=function(x,y){var i,i1,n=x.length,ret=x[n-1]*y[n-1];for(i=n-2;i>=1;i-=2)i1=i-1,ret+=x[i]*y[i]+x[i1]*y[i1];return 0===i&&(ret+=x[0]*y[0]),ret},numeric.dot=function(x,y){var d=numeric.dim;switch(1e3*d(x).length+d(y).length){case 2002:return y.length<10?numeric.dotMMsmall(x,y):numeric.dotMMbig(x,y);case 2001:return numeric.dotMV(x,y);case 1002:return numeric.dotVM(x,y);case 1001:return numeric.dotVV(x,y);case 1e3:return numeric.mulVS(x,y);case 1:return numeric.mulSV(x,y);case 0:return x*y;default:throw new Error("numeric.dot only works on vectors and matrices")}},numeric.diag=function(d){var i,i1,j,Ai,n=d.length,A=Array(n);for(i=n-1;i>=0;i--){for(Ai=Array(n),i1=i+2,j=n-1;j>=i1;j-=2)Ai[j]=0,Ai[j-1]=0;for(j>i&&(Ai[j]=0),Ai[i]=d[i],j=i-1;j>=1;j-=2)Ai[j]=0,Ai[j-1]=0;0===j&&(Ai[0]=0),A[i]=Ai}return A},numeric.getDiag=function(A){var i,n=Math.min(A.length,A[0].length),ret=Array(n);for(i=n-1;i>=1;--i)ret[i]=A[i][i],ret[--i]=A[i][i];return 0===i&&(ret[0]=A[0][0]),ret},numeric.identity=function(n){return numeric.diag(numeric.rep([n],1))},numeric.pointwise=function(params,body,setup){void 0===setup&&(setup="");var k,p,fun=[],avec=/\[i\]$/,thevec="",haveret=!1;for(k=0;k<params.length;k++)avec.test(params[k])?thevec=p=params[k].substring(0,params[k].length-3):p=params[k],"ret"===p&&(haveret=!0),fun.push(p);return fun[params.length]="_s",fun[params.length+1]="_k",fun[params.length+2]='if(typeof _s === "undefined") _s = numeric.dim('+thevec+');\nif(typeof _k === "undefined") _k = 0;\nvar _n = _s[_k];\nvar i'+(haveret?"":", ret = Array(_n)")+";\nif(_k < _s.length-1) {\n for(i=_n-1;i>=0;i--) ret[i] = arguments.callee("+params.join(",")+",_s,_k+1);\n return ret;\n}\n"+setup+"\nfor(i=_n-1;i!==-1;--i) {\n "+body+"\n}\nreturn ret;",Function.apply(null,fun)},numeric.pointwise2=function(params,body,setup){void 0===setup&&(setup="");var k,p,fun=[],avec=/\[i\]$/,thevec="",haveret=!1;for(k=0;k<params.length;k++)avec.test(params[k])?thevec=p=params[k].substring(0,params[k].length-3):p=params[k],"ret"===p&&(haveret=!0),fun.push(p);return fun[params.length]="var _n = "+thevec+".length;\nvar i"+(haveret?"":", ret = Array(_n)")+";\n"+setup+"\nfor(i=_n-1;i!==-1;--i) {\n"+body+"\n}\nreturn ret;",Function.apply(null,fun)},numeric._biforeach=function _biforeach(x,y,s,k,f){if(k!==s.length-1){var i;for(i=s[k]-1;i>=0;i--)_biforeach("object"==typeof x?x[i]:x,"object"==typeof y?y[i]:y,s,k+1,f)}else f(x,y)},numeric._biforeach2=function _biforeach2(x,y,s,k,f){if(k===s.length-1)return f(x,y);var i,n=s[k],ret=Array(n);for(i=n-1;i>=0;--i)ret[i]=_biforeach2("object"==typeof x?x[i]:x,"object"==typeof y?y[i]:y,s,k+1,f);return ret},numeric._foreach=function _foreach(x,s,k,f){if(k!==s.length-1){var i;for(i=s[k]-1;i>=0;i--)_foreach(x[i],s,k+1,f)}else f(x)},numeric._foreach2=function _foreach2(x,s,k,f){if(k===s.length-1)return f(x);var i,n=s[k],ret=Array(n);for(i=n-1;i>=0;i--)ret[i]=_foreach2(x[i],s,k+1,f);return ret},numeric.ops2={add:"+",sub:"-",mul:"*",div:"/",mod:"%",and:"&&",or:"||",eq:"===",neq:"!==",lt:"<",gt:">",leq:"<=",geq:">=",band:"&",bor:"|",bxor:"^",lshift:"<<",rshift:">>",rrshift:">>>"},numeric.opseq={addeq:"+=",subeq:"-=",muleq:"*=",diveq:"/=",modeq:"%=",lshifteq:"<<=",rshifteq:">>=",rrshifteq:">>>=",bandeq:"&=",boreq:"|=",bxoreq:"^="},numeric.mathfuns=["abs","acos","asin","atan","ceil","cos","exp","floor","log","round","sin","sqrt","tan","isNaN","isFinite"],numeric.mathfuns2=["atan2","pow","max","min"],numeric.ops1={neg:"-",not:"!",bnot:"~",clone:""},numeric.mapreducers={any:["if(xi) return true;","var accum = false;"],all:["if(!xi) return false;","var accum = true;"],sum:["accum += xi;","var accum = 0;"],prod:["accum *= xi;","var accum = 1;"],norm2Squared:["accum += xi*xi;","var accum = 0;"],norminf:["accum = max(accum,abs(xi));","var accum = 0, max = Math.max, abs = Math.abs;"],norm1:["accum += abs(xi)","var accum = 0, abs = Math.abs;"],sup:["accum = max(accum,xi);","var accum = -Infinity, max = Math.max;"],inf:["accum = min(accum,xi);","var accum = Infinity, min = Math.min;"]},function(){var i,o;for(i=0;i<numeric.mathfuns2.length;++i)o=numeric.mathfuns2[i],numeric.ops2[o]=o;for(i in numeric.ops2)if(numeric.ops2.hasOwnProperty(i)){o=numeric.ops2[i];var code,codeeq,setup="";-1!==numeric.myIndexOf.call(numeric.mathfuns2,i)?(setup="var "+o+" = Math."+o+";\n",code=function(r,x,y){return r+" = "+o+"("+x+","+y+")"},codeeq=function(x,y){return x+" = "+o+"("+x+","+y+")"}):(code=function(r,x,y){return r+" = "+x+" "+o+" "+y},codeeq=numeric.opseq.hasOwnProperty(i+"eq")?function(x,y){return x+" "+o+"= "+y}:function(x,y){return x+" = "+x+" "+o+" "+y}),numeric[i+"VV"]=numeric.pointwise2(["x[i]","y[i]"],code("ret[i]","x[i]","y[i]"),setup),numeric[i+"SV"]=numeric.pointwise2(["x","y[i]"],code("ret[i]","x","y[i]"),setup),numeric[i+"VS"]=numeric.pointwise2(["x[i]","y"],code("ret[i]","x[i]","y"),setup),numeric[i]=Function("var n = arguments.length, i, x = arguments[0], y;\nvar VV = numeric."+i+"VV, VS = numeric."+i+"VS, SV = numeric."+i+'SV;\nvar dim = numeric.dim;\nfor(i=1;i!==n;++i) { \n y = arguments[i];\n if(typeof x === "object") {\n if(typeof y === "object") x = numeric._biforeach2(x,y,dim(x),0,VV);\n else x = numeric._biforeach2(x,y,dim(x),0,VS);\n } else if(typeof y === "object") x = numeric._biforeach2(x,y,dim(y),0,SV);\n else '+codeeq("x","y")+"\n}\nreturn x;\n"),numeric[o]=numeric[i],numeric[i+"eqV"]=numeric.pointwise2(["ret[i]","x[i]"],codeeq("ret[i]","x[i]"),setup),numeric[i+"eqS"]=numeric.pointwise2(["ret[i]","x"],codeeq("ret[i]","x"),setup),numeric[i+"eq"]=Function("var n = arguments.length, i, x = arguments[0], y;\nvar V = numeric."+i+"eqV, S = numeric."+i+'eqS\nvar s = numeric.dim(x);\nfor(i=1;i!==n;++i) { \n y = arguments[i];\n if(typeof y === "object") numeric._biforeach(x,y,s,0,V);\n else numeric._biforeach(x,y,s,0,S);\n}\nreturn x;\n')}for(i=0;i<numeric.mathfuns2.length;++i)o=numeric.mathfuns2[i],delete numeric.ops2[o];for(i=0;i<numeric.mathfuns.length;++i)o=numeric.mathfuns[i],numeric.ops1[o]=o;for(i in numeric.ops1)numeric.ops1.hasOwnProperty(i)&&(setup="",o=numeric.ops1[i],-1!==numeric.myIndexOf.call(numeric.mathfuns,i)&&Math.hasOwnProperty(o)&&(setup="var "+o+" = Math."+o+";\n"),numeric[i+"eqV"]=numeric.pointwise2(["ret[i]"],"ret[i] = "+o+"(ret[i]);",setup),numeric[i+"eq"]=Function("x",'if(typeof x !== "object") return '+o+"x\nvar i;\nvar V = numeric."+i+"eqV;\nvar s = numeric.dim(x);\nnumeric._foreach(x,s,0,V);\nreturn x;\n"),numeric[i+"V"]=numeric.pointwise2(["x[i]"],"ret[i] = "+o+"(x[i]);",setup),numeric[i]=Function("x",'if(typeof x !== "object") return '+o+"(x)\nvar i;\nvar V = numeric."+i+"V;\nvar s = numeric.dim(x);\nreturn numeric._foreach2(x,s,0,V);\n"));for(i=0;i<numeric.mathfuns.length;++i)o=numeric.mathfuns[i],delete numeric.ops1[o];for(i in numeric.mapreducers)numeric.mapreducers.hasOwnProperty(i)&&(o=numeric.mapreducers[i],numeric[i+"V"]=numeric.mapreduce2(o[0],o[1]),numeric[i]=Function("x","s","k",o[1]+'if(typeof x !== "object") { xi = x;\n'+o[0]+';\n return accum;\n}if(typeof s === "undefined") s = numeric.dim(x);\nif(typeof k === "undefined") k = 0;\nif(k === s.length-1) return numeric.'+i+"V(x);\nvar xi;\nvar n = x.length, i;\nfor(i=n-1;i!==-1;--i) {\n xi = arguments.callee(x[i]);\n"+o[0]+";\n}\nreturn accum;\n"))}(),numeric.truncVV=numeric.pointwise(["x[i]","y[i]"],"ret[i] = round(x[i]/y[i])*y[i];","var round = Math.round;"),numeric.truncVS=numeric.pointwise(["x[i]","y"],"ret[i] = round(x[i]/y)*y;","var round = Math.round;"),numeric.truncSV=numeric.pointwise(["x","y[i]"],"ret[i] = round(x/y[i])*y[i];","var round = Math.round;"),numeric.trunc=function(x,y){return"object"==typeof x?"object"==typeof y?numeric.truncVV(x,y):numeric.truncVS(x,y):"object"==typeof y?numeric.truncSV(x,y):Math.round(x/y)*y},numeric.inv=function(x){var Ai,Aj,Ii,Ij,i,j,k,x,s=numeric.dim(x),abs=Math.abs,m=s[0],n=s[1],A=numeric.clone(x),I=numeric.identity(m);for(j=0;j<n;++j){var i0=-1,v0=-1;for(i=j;i!==m;++i)(k=abs(A[i][j]))>v0&&(i0=i,v0=k);for(Aj=A[i0],A[i0]=A[j],A[j]=Aj,Ij=I[i0],I[i0]=I[j],I[j]=Ij,x=Aj[j],k=j;k!==n;++k)Aj[k]/=x;for(k=n-1;-1!==k;--k)Ij[k]/=x;for(i=m-1;-1!==i;--i)if(i!==j){for(Ai=A[i],Ii=I[i],x=Ai[j],k=j+1;k!==n;++k)Ai[k]-=Aj[k]*x;for(k=n-1;k>0;--k)Ii[k]-=Ij[k]*x,Ii[--k]-=Ij[k]*x;0===k&&(Ii[0]-=Ij[0]*x)}}return I},numeric.det=function(x){var s=numeric.dim(x);if(2!==s.length||s[0]!==s[1])throw new Error("numeric: det() only works on square matrices");var i,j,k,Aj,Ai,alpha,temp,k1,n=s[0],ret=1,A=numeric.clone(x);for(j=0;j<n-1;j++){for(k=j,i=j+1;i<n;i++)Math.abs(A[i][j])>Math.abs(A[k][j])&&(k=i);for(k!==j&&(temp=A[k],A[k]=A[j],A[j]=temp,ret*=-1),Aj=A[j],i=j+1;i<n;i++){for(alpha=(Ai=A[i])[j]/Aj[j],k=j+1;k<n-1;k+=2)k1=k+1,Ai[k]-=Aj[k]*alpha,Ai[k1]-=Aj[k1]*alpha;k!==n&&(Ai[k]-=Aj[k]*alpha)}if(0===Aj[j])return 0;ret*=Aj[j]}return ret*A[j][j]},numeric.transpose=function(x){var i,j,A0,A1,Bj,m=x.length,n=x[0].length,ret=Array(n);for(j=0;j<n;j++)ret[j]=Array(m);for(i=m-1;i>=1;i-=2){for(A1=x[i],A0=x[i-1],j=n-1;j>=1;--j)(Bj=ret[j])[i]=A1[j],Bj[i-1]=A0[j],(Bj=ret[--j])[i]=A1[j],Bj[i-1]=A0[j];0===j&&((Bj=ret[0])[i]=A1[0],Bj[i-1]=A0[0])}if(0===i){for(A0=x[0],j=n-1;j>=1;--j)ret[j][0]=A0[j],ret[--j][0]=A0[j];0===j&&(ret[0][0]=A0[0])}return ret},numeric.negtranspose=function(x){var i,j,A0,A1,Bj,m=x.length,n=x[0].length,ret=Array(n);for(j=0;j<n;j++)ret[j]=Array(m);for(i=m-1;i>=1;i-=2){for(A1=x[i],A0=x[i-1],j=n-1;j>=1;--j)(Bj=ret[j])[i]=-A1[j],Bj[i-1]=-A0[j],(Bj=ret[--j])[i]=-A1[j],Bj[i-1]=-A0[j];0===j&&((Bj=ret[0])[i]=-A1[0],Bj[i-1]=-A0[0])}if(0===i){for(A0=x[0],j=n-1;j>=1;--j)ret[j][0]=-A0[j],ret[--j][0]=-A0[j];0===j&&(ret[0][0]=-A0[0])}return ret},numeric._random=function _random(s,k){var i,rnd,n=s[k],ret=Array(n);if(k===s.length-1){for(rnd=Math.random,i=n-1;i>=1;i-=2)ret[i]=rnd(),ret[i-1]=rnd();return 0===i&&(ret[0]=rnd()),ret}for(i=n-1;i>=0;i--)ret[i]=_random(s,k+1);return ret},numeric.random=function(s){return numeric._random(s,0)},numeric.norm2=function(x){return Math.sqrt(numeric.norm2Squared(x))},numeric.linspace=function(a,b,n){if(void 0===n&&(n=Math.max(Math.round(b-a)+1,1)),n<2)return 1===n?[a]:[];var i,ret=Array(n);for(i=--n;i>=0;i--)ret[i]=(i*b+(n-i)*a)/n;return ret},numeric.getBlock=function(x,from,to){function foo(x,k){var i,a=from[k],n=to[k]-a,ret=Array(n);if(k===s.length-1){for(i=n;i>=0;i--)ret[i]=x[i+a];return ret}for(i=n;i>=0;i--)ret[i]=foo(x[i+a],k+1);return ret}var s=numeric.dim(x);return foo(x,0)},numeric.setBlock=function(x,from,to,B){function foo(x,y,k){var i,a=from[k],n=to[k]-a;if(k===s.length-1)for(i=n;i>=0;i--)x[i+a]=y[i];for(i=n;i>=0;i--)foo(x[i+a],y[i],k+1)}var s=numeric.dim(x);return foo(x,B,0),x},numeric.getRange=function(A,I,J){var i,j,Bi,AI,m=I.length,n=J.length,B=Array(m);for(i=m-1;-1!==i;--i)for(B[i]=Array(n),Bi=B[i],AI=A[I[i]],j=n-1;-1!==j;--j)Bi[j]=AI[J[j]];return B},numeric.blockMatrix=function(X){var s=numeric.dim(X);if(s.length<4)return numeric.blockMatrix([X]);var M,N,i,j,Xij,m=s[0],n=s[1];for(M=0,N=0,i=0;i<m;++i)M+=X[i][0].length;for(j=0;j<n;++j)N+=X[0][j][0].length;var Z=Array(M);for(i=0;i<M;++i)Z[i]=Array(N);var J,ZI,k,l,Xijk,I=0;for(i=0;i<m;++i){for(J=N,j=n-1;-1!==j;--j)for(J-=(Xij=X[i][j])[0].length,k=Xij.length-1;-1!==k;--k)for(Xijk=Xij[k],ZI=Z[I+k],l=Xijk.length-1;-1!==l;--l)ZI[J+l]=Xijk[l];I+=X[i][0].length}return Z},numeric.tensor=function(x,y){if("number"==typeof x||"number"==typeof y)return numeric.mul(x,y);var s1=numeric.dim(x),s2=numeric.dim(y);if(1!==s1.length||1!==s2.length)throw new Error("numeric: tensor product is only defined for vectors");var Ai,i,j,xi,m=s1[0],n=s2[0],A=Array(m);for(i=m-1;i>=0;i--){for(Ai=Array(n),xi=x[i],j=n-1;j>=3;--j)Ai[j]=xi*y[j],Ai[--j]=xi*y[j],Ai[--j]=xi*y[j],Ai[--j]=xi*y[j];for(;j>=0;)Ai[j]=xi*y[j],--j;A[i]=Ai}return A},numeric.T=function(x,y){this.x=x,this.y=y},numeric.t=function(x,y){return new numeric.T(x,y)},numeric.Tbinop=function(rr,rc,cr,cc,setup){numeric.indexOf;if("string"!=typeof setup){var k;setup="";for(k in numeric)numeric.hasOwnProperty(k)&&(rr.indexOf(k)>=0||rc.indexOf(k)>=0||cr.indexOf(k)>=0||cc.indexOf(k)>=0)&&k.length>1&&(setup+="var "+k+" = numeric."+k+";\n")}return Function(["y"],"var x = this;\nif(!(y instanceof numeric.T)) { y = new numeric.T(y); }\n"+setup+"\nif(x.y) { if(y.y) { return new numeric.T("+cc+");\n }\n return new numeric.T("+cr+");\n}\nif(y.y) {\n return new numeric.T("+rc+");\n}\nreturn new numeric.T("+rr+");\n")},numeric.T.prototype.add=numeric.Tbinop("add(x.x,y.x)","add(x.x,y.x),y.y","add(x.x,y.x),x.y","add(x.x,y.x),add(x.y,y.y)"),numeric.T.prototype.sub=numeric.Tbinop("sub(x.x,y.x)","sub(x.x,y.x),neg(y.y)","sub(x.x,y.x),x.y","sub(x.x,y.x),sub(x.y,y.y)"),numeric.T.prototype.mul=numeric.Tbinop("mul(x.x,y.x)","mul(x.x,y.x),mul(x.x,y.y)","mul(x.x,y.x),mul(x.y,y.x)","sub(mul(x.x,y.x),mul(x.y,y.y)),add(mul(x.x,y.y),mul(x.y,y.x))"),numeric.T.prototype.reciprocal=function(){var mul=numeric.mul,div=numeric.div;if(this.y){var d=numeric.add(mul(this.x,this.x),mul(this.y,this.y));return new numeric.T(div(this.x,d),div(numeric.neg(this.y),d))}return new T(div(1,this.x))},numeric.T.prototype.div=function(y){if(y instanceof numeric.T||(y=new numeric.T(y)),y.y)return this.mul(y.reciprocal());var div=numeric.div;return this.y?new numeric.T(div(this.x,y.x),div(this.y,y.x)):new numeric.T(div(this.x,y.x))},numeric.T.prototype.dot=numeric.Tbinop("dot(x.x,y.x)","dot(x.x,y.x),dot(x.x,y.y)","dot(x.x,y.x),dot(x.y,y.x)","sub(dot(x.x,y.x),dot(x.y,y.y)),add(dot(x.x,y.y),dot(x.y,y.x))"),numeric.T.prototype.transpose=function(){var t=numeric.transpose,x=this.x,y=this.y;return y?new numeric.T(t(x),t(y)):new numeric.T(t(x))},numeric.T.prototype.transjugate=function(){var t=numeric.transpose,x=this.x,y=this.y;return y?new numeric.T(t(x),numeric.negtranspose(y)):new numeric.T(t(x))},numeric.Tunop=function(r,c,s){return"string"!=typeof s&&(s=""),Function("var x = this;\n"+s+"\nif(x.y) { "+c+";\n}\n"+r+";\n")},numeric.T.prototype.exp=numeric.Tunop("return new numeric.T(ex)","return new numeric.T(mul(cos(x.y),ex),mul(sin(x.y),ex))","var ex = numeric.exp(x.x), cos = numeric.cos, sin = numeric.sin, mul = numeric.mul;"),numeric.T.prototype.conj=numeric.Tunop("return new numeric.T(x.x);","return new numeric.T(x.x,numeric.neg(x.y));"),numeric.T.prototype.neg=numeric.Tunop("return new numeric.T(neg(x.x));","return new numeric.T(neg(x.x),neg(x.y));","var neg = numeric.neg;"),numeric.T.prototype.sin=numeric.Tunop("return new numeric.T(numeric.sin(x.x))","return x.exp().sub(x.neg().exp()).div(new numeric.T(0,2));"),numeric.T.prototype.cos=numeric.Tunop("return new numeric.T(numeric.cos(x.x))","return x.exp().add(x.neg().exp()).div(2);"),numeric.T.prototype.abs=numeric.Tunop("return new numeric.T(numeric.abs(x.x));","return new numeric.T(numeric.sqrt(numeric.add(mul(x.x,x.x),mul(x.y,x.y))));","var mul = numeric.mul;"),numeric.T.prototype.log=numeric.Tunop("return new numeric.T(numeric.log(x.x));","var theta = new numeric.T(numeric.atan2(x.y,x.x)), r = x.abs();\nreturn new numeric.T(numeric.log(r.x),theta.x);"),numeric.T.prototype.norm2=numeric.Tunop("return numeric.norm2(x.x);","var f = numeric.norm2Squared;\nreturn Math.sqrt(f(x.x)+f(x.y));"),numeric.T.prototype.inv=function(){var A=this;if(void 0===A.y)return new numeric.T(numeric.inv(A.x));var Aix,Aiy,Ajx,Ajy,Rix,Riy,Rjx,Rjy,i,j,k,d,d1,ax,ay,bx,by,temp,n=A.x.length,Rx=numeric.identity(n),Ry=numeric.rep([n,n],0),Ax=numeric.clone(A.x),Ay=numeric.clone(A.y);for(i=0;i<n;i++){for(d=(ax=Ax[i][i])*ax+(ay=Ay[i][i])*ay,k=i,j=i+1;j<n;j++)(d1=(ax=Ax[j][i])*ax+(ay=Ay[j][i])*ay)>d&&(k=j,d=d1);for(k!==i&&(temp=Ax[i],Ax[i]=Ax[k],Ax[k]=temp,temp=Ay[i],Ay[i]=Ay[k],Ay[k]=temp,temp=Rx[i],Rx[i]=Rx[k],Rx[k]=temp,temp=Ry[i],Ry[i]=Ry[k],Ry[k]=temp),Aix=Ax[i],Aiy=Ay[i],Rix=Rx[i],Riy=Ry[i],ax=Aix[i],ay=Aiy[i],j=i+1;j<n;j++)bx=Aix[j],by=Aiy[j],Aix[j]=(bx*ax+by*ay)/d,Aiy[j]=(by*ax-bx*ay)/d;for(j=0;j<n;j++)bx=Rix[j],by=Riy[j],Rix[j]=(bx*ax+by*ay)/d,Riy[j]=(by*ax-bx*ay)/d;for(j=i+1;j<n;j++){for(Ajx=Ax[j],Ajy=Ay[j],Rjx=Rx[j],Rjy=Ry[j],ax=Ajx[i],ay=Ajy[i],k=i+1;k<n;k++)bx=Aix[k],by=Aiy[k],Ajx[k]-=bx*ax-by*ay,Ajy[k]-=by*ax+bx*ay;for(k=0;k<n;k++)bx=Rix[k],by=Riy[k],Rjx[k]-=bx*ax-by*ay,Rjy[k]-=by*ax+bx*ay}}for(i=n-1;i>0;i--)for(Rix=Rx[i],Riy=Ry[i],j=i-1;j>=0;j--)for(Rjx=Rx[j],Rjy=Ry[j],ax=Ax[j][i],ay=Ay[j][i],k=n-1;k>=0;k--)bx=Rix[k],by=Riy[k],Rjx[k]-=ax*bx-ay*by,Rjy[k]-=ax*by+ay*bx;return new numeric.T(Rx,Ry)},numeric.T.prototype.get=function(i){var ik,x=this.x,y=this.y,k=0,n=i.length;if(y){for(;k<n;)x=x[ik=i[k]],y=y[ik],k++;return new numeric.T(x,y)}for(;k<n;)x=x[ik=i[k]],k++;return new numeric.T(x)},numeric.T.prototype.set=function(i,v){var ik,x=this.x,y=this.y,k=0,n=i.length,vx=v.x,vy=v.y;if(0===n)return vy?this.y=vy:y&&(this.y=void 0),this.x=x,this;if(vy){for(y||(y=numeric.rep(numeric.dim(x),0),this.y=y);k<n-1;)x=x[ik=i[k]],y=y[ik],k++;return ik=i[k],x[ik]=vx,y[ik]=vy,this}if(y){for(;k<n-1;)x=x[ik=i[k]],y=y[ik],k++;return ik=i[k],x[ik]=vx,vx instanceof Array?y[ik]=numeric.rep(numeric.dim(vx),0):y[ik]=0,this}for(;k<n-1;)x=x[ik=i[k]],k++;return ik=i[k],x[ik]=vx,this},numeric.T.prototype.getRows=function(i0,i1){var j,ry,n=i1-i0+1,rx=Array(n),x=this.x,y=this.y;for(j=i0;j<=i1;j++)rx[j-i0]=x[j];if(y){for(ry=Array(n),j=i0;j<=i1;j++)ry[j-i0]=y[j];return new numeric.T(rx,ry)}return new numeric.T(rx)},numeric.T.prototype.setRows=function(i0,i1,A){var j,rx=this.x,ry=this.y,x=A.x,y=A.y;for(j=i0;j<=i1;j++)rx[j]=x[j-i0];if(y)for(ry||(ry=numeric.rep(numeric.dim(rx),0),this.y=ry),j=i0;j<=i1;j++)ry[j]=y[j-i0];else if(ry)for(j=i0;j<=i1;j++)ry[j]=numeric.rep([x[j-i0].length],0);return this},numeric.T.prototype.getRow=function(k){var x=this.x,y=this.y;return y?new numeric.T(x[k],y[k]):new numeric.T(x[k])},numeric.T.prototype.setRow=function(i,v){var rx=this.x,ry=this.y,x=v.x,y=v.y;return rx[i]=x,y?(ry||(ry=numeric.rep(numeric.dim(rx),0),this.y=ry),ry[i]=y):ry&&(ry=numeric.rep([x.length],0)),this},numeric.T.prototype.getBlock=function(from,to){var x=this.x,y=this.y,b=numeric.getBlock;return y?new numeric.T(b(x,from,to),b(y,from,to)):new numeric.T(b(x,from,to))},numeric.T.prototype.setBlock=function(from,to,A){A instanceof numeric.T||(A=new numeric.T(A));var x=this.x,y=this.y,b=numeric.setBlock,Ax=A.x,Ay=A.y;if(Ay)return y||(this.y=numeric.rep(numeric.dim(this),0),y=this.y),b(x,from,to,Ax),b(y,from,to,Ay),this;b(x,from,to,Ax),y&&b(y,from,to,numeric.rep(numeric.dim(Ax),0))},numeric.T.rep=function(s,v){var T=numeric.T;v instanceof T||(v=new T(v));var x=v.x,y=v.y,r=numeric.rep;return y?new T(r(s,x),r(s,y)):new T(r(s,x))},numeric.T.diag=function(d){d instanceof numeric.T||(d=new numeric.T(d));var x=d.x,y=d.y,diag=numeric.diag;return y?new numeric.T(diag(x),diag(y)):new numeric.T(diag(x))},numeric.T.eig=function(){if(this.y)throw new Error("eig: not implemented for complex matrices.");return numeric.eig(this.x)},numeric.T.identity=function(n){return new numeric.T(numeric.identity(n))},numeric.T.prototype.getDiag=function(){var n=numeric,x=this.x,y=this.y;return y?new n.T(n.getDiag(x),n.getDiag(y)):new n.T(n.getDiag(x))},numeric.house=function(x){var v=numeric.clone(x),alpha=(x[0]>=0?1:-1)*numeric.norm2(x);v[0]+=alpha;var foo=numeric.norm2(v);if(0===foo)throw new Error("eig: internal error");return numeric.div(v,foo)},numeric.toUpperHessenberg=function(me){var s=numeric.dim(me);if(2!==s.length||s[0]!==s[1])throw new Error("numeric: toUpperHessenberg() only works on square matrices");var i,j,k,x,v,B,C,Ai,Ci,Qi,m=s[0],A=numeric.clone(me),Q=numeric.identity(m);for(j=0;j<m-2;j++){for(x=Array(m-j-1),i=j+1;i<m;i++)x[i-j-1]=A[i][j];if(numeric.norm2(x)>0){for(v=numeric.house(x),B=numeric.getBlock(A,[j+1,j],[m-1,m-1]),C=numeric.tensor(v,numeric.dot(v,B)),i=j+1;i<m;i++)for(Ai=A[i],Ci=C[i-j-1],k=j;k<m;k++)Ai[k]-=2*Ci[k-j];for(B=numeric.getBlock(A,[0,j+1],[m-1,m-1]),C=numeric.tensor(numeric.dot(B,v),v),i=0;i<m;i++)for(Ai=A[i],Ci=C[i],k=j+1;k<m;k++)Ai[k]-=2*Ci[k-j-1];for(B=Array(m-j-1),i=j+1;i<m;i++)B[i-j-1]=Q[i];for(C=numeric.tensor(v,numeric.dot(v,B)),i=j+1;i<m;i++)for(Qi=Q[i],Ci=C[i-j-1],k=0;k<m;k++)Qi[k]-=2*Ci[k]}}return{H:A,Q:Q}},numeric.epsilon=2.220446049250313e-16,numeric.QRFrancis=function(H,maxiter){void 0===maxiter&&(maxiter=1e4),H=numeric.clone(H);numeric.clone(H);var x,v,a,b,c,d,det,tr,Hloc,Qi,Hi,B,C,Ci,i,j,k,iter,m=numeric.dim(H)[0],Q=numeric.identity(m);if(m<3)return{Q:Q,B:[[0,m-1]]};var epsilon=numeric.epsilon;for(iter=0;iter<maxiter;iter++){for(j=0;j<m-1;j++)if(Math.abs(H[j+1][j])<epsilon*(Math.abs(H[j][j])+Math.abs(H[j+1][j+1]))){var QH1=numeric.QRFrancis(numeric.getBlock(H,[0,0],[j,j]),maxiter),QH2=numeric.QRFrancis(numeric.getBlock(H,[j+1,j+1],[m-1,m-1]),maxiter);for(B=Array(j+1),i=0;i<=j;i++)B[i]=Q[i];for(C=numeric.dot(QH1.Q,B),i=0;i<=j;i++)Q[i]=C[i];for(B=Array(m-j-1),i=j+1;i<m;i++)B[i-j-1]=Q[i];for(C=numeric.dot(QH2.Q,B),i=j+1;i<m;i++)Q[i]=C[i-j-1];return{Q:Q,B:QH1.B.concat(numeric.add(QH2.B,j+1))}}if(a=H[m-2][m-2],b=H[m-2][m-1],c=H[m-1][m-2],d=H[m-1][m-1],tr=a+d,det=a*d-b*c,Hloc=numeric.getBlock(H,[0,0],[2,2]),tr*tr>=4*det){var s1,s2;s1=.5*(tr+Math.sqrt(tr*tr-4*det)),s2=.5*(tr-Math.sqrt(tr*tr-4*det)),Hloc=numeric.add(numeric.sub(numeric.dot(Hloc,Hloc),numeric.mul(Hloc,s1+s2)),numeric.diag(numeric.rep([3],s1*s2)))}else Hloc=numeric.add(numeric.sub(numeric.dot(Hloc,Hloc),numeric.mul(Hloc,tr)),numeric.diag(numeric.rep([3],det)));for(x=[Hloc[0][0],Hloc[1][0],Hloc[2][0]],v=numeric.house(x),B=[H[0],H[1],H[2]],C=numeric.tensor(v,numeric.dot(v,B)),i=0;i<3;i++)for(Hi=H[i],Ci=C[i],k=0;k<m;k++)Hi[k]-=2*Ci[k];for(B=numeric.getBlock(H,[0,0],[m-1,2]),C=numeric.tensor(numeric.dot(B,v),v),i=0;i<m;i++)for(Hi=H[i],Ci=C[i],k=0;k<3;k++)Hi[k]-=2*Ci[k];for(B=[Q[0],Q[1],Q[2]],C=numeric.tensor(v,numeric.dot(v,B)),i=0;i<3;i++)for(Qi=Q[i],Ci=C[i],k=0;k<m;k++)Qi[k]-=2*Ci[k];var J;for(j=0;j<m-2;j++){for(k=j;k<=j+1;k++)if(Math.abs(H[k+1][k])<epsilon*(Math.abs(H[k][k])+Math.abs(H[k+1][k+1]))){var QH1=numeric.QRFrancis(numeric.getBlock(H,[0,0],[k,k]),maxiter),QH2=numeric.QRFrancis(numeric.getBlock(H,[k+1,k+1],[m-1,m-1]),maxiter);for(B=Array(k+1),i=0;i<=k;i++)B[i]=Q[i];for(C=numeric.dot(QH1.Q,B),i=0;i<=k;i++)Q[i]=C[i];for(B=Array(m-k-1),i=k+1;i<m;i++)B[i-k-1]=Q[i];for(C=numeric.dot(QH2.Q,B),i=k+1;i<m;i++)Q[i]=C[i-k-1];return{Q:Q,B:QH1.B.concat(numeric.add(QH2.B,k+1))}}for(J=Math.min(m-1,j+3),x=Array(J-j),i=j+1;i<=J;i++)x[i-j-1]=H[i][j];for(v=numeric.house(x),B=numeric.getBlock(H,[j+1,j],[J,m-1]),C=numeric.tensor(v,numeric.dot(v,B)),i=j+1;i<=J;i++)for(Hi=H[i],Ci=C[i-j-1],k=j;k<m;k++)Hi[k]-=2*Ci[k-j];for(B=numeric.getBlock(H,[0,j+1],[m-1,J]),C=numeric.tensor(numeric.dot(B,v),v),i=0;i<m;i++)for(Hi=H[i],Ci=C[i],k=j+1;k<=J;k++)Hi[k]-=2*Ci[k-j-1];for(B=Array(J-j),i=j+1;i<=J;i++)B[i-j-1]=Q[i];for(C=numeric.tensor(v,numeric.dot(v,B)),i=j+1;i<=J;i++)for(Qi=Q[i],Ci=C[i-j-1],k=0;k<m;k++)Qi[k]-=2*Ci[k]}}throw new Error("numeric: eigenvalue iteration does not converge -- increase maxiter?")},numeric.eig=function(A,maxiter){var i,k,Q0,j,a,b,c,d,p1,disc,x,y,p,q,n1,n2,QH=numeric.toUpperHessenberg(A),QB=numeric.QRFrancis(QH.H,maxiter),T=numeric.T,n=A.length,B=QB.B,H=numeric.dot(QB.Q,numeric.dot(QH.H,numeric.transpose(QB.Q))),Q=new T(numeric.dot(QB.Q,QH.Q)),m=B.length,sqrt=Math.sqrt;for(k=0;k<m;k++)if((i=B[k][0])===B[k][1]);else{if(j=i+1,a=H[i][i],b=H[i][j],c=H[j][i],d=H[j][j],0===b&&0===c)continue;(disc=(p1=-a-d)*p1-4*(a*d-b*c))>=0?((n1=(a-(x=p1<0?-.5*(p1-sqrt(disc)):-.5*(p1+sqrt(disc))))*(a-x)+b*b)>(n2=c*c+(d-x)*(d-x))?(p=(a-x)/(n1=sqrt(n1)),q=b/n1):(p=c/(n2=sqrt(n2)),q=(d-x)/n2),Q0=new T([[q,-p],[p,q]]),Q.setRows(i,j,Q0.dot(Q.getRows(i,j)))):(x=-.5*p1,y=.5*sqrt(-disc),(n1=(a-x)*(a-x)+b*b)>(n2=c*c+(d-x)*(d-x))?(p=(a-x)/(n1=sqrt(n1+y*y)),q=b/n1,x=0,y/=n1):(p=c/(n2=sqrt(n2+y*y)),q=(d-x)/n2,x=y/n2,y=0),Q0=new T([[q,-p],[p,q]],[[x,y],[y,-x]]),Q.setRows(i,j,Q0.dot(Q.getRows(i,j))))}var R=Q.dot(A).dot(Q.transjugate()),n=A.length,E=numeric.T.identity(n);for(j=0;j<n;j++)if(j>0)for(k=j-1;k>=0;k--){var Rk=R.get([k,k]),Rj=R.get([j,j]);numeric.neq(Rk.x,Rj.x)||numeric.neq(Rk.y,Rj.y)?(x=R.getRow(k).getBlock([k],[j-1]),y=E.getRow(j).getBlock([k],[j-1]),E.set([j,k],R.get([k,j]).neg().sub(x.dot(y)).div(Rk.sub(Rj)))):E.setRow(j,E.getRow(k))}for(j=0;j<n;j++)x=E.getRow(j),E.setRow(j,x.div(x.norm2()));return E=E.transpose(),E=Q.transjugate().dot(E),{lambda:R.getDiag(),E:E}},numeric.ccsSparse=function(A){var foo,i,j,m=A.length,counts=[];for(i=m-1;-1!==i;--i){foo=A[i];for(j in foo){for(j=parseInt(j);j>=counts.length;)counts[counts.length]=0;0!==foo[j]&&counts[j]++}}var n=counts.length,Ai=Array(n+1);for(Ai[0]=0,i=0;i<n;++i)Ai[i+1]=Ai[i]+counts[i];var Aj=Array(Ai[n]),Av=Array(Ai[n]);for(i=m-1;-1!==i;--i){foo=A[i];for(j in foo)0!==foo[j]&&(counts[j]--,Aj[Ai[j]+counts[j]]=i,Av[Ai[j]+counts[j]]=foo[j])}return[Ai,Aj,Av]},numeric.ccsFull=function(A){var i,j,j0,j1,Ai=A[0],Aj=A[1],Av=A[2],s=numeric.ccsDim(A),m=s[0],n=s[1],B=numeric.rep([m,n],0);for(i=0;i<n;i++)for(j0=Ai[i],j1=Ai[i+1],j=j0;j<j1;++j)B[Aj[j]][i]=Av