var tserSetCounter = 0; var tserCounter = 0; var tserSectionCounter = 0; var pointCounter = 0; var lastPoint = 0; var palette = ['categorical0', 'categorical1', 'categorical2', 'categorical3', 'categorical4']; var model = { tserSectionMaker: function tserSectionMaker(options) { var n = options.blockSize || 256; var cssStyles = options.cssStyles || []; // Simplified geometric brownian motion represented as log returns var current = lastPoint; var result = { key: tserSectionCounter, from: pointCounter, until: pointCounter + n, cssStyles: cssStyles, pathDrawer: options.pathDrawer, value: Array.apply(null, new Array(n)).map(function() { function normalRandom() { return Math.random() + Math.random() + Math.random() + Math.random() + Math.random() + Math.random() - 3; } current = current + normalRandom(); return current; }) }; pointCounter += n; tserSectionCounter += 1; lastPoint = current; return result; }, tserMaker: function(n, maxBlockSize) { return d3.range(n).map(function () { return model.tserSectionMaker({ blockSize: maxBlockSize / 4 + Math.round(maxBlockSize * 3 / 4 * Math.random()), cssStyles: [palette[Math.floor(palette.length * Math.random())]] }); }); } }; function Tser(n) { pointCounter = 0; lastPoint = 0; this.key = tserCounter++; this.value = model.tserMaker(n, maxBlockWidth); this.xWidth = this.value.reduce(function(prev, next) { return prev + next.until - next.from; }, 0); this.xDomain = extentUnion(this.value.map(function(v) {return [v.from, v.until];})); this.yDomain = extentUnion(this.value.map(function(v) {return d3.extent(v.value);})); } function TserSet(m, n) { this.key = tserSetCounter++; this.value = d3.range(m).map(function() {return new Tser(n);}); }