{"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":""}