made with requirebin
Created
October 5, 2017 01:00
-
-
Save dlau/0cc03022c56d86f7d406572fef33c255 to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var regression = require('regression'); | |
var bands = [ 0,50,100,300,1000 ]; | |
var inputPoints = []; | |
$(function() { | |
$('#bands').val(bands.join(',')) | |
$('#bands').on('change', (e) => { | |
try { | |
bands = e.target.value.split(',').map(parseInt); | |
} | |
catch(e) { | |
bands = []; | |
} | |
}) | |
$('#values').on('change', (e) => { | |
try { | |
inputPoints = Papa.parse(e.target.value).data; | |
inputPoints = inputPoints.map((pair) => ( | |
pair.map((pt) => parseFloat(pt)) | |
)); | |
} | |
catch(e) { | |
inputPoints = []; | |
} | |
}); | |
$('button').click(() => { | |
console.log(bands); | |
for(let i=0; i < bands.length; ++i) { | |
let txt = ''; | |
const lowerBound = bands[i]; | |
const upperBound = bands[i+1] || bands.length; | |
txt += `Band: ${lowerBound} ${upperBound}`; | |
console.log(regression.exponential(inputPoints.slice(lowerBound, upperBound), {order: 4, precision:4})); | |
$('#result').append(`<div> ${txt} </div>`) | |
} | |
}) | |
}) | |
/*! | |
Papa Parse | |
v4.3.2 | |
https://github.com/mholt/PapaParse | |
*/ | |
!function(a,b){"function"==typeof define&&define.amd?define([],b):"object"==typeof module&&module.exports?module.exports=b():a.Papa=b()}(this,function(){"use strict";function a(a,b){b=b||{};var c=b.dynamicTyping||!1;if(r(c)&&(b.dynamicTypingFunction=c,c={}),b.dynamicTyping=c,b.worker&&z.WORKERS_SUPPORTED){var h=k();return h.userStep=b.step,h.userChunk=b.chunk,h.userComplete=b.complete,h.userError=b.error,b.step=r(b.step),b.chunk=r(b.chunk),b.complete=r(b.complete),b.error=r(b.error),delete b.worker,void h.postMessage({input:a,config:b,workerId:h.id})}var i=null;return"string"==typeof a?i=b.download?new d(b):new f(b):a.readable===!0&&r(a.read)&&r(a.on)?i=new g(b):(t.File&&a instanceof File||a instanceof Object)&&(i=new e(b)),i.stream(a)}function b(a,b){function c(){"object"==typeof b&&("string"==typeof b.delimiter&&1===b.delimiter.length&&z.BAD_DELIMITERS.indexOf(b.delimiter)===-1&&(j=b.delimiter),("boolean"==typeof b.quotes||b.quotes instanceof Array)&&(h=b.quotes),"string"==typeof b.newline&&(k=b.newline),"string"==typeof b.quoteChar&&(l=b.quoteChar),"boolean"==typeof b.header&&(i=b.header))}function d(a){if("object"!=typeof a)return[];var b=[];for(var c in a)b.push(c);return b}function e(a,b){var c="";"string"==typeof a&&(a=JSON.parse(a)),"string"==typeof b&&(b=JSON.parse(b));var d=a instanceof Array&&a.length>0,e=!(b[0]instanceof Array);if(d&&i){for(var g=0;g<a.length;g++)g>0&&(c+=j),c+=f(a[g],g);b.length>0&&(c+=k)}for(var h=0;h<b.length;h++){for(var l=d?a.length:b[h].length,m=0;m<l;m++){m>0&&(c+=j);var n=d&&e?a[m]:m;c+=f(b[h][n],m)}h<b.length-1&&(c+=k)}return c}function f(a,b){if("undefined"==typeof a||null===a)return"";a=a.toString().replace(m,l+l);var c="boolean"==typeof h&&h||h instanceof Array&&h[b]||g(a,z.BAD_DELIMITERS)||a.indexOf(j)>-1||" "===a.charAt(0)||" "===a.charAt(a.length-1);return c?l+a+l:a}function g(a,b){for(var c=0;c<b.length;c++)if(a.indexOf(b[c])>-1)return!0;return!1}var h=!1,i=!0,j=",",k="\r\n",l='"';c();var m=new RegExp(l,"g");if("string"==typeof a&&(a=JSON.parse(a)),a instanceof Array){if(!a.length||a[0]instanceof Array)return e(null,a);if("object"==typeof a[0])return e(d(a[0]),a)}else if("object"==typeof a)return"string"==typeof a.data&&(a.data=JSON.parse(a.data)),a.data instanceof Array&&(a.fields||(a.fields=a.meta&&a.meta.fields),a.fields||(a.fields=a.data[0]instanceof Array?a.fields:d(a.data[0])),a.data[0]instanceof Array||"object"==typeof a.data[0]||(a.data=[a.data])),e(a.fields||[],a.data||[]);throw"exception: Unable to serialize unrecognized input"}function c(a){function b(a){var b=p(a);b.chunkSize=parseInt(b.chunkSize),a.step||a.chunk||(b.chunkSize=null),this._handle=new h(b),this._handle.streamer=this,this._config=b}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},b.call(this,a),this.parseChunk=function(a){if(this.isFirstChunk&&r(this._config.beforeFirstChunk)){var b=this._config.beforeFirstChunk(a);void 0!==b&&(a=b)}this.isFirstChunk=!1;var c=this._partialLine+a;this._partialLine="";var d=this._handle.parse(c,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var e=d.meta.cursor;this._finished||(this._partialLine=c.substring(e-this._baseIndex),this._baseIndex=e),d&&d.data&&(this._rowCount+=d.data.length);var f=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(v)t.postMessage({results:d,workerId:z.WORKER_ID,finished:f});else if(r(this._config.chunk)){if(this._config.chunk(d,this._handle),this._paused)return;d=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(d.data),this._completeResults.errors=this._completeResults.errors.concat(d.errors),this._completeResults.meta=d.meta),!f||!r(this._config.complete)||d&&d.meta.aborted||this._config.complete(this._completeResults,this._input),f||d&&d.meta.paused||this._nextChunk(),d}},this._sendError=function(a){r(this._config.error)?this._config.error(a):v&&this._config.error&&t.postMessage({workerId:z.WORKER_ID,error:a,finished:!1})}}function d(a){function b(a){var b=a.getResponseHeader("Content-Range");return null===b?-1:parseInt(b.substr(b.lastIndexOf("/")+1))}a=a||{},a.chunkSize||(a.chunkSize=z.RemoteChunkSize),c.call(this,a);var d;u?this._nextChunk=function(){this._readChunk(),this._chunkLoaded()}:this._nextChunk=function(){this._readChunk()},this.stream=function(a){this._input=a,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(d=new XMLHttpRequest,this._config.withCredentials&&(d.withCredentials=this._config.withCredentials),u||(d.onload=q(this._chunkLoaded,this),d.onerror=q(this._chunkError,this)),d.open("GET",this._input,!u),this._config.downloadRequestHeaders){var a=this._config.downloadRequestHeaders;for(var b in a)d.setRequestHeader(b,a[b])}if(this._config.chunkSize){var c=this._start+this._config.chunkSize-1;d.setRequestHeader("Range","bytes="+this._start+"-"+c),d.setRequestHeader("If-None-Match","webkit-no-cache")}try{d.send()}catch(a){this._chunkError(a.message)}u&&0===d.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==d.readyState){if(d.status<200||d.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>b(d),this.parseChunk(d.responseText)}},this._chunkError=function(a){var b=d.statusText||a;this._sendError(b)}}function e(a){a=a||{},a.chunkSize||(a.chunkSize=z.LocalChunkSize),c.call(this,a);var b,d,e="undefined"!=typeof FileReader;this.stream=function(a){this._input=a,d=a.slice||a.webkitSlice||a.mozSlice,e?(b=new FileReader,b.onload=q(this._chunkLoaded,this),b.onerror=q(this._chunkError,this)):b=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var a=this._input;if(this._config.chunkSize){var c=Math.min(this._start+this._config.chunkSize,this._input.size);a=d.call(a,this._start,c)}var f=b.readAsText(a,this._config.encoding);e||this._chunkLoaded({target:{result:f}})},this._chunkLoaded=function(a){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(a.target.result)},this._chunkError=function(){this._sendError(b.error)}}function f(a){a=a||{},c.call(this,a);var b,d;this.stream=function(a){return b=a,d=a,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var a=this._config.chunkSize,b=a?d.substr(0,a):d;return d=a?d.substr(a):"",this._finished=!d,this.parseChunk(b)}}}function g(a){a=a||{},c.call(this,a);var b=[],d=!0;this.stream=function(a){this._input=a,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._nextChunk=function(){b.length?this.parseChunk(b.shift()):d=!0},this._streamData=q(function(a){try{b.push("string"==typeof a?a:a.toString(this._config.encoding)),d&&(d=!1,this.parseChunk(b.shift()))}catch(a){this._streamError(a)}},this),this._streamError=q(function(a){this._streamCleanUp(),this._sendError(a.message)},this),this._streamEnd=q(function(){this._streamCleanUp(),this._finished=!0,this._streamData("")},this),this._streamCleanUp=q(function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)},this)}function h(a){function b(){if(x&&o&&(l("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+z.DefaultDelimiter+"'"),o=!1),a.skipEmptyLines)for(var b=0;b<x.data.length;b++)1===x.data[b].length&&""===x.data[b][0]&&x.data.splice(b--,1);return c()&&d(),g()}function c(){return a.header&&0===w.length}function d(){if(x){for(var a=0;c()&&a<x.data.length;a++)for(var b=0;b<x.data[a].length;b++)w.push(x.data[a][b]);x.data.splice(0,1)}}function e(b){return a.dynamicTypingFunction&&void 0===a.dynamicTyping[b]&&(a.dynamicTyping[b]=a.dynamicTypingFunction(b)),(a.dynamicTyping[b]||a.dynamicTyping)===!0}function f(a,b){return e(a)?"true"===b||"TRUE"===b||"false"!==b&&"FALSE"!==b&&k(b):b}function g(){if(!x||!a.header&&!a.dynamicTyping)return x;for(var b=0;b<x.data.length;b++){for(var c=a.header?{}:[],d=0;d<x.data[b].length;d++){var e=d,g=x.data[b][d];a.header&&(e=d>=w.length?"__parsed_extra":w[d]),g=f(e,g),"__parsed_extra"===e?(c[e]=c[e]||[],c[e].push(g)):c[e]=g}x.data[b]=c,a.header&&(d>w.length?l("FieldMismatch","TooManyFields","Too many fields: expected "+w.length+" fields but parsed "+d,b):d<w.length&&l("FieldMismatch","TooFewFields","Too few fields: expected "+w.length+" fields but parsed "+d,b))}return a.header&&x.meta&&(x.meta.fields=w),x}function h(b,c){for(var d,e,f,g=[",","\t","|",";",z.RECORD_SEP,z.UNIT_SEP],h=0;h<g.length;h++){var j=g[h],k=0,l=0;f=void 0;for(var m=new i({delimiter:j,newline:c,preview:10}).parse(b),n=0;n<m.data.length;n++){var o=m.data[n].length;l+=o,"undefined"!=typeof f?o>1&&(k+=Math.abs(o-f),f=o):f=o}m.data.length>0&&(l/=m.data.length),("undefined"==typeof e||k<e)&&l>1.99&&(e=k,d=j)}return a.delimiter=d,{successful:!!d,bestDelimiter:d}}function j(a){a=a.substr(0,1048576);var b=a.split("\r"),c=a.split("\n"),d=c.length>1&&c[0].length<b[0].length;if(1===b.length||d)return"\n";for(var e=0,f=0;f<b.length;f++)"\n"===b[f][0]&&e++;return e>=b.length/2?"\r\n":"\r"}function k(a){var b=q.test(a);return b?parseFloat(a):a}function l(a,b,c,d){x.errors.push({type:a,code:b,message:c,row:d})}var m,n,o,q=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,s=this,t=0,u=!1,v=!1,w=[],x={data:[],errors:[],meta:{}};if(r(a.step)){var y=a.step;a.step=function(d){if(x=d,c())b();else{if(b(),0===x.data.length)return;t+=d.data.length,a.preview&&t>a.preview?n.abort():y(x,s)}}}this.parse=function(c,d,e){if(a.newline||(a.newline=j(c)),o=!1,a.delimiter)r(a.delimiter)&&(a.delimiter=a.delimiter(c),x.meta.delimiter=a.delimiter);else{var f=h(c,a.newline);f.successful?a.delimiter=f.bestDelimiter:(o=!0,a.delimiter=z.DefaultDelimiter),x.meta.delimiter=a.delimiter}var g=p(a);return a.preview&&a.header&&g.preview++,m=c,n=new i(g),x=n.parse(m,d,e),b(),u?{meta:{paused:!0}}:x||{meta:{paused:!1}}},this.paused=function(){return u},this.pause=function(){u=!0,n.abort(),m=m.substr(n.getCharIndex())},this.resume=function(){u=!1,s.streamer.parseChunk(m)},this.aborted=function(){return v},this.abort=function(){v=!0,n.abort(),x.meta.aborted=!0,r(a.complete)&&a.complete(x),m=""}}function i(a){a=a||{};var b=a.delimiter,c=a.newline,d=a.comments,e=a.step,f=a.preview,g=a.fastMode,h=a.quoteChar||'"';if(("string"!=typeof b||z.BAD_DELIMITERS.indexOf(b)>-1)&&(b=","),d===b)throw"Comment character same as delimiter";d===!0?d="#":("string"!=typeof d||z.BAD_DELIMITERS.indexOf(d)>-1)&&(d=!1),"\n"!=c&&"\r"!=c&&"\r\n"!=c&&(c="\n");var i=0,j=!1;this.parse=function(a,k,l){function m(a){x.push(a),A=i}function n(b){return l?p():("undefined"==typeof b&&(b=a.substr(i)),z.push(b),i=s,m(z),w&&q(),p())}function o(b){i=b,m(z),z=[],E=a.indexOf(c,i)}function p(a){return{data:x,errors:y,meta:{delimiter:b,linebreak:c,aborted:j,truncated:!!a,cursor:A+(k||0)}}}function q(){e(p()),x=[],y=[]}if("string"!=typeof a)throw"Input must be a string";var s=a.length,t=b.length,u=c.length,v=d.length,w=r(e);i=0;var x=[],y=[],z=[],A=0;if(!a)return p();if(g||g!==!1&&a.indexOf(h)===-1){for(var B=a.split(c),C=0;C<B.length;C++){var z=B[C];if(i+=z.length,C!==B.length-1)i+=c.length;else if(l)return p();if(!d||z.substr(0,v)!==d){if(w){if(x=[],m(z.split(b)),q(),j)return p()}else m(z.split(b));if(f&&C>=f)return x=x.slice(0,f),p(!0)}}return p()}for(var D=a.indexOf(b,i),E=a.indexOf(c,i),F=new RegExp(h+h,"g");;)if(a[i]!==h)if(d&&0===z.length&&a.substr(i,v)===d){if(E===-1)return p();i=E+u,E=a.indexOf(c,i),D=a.indexOf(b,i)}else if(D!==-1&&(D<E||E===-1))z.push(a.substring(i,D)),i=D+t,D=a.indexOf(b,i);else{if(E===-1)break;if(z.push(a.substring(i,E)),o(E+u),w&&(q(),j))return p();if(f&&x.length>=f)return p(!0)}else{var G=i;for(i++;;){var G=a.indexOf(h,G+1);if(G===-1)return l||y.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:x.length,index:i}),n();if(G===s-1){var H=a.substring(i,G).replace(F,h);return n(H)}if(a[G+1]!==h){if(a[G+1]===b){z.push(a.substring(i,G).replace(F,h)),i=G+1+t,D=a.indexOf(b,i),E=a.indexOf(c,i);break}if(a.substr(G+1,u)===c){if(z.push(a.substring(i,G).replace(F,h)),o(G+1+u),D=a.indexOf(b,i),w&&(q(),j))return p();if(f&&x.length>=f)return p(!0);break}}else G++}}return n()},this.abort=function(){j=!0},this.getCharIndex=function(){return i}}function j(){var a=document.getElementsByTagName("script");return a.length?a[a.length-1].src:""}function k(){if(!z.WORKERS_SUPPORTED)return!1;if(!w&&null===z.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var a=z.SCRIPT_PATH||s;a+=(a.indexOf("?")!==-1?"&":"?")+"papaworker";var b=new t.Worker(a);return b.onmessage=l,b.id=y++,x[b.id]=b,b}function l(a){var b=a.data,c=x[b.workerId],d=!1;if(b.error)c.userError(b.error,b.file);else if(b.results&&b.results.data){var e=function(){d=!0,m(b.workerId,{data:[],errors:[],meta:{aborted:!0}})},f={abort:e,pause:n,resume:n};if(r(c.userStep)){for(var g=0;g<b.results.data.length&&(c.userStep({data:[b.results.data[g]],errors:b.results.errors,meta:b.results.meta},f),!d);g++);delete b.results}else r(c.userChunk)&&(c.userChunk(b.results,f,b.file),delete b.results)}b.finished&&!d&&m(b.workerId,b.results)}function m(a,b){var c=x[a];r(c.userComplete)&&c.userComplete(b),c.terminate(),delete x[a]}function n(){throw"Not implemented."}function o(a){var b=a.data;if("undefined"==typeof z.WORKER_ID&&b&&(z.WORKER_ID=b.workerId),"string"==typeof b.input)t.postMessage({workerId:z.WORKER_ID,results:z.parse(b.input,b.config),finished:!0});else if(t.File&&b.input instanceof File||b.input instanceof Object){var c=z.parse(b.input,b.config);c&&t.postMessage({workerId:z.WORKER_ID,results:c,finished:!0})}}function p(a){if("object"!=typeof a)return a;var b=a instanceof Array?[]:{};for(var c in a)b[c]=p(a[c]);return b}function q(a,b){return function(){a.apply(b,arguments)}}function r(a){return"function"==typeof a}var s,t=function(){return"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof t?t:{}}(),u=!t.document&&!!t.postMessage,v=u&&/(\?|&)papaworker(=|&|$)/.test(t.location.search),w=!1,x={},y=0,z={};if(z.parse=a,z.unparse=b,z.RECORD_SEP=String.fromCharCode(30),z.UNIT_SEP=String.fromCharCode(31),z.BYTE_ORDER_MARK="\ufeff",z.BAD_DELIMITERS=["\r","\n",'"',z.BYTE_ORDER_MARK],z.WORKERS_SUPPORTED=!u&&!!t.Worker,z.SCRIPT_PATH=null,z.LocalChunkSize=10485760,z.RemoteChunkSize=5242880,z.DefaultDelimiter=",",z.Parser=i,z.ParserHandle=h,z.NetworkStreamer=d,z.FileStreamer=e,z.StringStreamer=f,z.ReadableStreamStreamer=g,t.jQuery){var A=t.jQuery;A.fn.parse=function(a){function b(){if(0===f.length)return void(r(a.complete)&&a.complete());var b=f[0];if(r(a.before)){var e=a.before(b.file,b.inputElem);if("object"==typeof e){if("abort"===e.action)return void c("AbortError",b.file,b.inputElem,e.reason);if("skip"===e.action)return void d();"object"==typeof e.config&&(b.instanceConfig=A.extend(b.instanceConfig,e.config))}else if("skip"===e)return void d()}var g=b.instanceConfig.complete;b.instanceConfig.complete=function(a){r(g)&&g(a,b.file,b.inputElem),d()},z.parse(b.file,b.instanceConfig)}function c(b,c,d,e){r(a.error)&&a.error({name:b},c,d,e)}function d(){f.splice(0,1),b()}var e=a.config||{},f=[];return this.each(function(a){var b="INPUT"===A(this).prop("tagName").toUpperCase()&&"file"===A(this).attr("type").toLowerCase()&&t.FileReader;if(!b||!this.files||0===this.files.length)return!0;for(var c=0;c<this.files.length;c++)f.push({file:this.files[c],inputElem:this,instanceConfig:A.extend({},e)})}),b(),this}}return v?t.onmessage=o:z.WORKERS_SUPPORTED&&(s=j(),document.body?document.addEventListener("DOMContentLoaded",function(){w=!0},!0):w=!0),d.prototype=Object.create(c.prototype),d.prototype.constructor=d,e.prototype=Object.create(c.prototype),e.prototype.constructor=e,f.prototype=Object.create(f.prototype),f.prototype.constructor=f,g.prototype=Object.create(c.prototype),g.prototype.constructor=g,z}); | |
/** | |
* @license | |
* | |
* Regression.JS - Regression functions for javascript | |
* http://tom-alexander.github.com/regression-js/ | |
* | |
* copyright(c) 2013 Tom Alexander | |
* Licensed under the MIT license. | |
* | |
* @module regression - Least-squares regression functions for JavaScript | |
**/ | |
!function(a,b){var c;return c="function"==typeof define&&define.amd?define("regression",b):"undefined"!=typeof module?module.exports=b():a.regression=b()}(this,function(){"use strict";function a(a,b){var c=a.reduce(function(a,b){return a+b[1]},0),d=c/a.length,e=a.reduce(function(a,b){var c=b[1]-d;return a+c*c},0),f=a.reduce(function(a,c,d){var e=b[d],f=c[1]-e[1];return a+f*f},0);return 1-f/e}function b(a,b){var c=0,d=0,e=0,f=0,g=0,h=a.length-1,i=new Array(b);for(c=0;h>c;c++){for(f=c,d=c+1;h>d;d++)Math.abs(a[c][d])>Math.abs(a[c][f])&&(f=d);for(e=c;h+1>e;e++)g=a[e][c],a[e][c]=a[e][f],a[e][f]=g;for(d=c+1;h>d;d++)for(e=h;e>=c;e--)a[e][d]-=a[e][c]*a[c][d]/a[c][c]}for(d=h-1;d>=0;d--){for(g=0,e=d+1;h>e;e++)g+=a[e][d]*i[e];i[d]=(a[h][d]-g)/a[d][d]}return i}function c(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}var d,e=2,f={linear:function(b,d,e){for(var f,g,h,i=[0,0,0,0,0],j=b.length,k=0;j>k;k++)null!==b[k][1]&&(i[0]+=b[k][0],i[1]+=b[k][1],i[2]+=b[k][0]*b[k][0],i[3]+=b[k][0]*b[k][1],i[4]+=b[k][1]*b[k][1]);return g=(j*i[3]-i[0]*i[1])/(j*i[2]-i[0]*i[0]),h=i[1]/j-g*i[0]/j,f=b.map(function(a){var b=a[0];return[b,g*b+h]}),{r2:a(b,f),equation:[g,h],points:f,string:"y = "+c(g,e.precision)+"x + "+c(h,e.precision)}},linearthroughorigin:function(b,d,e){for(var f,g,h=[0,0],i=0;i<b.length;i++)null!==b[i][1]&&(h[0]+=b[i][0]*b[i][0],h[1]+=b[i][0]*b[i][1]);return f=h[1]/h[0],g=b.map(function(a){var b=a[0];return[b,f*b]}),{r2:a(b,g),equation:[f],points:g,string:"y = "+c(f,e.precision)+"x"}},exponential:function(b,d,e){for(var f,g,h,i,j=[0,0,0,0,0,0],k=0;k<b.length;k++)null!==b[k][1]&&(j[0]+=b[k][0],j[1]+=b[k][1],j[2]+=b[k][0]*b[k][0]*b[k][1],j[3]+=b[k][1]*Math.log(b[k][1]),j[4]+=b[k][0]*b[k][1]*Math.log(b[k][1]),j[5]+=b[k][0]*b[k][1]);return f=j[1]*j[2]-j[5]*j[5],g=Math.exp((j[2]*j[3]-j[5]*j[4])/f),h=(j[1]*j[4]-j[5]*j[3])/f,i=b.map(function(a){var b=a[0];return[b,g*Math.exp(h*b)]}),{r2:a(b,i),equation:[g,h],points:i,string:"y = "+c(g,e.precision)+"e^("+c(h,e.precision)+"x)"}},logarithmic:function(b,d,e){for(var f,g,h,i=[0,0,0,0],j=b.length,k=0;j>k;k++)null!==b[k][1]&&(i[0]+=Math.log(b[k][0]),i[1]+=b[k][1]*Math.log(b[k][0]),i[2]+=b[k][1],i[3]+=Math.pow(Math.log(b[k][0]),2));return g=(j*i[1]-i[2]*i[0])/(j*i[3]-i[0]*i[0]),f=(i[2]-g*i[0])/j,h=b.map(function(a){var b=a[0];return[b,f+g*Math.log(b)]}),{r2:a(b,h),equation:[f,g],points:h,string:"y = "+c(f,e.precision)+" + "+c(g,e.precision)+" ln(x)"}},power:function(b,d,e){for(var f,g,h,i=[0,0,0,0],j=b.length,k=0;j>k;k++)null!==b[k][1]&&(i[0]+=Math.log(b[k][0]),i[1]+=Math.log(b[k][1])*Math.log(b[k][0]),i[2]+=Math.log(b[k][1]),i[3]+=Math.pow(Math.log(b[k][0]),2));return g=(j*i[1]-i[2]*i[0])/(j*i[3]-i[0]*i[0]),f=Math.exp((i[2]-g*i[0])/j),h=b.map(function(a){var b=a[0];return[b,f*Math.pow(b,g)]}),{r2:a(b,h),equation:[f,g],points:h,string:"y = "+c(f,e.precision)+"x^"+c(g,e.precision)}},polynomial:function(d,e,f){var g,h,i,j,k,l,m,n,o=[],p=[],q=0,r=0,s=d.length;for(h="undefined"==typeof e?3:e+1,i=0;h>i;i++){for(k=0;s>k;k++)null!==d[k][1]&&(q+=Math.pow(d[k][0],i)*d[k][1]);for(o.push(q),q=0,g=[],j=0;h>j;j++){for(k=0;s>k;k++)null!==d[k][1]&&(r+=Math.pow(d[k][0],i+j));g.push(r),r=0}p.push(g)}for(p.push(o),m=b(p,h),l=d.map(function(a){var b=a[0],c=m.reduce(function(a,c,d){return a+c*Math.pow(b,d)},0);return[b,c]}),n="y = ",i=m.length-1;i>=0;i--)n+=i>1?c(m[i],f.precision)+"x^"+i+" + ":1===i?c(m[i],f.precision)+"x + ":c(m[i],f.precision);return{r2:a(d,l),equation:m,points:l,string:n}},lastvalue:function(b,d,e){for(var f=[],g=null,h=0;h<b.length;h++)null!==b[h][1]&&isFinite(b[h][1])?(g=b[h][1],f.push([b[h][0],b[h][1]])):f.push([b[h][0],g]);return{r2:a(b,f),equation:[g],points:f,string:""+c(g,e.precision)}}};return d=function(a,b,c,d){var g="object"==typeof c&&"undefined"==typeof d?c:d||{};return g.precision||(g.precision=e),"string"==typeof a?f[a.toLowerCase()](b,c,g):null}}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setTimeout(function(){ | |
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"regression":[function(require,module,exports){ | |
(function (global, factory) { | |
if (typeof define === "function" && define.amd) { | |
define(['module'], factory); | |
} else if (typeof exports !== "undefined") { | |
factory(module); | |
} else { | |
var mod = { | |
exports: {} | |
}; | |
factory(mod); | |
global.regression = mod.exports; | |
} | |
})(this, function (module) { | |
'use strict'; | |
function _defineProperty(obj, key, value) { | |
if (key in obj) { | |
Object.defineProperty(obj, key, { | |
value: value, | |
enumerable: true, | |
configurable: true, | |
writable: true | |
}); | |
} else { | |
obj[key] = value; | |
} | |
return obj; | |
} | |
var _extends = Object.assign || function (target) { | |
for (var i = 1; i < arguments.length; i++) { | |
var source = arguments[i]; | |
for (var key in source) { | |
if (Object.prototype.hasOwnProperty.call(source, key)) { | |
target[key] = source[key]; | |
} | |
} | |
} | |
return target; | |
}; | |
function _toConsumableArray(arr) { | |
if (Array.isArray(arr)) { | |
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { | |
arr2[i] = arr[i]; | |
} | |
return arr2; | |
} else { | |
return Array.from(arr); | |
} | |
} | |
var DEFAULT_OPTIONS = { order: 2, precision: 2, period: null }; | |
/** | |
* Determine the coefficient of determination (r^2) of a fit from the observations | |
* and predictions. | |
* | |
* @param {Array<Array<number>>} data - Pairs of observed x-y values | |
* @param {Array<Array<number>>} results - Pairs of observed predicted x-y values | |
* | |
* @return {number} - The r^2 value, or NaN if one cannot be calculated. | |
*/ | |
function determinationCoefficient(data, results) { | |
var predictions = []; | |
var observations = []; | |
data.forEach(function (d, i) { | |
if (d[1] !== null) { | |
observations.push(d); | |
predictions.push(results[i]); | |
} | |
}); | |
var sum = observations.reduce(function (a, observation) { | |
return a + observation[1]; | |
}, 0); | |
var mean = sum / observations.length; | |
var ssyy = observations.reduce(function (a, observation) { | |
var difference = observation[1] - mean; | |
return a + difference * difference; | |
}, 0); | |
var sse = observations.reduce(function (accum, observation, index) { | |
var prediction = predictions[index]; | |
var residual = observation[1] - prediction[1]; | |
return accum + residual * residual; | |
}, 0); | |
return 1 - sse / ssyy; | |
} | |
/** | |
* Determine the solution of a system of linear equations A * x = b using | |
* Gaussian elimination. | |
* | |
* @param {Array<Array<number>>} input - A 2-d matrix of data in row-major form [ A | b ] | |
* @param {number} order - How many degrees to solve for | |
* | |
* @return {Array<number>} - Vector of normalized solution coefficients matrix (x) | |
*/ | |
function gaussianElimination(input, order) { | |
var matrix = input; | |
var n = input.length - 1; | |
var coefficients = [order]; | |
for (var i = 0; i < n; i++) { | |
var maxrow = i; | |
for (var j = i + 1; j < n; j++) { | |
if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][maxrow])) { | |
maxrow = j; | |
} | |
} | |
for (var k = i; k < n + 1; k++) { | |
var tmp = matrix[k][i]; | |
matrix[k][i] = matrix[k][maxrow]; | |
matrix[k][maxrow] = tmp; | |
} | |
for (var _j = i + 1; _j < n; _j++) { | |
for (var _k = n; _k >= i; _k--) { | |
matrix[_k][_j] -= matrix[_k][i] * matrix[i][_j] / matrix[i][i]; | |
} | |
} | |
} | |
for (var _j2 = n - 1; _j2 >= 0; _j2--) { | |
var total = 0; | |
for (var _k2 = _j2 + 1; _k2 < n; _k2++) { | |
total += matrix[_k2][_j2] * coefficients[_k2]; | |
} | |
coefficients[_j2] = (matrix[n][_j2] - total) / matrix[_j2][_j2]; | |
} | |
return coefficients; | |
} | |
/** | |
* Round a number to a precision, specificed in number of decimal places | |
* | |
* @param {number} number - The number to round | |
* @param {number} precision - The number of decimal places to round to: | |
* > 0 means decimals, < 0 means powers of 10 | |
* | |
* | |
* @return {numbr} - The number, rounded | |
*/ | |
function round(number, precision) { | |
var factor = Math.pow(10, precision); | |
return Math.round(number * factor) / factor; | |
} | |
/** | |
* The set of all fitting methods | |
* | |
* @namespace | |
*/ | |
var methods = { | |
linear: function linear(data, options) { | |
var sum = [0, 0, 0, 0, 0]; | |
var len = 0; | |
for (var n = 0; n < data.length; n++) { | |
if (data[n][1] !== null) { | |
len++; | |
sum[0] += data[n][0]; | |
sum[1] += data[n][1]; | |
sum[2] += data[n][0] * data[n][0]; | |
sum[3] += data[n][0] * data[n][1]; | |
sum[4] += data[n][1] * data[n][1]; | |
} | |
} | |
var run = len * sum[2] - sum[0] * sum[0]; | |
var rise = len * sum[3] - sum[0] * sum[1]; | |
var gradient = run === 0 ? 0 : round(rise / run, options.precision); | |
var intercept = round(sum[1] / len - gradient * sum[0] / len, options.precision); | |
var predict = function predict(x) { | |
return [round(x, options.precision), round(gradient * x + intercept, options.precision)]; | |
}; | |
var points = data.map(function (point) { | |
return predict(point[0]); | |
}); | |
return { | |
points: points, | |
predict: predict, | |
equation: [gradient, intercept], | |
r2: round(determinationCoefficient(data, points), options.precision), | |
string: intercept === 0 ? 'y = ' + gradient + 'x' : 'y = ' + gradient + 'x + ' + intercept | |
}; | |
}, | |
exponential: function exponential(data, options) { | |
var sum = [0, 0, 0, 0, 0, 0]; | |
for (var n = 0; n < data.length; n++) { | |
if (data[n][1] !== null) { | |
sum[0] += data[n][0]; | |
sum[1] += data[n][1]; | |
sum[2] += data[n][0] * data[n][0] * data[n][1]; | |
sum[3] += data[n][1] * Math.log(data[n][1]); | |
sum[4] += data[n][0] * data[n][1] * Math.log(data[n][1]); | |
sum[5] += data[n][0] * data[n][1]; | |
} | |
} | |
var denominator = sum[1] * sum[2] - sum[5] * sum[5]; | |
var a = Math.exp((sum[2] * sum[3] - sum[5] * sum[4]) / denominator); | |
var b = (sum[1] * sum[4] - sum[5] * sum[3]) / denominator; | |
var coeffA = round(a, options.precision); | |
var coeffB = round(b, options.precision); | |
var predict = function predict(x) { | |
return [round(x, options.precision), round(coeffA * Math.exp(coeffB * x), options.precision)]; | |
}; | |
var points = data.map(function (point) { | |
return predict(point[0]); | |
}); | |
return { | |
points: points, | |
predict: predict, | |
equation: [coeffA, coeffB], | |
string: 'y = ' + coeffA + 'e^(' + coeffB + 'x)', | |
r2: round(determinationCoefficient(data, points), options.precision) | |
}; | |
}, | |
logarithmic: function logarithmic(data, options) { | |
var sum = [0, 0, 0, 0]; | |
var len = data.length; | |
for (var n = 0; n < len; n++) { | |
if (data[n][1] !== null) { | |
sum[0] += Math.log(data[n][0]); | |
sum[1] += data[n][1] * Math.log(data[n][0]); | |
sum[2] += data[n][1]; | |
sum[3] += Math.pow(Math.log(data[n][0]), 2); | |
} | |
} | |
var a = (len * sum[1] - sum[2] * sum[0]) / (len * sum[3] - sum[0] * sum[0]); | |
var coeffB = round(a, options.precision); | |
var coeffA = round((sum[2] - coeffB * sum[0]) / len, options.precision); | |
var predict = function predict(x) { | |
return [round(x, options.precision), round(round(coeffA + coeffB * Math.log(x), options.precision), options.precision)]; | |
}; | |
var points = data.map(function (point) { | |
return predict(point[0]); | |
}); | |
return { | |
points: points, | |
predict: predict, | |
equation: [coeffA, coeffB], | |
string: 'y = ' + coeffA + ' + ' + coeffB + ' ln(x)', | |
r2: round(determinationCoefficient(data, points), options.precision) | |
}; | |
}, | |
power: function power(data, options) { | |
var sum = [0, 0, 0, 0, 0]; | |
var len = data.length; | |
for (var n = 0; n < len; n++) { | |
if (data[n][1] !== null) { | |
sum[0] += Math.log(data[n][0]); | |
sum[1] += Math.log(data[n][1]) * Math.log(data[n][0]); | |
sum[2] += Math.log(data[n][1]); | |
sum[3] += Math.pow(Math.log(data[n][0]), 2); | |
} | |
} | |
var b = (len * sum[1] - sum[0] * sum[2]) / (len * sum[3] - Math.pow(sum[0], 2)); | |
var a = (sum[2] - b * sum[0]) / len; | |
var coeffA = round(Math.exp(a), options.precision); | |
var coeffB = round(b, options.precision); | |
var predict = function predict(x) { | |
return [round(x, options.precision), round(round(coeffA * Math.pow(x, coeffB), options.precision), options.precision)]; | |
}; | |
var points = data.map(function (point) { | |
return predict(point[0]); | |
}); | |
return { | |
points: points, | |
predict: predict, | |
equation: [coeffA, coeffB], | |
string: 'y = ' + coeffA + 'x^' + coeffB, | |
r2: round(determinationCoefficient(data, points), options.precision) | |
}; | |
}, | |
polynomial: function polynomial(data, options) { | |
var lhs = []; | |
var rhs = []; | |
var a = 0; | |
var b = 0; | |
var len = data.length; | |
var k = options.order + 1; | |
for (var i = 0; i < k; i++) { | |
for (var l = 0; l < len; l++) { | |
if (data[l][1] !== null) { | |
a += Math.pow(data[l][0], i) * data[l][1]; | |
} | |
} | |
lhs.push(a); | |
a = 0; | |
var c = []; | |
for (var j = 0; j < k; j++) { | |
for (var _l = 0; _l < len; _l++) { | |
if (data[_l][1] !== null) { | |
b += Math.pow(data[_l][0], i + j); | |
} | |
} | |
c.push(b); | |
b = 0; | |
} | |
rhs.push(c); | |
} | |
rhs.push(lhs); | |
var coefficients = gaussianElimination(rhs, k).map(function (v) { | |
return round(v, options.precision); | |
}); | |
var predict = function predict(x) { | |
return [round(x, options.precision), round(coefficients.reduce(function (sum, coeff, power) { | |
return sum + coeff * Math.pow(x, power); | |
}, 0), options.precision)]; | |
}; | |
var points = data.map(function (point) { | |
return predict(point[0]); | |
}); | |
var string = 'y = '; | |
for (var _i = coefficients.length - 1; _i >= 0; _i--) { | |
if (_i > 1) { | |
string += coefficients[_i] + 'x^' + _i + ' + '; | |
} else if (_i === 1) { | |
string += coefficients[_i] + 'x + '; | |
} else { | |
string += coefficients[_i]; | |
} | |
} | |
return { | |
string: string, | |
points: points, | |
predict: predict, | |
equation: [].concat(_toConsumableArray(coefficients)).reverse(), | |
r2: round(determinationCoefficient(data, points), options.precision) | |
}; | |
} | |
}; | |
function createWrapper() { | |
var reduce = function reduce(accumulator, name) { | |
return _extends({ | |
_round: round | |
}, accumulator, _defineProperty({}, name, function (data, supplied) { | |
return methods[name](data, _extends({}, DEFAULT_OPTIONS, supplied)); | |
})); | |
}; | |
return Object.keys(methods).reduce(reduce, {}); | |
} | |
module.exports = createWrapper(); | |
}); | |
},{}]},{},[]) | |
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInJlZ3Jlc3Npb24iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoWydtb2R1bGUnXSwgZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBmYWN0b3J5KG1vZHVsZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG1vZCA9IHtcbiAgICAgIGV4cG9ydHM6IHt9XG4gICAgfTtcbiAgICBmYWN0b3J5KG1vZCk7XG4gICAgZ2xvYmFsLnJlZ3Jlc3Npb24gPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKG1vZHVsZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgdmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnIyW2ldID0gYXJyW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyMjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oYXJyKTtcbiAgICB9XG4gIH1cblxuICB2YXIgREVGQVVMVF9PUFRJT05TID0geyBvcmRlcjogMiwgcHJlY2lzaW9uOiAyLCBwZXJpb2Q6IG51bGwgfTtcblxuICAvKipcbiAgKiBEZXRlcm1pbmUgdGhlIGNvZWZmaWNpZW50IG9mIGRldGVybWluYXRpb24gKHJeMikgb2YgYSBmaXQgZnJvbSB0aGUgb2JzZXJ2YXRpb25zXG4gICogYW5kIHByZWRpY3Rpb25zLlxuICAqXG4gICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gZGF0YSAtIFBhaXJzIG9mIG9ic2VydmVkIHgteSB2YWx1ZXNcbiAgKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSByZXN1bHRzIC0gUGFpcnMgb2Ygb2JzZXJ2ZWQgcHJlZGljdGVkIHgteSB2YWx1ZXNcbiAgKlxuICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgcl4yIHZhbHVlLCBvciBOYU4gaWYgb25lIGNhbm5vdCBiZSBjYWxjdWxhdGVkLlxuICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmF0aW9uQ29lZmZpY2llbnQoZGF0YSwgcmVzdWx0cykge1xuICAgIHZhciBwcmVkaWN0aW9ucyA9IFtdO1xuICAgIHZhciBvYnNlcnZhdGlvbnMgPSBbXTtcblxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgaWYgKGRbMV0gIT09IG51bGwpIHtcbiAgICAgICAgb2JzZXJ2YXRpb25zLnB1c2goZCk7XG4gICAgICAgIHByZWRpY3Rpb25zLnB1c2gocmVzdWx0c1tpXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgc3VtID0gb2JzZXJ2YXRpb25zLnJlZHVjZShmdW5jdGlvbiAoYSwgb2JzZXJ2YXRpb24pIHtcbiAgICAgIHJldHVybiBhICsgb2JzZXJ2YXRpb25bMV07XG4gICAgfSwgMCk7XG4gICAgdmFyIG1lYW4gPSBzdW0gLyBvYnNlcnZhdGlvbnMubGVuZ3RoO1xuXG4gICAgdmFyIHNzeXkgPSBvYnNlcnZhdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChhLCBvYnNlcnZhdGlvbikge1xuICAgICAgdmFyIGRpZmZlcmVuY2UgPSBvYnNlcnZhdGlvblsxXSAtIG1lYW47XG4gICAgICByZXR1cm4gYSArIGRpZmZlcmVuY2UgKiBkaWZmZXJlbmNlO1xuICAgIH0sIDApO1xuXG4gICAgdmFyIHNzZSA9IG9ic2VydmF0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjY3VtLCBvYnNlcnZhdGlvbiwgaW5kZXgpIHtcbiAgICAgIHZhciBwcmVkaWN0aW9uID0gcHJlZGljdGlvbnNbaW5kZXhdO1xuICAgICAgdmFyIHJlc2lkdWFsID0gb2JzZXJ2YXRpb25bMV0gLSBwcmVkaWN0aW9uWzFdO1xuICAgICAgcmV0dXJuIGFjY3VtICsgcmVzaWR1YWwgKiByZXNpZHVhbDtcbiAgICB9LCAwKTtcblxuICAgIHJldHVybiAxIC0gc3NlIC8gc3N5eTtcbiAgfVxuXG4gIC8qKlxuICAqIERldGVybWluZSB0aGUgc29sdXRpb24gb2YgYSBzeXN0ZW0gb2YgbGluZWFyIGVxdWF0aW9ucyBBICogeCA9IGIgdXNpbmdcbiAgKiBHYXVzc2lhbiBlbGltaW5hdGlvbi5cbiAgKlxuICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGlucHV0IC0gQSAyLWQgbWF0cml4IG9mIGRhdGEgaW4gcm93LW1ham9yIGZvcm0gWyBBIHwgYiBdXG4gICogQHBhcmFtIHtudW1iZXJ9IG9yZGVyIC0gSG93IG1hbnkgZGVncmVlcyB0byBzb2x2ZSBmb3JcbiAgKlxuICAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IC0gVmVjdG9yIG9mIG5vcm1hbGl6ZWQgc29sdXRpb24gY29lZmZpY2llbnRzIG1hdHJpeCAoeClcbiAgKi9cbiAgZnVuY3Rpb24gZ2F1c3NpYW5FbGltaW5hdGlvbihpbnB1dCwgb3JkZXIpIHtcbiAgICB2YXIgbWF0cml4ID0gaW5wdXQ7XG4gICAgdmFyIG4gPSBpbnB1dC5sZW5ndGggLSAxO1xuICAgIHZhciBjb2VmZmljaWVudHMgPSBbb3JkZXJdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHZhciBtYXhyb3cgPSBpO1xuICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhtYXRyaXhbaV1bal0pID4gTWF0aC5hYnMobWF0cml4W2ldW21heHJvd10pKSB7XG4gICAgICAgICAgbWF4cm93ID0gajtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBrID0gaTsgayA8IG4gKyAxOyBrKyspIHtcbiAgICAgICAgdmFyIHRtcCA9IG1hdHJpeFtrXVtpXTtcbiAgICAgICAgbWF0cml4W2tdW2ldID0gbWF0cml4W2tdW21heHJvd107XG4gICAgICAgIG1hdHJpeFtrXVttYXhyb3ddID0gdG1wO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaiA9IGkgKyAxOyBfaiA8IG47IF9qKyspIHtcbiAgICAgICAgZm9yICh2YXIgX2sgPSBuOyBfayA+PSBpOyBfay0tKSB7XG4gICAgICAgICAgbWF0cml4W19rXVtfal0gLT0gbWF0cml4W19rXVtpXSAqIG1hdHJpeFtpXVtfal0gLyBtYXRyaXhbaV1baV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfajIgPSBuIC0gMTsgX2oyID49IDA7IF9qMi0tKSB7XG4gICAgICB2YXIgdG90YWwgPSAwO1xuICAgICAgZm9yICh2YXIgX2syID0gX2oyICsgMTsgX2syIDwgbjsgX2syKyspIHtcbiAgICAgICAgdG90YWwgKz0gbWF0cml4W19rMl1bX2oyXSAqIGNvZWZmaWNpZW50c1tfazJdO1xuICAgICAgfVxuXG4gICAgICBjb2VmZmljaWVudHNbX2oyXSA9IChtYXRyaXhbbl1bX2oyXSAtIHRvdGFsKSAvIG1hdHJpeFtfajJdW19qMl07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvZWZmaWNpZW50cztcbiAgfVxuXG4gIC8qKlxuICAqIFJvdW5kIGEgbnVtYmVyIHRvIGEgcHJlY2lzaW9uLCBzcGVjaWZpY2VkIGluIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICAqXG4gICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciAtIFRoZSBudW1iZXIgdG8gcm91bmRcbiAgKiBAcGFyYW0ge251bWJlcn0gcHJlY2lzaW9uIC0gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0bzpcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAwIG1lYW5zIGRlY2ltYWxzLCA8IDAgbWVhbnMgcG93ZXJzIG9mIDEwXG4gICpcbiAgKlxuICAqIEByZXR1cm4ge251bWJyfSAtIFRoZSBudW1iZXIsIHJvdW5kZWRcbiAgKi9cbiAgZnVuY3Rpb24gcm91bmQobnVtYmVyLCBwcmVjaXNpb24pIHtcbiAgICB2YXIgZmFjdG9yID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbik7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAqIFRoZSBzZXQgb2YgYWxsIGZpdHRpbmcgbWV0aG9kc1xuICAqXG4gICogQG5hbWVzcGFjZVxuICAqL1xuICB2YXIgbWV0aG9kcyA9IHtcbiAgICBsaW5lYXI6IGZ1bmN0aW9uIGxpbmVhcihkYXRhLCBvcHRpb25zKSB7XG4gICAgICB2YXIgc3VtID0gWzAsIDAsIDAsIDAsIDBdO1xuICAgICAgdmFyIGxlbiA9IDA7XG5cbiAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZGF0YS5sZW5ndGg7IG4rKykge1xuICAgICAgICBpZiAoZGF0YVtuXVsxXSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxlbisrO1xuICAgICAgICAgIHN1bVswXSArPSBkYXRhW25dWzBdO1xuICAgICAgICAgIHN1bVsxXSArPSBkYXRhW25dWzFdO1xuICAgICAgICAgIHN1bVsyXSArPSBkYXRhW25dWzBdICogZGF0YVtuXVswXTtcbiAgICAgICAgICBzdW1bM10gKz0gZGF0YVtuXVswXSAqIGRhdGFbbl1bMV07XG4gICAgICAgICAgc3VtWzRdICs9IGRhdGFbbl1bMV0gKiBkYXRhW25dWzFdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBydW4gPSBsZW4gKiBzdW1bMl0gLSBzdW1bMF0gKiBzdW1bMF07XG4gICAgICB2YXIgcmlzZSA9IGxlbiAqIHN1bVszXSAtIHN1bVswXSAqIHN1bVsxXTtcbiAgICAgIHZhciBncmFkaWVudCA9IHJ1biA9PT0gMCA/IDAgOiByb3VuZChyaXNlIC8gcnVuLCBvcHRpb25zLnByZWNpc2lvbik7XG4gICAgICB2YXIgaW50ZXJjZXB0ID0gcm91bmQoc3VtWzFdIC8gbGVuIC0gZ3JhZGllbnQgKiBzdW1bMF0gLyBsZW4sIG9wdGlvbnMucHJlY2lzaW9uKTtcblxuICAgICAgdmFyIHByZWRpY3QgPSBmdW5jdGlvbiBwcmVkaWN0KHgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3VuZCh4LCBvcHRpb25zLnByZWNpc2lvbiksIHJvdW5kKGdyYWRpZW50ICogeCArIGludGVyY2VwdCwgb3B0aW9ucy5wcmVjaXNpb24pXTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBwb2ludHMgPSBkYXRhLm1hcChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY3QocG9pbnRbMF0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50czogcG9pbnRzLFxuICAgICAgICBwcmVkaWN0OiBwcmVkaWN0LFxuICAgICAgICBlcXVhdGlvbjogW2dyYWRpZW50LCBpbnRlcmNlcHRdLFxuICAgICAgICByMjogcm91bmQoZGV0ZXJtaW5hdGlvbkNvZWZmaWNpZW50KGRhdGEsIHBvaW50cyksIG9wdGlvbnMucHJlY2lzaW9uKSxcbiAgICAgICAgc3RyaW5nOiBpbnRlcmNlcHQgPT09IDAgPyAneSA9ICcgKyBncmFkaWVudCArICd4JyA6ICd5ID0gJyArIGdyYWRpZW50ICsgJ3ggKyAnICsgaW50ZXJjZXB0XG4gICAgICB9O1xuICAgIH0sXG4gICAgZXhwb25lbnRpYWw6IGZ1bmN0aW9uIGV4cG9uZW50aWFsKGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBzdW0gPSBbMCwgMCwgMCwgMCwgMCwgMF07XG5cbiAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZGF0YS5sZW5ndGg7IG4rKykge1xuICAgICAgICBpZiAoZGF0YVtuXVsxXSAhPT0gbnVsbCkge1xuICAgICAgICAgIHN1bVswXSArPSBkYXRhW25dWzBdO1xuICAgICAgICAgIHN1bVsxXSArPSBkYXRhW25dWzFdO1xuICAgICAgICAgIHN1bVsyXSArPSBkYXRhW25dWzBdICogZGF0YVtuXVswXSAqIGRhdGFbbl1bMV07XG4gICAgICAgICAgc3VtWzNdICs9IGRhdGFbbl1bMV0gKiBNYXRoLmxvZyhkYXRhW25dWzFdKTtcbiAgICAgICAgICBzdW1bNF0gKz0gZGF0YVtuXVswXSAqIGRhdGFbbl1bMV0gKiBNYXRoLmxvZyhkYXRhW25dWzFdKTtcbiAgICAgICAgICBzdW1bNV0gKz0gZGF0YVtuXVswXSAqIGRhdGFbbl1bMV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRlbm9taW5hdG9yID0gc3VtWzFdICogc3VtWzJdIC0gc3VtWzVdICogc3VtWzVdO1xuICAgICAgdmFyIGEgPSBNYXRoLmV4cCgoc3VtWzJdICogc3VtWzNdIC0gc3VtWzVdICogc3VtWzRdKSAvIGRlbm9taW5hdG9yKTtcbiAgICAgIHZhciBiID0gKHN1bVsxXSAqIHN1bVs0XSAtIHN1bVs1XSAqIHN1bVszXSkgLyBkZW5vbWluYXRvcjtcbiAgICAgIHZhciBjb2VmZkEgPSByb3VuZChhLCBvcHRpb25zLnByZWNpc2lvbik7XG4gICAgICB2YXIgY29lZmZCID0gcm91bmQoYiwgb3B0aW9ucy5wcmVjaXNpb24pO1xuICAgICAgdmFyIHByZWRpY3QgPSBmdW5jdGlvbiBwcmVkaWN0KHgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3VuZCh4LCBvcHRpb25zLnByZWNpc2lvbiksIHJvdW5kKGNvZWZmQSAqIE1hdGguZXhwKGNvZWZmQiAqIHgpLCBvcHRpb25zLnByZWNpc2lvbildO1xuICAgICAgfTtcblxuICAgICAgdmFyIHBvaW50cyA9IGRhdGEubWFwKGZ1bmN0aW9uIChwb2ludCkge1xuICAgICAgICByZXR1cm4gcHJlZGljdChwb2ludFswXSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9pbnRzOiBwb2ludHMsXG4gICAgICAgIHByZWRpY3Q6IHByZWRpY3QsXG4gICAgICAgIGVxdWF0aW9uOiBbY29lZmZBLCBjb2VmZkJdLFxuICAgICAgICBzdHJpbmc6ICd5ID0gJyArIGNvZWZmQSArICdlXignICsgY29lZmZCICsgJ3gpJyxcbiAgICAgICAgcjI6IHJvdW5kKGRldGVybWluYXRpb25Db2VmZmljaWVudChkYXRhLCBwb2ludHMpLCBvcHRpb25zLnByZWNpc2lvbilcbiAgICAgIH07XG4gICAgfSxcbiAgICBsb2dhcml0aG1pYzogZnVuY3Rpb24gbG9nYXJpdGhtaWMoZGF0YSwgb3B0aW9ucykge1xuICAgICAgdmFyIHN1bSA9IFswLCAwLCAwLCAwXTtcbiAgICAgIHZhciBsZW4gPSBkYXRhLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBsZW47IG4rKykge1xuICAgICAgICBpZiAoZGF0YVtuXVsxXSAhPT0gbnVsbCkge1xuICAgICAgICAgIHN1bVswXSArPSBNYXRoLmxvZyhkYXRhW25dWzBdKTtcbiAgICAgICAgICBzdW1bMV0gKz0gZGF0YVtuXVsxXSAqIE1hdGgubG9nKGRhdGFbbl1bMF0pO1xuICAgICAgICAgIHN1bVsyXSArPSBkYXRhW25dWzFdO1xuICAgICAgICAgIHN1bVszXSArPSBNYXRoLnBvdyhNYXRoLmxvZyhkYXRhW25dWzBdKSwgMik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGEgPSAobGVuICogc3VtWzFdIC0gc3VtWzJdICogc3VtWzBdKSAvIChsZW4gKiBzdW1bM10gLSBzdW1bMF0gKiBzdW1bMF0pO1xuICAgICAgdmFyIGNvZWZmQiA9IHJvdW5kKGEsIG9wdGlvbnMucHJlY2lzaW9uKTtcbiAgICAgIHZhciBjb2VmZkEgPSByb3VuZCgoc3VtWzJdIC0gY29lZmZCICogc3VtWzBdKSAvIGxlbiwgb3B0aW9ucy5wcmVjaXNpb24pO1xuXG4gICAgICB2YXIgcHJlZGljdCA9IGZ1bmN0aW9uIHByZWRpY3QoeCkge1xuICAgICAgICByZXR1cm4gW3JvdW5kKHgsIG9wdGlvbnMucHJlY2lzaW9uKSwgcm91bmQocm91bmQoY29lZmZBICsgY29lZmZCICogTWF0aC5sb2coeCksIG9wdGlvbnMucHJlY2lzaW9uKSwgb3B0aW9ucy5wcmVjaXNpb24pXTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBwb2ludHMgPSBkYXRhLm1hcChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY3QocG9pbnRbMF0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50czogcG9pbnRzLFxuICAgICAgICBwcmVkaWN0OiBwcmVkaWN0LFxuICAgICAgICBlcXVhdGlvbjogW2NvZWZmQSwgY29lZmZCXSxcbiAgICAgICAgc3RyaW5nOiAneSA9ICcgKyBjb2VmZkEgKyAnICsgJyArIGNvZWZmQiArICcgbG4oeCknLFxuICAgICAgICByMjogcm91bmQoZGV0ZXJtaW5hdGlvbkNvZWZmaWNpZW50KGRhdGEsIHBvaW50cyksIG9wdGlvbnMucHJlY2lzaW9uKVxuICAgICAgfTtcbiAgICB9LFxuICAgIHBvd2VyOiBmdW5jdGlvbiBwb3dlcihkYXRhLCBvcHRpb25zKSB7XG4gICAgICB2YXIgc3VtID0gWzAsIDAsIDAsIDAsIDBdO1xuICAgICAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGxlbjsgbisrKSB7XG4gICAgICAgIGlmIChkYXRhW25dWzFdICE9PSBudWxsKSB7XG4gICAgICAgICAgc3VtWzBdICs9IE1hdGgubG9nKGRhdGFbbl1bMF0pO1xuICAgICAgICAgIHN1bVsxXSArPSBNYXRoLmxvZyhkYXRhW25dWzFdKSAqIE1hdGgubG9nKGRhdGFbbl1bMF0pO1xuICAgICAgICAgIHN1bVsyXSArPSBNYXRoLmxvZyhkYXRhW25dWzFdKTtcbiAgICAgICAgICBzdW1bM10gKz0gTWF0aC5wb3coTWF0aC5sb2coZGF0YVtuXVswXSksIDIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBiID0gKGxlbiAqIHN1bVsxXSAtIHN1bVswXSAqIHN1bVsyXSkgLyAobGVuICogc3VtWzNdIC0gTWF0aC5wb3coc3VtWzBdLCAyKSk7XG4gICAgICB2YXIgYSA9IChzdW1bMl0gLSBiICogc3VtWzBdKSAvIGxlbjtcbiAgICAgIHZhciBjb2VmZkEgPSByb3VuZChNYXRoLmV4cChhKSwgb3B0aW9ucy5wcmVjaXNpb24pO1xuICAgICAgdmFyIGNvZWZmQiA9IHJvdW5kKGIsIG9wdGlvbnMucHJlY2lzaW9uKTtcblxuICAgICAgdmFyIHByZWRpY3QgPSBmdW5jdGlvbiBwcmVkaWN0KHgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3VuZCh4LCBvcHRpb25zLnByZWNpc2lvbiksIHJvdW5kKHJvdW5kKGNvZWZmQSAqIE1hdGgucG93KHgsIGNvZWZmQiksIG9wdGlvbnMucHJlY2lzaW9uKSwgb3B0aW9ucy5wcmVjaXNpb24pXTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBwb2ludHMgPSBkYXRhLm1hcChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY3QocG9pbnRbMF0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50czogcG9pbnRzLFxuICAgICAgICBwcmVkaWN0OiBwcmVkaWN0LFxuICAgICAgICBlcXVhdGlvbjogW2NvZWZmQSwgY29lZmZCXSxcbiAgICAgICAgc3RyaW5nOiAneSA9ICcgKyBjb2VmZkEgKyAneF4nICsgY29lZmZCLFxuICAgICAgICByMjogcm91bmQoZGV0ZXJtaW5hdGlvbkNvZWZmaWNpZW50KGRhdGEsIHBvaW50cyksIG9wdGlvbnMucHJlY2lzaW9uKVxuICAgICAgfTtcbiAgICB9LFxuICAgIHBvbHlub21pYWw6IGZ1bmN0aW9uIHBvbHlub21pYWwoZGF0YSwgb3B0aW9ucykge1xuICAgICAgdmFyIGxocyA9IFtdO1xuICAgICAgdmFyIHJocyA9IFtdO1xuICAgICAgdmFyIGEgPSAwO1xuICAgICAgdmFyIGIgPSAwO1xuICAgICAgdmFyIGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgICAgdmFyIGsgPSBvcHRpb25zLm9yZGVyICsgMTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBsZW47IGwrKykge1xuICAgICAgICAgIGlmIChkYXRhW2xdWzFdICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhICs9IE1hdGgucG93KGRhdGFbbF1bMF0sIGkpICogZGF0YVtsXVsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsaHMucHVzaChhKTtcbiAgICAgICAgYSA9IDA7XG5cbiAgICAgICAgdmFyIGMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICBmb3IgKHZhciBfbCA9IDA7IF9sIDwgbGVuOyBfbCsrKSB7XG4gICAgICAgICAgICBpZiAoZGF0YVtfbF1bMV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYiArPSBNYXRoLnBvdyhkYXRhW19sXVswXSwgaSArIGopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjLnB1c2goYik7XG4gICAgICAgICAgYiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmhzLnB1c2goYyk7XG4gICAgICB9XG4gICAgICByaHMucHVzaChsaHMpO1xuXG4gICAgICB2YXIgY29lZmZpY2llbnRzID0gZ2F1c3NpYW5FbGltaW5hdGlvbihyaHMsIGspLm1hcChmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gcm91bmQodiwgb3B0aW9ucy5wcmVjaXNpb24pO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBwcmVkaWN0ID0gZnVuY3Rpb24gcHJlZGljdCh4KSB7XG4gICAgICAgIHJldHVybiBbcm91bmQoeCwgb3B0aW9ucy5wcmVjaXNpb24pLCByb3VuZChjb2VmZmljaWVudHMucmVkdWNlKGZ1bmN0aW9uIChzdW0sIGNvZWZmLCBwb3dlcikge1xuICAgICAgICAgIHJldHVybiBzdW0gKyBjb2VmZiAqIE1hdGgucG93KHgsIHBvd2VyKTtcbiAgICAgICAgfSwgMCksIG9wdGlvbnMucHJlY2lzaW9uKV07XG4gICAgICB9O1xuXG4gICAgICB2YXIgcG9pbnRzID0gZGF0YS5tYXAoZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICAgIHJldHVybiBwcmVkaWN0KHBvaW50WzBdKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc3RyaW5nID0gJ3kgPSAnO1xuICAgICAgZm9yICh2YXIgX2kgPSBjb2VmZmljaWVudHMubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2ktLSkge1xuICAgICAgICBpZiAoX2kgPiAxKSB7XG4gICAgICAgICAgc3RyaW5nICs9IGNvZWZmaWNpZW50c1tfaV0gKyAneF4nICsgX2kgKyAnICsgJztcbiAgICAgICAgfSBlbHNlIGlmIChfaSA9PT0gMSkge1xuICAgICAgICAgIHN0cmluZyArPSBjb2VmZmljaWVudHNbX2ldICsgJ3ggKyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0cmluZyArPSBjb2VmZmljaWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0cmluZzogc3RyaW5nLFxuICAgICAgICBwb2ludHM6IHBvaW50cyxcbiAgICAgICAgcHJlZGljdDogcHJlZGljdCxcbiAgICAgICAgZXF1YXRpb246IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoY29lZmZpY2llbnRzKSkucmV2ZXJzZSgpLFxuICAgICAgICByMjogcm91bmQoZGV0ZXJtaW5hdGlvbkNvZWZmaWNpZW50KGRhdGEsIHBvaW50cyksIG9wdGlvbnMucHJlY2lzaW9uKVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gY3JlYXRlV3JhcHBlcigpIHtcbiAgICB2YXIgcmVkdWNlID0gZnVuY3Rpb24gcmVkdWNlKGFjY3VtdWxhdG9yLCBuYW1lKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBfcm91bmQ6IHJvdW5kXG4gICAgICB9LCBhY2N1bXVsYXRvciwgX2RlZmluZVByb3BlcnR5KHt9LCBuYW1lLCBmdW5jdGlvbiAoZGF0YSwgc3VwcGxpZWQpIHtcbiAgICAgICAgcmV0dXJuIG1ldGhvZHNbbmFtZV0oZGF0YSwgX2V4dGVuZHMoe30sIERFRkFVTFRfT1BUSU9OUywgc3VwcGxpZWQpKTtcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGhvZHMpLnJlZHVjZShyZWR1Y2UsIHt9KTtcbiAgfVxuXG4gIG1vZHVsZS5leHBvcnRzID0gY3JlYXRlV3JhcHBlcigpO1xufSk7XG4iXX0= | |
var regression = require('regression'); | |
var bands = [ 0,50,100,300,1000 ]; | |
var inputPoints = []; | |
$(function() { | |
$('#bands').val(bands.join(',')) | |
$('#bands').on('change', (e) => { | |
try { | |
bands = e.target.value.split(',').map(parseInt); | |
} | |
catch(e) { | |
bands = []; | |
} | |
}) | |
$('#values').on('change', (e) => { | |
try { | |
inputPoints = Papa.parse(e.target.value).data; | |
inputPoints = inputPoints.map((pair) => ( | |
pair.map((pt) => parseFloat(pt)) | |
)); | |
} | |
catch(e) { | |
inputPoints = []; | |
} | |
}); | |
$('button').click(() => { | |
console.log(bands); | |
for(let i=0; i < bands.length; ++i) { | |
let txt = ''; | |
const lowerBound = bands[i]; | |
const upperBound = bands[i+1] || bands.length; | |
txt += `Band: ${lowerBound} ${upperBound}`; | |
console.log(regression.exponential(inputPoints.slice(lowerBound, upperBound), {order: 4, precision:4})); | |
$('#result').append(`<div> ${txt} </div>`) | |
} | |
}) | |
}) | |
/*! | |
Papa Parse | |
v4.3.2 | |
https://github.com/mholt/PapaParse | |
*/ | |
!function(a,b){"function"==typeof define&&define.amd?define([],b):"object"==typeof module&&module.exports?module.exports=b():a.Papa=b()}(this,function(){"use strict";function a(a,b){b=b||{};var c=b.dynamicTyping||!1;if(r(c)&&(b.dynamicTypingFunction=c,c={}),b.dynamicTyping=c,b.worker&&z.WORKERS_SUPPORTED){var h=k();return h.userStep=b.step,h.userChunk=b.chunk,h.userComplete=b.complete,h.userError=b.error,b.step=r(b.step),b.chunk=r(b.chunk),b.complete=r(b.complete),b.error=r(b.error),delete b.worker,void h.postMessage({input:a,config:b,workerId:h.id})}var i=null;return"string"==typeof a?i=b.download?new d(b):new f(b):a.readable===!0&&r(a.read)&&r(a.on)?i=new g(b):(t.File&&a instanceof File||a instanceof Object)&&(i=new e(b)),i.stream(a)}function b(a,b){function c(){"object"==typeof b&&("string"==typeof b.delimiter&&1===b.delimiter.length&&z.BAD_DELIMITERS.indexOf(b.delimiter)===-1&&(j=b.delimiter),("boolean"==typeof b.quotes||b.quotes instanceof Array)&&(h=b.quotes),"string"==typeof b.newline&&(k=b.newline),"string"==typeof b.quoteChar&&(l=b.quoteChar),"boolean"==typeof b.header&&(i=b.header))}function d(a){if("object"!=typeof a)return[];var b=[];for(var c in a)b.push(c);return b}function e(a,b){var c="";"string"==typeof a&&(a=JSON.parse(a)),"string"==typeof b&&(b=JSON.parse(b));var d=a instanceof Array&&a.length>0,e=!(b[0]instanceof Array);if(d&&i){for(var g=0;g<a.length;g++)g>0&&(c+=j),c+=f(a[g],g);b.length>0&&(c+=k)}for(var h=0;h<b.length;h++){for(var l=d?a.length:b[h].length,m=0;m<l;m++){m>0&&(c+=j);var n=d&&e?a[m]:m;c+=f(b[h][n],m)}h<b.length-1&&(c+=k)}return c}function f(a,b){if("undefined"==typeof a||null===a)return"";a=a.toString().replace(m,l+l);var c="boolean"==typeof h&&h||h instanceof Array&&h[b]||g(a,z.BAD_DELIMITERS)||a.indexOf(j)>-1||" "===a.charAt(0)||" "===a.charAt(a.length-1);return c?l+a+l:a}function g(a,b){for(var c=0;c<b.length;c++)if(a.indexOf(b[c])>-1)return!0;return!1}var h=!1,i=!0,j=",",k="\r\n",l='"';c();var m=new RegExp(l,"g");if("string"==typeof a&&(a=JSON.parse(a)),a instanceof Array){if(!a.length||a[0]instanceof Array)return e(null,a);if("object"==typeof a[0])return e(d(a[0]),a)}else if("object"==typeof a)return"string"==typeof a.data&&(a.data=JSON.parse(a.data)),a.data instanceof Array&&(a.fields||(a.fields=a.meta&&a.meta.fields),a.fields||(a.fields=a.data[0]instanceof Array?a.fields:d(a.data[0])),a.data[0]instanceof Array||"object"==typeof a.data[0]||(a.data=[a.data])),e(a.fields||[],a.data||[]);throw"exception: Unable to serialize unrecognized input"}function c(a){function b(a){var b=p(a);b.chunkSize=parseInt(b.chunkSize),a.step||a.chunk||(b.chunkSize=null),this._handle=new h(b),this._handle.streamer=this,this._config=b}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},b.call(this,a),this.parseChunk=function(a){if(this.isFirstChunk&&r(this._config.beforeFirstChunk)){var b=this._config.beforeFirstChunk(a);void 0!==b&&(a=b)}this.isFirstChunk=!1;var c=this._partialLine+a;this._partialLine="";var d=this._handle.parse(c,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var e=d.meta.cursor;this._finished||(this._partialLine=c.substring(e-this._baseIndex),this._baseIndex=e),d&&d.data&&(this._rowCount+=d.data.length);var f=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(v)t.postMessage({results:d,workerId:z.WORKER_ID,finished:f});else if(r(this._config.chunk)){if(this._config.chunk(d,this._handle),this._paused)return;d=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(d.data),this._completeResults.errors=this._completeResults.errors.concat(d.errors),this._completeResults.meta=d.meta),!f||!r(this._config.complete)||d&&d.meta.aborted||this._config.complete(this._completeResults,this._input),f||d&&d.meta.paused||this._nextChunk(),d}},this._sendError=function(a){r(this._config.error)?this._config.error(a):v&&this._config.error&&t.postMessage({workerId:z.WORKER_ID,error:a,finished:!1})}}function d(a){function b(a){var b=a.getResponseHeader("Content-Range");return null===b?-1:parseInt(b.substr(b.lastIndexOf("/")+1))}a=a||{},a.chunkSize||(a.chunkSize=z.RemoteChunkSize),c.call(this,a);var d;u?this._nextChunk=function(){this._readChunk(),this._chunkLoaded()}:this._nextChunk=function(){this._readChunk()},this.stream=function(a){this._input=a,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(d=new XMLHttpRequest,this._config.withCredentials&&(d.withCredentials=this._config.withCredentials),u||(d.onload=q(this._chunkLoaded,this),d.onerror=q(this._chunkError,this)),d.open("GET",this._input,!u),this._config.downloadRequestHeaders){var a=this._config.downloadRequestHeaders;for(var b in a)d.setRequestHeader(b,a[b])}if(this._config.chunkSize){var c=this._start+this._config.chunkSize-1;d.setRequestHeader("Range","bytes="+this._start+"-"+c),d.setRequestHeader("If-None-Match","webkit-no-cache")}try{d.send()}catch(a){this._chunkError(a.message)}u&&0===d.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==d.readyState){if(d.status<200||d.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>b(d),this.parseChunk(d.responseText)}},this._chunkError=function(a){var b=d.statusText||a;this._sendError(b)}}function e(a){a=a||{},a.chunkSize||(a.chunkSize=z.LocalChunkSize),c.call(this,a);var b,d,e="undefined"!=typeof FileReader;this.stream=function(a){this._input=a,d=a.slice||a.webkitSlice||a.mozSlice,e?(b=new FileReader,b.onload=q(this._chunkLoaded,this),b.onerror=q(this._chunkError,this)):b=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var a=this._input;if(this._config.chunkSize){var c=Math.min(this._start+this._config.chunkSize,this._input.size);a=d.call(a,this._start,c)}var f=b.readAsText(a,this._config.encoding);e||this._chunkLoaded({target:{result:f}})},this._chunkLoaded=function(a){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(a.target.result)},this._chunkError=function(){this._sendError(b.error)}}function f(a){a=a||{},c.call(this,a);var b,d;this.stream=function(a){return b=a,d=a,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var a=this._config.chunkSize,b=a?d.substr(0,a):d;return d=a?d.substr(a):"",this._finished=!d,this.parseChunk(b)}}}function g(a){a=a||{},c.call(this,a);var b=[],d=!0;this.stream=function(a){this._input=a,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._nextChunk=function(){b.length?this.parseChunk(b.shift()):d=!0},this._streamData=q(function(a){try{b.push("string"==typeof a?a:a.toString(this._config.encoding)),d&&(d=!1,this.parseChunk(b.shift()))}catch(a){this._streamError(a)}},this),this._streamError=q(function(a){this._streamCleanUp(),this._sendError(a.message)},this),this._streamEnd=q(function(){this._streamCleanUp(),this._finished=!0,this._streamData("")},this),this._streamCleanUp=q(function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)},this)}function h(a){function b(){if(x&&o&&(l("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+z.DefaultDelimiter+"'"),o=!1),a.skipEmptyLines)for(var b=0;b<x.data.length;b++)1===x.data[b].length&&""===x.data[b][0]&&x.data.splice(b--,1);return c()&&d(),g()}function c(){return a.header&&0===w.length}function d(){if(x){for(var a=0;c()&&a<x.data.length;a++)for(var b=0;b<x.data[a].length;b++)w.push(x.data[a][b]);x.data.splice(0,1)}}function e(b){return a.dynamicTypingFunction&&void 0===a.dynamicTyping[b]&&(a.dynamicTyping[b]=a.dynamicTypingFunction(b)),(a.dynamicTyping[b]||a.dynamicTyping)===!0}function f(a,b){return e(a)?"true"===b||"TRUE"===b||"false"!==b&&"FALSE"!==b&&k(b):b}function g(){if(!x||!a.header&&!a.dynamicTyping)return x;for(var b=0;b<x.data.length;b++){for(var c=a.header?{}:[],d=0;d<x.data[b].length;d++){var e=d,g=x.data[b][d];a.header&&(e=d>=w.length?"__parsed_extra":w[d]),g=f(e,g),"__parsed_extra"===e?(c[e]=c[e]||[],c[e].push(g)):c[e]=g}x.data[b]=c,a.header&&(d>w.length?l("FieldMismatch","TooManyFields","Too many fields: expected "+w.length+" fields but parsed "+d,b):d<w.length&&l("FieldMismatch","TooFewFields","Too few fields: expected "+w.length+" fields but parsed "+d,b))}return a.header&&x.meta&&(x.meta.fields=w),x}function h(b,c){for(var d,e,f,g=[",","\t","|",";",z.RECORD_SEP,z.UNIT_SEP],h=0;h<g.length;h++){var j=g[h],k=0,l=0;f=void 0;for(var m=new i({delimiter:j,newline:c,preview:10}).parse(b),n=0;n<m.data.length;n++){var o=m.data[n].length;l+=o,"undefined"!=typeof f?o>1&&(k+=Math.abs(o-f),f=o):f=o}m.data.length>0&&(l/=m.data.length),("undefined"==typeof e||k<e)&&l>1.99&&(e=k,d=j)}return a.delimiter=d,{successful:!!d,bestDelimiter:d}}function j(a){a=a.substr(0,1048576);var b=a.split("\r"),c=a.split("\n"),d=c.length>1&&c[0].length<b[0].length;if(1===b.length||d)return"\n";for(var e=0,f=0;f<b.length;f++)"\n"===b[f][0]&&e++;return e>=b.length/2?"\r\n":"\r"}function k(a){var b=q.test(a);return b?parseFloat(a):a}function l(a,b,c,d){x.errors.push({type:a,code:b,message:c,row:d})}var m,n,o,q=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,s=this,t=0,u=!1,v=!1,w=[],x={data:[],errors:[],meta:{}};if(r(a.step)){var y=a.step;a.step=function(d){if(x=d,c())b();else{if(b(),0===x.data.length)return;t+=d.data.length,a.preview&&t>a.preview?n.abort():y(x,s)}}}this.parse=function(c,d,e){if(a.newline||(a.newline=j(c)),o=!1,a.delimiter)r(a.delimiter)&&(a.delimiter=a.delimiter(c),x.meta.delimiter=a.delimiter);else{var f=h(c,a.newline);f.successful?a.delimiter=f.bestDelimiter:(o=!0,a.delimiter=z.DefaultDelimiter),x.meta.delimiter=a.delimiter}var g=p(a);return a.preview&&a.header&&g.preview++,m=c,n=new i(g),x=n.parse(m,d,e),b(),u?{meta:{paused:!0}}:x||{meta:{paused:!1}}},this.paused=function(){return u},this.pause=function(){u=!0,n.abort(),m=m.substr(n.getCharIndex())},this.resume=function(){u=!1,s.streamer.parseChunk(m)},this.aborted=function(){return v},this.abort=function(){v=!0,n.abort(),x.meta.aborted=!0,r(a.complete)&&a.complete(x),m=""}}function i(a){a=a||{};var b=a.delimiter,c=a.newline,d=a.comments,e=a.step,f=a.preview,g=a.fastMode,h=a.quoteChar||'"';if(("string"!=typeof b||z.BAD_DELIMITERS.indexOf(b)>-1)&&(b=","),d===b)throw"Comment character same as delimiter";d===!0?d="#":("string"!=typeof d||z.BAD_DELIMITERS.indexOf(d)>-1)&&(d=!1),"\n"!=c&&"\r"!=c&&"\r\n"!=c&&(c="\n");var i=0,j=!1;this.parse=function(a,k,l){function m(a){x.push(a),A=i}function n(b){return l?p():("undefined"==typeof b&&(b=a.substr(i)),z.push(b),i=s,m(z),w&&q(),p())}function o(b){i=b,m(z),z=[],E=a.indexOf(c,i)}function p(a){return{data:x,errors:y,meta:{delimiter:b,linebreak:c,aborted:j,truncated:!!a,cursor:A+(k||0)}}}function q(){e(p()),x=[],y=[]}if("string"!=typeof a)throw"Input must be a string";var s=a.length,t=b.length,u=c.length,v=d.length,w=r(e);i=0;var x=[],y=[],z=[],A=0;if(!a)return p();if(g||g!==!1&&a.indexOf(h)===-1){for(var B=a.split(c),C=0;C<B.length;C++){var z=B[C];if(i+=z.length,C!==B.length-1)i+=c.length;else if(l)return p();if(!d||z.substr(0,v)!==d){if(w){if(x=[],m(z.split(b)),q(),j)return p()}else m(z.split(b));if(f&&C>=f)return x=x.slice(0,f),p(!0)}}return p()}for(var D=a.indexOf(b,i),E=a.indexOf(c,i),F=new RegExp(h+h,"g");;)if(a[i]!==h)if(d&&0===z.length&&a.substr(i,v)===d){if(E===-1)return p();i=E+u,E=a.indexOf(c,i),D=a.indexOf(b,i)}else if(D!==-1&&(D<E||E===-1))z.push(a.substring(i,D)),i=D+t,D=a.indexOf(b,i);else{if(E===-1)break;if(z.push(a.substring(i,E)),o(E+u),w&&(q(),j))return p();if(f&&x.length>=f)return p(!0)}else{var G=i;for(i++;;){var G=a.indexOf(h,G+1);if(G===-1)return l||y.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:x.length,index:i}),n();if(G===s-1){var H=a.substring(i,G).replace(F,h);return n(H)}if(a[G+1]!==h){if(a[G+1]===b){z.push(a.substring(i,G).replace(F,h)),i=G+1+t,D=a.indexOf(b,i),E=a.indexOf(c,i);break}if(a.substr(G+1,u)===c){if(z.push(a.substring(i,G).replace(F,h)),o(G+1+u),D=a.indexOf(b,i),w&&(q(),j))return p();if(f&&x.length>=f)return p(!0);break}}else G++}}return n()},this.abort=function(){j=!0},this.getCharIndex=function(){return i}}function j(){var a=document.getElementsByTagName("script");return a.length?a[a.length-1].src:""}function k(){if(!z.WORKERS_SUPPORTED)return!1;if(!w&&null===z.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var a=z.SCRIPT_PATH||s;a+=(a.indexOf("?")!==-1?"&":"?")+"papaworker";var b=new t.Worker(a);return b.onmessage=l,b.id=y++,x[b.id]=b,b}function l(a){var b=a.data,c=x[b.workerId],d=!1;if(b.error)c.userError(b.error,b.file);else if(b.results&&b.results.data){var e=function(){d=!0,m(b.workerId,{data:[],errors:[],meta:{aborted:!0}})},f={abort:e,pause:n,resume:n};if(r(c.userStep)){for(var g=0;g<b.results.data.length&&(c.userStep({data:[b.results.data[g]],errors:b.results.errors,meta:b.results.meta},f),!d);g++);delete b.results}else r(c.userChunk)&&(c.userChunk(b.results,f,b.file),delete b.results)}b.finished&&!d&&m(b.workerId,b.results)}function m(a,b){var c=x[a];r(c.userComplete)&&c.userComplete(b),c.terminate(),delete x[a]}function n(){throw"Not implemented."}function o(a){var b=a.data;if("undefined"==typeof z.WORKER_ID&&b&&(z.WORKER_ID=b.workerId),"string"==typeof b.input)t.postMessage({workerId:z.WORKER_ID,results:z.parse(b.input,b.config),finished:!0});else if(t.File&&b.input instanceof File||b.input instanceof Object){var c=z.parse(b.input,b.config);c&&t.postMessage({workerId:z.WORKER_ID,results:c,finished:!0})}}function p(a){if("object"!=typeof a)return a;var b=a instanceof Array?[]:{};for(var c in a)b[c]=p(a[c]);return b}function q(a,b){return function(){a.apply(b,arguments)}}function r(a){return"function"==typeof a}var s,t=function(){return"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof t?t:{}}(),u=!t.document&&!!t.postMessage,v=u&&/(\?|&)papaworker(=|&|$)/.test(t.location.search),w=!1,x={},y=0,z={};if(z.parse=a,z.unparse=b,z.RECORD_SEP=String.fromCharCode(30),z.UNIT_SEP=String.fromCharCode(31),z.BYTE_ORDER_MARK="\ufeff",z.BAD_DELIMITERS=["\r","\n",'"',z.BYTE_ORDER_MARK],z.WORKERS_SUPPORTED=!u&&!!t.Worker,z.SCRIPT_PATH=null,z.LocalChunkSize=10485760,z.RemoteChunkSize=5242880,z.DefaultDelimiter=",",z.Parser=i,z.ParserHandle=h,z.NetworkStreamer=d,z.FileStreamer=e,z.StringStreamer=f,z.ReadableStreamStreamer=g,t.jQuery){var A=t.jQuery;A.fn.parse=function(a){function b(){if(0===f.length)return void(r(a.complete)&&a.complete());var b=f[0];if(r(a.before)){var e=a.before(b.file,b.inputElem);if("object"==typeof e){if("abort"===e.action)return void c("AbortError",b.file,b.inputElem,e.reason);if("skip"===e.action)return void d();"object"==typeof e.config&&(b.instanceConfig=A.extend(b.instanceConfig,e.config))}else if("skip"===e)return void d()}var g=b.instanceConfig.complete;b.instanceConfig.complete=function(a){r(g)&&g(a,b.file,b.inputElem),d()},z.parse(b.file,b.instanceConfig)}function c(b,c,d,e){r(a.error)&&a.error({name:b},c,d,e)}function d(){f.splice(0,1),b()}var e=a.config||{},f=[];return this.each(function(a){var b="INPUT"===A(this).prop("tagName").toUpperCase()&&"file"===A(this).attr("type").toLowerCase()&&t.FileReader;if(!b||!this.files||0===this.files.length)return!0;for(var c=0;c<this.files.length;c++)f.push({file:this.files[c],inputElem:this,instanceConfig:A.extend({},e)})}),b(),this}}return v?t.onmessage=o:z.WORKERS_SUPPORTED&&(s=j(),document.body?document.addEventListener("DOMContentLoaded",function(){w=!0},!0):w=!0),d.prototype=Object.create(c.prototype),d.prototype.constructor=d,e.prototype=Object.create(c.prototype),e.prototype.constructor=e,f.prototype=Object.create(f.prototype),f.prototype.constructor=f,g.prototype=Object.create(c.prototype),g.prototype.constructor=g,z}); | |
/** | |
* @license | |
* | |
* Regression.JS - Regression functions for javascript | |
* http://tom-alexander.github.com/regression-js/ | |
* | |
* copyright(c) 2013 Tom Alexander | |
* Licensed under the MIT license. | |
* | |
* @module regression - Least-squares regression functions for JavaScript | |
**/ | |
!function(a,b){var c;return c="function"==typeof define&&define.amd?define("regression",b):"undefined"!=typeof module?module.exports=b():a.regression=b()}(this,function(){"use strict";function a(a,b){var c=a.reduce(function(a,b){return a+b[1]},0),d=c/a.length,e=a.reduce(function(a,b){var c=b[1]-d;return a+c*c},0),f=a.reduce(function(a,c,d){var e=b[d],f=c[1]-e[1];return a+f*f},0);return 1-f/e}function b(a,b){var c=0,d=0,e=0,f=0,g=0,h=a.length-1,i=new Array(b);for(c=0;h>c;c++){for(f=c,d=c+1;h>d;d++)Math.abs(a[c][d])>Math.abs(a[c][f])&&(f=d);for(e=c;h+1>e;e++)g=a[e][c],a[e][c]=a[e][f],a[e][f]=g;for(d=c+1;h>d;d++)for(e=h;e>=c;e--)a[e][d]-=a[e][c]*a[c][d]/a[c][c]}for(d=h-1;d>=0;d--){for(g=0,e=d+1;h>e;e++)g+=a[e][d]*i[e];i[d]=(a[h][d]-g)/a[d][d]}return i}function c(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}var d,e=2,f={linear:function(b,d,e){for(var f,g,h,i=[0,0,0,0,0],j=b.length,k=0;j>k;k++)null!==b[k][1]&&(i[0]+=b[k][0],i[1]+=b[k][1],i[2]+=b[k][0]*b[k][0],i[3]+=b[k][0]*b[k][1],i[4]+=b[k][1]*b[k][1]);return g=(j*i[3]-i[0]*i[1])/(j*i[2]-i[0]*i[0]),h=i[1]/j-g*i[0]/j,f=b.map(function(a){var b=a[0];return[b,g*b+h]}),{r2:a(b,f),equation:[g,h],points:f,string:"y = "+c(g,e.precision)+"x + "+c(h,e.precision)}},linearthroughorigin:function(b,d,e){for(var f,g,h=[0,0],i=0;i<b.length;i++)null!==b[i][1]&&(h[0]+=b[i][0]*b[i][0],h[1]+=b[i][0]*b[i][1]);return f=h[1]/h[0],g=b.map(function(a){var b=a[0];return[b,f*b]}),{r2:a(b,g),equation:[f],points:g,string:"y = "+c(f,e.precision)+"x"}},exponential:function(b,d,e){for(var f,g,h,i,j=[0,0,0,0,0,0],k=0;k<b.length;k++)null!==b[k][1]&&(j[0]+=b[k][0],j[1]+=b[k][1],j[2]+=b[k][0]*b[k][0]*b[k][1],j[3]+=b[k][1]*Math.log(b[k][1]),j[4]+=b[k][0]*b[k][1]*Math.log(b[k][1]),j[5]+=b[k][0]*b[k][1]);return f=j[1]*j[2]-j[5]*j[5],g=Math.exp((j[2]*j[3]-j[5]*j[4])/f),h=(j[1]*j[4]-j[5]*j[3])/f,i=b.map(function(a){var b=a[0];return[b,g*Math.exp(h*b)]}),{r2:a(b,i),equation:[g,h],points:i,string:"y = "+c(g,e.precision)+"e^("+c(h,e.precision)+"x)"}},logarithmic:function(b,d,e){for(var f,g,h,i=[0,0,0,0],j=b.length,k=0;j>k;k++)null!==b[k][1]&&(i[0]+=Math.log(b[k][0]),i[1]+=b[k][1]*Math.log(b[k][0]),i[2]+=b[k][1],i[3]+=Math.pow(Math.log(b[k][0]),2));return g=(j*i[1]-i[2]*i[0])/(j*i[3]-i[0]*i[0]),f=(i[2]-g*i[0])/j,h=b.map(function(a){var b=a[0];return[b,f+g*Math.log(b)]}),{r2:a(b,h),equation:[f,g],points:h,string:"y = "+c(f,e.precision)+" + "+c(g,e.precision)+" ln(x)"}},power:function(b,d,e){for(var f,g,h,i=[0,0,0,0],j=b.length,k=0;j>k;k++)null!==b[k][1]&&(i[0]+=Math.log(b[k][0]),i[1]+=Math.log(b[k][1])*Math.log(b[k][0]),i[2]+=Math.log(b[k][1]),i[3]+=Math.pow(Math.log(b[k][0]),2));return g=(j*i[1]-i[2]*i[0])/(j*i[3]-i[0]*i[0]),f=Math.exp((i[2]-g*i[0])/j),h=b.map(function(a){var b=a[0];return[b,f*Math.pow(b,g)]}),{r2:a(b,h),equation:[f,g],points:h,string:"y = "+c(f,e.precision)+"x^"+c(g,e.precision)}},polynomial:function(d,e,f){var g,h,i,j,k,l,m,n,o=[],p=[],q=0,r=0,s=d.length;for(h="undefined"==typeof e?3:e+1,i=0;h>i;i++){for(k=0;s>k;k++)null!==d[k][1]&&(q+=Math.pow(d[k][0],i)*d[k][1]);for(o.push(q),q=0,g=[],j=0;h>j;j++){for(k=0;s>k;k++)null!==d[k][1]&&(r+=Math.pow(d[k][0],i+j));g.push(r),r=0}p.push(g)}for(p.push(o),m=b(p,h),l=d.map(function(a){var b=a[0],c=m.reduce(function(a,c,d){return a+c*Math.pow(b,d)},0);return[b,c]}),n="y = ",i=m.length-1;i>=0;i--)n+=i>1?c(m[i],f.precision)+"x^"+i+" + ":1===i?c(m[i],f.precision)+"x + ":c(m[i],f.precision);return{r2:a(d,l),equation:m,points:l,string:n}},lastvalue:function(b,d,e){for(var f=[],g=null,h=0;h<b.length;h++)null!==b[h][1]&&isFinite(b[h][1])?(g=b[h][1],f.push([b[h][0],b[h][1]])):f.push([b[h][0],g]);return{r2:a(b,f),equation:[g],points:f,string:""+c(g,e.precision)}}};return d=function(a,b,c,d){var g="object"==typeof c&&"undefined"==typeof d?c:d||{};return g.precision||(g.precision=e),"string"==typeof a?f[a.toLowerCase()](b,c,g):null}}); | |
;}, 0) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"regression": "2.0.0" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<label>bands</label> | |
<input id="bands" placeholder="e.g 0,10,50,100" /> | |
<br> | |
<label>x,y (no headers)</label> | |
<textarea id="values"> | |
</textarea> | |
<button> | |
calculate | |
</button> | |
<div id="result"> | |
</div> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <head> --> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"> | |
</script> | |
<style> | |
#bands { | |
width: 100%; | |
} | |
#values { | |
width: 100%; | |
min-height: 200px; | |
} | |
</style> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment