diff --git a/.gitignore b/.gitignore index d37eb0f..ebfd0ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.swp .DS_Store node_modules +templates package-lock.json \ No newline at end of file diff --git a/README.md b/README.md index 9161b65..6e7cd3c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -# Aiden. Your physio assistant. +![Aiden](/assets/aiden.png) -### Aiden is a web app utilising **_tensorflow.js_**, browser-based Machine Learning library, to enable accessible physiotherapy for the Visually Impaired and other people as well - talking through exercises by responding to users' postures in real-time. +# Aiden - Your Physio assistant. +#### Aiden is a web app utilising **_tensorflow.js_**, browser-based Machine Learning library, to enable accessible physiotherapy for the Visually Impaired and other people as well - talking through exercises by responding to users' postures in real-time. Aiden makes it easier for users to not only complete but to improve their techniques independently. @@ -15,8 +16,10 @@ Aiden makes it easier for users to not only complete but to improve their techni ### Machine Learning - tensorflow.js Aiden uses a [tensorflow.js](https://www.tensorflow.org/js) (browser-based) model to make predictions on the state of the current user's pose. It has been trained on a dataset of images created by us (~300 images per pose) to predict whether the position is correct, or incorrect - and what makes it so. + We have used Azure Machine Learning Studio, an Azure Machine Learning tool, to train our models in the various physiotherapy poses. Azure Cognitive Services Speech-to-Text API was also used to enable the application to be accessible by the visually impaired. The user can start their exercises via speech in various languages using Azure Translator Speech API remotely and this is more convenient and easier to use for our target audience. + The application utilizes Azure Cognitive Services for text-to-speech. This is useful for the visually impaired as they can hear if they are in the right position as the application will tell them to adjust their posture if incorrect. ### Index.html diff --git a/about/index.html.tmp b/about/index.html.tmp deleted file mode 100644 index af5645e..0000000 Binary files a/about/index.html.tmp and /dev/null differ diff --git a/app.js b/app.js deleted file mode 100644 index a3d0c95..0000000 --- a/app.js +++ /dev/null @@ -1,133 +0,0 @@ -/* ----------------------------------------------- -/* How to use? : Check the GitHub README -/* ----------------------------------------------- */ - -/* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */ -/* -particlesJS.load('particles-js', 'particles.json', function() { - console.log('particles.js loaded - callback'); -}); -*/ - -/* Otherwise just put the config content (json): */ - -particlesJS('particles-js', - - { - "particles": { - "number": { - "value": 80, - "density": { - "enable": true, - "value_area": 800 - } - }, - "color": { - "value": "#ffffff" - }, - "shape": { - "type": "circle", - "stroke": { - "width": 0, - "color": "#000000" - }, - "polygon": { - "nb_sides": 5 - }, - "image": { - "src": "img/github.svg", - "width": 100, - "height": 100 - } - }, - "opacity": { - "value": 0.5, - "random": false, - "anim": { - "enable": false, - "speed": 1, - "opacity_min": 0.1, - "sync": false - } - }, - "size": { - "value": 5, - "random": true, - "anim": { - "enable": false, - "speed": 40, - "size_min": 0.1, - "sync": false - } - }, - "line_linked": { - "enable": true, - "distance": 150, - "color": "#ffffff", - "opacity": 0.4, - "width": 1 - }, - "move": { - "enable": true, - "speed": 6, - "direction": "none", - "random": false, - "straight": false, - "out_mode": "out", - "attract": { - "enable": false, - "rotateX": 600, - "rotateY": 1200 - } - } - }, - "interactivity": { - "detect_on": "canvas", - "events": { - "onhover": { - "enable": false, - "mode": "repulse" - }, - "onclick": { - "enable": false, - "mode": "push" - }, - "resize": true - }, - "modes": { - "grab": { - "distance": 400, - "line_linked": { - "opacity": 1 - } - }, - "bubble": { - "distance": 400, - "size": 40, - "duration": 2, - "opacity": 8, - "speed": 3 - }, - "repulse": { - "distance": 200 - }, - "push": { - "particles_nb": 4 - }, - "remove": { - "particles_nb": 2 - } - } - }, - "retina_detect": true, - "config_demo": { - "hide_card": false, - "background_color": "#b61924", - "background_image": "", - "background_position": "50% 50%", - "background_repeat": "no-repeat", - "background_size": "cover" - } - } - -); \ No newline at end of file diff --git a/assets/aiden.png b/assets/aiden.png new file mode 100644 index 0000000..20d9723 Binary files /dev/null and b/assets/aiden.png differ diff --git a/client/about/index.html.tmp b/client/about/index.html.tmp deleted file mode 100644 index af5645e..0000000 Binary files a/client/about/index.html.tmp and /dev/null differ diff --git a/client/app.js b/client/app.js deleted file mode 100644 index a3d0c95..0000000 --- a/client/app.js +++ /dev/null @@ -1,133 +0,0 @@ -/* ----------------------------------------------- -/* How to use? : Check the GitHub README -/* ----------------------------------------------- */ - -/* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */ -/* -particlesJS.load('particles-js', 'particles.json', function() { - console.log('particles.js loaded - callback'); -}); -*/ - -/* Otherwise just put the config content (json): */ - -particlesJS('particles-js', - - { - "particles": { - "number": { - "value": 80, - "density": { - "enable": true, - "value_area": 800 - } - }, - "color": { - "value": "#ffffff" - }, - "shape": { - "type": "circle", - "stroke": { - "width": 0, - "color": "#000000" - }, - "polygon": { - "nb_sides": 5 - }, - "image": { - "src": "img/github.svg", - "width": 100, - "height": 100 - } - }, - "opacity": { - "value": 0.5, - "random": false, - "anim": { - "enable": false, - "speed": 1, - "opacity_min": 0.1, - "sync": false - } - }, - "size": { - "value": 5, - "random": true, - "anim": { - "enable": false, - "speed": 40, - "size_min": 0.1, - "sync": false - } - }, - "line_linked": { - "enable": true, - "distance": 150, - "color": "#ffffff", - "opacity": 0.4, - "width": 1 - }, - "move": { - "enable": true, - "speed": 6, - "direction": "none", - "random": false, - "straight": false, - "out_mode": "out", - "attract": { - "enable": false, - "rotateX": 600, - "rotateY": 1200 - } - } - }, - "interactivity": { - "detect_on": "canvas", - "events": { - "onhover": { - "enable": false, - "mode": "repulse" - }, - "onclick": { - "enable": false, - "mode": "push" - }, - "resize": true - }, - "modes": { - "grab": { - "distance": 400, - "line_linked": { - "opacity": 1 - } - }, - "bubble": { - "distance": 400, - "size": 40, - "duration": 2, - "opacity": 8, - "speed": 3 - }, - "repulse": { - "distance": 200 - }, - "push": { - "particles_nb": 4 - }, - "remove": { - "particles_nb": 2 - } - } - }, - "retina_detect": true, - "config_demo": { - "hide_card": false, - "background_color": "#b61924", - "background_image": "", - "background_position": "50% 50%", - "background_repeat": "no-repeat", - "background_size": "cover" - } - } - -); \ No newline at end of file diff --git a/client/css/style.css b/client/css/style.css index 3fd2bf2..f618d7a 100644 --- a/client/css/style.css +++ b/client/css/style.css @@ -88,11 +88,21 @@ canvas{ #particles-js{ width: 100%; height: 100%; - background-color: #11231f; + background-color: #3d949b; background-image: url(''); background-size: cover; background-position: 50% 50%; background-repeat: no-repeat; } -/* ---- reset ---- */ body{ margin:0; font:normal 75% Arial, Helvetica, sans-serif; } canvas{ display: block; vertical-align: bottom; } /* ---- particles.js container ---- */ #particles-js{ position:absolute; width: 100%; height: 100%; background-color: #273e3a; background-image: url(""); background-repeat: no-repeat; background-size: cover; background-position: 50% 50%; } /* ---- stats.js ---- */ .count-particles{ background: #000022; position: absolute; top: 48px; left: 0; width: 80px; color: #13E8E9; font-size: .8em; text-align: left; text-indent: 4px; line-height: 14px; padding-bottom: 2px; font-family: Helvetica, Arial, sans-serif; font-weight: bold; } .js-count-particles{ font-size: 1.1em; } #stats, .count-particles{ -webkit-user-select: none; margin-top: 5px; margin-left: 5px; } #stats{ border-radius: 3px 3px 0 0; overflow: hidden; } .count-particles{ border-radius: 0 0 3px 3px; } \ No newline at end of file +/* ---- reset ---- */ +/* body{ margin:0; font:normal 75% Arial, Helvetica, sans-serif; } +canvas{ display: block; vertical-align: bottom; } */ +/* ---- particles.js container ---- */ +/* #particles-js{ position:absolute; width: 100%; height: 100%; background-color: #273e3a; background-image: url(""); background-repeat: no-repeat; background-size: cover; background-position: 50% 50%; } */ +/* ---- stats.js ---- */ +/* .count-particles{ background: #000022; position: absolute; top: 48px; left: 0; width: 80px; color: #13E8E9; font-size: .8em; text-align: left; text-indent: 4px; line-height: 14px; padding-bottom: 2px; font-family: Helvetica, Arial, sans-serif; font-weight: bold; } */ +/* .js-count-particles{ font-size: 1.1em; } +#stats, .count-particles{ -webkit-user-select: none; margin-top: 5px; margin-left: 5px; } +#stats{ border-radius: 3px 3px 0 0; overflow: hidden; } +.count-particles{ border-radius: 0 0 3px 3px; } */ \ No newline at end of file diff --git a/client/img/enterprise/netlify-enterprise-edge-animated.svg.tmp b/client/img/enterprise/netlify-enterprise-edge-animated.svg.tmp deleted file mode 100644 index 876aa94..0000000 Binary files a/client/img/enterprise/netlify-enterprise-edge-animated.svg.tmp and /dev/null differ diff --git a/client/img/enterprise/netlify-enterprise-performance-animated.svg.tmp b/client/img/enterprise/netlify-enterprise-performance-animated.svg.tmp deleted file mode 100644 index ab6cbcd..0000000 Binary files a/client/img/enterprise/netlify-enterprise-performance-animated.svg.tmp and /dev/null differ diff --git a/client/img/enterprise/netlify-enterprise-secure-animated.svg.tmp b/client/img/enterprise/netlify-enterprise-secure-animated.svg.tmp deleted file mode 100644 index e6b355a..0000000 Binary files a/client/img/enterprise/netlify-enterprise-secure-animated.svg.tmp and /dev/null differ diff --git a/app2.js b/client/js/app2.js similarity index 100% rename from app2.js rename to client/js/app2.js diff --git a/client/index.js b/client/js/index.js similarity index 100% rename from client/index.js rename to client/js/index.js diff --git a/client/live_stream.html b/client/live_stream.html index 8af9476..e229a9e 100644 --- a/client/live_stream.html +++ b/client/live_stream.html @@ -197,7 +197,7 @@ web.addMessage("Hello, my name is AIDEN. I'll be your physio assistant."); web.processMessages(); - + - + diff --git a/css/style.css b/css/style.css deleted file mode 100644 index 3fd2bf2..0000000 --- a/css/style.css +++ /dev/null @@ -1,98 +0,0 @@ -/* ============================================================================= - HTML5 CSS Reset Minified - Eric Meyer - ========================================================================== */ - -html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent} -body{line-height:1} -article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block} -nav ul{list-style:none} -blockquote,q{quotes:none} -blockquote:before,blockquote:after,q:before,q:after{content:none} -a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent;text-decoration:none} -mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold} -del{text-decoration:line-through} -abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help} -table{border-collapse:collapse;border-spacing:0} -hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0} -input,select{vertical-align:middle} -li{list-style:none} - - -/* ============================================================================= - My CSS - ========================================================================== */ - -/* ---- base ---- */ - -html,body{ - width:100%; - height:100%; - background:#111; -} - -html{ - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -body{ - font:normal 75% Arial, Helvetica, sans-serif; -} - -canvas{ - display:block; - vertical-align:bottom; -} - - -/* ---- stats.js ---- */ - -.count-particles{ - background: #000022; - position: absolute; - top: 48px; - left: 0; - width: 80px; - color: #13E8E9; - font-size: .8em; - text-align: left; - text-indent: 4px; - line-height: 14px; - padding-bottom: 2px; - font-family: Helvetica, Arial, sans-serif; - font-weight: bold; -} - -.js-count-particles{ - font-size: 1.1em; -} - -#stats, -.count-particles{ - -webkit-user-select: none; - margin-top: 5px; - margin-left: 5px; -} - -#stats{ - border-radius: 3px 3px 0 0; - overflow: hidden; -} - -.count-particles{ - border-radius: 0 0 3px 3px; -} - - -/* ---- particles.js container ---- */ - -#particles-js{ - width: 100%; - height: 100%; - background-color: #11231f; - background-image: url(''); - background-size: cover; - background-position: 50% 50%; - background-repeat: no-repeat; -} - -/* ---- reset ---- */ body{ margin:0; font:normal 75% Arial, Helvetica, sans-serif; } canvas{ display: block; vertical-align: bottom; } /* ---- particles.js container ---- */ #particles-js{ position:absolute; width: 100%; height: 100%; background-color: #273e3a; background-image: url(""); background-repeat: no-repeat; background-size: cover; background-position: 50% 50%; } /* ---- stats.js ---- */ .count-particles{ background: #000022; position: absolute; top: 48px; left: 0; width: 80px; color: #13E8E9; font-size: .8em; text-align: left; text-indent: 4px; line-height: 14px; padding-bottom: 2px; font-family: Helvetica, Arial, sans-serif; font-weight: bold; } .js-count-particles{ font-size: 1.1em; } #stats, .count-particles{ -webkit-user-select: none; margin-top: 5px; margin-left: 5px; } #stats{ border-radius: 3px 3px 0 0; overflow: hidden; } .count-particles{ border-radius: 0 0 3px 3px; } \ No newline at end of file diff --git a/img/enterprise/netlify-enterprise-edge-animated.svg.tmp b/img/enterprise/netlify-enterprise-edge-animated.svg.tmp deleted file mode 100644 index 876aa94..0000000 Binary files a/img/enterprise/netlify-enterprise-edge-animated.svg.tmp and /dev/null differ diff --git a/img/enterprise/netlify-enterprise-performance-animated.svg.tmp b/img/enterprise/netlify-enterprise-performance-animated.svg.tmp deleted file mode 100644 index ab6cbcd..0000000 Binary files a/img/enterprise/netlify-enterprise-performance-animated.svg.tmp and /dev/null differ diff --git a/img/enterprise/netlify-enterprise-secure-animated.svg.tmp b/img/enterprise/netlify-enterprise-secure-animated.svg.tmp deleted file mode 100644 index e6b355a..0000000 Binary files a/img/enterprise/netlify-enterprise-secure-animated.svg.tmp and /dev/null differ diff --git a/img/global/favicon/apple-touch-icon.png b/img/global/favicon/apple-touch-icon.png deleted file mode 100644 index 7ff4640..0000000 Binary files a/img/global/favicon/apple-touch-icon.png and /dev/null differ diff --git a/img/global/favicon/browserconfig.xml b/img/global/favicon/browserconfig.xml deleted file mode 100644 index cadc027..0000000 --- a/img/global/favicon/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #00c7b7 - - - diff --git a/img/global/favicon/favicon-16x16.png b/img/global/favicon/favicon-16x16.png deleted file mode 100644 index d4898ff..0000000 Binary files a/img/global/favicon/favicon-16x16.png and /dev/null differ diff --git a/img/global/favicon/favicon-32x32.png b/img/global/favicon/favicon-32x32.png deleted file mode 100644 index 0d4612c..0000000 Binary files a/img/global/favicon/favicon-32x32.png and /dev/null differ diff --git a/img/global/favicon/manifest.json b/img/global/favicon/manifest.json deleted file mode 100644 index 44b264d..0000000 --- a/img/global/favicon/manifest.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "Netlify", - "icons": [ - { - "src": "\/img\/global\/favicon\/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image\/png" - }, - { - "src": "\/img\/global\/favicon\/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image\/png" - } - ], - "background_color": "#ffffff", - "theme_color": "#ffffff", - "display": "standalone" -} diff --git a/img/global/favicon/safari-pinned-tab.svg b/img/global/favicon/safari-pinned-tab.svg deleted file mode 100644 index 776ea95..0000000 --- a/img/global/favicon/safari-pinned-tab.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/img/global/meta-image.jpg b/img/global/meta-image.jpg deleted file mode 100644 index 0a937d5..0000000 Binary files a/img/global/meta-image.jpg and /dev/null differ diff --git a/index.html b/index.html deleted file mode 100644 index 327554b..0000000 --- a/index.html +++ /dev/null @@ -1,1354 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
- -

- One assistant. - One platform. - For Your Good Health. -

- -

- AIDEN is everything you need from your physiotherapist. -

- -
-
- - -
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/index.js b/index.js deleted file mode 100644 index 1c0ddbe..0000000 --- a/index.js +++ /dev/null @@ -1,333 +0,0 @@ -// More API functions here: -// https://github.com/googlecreativelab/teachablemachine-community/tree/master/libraries/pose - -// the link to your model provided by Teachable Machine export panel -const URL2 = "https://teachablemachine.withgoogle.com/models/9o5NXD5r/"; // Lunge -// const URL2 = "https://aiden.blob.core.windows.net/aidenmodels/"; // 2.0 lunge - -// const URL1 = "https://teachablemachine.withgoogle.com/models/nFctljBl/"; // Back bend -const URL1 = "https://teachablemachine.withgoogle.com/models/w_q11QNp/"; // DEMO -// const URL1 = "https://aiden.blob.core.windows.net/aidenmodels/"; // 2.0 metadata.json -let model, model2, webcam, ctx, labelContainer, maxPredictions; - -var bar_colours = [ - "bg-success", - "bg-warning", - "bg-info", - "bg-danger", - "bg-success", - "bg-info", - "bg-warning", - "bg-danger" -]; - -let no_stretch = 1; - -const STREAK = 40; -const CONFIDENCE_BENCHMARK = 0.5; -var currentPosture_and_stream = { Posture: "Unsure", Streak: 1 }; -var lastCall = "Unsure"; -var flag = true; - -async function init(URLno) { - var URL = URL1; - if (URLno == 1) { - URL = URL2; - } - - const modelURL = URL + "model.json"; - const metadataURL = URL + "metadata.json"; - - // load the model and metadata - // Refer to tmPose.loadFromFiles() in the API to support files from a file picker - model = await tmPose.load(modelURL, metadataURL); - maxPredictions = model.getTotalClasses(); - - // Convenience function to setup a webcam - const flip = true; // whether to flip the webcam - webcam = new tmPose.Webcam(parent.innerWidth, parent.innerHeight, flip); // width, height, flip - await webcam.setup(); // request access to the webcam - webcam.play(); - window.requestAnimationFrame(loop); - - // append/get elements to the DOM - const canvas = document.getElementById("canvas"); - canvas.width = parent.innerWidth; - canvas.height = parent.innerHeight; - - ctx = canvas.getContext("2d"); - labelContainer = document.getElementById("label-container"); - for (let i = 0; i < maxPredictions; i++) { - // and class labels - labelContainer.appendChild(document.createElement("div")); - } - // var startmsg = new SpeechSynthesisUtterance( - // "Starting Your Exercises. Beginning with Back Bend Stretch" - // ); - web.addMessage("Starting Your Exercises. Beginning with Back Bend Stretch"); - web.processMessages(); - - if (URLno == 1) { - startmsg = new SpeechSynthesisUtterance( - "." - ); - web.addMessage("Second Exercise. Lunge Rotate Stretch"); - web.processMessages(); - } - window.speechSynthesis.speak(startmsg); - - var el = document.getElementById("filler-label-container"); - el.remove(); - var bel = document.getElementById("speech"); - bel.remove(); - - document.getElementById("sequence").innerHTML = `
- Back Bend - Lunge Rotate - Calf Tense - Shoulder Relax - Neck Soother - Ankle Rolling - Chest Expand -
`; - - console.log("Hello World"); - - if (URLno == 1) { - document.getElementById("sequence").sequence.innerHTML = `
- Back Bend - Lunge Rotate - Calf Tense - Shoulder Relax - Neck Soother - Ankle Rolling - Chest Expand -
`; - } -} - -async function loop(timestamp) { - webcam.update(); // update the webcam frame - - await predict(); - window.requestAnimationFrame(loop); -} - -async function predict() { - let { pose, posenetOutput } = await model.estimatePose(webcam.canvas); - let prediction = await model.predict(posenetOutput); - - // Prediction #1: run input through posenet - // estimatePose can take in an image, video or canvas html element - - // Prediction 2: run input through teachable machine classification model - - // Prediction 2: run input through teachable machine classification model - - for (let i = 0; i < maxPredictions; i++) { - prediction[i].className = - prediction[i].className == "Knees too bent" - ? "Knees Too Bent" - : prediction[i].className; - const classPrediction = - prediction[i].className + - ": " + - (prediction[i].probability * 100).toFixed(0) + - "%" + - `
-
-
`; - - labelContainer.childNodes[i].innerHTML = classPrediction; - if (prediction[i].probability > CONFIDENCE_BENCHMARK) { - if (currentPosture_and_stream.Posture == prediction[i].className) { - console.log( - currentPosture_and_stream.Streak, - lastCall, - prediction[i].className - ); - if (currentPosture_and_stream.Streak > STREAK) { - console.log("Mumba", lastCall, no_stretch); - if (lastCall != prediction[i].className) { - console.log( - "Has been " + - prediction[i].className + - " " + - STREAK + - " times in a row" - ); - // Current Status - footer.innerHTML = "Status: " + prediction[i].className; - - lastCall = prediction[i].className; - var msg = new SpeechSynthesisUtterance( - prediction[i].className - ); - web.addMessage(prediction[i].className); - console.log(prediction[i].className) - web.processMessages(); - - // window.speechSynthesis.speak(msg); - } else { - if (no_stretch == 1 && lastCall == "Correct Bend") { - console.log(msg, "yeeepo"); - var msg = new SpeechSynthesisUtterance( - "." - - ); - - - // window.speechSynthesis.speak(msg); - web.addMessage("Hold there for 10 seconds. Finished Back Bend"); - web.processMessages(); - flag = false; - console.log("start" + no_stretch); - document.getElementById( - "stretch" + no_stretch - ).style.background = "green"; - no_stretch += 1; - init(1); - } else if ( - no_stretch == 2 && - lastCall == "Correct Lunge" - ) { - var msg = new SpeechSynthesisUtterance( - "Finished Lunge Rotate" - ); - window.speechSynthesis.speak(msg); - flag = false; - console.log("start" + no_stretch); - document.getElementById( - "stretch" + no_stretch.toString() - ).style.background = "green"; - no_stretch += 1; - } else if (no_stretch == 3) { - var msg = new SpeechSynthesisUtterance( - "Finished Stretches. This continues your 3 day streak" - ); - window.speechSynthesis.speak(msg); - no_stretch += 1; - } - } - } else { - console.log("streak", currentPosture_and_stream.Streak); - currentPosture_and_stream.Streak += 1; - } - } else { - console.log("Yeahhh"); - currentPosture_and_stream.Posture = prediction[i].className; - currentPosture_and_stream.Streak = 0; - console.log(currentPosture_and_stream.Posture); - } - } - } - - // finally draw the poses - drawPose(pose); -} - -function drawPose(pose) { - ctx.drawImage(webcam.canvas, 0, 0); - // draw the keypoints and skeleton - if (pose) { - const minPartConfidence = 0.5; - tmPose.drawKeypoints(pose.keypoints, minPartConfidence, ctx); - tmPose.drawSkeleton(pose.keypoints, minPartConfidence, ctx); - } -} - -try { - let started = true; - window.SpeechRecognition = - window.webkitSpeechRecognition || window.SpeechRecognition; - let finalTranscript = ""; - let recognition = new window.SpeechRecognition(); - recognition.interimResults = true; - recognition.maxAlternatives = 10; - recognition.continuous = true; - recognition.onresult = event => { - let interimTranscript = ""; - for (let i = event.resultIndex, len = event.results.length;i < len;i++) { - let transcript = event.results[i][0].transcript; - if (transcript.includes("begin")||transcript.toLowerCase().includes("shuru")) { - if (started) { - started = false; - init(0); - - console.log("Begin exercises"); - // Removes the div with the 'div-02' id}} - } - } - if (event.results[i].isFinal) { - finalTranscript += transcript; - - } else { - interimTranscript += transcript; - } - console.log(finalTranscript); - - if (transcript.includes("stop")|| transcript.includes("ruk ja")) { - console.log("TMKC"); - // recognition.abort(); - // recognition.stop(); - // recognition.getTracks().forEach(function(track) { - // track.stop(); - // alert(track); - // }); - webcam.stop(); - document.getElementById("Camera").style.visibility="hidden"; - } - - - if (transcript.includes("leaderboard")) { - // recognition.abort(); - // recognition.stop(); - // recognition.getTracks().forEach(function(track) { - // track.stop(); - // alert(track); - // }); - window.location.href = "/leaderboard.html"; - } - - } - speech.innerHTML = - '' + interimTranscript + ""; - finalTranscript + '' + interimTranscript + ""; - }; - recognition.start(); - started=true; -} catch (err) { - alert( - "Unfortunately, this browser/OS combination is unsupported. For best results, use Google Chrome on Desktop or Android." - ); -} - - -async function postData(url = '', data = {}) { - // Default options are marked with * - const response = await fetch(url, { - method: 'POST', // *GET, POST, PUT, DELETE, etc. - mode: 'cors', // no-cors, *cors, same-origin - cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached - credentials: 'same-origin', // include, *same-origin, omit - headers: { - 'Content-Type': 'application/json' - // 'Content-Type': 'application/x-www-form-urlencoded', - }, - redirect: 'follow', // manual, *follow, error - referrerPolicy: 'no-referrer', // no-referrer, *client - body: JSON.stringify(data) // body data type must match "Content-Type" header - }); - return await response.json(); // parses JSON response into native JavaScript objects - } - - postData('https://api.cognitive.microsofttranslator.com/translate?api-version=3.0', { "Text":"I would really like to drive your car around the block a few times."}) - .then((data) => { - console.log(data); // JSON data parsed by `response.json()` call - }); \ No newline at end of file diff --git a/js/app.js b/js/app.js deleted file mode 100644 index 20533cd..0000000 --- a/js/app.js +++ /dev/null @@ -1,128 +0,0 @@ -/* ----------------------------------------------- -/* How to use? : Check the GitHub README -/* ----------------------------------------------- */ - -/* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */ -/* -particlesJS.load('particles-js', 'particles.json', function() { - console.log('particles.js loaded - callback'); -}); -*/ - -/* Otherwise just put the config content (json): */ - -particlesJS('particles-js', - -{ - "particles": { - "number": { - "value": 35, - "density": { - "enable": true, - "value_area": 1657.2100474277727 - } - }, - "color": { - "value": "#ffffff" - }, - "shape": { - "type": "circle", - "stroke": { - "width": 0, - "color": "#000000" - }, - "polygon": { - "nb_sides": 5 - }, - "image": { - "src": "img/github.svg", - "width": 100, - "height": 100 - } - }, - "opacity": { - "value": 0.16572100474277726, - "random": false, - "anim": { - "enable": false, - "speed": 1, - "opacity_min": 0.1, - "sync": false - } - }, - "size": { - "value": 3, - "random": true, - "anim": { - "enable": false, - "speed": 40, - "size_min": 0.1, - "sync": false - } - }, - "line_linked": { - "enable": true, - "distance": 150, - "color": "#ffffff", - "opacity": 0.4, - "width": 1 - }, - "move": { - "enable": true, - "speed": 6, - "direction": "none", - "random": false, - "straight": false, - "out_mode": "out", - "bounce": false, - "attract": { - "enable": false, - "rotateX": 600, - "rotateY": 1200 - } - } - }, - "interactivity": { - "detect_on": "canvas", - "events": { - "onhover": { - "enable": true, - "mode": "repulse" - }, - "onclick": { - "enable": true, - "mode": "push" - }, - "resize": true - }, - "modes": { - "grab": { - "distance": 400, - "line_linked": { - "opacity": 1 - } - }, - "bubble": { - "distance": 400, - "size": 40, - "duration": 2, - "opacity": 8, - "speed": 3 - }, - "repulse": { - "distance": 200, - "duration": 0.4 - }, - "push": { - "particles_nb": 4 - }, - "remove": { - "particles_nb": 2 - } - } - }, - "retina_detect": true -} - - -); \ No newline at end of file diff --git a/js/tf.min.js b/js/tf.min.js deleted file mode 100644 index c3f4d05..0000000 --- a/js/tf.min.js +++ /dev/null @@ -1,3 +0,0 @@ -// @tensorflow/tfjs Copyright 2019 Google -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.tf=t.tf||{})}(this,function(t){"use strict";var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,n)};function n(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}function r(t,e,n,r){return new(n||(n=Promise))(function(a,i){function o(t){try{u(r.next(t))}catch(t){i(t)}}function s(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){t.done?a(t.value):new n(function(e){e(t.value)}).then(o,s)}u((r=r.apply(t,e||[])).next())})}function a(t,e){var n,r,a,i,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&i[0]?r.return:i[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,i[1])).done)return a;switch(r=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]0;)r=Math.random()*e|0,n=t[--e],t[e]=t[r],t[r]=n}function f(t,e,n){return Math.max(t,Math.min(e,n))}function d(t){return t%2==0?t:t+1}function m(t){for(var e=0,n=0;n=n?a():setTimeout(o,s)}};o()})}function E(t,e){for(var n=1,r=-1,a=0;a=0)n*=t[a];else if(-1===t[a]){if(-1!==r)throw Error("Shapes can only have 1 implicit size. Found -1 at dim "+r+" and dim "+a);r=a}else if(t[a]<0)throw Error("Shapes can not be < 0. Found "+t[a]+" at dim "+a);if(-1===r){if(e>0&&e!==n)throw Error("Size("+e+") must match the product of shape "+t);return t}if(0===n)throw Error("Cannot infer the missing size in ["+t+"] when there are 0 elements");if(e%n!=0)throw Error("The implicit shape can't be a fractional number. Got "+e+" / "+n);var i=t.slice();return i[r]=e/n,i}function A(t,e){var n=e.length;return g((t=null==t?e.map(function(t,e){return e}):[].concat(t)).every(function(t){return t>=-n&&ts)&&1===t[s]&&(n.push(t[s]),r.push(s)),i[o]<=s&&o++}1!==t[s]&&(n.push(t[s]),r.push(s))}return{newShape:n,keptDims:r}}function T(t,e){var n=null;if(null==t||"float32"===t)n=new Float32Array(e);else if("int32"===t)n=new Int32Array(e);else{if("bool"!==t)throw new Error("Unknown data type "+t);n=new Uint8Array(e)}return n}function D(t,e){var n=null;if(null==t||"float32"===t)n=new Float32Array(e);else if("int32"===t)n=new Int32Array(e);else if("bool"===t)n=new Uint8Array(e);else{if("string"!==t)throw new Error("Unknown data type "+t);n=new Array(e)}return n}function O(t,e){for(var n=0;n=0;--r)n[r]=n[r+1]*t[r+1];return n}function q(t,e,n){if("string"===e)throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(t)&&(t=b(t)),n&&O(t,e),function(t,e){return t instanceof Float32Array&&"float32"===e||t instanceof Int32Array&&"int32"===e||t instanceof Uint8Array&&"bool"===e}(t,e))return t;if(null==e||"float32"===e||"complex64"===e)return new Float32Array(t);if("int32"===e)return new Int32Array(t);if("bool"===e){for(var r=new Uint8Array(t.length),a=0;a=0,function(){return"Tensor must have a shape comprised of positive integers but got shape ["+t+"]."})})}function J(t,e){return void 0===e&&(e="utf-8"),e=e||"utf-8",o().platform.encode(t,e)}function Z(t,e){return void 0===e&&(e="utf-8"),e=e||"utf-8",o().platform.decode(t,e)}var Q=Object.freeze({shuffle:h,clamp:f,nearestLargerEven:d,sum:m,randUniform:function(t,e){var n=Math.random();return e*n+(1-n)*t},distSquared:function(t,e){for(var n=0,r=0;r0?f:"")+" "}console.log("%c"+s+"\t%c"+o+"\t%c"+u+"D "+c+"\t%c"+l+"\t%c"+p+"\t%c"+i,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")},t}(),nt=20,rt=3,at=7;function it(t,e,n){return I(Array.isArray(t)?parseFloat(t[0].toFixed(at))+" + "+parseFloat(t[1].toFixed(at))+"j":B(t)?"'"+t+"'":"bool"===n?ot(t):parseFloat(t.toFixed(at)).toString(),e)}function ot(t){return 0===t?"false":"true"}function st(t){for(var e=[],n=0;n=this.shape[n]){var o="Requested out of range element at "+t+". Buffer shape="+this.shape;throw new Error(o)}n++}for(var s=t[t.length-1],u=0;u1)for(var l=0;lnt){var c=rt*s,p=Array.from(e.slice(0,c)),h=Array.from(e.slice(u-rt*s,u));return"complex64"===r&&(p=st(p),h=st(h)),["["+p.map(function(t,e){return it(t,i[e],r)}).join(", ")+", ..., "+h.map(function(t,e){return it(t,i[u-rt+e],r)}).join(", ")+"]"]}return["["+("complex64"===r?st(e):Array.from(e)).map(function(t,e){return it(t,i[e],r)}).join(", ")+"]"]}var f=n.slice(1),d=a.slice(1),m=a[0]*s,g=[];if(u>nt){for(var v=0;v0)throw new Error("Backend '"+this.backendName+"' has an internal memory leak ("+o+" data ids) after running '"+t+"'")},t.prototype.runKernelFunc=function(t,e,n,r,a,i,o){var s,l=this;void 0===i&&(i=[]),void 0===o&&(o=[]);var c,p=[],h=this.isTapeOn(),f=null!=this.state.activeScope?this.state.activeScope.name:"",d=function(t){h&&(p=t.map(function(t){return l.keep(l.clone(t))}))},m=this.state.numBytes,g=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);var v,y=u(r,this.backendName);return c=null!=y?function(){var t=l.backend.numDataIds();v=y.kernelFunc({inputs:e,attrs:a,backend:l.backend});var n=Array.isArray(v)?v:[v];l.shouldCheckForMemLeaks()&&l.checkKernelForMemLeak(f,t,n);var r=n.map(function(t){var e=t.dataId,n=t.shape,r=t.dtype;return l.makeTensorFromDataId(e,n,r)}),s=r.filter(function(t,e){return o[e]});return d(i.slice().concat(s)),r}:function(){var e=l.backend.numDataIds();v=l.tidy(function(){return t(l.backend,d)});var n=Array.isArray(v)?v:[v];return l.shouldCheckForMemLeaks()&&l.checkKernelForMemLeak(f,e,n),n},this.scopedRun(function(){return l.state.kernelDepth++},function(){return l.state.kernelDepth--},function(){s=l.ENV.getBool("DEBUG")?l.profiler.profileKernel(f,e,function(){return c()}):c()}),h&&this.addTapeNode(f,e,s,n,p),this.state.profiling&&this.state.activeProfile.kernels.push({name:f,bytesAdded:this.state.numBytes-m,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-g,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(e).map(function(t){return e[t].shape}),outputShapes:s.map(function(t){return t.shape})}),Array.isArray(v)?s:s[0]},t.prototype.makeTensor=function(t,e,n,r){if(null==t)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",r=r||this.backend;var a=t;"string"===n&&B(t[0])&&(a=t.map(function(t){return J(t)}));var i=r.write(a,e,n),o=new ht(e,n,i,this.nextTensorId());if(this.incRef(o,r),"string"===n){var s=this.state.tensorInfo.get(i),u=L(a);this.state.numBytes+=u-s.bytes,s.bytes=u}return o},t.prototype.makeTensorFromDataId=function(t,e,n,r){var a=new ht(e,n=n||"float32",t,this.nextTensorId());return this.incRef(a,r),a},t.prototype.makeVariable=function(t,e,n,r){void 0===e&&(e=!0),n=n||this.nextVariableId().toString(),null!=r&&r!==t.dtype&&(t=t.asType(r));var a=new vt(t,e,n,this.nextTensorId());if(null!=this.state.registeredVariables[a.name])throw new Error("Variable with name "+a.name+" was already registered");return this.state.registeredVariables[a.name]=a,this.incRef(a,this.backend),a},t.prototype.incRef=function(t,e){var n=this.state.tensorInfo.has(t.dataId)?this.state.tensorInfo.get(t.dataId).refCount:0;if(this.state.numTensors++,"string"===t.dtype&&this.state.numStringTensors++,0===n){this.state.numDataBuffers++;var r=0;"complex64"!==t.dtype&&"string"!==t.dtype&&(r=t.size*z(t.dtype)),this.state.tensorInfo.set(t.dataId,{backend:e||this.backend,dtype:t.dtype,shape:t.shape,bytes:r,refCount:0}),this.state.numBytes+=r}this.state.tensorInfo.get(t.dataId).refCount++,t instanceof vt||this.track(t)},t.prototype.disposeTensor=function(t){if(this.state.tensorInfo.has(t.dataId)){this.state.numTensors--,"string"===t.dtype&&this.state.numStringTensors--;var e=this.state.tensorInfo.get(t.dataId);e.refCount<=1?("complex64"!==t.dtype&&(this.state.numBytes-=e.bytes),this.state.numDataBuffers--,e.backend.disposeData(t.dataId),this.state.tensorInfo.delete(t.dataId)):this.state.tensorInfo.get(t.dataId).refCount--}},t.prototype.disposeVariables=function(){for(var t in this.state.registeredVariables){var e=this.state.registeredVariables[t];this.disposeVariable(e)}},t.prototype.disposeVariable=function(t){this.disposeTensor(t),null!=this.state.registeredVariables[t.name]&&delete this.state.registeredVariables[t.name]},t.prototype.memory=function(){var t=this.backend.memory();return t.numTensors=this.state.numTensors,t.numDataBuffers=this.state.numDataBuffers,t.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(t.unreliable=!0,null==t.reasons&&(t.reasons=[]),t.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),t},t.prototype.profile=function(t){return r(this,void 0,void 0,function(){var e,n;return a(this,function(r){return this.state.profiling=!0,e=this.state.numBytes,n=this.state.numTensors,this.state.activeProfile.kernels=[],this.state.activeProfile.result=t(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max.apply(Math,this.state.activeProfile.kernels.map(function(t){return t.totalBytesSnapshot})),this.state.activeProfile.newBytes=this.state.numBytes-e,this.state.activeProfile.newTensors=this.state.numTensors-n,[2,this.state.activeProfile]})})},t.prototype.isTapeOn=function(){return this.state.gradientDepth>0&&0===this.state.kernelDepth},t.prototype.addTapeNode=function(t,e,n,r,a){var i=this,o={id:this.state.nextTapeNodeId++,name:t,inputs:e,outputs:n,saved:a};null!=r&&(o.gradient=function(t){return t=t.map(function(t,e){if(null==t){var r=n[e],a=X(r.size,r.dtype);return i.makeTensor(a,r.shape,r.dtype)}return t}),r(t.length>1?t:t[0],a)}),this.state.activeTape.push(o)},t.prototype.keep=function(t){return t.kept=!0,t},t.prototype.startTape=function(){0===this.state.gradientDepth&&(this.state.activeTape=[]),this.state.gradientDepth++},t.prototype.endTape=function(){this.state.gradientDepth--},t.prototype.startScope=function(t){var e={track:[],name:"unnamed scope",id:this.state.nextScopeId++};t&&(e.name=t),this.state.scopeStack.push(e),this.state.activeScope=e},t.prototype.endScope=function(t){for(var e=this,n=Nt(t),r=new Set(n.map(function(t){return t.id})),a=0;a0,function(){return"gradients() received an empty list of xs."}),null!=n&&"float32"!==n.dtype)throw new Error("dy must have 'float32' dtype, but has '"+n.dtype+"'");var i=this.scopedRun(function(){return a.startTape()},function(){return a.endTape()},function(){return a.tidy("forward",t)});g(i instanceof ht,function(){return"The result y returned by f() must be a tensor."});var o=function(t,e,n){for(var r={},a={},i=0;i=0;i--)for(o=(d=t[i]).inputs,c=0;c0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",function(){var t,r,s={};s[i.id]=null==n?(r=K(x(t=i.shape),"float32"),At.makeTensor(r,t,"float32")):n,function(t,e,n){for(var r=function(r){var a=e[r],i=[];if(a.outputs.forEach(function(e){var n=t[e.id];null!=n?i.push(n):i.push(null)}),null==a.gradient)throw new Error("Cannot compute gradient: gradient function not found for "+a.name+".");var o=a.gradient(i),s=function(e){if(!(e in o))throw new Error("Cannot backprop through input "+e+". Available gradients found: "+Object.keys(o)+".");var r=n(function(){return o[e]()});if("float32"!==r.dtype)throw new Error("Error in gradient for op "+a.name+". The gradient of input "+e+" must have 'float32' dtype, but has '"+r.dtype+"'");var i=a.inputs[e];if(!w(r.shape,i.shape))throw new Error("Error in gradient for op "+a.name+". The gradient of input '"+e+"' has shape '"+r.shape+"', which does not match the shape of the input '"+i.shape+"'");if(null==t[i.id])t[i.id]=r;else{var s=t[i.id];t[i.id]=s.add(r),s.dispose()}};for(var u in a.inputs)s(u)},a=e.length-1;a>=0;a--)r(a)}(s,o,function(t){return a.tidy(t)});var u=e.map(function(t){return s[t.id]});return 0===a.state.gradientDepth&&(a.state.activeTape.forEach(function(t){for(var e in t.saved)t.saved[e].dispose()}),a.state.activeTape=null),{value:i,grads:u}})},t.prototype.customGrad=function(t){var e=this;return g(U(t),function(){return"The f passed in customGrad(f) must be a function."}),function(){for(var n,r=[],a=0;an||e>n)throw r="["+t+"x"+e+"]",new Error("Requested texture size "+r+" greater than WebGL maximum on this browser / GPU ["+n+"x"+n+"].")}function se(t,e){return ve(t,e,function(){return t.createFramebuffer()},"Unable to create WebGLFramebuffer.")}function ue(t,e,n,r,a,i,o,s){var u=t.getAttribLocation(n,r);return-1!==u&&(jt(t,e,function(){return t.bindBuffer(t.ARRAY_BUFFER,a)}),jt(t,e,function(){return t.vertexAttribPointer(u,i,t.FLOAT,!1,o,s)}),jt(t,e,function(){return t.enableVertexAttribArray(u)}),!0)}function le(t,e,n,r){ye(t,r),jt(t,e,function(){return t.activeTexture(t.TEXTURE0+r)}),jt(t,e,function(){return t.bindTexture(t.TEXTURE_2D,n)})}function ce(t,e,n,r){return ve(t,e,function(){return t.getUniformLocation(n,r)},'uniform "'+r+'" not present in program.')}function pe(t,e,n){return t.getUniformLocation(e,n)}function he(t,e,n,r,a,i){jt(t,e,function(){return le(t,e,r,i)}),jt(t,e,function(){return t.uniform1i(a,i)})}function fe(t,e,n,r){jt(t,e,function(){return t.bindFramebuffer(t.FRAMEBUFFER,r)}),jt(t,e,function(){return t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,n,0)})}function de(t,e,n){jt(t,e,function(){return t.bindFramebuffer(t.FRAMEBUFFER,n)}),jt(t,e,function(){return t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,null,0)})}function me(t){var e=t.checkFramebufferStatus(t.FRAMEBUFFER);if(e!==t.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+ge(t,e))}function ge(t,e){switch(e){case t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case t.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return"unknown error "+e}}function ve(t,e,n,r){var a=jt(t,e,function(){return n()});if(null==a)throw new Error(r);return a}function ye(t,e){var n=t.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=e+t.TEXTURE0;if(rn)throw new Error("textureUnit must be in [gl.TEXTURE0, gl.TEXTURE"+n+"].")}function be(t,e){return void 0===e&&(e=2),x(t.slice(0,t.length-e))}function xe(t){if(0===t.length)throw Error("Cannot get rows and columns of an empty shape array.");return[t.length>1?t[t.length-2]:1,t[t.length-1]]}function we(t){var e=[1,1,1];return 0===t.length||1===t.length&&1===t[0]||(e=[be(t)].concat(xe(t))),e}function Ce(t,e){var n;void 0===e&&(e=!1);var r=o().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e&&(r*=2,1===(t=t.map(function(e,n){return n>=t.length-2?d(t[n]):t[n]})).length&&(t=[2,t[0]])),2!==t.length){var a=R(t);t=a.newShape}var i=x(t);if(t.length<=1&&i<=r)return[1,i];if(2===t.length&&t[0]<=r&&t[1]<=r)return t;if(3===t.length&&t[0]*t[1]<=r&&t[2]<=r)return[t[0]*t[1],t[2]];if(3===t.length&&t[0]<=r&&t[1]*t[2]<=r)return[t[0],t[1]*t[2]];if(4===t.length&&t[0]*t[1]*t[2]<=r&&t[3]<=r)return[t[0]*t[1]*t[2],t[3]];if(4===t.length&&t[0]<=r&&t[1]*t[2]*t[3]<=r)return[t[0],t[1]*t[2]*t[3]];if(e){var s=be(t),u=2,l=2;return t.length&&(u=(n=xe(t))[0],l=n[1]),S(i=s*(u/2)*(l/2)).map(function(t){return 2*t})}return S(i)}function Ne(t){return t%2==0}function Se(t,e){if(w(t=t.slice(-2),e=e.slice(-2)))return!0;if(!t.length||!e.length)return!0;if(0===t[0]||0===t[1]||0===e[0]||0===e[1])return!0;if(t.length!==e.length){var n=t.slice(-1)[0],r=e.slice(-1)[0];if(n===r)return!0;if(Ne(n)&&Ne(r)&&(1===t[0]||1===e[0]))return!0}return t[1]===e[1]&&Ne(t[0])&&Ne(e[0])}function Ie(t){if(null==Jt){var e=Lt(t);Jt=e.getParameter(e.MAX_TEXTURE_SIZE)}return Jt}function ke(t){if(null==Zt){var e=Lt(t);Zt=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,Zt)}function Ee(t){if(0===t)return 0;var e=Lt(t);return Ae(e,"EXT_disjoint_timer_query_webgl2")&&2===t?2:Ae(e,"EXT_disjoint_timer_query")?1:0}function Ae(t,e){return null!=t.getExtension(e)}function Re(t){try{if(null!=Lt(t))return!0}catch(t){return!1}return!1}function Te(t){if(0===t)return!1;var e=Lt(t);if(1===t){if(!Ae(e,"OES_texture_float"))return!1}else if(!Ae(e,"EXT_color_buffer_float"))return!1;return Oe(e)}function De(t){if(0===t)return!1;var e=Lt(t);return 1!==t?Ae(e,"EXT_color_buffer_float")?Oe(e):!!Ae(e,"EXT_color_buffer_half_float")&&function(t,e){var n=Ut(t,e),r=t.createTexture();t.bindTexture(t.TEXTURE_2D,r),t.texImage2D(t.TEXTURE_2D,0,n.internalFormatHalfFloat,1,1,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);var a=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,a),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,r,0);var i=t.checkFramebufferStatus(t.FRAMEBUFFER)===t.FRAMEBUFFER_COMPLETE;return t.bindTexture(t.TEXTURE_2D,null),t.bindFramebuffer(t.FRAMEBUFFER,null),t.deleteTexture(r),t.deleteFramebuffer(a),i}(e,e.getExtension("EXT_color_buffer_half_float")):!!Ae(e,"OES_texture_float")&&!!Ae(e,"WEBGL_color_buffer_float")&&Oe(e)}function Oe(t){var e=Ut(t),n=t.createTexture();t.bindTexture(t.TEXTURE_2D,n),t.texImage2D(t.TEXTURE_2D,0,e.internalFormatFloat,1,1,0,e.textureFormatFloat,e.textureTypeFloat,null);var r=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,r),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,n,0);var a=t.checkFramebufferStatus(t.FRAMEBUFFER)===t.FRAMEBUFFER_COMPLETE;return t.bindTexture(t.TEXTURE_2D,null),t.bindFramebuffer(t.FRAMEBUFFER,null),t.deleteTexture(n),t.deleteFramebuffer(r),a}function _e(t){return 2===t&&null!=Lt(t).fenceSync}var Fe=Object.freeze({callAndCheck:jt,canBeRepresented:Ht,getWebGLErrorMessage:Kt,getExtensionOrThrow:Xt,createVertexShader:$t,createFragmentShader:Yt,createProgram:te,linkProgram:ee,validateProgram:ne,createStaticVertexBuffer:re,createStaticIndexBuffer:ae,getNumChannels:function(){return 2===o().getNumber("WEBGL_VERSION")?1:4},createTexture:ie,validateTextureSize:oe,createFramebuffer:se,bindVertexBufferToProgramAttribute:ue,bindTextureUnit:le,unbindTextureUnit:function(t,e,n){ye(t,n),jt(t,e,function(){return t.activeTexture(t.TEXTURE0+n)}),jt(t,e,function(){return t.bindTexture(t.TEXTURE_2D,null)})},getProgramUniformLocationOrThrow:ce,getProgramUniformLocation:pe,bindTextureToProgramUniformSampler:he,bindCanvasToFramebuffer:function(t,e){jt(t,e,function(){return t.bindFramebuffer(t.FRAMEBUFFER,null)}),jt(t,e,function(){return t.viewport(0,0,t.canvas.width,t.canvas.height)}),jt(t,e,function(){return t.scissor(0,0,t.canvas.width,t.canvas.height)})},bindColorTextureToFramebuffer:fe,unbindColorTextureFromFramebuffer:de,validateFramebuffer:me,getFramebufferErrorMessage:ge,getBatchDim:be,getRowsCols:xe,getShapeAs3D:we,getTextureShapeFromLogicalShape:Ce,isReshapeFree:Se,getWebGLMaxTextureSize:Ie,resetMaxTextureSize:function(){Jt=null},resetMaxTexturesInShader:function(){Zt=null},getMaxTexturesInShader:ke,getWebGLDisjointQueryTimerVersion:Ee,hasExtension:Ae,isWebGLVersionEnabled:Re,isCapableOfRenderingToFloatTexture:Te,isDownloadFloatTextureEnabled:De,isWebGLFenceEnabled:_e}),Me=o();function ze(t){o().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(t+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}function Le(){return At.memory()}function Be(t,e){return At.tidy(t,e)}function Pe(t){Nt(t).forEach(function(t){return t.dispose()})}function We(t){return At.keep(t)}function Ve(){return At.backend}function Ue(){for(var t=[],e=0;e0,function(){return"Element arr["+r.join("][")+"] should be a primitive, but is an array of "+e.length+" elements"}),g(e.length===n[0],function(){return"Element arr["+r.join("][")+"] should have "+n[0]+" elements, but has "+e.length+" elements"});for(var a=n.slice(1),i=0;i=0&&(a=r),Ge(r,a,e,n),null==t||!M(t)&&!Array.isArray(t)&&"number"!=typeof t&&"boolean"!=typeof t&&"string"!=typeof t){var i=null==t?"null":t.constructor.name;throw new Error("Argument '"+e+"' passed to '"+n+"' must be a Tensor or TensorLike, but got '"+i+"'")}var s=je(t,a);M(t)||Array.isArray(t)||(t=[t]);var u="string"!==a?q(t,a,o().getBool("DEBUG")):b(t,[],!0);return At.makeTensor(u,s,a)}function He(t,e,n,r){if(void 0===r&&(r="numeric"),!Array.isArray(t))throw new Error("Argument "+e+" passed to "+n+" must be a `Tensor[]` or `TensorLike[]`");return t.map(function(t,r){return qe(t,e+"["+r+"]",n)},r)}function Ke(t,e){for(var n=0;n=0&&e0}),Me.registerFlag("WEBGL_VERSION",function(){return Re(2)?2:Re(1)?1:0}),Me.registerFlag("WEBGL_BUFFER_SUPPORTED",function(){return 2===Me.get("WEBGL_VERSION")}),Me.registerFlag("WEBGL_CPU_FORWARD",function(){return!0}),Me.registerFlag("WEBGL_FORCE_F16_TEXTURES",function(){return!1}),Me.registerFlag("WEBGL_PACK",function(){return Me.getBool("HAS_WEBGL")}),Me.registerFlag("WEBGL_PACK_NORMALIZATION",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_PACK_CLIP",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_PACK_DEPTHWISECONV",function(){return!1}),Me.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_PACK_REDUCE",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_LAZILY_UNPACK",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_CONV_IM2COL",function(){return Me.getBool("WEBGL_PACK")}),Me.registerFlag("WEBGL_MAX_TEXTURE_SIZE",function(){return Ie(Me.getNumber("WEBGL_VERSION"))}),Me.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",function(){return ke(Me.getNumber("WEBGL_VERSION"))}),Me.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",function(){var t=Me.getNumber("WEBGL_VERSION");return 0===t?0:Ee(t)}),Me.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",function(){return Me.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&(t=navigator.userAgent||navigator.vendor||window.opera,!(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4))));var t}),Me.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",function(){return Te(Me.getNumber("WEBGL_VERSION"))}),Me.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",function(){return!Me.getBool("WEBGL_FORCE_F16_TEXTURES")&&Me.getBool("WEBGL_RENDER_FLOAT32_CAPABLE")}),Me.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",function(){return De(Me.getNumber("WEBGL_VERSION"))}),Me.registerFlag("WEBGL_FENCE_API_ENABLED",function(){return _e(Me.getNumber("WEBGL_VERSION"))}),Me.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",function(){return Me.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0}),pt=ze;var an=rn({complex_:function(t,e){var n=qe(t,"real","complex"),r=qe(e,"imag","complex");return v(n.shape,r.shape,"real and imag shapes, "+n.shape+" and "+r.shape+", must match in call to tf.complex()."),At.runKernelFunc(function(t){return t.complex(n,r)},{$real:n,$imag:r})}}),on=rn({real_:function(t){var e=qe(t,"input","real");return At.runKernelFunc(function(t){return t.real(e)},{$input:e})}}),sn=rn({imag_:function(t){var e=qe(t,"input","imag");return At.runKernelFunc(function(t){return t.imag(e)},{$input:e})}});function un(t,e,n){return ln(t,e,je(t,n),n)}function ln(t,e,n,r){if(null==r&&(r=V(t)),"complex64"===r)throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!M(t)&&!Array.isArray(t)&&"number"!=typeof t&&"boolean"!=typeof t&&"string"!=typeof t)throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(null!=e){Y(e);var a=x(e),i=x(n);g(a===i,function(){return"Based on the provided shape, ["+e+"], the tensor should have "+a+" values but has "+i});for(var s=0;s1)return bn([0],r);var a=X(Math.abs(Math.ceil((e-t)/n)),r);e=1,function(){return"Pass at least one tensor to concat"});var n=He(t,"tensors","concat");"complex64"===n[0].dtype&&n.forEach(function(t){if("complex64"!==t.dtype)throw new Error("Cannot concatenate complex64 tensors with a tensor\n with dtype "+t.dtype+". ")}),e=A(e,n[0].shape)[0];var r=nn(n.map(function(t){return t.shape}),e);if(0===x(r))return un([],r);if(1===(n=n.filter(function(t){return t.size>0})).length)return n[0];var a=n.map(function(t){return t.shape});en(a,e);var i=n;return At.runKernelFunc(function(t){return t.concat(n,e)},i,function(t){var n=a.map(function(t){return t[e]});return Tn(t,n,e).map(function(t){return function(){return t}})})}}),kn=rn({concat1d_:function(t){return In(t,0)}}),En=rn({concat2d_:function(t,e){return In(t,e)}}),An=rn({concat3d_:function(t,e){return In(t,e)}}),Rn=rn({concat4d_:function(t,e){return In(t,e)}}),Tn=rn({split_:function(t,e,n){void 0===n&&(n=0);var r,a=qe(t,"x","split");return n=A(n,a.shape)[0],"number"==typeof e?(g(a.shape[n]%e==0,function(){return"Number of splits must evenly divide the axis."}),r=new Array(e).fill(a.shape[n]/e)):(g(a.shape[n]===e.reduce(function(t,e){return t+e}),function(){return"The sum of sizes must match the size of the axis dimension."}),r=e),At.runKernelFunc(function(t){return t.split(a,r,n)},{$x:a},function(t){return{$x:function(){return In(t,n)}}})}});function Dn(t,e){return t(e={exports:{}},e.exports),e.exports}var On=Dn(function(t){!function(t,e,n){function r(t,e){return e.c=t.c,e.s0=t.s0,e.s1=t.s1,e.s2=t.s2,e}function a(t,e){var n=new function(t){var e,n=this,r=(e=4022871197,function(t){t=t.toString();for(var n=0;n>>0,e=(r*=e)>>>0,e+=4294967296*(r-=e)}return 2.3283064365386963e-10*(e>>>0)});n.next=function(){var t=2091639*n.s0+2.3283064365386963e-10*n.c;return n.s0=n.s1,n.s1=n.s2,n.s2=t-(n.c=0|t)},n.c=1,n.s0=r(" "),n.s1=r(" "),n.s2=r(" "),n.s0-=r(t),n.s0<0&&(n.s0+=1),n.s1-=r(t),n.s1<0&&(n.s1+=1),n.s2-=r(t),n.s2<0&&(n.s2+=1),r=null}(t),a=e&&e.state,i=n.next;return i.int32=function(){return 4294967296*n.next()|0},i.double=function(){return i()+1.1102230246251565e-16*(2097152*i()|0)},i.quick=i,a&&("object"==typeof a&&r(a,n),i.state=function(){return r(n,{})}),i}e&&e.exports?e.exports=a:this.alea=a}(0,t)}),_n=Dn(function(t){!function(t,e,n){function r(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e}function a(t,e){var n=new function(t){var e=this,n="";e.x=0,e.y=0,e.z=0,e.w=0,e.next=function(){var t=e.x^e.x<<11;return e.x=e.y,e.y=e.z,e.z=e.w,e.w^=e.w>>>19^t^t>>>8},t===(0|t)?e.x=t:n+=t;for(var r=0;r>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&r(a,n),i.state=function(){return r(n,{})}),i}e&&e.exports?e.exports=a:this.xor128=a}(0,t)}),Fn=Dn(function(t){!function(t,e,n){function r(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e.v=t.v,e.d=t.d,e}function a(t,e){var n=new function(t){var e=this,n="";e.next=function(){var t=e.x^e.x>>>2;return e.x=e.y,e.y=e.z,e.z=e.w,e.w=e.v,(e.d=e.d+362437|0)+(e.v=e.v^e.v<<4^t^t<<1)|0},e.x=0,e.y=0,e.z=0,e.w=0,e.v=0,t===(0|t)?e.x=t:n+=t;for(var r=0;r>>4),e.next()}(t),a=e&&e.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&r(a,n),i.state=function(){return r(n,{})}),i}e&&e.exports?e.exports=a:this.xorwow=a}(0,t)}),Mn=Dn(function(t){!function(t,e,n){function r(t,e){return e.x=t.x.slice(),e.i=t.i,e}function a(t,e){null==t&&(t=+new Date);var n=new function(t){var e=this;e.next=function(){var t,n,r=e.x,a=e.i;return t=r[a],n=(t^=t>>>7)^t<<24,n^=(t=r[a+1&7])^t>>>10,n^=(t=r[a+3&7])^t>>>3,n^=(t=r[a+4&7])^t<<7,t=r[a+7&7],n^=(t^=t<<13)^t<<9,r[a]=n,e.i=a+1&7,n},function(t,e){var n,r=[];if(e===(0|e))r[0]=e;else for(e=""+e,n=0;n0;--n)t.next()}(e,t)}(t),a=e&&e.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,a&&(a.x&&r(a,n),i.state=function(){return r(n,{})}),i}e&&e.exports?e.exports=a:this.xorshift7=a}(0,t)}),zn=Dn(function(t){!function(t,e,n){function r(t,e){return e.i=t.i,e.w=t.w,e.X=t.X.slice(),e}function a(t,e){null==t&&(t=+new Date);var n=new function(t){var e=this;e.next=function(){var t,n,r=e.w,a=e.X,i=e.i;return e.w=r=r+1640531527|0,n=a[i+34&127],t=a[i=i+1&127],n^=n<<13,t^=t<<17,n^=n>>>15,t^=t>>>12,n=a[i]=n^t,e.i=i,n+(r^r>>>16)|0},function(t,e){var n,r,a,i,o,s=[],u=128;for(e===(0|e)?(r=e,e=null):(e+="\0",r=0,u=Math.max(u,e.length)),a=0,i=-32;i>>15,r^=r<<4,r^=r>>>13,i>=0&&(o=o+1640531527|0,a=0==(n=s[127&i]^=r+o)?a+1:0);for(a>=128&&(s[127&(e&&e.length||0)]=-1),a=127,i=512;i>0;--i)r=s[a+34&127],n=s[a=a+1&127],r^=r<<13,n^=n<<17,r^=r>>>15,n^=n>>>12,s[a]=r^n;t.w=o,t.X=s,t.i=a}(e,t)}(t),a=e&&e.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,a&&(a.X&&r(a,n),i.state=function(){return r(n,{})}),i}e&&e.exports?e.exports=a:this.xor4096=a}(0,t)}),Ln=Dn(function(t){!function(t,e,n){function r(t,e){return e.a=t.a,e.b=t.b,e.c=t.c,e.d=t.d,e}function a(t,e){var n=new function(t){var e=this,n="";e.next=function(){var t=e.b,n=e.c,r=e.d,a=e.a;return t=t<<25^t>>>7^n,n=n-r|0,r=r<<24^r>>>8^a,a=a-t|0,e.b=t=t<<20^t>>>12^n,e.c=n=n-r|0,e.d=r<<16^n>>>16^a,e.a=a-t|0},e.a=0,e.b=0,e.c=-1640531527,e.d=1367130551,t===Math.floor(t)?(e.a=t/4294967296|0,e.b=0|t):n+=t;for(var r=0;r>>0)/4294967296};return i.double=function(){do{var t=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&r(a,n),i.state=function(){return r(n,{})}),i}e&&e.exports?e.exports=a:this.tychei=a}(0,t)}),Bn=Dn(function(t){!function(e,n){var r,a=this,i=256,o=6,s="random",u=n.pow(i,o),l=n.pow(2,52),c=2*l,p=i-1;function h(t,p,h){var v=[],y=m(function t(e,n){var r,a=[],i=typeof e;if(n&&"object"==i)for(r in e)try{a.push(t(e[r],n-1))}catch(t){}return a.length?a:"string"==i?e:e+"\0"}((p=1==p?{entropy:!0}:p||{}).entropy?[t,g(e)]:null==t?function(){try{var t;return r&&(t=r.randomBytes)?t=t(i):(t=new Uint8Array(i),(a.crypto||a.msCrypto).getRandomValues(t)),g(t)}catch(t){var n=a.navigator,o=n&&n.plugins;return[+new Date,a,o,a.screen,g(e)]}}():t,3),v),b=new f(v),x=function(){for(var t=b.g(o),e=u,n=0;t=c;)t/=2,e/=2,n>>>=1;return(t+n)/e};return x.int32=function(){return 0|b.g(4)},x.quick=function(){return b.g(4)/4294967296},x.double=x,m(g(b.S),e),(p.pass||h||function(t,e,r,a){return a&&(a.S&&d(a,b),t.state=function(){return d(b,{})}),r?(n[s]=t,e):t})(x,y,"global"in p?p.global:this==n,p.state)}function f(t){var e,n=t.length,r=this,a=0,o=r.i=r.j=0,s=r.S=[];for(n||(t=[n++]);a=1||0===o);var s=Math.sqrt(-2*Math.log(o)/o);e=this.mean+this.stdDev*a*s,n=this.mean+this.stdDev*i*s,this.truncated&&!this.isValidTruncated(e)||(r=!0)}return this.truncated&&!this.isValidTruncated(n)||(this.nextVal=this.convertValue(n)),this.convertValue(e)},t.prototype.convertValue=function(t){return null==this.dtype||"float32"===this.dtype?t:Math.round(t)},t.prototype.isValidTruncated=function(t){return t<=this.upper&&t>=this.lower},t}(),Vn=function(){function t(t,e,n,r){this.alpha=t,this.beta=1/e,this.dtype=n;var a=r||Math.random();this.randu=Pn(a.toString()),this.randn=new Wn(0,1,n,!1,this.randu()),this.d=t<1?t+2/3:t-1/3,this.c=1/Math.sqrt(9*this.d)}return t.prototype.nextValue=function(){for(var t,e,n,r,a,i;;){do{r=this.randn.nextValue(),i=1+this.c*r}while(i<=0);if(i*=i*i,e=1-.331*(t=r*r)*t,n=.5*t+this.d*(1-i+Math.log(i)),(a=this.randu())=1+e.length,function(){return"input rank is "+r.rank+" but should be > than blockShape.length "+e.length}),g(n.length===e.length,function(){return"crops.length is "+n.length+" but should be equal to blockShape.length "+e.length}),g(r.shape[0]%a==0,function(){return"input tensor batch is "+r.shape[0]+" but is not divisible by the product of the elements of blockShape "+e.join(" * ")+" === "+a}),At.runKernelFunc(function(t){return t.batchToSpaceND(r,e,n)},{$x:r},function(t){return{$x:function(){return t.spaceToBatchND(e,n)}}})}}),Hn=rn({cast_:function(t,e){var n=qe(t,"x","cast");if(!_(e))throw new Error("Failed to cast to unknown dtype "+e);if("string"===e&&"string"!==n.dtype||"string"!==e&&"string"===n.dtype)throw new Error("Only strings can be casted to strings");var r={dtype:e};return At.runKernelFunc(function(t){return t.cast(n,e)},{x:n},function(t){return{x:function(){return t.clone()}}},"Cast",r)}}),Kn=rn({clone_:function(t){var e=qe(t,"x","clone",null);return At.runKernelFunc(function(){return At.makeTensorFromDataId(e.dataId,e.shape,e.dtype)},{$x:e},function(t){return{$x:function(){return t.toFloat()}}})}}),Xn=rn({cumsum_:function(t,e,n,r){void 0===e&&(e=0),void 0===n&&(n=!1),void 0===r&&(r=!1);var a=qe(t,"x","cumsum"),i=Ze([e|=0],a.rank),o=a;null!=i&&(o=a.transpose(i));var s=tn(1,a.rank)[0],u=At.runKernelFunc(function(t){return t.cumsum(o,s,n,r)},{permutedX:o},function(t){return{permutedX:function(){return t.cumsum(e,n,!r)}}});return null!=i&&(u=u.transpose(i)),u}}),$n=rn({depthToSpace_:function(t,e,n){void 0===n&&(n="NHWC");var r=qe(t,"x","depthToSpace"),a="NHWC"===n?r.shape[1]:r.shape[2],i="NHWC"===n?r.shape[2]:r.shape[3],o="NHWC"===n?r.shape[3]:r.shape[1];return g(a*e>=0,function(){return"Negative dimension size caused by overflow when multiplying\n "+a+" and "+e+" for depthToSpace with input shape\n "+r.shape}),g(i*e>=0,function(){return"Negative dimension size caused by overflow when multiplying\n "+i+" and "+e+" for depthToSpace with input shape\n "+r.shape}),g(o%(e*e)==0,function(){return"Dimension size must be evenly divisible by "+e*e+" but is "+o+" for depthToSpace with input shape "+r.shape}),At.runKernelFunc(function(t){return t.depthToSpace(r,e,n)},{$x:r})}}),Yn=rn({expandDims_:function(t,e){void 0===e&&(e=0);var n=qe(t,"x","expandDims",null);g(e<=n.rank,function(){return"Axis must be <= rank of the tensor"});var r=n.shape.slice();return e<0&&(g(-(n.rank+1)<=e,function(){return"Axis must be in the interval ["+-(n.rank+1)+", "+n.rank+"]"}),e=n.rank+e+1),r.splice(e,0,1),lr(n,r)}}),Jn=rn({eye_:function(t,e,n,r){void 0===r&&(r="float32"),null==e&&(e=t);for(var a=jn([t,e],r),i=t<=e?t:e,o=0;o2)throw new Error("Rank of probabilities must be 1 or 2, but is "+o);n=n||Math.random();var s=1===o?a.as2D(1,-1):a,u=At.runKernelFunc(function(t){return t.multinomial(s,r,e,n)},{logits2D:s});return 1===o?u.as1D():u}}),Qn=rn({oneHot_:function(t,e,n,r){if(void 0===n&&(n=1),void 0===r&&(r=0),e<2)throw new Error("Error in oneHot: depth must be >=2, but it is "+e);var a=qe(t,"indices","oneHot","int32"),i=a.shape.concat([e]);return a=a.flatten(),At.runKernelFunc(function(t){return t.oneHot(a,e,n,r)},{$indices:a},function(t){return{$indices:function(){return bn(a.shape,"float32")}}}).reshape(i)}}),tr=rn({pad_:function(t,e,n){void 0===n&&(n=0);var r=qe(t,"x","pad");if(0===r.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");var a=e.map(function(t){return t[0]});return At.runKernelFunc(function(t){return t.pad(r,e,n)},{$x:r},function(t){return{$x:function(){return t.slice(a,r.shape)}}})}}),er=rn({pad1d_:function(t,e,n){return void 0===n&&(n=0),g(2===e.length,function(){return"Invalid number of paddings. Must be length of 2."}),tr(t,[e],n)}}),nr=rn({pad2d_:function(t,e,n){return void 0===n&&(n=0),g(2===e.length&&2===e[0].length&&2===e[1].length,function(){return"Invalid number of paddings. Must be length of 2 each."}),tr(t,e,n)}}),rr=rn({pad3d_:function(t,e,n){return void 0===n&&(n=0),g(3===e.length&&2===e[0].length&&2===e[1].length&&2===e[2].length,function(){return"Invalid number of paddings. Must be length of 2 each."}),tr(t,e,n)}}),ar=rn({pad4d_:function(t,e,n){return void 0===n&&(n=0),g(4===e.length&&2===e[0].length&&2===e[1].length&&2===e[2].length&&2===e[3].length,function(){return"Invalid number of paddings. Must be length of 2 each."}),tr(t,e,n)}}),ir=rn({rand_:function(t,e,n){var r=x(t),a=null;if(null==n||"float32"===n)a=new Float32Array(r);else if("int32"===n)a=new Int32Array(r);else{if("bool"!==n)throw new Error("Unknown data type "+n);a=new Uint8Array(r)}for(var i=0;i=1+e.length,function(){return"input rank "+r.rank+" should be > than [blockShape] "+e.length}),g(n.length===e.length,function(){return"paddings.shape[0] "+n.length+" must be equal to [blockShape] "+e.length}),g(r.shape.reduce(function(t,r,a){return a>0&&a<=e.length?t&&(r+n[a-1][0]+n[a-1][1])%e[a-1]==0:t},!0),function(){return"input spatial dimensions "+r.shape.slice(1)+" with paddings "+n.toString()+" must be divisible by blockShapes "+e.toString()}),At.runKernelFunc(function(t){return t.spaceToBatchND(r,e,n)},{$x:r},function(t){return{$x:function(){return t.batchToSpaceND(e,n)}}})}}),pr=rn({squeeze_:function(t,e){var n=qe(t,"x","squeeze");return lr(n,R(n.shape,e).newShape)}}),hr=rn({stack_:function(t,e){void 0===e&&(e=0);var n=He(t,"tensors","stack");if(g(n.length>=1,function(){return"Pass at least one tensor to tf.stack"}),1===n.length)return n[0].expandDims(e);var r=n[0].rank,a=n[0].shape,i=n[0].dtype;g(e<=r,function(){return"Axis must be <= rank of the tensor"}),n.forEach(function(t){v(a,t.shape,"All tensors passed to stack must have matching shapes")}),n.forEach(function(t){g(i===t.dtype,function(){return"All tensors passed to stack must have matching dtypes"})});var o=n.map(function(t){return t.expandDims(e)});return In(o,e)}}),fr=rn({tile_:function(t,e){var n=qe(t,"x","tile",null);return g(n.rank===e.length,function(){return"Error in transpose: rank of input "+n.rank+" must match length of reps "+e+"."}),At.runKernelFunc(function(t,r){var a=t.tile(n,e);return r([n]),a},{$x:n},function(t,n){var r=n[0];return{$x:function(){var n=Sn(r);if(1===r.rank)for(var a=0;a=-n.shape.length&&e=2*e+1||a%2==1?o.push(a):i.push(a);r.push.apply(r,i),r.push(0),r.push.apply(r,o)}return r}function br(t,e,n,r){void 0===r&&(r=!0);var a=[];r?a.push(t[0]/n):a.push(t[0]*n);for(var i=1;it.rank)throw new Error("index innermost dimension length must be <= tensor rank; saw: "+e.shape[e.rank-1]+" vs. "+t.rank);if(0===t.size)throw new Error("Requested more than 0 entries, but input is empty. Input shape: "+t.shape+".");for(var n=e.shape,r=n[n.length-1],a=1,i=0;i1?e.shape[e.rank-1]:1,a=n.length,i=1,o=r;o0;)1&t&&e.push(n),t/=2,n++;return e}function Ar(t,e,n){for(var r=[],a=0;a0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);var s=r[a];return i<0&&(i+=s),f(0,i,s-1)}function Tr(t,e,n,r,a){var i=e[a],o=n[a]||1;(t&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);var s=r[a];return i<0&&(i+=s),o>0?f(0,i,s):f(-1,i,s-1)}function Dr(t,e,n){for(var r=n.length,a=0;a1){r=a;break}for(a=r+1;a0||n[a]!==t[a])return!1;return!0}function Or(t,e){for(var n=t.length>0?t[t.length-1]:1,r=0;r0,function(){return"variableGrads() expects at least one of the input variables to be trainable, but none of the "+i+" variables is trainable."});var o=At.gradients(t,e,null,!0),s=o.value,u=o.grads;g(u.some(function(t){return null!=t}),function(){return"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize()."}),g(0===s.rank,function(){return"The f passed in variableGrads(f) must return a scalar, but it returned a rank-"+s.rank+" tensor"});var l={};return e.forEach(function(t,e){null!=u[e]&&(l[t.name]=u[e])}),null!=a&&a.forEach(function(t){return l[t.name]=null}),{value:s,grads:l}}function Mr(t){return At.customGrad(t)}function zr(t){if(t.filter(function(t){return null==t}).length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.")}var Lr=rn({softmax_:function(t,e){void 0===e&&(e=-1);var n=qe(t,"logits","softmax");if(-1===e&&(e=n.rank-1),e!==n.rank-1)throw Error("Softmax along a non-last dimension is not yet supported. Logits was rank "+n.rank+" and dim was "+e);return Mr(function(t,n){var r=t.logSumExp([e],!0),a=t.toFloat().sub(r).exp();return n([a]),{value:a,gradFunc:function(t,n){var r=n[0],a=t.mul(r);return a.sub(a.sum([e],!0).mul(r))}}})(n)}}),Br=rn({logSoftmax_:function(t,e){void 0===e&&(e=-1);var n=qe(t,"logits","logSoftmax");if(-1===e&&(e=n.rank-1),e!==n.rank-1)throw Error("Log Softmax along a non-last dimension is not yet supported. Logits was rank "+n.rank+" and axis was "+e);return Mr(function(t,n){var r=t.max(e,!0),a=t.sub(r),i=a.toFloat().sub(a.exp().sum(e,!0).log());return n([i]),{value:i,gradFunc:function(t,n){var r=n[0].exp();return t.sub(t.sum(e,!0).mul(r))}}})(n)}}),Pr=function(){function t(t,e){this.backend=t,this.dataMover=e,this.data=new WeakMap,this.dataIdsCount=0}return t.prototype.get=function(t){return this.data.has(t)||this.dataMover.moveData(this.backend,t),this.data.get(t)},t.prototype.set=function(t,e){this.dataIdsCount++,this.data.set(t,e)},t.prototype.has=function(t){return this.data.has(t)},t.prototype.delete=function(t){return this.dataIdsCount--,this.data.delete(t)},t.prototype.numDataIds=function(){return this.dataIdsCount},t}(),Wr=function(){function t(){}return t.prototype.time=function(t){return Vr()},t.prototype.read=function(t){return Vr()},t.prototype.readSync=function(t){return Vr()},t.prototype.numDataIds=function(){return Vr()},t.prototype.disposeData=function(t){return Vr()},t.prototype.fromPixels=function(t,e){return Vr()},t.prototype.write=function(t,e,n){return Vr()},t.prototype.move=function(t,e,n,r){return Vr()},t.prototype.memory=function(){return Vr()},t.prototype.floatPrecision=function(){return Vr()},t.prototype.epsilon=function(){return 32===this.floatPrecision()?1e-7:1e-4},t.prototype.batchMatMul=function(t,e,n,r){return Vr()},t.prototype.fusedBatchMatMul=function(t){return t.a,t.b,t.transposeA,t.transposeB,t.bias,t.activation,t.preluActivationWeights,Vr()},t.prototype.slice=function(t,e,n){return Vr()},t.prototype.stridedSlice=function(t,e,n,r){return Vr()},t.prototype.unstack=function(t,e){return Vr()},t.prototype.reverse=function(t,e){return Vr()},t.prototype.concat=function(t,e){return Vr()},t.prototype.neg=function(t){return Vr()},t.prototype.add=function(t,e){return Vr()},t.prototype.addN=function(t){return Vr()},t.prototype.subtract=function(t,e){return Vr()},t.prototype.multiply=function(t,e){return Vr()},t.prototype.realDivide=function(t,e){return Vr()},t.prototype.floorDiv=function(t,e){return Vr()},t.prototype.sum=function(t,e){return Vr()},t.prototype.prod=function(t,e){return Vr()},t.prototype.unsortedSegmentSum=function(t,e,n){return Vr()},t.prototype.argMin=function(t,e){return Vr()},t.prototype.argMax=function(t,e){return Vr()},t.prototype.equal=function(t,e){return Vr()},t.prototype.notEqual=function(t,e){return Vr()},t.prototype.less=function(t,e){return Vr()},t.prototype.lessEqual=function(t,e){return Vr()},t.prototype.greater=function(t,e){return Vr()},t.prototype.greaterEqual=function(t,e){return Vr()},t.prototype.logicalNot=function(t){return Vr()},t.prototype.logicalAnd=function(t,e){return Vr()},t.prototype.logicalOr=function(t,e){return Vr()},t.prototype.where=function(t){return Vr()},t.prototype.select=function(t,e,n){return Vr()},t.prototype.topk=function(t,e,n){return Vr()},t.prototype.min=function(t,e){return Vr()},t.prototype.minimum=function(t,e){return Vr()},t.prototype.mod=function(t,e){return Vr()},t.prototype.max=function(t,e){return Vr()},t.prototype.maximum=function(t,e){return Vr()},t.prototype.all=function(t,e){return Vr()},t.prototype.any=function(t,e){return Vr()},t.prototype.squaredDifference=function(t,e){return Vr()},t.prototype.ceil=function(t){return Vr()},t.prototype.floor=function(t){return Vr()},t.prototype.round=function(t){return Vr()},t.prototype.sign=function(t){return Vr()},t.prototype.isNaN=function(t){return Vr()},t.prototype.isInf=function(t){return Vr()},t.prototype.isFinite=function(t){return Vr()},t.prototype.pow=function(t,e){return Vr()},t.prototype.exp=function(t){return Vr()},t.prototype.expm1=function(t){return Vr()},t.prototype.log=function(t){return Vr()},t.prototype.log1p=function(t){return Vr()},t.prototype.sqrt=function(t){return Vr()},t.prototype.rsqrt=function(t){return Vr()},t.prototype.square=function(t){return Vr()},t.prototype.reciprocal=function(t){return Vr()},t.prototype.relu=function(t){return Vr()},t.prototype.relu6=function(t){return Vr()},t.prototype.prelu=function(t,e){return Vr()},t.prototype.elu=function(t){return Vr()},t.prototype.eluDer=function(t,e){return Vr()},t.prototype.selu=function(t){return Vr()},t.prototype.int=function(t){return Vr()},t.prototype.clip=function(t,e,n){return Vr()},t.prototype.abs=function(t){return Vr()},t.prototype.complexAbs=function(t){return Vr()},t.prototype.sigmoid=function(t){return Vr()},t.prototype.softplus=function(t){return Vr()},t.prototype.sin=function(t){return Vr()},t.prototype.cos=function(t){return Vr()},t.prototype.tan=function(t){return Vr()},t.prototype.asin=function(t){return Vr()},t.prototype.acos=function(t){return Vr()},t.prototype.atan=function(t){return Vr()},t.prototype.atan2=function(t,e){return Vr()},t.prototype.sinh=function(t){return Vr()},t.prototype.cosh=function(t){return Vr()},t.prototype.tanh=function(t){return Vr()},t.prototype.asinh=function(t){return Vr()},t.prototype.acosh=function(t){return Vr()},t.prototype.atanh=function(t){return Vr()},t.prototype.erf=function(t){return Vr()},t.prototype.step=function(t,e){return Vr()},t.prototype.fusedConv2d=function(t){return t.input,t.filter,t.convInfo,t.bias,t.activation,t.preluActivationWeights,Vr()},t.prototype.conv2d=function(t,e,n){return Vr()},t.prototype.conv2dDerInput=function(t,e,n){return Vr()},t.prototype.conv2dDerFilter=function(t,e,n){return Vr()},t.prototype.fusedDepthwiseConv2D=function(t){return t.input,t.filter,t.convInfo,t.bias,t.activation,t.preluActivationWeights,Vr()},t.prototype.depthwiseConv2D=function(t,e,n){return Vr()},t.prototype.depthwiseConv2DDerInput=function(t,e,n){return Vr()},t.prototype.depthwiseConv2DDerFilter=function(t,e,n){return Vr()},t.prototype.conv3d=function(t,e,n){return Vr()},t.prototype.conv3dDerInput=function(t,e,n){return Vr()},t.prototype.conv3dDerFilter=function(t,e,n){return Vr()},t.prototype.maxPool=function(t,e){return Vr()},t.prototype.maxPoolBackprop=function(t,e,n,r){return Vr()},t.prototype.avgPool=function(t,e){return Vr()},t.prototype.avgPoolBackprop=function(t,e,n){return Vr()},t.prototype.avgPool3d=function(t,e){return Vr()},t.prototype.avgPool3dBackprop=function(t,e,n){return Vr()},t.prototype.maxPool3d=function(t,e){return Vr()},t.prototype.maxPool3dBackprop=function(t,e,n,r){return Vr()},t.prototype.reshape=function(t,e){return Vr()},t.prototype.cast=function(t,e){return Vr()},t.prototype.tile=function(t,e){return Vr()},t.prototype.pad=function(t,e,n){return Vr()},t.prototype.transpose=function(t,e){return Vr()},t.prototype.gather=function(t,e,n){return Vr()},t.prototype.gatherND=function(t,e){return Vr()},t.prototype.scatterND=function(t,e,n){return Vr()},t.prototype.batchToSpaceND=function(t,e,n){return Vr()},t.prototype.spaceToBatchND=function(t,e,n){return Vr()},t.prototype.resizeBilinear=function(t,e,n,r){return Vr()},t.prototype.resizeBilinearBackprop=function(t,e,n){return Vr()},t.prototype.resizeNearestNeighbor=function(t,e,n,r){return Vr()},t.prototype.resizeNearestNeighborBackprop=function(t,e,n){return Vr()},t.prototype.batchNormalization=function(t,e,n,r,a,i){return Vr()},t.prototype.localResponseNormalization4D=function(t,e,n,r,a){return Vr()},t.prototype.LRNGrad=function(t,e,n,r,a,i,o){return Vr()},t.prototype.multinomial=function(t,e,n,r){return Vr()},t.prototype.oneHot=function(t,e,n,r){return Vr()},t.prototype.cumsum=function(t,e,n,r){return Vr()},t.prototype.nonMaxSuppression=function(t,e,n,r,a){return Vr()},t.prototype.fft=function(t){return Vr()},t.prototype.ifft=function(t){return Vr()},t.prototype.complex=function(t,e){return Vr()},t.prototype.real=function(t){return Vr()},t.prototype.imag=function(t){return Vr()},t.prototype.cropAndResize=function(t,e,n,r,a,i){return Vr()},t.prototype.depthToSpace=function(t,e,n){return Vr()},t.prototype.split=function(t,e,n){return Vr()},t.prototype.sparseToDense=function(t,e,n,r){return Vr()},t.prototype.diag=function(t){return Vr()},t.prototype.fill=function(t,e,n){throw new Error("Not yet implemented.")},t.prototype.onesLike=function(t){return Vr()},t.prototype.zerosLike=function(t){return Vr()},t.prototype.linspace=function(t,e,n){return Vr()},t.prototype.dispose=function(){return Vr()},t}();function Vr(){throw new Error("Not yet implemented or not found in the registry. Did you forget to import the kernel?")}function Ur(t,e){for(var n=t.length,r=[],a=0;a1&&1===o&&r.unshift(i)}return r}function jr(t,e){for(var n=[],r=0;r1)&&n.unshift(i)}return n}function Gr(t,e){for(var n=[],r=Math.max(t.length,e.length),a=0;aa}).sort(function(t,e){return e.score-t.score}),o=[],s=0;s=0;--h)if(ha(t,c,o[h])>=r){p=!0;break}if(!p&&(o.push(c),o.length>=n))break}return pn(o,"int32")}function ha(t,e,n){var r=t.subarray(4*e,4*e+4),a=t.subarray(4*n,4*n+4),i=Math.min(r[0],r[2]),o=Math.min(r[1],r[3]),s=Math.max(r[0],r[2]),u=Math.max(r[1],r[3]),l=Math.min(a[0],a[2]),c=Math.min(a[1],a[3]),p=Math.max(a[0],a[2]),h=Math.max(a[1],a[3]),f=(s-i)*(u-o),d=(p-l)*(h-c);if(f<=0||d<=0)return 0;var m=Math.max(i,l),g=Math.max(o,c),v=Math.min(s,p),y=Math.min(u,h),b=Math.max(v-m,0)*Math.max(y-g,0);return b/(f+d-b)}function fa(t,e,n){var r=new Array(t.rank).fill(0),a=t.shape.slice();return e.map(function(e){a[n]=e;var i=t.slice(r,a);return r[n]+=e,i})}function da(t,e){for(var n=new Array(t.rank),r=0;r":"<",u=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+r+";\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < "+r+"; i++) {\n int inIdx = "+u+";\n float candidate = getA(batch, inIdx);\n if (candidate "+s+" bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n "};function xa(t,e){return["x","y","z","w","u","v"].slice(0,e).map(function(e){return t+"."+e})}function wa(t,e){return 1===e?[t]:xa(t,e)}function Ca(){var t,e,n,r,a,i,s,u,l,c;return 2===o().getNumber("WEBGL_VERSION")?(t="#version 300 es",e="in",n="out",r="in",a="texture",i="outputColor",s="out vec4 outputColor;",u="\n bool isnan_custom(float val) {\n return (val > 0.0 || val < 0.0) ? false : val != 0.0;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ",l="",c="\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "):(t="",e="attribute",n="varying",r="varying",a="texture2D",i="gl_FragColor",s="",u="\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n ",l="\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n ",c="\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "),{version:t,attribute:e,varyingVs:n,varyingFs:r,texture2D:a,output:i,defineOutput:s,defineSpecialNaN:u,defineSpecialInf:l,defineRound:c}}function Na(t,e,n){void 0===n&&(n="index");var r=G(e);return r.map(function(e,a){return"int "+t[a]+" = "+n+" / "+e+"; "+(a===r.length-1?"int "+t[a+1]+" = "+n+" - "+t[a]+" * "+e:"index -= "+t[a]+" * "+e)+";"}).join("")}function Sa(t){var e=G(t).map(function(t){return t.toString()});return"\n int getFlatIndex(ivec3 coords) {\n return coords.x * "+e[0]+" + coords.y * "+e[1]+" + coords.z;\n }\n"}var Ia="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n";function ka(t,e,n,r){var a=[];t.forEach(function(t){var e=x(t.shapeInfo.logicalShape);t.shapeInfo.isUniform?a.push("uniform float "+t.name+(e>1?"["+e+"]":"")+";"):(a.push("uniform sampler2D "+t.name+";"),a.push("uniform int offset"+t.name+";"))});var i,o,s=a.join("\n"),u=t.map(function(t){return function(t,e,n){void 0===n&&(n=!1);var r="";r+=n?function t(e){var n,r,a;switch(e.shapeInfo.logicalShape.length){case 0:return n=e.name,r="get"+n.charAt(0).toUpperCase()+n.slice(1),a=Ca(),"\n vec4 "+r+"() {\n return "+a.texture2D+"("+n+", halfCR);\n }\n ";case 1:return function(t){var e=t.name,n="get"+e.charAt(0).toUpperCase()+e.slice(1),r=t.shapeInfo.texShape,a=[Math.ceil(r[0]/2),Math.ceil(r[1]/2)],i=Ca();return"\n vec4 "+n+"(int index) {\n vec2 uv = packedUVfrom1D(\n "+a[0]+", "+a[1]+", index);\n return "+i.texture2D+"("+e+", uv);\n }\n "}(e);case 2:return function(t){var e=t.shapeInfo.logicalShape,n=t.name,r="get"+n.charAt(0).toUpperCase()+n.slice(1),a=t.shapeInfo.texShape,i=a[0],o=a[1],s=Ca();if(null!=a&&w(e,a))return"\n vec4 "+r+"(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2("+o+".0, "+i+".0);\n\n return "+s.texture2D+"("+n+", uv);\n }\n ";var u=[Math.ceil(a[0]/2),Math.ceil(a[1]/2)],l=Math.ceil(e[1]/2);return"\n vec4 "+r+"(int row, int col) {\n vec2 uv = packedUVfrom2D("+l+", "+u[0]+", "+u[1]+", row, col);\n return "+s.texture2D+"("+n+", uv);\n }\n "}(e);case 3:return function(e){var n=e.shapeInfo.logicalShape,r=e.name,a="get"+r.charAt(0).toUpperCase()+r.slice(1),i=e.shapeInfo.texShape,o=[Math.ceil(i[0]/2),Math.ceil(i[1]/2)];if(1===n[0]){var s=n.slice(1),u=Fa(e,s);return"\n "+t(u)+"\n vec4 "+a+"(int b, int row, int col) {\n return "+a+"("+Ma(["b","row","col"],[1,2])+");\n }\n "}var l=o[0],c=o[1],p=Math.ceil(n[2]/2),h=p*Math.ceil(n[1]/2),f=Ca();return"\n vec4 "+a+"(int b, int row, int col) {\n vec2 uv = packedUVfrom3D(\n "+l+", "+c+", "+h+", "+p+", b, row, col);\n return "+f.texture2D+"("+r+", uv);\n }\n "}(e);default:return function(t){for(var e=t.shapeInfo.logicalShape,n=e.length,r=t.name,a="get"+r.charAt(0).toUpperCase()+r.slice(1),i=t.shapeInfo.texShape,o=[Math.ceil(i[0]/2),Math.ceil(i[1]/2)],s=o[0],u=o[1],l=Math.ceil(e[n-1]/2),c=l*Math.ceil(e[n-2]/2),p="int b, int row, int col",h="b * "+c+" + (row / 2) * "+l+" + (col / 2)",f=2;f=1?"coords = 0;":u.map(function(t){return"coords."+p[t+c]+" = 0;"}).join("\n");var h;h=s<2&&o>0?"coords":t.shapeInfo.logicalShape.map(function(t,e){return"coords."+p[e+c]}).join(", ");var f="return outputValue;",d=1===x(t.shapeInfo.logicalShape),m=1===x(e.logicalShape);if(1!==o||d||m){if(d&&!m)f=1===s?"\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n ":"\n return vec4(outputValue.x);\n ";else if(u.length){var g=o-2,v=o-1;u.indexOf(g)>-1&&u.indexOf(v)>-1?f="return vec4(outputValue.x);":u.indexOf(g)>-1?f="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":u.indexOf(v)>-1&&(f="return vec4(outputValue.xx, outputValue.zz);")}}else f="\n return vec4(outputValue.xy, outputValue.xy);\n ";return"\n vec4 "+i+"() {\n "+l+" coords = getOutputCoords();\n "+n+"\n vec4 outputValue = get"+a+"("+h+");\n "+f+"\n }\n "}(t,e):function(t,e){var n=t.name,r=n.charAt(0).toUpperCase()+n.slice(1),a="get"+r+"AtOutCoords",i=e.texShape,o=t.shapeInfo.texShape,s=t.shapeInfo.logicalShape.length,u=e.logicalShape.length;if(!t.shapeInfo.isUniform&&s===u&&null==t.shapeInfo.flatOffset&&w(o,i))return"\n float "+a+"() {\n return sampleTexture("+n+", resultUV);\n }\n ";var l=_a(u),c=Ur(t.shapeInfo.logicalShape,e.logicalShape),p=u-s,h=["x","y","z","w","u","v"];return"\n float "+a+"() {\n "+l+" coords = getOutputCoords();\n "+(0===s?"":u<2&&c.length>=1?"coords = 0;":c.map(function(t){return"coords."+h[t+p]+" = 0;"}).join("\n"))+"\n return get"+r+"("+(u<2&&s>0?"coords":t.shapeInfo.logicalShape.map(function(t,e){return"coords."+h[e+p]}).join(", "))+");\n }\n "}(t,e)),r}(t,e,r)}).join("\n"),l=e.texShape,c=Ca(),p="\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return "+c.texture2D+"(textureSampler, uv).r;\n }\n ",h=function(t){return t.version+"\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n "+t.varyingFs+" vec2 resultUV;\n "+t.defineOutput+"\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n "+t.defineSpecialNaN+"\n "+t.defineSpecialInf+"\n "+t.defineRound+"\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n "+Ea+"\n "+Aa+"\n "+Ra+"\n "}(c);return e.isPacked?(i=function(t,e){switch(t.length){case 0:return"\n int getOutputCoords() {\n return 0;\n }\n ";case 1:return function(t,e){var n=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)];return 1===n[0]?"\n int getOutputCoords() {\n return 2 * int(resultUV.x * "+n[1]+".0);\n }\n ":1===n[1]?"\n int getOutputCoords() {\n return 2 * int(resultUV.y * "+n[0]+".0);\n }\n ":"\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n return 2 * (resTexRC.x * "+n[1]+" + resTexRC.y);\n }\n "}(0,e);case 2:return function(t,e){var n=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)];if(w(t,e))return"\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2("+n[0]+", "+n[1]+"));\n }\n ";var r=Math.ceil(t[1]/2);return"\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+n[0]+", "+n[1]+"));\n\n int index = resTexRC.x * "+n[1]+" + resTexRC.y;\n int r = 2 * (index / "+r+");\n int c = imod(index, "+r+") * 2;\n\n return ivec2(r, c);\n }\n "}(t,e);case 3:return n=t,r=e,a=[Math.ceil(r[0]/2),Math.ceil(r[1]/2)],o=(i=Math.ceil(n[2]/2))*Math.ceil(n[1]/2),"\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+a[0]+", "+a[1]+"));\n int index = resTexRC.x * "+a[1]+" + resTexRC.y;\n\n int b = index / "+o+";\n index -= b * "+o+";\n\n int r = 2 * (index / "+i+");\n int c = imod(index, "+i+") * 2;\n\n return ivec3(b, r, c);\n }\n ";default:return function(t,e){for(var n=[Math.ceil(e[0]/2),Math.ceil(e[1]/2)],r=Math.ceil(t[t.length-1]/2),a=r*Math.ceil(t[t.length-2]/2),i=a,o="",s="b, r, c",u=2;u2,function(){return"Packed arg"+(n.charAt(0).toUpperCase()+n.slice(1))+" supports only inputs with rank above 2."});var a=t[t.length-1],i=Math.ceil(a/e);this.outputShape=t.slice(0,-1),i>1&&this.outputShape.push(i),r||this.variableNames.push("bestIndicesA");var o,s,u=this.outputShape,l=u.length,c=_a(l),p=wa("coords",l);if(1===i){var h=_a(s=l+1);o="\n "+h+" sourceLocR = "+h+"("+p.join()+", 0);\n ++"+p[l-1]+";\n "+h+" sourceLocG = "+h+"("+p.join()+", 0);\n ++"+p[l-2]+";\n "+h+" sourceLocA = "+h+"("+p.join()+", 0);\n --"+p[l-1]+";\n "+h+" sourceLocB = "+h+"("+p.join()+", 0);\n --"+p[l-2]+";"}else s=l,o="\n "+c+" sourceLocR = coords;\n ++"+p[l-1]+";\n "+c+" sourceLocG = coords;\n ++"+p[l-2]+";\n "+c+" sourceLocA = coords;\n --"+p[l-1]+";\n "+c+" sourceLocB = coords;\n --"+p[l-2]+";";var f=["x","y","z","w","u","v"].slice(0,s),d="."+f[s-1],m=f.map(function(t){return"int "+t}),v=wa("sourceLocR",s-1).concat("inIdx.r"),y=wa("sourceLocG",s-1).concat("inIdx.g"),b=wa("sourceLocB",s-1).concat("inIdx.b"),x=wa("sourceLocA",s-1).concat("inIdx.a"),w="max"===n?"greaterThan":"lessThan",C=r?"":"\n inIdx = round(vec4(getBestIndicesAChannel("+v.join()+"),\n getBestIndicesAChannel("+y.join()+"),\n getBestIndicesAChannel("+b.join()+"),\n getBestIndicesAChannel("+x.join()+")));",N="vec4(\n getAChannel("+v.join()+"),\n hasNextCol ? getAChannel("+y.join()+") : 0.,\n hasNextRow ? getAChannel("+b.join()+") : 0.,\n hasNextRow && hasNextCol ? getAChannel("+x.join()+") : 0.)",S=r?"":"\n float getBestIndicesAChannel("+m.join()+") {\n return getChannel(getBestIndicesA("+f.join()+"),\n vec2("+f.slice(-2).join()+"));\n }";this.userCode="\n float getAChannel("+m.join()+") {\n return getChannel(getA("+f.join()+"),\n vec2("+f.slice(-2).join()+"));\n }\n "+S+"\n void main() {\n "+c+" coords = getOutputCoords();\n bool hasNextCol = "+p[l-1]+" < "+(u[l-1]-1)+";\n bool hasNextRow = "+p[l-2]+" < "+(u[l-2]-1)+";\n "+o+"\n ivec4 srcIdx = ivec4(sourceLocR"+d+", sourceLocG"+d+",\n sourceLocB"+d+", sourceLocA"+d+") * "+e+";\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = "+N+";\n\n for (int i = 0; i < "+e+"; i++) {\n inIdx = srcIdx;\n "+C+"\n vec4 candidate = "+N+";\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4("+w+"(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n "},La=function(t){this.variableNames=["dy"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,a=t.strideWidth,i=t.dilationHeight,o=t.dilationWidth,s=t.effectiveFilterHeight,u=t.effectiveFilterWidth,l=s-1-t.padInfo.top,c=u-1-t.padInfo.left,p=1/(e*n);this.userCode="\n const ivec2 pads = ivec2("+l+", "+c+");\n const float avgMultiplier = float("+p+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+s+";\n wR += "+i+") {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+u+";\n wC+= "+o+") {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n "},Ba=function(t){this.variableNames=["dy"],this.outputShape=t.inShape;var e=t.filterDepth,n=t.filterHeight,r=t.filterWidth,a=t.strideDepth,i=t.strideHeight,o=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,l=t.dilationWidth,c=t.effectiveFilterDepth,p=t.effectiveFilterHeight,h=t.effectiveFilterWidth,f=c-1-t.padInfo.front,d=p-1-t.padInfo.top,m=h-1-t.padInfo.left,g=1/(e*n*r);this.userCode="\n const ivec3 pads = ivec3("+f+", "+d+", "+m+");\n const float avgMultiplier = float("+g+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < "+c+";\n wD += "+s+") {\n float dyD = float(dyDCorner + wD) / "+a+".0;\n\n if (dyD < 0.0 || dyD >= "+t.outDepth+".0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < "+p+";\n wR += "+u+") {\n float dyR = float(dyRCorner + wR) / "+i+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+h+";\n wC += "+l+") {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n "},Pa=function(t,e,n,r,a,i){this.outputShape=[],this.variableNames=["x","mean","variance"],Gr(t,e),Gr(t,n);var o="0.0";null!=r&&(Gr(t,r),this.variableNames.push("offset"),o="getOffsetAtOutCoords()");var s="1.0";null!=a&&(Gr(t,a),this.variableNames.push("scale"),s="getScaleAtOutCoords()"),this.outputShape=t,this.userCode="\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = "+o+";\n float scale = "+s+";\n float inv = scale * inversesqrt(variance + float("+i+"));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n "},Wa=function(t,e,n,r,a,i){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],Gr(t,e),Gr(t,n);var o="vec4(0.0)";null!=r&&(Gr(t,r),this.variableNames.push("offset"),o="getOffsetAtOutCoords()");var s="vec4(1.0)";null!=a&&(Gr(t,a),this.variableNames.push("scale"),s="getScaleAtOutCoords()"),this.outputShape=t,this.userCode="\n void main() {\n vec4 offset = "+o+";\n vec4 scale = "+s+";\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4("+i+"));\n\n setOutput((x - mean) * inv + offset);\n }\n "},Va=function(t,e,n){this.variableNames=["AReal","AImag","BReal","BImag"],this.outputShape=Gr(e,n),this.userCode="\n float binaryOpComplex(\n float areal, float aimag, float breal, float bimag) {\n "+t+"\n }\n\n void main() {\n float areal = getARealAtOutCoords();\n float aimag = getAImagAtOutCoords();\n float breal = getBRealAtOutCoords();\n float bimag = getBImagAtOutCoords();\n setOutput(binaryOpComplex(areal, aimag, breal, bimag));\n }\n "},Ua="return a + b;",ja="return a - b;",Ga="return a * b;",qa="return (a < 0.) ? b * a : a;",Ha=function(t,e,n){this.variableNames=["A","B"],this.outputShape=Gr(e,n),this.userCode="\n float binaryOperation(float a, float b) {\n "+t+"\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n "},Ka="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n",Xa=function(t,e,n,r){void 0===r&&(r=!1),this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=Gr(e,n);var a=this.outputShape.length,i="";if(r)if(0===a||1===x(this.outputShape))i="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else if(i="\n "+_a(a)+" coords = getOutputCoords();\n ",1===a)i+="\n result.y = (coords + 1) >= "+this.outputShape[0]+" ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ";else{var o=wa("coords",a);i+="\n bool nextRowOutOfBounds =\n ("+o[a-2]+" + 1) >= "+this.outputShape[a-2]+";\n bool nextColOutOfBounds =\n ("+o[a-1]+" + 1) >= "+this.outputShape[a-1]+";\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n "}this.userCode="\n vec4 binaryOperation(vec4 a, vec4 b) {\n "+t+"\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n "+i+"\n\n setOutput(result);\n }\n "},$a=function(){function t(t){this.variableNames=["A"],this.outputShape=t,this.userCode="\n uniform float minVal;\n uniform float maxVal;\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}return t.prototype.getCustomSetupFunc=function(t,e){var n=this;return function(r,a){null==n.minLoc&&(n.minLoc=r.getUniformLocationNoThrow(a,"minVal"),n.maxLoc=r.getUniformLocationNoThrow(a,"maxVal")),r.gl.uniform1f(n.minLoc,t),r.gl.uniform1f(n.maxLoc,e)}},t}(),Ya=function(){function t(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t,this.userCode="\n uniform float minVal;\n uniform float maxVal;\n\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}return t.prototype.getCustomSetupFunc=function(t,e){var n=this;return function(r,a){null==n.minLoc&&(n.minLoc=r.getUniformLocationNoThrow(a,"minVal"),n.maxLoc=r.getUniformLocationNoThrow(a,"maxVal")),r.gl.uniform1f(n.minLoc,t),r.gl.uniform1f(n.maxLoc,e)}},t}(),Ja=function(t){this.variableNames=["real","imag"],this.outputShape=t,this.userCode="\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n "},Za=function(t){this.outputShape=[],this.outputShape=nn(t,1),this.variableNames=t.map(function(t,e){return"T"+e});var e=new Array(t.length-1);e[0]=t[0][1];for(var n=1;n= "+s[u-1]+") {\n return getChannel(\n getT"+u+"("+ti(o,l,f)+"),\n vec2("+ti(c,l,f)+"));\n }"}var d=s.length,m=s[s.length-1];h+="\n return getChannel(\n getT"+d+"("+ti(o,l,m)+"),\n vec2("+ti(c,l,m)+"));",this.userCode="\n float getValue("+o.map(function(t){return"int "+t})+") {\n "+h+"\n }\n\n void main() {\n "+a+" coords = getOutputCoords();\n vec4 result = vec4(getValue("+i+"), 0., 0., 0.);\n\n "+i[r-1]+" = "+i[r-1]+" + 1;\n if ("+i[r-1]+" < "+n[r-1]+") {\n result.g = getValue("+i+");\n }\n\n "+i[r-2]+" = "+i[r-2]+" + 1;\n if ("+i[r-2]+" < "+n[r-2]+") {\n result.a = getValue("+i+");\n }\n\n "+i[r-1]+" = "+i[r-1]+" - 1;\n if ("+i[r-2]+" < "+n[r-2]+" &&\n "+i[r-1]+" < "+n[r-1]+") {\n result.b = getValue("+i+");\n }\n setOutput(result);\n }\n "};function ti(t,e,n){var r=t.indexOf(e);return t.map(function(t,e){return e===r?t+" - "+n:t}).join()}var ei=function(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideHeight,n=t.strideWidth,r=t.padInfo.top,a=t.padInfo.left,i="channelsLast"===t.dataFormat;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+e+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+a+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n if ("+i+") {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n "},ni=function(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,a=t.strideWidth,i="channelsLast"===t.dataFormat,o=e-1-t.padInfo.top,s=n-1-t.padInfo.left,u=i?1:2,l=i?2:3,c=i?3:1;this.userCode="\n const ivec2 pads = ivec2("+o+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords["+c+"];\n\n ivec2 dyCorner = ivec2(coords["+u+"], coords["+l+"]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+e+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n\n if ("+i+") {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n "},ri=function(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideDepth,n=t.strideHeight,r=t.strideWidth,a=t.padInfo.front,i=t.padInfo.top,o=t.padInfo.left;this.userCode="\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yF = 0; yF < "+t.outDepth+"; yF++) {\n int xF = wF + yF * "+e+" - "+a+";\n\n if (xF < 0 || xF >= "+t.inDepth+") {\n continue;\n }\n\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+n+" - "+i+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+r+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "},ai=function(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterDepth,n=t.filterHeight,r=t.filterWidth,a=t.strideDepth,i=t.strideHeight,o=t.strideWidth,s=e-1-t.padInfo.front,u=n-1-t.padInfo.top,l=r-1-t.padInfo.left;this.userCode="\n const ivec3 pads = ivec3("+s+", "+u+", "+l+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < "+e+"; wF++) {\n float dyF = float(dyFCorner + wF) / "+a+".0;\n\n if (dyF < 0.0 || dyF >= "+t.outDepth+".0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = "+e+" - 1 - wF;\n\n for (int wR = 0; wR < "+n+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+i+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+n+" - 1 - wR;\n\n for (int wC = 0; wC < "+r+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+r+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "},ii=function(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideHeight,n=t.strideWidth,r=t.padInfo.top,a=t.padInfo.left,i=t.outChannels/t.inChannels;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * "+i+" + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+e+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+a+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "},oi=function(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,a=t.strideWidth,i=e-1-t.padInfo.top,o=n-1-t.padInfo.left,s=t.outChannels/t.inChannels;this.userCode="\n const ivec2 pads = ivec2("+i+", "+o+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+e+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < "+s+"; dm++) {\n int d2 = d1 * "+s+" + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "},si=function(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.outputShape=t.outShape;var a=t.padInfo.top,i=t.padInfo.left,o=t.strideHeight,s=t.strideWidth,u=t.dilationHeight,l=t.dilationWidth,c=t.filterHeight,p=t.filterWidth,h=4*Math.floor(t.inChannels/4),f=t.inChannels%4,d="channelsLast"===t.dataFormat,m=d?1:2,g=d?2:3,v=d?3:1,y="",b="";n&&(y=r?"float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n "+n+"\n }":"\n float activation(float x) {\n "+n+"\n }\n ",b="result = activation(result);");var x=e?"result += getBiasAtOutCoords();":"";e&&this.variableNames.push("bias"),r&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+y+"\n\n const ivec2 strides = ivec2("+o+", "+s+");\n const ivec2 pads = ivec2("+a+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords["+v+"];\n\n ivec2 xRCCorner =\n ivec2(coords["+m+"], coords["+g+"]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+c+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+p+"; wC++) {\n int xC = xCCorner + wC * "+l+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+h+"; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if ("+d+") {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if ("+(1===f)+") {\n\n if ("+d+") {\n dotProd +=\n getX(batch, xR, xC, "+h+") *\n getW(wR, wC, "+h+", d2);\n } else {\n dotProd +=\n getX(batch, "+h+", xR, xC) *\n getW(wR, wC, "+h+", d2);\n }\n\n } else if ("+(2===f)+") {\n vec2 wValues = vec2(\n getW(wR, wC, "+h+", d2),\n getW(wR, wC, "+h+" + 1, d2)\n );\n\n if ("+d+") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, "+h+"),\n getX(batch, xR, xC, "+h+" + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, "+h+", xR, xC),\n getX(batch, "+h+" + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if ("+(3===f)+") {\n vec3 wValues = vec3(\n getW(wR, wC, "+h+", d2),\n getW(wR, wC, "+h+" + 1, d2),\n getW(wR, wC, "+h+" + 2, d2)\n );\n\n if ("+d+") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, "+h+"),\n getX(batch, xR, xC, "+h+" + 1),\n getX(batch, xR, xC, "+h+" + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, "+h+", xR, xC),\n getX(batch, "+h+" + 1, xR, xC),\n getX(batch, "+h+" + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n "+x+"\n "+b+"\n setOutput(result);\n }\n "},ui=function(t){this.variableNames=["x","W"],this.outputShape=t.outShape;var e=t.padInfo.front,n=t.padInfo.top,r=t.padInfo.left,a=t.strideDepth,i=t.strideHeight,o=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,l=t.dilationWidth,c=t.filterDepth,p=t.filterHeight,h=t.filterWidth,f=4*Math.floor(t.inChannels/4),d=t.inChannels%4;this.userCode="\n const ivec3 strides = ivec3("+a+", "+i+", "+o+");\n const ivec3 pads = ivec3("+e+", "+n+", "+r+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < "+c+"; wF++) {\n int xF = xFCorner + wF * "+s+";\n\n if (xF < 0 || xF >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+p+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+h+"; wC++) {\n int xC = xCCorner + wC * "+l+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+f+"; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if ("+(1===d)+") {\n dotProd +=\n getX(batch, xF, xR, xC, "+f+") *\n getW(wF, wR, wC, "+f+", d2);\n } else if ("+(2===d)+") {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, "+f+"),\n getX(batch, xF, xR, xC, "+f+" + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, "+f+", d2),\n getW(wF, wR, wC, "+f+" + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if ("+(3===d)+") {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, "+f+"),\n getX(batch, xF, xR, xC, "+f+" + 1),\n getX(batch, xF, xR, xC, "+f+" + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, "+f+", d2),\n getW(wF, wR, wC, "+f+" + 1, d2),\n getW(wF, wR, wC, "+f+" + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "},li=function(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.outputShape=t.outShape;var a=t.inHeight,i=t.inWidth,o=t.padInfo.top,s=t.padInfo.left,u=t.strideHeight,l=t.strideWidth,c=t.dilationHeight,p=t.dilationWidth,h=t.filterHeight,f=t.filterWidth,d=t.outChannels/t.inChannels,m="",g="";n&&(m=r?"float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n "+n+"\n }":"\n float activation(float x) {\n "+n+"\n }\n ",g="result = activation(result);");var v=e?"result += getBiasAtOutCoords();":"";e&&this.variableNames.push("bias"),r&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+m+"\n\n const ivec2 strides = ivec2("+u+", "+l+");\n const ivec2 pads = ivec2("+o+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / "+d+";\n int q = d2 - d1 * "+d+";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < "+h+"; wR++) {\n int xR = xRCorner + wR * "+c+";\n\n if (xR < 0 || xR >= "+a+") {\n continue;\n }\n\n for (int wC = 0; wC < "+f+"; wC++) {\n int xC = xCCorner + wC * "+p+";\n\n if (xC < 0 || xC >= "+i+") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n "+v+"\n "+g+"\n setOutput(result);\n }\n "},ci=function(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.outShape;for(var a=t.inHeight,i=t.inWidth,o=t.padInfo.top,s=t.padInfo.left,u=t.strideHeight,l=t.strideWidth,c=t.dilationHeight,p=t.dilationWidth,h=t.filterHeight,f=t.filterWidth,m=f,g="int xR; int xC; int xCOffset;",v=0;v= 0 && xR < "+a+" && xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+v+"C"+y+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+v+"C"+y+" = vec4(0.);\n }\n\n xCOffset = xC + 1 - 2;\n if(xR >= 0 && xR < "+a+" && xCOffset >= 0 && xCOffset < "+i+") {\n vec4 previous = getX(batch, xR, xCOffset, d1);\n xR"+v+"C"+y+" = vec4(previous.zw, xTexelR"+v+"C"+y+".xy);\n } else {\n xR"+v+"C"+y+" = vec4(0, 0, xTexelR"+v+"C"+y+".xy);\n }\n ":"\n if(xR >= 0 && xR < "+a+" && xC >= 0 && xC < "+i+") {\n xTexelR"+v+"C"+y+" = getX(batch, xR, xC, d1);\n } else {\n xTexelR"+v+"C"+y+" = vec4(0.);\n }\n\n xR"+v+"C"+y+" = xTexelR"+v+"C"+y+";\n ",y+1= 0 && xR < "+a+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+v+"C"+(y+2)+" = getX(batch, xR, xCOffset, d1);\n }\n ",p>1&&(g+="\n xCOffset -= 2;\n if(xR >= 0 && xR < "+a+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+v+"C"+y+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+v+"C"+y+" = vec4(0.);\n }\n "),g+="\n xR"+v+"C"+(y+1)+" = vec4(\n xTexelR"+v+"C"+y+".zw, xTexelR"+v+"C"+(y+2)+".xy);\n "):g+="\n xCOffset = xC + "+x+";\n\n if(xR >= 0 && xR < "+a+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+v+"C"+(y+2)+" = getX(batch, xR, xCOffset, d1);\n }\n\n xR"+v+"C"+(y+1)+" = xTexelR"+v+"C"+(y+2)+";\n "}}else y= 0 && xR < "+a+") {\n ",s%2==1?(g+="\n xCOffset = xC + 1 - "+l+";\n if(xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+v+"C"+y+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+v+"C"+y+" = vec4(0.);\n }\n\n if(xC + 1 >= 0 && xC + 1 < "+i+") {\n xTexelR"+v+"C"+(y+2)+" = getX(batch, xR, xC + 1, d1);\n } else {\n xTexelR"+v+"C"+(y+2)+" = vec4(0.);\n }\n\n xR"+v+"C"+y+" = vec4(\n xTexelR"+v+"C"+y+".zw, xTexelR"+v+"C"+(y+2)+".zw);\n ",y+1= 0 && xCOffset < "+i+") {\n final = getX(batch, xR, xCOffset, d1);\n }\n xR"+v+"C"+(y+1)+" = vec4(xTexelR"+v+"C"+(y+2)+".xy, final.xy);\n ")):(g+="\n if(xC >= 0 && xC < "+i+") {\n xTexelR"+v+"C"+y+" = getX(batch, xR, xC, d1);\n } else {\n xTexelR"+v+"C"+y+" = vec4(0.);\n }\n\n xCOffset = xC + "+l+";\n if(xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+v+"C"+(y+2)+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+v+"C"+(y+2)+" = vec4(0.);\n }\n\n xR"+v+"C"+y+" = vec4(\n xTexelR"+v+"C"+y+".xy, xTexelR"+v+"C"+(y+2)+".xy);\n ",y+11?[""+(o-1)/(c-1),"(y2-y1) * height_ratio","y1*"+d+" + float(y)*(height_scale)"]:["0.0","0.0","0.5 * (y1+y2) * "+d],v=g[0],y=g[1],b=g[2],x=p>1?[""+(s-1)/(p-1),"(x2-x1) * width_ratio","x1*"+m+" + float(x)*(width_scale)"]:["0.0","0.0","0.5 * (x1+x2) * "+m],w=x[0],C=x[1],N=x[2];this.userCode="\n const float height_ratio = float("+v+");\n const float width_ratio = float("+w+");\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= "+i+") {\n return;\n }\n\n float height_scale = "+y+";\n float width_scale = "+C+";\n\n float in_y = "+b+";\n if( in_y < 0.0 || in_y > "+d+" ) {\n setOutput(float("+a+"));\n return;\n }\n float in_x = "+N+";\n if( in_x < 0.0 || in_x > "+m+" ) {\n setOutput(float("+a+"));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if("+h+" == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n "},hi=function(t,e,n){this.variableNames=["x"],this.outputShape=t;var r=t.length,a=t[t.length-1],i=n?"<":">";this.userCode="\n int getIndex(int i) {\n "+(n?"return "+a+" -i - 1;":"return i;")+"\n }\n\n void main() {\n "+_a(r)+" coords = getOutputCoords();\n int end = "+fi(r,"coords")+";\n float val = 0.0;\n for (int i = "+a+" - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx "+i+" end) {\n continue;\n }\n if (idx == end && "+e+") {\n continue;\n }\n "+fi(r,"coords")+" = idx;\n val += getX("+function(t,e){if(1===t)return""+e;if(2===t)return e+".x, "+e+".y";if(3===t)return e+".x, "+e+".y, "+e+".z";if(4===t)return e+".x, "+e+".y, "+e+".z, "+e+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}(r,"coords")+");\n }\n setOutput(val);\n }\n "};function fi(t,e){if(1===t)return""+e;if(2===t)return e+".y";if(3===t)return e+".z";if(4===t)return e+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}var di=function(t){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=Dt.DENSE;var e=Wt(t),n=Ca();this.outputShape=t,this.userCode="\n ivec3 outCoordsFromFlatIndex(int index) {\n "+Na(["r","c","d"],t)+"\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = 4 * (resTexRC.x * "+e[1]+" + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n "+n.output+" = result;\n }\n "},mi=function(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=Dt.DENSE;var e=Wt(t),n=Ca();this.outputShape=t,this.userCode="\n ivec3 outCoordsFromFlatIndex(int index) {\n "+Na(["r","c","d"],t)+"\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = 4 * (resTexRC.x * "+e[1]+" + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n "+n.output+" = result;\n }\n "},gi=function(){function t(t,e,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=t,this.blockSize=e,this.dataFormat=n,this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = "+this.getHeightCoordString()+";\n int w = "+this.getWidthCoordString()+";\n int d = "+this.getDepthCoordString()+";\n\n int in_h = h / "+e+";\n int offset_h = imod(h, "+e+");\n int in_w = w / "+e+";\n int offset_w = imod(w, "+e+");\n int offset_d = (offset_h * "+e+" + offset_w) *\n "+this.getOutputDepthSize()+";\n int in_d = d + offset_d;\n\n float result = "+this.getInputSamplingString()+";\n setOutput(result);\n }\n "}return t.prototype.getHeightCoordString=function(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"},t.prototype.getWidthCoordString=function(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"},t.prototype.getDepthCoordString=function(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"},t.prototype.getOutputDepthSize=function(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]},t.prototype.getInputSamplingString=function(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"},t}(),vi=function(t){this.variableNames=["X"],this.outputShape=[t,t],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "},yi=function(t){this.variableNames=["A"],this.outTexUsage=Ot.DOWNLOAD;var e=Ca();this.outputShape=t,this.userCode="\n "+Ia+"\n\n void main() {\n float x = getAAtOutCoords();\n "+e.output+" = encode_float(x);\n }\n "},bi=function(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=Ot.DOWNLOAD;var e=Ca();this.outputShape=t,this.userCode="\n "+Ia+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n "+e.output+" = encode_float(x);\n }\n "},xi=function(t,e,n){void 0===n&&(n=!1),this.variableNames=["A"];var r=Ca(),a=e[0],i=e[1];this.outputShape=t;var o="result";n&&(o="floor(result * 255. + 0.5)"),this.userCode="\n "+Sa(t)+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n \n int r = flatIndex / "+i+";\n int c = imod(flatIndex, "+i+");\n vec2 uv = (vec2(c, r) + halfCR) / vec2("+i+".0, "+a+".0);\n vec4 values = "+r.texture2D+"(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n "+r.output+" = vec4("+o+", 0., 0., 0.);\n }\n "},wi=function(t,e,n){void 0===n&&(n=!1),this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;var r=Ca(),a=e[0],i=e[1];this.outputShape=t;var o="",s="result";n&&(s="floor(result * 255. + 0.5)");for(var u=0;u<=1;u++)for(var l=0;l<=1;l++){var c=2*u+l;o+="\n localCoords = coords;\n if(localCoords[2] + "+l+" < "+t[2]+") {\n localCoords[2] += "+l+";\n if(localCoords[1] + "+u+" < "+t[1]+") {\n localCoords[1] += "+u+";\n\n flatIndex = getFlatIndex(localCoords);\n offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n r = flatIndex / "+i+";\n c = imod(flatIndex, "+i+");\n uv = (vec2(c, r) + halfCR) / vec2("+i+".0, "+a+".0);\n values = "+r.texture2D+"(A, uv);\n\n if(offset == 0) {\n result["+c+"] = values[0];\n } else if(offset == 1) {\n result["+c+"] = values[1];\n } else if(offset == 2) {\n result["+c+"] = values[2];\n } else {\n result["+c+"] = values[3];\n }\n }\n }\n "}this.userCode="\n "+Sa(t)+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n vec4 result = vec4(0.);\n int flatIndex, r, c, offset;\n ivec3 localCoords;\n vec2 uv;\n vec4 values;\n\n "+o+"\n\n "+r.output+" = "+s+";\n }\n "},Ci=function(t,e,n){this.variableNames=["real","imag"];var r=e[1];this.outputShape=e;var a=n?"2.0 * "+Math.PI:"-2.0 * "+Math.PI,i=n?r+".0":"1.0";this.userCode="\n const float exponentMultiplier = "+a+";\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n "+t+"\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float("+r+");\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < "+r+"; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / "+i+";\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n "},Ni=function(){function t(t,e){this.outputShape=[],this.variableNames=["x"],this.outputShape=t,this.userCode="\n uniform float value;\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var e=this;return function(n,r){null==e.valueLoc&&(e.valueLoc=n.getUniformLocationNoThrow(r,"value")),n.gl.uniform1f(e.valueLoc,t)}},t}(),Si=function(t){this.variableNames=["A"];var e=Ca(),n=t[0],r=t[1];this.outputShape=t,this.userCode="\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2("+r+".0, "+n+".0);\n\n vec4 values = "+e.texture2D+"(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n "},Ii=function(t){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;var e=Ca(),n=t[0],r=t[1];this.outputShape=t,this.userCode="\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2("+r+".0, "+n+".0);\n vec4 values = "+e.texture2D+"(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n "+e.output+" = result;\n }\n "},ki=function(t,e,n){this.variableNames=["A","indices"];var r=t.slice();r[n]=e,this.outputShape=r,this.rank=r.length;var a=_a(this.rank),i=function(t,e){var n=t.length;if(n>4)throw Error("Gather for rank "+n+" is not yet supported");if(1===n)return"int(getIndices(resRC))";for(var r=["resRC.x","resRC.y","resRC.z","resRC.w"],a=[],i=0;i1?"strides[j]":"strides";this.userCode="\n "+r+" strides = "+r+"("+this.strides+");\n void main() {\n "+a+" coords = getOutputCoords();\n int flattenIndex = 0;\n for (int j = 0; j < "+this.sliceDim+"; j++) {\n int index = round(getIndices(coords[0], j));\n flattenIndex += index * "+i+";\n }\n setOutput(getX(flattenIndex, coords[1]));\n }\n "};function Ai(t,e){var n=Ca();return $t(t,e,n.version+"\n precision highp float;\n "+n.attribute+" vec3 clipSpacePos;\n "+n.attribute+" vec2 uv;\n "+n.varyingVs+" vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }")}function Ri(t,e){return re(t,e,new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]))}function Ti(t,e){return ae(t,e,new Uint16Array([0,1,2,2,1,3]))}function Di(t,e,n,r,a,i,o){oe(n,r);var s=ie(t,e),u=t.TEXTURE_2D;return jt(t,e,function(){return t.bindTexture(u,s)}),jt(t,e,function(){return t.texParameteri(u,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE)}),jt(t,e,function(){return t.texParameteri(u,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE)}),jt(t,e,function(){return t.texParameteri(u,t.TEXTURE_MIN_FILTER,t.NEAREST)}),jt(t,e,function(){return t.texParameteri(u,t.TEXTURE_MAG_FILTER,t.NEAREST)}),jt(t,e,function(){return t.texImage2D(u,0,a,n,r,0,i,o,null)}),jt(t,e,function(){return t.bindTexture(t.TEXTURE_2D,null)}),s}function Oi(t,e,n,r,a){var i=Pt(n,r);return Di(t,e,i[0],i[1],a.internalFormatFloat,a.textureFormatFloat,t.FLOAT)}function _i(t,e,n,r,a){var i=Pt(n,r);return Di(t,e,i[0],i[1],a.internalFormatHalfFloat,a.textureFormatFloat,a.textureTypeHalfFloat)}function Fi(t,e,n,r,a){var i=Pt(n,r);return Di(t,e,i[0],i[1],t.RGBA,t.RGBA,t.UNSIGNED_BYTE)}function Mi(t,e,n,r,a){var i=Vt(n,r);return Di(t,e,i[0],i[1],a.internalFormatPackedFloat,t.RGBA,t.FLOAT)}function zi(t,e,n,r,a){var i=Vt(n,r);return Di(t,e,i[0],i[1],a.internalFormatPackedHalfFloat,t.RGBA,a.textureTypeHalfFloat)}function Li(t,e,n,r){return jt(t,e,function(){return t.bindBuffer(t.ARRAY_BUFFER,r)}),ue(t,e,n,"clipSpacePos",r,3,20,0)&&ue(t,e,n,"uv",r,2,20,12)}function Bi(t,e,n,r,a,i,o){var s,u,l;jt(t,e,function(){return t.bindTexture(t.TEXTURE_2D,n)}),i instanceof Uint8Array?(s=new Uint8Array(r*a*4),u=t.UNSIGNED_BYTE,l=t.RGBA):(s=new Float32Array(r*a*4),u=t.FLOAT,l=o.internalFormatPackedFloat),s.set(i),jt(t,e,function(){return t.texImage2D(t.TEXTURE_2D,0,l,r,a,0,t.RGBA,u,s)}),jt(t,e,function(){return t.bindTexture(t.TEXTURE_2D,null)})}function Pi(t,e,n,r){jt(t,e,function(){return t.bindTexture(t.TEXTURE_2D,n)}),r.data instanceof Uint8Array?jt(t,e,function(){return t.texImage2D(t.TEXTURE_2D,0,t.RGBA,r.width,r.height,0,t.RGBA,t.UNSIGNED_BYTE,r.data)}):jt(t,e,function(){return t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,r)}),jt(t,e,function(){return t.bindTexture(t.TEXTURE_2D,null)})}function Wi(t,e,n,r,a){var i=t.createBuffer();jt(t,e,function(){return t.bindBuffer(t.PIXEL_PACK_BUFFER,i)});var o=16*n*r;return jt(t,e,function(){return t.bufferData(t.PIXEL_PACK_BUFFER,o,t.STREAM_READ)}),jt(t,e,function(){return t.readPixels(0,0,r,n,t.RGBA,t.FLOAT,0)}),jt(t,e,function(){return t.bindBuffer(t.PIXEL_PACK_BUFFER,null)}),i}function Vi(t,e,n){var r=t,a=new Float32Array(n);return r.bindBuffer(r.PIXEL_PACK_BUFFER,e),r.getBufferSubData(r.PIXEL_PACK_BUFFER,0,a),r.bindBuffer(r.PIXEL_PACK_BUFFER,null),a}function Ui(t,e,n,r,a){var i=Pt(n,r),o=i[0],s=i[1],u=new Uint8Array(n*r*4);return jt(t,e,function(){return t.readPixels(0,0,o,s,a.downloadTextureFormat,t.UNSIGNED_BYTE,u)}),new Float32Array(u.buffer)}function ji(t,e,n,r,a,i,o,s){var u=t,l=new Float32Array(function(t,e){var n=Vt(i,o);return n[0]*n[1]*4}());return u.bindBuffer(u.PIXEL_PACK_BUFFER,e),u.getBufferSubData(u.PIXEL_PACK_BUFFER,0,l),u.bindBuffer(u.PIXEL_PACK_BUFFER,null),l}function Gi(t,e,n,r){var a=new Float32Array(n*r*4);return jt(t,e,function(){return t.readPixels(0,0,r,n,t.RGBA,t.FLOAT,a)}),a}var qi=Object.freeze({createVertexShader:Ai,createVertexBuffer:Ri,createIndexBuffer:Ti,createFloat32MatrixTexture:Oi,createFloat16MatrixTexture:_i,createUnsignedBytesMatrixTexture:Fi,createPackedMatrixTexture:Mi,createFloat16PackedMatrixTexture:zi,bindVertexProgramAttributeStreams:Li,uploadDenseMatrixToTexture:Bi,uploadPixelDataToTexture:Pi,createBufferFromOutputTexture:Wi,downloadFloat32MatrixFromBuffer:Vi,downloadByteEncodedFloatMatrixFromOutputTexture:Ui,downloadPackedMatrixFromBuffer:ji,downloadMatrixFromPackedOutputTexture:Gi}),Hi=function(){function t(t){this.outputTexture=null,this.program=null,this.disposed=!1,this.vertexAttrsAreBound=!1,this.itemsToPoll=[];var e=o().getNumber("WEBGL_VERSION");if(null!=t?(this.gl=t,zt(e,t)):this.gl=Lt(e),1===o().getNumber("WEBGL_VERSION"))this.textureFloatExtension=Xt(this.gl,this.debug,"OES_texture_float"),this.colorBufferFloatExtension=this.gl.getExtension("WEBGL_color_buffer_float"),this.textureHalfFloatExtension=Xt(this.gl,this.debug,"OES_texture_half_float"),this.colorBufferHalfFloatExtension=this.gl.getExtension("EXT_color_buffer_half_float");else if(Ae(this.gl,"EXT_color_buffer_float"))this.colorBufferFloatExtension=this.gl.getExtension("EXT_color_buffer_float");else{if(!Ae(this.gl,"EXT_color_buffer_half_float"))throw new Error("GL context does not support color renderable floats");this.colorBufferHalfFloatExtension=this.gl.getExtension("EXT_color_buffer_half_float")}this.vertexBuffer=Ri(this.gl,this.debug),this.indexBuffer=Ti(this.gl,this.debug),this.framebuffer=se(this.gl,this.debug),this.textureConfig=Ut(this.gl,this.textureHalfFloatExtension)}return Object.defineProperty(t.prototype,"debug",{get:function(){return o().getBool("DEBUG")},enumerable:!0,configurable:!0}),t.prototype.dispose=function(){var t=this;if(!this.disposed){null!=this.program&&console.warn("Disposing a GPGPUContext that still has a bound WebGLProgram. This is probably a resource leak, delete the program with GPGPUContext.deleteProgram before disposing."),null!=this.outputTexture&&console.warn("Disposing a GPGPUContext that still has a bound output matrix texture. This is probably a resource leak, delete the output matrix texture with GPGPUContext.deleteMatrixTexture before disposing.");var e=this.gl;jt(e,this.debug,function(){return e.finish()}),jt(e,this.debug,function(){return e.bindFramebuffer(e.FRAMEBUFFER,null)}),jt(e,this.debug,function(){return e.deleteFramebuffer(t.framebuffer)}),jt(e,this.debug,function(){return e.bindBuffer(e.ARRAY_BUFFER,null)}),jt(e,this.debug,function(){return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null)}),jt(e,this.debug,function(){return e.deleteBuffer(t.indexBuffer)}),this.disposed=!0}},t.prototype.createFloat32MatrixTexture=function(t,e){return this.throwIfDisposed(),Oi(this.gl,this.debug,t,e,this.textureConfig)},t.prototype.createFloat16MatrixTexture=function(t,e){return this.throwIfDisposed(),_i(this.gl,this.debug,t,e,this.textureConfig)},t.prototype.createUnsignedBytesMatrixTexture=function(t,e){return this.throwIfDisposed(),Fi(this.gl,this.debug,t,e,this.textureConfig)},t.prototype.uploadPixelDataToTexture=function(t,e){this.throwIfDisposed(),Pi(this.gl,this.debug,t,e)},t.prototype.uploadDenseMatrixToTexture=function(t,e,n,r){this.throwIfDisposed(),Bi(this.gl,this.debug,t,e,n,r,this.textureConfig)},t.prototype.createFloat16PackedMatrixTexture=function(t,e){return this.throwIfDisposed(),zi(this.gl,this.debug,t,e,this.textureConfig)},t.prototype.createPackedMatrixTexture=function(t,e){return this.throwIfDisposed(),Mi(this.gl,this.debug,t,e,this.textureConfig)},t.prototype.deleteMatrixTexture=function(t){var e=this;this.throwIfDisposed(),this.outputTexture===t&&(de(this.gl,this.debug,this.framebuffer),this.outputTexture=null),jt(this.gl,this.debug,function(){return e.gl.deleteTexture(t)})},t.prototype.downloadByteEncodedFloatMatrixFromOutputTexture=function(t,e,n){var r=this;return this.downloadMatrixDriver(t,function(){return Ui(r.gl,r.debug,e,n,r.textureConfig)})},t.prototype.downloadPackedMatrixFromBuffer=function(t,e,n,r,a,i){return ji(this.gl,t,0,0,0,a,i,this.textureConfig)},t.prototype.downloadFloat32MatrixFromBuffer=function(t,e){return Vi(this.gl,t,e)},t.prototype.createBufferFromTexture=function(t,e,n){this.bindTextureToFrameBuffer(t);var r=Wi(this.gl,this.debug,e,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),r},t.prototype.createAndWaitForFence=function(){var t=this.createFence(this.gl);return this.pollFence(t)},t.prototype.createFence=function(t){var e,n,r=this;if(o().getBool("WEBGL_FENCE_API_ENABLED")){var a=t,i=a.fenceSync(a.SYNC_GPU_COMMANDS_COMPLETE,0);t.flush(),n=function(){var t=a.clientWaitSync(i,0,0);return t===a.ALREADY_SIGNALED||t===a.CONDITION_SATISFIED},e=i}else o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(e=this.beginQuery(),this.endQuery(),n=function(){return r.isQueryAvailable(e,o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}):n=function(){return!0};return{query:e,isFencePassed:n}},t.prototype.downloadMatrixFromPackedTexture=function(t,e,n){var r=this;return this.downloadMatrixDriver(t,function(){return Gi(r.gl,r.debug,e,n)})},t.prototype.createProgram=function(t){this.throwIfDisposed();var e=this.gl,n=Yt(e,this.debug,t),r=Ai(e,this.debug),a=te(e,this.debug);return jt(e,this.debug,function(){return e.attachShader(a,r)}),jt(e,this.debug,function(){return e.attachShader(a,n)}),ee(e,this.debug,a),this.debug&&ne(e,this.debug,a),this.vertexAttrsAreBound||(this.setProgram(a),this.vertexAttrsAreBound=Li(e,this.debug,this.program,this.vertexBuffer)),a},t.prototype.deleteProgram=function(t){var e=this;this.throwIfDisposed(),t===this.program&&(this.program=null),null!=t&&jt(this.gl,this.debug,function(){return e.gl.deleteProgram(t)})},t.prototype.setProgram=function(t){var e=this;this.throwIfDisposed(),this.program=t,null!=this.program&&this.debug&&ne(this.gl,this.debug,this.program),jt(this.gl,this.debug,function(){return e.gl.useProgram(t)})},t.prototype.getUniformLocation=function(t,e,n){return void 0===n&&(n=!0),this.throwIfDisposed(),n?ce(this.gl,this.debug,t,e):pe(this.gl,t,e)},t.prototype.getAttributeLocation=function(t,e){var n=this;return this.throwIfDisposed(),jt(this.gl,this.debug,function(){return n.gl.getAttribLocation(t,e)})},t.prototype.getUniformLocationNoThrow=function(t,e){return this.throwIfDisposed(),this.gl.getUniformLocation(t,e)},t.prototype.setInputMatrixTexture=function(t,e,n){this.throwIfDisposed(),this.throwIfNoProgram(),he(this.gl,this.debug,this.program,t,e,n)},t.prototype.setOutputMatrixTexture=function(t,e,n){this.setOutputMatrixTextureDriver(t,n,e)},t.prototype.setOutputPackedMatrixTexture=function(t,e,n){this.throwIfDisposed();var r=Vt(e,n),a=r[0],i=r[1];this.setOutputMatrixTextureDriver(t,a,i)},t.prototype.setOutputMatrixWriteRegion=function(t,e,n,r){this.setOutputMatrixWriteRegionDriver(n,t,r,e)},t.prototype.setOutputPackedMatrixWriteRegion=function(t,e,n,r){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")},t.prototype.debugValidate=function(){null!=this.program&&ne(this.gl,this.debug,this.program),me(this.gl)},t.prototype.executeProgram=function(){this.throwIfDisposed(),this.throwIfNoProgram();var t=this.gl;this.debug&&this.debugValidate(),jt(t,this.debug,function(){return t.drawElements(t.TRIANGLES,6,t.UNSIGNED_SHORT,0)})},t.prototype.blockUntilAllProgramsCompleted=function(){var t=this;this.throwIfDisposed(),jt(this.gl,this.debug,function(){return t.gl.finish()})},t.prototype.getQueryTimerExtension=function(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=Xt(this.gl,this.debug,2===o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension},t.prototype.getQueryTimerExtensionWebGL2=function(){return this.getQueryTimerExtension()},t.prototype.getQueryTimerExtensionWebGL1=function(){return this.getQueryTimerExtension()},t.prototype.beginQuery=function(){if(2===o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){var t=this.gl,e=this.getQueryTimerExtensionWebGL2(),n=t.createQuery();return t.beginQuery(e.TIME_ELAPSED_EXT,n),n}var r=this.getQueryTimerExtensionWebGL1(),a=r.createQueryEXT();return r.beginQueryEXT(r.TIME_ELAPSED_EXT,a),a},t.prototype.endQuery=function(){if(2!==o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){var t=this.getQueryTimerExtensionWebGL1();t.endQueryEXT(t.TIME_ELAPSED_EXT)}else{var e=this.gl,n=this.getQueryTimerExtensionWebGL2();e.endQuery(n.TIME_ELAPSED_EXT)}},t.prototype.waitForQueryAndGetTime=function(t){return r(this,void 0,void 0,function(){var e=this;return a(this,function(n){switch(n.label){case 0:return[4,k(function(){return e.disposed||e.isQueryAvailable(t,o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))})];case 1:return n.sent(),[2,this.getQueryTime(t,o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))]}})})},t.prototype.getQueryTime=function(t,e){if(0===e)return null;if(2===e){var n=this.gl;return n.getQueryParameter(t,n.QUERY_RESULT)/1e6}var r=this.getQueryTimerExtensionWebGL1();return r.getQueryObjectEXT(t,r.QUERY_RESULT_EXT)/1e6},t.prototype.isQueryAvailable=function(t,e){if(0===e)return!0;if(2===e){var n=this.gl,r=this.getQueryTimerExtensionWebGL2(),a=n.getQueryParameter(t,n.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(r.GPU_DISJOINT_EXT)),a&&!this.disjoint}return a=(r=this.getQueryTimerExtensionWebGL1()).getQueryObjectEXT(t,r.QUERY_RESULT_AVAILABLE_EXT),null==this.disjoint&&(this.disjoint=this.gl.getParameter(r.GPU_DISJOINT_EXT)),a&&!this.disjoint},t.prototype.pollFence=function(t){var e=this;return new Promise(function(n){e.addItemToPoll(function(){return t.isFencePassed()},function(){return n()})})},t.prototype.pollItems=function(){for(var t=function(t){for(var e=0;e1||k(function(){return n.pollItems(),0===n.itemsToPoll.length})},t.prototype.bindTextureToFrameBuffer=function(t){this.throwIfDisposed(),fe(this.gl,this.debug,t,this.framebuffer),this.debug&&me(this.gl)},t.prototype.unbindTextureToFrameBuffer=function(){null!=this.outputTexture?(fe(this.gl,this.debug,this.outputTexture,this.framebuffer),this.debug&&me(this.gl)):de(this.gl,this.debug,this.framebuffer)},t.prototype.downloadMatrixDriver=function(t,e){this.bindTextureToFrameBuffer(t);var n=e();return this.unbindTextureToFrameBuffer(),n},t.prototype.setOutputMatrixTextureDriver=function(t,e,n){this.throwIfDisposed();var r=this.gl;fe(r,this.debug,t,this.framebuffer),this.debug&&me(r),this.outputTexture=t,jt(r,this.debug,function(){return r.viewport(0,0,e,n)}),jt(r,this.debug,function(){return r.scissor(0,0,e,n)})},t.prototype.setOutputMatrixWriteRegionDriver=function(t,e,n,r){var a=this;this.throwIfDisposed(),jt(this.gl,this.debug,function(){return a.gl.scissor(t,e,n,r)})},t.prototype.throwIfDisposed=function(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")},t.prototype.throwIfNoProgram=function(){if(null==this.program)throw new Error("No GPU program is currently set.")},t}();function Ki(t,e){if(t.length!==e.length)throw Error("Binary was compiled with "+t.length+" inputs, but was executed with "+e.length+" inputs");t.forEach(function(t,n){var r=t.logicalShape,a=e[n],i=a.shape;if(!w(r,i))throw Error("Binary was compiled with different shapes than the current args. Shapes "+r+" and "+i+" must match");if(!t.isUniform||!a.isUniform){var o=t.texShape,s=a.isUniform?null:a.texData.texShape;if(!w(o,s))throw Error("Binary was compiled with different texture shapes than the current args. Shape "+o+" and "+s+" must match")}})}var Xi=function(t,e,n){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t;for(var r=n.filterWidth,a=n.inChannels,i=n.strideWidth,o=n.strideHeight,s=n.padInfo,u=n.outWidth,l=n.dilationWidth,c=n.dilationHeight,p=n.dataFormat,h=s.left,f=s.top,d=a*r,m=Ca(),g="channelsLast"===p,v=g?0:1,y=g?1:2,b="",x=0;x<=1;x++)for(var w=0;w<=1;w++)b+="\n blockIndex = rc.y + "+w+";\n pos = rc.x + "+x+";\n\n if(blockIndex < "+t[1]+" && pos < "+t[0]+") {\n offsetY = int(blockIndex / ("+u+")) * "+o+" - "+f+";\n d0 = offsetY + "+c+" * (pos / "+d+");\n\n if(d0 < "+e[v]+" && d0 >= 0) {\n\n offsetX = int(mod(float(blockIndex), "+u+".) * "+i+". - "+h+".);\n d1 = offsetX + "+l+" * (int(mod(float(pos), "+d+".) / "+a+".));\n\n if(d1 < "+e[y]+" && d1 >= 0) {\n\n ch = int(mod(float(pos), "+a+".));\n\n if ("+g+") {\n innerDims = vec2(d1, ch);\n result["+(2*x+w)+"] = getChannel(\n getA(d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result["+(2*x+w)+"] = getChannel(\n getA(ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n ";this.userCode="\n void main() {\n ivec2 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n "+b+"\n\n "+m.output+" = result;\n }\n "},$i=function(t,e,n,r,a){this.variableNames=["x"],this.outputShape=[];var i,o=e,s=t[3]-1;this.outputShape=t;var u="float("+n+") + float("+r+") * sum";i=.5===a?"inversesqrt("+u+")":1===a?"1.0/("+u+")":"exp(log("+u+") * float(-"+a+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -"+o+"; j <= "+o+"; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= "+s+") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * "+i+";\n setOutput(val);\n }\n "},Yi=function(t,e,n,r,a){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=t,this.depth=t[3],this.depthRadius=e,this.bias=n,this.alpha=r,this.beta=a,this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < "+this.depth+"; ++d) {\n int depthBegin = int(max(0.0, float(d - "+e+")));\n int depthEnd = int(min(float("+this.depth+"),\n float(d + "+e+" + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = "+this.depth+";\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float("+r+") * norm + float("+n+");\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float("+r+")\n * float("+a+")\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * "+a+");\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n "},Ji=function(t,e,n,r,a){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;var i,o=e,s=t[3]-1;this.outputShape=t;var u="float("+n+") + float("+r+") * sum";i=.5===a?"inversesqrt("+u+")":1===a?"1.0/("+u+")":"exp(log("+u+") * float(-"+a+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < "+this.outputShape[3]+";\n bool hasNextRow = c < "+this.outputShape[2]+";\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - "+o+";\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - "+o+"; j <= "+o+"; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2("+s+"));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * "+i+";\n setOutput(result);\n }\n "},Zi=function(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var e=t.strideHeight,n=t.strideWidth,r=t.dilationHeight,a=t.effectiveFilterHeight,i=t.effectiveFilterWidth,o=a-1-t.padInfo.top,s=i-1-t.padInfo.left,u=a*i-1;this.userCode="\n const ivec2 pads = ivec2("+o+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+a+";\n wR += "+r+") {\n float dyR = float(dyRCorner + wR) / "+e+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+i+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+n+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = "+u+" - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * "+i+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n "},Qi=function(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var e=t.strideDepth,n=t.strideHeight,r=t.strideWidth,a=t.dilationDepth,i=t.dilationHeight,o=t.dilationWidth,s=t.effectiveFilterDepth,u=t.effectiveFilterHeight,l=t.effectiveFilterWidth,c=s-1-t.padInfo.front,p=u-1-t.padInfo.top,h=l-1-t.padInfo.left,f=s*u*l-1;this.userCode="\n const ivec3 pads = ivec3("+c+", "+p+", "+h+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < "+s+";\n wD += "+a+") {\n float dyD = float(dyDCorner + wD) / "+e+".0;\n\n if (dyD < 0.0 || dyD >= "+t.outDepth+".0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < "+u+";\n wR += "+i+") {\n float dyR = float(dyRCorner + wR) / "+n+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+l+";\n wC += "+o+") {\n float dyC = float(dyCCorner + wC) / "+r+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = "+f+" -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * "+u+" * "+l+" +\n wR * "+l+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n "},to=function(t,e,n,r,a,i,o){void 0===n&&(n=!1),void 0===r&&(r=!1),void 0===a&&(a=!1),void 0===i&&(i=null),void 0===o&&(o=!1),this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e;var s=n?t[1]:t[2],u=Math.ceil(s/2),l=n?"i * 2, rc.y":"rc.y, i * 2",c=r?"rc.z, i * 2":"i * 2, rc.z",p=n?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],h=r?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"],f="",d="";i&&(f=o?"vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n "+i+"\n }":"vec4 activation(vec4 x) {\n "+i+"\n }",d="result = activation(result);");var m=a?"result += getBiasAtOutCoords();":"";a&&this.variableNames.push("bias"),o&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+f+"\n\n const float sharedDimension = "+u+".0;\n\n vec4 dot2x2ARowBCol(ivec3 rc) {\n vec4 result = vec4(0);\n for (int i = 0; i < "+u+"; i++) {\n vec4 a = getMatrixA(rc.x, "+l+");\n vec4 b = getMatrixB(rc.x, "+c+");\n\n // These swizzled products need to be separately added.\n // See: https://github.com/tensorflow/tfjs/issues/1735\n result += ("+p[0]+" * "+h[0]+");\n result += ("+p[1]+" * "+h[1]+");\n }\n return result;\n }\n\n void main() {\n ivec3 rc = getOutputCoords();\n vec4 result = dot2x2ARowBCol(rc);\n\n "+m+"\n\n "+d+"\n\n setOutput(result);\n }\n "},eo=function(){function t(t,e,n){this.variableNames=["probs"],this.outputShape=[t,n],this.userCode="\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < "+(e-1)+"; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float("+(e-1)+"));\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var e=this;return function(n,r){null==e.seedLoc&&(e.seedLoc=n.getUniformLocation(r,"seed")),n.gl.uniform1f(e.seedLoc,t)}},t}(),no=function(t,e,n,r){this.variableNames=["indices"],this.outputShape=[t,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float("+r+"), float("+n+"),\n float(index == coords.y)));\n }\n "},ro=function(t){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outputShape=t;var e=t.length;if(0===e)this.userCode="\n void main() {\n setOutput(vec4(getA(), 0., 0., 0.));\n }\n ";else{var n=wa("rc",e),r=_a(e),a=function(t,e,n){if(1===t)return"rc > "+e[0];for(var r="",a=t-2;a= "+e[a],a= "+e+";\n bool rEdge = rp1 >= "+n+";\n "}(e,t[t.length-1],t[t.length-2],n),o=function(t,e){var n=t.length,r=function(t,e){for(var n=[],r=0;r<=1;r++)for(var a=0;a<=1;a++){for(var i=(0===r?"r":"rp1")+", "+(0===a?"c":"cp1"),o=2;o= "+t[0]+" ? 0. : getA(rc + 1),\n 0, 0":"getA("+r[0]+"),\n cEdge ? 0. : getA("+r[1]+"),\n rEdge ? 0. : getA("+r[2]+"),\n rEdge || cEdge ? 0. : getA("+r[3]+")"}(t,n);this.userCode="\n void main() {\n "+r+" rc = getOutputCoords();\n\n if("+a+") {\n setOutput(vec4(0));\n } else {\n "+i+"\n\n setOutput(vec4("+o+"));\n }\n }\n "}},ao=function(t,e,n){this.variableNames=["x"],this.outputShape=e.map(function(e,n){return e[0]+t[n]+e[1]});var r=t.length,a=_a(r),i=e.map(function(t){return t[0]}).join(","),o=e.map(function(e,n){return e[0]+t[n]}).join(","),s=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,r);this.userCode=1!==r?"\n "+a+" start = "+a+"("+i+");\n "+a+" end = "+a+"("+o+");\n\n void main() {\n "+a+" outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float("+n+"));\n } else {\n "+a+" coords = outC - start;\n setOutput(getX("+s+"));\n }\n }\n ":"\n int start = "+i+";\n int end = "+o+";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float("+n+"));\n } else {\n setOutput(getX(outC - start));\n }\n }\n "},io=function(t,e,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e.map(function(e,n){return e[0]+t[n]+e[1]});for(var r=t.length,a=_a(r),i=e.map(function(t){return t[0]}).join(","),o=e.map(function(e,n){return e[0]+t[n]}).join(","),s=wa("rc",r),u=wa("source",r),l=s[r-1]+" < "+this.outputShape[r-1],c=1===r?"source":"vec2("+u.slice(-2).join()+")",p=[a+" rc = outputLoc;",s[r-1]+" += 1;\n if("+l+") {\n ",1===r?"":"}\n rc = outputLoc;\n "+s[r-2]+" += 1;\n if("+s[r-2]+" < "+this.outputShape[r-2]+") {",1===r?"":" "+s[r-1]+" += 1;\n if("+l+") {"],h=1===r?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))",f="",d=0,m=1===r?2:4;d= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+l+";\n wC += "+s+") {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * "+l+" + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var d=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===e&&(d="avgValue / count");var m=4*Math.floor(r/4),g=r%4,v="\n if ("+h+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec2 strides = ivec2("+a+", "+i+");\n const ivec2 pads = ivec2("+c+", "+p+");\n const float initializationValue = "+f+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4("+f+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < "+u+";\n wR += "+o+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+m+"; wC += 4) {\n int xC = xCCorner + wC * "+s+";\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n getValue(batch, xR, xC + 2 * "+s+", d),\n getValue(batch, xR, xC + 3 * "+s+", d)\n );\n\n "+v+"\n }\n\n int xC = xCCorner + "+m+";\n if ("+(1===g)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+v+"\n } else if ("+(2===g)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n initializationValue,\n initializationValue\n );\n\n "+v+"\n } else if ("+(3===g)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n getValue(batch, xR, xC + 2 * "+s+", d),\n initializationValue\n );\n\n "+v+"\n }\n }\n setOutput("+d+");\n }\n "}},so=function(t,e,n){if(this.variableNames=["x"],"avg"===e&&n)throw new Error("Cannot compute positions for average pool.");var r=t.filterWidth,a=t.strideDepth,i=t.strideHeight,o=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,l=t.dilationWidth,c=t.effectiveFilterDepth,p=t.effectiveFilterHeight,h=t.effectiveFilterWidth,f=t.padInfo.front,d=t.padInfo.top,m=t.padInfo.left;this.outputShape=t.outShape;var g="avg"===e,v="0.0";if(g||(v="-1.0 / 1e-20"),n)this.userCode="\n const ivec3 strides =\n ivec3("+a+", "+i+", "+o+");\n const ivec3 pads = ivec3("+f+", "+d+", "+m+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < "+c+";\n wD += "+s+") {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+p+";\n wR += "+u+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+h+";\n wC += "+l+") {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition =\n wD * "+p+" * "+h+" +\n wR * "+h+" + wC;;\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var y=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===e&&(y="avgValue / count");var b=4*Math.floor(r/4),x=r%4,w="\n if ("+g+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec3 strides =\n ivec3("+a+", "+i+", "+o+");\n const ivec3 pads = ivec3("+f+", "+d+", "+m+");\n const float initializationValue = "+v+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4("+v+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < "+c+";\n wD += "+s+") {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+p+";\n wR += "+u+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+b+"; wC += 4) {\n int xC = xCCorner + wC * "+l+";\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+l+", ch),\n getValue(batch, xD, xR, xC + 2 * "+l+", ch),\n getValue(batch, xD, xR, xC + 3 * "+l+", ch)\n );\n\n "+w+"\n }\n\n int xC = xCCorner + "+b+";\n if ("+(1===x)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+w+"\n } else if ("+(2===x)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+l+", ch),\n initializationValue,\n initializationValue\n );\n\n "+w+"\n } else if ("+(3===x)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+l+", ch),\n getValue(batch, xD, xR, xC + 2 * "+l+", ch),\n initializationValue\n );\n\n "+w+"\n }\n }\n setOutput("+y+");\n }\n }\n "}},uo=function(t,e){this.variableNames=["x"];var n=t.windowSize,r=t.batchSize,a=t.inSize,i=Math.ceil(a/n);this.outputShape=[r,i];var o="0.0",s="";"prod"===e?o="1.0":"min"===e?(o="1.0 / 1e-20",s="min"):"max"===e&&(o="-1.0 / 1e-20",s="max");var u=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"sum"===e?u="sumValue":"prod"===e?u="prodValue":"all"===e?u="allValue":"any"===e&&(u="anyValue");var l=4*Math.floor(n/4),c=n%4,p="\n if ("+("sum"===e)+") {\n sumValue += dot(values, ones);\n } else if ("+("prod"===e)+") {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = "+s+"(values, minMaxValue);\n }\n ",h="vec4";"all"===e?(o="1.0",p="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",h="bvec4"):"any"===e&&(o="0.0",p="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",h="bvec4");var f="";a%n>0&&(f="\n if (inIdx < 0 || inIdx >= "+a+") {\n return initializationValue;\n }\n "),this.userCode="\n const float initializationValue = "+o+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n "+f+"\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+n+";\n\n vec4 minMaxValue = vec4("+o+");\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < "+l+"; i += 4) {\n int inIdx = inOffset + i;\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n "+p+"\n }\n\n int inIdx = inOffset + "+l+";\n if ("+(1===c)+") {\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+p+"\n } else if ("+(2===c)+") {\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n "+p+"\n } else if ("+(3===c)+") {\n "+h+" values = "+h+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n "+p+"\n }\n setOutput("+u+");\n }\n "},lo=function(t,e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t;for(var n="",r=0;r<4;r++){var a="thisRC = rc;";r%2==1&&(a+="thisRC.z += 1;"),r>1&&(a+="thisRC.y += 1;"),n+="\n "+a+"\n "+(r>0?"if(thisRC.y < rows && thisRC.z < cols){":"")+"\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result["+r+"] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n "+(r>0?"}":"")+"\n "}this.userCode="\n \n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n "+Na(["r","c","d"],e)+"\n return ivec3(r, c, d);\n }\n \n "+Sa(t)+"\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = "+t[1]+";\n int cols = "+t[2]+";\n\n "+n+"\n\n setOutput(result);\n }\n "},co=function(t,e,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=e.shape;var r=e.shape,a=r[1],i=r[2],o=t.shape,s=o[1],u=o[2],l=[n&&s>1?a-1:a,n&&u>1?i-1:i],c=[n&&s>1?s-1:s,n&&u>1?u-1:u],p=l[0]/c[0],h=l[1]/c[1],f=1/p,d=1/h,m=2*Math.ceil(f)+2,g=2*Math.ceil(d)+2;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float("+p+");\n const float widthScale = float("+h+");\n\n const float invHeightScale = float("+f+");\n const float invWidthScale = float("+d+");\n\n const int winHeight = int("+m+");\n const int winWidth = int("+g+");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), "+(a-1)+".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), "+(i-1)+".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "},po=function(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var a=t[0],i=t[1],o=t[2],s=t[3];this.outputShape=[a,e,n,s];var u=[r&&e>1?i-1:i,r&&n>1?o-1:o],l=[r&&e>1?e-1:e,r&&n>1?n-1:n];this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+u[0]/l[0]+",\n "+u[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+i+".0, "+o+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(sourceFracIndexRC);\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n "},ho=function(t,e,n,r){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];var a=t[0],i=t[1],o=t[2],s=t[3];this.outputShape=[a,e,n,s];var u=[r&&e>1?i-1:i,r&&n>1?o-1:o],l=[r&&e>1?e-1:e,r&&n>1?n-1:n];this.userCode="\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n "+u[0]/l[0]+",\n "+u[1]/l[1]+",\n "+u[1]/l[1]+");\n const vec3 inputShapeRC = vec3("+i+".0, "+o+".0,\n "+o+".0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = vec3(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(sourceFracIndexRC);\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < "+(s-1)+";\n bool hasNextRow = coords.z < "+(n-1)+";\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n "},fo=function(t,e,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=e.shape;var r=e.shape,a=r[1],i=r[2],o=t.shape,s=o[1],u=o[2],l=[n&&s>1?a-1:a,n&&u>1?i-1:i],c=[n&&s>1?s-1:s,n&&u>1?u-1:u],p=l[0]/c[0],h=l[1]/c[1],f=1/p,d=1/h,m=2*Math.ceil(f)+2,g=2*Math.ceil(d)+2;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float("+p+");\n const float widthScale = float("+h+");\n\n const float invHeightScale = float("+f+");\n const float invWidthScale = float("+d+");\n\n const int winHeight = int("+m+");\n const int winWidth = int("+g+");\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float sourceFracRow =\n float("+l[0]+") *\n (float(dyR) / float("+c[0]+"));\n\n float sourceFracCol =\n float("+l[1]+") *\n (float(dyC) / float("+c[1]+"));\n\n int sourceNearestRow = int(min(\n float(int("+a+") - 1),\n "+n+" ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int("+i+") - 1),\n "+n+" ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "},mo=function(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var a=t[0],i=t[1],o=t[2],s=t[3];this.outputShape=[a,e,n,s];var u=[r&&e>1?i-1:i,r&&n>1?o-1:o],l=[r&&e>1?e-1:e,r&&n>1?n-1:n],c=r?"0.5":"0.0";this.userCode="\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n "+u[0]/l[0]+",\n "+u[1]/l[1]+");\n const vec2 inputShapeRC = vec2("+i+".0, "+o+".0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = vec2(yRC) * effectiveInputOverOutputRatioRC;\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + "+c+")));\n\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n "},go=function(t,e){this.variableNames=["x"];var n=t.length;if(n>4)throw new Error("WebGL backend: Reverse of rank-"+n+" tensor is not yet supported");if(this.outputShape=t,1!==n){var r=t.map(function(n,r){return function(n){return-1!==e.indexOf(n)&&1!==t[n]?t[n]+" - coords["+n+"] - 1":"coords["+n+"]"}(r)}).join(","),a=_a(n);this.userCode="\n void main() {\n "+a+" coords = getOutputCoords();\n setOutput(getX("+r+"));\n }\n "}else this.userCode="\n void main() {\n int coord = getOutputCoords();\n setOutput(getX("+t[0]+" - coord - 1));\n }\n "},vo=function(t,e){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;var n=t.length;if(n>4)throw new Error("WebGL backend: Reverse of rank-"+n+" tensor is not yet supported");this.outputShape=t;var r=wa("rc",n),a=r[n-1]+" + 1 < "+this.outputShape[n-1],i=r[n-2]+" + 1 < "+this.outputShape[n-2],o=_a(n);function s(n){var r=t.map(function(r,a){return function(n,r){return-1!==e.indexOf(n)&&1!==t[n]?t[n]+" - "+r[n]+" - 1":""+r[n]}(a,n)});return"getChannel(getX("+r.join(",")+"), vec2("+r.slice(-2).join(",")+"))"}this.userCode=1===n?"\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX("+t[0]+" - rc - 1),\n "+t[0]+" - rc - 1);\n if("+a+"){\n result.g = getChannel(getX("+t[0]+" - (rc + 1) - 1),\n "+t[0]+" - (rc + 1) - 1);\n }\n setOutput(result);\n }\n ":"\n void main() {\n "+o+" rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = "+s(r.slice())+";\n if("+a+"){\n result.g = "+function(t){return t[n-1]="("+t[n-1]+" + 1)",s(t)}(r.slice())+";\n }\n if("+i+") {\n result.b = "+function(t){return t[n-2]="("+t[n-2]+" + 1)",s(t)}(r.slice())+";\n if("+a+") {\n result.a = "+function(t){return t[n-1]="("+t[n-1]+" + 1)",t[n-2]="("+t[n-2]+" + 1)",s(t)}(r.slice())+";\n }\n }\n setOutput(result);\n }\n "},yo=function(t,e,n,r,a,i,o){void 0===o&&(o=!0),this.variableNames=["updates","indices","defaultValue"],this.outputShape=i;var s=_a(a.length),u=_a(i.length),l="";1===n?l="i":2===n&&(l="i, j");var c="getIndices("+l+")",p="";1===r?p="i":2===r&&(p="i, coords[1]");var h="getUpdates("+p+")",f=e>1?"strides[j]":"strides";this.userCode="\n "+s+" strides = "+s+"("+a+");\n\n void main() {\n "+u+" coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < "+t+"; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < "+e+"; j++) {\n int index = round("+c+");\n flattenedIndex += index * "+f+";\n }\n if (flattenedIndex == coords[0]) {\n sum += "+h+";\n found = true;\n }\n }\n setOutput(mix(getDefaultValue(), sum, float(found)));\n }\n "},bo=function(t,e){this.variableNames=["x","segmentIds"];var n=t.windowSize,r=t.batchSize,a=t.inSize,i=t.numSegments,o=i*Math.ceil(a/n);this.outputShape=[r,o];var s=4*Math.floor(n/4),u=n%4,l="\n sumValue += dot(values, segFilter);\n ",c="";a%n>0&&(c="\n if (inIdx < 0 || inIdx >= "+a+") {\n return initializationValue;\n }\n ");var p="";a%n>0&&(p="\n if (inIdx < 0 || inIdx >= "+a+") {\n return -1.0;\n }\n "),this.userCode="\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n "+c+"\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n "+p+"\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n "+i+")) * float("+n+"));\n int currentSeg = int(mod(float(outIdx), float("+i+")));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < "+s+"; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n "+l+"\n }\n\n int inIdx = inOffset + "+s+";\n if ("+(1===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(2===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n "+l+"\n } else if ("+(3===u)+") {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n "+l+"\n }\n setOutput(sumValue);\n }\n "},xo=function(t,e,n){var r,a;if(this.variableNames=["c","a","b"],this.outputShape=e,n>4)throw Error("Where for rank "+n+" is not yet supported");if(1===n)a="resRC",r="resRC";else{for(var i=["resRC.x","resRC.y","resRC.z","resRC.w"],o=[],s=[],u=0;u= 1.0) {\n setOutput(getA("+a+"));\n } else {\n setOutput(getB("+a+"));\n }\n }\n "},wo=function(){function t(t){this.variableNames=["source"],this.outputShape=t,this.rank=t.length;var e,n=_a(this.rank),r="uniform int start["+this.rank+"];",a=function(t){if(1===t)return"sourceLoc";if(t<=6)return Co.slice(0,t).map(function(t){return"sourceLoc."+t}).join(",");throw Error("Slicing for rank "+t+" is not yet supported")}(this.rank);e="\n "+n+" sourceLoc;\n "+n+" coords = getOutputCoords();\n "+t.map(function(t,e){return"sourceLoc."+Co[e]+" = start["+e+"] + coords."+Co[e]+";"}).join("\n")+"\n ",this.userCode="\n "+r+"\n void main() {\n "+e+"\n setOutput(getSource("+a+"));\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var e=this;if(t.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+t.length+")");return function(n,r){null==e.startLoc&&(e.startLoc=n.getUniformLocationNoThrow(r,"start"),null==e.startLoc)||n.gl.uniform1iv(e.startLoc,t)}},t}(),Co=["x","y","z","w","u","v"],No=function(){function t(t){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t,this.rank=t.length;var e=_a(this.rank),n=wa("coords",this.rank),r=wa("sourceLoc",this.rank),a=1===this.rank?"sourceLoc":"vec2("+r.slice(-2).join()+")",i="getChannel(getSource("+r.join()+"), "+a+")",o="\n result.x = "+i+";\n if (++"+n[this.rank-1]+" < "+t[this.rank-1]+") {\n ++"+r[this.rank-1]+";\n result.y = "+i+";\n --"+r[this.rank-1]+";\n }\n ",s=1===this.rank?"":"\n --"+n[this.rank-1]+";\n if (++"+n[this.rank-2]+" < "+t[this.rank-2]+") {\n ++"+r[this.rank-2]+";\n result.z = "+i+";\n if (++"+n[this.rank-1]+" < "+t[this.rank-1]+") {\n ++"+r[this.rank-1]+";\n result.w = "+i+";\n }\n }\n ",u=this.rank<=4?"sourceLoc = coords +\n "+e+"("+t.map(function(t,e){return"start["+e+"]"}).join()+");":t.map(function(t,e){return r[e]+" = "+n[e]+" + start["+e+"];"}).join("\n");this.userCode="\n uniform int start["+this.rank+"];\n void main() {\n "+e+" coords = getOutputCoords();\n "+e+" sourceLoc;\n "+u+"\n vec4 result = vec4(0.);\n "+o+"\n "+s+"\n setOutput(result);\n }\n "}return t.prototype.getCustomSetupFunc=function(t){var e=this;if(t.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+t.length+")");return function(n,r){null==e.startLoc&&(e.startLoc=n.getUniformLocationNoThrow(r,"start"),null==e.startLoc)||n.gl.uniform1iv(e.startLoc,t)}},t}(),So=function(t,e,n){this.variableNames=["x"],this.outputShape=n;var r=n.length,a=_a(n.length),i=_a(n.length),o="";if(1===r)o="coords * strides + begin";else{var s=0;o=n.map(function(t,e){return s++,1===n.length?"coords * strides["+e+"] + begin["+e+"]":"coords["+(s-1)+"] * strides["+e+"] + begin["+e+"]"}).join(",")}this.userCode="\n "+a+" begin = "+a+"("+t+");\n "+a+" strides = "+a+"("+e+");\n\n void main() {\n "+i+" coords = getOutputCoords();\n setOutput(getX("+o+"));\n }\n "},Io=function(){function t(t){this.gpgpu=t,this.numUsedTextures=0,this.numFreeTextures=0,this.freeTextures={},this.logEnabled=!1,this.usedTextures={}}return t.prototype.acquireTexture=function(t,e,n){var r,a=ko(e,n),i=Eo(t,a,n);if(i in this.freeTextures||(this.freeTextures[i]=[]),i in this.usedTextures||(this.usedTextures[i]=[]),this.freeTextures[i].length>0){this.numFreeTextures--,this.numUsedTextures++,this.log();var o=this.freeTextures[i].shift();return this.usedTextures[i].push(o),o}return this.numUsedTextures++,this.log(),a===_t.PACKED_2X2_FLOAT32?r=this.gpgpu.createPackedMatrixTexture(t[0],t[1]):a===_t.PACKED_2X2_FLOAT16?r=this.gpgpu.createFloat16PackedMatrixTexture(t[0],t[1]):a===_t.UNPACKED_FLOAT32?r=this.gpgpu.createFloat32MatrixTexture(t[0],t[1]):a===_t.UNPACKED_FLOAT16?r=this.gpgpu.createFloat16MatrixTexture(t[0],t[1]):a===_t.PACKED_4X1_UNSIGNED_BYTE&&(r=this.gpgpu.createUnsignedBytesMatrixTexture(t[0],t[1])),this.usedTextures[i].push(r),r},t.prototype.releaseTexture=function(t,e,n,r){if(null!=this.freeTextures){var a=Eo(e,ko(n,r),r);a in this.freeTextures||(this.freeTextures[a]=[]),this.freeTextures[a].push(t),this.numFreeTextures++,this.numUsedTextures--;var i=this.usedTextures[a],o=i.indexOf(t);if(o<0)throw new Error("Cannot release a texture that was never provided by this texture manager");i.splice(o,1),this.log()}},t.prototype.log=function(){if(this.logEnabled){var t=this.numFreeTextures+this.numUsedTextures;console.log("Free/Used",this.numFreeTextures+" / "+this.numUsedTextures,"("+t+")")}},t.prototype.getNumUsedTextures=function(){return this.numUsedTextures},t.prototype.getNumFreeTextures=function(){return this.numFreeTextures},t.prototype.dispose=function(){var t=this;if(null!=this.freeTextures){for(var e in this.freeTextures)this.freeTextures[e].forEach(function(e){t.gpgpu.deleteMatrixTexture(e)});for(var e in this.usedTextures)this.usedTextures[e].forEach(function(e){t.gpgpu.deleteMatrixTexture(e)});this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0}},t}();function ko(t,e){if(t===Ot.UPLOAD)return _t.PACKED_2X2_FLOAT32;if(t===Ot.RENDER||null==t)return function(t){return o().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?t?_t.PACKED_2X2_FLOAT32:_t.UNPACKED_FLOAT32:t?_t.PACKED_2X2_FLOAT16:_t.UNPACKED_FLOAT16}(e);if(t===Ot.DOWNLOAD||t===Ot.PIXELS)return _t.PACKED_4X1_UNSIGNED_BYTE;throw new Error("Unknown logical texture type "+t)}function Eo(t,e,n){return t[0]+"_"+t[1]+"_"+e+"_"+n}var Ao=function(t,e){this.variableNames=["A"];for(var n=new Array(t.length),r=0;r5)throw Error("Tile for rank "+e+" is not yet supported");if(1===e)return"imod(resRC, "+t[0]+")";for(var n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],r=[],a=0;a6)throw Error("Transpose for rank "+e+" is not yet supported");for(var n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],r=new Array(e),a=0;a6)throw Error("Packed transpose for rank "+this.rank+" is not yet supported.");var a=_a(this.rank),i=xa("rc",this.rank),o=new Array(this.rank);for(r=0;r0?this.gpgpu.beginQuery():{startMs:$(),endMs:null}},e.prototype.endTimer=function(t){return o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(this.gpgpu.endQuery(),t):(t.endMs=$(),t)},e.prototype.getQueryTime=function(t){return r(this,void 0,void 0,function(){var e;return a(this,function(n){return o().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?[2,this.gpgpu.waitForQueryAndGetTime(t)]:[2,(e=t).endMs-e.startMs]})})},e.prototype.disposeData=function(t){if(!this.pendingDisposal.has(t)){if(this.pendingRead.has(t))return this.pendingDisposal.add(t),void this.pendingDeletes++;if(this.texData.has(t)){this.releaseGPUData(t);var e=this.texData.get(t).complexTensors;null!=e&&(e.real.dispose(),e.imag.dispose()),this.texData.delete(t)}}},e.prototype.releaseGPUData=function(t){var e=this.texData.get(t),n=e.texture,r=e.dtype,a=e.texShape,i=e.usage,o=e.isPacked,s=e.slice,u=s&&s.origDataId||t,l=this.dataRefCount.get(u);l>1?this.dataRefCount.set(u,l-1):(this.dataRefCount.delete(u),null!=n&&(this.numBytesInGPU-=this.computeBytes(a,r),this.textureManager.releaseTexture(n,a,i,o)));var c=this.texData.get(t);c.texture=null,c.texShape=null,c.isPacked=!1,c.slice=null},e.prototype.getTexture=function(t){return this.uploadToGPU(t),this.texData.get(t).texture},e.prototype.getDataInfo=function(t){return this.texData.get(t)},e.prototype.getCPUBackend=function(){return o().getBool("WEBGL_CPU_FORWARD")?(null==this.cpuBackend&&(this.cpuBackend=At.findBackend("cpu")),this.cpuBackend):null},e.prototype.shouldExecuteOnCPU=function(t,e){var n=this;return void 0===e&&(e=128),null!=this.getCPUBackend()&&t.every(function(t){return null==n.texData.get(t.dataId).texture&&t.sizeo().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){var a=Math.floor(t.length/2),i=this.concat(t.slice(0,a),e),s=this.concat(t.slice(a),e);return this.concat([i,s],e)}if(o().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&t[0].rank>1){var u=new Qa(t.map(function(t){return t.shape}),e);return this.compileAndRun(u,t)}var l=nn(t.map(function(t){return t.shape}),e),c=t.map(function(t){return t.as2D(-1,x(t.shape.slice(e)))}),p=new Za(c.map(function(t){return t.shape}));return this.compileAndRun(p,c).reshape(l)},e.prototype.neg=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.neg(t);if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,Wo,t.dtype);var e=new _o(t.shape,Wo);return this.compileAndRun(e,[t])},e.prototype.batchMatMul=function(t,e,n,r){var a=n?t.shape[2]:t.shape[1],i=r?e.shape[1]:e.shape[2],o=n?t.shape[1]:t.shape[2],s=t.shape[0];if((1===a||1===i)&&o>1e3){n&&(t=t.transpose([0,2,1])),r&&(e=e.transpose([0,2,1]));var u=1===i?t:t.as3D(s,o,1),l=1===i?2:1,c=1===i?e.as3D(s,1,o):e;return this.multiply(u,c).sum(l,!0)}var p=bt(t.dtype,e.dtype),h=new to(t.shape,[s,a,i],n,r);return this.compileAndRun(h,[t,e],p)},e.prototype.fusedBatchMatMul=function(t){var e=t.a,n=t.b,r=t.transposeA,a=t.transposeB,i=t.bias,o=t.activation,s=t.preluActivationWeights,u=r?e.shape[2]:e.shape[1],l=a?n.shape[1]:n.shape[2],c=e.shape[0],p=bt(e.dtype,n.dtype),h=null!=i,f=null!=s,d=o?Qo(o,!0):null,m=new to(e.shape,[c,u,l],r,a,h,d,f),g=[e,n];return i&&g.push(i),s&&g.push(s),this.compileAndRun(m,g,p)},e.prototype.multiply=function(t,e){if("complex64"===t.dtype){var n=this.texData.get(t.dataId),r=this.texData.get(e.dataId),a=new Va("return areal * breal - aimag * bimag;",t.shape,e.shape),i=new Va("return areal * bimag + aimag * breal;",t.shape,e.shape),s=[this.makeComplexComponentTensorInfo(t,n.complexTensors.real),this.makeComplexComponentTensorInfo(t,n.complexTensors.imag),this.makeComplexComponentTensorInfo(e,r.complexTensors.real),this.makeComplexComponentTensorInfo(e,r.complexTensors.imag)],u=this.compileAndRun(a,s),l=this.compileAndRun(i,s),c=this.complex(u,l);return u.dispose(),l.dispose(),c}if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.multiply(t,e);if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,Ga,t.dtype);var p=new Ha(Ga,t.shape,e.shape);return this.compileAndRun(p,[t,e],t.dtype)},e.prototype.batchNormalization=function(t,e,n,r,a,i){var s=[t,e,n],u=null;null!=i&&(u=i.shape,s.push(i));var l=null;if(null!=a&&(l=a.shape,s.push(a)),o().getBool("WEBGL_PACK_NORMALIZATION")){var c=new Wa(t.shape,e.shape,n.shape,u,l,r);return this.compileAndRun(c,s)}var p=new Pa(t.shape,e.shape,n.shape,u,l,r);return this.compileAndRun(p,s)},e.prototype.localResponseNormalization4D=function(t,e,n,r,a){var i=o().getBool("WEBGL_PACK_NORMALIZATION")?new Ji(t.shape,e,n,r,a):new $i(t.shape,e,n,r,a);return this.compileAndRun(i,[t])},e.prototype.LRNGrad=function(t,e,n,r,a,i,o){var s=new Yi(e.shape,r,a,i,o);return this.compileAndRun(s,[e,n,t])},e.prototype.tile=function(t,e){if("string"===t.dtype){var n=this.readSync(t.dataId).map(function(t){return Z(t)});return da(jn(t.shape,t.dtype,n),e)}var r=new Ao(t.shape,e);return this.compileAndRun(r,[t])},e.prototype.pad=function(t,e,n){var r=o().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new io(t.shape,e,n):new ao(t.shape,e,n);return this.compileAndRun(r,[t])},e.prototype.transpose=function(t,e){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.transpose(t,e);var n=o().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new To(t.shape,e):new Ro(t.shape,e);return this.compileAndRun(n,[t])},e.prototype.gather=function(t,e,n){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.gather(t,e,n);var r=new ki(t.shape,e.size,n);return this.compileAndRun(r,[t,e])},e.prototype.batchToSpaceND=function(t,e,n){g(t.rank<=4,function(){return"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"});var r=e.reduce(function(t,e){return t*e}),a=vr(t.shape,e,r),i=yr(a.length,e.length),o=br(t.shape,e,r),s=xr(n,e.length),u=wr(o,n,e.length);return t.reshape(a).transpose(i).reshape(o).slice(s,u)},e.prototype.spaceToBatchND=function(t,e,n){g(t.rank<=4,function(){return"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"});var r=e.reduce(function(t,e){return t*e}),a=[[0,0]];a.push.apply(a,n);for(var i=1+e.length;ie||n===t?r=!0:n=j(t,n+1);return n}(o,a),u=new bo({windowSize:s,inSize:o,batchSize:i,numSegments:a},e),l=this.compileAndRun(u,[t,n],r);return l.shape[1]===a?l:(n=Cn(0,a).tile([o/s]),this.segOpCompute(l,e,n,r,a))},e.prototype.argMinMaxReduce=function(t,e,n){var r=[e];if(Je("arg"+n.charAt(0).toUpperCase()+n.slice(1),r,t.rank),!o().getBool("WEBGL_PACK_REDUCE")||t.rank<=2){var a=$e(t.shape,r),i=a[0],s=x(a[1]),u=t.as2D(-1,s);return this.argReduce(u,n).reshape(i)}return this.argReducePacked(t,n)},e.prototype.argMin=function(t,e){return this.argMinMaxReduce(t,e,"min")},e.prototype.argMax=function(t,e){return this.argMinMaxReduce(t,e,"max")},e.prototype.cumsum=function(t,e,n,r){if(e!==t.rank-1)throw new Error("WebGL cumsum shader expects an inner-most axis="+(t.rank-1)+" but got axis="+e);var a=new hi(t.shape,n,r);return this.compileAndRun(a,[t])},e.prototype.equal=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(equal(a, b));\n","bool");var n=new Ha("return float(a == b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.notEqual=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(notEqual(a, b));\n","bool");var n=new Ha("return float(a != b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.less=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.less(t,e);if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(lessThan(a, b));\n","bool");var n=new Ha("return float(a < b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.lessEqual=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(lessThanEqual(a, b));\n","bool");var n=new Ha("return float(a <= b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.greater=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.greater(t,e);if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(greaterThan(a, b));\n","bool");var n=new Ha("return float(a > b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.greaterEqual=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(greaterThanEqual(a, b));\n","bool");var n=new Ha("return float(a >= b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.logicalNot=function(t){var e=new _o(t.shape,"return float(!(x >= 1.0));");return this.compileAndRun(e,[t])},e.prototype.logicalAnd=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n","bool");var n=new Ha("return float(a >= 1.0 && b >= 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.logicalOr=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n","bool");var n=new Ha("return float(a >= 1.0 || b >= 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},e.prototype.select=function(t,e,n){var r=new xo(t.rank,e.shape,e.rank);return this.compileAndRun(r,[t,e,n],bt(e.dtype,n.dtype))},e.prototype.where=function(t){Ue("tf.where() in webgl locks the UI thread. Call tf.whereAsync() instead");var e=t.dataSync();return ga(t.shape,e)},e.prototype.topk=function(t,e,n){return ma(t.dataSync(),t.shape,t.dtype,e)},e.prototype.min=function(t,e){Je("min",e,t.rank);var n=$e(t.shape,e),r=n[0],a=x(n[1]),i=t.as2D(-1,a);return this.reduce(i,"min",i.dtype).reshape(r)},e.prototype.minimum=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.minimum(t,e);var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa("\n vec4 result = vec4(min(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new Ha("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return min(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},e.prototype.mod=function(t,e){var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa("\n vec4 result = mod(a, b);\n vec4 isNaN = vec4(equal(b, vec4(0.0)));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new Ha("if (b == 0.0) return NAN;\n return mod(a, b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},e.prototype.max=function(t,e){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.max(t,e);Je("max",e,t.rank);var n=$e(t.shape,e),r=n[0],a=x(n[1]),i=t.as2D(-1,a);return this.reduce(i,"max",i.dtype).reshape(r)},e.prototype.maximum=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.maximum(t,e);var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa("\n vec4 result = vec4(max(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new Ha("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return max(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},e.prototype.all=function(t,e){Je("all",e,t.rank);var n=$e(t.shape,e),r=n[0],a=x(n[1]),i=t.as2D(-1,a);return this.reduce(i,"all",i.dtype).reshape(r)},e.prototype.any=function(t,e){Je("any",e,t.rank);var n=$e(t.shape,e),r=n[0],a=x(n[1]),i=t.as2D(-1,a);return this.reduce(i,"any",i.dtype).reshape(r)},e.prototype.squaredDifference=function(t,e){var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa("return (a - b) * (a - b);",t.shape,e.shape):new Ha("return (a - b) * (a - b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},e.prototype.realDivide=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n","float32",!0);var n=new Ha("\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",t.shape,e.shape);return this.compileAndRun(n,[t,e],"float32")},e.prototype.floorDiv=function(t,e){if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n","int32");var n=new Ha("\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",t.shape,e.shape);return this.compileAndRun(n,[t,e],"int32")},e.prototype.add=function(t,e){if("complex64"===t.dtype&&"complex64"===e.dtype)return this.complexSeparableBinaryOp(t,e,Ua);if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.add(t,e);var n=bt(t.dtype,e.dtype);if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,Ua,n);var r=new Ha(Ua,t.shape,e.shape);return this.compileAndRun(r,[t,e],n)},e.prototype.packedUnaryOp=function(t,e,n){var r=new Yo(t.shape,e);return this.compileAndRun(r,[t],n)},e.prototype.packedBinaryOp=function(t,e,n,r,a){void 0===a&&(a=!1);var i=new Xa(n,t.shape,e.shape,a);return this.compileAndRun(i,[t,e],r)},e.prototype.complexSeparableBinaryOp=function(t,e,n){var r=this,a=this.texData.get(t.dataId),i=this.texData.get(e.dataId),o=[[a.complexTensors.real,i.complexTensors.real],[a.complexTensors.imag,i.complexTensors.imag]].map(function(a){var i=a[0],o=a[1],s=r.makeComplexComponentTensorInfo(t,i),u=r.makeComplexComponentTensorInfo(e,o),l=new Ha(n,t.shape,e.shape);return r.compileAndRun(l,[s,u],bt(i.dtype,o.dtype))}),s=o[0],u=o[1],l=this.complex(s,u);return s.dispose(),u.dispose(),l},e.prototype.makeComplexComponentTensorInfo=function(t,e){return{dataId:e.dataId,dtype:e.dtype,shape:t.shape}},e.prototype.addN=function(t){if(1===t.length)return t[0];if(t.length>o().get("WEBGL_MAX_TEXTURES_IN_SHADER")){var e=Math.floor(t.length/2),n=this.addN(t.slice(0,e)),r=this.addN(t.slice(e));return this.addN([n,r])}var a=t.map(function(t){return t.dtype}).reduce(function(t,e){return bt(t,e)}),i=t.map(function(t){return t.shape}),s=o().getBool("WEBGL_PACK")?new ya(t[0].shape,i):new va(t[0].shape,i);return this.compileAndRun(s,t,a)},e.prototype.subtract=function(t,e){if("complex64"===t.dtype&&"complex64"===e.dtype)return this.complexSeparableBinaryOp(t,e,ja);if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.subtract(t,e);var n=bt(t.dtype,e.dtype);if(o().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,ja,t.dtype);var r=new Ha(ja,t.shape,e.shape);return this.compileAndRun(r,[t,e],n)},e.prototype.pow=function(t,e){var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa("\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new Ha("\nif(a < 0.0 && floor(b) < b){\n return NAN;\n}\nif (b == 0.0) {\n return 1.0;\n}\nreturn (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",t.shape,e.shape),r=bt(t.dtype,e.dtype);return this.compileAndRun(n,[t,e],r)},e.prototype.ceil=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.ceil(t);if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,Vo,t.dtype);var e=new _o(t.shape,Vo);return this.compileAndRun(e,[t])},e.prototype.floor=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.floor(t);if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,Uo,t.dtype);var e=new _o(t.shape,Uo);return this.compileAndRun(e,[t])},e.prototype.sign=function(t){var e=new _o(t.shape,"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n");return this.compileAndRun(e,[t])},e.prototype.isNaN=function(t){var e=new _o(t.shape,"return float(isnan(x));");return this.compileAndRun(e,[t],"bool")},e.prototype.isInf=function(t){var e=new _o(t.shape,"return float(isinf(x));");return this.compileAndRun(e,[t],"bool")},e.prototype.isFinite=function(t){var e=new _o(t.shape,"return float(!isnan(x) && !isinf(x));");return this.compileAndRun(e,[t],"bool")},e.prototype.round=function(t){var e=new _o(t.shape,"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n");return this.compileAndRun(e,[t])},e.prototype.exp=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.exp(t);if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,jo,t.dtype);var e=new _o(t.shape,jo);return this.compileAndRun(e,[t])},e.prototype.expm1=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.expm1(t);if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,Go,t.dtype);var e=new _o(t.shape,Go);return this.compileAndRun(e,[t])},e.prototype.log=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.log(t);if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,"\n vec4 result = log(x);\n vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\n result.r = isNaN.r == 1.0 ? NAN : result.r;\n result.g = isNaN.g == 1.0 ? NAN : result.g;\n result.b = isNaN.b == 1.0 ? NAN : result.b;\n result.a = isNaN.a == 1.0 ? NAN : result.a;\n\n return result;\n",t.dtype);var e=new _o(t.shape,"if (x < 0.0) return NAN;\n return log(x);");return this.compileAndRun(e,[t])},e.prototype.log1p=function(t){var e=new _o(t.shape,"return log(1.0 + x);");return this.compileAndRun(e,[t])},e.prototype.sqrt=function(t){var e=new _o(t.shape,"return sqrt(x);");return this.compileAndRun(e,[t])},e.prototype.rsqrt=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.rsqrt(t);var e=new _o(t.shape,"return inversesqrt(x);");return this.compileAndRun(e,[t])},e.prototype.reciprocal=function(t){var e=new _o(t.shape,"return 1.0 / x;");return this.compileAndRun(e,[t])},e.prototype.relu=function(t){var e;return e=o().getBool("WEBGL_PACK")?new Yo(t.shape,Ko):new _o(t.shape,Lo),this.compileAndRun(e,[t])},e.prototype.relu6=function(t){var e;return e=o().getBool("WEBGL_PACK")?new Yo(t.shape,Xo):new _o(t.shape,Bo),this.compileAndRun(e,[t])},e.prototype.prelu=function(t,e){var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa(Ka,t.shape,e.shape):new Ha(qa,t.shape,e.shape);return this.compileAndRun(n,[t,e])},e.prototype.elu=function(t){if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,$o,t.dtype);var e=new _o(t.shape,Po);return this.compileAndRun(e,[t])},e.prototype.eluDer=function(t,e){var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",t.shape,e.shape):new Ha("return (b >= 1.0) ? a : a * (b + 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},e.prototype.selu=function(t){var e=new _o(t.shape,"\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = 1.7580993408473768;\n float scale = 1.0507009873554805;\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n");return this.compileAndRun(e,[t])},e.prototype.int=function(t){var e=new _o(t.shape,"return float(int(x));");return this.compileAndRun(e,[t],"int32")},e.prototype.clip=function(t,e,n){var r,a=(r=o().getBool("WEBGL_PACK_CLIP")?new Ya(t.shape):new $a(t.shape)).getCustomSetupFunc(e,n);return this.compileAndRun(r,[t],null,a)},e.prototype.abs=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.abs(t);if(o().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,zo,t.dtype);var e=new _o(t.shape,zo);return this.compileAndRun(e,[t])},e.prototype.complexAbs=function(t){var e=this.texData.get(t.dataId),n=new Ja(t.shape),r=[this.makeComplexComponentTensorInfo(t,e.complexTensors.real),this.makeComplexComponentTensorInfo(t,e.complexTensors.imag)];return this.compileAndRun(n,r)},e.prototype.sigmoid=function(t){var e=new _o(t.shape,"return 1.0 / (1.0 + exp(-1.0 * x));");return this.compileAndRun(e,[t])},e.prototype.softplus=function(t){var e=new _o(t.shape,"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n");return this.compileAndRun(e,[t])},e.prototype.sin=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;\n return sin(x);\n");return this.compileAndRun(e,[t])},e.prototype.cos=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;\n return cos(x);\n");return this.compileAndRun(e,[t])},e.prototype.tan=function(t){var e=new _o(t.shape,"return tan(x);");return this.compileAndRun(e,[t])},e.prototype.asin=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n");return this.compileAndRun(e,[t])},e.prototype.acos=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n");return this.compileAndRun(e,[t])},e.prototype.atan=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;\n return atan(x);\n");return this.compileAndRun(e,[t])},e.prototype.atan2=function(t,e){var n=o().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new Xa("\n vec4 result = atan(a, b);\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new Ha("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return atan(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},e.prototype.sinh=function(t){var e=new _o(t.shape,"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},e.prototype.cosh=function(t){var e=new _o(t.shape,"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},e.prototype.tanh=function(t){var e=new _o(t.shape,"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n");return this.compileAndRun(e,[t])},e.prototype.asinh=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;return log(x + sqrt(x * x + 1.0));");return this.compileAndRun(e,[t])},e.prototype.acosh=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;\n if (x < 1.0) return NAN;\n return log(x + sqrt(x * x - 1.0));");return this.compileAndRun(e,[t])},e.prototype.atanh=function(t){var e=new _o(t.shape,"if (isnan(x)) return x;\n if ((x < -1.0) || (x > 1.0)) return NAN;\n return (log(1.0 + x) - log(1.0 - x)) / 2.0;");return this.compileAndRun(e,[t])},e.prototype.erf=function(t){var e=new _o(t.shape,'\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = 0.3275911;\n float a1 = 0.254829592;\n float a2 = -0.284496736;\n float a3 = 1.421413741;\n float a4 = -1.453152027;\n float a5 = 1.061405429;\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n');return this.compileAndRun(e,[t])},e.prototype.step=function(t,e){var n=new _o(t.shape,function(t){return void 0===t&&(t=0),Fo+"\n return x > 0.0 ? 1.0 : float("+t+");\n "}(e));return this.compileAndRun(n,[t])},e.prototype.conv2dByMatMul=function(t,e,n,r,a,i){var s=t.shape,u=this.texData.get(t.dataId),l=n.inChannels,c=s[0]*s[1]*s[2],p=n.outChannels,h="channelsLast"===n.dataFormat,f=(1===c||1===p)&&l>1e3,d=s[2]%2!=0&&!!u.isPacked;if(f||!o().getBool("WEBGL_LAZILY_UNPACK")||!o().getBool("WEBGL_PACK_BINARY_OPERATIONS")||!d){var m=h?s[0]*s[1]*s[2]:s[0]*s[2]*s[3],v=this.reshape(t,[1,m,n.inChannels]),y=this.reshape(e,[1,n.inChannels,n.outChannels]);return this.reshape(this.fusedBatchMatMul({a:v,b:y,transposeA:!1,transposeB:!1,bias:r,activation:a,preluActivationWeights:i}),n.outShape)}var b=h?s[0]*s[1]*(s[2]+1):s[0]*s[2]*(s[3]+1),x={dataId:t.dataId,shape:[1,b,n.inChannels],dtype:t.dtype},w=u.shape;u.shape=u.shape.slice(),u.shape[u.shape.length-2]++,g(Se(u.shape,x.shape),function(){return"packed reshape "+u.shape+" to "+x.shape+" isn't free"});var C=this.reshape(e,[1,n.inChannels,n.outChannels]),N=this.fusedBatchMatMul({a:x,b:C,transposeA:!1,transposeB:!1,bias:r,activation:a,preluActivationWeights:i}),S=this.texData.get(N.dataId);return g(S.isPacked,function(){return"batchMatMul result is expected to be packed"}),u.shape=w,S.shape=n.outShape,At.makeTensorFromDataId(N.dataId,n.outShape,N.dtype)},e.prototype.conv2dWithIm2Row=function(t,e,n,r,a,i){var o=n.filterWidth,s=n.filterHeight,u=n.inChannels,l=n.outWidth,c=n.outHeight,p="channelsLast"===n.dataFormat,h=o*s*u,f=c*l,d=[h,f],m=t.squeeze([0]),g=e.reshape([1,h,-1]),v=new Xi(d,m.shape,n),y=this.compileAndRun(v,[m]).reshape([1,d[0],d[1]]),b=null!=r,x=null!=i,w=a?Qo(a,!0):null,C=new to(y.shape,[1,f,n.outChannels],!0,!1,b,w,x),N=[y,g];r&&N.push(r),x&&N.push(i);var S=this.compileAndRun(C,N);return p?S.reshape([1,c,l,n.outChannels]):S.reshape([1,n.outChannels,c,l])},e.prototype.fusedConv2d=function(t){var e=t.input,n=t.filter,r=t.convInfo,a=t.bias,i=t.activation,s=t.preluActivationWeights;if(1===r.filterHeight&&1===r.filterWidth&&1===r.dilationHeight&&1===r.dilationWidth&&1===r.strideHeight&&1===r.strideWidth&&("SAME"===r.padInfo.type||"VALID"===r.padInfo.type))return this.conv2dByMatMul(e,n,r,a,i,s);if(o().getBool("WEBGL_CONV_IM2COL")&&1===e.shape[0])return this.conv2dWithIm2Row(e,n,r,a,i,s);var u=null!=a,l=null!=s,c=i?Qo(i,!1):null,p=new si(r,u,c,l),h=[e,n];return a&&h.push(a),s&&h.push(s),this.compileAndRun(p,h)},e.prototype.conv2d=function(t,e,n){if(1===n.filterHeight&&1===n.filterWidth&&1===n.dilationHeight&&1===n.dilationWidth&&1===n.strideHeight&&1===n.strideWidth&&("SAME"===n.padInfo.type||"VALID"===n.padInfo.type))return this.conv2dByMatMul(t,e,n);if(o().getBool("WEBGL_CONV_IM2COL")&&1===t.shape[0])return this.conv2dWithIm2Row(t,e,n);var r=new si(n);return this.compileAndRun(r,[t,e])},e.prototype.conv2dDerInput=function(t,e,n){var r=new ni(n);return this.compileAndRun(r,[t,e])},e.prototype.conv2dDerFilter=function(t,e,n){var r=new ei(n);return this.compileAndRun(r,[t,e])},e.prototype.fusedDepthwiseConv2D=function(t){var e,n=t.input,r=t.filter,a=t.convInfo,i=t.bias,s=t.activation,u=t.preluActivationWeights,l=o().getBool("WEBGL_PACK_DEPTHWISECONV")&&a.strideWidth<=2&&a.outChannels/a.inChannels==1,c=s?Qo(s,l):null,p=[n,r],h=null!=i,f=null!=u;return h&&p.push(i),f&&p.push(u),l?(e=new ci(a,h,c,f),this.compileAndRun(e,p)):(e=new li(a,h,c,f),this.compileAndRun(e,p))},e.prototype.depthwiseConv2D=function(t,e,n){var r;return o().getBool("WEBGL_PACK_DEPTHWISECONV")&&n.strideWidth<=2&&n.outChannels/n.inChannels==1?(r=new ci(n),this.compileAndRun(r,[t,e])):(r=new li(n),this.compileAndRun(r,[t,e]))},e.prototype.depthwiseConv2DDerInput=function(t,e,n){var r=new oi(n);return this.compileAndRun(r,[t,e])},e.prototype.depthwiseConv2DDerFilter=function(t,e,n){var r=new ii(n);return this.compileAndRun(r,[t,e])},e.prototype.conv3d=function(t,e,n){var r=new ui(n);return this.compileAndRun(r,[t,e])},e.prototype.conv3dDerInput=function(t,e,n){var r=new ai(n);return this.compileAndRun(r,[t,e])},e.prototype.conv3dDerFilter=function(t,e,n){var r=new ri(n);return this.compileAndRun(r,[t,e])},e.prototype.maxPool=function(t,e){var n=new oo(e,"max",!1);return this.compileAndRun(n,[t])},e.prototype.avgPool=function(t,e){var n=new oo(e,"avg",!1);return this.compileAndRun(n,[t],"float32")},e.prototype.maxPoolBackprop=function(t,e,n,r){var a=new oo(r,"max",!0),i=this.compileAndRun(a,[e]),o=new Zi(r),s=this.compileAndRun(o,[t,i],e.dtype);return i.dispose(),s},e.prototype.avgPoolBackprop=function(t,e,n){var r=new La(n);return this.compileAndRun(r,[t],e.dtype)},e.prototype.cast=function(t,e){return ra(t,e,this)},e.prototype.unstack=function(t,e){for(var n=t.shape[e],r=new Array(t.rank-1),a=0,i=0;i1,function(){return"blockSize should be > 1 for depthToSpace, but was: "+e});var r=t.shape[0],a="NHWC"===n?t.shape[1]:t.shape[2],i="NHWC"===n?t.shape[2]:t.shape[3],o="NHWC"===n?t.shape[3]:t.shape[1],s=a*e,u=i*e,l=o/(e*e),c=new gi("NHWC"===n?[r,s,u,l]:[r,l,s,u],e,n);return this.compileAndRun(c,[t])},e.prototype.split=function(t,e,n){return fa(t,e,n)},e.prototype.scatterND=function(t,e,n){var r=Ir(0,t,n),a=r.sliceRank,i=r.numUpdates,o=r.sliceSize,s=r.strides,u=r.outputSize,l=[u/o,o],c=t.reshape([i,a]),p=e.reshape([i,o]);if(0===u)return aa(un([]),n);var h=cn(0),f=new yo(i,a,c.rank,p.rank,s,l);return this.compileAndRun(f,[p,c,h]).reshape(n)},e.prototype.sparseToDense=function(t,e,n,r){var a=Ir(0,t,n),i=a.sliceRank,o=a.numUpdates,s=a.strides,u=a.outputSize,l=new yo(o,i,t.rank,e.rank,s,[u,1],!1);return this.compileAndRun(l,[e,t,r]).reshape(n)},e.prototype.fft=function(t){return this.fftImpl(t,!1)},e.prototype.ifft=function(t){return this.fftImpl(t,!0)},e.prototype.fftImpl=function(t,e){var n=this.texData.get(t.dataId),r=new Ci("return real * expR - imag * expI;",t.shape,e),a=new Ci("return real * expI + imag * expR;",t.shape,e),i=[this.makeComplexComponentTensorInfo(t,n.complexTensors.real),this.makeComplexComponentTensorInfo(t,n.complexTensors.imag)],o=this.compileAndRun(r,i),s=this.compileAndRun(a,i),u=this.complex(o,s).as2D(t.shape[0],t.shape[1]);return o.dispose(),s.dispose(),u},e.prototype.gatherND=function(t,e){var n=e.shape,r=n[n.length-1],a=Cr(t,e),i=a[0],o=a[1],s=a[2],u=a[3],l=e.reshape([o,r]),c=t.reshape([t.size/s,s]),p=new Ei(r,u,[o,s]);return this.compileAndRun(p,[c,l]).reshape(i)},e.prototype.fill=function(t,e,n){if("string"===(n=n||V(e))){var r=D(n,x(t));return r.fill(e),At.makeTensor(r,t,n,this)}var a=new Ni(t,e),i=a.getCustomSetupFunc(e);return this.compileAndRun(a,[],n,i)},e.prototype.onesLike=function(t){if("string"===t.dtype)throw new Error("onesLike is not supported under string dtype");return this.fill(t.shape,1,t.dtype)},e.prototype.zerosLike=function(t){return this.fill(t.shape,"string"===t.dtype?"":0,t.dtype)},e.prototype.linspace=function(t,e,n){return ia(t,e,n)},e.prototype.makeTensorInfo=function(t,e){var n=this.write(null,t,e);return this.texData.get(n).usage=null,{dataId:n,shape:t,dtype:e}},e.prototype.makeOutput=function(t,e){var n=this.makeTensorInfo(t,e).dataId;return At.makeTensorFromDataId(n,t,e,this)},e.prototype.unpackTensor=function(t){var e=new Jo(t.shape);return this.runWebGLProgram(e,[t],t.dtype)},e.prototype.packTensor=function(t){var e=new ro(t.shape);return this.runWebGLProgram(e,[t],t.dtype,null,!0)},e.prototype.packedReshape=function(t,e){var n=[be(t.shape)].concat(xe(t.shape)),r={dtype:t.dtype,shape:n,dataId:t.dataId},a=[be(e)].concat(xe(e)),i=new lo(a,n),o=this.runWebGLProgram(i,[r],t.dtype,null,!0);return{dataId:o.dataId,shape:e,dtype:o.dtype}},e.prototype.decode=function(t){var e,n=this.texData.get(t),r=n.isPacked,a=n.shape,i=n.dtype,o=we(a);return e=r?new mi(o):new di(o),{dtype:i,shape:a,dataId:this.runWebGLProgram(e,[{shape:o,dtype:i,dataId:t}],i,null,!0).dataId}},e.prototype.runWebGLProgram=function(t,e,n,r,a){var i=this;void 0===a&&(a=!1);var s=this.makeTensorInfo(t.outputShape,n),u=this.texData.get(s.dataId);if(t.packedOutput&&(u.isPacked=!0),t.outPackingScheme===Dt.DENSE){var l=Wt(t.outputShape);u.texShape=l.map(function(t){return 2*t})}if(null!=t.outTexUsage&&(u.usage=t.outTexUsage),0===x(s.shape))return u.values=T(s.dtype,0),s;var c=[],p=e.map(function(e){if("complex64"===e.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");var n=i.texData.get(e.dataId);if(null==n.texture){if(!t.packedInputs&&x(e.shape)<=o().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:e.shape,texData:null,isUniform:!0,uniformValues:n.values};t.packedInputs&&(n.isPacked=!0,n.shape=e.shape)}else if(!!n.isPacked!=!!t.packedInputs)e=n.isPacked?i.unpackTensor(e):i.packTensor(e),c.push(e),n=i.texData.get(e.dataId);else if(n.isPacked&&!Se(n.shape,e.shape)){var r=e,a=e.shape;e.shape=n.shape,e=i.packedReshape(e,a),c.push(e),n=i.texData.get(e.dataId),r.shape=a}return i.uploadToGPU(e.dataId),{shape:e.shape,texData:n,isUniform:!1}});this.uploadToGPU(s.dataId);var h,f={shape:s.shape,texData:u,isUniform:!1},d=function(t,e,n){var r="";p.concat(n).forEach(function(t){var e=null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0,n=t.isUniform?"uniform":t.texData.texShape;r+=t.shape+"_"+n+"_"+e});var a=t.userCode;return t.constructor.name+"_"+r+"_"+a}(t,0,f),m=this.getAndSaveBinary(d,function(){return function(t,e,n,r){var a=e.userCode,i=n.map(function(t,n){var r={logicalShape:t.shape,texShape:t.isUniform?null:t.texData.texShape,isUniform:t.isUniform,isPacked:!t.isUniform&&t.texData.isPacked,flatOffset:null};return null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0&&(r.flatOffset=t.texData.slice.flatOffset),{name:e.variableNames[n],shapeInfo:r}}),s=i.map(function(t){return t.shapeInfo}),u={logicalShape:r.shape,texShape:r.texData.texShape,isUniform:!1,isPacked:r.texData.isPacked,flatOffset:null},l=ka(i,u,a,e.packedInputs),c=t.createProgram(l),p=null,h=t.getUniformLocation(c,"NAN",!1);1===o().getNumber("WEBGL_VERSION")&&(p=t.getUniformLocation(c,"INFINITY",!1));for(var f={},d=0;d0)return 32}return 16})),this.floatPrecisionValue},e.prototype.epsilon=function(){return 32===this.floatPrecision()?1e-7:1e-4},e.prototype.uploadToGPU=function(t){var e,n=this.texData.get(t),r=n.shape,a=n.dtype,i=n.values,o=n.texture,s=n.usage,u=n.isPacked;if(null==o){var l,c=null!=this.activeTimers;c&&(l=$());var p=n.texShape;if(null==p&&(p=Ce(r,u),n.texShape=p),null!=i){var h=we(r),f=void 0,d=p[1],m=p[0],g=i instanceof Uint8Array;u?(d=(e=Vt(p[0],p[1]))[0],m=e[1],f=new wi(h,[m,d],g)):f=new xi(h,[m,d],g);var v=this.makeTensorInfo([m,d],a);this.texData.get(v.dataId).usage=g?Ot.PIXELS:Ot.UPLOAD,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(v.dataId),d,m,i);var y=this.runWebGLProgram(f,[v],a,null,!0),b=this.texData.get(y.dataId);n.texture=b.texture,n.texShape=b.texShape,n.isPacked=b.isPacked,n.usage=b.usage,this.disposeData(v.dataId),this.texData.delete(y.dataId),n.values=null,c&&(this.uploadWaitMs+=$()-l)}else{var x=this.acquireTexture(p,s,a,u);n.texture=x}}},e.prototype.convertAndCacheOnCPU=function(t,e){var n=this.texData.get(t),r=n.dtype;return this.releaseGPUData(t),null!=e&&(n.values=function(t,e){if("float32"===e||"complex64"===e)return t;if("int32"===e||"bool"===e){for(var n="int32"===e?new Int32Array(t.length):new Uint8Array(t.length),r=0;r1024*this.numMBBeforeWarning*1024){var a=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn("High memory usage in GPU: "+a+" MB, most likely due to a memory leak")}return this.textureManager.acquireTexture(t,e,r)},e.prototype.computeBytes=function(t,e){return t[0]*t[1]*z(e)},e}(Wr);Rt()&&At.registerBackend("webgl",function(){return new es},2);var ns=rn({square_:function(t){var e=qe(t,"x","square"),n=[e];return At.runKernelFunc(function(t,n){return n([e]),t.square(e)},{x:e},function(t,e){var n=e[0];return{x:function(){return t.mul(n.toFloat().mul(2))}}},"Square",{},n,[])}}),rs=rn({abs_:function(t){var e=qe(t,"x","abs");return"complex64"===e.dtype?At.runKernelFunc(function(t){return t.complexAbs(e)},{$x:e}):At.runKernelFunc(function(t,n){var r=t.abs(e);return n([e]),r},{x:e},function(t,e){var n=e[0];return{x:function(){return t.mul(n.toFloat().step(-1))}}},"Abs")}}),as=rn({acos_:function(t){var e=qe(t,"x","acos");return At.runKernelFunc(function(t,n){var r=t.acos(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(cn(1).sub(n.toFloat().square()).sqrt()).neg()}}})}}),is=rn({acosh_:function(t){var e=qe(t,"x","acosh");return At.runKernelFunc(function(t,n){var r=t.acosh(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(n.toFloat().square().sub(1).sqrt())}}})}}),os=rn({asin_:function(t){var e=qe(t,"x","asin");return At.runKernelFunc(function(t,n){var r=t.asin(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(cn(1).sub(n.toFloat().square()).sqrt())}}})}}),ss=rn({asinh_:function(t){var e=qe(t,"x","asinh");return At.runKernelFunc(function(t,n){var r=t.asinh(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(cn(1).add(n.toFloat().square()).sqrt())}}})}}),us=rn({atan_:function(t){var e=qe(t,"x","atan");return At.runKernelFunc(function(t,n){var r=t.atan(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(n.toFloat().square().add(1))}}})}}),ls=rn({atanh_:function(t){var e=qe(t,"x","atanh");return At.runKernelFunc(function(t,n){var r=t.atanh(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(cn(1).sub(n.toFloat().square()))}}})}}),cs=rn({ceil_:function(t){var e=qe(t,"x","ceil");return At.runKernelFunc(function(t){return t.ceil(e)},{$x:e},function(t){return{$x:function(){return Sn(t)}}})}}),ps=rn({clipByValue_:function(t,e,n){var r=qe(t,"x","clipByValue");return g(e<=n,function(){return"Error in clip: min ("+e+") must be less than or equal to max ("+n+")."}),At.runKernelFunc(function(t,a){var i=t.clip(r,e,n);return a([r]),i},{$x:r},function(t,r){var a=r[0];return{$x:function(){return t.where(a.greaterEqual(e).logicalAnd(a.lessEqual(n)),Sn(t))}}})}}),hs=rn({cos_:function(t){var e=qe(t,"x","cos");return At.runKernelFunc(function(t,n){var r=t.cos(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().sin().neg().mul(t)}}})}}),fs=rn({cosh_:function(t){var e=qe(t,"x","cosh");return At.runKernelFunc(function(t,n){var r=t.cosh(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().sinh().mulStrict(t)}}})}}),ds=rn({erf_:function(t){var e=qe(t,"x","erf");return g("int32"===e.dtype||"float32"===e.dtype,function(){return"Input dtype must be `int32` or `float32`."}),"int32"===e.dtype&&(e=e.toFloat()),At.runKernelFunc(function(t,n){var r=t.erf(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.square().neg().exp().mul(2/Math.sqrt(Math.PI)))}}})}}),ms=rn({exp_:function(t){var e=qe(t,"x","exp");return At.runKernelFunc(function(t,n){var r=t.exp(e);return n([r]),r},{$x:e},function(t,e){return{$x:function(){return t.mulStrict(e[0])}}})}}),gs=rn({expm1_:function(t){var e=qe(t,"x","expm1");return At.runKernelFunc(function(t,n){var r=t.expm1(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.exp())}}})}}),vs=rn({floor_:function(t){var e=qe(t,"x","floor");return At.runKernelFunc(function(t){return t.floor(e)},{$x:e},function(t){return{$x:function(){return Sn(t)}}})}}),ys=rn({log_:function(t){var e=qe(t,"x","log");return At.runKernelFunc(function(t,n){var r=t.log(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(n.toFloat())}}})}}),bs=rn({log1p_:function(t){var e=qe(t,"x","log1p");return At.runKernelFunc(function(t,n){var r=t.log1p(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(n.add(1))}}})}}),xs=rn({logSigmoid_:function(t){var e=qe(t,"x","logSigmoid");return At.runKernelFunc(function(t,n){var r=t.softplus(e.neg()).neg();return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.neg().sigmoid())}}})}}),ws=rn({neg_:function(t){var e=qe(t,"x","neg");return At.runKernelFunc(function(t){return t.neg(e)},{$x:e},function(t){return{$x:function(){return t.neg()}}})}}),Cs=rn({reciprocal_:function(t){var e=qe(t,"x","reciprocal");return At.runKernelFunc(function(t,n){var r=t.reciprocal(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(n.square().neg())}}})}}),Ns=rn({round_:function(t){var e=qe(t,"x","round");return At.runKernelFunc(function(t){return t.round(e)},{$x:e},function(t){return{$x:function(){return Sn(t)}}})}}),Ss=rn({rsqrt_:function(t){var e=qe(t,"x","rsqrt");return At.runKernelFunc(function(t,n){var r=t.rsqrt(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(n.pow(1.5).mul(2)).neg()}}})}}),Is=rn({sigmoid_:function(t){var e=qe(t,"x","sigmoid");return At.runKernelFunc(function(t,n){var r=t.sigmoid(e);return n([r]),r},{x:e},function(t,e){var n=e[0];return{x:function(){return t.mul(n.mul(cn(1).sub(n)))}}},"Sigmoid")}}),ks=rn({sign_:function(t){var e=qe(t,"x","sign");return At.runKernelFunc(function(t){return t.sign(e)},{$x:e},function(t){return{$x:function(){return Sn(t)}}})}}),Es=rn({isNaN_:function(t){var e=qe(t,"x","isNaN");return At.runKernelFunc(function(t){return t.isNaN(e)},{$x:e},function(t){return{$x:function(){return Sn(t)}}})}}),As=rn({isInf_:function(t){var e=qe(t,"x","isInf");return At.runKernelFunc(function(t){return t.isInf(e)},{$x:e},function(t){return{$x:function(){return Sn(t)}}})}}),Rs=rn({isFinite_:function(t){var e=qe(t,"x","isFinite");return At.runKernelFunc(function(t){return t.isFinite(e)},{$x:e},function(t){return{$x:function(){return Sn(t)}}})}}),Ts=rn({sin_:function(t){var e=qe(t,"x","sin");return At.runKernelFunc(function(t,n){var r=t.sin(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().cos().mul(t)}}})}}),Ds=rn({sinh_:function(t){var e=qe(t,"x","sinh");return At.runKernelFunc(function(t,n){var r=t.sinh(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().cosh().mulStrict(t)}}})}}),Os=rn({softplus_:function(t){var e=qe(t,"x","softplus");return At.runKernelFunc(function(t,n){var r=t.softplus(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.sigmoid())}}})}}),_s=rn({sqrt_:function(t){var e=qe(t,"x","sqrt");return At.runKernelFunc(function(t,n){var r=t.sqrt(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(n.toFloat().sqrt().mul(2))}}})}}),Fs=rn({step_:function(t,e){void 0===e&&(e=0);var n=qe(t,"x","step");return At.runKernelFunc(function(t){return t.step(n,e)},{$x:n},function(t){return{$x:function(){return Sn(t)}}})}}),Ms=rn({tan_:function(t){var e=qe(t,"x","tan");return At.runKernelFunc(function(t,n){var r=t.tan(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.div(n.cos().square())}}})}}),zs=rn({tanh_:function(t){var e=qe(t,"x","tanh");return At.runKernelFunc(function(t,n){var r=t.tanh(e);return n([r]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return cn(1).sub(n.square()).mulStrict(t)}}})}});function Ls(t,e,n,r,a,i){var o,s,u=qe(t,"x","batchNorm"),l=qe(e,"mean","batchNorm"),c=qe(n,"variance","batchNorm");return null!=a&&(o=qe(a,"scale","batchNorm")),null!=r&&(s=qe(r,"offset","batchNorm")),g(2===u.rank,function(){return"Error in batchNorm3D: x must be rank 3 but got rank "+u.rank+"."}),g(2===l.rank||1===l.rank,function(){return"Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank "+l.rank+"."}),g(2===c.rank||1===c.rank,function(){return"Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank "+c.rank+"."}),null!=o&&g(2===o.rank||1===o.rank,function(){return"Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank "+o.rank+"."}),null!=s&&g(2===s.rank||1===s.rank,function(){return"Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank "+s.rank+"."}),Ws(u,l,c,s,o,i)}function Bs(t,e,n,r,a,i){var o,s,u=qe(t,"x","batchNorm"),l=qe(e,"mean","batchNorm"),c=qe(n,"variance","batchNorm");return null!=a&&(o=qe(a,"scale","batchNorm")),null!=r&&(s=qe(r,"offset","batchNorm")),g(3===u.rank,function(){return"Error in batchNorm3D: x must be rank 3 but got rank "+u.rank+"."}),g(3===l.rank||1===l.rank,function(){return"Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank "+l.rank+"."}),g(3===c.rank||1===c.rank,function(){return"Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank "+c.rank+"."}),null!=o&&g(3===o.rank||1===o.rank,function(){return"Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank "+o.rank+"."}),null!=s&&g(3===s.rank||1===s.rank,function(){return"Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank "+s.rank+"."}),Ws(u,l,c,s,o,i)}function Ps(t,e,n,r,a,i){var o,s,u=qe(t,"x","batchNorm"),l=qe(e,"mean","batchNorm"),c=qe(n,"variance","batchNorm");return null!=a&&(o=qe(a,"scale","batchNorm")),null!=r&&(s=qe(r,"offset","batchNorm")),g(4===u.rank,function(){return"Error in batchNorm4D: x must be rank 4 but got rank "+u.rank+"."}),g(4===l.rank||1===l.rank,function(){return"Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank "+l.rank+"."}),g(4===c.rank||1===c.rank,function(){return"Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank "+c.rank+"."}),null!=o&&g(4===o.rank||1===o.rank,function(){return"Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank "+o.rank+"."}),null!=s&&g(4===s.rank||1===s.rank,function(){return"Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank "+s.rank+"."}),Ws(u,l,c,s,o,i)}function Ws(t,e,n,r,a,i){null==i&&(i=.001);var o,s,u,l=qe(t,"x","batchNorm"),c=qe(e,"mean","batchNorm"),p=qe(n,"variance","batchNorm");null!=a&&(o=qe(a,"scale","batchNorm")),null!=r&&(s=qe(r,"offset","batchNorm")),g(c.rank===p.rank,function(){return"Batch normalization gradient requires mean and variance to have equal ranks."}),g(null==s||c.rank===s.rank,function(){return"Batch normalization gradient requires mean and offset to have equal ranks."}),g(null==o||c.rank===o.rank,function(){return"Batch normalization gradient requires mean and scale to have equal ranks."}),u=0===l.rank||1===l.rank?l.as4D(1,1,1,l.size):2===l.rank?l.as4D(1,1,l.shape[0],l.shape[1]):3===l.rank?l.as4D(1,l.shape[0],l.shape[1],l.shape[2]):l;var h=[l,c,p,o];return At.runKernelFunc(function(t,e){var n=t.batchNormalization(u,Vs(c),Vs(p),i,Vs(o),Vs(s));return e([l,c,p,o]),n},{x:l,mean:c,variance:p,scale:o,offset:s},function(t,e){var n=e,r=n[0],a=n[1],o=n[2],s=n[3],l=null==s?cn(1):s,c=jr(a.shape,u.shape),p=[];if(1===a.rank){for(var h=0;h0&&(e=e.sum(n)),e.reshape(r.shape)},b:function(){var e=t,n=jr(a.shape,i);return n.length>0&&(e=e.sum(n)),e.reshape(a.shape)}}},"Add")}}),au=rn({addN_:function(t){g(Array.isArray(t),function(){return"The argument passed to tf.addN() must be a list of tensors"}),g(t.length>=1,function(){return"Must pass at least one tensor to tf.addN(), but got "+t.length});var e=t.map(function(t,e){return qe(t,"tensors"+e,"addN")}),n=e[0];e.forEach(function(t){if(t.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),e.forEach(function(t){if(!w(t.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});var r=e;return At.runKernelFunc(function(t){return t.addN(e)},r,function(t){var n={};return e.forEach(function(e,r){n[r]=function(){return t.clone()}}),n})}}),iu=rn({addStrict_:function(t,e){var n=qe(t,"a","addStrict"),r=qe(e,"b","addStrict");return v(n.shape,r.shape,"Error in addStrict: "),n.add(r)}}),ou=rn({atan2_:function(t,e){var n,r=qe(t,"a","atan2"),a=qe(e,"b","atan2");n=wt(r,a),r=n[0],a=n[1];var i=Gr(r.shape,a.shape);return At.runKernelFunc(function(t,e){var n=t.atan2(r,a);return e([r,a]),n},{$a:r,$b:a},function(t,e){var n=e[0],r=e[1];return{$a:function(){var e=ru(n.square(),r.square()),a=t.mul(r.div(e)),o=jr(n.shape,i);return o.length>0&&(a=a.sum(o)),a.reshape(n.shape)},$b:function(){var e=ru(n.square(),r.square()),a=ws(t.mul(n.div(e))),o=jr(r.shape,i);return o.length>0&&(a=a.sum(o)),a.reshape(r.shape)}}})}}),su=rn({div_:function(t,e){var n,r=qe(t,"a","div"),a=qe(e,"b","div");if(n=wt(r,a),r=n[0],a=n[1],"int32"===r.dtype&&"int32"===a.dtype)return lu(r,a);var i=Gr(r.shape,a.shape);return At.runKernelFunc(function(t,e){var n=t.realDivide(r,a);return e([r,a]),n},{a:r,b:a},function(t,e){var n=e[0],r=e[1];return{a:function(){var e=t.div(r.toFloat()),a=jr(n.shape,i);return a.length>0?e.sum(a).reshape(n.shape):e},b:function(){var e=t.mul(n.toFloat()),a=jr(r.shape,i);a.length>0&&(e=e.sum(a).reshape(r.shape));var o=r.square();return e.div(o.toFloat()).neg()}}},"Div")}}),uu=rn({divStrict_:function(t,e){var n=qe(t,"a","div"),r=qe(e,"b","div");return v(n.shape,r.shape,"Error in divideStrict: "),n.div(r)}}),lu=rn({floorDiv_:function(t,e){var n,r=qe(t,"a","floorDiv"),a=qe(e,"b","floorDiv");n=wt(r,a),r=n[0],a=n[1];var i=Gr(r.shape,a.shape);return At.runKernelFunc(function(t,e){var n=t.floorDiv(r,a);return e([r,a]),n},{$a:r,$b:a},function(t,e){var n=e[0],r=e[1];return{$a:function(){var e=t.div(r.toFloat()),a=jr(n.shape,i);return a.length>0?e.sum(a).reshape(n.shape):e},$b:function(){var e=t.mul(n.toFloat()),a=jr(r.shape,i);a.length>0&&(e=e.sum(a).reshape(r.shape));var o=r.square();return e.div(o.toFloat()).neg()}}})}}),cu=rn({maximum_:function(t,e){var n,r=qe(t,"a","maximum"),a=qe(e,"b","maximum");return n=wt(r,a),r=n[0],a=n[1],"bool"===r.dtype&&(r=r.toInt(),a=a.toInt()),Gr(r.shape,a.shape),At.runKernelFunc(function(t,e){var n=t.maximum(r,a);return e([r,a]),n},{$a:r,$b:a},function(t,e){var n=e[0],r=e[1];return{$a:function(){return t.mul(n.greaterEqual(r).toFloat())},$b:function(){return t.mul(n.less(r).toFloat())}}})}}),pu=rn({maximumStrict_:function(t,e){var n=qe(t,"a","maximumStrict"),r=qe(e,"b","maximumStrict");return v(n.shape,r.shape,"Error in maximumStrict: "),n.maximum(r)}}),hu=rn({minimum_:function(t,e){var n,r=qe(t,"a","minimum"),a=qe(e,"b","minimum");return n=wt(r,a),r=n[0],a=n[1],"bool"===r.dtype&&(r=r.toInt(),a=a.toInt()),Gr(r.shape,a.shape),At.runKernelFunc(function(t,e){var n=t.minimum(r,a);return e([r,a]),n},{$a:r,$b:a},function(t,e){var n=e[0],r=e[1];return{$a:function(){return t.mul(n.lessEqual(r).toFloat())},$b:function(){return t.mul(n.greater(r).toFloat())}}})}}),fu=rn({minimumStrict_:function(t,e){var n=qe(t,"a","minimumStrict"),r=qe(e,"b","minimumStrict");return v(n.shape,r.shape,"Error in minimumStrict: "),n.minimum(r)}}),du=rn({mod_:function(t,e){var n,r=qe(t,"a","mod"),a=qe(e,"b","mod");n=wt(r,a),r=n[0],a=n[1];var i=Gr(r.shape,a.shape);return At.runKernelFunc(function(t,e){var n=t.mod(r,a);return e([r,a]),n},{$a:r,$b:a},function(t,e){var n=e[0],r=e[1];return{$a:function(){var e=jr(n.shape,i);return e.length>0?t.sum(e).reshape(n.shape):t},$b:function(){var e=t.mul(n.div(r).floor().neg()),a=jr(r.shape,i);return a.length>0?e.sum(a).reshape(r.shape):e}}})}}),mu=rn({modStrict_:function(t,e){var n=qe(t,"a","modStrict"),r=qe(e,"b","modStrict");return v(n.shape,r.shape,"Error in modStrict: "),n.mod(r)}}),gu=rn({mul_:function(t,e){var n,r=qe(t,"a","mul"),a=qe(e,"b","mul");n=wt(r,a),r=n[0],a=n[1];var i=Gr(r.shape,a.shape);return At.runKernelFunc(function(t,e){var n=t.multiply(r,a);return e([r,a]),n},{a:r,b:a},function(t,e){var n=e[0],r=e[1];return{a:function(){var e=t.mul(r.toFloat()),a=jr(n.shape,i);return a.length>0?e.sum(a).reshape(n.shape):e},b:function(){var e=t.mul(n.toFloat()),a=jr(r.shape,i);return a.length>0?e.sum(a).reshape(r.shape):e}}},"Mul")}}),vu=rn({mulStrict_:function(t,e){var n=qe(t,"a","mul"),r=qe(e,"b","mul");return v(n.shape,r.shape,"Error in multiplyStrict: "),n.mul(r)}}),yu=rn({pow_:function(t,e){var n=qe(t,"base","pow"),r=qe(e,"exp","pow"),a=Gr(n.shape,r.shape);return t=n.cast(bt(n.dtype,r.dtype)),e=r.cast(bt(n.dtype,r.dtype)),At.runKernelFunc(function(t,e){var a=t.pow(n,r);return e([n,r,a]),a},{$base:n,$exp:r},function(t,e){var n=e[0],r=e[1],i=e[2];return{$base:function(){var e=r.toFloat(),i=t.mul(e.mul(n.pow(e.sub(cn(1))))),o=jr(n.shape,a);return o.length>0&&(i=i.sum(o)),i.reshape(n.shape)},$exp:function(){var e=n.greater(0),o=n.log().where(e,Sn(n)),s=t.mul(i.mul(o)),u=jr(r.shape,a);return u.length>0&&(s=s.sum(u)),s.reshape(r.shape)}}})}}),bu=rn({powStrict_:function(t,e){return v(t.shape,e.shape,"Error in powStrict: "),t.pow(e)}}),xu=rn({squaredDifference_:function(t,e){var n,r=qe(t,"a","squaredDifference"),a=qe(e,"b","squaredDifference");return n=wt(r,a),r=n[0],a=n[1],Gr(r.shape,a.shape),At.runKernelFunc(function(t,e){var n=t.squaredDifference(r,a);return e([r,a]),n},{$a:r,$b:a},function(t,e){var n=e[0],r=e[1],a=cn(2);return{$a:function(){return t.mul(n.sub(r).mul(a))},$b:function(){return t.mul(r.sub(n).mul(a))}}})}}),wu=rn({squaredDifferenceStrict_:function(t,e){var n=qe(t,"a","squaredDifferenceStrict"),r=qe(e,"b","squaredDifferenceStrict");return v(n.shape,r.shape,"Error in squaredDifferenceStrict: "),n.squaredDifference(r)}}),Cu=rn({sub_:function(t,e){var n,r=qe(t,"a","sub"),a=qe(e,"b","sub");n=wt(r,a),r=n[0],a=n[1];var i=Gr(r.shape,a.shape);return At.runKernelFunc(function(t){return t.subtract(r,a)},{a:r,b:a},function(t){return{a:function(){var e=t,n=jr(r.shape,i);return n.length>0&&(e=e.sum(n)),e.reshape(r.shape)},b:function(){var e=t,n=jr(a.shape,i);return n.length>0&&(e=e.sum(n)),e.neg().reshape(a.shape)}}},"Sub")}}),Nu=rn({subStrict_:function(t,e){var n=qe(t,"a","subStrict"),r=qe(e,"b","subStrict");return v(n.shape,r.shape,"Error in subStrict: "),n.sub(r)}}),Su=rn({equal_:function(t,e){var n,r=qe(t,"a","equal"),a=qe(e,"b","equal");return n=wt(r,a),r=n[0],a=n[1],Gr(r.shape,a.shape),At.runKernelFunc(function(t){return t.equal(r,a)},{$a:r,$b:a})}}),Iu=rn({equalStrict_:function(t,e){var n=qe(t,"a","equalStrict"),r=qe(e,"b","equalStrict");return v(n.shape,r.shape,"Error in equalStrict: "),n.equal(r)}}),ku=rn({greater_:function(t,e){var n,r=qe(t,"a","greater"),a=qe(e,"b","greater");return n=wt(r,a),r=n[0],a=n[1],Gr(r.shape,a.shape),At.runKernelFunc(function(t){return t.greater(r,a)},{$a:r,$b:a})}}),Eu=rn({greaterEqual_:function(t,e){var n,r=qe(t,"a","greaterEqual"),a=qe(e,"b","greaterEqual");return n=wt(r,a),r=n[0],a=n[1],Gr(r.shape,a.shape),At.runKernelFunc(function(t,e){var n=t.greaterEqual(r,a);return e([r,a]),n},{$a:r,$b:a},function(t,e){var n=e[0],r=e[1];return{$a:function(){return Sn(n)},$b:function(){return Sn(r)}}})}}),Au=rn({greaterEqualStrict_:function(t,e){var n=qe(t,"a","greaterEqualStrict"),r=qe(e,"b","greaterEqualStrict");return v(n.shape,r.shape,"Error in greaterEqualStrict: "),n.greaterEqual(r)}}),Ru=rn({greaterStrict_:function(t,e){var n=qe(t,"a","greaterStrict"),r=qe(e,"b","greaterStrict");return v(n.shape,r.shape,"Error in greaterStrict: "),n.greater(r)}}),Tu=rn({less_:function(t,e){var n,r=qe(t,"a","less"),a=qe(e,"b","less");return n=wt(r,a),r=n[0],a=n[1],Gr(r.shape,a.shape),At.runKernelFunc(function(t){return t.less(r,a)},{$a:r,$b:a})}}),Du=rn({lessEqual_:function(t,e){var n,r=qe(t,"a","lessEqual"),a=qe(e,"b","lessEqual");return n=wt(r,a),r=n[0],a=n[1],Gr(r.shape,a.shape),At.runKernelFunc(function(t){return t.lessEqual(r,a)},{$a:r,$b:a})}}),Ou=rn({lessEqualStrict_:function(t,e){var n=qe(t,"a","lessEqualStrict"),r=qe(e,"b","lessEqualStrict");return v(n.shape,r.shape,"Error in lessEqualStrict: "),n.lessEqual(r)}}),_u=rn({lessStrict_:function(t,e){var n=qe(t,"a","lessStrict"),r=qe(e,"b","lessStrict");return v(n.shape,r.shape,"Error in lessStrict: "),n.less(r)}}),Fu=rn({notEqual_:function(t,e){var n,r=qe(t,"a","notEqual"),a=qe(e,"b","notEqual");return n=wt(r,a),r=n[0],a=n[1],Gr(r.shape,a.shape),At.runKernelFunc(function(t){return t.notEqual(r,a)},{$a:r,$b:a})}}),Mu=rn({notEqualStrict_:function(t,e){var n=qe(t,"a","notEqualStrict"),r=qe(e,"b","notEqualStrict");return v(n.shape,r.shape,"Error in notEqualStrict: "),n.notEqual(r)}});function zu(t,e){for(var n=[],r=t;r0,function(){return"mask cannot be scalar"}),v(u.slice(o,o+s),i.shape,"mask's shape must match the first K dimensions of tensor's shape,"),l=1,c=o;c=2&&o.rank>=2&&i.rank===o.rank,function(){return"Error in matMul: inputs must have the same rank of at least 2, got ranks "+i.rank+" and "+o.rank+"."}),g(w(p,h),function(){return"Error in matMul: outer dimensions ("+p+") and ("+h+") of Tensors with shapes "+i.shape+" and "+o.shape+" must match."}),g(s===u,function(){return"Error in matMul: inner shapes ("+s+") and ("+u+") of Tensors with shapes "+i.shape+" and "+o.shape+" and transposeA="+n+" and transposeB="+r+" must match."});var m=i.shape.slice(0,-2).concat([l,c]),v=n?i.as3D(f,s,l):i.as3D(f,l,s),y=r?o.as3D(d,c,u):o.as3D(d,u,c),b={transposeA:n,transposeB:r};return At.runKernelFunc(function(t,e){var a=t.batchMatMul(v,y,n,r);return e([v,y]),a},{a:v,b:y},function(t,e){var a=e,i=a[0],o=a[1];return n||r?!n&&r?{a:function(){return t.matMul(o,!1,!1)},b:function(){return t.matMul(i,!0,!1)}}:n&&!r?{a:function(){return o.matMul(t,!1,!0)},b:function(){return i.matMul(t,!1,!1)}}:{a:function(){return o.matMul(t,!0,!0)},b:function(){return t.matMul(i,!0,!0)}}:{a:function(){return t.matMul(o,!1,!0)},b:function(){return i.matMul(t,!0,!1)}}},"BatchMatMul",b).reshape(m)}}),nl=rn({dot_:function(t,e){var n=qe(t,"t1","dot"),r=qe(e,"t2","dot");g(!(1!==n.rank&&2!==n.rank||1!==r.rank&&2!==r.rank),function(){return"Error in dot: inputs must all be rank 1 or 2, but got ranks "+n.rank+" and "+r.rank+"."});var a=1===n.rank?n.size:n.shape[1],i=1===r.rank?r.size:r.shape[0];return g(a===i,function(){return"Error in dot: inner dimensions of inputs must match, but got "+a+" and "+i+"."}),1===n.rank&&1===r.rank?n.as2D(1,-1).matMul(r.as2D(-1,1)).asScalar():1===n.rank&&2===r.rank?n.as2D(1,-1).matMul(r.as2D(r.shape[0],r.shape[1])).as1D():2===n.rank&&1===r.rank?n.matMul(r.as2D(-1,1)).as1D():n.matMul(r.as2D(r.shape[0],r.shape[1]))}}),rl=rn({outerProduct_:function(t,e){var n=qe(t,"v1","outerProduct"),r=qe(e,"v2","outerProduct");return g(1===n.rank&&1===r.rank,function(){return"Error in outerProduct: inputs must be rank 1, but got ranks "+n.rank+" and "+r.rank+"."}),n.as2D(-1,1).matMul(r.as2D(1,-1))}}),al=rn({reverse_:function(t,e){var n=qe(t,"x","reverse");if(0===n.rank)return n.clone();var r=A(e,n.shape);return At.runKernelFunc(function(t){return t.reverse(n,r)},{$x:n},function(t){return{$x:function(){return t.reverse(r)}}}).reshapeAs(n)}}),il=rn({reverse1d_:function(t){var e=qe(t,"x","reverse");return g(1===e.rank,function(){return"Error in reverse1D: x must be rank 1 but got rank "+e.rank+"."}),al(e,0)}}),ol=rn({reverse2d_:function(t,e){var n=qe(t,"x","reverse");return g(2===n.rank,function(){return"Error in reverse2D: x must be rank 2 but got rank "+n.rank+"."}),al(n,e)}}),sl=rn({reverse3d_:function(t,e){var n=qe(t,"x","reverse");return g(3===n.rank,function(){return"Error in reverse3D: x must be rank 3 but got rank "+n.rank+"."}),al(n,e)}}),ul=rn({reverse4d_:function(t,e){var n=qe(t,"x","reverse");return g(4===n.rank,function(){return"Error in reverse4D: x must be rank 4 but got rank "+n.rank+"."}),al(n,e)}});function ll(t,e,n,r,a,i){var o=qe(t,"x","maxPool"),s=o,u=!1;3===o.rank&&(u=!0,s=o.as4D(1,o.shape[0],o.shape[1],o.shape[2])),null==r&&(r=[1,1]),g(4===s.rank,function(){return"Error in maxPool: input must be rank 4 but got rank "+s.rank+"."}),g(ea(n,r),function(){return"Error in maxPool: Either strides or dilations must be 1. Got strides "+n+" and dilations '"+r+"'"}),null!=i&&g(C(a),function(){return"Error in maxPool: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+a+"."});var l=qr(s.shape,e,n,r,a,i),c=At.runKernelFunc(function(t,e){var n=t.maxPool(s,l);return e([s,n]),n},{x:s},function(t,i){var o=i[0],s=i[1];return{x:function(){return function(t,e,n,r,a,i,o,s){var u=qe(t,"dy","maxPoolBackprop"),l=qe(e,"input","maxPoolBackprop"),c=qe(n,"output","maxPoolBackprop");g(l.rank===u.rank,function(){return"Rank of input ("+l.rank+") does not match rank of dy ("+u.rank+")"}),null==i&&(i=[1,1]),g(ea(a,i),function(){return"Error in maxPoolBackProp: Either strides or dilations must be 1. Got strides "+a+" and dilations '"+i+"'"}),g(4===u.rank,function(){return"Error in maxPoolBackprop: dy must be rank 4 but got rank "+u.rank+"."}),g(4===l.rank,function(){return"Error in maxPoolBackprop: input must be rank 4 but got rank "+l.rank+"."});var p=qr(l.shape,r,a,i,o,s);return At.runKernelFunc(function(t){return t.maxPoolBackprop(u,l,c,p)},{$dy:u,$input:l})}(t,o,s,e,n,r,a)}}});return u?c.as3D(c.shape[1],c.shape[2],c.shape[3]):c}function cl(t,e,n,r,a,i){var o=qe(t,"x","avgPool","float32");null==r&&(r=[1,1]),g(ea(n,r),function(){return"Error in avgPool: Either strides or dilations must be 1. Got strides "+n+" and dilations '"+r+"'"});var s=o,u=!1;3===o.rank&&(u=!0,s=o.as4D(1,o.shape[0],o.shape[1],o.shape[2])),g(4===s.rank,function(){return"Error in avgPool: x must be rank 4 but got rank "+s.rank+"."}),null!=i&&g(C(a),function(){return"Error in avgPool: pad must be an integer when using, dimRoundingMode "+i+" but got pad "+a+"."});var l=qr(s.shape,e,n,r,a,i),c=At.runKernelFunc(function(t){return t.avgPool(s,l)},{x:s},function(t){return{x:function(){return function(t,e,n,r,a,i){var o=qe(t,"dy","avgPoolBackprop"),s=qe(e,"input","avgPoolBackprop");g(s.rank===o.rank,function(){return"Rank of input ("+s.rank+") does not match rank of dy ("+o.rank+")"}),null==a&&(a=[1,1]),g(ea(r,a),function(){return"Error in avgPoolBackprop: Either strides or dilations must be 1. Got strides "+r+" and dilations '"+a+"'"});var u=s,l=o,c=!1;3===s.rank&&(c=!0,u=s.as4D(1,s.shape[0],s.shape[1],s.shape[2]),l=o.as4D(1,o.shape[0],o.shape[1],o.shape[2])),g(4===l.rank,function(){return"Error in avgPoolBackprop: dy must be rank 4 but got rank "+l.rank+"."}),g(4===u.rank,function(){return"Error in avgPoolBackprop: input must be rank 4 but got rank "+u.rank+"."});var p=qr(u.shape,n,r,a,i),h=At.runKernelFunc(function(t){return t.avgPoolBackprop(l,u,p)},{dy4D:l,input4D:u});return c?h.as3D(h.shape[1],h.shape[2],h.shape[3]):h}(t,s,e,n,r,a)}}});return c=c.cast(o.dtype),u?c.as3D(c.shape[1],c.shape[2],c.shape[3]):c}var pl=rn({maxPool_:function(t,e,n,r,a){return ll(t,e,n,1,r,a)}}),hl=rn({avgPool_:function(t,e,n,r,a){return cl(t,e,n,1,r,a)}}),fl=rn({pool_:function(t,e,n,r,a,i){null==a&&(a=[1,1]),null==i&&(i=1),0===r&&(r="valid");var o=qe(t,"x","maxPool"),s=o,u=!1;3===o.rank&&(u=!0,s=o.as4D(1,o.shape[0],o.shape[1],o.shape[2])),g(ea(i,a),function(){return"Error in pool: Either strides or dilations must be 1. Got strides "+i+" and dilations '"+a+"'"});var l,c=qr(s.shape,e,i,a,r),p=[c.dilationHeight,c.dilationWidth];l="same"===r?function(t,e){var n=t.map(function(t,n){return t+(t-1)*(e[n]-1)}).map(function(t){return t-1}),r=n.map(function(t){return Math.floor(t/2)}),a=n.map(function(t,e){return t-r[e]});return n.map(function(t,e){return[r[e],a[e]]})}([c.filterHeight,c.filterWidth],p):[[0,0],[0,0]];var h=1===p[0]&&1===p[1],f=function(t,e,n){var r=n.map(function(t){return t[0]}),a=n.map(function(t){return t[1]}),i=t.concat(r,a),o=e.map(function(t,e){return(t-i[e]%t)%t}),s=a.map(function(t,e){return t+o[e]});return[e.map(function(t,e){return[r[e],s[e]]}),e.map(function(t,e){return[0,o[e]]})]}([c.inHeight,c.inWidth],p,l),d=f[0],m=f[1],v=h?r:"valid",y=h?s:cr(s,p,d),b=("avg"===n?function(){return cl(y,e,i,1,v)}:function(){return ll(y,e,i,1,v)})(),x=h?b:qn(b,p,m);return u?x.as3D(x.shape[1],x.shape[2],x.shape[3]):x}}),dl=rn({maxPool3d_:function(t,e,n,r,a,i,o){void 0===i&&(i="NDHWC");var s=qe(t,"x","maxPool3d"),u=s,l=!1;4===s.rank&&(l=!0,u=s.as5D(1,s.shape[0],s.shape[1],s.shape[2],s.shape[3])),null==o&&(o=[1,1,1]),g(5===u.rank,function(){return"Error in maxPool3d: x must be rank 5 but got rank "+u.rank+"."}),g("NDHWC"===i,function(){return"Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of "+i}),g(ea(n,o),function(){return"Error in maxPool3d: Either strides or dilations must be 1. Got strides "+n+" and dilations '"+o+"'"}),null!=a&&g(C(r),function(){return"Error in maxPool3d: pad must be an integer when using, dimRoundingMode "+a+" but got pad "+r+"."});var c=Hr(u.shape,e,n,o,r,a,i),p=At.runKernelFunc(function(t,e){var n=t.maxPool3d(u,c);return e([u,n]),n},{x:u},function(t,i){var s=i[0],u=i[1];return{x:function(){return function(t,e,n,r,a,i,o,s){var u=qe(t,"dy","maxPool3dBackprop"),l=qe(e,"input","maxPool3dBackprop"),c=qe(n,"output","maxPool3dBackprop"),p=u,h=l,f=c,d=!1;4===l.rank&&(d=!0,p=u.as5D(1,u.shape[0],u.shape[1],u.shape[2],u.shape[3]),h=l.as5D(1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]),f=c.as5D(1,c.shape[0],c.shape[1],c.shape[2],c.shape[3])),g(5===p.rank,function(){return"Error in maxPool3dBackprop: dy must be rank 5 but got rank "+p.rank+"."}),g(5===h.rank,function(){return"Error in maxPool3dBackprop: input must be rank 5 but got rank "+h.rank+"."}),g(5===f.rank,function(){return"Error in maxPool3dBackprop: output must be rank 5 but got rank "+f.rank+"."}),null==i&&(i=[1,1,1]),g(ea(a,i),function(){return"Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides "+a+" and dilations '"+i+"'"}),null!=s&&g(C(o),function(){return"Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode "+s+" but got pad "+o+"."});var m=Hr(h.shape,r,a,i,o,s),v=At.runKernelFunc(function(t){return t.maxPool3dBackprop(p,h,f,m)},{dy5D:p,input5D:h});return d?v.as4D(v.shape[1],v.shape[2],v.shape[3],v.shape[4]):v}(t,s,u,e,n,o,r,a)}}});return l?p.as4D(p.shape[1],p.shape[2],p.shape[3],p.shape[4]):p}}),ml=rn({avgPool3d_:function(t,e,n,r,a,i,o){void 0===i&&(i="NDHWC");var s=qe(t,"x","avgPool3d","float32"),u=s,l=!1;4===s.rank&&(l=!0,u=s.as5D(1,s.shape[0],s.shape[1],s.shape[2],s.shape[3])),null==o&&(o=[1,1,1]),g(5===u.rank,function(){return"Error in avgPool3d: x must be rank 5 but got rank "+u.rank+"."}),g("NDHWC"===i,function(){return"Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of "+i}),g(ea(n,o),function(){return"Error in avgPool3d: Either strides or dilations must be 1. Got strides "+n+" and dilations '"+o+"'"}),null!=a&&g(C(r),function(){return"Error in avgPool3d: pad must be an integer when using, dimRoundingMode "+a+" but got pad "+r+"."});var c=Hr(u.shape,e,n,o,r,a,i),p=At.runKernelFunc(function(t){return t.avgPool3d(u,c)},{x:u},function(t){return{x:function(){return function(t,e,n,r,a,i,o){var s=qe(t,"dy","avgPool3dBackprop"),u=qe(e,"input","avgPool3dBackprop"),l=s,c=u,p=!1;4===u.rank&&(p=!0,l=s.as5D(1,s.shape[0],s.shape[1],s.shape[2],s.shape[3]),c=u.as5D(1,u.shape[0],u.shape[1],u.shape[2],u.shape[3])),g(5===l.rank,function(){return"Error in avgPool3dBackprop: dy must be rank 5 but got rank "+l.rank+"."}),g(5===c.rank,function(){return"Error in avgPool3dBackprop: input must be rank 5 but got rank "+c.rank+"."}),null==a&&(a=[1,1,1]),g(ea(r,a),function(){return"Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides "+r+" and dilations '"+a+"'"}),null!=o&&g(C(i),function(){return"Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode "+o+" but got pad "+i+"."});var h=Hr(c.shape,n,r,a,i,o),f=At.runKernelFunc(function(t){return t.avgPool3dBackprop(l,c,h)},{dy5D:l,input5D:c});return p?f.as4D(f.shape[1],f.shape[2],f.shape[3],f.shape[4]):f}(t,u,e,n,o,r,a)}}});return p=p.cast(u.dtype),l?p.as4D(p.shape[1],p.shape[2],p.shape[3],p.shape[4]):p}}),gl=rn({slice_:function(t,e,n){var r,a,i=qe(t,"x","slice");if(0===i.rank)throw new Error("Slicing scalar is not possible");(r="number"==typeof e?[e].concat(new Array(i.rank-1).fill(0)):e.length=0?t:(g(-1===t,function(){return"Negative size values should be exactly -1 but got "+t+" for the slice() size at index "+e+"."}),i.shape[e]-r[e])}),kr(i,r,a);var o=i.shape,s={begin:r,size:a};return At.runKernelFunc(function(t){return t.slice(i,r,a)},{x:i},function(t){for(var e=[],n=0;n0&&(e=e.sum(i)),e.reshape(r.shape)}}},"Prelu")}}),zl=rn({relu_:function(t){var e=qe(t,"x","relu");return"bool"===e.dtype?e.toInt():At.runKernelFunc(function(t,n){var r=t.relu(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){return t.mulStrict(n.step().toFloat())}}})}}),Ll=rn({relu6_:function(t){var e=qe(t,"x","relu6");return"bool"===e.dtype?e.toInt():At.runKernelFunc(function(t,n){var r=t.relu6(e);return n([e]),r},{$x:e},function(t,e){var n=e[0],r=n.lessEqual(6).mul(n.step());return{$x:function(){return t.mulStrict(r.toFloat())}}})}}),Bl=rn({selu_:function(t){var e=qe(t,"x","selu");return At.runKernelFunc(function(t,n){var r=t.selu(e);return n([e]),r},{$x:e},function(t,e){var n=e[0];return{$x:function(){var e=n.greater(cn(0)),r=cn(Do),a=cn(Oo),i=t.mul(a),o=t.mul(r).mul(n.toFloat().exp());return eu(e,i,o)}}})}}),Pl=rn({transpose_:function(t,e){var n=qe(t,"x","transpose");return null==e&&(e=n.shape.map(function(t,e){return e}).reverse()),g(n.rank===e.length,function(){return"Error in transpose: rank of input "+n.rank+" must match length of perm "+e+"."}),e.forEach(function(t){g(t>=0&&ta)throw new Error("'k' passed to topk() must be <= the last dimension ("+a+") but got "+e);var i=At.runKernelFunc(function(t){return t.topk(r,e,n)},{$x:r});return{values:i[0],indices:i[1]}}}),Kl=rn({scatterND_:function(t,e,n){var r=qe(t,"indices","scatterND","int32"),a=qe(e,"updates","scatterND");return function(t,e,n){if(e.rank<1)throw new Error("tf.scatterND() expects the indices to be rank 1 or higher, but the rank was "+e.rank+".");if(t.rank<1)throw new Error("tf.scatterND() expects the updates to be rank 1 or higher, but the rank was "+t.rank+".");if("int32"!==e.dtype)throw new Error("The dtype of 'indices' should be int32, but got dtype: "+e.dtype);if(n.length<1)throw new Error("Output rank must be greater or equal to 1, but got shape: "+n);if(0===n.length){if(0===e.size)throw new Error("Indices specified for empty output. indices shape: "+e.shape);if(0===t.size)throw new Error("Updates specified for empty output. updates shape: "+t.shape)}!function(t,e,n){var r=e.rank>1?e.shape[e.rank-1]:1,a=e.rank>1?e.rank-1:1,i="Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: "+n.shape+", indices.shape: "+e.shape+", shape: "+t+", sliceDim: "+r+", and batchDim: "+a+".";if(n.rankr){var s=t.shape.map(function(t){return t});s[t.shape.length-1]=e-r,n=t.concat(bn(s),t.shape.length-1),r=e}else n=t;var u=n.zerosLike(),l=an(n,u).as2D(a,r),c=Xl(l),p=Math.floor(r/2)+1,h=on(c),f=sn(c),d=h.split([p,r-p],h.shape.length-1),m=f.split([p,r-p],f.shape.length-1),v=n.shape.slice();return v[n.shape.length-1]=p,an(d[0],m[0]).reshape(v)}}),Jl=rn({irfft_:function(t){var e=t.shape[t.shape.length-1],n=t.size/e;if(e<=2){var r=t.as2D(n,e),a=$l(r);return on(a)}var i=[n,2*(e-1)],o=on(t).as2D(n,e),s=sn(t).as2D(n,e),u=o.slice([0,1],[n,e-2]).reverse(1),l=s.slice([0,1],[n,e-2]).reverse(1).mul(cn(-1)),c=o.concat(u,1),p=s.concat(l,1);return r=an(c,p).as2D(i[0],i[1]),a=$l(r),on(a)}}),Zl=Object.freeze({fft:Xl,ifft:$l,rfft:Yl,irfft:Jl}),Ql=rn({sparseToDense_:function(t,e,n,r){void 0===r&&(r=0);var a=qe(t,"sparseIndices","sparseToDense","int32"),i=qe(e,"sparseValues","sparseToDense"),o=qe(r,"defaultValue","sparseToDense",i.dtype);return function(t,e,n,r){if("int32"!==t.dtype)throw new Error("tf.sparseToDense() expects the indices to be int32 type, but the dtype was "+t.dtype+".");if(t.rank>2)throw new Error("sparseIndices should be a scalar, vector, or matrix, but got shape "+t.shape+".");var a=t.rank>0?t.shape[0]:1,i=t.rank>1?t.shape[1]:1;if(n.length!==i)throw new Error("outputShape has incorrect number of elements:, "+n.length+", should be: "+i+".");var o=e.size;if(0!==e.rank&&(1!==e.rank||o!==a))throw new Error("sparseValues has incorrect shape "+e.shape+", should be [] or ["+a+"]");if(e.dtype!==r.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}(a,i,n,o),At.runKernelFunc(function(t){return t.sparseToDense(a,i,n,o)},{$sparseIndices:a,$sparseValues:i,$defaultValue:o})}}),tc=rn({gatherND_:function(t,e){var n=qe(e,"indices","gatherND","int32"),r=qe(t,"x","gatherND");return At.runKernelFunc(function(t){return t.gatherND(r,n)},{$x:r,$indices:n})}}),ec=rn({diag_:function(t){var e=qe(t,"x","diag").flatten(),n=t.shape.concat(t.shape);return At.runKernelFunc(function(t){return t.diag(e)},{$x:e}).reshape(n)}}),nc=rn({dropout_:function(t,e,n,r){var a=qe(t,"x","dropout");if(g("float32"===a.dtype,function(){return"x has to be a floating point tensor since it's going to be scaled, but got a "+a.dtype+" tensor instead."}),g(e>=0&&e<1,function(){return"rate must be a float in the range [0, 1), but got "+e+"."}),0===e)return t instanceof ht?a.clone():a;var i=function(t,e){if(null==e)return t.shape.slice();if(w(t.shape,e))return e;if(t.shape.length===e.length){for(var n=[],r=0;r1,function(){return"inTopK() expects the predictions to be of rank 2 or higher, but got "+r.rank}),g(r.rank-1===i.rank,function(){return"predictions rank should be 1 larger than targets rank, but got predictions rank "+r.rank+" and targets rank "+i.rank}),v(r.shape.slice(0,r.shape.length-1),i.shape,"predictions's shape should be align with the targets' shape, except the last dimension."),o=r.shape[r.shape.length-1],g(n>0&&n<=o,function(){return"'k' passed to inTopK() must be > 0 && <= the predictions last dimension ("+o+"), but got "+n}),[4,r.data()];case 1:return s=a.sent(),[4,i.data()];case 2:for(u=a.sent(),l=[s.length/o,o],p=l[1],h=T("bool",c=l[0]),f=0;f1?u.div(cn(s)):u}if(r===t.Reduction.SUM_BY_NONZERO_WEIGHTS){if(null==i)return o.sum().div(cn(a.size));var l=i.mul(yn(a.shape)).notEqual(cn(0)).sum().toFloat();return o.sum().div(l)}throw Error("Unknown reduction: "+r)}}),hc=rn({cosineDistance_:function(e,n,r,a,i){void 0===i&&(i=t.Reduction.SUM_BY_NONZERO_WEIGHTS);var o=qe(e,"labels","cosineDistance"),s=qe(n,"predictions","cosineDistance"),u=null;null!=a&&(u=qe(a,"weights","cosineDistance")),v(o.shape,s.shape,"Error in cosineDistance: ");var l=cn(1).sub(o.mul(s).sum(r,!0));return pc(l,u,i)}}),fc=rn({hingeLoss_:function(e,n,r,a){void 0===a&&(a=t.Reduction.SUM_BY_NONZERO_WEIGHTS);var i=qe(e,"labels","hingeLoss"),o=qe(n,"predictions","hingeLoss"),s=null;null!=r&&(s=qe(r,"weights","hingeLoss")),v(i.shape,o.shape,"Error in hingeLoss: ");var u=cn(1);i=cn(2).mul(i).sub(u);var l=u.sub(i.mul(o)).relu();return pc(l,s,a)}}),dc=rn({huberLoss_:function(e,n,r,a,i){void 0===a&&(a=1),void 0===i&&(i=t.Reduction.SUM_BY_NONZERO_WEIGHTS);var o=qe(e,"labels","huberLoss"),s=qe(n,"predictions","huberLoss"),u=null;null!=r&&(u=qe(r,"weights","huberLoss")),v(o.shape,s.shape,"Error in huberLoss: ");var l=cn(a),c=s.sub(o).abs(),p=hu(c,l),h=c.sub(p),f=cn(.5).mul(p.square()).add(l.mul(h));return pc(f,u,i)}}),mc=rn({logLoss_:function(e,n,r,a,i){void 0===a&&(a=1e-7),void 0===i&&(i=t.Reduction.SUM_BY_NONZERO_WEIGHTS);var o=qe(e,"labels","logLoss"),s=qe(n,"predictions","logLoss"),u=null;null!=r&&(u=qe(r,"weights","logLoss")),v(o.shape,s.shape,"Error in logLoss: ");var l=cn(1),c=cn(a),p=o.mul(s.add(c).log()).neg().sub(l.sub(o).mul(l.sub(s).add(c).log()));return pc(p,u,i)}}),gc=rn({meanSquaredError_:function(e,n,r,a){void 0===a&&(a=t.Reduction.SUM_BY_NONZERO_WEIGHTS);var i=qe(e,"labels","meanSquaredError"),o=qe(n,"predictions","meanSquaredError"),s=null;null!=r&&(s=qe(r,"weights","meanSquaredError")),v(i.shape,o.shape,"Error in meanSquaredError: ");var u=i.squaredDifference(o);return pc(u,s,a)}}),vc=rn({sigmoidCrossEntropy_:function(e,n,r,a,i){void 0===a&&(a=0),void 0===i&&(i=t.Reduction.SUM_BY_NONZERO_WEIGHTS);var o=qe(e,"multiClassLabels","sigmoidCrossEntropy"),s=qe(n,"logits","sigmoidCrossEntropy"),u=null;if(null!=r&&(u=qe(r,"weights","sigmoidCrossEntropy")),v(o.shape,s.shape,"Error in sigmoidCrossEntropy: "),a>0){var l=cn(a),c=cn(1),p=cn(.5);o=o.mul(c.sub(l)).add(p.mul(l))}var h=function(t,e){var n=qe(t,"labels","sigmoidCrossEntropyWithLogits"),r=qe(e,"logits","sigmoidCrossEntropyWithLogits");v(n.shape,r.shape,"Error in sigmoidCrossEntropyWithLogits: ");var a=r.relu(),i=r.mul(n),o=r.abs().neg().exp().log1p();return a.sub(i).add(o)}(o,s);return pc(h,u,i)}}),yc=rn({softmaxCrossEntropy_:function(e,n,r,a,i){void 0===a&&(a=0),void 0===i&&(i=t.Reduction.SUM_BY_NONZERO_WEIGHTS);var o=qe(e,"onehotLabels","softmaxCrossEntropy"),s=qe(n,"logits","softmaxCrossEntropy"),u=null;if(null!=r&&(u=qe(r,"weights","softmaxCrossEntropy")),v(o.shape,s.shape,"Error in softmaxCrossEntropy: "),a>0){var l=cn(a),c=cn(1),p=cn(o.shape[1]);o=o.mul(c.sub(l)).add(l.div(p))}var h=function(t,e,n){if(void 0===n&&(n=-1),-1===n&&(n=e.rank-1),n!==e.rank-1)throw Error("Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank "+e.rank+" and dim was "+n);return Mr(function(t,e,r){var a=e.logSumExp([n],!0),i=e.toFloat().sub(a);return r([t,i]),{value:i.mul(t).neg().sum([n]),gradFunc:function(t,e){var r=e[0],a=e[1],i=Ye(t.shape,[n]);return[t.reshape(i).mul(r.toFloat().sub(a.exp())),t.reshape(i).mul(a.exp().sub(r.toFloat()))]}}})(t,e)}(o,s);return pc(h,u,i)}}),bc=Object.freeze({get Reduction(){return t.Reduction},absoluteDifference:cc,computeWeightedLoss:pc,cosineDistance:hc,hingeLoss:fc,huberLoss:dc,logLoss:mc,meanSquaredError:gc,sigmoidCrossEntropy:vc,softmaxCrossEntropy:yc});function xc(t,e){return void 0===e&&(e=!1),At.tidy(function(){if(2!==t.shape.length)throw new Error("qr2d() requires a 2D Tensor, but got a "+t.shape.length+"D Tensor.");for(var n=t.shape[0],r=t.shape[1],a=Jn(n),i=t.clone(),o=hn([[1]],[1,1]),s=o.clone(),u=n>=r?r:n,l=function(t){var e,u=i,l=s,c=a;e=At.tidy(function(){var e=i.slice([t,t],[n-t,1]),u=e.norm(),l=i.slice([t,t],[1,1]),c=hn([[-1]]).where(l.greater(0),hn([[1]])),p=l.sub(c.mul(u)),h=e.div(p);s=1===h.shape[0]?o.clone():o.concat(h.slice([1,0],[h.shape[0]-1,h.shape[1]]),0);var f=c.matMul(p).div(u).neg(),d=i.slice([t,0],[n-t,r]),m=f.mul(s);if(0===t)i=d.sub(m.matMul(s.transpose().matMul(d)));else{var g=d.sub(m.matMul(s.transpose().matMul(d)));i=i.slice([0,0],[t,r]).concat(g,0)}var v=a.slice([0,t],[n,a.shape[1]-t]);if(0===t)a=v.sub(v.matMul(s).matMul(m.transpose()));else{var y=v.sub(v.matMul(s).matMul(m.transpose()));a=a.slice([0,0],[n,t]).concat(y,1)}return[s,i,a]}),s=e[0],i=e[1],a=e[2],Pe([u,l,c])},c=0;cr&&(a=a.slice([0,0],[n,r]),i=i.slice([0,0],[r,r])),[a,i]})}var wc=rn({gramSchmidt_:function(t){var e;if(Array.isArray(t)){e=!1,g(null!=t&&t.length>0,function(){return"Gram-Schmidt process: input must not be null, undefined, or empty"});for(var n=t[0].shape[0],r=function(e){g(t[e].shape[0]===n,function(){return"Gram-Schmidt: Non-unique lengths found in the input vectors: ("+t[e].shape[0]+" vs. "+n+")"})},a=1;a0)for(var n=0;n= 2, but got rank "+t.rank);if(2===t.rank)return xc(t,e);var n=t.shape.slice(0,t.shape.length-2).reduce(function(t,e){return t*e}),r=[],a=[];return mr(t.reshape([n,t.shape[t.shape.length-2],t.shape[t.shape.length-1]]),0).forEach(function(t){var n=xc(t,e),i=n[0],o=n[1];r.push(i),a.push(o)}),[hr(r,0).reshape(t.shape),hr(a,0).reshape(t.shape)]}}),Nc=Object.freeze({gramSchmidt:wc,qr:Cc});function Sc(t,e,n,r,a){null==r&&(r=.5),null==a&&(a=Number.NEGATIVE_INFINITY);var i=t.shape[0];return n=Math.min(n,i),g(0<=r&&r<=1,function(){return"iouThreshold must be in [0, 1], but was '"+r+"'"}),g(2===t.rank,function(){return"boxes must be a 2D tensor, but was of rank '"+t.rank+"'"}),g(4===t.shape[1],function(){return"boxes must have 4 columns, but 2nd dimension was "+t.shape[1]}),g(1===e.rank,function(){return"scores must be a 1D tensor"}),g(e.shape[0]===i,function(){return"scores has incompatible shape with boxes. Expected "+i+", but was "+e.shape[0]}),{maxOutputSize:n,iouThreshold:r,scoreThreshold:a}}var Ic=rn({resizeBilinear_:function(t,e,n){void 0===n&&(n=!1);var r=qe(t,"images","resizeBilinear");g(3===r.rank||4===r.rank,function(){return"Error in resizeBilinear: x must be rank 3 or 4, but got rank "+r.rank+"."}),g(2===e.length,function(){return"Error in resizeBilinear: new shape must 2D, but got shape "+e+"."});var a=r,i=!1;3===r.rank&&(i=!0,a=r.as4D(1,r.shape[0],r.shape[1],r.shape[2]));var o=e[0],s=e[1],u=At.runKernelFunc(function(t,e){return e([a]),t.resizeBilinear(a,o,s,n)},{batchImages:a},function(t,e){return{batchImages:function(){return At.runKernelFunc(function(r){return r.resizeBilinearBackprop(t,e[0],n)},{})}}});return i?u.as3D(u.shape[1],u.shape[2],u.shape[3]):u}}),kc=rn({resizeNearestNeighbor_:function(t,e,n){void 0===n&&(n=!1);var r=qe(t,"images","resizeNearestNeighbor");g(3===r.rank||4===r.rank,function(){return"Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank "+r.rank+"."}),g(2===e.length,function(){return"Error in resizeNearestNeighbor: new shape must 2D, but got shape "+e+"."}),g("float32"===r.dtype||"int32"===r.dtype,function(){return"`images` must have `int32` or `float32` as dtype"});var a=r,i=!1;3===r.rank&&(i=!0,a=r.as4D(1,r.shape[0],r.shape[1],r.shape[2]));var o=e[0],s=e[1],u=At.runKernelFunc(function(t,e){return e([a]),t.resizeNearestNeighbor(a,o,s,n)},{batchImages:a},function(t,e){return{batchImages:function(){return At.runKernelFunc(function(r){return r.resizeNearestNeighborBackprop(t,e[0],n)},{})}}});return i?u.as3D(u.shape[1],u.shape[2],u.shape[3]):u}}),Ec=rn({nonMaxSuppression_:function(t,e,n,r,a){void 0===r&&(r=.5),void 0===a&&(a=Number.NEGATIVE_INFINITY);var i=qe(t,"boxes","nonMaxSuppression"),o=qe(e,"scores","nonMaxSuppression"),s=Sc(i,o,n,r,a);return n=s.maxOutputSize,r=s.iouThreshold,a=s.scoreThreshold,At.runKernelFunc(function(t){return t.nonMaxSuppression(i,o,n,r,a)},{$boxes:i})}}),Ac=rn({cropAndResize_:function(t,e,n,r,a,i){var o=qe(t,"image","cropAndResize","float32"),s=qe(e,"boxes","cropAndResize","float32"),u=qe(n,"boxInd","cropAndResize","int32");a=a||"bilinear",i=i||0;var l=s.shape[0];return g(4===o.rank,function(){return"Error in cropAndResize: image must be rank 4,but got rank "+o.rank+"."}),g(2===s.rank&&4===s.shape[1],function(){return"Error in cropAndResize: boxes must be have size ["+l+",4] but had shape "+s.shape+"."}),g(1===u.rank&&u.shape[0]===l,function(){return"Error in cropAndResize: boxInd must be have size ["+l+"] but had shape "+s.shape+"."}),g(2===r.length,function(){return"Error in cropAndResize: cropSize must be of length 2, but got length "+r.length+"."}),g(r[0]>=1&&r[1]>=1,function(){return"cropSize must be atleast [1,1], but was "+r}),g("bilinear"===a||"nearest"===a,function(){return"method must be bilinear or nearest, but was "+a}),At.runKernelFunc(function(t,e){return t.cropAndResize(o,s,u,r,a,i)},{$image:o,$boxes:s})}}),Rc=Object.freeze({resizeBilinear:Ic,resizeNearestNeighbor:kc,nonMaxSuppression:Ec,nonMaxSuppressionAsync:function(t,e,n,i,o){return void 0===i&&(i=.5),void 0===o&&(o=Number.NEGATIVE_INFINITY),r(this,void 0,void 0,function(){var r,s,u,l,c,p,h;return a(this,function(a){switch(a.label){case 0:return r=qe(t,"boxes","nonMaxSuppressionAsync"),s=qe(e,"scores","nonMaxSuppressionAsync"),u=Sc(r,s,n,i,o),n=u.maxOutputSize,i=u.iouThreshold,o=u.scoreThreshold,[4,Promise.all([r.data(),s.data()])];case 1:return l=a.sent(),c=l[0],p=l[1],h=pa(c,p,n,i,o),r!==t&&r.dispose(),s!==e&&s.dispose(),[2,h]}})})},cropAndResize:Ac}),Tc=function(t,e){return!(t>0||"linear"!==e&&"relu"!==e)},Dc=function(t,e,n){if(null==n||"linear"===n)return t;if("relu"===n)return t.mul(e.step());throw new Error("Gradient for activation "+n+" has not been implemented yet.")},Oc=function(t,e){var n=e,r=jr(t.shape,e.shape);return r.length>0&&(n=n.sum(r)),n.reshape(t.shape)},_c=function(t,e,n){if("linear"===e)return t;if("relu"===e)return zl(t);if("elu"===e)return _l(t);if("relu6"===e)return Ll(t);if("prelu"===e)return Ml(t,n);throw new Error("Unknown fused activation "+e+".")},Fc=rn({matMul_:function(t){var e,n=t.a,r=t.b,a=t.transposeA,i=void 0!==a&&a,o=t.transposeB,s=void 0!==o&&o,u=t.bias,l=t.activation,c=void 0===l?"linear":l,p=t.preluActivationWeights;if(!1===Tc(At.state.gradientDepth,c)){var h=el(n,r,i,s);return null!=u&&(h=ru(h,u)),_c(h,c,p)}var f=qe(n,"a","fused matMul"),d=qe(r,"b","fused matMul");e=wt(f,d),f=e[0],d=e[1];var m=i?f.shape[f.rank-2]:f.shape[f.rank-1],v=s?d.shape[d.rank-1]:d.shape[d.rank-2],y=i?f.shape[f.rank-1]:f.shape[f.rank-2],b=s?d.shape[d.rank-2]:d.shape[d.rank-1],C=f.shape.slice(0,-2),N=d.shape.slice(0,-2),S=x(C),I=x(N);g(f.rank>=2&&d.rank>=2&&f.rank===d.rank,function(){return"Error in fused matMul: inputs must have the same rank of at least 2, got ranks "+f.rank+" and "+d.rank+"."}),g(w(C,N),function(){return"Error in fused matMul: outer dimensions ("+C+") and ("+N+") of Tensors with shapes "+f.shape+" and "+d.shape+" must match."}),g(m===v,function(){return"Error in fused matMul: inner shapes ("+m+") and ("+v+") of Tensors with shapes "+f.shape+" and "+d.shape+" and transposeA="+i+" and transposeB="+s+" must match."});var k,E,A=f.shape.slice(0,-2).concat([y,b]),R=i?f.as3D(S,m,y):f.as3D(S,y,m),T=s?d.as3D(I,b,v):d.as3D(I,v,b);null!=u&&Gr(A,(k=wt(k=qe(u,"bias","fused matMul"),f)[0]).shape),null!=p&&(E=qe(p,"prelu weights","fused matMul"));var D={$a:R,$b:T};return null!=u&&(D.$bias=k),null!=p&&(D.$preluActivationWeights=E),At.runKernelFunc(function(t,e){var n=t.fusedBatchMatMul({a:R,b:T,transposeA:i,transposeB:s,bias:k,activation:c,preluActivationWeights:E});return e([R,T,n]),n},D,function(t,e){var n=e[0],r=e[1],a=e[2],o=Dc(t,a,c),l={};return null!=u&&(l={$bias:function(){return Oc(k,o)}}),i||s?!i&&s?Object.assign({$a:function(){return o.matMul(r,!1,!1)},$b:function(){return o.matMul(n,!0,!1)}},l):i&&!s?Object.assign({$a:function(){return r.matMul(o,!1,!0)},$b:function(){return n.matMul(o,!1,!1)}},l):Object.assign({$a:function(){return r.matMul(o,!0,!0)},$b:function(){return o.matMul(n,!0,!0)}},l):Object.assign({$a:function(){return o.matMul(r,!1,!0)},$b:function(){return n.matMul(o,!0,!1)}},l)}).reshape(A)}}),Mc=rn({conv2d_:function(t){var e=t.x,n=t.filter,r=t.strides,a=t.pad,i=t.dataFormat,o=void 0===i?"NHWC":i,s=t.dilations,u=void 0===s?[1,1]:s,l=t.dimRoundingMode,c=t.bias,p=t.activation,h=void 0===p?"linear":p,f=t.preluActivationWeights;if(h=h||"linear",!1===Tc(At.state.gradientDepth,h)){var d=qu(e,n,r,a,o,u,l);return null!=c&&(d=ru(d,c)),_c(d,h,f)}var m=qe(e,"x","conv2d"),v=qe(n,"filter","conv2d"),y=m,b=!1;3===m.rank&&(b=!0,y=m.as4D(1,m.shape[0],m.shape[1],m.shape[2])),g(4===y.rank,function(){return"Error in fused conv2d: input must be rank 4, but got rank "+y.rank+"."}),g(4===v.rank,function(){return"Error in fused conv2d: filter must be rank 4, but got rank "+v.rank+"."}),null!=l&&g(C(a),function(){return"Error in fused conv2d: pad must be an integer when using, dimRoundingMode "+l+" but got pad "+a+"."}),g(y.shape[3]===v.shape[2],function(){return"Error in conv2d: depth of input ("+y.shape[3]+") must match input depth for filter "+v.shape[2]+"."}),g(ea(r,u),function(){return"Error in conv2D: Either strides or dilations must be 1. Got strides "+r+" and dilations '"+u+"'"}),g("NHWC"===o,function(){return"Error in conv2d: got dataFormat of "+o+" but only NHWC is currently supported."});var x,w,N=Kr(y.shape,v.shape,r,u,a,l);null!=c&&(x=wt(x=qe(c,"bias","fused conv2d"),m)[0],Gr(N.outShape,x.shape)),null!=f&&(w=qe(f,"prelu weights","fused conv2d"));var S={x:y,$filter:v};null!=c&&(S.$bias=x),null!=f&&(S.$preluActivationWeights=w);var I=At.runKernelFunc(function(t,e){var n=t.fusedConv2d({input:y,filter:v,convInfo:N,bias:x,activation:h,preluActivationWeights:w});return e([v,y,n]),n},S,function(t,e){var n=e,i=n[0],o=n[1],s=n[2],l=Dc(t,s,h);g(ta(u),function(){return"Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '"+u+"'"});var p={};return null!=c&&(p={$bias:function(){return Oc(x,l)}}),Object.assign({x:function(){return Xu(o.shape,l,i,r,a)},$filter:function(){return Ku(o,l,i.shape,r,a)}},p)});return b?I.as3D(I.shape[1],I.shape[2],I.shape[3]):I}}),zc=rn({depthwiseConv2d_:function(t){var e=t.x,n=t.filter,r=t.strides,a=t.pad,i=t.dataFormat,o=void 0===i?"NHWC":i,s=t.dilations,u=void 0===s?[1,1]:s,l=t.dimRoundingMode,c=t.bias,p=t.activation,h=void 0===p?"linear":p,f=t.preluActivationWeights;if(!1===Tc(At.state.gradientDepth,h)){var d=$u(e,n,r,a,o,u,l);return null!=c&&(d=ru(d,c)),_c(d,h,f)}var m=qe(e,"x","depthwiseConv2d"),v=qe(n,"filter","depthwiseConv2d"),y=m,b=!1;3===m.rank&&(b=!0,y=m.as4D(1,m.shape[0],m.shape[1],m.shape[2])),g(4===y.rank,function(){return"Error in fused depthwiseConv2d: input must be rank 4, but got rank "+y.rank+"."}),g(4===v.rank,function(){return"Error in fused depthwiseConv2d: filter must be rank 4, but got rank "+v.rank+"."}),g(y.shape[3]===v.shape[2],function(){return"Error in fused depthwiseConv2d: number of input channels ("+y.shape[3]+") must match the inChannels dimension in filter "+v.shape[2]+"."}),null==u&&(u=[1,1]),g(ea(r,u),function(){return"Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides "+r+" and dilations '"+u+"'"}),null!=l&&g(C(a),function(){return"Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode "+l+" but got pad "+a+"."});var x,w,N=Kr(y.shape,v.shape,r,u,a,l,!0);null!=c&&(x=wt(x=qe(c,"bias","fused conv2d"),m)[0],Gr(N.outShape,x.shape)),null!=f&&(w=qe(f,"prelu weights","fused depthwiseConv2d"));var S={x:y,$filter:v};null!=c&&(S.$bias=x),null!=f&&(S.$preluActivationWeights=w);var I=At.runKernelFunc(function(t,e){var n=t.fusedDepthwiseConv2D({input:y,filter:v,convInfo:N,bias:x,activation:h,preluActivationWeights:w});return e([y,v,n]),n},S,function(t,e){g(ta(u),function(){return"Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '"+u+"'"});var n=e[0],r=e[1],a=e[2],i=Dc(t,a,h),o={};return null!=c&&(o={$bias:function(){return Oc(x,i)}}),Object.assign({x:function(){return Yu(n.shape,i,r,N)},$filter:function(){return Ju(n,i,r.shape,N)}},o)});return b?I.as3D(I.shape[1],I.shape[2],I.shape[3]):I}}),Lc=Object.freeze({matMul:Fc,conv2d:Mc,depthwiseConv2d:zc}),Bc=Object.freeze({image:Rc,linalg:Nc,losses:bc,spectral:Zl,fused:Lc,signal:uc,square:ns,conv1d:Gu,conv2d:qu,conv3d:Hu,depthwiseConv2d:$u,separableConv2d:Zu,conv2dTranspose:Qu,conv3dTranspose:tl,op:rn,batchNormalization2d:js,batchNormalization3d:Gs,batchNormalization4d:qs,batchNormalization:Hs,batchNorm:Ks,batchNorm2d:Xs,batchNorm3d:$s,batchNorm4d:Ys,booleanMaskAsync:Wu,complex:an,real:on,imag:sn,concat:In,concat1d:kn,concat2d:En,concat3d:An,concat4d:Rn,split:Tn,matMul:el,dot:nl,outerProduct:rl,reverse:al,reverse1d:il,reverse2d:ol,reverse3d:sl,reverse4d:ul,maxPool:pl,avgPool:hl,pool:fl,maxPool3d:dl,avgPool3d:ml,slice:gl,slice1d:vl,slice2d:yl,slice3d:bl,slice4d:xl,abs:rs,acos:as,acosh:is,asin:os,asinh:ss,atan:us,atanh:ls,ceil:cs,clipByValue:ps,cos:hs,cosh:fs,erf:ds,exp:ms,expm1:gs,floor:vs,log:ys,log1p:bs,logSigmoid:xs,neg:ws,reciprocal:Cs,round:Ns,rsqrt:Ss,sigmoid:Is,sign:ks,isNaN:Es,isInf:As,isFinite:Rs,sin:Ts,sinh:Ds,softplus:Os,sqrt:_s,step:Fs,tan:Ms,tanh:zs,all:Cl,any:Nl,argMax:Sl,argMin:Il,logSumExp:kl,max:El,mean:Al,min:Rl,moments:Tl,sum:Dl,prod:Ol,equal:Su,equalStrict:Iu,greater:ku,greaterEqual:Eu,greaterEqualStrict:Au,greaterStrict:Ru,less:Tu,lessEqual:Du,lessEqualStrict:Ou,lessStrict:_u,notEqual:Fu,notEqualStrict:Mu,add:ru,addN:au,addStrict:iu,atan2:ou,div:su,divStrict:uu,floorDiv:lu,maximum:cu,maximumStrict:pu,minimum:hu,minimumStrict:fu,mod:du,modStrict:mu,mul:gu,mulStrict:vu,pow:yu,powStrict:bu,squaredDifference:xu,squaredDifferenceStrict:wu,sub:Cu,subStrict:Nu,elu:_l,leakyRelu:Fl,prelu:Ml,relu:zl,relu6:Ll,selu:Bl,logicalAnd:Js,logicalNot:Zs,logicalOr:Qs,logicalXor:tu,where:eu,whereAsync:nu,buffer:jn,print:Gn,batchToSpaceND:qn,cast:Hn,clone:Kn,cumsum:Xn,depthToSpace:$n,expandDims:Yn,eye:Jn,multinomial:Zn,oneHot:Qn,pad:tr,pad1d:er,pad2d:nr,pad3d:rr,pad4d:ar,rand:ir,randomNormal:or,randomGamma:sr,randomUniform:ur,reshape:lr,spaceToBatchND:cr,squeeze:pr,stack:hr,tile:fr,truncatedNormal:dr,unstack:mr,setdiff1dAsync:gr,fill:xn,linspace:wn,ones:yn,range:Cn,scalar:cn,tensor:un,tensor1d:pn,tensor2d:hn,tensor3d:fn,tensor4d:dn,tensor5d:mn,tensor6d:gn,variable:vn,zeros:bn,onesLike:Nn,zerosLike:Sn,transpose:Pl,softmax:Lr,logSoftmax:Br,localResponseNormalization:Wl,norm:Vl,gather:Bu,unsortedSegmentSum:Pu,basicLSTMCell:Ul,multiRNNCell:jl,movingAverage:Gl,stridedSlice:ql,topk:Hl,scatterND:Kl,fft:Xl,ifft:$l,rfft:Yl,irfft:Jl,sparseToDense:Ql,gatherND:tc,diag:ec,dropout:nc,hannWindow:ac,hammingWindow:ic,frame:oc,stft:sc,inTopKAsync:lc});function Pc(t,e){Array.isArray(t)||(t=[t]),t.forEach(function(t){null!=t&&g("complex64"!==t.dtype,function(){return e+" does not support complex64 tensors."})})}function Wc(t,e,n,r){if("linear"===n)return t.linear(e);if("relu"===n)return t.relu(e);if("elu"===n)return t.elu(e);if("relu6"===n)return t.relu6(e);if("prelu"===n)return t.prelu(e,r);throw new Error("Activation "+n+" has not been implemented for the CPU backend.")}var Vc=function(t){function e(){var e=t.call(this)||this;if(e.blockSize=48,e.firstUse=!0,o().get("IS_BROWSER")){var n="undefined"!=typeof OffscreenCanvas?new OffscreenCanvas(300,150):"undefined"!=typeof document?document.createElement("canvas"):null;null!==n&&(e.fromPixels2DContext=n.getContext("2d"))}return e.data=new Pr(e,At),e}return n(e,t),e.prototype.write=function(t,e,n){this.firstUse&&(this.firstUse=!1,o().get("IS_NODE")&&Ue("\n============================\nHi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.\n============================\n"));var r={};return this.data.set(r,{values:t,dtype:n}),r},e.prototype.move=function(t,e,n,r){this.data.set(t,{values:e,dtype:r})},e.prototype.numDataIds=function(){return this.data.numDataIds()},e.prototype.fromPixels=function(t,e){if(null==t)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");var n,r,a=t.data instanceof Uint8Array,i="undefined"!=typeof ImageData&&t instanceof ImageData,s="undefined"!=typeof HTMLVideoElement&&t instanceof HTMLVideoElement,u="undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement,l=s?[t.videoWidth,t.videoHeight]:[t.width,t.height],c=l[0],p=l[1];if(o().get("IS_NODE")&&null==t.getContext)throw new Error("When running in node, pixels must be an HTMLCanvasElement like the one returned by the `canvas` npm package");if(null!=t.getContext)n=t.getContext("2d").getImageData(0,0,c,p).data;else if(i||a)n=t.data;else{if(!u&&!s)throw new Error("pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData or {data: Uint32Array, width: number, height: number}, but was "+t.constructor.name);if(null==this.fromPixels2DContext)throw new Error("Can't read pixels from HTMLImageElement outside the browser.");this.fromPixels2DContext.canvas.width=c,this.fromPixels2DContext.canvas.height=p,this.fromPixels2DContext.drawImage(t,0,0,c,p),n=this.fromPixels2DContext.getImageData(0,0,c,p).data}if(4===e)r=new Int32Array(n);else{var h=c*p;r=new Int32Array(h*e);for(var f=0;fh&&(h=m,f=d)}u[c]=f}return o},e.prototype.cumsum=function(t,e,n,r){if(Pc(t,"cumsum"),e!==t.rank-1)throw new Error("backend.cumsum in CPU expects an inner-most axis="+(t.rank-1)+" but got axis="+e);for(var a=bt(t.dtype,"int32"),i=bn(t.shape,a),o=this.readSync(i.dataId),s=this.readSync(t.dataId),u=t.shape[t.rank-1],l=r?function(t,e){return t+u-e-1}:function(t,e){return t+e},c=0;ce?1:0})},e.prototype.greaterEqual=function(t,e){return Pc([t,e],"greaterEqual"),this.broadcastedBinaryOp(t,e,"bool",function(t,e){return t>=e?1:0})},e.prototype.logicalNot=function(t){Pc(t,"logicalNot");for(var e=this.readSync(t.dataId),n=new Uint8Array(e.length),r=0;r1||1===e.rank?1:x(e.shape.slice(1)),c=0;c=0&&e>=0?n:(n+e)%e})},e.prototype.max=function(t,e){Pc(t,"max"),Je("max",e,t.rank);for(var n=$e(t.shape,e),r=n[0],a=n[1],i=bn(r,t.dtype),o=x(a),s=this.readSync(i.dataId),u=this.readSync(t.dataId),l=0;lp&&(p=f)}s[l]=p}return i},e.prototype.maximum=function(t,e){return Pc([t,e],"maximum"),this.broadcastedBinaryOp(t,e,t.dtype,function(t,e){return Math.max(t,e)})},e.prototype.all=function(t,e){Pc(t,"all"),Je("all",e,t.rank);for(var n=$e(t.shape,e),r=n[0],a=n[1],i=bn(r,t.dtype),o=x(a),s=this.readSync(i.dataId),u=this.readSync(t.dataId),l=0;l0?n[r]=1:n[r]=0;return this.makeOutput(n,t.shape,"float32")},e.prototype.isNaN=function(t){Pc(t,"x");for(var e=this.readSync(t.dataId),n=new Uint8Array(e.length),r=0;r.5?n[r]=Math.ceil(e[r]):n[r]=a%2==0?a:a+1}return this.makeOutput(n,t.shape,"float32")},e.prototype.exp=function(t){Pc(t,"exp");for(var e=this.readSync(t.dataId),n=new Float32Array(e.length),r=0;r=0?a:Math.exp(a)-1}return this.makeOutput(e,t.shape,"float32")},e.prototype.eluDer=function(t,e){Pc([t,e],"eluDer");for(var n=new Float32Array(e.size),r=this.readSync(e.dataId),a=this.readSync(t.dataId),i=0;i=1?a[i]:a[i]*(o+1)}return this.makeOutput(n,e.shape,"float32")},e.prototype.selu=function(t){Pc(t,"selu");for(var e=new Float32Array(t.size),n=this.readSync(t.dataId),r=0;r=0?1.0507009873554805*a:1.7580993408473768*(Math.exp(a)-1)}return this.makeOutput(e,t.shape,"float32")},e.prototype.clip=function(t,e,n){Pc(t,"clip");for(var r=new Float32Array(t.size),a=this.readSync(t.dataId),i=0;in?n:o-e,s=r[a]0?1:e}return this.makeOutput(n,t.shape,"float32")},e.prototype.fusedConv2d=function(t){var e=t.input,n=t.filter,r=t.convInfo,a=t.bias,i=t.activation,o=t.preluActivationWeights,s=this.conv2d(e,n,r);return a&&(s=this.add(s,a)),i&&(s=Wc(this,s,i,o)),s},e.prototype.conv2d=function(t,e,n){Pc([t,e],"conv2d");for(var r=n.filterHeight,a=n.filterWidth,i=n.dilationHeight,o=n.dilationWidth,s=n.padInfo.left,u=n.padInfo.top,l="channelsLast"===n.dataFormat,c=jn(n.outShape,t.dtype),p=t.strides[0],h=l?t.strides[1]:t.strides[2],f=l?t.strides[2]:1,d=l?1:t.strides[1],m=c.strides[0],g=l?c.strides[1]:c.strides[2],v=l?c.strides[2]:1,y=l?1:c.strides[1],b=this.readSync(t.dataId),x=this.readSync(e.dataId),w=c.values,C=0;C=n.inHeight))for(var T=A*e.strides[0],D=N+R*h,O=0;O=n.inWidth))for(var L=D+z*f,B=T+M*e.strides[1],P=0;P=n.inDepth))for(var S=C*e.strides[0],I=v+N*t.strides[1],k=0;k=n.inHeight))for(var D=S+R*e.strides[1],O=I+T*t.strides[2],_=0;_=n.inWidth))for(var B=D+z*e.strides[2],P=O+L*n.inChannels,W=B,V=0;V=n.inHeight))for(var C=x*e.strides[0],N=m+w*t.strides[1],S=0;S=n.inWidth))for(var R=C+E*e.strides[1],T=N+A*n.inChannels,D=I,O=R,_=0;_D?D=L:"avg"===n&&(O+=L,_++)}if(isNaN(D))break}d[k+E*v+w]="avg"===n?O/_:D}return f.toTensor()},e.prototype.maxPool=function(t,e){return this.pool(t,e,"max")},e.prototype.maxPoolPositions=function(t,e){for(var n=jn(e.outShape,"int32"),r=e.strideHeight,a=e.strideWidth,i=e.dilationHeight,o=e.dilationWidth,s=e.effectiveFilterHeight,u=e.effectiveFilterWidth,l=e.padInfo.top,c=e.padInfo.left,p=this.bufferSync(t),h=0;hC&&(C=A,N=I*u+E)}n.set(N,h,d,y,f)}}return n.toTensor()},e.prototype.maxPoolBackprop=function(t,e,n,r){Pc([e,n],"maxPoolBackprop");for(var a=this.maxPoolPositions(e,r),i=r.strideHeight,o=r.strideWidth,s=r.dilationHeight,u=r.dilationWidth,l=r.effectiveFilterHeight,c=r.effectiveFilterWidth,p=c-1-r.padInfo.left,h=l-1-r.padInfo.top,f=jn(e.shape,"float32"),d=this.bufferSync(a),m=this.bufferSync(t),g=0;g=r.outHeight||Math.floor(S)!==S))for(var I=0;I=r.outWidth||Math.floor(k)!==k)){var E=l*c-1-d.get(g,S,k,v)===N*c+I?1:0;0!==E&&(C+=m.get(g,S,k,v)*E)}}}f.set(C,g,y,b,v)}return f.toTensor()},e.prototype.avgPoolBackprop=function(t,e,n){Pc([t,e],"avgPoolBackprop");for(var r=n.strideHeight,a=n.strideWidth,i=n.filterHeight,o=n.filterWidth,s=n.dilationHeight,u=n.dilationWidth,l=n.effectiveFilterHeight,c=n.effectiveFilterWidth,p=c-1-n.padInfo.left,h=l-1-n.padInfo.top,f=jn(e.shape,"float32"),d=1/(i*o),m=this.bufferSync(t),g=0;g=n.outHeight||Math.floor(S)!==S))for(var I=0;I=n.outWidth||Math.floor(k)!==k||(C+=m.get(g,S,k,v))}}f.set(C*d,g,y,b,v)}return f.toTensor()},e.prototype.pool3d=function(t,e,n){Pc(t,"pool3d");for(var r=e.strideDepth,a=e.strideHeight,i=e.strideWidth,o=e.dilationDepth,s=e.dilationHeight,u=e.dilationWidth,l=e.effectiveFilterDepth,c=e.effectiveFilterHeight,p=e.effectiveFilterWidth,h=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left,m="max"===n?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,g=this.readSync(t.dataId),v=jn(e.outShape,t.dtype),y=v.values,b=e.outShape[1]*e.outShape[2]*e.outShape[3]*e.outShape[4],x=e.outShape[2]*e.outShape[3]*e.outShape[4],w=e.outShape[3]*e.outShape[4],C=e.outShape[4],N=0;NU?U=Y:"avg"===n&&(j+=Y,G++),isNaN(U))break}if(isNaN(U))break}if(isNaN(U))break}y[V+k]="avg"===n?j/G:U}}}return v.toTensor()},e.prototype.avgPool3d=function(t,e){return Pc(t,"avgPool3d"),this.pool3d(t,e,"avg").toFloat()},e.prototype.avgPool3dBackprop=function(t,e,n){Pc([t,e],"avgPool3dBackprop");for(var r=n.strideDepth,a=n.strideHeight,i=n.strideWidth,o=n.filterDepth,s=n.filterHeight,u=n.filterWidth,l=n.dilationDepth,c=n.dilationHeight,p=n.dilationWidth,h=n.effectiveFilterDepth,f=n.effectiveFilterHeight,d=n.effectiveFilterWidth,m=h-1-n.padInfo.front,g=d-1-n.padInfo.left,v=f-1-n.padInfo.top,y=jn(e.shape,"float32"),b=1/(o*s*u),x=this.bufferSync(t),w=0;w=n.outDepth||Math.floor(D)!==D))for(var O=0;O=n.outHeight||Math.floor(_)!==_))for(var F=0;F=n.outWidth||Math.floor(M)!==M||(R+=x.get(w,D,_,M,C))}}}y.set(R*b,w,N,S,I,C)}return y.toTensor()},e.prototype.maxPool3d=function(t,e){return Pc(t,"maxPool3d"),this.pool3d(t,e,"max").toFloat()},e.prototype.maxPool3dPositions=function(t,e){for(var n=jn(e.outShape,"int32"),r=e.strideDepth,a=e.strideHeight,i=e.strideWidth,o=e.dilationDepth,s=e.dilationHeight,u=e.dilationWidth,l=e.effectiveFilterDepth,c=e.effectiveFilterHeight,p=e.effectiveFilterWidth,h=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left,m=this.bufferSync(t),g=0;g=T&&(T=B,D=_*c*p+M*c+L)}n.set(D,g,y,C,k,v)}}}return n.toTensor()},e.prototype.maxPool3dBackprop=function(t,e,n,r){Pc([e,n],"maxPool3dBackprop");for(var a=this.maxPool3dPositions(e,r),i=r.strideDepth,o=r.strideHeight,s=r.strideWidth,u=r.dilationDepth,l=r.dilationHeight,c=r.dilationWidth,p=r.effectiveFilterDepth,h=r.effectiveFilterHeight,f=r.effectiveFilterWidth,d=p-1-r.padInfo.front,m=f-1-r.padInfo.left,g=h-1-r.padInfo.top,v=jn(e.shape,"float32"),y=this.bufferSync(a),b=this.bufferSync(t),x=0;x=r.outDepth||Math.floor(T)!==T))for(var D=0;D=r.outHeight||Math.floor(O)!==O))for(var _=0;_=r.outWidth||Math.floor(F)!==F)){var M=p*h*f-1-y.get(x,T,O,F,w)===R*h*f+D*f+_?1:0;0!==M&&(A+=b.get(x,T,O,F,w)*M)}}}}v.set(A,x,C,N,S,w)}return v.toTensor()},e.prototype.cast=function(t,e){return ra(t,e,this)},e.prototype.reshape=function(t,e){return aa(t,e)},e.prototype.avgPool=function(t,e){return Pc(t,"avgPool"),this.pool(t,e,"avg").toFloat()},e.prototype.resizeBilinear=function(t,e,n,r){Pc(t,"resizeBilinear");for(var a=t.shape,i=a[0],o=a[1],s=a[2],u=a[3],l=this.readSync(t.dataId),c=new Float32Array(x([i,e,n,u])),p=[r&&e>1?o-1:o,r&&n>1?s-1:s],h=[r&&e>1?e-1:e,r&&n>1?n-1:n],f=0,d=p[0]/h[0],m=p[1]/h[1],g=0;g1?i-1:i,n&&c>1?o-1:o],f=[n&&l>1?l-1:l,n&&c>1?c-1:c],d=h[0]/f[0],m=h[1]/f[1],g=this.readSync(t.dataId),v=0,y=0;y1?o-1:o,r&&n>1?s-1:s],h=[r&&e>1?e-1:e,r&&n>1?n-1:n],f=p[0]/h[0],d=p[1]/h[1],m=0,g=0;g1?i-1:i,n&&c>1?o-1:o],d=[n&&l>1?l-1:l,n&&c>1?c-1:c],m=f[0]/d[0],g=f[1]/d[1],v=1/m,y=1/g,b=2*Math.ceil(v)+2,x=2*Math.ceil(y)+2,w=0;w=l)){var M=C+F*t.strides[1],z=F*m;if(N===Math.min(i-1,n?Math.round(z):Math.floor(z)))for(var L=0;L=c)){var P=M+B*t.strides[2],W=B*g;E===Math.min(o-1,n?Math.round(W):Math.floor(W))&&(O+=h[P+D])}}}}p[A+D]=O}return dn(p,e.shape,e.dtype)},e.prototype.batchNormalization=function(t,e,n,r,a,i){Pc([t,e,n,a,i],"batchNorm");for(var o=this.readSync(t.dataId),s=this.readSync(e.dataId),u=this.readSync(n.dataId),l=a?this.readSync(a.dataId):new Float32Array([1]),c=i?this.readSync(i.dataId):new Float32Array([0]),p=new Float32Array(o.length),h=c.length,f=l.length,d=u.length,m=s.length,g=0,v=0,y=0,b=0,x=0;x=h&&(g=0),v>=m&&(v=0),y>=f&&(y=0),b>=d&&(b=0);return dn(p,t.shape)},e.prototype.localResponseNormalization4D=function(t,e,n,r,a){Pc(t,"localResponseNormalization4D");var i=t.shape[3],o=i-1,s=this.readSync(t.dataId),u=t.size,l=new Float32Array(u);function c(t){for(var n=t%i,r=t-n+Math.max(0,n-e),a=t-n+Math.min(n+e,o),u=0;r<=a;r++){var l=s[r];u+=l*l}return u}for(var p=0;p=0&&i[o]1,function(){return"blockSize should be > 1 for depthToSpace, but was: "+e});for(var r=t.shape[0],a=t.shape[1],i=t.shape[2],o=t.shape[3],s=a*e,u=i*e,l=o/(e*e),c=this.readSync(t.dataId),p=new Float32Array(r*s*u*l),h=0,f=0;f=s))for(var E=h>1?(S-C)*(u-1)/(h-1):0,A=f>1?(I-N)*(l-1)/(f-1):0,R=0;R1?C*(u-1)+R*E:.5*(C+S)*(u-1);if(T<0||T>u-1)for(var D=0;D1?N*(l-1)+D*A:.5*(N+I)*(l-1))<0||q>l-1)for(O=0;O1?N*(l-1)+D*A:.5*(N+I)*(l-1))<0||q>l-1)for(O=0;O=t.size/s)throw new Error("Invalid indices: "+f+" does not index into "+t.shape);for(var v=0;v=r/a)throw new Error("Invalid indices: "+m+" does not index into "+n);for(var b=0;b0,function(){return"scheme must not be an empty string."});var r=t.getInstance();g(null==r.managers[e],function(){return"A model store manager is already registered for scheme '"+e+"'."}),r.managers[e]=n},t.getManager=function(t){var e=this.getInstance().managers[t];if(null==e)throw new Error("Cannot find model manager for scheme '"+t+"'");return e},t.getSchemes=function(){return Object.keys(this.getInstance().managers)},t}();function np(t){if(-1===t.indexOf(tp))throw new Error("The url string provided does not contain a scheme. Supported schemes are: "+ep.getSchemes().join(","));return{scheme:t.split(tp)[0],path:t.split(tp)[1]}}function rp(t,e,n){return void 0===n&&(n=!1),r(this,void 0,void 0,function(){var r,i,o,s,u,l,c,p,h;return a(this,function(a){switch(a.label){case 0:return g(t!==e,function(){return"Old path and new path are the same: '"+t+"'"}),g((r=Qc.getLoadHandlers(t)).length>0,function(){return"Copying failed because no load handler is found for source URL "+t+"."}),g(r.length<2,function(){return"Copying failed because more than one ("+r.length+") load handlers for source URL "+t+"."}),i=r[0],g((o=Qc.getSaveHandlers(e)).length>0,function(){return"Copying failed because no save handler is found for destination URL "+e+"."}),g(o.length<2,function(){return"Copying failed because more than one ("+r.length+") save handlers for destination URL "+e+"."}),s=o[0],u=np(t).scheme,l=np(t).path,c=u===np(t).scheme,[4,i.load()];case 1:return p=a.sent(),n&&c?[4,ep.getManager(u).removeModel(l)]:[3,3];case 2:a.sent(),a.label=3;case 3:return[4,s.save(p)];case 4:return h=a.sent(),!n||c?[3,6]:[4,ep.getManager(u).removeModel(l)];case 5:a.sent(),a.label=6;case 6:return[2,h.modelArtifactsInfo]}})})}var ap="models_store",ip="model_info_store";function op(){if(!o().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");var t=window,e=t.indexedDB||t.mozIndexedDB||t.webkitIndexedDB||t.msIndexedDB||t.shimIndexedDB;if(null==e)throw new Error("The current browser does not appear to support IndexedDB.");return e}function sp(t){var e=t.result;e.createObjectStore(ap,{keyPath:"modelPath"}),e.createObjectStore(ip,{keyPath:"modelPath"})}var up=function(){function t(t){if(this.indexedDB=op(),null==t||!t)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=t}return t.prototype.save=function(t){return r(this,void 0,void 0,function(){return a(this,function(e){if(t.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return[2,this.databaseAction(this.modelPath,t)]})})},t.prototype.load=function(){return r(this,void 0,void 0,function(){return a(this,function(t){return[2,this.databaseAction(this.modelPath)]})})},t.prototype.databaseAction=function(t,e){var n=this;return new Promise(function(t,r){var a=n.indexedDB.open("tensorflowjs",1);a.onupgradeneeded=function(){return sp(a)},a.onsuccess=function(){var i=a.result;if(null==e){var o=i.transaction(ap,"readonly"),s=o.objectStore(ap).get(n.modelPath);s.onsuccess=function(){if(null==s.result)return i.close(),r(new Error("Cannot find model with path '"+n.modelPath+"' in IndexedDB."));t(s.result.modelArtifacts)},s.onerror=function(t){return i.close(),r(s.error)},o.oncomplete=function(){return i.close()}}else{var u,l=Zc(e),c=i.transaction(ip,"readwrite"),p=c.objectStore(ip),h=p.put({modelPath:n.modelPath,modelArtifactsInfo:l});h.onsuccess=function(){var a=(u=i.transaction(ap,"readwrite")).objectStore(ap).put({modelPath:n.modelPath,modelArtifacts:e,modelArtifactsInfo:l});a.onsuccess=function(){return t({modelArtifactsInfo:l})},a.onerror=function(t){var e=(p=c.objectStore(ip)).delete(n.modelPath);e.onsuccess=function(){return i.close(),r(a.error)},e.onerror=function(t){return i.close(),r(a.error)}}},h.onerror=function(t){return i.close(),r(h.error)},c.oncomplete=function(){null==u?i.close():u.oncomplete=function(){return i.close()}}}},a.onerror=function(t){return r(a.error)}})},t.URL_SCHEME="indexeddb://",t}(),lp=function(t){return o().getBool("IS_BROWSER")&&!Array.isArray(t)&&t.startsWith(up.URL_SCHEME)?(e=t.slice(up.URL_SCHEME.length),new up(e)):null;var e};Qc.registerSaveRouter(lp),Qc.registerLoadRouter(lp);var cp=function(){function t(){this.indexedDB=op()}return t.prototype.listModels=function(){return r(this,void 0,void 0,function(){var t=this;return a(this,function(e){return[2,new Promise(function(e,n){var r=t.indexedDB.open("tensorflowjs",1);r.onupgradeneeded=function(){return sp(r)},r.onsuccess=function(){var t=r.result,a=t.transaction(ip,"readonly"),i=a.objectStore(ip).getAll();i.onsuccess=function(){for(var t={},n=0,r=i.result;n0,function(){return"promises must be a none empty array"})}(t),function(t,e){g(t>=0&&t<=1,function(){return"Progress fraction must be in range [0, 1], but got startFraction "+t}),g(e>=0&&e<=1,function(){return"Progress fraction must be in range [0, 1], but got endFraction "+e}),g(e>=t,function(){return"startFraction must be no more than endFraction, but got startFraction "+t+" and endFraction "+e})}(n=null==n?0:n,r=null==r?1:r);var a=0;return Promise.all(t.map(function(i){return i.then(function(i){var o=n+ ++a/t.length*(r-n);return e(o),i}),i}))}function Tp(t,e){return r(this,void 0,void 0,function(){var n,r,i,s,u,l,c,p,h;return a(this,function(a){switch(a.label){case 0:return null==e&&(e={}),n=null==e.fetchFunc?o().platform.fetch:e.fetchFunc,r=t.map(function(t){return n(t,e.requestInit,{isBinary:!0})}),i=0,s=.5,null!=e.onProgress?[3,2]:[4,Promise.all(r)];case 1:return u=a.sent(),[3,4];case 2:return[4,Rp(r,e.onProgress,i,s)];case 3:u=a.sent(),a.label=4;case 4:return l=u.map(function(t){return t.arrayBuffer()}),c=.5,p=1,null!=e.onProgress?[3,6]:[4,Promise.all(l)];case 5:return h=a.sent(),[3,8];case 6:return[4,Rp(l,e.onProgress,c,p)];case 7:h=a.sent(),a.label=8;case 8:return[2,h]}})})}function Dp(t){var e=this;return function(n,i,o){return void 0===i&&(i=""),r(e,void 0,void 0,function(){var e,r,s,u,l,c,p,h,f,d;return a(this,function(a){switch(a.label){case 0:if(e=n.map(function(){return!1}),r={},s=null!=o?o.map(function(){return!1}):[],u=[],n.forEach(function(t,n){var a=0;t.weights.forEach(function(t){var i="quantization"in t?t.quantization.dtype:t.dtype,l=qc[i]*x(t.shape),c=function(){e[n]=!0,null==r[n]&&(r[n]=[]),r[n].push({manifestEntry:t,groupOffset:a,sizeBytes:l})};null!=o?o.forEach(function(e,n){e===t.name&&(c(),s[n]=!0)}):c(),u.push(t.name),a+=l})}),!s.every(function(t){return t}))throw l=o.filter(function(t,e){return!s[e]}),new Error("Could not find weights in manifest with names: "+l.join(", ")+". \nManifest JSON has weights with names: "+u.join(", ")+".");return c=e.reduce(function(t,e,n){return e&&t.push(n),t},[]),p=[],c.forEach(function(t){n[t].paths.forEach(function(t){var e=i+(i.endsWith("/")?"":"/")+t;p.push(e)})}),[4,t(p)];case 1:return h=a.sent(),f={},d=0,c.forEach(function(t){for(var e=n[t].paths.length,a=0,i=0;i0,function(){return"URL path for http must not be null, undefined or empty."}),Array.isArray(t)&&g(2===t.length,function(){return"URL paths for http must have a length of 2, (actual length is "+t.length+")."}),this.path=t,null!=e.requestInit&&null!=e.requestInit.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=e.requestInit||{}}return t.prototype.save=function(t){return r(this,void 0,void 0,function(){var e,n,r,i;return a(this,function(a){switch(a.label){case 0:if(t.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");return(e=Object.assign({method:this.DEFAULT_METHOD},this.requestInit)).body=new FormData,n=[{paths:["./model.weights.bin"],weights:t.weightSpecs}],r={modelTopology:t.modelTopology,format:t.format,generatedBy:t.generatedBy,convertedBy:t.convertedBy,userDefinedMetadata:t.userDefinedMetadata,weightsManifest:n},e.body.append("model.json",new Blob([JSON.stringify(r)],{type:"application/json"}),"model.json"),null!=t.weightData&&e.body.append("model.weights.bin",new Blob([t.weightData],{type:"application/octet-stream"}),"model.weights.bin"),[4,this.fetch(this.path,e)];case 1:if((i=a.sent()).ok)return[2,{modelArtifactsInfo:Zc(t),responses:[i]}];throw new Error("BrowserHTTPRequest.save() failed due to HTTP response status "+i.status+".")}})})},t.prototype.load=function(){return r(this,void 0,void 0,function(){var t,e,n,r,i,o,s,u;return a(this,function(a){switch(a.label){case 0:return[4,this.fetch(this.path,this.requestInit)];case 1:if(!(t=a.sent()).ok)throw new Error("Request to "+this.path+" failed with status code "+t.status+". Please verify this URL points to the model JSON of the model to load.");a.label=2;case 2:return a.trys.push([2,4,,5]),[4,t.json()];case 3:return e=a.sent(),[3,5];case 4:throw a.sent(),n="Failed to parse model JSON of response from "+this.path+".",this.path.endsWith(".pb")?n+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":n+=" Please make sure the server is serving valid JSON for this request.",new Error(n);case 5:if(r=e.modelTopology,i=e.weightsManifest,null==r&&null==i)throw new Error("The JSON from HTTP path "+this.path+" contains neither model topology or manifest for weights.");return null==i?[3,7]:[4,this.loadWeights(i)];case 6:u=a.sent(),o=u[0],s=u[1],a.label=7;case 7:return[2,{modelTopology:r,weightSpecs:o,weightData:s}]}})})},t.prototype.loadWeights=function(t){return r(this,void 0,void 0,function(){var e,n,r,i,o,s,u,l,c,p,h;return a(this,function(a){switch(a.label){case 0:for(e=Array.isArray(this.path)?this.path[1]:this.path,n=function(t){var e=t.lastIndexOf("/"),n=t.lastIndexOf("?");return[t.substring(0,e)+"/",n>e?t.substring(n):""]}(e),r=n[0],i=n[1],o=this.weightPathPrefix||r,s=[],u=0,l=t;u0&&Number.isInteger(n),function(){return"If provided, numClasses must be a positive integer, but got "+n}),g(1===r.rank,function(){return"Expected the rank of labels to be 1, but got "+r.rank}),g(1===a.rank,function(){return"Expected the rank of predictions to be 1, but got "+a.rank}),g(r.shape[0]===a.shape[0],function(){return"Mismatch in the number of examples: "+r.shape[0]+" vs. "+a.shape[0]+". Labels and predictions should have the same number of elements."}),g(n>0&&Number.isInteger(n),function(){return"numClasses is required to be a positive integer, but got "+n});var i=Qn(r.asType("int32"),n),o=Qn(a.asType("int32"),n);return i.transpose().matMul(o).asType("int32")}}),Wp=Object.freeze({confusionMatrix:Pp}),Vp=rn({fromPixels_:function(t,e){if(void 0===e&&(e=3),e>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");var n="undefined"!=typeof HTMLVideoElement&&t instanceof HTMLVideoElement;if(n&&n&&t.readyState<2)throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the