{"version":3,"sources":["../../src/generate/generate.ts","../../src/array/index.ts","../../src/kmeans/kMeans.ts"],"sourcesContent":["import { AlphabateOptions } from \"./types\";\n\n/**\n * Generator that generates all kinds of values.\n * alphanum\n * objectId\n * int\n * array\n */\ninterface generateArrayOptions{\n    min?: number,\n    max?: number\n}\nexport const Generate = {\n    /**\n     * Generates a string consist of alphanumeric characters of given length\n     * @param {number}[len=4] Length of the string \n     * @returns Alphanumeric string\n     */\n    alphanum(len: number = 4): string{\n        const chars: string ='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n        if(len === 1) return chars[Math.floor(Math.random() * chars.length)];\n        let result = '';\n        for (let i = len; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];\n        return result;\n    },\n     /**\n     * Generates Object Id.\n     * @returns \n     */\n    objectId (): string{\n        const timestamp: string = (new Date().getTime() / 1000 | 0).toString(16);\n        return timestamp + 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, () => {\n            return (Math.random() * 16 | 0).toString(16);\n        }).toLowerCase();\n    },\n    /**\n     * Generates random integer in a given range of [).\n     * Includes Min, exclude Max.\n     * @param min \n     * @param max \n     * @returns number\n     */\n    int(min: number, max: number): number{\n        let result: number = 0;\n        result = Math.floor(Math.random() * (max - min))+ min\n        return result\n    },\n    /**\n     * Generate random number.\n     * @param min \n     * @param max \n     * @returns \n     */\n    random(min: number, max: number): number{\n        return Math.random() * (max - min) + min;\n    },\n    /**\n     *  Generates an array with random integer as elemnt of desired length.\n     *  @param len @required Length of the array.\n     *  @returns Array of a given length\n     */\n    array(len: number, ops:generateArrayOptions = {}){\n        const defaultOps: generateArrayOptions = {\n            min:0,\n            max: 11,\n        }\n        const mergedOps: generateArrayOptions = {...defaultOps, ...ops};\n        const rs: number[] = [];\n        for(let i = 0; i< len ; i++)\n            rs.push(this.int(mergedOps.min ?? 0, mergedOps.max ?? 11))\n        return rs\n    },\n    /**\n     * Generates random alphabate of specified length.\n     * @param {number} [len=5] Length of the string. default = 5,\n     * @param {AlphabateOptions} [options] Options\n     */\n    alphabate(\n        len: number = 5,\n        options: AlphabateOptions = {}\n    ): string{\n        const op: AlphabateOptions = {\n            lowercase: true,\n            uppercase: true\n        }\n        Object.assign(op, options);\n        let result = '';\n        const lowerCaseCharacters = \"abcdefghijklmnopqrstuvwxyz\";\n        const upperCaseCharacters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n        let characterPool = \"\";\n        if(op.lowercase) characterPool += lowerCaseCharacters;\n        if(op.uppercase) characterPool += upperCaseCharacters;\n        const charactersLength = characterPool.length;\n        for (let i = 0; i<len; i++){\n            result += characterPool.charAt(Math.floor(Math.random() * charactersLength));\n        }\n        return result;\n    },\n    /**\n     * @returns Current Date Time with a format of \"YYYY-MM-DD\"\"\n     */\n    currentDate(): string{\n        const t: Date = new Date();\n        return `${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`;\n    },\n    /**\n     * @returns Current Date Time with a format of \"HH:mm:ss\"\"\n     */\n    currentTime(): string{\n        const t: Date = new Date();\n        return `${String(t.getHours()).padStart(2,\"0\")}:${String(t.getMinutes()).padStart(2,\"0\")}:${String(t.getSeconds()).padStart(2,\"0\")}`;\n    },\n    /**\n     * @returns Current Date Time with a format of \"YYYY-MM-DD HH:mm:ss\"\"\n     */\n    currentDateTime(): string{\n        const t: Date = new Date();\n        return `${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()} ${String(t.getHours()).padStart(2,\"0\")}:${String(t.getMinutes()).padStart(2,\"0\")}:${String(t.getSeconds()).padStart(2,\"0\")}`;\n    },\n    /**\n     * Generates and return list of date of specified day.\n     * Ex: All Sunday and Monday of 2022-01-01 to 2022-03-01\n     * @param f  From : YYYY-MM-DD\n     * @param t  To : YYYY-MM-DD\n     * @param days  number[] 0 ~ 6 Sunday ~ Saturday.\n     */\n    listOfDateOfDays(f: string, t: string, days: number[]){\n        let fromDate = new Date(f);\n        const toData = new Date(t);\n        let fromISO = fromDate.toISOString();\n        const toISO = toData.toISOString();\n        const rs: string[] = [];\n        while(true){\n            if(fromISO > toISO) break;\n            if(days.includes(fromDate.getDay()))\n                rs.push(fromISO.slice(0,10))\n            fromDate.setDate(fromDate.getDate()+1);\n            fromISO = fromDate.toISOString();\n        }\n        return rs;\n    },\n    /**\n     * Fast UUID generator, RFC4122 version 4 compliant.\n     * Copied and rewritted from the below. Thanks for such\n     * elegant code.\n     * @author Jeff Ward (jcward.com).\n     * @license MIT license\n     * @link http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n     **/\n    uuidv4(){\n        const lut: string[] = []; \n        for (let i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16); }\n        const d0 = Math.random()*0xffffffff|0;\n        const d1 = Math.random()*0xffffffff|0;\n        const d2 = Math.random()*0xffffffff|0;\n        const d3 = Math.random()*0xffffffff|0;\n        return (\n            lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+\n            lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+\n            lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+\n            lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff]\n        );\n    }\n}\n","export const FromArray = {\n    /**\n     * Returns one or more random elements from an array.\n     * @param arr Input array.\n     * @param noOfResult Number of results to return (default 1).\n     * @param returnIndex Return index positions instead of values.\n     */\n    getRandom<T>(arr: T[], noOfResult: number = 1, returnIndex: boolean = false): T[] | number[] {\n        if (!Array.isArray(arr)) throw new Error(\"Input must be an array\");\n        if (returnIndex) {\n            const result: number[] = [];\n            for (let i = 0; i < noOfResult; i++)\n                result.push(Math.floor(Math.random() * arr.length));\n            return result;\n        }\n        const result: T[] = [];\n        for (let i = 0; i < noOfResult; i++)\n            result.push(arr[Math.floor(Math.random() * arr.length)]);\n        return result;\n    },\n    /**\n     * Find and return the largest N numbers.\n     * @param numbers Array of numbers.\n     * @param n Number of results to return (default 1).\n     * @param returnIndex Return indices instead of values.\n     */\n    getLargest(numbers: number[], n: number = 1, returnIndex: boolean = false): number[] {\n        const results: number[] = [];\n        if (returnIndex) {\n            const indexed = numbers.map((v, i) => ({ v, i })).sort((a, b) => b.v - a.v);\n            for (let i = 0; i < n && i < indexed.length; i++) results.push(indexed[i].i);\n        } else {\n            const sorted = [...numbers].sort((a, b) => b - a);\n            for (let i = 0; i < n && i < sorted.length; i++) results.push(sorted[i]);\n        }\n        return results;\n    },\n    /**\n     * Find and return the smallest N numbers.\n     * @param numbers Array of numbers.\n     * @param n Number of results to return (default 1).\n     * @param returnIndex Return indices instead of values.\n     */\n    getSmallest(numbers: number[], n: number = 1, returnIndex: boolean = false): number[] {\n        const results: number[] = [];\n        if (returnIndex) {\n            const indexed = numbers.map((v, i) => ({ v, i })).sort((a, b) => a.v - b.v);\n            for (let i = 0; i < n && i < indexed.length; i++) results.push(indexed[i].i);\n        } else {\n            const sorted = [...numbers].sort((a, b) => a - b);\n            for (let i = 0; i < n && i < sorted.length; i++) results.push(sorted[i]);\n        }\n        return results;\n    },\n    /**\n     * Return the intersection of two arrays.\n     * @param arrA Array A.\n     * @param arrB Array B.\n     * @param duplicated Include duplicate matches.\n     */\n    getIntersect<T>(arrA: T[], arrB: T[], duplicated: boolean = false): T[] {\n        const seen = new Map<string, number>();\n        const result: T[] = [];\n        for (const item of arrA) seen.set(String(item), 1);\n        for (const item of arrB) {\n            const key = String(item);\n            if (seen.has(key)) {\n                if (!duplicated && seen.get(key) === 1) {\n                    result.push(item);\n                    seen.set(key, 2);\n                } else if (duplicated) {\n                    result.push(item);\n                }\n            }\n        }\n        return result;\n    },\n    /**\n     * Randomly shuffle an array in-place (Fisher-Yates).\n     * @param arr Array to shuffle.\n     */\n    shuffle<T>(arr: T[]): T[] {\n        let currentIndex = arr.length;\n        while (currentIndex !== 0) {\n            const randomIndex = Math.floor(Math.random() * currentIndex);\n            currentIndex--;\n            [arr[currentIndex], arr[randomIndex]] = [arr[randomIndex], arr[currentIndex]];\n        }\n        return arr;\n    },\n    /**\n     * The Thanos snap — removes roughly half the elements randomly.\n     * Mutates the original array.\n     * @param arr Input array.\n     */\n    thanosSnap<T>(arr: T[]): T[] {\n        const targetLen = arr.length % 2 === 0 ? arr.length / 2 : (arr.length - 1) / 2;\n        while (arr.length !== targetLen)\n            arr.splice(Math.floor(Math.random() * arr.length), 1);\n        return arr;\n    },\n    /**\n     * Convert a 2D array ([[key, value], ...]) into an object.\n     * @param arr Input 2D array.\n     */\n    toObject<V>(arr: [string | number, V][]): Record<string | number, V> {\n        const obj: Record<string | number, V> = {};\n        for (const [k, v] of arr) obj[k] = v;\n        return obj;\n    },\n    /**\n     * Split an array into groups by ratio.\n     * ex) [1,2,3,4] split [1,3] → {1:[1], 2:[2,3,4]}\n     * Remainder goes into \"extra\" if it doesn't fit.\n     * @param arr Array to split.\n     * @param ratio Ratio to split into.\n     */\n    splitInto<T>(arr: T[], ratio: number[]): Record<string, T[]> {\n        if (ratio.length === 0) return { 1: arr };\n        const filtered = ratio.filter((r) => r !== 0 && !isNaN(r));\n        const unitLen = Math.floor((1 / filtered.reduce((a, b) => a + b)) * arr.length);\n        const rs: Record<string, T[]> = {};\n        let group = 1;\n        let offset = 0;\n        for (const r of ratio) {\n            const len = r * unitLen;\n            rs[group] = arr.slice(offset, offset + len);\n            offset += rs[group].length;\n            group++;\n        }\n        if (offset < arr.length) rs[\"extra\"] = arr.slice(offset);\n        return rs;\n    },\n    /**\n     * Log array elements to console, optionally limited to a range.\n     * @param arr Array to log.\n     * @param from Starting index (inclusive), default 0.\n     * @param to Ending index (exclusive), default arr.length.\n     */\n    log<T>(arr: T[], from: number = 0, to: number = arr.length): void {\n        for (let i = from; i < to; i++) console.log(arr[i]);\n    },\n};\n","import { Generate } from '../generate/generate';\nimport { FromArray } from '../array/index';\n\n// ─── 1-D (original, kept for backward compatibility) ────────────────────────\n\ninterface Cluster {\n    id: number;\n    position: number;\n    childs: number[];\n}\n\n/**\n * Simple 1D K-means clustering.\n * Runs multiple attempts and returns the best result (most balanced cluster sizes).\n * @param k Number of clusters (default 2).\n * @param arr Input data points.\n * @param attempts Number of attempts to run (default 1).\n */\nexport const KMeans = (k: number = 2, arr: number[], attempts: number = 1): Cluster[] => {\n    if (arr.length === 0) throw new Error(\"Empty array.\");\n\n    const max = Math.max(...arr);\n    const min = Math.min(...arr);\n    const variations: Cluster[][] = [];\n\n    for (let attempt = 0; attempt < attempts; attempt++) {\n        let clusters: Cluster[] = [];\n        for (let i = 0; i < k; i++)\n            clusters.push({ id: i + 1, position: Generate.int(min, max + 1), childs: [] });\n\n        let previousClusters: Cluster[] = [];\n        while (!samePositions(clusters, previousClusters)) {\n            previousClusters = clusters.map((c) => ({ ...c }));\n            for (const c of clusters) c.childs = [];\n            clusters = assignPoints(clusters, arr);\n            clusters = recalibrate(clusters);\n        }\n        variations.push(clusters);\n    }\n\n    if (variations.length === 1) return variations[0];\n\n    // Pick the variation with the most balanced cluster sizes\n    const scores = variations.map((v) => {\n        let score = 0;\n        for (let i = 0; i < v.length - 1; i++)\n            score += Math.abs(v[i + 1].childs.length - v[i].childs.length);\n        return score;\n    });\n    const bestIndex = FromArray.getSmallest(scores, 1, true)[0];\n    return variations[bestIndex];\n};\n\nfunction samePositions(clusters: Cluster[], prev: Cluster[]): boolean {\n    if (prev.length === 0) return false;\n    return clusters.every((c, i) => c.position === prev[i].position);\n}\n\nfunction assignPoints(clusters: Cluster[], arr: number[]): Cluster[] {\n    for (const point of arr) {\n        const distances = clusters.map((c) => Math.abs(c.position - point));\n        const nearest = FromArray.getSmallest(distances, 1, true)[0];\n        clusters[nearest].childs.push(point);\n    }\n    return clusters;\n}\n\nfunction recalibrate(clusters: Cluster[]): Cluster[] {\n    for (const c of clusters) {\n        if (c.childs.length === 0) continue;\n        const mean = c.childs.reduce((a, b) => a + b, 0) / c.childs.length;\n        c.position = Number(mean.toFixed(2));\n    }\n    return clusters;\n}\n\n// ─── N-dimensional ──────────────────────────────────────────────────────────\n\nexport interface NDCluster<T> {\n    /** 1-based cluster id */\n    id: number;\n    /** Mean position in feature space */\n    centroid: number[];\n    /** Original data items assigned to this cluster */\n    members: T[];\n    /** Number of members */\n    size: number;\n    /**\n     * Within-cluster sum of squares — sum of squared Euclidean distances\n     * from each member to the centroid. Lower means a tighter, more\n     * cohesive cluster.\n     */\n    wcss: number;\n}\n\nexport type FeatureExtractor<T> = (item: T) => number[];\n\nexport interface KMeansNDOptions {\n    /**\n     * Number of independent runs. The run with the lowest total WCSS wins.\n     * More attempts → more reliable result at the cost of compute.\n     * Default: 5.\n     */\n    attempts?: number;\n    /**\n     * Centroid initialisation strategy.\n     * - `'kmeans++'` (default) spreads initial centroids far apart,\n     *   which dramatically reduces the chance of a poor local minimum.\n     * - `'random'` picks k random data points as starting centroids.\n     */\n    init?: 'random' | 'kmeans++';\n    /**\n     * Hard cap on iteration count per attempt.\n     * Default: 300.\n     */\n    maxIter?: number;\n}\n\n/**\n * N-dimensional K-means clustering suitable for production analytics\n * (customer segmentation, product segmentation, etc.).\n *\n * @param k Number of clusters.\n * @param data Array of items to cluster.\n * @param features Function that extracts a numeric feature vector from each item.\n *   All vectors must have the same length.\n * @param options Optional tuning parameters.\n *\n * @example\n * // Customer segmentation by recency, frequency, monetary value (RFM)\n * const segments = KMeansND(3, customers, (c) => [c.recency, c.frequency, c.spend]);\n *\n * @example\n * // Works with plain number arrays too\n * const result = KMeansND(2, [[1,2],[3,4],[100,200]], (x) => x);\n */\nexport const KMeansND = <T>(\n    k: number,\n    data: T[],\n    features: FeatureExtractor<T>,\n    options: KMeansNDOptions = {},\n): NDCluster<T>[] => {\n    if (data.length === 0) throw new Error(\"Empty data array.\");\n    if (k < 1) throw new Error(\"k must be >= 1.\");\n    if (k > data.length) throw new Error(\"k cannot exceed the number of data points.\");\n\n    const { attempts = 5, init = 'kmeans++', maxIter = 300 } = options;\n\n    const points = data.map(features);\n    const dims = points[0].length;\n    if (points.some((p) => p.length !== dims))\n        throw new Error(\"All feature vectors must have the same length.\");\n\n    let bestClusters: NDCluster<T>[] | null = null;\n    let bestTotalWCSS = Infinity;\n\n    for (let attempt = 0; attempt < attempts; attempt++) {\n        const centroids =\n            init === 'kmeans++'\n                ? initKMeansPlusPlus(points, k)\n                : initRandom(points, k);\n\n        const memberIndices: number[][] = Array.from({ length: k }, () => []);\n        let prevCentroids: number[][] = [];\n        let iter = 0;\n\n        while (!centroidsConverged(centroids, prevCentroids) && iter < maxIter) {\n            prevCentroids = centroids.map((c) => [...c]);\n            for (const m of memberIndices) m.length = 0;\n\n            // Assign each point to the nearest centroid\n            for (let p = 0; p < points.length; p++) {\n                const dists = centroids.map((c) => euclidean(c, points[p]));\n                let nearest = 0;\n                for (let c = 1; c < k; c++)\n                    if (dists[c] < dists[nearest]) nearest = c;\n                memberIndices[nearest].push(p);\n            }\n\n            // Re-initialise empty clusters to a random data point\n            for (let c = 0; c < k; c++) {\n                if (memberIndices[c].length === 0) {\n                    const randomIdx = Math.floor(Math.random() * points.length);\n                    memberIndices[c].push(randomIdx);\n                }\n            }\n\n            // Recompute centroids as mean of assigned points\n            for (let c = 0; c < k; c++) {\n                const newCentroid = new Array(dims).fill(0);\n                for (const idx of memberIndices[c])\n                    for (let d = 0; d < dims; d++)\n                        newCentroid[d] += points[idx][d];\n                for (let d = 0; d < dims; d++)\n                    newCentroid[d] /= memberIndices[c].length;\n                centroids[c] = newCentroid;\n            }\n\n            iter++;\n        }\n\n        // Build result clusters and compute WCSS\n        const clusters: NDCluster<T>[] = centroids.map((centroid, c) => {\n            const members = memberIndices[c].map((i) => data[i]);\n            const wcss = memberIndices[c].reduce(\n                (sum, i) => sum + euclideanSq(points[i], centroid),\n                0,\n            );\n            return { id: c + 1, centroid, members, size: members.length, wcss };\n        });\n\n        const totalWCSS = clusters.reduce((s, c) => s + c.wcss, 0);\n        if (totalWCSS < bestTotalWCSS) {\n            bestTotalWCSS = totalWCSS;\n            bestClusters = clusters;\n        }\n    }\n\n    return bestClusters!;\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction euclidean(a: number[], b: number[]): number {\n    return Math.sqrt(euclideanSq(a, b));\n}\n\nfunction euclideanSq(a: number[], b: number[]): number {\n    let sum = 0;\n    for (let i = 0; i < a.length; i++) sum += (a[i] - b[i]) ** 2;\n    return sum;\n}\n\n/** K-means++ centroid seeding for better convergence. */\nfunction initKMeansPlusPlus(points: number[][], k: number): number[][] {\n    const centroids: number[][] = [];\n    // Pick first centroid at random\n    centroids.push([...points[Math.floor(Math.random() * points.length)]]);\n\n    for (let c = 1; c < k; c++) {\n        // For each point, D² = squared distance to nearest existing centroid\n        const weights = points.map((p) => {\n            let minDist = Infinity;\n            for (const centroid of centroids) {\n                const d = euclideanSq(p, centroid);\n                if (d < minDist) minDist = d;\n            }\n            return minDist;\n        });\n        // Weighted random selection\n        centroids.push([...weightedChoice(points, weights)]);\n    }\n    return centroids;\n}\n\nfunction initRandom(points: number[][], k: number): number[][] {\n    const indices = new Set<number>();\n    while (indices.size < k)\n        indices.add(Math.floor(Math.random() * points.length));\n    return [...indices].map((i) => [...points[i]]);\n}\n\nfunction weightedChoice(points: number[][], weights: number[]): number[] {\n    const total = weights.reduce((a, b) => a + b, 0);\n    let r = Math.random() * total;\n    for (let i = 0; i < weights.length; i++) {\n        r -= weights[i];\n        if (r <= 0) return points[i];\n    }\n    return points[points.length - 1];\n}\n\nconst CONVERGENCE_EPSILON = 1e-10;\n\nfunction centroidsConverged(curr: number[][], prev: number[][]): boolean {\n    if (prev.length === 0) return false;\n    return curr.every((c, i) => euclidean(c, prev[i]) < CONVERGENCE_EPSILON);\n}\n"],"mappings":"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","names":["result"]}