From ff669e8f56ad3879d63c390dce663373313ee800 Mon Sep 17 00:00:00 2001 From: Angelos Chatzimparmpas Date: Fri, 20 Sep 2019 15:03:55 +0200 Subject: [PATCH] fixed heatmap --- __pycache__/run.cpython-37.pyc | Bin 17119 -> 17493 bytes frontend/package-lock.json | 379 +++++----- frontend/package.json | 33 +- .../src/components/AlgorithmHyperParam.vue | 13 +- frontend/src/components/Algorithms.vue | 2 +- frontend/src/components/BarChart.vue | 10 +- .../src/components/DataSetExecController.vue | 7 + frontend/src/components/DataSpace.vue | 2 +- frontend/src/components/FeatureSelection.vue | 117 ---- frontend/src/components/Heatmap.vue | 649 ++++++++++++++++-- frontend/src/components/Main.vue | 60 +- frontend/src/components/PredictionsSpace.vue | 2 +- frontend/src/components/StretchedChord.vue | 581 ---------------- frontend/src/components/ToggleSelection.vue | 70 ++ frontend/src/main.js | 4 +- run.py | 205 ++++-- 16 files changed, 1079 insertions(+), 1055 deletions(-) delete mode 100644 frontend/src/components/FeatureSelection.vue delete mode 100644 frontend/src/components/StretchedChord.vue create mode 100644 frontend/src/components/ToggleSelection.vue diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc index 565fc374d15f9e3f92353faafb4e77d2ebffb0cb..6db7701cc5843155e2e10c946457eb4c66546769 100644 GIT binary patch delta 9120 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.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