diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc index 565fc374d..6db7701cc 100644 Binary files a/__pycache__/run.cpython-37.pyc and b/__pycache__/run.cpython-37.pyc differ diff --git a/frontend/package-lock.json b/frontend/package-lock.json index bb808ba42..1a2b1d802 100755 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1447,29 +1447,29 @@ } }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.22.tgz", - "integrity": "sha512-QmEuZsipX5/cR9JOg0fsTN4Yr/9lieYWM8AQpmRa0eIfeOcl/HLYoEa366BCGRSrgNJEexuvOgbq9jnJ22IY5g==" + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.24.tgz", + "integrity": "sha512-IPBT/1LdUVQpHcqdrh8uI2/86Fbu7933hkA/HweiCmP5QgF/8PecFM00gYvykxf0RZud8bg8zu+YfggDFUc1Kw==" }, "@fortawesome/fontawesome-free": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.10.2.tgz", - "integrity": "sha512-9pw+Nsnunl9unstGEHQ+u41wBEQue6XPBsILXtJF/4fNN1L3avJcMF/gGF86rIjeTAgfLjTY9ndm68/X4f4idQ==" + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.11.1.tgz", + "integrity": "sha512-DtXLVYAkDU0ce1cFUgLvZaMd1R2J/LviBYih9xr4ZLhQMrgvYX7w2vOxlpKLRALfIj5GyC5zoVrcACOkLcFgvg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.22", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.22.tgz", - "integrity": "sha512-Q941E4x8UfnMH3308n0qrgoja+GoqyiV846JTLoCcCWAKokLKrixCkq6RDBs8r+TtAWaLUrBpI+JFxQNX/WNPQ==", + "version": "1.2.24", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.24.tgz", + "integrity": "sha512-9uVGOEZwviZKbkOVX8nn8cErVqOHBAd1Fqd2OH7Iwu0vxGWdb3fFOMhaAyMXUHZpq1u5C9/HClCV49ci4WmJAg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.22" + "@fortawesome/fontawesome-common-types": "^0.2.24" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.10.2.tgz", - "integrity": "sha512-9Os/GRUcy+iVaznlg8GKcPSQFpIQpAg14jF0DWsMdnpJfIftlvfaQCWniR/ex9FoOpSEOrlXqmUCFL+JGeciuA==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.11.1.tgz", + "integrity": "sha512-bB3hXON1K6mVOetTTg5VXZ4CAHg866p7MqenDkJ/eVcbWbGQRE45ojHEwkf37tWx3E8z6lcEameRwU9r5tGwjg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.22" + "@fortawesome/fontawesome-common-types": "^0.2.24" } }, "@fortawesome/vue-fontawesome": { @@ -5132,10 +5132,15 @@ "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-10.6.2.tgz", "integrity": "sha512-8JTPZB9QVOdrGzYF3YgC3YW6ssfPeBvBwZnXffiZ7YH/zz1D0EKlZvmQsm/w3N0XjVNYQEoQ0ax+jHrErV4K1Q==" }, + "bootstrap-toggle": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bootstrap-toggle/-/bootstrap-toggle-2.2.2.tgz", + "integrity": "sha1-K4hTT8G5mGdPh3+Yug2LW3Q+lv4=" + }, "bootstrap-vue": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.0.tgz", - "integrity": "sha512-lBqkMtkXMqdIwMSDnWydVb38sOIQ0v+RRn/H0PEcLNd2OFarh81mHzGR+ARofGnO9Ubt0o1WJDRWk8RsNK2JfA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.1.tgz", + "integrity": "sha512-mb2MP0f3KNRi/D8W0cItX2joM+XbwciFx1JKjtdKzt4uIXNx2SpOwF/wle26CszB1S35ArXJ/ZVN0dX8ry4yng==", "requires": { "@nuxt/opencollective": "^0.3.0", "bootstrap": ">=4.3.1 <5.0.0", @@ -6025,6 +6030,11 @@ "simple-swizzle": "^0.2.2" } }, + "colorbrewer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.3.0.tgz", + "integrity": "sha512-AzVPpWa+fuO/qY8LxPQjej6F49Lb2Cl+7U9YhPn6y4/SOY6u/EZiXUc7qHzRb6i6fWPStCUdEaU2731QyQKWjg==" + }, "colormap": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/colormap/-/colormap-2.3.1.tgz", @@ -6802,9 +6812,9 @@ } }, "css-element-queries": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-element-queries/-/css-element-queries-1.2.0.tgz", - "integrity": "sha512-4gaxpioSFueMcp9yj1TJFCLjfooGv38y6ZdwFUS3GuS+9NIVijdeiExXKwSIHoQDADfpgnaYSTzmJs+bV+Hehg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-element-queries/-/css-element-queries-1.2.1.tgz", + "integrity": "sha512-hiI1tSzf+U/gE13qhfwnCvN90Ay0THnE+mT3pjN/c/mvFmEUHZVNrvMJrrkw2ppOzkl69FdgH2ZGZENYQUaN2A==" }, "css-font": { "version": "1.2.0", @@ -7316,6 +7326,21 @@ "d3-array": "1" } }, + "d3-heatmap": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-heatmap/-/d3-heatmap-1.2.1.tgz", + "integrity": "sha1-ukicekNWKtfcyUGvoursqVESz6Q=", + "requires": { + "d3": "^3.5.16" + }, + "dependencies": { + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + } + } + }, "d3-hierarchy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", @@ -8289,9 +8314,9 @@ } }, "earcut": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.1.5.tgz", - "integrity": "sha512-QFWC7ywTVLtvRAJTVp8ugsuuGQ5mVqNmJ1cRYeLrSHgP3nycr2RHTJob9OtM0v8ujuoKN0NY1a93J/omeTL1PA==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.1.tgz", + "integrity": "sha512-5jIMi2RB3HtGPHcYd9Yyl0cczo84y+48lgKPxMijliNQaKAHEZJbdzLmKmdxG/mCdS/YD9DQ1gihL8mxzR0F9w==" }, "edges-to-adjacency-list": { "version": "1.0.0", @@ -8308,9 +8333,9 @@ "dev": true }, "ejs": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", - "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", "dev": true }, "electron-to-chromium": { @@ -8332,9 +8357,9 @@ } }, "elliptic": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", - "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -8759,9 +8784,9 @@ } }, "eslint": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.3.0.tgz", - "integrity": "sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.4.0.tgz", + "integrity": "sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -9163,9 +9188,9 @@ "dev": true }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", "dev": true }, "events": { @@ -10145,12 +10170,12 @@ } }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", "dev": true, "requires": { - "debug": "^3.2.6" + "debug": "^3.0.0" }, "dependencies": { "debug": { @@ -10944,15 +10969,23 @@ } }, "gl-cone3d": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.3.1.tgz", - "integrity": "sha512-ftw75smsDy5nU94susUNimXo8H40BEOVjaFrjT387vP4fJqkSVpzVK7jGrPA8/nSrFCOIQ0msWNYL9MMqQ3hjg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.4.0.tgz", + "integrity": "sha512-RiwwS0378p779Ae+aX+JqlodlALcTLrXVRkqbWdF03wRj0Ih6OgyuiVGQ/BduarWe+Tt8iGbt7zs+/H8RPVscQ==", "requires": { + "colormap": "^2.3.1", + "gl-buffer": "^2.1.2", "gl-shader": "^4.2.1", + "gl-texture2d": "^2.1.0", + "gl-vao": "^1.3.0", "gl-vec3": "^1.1.3", "glsl-inverse": "^1.0.0", "glsl-out-of-range": "^1.0.4", - "glslify": "^7.0.0" + "glslify": "^7.0.0", + "ndarray": "^1.0.18", + "normals": "^1.1.0", + "simplicial-complex-contour": "^1.0.2", + "typedarray-pool": "^1.1.0" } }, "gl-constants": { @@ -11218,14 +11251,23 @@ } }, "gl-streamtube3d": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.2.1.tgz", - "integrity": "sha512-1aj1noU+jJirl5IwFXk29eDx1nO7PQk4r0UZK3My56J3vDSfRR+IbMq2YBhBkjfCWsKY1nc9ESD8t9EcqZY91w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.3.0.tgz", + "integrity": "sha512-A0WBBNqLsze8Ch1pbuLJLXHwurXDqTB/F6BxKi7FbSMPEmky4l1Od5D9+mlimfJFd2n1q4m7hUHBxPLxKNUJpQ==", "requires": { - "gl-vec3": "^1.0.0", + "colormap": "^2.3.1", + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.1.0", + "gl-vao": "^1.3.0", + "gl-vec3": "^1.1.3", "glsl-inverse": "^1.0.0", "glsl-out-of-range": "^1.0.4", - "glslify": "^7.0.0" + "glslify": "^7.0.0", + "ndarray": "^1.0.18", + "normals": "^1.1.0", + "simplicial-complex-contour": "^1.0.2", + "typedarray-pool": "^1.1.0" } }, "gl-surface3d": { @@ -12349,12 +12391,12 @@ "dev": true }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "dev": true, "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } @@ -12581,14 +12623,6 @@ "path-exists": "^3.0.0" } }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -12597,11 +12631,6 @@ "p-limit": "^2.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -14285,9 +14314,9 @@ } }, "loglevel": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", - "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", + "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", "dev": true }, "longest": { @@ -14854,9 +14883,9 @@ } }, "mdbvue": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/mdbvue/-/mdbvue-5.8.1.tgz", - "integrity": "sha512-RzlQb1YoT60nxhrW/iTF3nJlNIdQc1tEDXkcWhKpa6YFVX5iu0GhOQvlFWBNBWDw0/OkgTbiUnimSf9Jq4ESwg==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/mdbvue/-/mdbvue-5.8.2.tgz", + "integrity": "sha512-2U2vx1YYctmQEj/L52DdzpRTmft0QlCIe/i0AdjlxTdFWen7AVZJBWACC7ancEIPNYhLh/JjLfaOlUay+6eIAg==", "requires": { "@fortawesome/fontawesome-free": "^5.8.2", "axios": "^0.18.0", @@ -15188,9 +15217,9 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.5.1.tgz", - "integrity": "sha512-dmpSnLJtNQioZFI5HfQ55Ad0DzzsMAb+HfokwRTNXwEQjepbTkl5mtIlSVxGIkOkxlpX7wIn5ET/oAd9fZ/Y/Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.6.0.tgz", + "integrity": "sha512-OuNZ0OHrrI+jswzmgivYBZ+fAAGHZA4293d5q0z631/I9QSw3yumKB92njxHIHiB1eAdGRsE+3CcOPkoEyV5FQ==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -15204,9 +15233,9 @@ } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz", + "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==", "requires": { "minipass": "^2.2.1" } @@ -15630,9 +15659,9 @@ } }, "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz", + "integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==", "dev": true }, "node-libs-browser": { @@ -15841,9 +15870,9 @@ "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" }, "npm-check-updates": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-3.1.22.tgz", - "integrity": "sha512-glG2ui4bM6fbPJCnUmuhaZVRTU77xqJQmFnSqeINQI2k/Vo2jiuOLpbvGTEQ4s7a/E2Gv0Ze7+qm5iPeWzl0XA==", + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-3.1.23.tgz", + "integrity": "sha512-Z2dkMdNgue6OPkQDPcAK62Qrwv+G1PaEmKrDrrSAiSP7pRD3u30xOVy1nLukS1XrJ2/zF8XTVxFe9/ubcvlcPQ==", "requires": { "chalk": "^2.4.2", "cint": "^8.2.1", @@ -15954,16 +15983,17 @@ } }, "npm-registry-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", - "integrity": "sha512-Jllq35Jag8dtv0M17ue74XtdQTyqKzuAYGiX9mAjOhkmNjib3bBUgK6mUY61+AHnXeSRobQkpY3/xIOS/omptw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.1.tgz", + "integrity": "sha512-1ZQ+yjnxc698R5h9Yje9CASapzAZr7aYDkJDdERg9xg2hOEY0vRJwskOaJAXq8N/eLavzvW4g564YAfq6zMn/A==", "requires": { "JSONStream": "^1.3.4", "bluebird": "^3.5.1", "figgy-pudding": "^3.4.1", "lru-cache": "^5.1.1", "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0" + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" }, "dependencies": { "lru-cache": { @@ -15974,6 +16004,11 @@ "yallist": "^3.0.2" } }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", @@ -16435,27 +16470,10 @@ "strip-eof": "^1.0.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -16684,9 +16702,9 @@ "dev": true }, "papaparse": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.0.2.tgz", - "integrity": "sha512-FoaaFfNlCztJ7c+XD1Fgb0zIJ530HwSr6FBfM1mcMzLtIWoTxE5paBNJWiCWFjDrTzGiEG/uIUfqVzgKxqd+Sw==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.1.0.tgz", + "integrity": "sha512-3jEYMiCc8qN7V5ffi2BTS2mRauKxCu5AIED6DxbjnHhIm7OY7fzKYkndfPlHWaaKUDCTml5XTU6V+hiuxGlZuw==" }, "parallel-transform": { "version": "1.1.0", @@ -17223,9 +17241,9 @@ } }, "plotly.js": { - "version": "1.49.4", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.49.4.tgz", - "integrity": "sha512-yOcA1GKLY6vsGLWYoGa/jWTPXcHPTyTWwkgAhopNtCgxTVexXzKfnnGQ2SslL//+TkpNX8CpCzC88HQVV4p42Q==", + "version": "1.49.5", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.49.5.tgz", + "integrity": "sha512-R8viAou9aIeMOaI+sDWyQb4uQajGV6nFqPg2ybNTy/XcZVBetzw+2ALSdkBFR1TyzCF46IvQZcF7BcdCrdraPA==", "requires": { "@plotly/d3-sankey": "0.7.2", "@plotly/d3-sankey-circular": "0.33.1", @@ -17302,15 +17320,16 @@ } }, "point-cluster": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-3.1.5.tgz", - "integrity": "sha512-KpVtB1mXDlo6yzv80MA6oUq+1519CMeeUd4PPluM4ZlAQgHi/qeBrLY2G53RLy41kas7XvKol0FM98MSrjNH7Q==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-3.1.6.tgz", + "integrity": "sha512-MJx0Shjr5T9NHpq/dfLormnEMoW2aqCEPBPcyz7gIG/NkRlD/1wEgmfKLNwT6g5Ivu/t/I9P+sQLpsEh6TBHIg==", "requires": { "array-bounds": "^1.0.1", "array-normalize": "^1.1.3", "binary-search-bounds": "^2.0.4", "bubleify": "^1.1.0", "clamp": "^1.0.1", + "defined": "^1.0.0", "dtype": "^2.0.0", "flatten-vertex-data": "^1.0.0", "is-obj": "^1.0.1", @@ -18766,9 +18785,9 @@ } }, "regl": { - "version": "1.3.12", - "resolved": "https://registry.npmjs.org/regl/-/regl-1.3.12.tgz", - "integrity": "sha512-RsYw/01WrkFanniKeZ/x6pQjG6/2DL+ansp90Olx0yyiVIXZR2PzZ+m/eKmBQ/M43bvaGOabtt+mNEgPG0TiCg==" + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.3.13.tgz", + "integrity": "sha512-TTiCabJbbUykCL4otjqOvKqDFJhvJOT7xB51JxcDeSHGrEJl1zz4RthPcoOogqfuR3ECN4Te790DfHCXzli5WQ==" }, "regl-error2d": { "version": "2.0.8", @@ -18805,10 +18824,11 @@ } }, "regl-scatter2d": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.1.5.tgz", - "integrity": "sha512-VCmASgrNIQXzDxmTLpLA4MAlbi+kdjKcVR9XugmFCTnWY7zytIhuMyIoPxinpaejGXzsC0Lq5oKvOnWFMQFGng==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.1.6.tgz", + "integrity": "sha512-mnLcwQzTHWgmkiD+5fToNaKJ7QNylvOcBJ/1roJJkIAtr1jnvgXiqrkeqkMIb8IVBKvm00/lCdPZat6Qifxvmw==", "requires": { + "array-bounds": "^1.0.1", "array-range": "^1.0.1", "array-rearrange": "^2.2.2", "clamp": "^1.0.1", @@ -19398,9 +19418,9 @@ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -19430,9 +19450,9 @@ "integrity": "sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA==" }, "sass": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.10.tgz", - "integrity": "sha512-DUpS1tVMGCH6gr/N9cXCoemrjoNdOLhAHfQ37fJw2A5ZM4gSI9ej/8Xi95Xwus03RqZ2zdSnKZGULL7oS+jfMA==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.12.tgz", + "integrity": "sha512-u5Rxn+dKTPCW5/11kMNxtmqKsxCjcpnqj9CaJoru1NqeJ0DOa9rOM00e0HqmseTAatGkKoLY+jaNecMYevu1gg==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -19510,12 +19530,12 @@ "dev": true }, "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.6.tgz", + "integrity": "sha512-i3+CeqxL7DpAazgVpAGdKMwHuL63B5nhJMh9NQ7xmChGkA3jNFflq6Jyo1LLJYcr3idWiNOPWHCrm4zMayLG4w==", "dev": true, "requires": { - "node-forge": "0.7.5" + "node-forge": "0.8.2" } }, "semver": { @@ -19987,9 +20007,9 @@ } }, "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { "debug": "^3.2.5", @@ -21120,9 +21140,9 @@ } }, "terser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.2.1.tgz", - "integrity": "sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.1.tgz", + "integrity": "sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==", "dev": true, "requires": { "commander": "^2.20.0", @@ -23305,12 +23325,12 @@ } }, "vue-plotly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vue-plotly/-/vue-plotly-1.0.0.tgz", - "integrity": "sha512-3zm1E/dg5I4IOJJMb2l3LXTPzJvPOUanmJNSEbRYMzmBpsmOK8DHnKj4jOfE/yn/Gp3/a9vv84USoluVA+g7SA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-plotly/-/vue-plotly-1.0.1.tgz", + "integrity": "sha512-JNBQeTgiHIomnGhwL+2FkqY/6qiIU3mNRiXBNVOmx6xyrx657H6QxeNL9YxSrKpN4wvR/ulnwztKVKO5aT6Fqg==", "requires": { - "plotly.js": "^1.45.2", - "vue": "^2.6.9", + "plotly.js": "^1.49.4", + "vue": "^2.6.10", "vue-resize-directive": "^1.2.0" } }, @@ -23477,9 +23497,9 @@ } }, "webpack": { - "version": "4.39.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.3.tgz", - "integrity": "sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.40.2.tgz", + "integrity": "sha512-5nIvteTDCUws2DVvP9Qe+JPla7kWPPIDFZv55To7IycHWZ+Z5qBdaBYPyuXWdhggTufZkQwfIK+5rKQTVovm2A==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -23553,9 +23573,9 @@ } }, "webpack-bundle-analyzer": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz", - "integrity": "sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.5.0.tgz", + "integrity": "sha512-NzueflueLSJxWGzDlMq5oUV+P8Qoq6yiaQlXGCbDYUpHEKlmzWdPLBJ4k/B6HTdAP/vHM8ply1Fx08mDnY+S8Q==", "dev": true, "requires": { "acorn": "^6.0.7", @@ -23588,9 +23608,9 @@ } }, "webpack-cli": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.8.tgz", - "integrity": "sha512-RANYSXwikSWINjHMd/mtesblNSpjpDLoYTBtP99n1RhXqVI/wxN40Auqy42I7y4xrbmRBoA5Zy5E0JSBD5XRhw==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", + "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", "requires": { "chalk": "2.4.2", "cross-spawn": "6.0.5", @@ -23762,13 +23782,14 @@ } }, "webpack-dev-middleware": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", - "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.1.tgz", + "integrity": "sha512-5MWu9SH1z3hY7oHOV6Kbkz5x7hXbxK56mGHNqHTe6d+ewxOwKUxoUJBs7QIaJb33lPjl9bJZ3X0vCoooUzC36A==", "dev": true, "requires": { "memory-fs": "^0.4.1", - "mime": "^2.4.2", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", "range-parser": "^1.2.1", "webpack-log": "^2.0.0" }, @@ -23782,14 +23803,14 @@ } }, "webpack-dev-server": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", - "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.1.tgz", + "integrity": "sha512-9F5DnfFA9bsrhpUCAfQic/AXBVHvq+3gQS+x6Zj0yc1fVVE0erKh2MV4IV12TBewuTrYeeTIRwCH9qLMvdNvTw==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.6", + "chokidar": "^2.1.8", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", @@ -23800,28 +23821,48 @@ "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", - "is-absolute-url": "^3.0.0", + "is-absolute-url": "^3.0.2", "killable": "^1.0.1", - "loglevel": "^1.6.3", + "loglevel": "^1.6.4", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.21", + "portfinder": "^1.0.24", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.4", + "selfsigned": "^1.10.6", "semver": "^6.3.0", "serve-index": "^1.9.1", "sockjs": "0.3.19", - "sockjs-client": "1.3.0", + "sockjs-client": "1.4.0", "spdy": "^4.0.1", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.0", + "webpack-dev-middleware": "^3.7.1", "webpack-log": "^2.0.0", "ws": "^6.2.1", "yargs": "12.0.5" }, "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -23832,9 +23873,9 @@ } }, "is-absolute-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.0.tgz", - "integrity": "sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.2.tgz", + "integrity": "sha512-+5g/wLlcm1AcxSP7014m6GvbPHswDx980vD/3bZaap8aGV9Yfs7Q6y6tfaupgZ5O74Byzc8dGrSCJ+bFXx0KdA==", "dev": true }, "ms": { diff --git a/frontend/package.json b/frontend/package.json index 71f3e5ed1..2f7a9462e 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,9 +13,9 @@ "dependencies": { "@babel/core": "^7.6.0", "@babel/runtime": "^7.6.0", - "@fortawesome/fontawesome-free": "^5.10.2", - "@fortawesome/fontawesome-svg-core": "^1.2.22", - "@fortawesome/free-solid-svg-icons": "^5.10.2", + "@fortawesome/fontawesome-free": "^5.11.1", + "@fortawesome/fontawesome-svg-core": "^1.2.24", + "@fortawesome/free-solid-svg-icons": "^5.11.1", "@fortawesome/vue-fontawesome": "^0.1.7", "@statnett/vue-plotly": "^0.3.2", "@types/d3-drag": "^1.2.3", @@ -27,10 +27,13 @@ "babel-preset-vue": "^2.0.2", "blob": "0.0.5", "bootstrap": "^4.3.1", - "bootstrap-vue": "^2.0.0", + "bootstrap-toggle": "^2.2.2", + "bootstrap-vue": "^2.0.1", "clean-webpack-plugin": "^3.0.0", + "colorbrewer": "^1.3.0", "d3": "^5.12.0", "d3-drag": "^1.2.4", + "d3-heatmap": "^1.2.1", "d3-lasso": "0.0.5", "d3-loom": "^1.0.2", "d3-selection": "^1.4.0", @@ -44,12 +47,12 @@ "ify-loader": "^1.1.0", "interactjs": "^1.6.2", "jquery": "^3.4.1", - "mdbvue": "^5.8.1", + "mdbvue": "^5.8.2", "mini-css-extract-plugin": "^0.8.0", - "npm-check-updates": "^3.1.22", - "papaparse": "^5.0.2", + "npm-check-updates": "^3.1.23", + "papaparse": "^5.1.0", "parcoord-es": "^2.2.10", - "plotly.js": "^1.49.4", + "plotly.js": "^1.49.5", "popper.js": "^1.15.0", "strip-loader": "^0.1.2", "toposort": "^2.0.2", @@ -59,11 +62,11 @@ "vue": "^2.6.10", "vue-bootstrap-slider": "^2.1.8", "vue-papa-parse": "^1.2.2", - "vue-plotly": "^1.0.0", + "vue-plotly": "^1.0.1", "vue-router": "^3.1.3", "vue-slider-component": "^3.0.40", "vue2-simplert-plugin": "^0.5.3", - "webpack-cli": "^3.3.8", + "webpack-cli": "^3.3.9", "webpack-require": "0.0.16" }, "devDependencies": { @@ -87,7 +90,7 @@ "chalk": "^2.4.2", "copy-webpack-plugin": "^5.0.4", "css-loader": "^3.2.0", - "eslint": "^6.3.0", + "eslint": "^6.4.0", "eslint-config-standard": "^14.1.0", "eslint-friendly-formatter": "^4.0.1", "eslint-loader": "^3.0.0", @@ -108,7 +111,7 @@ "postcss-loader": "^3.0.0", "postcss-url": "^8.0.0", "rimraf": "^3.0.0", - "sass": "^1.22.10", + "sass": "^1.22.12", "sass-loader": "^8.0.0", "semver": "^6.3.0", "shelljs": "^0.8.3", @@ -122,9 +125,9 @@ "vue-template-compiler": "^2.6.10", "vue2-simplert": "^1.0.0", "vuetify-loader": "^1.3.0", - "webpack": "^4.39.3", - "webpack-bundle-analyzer": "^3.4.1", - "webpack-dev-server": "^3.8.0", + "webpack": "^4.40.2", + "webpack-bundle-analyzer": "^3.5.0", + "webpack-dev-server": "^3.8.1", "webpack-merge": "^4.2.2" }, "browserslist": [ diff --git a/frontend/src/components/AlgorithmHyperParam.vue b/frontend/src/components/AlgorithmHyperParam.vue index c72b37ae3..d66034cea 100644 --- a/frontend/src/components/AlgorithmHyperParam.vue +++ b/frontend/src/components/AlgorithmHyperParam.vue @@ -25,7 +25,7 @@ export default { PCPView () { d3.selectAll("#PCP > *").remove(); if (this.selAlgorithm != '') { - var colors = ['#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a'] + var colors = ['#8dd3c7','#ffffb3','#bebada','#fb8072','#80b1d3','#fdb462','#b3de69','#fccde5','#d9d9d9','#bc80bd','#ccebc5','#ffed6f'] var colorGiv = 0 var Combined = 0 @@ -38,22 +38,29 @@ export default { } var valuesPerf = Object.values(Combined['mean_test_score']) var ObjectsParams = Combined['params'] + var newObjectsParams = [] var ArrayCombined = new Array(valuesPerf.length) for (let i = 0; i < valuesPerf.length; i++) { + if (this.selAlgorithm == 'KNN') { + newObjectsParams.push({'weights':ObjectsParams[i].weights, 'algorithm':ObjectsParams[i].algorithm,'metric':ObjectsParams[i].metric,'n_neighbors':ObjectsParams[i].n_neighbors}) + Object.assign(newObjectsParams[i], {performance: valuesPerf[i]}, {model: i}) + ArrayCombined[i] = newObjectsParams[i] + } else { Object.assign(ObjectsParams[i], {performance: valuesPerf[i]}, {model: i}) ArrayCombined[i] = ObjectsParams[i] + } } EventBus.$emit('AllAlModels', ArrayCombined.length) this.pc = ParCoords()("#PCP") .data(ArrayCombined) .color(colorGiv) - .hideAxis(['model']) + .hideAxis(['model','performance']) .bundlingStrength(0) // set bundling strength .smoothness(0) - .bundleDimension('performance') .showControlPoints(false) .render() .brushMode('1D-axes') + .reorderable() .interactive(); this.pc.on("brush", function(d) { diff --git a/frontend/src/components/Algorithms.vue b/frontend/src/components/Algorithms.vue index 226b0ce7d..84c8f144a 100644 --- a/frontend/src/components/Algorithms.vue +++ b/frontend/src/components/Algorithms.vue @@ -79,7 +79,7 @@ export default { }, brushed () { var allPoints = document.getElementsByClassName("d3-exploding-boxplot point") - const previousColor = ['#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a'] + const previousColor = ['#8dd3c7','#ffffb3','#bebada','#fb8072','#80b1d3','#fdb462','#b3de69','#fccde5','#d9d9d9','#bc80bd','#ccebc5','#ffed6f'] var modelsActive = [] for (let j = 0; j < this.brushedBoxPl.length; j++) { modelsActive.push(this.brushedBoxPl[j].model) diff --git a/frontend/src/components/BarChart.vue b/frontend/src/components/BarChart.vue index aa85d4f5c..c067e3301 100644 --- a/frontend/src/components/BarChart.vue +++ b/frontend/src/components/BarChart.vue @@ -32,12 +32,12 @@ export default { }, methods: { BarChartView () { - const PerClassMetrics = JSON.parse(this.BarChartResults[4]) - var ClassNames = JSON.parse(this.BarChartResults[5]) + const PerClassMetrics = JSON.parse(this.BarChartResults[3]) + var ClassNames = JSON.parse(this.BarChartResults[4]) this.ClassNamesOverview = ClassNames - const limit = JSON.parse(this.BarChartResults[13]) - let ClassifierswithoutFI = JSON.parse(this.BarChartResults[8]) - let ClassifierswithFI = JSON.parse(this.BarChartResults[9]) + let ClassifierswithoutFI = JSON.parse(this.BarChartResults[7]) + let ClassifierswithFI = JSON.parse(this.BarChartResults[8]) + const limit = JSON.parse(this.BarChartResults[14]) for (let j = 0; j < this.ClassNamesOverview.length; j++) { Plotly.purge('barChartf1Score' + j) diff --git a/frontend/src/components/DataSetExecController.vue b/frontend/src/components/DataSetExecController.vue index 035f2772b..58282e38e 100644 --- a/frontend/src/components/DataSetExecController.vue +++ b/frontend/src/components/DataSetExecController.vue @@ -19,6 +19,12 @@ {{ value }} + @@ -32,6 +38,7 @@ export default { return { RetrieveValueCSV: 'IrisC', value: 'Execute', + valueReset: 'Reset', InitializeEnsemble: false } }, diff --git a/frontend/src/components/DataSpace.vue b/frontend/src/components/DataSpace.vue index 46cdc0871..7d279f4c9 100644 --- a/frontend/src/components/DataSpace.vue +++ b/frontend/src/components/DataSpace.vue @@ -16,7 +16,7 @@ export default { }, methods: { ScatterPlotDataView () { - const XandYCoordinates = JSON.parse(this.DataSpace[10]) + const XandYCoordinates = JSON.parse(this.DataSpace[9]) var result = XandYCoordinates.reduce(function(r, a) { a.forEach(function(s, i) { diff --git a/frontend/src/components/FeatureSelection.vue b/frontend/src/components/FeatureSelection.vue deleted file mode 100644 index 617552fe4..000000000 --- a/frontend/src/components/FeatureSelection.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Heatmap.vue b/frontend/src/components/Heatmap.vue index 7a44779a0..b944eea83 100644 --- a/frontend/src/components/Heatmap.vue +++ b/frontend/src/components/Heatmap.vue @@ -5,28 +5,54 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/frontend/src/components/Main.vue b/frontend/src/components/Main.vue index 3fc0f8372..dbb858b8d 100755 --- a/frontend/src/components/Main.vue +++ b/frontend/src/components/Main.vue @@ -6,7 +6,7 @@ - Data Set Selection and Execution + Basic Operations Control Panel - Per Class Metrics Exploration + Diverse Models Exploration @@ -48,21 +48,18 @@ - Subset Feature Selection Per Model + Models Feature Selection - - - - - - + - - - + + + + + @@ -118,13 +115,13 @@ import ScatterPlot from './ScatterPlot.vue' import DataSpace from './DataSpace.vue' import PredictionsSpace from './PredictionsSpace.vue' import BarChart from './BarChart.vue' -import StretchedChord from './StretchedChord.vue' import Heatmap from './Heatmap.vue' -import FeatureSelection from './FeatureSelection.vue' +import ToggleSelection from './ToggleSelection.vue' import FinalResultsLinePlot from './FinalResultsLinePlot.vue' import axios from 'axios' import { loadProgressBar } from 'axios-progress-bar' import 'axios-progress-bar/dist/nprogress.css' +import 'bootstrap-css-only/css/bootstrap.min.css' import { mdbCard, mdbCardBody, mdbCardText, mdbCardHeader } from 'mdbvue' import { EventBus } from '../main.js' import * as jQuery from 'jquery' @@ -145,9 +142,8 @@ export default Vue.extend({ DataSpace, PredictionsSpace, BarChart, - StretchedChord, Heatmap, - FeatureSelection, + ToggleSelection, FinalResultsLinePlot, mdbCard, mdbCardBody, @@ -180,7 +176,10 @@ export default Vue.extend({ valueSel: 0, valueAll: 0, OverSelLength: 0, - OverAllLength: 0 + OverAllLength: 0, + toggle1: 1, + toggle2: 1, + toggle3: 1 } }, methods: { @@ -240,10 +239,17 @@ export default Vue.extend({ var length = JSON.parse(this.OverviewResults[0]).length this.OverSelLength = length this.OverAllLength = length + this.valueSel = 0 + this.valueAll = 0 + var toggles = [] + toggles.push(this.toggle1) + toggles.push(this.toggle2) + toggles.push(this.toggle3) if (length < this.limitModels) { this.OverviewResults.push(JSON.stringify(this.ClassifierIDsList)) EventBus.$emit('emittedEventCallingBarChart', this.OverviewResults) - EventBus.$emit('emittedEventCallingChordView', this.OverviewResults) + EventBus.$emit('emitToggles', this.OverviewResults) + EventBus.$emit('emittedEventCallingToggles', toggles) EventBus.$emit('emittedEventCallingHeatmapView', this.OverviewResults) EventBus.$emit('emittedEventCallingTableView', this.OverviewResults) EventBus.$emit('emittedEventCallingDataSpacePlotView', this.OverviewResults) @@ -305,7 +311,6 @@ export default Vue.extend({ if (this.ClassifierIDsList.length < this.limitModels) { this.OverviewResults.push(JSON.stringify(this.ClassifierIDsList)) EventBus.$emit('emittedEventCallingBarChart', this.OverviewResults) - EventBus.$emit('emittedEventCallingChordView', this.OverviewResults) EventBus.$emit('emittedEventCallingHeatmapView', this.OverviewResults) EventBus.$emit('emittedEventCallingTableView', this.OverviewResults) EventBus.$emit('emittedEventCallingDataSpacePlotView', this.OverviewResults) @@ -390,7 +395,6 @@ export default Vue.extend({ SendBrushedParameters () { EventBus.$emit('emittedEventCallingModelBrushed') const path = `http://127.0.0.1:5000/data/SendBrushedParam` - this.brushedAll.push(this.brushed) const postData = { brushed: this.brushed, algorithm: this.selectedAlgorithm @@ -418,8 +422,7 @@ export default Vue.extend({ UpdateBasedonFeatures () { const path = `http://127.0.0.1:5000/data/FeaturesSelection` const postData = { - featureSelection: this.SelectedFeaturesPerClassifier, - brushedAll: this.brushedAll + featureSelection: this.SelectedFeaturesPerClassifier } const axiosConfig = { headers: { @@ -531,6 +534,13 @@ export default Vue.extend({ console.log(error) }) }, + updateToggle () { + var toggles = [] + toggles.push(this.toggle1) + toggles.push(this.toggle2) + toggles.push(this.toggle3) + EventBus.$emit('emittedEventCallingTogglesUpdate', toggles) + } }, created() { // does the browser support the Navigation Timing API? @@ -564,6 +574,12 @@ export default Vue.extend({ EventBus.$on('SendToServerDataSetConfirmation', data => { this.RetrieveValueFile = data }) EventBus.$on('SendToServerDataSetConfirmation', this.fileNameSend) EventBus.$on('PCPCall', data => { this.selectedAlgorithm = data }) + EventBus.$on('toggle1', data => { this.toggle1 = data }) + EventBus.$on('toggle2', data => { this.toggle2 = data }) + EventBus.$on('toggle3', data => { this.toggle3 = data }) + EventBus.$on('toggle1', this.updateToggle) + EventBus.$on('toggle2', this.updateToggle) + EventBus.$on('toggle3', this.updateToggle) EventBus.$on('PCPCall', this.CallPCP) EventBus.$on('PCPCallDB', this.SendBrushedParameters) EventBus.$on('UpdateBoxPlot', data => { this.brushedBoxPlotUpdate = data }) diff --git a/frontend/src/components/PredictionsSpace.vue b/frontend/src/components/PredictionsSpace.vue index bbb687e82..e93589577 100644 --- a/frontend/src/components/PredictionsSpace.vue +++ b/frontend/src/components/PredictionsSpace.vue @@ -15,7 +15,7 @@ export default { }, methods: { ScatterPlotDataView () { - const XandYCoordinates = JSON.parse(this.PredictionsData[11]) + const XandYCoordinates = JSON.parse(this.PredictionsData[10]) var result = XandYCoordinates.reduce(function(r, a) { a.forEach(function(s, i) { diff --git a/frontend/src/components/StretchedChord.vue b/frontend/src/components/StretchedChord.vue deleted file mode 100644 index 4cef60d96..000000000 --- a/frontend/src/components/StretchedChord.vue +++ /dev/null @@ -1,581 +0,0 @@ - - - - - - diff --git a/frontend/src/components/ToggleSelection.vue b/frontend/src/components/ToggleSelection.vue new file mode 100644 index 000000000..521063f4f --- /dev/null +++ b/frontend/src/components/ToggleSelection.vue @@ -0,0 +1,70 @@ + + + \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js index 106e3aecc..ce2bf0e8c 100755 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -6,10 +6,10 @@ import 'bootstrap-vue/dist/bootstrap-vue.css' import router from './router' import { library } from '@fortawesome/fontawesome-svg-core' import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' -import { faUpload, faPlay, faCheck, faSave} from '@fortawesome/free-solid-svg-icons' +import { faUpload, faPlay, faCheck, faSave, faTrash} from '@fortawesome/free-solid-svg-icons' import bFormSlider from 'vue-bootstrap-slider' -library.add(faUpload, faPlay, faCheck, faSave) +library.add(faUpload, faPlay, faCheck, faSave, faTrash) Vue.component('font-awesome-icon', FontAwesomeIcon) diff --git a/run.py b/run.py index 8099585f6..aa89e5cd9 100644 --- a/run.py +++ b/run.py @@ -24,6 +24,14 @@ from sklearn.manifold import MDS from sklearn.manifold import TSNE from sklearn.metrics import classification_report from sklearn.preprocessing import scale +#from sklearn.metrics import r2_score +#from rfpimp import permutation_importances +import eli5 +from eli5.sklearn import PermutationImportance +from sklearn.feature_selection import SelectKBest +from sklearn.feature_selection import chi2 +from sklearn.feature_selection import RFE +from sklearn.decomposition import PCA from mlxtend.classifier import StackingCVClassifier from mlxtend.feature_selection import ColumnSelector @@ -52,6 +60,9 @@ def Reset(): global yData yData = [] + + global detailsParams + detailsParams = [] global algorithmList algorithmList = [] @@ -130,6 +141,9 @@ def RetrieveFileName(): global algorithmList algorithmList = [] + global detailsParams + detailsParams = [] + # Initializing models global classifiersId @@ -263,7 +277,7 @@ def column_index(df, query_cols): global mem mem = Memory("./cache_dir") -def GridSearch(clf, params, FI): +def GridSearch(clf, params): global XData global yData global scoring @@ -292,7 +306,10 @@ def GridSearch(clf, params, FI): df_cv_results_classifiers = pd.DataFrame(data = df_cv_results_per_row, columns= df_cv_results.columns) parameters = df_cv_results_classifiers['params'] PerClassMetrics = [] - FeatureImp = [] + #perm_imp_rfpimp = [] + #FeatureImp = [] + #RFEList = [] + permList = [] PerFeatureAccuracy = [] global subset global loopFeatures @@ -325,25 +342,43 @@ def GridSearch(clf, params, FI): subset = XData[featureSelected] element = (column_index(XData, featureSelected)) columns.append(element) - grid.fit(subset, yData) - if (FI == 0): - n_feats = XData.shape[1] - for i in range(n_feats): - scores = model_selection.cross_val_score(grid.best_estimator_, XData.values[:, i].reshape(-1, 1), yData, cv=crossValidation) - PerFeatureAccuracy.append(scores.mean()) + grid.fit(subset, yData) + #perm_imp_rfpimp.append(permutation_importances(grid.best_estimator_, subset, yData, r2)['Importance']) + perm = PermutationImportance(grid.best_estimator_, cv = None, refit = True, n_iter = 50).fit(subset, yData) + permList.append(perm.feature_importances_) + n_feats = subset.shape[1] + for i in range(n_feats): + scores = model_selection.cross_val_score(grid.best_estimator_, subset.values[:, i].reshape(-1, 1), yData, cv=crossValidation) + PerFeatureAccuracy.append(scores.mean()) yPredict = grid.predict(subset) yPredictProb.append(grid.predict_proba(subset)) PerClassMetrics.append(classification_report(yData, yPredict, target_names=target_names, digits=2, output_dict=True)) - if (FI == 1): - X = subset.values - Y = array(yData) - FeatureImp.append(class_feature_importance(X, Y, grid.best_estimator_.feature_importances_)) - - FeatureImpPandas = pd.DataFrame(FeatureImp) + #if (FI == 1): + # X = subset.values + # Y = array(yData) + # FeatureImp.append(class_feature_importance(X, Y, grid.best_estimator_.feature_importances_)) + # rfe = RFE(grid.best_estimator_, 3) + # fit = rfe.fit(subset, yData) + # RFEList.append(fit.ranking_) + + bestfeatures = SelectKBest(score_func=chi2, k='all') + fit = bestfeatures.fit(subset,yData) + dfscores = pd.DataFrame(fit.scores_) + dfcolumns = pd.DataFrame(subset.columns) + #concat two dataframes for better visualization + featureScores = pd.concat([dfcolumns,dfscores],axis=1) + featureScores.columns = ['Specs','Score'] #naming the dataframe columns + #FeatureImpPandas = pd.DataFrame(FeatureImp) + #RFEListPD = pd.DataFrame(RFEList) + #perm_imp_rfpimp = pd.DataFrame(perm_imp_rfpimp) + perm_imp_eli5PD = pd.DataFrame(permList) PerClassMetricsPandas = pd.DataFrame(PerClassMetrics) PerFeatureAccuracyPandas = pd.DataFrame(PerFeatureAccuracy) - return df_cv_results_classifiers, parameters, FeatureImpPandas, PerClassMetricsPandas, PerFeatureAccuracyPandas + return df_cv_results_classifiers, parameters, PerClassMetricsPandas, PerFeatureAccuracyPandas, perm_imp_eli5PD, featureScores + +#def r2(rf, X_train, y_train): +# return r2_score(y_train, rf.predict(X_train)) def class_feature_importance(X, Y, feature_importances): N, M = X.shape @@ -363,21 +398,33 @@ def Preprocessing(): global resultsList df_cv_results_classifiersList = [] parametersList = [] - FeatureImportanceList = [] + #FeatureImportanceList = [] PerClassMetricsList = [] FeatureAccuracyList = [] + #RFEListPD = [] + #perm_imp_rfpimp = [] + perm_imp_eli5PD = [] + featureScores = [] for j, result in enumerate(resultsList): df_cv_results_classifiersList.append(resultsList[j][0]) parametersList.append(resultsList[j][1]) - FeatureImportanceList.append(resultsList[j][2]) - PerClassMetricsList.append(resultsList[j][3]) - FeatureAccuracyList.append(resultsList[j][4]) + #FeatureImportanceList.append(resultsList[j][2]) + PerClassMetricsList.append(resultsList[j][2]) + FeatureAccuracyList.append(resultsList[j][3]) + #RFEListPD.append(resultsList[j][5]) + #perm_imp_rfpimp.append(resultsList[j][6]) + perm_imp_eli5PD.append(resultsList[j][4]) + featureScores.append(resultsList[j][5]) df_cv_results_classifiers = pd.concat(df_cv_results_classifiersList, ignore_index=True, sort=False) parameters = pd.concat(parametersList, ignore_index=True, sort=False) - FeatureImportance = pd.concat(FeatureImportanceList, ignore_index=True, sort=False) + #FeatureImportanceListPD = pd.concat(FeatureImportanceList, ignore_index=True, sort=False) PerClassMetrics = pd.concat(PerClassMetricsList, ignore_index=True, sort=False) FeatureAccuracy = pd.concat(FeatureAccuracyList, ignore_index=True, sort=False) + #RFEListPDCon = pd.concat(RFEListPD, ignore_index=True, sort=False) + #perm_imp_rfpimpCon = pd.concat(perm_imp_rfpimp, ignore_index=True, sort=False) + perm_imp_eli5PDCon = pd.concat(perm_imp_eli5PD, ignore_index=True, sort=False) + featureScoresCon = pd.concat(featureScores, ignore_index=True, sort=False) global factors factors = [1,1,1,1,1,1] global scoring @@ -388,19 +435,24 @@ def Preprocessing(): del df_cv_results_classifiers_metrics['mean_fit_time'] del df_cv_results_classifiers_metrics['mean_score_time'] df_cv_results_classifiers_metrics = df_cv_results_classifiers_metrics.ix[:, 0:NumberofscoringMetrics] - return [parameters,FeatureImportance,PerClassMetrics,FeatureAccuracy,df_cv_results_classifiers_metrics] + return [parameters,PerClassMetrics,FeatureAccuracy,df_cv_results_classifiers_metrics,perm_imp_eli5PDCon,featureScoresCon] def sumPerMetric(factors): sumPerClassifier = [] - global df_cv_results_classifiers_metrics - for index, row in df_cv_results_classifiers_metrics.iterrows(): + preProcessResults = [] + preProcessResults = Preprocessing() + loopThroughMetrics = preProcessResults[4] + for index, row in loopThroughMetrics.iterrows(): rowSum = 0 global scoring lengthFactors = len(scoring) for loop,elements in enumerate(row): lengthFactors = lengthFactors - 1 + factors[loop] rowSum = elements*factors[loop] + rowSum - sumPerClassifier.append(rowSum/lengthFactors) + if lengthFactors is 0: + sumPerClassifier = 0 + else: + sumPerClassifier.append(rowSum/lengthFactors) return sumPerClassifier # Retrieve data from client @@ -413,6 +465,7 @@ def RetrieveFactors(): global ModelSpaceMDSNew global ModelSpaceTSNENew sumPerClassifierSel = [] + sumPerClassifierSel = sumPerMetric(FactorsInt['Factors']) ModelSpaceMDSNew = [] ModelSpaceTSNENew = [] preProcessResults = [] @@ -423,13 +476,12 @@ def RetrieveFactors(): for l,el in enumerate(FactorsInt['Factors']): if el is 0: XClassifiers.drop(XClassifiers.columns[[l-countRemovals]], axis=1, inplace=True) - counter = countRemovals + 1 + countRemovals = countRemovals + 1 flagLocal = 1 if flagLocal is 1: ModelSpaceMDSNew = FunMDS(XClassifiers) ModelSpaceTSNENew = FunTsne(XClassifiers) ModelSpaceTSNENew = ModelSpaceTSNENew.tolist() - sumPerClassifierSel = sumPerMetric(FactorsInt['Factors']) return 'Everything Okay' @app.route('/data/UpdateOverv', methods=["GET", "POST"]) @@ -470,26 +522,38 @@ def InitializeEnsemble(): def ReturnResults(sumPerClassifier,ModelSpaceMDS,ModelSpaceTSNE,preProcessResults,DataSpaceList,PredictionSpaceList): global Results Results = [] - FeatureImportance = preProcessResults[1] - PerClassMetrics = preProcessResults[2] - FeatureAccuracy = preProcessResults[3] - FeatureImportance = FeatureImportance.to_json(orient='records') + #FeatureImportanceListPD = preProcessResults[1] + PerClassMetrics = preProcessResults[1] + FeatureAccuracy = preProcessResults[2] + #RFEListPDCon = preProcessResults[5] + #perm_imp_rfpimpCon = preProcessResults[6] + perm_imp_eli5PDCon = preProcessResults[4] + featureScoresCon = preProcessResults[5] + #FeatureImportanceListPD = FeatureImportanceListPD.to_json(orient='records') PerClassMetrics = PerClassMetrics.to_json(orient='records') FeatureAccuracy = FeatureAccuracy.to_json(orient='records') + #RFEListPDCon = RFEListPDCon.to_json(orient='records') + #perm_imp_rfpimpCon = perm_imp_rfpimpCon.to_json(orient='records') + perm_imp_eli5PDCon = perm_imp_eli5PDCon.to_json(orient='records') + featureScoresCon = featureScoresCon.to_json(orient='records') XDataJSON = XData.columns.tolist() Results.append(json.dumps(sumPerClassifier)) # Position: 0 Results.append(json.dumps(ModelSpaceMDS)) # Position: 1 Results.append(json.dumps(classifiersIDPlusParams)) # Position: 2 - Results.append(FeatureImportance) # Position: 3 - Results.append(PerClassMetrics) # Position: 4 - Results.append(json.dumps(target_names)) # Position: 5 - Results.append(FeatureAccuracy) # Position: 6 - Results.append(json.dumps(XDataJSON)) # Position: 7 - Results.append(json.dumps(classifiersId)) # Position: 8 - Results.append(json.dumps(classifiersIDwithFI)) # Position: 9 - Results.append(json.dumps(DataSpaceList)) # Position: 10 - Results.append(json.dumps(PredictionSpaceList)) # Position: 11 - Results.append(json.dumps(ModelSpaceTSNE)) # Position: 12 + #Results.append(FeatureImportanceListPD) # Position: 3 + Results.append(PerClassMetrics) # Position: 3 + Results.append(json.dumps(target_names)) # Position: 4 + Results.append(FeatureAccuracy) # Position: 5 + Results.append(json.dumps(XDataJSON)) # Position: 6 + Results.append(json.dumps(classifiersId)) # Position: 7 + Results.append(json.dumps(classifiersIDwithFI)) # Position: 8 + Results.append(json.dumps(DataSpaceList)) # Position: 9 + Results.append(json.dumps(PredictionSpaceList)) # Position: 10 + Results.append(json.dumps(ModelSpaceTSNE)) # Position: 11 + #Results.append(RFEListPDCon) # Position: 13 + #Results.append(perm_imp_rfpimpCon) # Position: 14 + Results.append(perm_imp_eli5PDCon) # Position: 12 + Results.append(featureScoresCon) # Position: 13 return Results # Retrieve data from client @@ -507,46 +571,31 @@ def RetrieveSelClassifiersID(): @app.route('/data/FeaturesSelection', methods=["GET", "POST"]) def FeatureSelPerModel(): global featureSelection - global loopFeatures global ClassifierIDsList - RetrieveModelsPar = request.get_data().decode('utf8').replace("'", '"') - RetrieveModelsPar = json.loads(RetrieveModelsPar) - RetrieveModelsParRed = [] - print(RetrieveModelsPar['brushedAll']) # FIX THIS THING!!!!! - #for j, i in enumerate(RetrieveModelsPar['brushedAll']): - # print(j) - #RetrieveModelsParRed = [for j, i in enumerate(RetrieveModelsPar['brushedAll']) if j not in ClassifierIDsList] - - #RetrieveModelsParPandas = pd.DataFrame(RetrieveModelsParRed) - RetrieveModelsParPandas = pd.DataFrame(RetrieveModelsPar) - RetrieveModelsParPandas = RetrieveModelsParPandas.drop(columns=['performance']) - RetrieveModelsParPandas = RetrieveModelsParPandas.to_dict(orient='list') - print(RetrieveModelsParPandas) - RetrieveModels = {} - for key, value in RetrieveModelsParPandas.items(): - withoutDuplicates = Remove(value) - RetrieveModels[key] = withoutDuplicates - global RetrieveModelsListNew - RetrieveModelsListNew.append(RetrieveModels) - loopFeatures = 2 featureSelection = request.get_data().decode('utf8').replace("'", '"') featureSelection = json.loads(featureSelection) + global detailsParams global algorithmList results = [] + global resultsList + resultsList = [] + global loopFeatures + loopFeatures = 2 for index, eachalgor in enumerate(algorithmList): if (eachalgor == 'KNN'): clf = KNeighborsClassifier() - params = RetrieveModelsListNew[index] - IF = 0 - results.append(GridSearch(clf, params, IF)) + params = detailsParams[index] + results.append(GridSearch(clf, params)) resultsList.append(results[0]) else: clf = RandomForestClassifier() - params = RetrieveModelsListNew[index] - IF = 1 - results.append(GridSearch(clf, params, IF)) + params = detailsParams[index] + results.append(GridSearch(clf, params)) resultsList.append(results[0]) - key = 2 + if (featureSelection['featureSelection'] == ''): + key = 0 + else: + key = 2 EnsembleModel(ClassifierIDsList, key) return 'Everything Okay' @@ -570,6 +619,7 @@ def EnsembleModel (ClassifierIDsList, keyRetrieved): global columns global all_classifiers + global algorithmList if (keyRetrieved == 0): columnsInit = [] @@ -684,11 +734,11 @@ def RetrieveModel(): else: clf = RandomForestClassifier() params = {'n_estimators': list(range(80, 120)), 'criterion': ['gini', 'entropy']} - GridSearchForParameters(clf, params) + GridSearchForParameters(clf, params, eachAlgor) SendEachClassifiersPerformanceToVisualize() return 'Everything Okay' -def GridSearchForParameters(clf, params): +def GridSearchForParameters(clf, params, eachAlgor): grid = GridSearchCV(estimator=clf, param_grid=params, scoring='accuracy', @@ -753,28 +803,31 @@ def RetrieveModelsParam(): global classifierID global algorithmList + global detailsParams results = [] algorithmList.append(algorithm) if (algorithm == 'KNN'): clf = KNeighborsClassifier() params = RetrieveModels - IF = 0 - results.append(GridSearch(clf, params, IF)) + detailsParams.append(params) + results.append(GridSearch(clf, params)) resultsList.append(results[0]) for j, oneClassifier in enumerate(results[0][1]): classifiersId.append(classifierID) classifiersIDPlusParams.append(classifierID) - classifierID = classifierID + 1 - else: + classifierID = classifierID + 1 + elif (algorithm == 'RF'): clf = RandomForestClassifier() params = RetrieveModels - IF = 1 - results.append(GridSearch(clf, params, IF)) + detailsParams.append(params) + results.append(GridSearch(clf, params)) resultsList.append(results[0]) for oneClassifier, j in enumerate(results[0][1]): classifiersIDPlusParams.append(classifierID) classifiersIDwithFI.append(classifierID) classifierID = classifierID + 1 + else: + pass return 'Everything Okay' \ No newline at end of file