{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/assets/js/heatmap/handle.js","webpack:///./resources/assets/js/heatmap/heatmap-normalization.js","webpack:///./resources/assets/js/heatmap/aggregated-heatmap-worker.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","normalizeBar","bar","calculateWeight","normalization","params","NormalizationFunctions","linear","makeWeightedMaps","vars","volumeMaps","defaultMaxWeight","timestamp","sorted","q","pos","base","rest","easingFunction","weightedMaps","volumeMapsKeys","keys","sort","maxSingleWeight","maxTotalBookVolume","allVolumesArray","prices","totalBookVolume","volume","push","sortedAscAllVolumesArray","a","b","length","Math","floor","undefined","easingFunctionKey","handle","bufferId","weightedMapsResult","precisionStep","Infinity","ti","p1","p2","diff","abs","dataForDraw","keysLength","weightedBar","previousBar","nextBar","reverse","price","weight","dataWeight","noiseSmoothingThreshold","previousBarWeight","nextBarWeight","max","min","parseFloat","parseInt","maxVolume","exponential","x","pow","minWeight","maxWeight","findMinMax","minMaxDiff","onmessage","e","data","combinedHeatmap","pricesSpread","heatmaps","result","heatmapId","weightedMap","tsData","priceDifference","newPrice","combineHeatmaps","postMessage"],"mappings":"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","file":"/js/aggregated-heatmap-worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 15);\n","import NormalizationFunctions from './heatmap-normalization';\n\nfunction normalizeBar(bar, calculateWeight, normalization, params) {\n if(!NormalizationFunctions.hasOwnProperty(normalization)) {\n return NormalizationFunctions.linear(calculateWeight, bar, params);\n }\n\n return NormalizationFunctions[normalization](calculateWeight, bar, params);\n}\n\nconst asc = arr => arr.sort((a, b) => a - b);\n\nconst quantileAsc = (sorted, q) => {\n // const sorted = asc(arr);\n const pos = (sorted.length - 1) * q;\n const base = Math.floor(pos);\n const rest = pos - base;\n if (sorted[base + 1] !== undefined) {\n return sorted[base] + rest * (sorted[base + 1] - sorted[base]);\n } else {\n return sorted[base];\n }\n};\n\nconst makeWeightedMaps = function(vars, volumeMaps, defaultMaxWeight) {\n const calculateWeight = vars.easingFunction;\n\n const weightedMaps = {};\n\n const volumeMapsKeys = Object.keys(volumeMaps).sort();\n\n let timestamp;\n\n if(!defaultMaxWeight) {\n let maxSingleWeight = 0;\n let maxTotalBookVolume = 0;\n\n const allVolumesArray = [];\n\n for (timestamp of volumeMapsKeys) {\n const bar = volumeMaps[timestamp];\n const prices = Object.keys(bar);\n\n let totalBookVolume = 0;\n\n for (let price of prices) {\n const volume = bar[price];\n\n if (volume > maxSingleWeight) {\n maxSingleWeight = volume;\n }\n\n totalBookVolume += volume;\n\n allVolumesArray.push(volume);\n }\n\n if (totalBookVolume > maxTotalBookVolume) {\n maxTotalBookVolume = totalBookVolume;\n }\n }\n\n const sortedAscAllVolumesArray = asc(allVolumesArray);\n\n //defaultMaxWeight = quantileAsc(sortedAscAllVolumesArray, 0.9) * 5 + quantileAsc(sortedAscAllVolumesArray, 0.1) * 5;\n defaultMaxWeight = quantileAsc(sortedAscAllVolumesArray, 0.9) * 5;\n //defaultMaxWeight = 30;\n }\n\n for (timestamp of volumeMapsKeys) {\n const bar = volumeMaps[timestamp];\n\n weightedMaps[timestamp] = normalizeBar(\n bar,\n calculateWeight,\n vars.normalization,\n {\n easingFunctionKey: vars.easingFunctionKey,\n defaultMaxWeight: defaultMaxWeight\n }\n );\n }\n\n return [defaultMaxWeight, weightedMaps]\n};\n\nconst handle = function(bufferId, volumeMaps, defaultMaxWeight, vars) {\n const weightedMapsResult = makeWeightedMaps(vars, volumeMaps, defaultMaxWeight);\n\n defaultMaxWeight = weightedMapsResult[0];\n const weightedMaps = weightedMapsResult[1];\n\n let precisionStep = 0;\n\n let timestamp;\n\n // calculate precisionStep based on prices difference\n for (timestamp in volumeMaps) {\n if(!volumeMaps.hasOwnProperty(timestamp)) {\n continue;\n }\n\n precisionStep = Infinity;\n\n const keys = Object.keys(volumeMaps[timestamp]);\n\n let ti = 0;\n\n if (keys.length >= 2) {\n do {\n const p1 = keys[ti++];\n const p2 = keys[ti];\n\n const diff = Math.abs(p2 - p1);\n\n if(diff < precisionStep) {\n precisionStep = diff;\n }\n } while(ti < keys.length);\n\n break;\n }\n }\n\n const dataForDraw = [];\n\n const keys = Object.keys(volumeMaps).sort();\n const keysLength = keys.length;\n\n for (let i = 0; i < keysLength; i++) {\n const timestamp = keys[i];\n\n const weightedBar = weightedMaps[keys[i]];\n const previousBar = i > 0 ? weightedMaps[keys[i-1]] : null;\n const nextBar = i < keysLength ? weightedMaps[keys[i+1]] : null;\n\n const prices = Object.keys(weightedBar).sort().reverse();\n\n for (let price of prices) {\n const weight = weightedBar[price];\n\n let dataWeight = weight;\n\n if(vars.noiseSmoothingThreshold) {\n let previousBarWeight = 0;\n let nextBarWeight = 0;\n\n if(previousBar && previousBar[price]) {\n previousBarWeight = previousBar[price];\n }\n\n if(nextBar && nextBar[price]) {\n nextBarWeight = nextBar[price];\n } else /*if(previousBar && previousBar[price]) {\n nextBarWeight = previousBar[price];\n } if(previousBar && previousBar[price]) */ {\n nextBarWeight = weight;\n }\n\n dataWeight = Math.max(0, Math.min(weight, previousBarWeight + nextBarWeight + weight - vars.noiseSmoothingThreshold));\n }\n\n dataForDraw.push({\n price: parseFloat(price),\n timestamp: parseInt(timestamp),\n weight: dataWeight\n });\n }\n }\n\n return [bufferId, precisionStep, defaultMaxWeight, dataForDraw];\n};\n\nexport { handle, makeWeightedMaps };\n\n// const qForWeight = quantile(allVolumesArray, 0.5);\n\n// console.log('maxSingleWeight', maxSingleWeight);\n// console.log('maxTotalBookVolume / 10', maxTotalBookVolume / 10);\n// console.log('qForWeight * 15', qForWeight * 15);\n\n// for(let i = 0; i <= 1; i += 0.01) {\n// console.log(i, quantile(allVolumesArray, i));\n// }\n\n// const defaultMaxWeight = quantile(allVolumesArray, 0.5) * 15;","// https://en.wikipedia.org/wiki/Feature_scaling\nconst NormalizationFunctions = {\n // default\n // weight = % of total volume\n linear: function(calculateWeight, bar, params) {\n const weightedBar = {};\n const prices = Object.keys(bar);\n\n const maxVolume = params.defaultMaxWeight;\n\n for (let price of prices) {\n const volume = bar[price];\n\n let weight = Math.floor(volume / maxVolume * 100);\n\n if(weight > 100) {\n weight = 100;\n }\n\n weightedBar[price] = weight;\n }\n\n return weightedBar;\n },\n\n // Divide each component by the Euclidean length of the vector\n /* unitLength: function(calculateWeight, bar) {\n const maxValue = 100;\n\n const weightedBar = {};\n const prices = Object.keys(bar);\n\n let squaresSum = 0;\n\n for (let price of prices) {\n const weight = calculateWeight(bar[price]);\n\n squaresSum += weight * weight;\n }\n\n const squared = Math.sqrt(squaresSum);\n\n for (let price of prices) {\n const volume = calculateWeight(bar[price]);\n\n weightedBar[price] = Math.floor(volume / squared * maxValue);\n }\n\n return weightedBar;\n },*/\n\n // min-max normalization\n /*\n minMax: function(calculateWeight, bar) {\n const maxValue = 100;\n\n const weightedBar = {};\n const prices = Object.keys(bar);\n\n let minWeight = Infinity;\n let maxWeight = -Infinity;\n\n for (let price of prices) {\n const weight = calculateWeight(bar[price]);\n\n if(weight > maxWeight) {\n maxWeight = weight;\n }\n\n if(weight < minWeight) {\n minWeight = weight;\n }\n }\n\n const minMaxDiff = maxWeight - minWeight;\n\n for (let price of prices) {\n const weight = calculateWeight(bar[price]);\n\n weightedBar[price] = Math.floor((weight - minWeight) / minMaxDiff * maxValue);\n }\n\n return weightedBar;\n },\n */\n\n // I really like the result with smoothing > 30 and easeInQuad\n // linear produces too many noise\n // easeInCubic and higher too few signals\n exponential: function(calculateWeight, bar, params) {\n let maxValue = 100;\n\n const weightedBar = {};\n const prices = Object.keys(bar);\n\n let exp = 1.25;\n\n /*\n if(params.easingFunctionKey === \"linear\") {\n exp = 1;\n } else if(params.easingFunctionKey === \"easeInQuad\") {\n exp = 1.25;\n } else if(params.easingFunctionKey === \"easeInCubic\") {\n exp = 1.5;\n } else if(params.easingFunctionKey === \"easeInQuart\") {\n exp = 1.75;\n } else if(params.easingFunctionKey === \"easeInQuint\") {\n exp = 2;\n }\n\n if(params.easingFunctionKey === \"easeInQuad\") {\n exp = 1;\n } else if(params.easingFunctionKey === \"easeInQuad\") {\n exp = 1.1;\n } else if(params.easingFunctionKey === \"easeInCubic\") {\n exp = 1.2;\n } else if(params.easingFunctionKey === \"easeInQuart\") {\n exp = 1.3;\n } else if(params.easingFunctionKey === \"easeInQuint\") {\n exp = 1.4;\n }\n */\n\n calculateWeight = (x) => Math.pow(x, exp); // good values are between: [1, 2]\n\n let minWeight = 0;\n let maxWeight = params.defaultMaxWeight;\n\n // does not work\n function findMinMax1() {\n let sum = 0;\n\n for (let price of prices) {\n sum += calculateWeight(bar[price]);\n }\n\n for (let price of prices) {\n const weight = calculateWeight(bar[price]);\n\n if(weight < minWeight) {\n minWeight = weight;\n }\n }\n\n maxWeight = Math.pow(sum, 1/exp);\n maxWeight = sum;\n }\n\n function findMinMax() {\n for (let price of prices) {\n const weight = bar[price];\n\n if(weight > maxWeight) {\n maxWeight = weight;\n }\n\n if(weight < minWeight) {\n minWeight = weight;\n }\n }\n }\n\n // findMinMax1();\n findMinMax();\n\n minWeight = calculateWeight(minWeight);\n maxWeight = calculateWeight(maxWeight);\n\n const minMaxDiff = maxWeight - minWeight;\n\n for (let price of prices) {\n const weight = calculateWeight(bar[price]);\n\n weightedBar[price] = Math.floor((weight - minWeight) / minMaxDiff * maxValue);\n }\n\n // min-max again?\n /* let minWeight2 = Infinity;\n let maxWeight2 = -Infinity;\n\n for (let price of prices) {\n const weight = weightedBar[price];\n\n if(weight > maxWeight2) {\n maxWeight2 = weight;\n }\n\n if(weight < minWeight2) {\n minWeight2 = weight;\n }\n }\n\n const minMaxDiff2 = maxWeight2 - minWeight2;\n\n for (let price of prices) {\n const weight = weightedBar[price];\n\n weightedBar[price] = Math.floor((weight - minWeight2) / minMaxDiff2 * 30);\n }*/\n\n /*\n let sum = 0;\n\n for (let price of prices) {\n sum += weightedBar[price];\n }\n\n const sumSquared = sum * sum;\n\n for (let price of prices) {\n const volume = calculateWeight(weightedBar[price]);\n\n weightedBar[price] = Math.floor(volume / sumSquared * 100);\n }\n */\n\n // return this.relative((x) => Math.pow(x, 5), weightedBar);\n\n return weightedBar;\n },\n\n // z-score normalization\n // Mean normalization with sigma = (max - min)\n /*\n score: function (calculateWeight, bar) {\n const maxValue = 100;\n\n const weightedBar = {};\n const prices = Object.keys(bar);\n\n let minWeight = Infinity;\n let maxWeight = -Infinity;\n\n let sum = 0;\n let divideBy = 0;\n\n for (let price of prices) {\n const weight = calculateWeight(bar[price]);\n\n if(weight > maxWeight) {\n maxWeight = weight;\n }\n\n if(weight < minWeight) {\n minWeight = weight;\n }\n\n sum += calculateWeight(bar[price]);\n\n divideBy++;\n }\n\n const avg = sum / divideBy;\n const sigma = (maxWeight - minWeight);\n\n for (let price of prices) {\n const weight = calculateWeight(bar[price]);\n\n weightedBar[price] = Math.floor((weight - avg) / sigma * maxValue);\n }\n\n return weightedBar;\n }\n */\n};\n\nexport default NormalizationFunctions;","import { makeWeightedMaps, handle } from './handle'\n\nfunction combineHeatmaps(pricesSpread, vars, heatmaps, defaultMaxWeight) {\n const result = {};\n\n const priceDifference = 0;\n\n for(let heatmapId in heatmaps) {\n if(!heatmaps.hasOwnProperty(heatmapId)) {\n continue;\n }\n\n if(!heatmaps[heatmapId]) {\n // console.log('empty heatmap:', heatmapId);\n\n continue;\n }\n\n const weightedMapsResult = makeWeightedMaps(vars, heatmaps[heatmapId], defaultMaxWeight);\n const weightedMap = weightedMapsResult[1];\n\n for(let timestamp in weightedMap) {\n const tsData = weightedMap[timestamp];\n\n if(!result.hasOwnProperty(timestamp)) {\n result[timestamp] = {};\n }\n\n for(let price in tsData) {\n if(!tsData.hasOwnProperty(price)) {\n continue;\n }\n\n let priceDifference = 0;\n\n if(pricesSpread.hasOwnProperty(heatmapId) && pricesSpread[heatmapId].hasOwnProperty(timestamp)) {\n priceDifference = pricesSpread[heatmapId][timestamp];\n }\n\n const newPrice = price - priceDifference;\n\n if(!result[timestamp].hasOwnProperty(newPrice)) {\n result[timestamp][newPrice] = 0;\n }\n\n result[timestamp][newPrice] += tsData[price];\n }\n }\n }\n\n return result\n}\n\nonmessage = function(e) {\n const data = e.data;\n\n let combinedHeatmap = combineHeatmaps(data[0], data[4], data[2], data[3]);\n let result = handle(data[1], combinedHeatmap, data[3], data[4]);\n\n postMessage(result);\n};"],"sourceRoot":""}