{"version":3,"file":"analyze.cjs","sources":["../../../../../../../../../.yarn/berry/cache/chroma-js-npm-3.2.0-d5c39f5077-10c0.zip/node_modules/chroma-js/src/utils/analyze.js"],"sourcesContent":["import type from './type.js';\n\nconst { log, pow, floor, abs } = Math;\n\nexport function analyze(data, key = null) {\n    const r = {\n        min: Number.MAX_VALUE,\n        max: Number.MAX_VALUE * -1,\n        sum: 0,\n        values: [],\n        count: 0\n    };\n    if (type(data) === 'object') {\n        data = Object.values(data);\n    }\n    data.forEach((val) => {\n        if (key && type(val) === 'object') val = val[key];\n        if (val !== undefined && val !== null && !isNaN(val)) {\n            r.values.push(val);\n            r.sum += val;\n            if (val < r.min) r.min = val;\n            if (val > r.max) r.max = val;\n            r.count += 1;\n        }\n    });\n\n    r.domain = [r.min, r.max];\n\n    r.limits = (mode, num) => limits(r, mode, num);\n\n    return r;\n}\n\nexport function limits(data, mode = 'equal', num = 7) {\n    if (type(data) == 'array') {\n        data = analyze(data);\n    }\n    const { min, max } = data;\n    const values = data.values.sort((a, b) => a - b);\n\n    if (num === 1) {\n        return [min, max];\n    }\n\n    const limits = [];\n\n    if (mode.substr(0, 1) === 'c') {\n        // continuous\n        limits.push(min);\n        limits.push(max);\n    }\n\n    if (mode.substr(0, 1) === 'e') {\n        // equal interval\n        limits.push(min);\n        for (let i = 1; i < num; i++) {\n            limits.push(min + (i / num) * (max - min));\n        }\n        limits.push(max);\n    } else if (mode.substr(0, 1) === 'l') {\n        // log scale\n        if (min <= 0) {\n            throw new Error(\n                'Logarithmic scales are only possible for values > 0'\n            );\n        }\n        const min_log = Math.LOG10E * log(min);\n        const max_log = Math.LOG10E * log(max);\n        limits.push(min);\n        for (let i = 1; i < num; i++) {\n            limits.push(pow(10, min_log + (i / num) * (max_log - min_log)));\n        }\n        limits.push(max);\n    } else if (mode.substr(0, 1) === 'q') {\n        // quantile scale\n        limits.push(min);\n        for (let i = 1; i < num; i++) {\n            const p = ((values.length - 1) * i) / num;\n            const pb = floor(p);\n            if (pb === p) {\n                limits.push(values[pb]);\n            } else {\n                // p > pb\n                const pr = p - pb;\n                limits.push(values[pb] * (1 - pr) + values[pb + 1] * pr);\n            }\n        }\n        limits.push(max);\n    } else if (mode.substr(0, 1) === 'k') {\n        // k-means clustering\n        /*\n        implementation based on\n        http://code.google.com/p/figue/source/browse/trunk/figue.js#336\n        simplified for 1-d input values\n        */\n        let cluster;\n        const n = values.length;\n        const assignments = new Array(n);\n        const clusterSizes = new Array(num);\n        let repeat = true;\n        let nb_iters = 0;\n        let centroids = null;\n\n        // get seed values\n        centroids = [];\n        centroids.push(min);\n        for (let i = 1; i < num; i++) {\n            centroids.push(min + (i / num) * (max - min));\n        }\n        centroids.push(max);\n\n        while (repeat) {\n            // assignment step\n            for (let j = 0; j < num; j++) {\n                clusterSizes[j] = 0;\n            }\n            for (let i = 0; i < n; i++) {\n                const value = values[i];\n                let mindist = Number.MAX_VALUE;\n                let best;\n                for (let j = 0; j < num; j++) {\n                    const dist = abs(centroids[j] - value);\n                    if (dist < mindist) {\n                        mindist = dist;\n                        best = j;\n                    }\n                    clusterSizes[best]++;\n                    assignments[i] = best;\n                }\n            }\n\n            // update centroids step\n            const newCentroids = new Array(num);\n            for (let j = 0; j < num; j++) {\n                newCentroids[j] = null;\n            }\n            for (let i = 0; i < n; i++) {\n                cluster = assignments[i];\n                if (newCentroids[cluster] === null) {\n                    newCentroids[cluster] = values[i];\n                } else {\n                    newCentroids[cluster] += values[i];\n                }\n            }\n            for (let j = 0; j < num; j++) {\n                newCentroids[j] *= 1 / clusterSizes[j];\n            }\n\n            // check convergence\n            repeat = false;\n            for (let j = 0; j < num; j++) {\n                if (newCentroids[j] !== centroids[j]) {\n                    repeat = true;\n                    break;\n                }\n            }\n\n            centroids = newCentroids;\n            nb_iters++;\n\n            if (nb_iters > 200) {\n                repeat = false;\n            }\n        }\n\n        // finished k-means clustering\n        // the next part is borrowed from gabrielflor.it\n        const kClusters = {};\n        for (let j = 0; j < num; j++) {\n            kClusters[j] = [];\n        }\n        for (let i = 0; i < n; i++) {\n            cluster = assignments[i];\n            kClusters[cluster].push(values[i]);\n        }\n        let tmpKMeansBreaks = [];\n        for (let j = 0; j < num; j++) {\n            tmpKMeansBreaks.push(kClusters[j][0]);\n            tmpKMeansBreaks.push(kClusters[j][kClusters[j].length - 1]);\n        }\n        tmpKMeansBreaks = tmpKMeansBreaks.sort((a, b) => a - b);\n        limits.push(tmpKMeansBreaks[0]);\n        for (let i = 1; i < tmpKMeansBreaks.length; i += 2) {\n            const v = tmpKMeansBreaks[i];\n            if (!isNaN(v) && limits.indexOf(v) === -1) {\n                limits.push(v);\n            }\n        }\n    }\n    return limits;\n}\n"],"names":["limits"],"mappings":"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","x_google_ignoreList":[0]}