{"version":3,"sources":["webpack:///ml-svm/webpack/universalModuleDefinition","webpack:///ml-svm/ml-svm.min.js","webpack:///ml-svm/webpack/bootstrap 7d611716f5fdbb1d301a","webpack:///ml-svm/./src/index.js","webpack:///ml-svm/./src/svm.js","webpack:///ml-svm/./src/kernel.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","kernel","f","x","X","Y","alpha","b","par","length","aux","i","SVM","options","o","defaultOptions","hasOwnProperty","getKernel","k","randi","a","Math","floor","random","C","tol","max_passes","prototype","train","Array","TypeError","b1","b2","iter","Ei","Ej","ai","aj","L","H","eta","numChange","j","max","min","abs","newaj","s","W","r","w","alphas","splice","load","model","name","svm","slice","getAlphas","getThreshold","predict","ev","isArray","ans","e","x1","x2","func","dot","p1","p2","l","prod","kernellinear","kernelPolynomial","kernelRadial","pow","rest","norm","exp","linear","polynomial","radial"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,MAAAD,IAEAD,EAAA,MAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAASL,EAAQD,EAASM,GEtDhCL,EAAAD,UAAAM,EAAA,GACAN,EAAAe,OAAAT,EAAA,GAAAS,QF6DM,SAASd,EAAQD,EAASM,GG9DhC,YAmCA,SAAAU,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAN,EAAAO,GAGA,OAFAV,GAAAM,EAAAK,OACAC,EAAAH,EACAI,EAAA,EAAmBA,EAAAb,EAAOa,IAC1BD,GAAAJ,EAAAK,GAAAN,EAAAM,GAAAV,EAAAG,EAAAO,GAAAR,EAAAK,EAEA,OAAAE,GASA,QAAAE,GAAAC,GACAA,QACAvB,KAAAuB,UACA,QAAAC,KAAAC,GACAF,EAAAG,eAAAF,GACAxB,KAAAuB,QAAAC,GAAAD,EAAAC,GAEAxB,KAAAuB,QAAAC,GAAAC,EAAAD,EAGAxB,MAAAW,OAAAgB,EAAA3B,KAAAuB,QAAAK,GACA5B,KAAAiB,EAAA,EAiKA,QAAAY,GAAAC,EAAAb,GACA,MAAAc,MAAAC,MAAAD,KAAAE,UAAAhB,EAAAa,MA9NA,GACAH,IADAzB,EAAA,GAAAS,OACAT,EAAA,GAAAyB,WAaAF,GACAS,EAAA,GACAC,IAAA,GACAC,WAAA,GACAlB,IAAA,EACAU,EAAA,SAiDAN,GAAAe,UAAAC,MAAA,SAAAxB,EAAAC,GAGA,OAFAP,GAAAO,EAAAI,OACAH,EAAA,GAAAuB,OAAA/B,GACAsB,EAAA,EAAmBA,EAAAtB,EAAOsB,IAC1Bd,EAAAc,GAAA,CACA,IAAAhB,EAAAK,SAAAX,EACA,SAAAgC,WAAA,qCAaA,KAZA,GAAAvB,GAAA,EACAwB,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EAEAP,EAAA3C,KAAAuB,QAAAa,YAAA,CAEA,OADAe,GAAA,EACA9B,EAAA,EAAuBA,EAAAb,EAAOa,IAE9B,GADAuB,EAAAhC,EAAAE,EAAAO,GAAAP,EAAAC,EAAAC,EAAAC,EAAAjB,KAAAW,OAAAX,KAAAuB,QAAAL,KAAAH,EAAAM,GACAN,EAAAM,GAAAuB,GAAA5C,KAAAuB,QAAAY,KAAAnB,EAAAK,GAAArB,KAAAuB,QAAAW,GAAAnB,EAAAM,GAAAuB,EAAA5C,KAAAuB,QAAAY,KAAAnB,EAAAK,GAAA,GAEA,IADA,GAAA+B,GAAA/B,EACA+B,IAAA/B,GAAA+B,EAAAvB,EAAA,EAAArB,EAYA,IAXAqC,EAAAjC,EAAAE,EAAAsC,GAAAtC,EAAAC,EAAAC,EAAAC,EAAAjB,KAAAW,OAAAX,KAAAuB,QAAAL,KAAAH,EAAAqC,GACAN,EAAA9B,EAAAK,GACA0B,EAAA/B,EAAAoC,GACArC,EAAAM,KAAAN,EAAAqC,IACAJ,EAAAjB,KAAAsB,IAAA,EAAAP,EAAAC,EAAA/C,KAAAuB,QAAAW,GACAe,EAAAlB,KAAAuB,IAAAtD,KAAAuB,QAAAW,EAAAY,EAAAC,KAGAC,EAAAjB,KAAAsB,IAAA,EAAAN,EAAAD,GACAG,EAAAlB,KAAAuB,IAAAtD,KAAAuB,QAAAW,EAAAlC,KAAAuB,QAAAW,EAAAa,EAAAD,IAEAf,KAAAwB,IAAAP,EAAAC,GAAA,aAGA,IADAC,EAAA,EAAAlD,KAAAW,OAAAG,EAAAO,GAAAP,EAAAsC,GAAApD,KAAAuB,QAAAL,KAAAlB,KAAAW,OAAAG,EAAAO,GAAAP,EAAAO,GAAArB,KAAAuB,QAAAL,KAAAlB,KAAAW,OAAAG,EAAAsC,GAAAtC,EAAAsC,GAAApD,KAAAuB,QAAAL,KACAgC,GAAA,UACA,IAAAM,GAAAxC,EAAAoC,GAAArC,EAAAqC,IAAAR,EAAAC,GAAAK,CAMA,IALAlC,EAAAoC,GAAApC,EAAAoC,GAAArC,EAAAqC,IAAAR,EAAAC,GAAAK,EACAM,EAAAP,EACAO,EAAAP,EACAO,EAAAR,IACAQ,EAAAR,GACAjB,KAAAwB,IAAAR,EAAAS,GAAA,aACAxC,GAAAoC,GAAAI,EACAxC,EAAAK,GAAAL,EAAAK,GAAAN,EAAAM,GAAAN,EAAAqC,IAAAL,EAAAS,GACAf,EAAAxB,EAAA2B,EAAA7B,EAAAM,IAAAL,EAAAK,GAAAyB,GAAA9C,KAAAW,OAAAG,EAAAO,GAAAP,EAAAO,GAAArB,KAAAuB,QAAAL,KAAAH,EAAAqC,IAAApC,EAAAoC,GAAAL,GAAA/C,KAAAW,OAAAG,EAAAO,GAAAP,EAAAsC,GAAApD,KAAAuB,QAAAL,KACAwB,EAAAzB,EAAA4B,EAAA9B,EAAAM,IAAAL,EAAAK,GAAAyB,GAAA9C,KAAAW,OAAAG,EAAAO,GAAAP,EAAAsC,GAAApD,KAAAuB,QAAAL,KAAAH,EAAAqC,IAAApC,EAAAoC,GAAAL,GAAA/C,KAAAW,OAAAG,EAAAsC,GAAAtC,EAAAsC,GAAApD,KAAAuB,QAAAL,KACAD,GAAAwB,EAAAC,GAAA,EACA1B,EAAAK,GAAArB,KAAAuB,QAAAW,GAAAlB,EAAAK,GAAA,IAAAJ,EAAAwB,GACAzB,EAAAoC,GAAApD,KAAAuB,QAAAW,GAAAlB,EAAAoC,GAAA,IAAAnC,EAAAyB,GACAS,GAAA,EAGA,GAAAA,EACAR,GAAA,EAEAA,EAAA,EAEA3C,KAAAiB,GACA,IAAAwC,GAAA3C,EAAA,GAAAK,MACAnB,MAAA0D,EAAA,GAAAnB,OAAAkB,EACA,QAAAE,GAAA,EAAmBA,EAAAF,EAAOE,IAAA,CAC1B3D,KAAA0D,EAAAC,GAAA,CACA,QAAAC,GAAA,EAAuBA,EAAApD,EAAOoD,IAC9B5D,KAAA0D,EAAAC,IAAA5C,EAAA6C,GAAA5C,EAAA4C,GAAA9C,EAAA8C,GAAAD,GAEA3D,KAAA6D,OAAA7C,EAAA8C,UAQAxC,EAAAyC,KAAA,SAAAC,GACA,WAAAA,EAAAC,KAAA,CACA,GAAAC,GAAA,GAAA5C,GAAA0C,EAAAzC,QAGA,OAFA2C,GAAAR,EAAAM,EAAAN,EAAAS,QACAD,EAAAjD,EAAA+C,EAAA/C,EACAiD,EAEA,SAAA1B,WAAA,0BAUAlB,EAAAe,UAAAf,UAAA,WACA,GAAA0C,IACAC,KAAA,MAKA,OAHAD,GAAAzC,QAAAvB,KAAAuB,QACAyC,EAAAN,EAAA1D,KAAA0D,EACAM,EAAA/C,EAAAjB,KAAAiB,EACA+C,GAOA1C,EAAAe,UAAA+B,UAAA,WACA,MAAApE,MAAA6D,OAAAM,SAOA7C,EAAAe,UAAAgC,aAAA,WACA,MAAArE,MAAAiB,GAQAK,EAAAe,UAAAiC,QAAA,SAAA5D,GACA,GAAA6D,EACA,IAAAhC,MAAAiC,QAAA9D,KAAA6B,MAAAiC,QAAA9D,EAAA,qBAAAA,GAAA,KAEA,OADA+D,GAAA,GAAAlC,OAAA7B,EAAAS,QACAE,EAAA,EAAuBA,EAAAoD,EAAAtD,OAAgBE,IAAA,CACvCkD,EAAAvE,KAAAiB,CACA,QAAAmC,GAAA,EAA2BA,EAAApD,KAAA0D,EAAAvC,OAAmBiC,IAC9CmB,GAAAvE,KAAA0D,EAAAN,GAAA1C,EAAA0C,EACAmB,GAAA,EACAE,EAAApD,MAEAoD,EAAApD,GAAA,EAEA,MAAAoD,GAGAF,EAAAvE,KAAAiB,CACA,QAAAyD,GAAA,EAAuBA,EAAA1E,KAAA0D,EAAAvC,OAAmBuD,IAC1CH,GAAAvE,KAAA0D,EAAAgB,GAAAhE,EAAAgE,EACA,OAAAH,GAAA,KAGA,GAQA1E,EAAAD,QAAA0B,GHoEM,SAASzB,EAAQD,GItSvB,YAUA,SAAAe,GAAAgE,EAAAC,EAAAC,EAAA3D,GACA,MAAAS,GAAAkD,GAAAF,EAAAC,EAAA1D,GASA,QAAA4D,GAAAC,EAAAC,GAIA,OAHAC,GAAAF,EAAA5D,OACA+D,EAAA,EAEA7D,EAAA,EAAmBA,EAAA4D,EAAO5D,IAC1B6D,GAAAH,EAAA1D,GAAA2D,EAAA3D,EAGA,OAAA6D,GAGA,QAAAvD,GAAAkD,GAGA,OAFAA,EAAA,mBAAAA,GAAA,SAAAA,GAGA,aACA,MAAAM,EACA,kBACA,MAAAC,EACA,cACA,MAAAC,EACA,SACA,SAAA7C,WAAA,8BAAAqC,IAIA,QAAAM,GAAAR,EAAAC,GACA,MAAAE,GAAAH,EAAAC,GAGA,QAAAQ,GAAAT,EAAAC,EAAA1D,GAEA,MADAA,GAAA,mBAAAA,GAAA,EAAAA,EACAa,KAAAuD,IAAAR,EAAAH,EAAAC,GAAA,EAAA1D,GAGA,QAAAmE,GAAAV,EAAAC,EAAA1D,GACAA,EAAA,mBAAAA,GAAA,EAAAA,CAGA,QAFA+D,GAAAN,EAAAxD,OACAoE,EAAA,GAAAhD,OAAA0C,GACA5D,EAAA,EAAmBA,EAAA4D,EAAO5D,IAC1BkE,EAAAlE,GAAAsD,EAAAtD,GAAAuD,EAAAvD,EAEA,IAAAmE,GAAAV,EAAAS,IACA,OAAAxD,MAAA0D,IAAA,MAAAvE,MAGArB,EAAAD,SACAe,SACAgB,YACA+D,OAAAP,EACAQ,WAAAP,EACAQ,OAAAP","file":"ml-svm.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mlSvm\"] = factory();\n\telse\n\t\troot[\"mlSvm\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"mlSvm\"] = factory();\n\telse\n\t\troot[\"mlSvm\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = exports = __webpack_require__(1);\n\texports.kernel = __webpack_require__(2).kernel;\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar kernel = __webpack_require__(2).kernel;\n\tvar getKernel = __webpack_require__(2).getKernel;\n\t\n\t/**\n\t * Parameters to implement function\n\t * @type {{C: number, tol: number, max_passes: number, par: number, k: string}}\n\t * @param {number} C - regularization parameter\n\t * @param {number} tol - numerical tolerance\n\t * @param {number} max_passes - max number of times to iterate over alphas without\n\t * changing\n\t * @param {string} k - the kind of kernel\n\t * @param {number} par - parameter used in the polynomial and the radial function\n\t * of the kernel\n\t */\n\tvar defaultOptions = {\n\t    C: 10,\n\t    tol: 10e-2,\n\t    max_passes: 10,\n\t    par: 2,\n\t    k: 'linear'\n\t};\n\t\n\t/**\n\t * Function to calculate the estimated prediction\n\t * @param {Array <number>} x - point where calculate the function prediction\n\t * @param {Array <Array <number>>} X - training data point in the form (x1, x2)\n\t * @param {Array <number>} Y - training data labels in the domain {1,-1}\n\t * @param {Array <number>} alpha - Lagrange multipliers\n\t * @param {number} b - threshold of the function\n\t * @param {string} k - the kind of kernel\n\t * @param {number} par - parameter used in the polynomial and the radial function\n\t * of the kernel\n\t * @returns {number}\n\t */\n\tfunction f(x, X, Y, alpha, b, kernel, par) {\n\t    var m = X.length;\n\t    var aux = b;\n\t    for (var i = 0; i < m; i++) {\n\t        aux += alpha[i]*Y[i]*kernel(X[i],x, par)\n\t    }\n\t    return aux;\n\t}\n\t\n\t/**\n\t * Simplified version of the Sequential Minimal Optimization algorithm for training\n\t * support vector machines\n\t * @param {{json}} options - parameters to implement function\n\t * @constructor\n\t */\n\tfunction SVM(options) {\n\t    options = options || {};\n\t    this.options = {};\n\t    for (var o in defaultOptions) {\n\t        if (options.hasOwnProperty(o)) {\n\t            this.options[o] = options[o];\n\t        } else {\n\t            this.options[o] = defaultOptions[o];\n\t        }\n\t    }\n\t    this.kernel = getKernel(this.options.k);\n\t    this.b = 0;\n\t}\n\t\n\t/**\n\t * Train the SVM model\n\t * @param {Array <Array <number>>} X - training data point in the form (x1, x2)\n\t * @param {Array <number>} Y - training data labels in the domain {1,-1}\n\t */\n\tSVM.prototype.train = function (X, Y) {\n\t    var m = Y.length;\n\t    var alpha = new Array(m);\n\t    for (var a = 0; a < m; a++)\n\t        alpha[a] = 0;\n\t    if (X.length !== m)\n\t        throw new TypeError('Arrays should have the same length');\n\t    var b = 0,\n\t        b1 = 0,\n\t        b2 = 0,\n\t        iter = 0,\n\t        Ei = 0,\n\t        Ej = 0,\n\t        ai = 0,\n\t        aj = 0,\n\t        L = 0,\n\t        H = 0,\n\t        eta = 0;\n\t\n\t    while (iter < this.options.max_passes) {\n\t        var numChange = 0;\n\t        for (var i = 0; i < m; i++) {\n\t            Ei = f(X[i],X,Y,alpha,b,this.kernel,this.options.par) - Y[i];\n\t            if (((Y[i]*Ei < -this.options.tol) && (alpha[i] < this.options.C)) || ((Y[i]*Ei > this.options.tol) && (alpha[i] > 0))) {\n\t                var j = i;\n\t                while(j===i) j=randi(0, m);\n\t                Ej = f(X[j],X,Y,alpha,b,this.kernel,this.options.par) - Y[j];\n\t                ai = alpha[i];\n\t                aj = alpha[j];\n\t                if (Y[i] === Y[j]) {\n\t                    L = Math.max(0, ai+aj-this.options.C);\n\t                    H = Math.min(this.options.C, ai+aj);\n\t                }\n\t                else  {\n\t                    L = Math.max(0, aj-ai);\n\t                    H = Math.min(this.options.C, this.options.C+aj+ai);\n\t                }\n\t                if(Math.abs(L - H) < 1e-4) continue;\n\t\n\t                eta = 2*this.kernel(X[i],X[j], this.options.par) - this.kernel(X[i],X[i], this.options.par) - this.kernel(X[j],X[j], this.options.par);\n\t                if(eta >=0) continue;\n\t                var newaj = alpha[j] - (Y[j]*(Ei - Ej)) / eta;\n\t                alpha[j] = alpha[j] - (Y[j]*(Ei - Ej)) / eta;\n\t                if (newaj > H)\n\t                    newaj = H;\n\t                else if (newaj < L)\n\t                    newaj = L;\n\t                if(Math.abs(aj - newaj) < 10e-4) continue;\n\t                alpha[j] = newaj;\n\t                alpha[i] = alpha[i] + Y[i]*Y[j]*(aj - newaj);\n\t                b1 = b - Ei - Y[i]*(alpha[i] - ai)*this.kernel(X[i],X[i], this.options.par) - Y[j]*(alpha[j] - aj)*this.kernel(X[i],X[j], this.options.par);\n\t                b2 = b - Ej - Y[i]*(alpha[i] - ai)*this.kernel(X[i],X[j], this.options.par) - Y[j]*(alpha[j] - aj)*this.kernel(X[j],X[j], this.options.par);\n\t                b = (b1 + b2) / 2;\n\t                if (alpha[i] < this.options.C && alpha[i] > 0) b = b1;\n\t                if (alpha[j] < this.options.C && alpha[j] > 0) b = b2;\n\t                numChange += 1;\n\t            }\n\t        }\n\t        if (numChange == 0)\n\t            iter += 1;\n\t        else\n\t            iter = 0;\n\t    }\n\t    this.b = b;\n\t    var s = X[0].length;\n\t    this.W = new Array(s);\n\t    for (var r = 0; r < s; r++) {\n\t        this.W[r] = 0;\n\t        for (var w = 0; w < m; w++)\n\t            this.W[r] += Y[w]*alpha[w]*X[w][r];\n\t    }\n\t    this.alphas = alpha.splice();\n\t};\n\t\n\t/**\n\t * Recreates a SVM based in the exported model\n\t * @param {{name: string, ,options: {json} ,alpha: Array<number>, b: number}} model\n\t * @returns {SVM}\n\t */\n\tSVM.load = function (model) {\n\t    if (model.name === 'SVM') {\n\t        var svm = new SVM(model.options);\n\t        svm.W = model.W.slice();\n\t        svm.b = model.b;\n\t        return svm;\n\t    } else {\n\t        throw new TypeError('expecting a SVM model');\n\t    }\n\t};\n\t\n\t/**\n\t * Let's have a JSON to recreate the model\n\t * @returns {{name: String(\"SVM\"), ,options: {json} ,alpha: Array<number>, b: number}}\n\t * name identifier, options to recreate model, the Lagrange multipliers and the\n\t * threshold of the objective function\n\t */\n\tSVM.prototype.export = function () {\n\t    var model = {\n\t        name: 'SVM'\n\t    };\n\t    model.options = this.options;\n\t    model.W = this.W;\n\t    model.b = this.b;\n\t    return model;\n\t};\n\t\n\t/**\n\t * Return the Lagrange multipliers\n\t * @returns {Array <number>}\n\t */\n\tSVM.prototype.getAlphas = function () {\n\t    return this.alphas.slice();\n\t};\n\t\n\t/**\n\t * Returns the threshold of the model function\n\t * @returns {number} threshold of the function\n\t */\n\tSVM.prototype.getThreshold = function () {\n\t    return this.b;\n\t};\n\t\n\t/**\n\t * Use the train model to make predictions\n\t * @param {Array} p - An array or a single dot to have the prediction\n\t * @returns {*} An array or a single {-1, 1} value of the prediction\n\t */\n\tSVM.prototype.predict = function (p) {\n\t    var ev;\n\t    if (Array.isArray(p) && (Array.isArray(p[0]) || (typeof p[0] === 'object'))) {\n\t        var ans = new Array(p.length);\n\t        for (var i = 0; i < ans.length; i++) {\n\t            ev = this.b;\n\t            for (var j = 0; j < this.W.length; j++)\n\t                ev += this.W[j]*p[j];\n\t            if (ev < 0)\n\t                ans[i] = -1;\n\t            else\n\t                ans[i] = 1;\n\t        }\n\t        return ans;\n\t    }\n\t    else {\n\t        ev = this.b;\n\t        for (var e = 0; e < this.W.length; e++)\n\t            ev += this.W[e]*p[e];\n\t        if (ev < 0)\n\t            return -1;\n\t        else\n\t            return 1;\n\t    }\n\t};\n\t\n\tfunction randi(a, b) {\n\t    return Math.floor(Math.random()*(b-a)+a);\n\t}\n\t\n\tmodule.exports = SVM;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Kernel function to return the dot product for different spaces\n\t * @param {Array <number>} x1 - input first vector\n\t * @param {Array <number>} x2 - input second vector\n\t * @param {string} func - the kind of transformation\n\t * @param {number} par - parameter used in the polynomial and the radial function\n\t * @return {number} calculus of the dot product using the function\n\t * */\n\tfunction kernel(x1,x2,func,par) {\n\t    return getKernel(func)(x1, x2, par);\n\t}\n\t\n\t/**\n\t * The dot product between the p1 and p2 vectors\n\t * @param {Array <number>} p1 - first vector to get dot product\n\t * @param {Array <number>} p2 - second vector to get dot product\n\t * @returns {number} dot product between the p1 and p2 vectors\n\t */\n\tfunction dot(p1, p2) {\n\t    var l = p1.length;\n\t    var prod = 0;\n\t\n\t    for (var i = 0; i < l; i++) {\n\t        prod += p1[i] * p2[i];\n\t    }\n\t\n\t    return prod;\n\t}\n\t\n\tfunction getKernel(func) {\n\t    func = (typeof func === 'undefined') ? 'linear' : func;\n\t\n\t    switch(func) {\n\t        case 'linear':\n\t            return kernellinear;\n\t        case 'polynomial':\n\t            return kernelPolynomial;\n\t        case 'radial':\n\t            return kernelRadial;\n\t        default:\n\t            throw new TypeError('Function kernel undefined: ' + func);\n\t    }\n\t}\n\t\n\tfunction kernellinear(x1,x2) {\n\t    return dot(x1,x2);\n\t}\n\t\n\tfunction kernelPolynomial(x1, x2, par) {\n\t    par = (typeof par === 'undefined') ? 2 : par;\n\t    return Math.pow((dot(x1, x2) + 1), par);\n\t}\n\t\n\tfunction kernelRadial(x1, x2, par) {\n\t    par = (typeof par === 'undefined') ? 2 : par;\n\t    var l = x1.length;\n\t    var rest = new Array(l);\n\t    for (var i = 0; i < l; i++) {\n\t        rest[i] = x1[i] - x2[i];\n\t    }\n\t    var norm = dot(rest, rest);\n\t    return Math.exp((norm)/(-2*par*par));\n\t}\n\t\n\tmodule.exports = {\n\t    kernel: kernel,\n\t    getKernel: getKernel,\n\t    linear : kernellinear,\n\t    polynomial : kernelPolynomial,\n\t    radial : kernelRadial\n\t};\n\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** ml-svm.min.js\n **/"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 7d611716f5fdbb1d301a\n **/","module.exports = exports = require('./svm');\nexports.kernel = require('./kernel').kernel;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/index.js\n ** module id = 0\n ** module chunks = 0\n **/","'use strict';\nvar kernel = require(\"./kernel\").kernel;\nvar getKernel = require(\"./kernel\").getKernel;\n\n/**\n * Parameters to implement function\n * @type {{C: number, tol: number, max_passes: number, par: number, k: string}}\n * @param {number} C - regularization parameter\n * @param {number} tol - numerical tolerance\n * @param {number} max_passes - max number of times to iterate over alphas without\n * changing\n * @param {string} k - the kind of kernel\n * @param {number} par - parameter used in the polynomial and the radial function\n * of the kernel\n */\nvar defaultOptions = {\n    C: 10,\n    tol: 10e-2,\n    max_passes: 10,\n    par: 2,\n    k: 'linear'\n};\n\n/**\n * Function to calculate the estimated prediction\n * @param {Array <number>} x - point where calculate the function prediction\n * @param {Array <Array <number>>} X - training data point in the form (x1, x2)\n * @param {Array <number>} Y - training data labels in the domain {1,-1}\n * @param {Array <number>} alpha - Lagrange multipliers\n * @param {number} b - threshold of the function\n * @param {string} k - the kind of kernel\n * @param {number} par - parameter used in the polynomial and the radial function\n * of the kernel\n * @returns {number}\n */\nfunction f(x, X, Y, alpha, b, kernel, par) {\n    var m = X.length;\n    var aux = b;\n    for (var i = 0; i < m; i++) {\n        aux += alpha[i]*Y[i]*kernel(X[i],x, par)\n    }\n    return aux;\n}\n\n/**\n * Simplified version of the Sequential Minimal Optimization algorithm for training\n * support vector machines\n * @param {{json}} options - parameters to implement function\n * @constructor\n */\nfunction SVM(options) {\n    options = options || {};\n    this.options = {};\n    for (var o in defaultOptions) {\n        if (options.hasOwnProperty(o)) {\n            this.options[o] = options[o];\n        } else {\n            this.options[o] = defaultOptions[o];\n        }\n    }\n    this.kernel = getKernel(this.options.k);\n    this.b = 0;\n}\n\n/**\n * Train the SVM model\n * @param {Array <Array <number>>} X - training data point in the form (x1, x2)\n * @param {Array <number>} Y - training data labels in the domain {1,-1}\n */\nSVM.prototype.train = function (X, Y) {\n    var m = Y.length;\n    var alpha = new Array(m);\n    for (var a = 0; a < m; a++)\n        alpha[a] = 0;\n    if (X.length !== m)\n        throw new TypeError('Arrays should have the same length');\n    var b = 0,\n        b1 = 0,\n        b2 = 0,\n        iter = 0,\n        Ei = 0,\n        Ej = 0,\n        ai = 0,\n        aj = 0,\n        L = 0,\n        H = 0,\n        eta = 0;\n\n    while (iter < this.options.max_passes) {\n        var numChange = 0;\n        for (var i = 0; i < m; i++) {\n            Ei = f(X[i],X,Y,alpha,b,this.kernel,this.options.par) - Y[i];\n            if (((Y[i]*Ei < -this.options.tol) && (alpha[i] < this.options.C)) || ((Y[i]*Ei > this.options.tol) && (alpha[i] > 0))) {\n                var j = i;\n                while(j===i) j=randi(0, m);\n                Ej = f(X[j],X,Y,alpha,b,this.kernel,this.options.par) - Y[j];\n                ai = alpha[i];\n                aj = alpha[j];\n                if (Y[i] === Y[j]) {\n                    L = Math.max(0, ai+aj-this.options.C);\n                    H = Math.min(this.options.C, ai+aj);\n                }\n                else  {\n                    L = Math.max(0, aj-ai);\n                    H = Math.min(this.options.C, this.options.C+aj+ai);\n                }\n                if(Math.abs(L - H) < 1e-4) continue;\n\n                eta = 2*this.kernel(X[i],X[j], this.options.par) - this.kernel(X[i],X[i], this.options.par) - this.kernel(X[j],X[j], this.options.par);\n                if(eta >=0) continue;\n                var newaj = alpha[j] - (Y[j]*(Ei - Ej)) / eta;\n                alpha[j] = alpha[j] - (Y[j]*(Ei - Ej)) / eta;\n                if (newaj > H)\n                    newaj = H;\n                else if (newaj < L)\n                    newaj = L;\n                if(Math.abs(aj - newaj) < 10e-4) continue;\n                alpha[j] = newaj;\n                alpha[i] = alpha[i] + Y[i]*Y[j]*(aj - newaj);\n                b1 = b - Ei - Y[i]*(alpha[i] - ai)*this.kernel(X[i],X[i], this.options.par) - Y[j]*(alpha[j] - aj)*this.kernel(X[i],X[j], this.options.par);\n                b2 = b - Ej - Y[i]*(alpha[i] - ai)*this.kernel(X[i],X[j], this.options.par) - Y[j]*(alpha[j] - aj)*this.kernel(X[j],X[j], this.options.par);\n                b = (b1 + b2) / 2;\n                if (alpha[i] < this.options.C && alpha[i] > 0) b = b1;\n                if (alpha[j] < this.options.C && alpha[j] > 0) b = b2;\n                numChange += 1;\n            }\n        }\n        if (numChange == 0)\n            iter += 1;\n        else\n            iter = 0;\n    }\n    this.b = b;\n    var s = X[0].length;\n    this.W = new Array(s);\n    for (var r = 0; r < s; r++) {\n        this.W[r] = 0;\n        for (var w = 0; w < m; w++)\n            this.W[r] += Y[w]*alpha[w]*X[w][r];\n    }\n    this.alphas = alpha.splice();\n};\n\n/**\n * Recreates a SVM based in the exported model\n * @param {{name: string, ,options: {json} ,alpha: Array<number>, b: number}} model\n * @returns {SVM}\n */\nSVM.load = function (model) {\n    if (model.name === 'SVM') {\n        var svm = new SVM(model.options);\n        svm.W = model.W.slice();\n        svm.b = model.b;\n        return svm;\n    } else {\n        throw new TypeError('expecting a SVM model');\n    }\n};\n\n/**\n * Let's have a JSON to recreate the model\n * @returns {{name: String(\"SVM\"), ,options: {json} ,alpha: Array<number>, b: number}}\n * name identifier, options to recreate model, the Lagrange multipliers and the\n * threshold of the objective function\n */\nSVM.prototype.export = function () {\n    var model = {\n        name: 'SVM'\n    };\n    model.options = this.options;\n    model.W = this.W;\n    model.b = this.b;\n    return model;\n};\n\n/**\n * Return the Lagrange multipliers\n * @returns {Array <number>}\n */\nSVM.prototype.getAlphas = function () {\n    return this.alphas.slice();\n};\n\n/**\n * Returns the threshold of the model function\n * @returns {number} threshold of the function\n */\nSVM.prototype.getThreshold = function () {\n    return this.b;\n};\n\n/**\n * Use the train model to make predictions\n * @param {Array} p - An array or a single dot to have the prediction\n * @returns {*} An array or a single {-1, 1} value of the prediction\n */\nSVM.prototype.predict = function (p) {\n    var ev;\n    if (Array.isArray(p) && (Array.isArray(p[0]) || (typeof p[0] === 'object'))) {\n        var ans = new Array(p.length);\n        for (var i = 0; i < ans.length; i++) {\n            ev = this.b;\n            for (var j = 0; j < this.W.length; j++)\n                ev += this.W[j]*p[j];\n            if (ev < 0)\n                ans[i] = -1;\n            else\n                ans[i] = 1;\n        }\n        return ans;\n    }\n    else {\n        ev = this.b;\n        for (var e = 0; e < this.W.length; e++)\n            ev += this.W[e]*p[e];\n        if (ev < 0)\n            return -1;\n        else\n            return 1;\n    }\n};\n\nfunction randi(a, b) {\n    return Math.floor(Math.random()*(b-a)+a);\n}\n\nmodule.exports = SVM;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/svm.js\n ** module id = 1\n ** module chunks = 0\n **/","'use strict';\n\n/**\n * Kernel function to return the dot product for different spaces\n * @param {Array <number>} x1 - input first vector\n * @param {Array <number>} x2 - input second vector\n * @param {string} func - the kind of transformation\n * @param {number} par - parameter used in the polynomial and the radial function\n * @return {number} calculus of the dot product using the function\n * */\nfunction kernel(x1,x2,func,par) {\n    return getKernel(func)(x1, x2, par);\n}\n\n/**\n * The dot product between the p1 and p2 vectors\n * @param {Array <number>} p1 - first vector to get dot product\n * @param {Array <number>} p2 - second vector to get dot product\n * @returns {number} dot product between the p1 and p2 vectors\n */\nfunction dot(p1, p2) {\n    var l = p1.length;\n    var prod = 0;\n\n    for (var i = 0; i < l; i++) {\n        prod += p1[i] * p2[i];\n    }\n\n    return prod;\n}\n\nfunction getKernel(func) {\n    func = (typeof func === 'undefined') ? 'linear' : func;\n\n    switch(func) {\n        case 'linear':\n            return kernellinear;\n        case 'polynomial':\n            return kernelPolynomial;\n        case 'radial':\n            return kernelRadial;\n        default:\n            throw new TypeError('Function kernel undefined: ' + func);\n    }\n}\n\nfunction kernellinear(x1,x2) {\n    return dot(x1,x2);\n}\n\nfunction kernelPolynomial(x1, x2, par) {\n    par = (typeof par === 'undefined') ? 2 : par;\n    return Math.pow((dot(x1, x2) + 1), par);\n}\n\nfunction kernelRadial(x1, x2, par) {\n    par = (typeof par === 'undefined') ? 2 : par;\n    var l = x1.length;\n    var rest = new Array(l);\n    for (var i = 0; i < l; i++) {\n        rest[i] = x1[i] - x2[i];\n    }\n    var norm = dot(rest, rest);\n    return Math.exp((norm)/(-2*par*par));\n}\n\nmodule.exports = {\n    kernel: kernel,\n    getKernel: getKernel,\n    linear : kernellinear,\n    polynomial : kernelPolynomial,\n    radial : kernelRadial\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/kernel.js\n ** module id = 2\n ** module chunks = 0\n **/"],"sourceRoot":""}