From 374e02642524c22d269508d6f98e04b493f73519 Mon Sep 17 00:00:00 2001 From: Dan Ruta Date: Fri, 23 Mar 2018 10:49:10 +0000 Subject: [PATCH] Bug fix: Misassigned learning rate (WebAssembly) --- CHANGELOG.md | 3 +++ dev/js-WebAssembly/Network.js | 7 ++++--- dev/js/Network.js | 2 +- dist/jsNetJS.concat.js | 2 +- dist/jsNetJS.concat.js.map | 2 +- dist/jsNetJS.min.js | 2 +- dist/jsNetJS.min.js.map | 2 +- dist/jsNetWebAssembly.concat.js | 7 ++++--- dist/jsNetWebAssembly.concat.js.map | 2 +- dist/jsNetWebAssembly.min.js | 2 +- dist/jsNetWebAssembly.min.js.map | 2 +- examples/mnist/mnist.html | 2 +- package.json | 2 +- test/js-test.js | 2 +- test/wa-test.js | 2 +- 15 files changed, 23 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7982635..471de54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ #### Examples - Added example project for loading jsNet through Webpack +#### Bug fixes +- WASM not training on some update functions, due to misassigned learning rate + # 3.3.0 - Misc Improvements --- #### Network diff --git a/dev/js-WebAssembly/Network.js b/dev/js-WebAssembly/Network.js index 4858325..5c7d3f4 100644 --- a/dev/js-WebAssembly/Network.js +++ b/dev/js-WebAssembly/Network.js @@ -161,11 +161,11 @@ class Network { switch (NetUtil.format(updateFn)) { case "rmsprop": - this.learningRate = this.learningRate==undefined ? 0.001 : this.learningRate + this.learningRate = this.learningRate || 0.001 break case "adam": - this.learningRate = this.learningRate==undefined ? 0.01 : this.learningRate + this.learningRate = this.learningRate || 0.01 break case "adadelta": @@ -175,6 +175,7 @@ class Network { case "momentum": NetUtil.defineProperty(this, "momentum", ["number"], [this.netInstance]) + this.learningRate = this.learningRate || 0.2 this.momentum = momentum break @@ -738,7 +739,7 @@ class Network { } static get version () { - return "3.3.1" + return "3.3.3" } } diff --git a/dev/js/Network.js b/dev/js/Network.js index 650b29f..fe908d4 100644 --- a/dev/js/Network.js +++ b/dev/js/Network.js @@ -671,7 +671,7 @@ class Network { } static get version () { - return "3.3.1" + return "3.3.3" } } diff --git a/dist/jsNetJS.concat.js b/dist/jsNetJS.concat.js index 88bdef2..4b86751 100644 --- a/dist/jsNetJS.concat.js +++ b/dist/jsNetJS.concat.js @@ -2169,7 +2169,7 @@ class Network { } static get version () { - return "3.3.1" + return "3.3.3" } } diff --git a/dist/jsNetJS.concat.js.map b/dist/jsNetJS.concat.js.map index 8eb1fd7..7d4cdb4 100644 --- a/dist/jsNetJS.concat.js.map +++ b/dist/jsNetJS.concat.js.map @@ -1 +1 @@ -{"version":3,"sources":["../dev/js/ConvLayer.js","../dev/js/FCLayer.js","../dev/js/Filter.js","../dev/js/InputLayer.js","../dev/js/NetMath.js","../dev/js/NetUtil.js","../dev/js/Network.js","../dev/js/Neuron.js","../dev/js/OutputLayer.js","../dev/js/PoolLayer.js"],"names":[],"mappings":"AAAA,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;AAC3E,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AACjD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AACD,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AACvC,QAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;AACzC,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC/D,gBAAgB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACxC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,gBAAgB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9H,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACvC,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AACD,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,CAAC;AACD,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACrC,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACnC,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3E,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,YAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC3C,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtD,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC7C,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3C,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC7C,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;AACzD,gBAAgB,KAAK,CAAC;AACtB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAY,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;AAChI,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;AAChC,QAAQ,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1H,2DAA2D,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;AAC9E,CAAC;AACD,QAAQ,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,QAAQ,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtF,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACvG,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AAC5J,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;AACxE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACd,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AACD,YAAY,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;AACnF,gBAAgB,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AACtI,YAAY,EAAE,CAAC;AACf,CAAC;AACD,YAAY,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC3H,YAAY,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACtH,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,gBAAgB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;AACzF,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC;AAC1B,gBAAgB,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC7C,gBAAgB,UAAU,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC9E,gBAAgB,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5C,YAAY,EAAE,CAAC;AACf,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC;AACD,QAAQ,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnE,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AACD,YAAY,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC/C,gBAAgB,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;AACpC,gBAAgB,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC/C,gBAAgB,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzC,gBAAgB,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzC,gBAAgB,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrC,gBAAgB,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AAClC,YAAY,EAAE,CAAC;AACf,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAClE,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACtE,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7I,wBAAwB,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAClD,wBAAwB,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7I,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7B,wBAAwB,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrF,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AACD,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;AACzJ,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAC1E,CAAC;AACD,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACrD,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACrE,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACzE,CAAC;AACD,wBAAwB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9G,CAAC;AACD,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAChG,CAAC;AACD,4BAA4B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAC3E,4BAA4B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACpG,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAC1E,gBAAgB,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;AACnG,YAAY,CAAC,CAAC;AACd,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAC1E,CAAC;AACD,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACrD,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACrE,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACzE,wBAAwB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC7F,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAChD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACjE,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5E,wBAAwB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACjD,wBAAwB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5G,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AACpE,QAAQ,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACxC,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjD,YAAY,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACjF,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5E,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACnF,wBAAwB,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACjE,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACrE,oBAAoB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACvE,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9E,wBAAwB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5D,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACjF,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5E,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACnF,CAAC;AACD,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;AACtI,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACvI,CAAC;AACD,wBAAwB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACpF,4BAA4B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC9E,4BAA4B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AACvH,CAAC;AACD,wBAAwB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtI,gEAAgE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;AAC5G,CAAC;AACD,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;AACvH,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;AAC1G,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AACD,YAAY,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AAChD,YAAY,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7D,gBAAgB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,oBAAoB,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAClE,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;AAChD,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7D,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACrE,oBAAoB,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACvF,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,QAAQ,MAAM,CAAC,CAAC,CAAC;AACjB,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,gBAAgB,MAAM,CAAC,CAAC,CAAC;AACzB,oBAAoB,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACvC,oBAAoB,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5C,gBAAgB,CAAC,CAAC;AAClB,YAAY,EAAE,CAAC;AACf,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAClC,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5E,gBAAgB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,OAAO,GAAG,EAAE,IAAI,CAAC;AACrL,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAClF,gBAAgB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,OAAO,GAAG,EAAE,IAAI,CAAC;AAC1L,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC;AAChD,YAAY,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;AACtD,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AAC/B,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,oBAAoB,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;AACxD,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACtB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,IAAI,CAAC;AACpB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACf,CAAC;AACD,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AACD,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,wBAAwB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3D,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,IAAI,CAAC;AACpB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,YAAY,IAAI,EAAE,CAAC;AACnB,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,wBAAwB,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7D,wBAAwB,IAAI,EAAE,CAAC;AAC/B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9C,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC;AACtE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7D,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;ACvXpB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC;AACD,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;AAC1C,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;AACnE,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AACrC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC/D,gBAAgB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACxC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,gBAAgB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9H,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACrC,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACd,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AACD,YAAY,GAAG,CAAC,YAAY,CAAC;AAC7B,CAAC;AACD,YAAY,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACxD,oBAAoB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACvD,oBAAoB,KAAK,CAAC;AAC1B,CAAC;AACD,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC1D,oBAAoB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;AAChG,oBAAoB,KAAK,CAAC;AAC1B,CAAC;AACD,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC1D,oBAAoB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;AACpG,oBAAoB,KAAK,CAAC;AAC1B,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACtF,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC;AAC1B,gBAAgB,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC7C,gBAAgB,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC7D,gBAAgB,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5C,YAAY,EAAE,CAAC;AACf,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACjG,gBAAgB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,gBAAgB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AACzC,CAAC;AACD,gBAAgB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC3E,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAoB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACvE,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACxI,YAAY,CAAC,CAAC;AACd,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAgB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,gBAAgB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AACrD,oBAAoB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC9C,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,oBAAoB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxG,oBAAoB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACrH,6EAA6E,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtG,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC3E,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACjE,oBAAoB,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;AAChF,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;AACjD,YAAY,CAAC,CAAC;AACd,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9E,gBAAgB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9E,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAChH,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACjH,CAAC;AACD,gBAAgB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAC9D,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxD,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AACjG,CAAC;AACD,gBAAgB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;AAC9H,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AACjG,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;AAC1G,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAY,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AAChD,YAAY,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/D,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;AAChD,YAAY,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/D,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,QAAQ,MAAM,CAAC,CAAC,CAAC;AACjB,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,gBAAgB,MAAM,CAAC,CAAC,CAAC;AACzB,oBAAoB,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACvC,oBAAoB,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5C,gBAAgB,CAAC,CAAC;AAClB,YAAY,EAAE,CAAC;AACf,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAClC,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1E,gBAAgB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,OAAO,GAAG,EAAE,IAAI,CAAC;AACpL,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC;AAChD,YAAY,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;AACtD,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AAC/B,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,IAAI,CAAC;AACpB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACf,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,gBAAgB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;AACtD,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,IAAI,CAAC;AACpB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,YAAY,IAAI,EAAE,CAAC;AACnB,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,gBAAgB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/C,gBAAgB,IAAI,EAAE,CAAC;AACvB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AACtB,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACxE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AC9NlC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC;AACD,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;AACtB,CAAC;AACD,IAAI,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AACD,QAAQ,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AAC/F,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAgB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AACtG,gBAAgB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACxG,gBAAgB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5B,YAAY,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5B,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7B,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7B,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,gBAAgB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AACvG,gBAAgB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC3G,gBAAgB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClH,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC5C,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,oBAAoB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AAC5G,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACjH,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxH,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,gBAAgB,KAAK,CAAC;AACtB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACnC,YAAY,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;AACxC,YAAY,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrC,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACzC,QAAQ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAClD,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC9C,QAAQ,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACvD,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,QAAQ,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;ACtEjB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AAC/D,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;;ACVhC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC;AACD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;AAC5B,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpC,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;AAC3C,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACnC,qBAAqB,CAAC,CAAC,GAAG,CAAC;AAC3B,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjC,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACtC,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAChF,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAChD,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjC,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpE,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;AACrF,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1C,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;AACzD,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1D,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtC,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1E,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5D,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxC,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3F,qBAAqB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnF,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AACtB,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3C,QAAQ,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAC5H,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACpD,QAAQ,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;AACvF,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;AACnF,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,oBAAoB,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxD,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;AACxE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;AACjC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5C,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;AACtD,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AACD,QAAQ,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;AAClI,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AAC3D,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,gBAAgB,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,gBAAgB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,gBAAgB,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/F,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,gBAAgB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,MAAM,CAAC;AACtB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AACvG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AAC1H,wFAAwF,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAC7G,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7I,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAChH,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AAC1H,wFAAwF,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAC7G,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACvD,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC;AACD,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AACjI,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9I,YAAY,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AACnI,YAAY,MAAM,CAAC,MAAM,CAAC;AAC1B,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AACvH,YAAY,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACpH,YAAY,MAAM,CAAC,MAAM,CAAC;AAC1B,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,CAAC;AACd,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;AACnG,YAAY,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;AACpF,YAAY,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;AACpB,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACrC,QAAQ,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrD,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,MAAM,CAAC;AACtB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;AACnD,QAAQ,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AACD,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AAC5B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AACD,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AACxF,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,MAAM,CAAC;AACtB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAClD,QAAQ,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;AAClH,mCAAmC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AACxE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACnD,QAAQ,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;AACjG,mCAAmC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AACzE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACzC,QAAQ,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AACnF,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1C,QAAQ,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AAClE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,IAAI,CAAC;AACZ,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AACD,QAAQ,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACrG,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACvD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AACD,gBAAgB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AACpD,gBAAgB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;AACnC,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC1F,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AAC3E,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AACD,wBAAwB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC7H,CAAC;AACD,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAClD,4BAA4B,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,4BAA4B,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;AACtF,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AAClE,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,KAAK,CAAC;AACb,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AACD,QAAQ,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxC,gBAAgB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,YAAY,CAAC;AACxB,QAAQ,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACtD,QAAQ,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACnD,YAAY,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;AACjC,YAAY,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,YAAY,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC;AAC/C,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACxC,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,MAAM,CAAC;AACtB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAC3D,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AAC1D,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3D,QAAQ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AACD,YAAY,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC1E,CAAC;AACD,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,gBAAgB,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACxD,oBAAoB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AAC/G,gBAAgB,EAAE,CAAC;AACnB,YAAY,EAAE,CAAC;AACf,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACzD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AC/RlB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC;AACD,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC3C,QAAQ,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AACD,YAAY,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;AAC3D,gBAAgB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC;AACnE,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC;AACzD,gBAAgB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7C,gBAAgB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,oBAAoB,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,GAAG,EAAE,EAAE,CAAC;AAClE,CAAC;AACD,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5C,oBAAoB,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;AACtF,CAAC;AACD,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;AAChF,CAAC;AACD,oBAAoB,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;AAC5D,oBAAoB,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;AAC5D,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;AAC5C,gBAAgB,KAAK,CAAC;AACtB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,KAAK,CAAC;AACrB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9B,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AACD,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACjD,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AACzC,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,YAAY,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,gBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,gBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnC,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AAClD,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACxE,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,IAAI,CAAC;AACpB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACvB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1C,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AACD,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACvB,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACpD,QAAQ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC;AACD,YAAY,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3B,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,oBAAoB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7D,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACzB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,GAAG,CAAC;AACnB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC;AACD,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AAChE,QAAQ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC;AACD,QAAQ,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAChE,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AACD,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACnC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAY,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;AAC7E,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAC1C,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACtF,gBAAgB,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAChG,gBAAgB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAC9C,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1F,oBAAoB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,oBAAoB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;AAClD,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACnF,wBAAwB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;AACtD,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACvF,4BAA4B,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC1I,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,CAAC;AACD,oBAAoB,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC7J,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAC1D,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAC9D,gBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;AAC9C,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,SAAS,CAAC;AACzB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;AAC/B,QAAQ,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;AAClD,QAAQ,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7D,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AACrE,QAAQ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACnD,YAAY,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACnD,YAAY,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/C,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;AACzF,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AACD,YAAY,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1E,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;AACjE,CAAC;AACD,YAAY,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AAC5D,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClG,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtG,CAAC;AACD,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACtF,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AAC1F,4BAA4B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC5H,gCAAgC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;AACjH,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAQ,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACxC,QAAQ,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtE,CAAC;AACD,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;AACpB,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACzD,YAAY,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACvG,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AACD,QAAQ,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAChE,QAAQ,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,QAAQ,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC;AAC9D,CAAC;AACD,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AACD,YAAY,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC;AACD,YAAY,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;AACrG,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AACD,gBAAgB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAC9G,gBAAgB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC/I,CAAC;AACD,gBAAgB,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;AAC9F,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnG,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvG,CAAC;AACD,wBAAwB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AACtH,CAAC;AACD,wBAAwB,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC;AACtD,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AAClF,4BAA4B,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACtF,gCAAgC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAChH,gCAAgC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACxG,4BAA4B,CAAC,CAAC;AAC9B,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;AAC9E,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAClE,oBAAoB,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAChE,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AACD,QAAQ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAChE,oBAAoB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AACjE,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAChE,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAC5F,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACtG,4BAA4B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;AACxF,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9E,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClF,4BAA4B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACjF,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9E,oBAAoB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAChE,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC5F,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACrG,wBAAwB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AACzF,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACtF,wBAAwB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC/E,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,SAAS,CAAC;AACzB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC;AACD,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,YAAY,QAAQ,CAAC,CAAC,GAAG,CAAC;AAC1B,YAAY,UAAU,CAAC,CAAC,GAAG,CAAC;AAC5B,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC;AACrB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACxD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAClC,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAgB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAC7C,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACpC,oBAAoB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACnD,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAC7C,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,KAAK,CAAC;AACrB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC9B,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/B,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpC,gBAAgB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,YAAY,CAAC,CAAC;AACd,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpC,gBAAgB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACvE,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAChC,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAChD,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtB,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,YAAY,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3B,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,gBAAgB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7C,YAAY,CAAC,CAAC;AACd,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,gBAAgB,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC;AACD,YAAY,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,gBAAgB,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvC,gBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACzF,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;AACrE,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,gBAAgB,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;AAC9C,gBAAgB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;AACjD,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;AAC1C,QAAQ,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AACD,YAAY,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,gBAAgB,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAChD,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;AACxE,CAAC;AACD,YAAY,SAAS,CAAC,IAAI,EAAE,CAAC;AAC7B,gBAAgB,OAAO,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;AAC9C,gBAAgB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;AACjD,YAAY,EAAE,CAAC;AACf,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/B,CAAC;AACD,QAAQ,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;AAC7C,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACtD,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3D,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,IAAI,CAAC;AACpB,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/B,IAAI,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,oBAAoB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;AAC3F,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AAC5G,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AAC5G,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AACjH,CAAC;AACD,YAAY,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChC,YAAY,MAAM,CAAC;AACnB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,CAAC;AACD,QAAQ,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,YAAY,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAClE,YAAY,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,YAAY,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACzE,YAAY,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChE,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,GAAG,CAAC,UAAU,CAAC;AACvB,QAAQ,GAAG,CAAC,gBAAgB,CAAC;AAC7B,CAAC;AACD,QAAQ,EAAE,CAAC,MAAM,CAAC;AAClB,QAAQ,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AAC1C,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC;AACD,YAAY,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AACjC,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AACD,YAAY,EAAE,CAAC,KAAK,CAAC;AACrB,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,gBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACnE,gBAAgB,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;AACnH,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;AAClD,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3C,YAAY,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1C,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;AAC3G,CAAC;AACD,YAAY,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AACjC,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3C,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC;AACD,YAAY,EAAE,CAAC,OAAO,CAAC;AACvB,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,gBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACnE,gBAAgB,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5G,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3C,YAAY,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1C,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC;AACzG,CAAC;AACD,YAAY,EAAE,CAAC,MAAM,CAAC;AACtB,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AACtD,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;AAC1B,QAAQ,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AACD,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;AAC1C,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxC,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;AACjG,QAAQ,CAAC,CAAC;AACV,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AACrC,QAAQ,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;AAC3B,QAAQ,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7C,QAAQ,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;AAC5G,CAAC;AACD,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;AACvC,QAAQ,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxC,QAAQ,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AACD,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;AACxC,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxC,YAAY,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/F,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;AACzC,QAAQ,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACvC,QAAQ,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,QAAQ,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;AAC1G,CAAC;AACD,QAAQ,EAAE,CAAC,KAAK,CAAC;AACjB,QAAQ,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1C,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACzD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AC/gBlB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC;AACD,IAAI,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/H,QAAQ,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;AACpH,CAAC;AACD,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnC,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACzB,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACvB,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACvB,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,QAAQ,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAChD,QAAQ,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5C,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAClB,YAAY,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAClB,YAAY,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACvB,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACjF,YAAY,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;AAC7D,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACvF,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;AACzF,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/E,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3D,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/D,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC/C,QAAQ,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5B,gBAAgB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;AAC7F,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,gBAAgB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;AAC5F,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7B,gBAAgB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;AAC3F,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzC,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7B,gBAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,OAAO,CAAC,CAAC;AACrB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,oBAAoB,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AACD,wBAAwB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,wBAAwB,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACtC,wBAAwB,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACtC,wBAAwB,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;AACpC,4BAA4B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,4BAA4B,KAAK,CAAC;AAClC,CAAC;AACD,wBAAwB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,wBAAwB,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;AAC1C,4BAA4B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACtD,4BAA4B,KAAK,CAAC;AAClC,CAAC;AACD,wBAAwB,OAAO,CAAC,CAAC;AACjC,4BAA4B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC9F,QAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACrD,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACtG,QAAQ,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;AAC3C,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;AACxC,YAAY,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClE,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;AACvE,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAChD,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3D,CAAC;AACD,QAAQ,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;AAChC,QAAQ,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;AAC7D,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACxE,YAAY,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;AACzF,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC5D,YAAY,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpE,YAAY,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,YAAY,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjF,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AAClE,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;AACjE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;AAC1E,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AACD,YAAY,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,gBAAgB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;AACnE,oBAAoB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACxE,oBAAoB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAC/C,oBAAoB,IAAI,CAAC,UAAU,EAAE,CAAC;AACtC,oBAAoB,KAAK,CAAC;AAC1B,CAAC;AACD,gBAAgB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;AAClI,oBAAoB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAC/C,oBAAoB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,oBAAoB,IAAI,CAAC,UAAU,EAAE,CAAC;AACtC,oBAAoB,KAAK,CAAC;AAC1B,CAAC;AACD,gBAAgB,OAAO,CAAC,CAAC;AACzB,oBAAoB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;AAC9F,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACxE,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAChC,gBAAgB,MAAM,CAAC;AACvB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;AAChC,gBAAgB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACpD,gBAAgB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACpH,0EAA0E,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC/F,gBAAgB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAClE,gBAAgB,KAAK,CAAC;AACtB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AACD,QAAQ,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC;AAC/D,QAAQ,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC7G,QAAQ,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACzG,QAAQ,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC/G,CAAC;AACD,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACnC,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AACD,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,QAAQ,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;AAC5F,CAAC;AACD,QAAQ,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,QAAQ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC/D,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AACxD,YAAY,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;AACpE,CAAC;AACD,YAAY,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AAC7D,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,gBAAgB,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;AAC5E,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,YAAY,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC;AAC7D,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACpC,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC;AACzC,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC;AAC7E,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC;AACnE,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;AACjC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,wBAAwB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACjD,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACxB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5D,YAAY,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC;AACvF,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AACrF,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC;AAClE,CAAC;AACD,QAAQ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AAChF,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACpC,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC;AACpE,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjF,YAAY,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;AACnG,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AAChF,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC/C,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;AACxI,CAAC;AACD,QAAQ,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;AAC3H,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACrC,CAAC;AACD,QAAQ,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3B,gBAAgB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACzC,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACvB,gBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC;AACrG,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7D,gBAAgB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvD,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC/C,gBAAgB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;AAClG,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnE,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACnC,gBAAgB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5G,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACrD,oBAAoB,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClE,wBAAwB,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;AAC1C,4BAA4B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACtH,4BAA4B,KAAK,CAAC;AAClC,wBAAwB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AACzC,4BAA4B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,4BAA4B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/E,4BAA4B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAClH,4BAA4B,KAAK,CAAC;AAClC,wBAAwB,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;AAC3C,4BAA4B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAChH,4BAA4B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/E,4BAA4B,KAAK,CAAC;AAClC,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,YAAY,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAY,GAAG,CAAC,OAAO,CAAC;AACxB,YAAY,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACzC,CAAC;AACD,YAAY,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,gBAAgB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1E,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AACpL,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,wBAAwB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC;AAC3D,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3B,oBAAoB,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAChL,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,OAAO,EAAE,CAAC;AAC1B,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC;AAC9B,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,gBAAgB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,gBAAgB,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,gBAAgB,WAAW,EAAE,CAAC;AAC9B,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AACD,gBAAgB,EAAE,CAAC,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;AAC/H,oBAAoB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC;AAC/G,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,GAAG,CAAC,aAAa,CAAC;AAClC,gBAAgB,GAAG,CAAC,eAAe,CAAC;AACpC,CAAC;AACD,gBAAgB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC;AAC5D,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACnD,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;AAChE,CAAC;AACD,gBAAgB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,oBAAoB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnE,oBAAoB,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AACzE,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACvE,oBAAoB,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC;AACtG,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;AACjC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACvG,CAAC;AACD,oBAAoB,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAChF,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5F,wBAAwB,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC7D,wBAAwB,MAAM,CAAC,aAAa,EAAE,CAAC;AAC/C,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AACD,gBAAgB,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,oBAAoB,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7C,oBAAoB,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7C,gBAAgB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/D,oBAAoB,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7C,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1D,gBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC;AAC5C,gBAAgB,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,CAAC;AACD,gBAAgB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACrC,oBAAoB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACtE,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAC3C,wBAAwB,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC9E,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AAChH,oBAAoB,QAAQ,EAAE,CAAC;AAC/B,wBAAwB,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrD,wBAAwB,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACvD,wBAAwB,eAAe,CAAC,CAAC,aAAa,CAAC,CAAC;AACxD,wBAAwB,OAAO,CAAC,CAAC,KAAK,CAAC;AACvC,oBAAoB,EAAE,CAAC;AACvB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,wBAAwB,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7B,wBAAwB,WAAW,EAAE,CAAC;AACtC,oBAAoB,CAAC,CAAC;AACtB,CAAC;AACD,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,oBAAoB,aAAa,EAAE,CAAC;AACpC,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/B,wBAAwB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;AACzG,CAAC;AACD,wBAAwB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC1C,4BAA4B,IAAI,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AAClF,wBAAwB,CAAC,CAAC;AAC1B,CAAC;AACD,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AACvD,4BAA4B,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;AACjF,wBAAwB,CAAC,CAAC;AAC1B,CAAC;AACD,wBAAwB,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACnJ,wBAAwB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1C,oBAAoB,CAAC,CAAC;AACtB,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClD,wBAAwB,OAAO,EAAE,CAAC;AAClC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7B,wBAAwB,aAAa,EAAE,CAAC;AACxC,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACrC,YAAY,OAAO,EAAE,CAAC;AACtB,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,QAAQ,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,YAAY,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,YAAY,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AACD,YAAY,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AACD,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AACzE,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC;AAC9D,CAAC;AACD,gBAAgB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,oBAAoB,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AACzE,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzE,oBAAoB,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC;AACxG,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC;AACnC,gBAAgB,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACnE,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1E,gBAAgB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AACD,gBAAgB,EAAE,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACrD,oBAAoB,UAAU,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AACnF,oBAAoB,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjE,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,YAAY,YAAY,CAAC,eAAe,CAAC,CAAC;AAC1C,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AACD,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACzB,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtD,YAAY,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9B,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;AAC3F,CAAC;AACD,gBAAgB,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7C,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,oBAAoB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1C,oBAAoB,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7C,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,MAAM,CAAC,IAAI,CAAC;AAC5B,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7B,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC1F,oBAAoB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,oBAAoB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACvF,CAAC;AACD,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,wBAAwB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;AAC1D,oBAAoB,CAAC,CAAC;AACtB,CAAC;AACD,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,oBAAoB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;AACpE,oBAAoB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC;AACjH,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,MAAM,CAAC,IAAI,CAAC;AAC5B,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;AAC/B,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC1F,oBAAoB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACvF,CAAC;AACD,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,wBAAwB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;AAC1D,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,oBAAoB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC/I,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,MAAM,CAAC,IAAI,CAAC;AAC5B,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC;AAC7D,QAAQ,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7D,gBAAgB,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC3C,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACvB,gBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AAC/C,YAAY,CAAC,CAAC;AACd,CAAC;AACD,YAAY,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,YAAY,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACzC,CAAC;AACD,YAAY,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AACD,gBAAgB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC;AAC5D,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACnD,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;AAChE,gBAAgB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AACD,gBAAgB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,oBAAoB,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AACzE,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC;AAClG,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,gBAAgB,UAAU,CAAC,EAAE,CAAC,cAAc,CAAC;AAC7C,gBAAgB,cAAc,EAAE,CAAC;AACjC,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACrC,oBAAoB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACnE,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AACnD,oBAAoB,QAAQ,EAAE,CAAC;AAC/B,wBAAwB,UAAU,CAAC,CAAC,cAAc,CAAC,CAAC;AACpD,wBAAwB,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC;AAC/C,wBAAwB,OAAO,CAAC,CAAC,KAAK,CAAC;AACvC,oBAAoB,EAAE,CAAC;AACvB,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvD,oBAAoB,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AACD,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,CAAC;AACD,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/B,wBAAwB,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AACnL,oBAAoB,CAAC,CAAC;AACtB,CAAC;AACD,oBAAoB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACvD,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,YAAY,SAAS,EAAE,CAAC;AACxB,QAAQ,EAAE,CAAC;AACX,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC;AAC5E,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC;AACD,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC;AAC5E,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AACvC,YAAY,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC7D,YAAY,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;AACzC,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,QAAQ,MAAM,CAAC,CAAC,CAAC;AACjB,YAAY,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AAC7D,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;AAC7D,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxD,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,GAAG,CAAC;AACrI,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACjC,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;AACtF,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AACjC,CAAC;AACD,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC;AAC/G,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,YAAY,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACrD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;AACxC,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3C,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AACD,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC;AAC/G,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC;AACD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,YAAY,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;AAC3D,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9D,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,YAAY,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC;AACtG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxE,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5E,oBAAoB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACzI,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/B,YAAY,CAAC,CAAC;AACd,YAAY,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;AAC5E,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5B,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACzD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;ACvqBlB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC;AACD,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;AACtB,CAAC;AACD,IAAI,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AACD,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACzC,QAAQ,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAgB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,gBAAgB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAC9D,gBAAgB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5B,YAAY,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5B,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7B,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7B,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,gBAAgB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrE,gBAAgB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACjE,gBAAgB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AACD,gBAAgB,EAAE,CAAC,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC5C,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,oBAAoB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1E,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACvE,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,gBAAgB,KAAK,CAAC;AACtB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACnC,YAAY,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;AACxC,YAAY,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrC,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/B,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,QAAQ,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACpC,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;ACtEjB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AACD,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AAClC,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACvB,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC;AACD,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;AACxB,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,YAAY,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AACjF,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,gBAAgB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxD,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACjE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;;AC9BlC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACb,CAAC;AACD,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAY,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1H,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,YAAY,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACpC,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACf,CAAC;AACD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AACD,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACzD,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;AACvE,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACrC,CAAC;AACD,QAAQ,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;AACjD,CAAC;AACD,QAAQ,MAAM,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5B,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAClD,gBAAgB,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;AACjG,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9B,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3C,gBAAgB,KAAK,CAAC;AACtB,CAAC;AACD,YAAY,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;AAC9B,gBAAgB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC/C,gBAAgB,KAAK,CAAC;AACtB,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC;AACnD,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,QAAQ,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,YAAY,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,CAAC;AAC5J,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,YAAY,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC3G,QAAQ,EAAE,CAAC;AACX,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACrE,YAAY,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC/G,QAAQ,EAAE,CAAC;AACX,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChG,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AACD,YAAY,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AACD,YAAY,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;AACjC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACnC,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClE,wBAAwB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpI,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;AAClD,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAChE,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAChE,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACpE,oBAAoB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACpE,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AACD,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,wBAAwB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;AACvG,CAAC;AACD,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7F,4BAA4B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AACrG,gEAAgE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;AACtH,wBAAwB,CAAC,CAAC;AAC1B,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AACD,gBAAgB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAChC,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAoB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAgB,CAAC,CAAC;AAClB,CAAC;AACD,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7C,gBAAgB,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AACD,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,CAAC;AACD,wBAAwB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC3E,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,CAAC;AACD,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,CAAC;AACD,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACpE,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC9D,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AACD,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,CAAC;AACD,wBAAwB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACrG,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,CAAC;AACD,QAAQ,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;AAC7B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC/B,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AACD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC3E,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AACD,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,wBAAwB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5F,CAAC;AACD,wBAAwB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9H,oBAAoB,CAAC,CAAC;AACtB,gBAAgB,CAAC,CAAC;AAClB,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,CAAC;AACN,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5B,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5B,CAAC;AACD,IAAI,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3B,CAAC;AACD,IAAI,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5B,CAAC;AACD,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AAC1B,CAAC;AACD,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACnB,CAAC;AACD,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AACD,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AACzB,CAAC;AACD,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAClB,CAAC,CAAC;AACF,CAAC;AACD,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7D,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC","file":"jsNetJS.concat.js","sourcesContent":["\"use strict\"\r\n\r\nclass ConvLayer {\r\n\r\n constructor (size, {filterSize, zeroPadding, stride, activation}={}) {\r\n\r\n if (filterSize) this.filterSize = filterSize\r\n if (stride) this.stride = stride\r\n if (size) this.size = size\r\n\r\n this.zeroPadding = zeroPadding\r\n this.activationName = activation\r\n\r\n if (activation!=undefined) {\r\n\r\n if (typeof activation==\"boolean\" && !activation) {\r\n this.activation = false\r\n } else {\r\n this.activation = typeof activation==\"function\" ? activation : NetMath[NetUtil.format(activation)].bind(this)\r\n }\r\n }\r\n\r\n this.state = \"not-initialised\"\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.prevLayer = layer\r\n\r\n this.layerIndex = layerIndex\r\n this.size = this.size || 4\r\n this.filterSize = this.filterSize || this.net.conv.filterSize || 3\r\n this.stride = this.stride || this.net.conv.stride || 1\r\n\r\n switch (true) {\r\n case layer instanceof FCLayer:\r\n this.channels = this.net.channels ||1\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n this.channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n this.channels = layer.activations.length\r\n break\r\n }\r\n\r\n if (this.zeroPadding==undefined) {\r\n this.zeroPadding = this.net.conv.zeroPadding==undefined ? Math.floor(this.filterSize/2) : this.net.conv.zeroPadding\r\n }\r\n\r\n // Caching calculations\r\n const prevLayerOutWidth = layer instanceof FCLayer ? Math.max(Math.floor(Math.sqrt(layer.size/this.channels)), 1)\r\n : layer.outMapSize\r\n\r\n this.inMapValuesCount = Math.pow(prevLayerOutWidth, 2)\r\n this.inZPMapValuesCount = Math.pow(prevLayerOutWidth + this.zeroPadding*2, 2)\r\n this.outMapSize = (prevLayerOutWidth - this.filterSize + 2*this.zeroPadding) / this.stride + 1\r\n\r\n if (this.outMapSize%1!=0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${this.outMapSize} in conv layer at index ${layerIndex}`)\r\n }\r\n\r\n this.filters = [...new Array(this.size)].map(f => new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach(filter => {\r\n\r\n filter.weights = [...new Array(this.channels)].map(channelWeights => {\r\n return [...new Array(this.filterSize)].map(weightsRow => this.net.weightsInitFn(this.filterSize, this.weightsConfig))\r\n })\r\n\r\n filter.activationMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.errorMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.bias = 1\r\n\r\n if (this.net.dropout != 1) {\r\n filter.dropoutMap = filter.activationMap.map(row => row.map(v => false))\r\n }\r\n\r\n filter.init({\r\n updateFn: this.net.updateFn,\r\n activation: this.activationName || this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let filterI=0; filterI this.net.dropout)) {\r\n filter.activationMap[sumY][sumX] = 0\r\n } else if (this.activation) {\r\n filter.activationMap[sumY][sumX] = this.activation(filter.sumMap[sumY][sumX], false, filter) / (this.net.dropout||1)\r\n } else {\r\n filter.activationMap[sumY][sumX] = filter.sumMap[sumY][sumX]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n backward () {\r\n\r\n // First, get the filters' error maps\r\n if (this.nextLayer instanceof FCLayer) {\r\n\r\n // For each filter, build the errorMap from the weighted neuron errors in the next FCLayer corresponding to each value in the activation map\r\n for (let filterI=0; filterI 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n filter.weights[channel][row][col] = this.net.weightUpdateFn.bind(this.net, filter.weights[channel][row][col],\r\n regularized, filter, [channel, row, col])()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += filter.weights[channel][row][col]**2\r\n }\r\n }\r\n }\r\n\r\n filter.bias = this.net.weightUpdateFn.bind(this.net, filter.bias, filter.deltaBias, filter)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let f=0; f {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.state = \"not-initialised\"\r\n\r\n if (activation!=undefined) {\r\n if (typeof activation==\"boolean\" && !activation) {\r\n this.activation = false\r\n } else {\r\n this.activation = typeof activation==\"function\" ? activation : NetMath[NetUtil.format(activation)].bind(this)\r\n }\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n }\r\n\r\n init () {\r\n this.neurons.forEach(neuron => {\r\n\r\n let weightsCount\r\n\r\n switch (true) {\r\n case this.prevLayer instanceof FCLayer:\r\n weightsCount = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n weightsCount = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n weightsCount = this.prevLayer.activations.length * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.weights = this.net.weightsInitFn(weightsCount, this.weightsConfig)\r\n neuron.bias = 1\r\n\r\n neuron.init({\r\n updateFn: this.net.updateFn,\r\n activationConfig: this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n this.neurons.forEach((neuron, ni) => {\r\n if (this.state==\"training\" && (neuron.dropped = Math.random() > this.net.dropout)) {\r\n neuron.activation = 0\r\n } else {\r\n neuron.sum = neuron.bias\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let ai=0; ai {\r\n\r\n if (neuron.dropped) {\r\n neuron.error = 0\r\n neuron.deltaBias += 0\r\n } else {\r\n if (typeof errors !== \"undefined\") {\r\n neuron.error = errors[ni]\r\n } else {\r\n neuron.derivative = this.activation ? this.activation(neuron.sum, true, neuron) : 1\r\n neuron.error = neuron.derivative * this.nextLayer.neurons.map(n => n.error * (n.weights[ni]||0))\r\n .reduce((p,c) => p+c, 0)\r\n }\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let wi=0; wi 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n neuron.weights[dwi] = this.net.weightUpdateFn.bind(this.net, neuron.weights[dwi], regularized, neuron, dwi)()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += neuron.weights[dwi]**2\r\n }\r\n\r\n neuron.bias = this.net.weightUpdateFn.bind(this.net, neuron.bias, neuron.deltaBias, neuron)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let n=0; n {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=neuron.weights.length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let n=0; n channel.map(wRow => wRow.map(w => 0)))\r\n this.deltaBias = 0\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = this.weights.map(channel => channel.map(wRow => wRow.map(w => 1)))\r\n this.getWeightGain = ([channel, row, column]) => this.weightGains[channel][row][column]\r\n this.setWeightGain = ([channel, row, column], v) => this.weightGains[channel][row][column] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getWeightsCache = ([channel, row, column]) => this.weightsCache[channel][row][column]\r\n this.setWeightsCache = ([channel, row, column], v) => this.weightsCache[channel][row][column] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getAdadeltaCache = ([channel, row, column]) => this.adadeltaCache[channel][row][column]\r\n this.setAdadeltaCache = ([channel, row, column], v) => this.adadeltaCache[channel][row][column] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight ([channel, row, column]) {\r\n return this.weights[channel][row][column]\r\n }\r\n\r\n setWeight ([channel, row, column], v) {\r\n this.weights[channel][row][column] = v\r\n }\r\n\r\n getDeltaWeight ([channel, row, column]) {\r\n return this.deltaWeights[channel][row][column]\r\n }\r\n\r\n setDeltaWeight ([channel, row, column], v) {\r\n this.deltaWeights[channel][row][column] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Filter = Filter)\r\nexports.Filter = Filter","\"use strict\"\r\n\r\nclass InputLayer extends FCLayer {\r\n constructor (size, {span=1}={}) {\r\n super(size * span*span)\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.InputLayer = InputLayer)\r\nexports.InputLayer = InputLayer\r\n","\"use strict\"\r\n\r\nclass NetMath {\r\n\r\n // Activation functions\r\n static sigmoid (value, prime) {\r\n const val = 1/(1+Math.exp(-value))\r\n return prime ? val*(1-val)\r\n : val\r\n }\r\n\r\n static tanh (value, prime) {\r\n const exp = Math.exp(2*value)\r\n return prime ? 4/Math.pow(Math.exp(value)+Math.exp(-value), 2) || 1e-18\r\n : (exp-1)/(exp+1) || 1e-18\r\n }\r\n\r\n static relu (value, prime) {\r\n return prime ? value > 0 ? 1 : 0\r\n : Math.max(value, 0)\r\n }\r\n\r\n static lrelu (value, prime) {\r\n return prime ? value > 0 ? 1 : (this.lreluSlope || -0.0005)\r\n : Math.max((this.lreluSlope || -0.0005)*Math.abs(value), value)\r\n }\r\n\r\n static rrelu (value, prime, neuron) {\r\n return prime ? value > 0 ? 1 : neuron.rreluSlope\r\n : Math.max(neuron.rreluSlope, value)\r\n }\r\n\r\n static lecuntanh (value, prime) {\r\n return prime ? 1.15333 * Math.pow(NetMath.sech((2/3) * value), 2)\r\n : 1.7159 * NetMath.tanh((2/3) * value)\r\n }\r\n\r\n static elu (value, prime, neuron) {\r\n return prime ? value >=0 ? 1 : NetMath.elu(value, false, neuron) + neuron.eluAlpha\r\n : value >=0 ? value : neuron.eluAlpha * (Math.exp(value) - 1)\r\n }\r\n\r\n // Cost functions\r\n static crossentropy (target, output) {\r\n return output.map((value, vi) => target[vi] * Math.log(value+1e-15) + ((1-target[vi]) * Math.log((1+1e-15)-value)))\r\n .reduce((p,c) => p-c, 0)\r\n }\r\n\r\n static meansquarederror (calculated, desired) {\r\n return calculated.map((output, index) => Math.pow(output - desired[index], 2))\r\n .reduce((prev, curr) => prev+curr, 0) / calculated.length\r\n }\r\n\r\n static rootmeansquarederror (calculated, desired) {\r\n return Math.sqrt(NetMath.meansquarederror(calculated, desired))\r\n }\r\n\r\n // Weight updating functions\r\n static vanillasgd (value, deltaValue) {\r\n return value + this.learningRate * deltaValue\r\n }\r\n\r\n static gain (value, deltaValue, neuron, weightI) {\r\n\r\n const newVal = value + this.learningRate * deltaValue * (weightI==null ? neuron.biasGain : neuron.getWeightGain(weightI))\r\n\r\n if (newVal<=0 && value>0 || newVal>=0 && value<0){\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.max(neuron.getWeightGain(weightI)*0.95, 0.5))\r\n } else {\r\n neuron.biasGain = Math.max(neuron.biasGain*0.95, 0.5)\r\n }\r\n } else {\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.min(neuron.getWeightGain(weightI)+0.05, 5))\r\n } else {\r\n neuron.biasGain = Math.min(neuron.biasGain+0.05, 5)\r\n }\r\n }\r\n\r\n return newVal\r\n }\r\n\r\n static adagrad (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, neuron.getWeightsCache(weightI) + Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache += Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static rmsprop (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rmsDecay * neuron.getWeightsCache(weightI) + (1 - this.rmsDecay) * Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache = this.rmsDecay * neuron.biasCache + (1 - this.rmsDecay) * Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static adam (value, deltaValue, neuron) {\r\n\r\n neuron.m = 0.9*neuron.m + (1-0.9) * deltaValue\r\n const mt = neuron.m / (1-Math.pow(0.9, this.iterations + 1))\r\n\r\n neuron.v = 0.999*neuron.v + (1-0.999) * Math.pow(deltaValue, 2)\r\n const vt = neuron.v / (1-Math.pow(0.999, this.iterations + 1))\r\n\r\n return value + this.learningRate * mt / (Math.sqrt(vt) + 1e-8)\r\n }\r\n\r\n static adadelta (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rho * neuron.getWeightsCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n const newVal = value + Math.sqrt((neuron.getAdadeltaCache(weightI) + 1e-6)/(neuron.getWeightsCache(weightI) + 1e-6)) * deltaValue\r\n neuron.setAdadeltaCache(weightI, this.rho * neuron.getAdadeltaCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n return newVal\r\n\r\n } else {\r\n neuron.biasCache = this.rho * neuron.biasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n const newVal = value + Math.sqrt((neuron.adadeltaBiasCache + 1e-6)/(neuron.biasCache + 1e-6)) * deltaValue\r\n neuron.adadeltaBiasCache = this.rho * neuron.adadeltaBiasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n return newVal\r\n }\r\n }\r\n\r\n static momentum (value, deltaValue, neuron, weightI) {\r\n\r\n let v\r\n\r\n if (weightI!=null) {\r\n v = this.momentum * (neuron.getWeightsCache(weightI)) - this.learningRate * deltaValue\r\n neuron.setWeightsCache(weightI, v)\r\n } else {\r\n v = this.momentum * (neuron.biasCache) - this.learningRate * deltaValue\r\n neuron.biasCache = v\r\n }\r\n\r\n return value - v\r\n }\r\n\r\n // Weights init\r\n static uniform (size, {limit}) {\r\n const values = []\r\n\r\n for (let i=0; i= 1 || !r)\r\n\r\n values.push(mean + (x1 * (Math.sqrt(-2 * Math.log(r) / r))) * stdDeviation)\r\n }\r\n\r\n return values\r\n }\r\n\r\n static xaviernormal (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(2/(fanIn+fanOut))})\r\n : NetMath.lecunnormal(size, {fanIn})\r\n }\r\n\r\n static xavieruniform (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.uniform(size, {limit: Math.sqrt(6/(fanIn+fanOut))})\r\n : NetMath.lecununiform(size, {fanIn})\r\n }\r\n\r\n static lecunnormal (size, {fanIn}) {\r\n return NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(1/fanIn)})\r\n }\r\n\r\n static lecununiform (size, {fanIn}) {\r\n return NetMath.uniform(size, {limit: Math.sqrt(3/fanIn)})\r\n }\r\n\r\n // Pool\r\n static maxPool (layer, channel) {\r\n\r\n const activations = NetUtil.getActivations(layer.prevLayer, channel, layer.inMapValuesCount)\r\n\r\n for (let row=0; row activation) {\r\n activation = value\r\n layer.indeces[channel][row][col] = [filterRow, filterCol]\r\n }\r\n }\r\n }\r\n\r\n layer.activations[channel][row][col] = activation\r\n }\r\n }\r\n }\r\n\r\n // Other\r\n static softmax (v) {\r\n\r\n const values = v.slice(0)\r\n let maxValue = values[0]\r\n\r\n for (let i=1; i maxValue) {\r\n maxValue = values[i]\r\n }\r\n }\r\n\r\n // Exponentials\r\n const exponentials = new Array(values.length)\r\n let exponentialsSum = 0.0\r\n\r\n for (let i=0; i p+c) / arr.length\r\n const diffs = arr.map(v => v - avg).map(v => v**2)\r\n return Math.sqrt(diffs.reduce((p,c) => p+c) / diffs.length)\r\n }\r\n\r\n static maxNorm () {\r\n\r\n if (this.maxNormTotal > this.maxNorm) {\r\n\r\n const multiplier = this.maxNorm / (1e-18 + this.maxNormTotal)\r\n\r\n this.layers.forEach((layer, li) => {\r\n li && layer.neurons.forEach(neuron => {\r\n neuron.weights.forEach((w, wi) => neuron.setWeight(wi, neuron.getWeight(wi) * multiplier))\r\n })\r\n })\r\n }\r\n\r\n this.maxNormTotal = 0\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.NetMath = NetMath)\r\nexports.NetMath = NetMath","\"use strict\"\r\n\r\nclass NetUtil {\r\n\r\n static format (value, type=\"string\") {\r\n switch (true) {\r\n\r\n case type==\"string\" && typeof value==\"string\":\r\n value = value.replace(/(_|\\s)/g, \"\").toLowerCase()\r\n break\r\n\r\n case type==\"time\" && typeof value==\"number\":\r\n const date = new Date(value)\r\n const formatted = []\r\n\r\n if (value < 1000) {\r\n formatted.push(`${date.getMilliseconds()}ms`)\r\n\r\n } else if (value < 60000) {\r\n formatted.push(`${date.getSeconds()}.${date.getMilliseconds()}s`)\r\n\r\n } else {\r\n\r\n if (value >= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static addZeroPadding (map, zP) {\r\n\r\n const data = []\r\n\r\n for (let row=0; row 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; i {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.state = \"constructed\"\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.state = \"constructed\"\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n }\r\n }\r\n\r\n this.collectedErrors = {training: [], validation: [], test: []}\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n switch (this.state) {\r\n\r\n case \"initialised\":\r\n return\r\n\r\n case \"not-defined\":\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n break\r\n }\r\n\r\n this.layers.forEach(this.joinLayer.bind(this))\r\n\r\n const outSize = this.layers[this.layers.length-1].size\r\n this.trainingConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.testConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.validationConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n\r\n this.state = \"initialised\"\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.activation = layer.activation==undefined ? this.activation : layer.activation\r\n\r\n layer.weightsConfig = {}\r\n Object.assign(layer.weightsConfig, this.weightsConfig)\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n\r\n layer.weightsConfig.fanIn = layer.prevLayer.size\r\n\r\n if (layerIndex 1) {\r\n layer.weightsConfig.fanOut = this.layers[1].size\r\n }\r\n\r\n layer.state = \"initialised\"\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c neuron.activation = data[ni])\r\n this.layers.forEach((layer, li) => li && layer.forward())\r\n\r\n return this.layers[this.layers.length-1].neurons.map(n => n.activation)\r\n }\r\n\r\n backward (errors) {\r\n\r\n if (errors === undefined) {\r\n throw new Error(\"No data passed to Network.backward()\")\r\n }\r\n\r\n if (errors.length != this.layers[this.layers.length-1].neurons.length) {\r\n console.warn(\"Expected data length did not match output layer neurons count.\", errors)\r\n }\r\n\r\n this.layers[this.layers.length-1].backward(errors)\r\n\r\n for (let layerIndex=this.layers.length-2; layerIndex>0; layerIndex--) {\r\n this.layers[layerIndex].backward()\r\n }\r\n }\r\n\r\n train (dataSet, {epochs=1, callback, callbackInterval=1, collectErrors, log=true, miniBatchSize=1, shuffle=false, validation}={}) {\r\n\r\n this.miniBatchSize = typeof miniBatchSize==\"boolean\" && miniBatchSize ? dataSet[0].expected.length : miniBatchSize\r\n this.validation = validation\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if (shuffle) {\r\n NetUtil.shuffle(dataSet)\r\n }\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch Size: ${this.miniBatchSize}`)\r\n }\r\n\r\n if (dataSet === undefined || dataSet === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers.bind(this, dataSet[0].input.length, dataSet[0].expected.length)()\r\n }\r\n\r\n this.layers.forEach(layer => layer.state = \"training\")\r\n\r\n if (this.validation) {\r\n this.validation.interval = this.validation.interval || dataSet.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = Infinity\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.validation.earlyStopping.bestError = Infinity\r\n break\r\n }\r\n }\r\n }\r\n\r\n let iterationIndex = 0\r\n let epochsCounter = 0\r\n let elapsed\r\n const startTime = Date.now()\r\n\r\n const logAndResolve = () => {\r\n this.layers.forEach(layer => layer.state = \"initialised\")\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n for (let l=1; l {\r\n this.epochs++\r\n this.error = 0\r\n this.validationError = 0\r\n iterationIndex = 0\r\n\r\n if (this.l2Error!=undefined) this.l2Error = 0\r\n if (this.l1Error!=undefined) this.l1Error = 0\r\n\r\n doIteration()\r\n }\r\n\r\n const doIteration = async () => {\r\n\r\n if (!dataSet[iterationIndex].hasOwnProperty(\"input\") || !dataSet[iterationIndex].hasOwnProperty(\"expected\")) {\r\n return void reject(\"Data set must be a list of objects with keys: 'input' and 'expected'\")\r\n }\r\n\r\n let trainingError\r\n let validationError\r\n\r\n const input = dataSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = dataSet[iterationIndex].expected\r\n\r\n let classification = -Infinity\r\n const errors = []\r\n for (let n=0; n= dataSet.length) {\r\n this.applyDeltaWeights()\r\n }\r\n\r\n trainingError = this.cost(target, output)\r\n this.error += trainingError\r\n this.iterations++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (collectErrors) {\r\n this.collectedErrors.training.push(trainingError)\r\n\r\n if (validationError) {\r\n this.collectedErrors.validation.push(validationError)\r\n }\r\n }\r\n\r\n if ((iterationIndex%callbackInterval == 0 || validationError) && typeof callback==\"function\") {\r\n callback({\r\n iterations: this.iterations,\r\n validations: this.validations,\r\n validationError, trainingError,\r\n elapsed, input\r\n })\r\n }\r\n\r\n if (iterationIndex < dataSet.length) {\r\n\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n\r\n } else {\r\n epochsCounter++\r\n\r\n if (log) {\r\n let text = `Epoch: ${this.epochs}\\nTraining Error: ${this.error/iterationIndex}`\r\n\r\n if (validation) {\r\n text += `\\nValidation Error: ${this.validationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochsCounter, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochsCounter < epochs) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n\r\n this.resetDeltaWeights()\r\n doEpoch()\r\n })\r\n }\r\n\r\n validate (data) {\r\n return new Promise((resolve, reject) => {\r\n let validationIndex = 0\r\n let totalValidationErrors = 0\r\n\r\n const validateItem = (item) => {\r\n\r\n const output = this.forward(data[validationIndex].input)\r\n const target = data[validationIndex].expected\r\n\r\n let classification = -Infinity\r\n for (let i=0; i validateItem(validationIndex), 0)\r\n } else {\r\n this.lastValidationError = totalValidationErrors / data.length\r\n resolve(totalValidationErrors / data.length)\r\n }\r\n }\r\n validateItem(validationIndex)\r\n })\r\n }\r\n\r\n checkEarlyStopping (errors) {\r\n\r\n let stop = false\r\n\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n stop = this.lastValidationError <= this.validation.earlyStopping.threshold\r\n\r\n // Do the last backward pass\r\n if (stop) {\r\n this.backward(errors)\r\n this.applyDeltaWeights()\r\n }\r\n\r\n return stop\r\n\r\n case \"patience\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l=this.validation.earlyStopping.patience\r\n }\r\n return stop\r\n\r\n case \"divergence\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l= (1+this.validation.earlyStopping.percent/100)\r\n }\r\n\r\n return stop\r\n }\r\n }\r\n\r\n test (testSet, {log=true, callback, collectErrors}={}) {\r\n return new Promise((resolve, reject) => {\r\n\r\n if (testSet === undefined || testSet === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n let totalError = 0\r\n let iterationIndex = 0\r\n const startTime = Date.now()\r\n\r\n const testInput = () => {\r\n\r\n const input = testSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = testSet[iterationIndex].expected\r\n const elapsed = Date.now() - startTime\r\n\r\n let classification = -Infinity\r\n for (let i=0; i li && layer.resetDeltaWeights())\r\n }\r\n\r\n applyDeltaWeights () {\r\n\r\n this.layers.forEach((layer, li) => li && layer.applyDeltaWeights())\r\n\r\n if (this.maxNorm!=undefined) {\r\n this.maxNormTotal = Math.sqrt(this.maxNormTotal)\r\n NetMath.maxNorm.bind(this)()\r\n }\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.resetDeltaWeights()\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l 0)\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = [...new Array(size)].map(v => 1)\r\n this.getWeightGain = i => this.weightGains[i]\r\n this.setWeightGain = (i,v) => this.weightGains[i] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = [...new Array(size)].map(v => 0)\r\n this.getWeightsCache = i => this.weightsCache[i]\r\n this.setWeightsCache = (i,v) => this.weightsCache[i] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = [...new Array(size)].map(v => 0)\r\n this.getAdadeltaCache = i => this.adadeltaCache[i]\r\n this.setAdadeltaCache = (i,v) => this.adadeltaCache[i] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight (i) {\r\n return this.weights[i]\r\n }\r\n\r\n setWeight (i, v) {\r\n this.weights[i] = v\r\n }\r\n\r\n getDeltaWeight (i) {\r\n return this.deltaWeights[i]\r\n }\r\n\r\n setDeltaWeight (i, v) {\r\n this.deltaWeights[i] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron","\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n\r\n forward () {\r\n\r\n super.forward()\r\n\r\n if (this.softmax) {\r\n\r\n const softmax = NetMath.softmax(this.neurons.map(n => n.activation))\r\n\r\n for (let s=0; s {\r\n return [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n })\r\n this.errors = [...new Array(this.channels)].map(channel => {\r\n return [...new Array(prevLayerOutWidth)].map(row => [...new Array(prevLayerOutWidth)].map(v => 0))\r\n })\r\n this.indeces = this.activations.map(channel => channel.map(row => row.map(v => [0,0])))\r\n }\r\n\r\n forward () {\r\n for (let channel=0; channel new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach(filter => {\r\n\r\n filter.weights = [...new Array(this.channels)].map(channelWeights => {\r\n return [...new Array(this.filterSize)].map(weightsRow => this.net.weightsInitFn(this.filterSize, this.weightsConfig))\r\n })\r\n\r\n filter.activationMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.errorMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.bias = 1\r\n\r\n if (this.net.dropout != 1) {\r\n filter.dropoutMap = filter.activationMap.map(row => row.map(v => false))\r\n }\r\n\r\n filter.init({\r\n updateFn: this.net.updateFn,\r\n activation: this.activationName || this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let filterI=0; filterI this.net.dropout)) {\r\n filter.activationMap[sumY][sumX] = 0\r\n } else if (this.activation) {\r\n filter.activationMap[sumY][sumX] = this.activation(filter.sumMap[sumY][sumX], false, filter) / (this.net.dropout||1)\r\n } else {\r\n filter.activationMap[sumY][sumX] = filter.sumMap[sumY][sumX]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n backward () {\r\n\r\n // First, get the filters' error maps\r\n if (this.nextLayer instanceof FCLayer) {\r\n\r\n // For each filter, build the errorMap from the weighted neuron errors in the next FCLayer corresponding to each value in the activation map\r\n for (let filterI=0; filterI 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n filter.weights[channel][row][col] = this.net.weightUpdateFn.bind(this.net, filter.weights[channel][row][col],\r\n regularized, filter, [channel, row, col])()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += filter.weights[channel][row][col]**2\r\n }\r\n }\r\n }\r\n\r\n filter.bias = this.net.weightUpdateFn.bind(this.net, filter.bias, filter.deltaBias, filter)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let f=0; f {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.state = \"not-initialised\"\r\n\r\n if (activation!=undefined) {\r\n if (typeof activation==\"boolean\" && !activation) {\r\n this.activation = false\r\n } else {\r\n this.activation = typeof activation==\"function\" ? activation : NetMath[NetUtil.format(activation)].bind(this)\r\n }\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n }\r\n\r\n init () {\r\n this.neurons.forEach(neuron => {\r\n\r\n let weightsCount\r\n\r\n switch (true) {\r\n case this.prevLayer instanceof FCLayer:\r\n weightsCount = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n weightsCount = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n weightsCount = this.prevLayer.activations.length * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.weights = this.net.weightsInitFn(weightsCount, this.weightsConfig)\r\n neuron.bias = 1\r\n\r\n neuron.init({\r\n updateFn: this.net.updateFn,\r\n activationConfig: this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n this.neurons.forEach((neuron, ni) => {\r\n if (this.state==\"training\" && (neuron.dropped = Math.random() > this.net.dropout)) {\r\n neuron.activation = 0\r\n } else {\r\n neuron.sum = neuron.bias\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let ai=0; ai {\r\n\r\n if (neuron.dropped) {\r\n neuron.error = 0\r\n neuron.deltaBias += 0\r\n } else {\r\n if (typeof errors !== \"undefined\") {\r\n neuron.error = errors[ni]\r\n } else {\r\n neuron.derivative = this.activation ? this.activation(neuron.sum, true, neuron) : 1\r\n neuron.error = neuron.derivative * this.nextLayer.neurons.map(n => n.error * (n.weights[ni]||0))\r\n .reduce((p,c) => p+c, 0)\r\n }\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let wi=0; wi 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n neuron.weights[dwi] = this.net.weightUpdateFn.bind(this.net, neuron.weights[dwi], regularized, neuron, dwi)()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += neuron.weights[dwi]**2\r\n }\r\n\r\n neuron.bias = this.net.weightUpdateFn.bind(this.net, neuron.bias, neuron.deltaBias, neuron)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let n=0; n {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=neuron.weights.length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let n=0; n channel.map(wRow => wRow.map(w => 0)))\r\n this.deltaBias = 0\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = this.weights.map(channel => channel.map(wRow => wRow.map(w => 1)))\r\n this.getWeightGain = ([channel, row, column]) => this.weightGains[channel][row][column]\r\n this.setWeightGain = ([channel, row, column], v) => this.weightGains[channel][row][column] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getWeightsCache = ([channel, row, column]) => this.weightsCache[channel][row][column]\r\n this.setWeightsCache = ([channel, row, column], v) => this.weightsCache[channel][row][column] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getAdadeltaCache = ([channel, row, column]) => this.adadeltaCache[channel][row][column]\r\n this.setAdadeltaCache = ([channel, row, column], v) => this.adadeltaCache[channel][row][column] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight ([channel, row, column]) {\r\n return this.weights[channel][row][column]\r\n }\r\n\r\n setWeight ([channel, row, column], v) {\r\n this.weights[channel][row][column] = v\r\n }\r\n\r\n getDeltaWeight ([channel, row, column]) {\r\n return this.deltaWeights[channel][row][column]\r\n }\r\n\r\n setDeltaWeight ([channel, row, column], v) {\r\n this.deltaWeights[channel][row][column] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Filter = Filter)\r\nexports.Filter = Filter","\"use strict\"\r\n\r\nclass InputLayer extends FCLayer {\r\n constructor (size, {span=1}={}) {\r\n super(size * span*span)\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.InputLayer = InputLayer)\r\nexports.InputLayer = InputLayer\r\n","\"use strict\"\r\n\r\nclass NetMath {\r\n\r\n // Activation functions\r\n static sigmoid (value, prime) {\r\n const val = 1/(1+Math.exp(-value))\r\n return prime ? val*(1-val)\r\n : val\r\n }\r\n\r\n static tanh (value, prime) {\r\n const exp = Math.exp(2*value)\r\n return prime ? 4/Math.pow(Math.exp(value)+Math.exp(-value), 2) || 1e-18\r\n : (exp-1)/(exp+1) || 1e-18\r\n }\r\n\r\n static relu (value, prime) {\r\n return prime ? value > 0 ? 1 : 0\r\n : Math.max(value, 0)\r\n }\r\n\r\n static lrelu (value, prime) {\r\n return prime ? value > 0 ? 1 : (this.lreluSlope || -0.0005)\r\n : Math.max((this.lreluSlope || -0.0005)*Math.abs(value), value)\r\n }\r\n\r\n static rrelu (value, prime, neuron) {\r\n return prime ? value > 0 ? 1 : neuron.rreluSlope\r\n : Math.max(neuron.rreluSlope, value)\r\n }\r\n\r\n static lecuntanh (value, prime) {\r\n return prime ? 1.15333 * Math.pow(NetMath.sech((2/3) * value), 2)\r\n : 1.7159 * NetMath.tanh((2/3) * value)\r\n }\r\n\r\n static elu (value, prime, neuron) {\r\n return prime ? value >=0 ? 1 : NetMath.elu(value, false, neuron) + neuron.eluAlpha\r\n : value >=0 ? value : neuron.eluAlpha * (Math.exp(value) - 1)\r\n }\r\n\r\n // Cost functions\r\n static crossentropy (target, output) {\r\n return output.map((value, vi) => target[vi] * Math.log(value+1e-15) + ((1-target[vi]) * Math.log((1+1e-15)-value)))\r\n .reduce((p,c) => p-c, 0)\r\n }\r\n\r\n static meansquarederror (calculated, desired) {\r\n return calculated.map((output, index) => Math.pow(output - desired[index], 2))\r\n .reduce((prev, curr) => prev+curr, 0) / calculated.length\r\n }\r\n\r\n static rootmeansquarederror (calculated, desired) {\r\n return Math.sqrt(NetMath.meansquarederror(calculated, desired))\r\n }\r\n\r\n // Weight updating functions\r\n static vanillasgd (value, deltaValue) {\r\n return value + this.learningRate * deltaValue\r\n }\r\n\r\n static gain (value, deltaValue, neuron, weightI) {\r\n\r\n const newVal = value + this.learningRate * deltaValue * (weightI==null ? neuron.biasGain : neuron.getWeightGain(weightI))\r\n\r\n if (newVal<=0 && value>0 || newVal>=0 && value<0){\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.max(neuron.getWeightGain(weightI)*0.95, 0.5))\r\n } else {\r\n neuron.biasGain = Math.max(neuron.biasGain*0.95, 0.5)\r\n }\r\n } else {\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.min(neuron.getWeightGain(weightI)+0.05, 5))\r\n } else {\r\n neuron.biasGain = Math.min(neuron.biasGain+0.05, 5)\r\n }\r\n }\r\n\r\n return newVal\r\n }\r\n\r\n static adagrad (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, neuron.getWeightsCache(weightI) + Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache += Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static rmsprop (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rmsDecay * neuron.getWeightsCache(weightI) + (1 - this.rmsDecay) * Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache = this.rmsDecay * neuron.biasCache + (1 - this.rmsDecay) * Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static adam (value, deltaValue, neuron) {\r\n\r\n neuron.m = 0.9*neuron.m + (1-0.9) * deltaValue\r\n const mt = neuron.m / (1-Math.pow(0.9, this.iterations + 1))\r\n\r\n neuron.v = 0.999*neuron.v + (1-0.999) * Math.pow(deltaValue, 2)\r\n const vt = neuron.v / (1-Math.pow(0.999, this.iterations + 1))\r\n\r\n return value + this.learningRate * mt / (Math.sqrt(vt) + 1e-8)\r\n }\r\n\r\n static adadelta (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rho * neuron.getWeightsCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n const newVal = value + Math.sqrt((neuron.getAdadeltaCache(weightI) + 1e-6)/(neuron.getWeightsCache(weightI) + 1e-6)) * deltaValue\r\n neuron.setAdadeltaCache(weightI, this.rho * neuron.getAdadeltaCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n return newVal\r\n\r\n } else {\r\n neuron.biasCache = this.rho * neuron.biasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n const newVal = value + Math.sqrt((neuron.adadeltaBiasCache + 1e-6)/(neuron.biasCache + 1e-6)) * deltaValue\r\n neuron.adadeltaBiasCache = this.rho * neuron.adadeltaBiasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n return newVal\r\n }\r\n }\r\n\r\n static momentum (value, deltaValue, neuron, weightI) {\r\n\r\n let v\r\n\r\n if (weightI!=null) {\r\n v = this.momentum * (neuron.getWeightsCache(weightI)) - this.learningRate * deltaValue\r\n neuron.setWeightsCache(weightI, v)\r\n } else {\r\n v = this.momentum * (neuron.biasCache) - this.learningRate * deltaValue\r\n neuron.biasCache = v\r\n }\r\n\r\n return value - v\r\n }\r\n\r\n // Weights init\r\n static uniform (size, {limit}) {\r\n const values = []\r\n\r\n for (let i=0; i= 1 || !r)\r\n\r\n values.push(mean + (x1 * (Math.sqrt(-2 * Math.log(r) / r))) * stdDeviation)\r\n }\r\n\r\n return values\r\n }\r\n\r\n static xaviernormal (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(2/(fanIn+fanOut))})\r\n : NetMath.lecunnormal(size, {fanIn})\r\n }\r\n\r\n static xavieruniform (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.uniform(size, {limit: Math.sqrt(6/(fanIn+fanOut))})\r\n : NetMath.lecununiform(size, {fanIn})\r\n }\r\n\r\n static lecunnormal (size, {fanIn}) {\r\n return NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(1/fanIn)})\r\n }\r\n\r\n static lecununiform (size, {fanIn}) {\r\n return NetMath.uniform(size, {limit: Math.sqrt(3/fanIn)})\r\n }\r\n\r\n // Pool\r\n static maxPool (layer, channel) {\r\n\r\n const activations = NetUtil.getActivations(layer.prevLayer, channel, layer.inMapValuesCount)\r\n\r\n for (let row=0; row activation) {\r\n activation = value\r\n layer.indeces[channel][row][col] = [filterRow, filterCol]\r\n }\r\n }\r\n }\r\n\r\n layer.activations[channel][row][col] = activation\r\n }\r\n }\r\n }\r\n\r\n // Other\r\n static softmax (v) {\r\n\r\n const values = v.slice(0)\r\n let maxValue = values[0]\r\n\r\n for (let i=1; i maxValue) {\r\n maxValue = values[i]\r\n }\r\n }\r\n\r\n // Exponentials\r\n const exponentials = new Array(values.length)\r\n let exponentialsSum = 0.0\r\n\r\n for (let i=0; i p+c) / arr.length\r\n const diffs = arr.map(v => v - avg).map(v => v**2)\r\n return Math.sqrt(diffs.reduce((p,c) => p+c) / diffs.length)\r\n }\r\n\r\n static maxNorm () {\r\n\r\n if (this.maxNormTotal > this.maxNorm) {\r\n\r\n const multiplier = this.maxNorm / (1e-18 + this.maxNormTotal)\r\n\r\n this.layers.forEach((layer, li) => {\r\n li && layer.neurons.forEach(neuron => {\r\n neuron.weights.forEach((w, wi) => neuron.setWeight(wi, neuron.getWeight(wi) * multiplier))\r\n })\r\n })\r\n }\r\n\r\n this.maxNormTotal = 0\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.NetMath = NetMath)\r\nexports.NetMath = NetMath","\"use strict\"\r\n\r\nclass NetUtil {\r\n\r\n static format (value, type=\"string\") {\r\n switch (true) {\r\n\r\n case type==\"string\" && typeof value==\"string\":\r\n value = value.replace(/(_|\\s)/g, \"\").toLowerCase()\r\n break\r\n\r\n case type==\"time\" && typeof value==\"number\":\r\n const date = new Date(value)\r\n const formatted = []\r\n\r\n if (value < 1000) {\r\n formatted.push(`${date.getMilliseconds()}ms`)\r\n\r\n } else if (value < 60000) {\r\n formatted.push(`${date.getSeconds()}.${date.getMilliseconds()}s`)\r\n\r\n } else {\r\n\r\n if (value >= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static addZeroPadding (map, zP) {\r\n\r\n const data = []\r\n\r\n for (let row=0; row 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; i {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.state = \"constructed\"\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.state = \"constructed\"\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n }\r\n }\r\n\r\n this.collectedErrors = {training: [], validation: [], test: []}\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n switch (this.state) {\r\n\r\n case \"initialised\":\r\n return\r\n\r\n case \"not-defined\":\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n break\r\n }\r\n\r\n this.layers.forEach(this.joinLayer.bind(this))\r\n\r\n const outSize = this.layers[this.layers.length-1].size\r\n this.trainingConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.testConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.validationConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n\r\n this.state = \"initialised\"\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.activation = layer.activation==undefined ? this.activation : layer.activation\r\n\r\n layer.weightsConfig = {}\r\n Object.assign(layer.weightsConfig, this.weightsConfig)\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n\r\n layer.weightsConfig.fanIn = layer.prevLayer.size\r\n\r\n if (layerIndex 1) {\r\n layer.weightsConfig.fanOut = this.layers[1].size\r\n }\r\n\r\n layer.state = \"initialised\"\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c neuron.activation = data[ni])\r\n this.layers.forEach((layer, li) => li && layer.forward())\r\n\r\n return this.layers[this.layers.length-1].neurons.map(n => n.activation)\r\n }\r\n\r\n backward (errors) {\r\n\r\n if (errors === undefined) {\r\n throw new Error(\"No data passed to Network.backward()\")\r\n }\r\n\r\n if (errors.length != this.layers[this.layers.length-1].neurons.length) {\r\n console.warn(\"Expected data length did not match output layer neurons count.\", errors)\r\n }\r\n\r\n this.layers[this.layers.length-1].backward(errors)\r\n\r\n for (let layerIndex=this.layers.length-2; layerIndex>0; layerIndex--) {\r\n this.layers[layerIndex].backward()\r\n }\r\n }\r\n\r\n train (dataSet, {epochs=1, callback, callbackInterval=1, collectErrors, log=true, miniBatchSize=1, shuffle=false, validation}={}) {\r\n\r\n this.miniBatchSize = typeof miniBatchSize==\"boolean\" && miniBatchSize ? dataSet[0].expected.length : miniBatchSize\r\n this.validation = validation\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if (shuffle) {\r\n NetUtil.shuffle(dataSet)\r\n }\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch Size: ${this.miniBatchSize}`)\r\n }\r\n\r\n if (dataSet === undefined || dataSet === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers.bind(this, dataSet[0].input.length, dataSet[0].expected.length)()\r\n }\r\n\r\n this.layers.forEach(layer => layer.state = \"training\")\r\n\r\n if (this.validation) {\r\n this.validation.interval = this.validation.interval || dataSet.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = Infinity\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.validation.earlyStopping.bestError = Infinity\r\n break\r\n }\r\n }\r\n }\r\n\r\n let iterationIndex = 0\r\n let epochsCounter = 0\r\n let elapsed\r\n const startTime = Date.now()\r\n\r\n const logAndResolve = () => {\r\n this.layers.forEach(layer => layer.state = \"initialised\")\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n for (let l=1; l {\r\n this.epochs++\r\n this.error = 0\r\n this.validationError = 0\r\n iterationIndex = 0\r\n\r\n if (this.l2Error!=undefined) this.l2Error = 0\r\n if (this.l1Error!=undefined) this.l1Error = 0\r\n\r\n doIteration()\r\n }\r\n\r\n const doIteration = async () => {\r\n\r\n if (!dataSet[iterationIndex].hasOwnProperty(\"input\") || !dataSet[iterationIndex].hasOwnProperty(\"expected\")) {\r\n return void reject(\"Data set must be a list of objects with keys: 'input' and 'expected'\")\r\n }\r\n\r\n let trainingError\r\n let validationError\r\n\r\n const input = dataSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = dataSet[iterationIndex].expected\r\n\r\n let classification = -Infinity\r\n const errors = []\r\n for (let n=0; n= dataSet.length) {\r\n this.applyDeltaWeights()\r\n }\r\n\r\n trainingError = this.cost(target, output)\r\n this.error += trainingError\r\n this.iterations++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (collectErrors) {\r\n this.collectedErrors.training.push(trainingError)\r\n\r\n if (validationError) {\r\n this.collectedErrors.validation.push(validationError)\r\n }\r\n }\r\n\r\n if ((iterationIndex%callbackInterval == 0 || validationError) && typeof callback==\"function\") {\r\n callback({\r\n iterations: this.iterations,\r\n validations: this.validations,\r\n validationError, trainingError,\r\n elapsed, input\r\n })\r\n }\r\n\r\n if (iterationIndex < dataSet.length) {\r\n\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n\r\n } else {\r\n epochsCounter++\r\n\r\n if (log) {\r\n let text = `Epoch: ${this.epochs}\\nTraining Error: ${this.error/iterationIndex}`\r\n\r\n if (validation) {\r\n text += `\\nValidation Error: ${this.validationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochsCounter, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochsCounter < epochs) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n\r\n this.resetDeltaWeights()\r\n doEpoch()\r\n })\r\n }\r\n\r\n validate (data) {\r\n return new Promise((resolve, reject) => {\r\n let validationIndex = 0\r\n let totalValidationErrors = 0\r\n\r\n const validateItem = (item) => {\r\n\r\n const output = this.forward(data[validationIndex].input)\r\n const target = data[validationIndex].expected\r\n\r\n let classification = -Infinity\r\n for (let i=0; i validateItem(validationIndex), 0)\r\n } else {\r\n this.lastValidationError = totalValidationErrors / data.length\r\n resolve(totalValidationErrors / data.length)\r\n }\r\n }\r\n validateItem(validationIndex)\r\n })\r\n }\r\n\r\n checkEarlyStopping (errors) {\r\n\r\n let stop = false\r\n\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n stop = this.lastValidationError <= this.validation.earlyStopping.threshold\r\n\r\n // Do the last backward pass\r\n if (stop) {\r\n this.backward(errors)\r\n this.applyDeltaWeights()\r\n }\r\n\r\n return stop\r\n\r\n case \"patience\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l=this.validation.earlyStopping.patience\r\n }\r\n return stop\r\n\r\n case \"divergence\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l= (1+this.validation.earlyStopping.percent/100)\r\n }\r\n\r\n return stop\r\n }\r\n }\r\n\r\n test (testSet, {log=true, callback, collectErrors}={}) {\r\n return new Promise((resolve, reject) => {\r\n\r\n if (testSet === undefined || testSet === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n let totalError = 0\r\n let iterationIndex = 0\r\n const startTime = Date.now()\r\n\r\n const testInput = () => {\r\n\r\n const input = testSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = testSet[iterationIndex].expected\r\n const elapsed = Date.now() - startTime\r\n\r\n let classification = -Infinity\r\n for (let i=0; i li && layer.resetDeltaWeights())\r\n }\r\n\r\n applyDeltaWeights () {\r\n\r\n this.layers.forEach((layer, li) => li && layer.applyDeltaWeights())\r\n\r\n if (this.maxNorm!=undefined) {\r\n this.maxNormTotal = Math.sqrt(this.maxNormTotal)\r\n NetMath.maxNorm.bind(this)()\r\n }\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.resetDeltaWeights()\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l 0)\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = [...new Array(size)].map(v => 1)\r\n this.getWeightGain = i => this.weightGains[i]\r\n this.setWeightGain = (i,v) => this.weightGains[i] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = [...new Array(size)].map(v => 0)\r\n this.getWeightsCache = i => this.weightsCache[i]\r\n this.setWeightsCache = (i,v) => this.weightsCache[i] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = [...new Array(size)].map(v => 0)\r\n this.getAdadeltaCache = i => this.adadeltaCache[i]\r\n this.setAdadeltaCache = (i,v) => this.adadeltaCache[i] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight (i) {\r\n return this.weights[i]\r\n }\r\n\r\n setWeight (i, v) {\r\n this.weights[i] = v\r\n }\r\n\r\n getDeltaWeight (i) {\r\n return this.deltaWeights[i]\r\n }\r\n\r\n setDeltaWeight (i, v) {\r\n this.deltaWeights[i] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron","\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n\r\n forward () {\r\n\r\n super.forward()\r\n\r\n if (this.softmax) {\r\n\r\n const softmax = NetMath.softmax(this.neurons.map(n => n.activation))\r\n\r\n for (let s=0; s {\r\n return [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n })\r\n this.errors = [...new Array(this.channels)].map(channel => {\r\n return [...new Array(prevLayerOutWidth)].map(row => [...new Array(prevLayerOutWidth)].map(v => 0))\r\n })\r\n this.indeces = this.activations.map(channel => channel.map(row => row.map(v => [0,0])))\r\n }\r\n\r\n forward () {\r\n for (let channel=0; channelnew Filter)}init(){this.filters.forEach(filter=>{filter.weights=[...new Array(this.channels)].map(channelWeights=>[...new Array(this.filterSize)].map(weightsRow=>this.net.weightsInitFn(this.filterSize,this.weightsConfig))),filter.activationMap=[...new Array(this.outMapSize)].map(row=>[...new Array(this.outMapSize)].map(v=>0)),filter.errorMap=[...new Array(this.outMapSize)].map(row=>[...new Array(this.outMapSize)].map(v=>0)),filter.bias=1,1!=this.net.dropout&&(filter.dropoutMap=filter.activationMap.map(row=>row.map(v=>!1))),filter.init({updateFn:this.net.updateFn,activation:this.activationName||this.net.activationConfig,eluAlpha:this.net.eluAlpha})})}forward(){const activations=NetUtil.getActivations(this.prevLayer);for(let filterI=0;filterIthis.net.dropout)?filter.activationMap[sumY][sumX]=0:this.activation?filter.activationMap[sumY][sumX]=this.activation(filter.sumMap[sumY][sumX],!1,filter)/(this.net.dropout||1):filter.activationMap[sumY][sumX]=filter.sumMap[sumY][sumX]}}backward(){if(this.nextLayer instanceof FCLayer)for(let filterI=0;filterI0?1:-1))/this.net.miniBatchSize;filter.weights[channel][row][col]=this.net.weightUpdateFn.bind(this.net,filter.weights[channel][row][col],regularized,filter,[channel,row,col])(),void 0!=this.net.maxNorm&&(this.net.maxNormTotal+=filter.weights[channel][row][col]**2)}filter.bias=this.net.weightUpdateFn.bind(this.net,filter.bias,filter.deltaBias,filter)()}}backUpValidation(){for(let f=0;f({bias:filter.bias,weights:filter.weights}))}}fromJSON(data,layerIndex){this.filters.forEach((filter,fi)=>{if(data.weights[fi].weights.length!=filter.weights.length)throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`);if(data.weights[fi].weights[0].length!=filter.weights[0].length)throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`);filter.bias=data.weights[fi].bias,filter.weights=data.weights[fi].weights})}getDataSize(){let size=0;for(let f=0;fnew Neuron),this.state="not-initialised",void 0!=activation&&(this.activation=!("boolean"==typeof activation&&!activation)&&("function"==typeof activation?activation:NetMath[NetUtil.format(activation)].bind(this)))}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.prevLayer=layer,this.layerIndex=layerIndex}init(){this.neurons.forEach(neuron=>{let weightsCount;switch(!0){case this.prevLayer instanceof FCLayer:weightsCount=this.prevLayer.size;break;case this.prevLayer instanceof ConvLayer:weightsCount=this.prevLayer.filters.length*this.prevLayer.outMapSize**2;break;case this.prevLayer instanceof PoolLayer:weightsCount=this.prevLayer.activations.length*this.prevLayer.outMapSize**2}neuron.weights=this.net.weightsInitFn(weightsCount,this.weightsConfig),neuron.bias=1,neuron.init({updateFn:this.net.updateFn,activationConfig:this.net.activationConfig,eluAlpha:this.net.eluAlpha})})}forward(){this.neurons.forEach((neuron,ni)=>{if("training"==this.state&&(neuron.dropped=Math.random()>this.net.dropout))neuron.activation=0;else{neuron.sum=neuron.bias;const activations=NetUtil.getActivations(this.prevLayer);for(let ai=0;ai{if(neuron.dropped)neuron.error=0,neuron.deltaBias+=0;else{void 0!==errors?neuron.error=errors[ni]:(neuron.derivative=this.activation?this.activation(neuron.sum,!0,neuron):1,neuron.error=neuron.derivative*this.nextLayer.neurons.map(n=>n.error*(n.weights[ni]||0)).reduce((p,c)=>p+c,0));const activations=NetUtil.getActivations(this.prevLayer);for(let wi=0;wi0?1:-1))/this.net.miniBatchSize;neuron.weights[dwi]=this.net.weightUpdateFn.bind(this.net,neuron.weights[dwi],regularized,neuron,dwi)(),void 0!=this.net.maxNorm&&(this.net.maxNormTotal+=neuron.weights[dwi]**2)}neuron.bias=this.net.weightUpdateFn.bind(this.net,neuron.bias,neuron.deltaBias,neuron)()}}backUpValidation(){for(let n=0;n({bias:neuron.bias,weights:neuron.weights}))}}fromJSON(data,layerIndex){this.neurons.forEach((neuron,ni)=>{if(data.weights[ni].weights.length!=neuron.weights.length)throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`);neuron.bias=data.weights[ni].bias,neuron.weights=data.weights[ni].weights})}getDataSize(){let size=0;for(let n=0;nchannel.map(wRow=>wRow.map(w=>0))),this.deltaBias=0,updateFn){case"gain":this.biasGain=1,this.weightGains=this.weights.map(channel=>channel.map(wRow=>wRow.map(w=>1))),this.getWeightGain=(([channel,row,column])=>this.weightGains[channel][row][column]),this.setWeightGain=(([channel,row,column],v)=>this.weightGains[channel][row][column]=v);break;case"adagrad":case"rmsprop":case"adadelta":case"momentum":this.biasCache=0,this.weightsCache=this.weights.map(channel=>channel.map(wRow=>wRow.map(w=>0))),this.getWeightsCache=(([channel,row,column])=>this.weightsCache[channel][row][column]),this.setWeightsCache=(([channel,row,column],v)=>this.weightsCache[channel][row][column]=v),"adadelta"==updateFn&&(this.adadeltaBiasCache=0,this.adadeltaCache=this.weights.map(channel=>channel.map(wRow=>wRow.map(w=>0))),this.getAdadeltaCache=(([channel,row,column])=>this.adadeltaCache[channel][row][column]),this.setAdadeltaCache=(([channel,row,column],v)=>this.adadeltaCache[channel][row][column]=v));break;case"adam":this.m=0,this.v=0}"rrelu"==activation?this.rreluSlope=.001*Math.random():"elu"==activation&&(this.eluAlpha=eluAlpha)}getWeight([channel,row,column]){return this.weights[channel][row][column]}setWeight([channel,row,column],v){this.weights[channel][row][column]=v}getDeltaWeight([channel,row,column]){return this.deltaWeights[channel][row][column]}setDeltaWeight([channel,row,column],v){this.deltaWeights[channel][row][column]=v}}"undefined"!=typeof window&&(window.Filter=Filter),exports.Filter=Filter;class InputLayer extends FCLayer{constructor(size,{span:span=1}={}){super(size*span*span)}}"undefined"!=typeof window&&(window.InputLayer=InputLayer),exports.InputLayer=InputLayer;class NetMath{static sigmoid(value,prime){const val=1/(1+Math.exp(-value));return prime?val*(1-val):val}static tanh(value,prime){const exp=Math.exp(2*value);return prime?4/Math.pow(Math.exp(value)+Math.exp(-value),2)||1e-18:(exp-1)/(exp+1)||1e-18}static relu(value,prime){return prime?value>0?1:0:Math.max(value,0)}static lrelu(value,prime){return prime?value>0?1:this.lreluSlope||-5e-4:Math.max((this.lreluSlope||-5e-4)*Math.abs(value),value)}static rrelu(value,prime,neuron){return prime?value>0?1:neuron.rreluSlope:Math.max(neuron.rreluSlope,value)}static lecuntanh(value,prime){return prime?1.15333*Math.pow(NetMath.sech(2/3*value),2):1.7159*NetMath.tanh(2/3*value)}static elu(value,prime,neuron){return prime?value>=0?1:NetMath.elu(value,!1,neuron)+neuron.eluAlpha:value>=0?value:neuron.eluAlpha*(Math.exp(value)-1)}static crossentropy(target,output){return output.map((value,vi)=>target[vi]*Math.log(value+1e-15)+(1-target[vi])*Math.log(1+1e-15-value)).reduce((p,c)=>p-c,0)}static meansquarederror(calculated,desired){return calculated.map((output,index)=>Math.pow(output-desired[index],2)).reduce((prev,curr)=>prev+curr,0)/calculated.length}static rootmeansquarederror(calculated,desired){return Math.sqrt(NetMath.meansquarederror(calculated,desired))}static vanillasgd(value,deltaValue){return value+this.learningRate*deltaValue}static gain(value,deltaValue,neuron,weightI){const newVal=value+this.learningRate*deltaValue*(null==weightI?neuron.biasGain:neuron.getWeightGain(weightI));return newVal<=0&&value>0||newVal>=0&&value<0?null!=weightI?neuron.setWeightGain(weightI,Math.max(.95*neuron.getWeightGain(weightI),.5)):neuron.biasGain=Math.max(.95*neuron.biasGain,.5):null!=weightI?neuron.setWeightGain(weightI,Math.min(neuron.getWeightGain(weightI)+.05,5)):neuron.biasGain=Math.min(neuron.biasGain+.05,5),newVal}static adagrad(value,deltaValue,neuron,weightI){return null!=weightI?neuron.setWeightsCache(weightI,neuron.getWeightsCache(weightI)+Math.pow(deltaValue,2)):neuron.biasCache+=Math.pow(deltaValue,2),value+this.learningRate*deltaValue/(1e-6+Math.sqrt(null!=weightI?neuron.getWeightsCache(weightI):neuron.biasCache))}static rmsprop(value,deltaValue,neuron,weightI){return null!=weightI?neuron.setWeightsCache(weightI,this.rmsDecay*neuron.getWeightsCache(weightI)+(1-this.rmsDecay)*Math.pow(deltaValue,2)):neuron.biasCache=this.rmsDecay*neuron.biasCache+(1-this.rmsDecay)*Math.pow(deltaValue,2),value+this.learningRate*deltaValue/(1e-6+Math.sqrt(null!=weightI?neuron.getWeightsCache(weightI):neuron.biasCache))}static adam(value,deltaValue,neuron){neuron.m=.9*neuron.m+(1-.9)*deltaValue;const mt=neuron.m/(1-Math.pow(.9,this.iterations+1));neuron.v=.999*neuron.v+(1-.999)*Math.pow(deltaValue,2);const vt=neuron.v/(1-Math.pow(.999,this.iterations+1));return value+this.learningRate*mt/(Math.sqrt(vt)+1e-8)}static adadelta(value,deltaValue,neuron,weightI){if(null!=weightI){neuron.setWeightsCache(weightI,this.rho*neuron.getWeightsCache(weightI)+(1-this.rho)*Math.pow(deltaValue,2));const newVal=value+Math.sqrt((neuron.getAdadeltaCache(weightI)+1e-6)/(neuron.getWeightsCache(weightI)+1e-6))*deltaValue;return neuron.setAdadeltaCache(weightI,this.rho*neuron.getAdadeltaCache(weightI)+(1-this.rho)*Math.pow(deltaValue,2)),newVal}{neuron.biasCache=this.rho*neuron.biasCache+(1-this.rho)*Math.pow(deltaValue,2);const newVal=value+Math.sqrt((neuron.adadeltaBiasCache+1e-6)/(neuron.biasCache+1e-6))*deltaValue;return neuron.adadeltaBiasCache=this.rho*neuron.adadeltaBiasCache+(1-this.rho)*Math.pow(deltaValue,2),newVal}}static momentum(value,deltaValue,neuron,weightI){let v;return null!=weightI?(v=this.momentum*neuron.getWeightsCache(weightI)-this.learningRate*deltaValue,neuron.setWeightsCache(weightI,v)):(v=this.momentum*neuron.biasCache-this.learningRate*deltaValue,neuron.biasCache=v),value-v}static uniform(size,{limit:limit}){const values=[];for(let i=0;i=1||!r);values.push(mean+x1*Math.sqrt(-2*Math.log(r)/r)*stdDeviation)}return values}static xaviernormal(size,{fanIn:fanIn,fanOut:fanOut}){return fanOut||0==fanOut?NetMath.gaussian(size,{mean:0,stdDeviation:Math.sqrt(2/(fanIn+fanOut))}):NetMath.lecunnormal(size,{fanIn:fanIn})}static xavieruniform(size,{fanIn:fanIn,fanOut:fanOut}){return fanOut||0==fanOut?NetMath.uniform(size,{limit:Math.sqrt(6/(fanIn+fanOut))}):NetMath.lecununiform(size,{fanIn:fanIn})}static lecunnormal(size,{fanIn:fanIn}){return NetMath.gaussian(size,{mean:0,stdDeviation:Math.sqrt(1/fanIn)})}static lecununiform(size,{fanIn:fanIn}){return NetMath.uniform(size,{limit:Math.sqrt(3/fanIn)})}static maxPool(layer,channel){const activations=NetUtil.getActivations(layer.prevLayer,channel,layer.inMapValuesCount);for(let row=0;rowactivation&&(activation=value,layer.indeces[channel][row][col]=[filterRow,filterCol])}layer.activations[channel][row][col]=activation}}static softmax(v){const values=v.slice(0);let maxValue=values[0];for(let i=1;imaxValue&&(maxValue=values[i]);const exponentials=new Array(values.length);let exponentialsSum=0;for(let i=0;ip+c)/arr.length,diffs=arr.map(v=>v-avg).map(v=>v**2);return Math.sqrt(diffs.reduce((p,c)=>p+c)/diffs.length)}static maxNorm(){if(this.maxNormTotal>this.maxNorm){const multiplier=this.maxNorm/(1e-18+this.maxNormTotal);this.layers.forEach((layer,li)=>{li&&layer.neurons.forEach(neuron=>{neuron.weights.forEach((w,wi)=>neuron.setWeight(wi,neuron.getWeight(wi)*multiplier))})})}this.maxNormTotal=0}}"undefined"!=typeof window&&(window.NetMath=NetMath),exports.NetMath=NetMath;class NetUtil{static format(value,type="string"){switch(!0){case"string"==type&&"string"==typeof value:value=value.replace(/(_|\s)/g,"").toLowerCase();break;case"time"==type&&"number"==typeof value:const date=new Date(value),formatted=[];value<1e3?formatted.push(`${date.getMilliseconds()}ms`):value<6e4?formatted.push(`${date.getSeconds()}.${date.getMilliseconds()}s`):(value>=36e5&&formatted.push(`${date.getHours()}h`),formatted.push(`${date.getMinutes()}m`),formatted.push(`${date.getSeconds()}s`)),value=formatted.join(" ")}return value}static shuffle(arr){for(let i=arr.length;i;i--){const j=Math.floor(Math.random()*i),x=arr[i-1];arr[i-1]=arr[j],arr[j]=x}}static addZeroPadding(map,zP){const data=[];for(let row=0;row1-training?split.training.push(data[i]):xmaxVal&&(maxVal=data[i]);if(-1*minVal+maxVal!=0)for(let i=0;i{num=percent?num.toFixed(1)+"%":num.toString();const leftPad=Math.max(Math.floor((7-num.length)/2),0),rightPad=Math.max(7-(num.length+leftPad),0);return" ".repeat(leftPad)+num+" ".repeat(rightPad)};let colourText,colourBackground;process.stdout.write("\n");for(let r=0;rNumber.isInteger(item)):this.layers=layers.map(size=>new FCLayer(size)),this.state="constructed",this.initLayers();break;case layers.every(layer=>layer instanceof FCLayer||layer instanceof ConvLayer||layer instanceof PoolLayer):this.state="constructed",this.layers=layers,this.initLayers();break;default:throw new Error("There was an error constructing from the layers given.")}this.collectedErrors={training:[],validation:[],test:[]}}initLayers(input,expected){switch(this.state){case"initialised":return;case"not-defined":this.layers[0]=new FCLayer(input),this.layers[1]=new FCLayer(Math.ceil(input/expected>5?expected+Math.abs(input-expected)/4:input+expected)),this.layers[2]=new FCLayer(Math.ceil(expected))}this.layers.forEach(this.joinLayer.bind(this));const outSize=this.layers[this.layers.length-1].size;this.trainingConfusionMatrix=[...new Array(outSize)].map(r=>[...new Array(outSize)].map(v=>0)),this.testConfusionMatrix=[...new Array(outSize)].map(r=>[...new Array(outSize)].map(v=>0)),this.validationConfusionMatrix=[...new Array(outSize)].map(r=>[...new Array(outSize)].map(v=>0)),this.state="initialised"}joinLayer(layer,layerIndex){layer.net=this,layer.activation=void 0==layer.activation?this.activation:layer.activation,layer.weightsConfig={},Object.assign(layer.weightsConfig,this.weightsConfig),layerIndex?(this.layers[layerIndex-1].assignNext(layer),layer.assignPrev(this.layers[layerIndex-1],layerIndex),layer.weightsConfig.fanIn=layer.prevLayer.size,layerIndex1&&(layer.weightsConfig.fanOut=this.layers[1].size),layer.state="initialised"}forward(data){if("initialised"!=this.state)throw new Error("The network layers have not been initialised.");if(void 0===data||null===data)throw new Error("No data passed to Network.forward()");if(Array.isArray(data[0])){const flat=[];for(let c=0;cneuron.activation=data[ni]),this.layers.forEach((layer,li)=>li&&layer.forward()),this.layers[this.layers.length-1].neurons.map(n=>n.activation)}backward(errors){if(void 0===errors)throw new Error("No data passed to Network.backward()");errors.length!=this.layers[this.layers.length-1].neurons.length&&console.warn("Expected data length did not match output layer neurons count.",errors),this.layers[this.layers.length-1].backward(errors);for(let layerIndex=this.layers.length-2;layerIndex>0;layerIndex--)this.layers[layerIndex].backward()}train(dataSet,{epochs:epochs=1,callback:callback,callbackInterval:callbackInterval=1,collectErrors:collectErrors,log:log=!0,miniBatchSize:miniBatchSize=1,shuffle:shuffle=!1,validation:validation}={}){return this.miniBatchSize="boolean"==typeof miniBatchSize&&miniBatchSize?dataSet[0].expected.length:miniBatchSize,this.validation=validation,new Promise((resolve,reject)=>{if(shuffle&&NetUtil.shuffle(dataSet),log&&console.log(`Training started. Epochs: ${epochs} Batch Size: ${this.miniBatchSize}`),void 0===dataSet||null===dataSet)return void reject("No data provided");if("initialised"!=this.state&&this.initLayers.bind(this,dataSet[0].input.length,dataSet[0].expected.length)(),this.layers.forEach(layer=>layer.state="training"),this.validation&&(this.validation.interval=this.validation.interval||dataSet.length,this.validation.earlyStopping))switch(this.validation.earlyStopping.type){case"threshold":this.validation.earlyStopping.threshold=this.validation.earlyStopping.threshold||.01;break;case"patience":this.validation.earlyStopping.patienceCounter=0,this.validation.earlyStopping.bestError=1/0,this.validation.earlyStopping.patience=this.validation.earlyStopping.patience||20;break;case"divergence":this.validation.earlyStopping.percent=this.validation.earlyStopping.percent||30,this.validation.earlyStopping.bestError=1/0}let elapsed,iterationIndex=0,epochsCounter=0;const startTime=Date.now(),logAndResolve=()=>{if(this.layers.forEach(layer=>layer.state="initialised"),this.validation&&this.validation.earlyStopping&&("patience"==this.validation.earlyStopping.type||"divergence"==this.validation.earlyStopping.type))for(let l=1;l{this.epochs++,this.error=0,this.validationError=0,iterationIndex=0,void 0!=this.l2Error&&(this.l2Error=0),void 0!=this.l1Error&&(this.l1Error=0),doIteration()},doIteration=async()=>{if(!dataSet[iterationIndex].hasOwnProperty("input")||!dataSet[iterationIndex].hasOwnProperty("expected"))return void reject("Data set must be a list of objects with keys: 'input' and 'expected'");let trainingError,validationError;const input=dataSet[iterationIndex].input,output=this.forward(input),target=dataSet[iterationIndex].expected;let classification=-1/0;const errors=[];for(let n=0;n=dataSet.length&&this.applyDeltaWeights(),trainingError=this.cost(target,output),this.error+=trainingError,this.iterations++,elapsed=Date.now()-startTime,collectErrors&&(this.collectedErrors.training.push(trainingError),validationError&&this.collectedErrors.validation.push(validationError)),iterationIndex%callbackInterval!=0&&!validationError||"function"!=typeof callback||callback({iterations:this.iterations,validations:this.validations,validationError:validationError,trainingError:trainingError,elapsed:elapsed,input:input}),iterationIndex{let validationIndex=0,totalValidationErrors=0;const validateItem=item=>{const output=this.forward(data[validationIndex].input),target=data[validationIndex].expected;let classification=-1/0;for(let i=0;ivalidateItem(validationIndex),0):(this.lastValidationError=totalValidationErrors/data.length,resolve(totalValidationErrors/data.length))};validateItem(validationIndex)})}checkEarlyStopping(errors){let stop=!1;switch(this.validation.earlyStopping.type){case"threshold":return(stop=this.lastValidationError<=this.validation.earlyStopping.threshold)&&(this.backward(errors),this.applyDeltaWeights()),stop;case"patience":if(this.lastValidationError=this.validation.earlyStopping.patience;return stop;case"divergence":if(this.lastValidationError=1+this.validation.earlyStopping.percent/100;return stop}}test(testSet,{log:log=!0,callback:callback,collectErrors:collectErrors}={}){return new Promise((resolve,reject)=>{void 0!==testSet&&null!==testSet||reject("No data provided"),log&&console.log("Testing started");let totalError=0,iterationIndex=0;const startTime=Date.now(),testInput=()=>{const input=testSet[iterationIndex].input,output=this.forward(input),target=testSet[iterationIndex].expected,elapsed=Date.now()-startTime;let classification=-1/0;for(let i=0;ili&&layer.resetDeltaWeights())}applyDeltaWeights(){this.layers.forEach((layer,li)=>li&&layer.applyDeltaWeights()),void 0!=this.maxNorm&&(this.maxNormTotal=Math.sqrt(this.maxNormTotal),NetMath.maxNorm.bind(this)())}toJSON(){return{layers:this.layers.map(layer=>layer.toJSON())}}fromJSON(data){if(void 0===data||null===data)throw new Error("No JSON data given to import.");if(data.layers.length!=this.layers.length)throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`);this.resetDeltaWeights(),this.layers.forEach((layer,li)=>li&&layer.fromJSON(data.layers[li],li))}toIMG(IMGArrays,opts={}){if(!IMGArrays)throw new Error("The IMGArrays library must be provided. See the documentation for instructions.");const data=[];for(let l=1;l0),updateFn){case"gain":this.biasGain=1,this.weightGains=[...new Array(size)].map(v=>1),this.getWeightGain=(i=>this.weightGains[i]),this.setWeightGain=((i,v)=>this.weightGains[i]=v);break;case"adagrad":case"rmsprop":case"adadelta":case"momentum":this.biasCache=0,this.weightsCache=[...new Array(size)].map(v=>0),this.getWeightsCache=(i=>this.weightsCache[i]),this.setWeightsCache=((i,v)=>this.weightsCache[i]=v),"adadelta"==updateFn&&(this.adadeltaBiasCache=0,this.adadeltaCache=[...new Array(size)].map(v=>0),this.getAdadeltaCache=(i=>this.adadeltaCache[i]),this.setAdadeltaCache=((i,v)=>this.adadeltaCache[i]=v));break;case"adam":this.m=0,this.v=0}"rrelu"==activation?this.rreluSlope=.001*Math.random():"elu"==activation&&(this.eluAlpha=eluAlpha)}getWeight(i){return this.weights[i]}setWeight(i,v){this.weights[i]=v}getDeltaWeight(i){return this.deltaWeights[i]}setDeltaWeight(i,v){this.deltaWeights[i]=v}}"undefined"!=typeof window&&(window.Neuron=Neuron),exports.Neuron=Neuron;class OutputLayer extends FCLayer{constructor(size,{activation:activation,softmax:softmax}={}){super(size,{activation:activation}),softmax&&(this.softmax=!0)}forward(){if(super.forward(),this.softmax){const softmax=NetMath.softmax(this.neurons.map(n=>n.activation));for(let s=0;s[...new Array(this.outMapSize)].map(row=>[...new Array(this.outMapSize)].map(v=>0))),this.errors=[...new Array(this.channels)].map(channel=>[...new Array(prevLayerOutWidth)].map(row=>[...new Array(prevLayerOutWidth)].map(v=>0))),this.indeces=this.activations.map(channel=>channel.map(row=>row.map(v=>[0,0])))}forward(){for(let channel=0;channelnew Filter)}init(){this.filters.forEach(filter=>{filter.weights=[...new Array(this.channels)].map(channelWeights=>[...new Array(this.filterSize)].map(weightsRow=>this.net.weightsInitFn(this.filterSize,this.weightsConfig))),filter.activationMap=[...new Array(this.outMapSize)].map(row=>[...new Array(this.outMapSize)].map(v=>0)),filter.errorMap=[...new Array(this.outMapSize)].map(row=>[...new Array(this.outMapSize)].map(v=>0)),filter.bias=1,1!=this.net.dropout&&(filter.dropoutMap=filter.activationMap.map(row=>row.map(v=>!1))),filter.init({updateFn:this.net.updateFn,activation:this.activationName||this.net.activationConfig,eluAlpha:this.net.eluAlpha})})}forward(){const activations=NetUtil.getActivations(this.prevLayer);for(let filterI=0;filterIthis.net.dropout)?filter.activationMap[sumY][sumX]=0:this.activation?filter.activationMap[sumY][sumX]=this.activation(filter.sumMap[sumY][sumX],!1,filter)/(this.net.dropout||1):filter.activationMap[sumY][sumX]=filter.sumMap[sumY][sumX]}}backward(){if(this.nextLayer instanceof FCLayer)for(let filterI=0;filterI0?1:-1))/this.net.miniBatchSize;filter.weights[channel][row][col]=this.net.weightUpdateFn.bind(this.net,filter.weights[channel][row][col],regularized,filter,[channel,row,col])(),void 0!=this.net.maxNorm&&(this.net.maxNormTotal+=filter.weights[channel][row][col]**2)}filter.bias=this.net.weightUpdateFn.bind(this.net,filter.bias,filter.deltaBias,filter)()}}backUpValidation(){for(let f=0;f({bias:filter.bias,weights:filter.weights}))}}fromJSON(data,layerIndex){this.filters.forEach((filter,fi)=>{if(data.weights[fi].weights.length!=filter.weights.length)throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`);if(data.weights[fi].weights[0].length!=filter.weights[0].length)throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`);filter.bias=data.weights[fi].bias,filter.weights=data.weights[fi].weights})}getDataSize(){let size=0;for(let f=0;fnew Neuron),this.state="not-initialised",void 0!=activation&&(this.activation=!("boolean"==typeof activation&&!activation)&&("function"==typeof activation?activation:NetMath[NetUtil.format(activation)].bind(this)))}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.prevLayer=layer,this.layerIndex=layerIndex}init(){this.neurons.forEach(neuron=>{let weightsCount;switch(!0){case this.prevLayer instanceof FCLayer:weightsCount=this.prevLayer.size;break;case this.prevLayer instanceof ConvLayer:weightsCount=this.prevLayer.filters.length*this.prevLayer.outMapSize**2;break;case this.prevLayer instanceof PoolLayer:weightsCount=this.prevLayer.activations.length*this.prevLayer.outMapSize**2}neuron.weights=this.net.weightsInitFn(weightsCount,this.weightsConfig),neuron.bias=1,neuron.init({updateFn:this.net.updateFn,activationConfig:this.net.activationConfig,eluAlpha:this.net.eluAlpha})})}forward(){this.neurons.forEach((neuron,ni)=>{if("training"==this.state&&(neuron.dropped=Math.random()>this.net.dropout))neuron.activation=0;else{neuron.sum=neuron.bias;const activations=NetUtil.getActivations(this.prevLayer);for(let ai=0;ai{if(neuron.dropped)neuron.error=0,neuron.deltaBias+=0;else{void 0!==errors?neuron.error=errors[ni]:(neuron.derivative=this.activation?this.activation(neuron.sum,!0,neuron):1,neuron.error=neuron.derivative*this.nextLayer.neurons.map(n=>n.error*(n.weights[ni]||0)).reduce((p,c)=>p+c,0));const activations=NetUtil.getActivations(this.prevLayer);for(let wi=0;wi0?1:-1))/this.net.miniBatchSize;neuron.weights[dwi]=this.net.weightUpdateFn.bind(this.net,neuron.weights[dwi],regularized,neuron,dwi)(),void 0!=this.net.maxNorm&&(this.net.maxNormTotal+=neuron.weights[dwi]**2)}neuron.bias=this.net.weightUpdateFn.bind(this.net,neuron.bias,neuron.deltaBias,neuron)()}}backUpValidation(){for(let n=0;n({bias:neuron.bias,weights:neuron.weights}))}}fromJSON(data,layerIndex){this.neurons.forEach((neuron,ni)=>{if(data.weights[ni].weights.length!=neuron.weights.length)throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`);neuron.bias=data.weights[ni].bias,neuron.weights=data.weights[ni].weights})}getDataSize(){let size=0;for(let n=0;nchannel.map(wRow=>wRow.map(w=>0))),this.deltaBias=0,updateFn){case"gain":this.biasGain=1,this.weightGains=this.weights.map(channel=>channel.map(wRow=>wRow.map(w=>1))),this.getWeightGain=(([channel,row,column])=>this.weightGains[channel][row][column]),this.setWeightGain=(([channel,row,column],v)=>this.weightGains[channel][row][column]=v);break;case"adagrad":case"rmsprop":case"adadelta":case"momentum":this.biasCache=0,this.weightsCache=this.weights.map(channel=>channel.map(wRow=>wRow.map(w=>0))),this.getWeightsCache=(([channel,row,column])=>this.weightsCache[channel][row][column]),this.setWeightsCache=(([channel,row,column],v)=>this.weightsCache[channel][row][column]=v),"adadelta"==updateFn&&(this.adadeltaBiasCache=0,this.adadeltaCache=this.weights.map(channel=>channel.map(wRow=>wRow.map(w=>0))),this.getAdadeltaCache=(([channel,row,column])=>this.adadeltaCache[channel][row][column]),this.setAdadeltaCache=(([channel,row,column],v)=>this.adadeltaCache[channel][row][column]=v));break;case"adam":this.m=0,this.v=0}"rrelu"==activation?this.rreluSlope=.001*Math.random():"elu"==activation&&(this.eluAlpha=eluAlpha)}getWeight([channel,row,column]){return this.weights[channel][row][column]}setWeight([channel,row,column],v){this.weights[channel][row][column]=v}getDeltaWeight([channel,row,column]){return this.deltaWeights[channel][row][column]}setDeltaWeight([channel,row,column],v){this.deltaWeights[channel][row][column]=v}}"undefined"!=typeof window&&(window.Filter=Filter),exports.Filter=Filter;class InputLayer extends FCLayer{constructor(size,{span:span=1}={}){super(size*span*span)}}"undefined"!=typeof window&&(window.InputLayer=InputLayer),exports.InputLayer=InputLayer;class NetMath{static sigmoid(value,prime){const val=1/(1+Math.exp(-value));return prime?val*(1-val):val}static tanh(value,prime){const exp=Math.exp(2*value);return prime?4/Math.pow(Math.exp(value)+Math.exp(-value),2)||1e-18:(exp-1)/(exp+1)||1e-18}static relu(value,prime){return prime?value>0?1:0:Math.max(value,0)}static lrelu(value,prime){return prime?value>0?1:this.lreluSlope||-5e-4:Math.max((this.lreluSlope||-5e-4)*Math.abs(value),value)}static rrelu(value,prime,neuron){return prime?value>0?1:neuron.rreluSlope:Math.max(neuron.rreluSlope,value)}static lecuntanh(value,prime){return prime?1.15333*Math.pow(NetMath.sech(2/3*value),2):1.7159*NetMath.tanh(2/3*value)}static elu(value,prime,neuron){return prime?value>=0?1:NetMath.elu(value,!1,neuron)+neuron.eluAlpha:value>=0?value:neuron.eluAlpha*(Math.exp(value)-1)}static crossentropy(target,output){return output.map((value,vi)=>target[vi]*Math.log(value+1e-15)+(1-target[vi])*Math.log(1+1e-15-value)).reduce((p,c)=>p-c,0)}static meansquarederror(calculated,desired){return calculated.map((output,index)=>Math.pow(output-desired[index],2)).reduce((prev,curr)=>prev+curr,0)/calculated.length}static rootmeansquarederror(calculated,desired){return Math.sqrt(NetMath.meansquarederror(calculated,desired))}static vanillasgd(value,deltaValue){return value+this.learningRate*deltaValue}static gain(value,deltaValue,neuron,weightI){const newVal=value+this.learningRate*deltaValue*(null==weightI?neuron.biasGain:neuron.getWeightGain(weightI));return newVal<=0&&value>0||newVal>=0&&value<0?null!=weightI?neuron.setWeightGain(weightI,Math.max(.95*neuron.getWeightGain(weightI),.5)):neuron.biasGain=Math.max(.95*neuron.biasGain,.5):null!=weightI?neuron.setWeightGain(weightI,Math.min(neuron.getWeightGain(weightI)+.05,5)):neuron.biasGain=Math.min(neuron.biasGain+.05,5),newVal}static adagrad(value,deltaValue,neuron,weightI){return null!=weightI?neuron.setWeightsCache(weightI,neuron.getWeightsCache(weightI)+Math.pow(deltaValue,2)):neuron.biasCache+=Math.pow(deltaValue,2),value+this.learningRate*deltaValue/(1e-6+Math.sqrt(null!=weightI?neuron.getWeightsCache(weightI):neuron.biasCache))}static rmsprop(value,deltaValue,neuron,weightI){return null!=weightI?neuron.setWeightsCache(weightI,this.rmsDecay*neuron.getWeightsCache(weightI)+(1-this.rmsDecay)*Math.pow(deltaValue,2)):neuron.biasCache=this.rmsDecay*neuron.biasCache+(1-this.rmsDecay)*Math.pow(deltaValue,2),value+this.learningRate*deltaValue/(1e-6+Math.sqrt(null!=weightI?neuron.getWeightsCache(weightI):neuron.biasCache))}static adam(value,deltaValue,neuron){neuron.m=.9*neuron.m+(1-.9)*deltaValue;const mt=neuron.m/(1-Math.pow(.9,this.iterations+1));neuron.v=.999*neuron.v+(1-.999)*Math.pow(deltaValue,2);const vt=neuron.v/(1-Math.pow(.999,this.iterations+1));return value+this.learningRate*mt/(Math.sqrt(vt)+1e-8)}static adadelta(value,deltaValue,neuron,weightI){if(null!=weightI){neuron.setWeightsCache(weightI,this.rho*neuron.getWeightsCache(weightI)+(1-this.rho)*Math.pow(deltaValue,2));const newVal=value+Math.sqrt((neuron.getAdadeltaCache(weightI)+1e-6)/(neuron.getWeightsCache(weightI)+1e-6))*deltaValue;return neuron.setAdadeltaCache(weightI,this.rho*neuron.getAdadeltaCache(weightI)+(1-this.rho)*Math.pow(deltaValue,2)),newVal}{neuron.biasCache=this.rho*neuron.biasCache+(1-this.rho)*Math.pow(deltaValue,2);const newVal=value+Math.sqrt((neuron.adadeltaBiasCache+1e-6)/(neuron.biasCache+1e-6))*deltaValue;return neuron.adadeltaBiasCache=this.rho*neuron.adadeltaBiasCache+(1-this.rho)*Math.pow(deltaValue,2),newVal}}static momentum(value,deltaValue,neuron,weightI){let v;return null!=weightI?(v=this.momentum*neuron.getWeightsCache(weightI)-this.learningRate*deltaValue,neuron.setWeightsCache(weightI,v)):(v=this.momentum*neuron.biasCache-this.learningRate*deltaValue,neuron.biasCache=v),value-v}static uniform(size,{limit:limit}){const values=[];for(let i=0;i=1||!r);values.push(mean+x1*Math.sqrt(-2*Math.log(r)/r)*stdDeviation)}return values}static xaviernormal(size,{fanIn:fanIn,fanOut:fanOut}){return fanOut||0==fanOut?NetMath.gaussian(size,{mean:0,stdDeviation:Math.sqrt(2/(fanIn+fanOut))}):NetMath.lecunnormal(size,{fanIn:fanIn})}static xavieruniform(size,{fanIn:fanIn,fanOut:fanOut}){return fanOut||0==fanOut?NetMath.uniform(size,{limit:Math.sqrt(6/(fanIn+fanOut))}):NetMath.lecununiform(size,{fanIn:fanIn})}static lecunnormal(size,{fanIn:fanIn}){return NetMath.gaussian(size,{mean:0,stdDeviation:Math.sqrt(1/fanIn)})}static lecununiform(size,{fanIn:fanIn}){return NetMath.uniform(size,{limit:Math.sqrt(3/fanIn)})}static maxPool(layer,channel){const activations=NetUtil.getActivations(layer.prevLayer,channel,layer.inMapValuesCount);for(let row=0;rowactivation&&(activation=value,layer.indeces[channel][row][col]=[filterRow,filterCol])}layer.activations[channel][row][col]=activation}}static softmax(v){const values=v.slice(0);let maxValue=values[0];for(let i=1;imaxValue&&(maxValue=values[i]);const exponentials=new Array(values.length);let exponentialsSum=0;for(let i=0;ip+c)/arr.length,diffs=arr.map(v=>v-avg).map(v=>v**2);return Math.sqrt(diffs.reduce((p,c)=>p+c)/diffs.length)}static maxNorm(){if(this.maxNormTotal>this.maxNorm){const multiplier=this.maxNorm/(1e-18+this.maxNormTotal);this.layers.forEach((layer,li)=>{li&&layer.neurons.forEach(neuron=>{neuron.weights.forEach((w,wi)=>neuron.setWeight(wi,neuron.getWeight(wi)*multiplier))})})}this.maxNormTotal=0}}"undefined"!=typeof window&&(window.NetMath=NetMath),exports.NetMath=NetMath;class NetUtil{static format(value,type="string"){switch(!0){case"string"==type&&"string"==typeof value:value=value.replace(/(_|\s)/g,"").toLowerCase();break;case"time"==type&&"number"==typeof value:const date=new Date(value),formatted=[];value<1e3?formatted.push(`${date.getMilliseconds()}ms`):value<6e4?formatted.push(`${date.getSeconds()}.${date.getMilliseconds()}s`):(value>=36e5&&formatted.push(`${date.getHours()}h`),formatted.push(`${date.getMinutes()}m`),formatted.push(`${date.getSeconds()}s`)),value=formatted.join(" ")}return value}static shuffle(arr){for(let i=arr.length;i;i--){const j=Math.floor(Math.random()*i),x=arr[i-1];arr[i-1]=arr[j],arr[j]=x}}static addZeroPadding(map,zP){const data=[];for(let row=0;row1-training?split.training.push(data[i]):xmaxVal&&(maxVal=data[i]);if(-1*minVal+maxVal!=0)for(let i=0;i{num=percent?num.toFixed(1)+"%":num.toString();const leftPad=Math.max(Math.floor((7-num.length)/2),0),rightPad=Math.max(7-(num.length+leftPad),0);return" ".repeat(leftPad)+num+" ".repeat(rightPad)};let colourText,colourBackground;process.stdout.write("\n");for(let r=0;rNumber.isInteger(item)):this.layers=layers.map(size=>new FCLayer(size)),this.state="constructed",this.initLayers();break;case layers.every(layer=>layer instanceof FCLayer||layer instanceof ConvLayer||layer instanceof PoolLayer):this.state="constructed",this.layers=layers,this.initLayers();break;default:throw new Error("There was an error constructing from the layers given.")}this.collectedErrors={training:[],validation:[],test:[]}}initLayers(input,expected){switch(this.state){case"initialised":return;case"not-defined":this.layers[0]=new FCLayer(input),this.layers[1]=new FCLayer(Math.ceil(input/expected>5?expected+Math.abs(input-expected)/4:input+expected)),this.layers[2]=new FCLayer(Math.ceil(expected))}this.layers.forEach(this.joinLayer.bind(this));const outSize=this.layers[this.layers.length-1].size;this.trainingConfusionMatrix=[...new Array(outSize)].map(r=>[...new Array(outSize)].map(v=>0)),this.testConfusionMatrix=[...new Array(outSize)].map(r=>[...new Array(outSize)].map(v=>0)),this.validationConfusionMatrix=[...new Array(outSize)].map(r=>[...new Array(outSize)].map(v=>0)),this.state="initialised"}joinLayer(layer,layerIndex){layer.net=this,layer.activation=void 0==layer.activation?this.activation:layer.activation,layer.weightsConfig={},Object.assign(layer.weightsConfig,this.weightsConfig),layerIndex?(this.layers[layerIndex-1].assignNext(layer),layer.assignPrev(this.layers[layerIndex-1],layerIndex),layer.weightsConfig.fanIn=layer.prevLayer.size,layerIndex1&&(layer.weightsConfig.fanOut=this.layers[1].size),layer.state="initialised"}forward(data){if("initialised"!=this.state)throw new Error("The network layers have not been initialised.");if(void 0===data||null===data)throw new Error("No data passed to Network.forward()");if(Array.isArray(data[0])){const flat=[];for(let c=0;cneuron.activation=data[ni]),this.layers.forEach((layer,li)=>li&&layer.forward()),this.layers[this.layers.length-1].neurons.map(n=>n.activation)}backward(errors){if(void 0===errors)throw new Error("No data passed to Network.backward()");errors.length!=this.layers[this.layers.length-1].neurons.length&&console.warn("Expected data length did not match output layer neurons count.",errors),this.layers[this.layers.length-1].backward(errors);for(let layerIndex=this.layers.length-2;layerIndex>0;layerIndex--)this.layers[layerIndex].backward()}train(dataSet,{epochs:epochs=1,callback:callback,callbackInterval:callbackInterval=1,collectErrors:collectErrors,log:log=!0,miniBatchSize:miniBatchSize=1,shuffle:shuffle=!1,validation:validation}={}){return this.miniBatchSize="boolean"==typeof miniBatchSize&&miniBatchSize?dataSet[0].expected.length:miniBatchSize,this.validation=validation,new Promise((resolve,reject)=>{if(shuffle&&NetUtil.shuffle(dataSet),log&&console.log(`Training started. Epochs: ${epochs} Batch Size: ${this.miniBatchSize}`),void 0===dataSet||null===dataSet)return void reject("No data provided");if("initialised"!=this.state&&this.initLayers.bind(this,dataSet[0].input.length,dataSet[0].expected.length)(),this.layers.forEach(layer=>layer.state="training"),this.validation&&(this.validation.interval=this.validation.interval||dataSet.length,this.validation.earlyStopping))switch(this.validation.earlyStopping.type){case"threshold":this.validation.earlyStopping.threshold=this.validation.earlyStopping.threshold||.01;break;case"patience":this.validation.earlyStopping.patienceCounter=0,this.validation.earlyStopping.bestError=1/0,this.validation.earlyStopping.patience=this.validation.earlyStopping.patience||20;break;case"divergence":this.validation.earlyStopping.percent=this.validation.earlyStopping.percent||30,this.validation.earlyStopping.bestError=1/0}let elapsed,iterationIndex=0,epochsCounter=0;const startTime=Date.now(),logAndResolve=()=>{if(this.layers.forEach(layer=>layer.state="initialised"),this.validation&&this.validation.earlyStopping&&("patience"==this.validation.earlyStopping.type||"divergence"==this.validation.earlyStopping.type))for(let l=1;l{this.epochs++,this.error=0,this.validationError=0,iterationIndex=0,void 0!=this.l2Error&&(this.l2Error=0),void 0!=this.l1Error&&(this.l1Error=0),doIteration()},doIteration=async()=>{if(!dataSet[iterationIndex].hasOwnProperty("input")||!dataSet[iterationIndex].hasOwnProperty("expected"))return void reject("Data set must be a list of objects with keys: 'input' and 'expected'");let trainingError,validationError;const input=dataSet[iterationIndex].input,output=this.forward(input),target=dataSet[iterationIndex].expected;let classification=-1/0;const errors=[];for(let n=0;n=dataSet.length&&this.applyDeltaWeights(),trainingError=this.cost(target,output),this.error+=trainingError,this.iterations++,elapsed=Date.now()-startTime,collectErrors&&(this.collectedErrors.training.push(trainingError),validationError&&this.collectedErrors.validation.push(validationError)),iterationIndex%callbackInterval!=0&&!validationError||"function"!=typeof callback||callback({iterations:this.iterations,validations:this.validations,validationError:validationError,trainingError:trainingError,elapsed:elapsed,input:input}),iterationIndex{let validationIndex=0,totalValidationErrors=0;const validateItem=item=>{const output=this.forward(data[validationIndex].input),target=data[validationIndex].expected;let classification=-1/0;for(let i=0;ivalidateItem(validationIndex),0):(this.lastValidationError=totalValidationErrors/data.length,resolve(totalValidationErrors/data.length))};validateItem(validationIndex)})}checkEarlyStopping(errors){let stop=!1;switch(this.validation.earlyStopping.type){case"threshold":return(stop=this.lastValidationError<=this.validation.earlyStopping.threshold)&&(this.backward(errors),this.applyDeltaWeights()),stop;case"patience":if(this.lastValidationError=this.validation.earlyStopping.patience;return stop;case"divergence":if(this.lastValidationError=1+this.validation.earlyStopping.percent/100;return stop}}test(testSet,{log:log=!0,callback:callback,collectErrors:collectErrors}={}){return new Promise((resolve,reject)=>{void 0!==testSet&&null!==testSet||reject("No data provided"),log&&console.log("Testing started");let totalError=0,iterationIndex=0;const startTime=Date.now(),testInput=()=>{const input=testSet[iterationIndex].input,output=this.forward(input),target=testSet[iterationIndex].expected,elapsed=Date.now()-startTime;let classification=-1/0;for(let i=0;ili&&layer.resetDeltaWeights())}applyDeltaWeights(){this.layers.forEach((layer,li)=>li&&layer.applyDeltaWeights()),void 0!=this.maxNorm&&(this.maxNormTotal=Math.sqrt(this.maxNormTotal),NetMath.maxNorm.bind(this)())}toJSON(){return{layers:this.layers.map(layer=>layer.toJSON())}}fromJSON(data){if(void 0===data||null===data)throw new Error("No JSON data given to import.");if(data.layers.length!=this.layers.length)throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`);this.resetDeltaWeights(),this.layers.forEach((layer,li)=>li&&layer.fromJSON(data.layers[li],li))}toIMG(IMGArrays,opts={}){if(!IMGArrays)throw new Error("The IMGArrays library must be provided. See the documentation for instructions.");const data=[];for(let l=1;l0),updateFn){case"gain":this.biasGain=1,this.weightGains=[...new Array(size)].map(v=>1),this.getWeightGain=(i=>this.weightGains[i]),this.setWeightGain=((i,v)=>this.weightGains[i]=v);break;case"adagrad":case"rmsprop":case"adadelta":case"momentum":this.biasCache=0,this.weightsCache=[...new Array(size)].map(v=>0),this.getWeightsCache=(i=>this.weightsCache[i]),this.setWeightsCache=((i,v)=>this.weightsCache[i]=v),"adadelta"==updateFn&&(this.adadeltaBiasCache=0,this.adadeltaCache=[...new Array(size)].map(v=>0),this.getAdadeltaCache=(i=>this.adadeltaCache[i]),this.setAdadeltaCache=((i,v)=>this.adadeltaCache[i]=v));break;case"adam":this.m=0,this.v=0}"rrelu"==activation?this.rreluSlope=.001*Math.random():"elu"==activation&&(this.eluAlpha=eluAlpha)}getWeight(i){return this.weights[i]}setWeight(i,v){this.weights[i]=v}getDeltaWeight(i){return this.deltaWeights[i]}setDeltaWeight(i,v){this.deltaWeights[i]=v}}"undefined"!=typeof window&&(window.Neuron=Neuron),exports.Neuron=Neuron;class OutputLayer extends FCLayer{constructor(size,{activation:activation,softmax:softmax}={}){super(size,{activation:activation}),softmax&&(this.softmax=!0)}forward(){if(super.forward(),this.softmax){const softmax=NetMath.softmax(this.neurons.map(n=>n.activation));for(let s=0;s[...new Array(this.outMapSize)].map(row=>[...new Array(this.outMapSize)].map(v=>0))),this.errors=[...new Array(this.channels)].map(channel=>[...new Array(prevLayerOutWidth)].map(row=>[...new Array(prevLayerOutWidth)].map(v=>0))),this.indeces=this.activations.map(channel=>channel.map(row=>row.map(v=>[0,0])))}forward(){for(let channel=0;channel new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach(filter => {\r\n\r\n filter.weights = [...new Array(this.channels)].map(channelWeights => {\r\n return [...new Array(this.filterSize)].map(weightsRow => this.net.weightsInitFn(this.filterSize, this.weightsConfig))\r\n })\r\n\r\n filter.activationMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.errorMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.bias = 1\r\n\r\n if (this.net.dropout != 1) {\r\n filter.dropoutMap = filter.activationMap.map(row => row.map(v => false))\r\n }\r\n\r\n filter.init({\r\n updateFn: this.net.updateFn,\r\n activation: this.activationName || this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let filterI=0; filterI this.net.dropout)) {\r\n filter.activationMap[sumY][sumX] = 0\r\n } else if (this.activation) {\r\n filter.activationMap[sumY][sumX] = this.activation(filter.sumMap[sumY][sumX], false, filter) / (this.net.dropout||1)\r\n } else {\r\n filter.activationMap[sumY][sumX] = filter.sumMap[sumY][sumX]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n backward () {\r\n\r\n // First, get the filters' error maps\r\n if (this.nextLayer instanceof FCLayer) {\r\n\r\n // For each filter, build the errorMap from the weighted neuron errors in the next FCLayer corresponding to each value in the activation map\r\n for (let filterI=0; filterI 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n filter.weights[channel][row][col] = this.net.weightUpdateFn.bind(this.net, filter.weights[channel][row][col],\r\n regularized, filter, [channel, row, col])()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += filter.weights[channel][row][col]**2\r\n }\r\n }\r\n }\r\n\r\n filter.bias = this.net.weightUpdateFn.bind(this.net, filter.bias, filter.deltaBias, filter)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let f=0; f {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.state = \"not-initialised\"\r\n\r\n if (activation!=undefined) {\r\n if (typeof activation==\"boolean\" && !activation) {\r\n this.activation = false\r\n } else {\r\n this.activation = typeof activation==\"function\" ? activation : NetMath[NetUtil.format(activation)].bind(this)\r\n }\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n }\r\n\r\n init () {\r\n this.neurons.forEach(neuron => {\r\n\r\n let weightsCount\r\n\r\n switch (true) {\r\n case this.prevLayer instanceof FCLayer:\r\n weightsCount = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n weightsCount = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n weightsCount = this.prevLayer.activations.length * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.weights = this.net.weightsInitFn(weightsCount, this.weightsConfig)\r\n neuron.bias = 1\r\n\r\n neuron.init({\r\n updateFn: this.net.updateFn,\r\n activationConfig: this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n this.neurons.forEach((neuron, ni) => {\r\n if (this.state==\"training\" && (neuron.dropped = Math.random() > this.net.dropout)) {\r\n neuron.activation = 0\r\n } else {\r\n neuron.sum = neuron.bias\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let ai=0; ai {\r\n\r\n if (neuron.dropped) {\r\n neuron.error = 0\r\n neuron.deltaBias += 0\r\n } else {\r\n if (typeof errors !== \"undefined\") {\r\n neuron.error = errors[ni]\r\n } else {\r\n neuron.derivative = this.activation ? this.activation(neuron.sum, true, neuron) : 1\r\n neuron.error = neuron.derivative * this.nextLayer.neurons.map(n => n.error * (n.weights[ni]||0))\r\n .reduce((p,c) => p+c, 0)\r\n }\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let wi=0; wi 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n neuron.weights[dwi] = this.net.weightUpdateFn.bind(this.net, neuron.weights[dwi], regularized, neuron, dwi)()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += neuron.weights[dwi]**2\r\n }\r\n\r\n neuron.bias = this.net.weightUpdateFn.bind(this.net, neuron.bias, neuron.deltaBias, neuron)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let n=0; n {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=neuron.weights.length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let n=0; n channel.map(wRow => wRow.map(w => 0)))\r\n this.deltaBias = 0\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = this.weights.map(channel => channel.map(wRow => wRow.map(w => 1)))\r\n this.getWeightGain = ([channel, row, column]) => this.weightGains[channel][row][column]\r\n this.setWeightGain = ([channel, row, column], v) => this.weightGains[channel][row][column] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getWeightsCache = ([channel, row, column]) => this.weightsCache[channel][row][column]\r\n this.setWeightsCache = ([channel, row, column], v) => this.weightsCache[channel][row][column] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getAdadeltaCache = ([channel, row, column]) => this.adadeltaCache[channel][row][column]\r\n this.setAdadeltaCache = ([channel, row, column], v) => this.adadeltaCache[channel][row][column] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight ([channel, row, column]) {\r\n return this.weights[channel][row][column]\r\n }\r\n\r\n setWeight ([channel, row, column], v) {\r\n this.weights[channel][row][column] = v\r\n }\r\n\r\n getDeltaWeight ([channel, row, column]) {\r\n return this.deltaWeights[channel][row][column]\r\n }\r\n\r\n setDeltaWeight ([channel, row, column], v) {\r\n this.deltaWeights[channel][row][column] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Filter = Filter)\r\nexports.Filter = Filter\r\n\"use strict\"\r\n\r\nclass InputLayer extends FCLayer {\r\n constructor (size, {span=1}={}) {\r\n super(size * span*span)\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.InputLayer = InputLayer)\r\nexports.InputLayer = InputLayer\r\n\r\n\"use strict\"\r\n\r\nclass NetMath {\r\n\r\n // Activation functions\r\n static sigmoid (value, prime) {\r\n const val = 1/(1+Math.exp(-value))\r\n return prime ? val*(1-val)\r\n : val\r\n }\r\n\r\n static tanh (value, prime) {\r\n const exp = Math.exp(2*value)\r\n return prime ? 4/Math.pow(Math.exp(value)+Math.exp(-value), 2) || 1e-18\r\n : (exp-1)/(exp+1) || 1e-18\r\n }\r\n\r\n static relu (value, prime) {\r\n return prime ? value > 0 ? 1 : 0\r\n : Math.max(value, 0)\r\n }\r\n\r\n static lrelu (value, prime) {\r\n return prime ? value > 0 ? 1 : (this.lreluSlope || -0.0005)\r\n : Math.max((this.lreluSlope || -0.0005)*Math.abs(value), value)\r\n }\r\n\r\n static rrelu (value, prime, neuron) {\r\n return prime ? value > 0 ? 1 : neuron.rreluSlope\r\n : Math.max(neuron.rreluSlope, value)\r\n }\r\n\r\n static lecuntanh (value, prime) {\r\n return prime ? 1.15333 * Math.pow(NetMath.sech((2/3) * value), 2)\r\n : 1.7159 * NetMath.tanh((2/3) * value)\r\n }\r\n\r\n static elu (value, prime, neuron) {\r\n return prime ? value >=0 ? 1 : NetMath.elu(value, false, neuron) + neuron.eluAlpha\r\n : value >=0 ? value : neuron.eluAlpha * (Math.exp(value) - 1)\r\n }\r\n\r\n // Cost functions\r\n static crossentropy (target, output) {\r\n return output.map((value, vi) => target[vi] * Math.log(value+1e-15) + ((1-target[vi]) * Math.log((1+1e-15)-value)))\r\n .reduce((p,c) => p-c, 0)\r\n }\r\n\r\n static meansquarederror (calculated, desired) {\r\n return calculated.map((output, index) => Math.pow(output - desired[index], 2))\r\n .reduce((prev, curr) => prev+curr, 0) / calculated.length\r\n }\r\n\r\n static rootmeansquarederror (calculated, desired) {\r\n return Math.sqrt(NetMath.meansquarederror(calculated, desired))\r\n }\r\n\r\n // Weight updating functions\r\n static vanillasgd (value, deltaValue) {\r\n return value + this.learningRate * deltaValue\r\n }\r\n\r\n static gain (value, deltaValue, neuron, weightI) {\r\n\r\n const newVal = value + this.learningRate * deltaValue * (weightI==null ? neuron.biasGain : neuron.getWeightGain(weightI))\r\n\r\n if (newVal<=0 && value>0 || newVal>=0 && value<0){\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.max(neuron.getWeightGain(weightI)*0.95, 0.5))\r\n } else {\r\n neuron.biasGain = Math.max(neuron.biasGain*0.95, 0.5)\r\n }\r\n } else {\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.min(neuron.getWeightGain(weightI)+0.05, 5))\r\n } else {\r\n neuron.biasGain = Math.min(neuron.biasGain+0.05, 5)\r\n }\r\n }\r\n\r\n return newVal\r\n }\r\n\r\n static adagrad (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, neuron.getWeightsCache(weightI) + Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache += Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static rmsprop (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rmsDecay * neuron.getWeightsCache(weightI) + (1 - this.rmsDecay) * Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache = this.rmsDecay * neuron.biasCache + (1 - this.rmsDecay) * Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static adam (value, deltaValue, neuron) {\r\n\r\n neuron.m = 0.9*neuron.m + (1-0.9) * deltaValue\r\n const mt = neuron.m / (1-Math.pow(0.9, this.iterations + 1))\r\n\r\n neuron.v = 0.999*neuron.v + (1-0.999) * Math.pow(deltaValue, 2)\r\n const vt = neuron.v / (1-Math.pow(0.999, this.iterations + 1))\r\n\r\n return value + this.learningRate * mt / (Math.sqrt(vt) + 1e-8)\r\n }\r\n\r\n static adadelta (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rho * neuron.getWeightsCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n const newVal = value + Math.sqrt((neuron.getAdadeltaCache(weightI) + 1e-6)/(neuron.getWeightsCache(weightI) + 1e-6)) * deltaValue\r\n neuron.setAdadeltaCache(weightI, this.rho * neuron.getAdadeltaCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n return newVal\r\n\r\n } else {\r\n neuron.biasCache = this.rho * neuron.biasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n const newVal = value + Math.sqrt((neuron.adadeltaBiasCache + 1e-6)/(neuron.biasCache + 1e-6)) * deltaValue\r\n neuron.adadeltaBiasCache = this.rho * neuron.adadeltaBiasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n return newVal\r\n }\r\n }\r\n\r\n static momentum (value, deltaValue, neuron, weightI) {\r\n\r\n let v\r\n\r\n if (weightI!=null) {\r\n v = this.momentum * (neuron.getWeightsCache(weightI)) - this.learningRate * deltaValue\r\n neuron.setWeightsCache(weightI, v)\r\n } else {\r\n v = this.momentum * (neuron.biasCache) - this.learningRate * deltaValue\r\n neuron.biasCache = v\r\n }\r\n\r\n return value - v\r\n }\r\n\r\n // Weights init\r\n static uniform (size, {limit}) {\r\n const values = []\r\n\r\n for (let i=0; i= 1 || !r)\r\n\r\n values.push(mean + (x1 * (Math.sqrt(-2 * Math.log(r) / r))) * stdDeviation)\r\n }\r\n\r\n return values\r\n }\r\n\r\n static xaviernormal (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(2/(fanIn+fanOut))})\r\n : NetMath.lecunnormal(size, {fanIn})\r\n }\r\n\r\n static xavieruniform (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.uniform(size, {limit: Math.sqrt(6/(fanIn+fanOut))})\r\n : NetMath.lecununiform(size, {fanIn})\r\n }\r\n\r\n static lecunnormal (size, {fanIn}) {\r\n return NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(1/fanIn)})\r\n }\r\n\r\n static lecununiform (size, {fanIn}) {\r\n return NetMath.uniform(size, {limit: Math.sqrt(3/fanIn)})\r\n }\r\n\r\n // Pool\r\n static maxPool (layer, channel) {\r\n\r\n const activations = NetUtil.getActivations(layer.prevLayer, channel, layer.inMapValuesCount)\r\n\r\n for (let row=0; row activation) {\r\n activation = value\r\n layer.indeces[channel][row][col] = [filterRow, filterCol]\r\n }\r\n }\r\n }\r\n\r\n layer.activations[channel][row][col] = activation\r\n }\r\n }\r\n }\r\n\r\n // Other\r\n static softmax (v) {\r\n\r\n const values = v.slice(0)\r\n let maxValue = values[0]\r\n\r\n for (let i=1; i maxValue) {\r\n maxValue = values[i]\r\n }\r\n }\r\n\r\n // Exponentials\r\n const exponentials = new Array(values.length)\r\n let exponentialsSum = 0.0\r\n\r\n for (let i=0; i p+c) / arr.length\r\n const diffs = arr.map(v => v - avg).map(v => v**2)\r\n return Math.sqrt(diffs.reduce((p,c) => p+c) / diffs.length)\r\n }\r\n\r\n static maxNorm () {\r\n\r\n if (this.maxNormTotal > this.maxNorm) {\r\n\r\n const multiplier = this.maxNorm / (1e-18 + this.maxNormTotal)\r\n\r\n this.layers.forEach((layer, li) => {\r\n li && layer.neurons.forEach(neuron => {\r\n neuron.weights.forEach((w, wi) => neuron.setWeight(wi, neuron.getWeight(wi) * multiplier))\r\n })\r\n })\r\n }\r\n\r\n this.maxNormTotal = 0\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.NetMath = NetMath)\r\nexports.NetMath = NetMath\r\n\"use strict\"\r\n\r\nclass NetUtil {\r\n\r\n static format (value, type=\"string\") {\r\n switch (true) {\r\n\r\n case type==\"string\" && typeof value==\"string\":\r\n value = value.replace(/(_|\\s)/g, \"\").toLowerCase()\r\n break\r\n\r\n case type==\"time\" && typeof value==\"number\":\r\n const date = new Date(value)\r\n const formatted = []\r\n\r\n if (value < 1000) {\r\n formatted.push(`${date.getMilliseconds()}ms`)\r\n\r\n } else if (value < 60000) {\r\n formatted.push(`${date.getSeconds()}.${date.getMilliseconds()}s`)\r\n\r\n } else {\r\n\r\n if (value >= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static addZeroPadding (map, zP) {\r\n\r\n const data = []\r\n\r\n for (let row=0; row 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; i {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.state = \"constructed\"\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.state = \"constructed\"\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n }\r\n }\r\n\r\n this.collectedErrors = {training: [], validation: [], test: []}\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n switch (this.state) {\r\n\r\n case \"initialised\":\r\n return\r\n\r\n case \"not-defined\":\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n break\r\n }\r\n\r\n this.layers.forEach(this.joinLayer.bind(this))\r\n\r\n const outSize = this.layers[this.layers.length-1].size\r\n this.trainingConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.testConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.validationConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n\r\n this.state = \"initialised\"\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.activation = layer.activation==undefined ? this.activation : layer.activation\r\n\r\n layer.weightsConfig = {}\r\n Object.assign(layer.weightsConfig, this.weightsConfig)\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n\r\n layer.weightsConfig.fanIn = layer.prevLayer.size\r\n\r\n if (layerIndex 1) {\r\n layer.weightsConfig.fanOut = this.layers[1].size\r\n }\r\n\r\n layer.state = \"initialised\"\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c neuron.activation = data[ni])\r\n this.layers.forEach((layer, li) => li && layer.forward())\r\n\r\n return this.layers[this.layers.length-1].neurons.map(n => n.activation)\r\n }\r\n\r\n backward (errors) {\r\n\r\n if (errors === undefined) {\r\n throw new Error(\"No data passed to Network.backward()\")\r\n }\r\n\r\n if (errors.length != this.layers[this.layers.length-1].neurons.length) {\r\n console.warn(\"Expected data length did not match output layer neurons count.\", errors)\r\n }\r\n\r\n this.layers[this.layers.length-1].backward(errors)\r\n\r\n for (let layerIndex=this.layers.length-2; layerIndex>0; layerIndex--) {\r\n this.layers[layerIndex].backward()\r\n }\r\n }\r\n\r\n train (dataSet, {epochs=1, callback, callbackInterval=1, collectErrors, log=true, miniBatchSize=1, shuffle=false, validation}={}) {\r\n\r\n this.miniBatchSize = typeof miniBatchSize==\"boolean\" && miniBatchSize ? dataSet[0].expected.length : miniBatchSize\r\n this.validation = validation\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if (shuffle) {\r\n NetUtil.shuffle(dataSet)\r\n }\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch Size: ${this.miniBatchSize}`)\r\n }\r\n\r\n if (dataSet === undefined || dataSet === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers.bind(this, dataSet[0].input.length, dataSet[0].expected.length)()\r\n }\r\n\r\n this.layers.forEach(layer => layer.state = \"training\")\r\n\r\n if (this.validation) {\r\n this.validation.interval = this.validation.interval || dataSet.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = Infinity\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.validation.earlyStopping.bestError = Infinity\r\n break\r\n }\r\n }\r\n }\r\n\r\n let iterationIndex = 0\r\n let epochsCounter = 0\r\n let elapsed\r\n const startTime = Date.now()\r\n\r\n const logAndResolve = () => {\r\n this.layers.forEach(layer => layer.state = \"initialised\")\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n for (let l=1; l {\r\n this.epochs++\r\n this.error = 0\r\n this.validationError = 0\r\n iterationIndex = 0\r\n\r\n if (this.l2Error!=undefined) this.l2Error = 0\r\n if (this.l1Error!=undefined) this.l1Error = 0\r\n\r\n doIteration()\r\n }\r\n\r\n const doIteration = async () => {\r\n\r\n if (!dataSet[iterationIndex].hasOwnProperty(\"input\") || !dataSet[iterationIndex].hasOwnProperty(\"expected\")) {\r\n return void reject(\"Data set must be a list of objects with keys: 'input' and 'expected'\")\r\n }\r\n\r\n let trainingError\r\n let validationError\r\n\r\n const input = dataSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = dataSet[iterationIndex].expected\r\n\r\n let classification = -Infinity\r\n const errors = []\r\n for (let n=0; n= dataSet.length) {\r\n this.applyDeltaWeights()\r\n }\r\n\r\n trainingError = this.cost(target, output)\r\n this.error += trainingError\r\n this.iterations++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (collectErrors) {\r\n this.collectedErrors.training.push(trainingError)\r\n\r\n if (validationError) {\r\n this.collectedErrors.validation.push(validationError)\r\n }\r\n }\r\n\r\n if ((iterationIndex%callbackInterval == 0 || validationError) && typeof callback==\"function\") {\r\n callback({\r\n iterations: this.iterations,\r\n validations: this.validations,\r\n validationError, trainingError,\r\n elapsed, input\r\n })\r\n }\r\n\r\n if (iterationIndex < dataSet.length) {\r\n\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n\r\n } else {\r\n epochsCounter++\r\n\r\n if (log) {\r\n let text = `Epoch: ${this.epochs}\\nTraining Error: ${this.error/iterationIndex}`\r\n\r\n if (validation) {\r\n text += `\\nValidation Error: ${this.validationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochsCounter, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochsCounter < epochs) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n\r\n this.resetDeltaWeights()\r\n doEpoch()\r\n })\r\n }\r\n\r\n validate (data) {\r\n return new Promise((resolve, reject) => {\r\n let validationIndex = 0\r\n let totalValidationErrors = 0\r\n\r\n const validateItem = (item) => {\r\n\r\n const output = this.forward(data[validationIndex].input)\r\n const target = data[validationIndex].expected\r\n\r\n let classification = -Infinity\r\n for (let i=0; i validateItem(validationIndex), 0)\r\n } else {\r\n this.lastValidationError = totalValidationErrors / data.length\r\n resolve(totalValidationErrors / data.length)\r\n }\r\n }\r\n validateItem(validationIndex)\r\n })\r\n }\r\n\r\n checkEarlyStopping (errors) {\r\n\r\n let stop = false\r\n\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n stop = this.lastValidationError <= this.validation.earlyStopping.threshold\r\n\r\n // Do the last backward pass\r\n if (stop) {\r\n this.backward(errors)\r\n this.applyDeltaWeights()\r\n }\r\n\r\n return stop\r\n\r\n case \"patience\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l=this.validation.earlyStopping.patience\r\n }\r\n return stop\r\n\r\n case \"divergence\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l= (1+this.validation.earlyStopping.percent/100)\r\n }\r\n\r\n return stop\r\n }\r\n }\r\n\r\n test (testSet, {log=true, callback, collectErrors}={}) {\r\n return new Promise((resolve, reject) => {\r\n\r\n if (testSet === undefined || testSet === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n let totalError = 0\r\n let iterationIndex = 0\r\n const startTime = Date.now()\r\n\r\n const testInput = () => {\r\n\r\n const input = testSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = testSet[iterationIndex].expected\r\n const elapsed = Date.now() - startTime\r\n\r\n let classification = -Infinity\r\n for (let i=0; i li && layer.resetDeltaWeights())\r\n }\r\n\r\n applyDeltaWeights () {\r\n\r\n this.layers.forEach((layer, li) => li && layer.applyDeltaWeights())\r\n\r\n if (this.maxNorm!=undefined) {\r\n this.maxNormTotal = Math.sqrt(this.maxNormTotal)\r\n NetMath.maxNorm.bind(this)()\r\n }\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.resetDeltaWeights()\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l 0)\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = [...new Array(size)].map(v => 1)\r\n this.getWeightGain = i => this.weightGains[i]\r\n this.setWeightGain = (i,v) => this.weightGains[i] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = [...new Array(size)].map(v => 0)\r\n this.getWeightsCache = i => this.weightsCache[i]\r\n this.setWeightsCache = (i,v) => this.weightsCache[i] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = [...new Array(size)].map(v => 0)\r\n this.getAdadeltaCache = i => this.adadeltaCache[i]\r\n this.setAdadeltaCache = (i,v) => this.adadeltaCache[i] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight (i) {\r\n return this.weights[i]\r\n }\r\n\r\n setWeight (i, v) {\r\n this.weights[i] = v\r\n }\r\n\r\n getDeltaWeight (i) {\r\n return this.deltaWeights[i]\r\n }\r\n\r\n setDeltaWeight (i, v) {\r\n this.deltaWeights[i] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron\r\n\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n\r\n forward () {\r\n\r\n super.forward()\r\n\r\n if (this.softmax) {\r\n\r\n const softmax = NetMath.softmax(this.neurons.map(n => n.activation))\r\n\r\n for (let s=0; s {\r\n return [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n })\r\n this.errors = [...new Array(this.channels)].map(channel => {\r\n return [...new Array(prevLayerOutWidth)].map(row => [...new Array(prevLayerOutWidth)].map(v => 0))\r\n })\r\n this.indeces = this.activations.map(channel => channel.map(row => row.map(v => [0,0])))\r\n }\r\n\r\n forward () {\r\n for (let channel=0; channel new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach(filter => {\r\n\r\n filter.weights = [...new Array(this.channels)].map(channelWeights => {\r\n return [...new Array(this.filterSize)].map(weightsRow => this.net.weightsInitFn(this.filterSize, this.weightsConfig))\r\n })\r\n\r\n filter.activationMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.errorMap = [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n filter.bias = 1\r\n\r\n if (this.net.dropout != 1) {\r\n filter.dropoutMap = filter.activationMap.map(row => row.map(v => false))\r\n }\r\n\r\n filter.init({\r\n updateFn: this.net.updateFn,\r\n activation: this.activationName || this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let filterI=0; filterI this.net.dropout)) {\r\n filter.activationMap[sumY][sumX] = 0\r\n } else if (this.activation) {\r\n filter.activationMap[sumY][sumX] = this.activation(filter.sumMap[sumY][sumX], false, filter) / (this.net.dropout||1)\r\n } else {\r\n filter.activationMap[sumY][sumX] = filter.sumMap[sumY][sumX]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n backward () {\r\n\r\n // First, get the filters' error maps\r\n if (this.nextLayer instanceof FCLayer) {\r\n\r\n // For each filter, build the errorMap from the weighted neuron errors in the next FCLayer corresponding to each value in the activation map\r\n for (let filterI=0; filterI 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n filter.weights[channel][row][col] = this.net.weightUpdateFn.bind(this.net, filter.weights[channel][row][col],\r\n regularized, filter, [channel, row, col])()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += filter.weights[channel][row][col]**2\r\n }\r\n }\r\n }\r\n\r\n filter.bias = this.net.weightUpdateFn.bind(this.net, filter.bias, filter.deltaBias, filter)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let f=0; f {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.state = \"not-initialised\"\r\n\r\n if (activation!=undefined) {\r\n if (typeof activation==\"boolean\" && !activation) {\r\n this.activation = false\r\n } else {\r\n this.activation = typeof activation==\"function\" ? activation : NetMath[NetUtil.format(activation)].bind(this)\r\n }\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n }\r\n\r\n init () {\r\n this.neurons.forEach(neuron => {\r\n\r\n let weightsCount\r\n\r\n switch (true) {\r\n case this.prevLayer instanceof FCLayer:\r\n weightsCount = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n weightsCount = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n weightsCount = this.prevLayer.activations.length * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.weights = this.net.weightsInitFn(weightsCount, this.weightsConfig)\r\n neuron.bias = 1\r\n\r\n neuron.init({\r\n updateFn: this.net.updateFn,\r\n activationConfig: this.net.activationConfig,\r\n eluAlpha: this.net.eluAlpha\r\n })\r\n })\r\n }\r\n\r\n forward () {\r\n this.neurons.forEach((neuron, ni) => {\r\n if (this.state==\"training\" && (neuron.dropped = Math.random() > this.net.dropout)) {\r\n neuron.activation = 0\r\n } else {\r\n neuron.sum = neuron.bias\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let ai=0; ai {\r\n\r\n if (neuron.dropped) {\r\n neuron.error = 0\r\n neuron.deltaBias += 0\r\n } else {\r\n if (typeof errors !== \"undefined\") {\r\n neuron.error = errors[ni]\r\n } else {\r\n neuron.derivative = this.activation ? this.activation(neuron.sum, true, neuron) : 1\r\n neuron.error = neuron.derivative * this.nextLayer.neurons.map(n => n.error * (n.weights[ni]||0))\r\n .reduce((p,c) => p+c, 0)\r\n }\r\n\r\n const activations = NetUtil.getActivations(this.prevLayer)\r\n\r\n for (let wi=0; wi 0 ? 1 : -1)) / this.net.miniBatchSize\r\n\r\n neuron.weights[dwi] = this.net.weightUpdateFn.bind(this.net, neuron.weights[dwi], regularized, neuron, dwi)()\r\n\r\n if (this.net.maxNorm!=undefined) this.net.maxNormTotal += neuron.weights[dwi]**2\r\n }\r\n\r\n neuron.bias = this.net.weightUpdateFn.bind(this.net, neuron.bias, neuron.deltaBias, neuron)()\r\n }\r\n }\r\n\r\n backUpValidation () {\r\n for (let n=0; n {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=neuron.weights.length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let n=0; n channel.map(wRow => wRow.map(w => 0)))\r\n this.deltaBias = 0\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = this.weights.map(channel => channel.map(wRow => wRow.map(w => 1)))\r\n this.getWeightGain = ([channel, row, column]) => this.weightGains[channel][row][column]\r\n this.setWeightGain = ([channel, row, column], v) => this.weightGains[channel][row][column] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getWeightsCache = ([channel, row, column]) => this.weightsCache[channel][row][column]\r\n this.setWeightsCache = ([channel, row, column], v) => this.weightsCache[channel][row][column] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = this.weights.map(channel => channel.map(wRow => wRow.map(w => 0)))\r\n this.getAdadeltaCache = ([channel, row, column]) => this.adadeltaCache[channel][row][column]\r\n this.setAdadeltaCache = ([channel, row, column], v) => this.adadeltaCache[channel][row][column] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight ([channel, row, column]) {\r\n return this.weights[channel][row][column]\r\n }\r\n\r\n setWeight ([channel, row, column], v) {\r\n this.weights[channel][row][column] = v\r\n }\r\n\r\n getDeltaWeight ([channel, row, column]) {\r\n return this.deltaWeights[channel][row][column]\r\n }\r\n\r\n setDeltaWeight ([channel, row, column], v) {\r\n this.deltaWeights[channel][row][column] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Filter = Filter)\r\nexports.Filter = Filter\r\n\"use strict\"\r\n\r\nclass InputLayer extends FCLayer {\r\n constructor (size, {span=1}={}) {\r\n super(size * span*span)\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.InputLayer = InputLayer)\r\nexports.InputLayer = InputLayer\r\n\r\n\"use strict\"\r\n\r\nclass NetMath {\r\n\r\n // Activation functions\r\n static sigmoid (value, prime) {\r\n const val = 1/(1+Math.exp(-value))\r\n return prime ? val*(1-val)\r\n : val\r\n }\r\n\r\n static tanh (value, prime) {\r\n const exp = Math.exp(2*value)\r\n return prime ? 4/Math.pow(Math.exp(value)+Math.exp(-value), 2) || 1e-18\r\n : (exp-1)/(exp+1) || 1e-18\r\n }\r\n\r\n static relu (value, prime) {\r\n return prime ? value > 0 ? 1 : 0\r\n : Math.max(value, 0)\r\n }\r\n\r\n static lrelu (value, prime) {\r\n return prime ? value > 0 ? 1 : (this.lreluSlope || -0.0005)\r\n : Math.max((this.lreluSlope || -0.0005)*Math.abs(value), value)\r\n }\r\n\r\n static rrelu (value, prime, neuron) {\r\n return prime ? value > 0 ? 1 : neuron.rreluSlope\r\n : Math.max(neuron.rreluSlope, value)\r\n }\r\n\r\n static lecuntanh (value, prime) {\r\n return prime ? 1.15333 * Math.pow(NetMath.sech((2/3) * value), 2)\r\n : 1.7159 * NetMath.tanh((2/3) * value)\r\n }\r\n\r\n static elu (value, prime, neuron) {\r\n return prime ? value >=0 ? 1 : NetMath.elu(value, false, neuron) + neuron.eluAlpha\r\n : value >=0 ? value : neuron.eluAlpha * (Math.exp(value) - 1)\r\n }\r\n\r\n // Cost functions\r\n static crossentropy (target, output) {\r\n return output.map((value, vi) => target[vi] * Math.log(value+1e-15) + ((1-target[vi]) * Math.log((1+1e-15)-value)))\r\n .reduce((p,c) => p-c, 0)\r\n }\r\n\r\n static meansquarederror (calculated, desired) {\r\n return calculated.map((output, index) => Math.pow(output - desired[index], 2))\r\n .reduce((prev, curr) => prev+curr, 0) / calculated.length\r\n }\r\n\r\n static rootmeansquarederror (calculated, desired) {\r\n return Math.sqrt(NetMath.meansquarederror(calculated, desired))\r\n }\r\n\r\n // Weight updating functions\r\n static vanillasgd (value, deltaValue) {\r\n return value + this.learningRate * deltaValue\r\n }\r\n\r\n static gain (value, deltaValue, neuron, weightI) {\r\n\r\n const newVal = value + this.learningRate * deltaValue * (weightI==null ? neuron.biasGain : neuron.getWeightGain(weightI))\r\n\r\n if (newVal<=0 && value>0 || newVal>=0 && value<0){\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.max(neuron.getWeightGain(weightI)*0.95, 0.5))\r\n } else {\r\n neuron.biasGain = Math.max(neuron.biasGain*0.95, 0.5)\r\n }\r\n } else {\r\n if (weightI!=null) {\r\n neuron.setWeightGain(weightI, Math.min(neuron.getWeightGain(weightI)+0.05, 5))\r\n } else {\r\n neuron.biasGain = Math.min(neuron.biasGain+0.05, 5)\r\n }\r\n }\r\n\r\n return newVal\r\n }\r\n\r\n static adagrad (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, neuron.getWeightsCache(weightI) + Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache += Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static rmsprop (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rmsDecay * neuron.getWeightsCache(weightI) + (1 - this.rmsDecay) * Math.pow(deltaValue, 2))\r\n } else {\r\n neuron.biasCache = this.rmsDecay * neuron.biasCache + (1 - this.rmsDecay) * Math.pow(deltaValue, 2)\r\n }\r\n\r\n return value + this.learningRate * deltaValue / (1e-6 + Math.sqrt(weightI!=null ? neuron.getWeightsCache(weightI)\r\n : neuron.biasCache))\r\n }\r\n\r\n static adam (value, deltaValue, neuron) {\r\n\r\n neuron.m = 0.9*neuron.m + (1-0.9) * deltaValue\r\n const mt = neuron.m / (1-Math.pow(0.9, this.iterations + 1))\r\n\r\n neuron.v = 0.999*neuron.v + (1-0.999) * Math.pow(deltaValue, 2)\r\n const vt = neuron.v / (1-Math.pow(0.999, this.iterations + 1))\r\n\r\n return value + this.learningRate * mt / (Math.sqrt(vt) + 1e-8)\r\n }\r\n\r\n static adadelta (value, deltaValue, neuron, weightI) {\r\n\r\n if (weightI!=null) {\r\n neuron.setWeightsCache(weightI, this.rho * neuron.getWeightsCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n const newVal = value + Math.sqrt((neuron.getAdadeltaCache(weightI) + 1e-6)/(neuron.getWeightsCache(weightI) + 1e-6)) * deltaValue\r\n neuron.setAdadeltaCache(weightI, this.rho * neuron.getAdadeltaCache(weightI) + (1-this.rho) * Math.pow(deltaValue, 2))\r\n return newVal\r\n\r\n } else {\r\n neuron.biasCache = this.rho * neuron.biasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n const newVal = value + Math.sqrt((neuron.adadeltaBiasCache + 1e-6)/(neuron.biasCache + 1e-6)) * deltaValue\r\n neuron.adadeltaBiasCache = this.rho * neuron.adadeltaBiasCache + (1-this.rho) * Math.pow(deltaValue, 2)\r\n return newVal\r\n }\r\n }\r\n\r\n static momentum (value, deltaValue, neuron, weightI) {\r\n\r\n let v\r\n\r\n if (weightI!=null) {\r\n v = this.momentum * (neuron.getWeightsCache(weightI)) - this.learningRate * deltaValue\r\n neuron.setWeightsCache(weightI, v)\r\n } else {\r\n v = this.momentum * (neuron.biasCache) - this.learningRate * deltaValue\r\n neuron.biasCache = v\r\n }\r\n\r\n return value - v\r\n }\r\n\r\n // Weights init\r\n static uniform (size, {limit}) {\r\n const values = []\r\n\r\n for (let i=0; i= 1 || !r)\r\n\r\n values.push(mean + (x1 * (Math.sqrt(-2 * Math.log(r) / r))) * stdDeviation)\r\n }\r\n\r\n return values\r\n }\r\n\r\n static xaviernormal (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(2/(fanIn+fanOut))})\r\n : NetMath.lecunnormal(size, {fanIn})\r\n }\r\n\r\n static xavieruniform (size, {fanIn, fanOut}) {\r\n return fanOut || fanOut==0 ? NetMath.uniform(size, {limit: Math.sqrt(6/(fanIn+fanOut))})\r\n : NetMath.lecununiform(size, {fanIn})\r\n }\r\n\r\n static lecunnormal (size, {fanIn}) {\r\n return NetMath.gaussian(size, {mean: 0, stdDeviation: Math.sqrt(1/fanIn)})\r\n }\r\n\r\n static lecununiform (size, {fanIn}) {\r\n return NetMath.uniform(size, {limit: Math.sqrt(3/fanIn)})\r\n }\r\n\r\n // Pool\r\n static maxPool (layer, channel) {\r\n\r\n const activations = NetUtil.getActivations(layer.prevLayer, channel, layer.inMapValuesCount)\r\n\r\n for (let row=0; row activation) {\r\n activation = value\r\n layer.indeces[channel][row][col] = [filterRow, filterCol]\r\n }\r\n }\r\n }\r\n\r\n layer.activations[channel][row][col] = activation\r\n }\r\n }\r\n }\r\n\r\n // Other\r\n static softmax (v) {\r\n\r\n const values = v.slice(0)\r\n let maxValue = values[0]\r\n\r\n for (let i=1; i maxValue) {\r\n maxValue = values[i]\r\n }\r\n }\r\n\r\n // Exponentials\r\n const exponentials = new Array(values.length)\r\n let exponentialsSum = 0.0\r\n\r\n for (let i=0; i p+c) / arr.length\r\n const diffs = arr.map(v => v - avg).map(v => v**2)\r\n return Math.sqrt(diffs.reduce((p,c) => p+c) / diffs.length)\r\n }\r\n\r\n static maxNorm () {\r\n\r\n if (this.maxNormTotal > this.maxNorm) {\r\n\r\n const multiplier = this.maxNorm / (1e-18 + this.maxNormTotal)\r\n\r\n this.layers.forEach((layer, li) => {\r\n li && layer.neurons.forEach(neuron => {\r\n neuron.weights.forEach((w, wi) => neuron.setWeight(wi, neuron.getWeight(wi) * multiplier))\r\n })\r\n })\r\n }\r\n\r\n this.maxNormTotal = 0\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.NetMath = NetMath)\r\nexports.NetMath = NetMath\r\n\"use strict\"\r\n\r\nclass NetUtil {\r\n\r\n static format (value, type=\"string\") {\r\n switch (true) {\r\n\r\n case type==\"string\" && typeof value==\"string\":\r\n value = value.replace(/(_|\\s)/g, \"\").toLowerCase()\r\n break\r\n\r\n case type==\"time\" && typeof value==\"number\":\r\n const date = new Date(value)\r\n const formatted = []\r\n\r\n if (value < 1000) {\r\n formatted.push(`${date.getMilliseconds()}ms`)\r\n\r\n } else if (value < 60000) {\r\n formatted.push(`${date.getSeconds()}.${date.getMilliseconds()}s`)\r\n\r\n } else {\r\n\r\n if (value >= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static addZeroPadding (map, zP) {\r\n\r\n const data = []\r\n\r\n for (let row=0; row 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; i {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.state = \"constructed\"\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.state = \"constructed\"\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n }\r\n }\r\n\r\n this.collectedErrors = {training: [], validation: [], test: []}\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n switch (this.state) {\r\n\r\n case \"initialised\":\r\n return\r\n\r\n case \"not-defined\":\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n break\r\n }\r\n\r\n this.layers.forEach(this.joinLayer.bind(this))\r\n\r\n const outSize = this.layers[this.layers.length-1].size\r\n this.trainingConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.testConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n this.validationConfusionMatrix = [...new Array(outSize)].map(r => [...new Array(outSize)].map(v => 0))\r\n\r\n this.state = \"initialised\"\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.activation = layer.activation==undefined ? this.activation : layer.activation\r\n\r\n layer.weightsConfig = {}\r\n Object.assign(layer.weightsConfig, this.weightsConfig)\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n\r\n layer.weightsConfig.fanIn = layer.prevLayer.size\r\n\r\n if (layerIndex 1) {\r\n layer.weightsConfig.fanOut = this.layers[1].size\r\n }\r\n\r\n layer.state = \"initialised\"\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c neuron.activation = data[ni])\r\n this.layers.forEach((layer, li) => li && layer.forward())\r\n\r\n return this.layers[this.layers.length-1].neurons.map(n => n.activation)\r\n }\r\n\r\n backward (errors) {\r\n\r\n if (errors === undefined) {\r\n throw new Error(\"No data passed to Network.backward()\")\r\n }\r\n\r\n if (errors.length != this.layers[this.layers.length-1].neurons.length) {\r\n console.warn(\"Expected data length did not match output layer neurons count.\", errors)\r\n }\r\n\r\n this.layers[this.layers.length-1].backward(errors)\r\n\r\n for (let layerIndex=this.layers.length-2; layerIndex>0; layerIndex--) {\r\n this.layers[layerIndex].backward()\r\n }\r\n }\r\n\r\n train (dataSet, {epochs=1, callback, callbackInterval=1, collectErrors, log=true, miniBatchSize=1, shuffle=false, validation}={}) {\r\n\r\n this.miniBatchSize = typeof miniBatchSize==\"boolean\" && miniBatchSize ? dataSet[0].expected.length : miniBatchSize\r\n this.validation = validation\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if (shuffle) {\r\n NetUtil.shuffle(dataSet)\r\n }\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch Size: ${this.miniBatchSize}`)\r\n }\r\n\r\n if (dataSet === undefined || dataSet === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers.bind(this, dataSet[0].input.length, dataSet[0].expected.length)()\r\n }\r\n\r\n this.layers.forEach(layer => layer.state = \"training\")\r\n\r\n if (this.validation) {\r\n this.validation.interval = this.validation.interval || dataSet.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = Infinity\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.validation.earlyStopping.bestError = Infinity\r\n break\r\n }\r\n }\r\n }\r\n\r\n let iterationIndex = 0\r\n let epochsCounter = 0\r\n let elapsed\r\n const startTime = Date.now()\r\n\r\n const logAndResolve = () => {\r\n this.layers.forEach(layer => layer.state = \"initialised\")\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n for (let l=1; l {\r\n this.epochs++\r\n this.error = 0\r\n this.validationError = 0\r\n iterationIndex = 0\r\n\r\n if (this.l2Error!=undefined) this.l2Error = 0\r\n if (this.l1Error!=undefined) this.l1Error = 0\r\n\r\n doIteration()\r\n }\r\n\r\n const doIteration = async () => {\r\n\r\n if (!dataSet[iterationIndex].hasOwnProperty(\"input\") || !dataSet[iterationIndex].hasOwnProperty(\"expected\")) {\r\n return void reject(\"Data set must be a list of objects with keys: 'input' and 'expected'\")\r\n }\r\n\r\n let trainingError\r\n let validationError\r\n\r\n const input = dataSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = dataSet[iterationIndex].expected\r\n\r\n let classification = -Infinity\r\n const errors = []\r\n for (let n=0; n= dataSet.length) {\r\n this.applyDeltaWeights()\r\n }\r\n\r\n trainingError = this.cost(target, output)\r\n this.error += trainingError\r\n this.iterations++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (collectErrors) {\r\n this.collectedErrors.training.push(trainingError)\r\n\r\n if (validationError) {\r\n this.collectedErrors.validation.push(validationError)\r\n }\r\n }\r\n\r\n if ((iterationIndex%callbackInterval == 0 || validationError) && typeof callback==\"function\") {\r\n callback({\r\n iterations: this.iterations,\r\n validations: this.validations,\r\n validationError, trainingError,\r\n elapsed, input\r\n })\r\n }\r\n\r\n if (iterationIndex < dataSet.length) {\r\n\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n\r\n } else {\r\n epochsCounter++\r\n\r\n if (log) {\r\n let text = `Epoch: ${this.epochs}\\nTraining Error: ${this.error/iterationIndex}`\r\n\r\n if (validation) {\r\n text += `\\nValidation Error: ${this.validationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochsCounter, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochsCounter < epochs) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n\r\n this.resetDeltaWeights()\r\n doEpoch()\r\n })\r\n }\r\n\r\n validate (data) {\r\n return new Promise((resolve, reject) => {\r\n let validationIndex = 0\r\n let totalValidationErrors = 0\r\n\r\n const validateItem = (item) => {\r\n\r\n const output = this.forward(data[validationIndex].input)\r\n const target = data[validationIndex].expected\r\n\r\n let classification = -Infinity\r\n for (let i=0; i validateItem(validationIndex), 0)\r\n } else {\r\n this.lastValidationError = totalValidationErrors / data.length\r\n resolve(totalValidationErrors / data.length)\r\n }\r\n }\r\n validateItem(validationIndex)\r\n })\r\n }\r\n\r\n checkEarlyStopping (errors) {\r\n\r\n let stop = false\r\n\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n stop = this.lastValidationError <= this.validation.earlyStopping.threshold\r\n\r\n // Do the last backward pass\r\n if (stop) {\r\n this.backward(errors)\r\n this.applyDeltaWeights()\r\n }\r\n\r\n return stop\r\n\r\n case \"patience\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.patienceCounter = 0\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l=this.validation.earlyStopping.patience\r\n }\r\n return stop\r\n\r\n case \"divergence\":\r\n if (this.lastValidationError < this.validation.earlyStopping.bestError) {\r\n this.validation.earlyStopping.bestError = this.lastValidationError\r\n\r\n for (let l=1; l= (1+this.validation.earlyStopping.percent/100)\r\n }\r\n\r\n return stop\r\n }\r\n }\r\n\r\n test (testSet, {log=true, callback, collectErrors}={}) {\r\n return new Promise((resolve, reject) => {\r\n\r\n if (testSet === undefined || testSet === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n let totalError = 0\r\n let iterationIndex = 0\r\n const startTime = Date.now()\r\n\r\n const testInput = () => {\r\n\r\n const input = testSet[iterationIndex].input\r\n const output = this.forward(input)\r\n const target = testSet[iterationIndex].expected\r\n const elapsed = Date.now() - startTime\r\n\r\n let classification = -Infinity\r\n for (let i=0; i li && layer.resetDeltaWeights())\r\n }\r\n\r\n applyDeltaWeights () {\r\n\r\n this.layers.forEach((layer, li) => li && layer.applyDeltaWeights())\r\n\r\n if (this.maxNorm!=undefined) {\r\n this.maxNormTotal = Math.sqrt(this.maxNormTotal)\r\n NetMath.maxNorm.bind(this)()\r\n }\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.resetDeltaWeights()\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l 0)\r\n\r\n switch (updateFn) {\r\n\r\n case \"gain\":\r\n this.biasGain = 1\r\n this.weightGains = [...new Array(size)].map(v => 1)\r\n this.getWeightGain = i => this.weightGains[i]\r\n this.setWeightGain = (i,v) => this.weightGains[i] = v\r\n break\r\n\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n case \"momentum\":\r\n this.biasCache = 0\r\n this.weightsCache = [...new Array(size)].map(v => 0)\r\n this.getWeightsCache = i => this.weightsCache[i]\r\n this.setWeightsCache = (i,v) => this.weightsCache[i] = v\r\n\r\n if (updateFn==\"adadelta\") {\r\n this.adadeltaBiasCache = 0\r\n this.adadeltaCache = [...new Array(size)].map(v => 0)\r\n this.getAdadeltaCache = i => this.adadeltaCache[i]\r\n this.setAdadeltaCache = (i,v) => this.adadeltaCache[i] = v\r\n }\r\n break\r\n\r\n case \"adam\":\r\n this.m = 0\r\n this.v = 0\r\n break\r\n }\r\n\r\n if (activation==\"rrelu\") {\r\n this.rreluSlope = Math.random() * 0.001\r\n\r\n } else if (activation==\"elu\") {\r\n this.eluAlpha = eluAlpha\r\n }\r\n }\r\n\r\n getWeight (i) {\r\n return this.weights[i]\r\n }\r\n\r\n setWeight (i, v) {\r\n this.weights[i] = v\r\n }\r\n\r\n getDeltaWeight (i) {\r\n return this.deltaWeights[i]\r\n }\r\n\r\n setDeltaWeight (i, v) {\r\n this.deltaWeights[i] = v\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron\r\n\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n\r\n forward () {\r\n\r\n super.forward()\r\n\r\n if (this.softmax) {\r\n\r\n const softmax = NetMath.softmax(this.neurons.map(n => n.activation))\r\n\r\n for (let s=0; s {\r\n return [...new Array(this.outMapSize)].map(row => [...new Array(this.outMapSize)].map(v => 0))\r\n })\r\n this.errors = [...new Array(this.channels)].map(channel => {\r\n return [...new Array(prevLayerOutWidth)].map(row => [...new Array(prevLayerOutWidth)].map(v => 0))\r\n })\r\n this.indeces = this.activations.map(channel => channel.map(row => row.map(v => [0,0])))\r\n }\r\n\r\n forward () {\r\n for (let channel=0; channel `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n\r\n this.filters = [...new Array(this.size)].map(f => new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n const paramTypes = [\"number\", \"number\", \"number\"]\r\n const params = [this.netInstance, this.layerIndex, fi]\r\n\r\n NetUtil.defineMapProperty(filter, \"activationMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"errorMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"sumMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"dropoutMap\", paramTypes, params, this.outMapSize, this.outMapSize, {\r\n pre: \"filter_\",\r\n getCallback: m => m.map(row => row.map(v => v==1))\r\n })\r\n\r\n filter.init(this.netInstance, this.layerIndex, fi, {\r\n updateFn: this.net.updateFn,\r\n filterSize: this.filterSize,\r\n channels: this.channels\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.filters.map(filter => {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.layerIndex = 0\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n if (this.activationName || this.net.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"fc_\",\r\n getCallback: _ => `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n }\r\n\r\n init () {\r\n this.neurons.forEach((neuron, ni) => {\r\n switch (true) {\r\n\r\n case this.prevLayer instanceof FCLayer:\r\n neuron.size = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n neuron.size = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n neuron.size = this.prevLayer.channels * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.init(this.netInstance, this.layerIndex, ni, {\r\n updateFn: this.net.updateFn\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.neurons.map(neuron => {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=(neuron.weights).length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n let size = 0\r\n\r\n for (let n=0; n> 1)\r\n break\r\n case \"HEAP32\": case \"HEAPU32\": case \"HEAPF32\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 2)\r\n break\r\n case \"HEAPF64\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 3)\r\n break\r\n }\r\n\r\n bufs.push(buf)\r\n parameters.push(buf)\r\n parameters.push(params[p].length)\r\n parameterTypes.push(\"number\")\r\n parameterTypes.push(\"number\")\r\n\r\n } else {\r\n parameters.push(params[p])\r\n parameterTypes.push(paramTypes[p]==undefined ? \"number\" : paramTypes[p])\r\n }\r\n }\r\n }\r\n\r\n res = NetUtil.Module.ccall(func, returnTypeParam, parameterTypes, parameters)\r\n } catch (e) {\r\n error = e\r\n } finally {\r\n for (let b=0; b= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static splitData (data, {training=0.7, validation=0.15, test=0.15}={}) {\r\n\r\n const split = {\r\n training: [],\r\n validation: [],\r\n test: []\r\n }\r\n\r\n // Define here splits, for returning at the end\r\n for (let i=0; i 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; ix, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(this.Module.ccall(`get_${pre}${prop}`, \"number\", valTypes, values)),\r\n set: val => this.Module.ccall(`set_${pre}${prop}`, null, valTypes.concat(\"number\"), values.concat(setCallback(val)))\r\n })\r\n }\r\n\r\n static defineArrayProperty (self, prop, valTypes, values, returnSize, {pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => NetUtil.ccallArrays(`get_${pre}${prop}`, \"array\", valTypes, values, {returnArraySize: returnSize, heapOut: \"HEAPF64\"}),\r\n set: value => NetUtil.ccallArrays(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([value]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineMapProperty (self, prop, valTypes, values, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth: 1, rows, columns, heapOut: \"HEAPF64\"})[0]),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineVolumeProperty (self, prop, valTypes, values, depth, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth, rows, columns, heapOut: \"HEAPF64\"})),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static makeConfusionMatrix (originalData) {\r\n let total = 0\r\n let totalCorrect = 0\r\n const data = []\r\n\r\n for (let r=0; r {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Module.ccall(\"getError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"validationError\", {\r\n get: () => Module.ccall(\"getValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"lastValidationError\", {\r\n get: () => Module.ccall(\"getLastValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n\r\n // Activation function get / set\r\n this.activationName = NetUtil.format(activation)\r\n Object.defineProperty(this, \"activation\", {\r\n get: () => `WASM ${this.activationName}`,\r\n set: activation => {\r\n\r\n if (NetUtil.activationsIndeces[activation] == undefined) {\r\n throw new Error(`The ${activation} activation function does not exist`)\r\n }\r\n this.activationName = activation\r\n this.Module.ccall(\"setActivation\", null, [\"number\", \"number\"], [this.netInstance, NetUtil.activationsIndeces[activation]])\r\n }\r\n })\r\n this.activation = this.activationName\r\n\r\n // Cost function get / set\r\n const costIndeces = {\r\n meansquarederror: 0,\r\n crossentropy: 1\r\n }\r\n let costFunctionName = NetUtil.format(cost)\r\n Object.defineProperty(this, \"cost\", {\r\n get: () => `WASM ${costFunctionName}`,\r\n set: cost => {\r\n if (costIndeces[cost] == undefined) {\r\n throw new Error(`The ${cost} function does not exist`)\r\n }\r\n costFunctionName = cost\r\n this.Module.ccall(\"setCostFunction\", null, [\"number\", \"number\"], [this.netInstance, costIndeces[cost]])\r\n }\r\n })\r\n this.cost = costFunctionName\r\n\r\n const updateFnIndeces = {\r\n vanillasgd: 0,\r\n gain: 1,\r\n adagrad: 2,\r\n rmsprop: 3,\r\n adam: 4,\r\n adadelta: 5,\r\n momentum: 6\r\n }\r\n NetUtil.defineProperty(this, \"updateFn\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(updateFnIndeces).find(key => updateFnIndeces[key]==index),\r\n setCallback: name => updateFnIndeces[name]\r\n })\r\n this.updateFn = NetUtil.format(updateFn)\r\n\r\n\r\n // Weights init configs\r\n const weightsConfigFns = {\r\n uniform: 0,\r\n gaussian: 1,\r\n xavieruniform: 2,\r\n xaviernormal: 3,\r\n lecununiform: 4,\r\n lecunnormal: 5\r\n }\r\n this.weightsConfig = {}\r\n\r\n NetUtil.defineProperty(this.weightsConfig, \"distribution\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(weightsConfigFns).find(key => weightsConfigFns[key]==Math.round(index)),\r\n setCallback: name => weightsConfigFns[name]\r\n })\r\n NetUtil.defineProperty(this.weightsConfig, \"limit\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"mean\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"stdDeviation\", [\"number\"], [this.netInstance])\r\n\r\n this.weightsConfig.distribution = \"xavieruniform\"\r\n\r\n if (weightsConfig!=undefined && weightsConfig.distribution) {\r\n\r\n if (typeof weightsConfig.distribution == \"function\") {\r\n throw new Error(\"Custom weights init functions are not (yet) supported with WASM.\")\r\n }\r\n\r\n this.weightsConfig.distribution = NetUtil.format(weightsConfig.distribution)\r\n }\r\n\r\n this.weightsConfig.limit = weightsConfig && weightsConfig.limit!=undefined ? weightsConfig.limit : 0.1\r\n this.weightsConfig.mean = weightsConfig && weightsConfig.mean!=undefined ? weightsConfig.mean : 0\r\n this.weightsConfig.stdDeviation = weightsConfig && weightsConfig.stdDeviation!=undefined ? weightsConfig.stdDeviation : 0.05\r\n\r\n switch (NetUtil.format(updateFn)) {\r\n\r\n case \"rmsprop\":\r\n this.learningRate = this.learningRate==undefined ? 0.001 : this.learningRate\r\n break\r\n\r\n case \"adam\":\r\n this.learningRate = this.learningRate==undefined ? 0.01 : this.learningRate\r\n break\r\n\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"rho\", [\"number\"], [this.netInstance])\r\n this.rho = rho==null ? 0.95 : rho\r\n break\r\n\r\n case \"momentum\":\r\n NetUtil.defineProperty(this, \"momentum\", [\"number\"], [this.netInstance])\r\n this.momentum = momentum\r\n break\r\n\r\n default:\r\n\r\n if (learningRate==undefined) {\r\n\r\n switch (this.activationName) {\r\n case \"relu\":\r\n case \"lrelu\":\r\n case \"rrelu\":\r\n case \"elu\":\r\n this.learningRate = 0.01\r\n break\r\n\r\n case \"tanh\":\r\n case \"lecuntanh\":\r\n this.learningRate = 0.001\r\n break\r\n\r\n default:\r\n this.learningRate = 0.2\r\n }\r\n }\r\n }\r\n\r\n if (this.updateFn==\"rmsprop\") {\r\n NetUtil.defineProperty(this, \"rmsDecay\", [\"number\"], [this.netInstance])\r\n this.rmsDecay = rmsDecay===undefined ? 0.99 : rmsDecay\r\n }\r\n\r\n if (this.activationName==\"lrelu\") {\r\n NetUtil.defineProperty(this, \"lreluSlope\", [\"number\"], [this.netInstance])\r\n this.lreluSlope = lreluSlope==undefined ? -0.0005 : lreluSlope\r\n } else if (this.activationName==\"elu\") {\r\n NetUtil.defineProperty(this, \"eluAlpha\", [\"number\"], [this.netInstance])\r\n this.eluAlpha = eluAlpha==undefined ? 1 : eluAlpha\r\n }\r\n\r\n this.layers = []\r\n this.epochs = 0\r\n\r\n NetUtil.defineProperty(this, \"iterations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validationInterval\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"trainingLogging\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"stoppedEarly\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingType\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingThreshold\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingBestError\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatienceCounter\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatience\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPercent\", [\"number\"], [this.netInstance])\r\n\r\n this.collectedErrors = {}\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"training\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"test\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"validation\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n\r\n if (layers.length) {\r\n\r\n this.state = \"constructed\"\r\n\r\n switch (true) {\r\n case layers.every(item => Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n\r\n }\r\n }\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n if (this.state == \"initialised\") {\r\n return\r\n }\r\n\r\n if (this.state == \"not-defined\") {\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n }\r\n\r\n this.state = \"initialised\"\r\n\r\n for (let l=0; l map.map(row => row.map(v => Math.floor(v)))\r\n\r\n NetUtil.defineMapProperty(this, \"trainingConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"testConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"validationConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.layerIndex = layerIndex\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n }\r\n layer.init()\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c {\r\n\r\n if (data === undefined || data === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers(data[0].input.length, data[0].expected.length)\r\n }\r\n\r\n const startTime = Date.now()\r\n\r\n const dimension = this.layers[0].size\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch size: ${miniBatchSize}`)\r\n }\r\n\r\n // Load training data\r\n const typedArray = new Float32Array(itemsCount)\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n let elapsed\r\n\r\n this.Module.ccall(\"loadTrainingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (shuffle) {\r\n this.Module.ccall(\"shuffleTrainingData\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n let validationBuf\r\n\r\n if (this.validation) {\r\n\r\n this.validationInterval = this.validation.interval || data.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n this.earlyStoppingThreshold = this.validation.earlyStopping.threshold\r\n this.earlyStoppingType = 1\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPatienceCounter = 0\r\n this.earlyStoppingPatience = this.validation.earlyStopping.patience\r\n this.earlyStoppingType = 2\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPercent = this.validation.earlyStopping.percent\r\n this.earlyStoppingType = 3\r\n break\r\n }\r\n }\r\n\r\n\r\n // Load validation data\r\n if (this.validation.data) {\r\n const typedArray = new Float32Array(this.validation.data.length)\r\n this.loadData(this.validation.data, typedArray, itemSize , reject)\r\n validationBuf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadValidationData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n }\r\n }\r\n\r\n const logAndResolve = () => {\r\n this.Module._free(buf)\r\n this.Module._free(validationBuf)\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n this.Module.ccall(\"restoreValidation\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (log) {\r\n console.log(`Training finished. Total time: ${NetUtil.format(elapsed, \"time\")}`)\r\n }\r\n resolve()\r\n }\r\n\r\n if (callback) {\r\n\r\n let epochIndex = 0\r\n let iterationIndex = 0\r\n\r\n const doEpoch = () => {\r\n\r\n if (this.l2) this.l2Error = 0\r\n if (this.l1) this.l1Error = 0\r\n\r\n iterationIndex = 0\r\n doIteration()\r\n }\r\n\r\n const doIteration = () => {\r\n\r\n this.Module.ccall(\"train\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, miniBatchSize, iterationIndex])\r\n\r\n if (iterationIndex%callbackInterval == 0 || this.validationError) {\r\n callback({\r\n iterations: (this.iterations),\r\n validations: (this.validations),\r\n trainingError: this.error,\r\n validationError: this.validationError,\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n }\r\n\r\n iterationIndex += miniBatchSize\r\n\r\n if (iterationIndex < data.length && !this.stoppedEarly) {\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n } else {\r\n epochIndex++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n let text = `Epoch: ${epochIndex}\\nTraining Error: ${this.error}`\r\n\r\n if (this.validation) {\r\n text += `\\nValidation Error: ${this.lastValidationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochIndex, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochIndex < epochs && !this.stoppedEarly) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n doEpoch()\r\n\r\n } else {\r\n for (let e=0; e {\r\n\r\n if (data === undefined || data === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n const startTime = Date.now()\r\n const dimension = data[0].input.length\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n const typedArray = new Float32Array(itemsCount)\r\n\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadTestingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (callback) {\r\n\r\n let iterationIndex = 0\r\n let totalError = 0\r\n\r\n const doIteration = () => {\r\n\r\n totalError += this.Module.ccall(\"test\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, 1, iterationIndex])\r\n\r\n callback({\r\n iterations: (iterationIndex+1),\r\n error: totalError/(iterationIndex+1),\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n\r\n if (++iterationIndex < data.length) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n iterationIndex\r\n\r\n const elapsed = Date.now() - startTime\r\n log && console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/iterationIndex, \"time\")}`)\r\n\r\n this.Module._free(buf)\r\n resolve(totalError/data.length)\r\n }\r\n }\r\n\r\n doIteration()\r\n\r\n } else {\r\n\r\n const avgError = this.Module.ccall(\"test\", \"number\", [\"number\", \"number\"], [this.netInstance, -1, 0])\r\n this.Module._free(buf)\r\n\r\n const elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/data.length, \"time\")}`)\r\n }\r\n\r\n resolve(avgError)\r\n }\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.Module.ccall(\"resetDeltaWeights\", null, [\"number\"], [this.netInstance])\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l v==1,\r\n setCallback: v => v ? 1 : 0\r\n })\r\n NetUtil.defineProperty(this, \"activation\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"error\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"derivative\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n NetUtil.defineProperty(this, \"bias\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n if (layerIndex) {\r\n NetUtil.defineArrayProperty(this, \"weights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n\r\n NetUtil.defineProperty(this, \"deltaBias\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"deltaWeights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n switch (updateFn) {\r\n case \"gain\":\r\n NetUtil.defineProperty(this, \"biasGain\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightGain\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n break\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"biasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightsCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n if (updateFn==\"adadelta\") {\r\n NetUtil.defineProperty(this, \"adadeltaBiasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"adadeltaCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n break\r\n\r\n case \"adam\":\r\n NetUtil.defineProperty(this, \"m\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"v\", paramTypes, params, {pre: \"neuron_\"})\r\n break\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron","\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.OutputLayer = OutputLayer)\r\nexports.OutputLayer = OutputLayer\r\n","\"use strict\"\r\n\r\nclass PoolLayer {\r\n\r\n constructor (size, {stride, activation}={}) {\r\n\r\n if (size) this.size = size\r\n if (stride) this.stride = stride\r\n\r\n this.activation = false\r\n this.activationName = activation\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n let channels\r\n let prevLayerOutWidth = layer.outMapSize\r\n const size = this.size || this.net.pool.size || 2\r\n const stride = this.stride || this.net.pool.stride || this.size\r\n\r\n NetUtil.defineProperty(this, \"channels\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"stride\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n this.size = size\r\n this.stride = stride\r\n\r\n switch (true) {\r\n\r\n case layer instanceof FCLayer:\r\n channels = this.net.channels\r\n prevLayerOutWidth = Math.max(Math.floor(Math.sqrt(layer.size/channels)), 1)\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n channels = layer.channels\r\n break\r\n }\r\n\r\n this.channels = channels\r\n\r\n NetUtil.defineProperty(this, \"prevLayerOutWidth\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"inMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"outMapSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"errors\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, prevLayerOutWidth, prevLayerOutWidth, {pre: \"pool_\"})\r\n\r\n const outMapSize = (prevLayerOutWidth - size) / stride + 1\r\n this.outMapSize = outMapSize\r\n this.inMapValuesCount = prevLayerOutWidth ** 2\r\n\r\n NetUtil.defineVolumeProperty(this, \"activations\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"indeces\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {\r\n pre: \"pool_\",\r\n getCallback: vol => vol.map(map => map.map(row => row.map(val => [parseInt(val/2), val%2]))),\r\n setCallback: vol => vol.map(map => map.map(row => row.map(([x,y]) => 2*x+y)))\r\n })\r\n\r\n if (outMapSize%1 != 0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outMapSize} in pool layer at index ${layerIndex}`)\r\n }\r\n\r\n if (this.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"pool_\",\r\n getCallback: _ => `WASM ${this.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName]\r\n }\r\n }\r\n\r\n init () {}\r\n\r\n toJSON () {return {}}\r\n\r\n fromJSON() {}\r\n\r\n getDataSize () {return 0}\r\n\r\n toIMG () {return []}\r\n\r\n fromIMG () {}\r\n\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.PoolLayer = PoolLayer)\r\nexports.PoolLayer = PoolLayer"]} \ No newline at end of file +{"version":3,"sources":["../dev/js-WebAssembly/ConvLayer.js","../dev/js-WebAssembly/FCLayer.js","../dev/js-WebAssembly/Filter.js","../dev/js-WebAssembly/InputLayer.js","../dev/js-WebAssembly/NetMath.js","../dev/js-WebAssembly/NetUtil.js","../dev/js-WebAssembly/Network.js","../dev/js-WebAssembly/Neuron.js","../dev/js-WebAssembly/OutputLayer.js","../dev/js-WebAssembly/PoolLayer.js"],"names":[],"mappings":"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","file":"jsNetWebAssembly.concat.js","sourcesContent":["\"use strict\"\r\n\r\nclass ConvLayer {\r\n\r\n constructor (size, {filterSize, zeroPadding, stride, activation}={}) {\r\n\r\n this.size = size\r\n this.stride = stride\r\n this.filterSize = filterSize\r\n this.layerIndex = 0\r\n this.zeroPadding = zeroPadding\r\n\r\n this.activation = false\r\n this.activationName = activation\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n const stride = this.stride || this.net.conv.stride || 1\r\n const filterSize = this.filterSize || this.net.conv.filterSize || 3\r\n let zeroPadding = this.zeroPadding\r\n\r\n NetUtil.defineProperty(this, \"channels\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"filterSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"stride\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"zeroPadding\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n\r\n this.size = this.size || 4\r\n let channels\r\n\r\n switch (true) {\r\n case layer instanceof FCLayer:\r\n channels = this.net.channels || 1\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n channels = layer.activations.length\r\n break\r\n }\r\n\r\n if (zeroPadding == undefined) {\r\n zeroPadding = this.net.conv.zeroPadding==undefined ? Math.floor(filterSize/2) : this.net.conv.zeroPadding\r\n }\r\n\r\n this.channels = channels\r\n this.filterSize = filterSize\r\n this.stride = stride\r\n this.zeroPadding = zeroPadding\r\n\r\n // Caching calculations\r\n const prevLayerOutWidth = layer instanceof FCLayer ? Math.max(Math.floor(Math.sqrt(layer.size/channels)), 1)\r\n : layer.outMapSize\r\n\r\n NetUtil.defineProperty(this, \"inMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"inZPMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"outMapSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n\r\n const outSize = (prevLayerOutWidth - filterSize + 2*zeroPadding) / stride + 1\r\n this.inMapValuesCount = Math.pow(prevLayerOutWidth, 2)\r\n this.inZPMapValuesCount = Math.pow(prevLayerOutWidth + zeroPadding*2, 2)\r\n this.outMapSize = outSize\r\n\r\n if (outSize%1!=0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outSize} in conv layer at index ${layerIndex}`)\r\n }\r\n\r\n if (this.activationName !== false && this.net.activationName !== false) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"conv_\",\r\n getCallback: _ => `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n\r\n this.filters = [...new Array(this.size)].map(f => new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n const paramTypes = [\"number\", \"number\", \"number\"]\r\n const params = [this.netInstance, this.layerIndex, fi]\r\n\r\n NetUtil.defineMapProperty(filter, \"activationMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"errorMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"sumMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"dropoutMap\", paramTypes, params, this.outMapSize, this.outMapSize, {\r\n pre: \"filter_\",\r\n getCallback: m => m.map(row => row.map(v => v==1))\r\n })\r\n\r\n filter.init(this.netInstance, this.layerIndex, fi, {\r\n updateFn: this.net.updateFn,\r\n filterSize: this.filterSize,\r\n channels: this.channels\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.filters.map(filter => {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.layerIndex = 0\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n if (this.activationName || this.net.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"fc_\",\r\n getCallback: _ => `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n }\r\n\r\n init () {\r\n this.neurons.forEach((neuron, ni) => {\r\n switch (true) {\r\n\r\n case this.prevLayer instanceof FCLayer:\r\n neuron.size = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n neuron.size = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n neuron.size = this.prevLayer.channels * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.init(this.netInstance, this.layerIndex, ni, {\r\n updateFn: this.net.updateFn\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.neurons.map(neuron => {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=(neuron.weights).length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n let size = 0\r\n\r\n for (let n=0; n> 1)\r\n break\r\n case \"HEAP32\": case \"HEAPU32\": case \"HEAPF32\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 2)\r\n break\r\n case \"HEAPF64\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 3)\r\n break\r\n }\r\n\r\n bufs.push(buf)\r\n parameters.push(buf)\r\n parameters.push(params[p].length)\r\n parameterTypes.push(\"number\")\r\n parameterTypes.push(\"number\")\r\n\r\n } else {\r\n parameters.push(params[p])\r\n parameterTypes.push(paramTypes[p]==undefined ? \"number\" : paramTypes[p])\r\n }\r\n }\r\n }\r\n\r\n res = NetUtil.Module.ccall(func, returnTypeParam, parameterTypes, parameters)\r\n } catch (e) {\r\n error = e\r\n } finally {\r\n for (let b=0; b= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static splitData (data, {training=0.7, validation=0.15, test=0.15}={}) {\r\n\r\n const split = {\r\n training: [],\r\n validation: [],\r\n test: []\r\n }\r\n\r\n // Define here splits, for returning at the end\r\n for (let i=0; i 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; ix, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(this.Module.ccall(`get_${pre}${prop}`, \"number\", valTypes, values)),\r\n set: val => this.Module.ccall(`set_${pre}${prop}`, null, valTypes.concat(\"number\"), values.concat(setCallback(val)))\r\n })\r\n }\r\n\r\n static defineArrayProperty (self, prop, valTypes, values, returnSize, {pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => NetUtil.ccallArrays(`get_${pre}${prop}`, \"array\", valTypes, values, {returnArraySize: returnSize, heapOut: \"HEAPF64\"}),\r\n set: value => NetUtil.ccallArrays(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([value]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineMapProperty (self, prop, valTypes, values, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth: 1, rows, columns, heapOut: \"HEAPF64\"})[0]),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineVolumeProperty (self, prop, valTypes, values, depth, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth, rows, columns, heapOut: \"HEAPF64\"})),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static makeConfusionMatrix (originalData) {\r\n let total = 0\r\n let totalCorrect = 0\r\n const data = []\r\n\r\n for (let r=0; r {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Module.ccall(\"getError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"validationError\", {\r\n get: () => Module.ccall(\"getValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"lastValidationError\", {\r\n get: () => Module.ccall(\"getLastValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n\r\n // Activation function get / set\r\n this.activationName = NetUtil.format(activation)\r\n Object.defineProperty(this, \"activation\", {\r\n get: () => `WASM ${this.activationName}`,\r\n set: activation => {\r\n\r\n if (NetUtil.activationsIndeces[activation] == undefined) {\r\n throw new Error(`The ${activation} activation function does not exist`)\r\n }\r\n this.activationName = activation\r\n this.Module.ccall(\"setActivation\", null, [\"number\", \"number\"], [this.netInstance, NetUtil.activationsIndeces[activation]])\r\n }\r\n })\r\n this.activation = this.activationName\r\n\r\n // Cost function get / set\r\n const costIndeces = {\r\n meansquarederror: 0,\r\n crossentropy: 1\r\n }\r\n let costFunctionName = NetUtil.format(cost)\r\n Object.defineProperty(this, \"cost\", {\r\n get: () => `WASM ${costFunctionName}`,\r\n set: cost => {\r\n if (costIndeces[cost] == undefined) {\r\n throw new Error(`The ${cost} function does not exist`)\r\n }\r\n costFunctionName = cost\r\n this.Module.ccall(\"setCostFunction\", null, [\"number\", \"number\"], [this.netInstance, costIndeces[cost]])\r\n }\r\n })\r\n this.cost = costFunctionName\r\n\r\n const updateFnIndeces = {\r\n vanillasgd: 0,\r\n gain: 1,\r\n adagrad: 2,\r\n rmsprop: 3,\r\n adam: 4,\r\n adadelta: 5,\r\n momentum: 6\r\n }\r\n NetUtil.defineProperty(this, \"updateFn\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(updateFnIndeces).find(key => updateFnIndeces[key]==index),\r\n setCallback: name => updateFnIndeces[name]\r\n })\r\n this.updateFn = NetUtil.format(updateFn)\r\n\r\n\r\n // Weights init configs\r\n const weightsConfigFns = {\r\n uniform: 0,\r\n gaussian: 1,\r\n xavieruniform: 2,\r\n xaviernormal: 3,\r\n lecununiform: 4,\r\n lecunnormal: 5\r\n }\r\n this.weightsConfig = {}\r\n\r\n NetUtil.defineProperty(this.weightsConfig, \"distribution\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(weightsConfigFns).find(key => weightsConfigFns[key]==Math.round(index)),\r\n setCallback: name => weightsConfigFns[name]\r\n })\r\n NetUtil.defineProperty(this.weightsConfig, \"limit\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"mean\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"stdDeviation\", [\"number\"], [this.netInstance])\r\n\r\n this.weightsConfig.distribution = \"xavieruniform\"\r\n\r\n if (weightsConfig!=undefined && weightsConfig.distribution) {\r\n\r\n if (typeof weightsConfig.distribution == \"function\") {\r\n throw new Error(\"Custom weights init functions are not (yet) supported with WASM.\")\r\n }\r\n\r\n this.weightsConfig.distribution = NetUtil.format(weightsConfig.distribution)\r\n }\r\n\r\n this.weightsConfig.limit = weightsConfig && weightsConfig.limit!=undefined ? weightsConfig.limit : 0.1\r\n this.weightsConfig.mean = weightsConfig && weightsConfig.mean!=undefined ? weightsConfig.mean : 0\r\n this.weightsConfig.stdDeviation = weightsConfig && weightsConfig.stdDeviation!=undefined ? weightsConfig.stdDeviation : 0.05\r\n\r\n switch (NetUtil.format(updateFn)) {\r\n\r\n case \"rmsprop\":\r\n this.learningRate = this.learningRate || 0.001\r\n break\r\n\r\n case \"adam\":\r\n this.learningRate = this.learningRate || 0.01\r\n break\r\n\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"rho\", [\"number\"], [this.netInstance])\r\n this.rho = rho==null ? 0.95 : rho\r\n break\r\n\r\n case \"momentum\":\r\n NetUtil.defineProperty(this, \"momentum\", [\"number\"], [this.netInstance])\r\n this.learningRate = this.learningRate || 0.2\r\n this.momentum = momentum\r\n break\r\n\r\n default:\r\n\r\n if (learningRate==undefined) {\r\n\r\n switch (this.activationName) {\r\n case \"relu\":\r\n case \"lrelu\":\r\n case \"rrelu\":\r\n case \"elu\":\r\n this.learningRate = 0.01\r\n break\r\n\r\n case \"tanh\":\r\n case \"lecuntanh\":\r\n this.learningRate = 0.001\r\n break\r\n\r\n default:\r\n this.learningRate = 0.2\r\n }\r\n }\r\n }\r\n\r\n if (this.updateFn==\"rmsprop\") {\r\n NetUtil.defineProperty(this, \"rmsDecay\", [\"number\"], [this.netInstance])\r\n this.rmsDecay = rmsDecay===undefined ? 0.99 : rmsDecay\r\n }\r\n\r\n if (this.activationName==\"lrelu\") {\r\n NetUtil.defineProperty(this, \"lreluSlope\", [\"number\"], [this.netInstance])\r\n this.lreluSlope = lreluSlope==undefined ? -0.0005 : lreluSlope\r\n } else if (this.activationName==\"elu\") {\r\n NetUtil.defineProperty(this, \"eluAlpha\", [\"number\"], [this.netInstance])\r\n this.eluAlpha = eluAlpha==undefined ? 1 : eluAlpha\r\n }\r\n\r\n this.layers = []\r\n this.epochs = 0\r\n\r\n NetUtil.defineProperty(this, \"iterations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validationInterval\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"trainingLogging\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"stoppedEarly\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingType\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingThreshold\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingBestError\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatienceCounter\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatience\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPercent\", [\"number\"], [this.netInstance])\r\n\r\n this.collectedErrors = {}\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"training\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"test\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"validation\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n\r\n if (layers.length) {\r\n\r\n this.state = \"constructed\"\r\n\r\n switch (true) {\r\n case layers.every(item => Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n\r\n }\r\n }\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n if (this.state == \"initialised\") {\r\n return\r\n }\r\n\r\n if (this.state == \"not-defined\") {\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n }\r\n\r\n this.state = \"initialised\"\r\n\r\n for (let l=0; l map.map(row => row.map(v => Math.floor(v)))\r\n\r\n NetUtil.defineMapProperty(this, \"trainingConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"testConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"validationConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.layerIndex = layerIndex\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n }\r\n layer.init()\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c {\r\n\r\n if (data === undefined || data === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers(data[0].input.length, data[0].expected.length)\r\n }\r\n\r\n const startTime = Date.now()\r\n\r\n const dimension = this.layers[0].size\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch size: ${miniBatchSize}`)\r\n }\r\n\r\n // Load training data\r\n const typedArray = new Float32Array(itemsCount)\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n let elapsed\r\n\r\n this.Module.ccall(\"loadTrainingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (shuffle) {\r\n this.Module.ccall(\"shuffleTrainingData\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n let validationBuf\r\n\r\n if (this.validation) {\r\n\r\n this.validationInterval = this.validation.interval || data.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n this.earlyStoppingThreshold = this.validation.earlyStopping.threshold\r\n this.earlyStoppingType = 1\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPatienceCounter = 0\r\n this.earlyStoppingPatience = this.validation.earlyStopping.patience\r\n this.earlyStoppingType = 2\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPercent = this.validation.earlyStopping.percent\r\n this.earlyStoppingType = 3\r\n break\r\n }\r\n }\r\n\r\n\r\n // Load validation data\r\n if (this.validation.data) {\r\n const typedArray = new Float32Array(this.validation.data.length)\r\n this.loadData(this.validation.data, typedArray, itemSize , reject)\r\n validationBuf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadValidationData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n }\r\n }\r\n\r\n const logAndResolve = () => {\r\n this.Module._free(buf)\r\n this.Module._free(validationBuf)\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n this.Module.ccall(\"restoreValidation\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (log) {\r\n console.log(`Training finished. Total time: ${NetUtil.format(elapsed, \"time\")}`)\r\n }\r\n resolve()\r\n }\r\n\r\n if (callback) {\r\n\r\n let epochIndex = 0\r\n let iterationIndex = 0\r\n\r\n const doEpoch = () => {\r\n\r\n if (this.l2) this.l2Error = 0\r\n if (this.l1) this.l1Error = 0\r\n\r\n iterationIndex = 0\r\n doIteration()\r\n }\r\n\r\n const doIteration = () => {\r\n\r\n this.Module.ccall(\"train\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, miniBatchSize, iterationIndex])\r\n\r\n if (iterationIndex%callbackInterval == 0 || this.validationError) {\r\n callback({\r\n iterations: (this.iterations),\r\n validations: (this.validations),\r\n trainingError: this.error,\r\n validationError: this.validationError,\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n }\r\n\r\n iterationIndex += miniBatchSize\r\n\r\n if (iterationIndex < data.length && !this.stoppedEarly) {\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n } else {\r\n epochIndex++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n let text = `Epoch: ${epochIndex}\\nTraining Error: ${this.error}`\r\n\r\n if (this.validation) {\r\n text += `\\nValidation Error: ${this.lastValidationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochIndex, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochIndex < epochs && !this.stoppedEarly) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n doEpoch()\r\n\r\n } else {\r\n for (let e=0; e {\r\n\r\n if (data === undefined || data === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n const startTime = Date.now()\r\n const dimension = data[0].input.length\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n const typedArray = new Float32Array(itemsCount)\r\n\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadTestingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (callback) {\r\n\r\n let iterationIndex = 0\r\n let totalError = 0\r\n\r\n const doIteration = () => {\r\n\r\n totalError += this.Module.ccall(\"test\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, 1, iterationIndex])\r\n\r\n callback({\r\n iterations: (iterationIndex+1),\r\n error: totalError/(iterationIndex+1),\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n\r\n if (++iterationIndex < data.length) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n iterationIndex\r\n\r\n const elapsed = Date.now() - startTime\r\n log && console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/iterationIndex, \"time\")}`)\r\n\r\n this.Module._free(buf)\r\n resolve(totalError/data.length)\r\n }\r\n }\r\n\r\n doIteration()\r\n\r\n } else {\r\n\r\n const avgError = this.Module.ccall(\"test\", \"number\", [\"number\", \"number\"], [this.netInstance, -1, 0])\r\n this.Module._free(buf)\r\n\r\n const elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/data.length, \"time\")}`)\r\n }\r\n\r\n resolve(avgError)\r\n }\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.Module.ccall(\"resetDeltaWeights\", null, [\"number\"], [this.netInstance])\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l v==1,\r\n setCallback: v => v ? 1 : 0\r\n })\r\n NetUtil.defineProperty(this, \"activation\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"error\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"derivative\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n NetUtil.defineProperty(this, \"bias\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n if (layerIndex) {\r\n NetUtil.defineArrayProperty(this, \"weights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n\r\n NetUtil.defineProperty(this, \"deltaBias\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"deltaWeights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n switch (updateFn) {\r\n case \"gain\":\r\n NetUtil.defineProperty(this, \"biasGain\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightGain\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n break\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"biasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightsCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n if (updateFn==\"adadelta\") {\r\n NetUtil.defineProperty(this, \"adadeltaBiasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"adadeltaCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n break\r\n\r\n case \"adam\":\r\n NetUtil.defineProperty(this, \"m\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"v\", paramTypes, params, {pre: \"neuron_\"})\r\n break\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron","\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.OutputLayer = OutputLayer)\r\nexports.OutputLayer = OutputLayer\r\n","\"use strict\"\r\n\r\nclass PoolLayer {\r\n\r\n constructor (size, {stride, activation}={}) {\r\n\r\n if (size) this.size = size\r\n if (stride) this.stride = stride\r\n\r\n this.activation = false\r\n this.activationName = activation\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n let channels\r\n let prevLayerOutWidth = layer.outMapSize\r\n const size = this.size || this.net.pool.size || 2\r\n const stride = this.stride || this.net.pool.stride || this.size\r\n\r\n NetUtil.defineProperty(this, \"channels\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"stride\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n this.size = size\r\n this.stride = stride\r\n\r\n switch (true) {\r\n\r\n case layer instanceof FCLayer:\r\n channels = this.net.channels\r\n prevLayerOutWidth = Math.max(Math.floor(Math.sqrt(layer.size/channels)), 1)\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n channels = layer.channels\r\n break\r\n }\r\n\r\n this.channels = channels\r\n\r\n NetUtil.defineProperty(this, \"prevLayerOutWidth\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"inMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"outMapSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"errors\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, prevLayerOutWidth, prevLayerOutWidth, {pre: \"pool_\"})\r\n\r\n const outMapSize = (prevLayerOutWidth - size) / stride + 1\r\n this.outMapSize = outMapSize\r\n this.inMapValuesCount = prevLayerOutWidth ** 2\r\n\r\n NetUtil.defineVolumeProperty(this, \"activations\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"indeces\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {\r\n pre: \"pool_\",\r\n getCallback: vol => vol.map(map => map.map(row => row.map(val => [parseInt(val/2), val%2]))),\r\n setCallback: vol => vol.map(map => map.map(row => row.map(([x,y]) => 2*x+y)))\r\n })\r\n\r\n if (outMapSize%1 != 0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outMapSize} in pool layer at index ${layerIndex}`)\r\n }\r\n\r\n if (this.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"pool_\",\r\n getCallback: _ => `WASM ${this.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName]\r\n }\r\n }\r\n\r\n init () {}\r\n\r\n toJSON () {return {}}\r\n\r\n fromJSON() {}\r\n\r\n getDataSize () {return 0}\r\n\r\n toIMG () {return []}\r\n\r\n fromIMG () {}\r\n\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.PoolLayer = PoolLayer)\r\nexports.PoolLayer = PoolLayer"]} \ No newline at end of file diff --git a/dist/jsNetWebAssembly.min.js b/dist/jsNetWebAssembly.min.js index b814783..fd355b1 100644 --- a/dist/jsNetWebAssembly.min.js +++ b/dist/jsNetWebAssembly.min.js @@ -1,2 +1,2 @@ -"use strict";class ConvLayer{constructor(size,{filterSize:filterSize,zeroPadding:zeroPadding,stride:stride,activation:activation}={}){if(this.size=size,this.stride=stride,this.filterSize=filterSize,this.layerIndex=0,this.zeroPadding=zeroPadding,this.activation=!1,this.activationName=activation,void 0!=activation){if("boolean"!=typeof activation||activation||(activation="noactivation"),"string"!=typeof activation)throw new Error("Custom activation functions are not available in the WebAssembly version");this.activationName=NetUtil.format(activation)}}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.netInstance=this.net.netInstance,this.prevLayer=layer,this.layerIndex=layerIndex;const stride=this.stride||this.net.conv.stride||1,filterSize=this.filterSize||this.net.conv.filterSize||3;let zeroPadding=this.zeroPadding;NetUtil.defineProperty(this,"channels",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"filterSize",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"stride",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"zeroPadding",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),this.size=this.size||4;let channels;switch(!0){case layer instanceof FCLayer:channels=this.net.channels||1;break;case layer instanceof ConvLayer:channels=layer.size;break;case layer instanceof PoolLayer:channels=layer.activations.length}void 0==zeroPadding&&(zeroPadding=void 0==this.net.conv.zeroPadding?Math.floor(filterSize/2):this.net.conv.zeroPadding),this.channels=channels,this.filterSize=filterSize,this.stride=stride,this.zeroPadding=zeroPadding;const prevLayerOutWidth=layer instanceof FCLayer?Math.max(Math.floor(Math.sqrt(layer.size/channels)),1):layer.outMapSize;NetUtil.defineProperty(this,"inMapValuesCount",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"inZPMapValuesCount",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"outMapSize",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"});const outSize=(prevLayerOutWidth-filterSize+2*zeroPadding)/stride+1;if(this.inMapValuesCount=Math.pow(prevLayerOutWidth,2),this.inZPMapValuesCount=Math.pow(prevLayerOutWidth+2*zeroPadding,2),this.outMapSize=outSize,outSize%1!=0)throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outSize} in conv layer at index ${layerIndex}`);!1!==this.activationName&&!1!==this.net.activationName&&(NetUtil.defineProperty(this,"activation",["number","number"],[this.netInstance,layerIndex],{pre:"conv_",getCallback:_=>`WASM ${this.activationName||this.net.activationName}`}),this.activation=NetUtil.activationsIndeces[this.activationName||this.net.activationName]),this.filters=[...new Array(this.size)].map(f=>new Filter)}init(){this.filters.forEach((filter,fi)=>{const paramTypes=["number","number","number"],params=[this.netInstance,this.layerIndex,fi];NetUtil.defineMapProperty(filter,"activationMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_"}),NetUtil.defineMapProperty(filter,"errorMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_"}),NetUtil.defineMapProperty(filter,"sumMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_"}),NetUtil.defineMapProperty(filter,"dropoutMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_",getCallback:m=>m.map(row=>row.map(v=>1==v))}),filter.init(this.netInstance,this.layerIndex,fi,{updateFn:this.net.updateFn,filterSize:this.filterSize,channels:this.channels})})}toJSON(){return{weights:this.filters.map(filter=>({bias:filter.bias,weights:filter.weights}))}}fromJSON(data,layerIndex){this.filters.forEach((filter,fi)=>{if(data.weights[fi].weights.length!=filter.weights.length)throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`);if(data.weights[fi].weights[0].length!=filter.weights[0].length)throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`);filter.bias=data.weights[fi].bias,filter.weights=data.weights[fi].weights})}getDataSize(){let size=0;for(let f=0;fnew Neuron),this.layerIndex=0,void 0!=activation){if("boolean"!=typeof activation||activation||(activation="noactivation"),"string"!=typeof activation)throw new Error("Custom activation functions are not available in the WebAssembly version");this.activationName=NetUtil.format(activation)}}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.netInstance=this.net.netInstance,this.prevLayer=layer,this.layerIndex=layerIndex,(this.activationName||this.net.activationName)&&(NetUtil.defineProperty(this,"activation",["number","number"],[this.netInstance,layerIndex],{pre:"fc_",getCallback:_=>`WASM ${this.activationName||this.net.activationName}`}),this.activation=NetUtil.activationsIndeces[this.activationName||this.net.activationName])}init(){this.neurons.forEach((neuron,ni)=>{switch(!0){case this.prevLayer instanceof FCLayer:neuron.size=this.prevLayer.size;break;case this.prevLayer instanceof ConvLayer:neuron.size=this.prevLayer.filters.length*this.prevLayer.outMapSize**2;break;case this.prevLayer instanceof PoolLayer:neuron.size=this.prevLayer.channels*this.prevLayer.outMapSize**2}neuron.init(this.netInstance,this.layerIndex,ni,{updateFn:this.net.updateFn})})}toJSON(){return{weights:this.neurons.map(neuron=>({bias:neuron.bias,weights:neuron.weights}))}}fromJSON(data,layerIndex){this.neurons.forEach((neuron,ni)=>{if(data.weights[ni].weights.length!=neuron.weights.length)throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`);neuron.bias=data.weights[ni].bias,neuron.weights=data.weights[ni].weights})}getDataSize(){let size=0;for(let n=0;n>1);break;case"HEAP32":case"HEAPU32":case"HEAPF32":NetUtil.Module[heapIn].set(typedArray,buf>>2);break;case"HEAPF64":NetUtil.Module[heapIn].set(typedArray,buf>>3)}bufs.push(buf),parameters.push(buf),parameters.push(params[p].length),parameterTypes.push("number"),parameterTypes.push("number")}else parameters.push(params[p]),parameterTypes.push(void 0==paramTypes[p]?"number":paramTypes[p]);res=NetUtil.Module.ccall(func,returnTypeParam,parameterTypes,parameters)}catch(e){error=e}finally{for(let b=0;b=36e5&&formatted.push(`${date.getHours()}h`),formatted.push(`${date.getMinutes()}m`),formatted.push(`${date.getSeconds()}s`)),value=formatted.join(" ")}return value}static shuffle(arr){for(let i=arr.length;i;i--){const j=Math.floor(Math.random()*i),x=arr[i-1];arr[i-1]=arr[j],arr[j]=x}}static splitData(data,{training:training=.7,validation:validation=.15,test:test=.15}={}){const split={training:[],validation:[],test:[]};for(let i=0;i1-training?split.training.push(data[i]):xmaxVal&&(maxVal=data[i]);if(-1*minVal+maxVal!=0)for(let i=0;ix),setCallback:setCallback=(x=>x),pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>getCallback(this.Module.ccall(`get_${pre}${prop}`,"number",valTypes,values)),set:val=>this.Module.ccall(`set_${pre}${prop}`,null,valTypes.concat("number"),values.concat(setCallback(val)))})}static defineArrayProperty(self,prop,valTypes,values,returnSize,{pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>NetUtil.ccallArrays(`get_${pre}${prop}`,"array",valTypes,values,{returnArraySize:returnSize,heapOut:"HEAPF64"}),set:value=>NetUtil.ccallArrays(`set_${pre}${prop}`,null,valTypes.concat("array"),values.concat([value]),{heapIn:"HEAPF64"})})}static defineMapProperty(self,prop,valTypes,values,rows,columns,{getCallback:getCallback=(x=>x),setCallback:setCallback=(x=>x),pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`,"volume",valTypes,values,{depth:1,rows:rows,columns:columns,heapOut:"HEAPF64"})[0]),set:value=>NetUtil.ccallVolume(`set_${pre}${prop}`,null,valTypes.concat("array"),values.concat([setCallback(value)]),{heapIn:"HEAPF64"})})}static defineVolumeProperty(self,prop,valTypes,values,depth,rows,columns,{getCallback:getCallback=(x=>x),setCallback:setCallback=(x=>x),pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`,"volume",valTypes,values,{depth:depth,rows:rows,columns:columns,heapOut:"HEAPF64"})),set:value=>NetUtil.ccallVolume(`set_${pre}${prop}`,null,valTypes.concat("array"),values.concat([setCallback(value)]),{heapIn:"HEAPF64"})})}static makeConfusionMatrix(originalData){let total=0,totalCorrect=0;const data=[];for(let r=0;r{num=percent?num.toFixed(1)+"%":num.toString();const leftPad=Math.max(Math.floor((7-num.length)/2),0),rightPad=Math.max(7-(num.length+leftPad),0);return" ".repeat(leftPad)+num+" ".repeat(rightPad)};let colourText,colourBackground;process.stdout.write("\n");for(let r=0;rModule.ccall("getError","number",["number"],[this.netInstance])}),Object.defineProperty(this,"validationError",{get:()=>Module.ccall("getValidationError","number",["number"],[this.netInstance])}),Object.defineProperty(this,"lastValidationError",{get:()=>Module.ccall("getLastValidationError","number",["number"],[this.netInstance])}),this.activationName=NetUtil.format(activation),Object.defineProperty(this,"activation",{get:()=>`WASM ${this.activationName}`,set:activation=>{if(void 0==NetUtil.activationsIndeces[activation])throw new Error(`The ${activation} activation function does not exist`);this.activationName=activation,this.Module.ccall("setActivation",null,["number","number"],[this.netInstance,NetUtil.activationsIndeces[activation]])}}),this.activation=this.activationName;const costIndeces={meansquarederror:0,crossentropy:1};let costFunctionName=NetUtil.format(cost);Object.defineProperty(this,"cost",{get:()=>`WASM ${costFunctionName}`,set:cost=>{if(void 0==costIndeces[cost])throw new Error(`The ${cost} function does not exist`);costFunctionName=cost,this.Module.ccall("setCostFunction",null,["number","number"],[this.netInstance,costIndeces[cost]])}}),this.cost=costFunctionName;const updateFnIndeces={vanillasgd:0,gain:1,adagrad:2,rmsprop:3,adam:4,adadelta:5,momentum:6};NetUtil.defineProperty(this,"updateFn",["number"],[this.netInstance],{getCallback:index=>Object.keys(updateFnIndeces).find(key=>updateFnIndeces[key]==index),setCallback:name=>updateFnIndeces[name]}),this.updateFn=NetUtil.format(updateFn);const weightsConfigFns={uniform:0,gaussian:1,xavieruniform:2,xaviernormal:3,lecununiform:4,lecunnormal:5};if(this.weightsConfig={},NetUtil.defineProperty(this.weightsConfig,"distribution",["number"],[this.netInstance],{getCallback:index=>Object.keys(weightsConfigFns).find(key=>weightsConfigFns[key]==Math.round(index)),setCallback:name=>weightsConfigFns[name]}),NetUtil.defineProperty(this.weightsConfig,"limit",["number"],[this.netInstance]),NetUtil.defineProperty(this.weightsConfig,"mean",["number"],[this.netInstance]),NetUtil.defineProperty(this.weightsConfig,"stdDeviation",["number"],[this.netInstance]),this.weightsConfig.distribution="xavieruniform",void 0!=weightsConfig&&weightsConfig.distribution){if("function"==typeof weightsConfig.distribution)throw new Error("Custom weights init functions are not (yet) supported with WASM.");this.weightsConfig.distribution=NetUtil.format(weightsConfig.distribution)}switch(this.weightsConfig.limit=weightsConfig&&void 0!=weightsConfig.limit?weightsConfig.limit:.1,this.weightsConfig.mean=weightsConfig&&void 0!=weightsConfig.mean?weightsConfig.mean:0,this.weightsConfig.stdDeviation=weightsConfig&&void 0!=weightsConfig.stdDeviation?weightsConfig.stdDeviation:.05,NetUtil.format(updateFn)){case"rmsprop":this.learningRate=void 0==this.learningRate?.001:this.learningRate;break;case"adam":this.learningRate=void 0==this.learningRate?.01:this.learningRate;break;case"adadelta":NetUtil.defineProperty(this,"rho",["number"],[this.netInstance]),this.rho=null==rho?.95:rho;break;case"momentum":NetUtil.defineProperty(this,"momentum",["number"],[this.netInstance]),this.momentum=momentum;break;default:if(void 0==learningRate)switch(this.activationName){case"relu":case"lrelu":case"rrelu":case"elu":this.learningRate=.01;break;case"tanh":case"lecuntanh":this.learningRate=.001;break;default:this.learningRate=.2}}if("rmsprop"==this.updateFn&&(NetUtil.defineProperty(this,"rmsDecay",["number"],[this.netInstance]),this.rmsDecay=void 0===rmsDecay?.99:rmsDecay),"lrelu"==this.activationName?(NetUtil.defineProperty(this,"lreluSlope",["number"],[this.netInstance]),this.lreluSlope=void 0==lreluSlope?-5e-4:lreluSlope):"elu"==this.activationName&&(NetUtil.defineProperty(this,"eluAlpha",["number"],[this.netInstance]),this.eluAlpha=void 0==eluAlpha?1:eluAlpha),this.layers=[],this.epochs=0,NetUtil.defineProperty(this,"iterations",["number"],[this.netInstance]),NetUtil.defineProperty(this,"validations",["number"],[this.netInstance]),NetUtil.defineProperty(this,"validationInterval",["number"],[this.netInstance]),NetUtil.defineProperty(this,"trainingLogging",["number"],[this.netInstance]),NetUtil.defineProperty(this,"stoppedEarly",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingType",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingThreshold",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingBestError",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingPatienceCounter",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingPatience",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingPercent",["number"],[this.netInstance]),this.collectedErrors={},NetUtil.defineArrayProperty(this.collectedErrors,"training",["number"],[this.netInstance],"auto",{pre:"collected_"}),NetUtil.defineArrayProperty(this.collectedErrors,"test",["number"],[this.netInstance],"auto",{pre:"collected_"}),NetUtil.defineArrayProperty(this.collectedErrors,"validation",["number"],[this.netInstance],"auto",{pre:"collected_"}),layers.length)switch(this.state="constructed",!0){case layers.every(item=>Number.isInteger(item)):this.layers=layers.map(size=>new FCLayer(size)),this.initLayers();break;case layers.every(layer=>layer instanceof FCLayer||layer instanceof ConvLayer||layer instanceof PoolLayer):this.layers=layers,this.initLayers();break;default:throw new Error("There was an error constructing from the layers given.")}}initLayers(input,expected){if("initialised"==this.state)return;"not-defined"==this.state&&(this.layers[0]=new FCLayer(input),this.layers[1]=new FCLayer(Math.ceil(input/expected>5?expected+Math.abs(input-expected)/4:input+expected)),this.layers[2]=new FCLayer(Math.ceil(expected))),this.state="initialised";for(let l=0;lmap.map(row=>row.map(v=>Math.floor(v)));NetUtil.defineMapProperty(this,"trainingConfusionMatrix",["number"],[this.netInstance],outSize,outSize,{getCallback:floorFunc}),NetUtil.defineMapProperty(this,"testConfusionMatrix",["number"],[this.netInstance],outSize,outSize,{getCallback:floorFunc}),NetUtil.defineMapProperty(this,"validationConfusionMatrix",["number"],[this.netInstance],outSize,outSize,{getCallback:floorFunc})}joinLayer(layer,layerIndex){layer.net=this,layer.layerIndex=layerIndex,layerIndex&&(this.layers[layerIndex-1].assignNext(layer),layer.assignPrev(this.layers[layerIndex-1],layerIndex)),layer.init()}forward(data){if("initialised"!=this.state)throw new Error("The network layers have not been initialised.");if(void 0===data||null===data)throw new Error("No data passed to Network.forward()");if(Array.isArray(data[0])){const flat=[];for(let c=0;c{if(void 0===data||null===data)return void reject("No data provided");"initialised"!=this.state&&this.initLayers(data[0].input.length,data[0].expected.length);const startTime=Date.now(),dimension=this.layers[0].size,itemSize=dimension+data[0].expected.length,itemsCount=itemSize*data.length;log&&console.log(`Training started. Epochs: ${epochs} Batch size: ${miniBatchSize}`);const typedArray=new Float32Array(itemsCount);this.loadData(data,typedArray,itemSize,reject);const buf=this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT);this.Module.HEAPF32.set(typedArray,buf>>2);let elapsed;this.Module.ccall("loadTrainingData","number",["number","number","number","number","number"],[this.netInstance,buf,itemsCount,itemSize,dimension]),shuffle&&this.Module.ccall("shuffleTrainingData",null,["number"],[this.netInstance]),collectErrors&&this.Module.ccall("collectErrors",null,["number"],[this.netInstance]);let validationBuf;if(this.validation){if(this.validationInterval=this.validation.interval||data.length,this.validation.earlyStopping)switch(this.validation.earlyStopping.type){case"threshold":this.validation.earlyStopping.threshold=this.validation.earlyStopping.threshold||.01,this.earlyStoppingThreshold=this.validation.earlyStopping.threshold,this.earlyStoppingType=1;break;case"patience":this.validation.earlyStopping.patience=this.validation.earlyStopping.patience||20,this.earlyStoppingBestError=1/0,this.earlyStoppingPatienceCounter=0,this.earlyStoppingPatience=this.validation.earlyStopping.patience,this.earlyStoppingType=2;break;case"divergence":this.validation.earlyStopping.percent=this.validation.earlyStopping.percent||30,this.earlyStoppingBestError=1/0,this.earlyStoppingPercent=this.validation.earlyStopping.percent,this.earlyStoppingType=3}if(this.validation.data){const typedArray=new Float32Array(this.validation.data.length);this.loadData(this.validation.data,typedArray,itemSize,reject),validationBuf=this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT),this.Module.HEAPF32.set(typedArray,buf>>2),this.Module.ccall("loadValidationData","number",["number","number","number","number","number"],[this.netInstance,buf,itemsCount,itemSize,dimension])}}const logAndResolve=()=>{this.Module._free(buf),this.Module._free(validationBuf),this.validation&&this.validation.earlyStopping&&("patience"==this.validation.earlyStopping.type||"divergence"==this.validation.earlyStopping.type)&&this.Module.ccall("restoreValidation",null,["number"],[this.netInstance]),log&&console.log(`Training finished. Total time: ${NetUtil.format(elapsed,"time")}`),resolve()};if(callback){let epochIndex=0,iterationIndex=0;const doEpoch=()=>{this.l2&&(this.l2Error=0),this.l1&&(this.l1Error=0),iterationIndex=0,doIteration()},doIteration=()=>{if(this.Module.ccall("train","number",["number","number","number"],[this.netInstance,miniBatchSize,iterationIndex]),(iterationIndex%callbackInterval==0||this.validationError)&&callback({iterations:this.iterations,validations:this.validations,trainingError:this.error,validationError:this.validationError,elapsed:Date.now()-startTime,input:data[iterationIndex].input}),(iterationIndex+=miniBatchSize){void 0!==data&&null!==data||reject("No data provided"),log&&console.log("Testing started");const startTime=Date.now(),dimension=data[0].input.length,itemSize=dimension+data[0].expected.length,itemsCount=itemSize*data.length,typedArray=new Float32Array(itemsCount);this.loadData(data,typedArray,itemSize,reject);const buf=this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT);if(this.Module.HEAPF32.set(typedArray,buf>>2),this.Module.ccall("loadTestingData","number",["number","number","number","number","number"],[this.netInstance,buf,itemsCount,itemSize,dimension]),collectErrors&&this.Module.ccall("collectErrors",null,["number"],[this.netInstance]),callback){let iterationIndex=0,totalError=0;const doIteration=()=>{if(totalError+=this.Module.ccall("test","number",["number","number","number"],[this.netInstance,1,iterationIndex]),callback({iterations:iterationIndex+1,error:totalError/(iterationIndex+1),elapsed:Date.now()-startTime,input:data[iterationIndex].input}),++iterationIndexlayer.toJSON())}}fromJSON(data){if(void 0===data||null===data)throw new Error("No JSON data given to import.");if(data.layers.length!=this.layers.length)throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`);this.Module.ccall("resetDeltaWeights",null,["number"],[this.netInstance]),this.layers.forEach((layer,li)=>li&&layer.fromJSON(data.layers[li],li))}toIMG(IMGArrays,opts={}){if(!IMGArrays)throw new Error("The IMGArrays library must be provided. See the documentation for instructions.");const data=[];for(let l=1;l1==v,setCallback:v=>v?1:0}),NetUtil.defineProperty(this,"activation",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"error",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"derivative",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"bias",paramTypes,params,{pre:"neuron_"}),layerIndex&&NetUtil.defineArrayProperty(this,"weights",paramTypes,params,this.size,{pre:"neuron_"}),NetUtil.defineProperty(this,"deltaBias",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"deltaWeights",paramTypes,params,this.size,{pre:"neuron_"}),updateFn){case"gain":NetUtil.defineProperty(this,"biasGain",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"weightGain",paramTypes,params,this.size,{pre:"neuron_"});break;case"adagrad":case"rmsprop":case"adadelta":NetUtil.defineProperty(this,"biasCache",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"weightsCache",paramTypes,params,this.size,{pre:"neuron_"}),"adadelta"==updateFn&&(NetUtil.defineProperty(this,"adadeltaBiasCache",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"adadeltaCache",paramTypes,params,this.size,{pre:"neuron_"}));break;case"adam":NetUtil.defineProperty(this,"m",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"v",paramTypes,params,{pre:"neuron_"})}}}"undefined"!=typeof window&&(window.Neuron=Neuron),exports.Neuron=Neuron;class OutputLayer extends FCLayer{constructor(size,{activation:activation,softmax:softmax}={}){super(size,{activation:activation}),softmax&&(this.softmax=!0)}}"undefined"!=typeof window&&(window.OutputLayer=OutputLayer),exports.OutputLayer=OutputLayer;class PoolLayer{constructor(size,{stride:stride,activation:activation}={}){if(size&&(this.size=size),stride&&(this.stride=stride),this.activation=!1,this.activationName=activation,void 0!=activation){if("boolean"!=typeof activation||activation||(activation="noactivation"),"string"!=typeof activation)throw new Error("Custom activation functions are not available in the WebAssembly version");this.activationName=NetUtil.format(activation)}}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.netInstance=this.net.netInstance,this.prevLayer=layer,this.layerIndex=layerIndex;let channels,prevLayerOutWidth=layer.outMapSize;const size=this.size||this.net.pool.size||2,stride=this.stride||this.net.pool.stride||this.size;switch(NetUtil.defineProperty(this,"channels",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineProperty(this,"stride",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),this.size=size,this.stride=stride,!0){case layer instanceof FCLayer:channels=this.net.channels,prevLayerOutWidth=Math.max(Math.floor(Math.sqrt(layer.size/channels)),1);break;case layer instanceof ConvLayer:channels=layer.size;break;case layer instanceof PoolLayer:channels=layer.channels}this.channels=channels,NetUtil.defineProperty(this,"prevLayerOutWidth",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineProperty(this,"inMapValuesCount",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineProperty(this,"outMapSize",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineVolumeProperty(this,"errors",["number","number"],[this.netInstance,layerIndex],channels,prevLayerOutWidth,prevLayerOutWidth,{pre:"pool_"});const outMapSize=(prevLayerOutWidth-size)/stride+1;if(this.outMapSize=outMapSize,this.inMapValuesCount=prevLayerOutWidth**2,NetUtil.defineVolumeProperty(this,"activations",["number","number"],[this.netInstance,layerIndex],channels,outMapSize,outMapSize,{pre:"pool_"}),NetUtil.defineVolumeProperty(this,"indeces",["number","number"],[this.netInstance,layerIndex],channels,outMapSize,outMapSize,{pre:"pool_",getCallback:vol=>vol.map(map=>map.map(row=>row.map(val=>[parseInt(val/2),val%2]))),setCallback:vol=>vol.map(map=>map.map(row=>row.map(([x,y])=>2*x+y)))}),outMapSize%1!=0)throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outMapSize} in pool layer at index ${layerIndex}`);this.activationName&&(NetUtil.defineProperty(this,"activation",["number","number"],[this.netInstance,layerIndex],{pre:"pool_",getCallback:_=>`WASM ${this.activationName}`}),this.activation=NetUtil.activationsIndeces[this.activationName])}init(){}toJSON(){return{}}fromJSON(){}getDataSize(){return 0}toIMG(){return[]}fromIMG(){}}"undefined"!=typeof window&&(window.PoolLayer=PoolLayer),exports.PoolLayer=PoolLayer; +"use strict";class ConvLayer{constructor(size,{filterSize:filterSize,zeroPadding:zeroPadding,stride:stride,activation:activation}={}){if(this.size=size,this.stride=stride,this.filterSize=filterSize,this.layerIndex=0,this.zeroPadding=zeroPadding,this.activation=!1,this.activationName=activation,void 0!=activation){if("boolean"!=typeof activation||activation||(activation="noactivation"),"string"!=typeof activation)throw new Error("Custom activation functions are not available in the WebAssembly version");this.activationName=NetUtil.format(activation)}}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.netInstance=this.net.netInstance,this.prevLayer=layer,this.layerIndex=layerIndex;const stride=this.stride||this.net.conv.stride||1,filterSize=this.filterSize||this.net.conv.filterSize||3;let zeroPadding=this.zeroPadding;NetUtil.defineProperty(this,"channels",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"filterSize",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"stride",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"zeroPadding",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),this.size=this.size||4;let channels;switch(!0){case layer instanceof FCLayer:channels=this.net.channels||1;break;case layer instanceof ConvLayer:channels=layer.size;break;case layer instanceof PoolLayer:channels=layer.activations.length}void 0==zeroPadding&&(zeroPadding=void 0==this.net.conv.zeroPadding?Math.floor(filterSize/2):this.net.conv.zeroPadding),this.channels=channels,this.filterSize=filterSize,this.stride=stride,this.zeroPadding=zeroPadding;const prevLayerOutWidth=layer instanceof FCLayer?Math.max(Math.floor(Math.sqrt(layer.size/channels)),1):layer.outMapSize;NetUtil.defineProperty(this,"inMapValuesCount",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"inZPMapValuesCount",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"}),NetUtil.defineProperty(this,"outMapSize",["number","number"],[this.netInstance,layerIndex],{pre:"conv_"});const outSize=(prevLayerOutWidth-filterSize+2*zeroPadding)/stride+1;if(this.inMapValuesCount=Math.pow(prevLayerOutWidth,2),this.inZPMapValuesCount=Math.pow(prevLayerOutWidth+2*zeroPadding,2),this.outMapSize=outSize,outSize%1!=0)throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outSize} in conv layer at index ${layerIndex}`);!1!==this.activationName&&!1!==this.net.activationName&&(NetUtil.defineProperty(this,"activation",["number","number"],[this.netInstance,layerIndex],{pre:"conv_",getCallback:_=>`WASM ${this.activationName||this.net.activationName}`}),this.activation=NetUtil.activationsIndeces[this.activationName||this.net.activationName]),this.filters=[...new Array(this.size)].map(f=>new Filter)}init(){this.filters.forEach((filter,fi)=>{const paramTypes=["number","number","number"],params=[this.netInstance,this.layerIndex,fi];NetUtil.defineMapProperty(filter,"activationMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_"}),NetUtil.defineMapProperty(filter,"errorMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_"}),NetUtil.defineMapProperty(filter,"sumMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_"}),NetUtil.defineMapProperty(filter,"dropoutMap",paramTypes,params,this.outMapSize,this.outMapSize,{pre:"filter_",getCallback:m=>m.map(row=>row.map(v=>1==v))}),filter.init(this.netInstance,this.layerIndex,fi,{updateFn:this.net.updateFn,filterSize:this.filterSize,channels:this.channels})})}toJSON(){return{weights:this.filters.map(filter=>({bias:filter.bias,weights:filter.weights}))}}fromJSON(data,layerIndex){this.filters.forEach((filter,fi)=>{if(data.weights[fi].weights.length!=filter.weights.length)throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`);if(data.weights[fi].weights[0].length!=filter.weights[0].length)throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`);filter.bias=data.weights[fi].bias,filter.weights=data.weights[fi].weights})}getDataSize(){let size=0;for(let f=0;fnew Neuron),this.layerIndex=0,void 0!=activation){if("boolean"!=typeof activation||activation||(activation="noactivation"),"string"!=typeof activation)throw new Error("Custom activation functions are not available in the WebAssembly version");this.activationName=NetUtil.format(activation)}}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.netInstance=this.net.netInstance,this.prevLayer=layer,this.layerIndex=layerIndex,(this.activationName||this.net.activationName)&&(NetUtil.defineProperty(this,"activation",["number","number"],[this.netInstance,layerIndex],{pre:"fc_",getCallback:_=>`WASM ${this.activationName||this.net.activationName}`}),this.activation=NetUtil.activationsIndeces[this.activationName||this.net.activationName])}init(){this.neurons.forEach((neuron,ni)=>{switch(!0){case this.prevLayer instanceof FCLayer:neuron.size=this.prevLayer.size;break;case this.prevLayer instanceof ConvLayer:neuron.size=this.prevLayer.filters.length*this.prevLayer.outMapSize**2;break;case this.prevLayer instanceof PoolLayer:neuron.size=this.prevLayer.channels*this.prevLayer.outMapSize**2}neuron.init(this.netInstance,this.layerIndex,ni,{updateFn:this.net.updateFn})})}toJSON(){return{weights:this.neurons.map(neuron=>({bias:neuron.bias,weights:neuron.weights}))}}fromJSON(data,layerIndex){this.neurons.forEach((neuron,ni)=>{if(data.weights[ni].weights.length!=neuron.weights.length)throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`);neuron.bias=data.weights[ni].bias,neuron.weights=data.weights[ni].weights})}getDataSize(){let size=0;for(let n=0;n>1);break;case"HEAP32":case"HEAPU32":case"HEAPF32":NetUtil.Module[heapIn].set(typedArray,buf>>2);break;case"HEAPF64":NetUtil.Module[heapIn].set(typedArray,buf>>3)}bufs.push(buf),parameters.push(buf),parameters.push(params[p].length),parameterTypes.push("number"),parameterTypes.push("number")}else parameters.push(params[p]),parameterTypes.push(void 0==paramTypes[p]?"number":paramTypes[p]);res=NetUtil.Module.ccall(func,returnTypeParam,parameterTypes,parameters)}catch(e){error=e}finally{for(let b=0;b=36e5&&formatted.push(`${date.getHours()}h`),formatted.push(`${date.getMinutes()}m`),formatted.push(`${date.getSeconds()}s`)),value=formatted.join(" ")}return value}static shuffle(arr){for(let i=arr.length;i;i--){const j=Math.floor(Math.random()*i),x=arr[i-1];arr[i-1]=arr[j],arr[j]=x}}static splitData(data,{training:training=.7,validation:validation=.15,test:test=.15}={}){const split={training:[],validation:[],test:[]};for(let i=0;i1-training?split.training.push(data[i]):xmaxVal&&(maxVal=data[i]);if(-1*minVal+maxVal!=0)for(let i=0;ix),setCallback:setCallback=(x=>x),pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>getCallback(this.Module.ccall(`get_${pre}${prop}`,"number",valTypes,values)),set:val=>this.Module.ccall(`set_${pre}${prop}`,null,valTypes.concat("number"),values.concat(setCallback(val)))})}static defineArrayProperty(self,prop,valTypes,values,returnSize,{pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>NetUtil.ccallArrays(`get_${pre}${prop}`,"array",valTypes,values,{returnArraySize:returnSize,heapOut:"HEAPF64"}),set:value=>NetUtil.ccallArrays(`set_${pre}${prop}`,null,valTypes.concat("array"),values.concat([value]),{heapIn:"HEAPF64"})})}static defineMapProperty(self,prop,valTypes,values,rows,columns,{getCallback:getCallback=(x=>x),setCallback:setCallback=(x=>x),pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`,"volume",valTypes,values,{depth:1,rows:rows,columns:columns,heapOut:"HEAPF64"})[0]),set:value=>NetUtil.ccallVolume(`set_${pre}${prop}`,null,valTypes.concat("array"),values.concat([setCallback(value)]),{heapIn:"HEAPF64"})})}static defineVolumeProperty(self,prop,valTypes,values,depth,rows,columns,{getCallback:getCallback=(x=>x),setCallback:setCallback=(x=>x),pre:pre=""}={}){Object.defineProperty(self,prop,{get:()=>getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`,"volume",valTypes,values,{depth:depth,rows:rows,columns:columns,heapOut:"HEAPF64"})),set:value=>NetUtil.ccallVolume(`set_${pre}${prop}`,null,valTypes.concat("array"),values.concat([setCallback(value)]),{heapIn:"HEAPF64"})})}static makeConfusionMatrix(originalData){let total=0,totalCorrect=0;const data=[];for(let r=0;r{num=percent?num.toFixed(1)+"%":num.toString();const leftPad=Math.max(Math.floor((7-num.length)/2),0),rightPad=Math.max(7-(num.length+leftPad),0);return" ".repeat(leftPad)+num+" ".repeat(rightPad)};let colourText,colourBackground;process.stdout.write("\n");for(let r=0;rModule.ccall("getError","number",["number"],[this.netInstance])}),Object.defineProperty(this,"validationError",{get:()=>Module.ccall("getValidationError","number",["number"],[this.netInstance])}),Object.defineProperty(this,"lastValidationError",{get:()=>Module.ccall("getLastValidationError","number",["number"],[this.netInstance])}),this.activationName=NetUtil.format(activation),Object.defineProperty(this,"activation",{get:()=>`WASM ${this.activationName}`,set:activation=>{if(void 0==NetUtil.activationsIndeces[activation])throw new Error(`The ${activation} activation function does not exist`);this.activationName=activation,this.Module.ccall("setActivation",null,["number","number"],[this.netInstance,NetUtil.activationsIndeces[activation]])}}),this.activation=this.activationName;const costIndeces={meansquarederror:0,crossentropy:1};let costFunctionName=NetUtil.format(cost);Object.defineProperty(this,"cost",{get:()=>`WASM ${costFunctionName}`,set:cost=>{if(void 0==costIndeces[cost])throw new Error(`The ${cost} function does not exist`);costFunctionName=cost,this.Module.ccall("setCostFunction",null,["number","number"],[this.netInstance,costIndeces[cost]])}}),this.cost=costFunctionName;const updateFnIndeces={vanillasgd:0,gain:1,adagrad:2,rmsprop:3,adam:4,adadelta:5,momentum:6};NetUtil.defineProperty(this,"updateFn",["number"],[this.netInstance],{getCallback:index=>Object.keys(updateFnIndeces).find(key=>updateFnIndeces[key]==index),setCallback:name=>updateFnIndeces[name]}),this.updateFn=NetUtil.format(updateFn);const weightsConfigFns={uniform:0,gaussian:1,xavieruniform:2,xaviernormal:3,lecununiform:4,lecunnormal:5};if(this.weightsConfig={},NetUtil.defineProperty(this.weightsConfig,"distribution",["number"],[this.netInstance],{getCallback:index=>Object.keys(weightsConfigFns).find(key=>weightsConfigFns[key]==Math.round(index)),setCallback:name=>weightsConfigFns[name]}),NetUtil.defineProperty(this.weightsConfig,"limit",["number"],[this.netInstance]),NetUtil.defineProperty(this.weightsConfig,"mean",["number"],[this.netInstance]),NetUtil.defineProperty(this.weightsConfig,"stdDeviation",["number"],[this.netInstance]),this.weightsConfig.distribution="xavieruniform",void 0!=weightsConfig&&weightsConfig.distribution){if("function"==typeof weightsConfig.distribution)throw new Error("Custom weights init functions are not (yet) supported with WASM.");this.weightsConfig.distribution=NetUtil.format(weightsConfig.distribution)}switch(this.weightsConfig.limit=weightsConfig&&void 0!=weightsConfig.limit?weightsConfig.limit:.1,this.weightsConfig.mean=weightsConfig&&void 0!=weightsConfig.mean?weightsConfig.mean:0,this.weightsConfig.stdDeviation=weightsConfig&&void 0!=weightsConfig.stdDeviation?weightsConfig.stdDeviation:.05,NetUtil.format(updateFn)){case"rmsprop":this.learningRate=this.learningRate||.001;break;case"adam":this.learningRate=this.learningRate||.01;break;case"adadelta":NetUtil.defineProperty(this,"rho",["number"],[this.netInstance]),this.rho=null==rho?.95:rho;break;case"momentum":NetUtil.defineProperty(this,"momentum",["number"],[this.netInstance]),this.learningRate=this.learningRate||.2,this.momentum=momentum;break;default:if(void 0==learningRate)switch(this.activationName){case"relu":case"lrelu":case"rrelu":case"elu":this.learningRate=.01;break;case"tanh":case"lecuntanh":this.learningRate=.001;break;default:this.learningRate=.2}}if("rmsprop"==this.updateFn&&(NetUtil.defineProperty(this,"rmsDecay",["number"],[this.netInstance]),this.rmsDecay=void 0===rmsDecay?.99:rmsDecay),"lrelu"==this.activationName?(NetUtil.defineProperty(this,"lreluSlope",["number"],[this.netInstance]),this.lreluSlope=void 0==lreluSlope?-5e-4:lreluSlope):"elu"==this.activationName&&(NetUtil.defineProperty(this,"eluAlpha",["number"],[this.netInstance]),this.eluAlpha=void 0==eluAlpha?1:eluAlpha),this.layers=[],this.epochs=0,NetUtil.defineProperty(this,"iterations",["number"],[this.netInstance]),NetUtil.defineProperty(this,"validations",["number"],[this.netInstance]),NetUtil.defineProperty(this,"validationInterval",["number"],[this.netInstance]),NetUtil.defineProperty(this,"trainingLogging",["number"],[this.netInstance]),NetUtil.defineProperty(this,"stoppedEarly",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingType",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingThreshold",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingBestError",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingPatienceCounter",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingPatience",["number"],[this.netInstance]),NetUtil.defineProperty(this,"earlyStoppingPercent",["number"],[this.netInstance]),this.collectedErrors={},NetUtil.defineArrayProperty(this.collectedErrors,"training",["number"],[this.netInstance],"auto",{pre:"collected_"}),NetUtil.defineArrayProperty(this.collectedErrors,"test",["number"],[this.netInstance],"auto",{pre:"collected_"}),NetUtil.defineArrayProperty(this.collectedErrors,"validation",["number"],[this.netInstance],"auto",{pre:"collected_"}),layers.length)switch(this.state="constructed",!0){case layers.every(item=>Number.isInteger(item)):this.layers=layers.map(size=>new FCLayer(size)),this.initLayers();break;case layers.every(layer=>layer instanceof FCLayer||layer instanceof ConvLayer||layer instanceof PoolLayer):this.layers=layers,this.initLayers();break;default:throw new Error("There was an error constructing from the layers given.")}}initLayers(input,expected){if("initialised"==this.state)return;"not-defined"==this.state&&(this.layers[0]=new FCLayer(input),this.layers[1]=new FCLayer(Math.ceil(input/expected>5?expected+Math.abs(input-expected)/4:input+expected)),this.layers[2]=new FCLayer(Math.ceil(expected))),this.state="initialised";for(let l=0;lmap.map(row=>row.map(v=>Math.floor(v)));NetUtil.defineMapProperty(this,"trainingConfusionMatrix",["number"],[this.netInstance],outSize,outSize,{getCallback:floorFunc}),NetUtil.defineMapProperty(this,"testConfusionMatrix",["number"],[this.netInstance],outSize,outSize,{getCallback:floorFunc}),NetUtil.defineMapProperty(this,"validationConfusionMatrix",["number"],[this.netInstance],outSize,outSize,{getCallback:floorFunc})}joinLayer(layer,layerIndex){layer.net=this,layer.layerIndex=layerIndex,layerIndex&&(this.layers[layerIndex-1].assignNext(layer),layer.assignPrev(this.layers[layerIndex-1],layerIndex)),layer.init()}forward(data){if("initialised"!=this.state)throw new Error("The network layers have not been initialised.");if(void 0===data||null===data)throw new Error("No data passed to Network.forward()");if(Array.isArray(data[0])){const flat=[];for(let c=0;c{if(void 0===data||null===data)return void reject("No data provided");"initialised"!=this.state&&this.initLayers(data[0].input.length,data[0].expected.length);const startTime=Date.now(),dimension=this.layers[0].size,itemSize=dimension+data[0].expected.length,itemsCount=itemSize*data.length;log&&console.log(`Training started. Epochs: ${epochs} Batch size: ${miniBatchSize}`);const typedArray=new Float32Array(itemsCount);this.loadData(data,typedArray,itemSize,reject);const buf=this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT);this.Module.HEAPF32.set(typedArray,buf>>2);let elapsed;this.Module.ccall("loadTrainingData","number",["number","number","number","number","number"],[this.netInstance,buf,itemsCount,itemSize,dimension]),shuffle&&this.Module.ccall("shuffleTrainingData",null,["number"],[this.netInstance]),collectErrors&&this.Module.ccall("collectErrors",null,["number"],[this.netInstance]);let validationBuf;if(this.validation){if(this.validationInterval=this.validation.interval||data.length,this.validation.earlyStopping)switch(this.validation.earlyStopping.type){case"threshold":this.validation.earlyStopping.threshold=this.validation.earlyStopping.threshold||.01,this.earlyStoppingThreshold=this.validation.earlyStopping.threshold,this.earlyStoppingType=1;break;case"patience":this.validation.earlyStopping.patience=this.validation.earlyStopping.patience||20,this.earlyStoppingBestError=1/0,this.earlyStoppingPatienceCounter=0,this.earlyStoppingPatience=this.validation.earlyStopping.patience,this.earlyStoppingType=2;break;case"divergence":this.validation.earlyStopping.percent=this.validation.earlyStopping.percent||30,this.earlyStoppingBestError=1/0,this.earlyStoppingPercent=this.validation.earlyStopping.percent,this.earlyStoppingType=3}if(this.validation.data){const typedArray=new Float32Array(this.validation.data.length);this.loadData(this.validation.data,typedArray,itemSize,reject),validationBuf=this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT),this.Module.HEAPF32.set(typedArray,buf>>2),this.Module.ccall("loadValidationData","number",["number","number","number","number","number"],[this.netInstance,buf,itemsCount,itemSize,dimension])}}const logAndResolve=()=>{this.Module._free(buf),this.Module._free(validationBuf),this.validation&&this.validation.earlyStopping&&("patience"==this.validation.earlyStopping.type||"divergence"==this.validation.earlyStopping.type)&&this.Module.ccall("restoreValidation",null,["number"],[this.netInstance]),log&&console.log(`Training finished. Total time: ${NetUtil.format(elapsed,"time")}`),resolve()};if(callback){let epochIndex=0,iterationIndex=0;const doEpoch=()=>{this.l2&&(this.l2Error=0),this.l1&&(this.l1Error=0),iterationIndex=0,doIteration()},doIteration=()=>{if(this.Module.ccall("train","number",["number","number","number"],[this.netInstance,miniBatchSize,iterationIndex]),(iterationIndex%callbackInterval==0||this.validationError)&&callback({iterations:this.iterations,validations:this.validations,trainingError:this.error,validationError:this.validationError,elapsed:Date.now()-startTime,input:data[iterationIndex].input}),(iterationIndex+=miniBatchSize){void 0!==data&&null!==data||reject("No data provided"),log&&console.log("Testing started");const startTime=Date.now(),dimension=data[0].input.length,itemSize=dimension+data[0].expected.length,itemsCount=itemSize*data.length,typedArray=new Float32Array(itemsCount);this.loadData(data,typedArray,itemSize,reject);const buf=this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT);if(this.Module.HEAPF32.set(typedArray,buf>>2),this.Module.ccall("loadTestingData","number",["number","number","number","number","number"],[this.netInstance,buf,itemsCount,itemSize,dimension]),collectErrors&&this.Module.ccall("collectErrors",null,["number"],[this.netInstance]),callback){let iterationIndex=0,totalError=0;const doIteration=()=>{if(totalError+=this.Module.ccall("test","number",["number","number","number"],[this.netInstance,1,iterationIndex]),callback({iterations:iterationIndex+1,error:totalError/(iterationIndex+1),elapsed:Date.now()-startTime,input:data[iterationIndex].input}),++iterationIndexlayer.toJSON())}}fromJSON(data){if(void 0===data||null===data)throw new Error("No JSON data given to import.");if(data.layers.length!=this.layers.length)throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`);this.Module.ccall("resetDeltaWeights",null,["number"],[this.netInstance]),this.layers.forEach((layer,li)=>li&&layer.fromJSON(data.layers[li],li))}toIMG(IMGArrays,opts={}){if(!IMGArrays)throw new Error("The IMGArrays library must be provided. See the documentation for instructions.");const data=[];for(let l=1;l1==v,setCallback:v=>v?1:0}),NetUtil.defineProperty(this,"activation",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"error",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"derivative",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"bias",paramTypes,params,{pre:"neuron_"}),layerIndex&&NetUtil.defineArrayProperty(this,"weights",paramTypes,params,this.size,{pre:"neuron_"}),NetUtil.defineProperty(this,"deltaBias",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"deltaWeights",paramTypes,params,this.size,{pre:"neuron_"}),updateFn){case"gain":NetUtil.defineProperty(this,"biasGain",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"weightGain",paramTypes,params,this.size,{pre:"neuron_"});break;case"adagrad":case"rmsprop":case"adadelta":NetUtil.defineProperty(this,"biasCache",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"weightsCache",paramTypes,params,this.size,{pre:"neuron_"}),"adadelta"==updateFn&&(NetUtil.defineProperty(this,"adadeltaBiasCache",paramTypes,params,{pre:"neuron_"}),NetUtil.defineArrayProperty(this,"adadeltaCache",paramTypes,params,this.size,{pre:"neuron_"}));break;case"adam":NetUtil.defineProperty(this,"m",paramTypes,params,{pre:"neuron_"}),NetUtil.defineProperty(this,"v",paramTypes,params,{pre:"neuron_"})}}}"undefined"!=typeof window&&(window.Neuron=Neuron),exports.Neuron=Neuron;class OutputLayer extends FCLayer{constructor(size,{activation:activation,softmax:softmax}={}){super(size,{activation:activation}),softmax&&(this.softmax=!0)}}"undefined"!=typeof window&&(window.OutputLayer=OutputLayer),exports.OutputLayer=OutputLayer;class PoolLayer{constructor(size,{stride:stride,activation:activation}={}){if(size&&(this.size=size),stride&&(this.stride=stride),this.activation=!1,this.activationName=activation,void 0!=activation){if("boolean"!=typeof activation||activation||(activation="noactivation"),"string"!=typeof activation)throw new Error("Custom activation functions are not available in the WebAssembly version");this.activationName=NetUtil.format(activation)}}assignNext(layer){this.nextLayer=layer}assignPrev(layer,layerIndex){this.netInstance=this.net.netInstance,this.prevLayer=layer,this.layerIndex=layerIndex;let channels,prevLayerOutWidth=layer.outMapSize;const size=this.size||this.net.pool.size||2,stride=this.stride||this.net.pool.stride||this.size;switch(NetUtil.defineProperty(this,"channels",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineProperty(this,"stride",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),this.size=size,this.stride=stride,!0){case layer instanceof FCLayer:channels=this.net.channels,prevLayerOutWidth=Math.max(Math.floor(Math.sqrt(layer.size/channels)),1);break;case layer instanceof ConvLayer:channels=layer.size;break;case layer instanceof PoolLayer:channels=layer.channels}this.channels=channels,NetUtil.defineProperty(this,"prevLayerOutWidth",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineProperty(this,"inMapValuesCount",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineProperty(this,"outMapSize",["number","number"],[this.netInstance,layerIndex],{pre:"pool_"}),NetUtil.defineVolumeProperty(this,"errors",["number","number"],[this.netInstance,layerIndex],channels,prevLayerOutWidth,prevLayerOutWidth,{pre:"pool_"});const outMapSize=(prevLayerOutWidth-size)/stride+1;if(this.outMapSize=outMapSize,this.inMapValuesCount=prevLayerOutWidth**2,NetUtil.defineVolumeProperty(this,"activations",["number","number"],[this.netInstance,layerIndex],channels,outMapSize,outMapSize,{pre:"pool_"}),NetUtil.defineVolumeProperty(this,"indeces",["number","number"],[this.netInstance,layerIndex],channels,outMapSize,outMapSize,{pre:"pool_",getCallback:vol=>vol.map(map=>map.map(row=>row.map(val=>[parseInt(val/2),val%2]))),setCallback:vol=>vol.map(map=>map.map(row=>row.map(([x,y])=>2*x+y)))}),outMapSize%1!=0)throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outMapSize} in pool layer at index ${layerIndex}`);this.activationName&&(NetUtil.defineProperty(this,"activation",["number","number"],[this.netInstance,layerIndex],{pre:"pool_",getCallback:_=>`WASM ${this.activationName}`}),this.activation=NetUtil.activationsIndeces[this.activationName])}init(){}toJSON(){return{}}fromJSON(){}getDataSize(){return 0}toIMG(){return[]}fromIMG(){}}"undefined"!=typeof window&&(window.PoolLayer=PoolLayer),exports.PoolLayer=PoolLayer; //# sourceMappingURL=jsNetWebAssembly.min.js.map \ No newline at end of file diff --git a/dist/jsNetWebAssembly.min.js.map b/dist/jsNetWebAssembly.min.js.map index a77d041..7c66fff 100644 --- a/dist/jsNetWebAssembly.min.js.map +++ b/dist/jsNetWebAssembly.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["jsNetWebAssembly.concat.js"],"names":["ConvLayer","[object Object]","size","filterSize","zeroPadding","stride","activation","this","layerIndex","activationName","undefined","Error","NetUtil","format","layer","nextLayer","netInstance","net","prevLayer","conv","defineProperty","pre","channels","FCLayer","PoolLayer","activations","length","Math","floor","prevLayerOutWidth","max","sqrt","outMapSize","outSize","inMapValuesCount","pow","inZPMapValuesCount","getCallback","_","activationsIndeces","filters","Array","map","f","Filter","forEach","filter","fi","paramTypes","params","defineMapProperty","m","row","v","init","updateFn","weights","bias","data","c","r","push","valI","newFilterWeights","slice","window","exports","global","jsNetWASMPath","neurons","n","Neuron","neuron","ni","w","Layer","filterIndex","defineVolumeProperty","InputLayer","span","super","NetMath","values","total","i","func","returnType","heapIn","heapOut","returnArraySize","heapMap","HEAP8","Int8Array","HEAPU8","Uint8Array","HEAP16","Int16Array","HEAPU16","Uint16Array","HEAP32","Int32Array","HEAPU32","Uint32Array","HEAPF32","Float32Array","HEAPF64","Float64Array","res","error","returnTypeParam","parameters","parameterTypes","bufs","p","isArray","typedArray","buf","Module","_malloc","BYTES_PER_ELEMENT","set","ccall","e","b","_free","returnData","depth","rows","columns","totalValues","parameter","isVolume","flat","d","splice","ccallArrays","vol","value","type","replace","toLowerCase","date","Date","formatted","getMilliseconds","getSeconds","getHours","getMinutes","join","arr","j","random","x","training","validation","test","split","minVal","Infinity","maxVal","self","prop","valTypes","setCallback","Object","get","val","concat","returnSize","ccallVolume","originalData","totalCorrect","rowTotal","count","percent","correctPercent","correct","wrong","bottomRow","columnTotal","toFixed","console","table","padNum","num","toString","leftPad","rightPad","repeat","colourText","colourBackground","process","stdout","write","col","noactivation","sigmoid","tanh","lecuntanh","relu","lrelu","rrelu","elu","Network","learningRate","cost","layers","momentum","rmsDecay","rho","lreluSlope","eluAlpha","dropout","l2","l1","maxNorm","weightsConfig","pool","state","cwrap","bind","costIndeces","meansquarederror","crossentropy","costFunctionName","updateFnIndeces","vanillasgd","gain","adagrad","rmsprop","adam","adadelta","index","keys","find","key","name","weightsConfigFns","uniform","gaussian","xavieruniform","xaviernormal","lecununiform","lecunnormal","round","distribution","limit","mean","stdDeviation","epochs","collectedErrors","defineArrayProperty","every","item","Number","isInteger","initLayers","input","expected","ceil","abs","l","softmax","joinLayer","floorFunc","assignNext","assignPrev","warn","callback","callbackInterval","collectErrors","miniBatchSize","log","shuffle","trainingLogging","stoppedEarly","Promise","resolve","reject","startTime","now","dimension","itemSize","itemsCount","loadData","elapsed","validationBuf","validationInterval","interval","earlyStopping","threshold","earlyStoppingThreshold","earlyStoppingType","patience","earlyStoppingBestError","earlyStoppingPatienceCounter","earlyStoppingPatience","earlyStoppingPercent","logAndResolve","epochIndex","iterationIndex","doEpoch","l2Error","l1Error","doIteration","validationError","iterations","validations","trainingError","setTimeout","text","lastValidationError","di","hasOwnProperty","ii","ei","totalError","avgError","toJSON","li","fromJSON","IMGArrays","opts","layerData","toIMG","rawData","fromIMG","dataCount","getDataSize","printConfusionMatrix","makeConfusionMatrix","trainingConfusionMatrix","testConfusionMatrix","validationConfusionMatrix","version","neuronIndex","OutputLayer","parseInt","y"],"mappings":"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","file":"jsNetWebAssembly.min.js","sourcesContent":["\"use strict\"\r\n\r\nclass ConvLayer {\r\n\r\n constructor (size, {filterSize, zeroPadding, stride, activation}={}) {\r\n\r\n this.size = size\r\n this.stride = stride\r\n this.filterSize = filterSize\r\n this.layerIndex = 0\r\n this.zeroPadding = zeroPadding\r\n\r\n this.activation = false\r\n this.activationName = activation\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n const stride = this.stride || this.net.conv.stride || 1\r\n const filterSize = this.filterSize || this.net.conv.filterSize || 3\r\n let zeroPadding = this.zeroPadding\r\n\r\n NetUtil.defineProperty(this, \"channels\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"filterSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"stride\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"zeroPadding\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n\r\n this.size = this.size || 4\r\n let channels\r\n\r\n switch (true) {\r\n case layer instanceof FCLayer:\r\n channels = this.net.channels || 1\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n channels = layer.activations.length\r\n break\r\n }\r\n\r\n if (zeroPadding == undefined) {\r\n zeroPadding = this.net.conv.zeroPadding==undefined ? Math.floor(filterSize/2) : this.net.conv.zeroPadding\r\n }\r\n\r\n this.channels = channels\r\n this.filterSize = filterSize\r\n this.stride = stride\r\n this.zeroPadding = zeroPadding\r\n\r\n // Caching calculations\r\n const prevLayerOutWidth = layer instanceof FCLayer ? Math.max(Math.floor(Math.sqrt(layer.size/channels)), 1)\r\n : layer.outMapSize\r\n\r\n NetUtil.defineProperty(this, \"inMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"inZPMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"outMapSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n\r\n const outSize = (prevLayerOutWidth - filterSize + 2*zeroPadding) / stride + 1\r\n this.inMapValuesCount = Math.pow(prevLayerOutWidth, 2)\r\n this.inZPMapValuesCount = Math.pow(prevLayerOutWidth + zeroPadding*2, 2)\r\n this.outMapSize = outSize\r\n\r\n if (outSize%1!=0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outSize} in conv layer at index ${layerIndex}`)\r\n }\r\n\r\n if (this.activationName !== false && this.net.activationName !== false) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"conv_\",\r\n getCallback: _ => `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n\r\n this.filters = [...new Array(this.size)].map(f => new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n const paramTypes = [\"number\", \"number\", \"number\"]\r\n const params = [this.netInstance, this.layerIndex, fi]\r\n\r\n NetUtil.defineMapProperty(filter, \"activationMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"errorMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"sumMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"dropoutMap\", paramTypes, params, this.outMapSize, this.outMapSize, {\r\n pre: \"filter_\",\r\n getCallback: m => m.map(row => row.map(v => v==1))\r\n })\r\n\r\n filter.init(this.netInstance, this.layerIndex, fi, {\r\n updateFn: this.net.updateFn,\r\n filterSize: this.filterSize,\r\n channels: this.channels\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.filters.map(filter => {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.layerIndex = 0\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n if (this.activationName || this.net.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"fc_\",\r\n getCallback: _ => `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n }\r\n\r\n init () {\r\n this.neurons.forEach((neuron, ni) => {\r\n switch (true) {\r\n\r\n case this.prevLayer instanceof FCLayer:\r\n neuron.size = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n neuron.size = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n neuron.size = this.prevLayer.channels * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.init(this.netInstance, this.layerIndex, ni, {\r\n updateFn: this.net.updateFn\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.neurons.map(neuron => {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=(neuron.weights).length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n let size = 0\r\n\r\n for (let n=0; n> 1)\r\n break\r\n case \"HEAP32\": case \"HEAPU32\": case \"HEAPF32\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 2)\r\n break\r\n case \"HEAPF64\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 3)\r\n break\r\n }\r\n\r\n bufs.push(buf)\r\n parameters.push(buf)\r\n parameters.push(params[p].length)\r\n parameterTypes.push(\"number\")\r\n parameterTypes.push(\"number\")\r\n\r\n } else {\r\n parameters.push(params[p])\r\n parameterTypes.push(paramTypes[p]==undefined ? \"number\" : paramTypes[p])\r\n }\r\n }\r\n }\r\n\r\n res = NetUtil.Module.ccall(func, returnTypeParam, parameterTypes, parameters)\r\n } catch (e) {\r\n error = e\r\n } finally {\r\n for (let b=0; b= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static splitData (data, {training=0.7, validation=0.15, test=0.15}={}) {\r\n\r\n const split = {\r\n training: [],\r\n validation: [],\r\n test: []\r\n }\r\n\r\n // Define here splits, for returning at the end\r\n for (let i=0; i 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; ix, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(this.Module.ccall(`get_${pre}${prop}`, \"number\", valTypes, values)),\r\n set: val => this.Module.ccall(`set_${pre}${prop}`, null, valTypes.concat(\"number\"), values.concat(setCallback(val)))\r\n })\r\n }\r\n\r\n static defineArrayProperty (self, prop, valTypes, values, returnSize, {pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => NetUtil.ccallArrays(`get_${pre}${prop}`, \"array\", valTypes, values, {returnArraySize: returnSize, heapOut: \"HEAPF64\"}),\r\n set: value => NetUtil.ccallArrays(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([value]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineMapProperty (self, prop, valTypes, values, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth: 1, rows, columns, heapOut: \"HEAPF64\"})[0]),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineVolumeProperty (self, prop, valTypes, values, depth, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth, rows, columns, heapOut: \"HEAPF64\"})),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static makeConfusionMatrix (originalData) {\r\n let total = 0\r\n let totalCorrect = 0\r\n const data = []\r\n\r\n for (let r=0; r {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Module.ccall(\"getError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"validationError\", {\r\n get: () => Module.ccall(\"getValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"lastValidationError\", {\r\n get: () => Module.ccall(\"getLastValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n\r\n // Activation function get / set\r\n this.activationName = NetUtil.format(activation)\r\n Object.defineProperty(this, \"activation\", {\r\n get: () => `WASM ${this.activationName}`,\r\n set: activation => {\r\n\r\n if (NetUtil.activationsIndeces[activation] == undefined) {\r\n throw new Error(`The ${activation} activation function does not exist`)\r\n }\r\n this.activationName = activation\r\n this.Module.ccall(\"setActivation\", null, [\"number\", \"number\"], [this.netInstance, NetUtil.activationsIndeces[activation]])\r\n }\r\n })\r\n this.activation = this.activationName\r\n\r\n // Cost function get / set\r\n const costIndeces = {\r\n meansquarederror: 0,\r\n crossentropy: 1\r\n }\r\n let costFunctionName = NetUtil.format(cost)\r\n Object.defineProperty(this, \"cost\", {\r\n get: () => `WASM ${costFunctionName}`,\r\n set: cost => {\r\n if (costIndeces[cost] == undefined) {\r\n throw new Error(`The ${cost} function does not exist`)\r\n }\r\n costFunctionName = cost\r\n this.Module.ccall(\"setCostFunction\", null, [\"number\", \"number\"], [this.netInstance, costIndeces[cost]])\r\n }\r\n })\r\n this.cost = costFunctionName\r\n\r\n const updateFnIndeces = {\r\n vanillasgd: 0,\r\n gain: 1,\r\n adagrad: 2,\r\n rmsprop: 3,\r\n adam: 4,\r\n adadelta: 5,\r\n momentum: 6\r\n }\r\n NetUtil.defineProperty(this, \"updateFn\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(updateFnIndeces).find(key => updateFnIndeces[key]==index),\r\n setCallback: name => updateFnIndeces[name]\r\n })\r\n this.updateFn = NetUtil.format(updateFn)\r\n\r\n\r\n // Weights init configs\r\n const weightsConfigFns = {\r\n uniform: 0,\r\n gaussian: 1,\r\n xavieruniform: 2,\r\n xaviernormal: 3,\r\n lecununiform: 4,\r\n lecunnormal: 5\r\n }\r\n this.weightsConfig = {}\r\n\r\n NetUtil.defineProperty(this.weightsConfig, \"distribution\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(weightsConfigFns).find(key => weightsConfigFns[key]==Math.round(index)),\r\n setCallback: name => weightsConfigFns[name]\r\n })\r\n NetUtil.defineProperty(this.weightsConfig, \"limit\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"mean\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"stdDeviation\", [\"number\"], [this.netInstance])\r\n\r\n this.weightsConfig.distribution = \"xavieruniform\"\r\n\r\n if (weightsConfig!=undefined && weightsConfig.distribution) {\r\n\r\n if (typeof weightsConfig.distribution == \"function\") {\r\n throw new Error(\"Custom weights init functions are not (yet) supported with WASM.\")\r\n }\r\n\r\n this.weightsConfig.distribution = NetUtil.format(weightsConfig.distribution)\r\n }\r\n\r\n this.weightsConfig.limit = weightsConfig && weightsConfig.limit!=undefined ? weightsConfig.limit : 0.1\r\n this.weightsConfig.mean = weightsConfig && weightsConfig.mean!=undefined ? weightsConfig.mean : 0\r\n this.weightsConfig.stdDeviation = weightsConfig && weightsConfig.stdDeviation!=undefined ? weightsConfig.stdDeviation : 0.05\r\n\r\n switch (NetUtil.format(updateFn)) {\r\n\r\n case \"rmsprop\":\r\n this.learningRate = this.learningRate==undefined ? 0.001 : this.learningRate\r\n break\r\n\r\n case \"adam\":\r\n this.learningRate = this.learningRate==undefined ? 0.01 : this.learningRate\r\n break\r\n\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"rho\", [\"number\"], [this.netInstance])\r\n this.rho = rho==null ? 0.95 : rho\r\n break\r\n\r\n case \"momentum\":\r\n NetUtil.defineProperty(this, \"momentum\", [\"number\"], [this.netInstance])\r\n this.momentum = momentum\r\n break\r\n\r\n default:\r\n\r\n if (learningRate==undefined) {\r\n\r\n switch (this.activationName) {\r\n case \"relu\":\r\n case \"lrelu\":\r\n case \"rrelu\":\r\n case \"elu\":\r\n this.learningRate = 0.01\r\n break\r\n\r\n case \"tanh\":\r\n case \"lecuntanh\":\r\n this.learningRate = 0.001\r\n break\r\n\r\n default:\r\n this.learningRate = 0.2\r\n }\r\n }\r\n }\r\n\r\n if (this.updateFn==\"rmsprop\") {\r\n NetUtil.defineProperty(this, \"rmsDecay\", [\"number\"], [this.netInstance])\r\n this.rmsDecay = rmsDecay===undefined ? 0.99 : rmsDecay\r\n }\r\n\r\n if (this.activationName==\"lrelu\") {\r\n NetUtil.defineProperty(this, \"lreluSlope\", [\"number\"], [this.netInstance])\r\n this.lreluSlope = lreluSlope==undefined ? -0.0005 : lreluSlope\r\n } else if (this.activationName==\"elu\") {\r\n NetUtil.defineProperty(this, \"eluAlpha\", [\"number\"], [this.netInstance])\r\n this.eluAlpha = eluAlpha==undefined ? 1 : eluAlpha\r\n }\r\n\r\n this.layers = []\r\n this.epochs = 0\r\n\r\n NetUtil.defineProperty(this, \"iterations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validationInterval\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"trainingLogging\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"stoppedEarly\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingType\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingThreshold\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingBestError\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatienceCounter\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatience\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPercent\", [\"number\"], [this.netInstance])\r\n\r\n this.collectedErrors = {}\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"training\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"test\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"validation\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n\r\n if (layers.length) {\r\n\r\n this.state = \"constructed\"\r\n\r\n switch (true) {\r\n case layers.every(item => Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n\r\n }\r\n }\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n if (this.state == \"initialised\") {\r\n return\r\n }\r\n\r\n if (this.state == \"not-defined\") {\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n }\r\n\r\n this.state = \"initialised\"\r\n\r\n for (let l=0; l map.map(row => row.map(v => Math.floor(v)))\r\n\r\n NetUtil.defineMapProperty(this, \"trainingConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"testConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"validationConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.layerIndex = layerIndex\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n }\r\n layer.init()\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c {\r\n\r\n if (data === undefined || data === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers(data[0].input.length, data[0].expected.length)\r\n }\r\n\r\n const startTime = Date.now()\r\n\r\n const dimension = this.layers[0].size\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch size: ${miniBatchSize}`)\r\n }\r\n\r\n // Load training data\r\n const typedArray = new Float32Array(itemsCount)\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n let elapsed\r\n\r\n this.Module.ccall(\"loadTrainingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (shuffle) {\r\n this.Module.ccall(\"shuffleTrainingData\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n let validationBuf\r\n\r\n if (this.validation) {\r\n\r\n this.validationInterval = this.validation.interval || data.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n this.earlyStoppingThreshold = this.validation.earlyStopping.threshold\r\n this.earlyStoppingType = 1\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPatienceCounter = 0\r\n this.earlyStoppingPatience = this.validation.earlyStopping.patience\r\n this.earlyStoppingType = 2\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPercent = this.validation.earlyStopping.percent\r\n this.earlyStoppingType = 3\r\n break\r\n }\r\n }\r\n\r\n\r\n // Load validation data\r\n if (this.validation.data) {\r\n const typedArray = new Float32Array(this.validation.data.length)\r\n this.loadData(this.validation.data, typedArray, itemSize , reject)\r\n validationBuf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadValidationData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n }\r\n }\r\n\r\n const logAndResolve = () => {\r\n this.Module._free(buf)\r\n this.Module._free(validationBuf)\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n this.Module.ccall(\"restoreValidation\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (log) {\r\n console.log(`Training finished. Total time: ${NetUtil.format(elapsed, \"time\")}`)\r\n }\r\n resolve()\r\n }\r\n\r\n if (callback) {\r\n\r\n let epochIndex = 0\r\n let iterationIndex = 0\r\n\r\n const doEpoch = () => {\r\n\r\n if (this.l2) this.l2Error = 0\r\n if (this.l1) this.l1Error = 0\r\n\r\n iterationIndex = 0\r\n doIteration()\r\n }\r\n\r\n const doIteration = () => {\r\n\r\n this.Module.ccall(\"train\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, miniBatchSize, iterationIndex])\r\n\r\n if (iterationIndex%callbackInterval == 0 || this.validationError) {\r\n callback({\r\n iterations: (this.iterations),\r\n validations: (this.validations),\r\n trainingError: this.error,\r\n validationError: this.validationError,\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n }\r\n\r\n iterationIndex += miniBatchSize\r\n\r\n if (iterationIndex < data.length && !this.stoppedEarly) {\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n } else {\r\n epochIndex++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n let text = `Epoch: ${epochIndex}\\nTraining Error: ${this.error}`\r\n\r\n if (this.validation) {\r\n text += `\\nValidation Error: ${this.lastValidationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochIndex, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochIndex < epochs && !this.stoppedEarly) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n doEpoch()\r\n\r\n } else {\r\n for (let e=0; e {\r\n\r\n if (data === undefined || data === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n const startTime = Date.now()\r\n const dimension = data[0].input.length\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n const typedArray = new Float32Array(itemsCount)\r\n\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadTestingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (callback) {\r\n\r\n let iterationIndex = 0\r\n let totalError = 0\r\n\r\n const doIteration = () => {\r\n\r\n totalError += this.Module.ccall(\"test\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, 1, iterationIndex])\r\n\r\n callback({\r\n iterations: (iterationIndex+1),\r\n error: totalError/(iterationIndex+1),\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n\r\n if (++iterationIndex < data.length) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n iterationIndex\r\n\r\n const elapsed = Date.now() - startTime\r\n log && console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/iterationIndex, \"time\")}`)\r\n\r\n this.Module._free(buf)\r\n resolve(totalError/data.length)\r\n }\r\n }\r\n\r\n doIteration()\r\n\r\n } else {\r\n\r\n const avgError = this.Module.ccall(\"test\", \"number\", [\"number\", \"number\"], [this.netInstance, -1, 0])\r\n this.Module._free(buf)\r\n\r\n const elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/data.length, \"time\")}`)\r\n }\r\n\r\n resolve(avgError)\r\n }\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.Module.ccall(\"resetDeltaWeights\", null, [\"number\"], [this.netInstance])\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l v==1,\r\n setCallback: v => v ? 1 : 0\r\n })\r\n NetUtil.defineProperty(this, \"activation\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"error\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"derivative\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n NetUtil.defineProperty(this, \"bias\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n if (layerIndex) {\r\n NetUtil.defineArrayProperty(this, \"weights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n\r\n NetUtil.defineProperty(this, \"deltaBias\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"deltaWeights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n switch (updateFn) {\r\n case \"gain\":\r\n NetUtil.defineProperty(this, \"biasGain\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightGain\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n break\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"biasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightsCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n if (updateFn==\"adadelta\") {\r\n NetUtil.defineProperty(this, \"adadeltaBiasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"adadeltaCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n break\r\n\r\n case \"adam\":\r\n NetUtil.defineProperty(this, \"m\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"v\", paramTypes, params, {pre: \"neuron_\"})\r\n break\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron\r\n\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.OutputLayer = OutputLayer)\r\nexports.OutputLayer = OutputLayer\r\n\r\n\"use strict\"\r\n\r\nclass PoolLayer {\r\n\r\n constructor (size, {stride, activation}={}) {\r\n\r\n if (size) this.size = size\r\n if (stride) this.stride = stride\r\n\r\n this.activation = false\r\n this.activationName = activation\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n let channels\r\n let prevLayerOutWidth = layer.outMapSize\r\n const size = this.size || this.net.pool.size || 2\r\n const stride = this.stride || this.net.pool.stride || this.size\r\n\r\n NetUtil.defineProperty(this, \"channels\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"stride\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n this.size = size\r\n this.stride = stride\r\n\r\n switch (true) {\r\n\r\n case layer instanceof FCLayer:\r\n channels = this.net.channels\r\n prevLayerOutWidth = Math.max(Math.floor(Math.sqrt(layer.size/channels)), 1)\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n channels = layer.channels\r\n break\r\n }\r\n\r\n this.channels = channels\r\n\r\n NetUtil.defineProperty(this, \"prevLayerOutWidth\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"inMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"outMapSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"errors\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, prevLayerOutWidth, prevLayerOutWidth, {pre: \"pool_\"})\r\n\r\n const outMapSize = (prevLayerOutWidth - size) / stride + 1\r\n this.outMapSize = outMapSize\r\n this.inMapValuesCount = prevLayerOutWidth ** 2\r\n\r\n NetUtil.defineVolumeProperty(this, \"activations\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"indeces\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {\r\n pre: \"pool_\",\r\n getCallback: vol => vol.map(map => map.map(row => row.map(val => [parseInt(val/2), val%2]))),\r\n setCallback: vol => vol.map(map => map.map(row => row.map(([x,y]) => 2*x+y)))\r\n })\r\n\r\n if (outMapSize%1 != 0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outMapSize} in pool layer at index ${layerIndex}`)\r\n }\r\n\r\n if (this.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"pool_\",\r\n getCallback: _ => `WASM ${this.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName]\r\n }\r\n }\r\n\r\n init () {}\r\n\r\n toJSON () {return {}}\r\n\r\n fromJSON() {}\r\n\r\n getDataSize () {return 0}\r\n\r\n toIMG () {return []}\r\n\r\n fromIMG () {}\r\n\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.PoolLayer = PoolLayer)\r\nexports.PoolLayer = PoolLayer\n//# sourceMappingURL=jsNetWebAssembly.concat.js.map"]} \ No newline at end of file +{"version":3,"sources":["jsNetWebAssembly.concat.js"],"names":["ConvLayer","[object Object]","size","filterSize","zeroPadding","stride","activation","this","layerIndex","activationName","undefined","Error","NetUtil","format","layer","nextLayer","netInstance","net","prevLayer","conv","defineProperty","pre","channels","FCLayer","PoolLayer","activations","length","Math","floor","prevLayerOutWidth","max","sqrt","outMapSize","outSize","inMapValuesCount","pow","inZPMapValuesCount","getCallback","_","activationsIndeces","filters","Array","map","f","Filter","forEach","filter","fi","paramTypes","params","defineMapProperty","m","row","v","init","updateFn","weights","bias","data","c","r","push","valI","newFilterWeights","slice","window","exports","global","jsNetWASMPath","neurons","n","Neuron","neuron","ni","w","Layer","filterIndex","defineVolumeProperty","InputLayer","span","super","NetMath","values","total","i","func","returnType","heapIn","heapOut","returnArraySize","heapMap","HEAP8","Int8Array","HEAPU8","Uint8Array","HEAP16","Int16Array","HEAPU16","Uint16Array","HEAP32","Int32Array","HEAPU32","Uint32Array","HEAPF32","Float32Array","HEAPF64","Float64Array","res","error","returnTypeParam","parameters","parameterTypes","bufs","p","isArray","typedArray","buf","Module","_malloc","BYTES_PER_ELEMENT","set","ccall","e","b","_free","returnData","depth","rows","columns","totalValues","parameter","isVolume","flat","d","splice","ccallArrays","vol","value","type","replace","toLowerCase","date","Date","formatted","getMilliseconds","getSeconds","getHours","getMinutes","join","arr","j","random","x","training","validation","test","split","minVal","Infinity","maxVal","self","prop","valTypes","setCallback","Object","get","val","concat","returnSize","ccallVolume","originalData","totalCorrect","rowTotal","count","percent","correctPercent","correct","wrong","bottomRow","columnTotal","toFixed","console","table","padNum","num","toString","leftPad","rightPad","repeat","colourText","colourBackground","process","stdout","write","col","noactivation","sigmoid","tanh","lecuntanh","relu","lrelu","rrelu","elu","Network","learningRate","cost","layers","momentum","rmsDecay","rho","lreluSlope","eluAlpha","dropout","l2","l1","maxNorm","weightsConfig","pool","state","cwrap","bind","costIndeces","meansquarederror","crossentropy","costFunctionName","updateFnIndeces","vanillasgd","gain","adagrad","rmsprop","adam","adadelta","index","keys","find","key","name","weightsConfigFns","uniform","gaussian","xavieruniform","xaviernormal","lecununiform","lecunnormal","round","distribution","limit","mean","stdDeviation","epochs","collectedErrors","defineArrayProperty","every","item","Number","isInteger","initLayers","input","expected","ceil","abs","l","softmax","joinLayer","floorFunc","assignNext","assignPrev","warn","callback","callbackInterval","collectErrors","miniBatchSize","log","shuffle","trainingLogging","stoppedEarly","Promise","resolve","reject","startTime","now","dimension","itemSize","itemsCount","loadData","elapsed","validationBuf","validationInterval","interval","earlyStopping","threshold","earlyStoppingThreshold","earlyStoppingType","patience","earlyStoppingBestError","earlyStoppingPatienceCounter","earlyStoppingPatience","earlyStoppingPercent","logAndResolve","epochIndex","iterationIndex","doEpoch","l2Error","l1Error","doIteration","validationError","iterations","validations","trainingError","setTimeout","text","lastValidationError","di","hasOwnProperty","ii","ei","totalError","avgError","toJSON","li","fromJSON","IMGArrays","opts","layerData","toIMG","rawData","fromIMG","dataCount","getDataSize","printConfusionMatrix","makeConfusionMatrix","trainingConfusionMatrix","testConfusionMatrix","validationConfusionMatrix","version","neuronIndex","OutputLayer","parseInt","y"],"mappings":"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","file":"jsNetWebAssembly.min.js","sourcesContent":["\"use strict\"\r\n\r\nclass ConvLayer {\r\n\r\n constructor (size, {filterSize, zeroPadding, stride, activation}={}) {\r\n\r\n this.size = size\r\n this.stride = stride\r\n this.filterSize = filterSize\r\n this.layerIndex = 0\r\n this.zeroPadding = zeroPadding\r\n\r\n this.activation = false\r\n this.activationName = activation\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n const stride = this.stride || this.net.conv.stride || 1\r\n const filterSize = this.filterSize || this.net.conv.filterSize || 3\r\n let zeroPadding = this.zeroPadding\r\n\r\n NetUtil.defineProperty(this, \"channels\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"filterSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"stride\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"zeroPadding\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n\r\n this.size = this.size || 4\r\n let channels\r\n\r\n switch (true) {\r\n case layer instanceof FCLayer:\r\n channels = this.net.channels || 1\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n channels = layer.activations.length\r\n break\r\n }\r\n\r\n if (zeroPadding == undefined) {\r\n zeroPadding = this.net.conv.zeroPadding==undefined ? Math.floor(filterSize/2) : this.net.conv.zeroPadding\r\n }\r\n\r\n this.channels = channels\r\n this.filterSize = filterSize\r\n this.stride = stride\r\n this.zeroPadding = zeroPadding\r\n\r\n // Caching calculations\r\n const prevLayerOutWidth = layer instanceof FCLayer ? Math.max(Math.floor(Math.sqrt(layer.size/channels)), 1)\r\n : layer.outMapSize\r\n\r\n NetUtil.defineProperty(this, \"inMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"inZPMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n NetUtil.defineProperty(this, \"outMapSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"conv_\"})\r\n\r\n const outSize = (prevLayerOutWidth - filterSize + 2*zeroPadding) / stride + 1\r\n this.inMapValuesCount = Math.pow(prevLayerOutWidth, 2)\r\n this.inZPMapValuesCount = Math.pow(prevLayerOutWidth + zeroPadding*2, 2)\r\n this.outMapSize = outSize\r\n\r\n if (outSize%1!=0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outSize} in conv layer at index ${layerIndex}`)\r\n }\r\n\r\n if (this.activationName !== false && this.net.activationName !== false) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"conv_\",\r\n getCallback: _ => `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n\r\n this.filters = [...new Array(this.size)].map(f => new Filter())\r\n }\r\n\r\n init () {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n const paramTypes = [\"number\", \"number\", \"number\"]\r\n const params = [this.netInstance, this.layerIndex, fi]\r\n\r\n NetUtil.defineMapProperty(filter, \"activationMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"errorMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"sumMap\", paramTypes, params, this.outMapSize, this.outMapSize, {pre: \"filter_\"})\r\n NetUtil.defineMapProperty(filter, \"dropoutMap\", paramTypes, params, this.outMapSize, this.outMapSize, {\r\n pre: \"filter_\",\r\n getCallback: m => m.map(row => row.map(v => v==1))\r\n })\r\n\r\n filter.init(this.netInstance, this.layerIndex, fi, {\r\n updateFn: this.net.updateFn,\r\n filterSize: this.filterSize,\r\n channels: this.channels\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.filters.map(filter => {\r\n return {\r\n bias: filter.bias,\r\n weights: filter.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n this.filters.forEach((filter, fi) => {\r\n\r\n if (data.weights[fi].weights.length != filter.weights.length) {\r\n throw new Error(`Mismatched weights depth. Given: ${data.weights[fi].weights.length} Existing: ${filter.weights.length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n if (data.weights[fi].weights[0].length != filter.weights[0].length) {\r\n throw new Error(`Mismatched weights size. Given: ${data.weights[fi].weights[0].length} Existing: ${filter.weights[0].length}. At: layers[${layerIndex}], filters[${fi}]`)\r\n }\r\n\r\n filter.bias = data.weights[fi].bias\r\n filter.weights = data.weights[fi].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n\r\n let size = 0\r\n\r\n for (let f=0; f new Neuron())\r\n this.layerIndex = 0\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n if (this.activationName || this.net.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"fc_\",\r\n getCallback: _ => `WASM ${this.activationName||this.net.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName||this.net.activationName]\r\n }\r\n }\r\n\r\n init () {\r\n this.neurons.forEach((neuron, ni) => {\r\n switch (true) {\r\n\r\n case this.prevLayer instanceof FCLayer:\r\n neuron.size = this.prevLayer.size\r\n break\r\n\r\n case this.prevLayer instanceof ConvLayer:\r\n neuron.size = this.prevLayer.filters.length * this.prevLayer.outMapSize**2\r\n break\r\n\r\n case this.prevLayer instanceof PoolLayer:\r\n neuron.size = this.prevLayer.channels * this.prevLayer.outMapSize**2\r\n break\r\n }\r\n\r\n neuron.init(this.netInstance, this.layerIndex, ni, {\r\n updateFn: this.net.updateFn\r\n })\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n weights: this.neurons.map(neuron => {\r\n return {\r\n bias: neuron.bias,\r\n weights: neuron.weights\r\n }\r\n })\r\n }\r\n }\r\n\r\n fromJSON (data, layerIndex) {\r\n\r\n this.neurons.forEach((neuron, ni) => {\r\n\r\n if (data.weights[ni].weights.length!=(neuron.weights).length) {\r\n throw new Error(`Mismatched weights count. Given: ${data.weights[ni].weights.length} Existing: ${neuron.weights.length}. At layers[${layerIndex}], neurons[${ni}]`)\r\n }\r\n\r\n neuron.bias = data.weights[ni].bias\r\n neuron.weights = data.weights[ni].weights\r\n })\r\n }\r\n\r\n // Used for importing data\r\n getDataSize () {\r\n let size = 0\r\n\r\n for (let n=0; n> 1)\r\n break\r\n case \"HEAP32\": case \"HEAPU32\": case \"HEAPF32\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 2)\r\n break\r\n case \"HEAPF64\":\r\n NetUtil.Module[heapIn].set(typedArray, buf >> 3)\r\n break\r\n }\r\n\r\n bufs.push(buf)\r\n parameters.push(buf)\r\n parameters.push(params[p].length)\r\n parameterTypes.push(\"number\")\r\n parameterTypes.push(\"number\")\r\n\r\n } else {\r\n parameters.push(params[p])\r\n parameterTypes.push(paramTypes[p]==undefined ? \"number\" : paramTypes[p])\r\n }\r\n }\r\n }\r\n\r\n res = NetUtil.Module.ccall(func, returnTypeParam, parameterTypes, parameters)\r\n } catch (e) {\r\n error = e\r\n } finally {\r\n for (let b=0; b= 3600000) formatted.push(`${date.getHours()}h`)\r\n\r\n formatted.push(`${date.getMinutes()}m`)\r\n formatted.push(`${date.getSeconds()}s`)\r\n }\r\n\r\n value = formatted.join(\" \")\r\n break\r\n }\r\n\r\n return value\r\n }\r\n\r\n static shuffle (arr) {\r\n for (let i=arr.length; i; i--) {\r\n const j = Math.floor(Math.random() * i)\r\n const x = arr[i-1]\r\n arr[i-1] = arr[j]\r\n arr[j] = x\r\n }\r\n }\r\n\r\n static splitData (data, {training=0.7, validation=0.15, test=0.15}={}) {\r\n\r\n const split = {\r\n training: [],\r\n validation: [],\r\n test: []\r\n }\r\n\r\n // Define here splits, for returning at the end\r\n for (let i=0; i 1-training) {\r\n split.training.push(data[i])\r\n } else {\r\n\r\n if (x maxVal) {\r\n maxVal = data[i]\r\n }\r\n }\r\n\r\n if ((-1*minVal + maxVal) != 0) {\r\n for (let i=0; ix, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(this.Module.ccall(`get_${pre}${prop}`, \"number\", valTypes, values)),\r\n set: val => this.Module.ccall(`set_${pre}${prop}`, null, valTypes.concat(\"number\"), values.concat(setCallback(val)))\r\n })\r\n }\r\n\r\n static defineArrayProperty (self, prop, valTypes, values, returnSize, {pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => NetUtil.ccallArrays(`get_${pre}${prop}`, \"array\", valTypes, values, {returnArraySize: returnSize, heapOut: \"HEAPF64\"}),\r\n set: value => NetUtil.ccallArrays(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([value]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineMapProperty (self, prop, valTypes, values, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth: 1, rows, columns, heapOut: \"HEAPF64\"})[0]),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static defineVolumeProperty (self, prop, valTypes, values, depth, rows, columns, {getCallback=x=>x, setCallback=x=>x, pre=\"\"}={}) {\r\n Object.defineProperty(self, prop, {\r\n get: () => getCallback(NetUtil.ccallVolume(`get_${pre}${prop}`, \"volume\", valTypes, values, {depth, rows, columns, heapOut: \"HEAPF64\"})),\r\n set: value => NetUtil.ccallVolume(`set_${pre}${prop}`, null, valTypes.concat(\"array\"), values.concat([setCallback(value)]), {heapIn: \"HEAPF64\"})\r\n })\r\n }\r\n\r\n static makeConfusionMatrix (originalData) {\r\n let total = 0\r\n let totalCorrect = 0\r\n const data = []\r\n\r\n for (let r=0; r {\r\n num = percent ? num.toFixed(1) + \"%\" : num.toString()\r\n const leftPad = Math.max(Math.floor((3*2+1 - num.length) / 2), 0)\r\n const rightPad = Math.max(3*2+1 - (num.length + leftPad), 0)\r\n return \" \".repeat(leftPad)+num+\" \".repeat(rightPad)\r\n }\r\n\r\n let colourText\r\n let colourBackground\r\n\r\n // Bright\r\n process.stdout.write(\"\\n\\x1b[1m\")\r\n\r\n for (let r=0; r Module.ccall(\"getError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"validationError\", {\r\n get: () => Module.ccall(\"getValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n Object.defineProperty(this, \"lastValidationError\", {\r\n get: () => Module.ccall(\"getLastValidationError\", \"number\", [\"number\"], [this.netInstance])\r\n })\r\n\r\n // Activation function get / set\r\n this.activationName = NetUtil.format(activation)\r\n Object.defineProperty(this, \"activation\", {\r\n get: () => `WASM ${this.activationName}`,\r\n set: activation => {\r\n\r\n if (NetUtil.activationsIndeces[activation] == undefined) {\r\n throw new Error(`The ${activation} activation function does not exist`)\r\n }\r\n this.activationName = activation\r\n this.Module.ccall(\"setActivation\", null, [\"number\", \"number\"], [this.netInstance, NetUtil.activationsIndeces[activation]])\r\n }\r\n })\r\n this.activation = this.activationName\r\n\r\n // Cost function get / set\r\n const costIndeces = {\r\n meansquarederror: 0,\r\n crossentropy: 1\r\n }\r\n let costFunctionName = NetUtil.format(cost)\r\n Object.defineProperty(this, \"cost\", {\r\n get: () => `WASM ${costFunctionName}`,\r\n set: cost => {\r\n if (costIndeces[cost] == undefined) {\r\n throw new Error(`The ${cost} function does not exist`)\r\n }\r\n costFunctionName = cost\r\n this.Module.ccall(\"setCostFunction\", null, [\"number\", \"number\"], [this.netInstance, costIndeces[cost]])\r\n }\r\n })\r\n this.cost = costFunctionName\r\n\r\n const updateFnIndeces = {\r\n vanillasgd: 0,\r\n gain: 1,\r\n adagrad: 2,\r\n rmsprop: 3,\r\n adam: 4,\r\n adadelta: 5,\r\n momentum: 6\r\n }\r\n NetUtil.defineProperty(this, \"updateFn\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(updateFnIndeces).find(key => updateFnIndeces[key]==index),\r\n setCallback: name => updateFnIndeces[name]\r\n })\r\n this.updateFn = NetUtil.format(updateFn)\r\n\r\n\r\n // Weights init configs\r\n const weightsConfigFns = {\r\n uniform: 0,\r\n gaussian: 1,\r\n xavieruniform: 2,\r\n xaviernormal: 3,\r\n lecununiform: 4,\r\n lecunnormal: 5\r\n }\r\n this.weightsConfig = {}\r\n\r\n NetUtil.defineProperty(this.weightsConfig, \"distribution\", [\"number\"], [this.netInstance], {\r\n getCallback: index => Object.keys(weightsConfigFns).find(key => weightsConfigFns[key]==Math.round(index)),\r\n setCallback: name => weightsConfigFns[name]\r\n })\r\n NetUtil.defineProperty(this.weightsConfig, \"limit\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"mean\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this.weightsConfig, \"stdDeviation\", [\"number\"], [this.netInstance])\r\n\r\n this.weightsConfig.distribution = \"xavieruniform\"\r\n\r\n if (weightsConfig!=undefined && weightsConfig.distribution) {\r\n\r\n if (typeof weightsConfig.distribution == \"function\") {\r\n throw new Error(\"Custom weights init functions are not (yet) supported with WASM.\")\r\n }\r\n\r\n this.weightsConfig.distribution = NetUtil.format(weightsConfig.distribution)\r\n }\r\n\r\n this.weightsConfig.limit = weightsConfig && weightsConfig.limit!=undefined ? weightsConfig.limit : 0.1\r\n this.weightsConfig.mean = weightsConfig && weightsConfig.mean!=undefined ? weightsConfig.mean : 0\r\n this.weightsConfig.stdDeviation = weightsConfig && weightsConfig.stdDeviation!=undefined ? weightsConfig.stdDeviation : 0.05\r\n\r\n switch (NetUtil.format(updateFn)) {\r\n\r\n case \"rmsprop\":\r\n this.learningRate = this.learningRate || 0.001\r\n break\r\n\r\n case \"adam\":\r\n this.learningRate = this.learningRate || 0.01\r\n break\r\n\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"rho\", [\"number\"], [this.netInstance])\r\n this.rho = rho==null ? 0.95 : rho\r\n break\r\n\r\n case \"momentum\":\r\n NetUtil.defineProperty(this, \"momentum\", [\"number\"], [this.netInstance])\r\n this.learningRate = this.learningRate || 0.2\r\n this.momentum = momentum\r\n break\r\n\r\n default:\r\n\r\n if (learningRate==undefined) {\r\n\r\n switch (this.activationName) {\r\n case \"relu\":\r\n case \"lrelu\":\r\n case \"rrelu\":\r\n case \"elu\":\r\n this.learningRate = 0.01\r\n break\r\n\r\n case \"tanh\":\r\n case \"lecuntanh\":\r\n this.learningRate = 0.001\r\n break\r\n\r\n default:\r\n this.learningRate = 0.2\r\n }\r\n }\r\n }\r\n\r\n if (this.updateFn==\"rmsprop\") {\r\n NetUtil.defineProperty(this, \"rmsDecay\", [\"number\"], [this.netInstance])\r\n this.rmsDecay = rmsDecay===undefined ? 0.99 : rmsDecay\r\n }\r\n\r\n if (this.activationName==\"lrelu\") {\r\n NetUtil.defineProperty(this, \"lreluSlope\", [\"number\"], [this.netInstance])\r\n this.lreluSlope = lreluSlope==undefined ? -0.0005 : lreluSlope\r\n } else if (this.activationName==\"elu\") {\r\n NetUtil.defineProperty(this, \"eluAlpha\", [\"number\"], [this.netInstance])\r\n this.eluAlpha = eluAlpha==undefined ? 1 : eluAlpha\r\n }\r\n\r\n this.layers = []\r\n this.epochs = 0\r\n\r\n NetUtil.defineProperty(this, \"iterations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validations\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"validationInterval\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"trainingLogging\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"stoppedEarly\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingType\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingThreshold\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingBestError\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatienceCounter\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPatience\", [\"number\"], [this.netInstance])\r\n NetUtil.defineProperty(this, \"earlyStoppingPercent\", [\"number\"], [this.netInstance])\r\n\r\n this.collectedErrors = {}\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"training\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"test\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n NetUtil.defineArrayProperty(this.collectedErrors, \"validation\", [\"number\"], [this.netInstance], \"auto\", {pre: \"collected_\"})\r\n\r\n if (layers.length) {\r\n\r\n this.state = \"constructed\"\r\n\r\n switch (true) {\r\n case layers.every(item => Number.isInteger(item)):\r\n this.layers = layers.map(size => new FCLayer(size))\r\n this.initLayers()\r\n break\r\n\r\n case layers.every(layer => layer instanceof FCLayer || layer instanceof ConvLayer || layer instanceof PoolLayer):\r\n this.layers = layers\r\n this.initLayers()\r\n break\r\n\r\n default:\r\n throw new Error(\"There was an error constructing from the layers given.\")\r\n\r\n }\r\n }\r\n }\r\n\r\n initLayers (input, expected) {\r\n\r\n if (this.state == \"initialised\") {\r\n return\r\n }\r\n\r\n if (this.state == \"not-defined\") {\r\n this.layers[0] = new FCLayer(input)\r\n this.layers[1] = new FCLayer(Math.ceil(input/expected > 5 ? expected + (Math.abs(input-expected))/4\r\n : input + expected))\r\n this.layers[2] = new FCLayer(Math.ceil(expected))\r\n }\r\n\r\n this.state = \"initialised\"\r\n\r\n for (let l=0; l map.map(row => row.map(v => Math.floor(v)))\r\n\r\n NetUtil.defineMapProperty(this, \"trainingConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"testConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n NetUtil.defineMapProperty(this, \"validationConfusionMatrix\", [\"number\"], [this.netInstance], outSize, outSize, {getCallback: floorFunc})\r\n }\r\n\r\n joinLayer (layer, layerIndex) {\r\n\r\n layer.net = this\r\n layer.layerIndex = layerIndex\r\n\r\n if (layerIndex) {\r\n this.layers[layerIndex-1].assignNext(layer)\r\n layer.assignPrev(this.layers[layerIndex-1], layerIndex)\r\n }\r\n layer.init()\r\n }\r\n\r\n forward (data) {\r\n\r\n if (this.state!=\"initialised\") {\r\n throw new Error(\"The network layers have not been initialised.\")\r\n }\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No data passed to Network.forward()\")\r\n }\r\n\r\n // Flatten volume inputs\r\n if (Array.isArray(data[0])) {\r\n const flat = []\r\n\r\n for (let c=0; c {\r\n\r\n if (data === undefined || data === null) {\r\n return void reject(\"No data provided\")\r\n }\r\n\r\n if (this.state != \"initialised\") {\r\n this.initLayers(data[0].input.length, data[0].expected.length)\r\n }\r\n\r\n const startTime = Date.now()\r\n\r\n const dimension = this.layers[0].size\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n\r\n if (log) {\r\n console.log(`Training started. Epochs: ${epochs} Batch size: ${miniBatchSize}`)\r\n }\r\n\r\n // Load training data\r\n const typedArray = new Float32Array(itemsCount)\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n let elapsed\r\n\r\n this.Module.ccall(\"loadTrainingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (shuffle) {\r\n this.Module.ccall(\"shuffleTrainingData\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n let validationBuf\r\n\r\n if (this.validation) {\r\n\r\n this.validationInterval = this.validation.interval || data.length // Default to 1 epoch\r\n\r\n if (this.validation.earlyStopping) {\r\n switch (this.validation.earlyStopping.type) {\r\n case \"threshold\":\r\n this.validation.earlyStopping.threshold = this.validation.earlyStopping.threshold || 0.01\r\n this.earlyStoppingThreshold = this.validation.earlyStopping.threshold\r\n this.earlyStoppingType = 1\r\n break\r\n case \"patience\":\r\n this.validation.earlyStopping.patience = this.validation.earlyStopping.patience || 20\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPatienceCounter = 0\r\n this.earlyStoppingPatience = this.validation.earlyStopping.patience\r\n this.earlyStoppingType = 2\r\n break\r\n case \"divergence\":\r\n this.validation.earlyStopping.percent = this.validation.earlyStopping.percent || 30\r\n this.earlyStoppingBestError = Infinity\r\n this.earlyStoppingPercent = this.validation.earlyStopping.percent\r\n this.earlyStoppingType = 3\r\n break\r\n }\r\n }\r\n\r\n\r\n // Load validation data\r\n if (this.validation.data) {\r\n const typedArray = new Float32Array(this.validation.data.length)\r\n this.loadData(this.validation.data, typedArray, itemSize , reject)\r\n validationBuf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadValidationData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n }\r\n }\r\n\r\n const logAndResolve = () => {\r\n this.Module._free(buf)\r\n this.Module._free(validationBuf)\r\n\r\n if (this.validation && this.validation.earlyStopping && (this.validation.earlyStopping.type == \"patience\" || this.validation.earlyStopping.type == \"divergence\")) {\r\n this.Module.ccall(\"restoreValidation\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (log) {\r\n console.log(`Training finished. Total time: ${NetUtil.format(elapsed, \"time\")}`)\r\n }\r\n resolve()\r\n }\r\n\r\n if (callback) {\r\n\r\n let epochIndex = 0\r\n let iterationIndex = 0\r\n\r\n const doEpoch = () => {\r\n\r\n if (this.l2) this.l2Error = 0\r\n if (this.l1) this.l1Error = 0\r\n\r\n iterationIndex = 0\r\n doIteration()\r\n }\r\n\r\n const doIteration = () => {\r\n\r\n this.Module.ccall(\"train\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, miniBatchSize, iterationIndex])\r\n\r\n if (iterationIndex%callbackInterval == 0 || this.validationError) {\r\n callback({\r\n iterations: (this.iterations),\r\n validations: (this.validations),\r\n trainingError: this.error,\r\n validationError: this.validationError,\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n }\r\n\r\n iterationIndex += miniBatchSize\r\n\r\n if (iterationIndex < data.length && !this.stoppedEarly) {\r\n if (iterationIndex%callbackInterval == 0) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n doIteration()\r\n }\r\n } else {\r\n epochIndex++\r\n\r\n elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n let text = `Epoch: ${epochIndex}\\nTraining Error: ${this.error}`\r\n\r\n if (this.validation) {\r\n text += `\\nValidation Error: ${this.lastValidationError}`\r\n }\r\n\r\n if (this.l2Error!=undefined) {\r\n text += `\\nL2 Error: ${this.l2Error/iterationIndex}`\r\n }\r\n\r\n text += `\\nElapsed: ${NetUtil.format(elapsed, \"time\")} Average Duration: ${NetUtil.format(elapsed/epochIndex, \"time\")}`\r\n console.log(text)\r\n }\r\n\r\n if (epochIndex < epochs && !this.stoppedEarly) {\r\n doEpoch()\r\n } else {\r\n logAndResolve()\r\n }\r\n }\r\n }\r\n doEpoch()\r\n\r\n } else {\r\n for (let e=0; e {\r\n\r\n if (data === undefined || data === null) {\r\n reject(\"No data provided\")\r\n }\r\n\r\n if (log) {\r\n console.log(\"Testing started\")\r\n }\r\n\r\n const startTime = Date.now()\r\n const dimension = data[0].input.length\r\n const itemSize = dimension + data[0].expected.length\r\n const itemsCount = itemSize * data.length\r\n const typedArray = new Float32Array(itemsCount)\r\n\r\n this.loadData(data, typedArray, itemSize, reject)\r\n\r\n const buf = this.Module._malloc(typedArray.length*typedArray.BYTES_PER_ELEMENT)\r\n this.Module.HEAPF32.set(typedArray, buf >> 2)\r\n\r\n this.Module.ccall(\"loadTestingData\", \"number\", [\"number\", \"number\", \"number\", \"number\", \"number\"],\r\n [this.netInstance, buf, itemsCount, itemSize, dimension])\r\n\r\n if (collectErrors) {\r\n this.Module.ccall(\"collectErrors\", null, [\"number\"], [this.netInstance])\r\n }\r\n\r\n if (callback) {\r\n\r\n let iterationIndex = 0\r\n let totalError = 0\r\n\r\n const doIteration = () => {\r\n\r\n totalError += this.Module.ccall(\"test\", \"number\", [\"number\", \"number\", \"number\"], [this.netInstance, 1, iterationIndex])\r\n\r\n callback({\r\n iterations: (iterationIndex+1),\r\n error: totalError/(iterationIndex+1),\r\n elapsed: Date.now() - startTime,\r\n input: data[iterationIndex].input\r\n })\r\n\r\n if (++iterationIndex < data.length) {\r\n setTimeout(doIteration.bind(this), 0)\r\n } else {\r\n iterationIndex\r\n\r\n const elapsed = Date.now() - startTime\r\n log && console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/iterationIndex, \"time\")}`)\r\n\r\n this.Module._free(buf)\r\n resolve(totalError/data.length)\r\n }\r\n }\r\n\r\n doIteration()\r\n\r\n } else {\r\n\r\n const avgError = this.Module.ccall(\"test\", \"number\", [\"number\", \"number\"], [this.netInstance, -1, 0])\r\n this.Module._free(buf)\r\n\r\n const elapsed = Date.now() - startTime\r\n\r\n if (log) {\r\n console.log(`Testing finished. Total time: ${NetUtil.format(elapsed, \"time\")} Average iteration time: ${NetUtil.format(elapsed/data.length, \"time\")}`)\r\n }\r\n\r\n resolve(avgError)\r\n }\r\n })\r\n }\r\n\r\n toJSON () {\r\n return {\r\n layers: this.layers.map(layer => layer.toJSON())\r\n }\r\n }\r\n\r\n fromJSON (data) {\r\n\r\n if (data === undefined || data === null) {\r\n throw new Error(\"No JSON data given to import.\")\r\n }\r\n\r\n if (data.layers.length != this.layers.length) {\r\n throw new Error(`Mismatched layers (${data.layers.length} layers in import data, but ${this.layers.length} configured)`)\r\n }\r\n\r\n this.Module.ccall(\"resetDeltaWeights\", null, [\"number\"], [this.netInstance])\r\n this.layers.forEach((layer, li) => li && layer.fromJSON(data.layers[li], li))\r\n }\r\n\r\n toIMG (IMGArrays, opts={}) {\r\n\r\n if (!IMGArrays) {\r\n throw new Error(\"The IMGArrays library must be provided. See the documentation for instructions.\")\r\n }\r\n\r\n const data = []\r\n\r\n for (let l=1; l v==1,\r\n setCallback: v => v ? 1 : 0\r\n })\r\n NetUtil.defineProperty(this, \"activation\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"error\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"derivative\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n NetUtil.defineProperty(this, \"bias\", paramTypes, params, {pre: \"neuron_\"})\r\n\r\n if (layerIndex) {\r\n NetUtil.defineArrayProperty(this, \"weights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n\r\n NetUtil.defineProperty(this, \"deltaBias\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"deltaWeights\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n switch (updateFn) {\r\n case \"gain\":\r\n NetUtil.defineProperty(this, \"biasGain\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightGain\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n break\r\n case \"adagrad\":\r\n case \"rmsprop\":\r\n case \"adadelta\":\r\n NetUtil.defineProperty(this, \"biasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"weightsCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n\r\n if (updateFn==\"adadelta\") {\r\n NetUtil.defineProperty(this, \"adadeltaBiasCache\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineArrayProperty(this, \"adadeltaCache\", paramTypes, params, this.size, {pre: \"neuron_\"})\r\n }\r\n break\r\n\r\n case \"adam\":\r\n NetUtil.defineProperty(this, \"m\", paramTypes, params, {pre: \"neuron_\"})\r\n NetUtil.defineProperty(this, \"v\", paramTypes, params, {pre: \"neuron_\"})\r\n break\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.Neuron = Neuron)\r\nexports.Neuron = Neuron\r\n\"use strict\"\r\n\r\nclass OutputLayer extends FCLayer {\r\n\r\n constructor (size, {activation, softmax}={}) {\r\n\r\n super(size, {activation})\r\n\r\n if (softmax) {\r\n this.softmax = true\r\n }\r\n }\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.OutputLayer = OutputLayer)\r\nexports.OutputLayer = OutputLayer\r\n\r\n\"use strict\"\r\n\r\nclass PoolLayer {\r\n\r\n constructor (size, {stride, activation}={}) {\r\n\r\n if (size) this.size = size\r\n if (stride) this.stride = stride\r\n\r\n this.activation = false\r\n this.activationName = activation\r\n\r\n if (activation != undefined) {\r\n if (typeof activation == \"boolean\" && !activation) {\r\n activation = \"noactivation\"\r\n }\r\n if (typeof activation != \"string\") {\r\n throw new Error(\"Custom activation functions are not available in the WebAssembly version\")\r\n }\r\n this.activationName = NetUtil.format(activation)\r\n }\r\n }\r\n\r\n assignNext (layer) {\r\n this.nextLayer = layer\r\n }\r\n\r\n assignPrev (layer, layerIndex) {\r\n\r\n this.netInstance = this.net.netInstance\r\n this.prevLayer = layer\r\n this.layerIndex = layerIndex\r\n\r\n let channels\r\n let prevLayerOutWidth = layer.outMapSize\r\n const size = this.size || this.net.pool.size || 2\r\n const stride = this.stride || this.net.pool.stride || this.size\r\n\r\n NetUtil.defineProperty(this, \"channels\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"stride\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n this.size = size\r\n this.stride = stride\r\n\r\n switch (true) {\r\n\r\n case layer instanceof FCLayer:\r\n channels = this.net.channels\r\n prevLayerOutWidth = Math.max(Math.floor(Math.sqrt(layer.size/channels)), 1)\r\n break\r\n\r\n case layer instanceof ConvLayer:\r\n channels = layer.size\r\n break\r\n\r\n case layer instanceof PoolLayer:\r\n channels = layer.channels\r\n break\r\n }\r\n\r\n this.channels = channels\r\n\r\n NetUtil.defineProperty(this, \"prevLayerOutWidth\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"inMapValuesCount\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineProperty(this, \"outMapSize\", [\"number\", \"number\"], [this.netInstance, layerIndex], {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"errors\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, prevLayerOutWidth, prevLayerOutWidth, {pre: \"pool_\"})\r\n\r\n const outMapSize = (prevLayerOutWidth - size) / stride + 1\r\n this.outMapSize = outMapSize\r\n this.inMapValuesCount = prevLayerOutWidth ** 2\r\n\r\n NetUtil.defineVolumeProperty(this, \"activations\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {pre: \"pool_\"})\r\n NetUtil.defineVolumeProperty(this, \"indeces\", [\"number\", \"number\"], [this.netInstance, layerIndex], channels, outMapSize, outMapSize, {\r\n pre: \"pool_\",\r\n getCallback: vol => vol.map(map => map.map(row => row.map(val => [parseInt(val/2), val%2]))),\r\n setCallback: vol => vol.map(map => map.map(row => row.map(([x,y]) => 2*x+y)))\r\n })\r\n\r\n if (outMapSize%1 != 0) {\r\n throw new Error(`Misconfigured hyperparameters. Activation volume dimensions would be ${outMapSize} in pool layer at index ${layerIndex}`)\r\n }\r\n\r\n if (this.activationName) {\r\n NetUtil.defineProperty(this, \"activation\", [\"number\", \"number\"], [this.netInstance, layerIndex], {\r\n pre: \"pool_\",\r\n getCallback: _ => `WASM ${this.activationName}`\r\n })\r\n this.activation = NetUtil.activationsIndeces[this.activationName]\r\n }\r\n }\r\n\r\n init () {}\r\n\r\n toJSON () {return {}}\r\n\r\n fromJSON() {}\r\n\r\n getDataSize () {return 0}\r\n\r\n toIMG () {return []}\r\n\r\n fromIMG () {}\r\n\r\n}\r\n\r\n/* istanbul ignore next */\r\ntypeof window!=\"undefined\" && (window.PoolLayer = PoolLayer)\r\nexports.PoolLayer = PoolLayer\n//# sourceMappingURL=jsNetWebAssembly.concat.js.map"]} \ No newline at end of file diff --git a/examples/mnist/mnist.html b/examples/mnist/mnist.html index f2bf64b..85391e3 100644 --- a/examples/mnist/mnist.html +++ b/examples/mnist/mnist.html @@ -361,7 +361,7 @@ Module: Module, layers: [ new InputLayer(784), - new FCLayer(100), + new FCLayer(100, {activation: "sigmoid"}), new OutputLayer(10, {activation: false, softmax: true}) ] }) diff --git a/package.json b/package.json index 74d66d7..011e186 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsnet", - "version": "3.3.2", + "version": "3.3.3", "description": "Javascript based deep learning framework for basic and convolutional neural networks.", "scripts": { "test": "npm run js-tests && npm run wa-tests", diff --git a/test/js-test.js b/test/js-test.js index a58994d..9987ed0 100644 --- a/test/js-test.js +++ b/test/js-test.js @@ -36,7 +36,7 @@ describe("Loading", () => { }) it("Statically returns the Network version when accessing via .version", () => { - expect(Network.version).to.equal("3.3.1") + expect(Network.version).to.equal("3.3.3") }) }) diff --git a/test/wa-test.js b/test/wa-test.js index 982381e..326ba56 100644 --- a/test/wa-test.js +++ b/test/wa-test.js @@ -36,7 +36,7 @@ describe("Loading", () => { }) it("Statically returns the Network version when accessing via .version", () => { - expect(Network.version).to.equal("3.3.1") + expect(Network.version).to.equal("3.3.3") }) })