{
  "errors": [],
  "warnings": [],
  "version": "4.41.4",
  "hash": "4d39963716f64c04f3c3",
  "time": 969,
  "builtAt": 1577446726575,
  "publicPath": "",
  "outputPath": "/Users/cornel/Projects/Personal/tfjs-model-view/lib",
  "assetsByChunkName": {
    "main": "tfjs-model-view.js"
  },
  "assets": [
    {
      "name": "tfjs-model-view.js",
      "size": 70866,
      "chunks": [
        "main"
      ],
      "chunkNames": [
        "main"
      ],
      "info": {},
      "emitted": true
    }
  ],
  "filteredAssets": 0,
  "entrypoints": {
    "main": {
      "chunks": [
        "main"
      ],
      "assets": [
        "tfjs-model-view.js"
      ],
      "children": {},
      "childAssets": {}
    }
  },
  "namedChunkGroups": {
    "main": {
      "chunks": [
        "main"
      ],
      "assets": [
        "tfjs-model-view.js"
      ],
      "children": {},
      "childAssets": {}
    }
  },
  "chunks": [
    {
      "id": "main",
      "rendered": true,
      "initial": true,
      "entry": true,
      "size": 24263,
      "names": [
        "main"
      ],
      "files": [
        "tfjs-model-view.js"
      ],
      "hash": "34eafb04426f5a10b885",
      "siblings": [],
      "parents": [],
      "children": [],
      "childrenByOrder": {},
      "modules": [
        {
          "id": "./src/default.config.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/default.config.js",
          "name": "./src/default.config.js",
          "index": 4,
          "index2": 3,
          "size": 485,
          "cacheable": true,
          "built": true,
          "optional": false,
          "prefetched": false,
          "chunks": [
            "main"
          ],
          "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "issuerId": "./src/index.js",
          "issuerName": "./src/index.js",
          "issuerPath": [
            {
              "id": "./src/index.js",
              "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "name": "./src/index.js",
              "profile": {
                "factory": 22,
                "building": 497
              }
            }
          ],
          "profile": {
            "factory": 5,
            "building": 278
          },
          "failed": false,
          "errors": 0,
          "warnings": 0,
          "assets": [],
          "reasons": [
            {
              "moduleId": "./src/index.js",
              "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "module": "./src/index.js",
              "moduleName": "./src/index.js",
              "type": "cjs require",
              "userRequest": "./default.config",
              "loc": "15:15-42"
            }
          ],
          "providedExports": null,
          "optimizationBailout": [],
          "depth": 1,
          "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = {\n    renderer: 'canvas',\n\n    radius: 6,\n    nodePadding: 2,\n    layerPadding: 20,\n    groupPadding: 1,\n\n    xPadding: 10,\n    yPadding: 10,\n\n    renderLinks: false,\n    plotActivations: false,\n    nodeStroke: true,\n\n    onRendererInitialized: function onRendererInitialized(renderer) {\n        document.body.appendChild(renderer.canvas);\n    }\n};\nmodule.exports = exports['default'];"
        },
        {
          "id": "./src/index.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "name": "./src/index.js",
          "index": 0,
          "index2": 4,
          "size": 1513,
          "cacheable": true,
          "built": true,
          "optional": false,
          "prefetched": false,
          "chunks": [
            "main"
          ],
          "issuer": null,
          "issuerId": null,
          "issuerName": null,
          "issuerPath": null,
          "profile": {
            "factory": 22,
            "building": 497
          },
          "failed": false,
          "errors": 0,
          "warnings": 0,
          "assets": [],
          "reasons": [
            {
              "moduleId": null,
              "moduleIdentifier": null,
              "module": null,
              "moduleName": null,
              "type": "single entry",
              "userRequest": "/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "loc": "main"
            }
          ],
          "providedExports": null,
          "optimizationBailout": [],
          "depth": 0,
          "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _modelParser = require('./model-parser');\n\nvar _modelParser2 = _interopRequireDefault(_modelParser);\n\nvar _canvas = require('./renderers/canvas.renderer');\n\nvar _canvas2 = _interopRequireDefault(_canvas);\n\nvar _default = require('./default.config');\n\nvar _default2 = _interopRequireDefault(_default);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ModelView = function ModelView(model, customConfig) {\n    _classCallCheck(this, ModelView);\n\n    var config = Object.assign({}, _default2.default, customConfig);\n    var onRendererInitialized = config.onRendererInitialized;\n\n    var renderer = void 0;\n\n    config.predictCallback = function (input) {\n        if (renderer) {\n            renderer.update(model, input);\n            renderer.render();\n        }\n    };\n\n    config.hookCallback = function (layer) {\n        if (renderer) {\n            renderer.updateValues(layer);\n            renderer.render();\n        }\n    };\n\n    (0, _modelParser2.default)(model, config).then(function (res) {\n        renderer = new _canvas2.default(config, res);\n        if (onRendererInitialized) {\n            onRendererInitialized(renderer);\n        }\n    });\n};\n\nexports.default = ModelView;\nmodule.exports = exports['default'];"
        },
        {
          "id": "./src/model-parser.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/model-parser.js",
          "name": "./src/model-parser.js",
          "index": 1,
          "index2": 0,
          "size": 7242,
          "cacheable": true,
          "built": true,
          "optional": false,
          "prefetched": false,
          "chunks": [
            "main"
          ],
          "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "issuerId": "./src/index.js",
          "issuerName": "./src/index.js",
          "issuerPath": [
            {
              "id": "./src/index.js",
              "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "name": "./src/index.js",
              "profile": {
                "factory": 22,
                "building": 497
              }
            }
          ],
          "profile": {
            "factory": 5,
            "building": 278
          },
          "failed": false,
          "errors": 0,
          "warnings": 0,
          "assets": [],
          "reasons": [
            {
              "moduleId": "./src/index.js",
              "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "module": "./src/index.js",
              "moduleName": "./src/index.js",
              "type": "cjs require",
              "userRequest": "./model-parser",
              "loc": "7:19-44"
            }
          ],
          "providedExports": null,
          "optimizationBailout": [],
          "depth": 1,
          "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar parseModel = function () {\n  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(model, options) {\n    var parsed, parserConfig, parseLayer, predict, layerArr;\n    return regeneratorRuntime.wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            parseLayer = function parseLayer(layer, nextColumn) {\n              var _this = this;\n\n              var name = layer.name,\n                  input = layer.input,\n                  inputs = layer.inputs,\n                  shape = layer.shape,\n                  sourceLayer = layer.sourceLayer;\n\n              var _ref2 = sourceLayer || {},\n                  getWeights = _ref2.getWeights,\n                  setCallHook = _ref2.setCallHook,\n                  activation = _ref2.activation;\n\n              var currentLayer = {\n                previousColumn: [],\n                name: name,\n                shape: shape,\n                weights: {},\n                getWeights: noop,\n                mapPosition: Object.keys(parsed.layerMap).length\n              };\n\n              parsed.layerMap[name] = currentLayer;\n              parsed.layerArr.unshift(currentLayer);\n\n              if (activation) {\n                var className = activation.getClassName();\n                currentLayer.activation = {\n                  name: className\n                };\n              }\n\n              if (setCallHook) {\n                sourceLayer.setCallHook(function () {\n                  var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(layerInput) {\n                    var i;\n                    return regeneratorRuntime.wrap(function _callee$(_context) {\n                      while (1) {\n                        switch (_context.prev = _context.next) {\n                          case 0:\n                            currentLayer.getWeights();\n                            currentLayer.activations = [];\n                            for (i = 0; i < layerInput.length; i++) {\n                              currentLayer.activations.push(layerInput[i].dataSync());\n                            }\n                            parserConfig.hookCallback(currentLayer);\n\n                          case 4:\n                          case 'end':\n                            return _context.stop();\n                        }\n                      }\n                    }, _callee, _this);\n                  }));\n\n                  return function (_x3) {\n                    return _ref3.apply(this, arguments);\n                  };\n                }());\n              }\n\n              if (getWeights) {\n\n                currentLayer.getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n                  var weights, i, weight, rankType, weightName;\n                  return regeneratorRuntime.wrap(function _callee2$(_context2) {\n                    while (1) {\n                      switch (_context2.prev = _context2.next) {\n                        case 0:\n                          _context2.next = 2;\n                          return sourceLayer.getWeights();\n\n                        case 2:\n                          weights = _context2.sent;\n                          i = 0;\n\n                        case 4:\n                          if (!(i < weights.length)) {\n                            _context2.next = 16;\n                            break;\n                          }\n\n                          weight = weights[i];\n                          rankType = weight.rankType, weightName = weight.name;\n\n                          currentLayer.hasWeights = true;\n                          _context2.t0 = weightName;\n                          _context2.next = 11;\n                          return weights[i].dataSync();\n\n                        case 11:\n                          _context2.t1 = _context2.sent;\n                          currentLayer.weights[rankType] = {\n                            name: _context2.t0,\n                            values: _context2.t1\n                          };\n\n                        case 13:\n                          i++;\n                          _context2.next = 4;\n                          break;\n\n                        case 16:\n                        case 'end':\n                          return _context2.stop();\n                      }\n                    }\n                  }, _callee2, _this);\n                }));\n\n                currentLayer.getWeights();\n              }\n\n              if (inputs) {\n                inputs.forEach(function (inp) {\n                  parseLayer(inp, currentLayer.previousColumn);\n                });\n              } else {\n                parseLayer(input, currentLayer.previousColumn);\n              }\n\n              if (nextColumn) {\n                nextColumn.push(currentLayer);\n              }\n\n              return currentLayer;\n            };\n\n            parsed = {\n              layerMap: {},\n              layerArr: []\n            };\n            parserConfig = _extends({\n              predictCallback: noop,\n              hookCallback: noop\n            }, options);\n            predict = model.predict;\n\n\n            model.predict = function () {\n              for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n              }\n\n              var result = predict.apply(model, args);\n              model.outputData = result.dataSync();\n              parserConfig.predictCallback(args);\n              return result;\n            };\n\n            _context3.next = 7;\n            return parseLayer(model.layers[model.layers.length - 1].output);\n\n          case 7:\n            parsed.model = _context3.sent;\n\n\n            if (options.printStats) {\n              layerArr = parsed.layerArr;\n\n              console.log(new Array(10).join('-'));\n              layerArr.forEach(function (layer) {\n                console.log('Layer: ' + layer.name);\n              });\n            }\n\n            return _context3.abrupt('return', parsed);\n\n          case 10:\n          case 'end':\n            return _context3.stop();\n        }\n      }\n    }, _callee3, this);\n  }));\n\n  return function parseModel(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nfunction noop() {}\n\nexports.default = parseModel;\nmodule.exports = exports['default'];"
        },
        {
          "id": "./src/renderers/abstract.renderer.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/abstract.renderer.js",
          "name": "./src/renderers/abstract.renderer.js",
          "index": 3,
          "index2": 1,
          "size": 7648,
          "cacheable": true,
          "built": true,
          "optional": false,
          "prefetched": false,
          "chunks": [
            "main"
          ],
          "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
          "issuerId": "./src/renderers/canvas.renderer.js",
          "issuerName": "./src/renderers/canvas.renderer.js",
          "issuerPath": [
            {
              "id": "./src/index.js",
              "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "name": "./src/index.js",
              "profile": {
                "factory": 22,
                "building": 497
              }
            },
            {
              "id": "./src/renderers/canvas.renderer.js",
              "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
              "name": "./src/renderers/canvas.renderer.js",
              "profile": {
                "factory": 5,
                "building": 278
              }
            }
          ],
          "profile": {
            "factory": 2,
            "building": 95
          },
          "failed": false,
          "errors": 0,
          "warnings": 0,
          "assets": [],
          "reasons": [
            {
              "moduleId": "./src/renderers/canvas.renderer.js",
              "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
              "module": "./src/renderers/canvas.renderer.js",
              "moduleName": "./src/renderers/canvas.renderer.js",
              "type": "cjs require",
              "userRequest": "./abstract.renderer",
              "loc": "11:16-46"
            }
          ],
          "providedExports": null,
          "optimizationBailout": [],
          "depth": 2,
          "source": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar colors = [[6, 57, 143], [0, 107, 92], [216, 139, 0], [180, 0, 85], [106, 2, 143], [216, 109, 0], [2, 105, 134], [0, 142, 103], [201, 0, 39], [139, 11, 215], [171, 141, 0]];\n\nvar AbstractRenderer = function () {\n    function AbstractRenderer(config, initData) {\n        var _this = this;\n\n        _classCallCheck(this, AbstractRenderer);\n\n        var xPadding = config.xPadding,\n            yPadding = config.yPadding,\n            xOffset = config.xOffset,\n            _config$layer = config.layer,\n            layer = _config$layer === undefined ? {} : _config$layer;\n        var layerArr = initData.layerArr;\n\n\n        var maxHeight = (yPadding || 1) * 2;\n        var cx = (xPadding || 0) + (xOffset || 0);\n\n        function processColumn(lyr) {\n            var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n            lyr.column = col;\n            lyr.previousColumn.forEach(function (l) {\n                processColumn(l, col + 1);\n            });\n        }\n\n        processColumn(layerArr[layerArr.length - 1]);\n\n        layerArr.forEach(function (l, lindex) {\n            var name = l.name,\n                shape = l.shape,\n                previousColumn = l.previousColumn;\n\n            _this.outputLayer = l;\n            var customConfig = layer[name] || {};\n\n            var layerConfig = Object.assign({}, config, customConfig);\n            var radius = layerConfig.radius,\n                nodePadding = layerConfig.nodePadding,\n                layerPadding = layerConfig.layerPadding,\n                groupPadding = layerConfig.groupPadding,\n                _layerConfig$domain = layerConfig.domain,\n                domain = _layerConfig$domain === undefined ? [0, 1] : _layerConfig$domain,\n                renderLinks = layerConfig.renderLinks,\n                renderNode = layerConfig.renderNode,\n                nodeStroke = layerConfig.nodeStroke,\n                reshape = layerConfig.reshape;\n\n\n            var color = layerConfig.color || (lindex < colors.length ? colors[lindex] : [0, 0, 0]);\n\n            var _Object$assign = Object.assign([1, 1, 1], shape.slice(1)),\n                _Object$assign2 = _slicedToArray(_Object$assign, 3),\n                rows = _Object$assign2[0],\n                cols = _Object$assign2[1],\n                groups = _Object$assign2[2];\n\n            var totalNodes = rows * cols * groups;\n\n            if (reshape) {\n                var _Object$assign3 = Object.assign([1, 1, 1], reshape),\n                    _Object$assign4 = _slicedToArray(_Object$assign3, 3),\n                    nr = _Object$assign4[0],\n                    nc = _Object$assign4[1],\n                    ng = _Object$assign4[2];\n\n                if (nr * nc * ng !== totalNodes) {\n                    throw new Error(\"Unable to reshape from [\" + rows + \", \" + cols + \", \" + groups + \"] to [\" + nr + \", \" + nc + \", \" + ng + \"]\");\n                }\n\n                rows = nr;\n                cols = nc;\n                groups = ng;\n            }\n\n            cx += layerPadding;\n\n            var step = radius + nodePadding;\n            var width = layerPadding + cols * step;\n            var nodes = [];\n            var height = 0;\n\n            for (var row = 0; row < rows; row++) {\n                for (var col = 0; col < cols; col++) {\n                    for (var group = 0; group < groups; group++) {\n                        var y = radius + row * step + group * rows * step + group * groupPadding;\n                        nodes.push({\n                            x: cx + col * step,\n                            y: y,\n                            radius: radius\n                        });\n                        height = y;\n                    }\n                }\n            }\n\n            height += groupPadding + radius;\n            maxHeight = Math.max(maxHeight, height);\n\n            Object.assign(l, {\n                name: name,\n                x: cx,\n                layerWidth: width,\n                layerHeight: height,\n                radius: radius,\n                nodes: nodes,\n                domain: domain,\n                renderLinks: renderLinks,\n                renderNode: renderNode,\n                nodeStroke: nodeStroke,\n                color: color,\n                previousLayers: previousColumn.map(function (lyr) {\n                    return lyr.name;\n                })\n            });\n\n            cx += width;\n        });\n\n        cx += xPadding || 0;\n\n        layerArr.forEach(function (l) {\n            var offsetY = Math.floor((maxHeight - l.layerHeight) / 2);\n            l.nodes.forEach(function (nd) {\n                return nd.y += offsetY;\n            });\n        });\n\n        Object.assign(this, { width: cx, height: maxHeight });\n\n        this.layers = layerArr;\n        this.layersMap = layerArr.reduce(function (memo, item) {\n            memo[item.name] = item;\n            return memo;\n        }, {});\n    }\n\n    _createClass(AbstractRenderer, [{\n        key: \"update\",\n        value: function update(model, input) {\n            var _this2 = this;\n\n            if (input) {\n                model.inputs.forEach(function (inputLayer, index) {\n                    var syntheticLayer = _this2.layersMap[inputLayer.name];\n                    _this2.updateLayerValues(syntheticLayer, input[index].dataSync());\n                });\n            }\n\n            this.updateLayerValues(this.outputLayer, model.outputData);\n        }\n    }, {\n        key: \"updateLayerValues\",\n        value: function updateLayerValues(layer, data) {\n            for (var i = 0; i < layer.nodes.length; i++) {\n                layer.nodes[i].value = data[i];\n            }\n        }\n    }, {\n        key: \"updateValues\",\n        value: function updateValues(layer) {\n            var _this3 = this;\n\n            var syntheticLayer = this.layersMap[layer.name];\n            syntheticLayer.weights = layer.weights;\n            syntheticLayer.previousColumn.forEach(function (col, idx) {\n                _this3.updateLayerValues(col, layer.activations[idx]);\n            });\n        }\n    }]);\n\n    return AbstractRenderer;\n}();\n\nexports.default = AbstractRenderer;\nmodule.exports = exports[\"default\"];"
        },
        {
          "id": "./src/renderers/canvas.renderer.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
          "name": "./src/renderers/canvas.renderer.js",
          "index": 2,
          "index2": 2,
          "size": 7375,
          "cacheable": true,
          "built": true,
          "optional": false,
          "prefetched": false,
          "chunks": [
            "main"
          ],
          "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "issuerId": "./src/index.js",
          "issuerName": "./src/index.js",
          "issuerPath": [
            {
              "id": "./src/index.js",
              "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "name": "./src/index.js",
              "profile": {
                "factory": 22,
                "building": 497
              }
            }
          ],
          "profile": {
            "factory": 5,
            "building": 278
          },
          "failed": false,
          "errors": 0,
          "warnings": 0,
          "assets": [],
          "reasons": [
            {
              "moduleId": "./src/index.js",
              "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
              "module": "./src/index.js",
              "moduleName": "./src/index.js",
              "type": "cjs require",
              "userRequest": "./renderers/canvas.renderer",
              "loc": "11:14-52"
            }
          ],
          "providedExports": null,
          "optimizationBailout": [],
          "depth": 1,
          "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _abstract = require('./abstract.renderer');\n\nvar _abstract2 = _interopRequireDefault(_abstract);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CanvasRenderer = function (_AbstractRenderer) {\n    _inherits(CanvasRenderer, _AbstractRenderer);\n\n    function CanvasRenderer(config, initData) {\n        _classCallCheck(this, CanvasRenderer);\n\n        var _this = _possibleConstructorReturn(this, (CanvasRenderer.__proto__ || Object.getPrototypeOf(CanvasRenderer)).call(this, config, initData));\n\n        var canvas = document.createElement('canvas');\n\n        var onBeginRender = config.onBeginRender,\n            onEndRender = config.onEndRender;\n\n\n        Object.assign(_this, { canvas: canvas, onBeginRender: onBeginRender, onEndRender: onEndRender });\n\n        canvas.setAttribute('width', _this.width);\n        canvas.setAttribute('height', _this.height);\n\n        _this.renderContext = canvas.getContext('2d');\n        _this.renderElement = canvas;\n        return _this;\n    }\n\n    _createClass(CanvasRenderer, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            window.requestAnimationFrame(function () {\n                var onBeginRender = _this2.onBeginRender,\n                    onEndRender = _this2.onEndRender;\n\n                _this2.renderContext.clearRect(0, 0, _this2.width, _this2.height);\n\n                if (onBeginRender) {\n                    onBeginRender(_this2);\n                }\n\n                _this2.layers.forEach(function (layer) {\n                    var radius = layer.radius,\n                        nodes = layer.nodes,\n                        _layer$domain = _slicedToArray(layer.domain, 2),\n                        min = _layer$domain[0],\n                        max = _layer$domain[1],\n                        previousColumn = layer.previousColumn,\n                        renderLinks = layer.renderLinks,\n                        renderNode = layer.renderNode,\n                        weights = layer.weights,\n                        _layer$color = _slicedToArray(layer.color, 3),\n                        r = _layer$color[0],\n                        g = _layer$color[1],\n                        b = _layer$color[2],\n                        nodeStroke = layer.nodeStroke;\n\n                    var kernel = weights[2];\n\n                    var leftSideNodes = void 0;\n\n                    if (renderLinks) {\n                        leftSideNodes = previousColumn.reduce(function (memo, prevLayer) {\n                            return memo.concat(prevLayer.nodes);\n                        }, []);\n                    }\n\n                    nodes.forEach(function (node, index) {\n                        var nx = node.x,\n                            ny = node.y,\n                            value = node.value;\n\n\n                        if (renderLinks) {\n                            leftSideNodes.forEach(function (leftNode, leftIdx) {\n                                _this2.renderContext.beginPath();\n                                var hasWeight = kernel && kernel.values;\n                                var weightVal = hasWeight ? kernel.values[index * leftIdx] : 0.5;\n                                if (hasWeight) {\n                                    _this2.renderContext.strokeStyle = weightVal > 0 ? 'rgb(0, 0, 255, ' + weightVal + ')' : 'rgb(255, 0, 0, ' + Math.abs(weightVal) + ')';\n                                } else {\n                                    _this2.renderContext.strokeStyle = 'rgba(0,0,0,.5)';\n                                }\n                                _this2.renderContext.moveTo(leftNode.x + leftNode.radius / 2, leftNode.y);\n                                _this2.renderContext.lineTo(node.x - node.radius / 2, node.y);\n                                _this2.renderContext.stroke();\n                            });\n                        }\n                        _this2.renderContext.strokeStyle = 'rgb(' + r + ', ' + g + ', ' + b + ')';\n                        var domainValue = value / (max + min);\n                        if (!isNaN(domainValue)) {\n                            _this2.renderContext.fillStyle = 'rgba(' + r + ', ' + g + ', ' + b + ', ' + domainValue + ')';\n                        } else {\n                            _this2.renderContext.fillStyle = '#FFF';\n                        }\n                        _this2.renderContext.beginPath();\n                        _this2.renderContext.arc(nx, ny, radius / 2, 0, 2 * Math.PI);\n                        if (radius > 3 && nodeStroke) {\n                            _this2.renderContext.stroke();\n                        }\n                        _this2.renderContext.fill();\n\n                        if (renderNode) {\n                            renderNode(_this2.renderContext, node, index);\n                        }\n                    });\n                });\n\n                if (onEndRender) {\n                    onEndRender(_this2);\n                }\n            });\n        }\n    }]);\n\n    return CanvasRenderer;\n}(_abstract2.default);\n\nexports.default = CanvasRenderer;\nmodule.exports = exports['default'];"
        }
      ],
      "filteredModules": 0,
      "origins": [
        {
          "module": "",
          "moduleIdentifier": "",
          "moduleName": "",
          "loc": "main",
          "request": "/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "reasons": []
        }
      ]
    }
  ],
  "modules": [
    {
      "id": "./src/default.config.js",
      "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/default.config.js",
      "name": "./src/default.config.js",
      "index": 4,
      "index2": 3,
      "size": 485,
      "cacheable": true,
      "built": true,
      "optional": false,
      "prefetched": false,
      "chunks": [
        "main"
      ],
      "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
      "issuerId": "./src/index.js",
      "issuerName": "./src/index.js",
      "issuerPath": [
        {
          "id": "./src/index.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "name": "./src/index.js",
          "profile": {
            "factory": 22,
            "building": 497
          }
        }
      ],
      "profile": {
        "factory": 5,
        "building": 278
      },
      "failed": false,
      "errors": 0,
      "warnings": 0,
      "assets": [],
      "reasons": [
        {
          "moduleId": "./src/index.js",
          "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "module": "./src/index.js",
          "moduleName": "./src/index.js",
          "type": "cjs require",
          "userRequest": "./default.config",
          "loc": "15:15-42"
        }
      ],
      "providedExports": null,
      "optimizationBailout": [],
      "depth": 1,
      "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = {\n    renderer: 'canvas',\n\n    radius: 6,\n    nodePadding: 2,\n    layerPadding: 20,\n    groupPadding: 1,\n\n    xPadding: 10,\n    yPadding: 10,\n\n    renderLinks: false,\n    plotActivations: false,\n    nodeStroke: true,\n\n    onRendererInitialized: function onRendererInitialized(renderer) {\n        document.body.appendChild(renderer.canvas);\n    }\n};\nmodule.exports = exports['default'];"
    },
    {
      "id": "./src/index.js",
      "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
      "name": "./src/index.js",
      "index": 0,
      "index2": 4,
      "size": 1513,
      "cacheable": true,
      "built": true,
      "optional": false,
      "prefetched": false,
      "chunks": [
        "main"
      ],
      "issuer": null,
      "issuerId": null,
      "issuerName": null,
      "issuerPath": null,
      "profile": {
        "factory": 22,
        "building": 497
      },
      "failed": false,
      "errors": 0,
      "warnings": 0,
      "assets": [],
      "reasons": [
        {
          "moduleId": null,
          "moduleIdentifier": null,
          "module": null,
          "moduleName": null,
          "type": "single entry",
          "userRequest": "/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "loc": "main"
        }
      ],
      "providedExports": null,
      "optimizationBailout": [],
      "depth": 0,
      "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _modelParser = require('./model-parser');\n\nvar _modelParser2 = _interopRequireDefault(_modelParser);\n\nvar _canvas = require('./renderers/canvas.renderer');\n\nvar _canvas2 = _interopRequireDefault(_canvas);\n\nvar _default = require('./default.config');\n\nvar _default2 = _interopRequireDefault(_default);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ModelView = function ModelView(model, customConfig) {\n    _classCallCheck(this, ModelView);\n\n    var config = Object.assign({}, _default2.default, customConfig);\n    var onRendererInitialized = config.onRendererInitialized;\n\n    var renderer = void 0;\n\n    config.predictCallback = function (input) {\n        if (renderer) {\n            renderer.update(model, input);\n            renderer.render();\n        }\n    };\n\n    config.hookCallback = function (layer) {\n        if (renderer) {\n            renderer.updateValues(layer);\n            renderer.render();\n        }\n    };\n\n    (0, _modelParser2.default)(model, config).then(function (res) {\n        renderer = new _canvas2.default(config, res);\n        if (onRendererInitialized) {\n            onRendererInitialized(renderer);\n        }\n    });\n};\n\nexports.default = ModelView;\nmodule.exports = exports['default'];"
    },
    {
      "id": "./src/model-parser.js",
      "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/model-parser.js",
      "name": "./src/model-parser.js",
      "index": 1,
      "index2": 0,
      "size": 7242,
      "cacheable": true,
      "built": true,
      "optional": false,
      "prefetched": false,
      "chunks": [
        "main"
      ],
      "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
      "issuerId": "./src/index.js",
      "issuerName": "./src/index.js",
      "issuerPath": [
        {
          "id": "./src/index.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "name": "./src/index.js",
          "profile": {
            "factory": 22,
            "building": 497
          }
        }
      ],
      "profile": {
        "factory": 5,
        "building": 278
      },
      "failed": false,
      "errors": 0,
      "warnings": 0,
      "assets": [],
      "reasons": [
        {
          "moduleId": "./src/index.js",
          "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "module": "./src/index.js",
          "moduleName": "./src/index.js",
          "type": "cjs require",
          "userRequest": "./model-parser",
          "loc": "7:19-44"
        }
      ],
      "providedExports": null,
      "optimizationBailout": [],
      "depth": 1,
      "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar parseModel = function () {\n  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(model, options) {\n    var parsed, parserConfig, parseLayer, predict, layerArr;\n    return regeneratorRuntime.wrap(function _callee3$(_context3) {\n      while (1) {\n        switch (_context3.prev = _context3.next) {\n          case 0:\n            parseLayer = function parseLayer(layer, nextColumn) {\n              var _this = this;\n\n              var name = layer.name,\n                  input = layer.input,\n                  inputs = layer.inputs,\n                  shape = layer.shape,\n                  sourceLayer = layer.sourceLayer;\n\n              var _ref2 = sourceLayer || {},\n                  getWeights = _ref2.getWeights,\n                  setCallHook = _ref2.setCallHook,\n                  activation = _ref2.activation;\n\n              var currentLayer = {\n                previousColumn: [],\n                name: name,\n                shape: shape,\n                weights: {},\n                getWeights: noop,\n                mapPosition: Object.keys(parsed.layerMap).length\n              };\n\n              parsed.layerMap[name] = currentLayer;\n              parsed.layerArr.unshift(currentLayer);\n\n              if (activation) {\n                var className = activation.getClassName();\n                currentLayer.activation = {\n                  name: className\n                };\n              }\n\n              if (setCallHook) {\n                sourceLayer.setCallHook(function () {\n                  var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(layerInput) {\n                    var i;\n                    return regeneratorRuntime.wrap(function _callee$(_context) {\n                      while (1) {\n                        switch (_context.prev = _context.next) {\n                          case 0:\n                            currentLayer.getWeights();\n                            currentLayer.activations = [];\n                            for (i = 0; i < layerInput.length; i++) {\n                              currentLayer.activations.push(layerInput[i].dataSync());\n                            }\n                            parserConfig.hookCallback(currentLayer);\n\n                          case 4:\n                          case 'end':\n                            return _context.stop();\n                        }\n                      }\n                    }, _callee, _this);\n                  }));\n\n                  return function (_x3) {\n                    return _ref3.apply(this, arguments);\n                  };\n                }());\n              }\n\n              if (getWeights) {\n\n                currentLayer.getWeights = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n                  var weights, i, weight, rankType, weightName;\n                  return regeneratorRuntime.wrap(function _callee2$(_context2) {\n                    while (1) {\n                      switch (_context2.prev = _context2.next) {\n                        case 0:\n                          _context2.next = 2;\n                          return sourceLayer.getWeights();\n\n                        case 2:\n                          weights = _context2.sent;\n                          i = 0;\n\n                        case 4:\n                          if (!(i < weights.length)) {\n                            _context2.next = 16;\n                            break;\n                          }\n\n                          weight = weights[i];\n                          rankType = weight.rankType, weightName = weight.name;\n\n                          currentLayer.hasWeights = true;\n                          _context2.t0 = weightName;\n                          _context2.next = 11;\n                          return weights[i].dataSync();\n\n                        case 11:\n                          _context2.t1 = _context2.sent;\n                          currentLayer.weights[rankType] = {\n                            name: _context2.t0,\n                            values: _context2.t1\n                          };\n\n                        case 13:\n                          i++;\n                          _context2.next = 4;\n                          break;\n\n                        case 16:\n                        case 'end':\n                          return _context2.stop();\n                      }\n                    }\n                  }, _callee2, _this);\n                }));\n\n                currentLayer.getWeights();\n              }\n\n              if (inputs) {\n                inputs.forEach(function (inp) {\n                  parseLayer(inp, currentLayer.previousColumn);\n                });\n              } else {\n                parseLayer(input, currentLayer.previousColumn);\n              }\n\n              if (nextColumn) {\n                nextColumn.push(currentLayer);\n              }\n\n              return currentLayer;\n            };\n\n            parsed = {\n              layerMap: {},\n              layerArr: []\n            };\n            parserConfig = _extends({\n              predictCallback: noop,\n              hookCallback: noop\n            }, options);\n            predict = model.predict;\n\n\n            model.predict = function () {\n              for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n              }\n\n              var result = predict.apply(model, args);\n              model.outputData = result.dataSync();\n              parserConfig.predictCallback(args);\n              return result;\n            };\n\n            _context3.next = 7;\n            return parseLayer(model.layers[model.layers.length - 1].output);\n\n          case 7:\n            parsed.model = _context3.sent;\n\n\n            if (options.printStats) {\n              layerArr = parsed.layerArr;\n\n              console.log(new Array(10).join('-'));\n              layerArr.forEach(function (layer) {\n                console.log('Layer: ' + layer.name);\n              });\n            }\n\n            return _context3.abrupt('return', parsed);\n\n          case 10:\n          case 'end':\n            return _context3.stop();\n        }\n      }\n    }, _callee3, this);\n  }));\n\n  return function parseModel(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nfunction noop() {}\n\nexports.default = parseModel;\nmodule.exports = exports['default'];"
    },
    {
      "id": "./src/renderers/abstract.renderer.js",
      "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/abstract.renderer.js",
      "name": "./src/renderers/abstract.renderer.js",
      "index": 3,
      "index2": 1,
      "size": 7648,
      "cacheable": true,
      "built": true,
      "optional": false,
      "prefetched": false,
      "chunks": [
        "main"
      ],
      "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
      "issuerId": "./src/renderers/canvas.renderer.js",
      "issuerName": "./src/renderers/canvas.renderer.js",
      "issuerPath": [
        {
          "id": "./src/index.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "name": "./src/index.js",
          "profile": {
            "factory": 22,
            "building": 497
          }
        },
        {
          "id": "./src/renderers/canvas.renderer.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
          "name": "./src/renderers/canvas.renderer.js",
          "profile": {
            "factory": 5,
            "building": 278
          }
        }
      ],
      "profile": {
        "factory": 2,
        "building": 95
      },
      "failed": false,
      "errors": 0,
      "warnings": 0,
      "assets": [],
      "reasons": [
        {
          "moduleId": "./src/renderers/canvas.renderer.js",
          "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
          "module": "./src/renderers/canvas.renderer.js",
          "moduleName": "./src/renderers/canvas.renderer.js",
          "type": "cjs require",
          "userRequest": "./abstract.renderer",
          "loc": "11:16-46"
        }
      ],
      "providedExports": null,
      "optimizationBailout": [],
      "depth": 2,
      "source": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar colors = [[6, 57, 143], [0, 107, 92], [216, 139, 0], [180, 0, 85], [106, 2, 143], [216, 109, 0], [2, 105, 134], [0, 142, 103], [201, 0, 39], [139, 11, 215], [171, 141, 0]];\n\nvar AbstractRenderer = function () {\n    function AbstractRenderer(config, initData) {\n        var _this = this;\n\n        _classCallCheck(this, AbstractRenderer);\n\n        var xPadding = config.xPadding,\n            yPadding = config.yPadding,\n            xOffset = config.xOffset,\n            _config$layer = config.layer,\n            layer = _config$layer === undefined ? {} : _config$layer;\n        var layerArr = initData.layerArr;\n\n\n        var maxHeight = (yPadding || 1) * 2;\n        var cx = (xPadding || 0) + (xOffset || 0);\n\n        function processColumn(lyr) {\n            var col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n            lyr.column = col;\n            lyr.previousColumn.forEach(function (l) {\n                processColumn(l, col + 1);\n            });\n        }\n\n        processColumn(layerArr[layerArr.length - 1]);\n\n        layerArr.forEach(function (l, lindex) {\n            var name = l.name,\n                shape = l.shape,\n                previousColumn = l.previousColumn;\n\n            _this.outputLayer = l;\n            var customConfig = layer[name] || {};\n\n            var layerConfig = Object.assign({}, config, customConfig);\n            var radius = layerConfig.radius,\n                nodePadding = layerConfig.nodePadding,\n                layerPadding = layerConfig.layerPadding,\n                groupPadding = layerConfig.groupPadding,\n                _layerConfig$domain = layerConfig.domain,\n                domain = _layerConfig$domain === undefined ? [0, 1] : _layerConfig$domain,\n                renderLinks = layerConfig.renderLinks,\n                renderNode = layerConfig.renderNode,\n                nodeStroke = layerConfig.nodeStroke,\n                reshape = layerConfig.reshape;\n\n\n            var color = layerConfig.color || (lindex < colors.length ? colors[lindex] : [0, 0, 0]);\n\n            var _Object$assign = Object.assign([1, 1, 1], shape.slice(1)),\n                _Object$assign2 = _slicedToArray(_Object$assign, 3),\n                rows = _Object$assign2[0],\n                cols = _Object$assign2[1],\n                groups = _Object$assign2[2];\n\n            var totalNodes = rows * cols * groups;\n\n            if (reshape) {\n                var _Object$assign3 = Object.assign([1, 1, 1], reshape),\n                    _Object$assign4 = _slicedToArray(_Object$assign3, 3),\n                    nr = _Object$assign4[0],\n                    nc = _Object$assign4[1],\n                    ng = _Object$assign4[2];\n\n                if (nr * nc * ng !== totalNodes) {\n                    throw new Error(\"Unable to reshape from [\" + rows + \", \" + cols + \", \" + groups + \"] to [\" + nr + \", \" + nc + \", \" + ng + \"]\");\n                }\n\n                rows = nr;\n                cols = nc;\n                groups = ng;\n            }\n\n            cx += layerPadding;\n\n            var step = radius + nodePadding;\n            var width = layerPadding + cols * step;\n            var nodes = [];\n            var height = 0;\n\n            for (var row = 0; row < rows; row++) {\n                for (var col = 0; col < cols; col++) {\n                    for (var group = 0; group < groups; group++) {\n                        var y = radius + row * step + group * rows * step + group * groupPadding;\n                        nodes.push({\n                            x: cx + col * step,\n                            y: y,\n                            radius: radius\n                        });\n                        height = y;\n                    }\n                }\n            }\n\n            height += groupPadding + radius;\n            maxHeight = Math.max(maxHeight, height);\n\n            Object.assign(l, {\n                name: name,\n                x: cx,\n                layerWidth: width,\n                layerHeight: height,\n                radius: radius,\n                nodes: nodes,\n                domain: domain,\n                renderLinks: renderLinks,\n                renderNode: renderNode,\n                nodeStroke: nodeStroke,\n                color: color,\n                previousLayers: previousColumn.map(function (lyr) {\n                    return lyr.name;\n                })\n            });\n\n            cx += width;\n        });\n\n        cx += xPadding || 0;\n\n        layerArr.forEach(function (l) {\n            var offsetY = Math.floor((maxHeight - l.layerHeight) / 2);\n            l.nodes.forEach(function (nd) {\n                return nd.y += offsetY;\n            });\n        });\n\n        Object.assign(this, { width: cx, height: maxHeight });\n\n        this.layers = layerArr;\n        this.layersMap = layerArr.reduce(function (memo, item) {\n            memo[item.name] = item;\n            return memo;\n        }, {});\n    }\n\n    _createClass(AbstractRenderer, [{\n        key: \"update\",\n        value: function update(model, input) {\n            var _this2 = this;\n\n            if (input) {\n                model.inputs.forEach(function (inputLayer, index) {\n                    var syntheticLayer = _this2.layersMap[inputLayer.name];\n                    _this2.updateLayerValues(syntheticLayer, input[index].dataSync());\n                });\n            }\n\n            this.updateLayerValues(this.outputLayer, model.outputData);\n        }\n    }, {\n        key: \"updateLayerValues\",\n        value: function updateLayerValues(layer, data) {\n            for (var i = 0; i < layer.nodes.length; i++) {\n                layer.nodes[i].value = data[i];\n            }\n        }\n    }, {\n        key: \"updateValues\",\n        value: function updateValues(layer) {\n            var _this3 = this;\n\n            var syntheticLayer = this.layersMap[layer.name];\n            syntheticLayer.weights = layer.weights;\n            syntheticLayer.previousColumn.forEach(function (col, idx) {\n                _this3.updateLayerValues(col, layer.activations[idx]);\n            });\n        }\n    }]);\n\n    return AbstractRenderer;\n}();\n\nexports.default = AbstractRenderer;\nmodule.exports = exports[\"default\"];"
    },
    {
      "id": "./src/renderers/canvas.renderer.js",
      "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/renderers/canvas.renderer.js",
      "name": "./src/renderers/canvas.renderer.js",
      "index": 2,
      "index2": 2,
      "size": 7375,
      "cacheable": true,
      "built": true,
      "optional": false,
      "prefetched": false,
      "chunks": [
        "main"
      ],
      "issuer": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
      "issuerId": "./src/index.js",
      "issuerName": "./src/index.js",
      "issuerPath": [
        {
          "id": "./src/index.js",
          "identifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "name": "./src/index.js",
          "profile": {
            "factory": 22,
            "building": 497
          }
        }
      ],
      "profile": {
        "factory": 5,
        "building": 278
      },
      "failed": false,
      "errors": 0,
      "warnings": 0,
      "assets": [],
      "reasons": [
        {
          "moduleId": "./src/index.js",
          "moduleIdentifier": "/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/babel-loader/lib/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/node_modules/eslint-loader/index.js!/Users/cornel/Projects/Personal/tfjs-model-view/src/index.js",
          "module": "./src/index.js",
          "moduleName": "./src/index.js",
          "type": "cjs require",
          "userRequest": "./renderers/canvas.renderer",
          "loc": "11:14-52"
        }
      ],
      "providedExports": null,
      "optimizationBailout": [],
      "depth": 1,
      "source": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _abstract = require('./abstract.renderer');\n\nvar _abstract2 = _interopRequireDefault(_abstract);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CanvasRenderer = function (_AbstractRenderer) {\n    _inherits(CanvasRenderer, _AbstractRenderer);\n\n    function CanvasRenderer(config, initData) {\n        _classCallCheck(this, CanvasRenderer);\n\n        var _this = _possibleConstructorReturn(this, (CanvasRenderer.__proto__ || Object.getPrototypeOf(CanvasRenderer)).call(this, config, initData));\n\n        var canvas = document.createElement('canvas');\n\n        var onBeginRender = config.onBeginRender,\n            onEndRender = config.onEndRender;\n\n\n        Object.assign(_this, { canvas: canvas, onBeginRender: onBeginRender, onEndRender: onEndRender });\n\n        canvas.setAttribute('width', _this.width);\n        canvas.setAttribute('height', _this.height);\n\n        _this.renderContext = canvas.getContext('2d');\n        _this.renderElement = canvas;\n        return _this;\n    }\n\n    _createClass(CanvasRenderer, [{\n        key: 'render',\n        value: function render() {\n            var _this2 = this;\n\n            window.requestAnimationFrame(function () {\n                var onBeginRender = _this2.onBeginRender,\n                    onEndRender = _this2.onEndRender;\n\n                _this2.renderContext.clearRect(0, 0, _this2.width, _this2.height);\n\n                if (onBeginRender) {\n                    onBeginRender(_this2);\n                }\n\n                _this2.layers.forEach(function (layer) {\n                    var radius = layer.radius,\n                        nodes = layer.nodes,\n                        _layer$domain = _slicedToArray(layer.domain, 2),\n                        min = _layer$domain[0],\n                        max = _layer$domain[1],\n                        previousColumn = layer.previousColumn,\n                        renderLinks = layer.renderLinks,\n                        renderNode = layer.renderNode,\n                        weights = layer.weights,\n                        _layer$color = _slicedToArray(layer.color, 3),\n                        r = _layer$color[0],\n                        g = _layer$color[1],\n                        b = _layer$color[2],\n                        nodeStroke = layer.nodeStroke;\n\n                    var kernel = weights[2];\n\n                    var leftSideNodes = void 0;\n\n                    if (renderLinks) {\n                        leftSideNodes = previousColumn.reduce(function (memo, prevLayer) {\n                            return memo.concat(prevLayer.nodes);\n                        }, []);\n                    }\n\n                    nodes.forEach(function (node, index) {\n                        var nx = node.x,\n                            ny = node.y,\n                            value = node.value;\n\n\n                        if (renderLinks) {\n                            leftSideNodes.forEach(function (leftNode, leftIdx) {\n                                _this2.renderContext.beginPath();\n                                var hasWeight = kernel && kernel.values;\n                                var weightVal = hasWeight ? kernel.values[index * leftIdx] : 0.5;\n                                if (hasWeight) {\n                                    _this2.renderContext.strokeStyle = weightVal > 0 ? 'rgb(0, 0, 255, ' + weightVal + ')' : 'rgb(255, 0, 0, ' + Math.abs(weightVal) + ')';\n                                } else {\n                                    _this2.renderContext.strokeStyle = 'rgba(0,0,0,.5)';\n                                }\n                                _this2.renderContext.moveTo(leftNode.x + leftNode.radius / 2, leftNode.y);\n                                _this2.renderContext.lineTo(node.x - node.radius / 2, node.y);\n                                _this2.renderContext.stroke();\n                            });\n                        }\n                        _this2.renderContext.strokeStyle = 'rgb(' + r + ', ' + g + ', ' + b + ')';\n                        var domainValue = value / (max + min);\n                        if (!isNaN(domainValue)) {\n                            _this2.renderContext.fillStyle = 'rgba(' + r + ', ' + g + ', ' + b + ', ' + domainValue + ')';\n                        } else {\n                            _this2.renderContext.fillStyle = '#FFF';\n                        }\n                        _this2.renderContext.beginPath();\n                        _this2.renderContext.arc(nx, ny, radius / 2, 0, 2 * Math.PI);\n                        if (radius > 3 && nodeStroke) {\n                            _this2.renderContext.stroke();\n                        }\n                        _this2.renderContext.fill();\n\n                        if (renderNode) {\n                            renderNode(_this2.renderContext, node, index);\n                        }\n                    });\n                });\n\n                if (onEndRender) {\n                    onEndRender(_this2);\n                }\n            });\n        }\n    }]);\n\n    return CanvasRenderer;\n}(_abstract2.default);\n\nexports.default = CanvasRenderer;\nmodule.exports = exports['default'];"
    }
  ],
  "filteredModules": 0,
  "logging": {
    "webpack.buildChunkGraph.visitModules": {
      "entries": [],
      "filteredEntries": 2,
      "debug": false
    }
  },
  "children": []
}
