Copy disabled (too large)
Download .txt
Showing preview only (15,643K chars total). Download the full file to get everything.
Repository: huseinzol05/Stock-Prediction-Models
Branch: master
Commit: 33266732b0b1
Files: 114
Total size: 14.9 MB
Directory structure:
gitextract_w7zipbjz/
├── .gitignore
├── LICENSE
├── README.md
├── agent/
│ ├── 1.turtle-agent.ipynb
│ ├── 10.duel-q-learning-agent.ipynb
│ ├── 11.double-duel-q-learning-agent.ipynb
│ ├── 12.duel-recurrent-q-learning-agent.ipynb
│ ├── 13.double-duel-recurrent-q-learning-agent.ipynb
│ ├── 14.actor-critic-agent.ipynb
│ ├── 15.actor-critic-duel-agent.ipynb
│ ├── 16.actor-critic-recurrent-agent.ipynb
│ ├── 17.actor-critic-duel-recurrent-agent.ipynb
│ ├── 18.curiosity-q-learning-agent.ipynb
│ ├── 19.recurrent-curiosity-q-learning-agent.ipynb
│ ├── 2.moving-average-agent.ipynb
│ ├── 20.duel-curiosity-q-learning-agent.ipynb
│ ├── 21.neuro-evolution-agent.ipynb
│ ├── 22.neuro-evolution-novelty-search-agent.ipynb
│ ├── 23.abcd-strategy-agent.ipynb
│ ├── 3.signal-rolling-agent.ipynb
│ ├── 4.policy-gradient-agent.ipynb
│ ├── 5.q-learning-agent.ipynb
│ ├── 6.evolution-strategy-agent.ipynb
│ ├── 7.double-q-learning-agent.ipynb
│ ├── 8.recurrent-q-learning-agent.ipynb
│ ├── 9.double-recurrent-q-learning-agent.ipynb
│ └── updated-NES-google.ipynb
├── dataset/
│ ├── AMD.csv
│ ├── BTC-sentiment.csv
│ ├── FB.csv
│ ├── FSV.csv
│ ├── GOOG-year.csv
│ ├── GOOG.csv
│ ├── INFY.csv
│ ├── KNX.csv
│ ├── MONDY.csv
│ ├── MTDR.csv
│ ├── SINA.csv
│ ├── TMUS.csv
│ ├── TSLA.csv
│ ├── TWTR.csv
│ ├── eur-myr.csv
│ ├── oil.csv
│ └── usd-myr.csv
├── deep-learning/
│ ├── 1.lstm.ipynb
│ ├── 10.lstm-seq2seq.ipynb
│ ├── 11.bidirectional-lstm-seq2seq.ipynb
│ ├── 12.lstm-seq2seq-vae.ipynb
│ ├── 13.gru-seq2seq.ipynb
│ ├── 14.bidirectional-gru-seq2seq.ipynb
│ ├── 15.gru-seq2seq-vae.ipynb
│ ├── 16.attention-is-all-you-need.ipynb
│ ├── 17.cnn-seq2seq.ipynb
│ ├── 18.dilated-cnn-seq2seq.ipynb
│ ├── 2.bidirectional-lstm.ipynb
│ ├── 3.lstm-2path.ipynb
│ ├── 4.gru.ipynb
│ ├── 5.bidirectional-gru.ipynb
│ ├── 6.gru-2path.ipynb
│ ├── 7.vanilla.ipynb
│ ├── 8.bidirectional-vanilla.ipynb
│ ├── 9.vanilla-2path.ipynb
│ ├── access.py
│ ├── addressing.py
│ ├── autoencoder.py
│ ├── dnc.py
│ ├── how-to-forecast.ipynb
│ ├── sentiment-consensus.ipynb
│ └── util.py
├── free-agent/
│ ├── evolution-strategy-agent.ipynb
│ └── evolution-strategy-bayesian-agent.ipynb
├── misc/
│ ├── bitcoin-analysis-lstm.ipynb
│ ├── fashion-forecasting.ipynb
│ ├── fashion.csv
│ ├── kijang-emas-bank-negara.ipynb
│ ├── outliers.ipynb
│ ├── overbought-oversold.ipynb
│ ├── sentiment-bitcoin.csv
│ ├── tesla-study.ipynb
│ └── which-stock.ipynb
├── realtime-agent/
│ ├── AMD.csv
│ ├── CPRT.csv
│ ├── FB.csv
│ ├── FSV.csv
│ ├── GOOG.csv
│ ├── GWR.csv
│ ├── LB.csv
│ ├── LYFT.csv
│ ├── MTDR.csv
│ ├── README.md
│ ├── SINA.csv
│ ├── TSLA.csv
│ ├── TWTR.csv
│ ├── app.py
│ ├── model.pkl
│ ├── realtime-evolution-strategy.ipynb
│ └── request.ipynb
├── simulation/
│ ├── monte-carlo-drift.ipynb
│ ├── monte-carlo-dynamic-volatility.ipynb
│ ├── monte-carlo-simple.ipynb
│ ├── multivariate-drift-monte-carlo.ipynb
│ └── portfolio-optimization.ipynb
├── stacking/
│ ├── autoencoder.py
│ ├── model.py
│ ├── stack-encoder-ensemble-xgb.ipynb
│ └── stack-rnn-arima-xgb.ipynb
└── stock-forecasting-js/
├── README.md
├── css/
│ └── style.css
├── data/
│ └── google.js
├── index.html
├── init.js
└── js/
├── tf-expand.js
├── tf.js
└── utils.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*DS_Store
*ipynb_checkpoints
*__pycache__
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
<p align="center">
<a href="#readme">
<img alt="logo" width="50%" src="output/evolution-strategy.png">
</a>
</p>
<p align="center">
<a href="https://github.com/huseinzol05/Stock-Prediction-Models/blob/master/LICENSE"><img alt="MIT License" src="https://img.shields.io/badge/License-Apache--License--2.0-yellow.svg"></a>
<a href="#"><img src="https://img.shields.io/badge/deeplearning-30--models-success.svg"></a>
<a href="#"><img src="https://img.shields.io/badge/agent-23--models-success.svg"></a>
</p>
---
**Stock-Prediction-Models**, Gathers machine learning and deep learning models for Stock forecasting, included trading bots and simulations.
## Table of contents
* [Models](#models)
* [Agents](#agents)
* [Realtime Agent](realtime-agent)
* [Data Explorations](#data-explorations)
* [Simulations](#simulations)
* [Tensorflow-js](#tensorflow-js)
* [Misc](#misc)
* [Results](#results)
* [Results Agent](#results-agent)
* [Results signal prediction](#results-signal-prediction)
* [Results analysis](#results-analysis)
* [Results simulation](#results-simulation)
## Contents
### Models
#### [Deep-learning models](deep-learning)
1. LSTM
2. LSTM Bidirectional
3. LSTM 2-Path
4. GRU
5. GRU Bidirectional
6. GRU 2-Path
7. Vanilla
8. Vanilla Bidirectional
9. Vanilla 2-Path
10. LSTM Seq2seq
11. LSTM Bidirectional Seq2seq
12. LSTM Seq2seq VAE
13. GRU Seq2seq
14. GRU Bidirectional Seq2seq
15. GRU Seq2seq VAE
16. Attention-is-all-you-Need
17. CNN-Seq2seq
18. Dilated-CNN-Seq2seq
**Bonus**
1. How to use one of the model to forecast `t + N`, [how-to-forecast.ipynb](deep-learning/how-to-forecast.ipynb)
2. Consensus, how to use sentiment data to forecast `t + N`, [sentiment-consensus.ipynb](deep-learning/sentiment-consensus.ipynb)
#### [Stacking models](stacking)
1. Deep Feed-forward Auto-Encoder Neural Network to reduce dimension + Deep Recurrent Neural Network + ARIMA + Extreme Boosting Gradient Regressor
2. Adaboost + Bagging + Extra Trees + Gradient Boosting + Random Forest + XGB
### [Agents](agent)
1. Turtle-trading agent
2. Moving-average agent
3. Signal rolling agent
4. Policy-gradient agent
5. Q-learning agent
6. Evolution-strategy agent
7. Double Q-learning agent
8. Recurrent Q-learning agent
9. Double Recurrent Q-learning agent
10. Duel Q-learning agent
11. Double Duel Q-learning agent
12. Duel Recurrent Q-learning agent
13. Double Duel Recurrent Q-learning agent
14. Actor-critic agent
15. Actor-critic Duel agent
16. Actor-critic Recurrent agent
17. Actor-critic Duel Recurrent agent
18. Curiosity Q-learning agent
19. Recurrent Curiosity Q-learning agent
20. Duel Curiosity Q-learning agent
21. Neuro-evolution agent
22. Neuro-evolution with Novelty search agent
23. ABCD strategy agent
### [Data Explorations](misc)
1. stock market study on TESLA stock, [tesla-study.ipynb](misc/tesla-study.ipynb)
2. Outliers study using K-means, SVM, and Gaussian on TESLA stock, [outliers.ipynb](misc/outliers.ipynb)
3. Overbought-Oversold study on TESLA stock, [overbought-oversold.ipynb](misc/overbought-oversold.ipynb)
4. Which stock you need to buy? [which-stock.ipynb](misc/which-stock.ipynb)
### [Simulations](simulation)
1. Simple Monte Carlo, [monte-carlo-drift.ipynb](simulation/monte-carlo-drift.ipynb)
2. Dynamic volatility Monte Carlo, [monte-carlo-dynamic-volatility.ipynb](simulation/monte-carlo-dynamic-volatility.ipynb)
3. Drift Monte Carlo, [monte-carlo-drift.ipynb](simulation/monte-carlo-drift.ipynb)
4. Multivariate Drift Monte Carlo BTC/USDT with Bitcurate sentiment, [multivariate-drift-monte-carlo.ipynb](simulation/multivariate-drift-monte-carlo.ipynb)
5. Portfolio optimization, [portfolio-optimization.ipynb](simulation/portfolio-optimization.ipynb), inspired from https://pythonforfinance.net/2017/01/21/investment-portfolio-optimisation-with-python/
### [Tensorflow-js](stock-forecasting-js)
I code [LSTM Recurrent Neural Network](deep-learning/1.lstm.ipynb) and [Simple signal rolling agent](agent/simple-agent.ipynb) inside Tensorflow JS, you can try it here, [huseinhouse.com/stock-forecasting-js](https://huseinhouse.com/stock-forecasting-js/), you can download any historical CSV and upload dynamically.
### [Misc](misc)
1. fashion trending prediction with cross-validation, [fashion-forecasting.ipynb](misc/fashion-forecasting.ipynb)
2. Bitcoin analysis with LSTM prediction, [bitcoin-analysis-lstm.ipynb](misc/bitcoin-analysis-lstm.ipynb)
3. Kijang Emas Bank Negara, [kijang-emas-bank-negara.ipynb](misc/kijang-emas-bank-negara.ipynb)
## Results
### Results Agent
**This agent only able to buy or sell 1 unit per transaction.**
1. Turtle-trading agent, [turtle-agent.ipynb](agent/1.turtle-agent.ipynb)
<img src="output-agent/turtle-agent.png" width="70%" align="">
2. Moving-average agent, [moving-average-agent.ipynb](agent/2.moving-average-agent.ipynb)
<img src="output-agent/moving-average-agent.png" width="70%" align="">
3. Signal rolling agent, [signal-rolling-agent.ipynb](agent/3.signal-rolling-agent.ipynb)
<img src="output-agent/signal-rolling-agent.png" width="70%" align="">
4. Policy-gradient agent, [policy-gradient-agent.ipynb](agent/4.policy-gradient-agent.ipynb)
<img src="output-agent/policy-gradient-agent.png" width="70%" align="">
5. Q-learning agent, [q-learning-agent.ipynb](agent/5.q-learning-agent.ipynb)
<img src="output-agent/q-learning-agent.png" width="70%" align="">
6. Evolution-strategy agent, [evolution-strategy-agent.ipynb](agent/6.evolution-strategy-agent.ipynb)
<img src="output-agent/evolution-strategy-agent.png" width="70%" align="">
7. Double Q-learning agent, [double-q-learning-agent.ipynb](agent/7.double-q-learning-agent.ipynb)
<img src="output-agent/double-q-learning.png" width="70%" align="">
8. Recurrent Q-learning agent, [recurrent-q-learning-agent.ipynb](agent/8.recurrent-q-learning-agent.ipynb)
<img src="output-agent/recurrent-q-learning.png" width="70%" align="">
9. Double Recurrent Q-learning agent, [double-recurrent-q-learning-agent.ipynb](agent/9.double-recurrent-q-learning-agent.ipynb)
<img src="output-agent/double-recurrent-q-learning.png" width="70%" align="">
10. Duel Q-learning agent, [duel-q-learning-agent.ipynb](agent/10.duel-q-learning-agent.ipynb)
<img src="output-agent/double-q-learning.png" width="70%" align="">
11. Double Duel Q-learning agent, [double-duel-q-learning-agent.ipynb](agent/11.double-duel-q-learning-agent.ipynb)
<img src="output-agent/double-duel-q-learning.png" width="70%" align="">
12. Duel Recurrent Q-learning agent, [duel-recurrent-q-learning-agent.ipynb](agent/12.duel-recurrent-q-learning-agent.ipynb)
<img src="output-agent/duel-recurrent-q-learning.png" width="70%" align="">
13. Double Duel Recurrent Q-learning agent, [double-duel-recurrent-q-learning-agent.ipynb](agent/13.double-duel-recurrent-q-learning-agent.ipynb)
<img src="output-agent/double-duel-recurrent-q-learning.png" width="70%" align="">
14. Actor-critic agent, [actor-critic-agent.ipynb](agent/14.actor-critic-agent.ipynb)
<img src="output-agent/actor-critic.png" width="70%" align="">
15. Actor-critic Duel agent, [actor-critic-duel-agent.ipynb](agent/14.actor-critic-duel-agent.ipynb)
<img src="output-agent/actor-critic-duel.png" width="70%" align="">
16. Actor-critic Recurrent agent, [actor-critic-recurrent-agent.ipynb](agent/16.actor-critic-recurrent-agent.ipynb)
<img src="output-agent/actor-critic-recurrent.png" width="70%" align="">
17. Actor-critic Duel Recurrent agent, [actor-critic-duel-recurrent-agent.ipynb](agent/17.actor-critic-duel-recurrent-agent.ipynb)
<img src="output-agent/actor-critic-duel-recurrent.png" width="70%" align="">
18. Curiosity Q-learning agent, [curiosity-q-learning-agent.ipynb](agent/18.curiosity-q-learning-agent.ipynb)
<img src="output-agent/curiosity-q-learning.png" width="70%" align="">
19. Recurrent Curiosity Q-learning agent, [recurrent-curiosity-q-learning.ipynb](agent/19.recurrent-curiosity-q-learning-agent.ipynb)
<img src="output-agent/recurrent-curiosity-q-learning.png" width="70%" align="">
20. Duel Curiosity Q-learning agent, [duel-curiosity-q-learning-agent.ipynb](agent/20.duel-curiosity-q-learning-agent.ipynb)
<img src="output-agent/duel-curiosity-q-learning.png" width="70%" align="">
21. Neuro-evolution agent, [neuro-evolution.ipynb](agent/21.neuro-evolution-agent.ipynb)
<img src="output-agent/neuro-evolution.png" width="70%" align="">
22. Neuro-evolution with Novelty search agent, [neuro-evolution-novelty-search.ipynb](agent/22.neuro-evolution-novelty-search-agent.ipynb)
<img src="output-agent/neuro-evolution-novelty-search.png" width="70%" align="">
23. ABCD strategy agent, [abcd-strategy.ipynb](agent/23.abcd-strategy-agent.ipynb)
<img src="output-agent/abcd-strategy.png" width="70%" align="">
### Results signal prediction
I will cut the dataset to train and test datasets,
1. Train dataset derived from starting timestamp until last 30 days
2. Test dataset derived from last 30 days until end of the dataset
So we will let the model do forecasting based on last 30 days, and we will going to repeat the experiment for 10 times. You can increase it locally if you want, and tuning parameters will help you by a lot.
1. LSTM, accuracy 95.693%, time taken for 1 epoch 01:09
<img src="output/lstm.png" width="70%" align="">
2. LSTM Bidirectional, accuracy 93.8%, time taken for 1 epoch 01:40
<img src="output/bidirectional-lstm.png" width="70%" align="">
3. LSTM 2-Path, accuracy 94.63%, time taken for 1 epoch 01:39
<img src="output/lstm-2path.png" width="70%" align="">
4. GRU, accuracy 94.63%, time taken for 1 epoch 02:10
<img src="output/gru.png" width="70%" align="">
5. GRU Bidirectional, accuracy 92.5673%, time taken for 1 epoch 01:40
<img src="output/bidirectional-gru.png" width="70%" align="">
6. GRU 2-Path, accuracy 93.2117%, time taken for 1 epoch 01:39
<img src="output/gru-2path.png" width="70%" align="">
7. Vanilla, accuracy 91.4686%, time taken for 1 epoch 00:52
<img src="output/vanilla.png" width="70%" align="">
8. Vanilla Bidirectional, accuracy 88.9927%, time taken for 1 epoch 01:06
<img src="output/bidirectional-vanilla.png" width="70%" align="">
9. Vanilla 2-Path, accuracy 91.5406%, time taken for 1 epoch 01:08
<img src="output/vanilla-2path.png" width="70%" align="">
10. LSTM Seq2seq, accuracy 94.9817%, time taken for 1 epoch 01:36
<img src="output/lstm-seq2seq.png" width="70%" align="">
11. LSTM Bidirectional Seq2seq, accuracy 94.517%, time taken for 1 epoch 02:30
<img src="output/bidirectional-lstm-seq2seq.png" width="70%" align="">
12. LSTM Seq2seq VAE, accuracy 95.4190%, time taken for 1 epoch 01:48
<img src="output/lstm-seq2seq-vae.png" width="70%" align="">
13. GRU Seq2seq, accuracy 90.8854%, time taken for 1 epoch 01:34
<img src="output/gru-seq2seq.png" width="70%" align="">
14. GRU Bidirectional Seq2seq, accuracy 67.9915%, time taken for 1 epoch 02:30
<img src="output/bidirectional-gru-seq2seq.png" width="70%" align="">
15. GRU Seq2seq VAE, accuracy 89.1321%, time taken for 1 epoch 01:48
<img src="output/gru-seq2seq-vae.png" width="70%" align="">
16. Attention-is-all-you-Need, accuracy 94.2482%, time taken for 1 epoch 01:41
<img src="output/attention-is-all-you-need.png" width="70%" align="">
17. CNN-Seq2seq, accuracy 90.74%, time taken for 1 epoch 00:43
<img src="output/cnn-seq2seq.png" width="70%" align="">
18. Dilated-CNN-Seq2seq, accuracy 95.86%, time taken for 1 epoch 00:14
<img src="output/dilated-cnn-seq2seq.png" width="70%" align="">
**Bonus**
1. How to forecast,
<img src="output/how-to-forecast.png" width="70%" align="">
2. Sentiment consensus,
<img src="output/sentiment-consensus.png" width="70%" align="">
### Results analysis
1. Outliers study using K-means, SVM, and Gaussian on TESLA stock
<img src="misc/outliers.png" width="70%" align="">
2. Overbought-Oversold study on TESLA stock
<img src="misc/overbought-oversold.png" width="70%" align="">
3. Which stock you need to buy?
<img src="misc/which-stock.png" width="40%" align="">
### Results simulation
1. Simple Monte Carlo
<img src="simulation/monte-carlo-simple.png" width="70%" align="">
2. Dynamic volatity Monte Carlo
<img src="simulation/monte-carlo-dynamic-volatility.png" width="70%" align="">
3. Drift Monte Carlo
<img src="simulation/monte-carlo-drift.png" width="70%" align="">
4. Multivariate Drift Monte Carlo BTC/USDT with Bitcurate sentiment
<img src="simulation/multivariate-drift-monte-carlo.png" width="70%" align="">
5. Portfolio optimization
<img src="simulation/portfolio-optimization.png" width="40%" align="">
================================================
FILE: agent/1.turtle-agent.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2016-11-02</td>\n",
" <td>778.200012</td>\n",
" <td>781.650024</td>\n",
" <td>763.450012</td>\n",
" <td>768.700012</td>\n",
" <td>768.700012</td>\n",
" <td>1872400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2016-11-03</td>\n",
" <td>767.250000</td>\n",
" <td>769.950012</td>\n",
" <td>759.030029</td>\n",
" <td>762.130005</td>\n",
" <td>762.130005</td>\n",
" <td>1943200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2016-11-04</td>\n",
" <td>750.659973</td>\n",
" <td>770.359985</td>\n",
" <td>750.560974</td>\n",
" <td>762.020020</td>\n",
" <td>762.020020</td>\n",
" <td>2134800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-11-07</td>\n",
" <td>774.500000</td>\n",
" <td>785.190002</td>\n",
" <td>772.549988</td>\n",
" <td>782.520020</td>\n",
" <td>782.520020</td>\n",
" <td>1585100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2016-11-08</td>\n",
" <td>783.400024</td>\n",
" <td>795.632996</td>\n",
" <td>780.190002</td>\n",
" <td>790.510010</td>\n",
" <td>790.510010</td>\n",
" <td>1350800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close \\\n",
"0 2016-11-02 778.200012 781.650024 763.450012 768.700012 768.700012 \n",
"1 2016-11-03 767.250000 769.950012 759.030029 762.130005 762.130005 \n",
"2 2016-11-04 750.659973 770.359985 750.560974 762.020020 762.020020 \n",
"3 2016-11-07 774.500000 785.190002 772.549988 782.520020 782.520020 \n",
"4 2016-11-08 783.400024 795.632996 780.190002 790.510010 790.510010 \n",
"\n",
" Volume \n",
"0 1872400 \n",
"1 1943200 \n",
"2 2134800 \n",
"3 1585100 \n",
"4 1350800 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../dataset/GOOG-year.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>signal</th>\n",
" <th>trend</th>\n",
" <th>RollingMax</th>\n",
" <th>RollingMin</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.0</td>\n",
" <td>768.700012</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.0</td>\n",
" <td>762.130005</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.0</td>\n",
" <td>762.020020</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.0</td>\n",
" <td>782.520020</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.0</td>\n",
" <td>790.510010</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.0</td>\n",
" <td>785.309998</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.0</td>\n",
" <td>762.559998</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.0</td>\n",
" <td>754.020020</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.0</td>\n",
" <td>736.080017</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.0</td>\n",
" <td>758.489990</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>0.0</td>\n",
" <td>764.479980</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0.0</td>\n",
" <td>771.229980</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0.0</td>\n",
" <td>760.539978</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0.0</td>\n",
" <td>769.200012</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>0.0</td>\n",
" <td>768.270020</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>0.0</td>\n",
" <td>760.989990</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>0.0</td>\n",
" <td>761.679993</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0.0</td>\n",
" <td>768.239990</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>0.0</td>\n",
" <td>770.840027</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0.0</td>\n",
" <td>758.039978</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>0.0</td>\n",
" <td>747.919983</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>0.0</td>\n",
" <td>750.500000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>0.0</td>\n",
" <td>762.520020</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>0.0</td>\n",
" <td>759.109985</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>0.0</td>\n",
" <td>771.190002</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>0.0</td>\n",
" <td>776.419983</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>0.0</td>\n",
" <td>789.289978</td>\n",
" <td>790.510010</td>\n",
" <td>736.080017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>0.0</td>\n",
" <td>789.270020</td>\n",
" <td>790.510010</td>\n",
" <td>736.080017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>-1.0</td>\n",
" <td>796.099976</td>\n",
" <td>790.510010</td>\n",
" <td>736.080017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>-1.0</td>\n",
" <td>797.070007</td>\n",
" <td>796.099976</td>\n",
" <td>736.080017</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>222</th>\n",
" <td>0.0</td>\n",
" <td>932.450012</td>\n",
" <td>939.330017</td>\n",
" <td>906.659973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>223</th>\n",
" <td>0.0</td>\n",
" <td>928.530029</td>\n",
" <td>939.330017</td>\n",
" <td>906.659973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>224</th>\n",
" <td>0.0</td>\n",
" <td>920.969971</td>\n",
" <td>939.330017</td>\n",
" <td>906.659973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>225</th>\n",
" <td>0.0</td>\n",
" <td>924.859985</td>\n",
" <td>939.330017</td>\n",
" <td>906.659973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>226</th>\n",
" <td>-1.0</td>\n",
" <td>944.489990</td>\n",
" <td>939.330017</td>\n",
" <td>906.659973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>227</th>\n",
" <td>-1.0</td>\n",
" <td>949.500000</td>\n",
" <td>944.489990</td>\n",
" <td>913.809998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>228</th>\n",
" <td>-1.0</td>\n",
" <td>959.109985</td>\n",
" <td>949.500000</td>\n",
" <td>913.809998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>229</th>\n",
" <td>0.0</td>\n",
" <td>953.270020</td>\n",
" <td>959.109985</td>\n",
" <td>913.809998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>230</th>\n",
" <td>0.0</td>\n",
" <td>957.789978</td>\n",
" <td>959.109985</td>\n",
" <td>913.809998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>231</th>\n",
" <td>0.0</td>\n",
" <td>951.679993</td>\n",
" <td>959.109985</td>\n",
" <td>913.809998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>232</th>\n",
" <td>-1.0</td>\n",
" <td>969.960022</td>\n",
" <td>959.109985</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>233</th>\n",
" <td>-1.0</td>\n",
" <td>978.890015</td>\n",
" <td>969.960022</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>234</th>\n",
" <td>0.0</td>\n",
" <td>977.000000</td>\n",
" <td>978.890015</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>235</th>\n",
" <td>0.0</td>\n",
" <td>972.599976</td>\n",
" <td>978.890015</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>236</th>\n",
" <td>-1.0</td>\n",
" <td>989.250000</td>\n",
" <td>978.890015</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>0.0</td>\n",
" <td>987.830017</td>\n",
" <td>989.250000</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>238</th>\n",
" <td>-1.0</td>\n",
" <td>989.679993</td>\n",
" <td>989.250000</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>239</th>\n",
" <td>-1.0</td>\n",
" <td>992.000000</td>\n",
" <td>989.679993</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>240</th>\n",
" <td>-1.0</td>\n",
" <td>992.179993</td>\n",
" <td>992.000000</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>241</th>\n",
" <td>-1.0</td>\n",
" <td>992.809998</td>\n",
" <td>992.179993</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>242</th>\n",
" <td>0.0</td>\n",
" <td>984.450012</td>\n",
" <td>992.809998</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>243</th>\n",
" <td>0.0</td>\n",
" <td>988.200012</td>\n",
" <td>992.809998</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>244</th>\n",
" <td>0.0</td>\n",
" <td>968.450012</td>\n",
" <td>992.809998</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>245</th>\n",
" <td>0.0</td>\n",
" <td>970.539978</td>\n",
" <td>992.809998</td>\n",
" <td>915.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>246</th>\n",
" <td>0.0</td>\n",
" <td>973.330017</td>\n",
" <td>992.809998</td>\n",
" <td>920.969971</td>\n",
" </tr>\n",
" <tr>\n",
" <th>247</th>\n",
" <td>0.0</td>\n",
" <td>972.559998</td>\n",
" <td>992.809998</td>\n",
" <td>920.969971</td>\n",
" </tr>\n",
" <tr>\n",
" <th>248</th>\n",
" <td>-1.0</td>\n",
" <td>1019.270020</td>\n",
" <td>992.809998</td>\n",
" <td>920.969971</td>\n",
" </tr>\n",
" <tr>\n",
" <th>249</th>\n",
" <td>0.0</td>\n",
" <td>1017.109985</td>\n",
" <td>1019.270020</td>\n",
" <td>920.969971</td>\n",
" </tr>\n",
" <tr>\n",
" <th>250</th>\n",
" <td>0.0</td>\n",
" <td>1016.640015</td>\n",
" <td>1019.270020</td>\n",
" <td>920.969971</td>\n",
" </tr>\n",
" <tr>\n",
" <th>251</th>\n",
" <td>-1.0</td>\n",
" <td>1025.500000</td>\n",
" <td>1019.270020</td>\n",
" <td>924.859985</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>252 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" signal trend RollingMax RollingMin\n",
"0 0.0 768.700012 NaN NaN\n",
"1 0.0 762.130005 NaN NaN\n",
"2 0.0 762.020020 NaN NaN\n",
"3 0.0 782.520020 NaN NaN\n",
"4 0.0 790.510010 NaN NaN\n",
"5 0.0 785.309998 NaN NaN\n",
"6 0.0 762.559998 NaN NaN\n",
"7 0.0 754.020020 NaN NaN\n",
"8 0.0 736.080017 NaN NaN\n",
"9 0.0 758.489990 NaN NaN\n",
"10 0.0 764.479980 NaN NaN\n",
"11 0.0 771.229980 NaN NaN\n",
"12 0.0 760.539978 NaN NaN\n",
"13 0.0 769.200012 NaN NaN\n",
"14 0.0 768.270020 NaN NaN\n",
"15 0.0 760.989990 NaN NaN\n",
"16 0.0 761.679993 NaN NaN\n",
"17 0.0 768.239990 NaN NaN\n",
"18 0.0 770.840027 NaN NaN\n",
"19 0.0 758.039978 NaN NaN\n",
"20 0.0 747.919983 NaN NaN\n",
"21 0.0 750.500000 NaN NaN\n",
"22 0.0 762.520020 NaN NaN\n",
"23 0.0 759.109985 NaN NaN\n",
"24 0.0 771.190002 NaN NaN\n",
"25 0.0 776.419983 NaN NaN\n",
"26 0.0 789.289978 790.510010 736.080017\n",
"27 0.0 789.270020 790.510010 736.080017\n",
"28 -1.0 796.099976 790.510010 736.080017\n",
"29 -1.0 797.070007 796.099976 736.080017\n",
".. ... ... ... ...\n",
"222 0.0 932.450012 939.330017 906.659973\n",
"223 0.0 928.530029 939.330017 906.659973\n",
"224 0.0 920.969971 939.330017 906.659973\n",
"225 0.0 924.859985 939.330017 906.659973\n",
"226 -1.0 944.489990 939.330017 906.659973\n",
"227 -1.0 949.500000 944.489990 913.809998\n",
"228 -1.0 959.109985 949.500000 913.809998\n",
"229 0.0 953.270020 959.109985 913.809998\n",
"230 0.0 957.789978 959.109985 913.809998\n",
"231 0.0 951.679993 959.109985 913.809998\n",
"232 -1.0 969.960022 959.109985 915.000000\n",
"233 -1.0 978.890015 969.960022 915.000000\n",
"234 0.0 977.000000 978.890015 915.000000\n",
"235 0.0 972.599976 978.890015 915.000000\n",
"236 -1.0 989.250000 978.890015 915.000000\n",
"237 0.0 987.830017 989.250000 915.000000\n",
"238 -1.0 989.679993 989.250000 915.000000\n",
"239 -1.0 992.000000 989.679993 915.000000\n",
"240 -1.0 992.179993 992.000000 915.000000\n",
"241 -1.0 992.809998 992.179993 915.000000\n",
"242 0.0 984.450012 992.809998 915.000000\n",
"243 0.0 988.200012 992.809998 915.000000\n",
"244 0.0 968.450012 992.809998 915.000000\n",
"245 0.0 970.539978 992.809998 915.000000\n",
"246 0.0 973.330017 992.809998 920.969971\n",
"247 0.0 972.559998 992.809998 920.969971\n",
"248 -1.0 1019.270020 992.809998 920.969971\n",
"249 0.0 1017.109985 1019.270020 920.969971\n",
"250 0.0 1016.640015 1019.270020 920.969971\n",
"251 -1.0 1025.500000 1019.270020 924.859985\n",
"\n",
"[252 rows x 4 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"count = int(np.ceil(len(df) * 0.1))\n",
"signals = pd.DataFrame(index=df.index)\n",
"signals['signal'] = 0.0\n",
"signals['trend'] = df['Close']\n",
"signals['RollingMax'] = (signals.trend.shift(1).rolling(count).max())\n",
"signals['RollingMin'] = (signals.trend.shift(1).rolling(count).min())\n",
"signals.loc[signals['RollingMax'] < signals.trend, 'signal'] = -1\n",
"signals.loc[signals['RollingMin'] > signals.trend, 'signal'] = 1\n",
"signals"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def buy_stock(\n",
" real_movement,\n",
" signal,\n",
" initial_money = 10000,\n",
" max_buy = 1,\n",
" max_sell = 1,\n",
"):\n",
" \"\"\"\n",
" real_movement = actual movement in the real world\n",
" delay = how much interval you want to delay to change our decision from buy to sell, vice versa\n",
" initial_state = 1 is buy, 0 is sell\n",
" initial_money = 1000, ignore what kind of currency\n",
" max_buy = max quantity for share to buy\n",
" max_sell = max quantity for share to sell\n",
" \"\"\"\n",
" starting_money = initial_money\n",
" states_sell = []\n",
" states_buy = []\n",
" current_inventory = 0\n",
"\n",
" def buy(i, initial_money, current_inventory):\n",
" shares = initial_money // real_movement[i]\n",
" if shares < 1:\n",
" print(\n",
" 'day %d: total balances %f, not enough money to buy a unit price %f'\n",
" % (i, initial_money, real_movement[i])\n",
" )\n",
" else:\n",
" if shares > max_buy:\n",
" buy_units = max_buy\n",
" else:\n",
" buy_units = shares\n",
" initial_money -= buy_units * real_movement[i]\n",
" current_inventory += buy_units\n",
" print(\n",
" 'day %d: buy %d units at price %f, total balance %f'\n",
" % (i, buy_units, buy_units * real_movement[i], initial_money)\n",
" )\n",
" states_buy.append(0)\n",
" return initial_money, current_inventory\n",
"\n",
" for i in range(real_movement.shape[0] - int(0.025 * len(df))):\n",
" state = signal[i]\n",
" if state == 1:\n",
" initial_money, current_inventory = buy(\n",
" i, initial_money, current_inventory\n",
" )\n",
" states_buy.append(i)\n",
" elif state == -1:\n",
" if current_inventory == 0:\n",
" print('day %d: cannot sell anything, inventory 0' % (i))\n",
" else:\n",
" if current_inventory > max_sell:\n",
" sell_units = max_sell\n",
" else:\n",
" sell_units = current_inventory\n",
" current_inventory -= sell_units\n",
" total_sell = sell_units * real_movement[i]\n",
" initial_money += total_sell\n",
" try:\n",
" invest = (\n",
" (real_movement[i] - real_movement[states_buy[-1]])\n",
" / real_movement[states_buy[-1]]\n",
" ) * 100\n",
" except:\n",
" invest = 0\n",
" print(\n",
" 'day %d, sell %d units at price %f, investment %f %%, total balance %f,'\n",
" % (i, sell_units, total_sell, invest, initial_money)\n",
" )\n",
" states_sell.append(i)\n",
" \n",
" invest = ((initial_money - starting_money) / starting_money) * 100\n",
" total_gains = initial_money - starting_money\n",
" return states_buy, states_sell, total_gains, invest"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 28: cannot sell anything, inventory 0\n",
"day 29: cannot sell anything, inventory 0\n",
"day 30: cannot sell anything, inventory 0\n",
"day 44: cannot sell anything, inventory 0\n",
"day 45: cannot sell anything, inventory 0\n",
"day 47: cannot sell anything, inventory 0\n",
"day 54: cannot sell anything, inventory 0\n",
"day 55: cannot sell anything, inventory 0\n",
"day 56: cannot sell anything, inventory 0\n",
"day 85: cannot sell anything, inventory 0\n",
"day 86: cannot sell anything, inventory 0\n",
"day 87: cannot sell anything, inventory 0\n",
"day 88: cannot sell anything, inventory 0\n",
"day 89: cannot sell anything, inventory 0\n",
"day 90: cannot sell anything, inventory 0\n",
"day 91: cannot sell anything, inventory 0\n",
"day 92: cannot sell anything, inventory 0\n",
"day 96: buy 1 units at price 817.580017, total balance 9182.419983\n",
"day 97: buy 1 units at price 814.429993, total balance 8367.989990\n",
"day 117, sell 1 units at price 862.760010, investment 5.934214 %, total balance 9230.750000,\n",
"day 118, sell 1 units at price 872.299988, investment 7.105582 %, total balance 10103.049988,\n",
"day 120: cannot sell anything, inventory 0\n",
"day 121: cannot sell anything, inventory 0\n",
"day 122: cannot sell anything, inventory 0\n",
"day 123: cannot sell anything, inventory 0\n",
"day 124: cannot sell anything, inventory 0\n",
"day 125: cannot sell anything, inventory 0\n",
"day 127: cannot sell anything, inventory 0\n",
"day 132: cannot sell anything, inventory 0\n",
"day 133: cannot sell anything, inventory 0\n",
"day 138: cannot sell anything, inventory 0\n",
"day 139: cannot sell anything, inventory 0\n",
"day 140: cannot sell anything, inventory 0\n",
"day 141: cannot sell anything, inventory 0\n",
"day 142: cannot sell anything, inventory 0\n",
"day 146: cannot sell anything, inventory 0\n",
"day 162: buy 1 units at price 927.330017, total balance 9175.719971\n",
"day 164: buy 1 units at price 917.789978, total balance 8257.929993\n",
"day 165: buy 1 units at price 908.729980, total balance 7349.200013\n",
"day 166: buy 1 units at price 898.700012, total balance 6450.500001\n",
"day 177, sell 1 units at price 970.890015, investment 8.032714 %, total balance 7421.390016,\n",
"day 179, sell 1 units at price 972.919983, investment 8.258592 %, total balance 8394.309999,\n",
"day 180, sell 1 units at price 980.340027, investment 9.084234 %, total balance 9374.650026,\n",
"day 200: buy 1 units at price 906.659973, total balance 8467.990053\n",
"day 226, sell 1 units at price 944.489990, investment 4.172459 %, total balance 9412.480043,\n",
"day 227, sell 1 units at price 949.500000, investment 4.725038 %, total balance 10361.980043,\n",
"day 228: cannot sell anything, inventory 0\n",
"day 232: cannot sell anything, inventory 0\n",
"day 233: cannot sell anything, inventory 0\n",
"day 236: cannot sell anything, inventory 0\n",
"day 238: cannot sell anything, inventory 0\n",
"day 239: cannot sell anything, inventory 0\n",
"day 240: cannot sell anything, inventory 0\n",
"day 241: cannot sell anything, inventory 0\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = buy_stock(df.Close, signals['signal'])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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v2oH/kXsfT4f61btYPIJA1q5VQe77LK/tMh1Bg0awt13z2+RawkhhBBCCNHSPEVWRc9ICfw6DX+2z+sxAz+vx8fmn9MYO7EPEVEhjT7/a6+9wsqVX+FylXHFFVcxZcqx7Nu3l8suu4DFi78EqPL3Rx99iG7dunHuuRcCsGXLZu6++zZeffVtHnjgXgYNGsysWbN58cXn2LlzB8XFRezdu4cePXpy330PERYWRlFREX/727388cc2kpNTSEpKJj4+gb/+9doqbSsrK2P+/LvZvn0bdruD3r37cN99D/L99+v4178e58UXXwHg7bdf5803/0dUVDRHHDGRd955g8WLvwy0e8aMM1izZhVlZWXccstdjBgxErfbzU03XUt+fj4ul4shQ4Zy44234XQ6G/2eCiGEEEII0RidsaIndPKhnpWzfX7+rF9TsNlsLFz4Kg899A8efvgBcnNzat1/1qyzeP/9dwJtevvtNzj99D9hGMZB+2q9ibvvvp///vct3G43S5Z8AsB//vM80dExvPrq29x334P89NOGaq+1du1qSkqKWbToTV566TVuvPG2g/b5/fffeOWVhTzzzAJeeOFlCgurrmWSn5/PsGHD+c9/XuWSSy7n2WefAMBut3P33fN58cVXeOWV1/F4PCxe/H7db5gQQgghhBDNzFNsVvTsbIFfnRk/pdTfgVlAX+AwrfUv1usDgZeARCAbuFBr/VtjtrWkA7N9fk2Z9TvllNMA6N27LwMHKjZu/Jl+/WoeRtq37yF0796DNWu+YejQw1i1agVXX319tfsefvgEoqOjARgyZBh79uwG4Icf1nHttTcCEBMTy6RJR1d7fP/+A9i+/Q8effQhRo0aw5FHHnXQPj/8sJ4jjphIfHw8ANOnz+Dzzz8JbA8Pj2DixEkADB16GE899RgAXq+X115bxJo13+D1eigsLCQsLKzmN0oIIYQQQogW4im0Ar9ONtQzmIzfe8Bk4MA02LPAv7TWA4F/Ac81wbYWU122z68ps34HstvteL37r1teXrWYzJlnns27777F4sUfMHnyVKJq+CYiJCQ08LPNZsPj8dSrHT169GTRojcYN24869at5eKLz8HlctXrHCEh+4dumm1wA/D555/y008bePrp53n55dc5/fQzD7pPIYQQQgghWkMg42clUTqLOgM/rfXXWutdlV9TSqUAo4HX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\n",
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"close = df['Close']\n",
"fig = plt.figure(figsize = (15,5))\n",
"plt.plot(close, color='r', lw=2.)\n",
"plt.plot(close, '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n",
"plt.plot(close, 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n",
"plt.title('total gains %f, total investment %f%%'%(total_gains, invest))\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
================================================
FILE: agent/10.duel-q-learning-agent.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import tensorflow as tf\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2016-11-02</td>\n",
" <td>778.200012</td>\n",
" <td>781.650024</td>\n",
" <td>763.450012</td>\n",
" <td>768.700012</td>\n",
" <td>768.700012</td>\n",
" <td>1872400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2016-11-03</td>\n",
" <td>767.250000</td>\n",
" <td>769.950012</td>\n",
" <td>759.030029</td>\n",
" <td>762.130005</td>\n",
" <td>762.130005</td>\n",
" <td>1943200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2016-11-04</td>\n",
" <td>750.659973</td>\n",
" <td>770.359985</td>\n",
" <td>750.560974</td>\n",
" <td>762.020020</td>\n",
" <td>762.020020</td>\n",
" <td>2134800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-11-07</td>\n",
" <td>774.500000</td>\n",
" <td>785.190002</td>\n",
" <td>772.549988</td>\n",
" <td>782.520020</td>\n",
" <td>782.520020</td>\n",
" <td>1585100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2016-11-08</td>\n",
" <td>783.400024</td>\n",
" <td>795.632996</td>\n",
" <td>780.190002</td>\n",
" <td>790.510010</td>\n",
" <td>790.510010</td>\n",
" <td>1350800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close \\\n",
"0 2016-11-02 778.200012 781.650024 763.450012 768.700012 768.700012 \n",
"1 2016-11-03 767.250000 769.950012 759.030029 762.130005 762.130005 \n",
"2 2016-11-04 750.659973 770.359985 750.560974 762.020020 762.020020 \n",
"3 2016-11-07 774.500000 785.190002 772.549988 782.520020 782.520020 \n",
"4 2016-11-08 783.400024 795.632996 780.190002 790.510010 790.510010 \n",
"\n",
" Volume \n",
"0 1872400 \n",
"1 1943200 \n",
"2 2134800 \n",
"3 1585100 \n",
"4 1350800 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../dataset/GOOG-year.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from collections import deque\n",
"import random\n",
"\n",
"\n",
"class Agent:\n",
" def __init__(self, state_size, window_size, trend, skip, batch_size):\n",
" self.state_size = state_size\n",
" self.window_size = window_size\n",
" self.half_window = window_size // 2\n",
" self.trend = trend\n",
" self.skip = skip\n",
" self.action_size = 3\n",
" self.batch_size = batch_size\n",
" self.memory = deque(maxlen = 1000)\n",
" self.inventory = []\n",
"\n",
" self.gamma = 0.95\n",
" self.epsilon = 0.5\n",
" self.epsilon_min = 0.01\n",
" self.epsilon_decay = 0.999\n",
"\n",
" tf.reset_default_graph()\n",
" self.sess = tf.InteractiveSession()\n",
" self.X = tf.placeholder(tf.float32, [None, self.state_size])\n",
" self.Y = tf.placeholder(tf.float32, [None, self.action_size])\n",
" feed = tf.layers.dense(self.X, 512, activation = tf.nn.relu)\n",
" tensor_action, tensor_validation = tf.split(feed,2,1)\n",
" feed_action = tf.layers.dense(tensor_action, self.action_size)\n",
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
" self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
" self.cost = tf.reduce_mean(tf.square(self.Y - self.logits))\n",
" self.optimizer = tf.train.GradientDescentOptimizer(1e-5).minimize(\n",
" self.cost\n",
" )\n",
" self.sess.run(tf.global_variables_initializer())\n",
"\n",
" def act(self, state):\n",
" if random.random() <= self.epsilon:\n",
" return random.randrange(self.action_size)\n",
" return np.argmax(\n",
" self.sess.run(self.logits, feed_dict = {self.X: state})[0]\n",
" )\n",
" \n",
" def get_state(self, t):\n",
" window_size = self.window_size + 1\n",
" d = t - window_size + 1\n",
" block = self.trend[d : t + 1] if d >= 0 else -d * [self.trend[0]] + self.trend[0 : t + 1]\n",
" res = []\n",
" for i in range(window_size - 1):\n",
" res.append(block[i + 1] - block[i])\n",
" return np.array([res])\n",
"\n",
" def replay(self, batch_size):\n",
" mini_batch = []\n",
" l = len(self.memory)\n",
" for i in range(l - batch_size, l):\n",
" mini_batch.append(self.memory[i])\n",
" replay_size = len(mini_batch)\n",
" X = np.empty((replay_size, self.state_size))\n",
" Y = np.empty((replay_size, self.action_size))\n",
" states = np.array([a[0][0] for a in mini_batch])\n",
" new_states = np.array([a[3][0] for a in mini_batch])\n",
" Q = self.sess.run(self.logits, feed_dict = {self.X: states})\n",
" Q_new = self.sess.run(self.logits, feed_dict = {self.X: new_states})\n",
" for i in range(len(mini_batch)):\n",
" state, action, reward, next_state, done = mini_batch[i]\n",
" target = Q[i]\n",
" target[action] = reward\n",
" if not done:\n",
" target[action] += self.gamma * np.amax(Q_new[i])\n",
" X[i] = state\n",
" Y[i] = target\n",
" cost, _ = self.sess.run(\n",
" [self.cost, self.optimizer], feed_dict = {self.X: X, self.Y: Y}\n",
" )\n",
" if self.epsilon > self.epsilon_min:\n",
" self.epsilon *= self.epsilon_decay\n",
" return cost\n",
" \n",
" def buy(self, initial_money):\n",
" starting_money = initial_money\n",
" states_sell = []\n",
" states_buy = []\n",
" inventory = []\n",
" state = self.get_state(0)\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self.act(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and initial_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\n",
" inventory.append(self.trend[t])\n",
" initial_money -= self.trend[t]\n",
" states_buy.append(t)\n",
" print('day %d: buy 1 unit at price %f, total balance %f'% (t, self.trend[t], initial_money))\n",
" \n",
" \n",
" elif action == 2 and len(inventory):\n",
" bought_price = inventory.pop(0)\n",
" initial_money += self.trend[t]\n",
" states_sell.append(t)\n",
" try:\n",
" invest = ((close[t] - bought_price) / bought_price) * 100\n",
" except:\n",
" invest = 0\n",
" print(\n",
" 'day %d, sell 1 unit at price %f, investment %f %%, total balance %f,'\n",
" % (t, close[t], invest, initial_money)\n",
" )\n",
" \n",
" state = next_state\n",
" invest = ((initial_money - starting_money) / starting_money) * 100\n",
" total_gains = initial_money - starting_money\n",
" return states_buy, states_sell, total_gains, invest\n",
" \n",
" def train(self, iterations, checkpoint, initial_money):\n",
" for i in range(iterations):\n",
" total_profit = 0\n",
" inventory = []\n",
" state = self.get_state(0)\n",
" starting_money = initial_money\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self.act(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and starting_money >= self.trend[t] and t < (len(self.trend) - self.half_window):\n",
" inventory.append(self.trend[t])\n",
" starting_money -= self.trend[t]\n",
" \n",
" elif action == 2 and len(inventory) > 0:\n",
" bought_price = inventory.pop(0)\n",
" total_profit += self.trend[t] - bought_price\n",
" starting_money += self.trend[t]\n",
" \n",
" invest = ((starting_money - initial_money) / initial_money)\n",
" self.memory.append((state, action, invest, \n",
" next_state, starting_money < initial_money))\n",
" state = next_state\n",
" batch_size = min(self.batch_size, len(self.memory))\n",
" cost = self.replay(batch_size)\n",
" if (i+1) % checkpoint == 0:\n",
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
" starting_money))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING:tensorflow:From <ipython-input-3-28bed545c0f8>:30: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"keep_dims is deprecated, use keepdims instead\n",
"epoch: 10, total rewards: 231.100222.3, cost: 0.499693, total money: 10231.100222\n",
"epoch: 20, total rewards: 195.875063.3, cost: 0.324152, total money: 10195.875063\n",
"epoch: 30, total rewards: 219.615054.3, cost: 0.237771, total money: 10219.615054\n",
"epoch: 40, total rewards: 56.505131.3, cost: 0.183305, total money: 10056.505131\n",
"epoch: 50, total rewards: 190.745120.3, cost: 0.129967, total money: 10190.745120\n",
"epoch: 60, total rewards: 165.275088.3, cost: 0.134246, total money: 10165.275088\n",
"epoch: 70, total rewards: 201.795107.3, cost: 0.075016, total money: 10201.795107\n",
"epoch: 80, total rewards: 187.545045.3, cost: 0.062454, total money: 10187.545045\n",
"epoch: 90, total rewards: 206.835023.3, cost: 0.050687, total money: 10206.835023\n",
"epoch: 100, total rewards: 199.895082.3, cost: 0.041359, total money: 10199.895082\n",
"epoch: 110, total rewards: 184.405092.3, cost: 0.035289, total money: 10184.405092\n",
"epoch: 120, total rewards: 242.405092.3, cost: 0.047248, total money: 10242.405092\n",
"epoch: 130, total rewards: 148.405032.3, cost: 0.050786, total money: 10148.405032\n",
"epoch: 140, total rewards: 225.724978.3, cost: 0.021171, total money: 10225.724978\n",
"epoch: 150, total rewards: 168.344972.3, cost: 0.018388, total money: 10168.344972\n",
"epoch: 160, total rewards: 230.095034.3, cost: 0.199324, total money: 10230.095034\n",
"epoch: 170, total rewards: 206.275026.3, cost: 0.044696, total money: 10206.275026\n",
"epoch: 180, total rewards: 364.895023.3, cost: 0.016494, total money: 10364.895023\n",
"epoch: 190, total rewards: 220.664980.3, cost: 0.014381, total money: 10220.664980\n",
"epoch: 200, total rewards: 175.284975.3, cost: 0.010883, total money: 10175.284975\n"
]
}
],
"source": [
"close = df.Close.values.tolist()\n",
"initial_money = 10000\n",
"window_size = 30\n",
"skip = 1\n",
"batch_size = 32\n",
"agent = Agent(state_size = window_size, \n",
" window_size = window_size, \n",
" trend = close, \n",
" skip = skip, \n",
" batch_size = batch_size)\n",
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 7: buy 1 unit at price 754.020020, total balance 9245.979980\n",
"day 8: buy 1 unit at price 736.080017, total balance 8509.899963\n",
"day 9, sell 1 unit at price 758.489990, investment 0.592818 %, total balance 9268.389953,\n",
"day 11: buy 1 unit at price 771.229980, total balance 8497.159973\n",
"day 12, sell 1 unit at price 760.539978, investment 3.323003 %, total balance 9257.699951,\n",
"day 14, sell 1 unit at price 768.270020, investment -0.383797 %, total balance 10025.969971,\n",
"day 22: buy 1 unit at price 762.520020, total balance 9263.449951\n",
"day 24, sell 1 unit at price 771.190002, investment 1.137017 %, total balance 10034.639953,\n",
"day 28: buy 1 unit at price 796.099976, total balance 9238.539977\n",
"day 29: buy 1 unit at price 797.070007, total balance 8441.469970\n",
"day 31, sell 1 unit at price 790.799988, investment -0.665744 %, total balance 9232.269958,\n",
"day 32: buy 1 unit at price 794.200012, total balance 8438.069946\n",
"day 33: buy 1 unit at price 796.419983, total balance 7641.649963\n",
"day 37, sell 1 unit at price 791.549988, investment -0.692539 %, total balance 8433.199951,\n",
"day 39, sell 1 unit at price 782.789978, investment -1.436670 %, total balance 9215.989929,\n",
"day 41, sell 1 unit at price 786.140015, investment -1.290772 %, total balance 10002.129944,\n",
"day 48: buy 1 unit at price 806.359985, total balance 9195.769959\n",
"day 49: buy 1 unit at price 807.880005, total balance 8387.889954\n",
"day 50, sell 1 unit at price 804.609985, investment -0.217025 %, total balance 9192.499939,\n",
"day 52: buy 1 unit at price 802.174988, total balance 8390.324951\n",
"day 53, sell 1 unit at price 805.020020, investment -0.354011 %, total balance 9195.344971,\n",
"day 56, sell 1 unit at price 835.669983, investment 4.175522 %, total balance 10031.014954,\n",
"day 67: buy 1 unit at price 809.559998, total balance 9221.454956\n",
"day 68: buy 1 unit at price 813.669983, total balance 8407.784973\n",
"day 69, sell 1 unit at price 819.239990, investment 1.195710 %, total balance 9227.024963,\n",
"day 71: buy 1 unit at price 818.979980, total balance 8408.044983\n",
"day 72, sell 1 unit at price 824.159973, investment 1.289219 %, total balance 9232.204956,\n",
"day 76: buy 1 unit at price 831.330017, total balance 8400.874939\n",
"day 77, sell 1 unit at price 828.640015, investment 1.179520 %, total balance 9229.514954,\n",
"day 78: buy 1 unit at price 829.280029, total balance 8400.234925\n",
"day 79, sell 1 unit at price 823.210022, investment -0.976747 %, total balance 9223.444947,\n",
"day 80: buy 1 unit at price 835.239990, total balance 8388.204957\n",
"day 81, sell 1 unit at price 830.630005, investment 0.162789 %, total balance 9218.834962,\n",
"day 83, sell 1 unit at price 827.780029, investment -0.893152 %, total balance 10046.614991,\n",
"day 88: buy 1 unit at price 845.539978, total balance 9201.075013\n",
"day 89, sell 1 unit at price 845.619995, investment 0.009463 %, total balance 10046.695008,\n",
"day 91: buy 1 unit at price 848.780029, total balance 9197.914979\n",
"day 92: buy 1 unit at price 852.119995, total balance 8345.794984\n",
"day 93: buy 1 unit at price 848.400024, total balance 7497.394960\n",
"day 96, sell 1 unit at price 817.580017, investment -3.675865 %, total balance 8314.974977,\n",
"day 97: buy 1 unit at price 814.429993, total balance 7500.544984\n",
"day 100, sell 1 unit at price 831.409973, investment -2.430411 %, total balance 8331.954957,\n",
"day 101, sell 1 unit at price 831.500000, investment -1.991988 %, total balance 9163.454957,\n",
"day 103, sell 1 unit at price 838.549988, investment 2.961580 %, total balance 10002.004945,\n",
"day 104: buy 1 unit at price 834.570007, total balance 9167.434938\n",
"day 105: buy 1 unit at price 831.409973, total balance 8336.024965\n",
"day 106, sell 1 unit at price 827.880005, investment -0.801611 %, total balance 9163.904970,\n",
"day 107: buy 1 unit at price 824.669983, total balance 8339.234987\n",
"day 108: buy 1 unit at price 824.729980, total balance 7514.505007\n",
"day 110: buy 1 unit at price 824.320007, total balance 6690.185000\n",
"day 111: buy 1 unit at price 823.559998, total balance 5866.625002\n",
"day 112, sell 1 unit at price 837.169983, investment 0.692800 %, total balance 6703.794985,\n",
"day 113, sell 1 unit at price 836.820007, investment 1.473320 %, total balance 7540.614992,\n",
"day 114, sell 1 unit at price 838.210022, investment 1.634479 %, total balance 8378.825014,\n",
"day 115, sell 1 unit at price 841.650024, investment 2.102341 %, total balance 9220.475038,\n",
"day 116, sell 1 unit at price 843.190002, investment 2.383555 %, total balance 10063.665040,\n",
"day 122: buy 1 unit at price 912.570007, total balance 9151.095033\n",
"day 123, sell 1 unit at price 916.440002, investment 0.424077 %, total balance 10067.535035,\n",
"day 125: buy 1 unit at price 931.659973, total balance 9135.875062\n",
"day 126, sell 1 unit at price 927.130005, investment -0.486225 %, total balance 10063.005067,\n",
"day 144: buy 1 unit at price 966.950012, total balance 9096.055055\n",
"day 145, sell 1 unit at price 975.599976, investment 0.894562 %, total balance 10071.655031,\n",
"day 146: buy 1 unit at price 983.679993, total balance 9087.975038\n",
"day 148: buy 1 unit at price 980.940002, total balance 8107.035036\n",
"day 149, sell 1 unit at price 983.409973, investment -0.027450 %, total balance 9090.445009,\n",
"day 151, sell 1 unit at price 942.900024, investment -3.877911 %, total balance 10033.345033,\n",
"day 155: buy 1 unit at price 939.780029, total balance 9093.565004\n",
"day 157, sell 1 unit at price 950.630005, investment 1.154523 %, total balance 10044.195009,\n",
"day 160: buy 1 unit at price 965.590027, total balance 9078.604982\n",
"day 161, sell 1 unit at price 952.270020, investment -1.379468 %, total balance 10030.875002,\n",
"day 164: buy 1 unit at price 917.789978, total balance 9113.085024\n",
"day 166, sell 1 unit at price 898.700012, investment -2.079993 %, total balance 10011.785036,\n",
"day 168: buy 1 unit at price 906.690002, total balance 9105.095034\n",
"day 171: buy 1 unit at price 930.090027, total balance 8175.005007\n",
"day 172, sell 1 unit at price 943.830017, investment 4.096220 %, total balance 9118.835024,\n",
"day 173, sell 1 unit at price 947.159973, investment 1.835300 %, total balance 10065.994997,\n",
"day 176: buy 1 unit at price 965.400024, total balance 9100.594973\n",
"day 179, sell 1 unit at price 972.919983, investment 0.778947 %, total balance 10073.514956,\n",
"day 180: buy 1 unit at price 980.340027, total balance 9093.174929\n",
"day 181, sell 1 unit at price 950.700012, investment -3.023442 %, total balance 10043.874941,\n",
"day 194: buy 1 unit at price 914.390015, total balance 9129.484926\n",
"day 195, sell 1 unit at price 922.669983, investment 0.905518 %, total balance 10052.154909,\n",
"day 197: buy 1 unit at price 926.960022, total balance 9125.194887\n",
"day 199: buy 1 unit at price 910.669983, total balance 8214.524904\n",
"day 201, sell 1 unit at price 924.690002, investment -0.244889 %, total balance 9139.214906,\n",
"day 202, sell 1 unit at price 927.000000, investment 1.793187 %, total balance 10066.214906,\n",
"day 208: buy 1 unit at price 939.330017, total balance 9126.884889\n",
"day 211, sell 1 unit at price 927.809998, investment -1.226408 %, total balance 10054.694887,\n",
"day 214: buy 1 unit at price 929.080017, total balance 9125.614870\n",
"day 216, sell 1 unit at price 935.090027, investment 0.646878 %, total balance 10060.704897,\n",
"day 219: buy 1 unit at price 915.000000, total balance 9145.704897\n",
"day 221: buy 1 unit at price 931.580017, total balance 8214.124880\n",
"day 222, sell 1 unit at price 932.450012, investment 1.907105 %, total balance 9146.574892,\n",
"day 223, sell 1 unit at price 928.530029, investment -0.327399 %, total balance 10075.104921,\n",
"day 224: buy 1 unit at price 920.969971, total balance 9154.134950\n",
"day 226: buy 1 unit at price 944.489990, total balance 8209.644960\n",
"day 227: buy 1 unit at price 949.500000, total balance 7260.144960\n",
"day 228, sell 1 unit at price 959.109985, investment 4.141287 %, total balance 8219.254945,\n",
"day 229, sell 1 unit at price 953.270020, investment 0.929605 %, total balance 9172.524965,\n",
"day 230: buy 1 unit at price 957.789978, total balance 8214.734987\n",
"day 231: buy 1 unit at price 951.679993, total balance 7263.054994\n",
"day 232, sell 1 unit at price 969.960022, investment 2.154821 %, total balance 8233.015016,\n",
"day 233, sell 1 unit at price 978.890015, investment 2.202992 %, total balance 9211.905031,\n",
"day 234, sell 1 unit at price 977.000000, investment 2.660559 %, total balance 10188.905031,\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1080x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize = (15,5))\n",
"plt.plot(close, color='r', lw=2.)\n",
"plt.plot(close, '^', markersize=10, color='m', label = 'buying signal', markevery = states_buy)\n",
"plt.plot(close, 'v', markersize=10, color='k', label = 'selling signal', markevery = states_sell)\n",
"plt.title('total gains %f, total investment %f%%'%(total_gains, invest))\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
================================================
FILE: agent/11.double-duel-q-learning-agent.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import tensorflow as tf\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Date</th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2016-11-02</td>\n",
" <td>778.200012</td>\n",
" <td>781.650024</td>\n",
" <td>763.450012</td>\n",
" <td>768.700012</td>\n",
" <td>768.700012</td>\n",
" <td>1872400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2016-11-03</td>\n",
" <td>767.250000</td>\n",
" <td>769.950012</td>\n",
" <td>759.030029</td>\n",
" <td>762.130005</td>\n",
" <td>762.130005</td>\n",
" <td>1943200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2016-11-04</td>\n",
" <td>750.659973</td>\n",
" <td>770.359985</td>\n",
" <td>750.560974</td>\n",
" <td>762.020020</td>\n",
" <td>762.020020</td>\n",
" <td>2134800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2016-11-07</td>\n",
" <td>774.500000</td>\n",
" <td>785.190002</td>\n",
" <td>772.549988</td>\n",
" <td>782.520020</td>\n",
" <td>782.520020</td>\n",
" <td>1585100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2016-11-08</td>\n",
" <td>783.400024</td>\n",
" <td>795.632996</td>\n",
" <td>780.190002</td>\n",
" <td>790.510010</td>\n",
" <td>790.510010</td>\n",
" <td>1350800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Date Open High Low Close Adj Close \\\n",
"0 2016-11-02 778.200012 781.650024 763.450012 768.700012 768.700012 \n",
"1 2016-11-03 767.250000 769.950012 759.030029 762.130005 762.130005 \n",
"2 2016-11-04 750.659973 770.359985 750.560974 762.020020 762.020020 \n",
"3 2016-11-07 774.500000 785.190002 772.549988 782.520020 782.520020 \n",
"4 2016-11-08 783.400024 795.632996 780.190002 790.510010 790.510010 \n",
"\n",
" Volume \n",
"0 1872400 \n",
"1 1943200 \n",
"2 2134800 \n",
"3 1585100 \n",
"4 1350800 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('../dataset/GOOG-year.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from collections import deque\n",
"import random\n",
"\n",
"class Model:\n",
" def __init__(self, input_size, output_size, layer_size, learning_rate):\n",
" self.X = tf.placeholder(tf.float32, (None, input_size))\n",
" self.Y = tf.placeholder(tf.float32, (None, output_size))\n",
" feed = tf.layers.dense(self.X, layer_size, activation = tf.nn.relu)\n",
" tensor_action, tensor_validation = tf.split(feed,2,1)\n",
" feed_action = tf.layers.dense(tensor_action, output_size)\n",
" feed_validation = tf.layers.dense(tensor_validation, 1)\n",
" self.logits = feed_validation + tf.subtract(feed_action,tf.reduce_mean(feed_action,axis=1,keep_dims=True))\n",
" self.cost = tf.reduce_sum(tf.square(self.Y - self.logits))\n",
" self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n",
" \n",
"class Agent:\n",
"\n",
" LEARNING_RATE = 0.003\n",
" BATCH_SIZE = 32\n",
" LAYER_SIZE = 500\n",
" OUTPUT_SIZE = 3\n",
" EPSILON = 0.5\n",
" DECAY_RATE = 0.005\n",
" MIN_EPSILON = 0.1\n",
" GAMMA = 0.99\n",
" MEMORIES = deque()\n",
" COPY = 1000\n",
" T_COPY = 0\n",
" MEMORY_SIZE = 300\n",
" \n",
" def __init__(self, state_size, window_size, trend, skip):\n",
" self.state_size = state_size\n",
" self.window_size = window_size\n",
" self.half_window = window_size // 2\n",
" self.trend = trend\n",
" self.skip = skip\n",
" tf.reset_default_graph()\n",
" self.model = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
" self.model_negative = Model(self.state_size, self.OUTPUT_SIZE, self.LAYER_SIZE, self.LEARNING_RATE)\n",
" self.sess = tf.InteractiveSession()\n",
" self.sess.run(tf.global_variables_initializer())\n",
" self.trainable = tf.trainable_variables()\n",
" \n",
" def _assign(self):\n",
" for i in range(len(self.trainable)//2):\n",
" assign_op = self.trainable[i+len(self.trainable)//2].assign(self.trainable[i])\n",
" self.sess.run(assign_op)\n",
"\n",
" def _memorize(self, state, action, reward, new_state, done):\n",
" self.MEMORIES.append((state, action, reward, new_state, done))\n",
" if len(self.MEMORIES) > self.MEMORY_SIZE:\n",
" self.MEMORIES.popleft()\n",
"\n",
" def _select_action(self, state):\n",
" if np.random.rand() < self.EPSILON:\n",
" action = np.random.randint(self.OUTPUT_SIZE)\n",
" else:\n",
" action = self.get_predicted_action([state])\n",
" return action\n",
"\n",
" def _construct_memories(self, replay):\n",
" states = np.array([a[0] for a in replay])\n",
" new_states = np.array([a[3] for a in replay])\n",
" Q = self.predict(states)\n",
" Q_new = self.predict(new_states)\n",
" Q_new_negative = self.sess.run(self.model_negative.logits, feed_dict={self.model_negative.X:new_states})\n",
" replay_size = len(replay)\n",
" X = np.empty((replay_size, self.state_size))\n",
" Y = np.empty((replay_size, self.OUTPUT_SIZE))\n",
" for i in range(replay_size):\n",
" state_r, action_r, reward_r, new_state_r, done_r = replay[i]\n",
" target = Q[i]\n",
" target[action_r] = reward_r\n",
" if not done_r:\n",
" target[action_r] += self.GAMMA * Q_new_negative[i, np.argmax(Q_new[i])]\n",
" X[i] = state_r\n",
" Y[i] = target\n",
" return X, Y\n",
"\n",
" def predict(self, inputs):\n",
" return self.sess.run(self.model.logits, feed_dict={self.model.X:inputs})\n",
" \n",
" def get_predicted_action(self, sequence):\n",
" prediction = self.predict(np.array(sequence))[0]\n",
" return np.argmax(prediction)\n",
" \n",
" def get_state(self, t):\n",
" window_size = self.window_size + 1\n",
" d = t - window_size + 1\n",
" block = self.trend[d : t + 1] if d >= 0 else -d * [self.trend[0]] + self.trend[0 : t + 1]\n",
" res = []\n",
" for i in range(window_size - 1):\n",
" res.append(block[i + 1] - block[i])\n",
" return np.array(res)\n",
" \n",
" def buy(self, initial_money):\n",
" starting_money = initial_money\n",
" states_sell = []\n",
" states_buy = []\n",
" inventory = []\n",
" state = self.get_state(0)\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" action = self._select_action(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and initial_money >= self.trend[t]:\n",
" inventory.append(self.trend[t])\n",
" initial_money -= self.trend[t]\n",
" states_buy.append(t)\n",
" print('day %d: buy 1 unit at price %f, total balance %f'% (t, self.trend[t], initial_money))\n",
" \n",
" elif action == 2 and len(inventory):\n",
" bought_price = inventory.pop(0)\n",
" initial_money += self.trend[t]\n",
" states_sell.append(t)\n",
" try:\n",
" invest = ((close[t] - bought_price) / bought_price) * 100\n",
" except:\n",
" invest = 0\n",
" print(\n",
" 'day %d, sell 1 unit at price %f, investment %f %%, total balance %f,'\n",
" % (t, close[t], invest, initial_money)\n",
" )\n",
" \n",
" state = next_state\n",
" invest = ((initial_money - starting_money) / starting_money) * 100\n",
" total_gains = initial_money - starting_money\n",
" return states_buy, states_sell, total_gains, invest\n",
" \n",
" \n",
" def train(self, iterations, checkpoint, initial_money):\n",
" for i in range(iterations):\n",
" total_profit = 0\n",
" inventory = []\n",
" state = self.get_state(0)\n",
" starting_money = initial_money\n",
" for t in range(0, len(self.trend) - 1, self.skip):\n",
" if (self.T_COPY + 1) % self.COPY == 0:\n",
" self._assign()\n",
" \n",
" action = self._select_action(state)\n",
" next_state = self.get_state(t + 1)\n",
" \n",
" if action == 1 and starting_money >= self.trend[t]:\n",
" inventory.append(self.trend[t])\n",
" starting_money -= self.trend[t]\n",
" \n",
" elif action == 2 and len(inventory) > 0:\n",
" bought_price = inventory.pop(0)\n",
" total_profit += self.trend[t] - bought_price\n",
" starting_money += self.trend[t]\n",
" \n",
" invest = ((starting_money - initial_money) / initial_money)\n",
" \n",
" self._memorize(state, action, invest, next_state, starting_money < initial_money)\n",
" batch_size = min(len(self.MEMORIES), self.BATCH_SIZE)\n",
" state = next_state\n",
" replay = random.sample(self.MEMORIES, batch_size)\n",
" X, Y = self._construct_memories(replay)\n",
" \n",
" cost, _ = self.sess.run([self.model.cost, self.model.optimizer], \n",
" feed_dict={self.model.X: X, self.model.Y:Y})\n",
" self.T_COPY += 1\n",
" self.EPSILON = self.MIN_EPSILON + (1.0 - self.MIN_EPSILON) * np.exp(-self.DECAY_RATE * i)\n",
" if (i+1) % checkpoint == 0:\n",
" print('epoch: %d, total rewards: %f.3, cost: %f, total money: %f'%(i + 1, total_profit, cost,\n",
" starting_money))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING:tensorflow:From <ipython-input-3-42f2d1e26a9d>:12: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"keep_dims is deprecated, use keepdims instead\n",
"epoch: 10, total rewards: 1486.684997.3, cost: 0.694152, total money: 10514.124999\n",
"epoch: 20, total rewards: 313.279660.3, cost: 0.878157, total money: 8354.909665\n",
"epoch: 30, total rewards: 752.595089.3, cost: 0.320037, total money: 10752.595089\n",
"epoch: 40, total rewards: 1159.299987.3, cost: 0.318166, total money: 10186.739989\n",
"epoch: 50, total rewards: 993.220279.3, cost: 0.391151, total money: 4149.310245\n",
"epoch: 60, total rewards: 1616.499880.3, cost: 0.307440, total money: 9630.939883\n",
"epoch: 70, total rewards: 941.484560.3, cost: 0.332979, total money: 6969.054506\n",
"epoch: 80, total rewards: 904.899903.3, cost: 0.718111, total money: 1132.559876\n",
"epoch: 90, total rewards: 346.619873.3, cost: 0.482044, total money: 542.599852\n",
"epoch: 100, total rewards: 141.554626.3, cost: 0.238426, total money: 6115.974608\n",
"epoch: 110, total rewards: -159.529845.3, cost: 0.202412, total money: 8852.270143\n",
"epoch: 120, total rewards: -37.579779.3, cost: 0.433529, total money: 8945.780206\n",
"epoch: 130, total rewards: 1049.544800.3, cost: 0.408910, total money: 8099.664795\n",
"epoch: 140, total rewards: 59.114809.3, cost: 0.028664, total money: 7098.904848\n",
"epoch: 150, total rewards: 96.424866.3, cost: 0.070552, total money: 9079.784851\n",
"epoch: 160, total rewards: 74.179754.3, cost: 0.044092, total money: 10074.179754\n",
"epoch: 170, total rewards: 80.999883.3, cost: 0.018813, total money: 8047.249883\n",
"epoch: 180, total rewards: 62.700011.3, cost: 0.083292, total money: 10062.700011\n",
"epoch: 190, total rewards: 70.424991.3, cost: 0.013884, total money: 9053.315006\n",
"epoch: 200, total rewards: 10.620115.3, cost: 0.030838, total money: 10010.620115\n"
]
}
],
"source": [
"close = df.Close.values.tolist()\n",
"initial_money = 10000\n",
"window_size = 30\n",
"skip = 1\n",
"batch_size = 32\n",
"agent = Agent(state_size = window_size, \n",
" window_size = window_size, \n",
" trend = close, \n",
" skip = skip)\n",
"agent.train(iterations = 200, checkpoint = 10, initial_money = initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"day 1: buy 1 unit at price 762.130005, total balance 9237.869995\n",
"day 2, sell 1 unit at price 762.020020, investment -0.014431 %, total balance 9999.890015,\n",
"day 11: buy 1 unit at price 771.229980, total balance 9228.660035\n",
"day 12: buy 1 unit at price 760.539978, total balance 8468.120057\n",
"day 13, sell 1 unit at price 769.200012, investment -0.263212 %, total balance 9237.320069,\n",
"day 15, sell 1 unit at price 760.989990, investment 0.059170 %, total balance 9998.310059,\n",
"day 34: buy 1 unit at price 794.559998, total balance 9203.750061\n",
"day 35, sell 1 unit at price 791.260010, investment -0.415323 %, total balance 9995.010071,\n",
"day 36: buy 1 unit at price 789.909973, total balance 9205.100098\n",
"day 37, sell 1 unit at price 791.549988, investment 0.207620 %, total balance 9996.650086,\n",
"day 38: buy 1 unit at price 785.049988, total balance 9211.600098\n",
"day 40, sell 1 unit at price 771.820007, investment -1.685241 %, total balance 9983.420105,\n",
"day 54: buy 1 unit at price 819.309998, total balance 9164.110107\n",
"day 55, sell 1 unit at price 823.869995, investment 0.556566 %, total balance 9987.980102,\n",
"day 62: buy 1 unit at price 798.530029, total balance 9189.450073\n",
"day 64, sell 1 unit at price 801.340027, investment 0.351896 %, total balance 9990.790100,\n",
"day 68: buy 1 unit at price 813.669983, total balance 9177.120117\n",
"day 69, sell 1 unit at price 819.239990, investment 0.684554 %, total balance 9996.360107,\n",
"day 72: buy 1 unit at price 824.159973, total balance 9172.200134\n",
"day 73, sell 1 unit at price 828.070007, investment 0.474427 %, total balance 10000.270141,\n",
"day 74: buy 1 unit at price 831.659973, total balance 9168.610168\n",
"day 75, sell 1 unit at price 830.760010, investment -0.108213 %, total balance 9999.370178,\n",
"day 79: buy 1 unit at price 823.210022, total balance 9176.160156\n",
"day 80, sell 1 unit at price 835.239990, investment 1.461349 %, total balance 10011.400146,\n",
"day 90: buy 1 unit at price 847.200012, total balance 9164.200134\n",
"day 91, sell 1 unit at price 848.780029, investment 0.186499 %, total balance 10012.980163,\n",
"day 93: buy 1 unit at price 848.400024, total balance 9164.580139\n",
"day 94: buy 1 unit at price 830.460022, total balance 8334.120117\n",
"day 95, sell 1 unit at price 829.590027, investment -2.217114 %, total balance 9163.710144,\n",
"day 96, sell 1 unit at price 817.580017, investment -1.550948 %, total balance 9981.290161,\n",
"day 100: buy 1 unit at price 831.409973, total balance 9149.880188\n",
"day 101, sell 1 unit at price 831.500000, investment 0.010828 %, total balance 9981.380188,\n",
"day 104: buy 1 unit at price 834.570007, total balance 9146.810181\n",
"day 106: buy 1 unit at price 827.880005, total balance 8318.930176\n",
"day 107, sell 1 unit at price 824.669983, investment -1.186242 %, total balance 9143.600159,\n",
"day 108, sell 1 unit at price 824.729980, investment -0.380493 %, total balance 9968.330139,\n",
"day 110: buy 1 unit at price 824.320007, total balance 9144.010132\n",
"day 111, sell 1 unit at price 823.559998, investment -0.092198 %, total balance 9967.570130,\n",
"day 115: buy 1 unit at price 841.650024, total balance 9125.920106\n",
"day 116, sell 1 unit at price 843.190002, investment 0.182971 %, total balance 9969.110108,\n",
"day 125: buy 1 unit at price 931.659973, total balance 9037.450135\n",
"day 126, sell 1 unit at price 927.130005, investment -0.486225 %, total balance 9964.580140,\n",
"day 127: buy 1 unit at price 934.299988, total balance 9030.280152\n",
"day 128, sell 1 unit at price 932.169983, investment -0.227979 %, total balance 9962.450135,\n",
"day 141: buy 1 unit at price 971.469971, total balance 8990.980164\n",
"day 142, sell 1 unit at price 975.880005, investment 0.453955 %, total balance 9966.860169,\n",
"day 152: buy 1 unit at price 953.400024, total balance 9013.460145\n",
"day 153, sell 1 unit at price 950.760010, investment -0.276905 %, total balance 9964.220155,\n",
"day 156: buy 1 unit at price 957.369995, total balance 9006.850160\n",
"day 157, sell 1 unit at price 950.630005, investment -0.704011 %, total balance 9957.480165,\n",
"day 166: buy 1 unit at price 898.700012, total balance 9058.780153\n",
"day 167, sell 1 unit at price 911.710022, investment 1.447648 %, total balance 9970.490175,\n",
"day 172: buy 1 unit at price 943.830017, total balance 9026.660158\n",
"day 173, sell 1 unit at price 947.159973, investment 0.352813 %, total balance 9973.820131,\n",
"day 185: buy 1 unit at price 930.500000, total balance 9043.320131\n",
"day 186: buy 1 unit at price 930.830017, total balance 8112.490114\n",
"day 187, sell 1 unit at price 930.390015, investment -0.011820 %, total balance 9042.880129,\n",
"day 188, sell 1 unit at price 923.650024, investment -0.771354 %, total balance 9966.530153,\n",
"day 193: buy 1 unit at price 907.239990, total balance 9059.290163\n",
"day 194, sell 1 unit at price 914.390015, investment 0.788107 %, total balance 9973.680178,\n",
"day 197: buy 1 unit at price 926.960022, total balance 9046.720156\n",
"day 199, sell 1 unit at price 910.669983, investment -1.757362 %, total balance 9957.390139,\n",
"day 211: buy 1 unit at price 927.809998, total balance 9029.580141\n",
"day 212, sell 1 unit at price 935.950012, investment 0.877336 %, total balance 9965.530153,\n",
"day 213: buy 1 unit at price 926.500000, total balance 9039.030153\n",
"day 214, sell 1 unit at price 929.080017, investment 0.278469 %, total balance 9968.110170,\n"
]
}
],
"source": [
"states_buy, states_sell, total_gains, invest = agent.buy(initial_money = initial_money)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
gitextract_w7zipbjz/
├── .gitignore
├── LICENSE
├── README.md
├── agent/
│ ├── 1.turtle-agent.ipynb
│ ├── 10.duel-q-learning-agent.ipynb
│ ├── 11.double-duel-q-learning-agent.ipynb
│ ├── 12.duel-recurrent-q-learning-agent.ipynb
│ ├── 13.double-duel-recurrent-q-learning-agent.ipynb
│ ├── 14.actor-critic-agent.ipynb
│ ├── 15.actor-critic-duel-agent.ipynb
│ ├── 16.actor-critic-recurrent-agent.ipynb
│ ├── 17.actor-critic-duel-recurrent-agent.ipynb
│ ├── 18.curiosity-q-learning-agent.ipynb
│ ├── 19.recurrent-curiosity-q-learning-agent.ipynb
│ ├── 2.moving-average-agent.ipynb
│ ├── 20.duel-curiosity-q-learning-agent.ipynb
│ ├── 21.neuro-evolution-agent.ipynb
│ ├── 22.neuro-evolution-novelty-search-agent.ipynb
│ ├── 23.abcd-strategy-agent.ipynb
│ ├── 3.signal-rolling-agent.ipynb
│ ├── 4.policy-gradient-agent.ipynb
│ ├── 5.q-learning-agent.ipynb
│ ├── 6.evolution-strategy-agent.ipynb
│ ├── 7.double-q-learning-agent.ipynb
│ ├── 8.recurrent-q-learning-agent.ipynb
│ ├── 9.double-recurrent-q-learning-agent.ipynb
│ └── updated-NES-google.ipynb
├── dataset/
│ ├── AMD.csv
│ ├── BTC-sentiment.csv
│ ├── FB.csv
│ ├── FSV.csv
│ ├── GOOG-year.csv
│ ├── GOOG.csv
│ ├── INFY.csv
│ ├── KNX.csv
│ ├── MONDY.csv
│ ├── MTDR.csv
│ ├── SINA.csv
│ ├── TMUS.csv
│ ├── TSLA.csv
│ ├── TWTR.csv
│ ├── eur-myr.csv
│ ├── oil.csv
│ └── usd-myr.csv
├── deep-learning/
│ ├── 1.lstm.ipynb
│ ├── 10.lstm-seq2seq.ipynb
│ ├── 11.bidirectional-lstm-seq2seq.ipynb
│ ├── 12.lstm-seq2seq-vae.ipynb
│ ├── 13.gru-seq2seq.ipynb
│ ├── 14.bidirectional-gru-seq2seq.ipynb
│ ├── 15.gru-seq2seq-vae.ipynb
│ ├── 16.attention-is-all-you-need.ipynb
│ ├── 17.cnn-seq2seq.ipynb
│ ├── 18.dilated-cnn-seq2seq.ipynb
│ ├── 2.bidirectional-lstm.ipynb
│ ├── 3.lstm-2path.ipynb
│ ├── 4.gru.ipynb
│ ├── 5.bidirectional-gru.ipynb
│ ├── 6.gru-2path.ipynb
│ ├── 7.vanilla.ipynb
│ ├── 8.bidirectional-vanilla.ipynb
│ ├── 9.vanilla-2path.ipynb
│ ├── access.py
│ ├── addressing.py
│ ├── autoencoder.py
│ ├── dnc.py
│ ├── how-to-forecast.ipynb
│ ├── sentiment-consensus.ipynb
│ └── util.py
├── free-agent/
│ ├── evolution-strategy-agent.ipynb
│ └── evolution-strategy-bayesian-agent.ipynb
├── misc/
│ ├── bitcoin-analysis-lstm.ipynb
│ ├── fashion-forecasting.ipynb
│ ├── fashion.csv
│ ├── kijang-emas-bank-negara.ipynb
│ ├── outliers.ipynb
│ ├── overbought-oversold.ipynb
│ ├── sentiment-bitcoin.csv
│ ├── tesla-study.ipynb
│ └── which-stock.ipynb
├── realtime-agent/
│ ├── AMD.csv
│ ├── CPRT.csv
│ ├── FB.csv
│ ├── FSV.csv
│ ├── GOOG.csv
│ ├── GWR.csv
│ ├── LB.csv
│ ├── LYFT.csv
│ ├── MTDR.csv
│ ├── README.md
│ ├── SINA.csv
│ ├── TSLA.csv
│ ├── TWTR.csv
│ ├── app.py
│ ├── model.pkl
│ ├── realtime-evolution-strategy.ipynb
│ └── request.ipynb
├── simulation/
│ ├── monte-carlo-drift.ipynb
│ ├── monte-carlo-dynamic-volatility.ipynb
│ ├── monte-carlo-simple.ipynb
│ ├── multivariate-drift-monte-carlo.ipynb
│ └── portfolio-optimization.ipynb
├── stacking/
│ ├── autoencoder.py
│ ├── model.py
│ ├── stack-encoder-ensemble-xgb.ipynb
│ └── stack-rnn-arima-xgb.ipynb
└── stock-forecasting-js/
├── README.md
├── css/
│ └── style.css
├── data/
│ └── google.js
├── index.html
├── init.js
└── js/
├── tf-expand.js
├── tf.js
└── utils.js
SYMBOL INDEX (1768 symbols across 13 files)
FILE: deep-learning/access.py
function _erase_and_write (line 32) | def _erase_and_write(memory, address, reset_weights, values):
class MemoryAccess (line 66) | class MemoryAccess(snt.RNNCore):
method __init__ (line 84) | def __init__(self,
method _build (line 113) | def _build(self, inputs, prev_state):
method _read_inputs (line 160) | def _read_inputs(self, inputs):
method _write_weights (line 220) | def _write_weights(self, inputs, memory, usage):
method _read_weights (line 259) | def _read_weights(self, inputs, memory, prev_read_weights, link):
method state_size (line 306) | def state_size(self):
method output_size (line 316) | def output_size(self):
FILE: deep-learning/addressing.py
function _vector_norms (line 34) | def _vector_norms(m):
function weighted_softmax (line 39) | def weighted_softmax(activations, strengths, strengths_op):
class CosineWeights (line 58) | class CosineWeights(snt.AbstractModule):
method __init__ (line 65) | def __init__(self,
method _build (line 83) | def _build(self, memory, keys, strengths):
class TemporalLinkage (line 108) | class TemporalLinkage(snt.RNNCore):
method __init__ (line 121) | def __init__(self, memory_size, num_writes, name='temporal_linkage'):
method _build (line 133) | def _build(self, write_weights, prev_state):
method directional_read_weights (line 155) | def directional_read_weights(self, link, prev_read_weights, forward):
method _link (line 183) | def _link(self, prev_link, prev_precedence_weights, write_weights):
method _precedence_weights (line 220) | def _precedence_weights(self, prev_precedence_weights, write_weights):
method state_size (line 243) | def state_size(self):
class Freeness (line 252) | class Freeness(snt.RNNCore):
method __init__ (line 269) | def __init__(self, memory_size, name='freeness'):
method _build (line 279) | def _build(self, write_weights, free_gate, read_weights, prev_usage):
method write_allocation_weights (line 307) | def write_allocation_weights(self, usage, write_gates, num_writes):
method _usage_after_write (line 342) | def _usage_after_write(self, prev_usage, write_weights):
method _usage_after_read (line 357) | def _usage_after_read(self, prev_usage, free_gate, read_weights):
method _allocation (line 376) | def _allocation(self, usage):
method state_size (line 408) | def state_size(self):
FILE: deep-learning/autoencoder.py
function reducedimension (line 5) | def reducedimension(input_, dimension = 2, learning_rate = 0.01, hidden_...
FILE: deep-learning/dnc.py
class DNC (line 36) | class DNC(snt.RNNCore):
method __init__ (line 42) | def __init__(self,
method _clip_if_enabled (line 78) | def _clip_if_enabled(self, x):
method _build (line 84) | def _build(self, inputs, prev_state):
method initial_state (line 129) | def initial_state(self, batch_size, dtype=tf.float32):
method state_size (line 137) | def state_size(self):
method output_size (line 141) | def output_size(self):
FILE: deep-learning/util.py
function batch_invert_permutation (line 25) | def batch_invert_permutation(permutations):
function batch_gather (line 33) | def batch_gather(values, indices):
function one_hot (line 41) | def one_hot(length, index):
FILE: realtime-agent/app.py
function softmax (line 16) | def softmax(z):
function get_state (line 25) | def get_state(parameters, t, window_size = 20):
class Deep_Evolution_Strategy (line 43) | class Deep_Evolution_Strategy:
method __init__ (line 47) | def __init__(
method _get_weight_from_population (line 56) | def _get_weight_from_population(self, weights, population):
method get_weights (line 63) | def get_weights(self):
method train (line 66) | def train(self, epoch = 100, print_every = 1):
class Model (line 97) | class Model:
method __init__ (line 98) | def __init__(self, input_size, layer_size, output_size):
method predict (line 108) | def predict(self, inputs):
method get_weights (line 113) | def get_weights(self):
method set_weights (line 116) | def set_weights(self, weights):
class Agent (line 120) | class Agent:
method __init__ (line 126) | def __init__(self, model, timeseries, skip, initial_money, real_trend,...
method _initiate (line 142) | def _initiate(self):
method reset_capital (line 152) | def reset_capital(self, capital):
method trade (line 159) | def trade(self, data):
method change_data (line 223) | def change_data(self, timeseries, skip, initial_money, real_trend, min...
method act (line 231) | def act(self, sequence):
method act_softmax (line 236) | def act_softmax(self, sequence):
method get_state (line 241) | def get_state(self, t, inventory, capital, timeseries):
method get_reward (line 255) | def get_reward(self, weights):
method fit (line 284) | def fit(self, iterations, checkpoint):
method buy (line 287) | def buy(self):
function hello (line 360) | def hello():
function inventory (line 365) | def inventory():
function queue (line 370) | def queue():
function balance (line 375) | def balance():
function trade (line 380) | def trade():
function reset (line 386) | def reset():
FILE: stacking/autoencoder.py
function reducedimension (line 5) | def reducedimension(input_, dimension = 2, learning_rate = 0.01, hidden_...
FILE: stacking/model.py
class Model (line 4) | class Model:
method __init__ (line 5) | def __init__(self, learning_rate, num_layers, size, size_layer, output...
FILE: stock-forecasting-js/data/google.js
constant GOOGLE (line 1) | const GOOGLE = JSON.parse(JSON.stringify({"date": ["2017-07-10", "2017-0...
FILE: stock-forecasting-js/init.js
function smoothing_line (line 16) | function smoothing_line(scalars,weight){
function generate_investment (line 27) | function generate_investment(strings,values){
function buildConfig (line 36) | function buildConfig() {
function errorFn (line 52) | function errorFn(err, file) {
function completeFn (line 56) | function completeFn(results) {
function calculate_distribution (line 100) | function calculate_distribution(real,predict){
function calculateMA (line 161) | function calculateMA(dayCount, data) {
function plot_stock (line 177) | function plot_stock(){
function f (line 436) | function f(x,states){
function async_training_loop (line 446) | function async_training_loop(callback) {
function plot_pairplot (line 1031) | function plot_pairplot(val){
FILE: stock-forecasting-js/js/tf-expand.js
function isMobile (line 6) | function isMobile() {
function doc (line 11) | function doc(e) {
function assertArgumentIsTensor (line 17) | function assertArgumentIsTensor(e, t, r) {
function assertArgumentsAreTensors (line 21) | function assertArgumentsAreTensors(e, t) {
function shuffle (line 30) | function shuffle(e) {
function clamp (line 34) | function clamp(e, t, r) {
function randUniform (line 38) | function randUniform(e, t) {
function distSquared (line 42) | function distSquared(e, t) {
function assert (line 50) | function assert(e, t) {
function assertShapesMatch (line 54) | function assertShapesMatch(e, t, r) {
function assertTypesMatch (line 58) | function assertTypesMatch(e, t) {
function flatten (line 62) | function flatten(e, t) {
function inferShape (line 69) | function inferShape(e) {
function sizeFromShape (line 76) | function sizeFromShape(e) {
function isScalarShape (line 82) | function isScalarShape(e) {
function arraysEqual (line 86) | function arraysEqual(e, t) {
function isInt (line 93) | function isInt(e) {
function tanh (line 97) | function tanh(e) {
function sizeToSquarishShape (line 105) | function sizeToSquarishShape(e) {
function createShuffledIndices (line 111) | function createShuffledIndices(e) {
function rightPad (line 116) | function rightPad(e, t) {
function repeatedTry (line 120) | function repeatedTry(e, t, r) {
function getQueryParams (line 136) | function getQueryParams(e) {
function decodeParam (line 144) | function decodeParam(e, t, r) {
function inferFromImplicitShape (line 148) | function inferFromImplicitShape(e, t) {
function squeezeShape (line 164) | function squeezeShape(e, t) {
function getTypedArrayFromDType (line 178) | function getTypedArrayFromDType(e, t) {
function isTensorInList (line 189) | function isTensorInList(e, t) {
function checkForNaN (line 195) | function checkForNaN(e, t, r) {
function flattenNameArrayMap (line 201) | function flattenNameArrayMap(e, t) {
function unflattenToNameArrayMap (line 209) | function unflattenToNameArrayMap(e, t) {
function hasEncodingLoss (line 215) | function hasEncodingLoss(e, t) {
function copyTypedArray (line 219) | function copyTypedArray(e, t) {
function isTypedArray (line 229) | function isTypedArray(e) {
function bytesPerElement (line 233) | function bytesPerElement(e) {
function isFunction (line 239) | function isFunction(e) {
function getTensorsInContainer (line 243) | function getTensorsInContainer(e) {
function walkTensorContainer (line 248) | function walkTensorContainer(e, t, r) {
function isIterable (line 260) | function isIterable(e) {
function tensorToString (line 264) | function tensorToString(e, t) {
function computeMaxSizePerColumn (line 274) | function computeMaxSizePerColumn(e) {
function valToString (line 285) | function valToString(e, t) {
function subTensorToString (line 289) | function subTensorToString(e, t, r, n, a) {
function axesAreInnerMostDims (line 335) | function axesAreInnerMostDims(e, t) {
function combineLocations (line 341) | function combineLocations(e, t, r) {
function computeOutAndReduceShapes (line 346) | function computeOutAndReduceShapes(e, t) {
function expandShapeToKeepDim (line 353) | function expandShapeToKeepDim(e, t) {
function parseAxisParam (line 359) | function parseAxisParam(e, t) {
function assertAxesAreInnerMostDims (line 372) | function assertAxesAreInnerMostDims(e, t, r) {
function getAxesPermutation (line 376) | function getAxesPermutation(e, t) {
function getUndoAxesPermutation (line 384) | function getUndoAxesPermutation(e) {
function getInnerMostAxes (line 394) | function getInnerMostAxes(e, t) {
function assertParams (line 399) | function assertParams(e, t, r) {
function computeOutShape (line 406) | function computeOutShape(e, t, r) {
function computeGradientSliceShapes (line 412) | function computeGradientSliceShapes(e, t) {
function operation (line 421) | function operation(e, t, r) {
function concat2Tensors (line 431) | function concat2Tensors(e, t, r) {
function createCommonjsModule (line 458) | function createCommonjsModule(e, t) {
function makeZerosTypedArray (line 464) | function makeZerosTypedArray(e, t) {
function makeOnesTypedArray (line 471) | function makeOnesTypedArray(e, t) {
function toTypedArray (line 476) | function toTypedArray(e, t) {
function noConversionNeeded (line 480) | function noConversionNeeded(e, t) {
function getBroadcastDims (line 484) | function getBroadcastDims(e, t) {
function getReductionAxes (line 493) | function getReductionAxes(e, t) {
function broadcastDimsAreOuter (line 503) | function broadcastDimsAreOuter(e) {
function assertAndGetBroadcastShape (line 509) | function assertAndGetBroadcastShape(e, t) {
function batchnormReshape4D (line 519) | function batchnormReshape4D(e) {
function upcastType (line 523) | function upcastType(e, t) {
function sumOutType (line 527) | function sumOutType(e) {
function computePool2DInfo (line 531) | function computePool2DInfo(e, t, r, n, a, o) {
function computeConv2DInfo (line 544) | function computeConv2DInfo(e, t, r, n, a, o, i, s) {
function computeOutputShape3D (line 592) | function computeOutputShape3D(e, t, r, n, a, o) {
function computeDefaultPad (line 602) | function computeDefaultPad(e, t, r, n) {
function parseTupleParam (line 608) | function parseTupleParam(e) {
function getEffectiveFilterSize (line 612) | function getEffectiveFilterSize(e, t) {
function getPadAndOutInfo (line 616) | function getPadAndOutInfo(e, t, r, n, a, o, i, s) {
function conditionalRound (line 658) | function conditionalRound(e, t) {
function parseTupleParam$1 (line 672) | function parseTupleParam$1(e) {
function tupleValuesAreOne (line 676) | function tupleValuesAreOne(e) {
function eitherStridesOrDilationsAreOne (line 683) | function eitherStridesOrDilationsAreOne(e, t) {
function depthwiseConv2dDerInput (line 687) | function depthwiseConv2dDerInput(e, t, r, n) {
function depthwiseConv2dDerFilter (line 699) | function depthwiseConv2dDerFilter(e, t, r, n) {
function normImpl (line 711) | function normImpl(e, t, r) {
function assertParamsValid (line 731) | function assertParamsValid(e, t, r) {
function getStridedSlicedInfo (line 736) | function getStridedSlicedInfo(e, t, r, n, a, o) {
function startForAxis (line 746) | function startForAxis(e, t, r, n, a) {
function stopForAxis (line 753) | function stopForAxis(e, t, r, n, a) {
function computeStrides (line 760) | function computeStrides(e) {
function checkGrads (line 769) | function checkGrads(e) {
function getFilteredNodesXToY (line 775) | function getFilteredNodesXToY(e, t, r) {
function backpropagateGradients (line 815) | function backpropagateGradients(e, t) {
function hasExtension (line 835) | function hasExtension(e, t) {
function getWebGLRenderingContext (line 839) | function getWebGLRenderingContext(e) {
function loseContext (line 845) | function loseContext(e) {
function isWebGLVersionEnabled (line 853) | function isWebGLVersionEnabled(e) {
function getWebGLDisjointQueryTimerVersion (line 858) | function getWebGLDisjointQueryTimerVersion(e) {
function isFloatTextureReadPixelsEnabled (line 864) | function isFloatTextureReadPixelsEnabled(e) {
function isWebGLGetBufferSubDataAsyncExtensionEnabled (line 881) | function isWebGLGetBufferSubDataAsyncExtensionEnabled(e) {
function getFeaturesFromURL (line 889) | function getFeaturesFromURL() {
function getGlobalNamespace (line 907) | function getGlobalNamespace() {
function getOrMakeEnvironment (line 917) | function getOrMakeEnvironment() {
function computeOptimalWindowSize (line 922) | function computeOptimalWindowSize(e) {
function nearestDivisor (line 926) | function nearestDivisor(e, t) {
function castTensor (line 932) | function castTensor(e, t, r) {
function reshapeTensor (line 941) | function reshapeTensor(e, t) {
function getUnpackedMatrixTextureShapeWidthHeight (line 947) | function getUnpackedMatrixTextureShapeWidthHeight(e, t) {
function getUnpackedArraySizeFromMatrixSize (line 951) | function getUnpackedArraySizeFromMatrixSize(e, t) {
function getColorMatrixTextureShapeWidthHeight (line 955) | function getColorMatrixTextureShapeWidthHeight(e, t) {
function getMatrixSizeFromUnpackedArraySize (line 959) | function getMatrixSizeFromUnpackedArraySize(e, t) {
function encodeMatrixToUnpackedArray (line 964) | function encodeMatrixToUnpackedArray(e, t, r) {
function encodeFloatArray (line 970) | function encodeFloatArray(e) {
function decodeToFloatArray (line 985) | function decodeToFloatArray(e) {
function decodeMatrixFromUnpackedArray (line 998) | function decodeMatrixFromUnpackedArray(e, t, r) {
function decodeMatrixFromUnpackedColorRGBAArray (line 1004) | function decodeMatrixFromUnpackedColorRGBAArray(e, t, r) {
function getPackedMatrixTextureShapeWidthHeight (line 1011) | function getPackedMatrixTextureShapeWidthHeight(e, t) {
function getPackedRGBAArraySizeFromMatrixShape (line 1015) | function getPackedRGBAArraySizeFromMatrixShape(e, t) {
function encodeMatrixToPackedRGBA (line 1020) | function encodeMatrixToPackedRGBA(e, t, r, n) {
function decodeMatrixFromPackedRGBA (line 1037) | function decodeMatrixFromPackedRGBA(e, t, r, n) {
function makeShader (line 1051) | function makeShader(e, t, r, n) {
function getSampleSnippet (line 1065) | function getSampleSnippet() {
function getSetOutputSnippet (line 1069) | function getSetOutputSnippet() {
function getSamplerFromInInfo (line 1073) | function getSamplerFromInInfo(e) {
function getInputSamplingSnippet (line 1093) | function getInputSamplingSnippet(e, t, r) {
function getOutputSamplingSnippet (line 1098) | function getOutputSamplingSnippet(e, t) {
function getOutputScalarCoords (line 1117) | function getOutputScalarCoords() {
function getOutput1DCoords (line 1121) | function getOutput1DCoords(e, t) {
function getOutput3DCoords (line 1125) | function getOutput3DCoords(e, t) {
function getOutput4DCoords (line 1131) | function getOutput4DCoords(e, t) {
function getOutput5DCoords (line 1138) | function getOutput5DCoords(e, t) {
function getOutput2DCoords (line 1146) | function getOutput2DCoords(e, t) {
function getSamplerScalar (line 1150) | function getSamplerScalar(e) {
function getSampler1D (line 1155) | function getSampler1D(e) {
function getSampler2D (line 1161) | function getSampler2D(e) {
function getSampler3D (line 1180) | function getSampler3D(e) {
function getSampler4D (line 1200) | function getSampler4D(e) {
function getSampler5D (line 1220) | function getSampler5D(e) {
function getSamplerFlat (line 1241) | function getSamplerFlat(e) {
function getBroadcastOutputCoordsSampler (line 1250) | function getBroadcastOutputCoordsSampler(e, t, r, n) {
function getSamplerAtOutputCoords (line 1266) | function getSamplerAtOutputCoords(e, t, r) {
function getCoordsDataType (line 1284) | function getCoordsDataType(e) {
function squeezeInputInfo (line 1293) | function squeezeInputInfo(e, t) {
function getSqueezedParams (line 1298) | function getSqueezedParams(e, t) {
function getCoords (line 1304) | function getCoords(e, t) {
function getFinalCoord (line 1312) | function getFinalCoord(e, t) {
function getSourceCoords (line 1320) | function getSourceCoords(e, t) {
function createWebGLRenderingContext (line 1328) | function createWebGLRenderingContext(e) {
function createWebGLRenderingContextFromCanvas (line 1333) | function createWebGLRenderingContextFromCanvas(e, t) {
function callAndCheck (line 1339) | function callAndCheck(e, t) {
function enableDebugWebGLErrorChecking (line 1344) | function enableDebugWebGLErrorChecking(e) {
function checkWebGLError (line 1348) | function checkWebGLError(e) {
function getWebGLErrorMessage (line 1355) | function getWebGLErrorMessage(e, t) {
function getExtensionOrThrow (line 1376) | function getExtensionOrThrow(e, t) {
function createVertexShader (line 1382) | function createVertexShader(e, t) {
function createFragmentShader (line 1394) | function createFragmentShader(e, t) {
function logShaderSourceAndInfoLog (line 1406) | function logShaderSourceAndInfoLog(e, t) {
function createProgram (line 1418) | function createProgram(e) {
function linkProgram (line 1424) | function linkProgram(e, t) {
function validateProgram (line 1430) | function validateProgram(e, t) {
function createStaticVertexBuffer (line 1436) | function createStaticVertexBuffer(e, t) {
function createStaticIndexBuffer (line 1447) | function createStaticIndexBuffer(e, t) {
function queryMaxTextureSize (line 1458) | function queryMaxTextureSize(e) {
function getChannelsPerTexture (line 1464) | function getChannelsPerTexture() {
function createTexture (line 1468) | function createTexture(e) {
function validateTextureSize (line 1474) | function validateTextureSize(e, t, r) {
function createFramebuffer (line 1487) | function createFramebuffer(e) {
function bindVertexBufferToProgramAttribute (line 1493) | function bindVertexBufferToProgramAttribute(e, t, r, n, a, o, i) {
function bindTextureUnit (line 1504) | function bindTextureUnit(e, t, r) {
function unbindTextureUnit (line 1512) | function unbindTextureUnit(e, t) {
function getProgramUniformLocationOrThrow (line 1520) | function getProgramUniformLocationOrThrow(e, t, r) {
function getProgramUniformLocation (line 1526) | function getProgramUniformLocation(e, t, r) {
function bindTextureToProgramUniformSampler (line 1530) | function bindTextureToProgramUniformSampler(e, t, r, n, a) {
function bindCanvasToFramebuffer (line 1538) | function bindCanvasToFramebuffer(e) {
function bindColorTextureToFramebuffer (line 1548) | function bindColorTextureToFramebuffer(e, t, r) {
function unbindColorTextureFromFramebuffer (line 1556) | function unbindColorTextureFromFramebuffer(e, t) {
function validateFramebuffer (line 1564) | function validateFramebuffer(e) {
function getFramebufferErrorMessage (line 1569) | function getFramebufferErrorMessage(e, t) {
function throwIfNull (line 1584) | function throwIfNull(e, t, r) {
function validateTextureUnit (line 1592) | function validateTextureUnit(e, t) {
function getTextureShapeFromLogicalShape (line 1601) | function getTextureShapeFromLogicalShape(e, t) {
function getWebGLContextAttributes (line 1608) | function getWebGLContextAttributes() {
function createWebGLContext (line 1620) | function createWebGLContext(e) {
function createVertexShader$1 (line 1643) | function createVertexShader$1(e) {
function createVertexBuffer (line 1647) | function createVertexBuffer(e) {
function createIndexBuffer (line 1651) | function createIndexBuffer(e) {
function getTextureInternalFormat (line 1655) | function getTextureInternalFormat(e, t) {
function getTextureFormat (line 1659) | function getTextureFormat(e, t) {
function getTextureType (line 1663) | function getTextureType(e) {
function createAndConfigureTexture (line 1667) | function createAndConfigureTexture(e, t, r, n) {
function createMatrixTexture (line 1690) | function createMatrixTexture(e, t, r) {
function createColorMatrixTexture (line 1695) | function createColorMatrixTexture(e, t, r) {
function createPackedMatrixTexture (line 1700) | function createPackedMatrixTexture(e, t, r) {
function bindVertexProgramAttributeStreams (line 1705) | function bindVertexProgramAttributeStreams(e, t, r) {
function uploadPixelDataToTexture (line 1711) | function uploadPixelDataToTexture(e, t, r) {
function uploadDataToTexture (line 1721) | function uploadDataToTexture(e, t, r, n, a, o) {
function uploadMatrixToTexture (line 1732) | function uploadMatrixToTexture(e, t, r, n, a, o) {
function uploadMatrixToPackedTexture (line 1743) | function uploadMatrixToPackedTexture(e, t, r, n, a) {
function getDownloadTargetArrayBuffer (line 1752) | function getDownloadTargetArrayBuffer(e, t, r) {
function decodeDownloadTargetArrayBuffer (line 1758) | function decodeDownloadTargetArrayBuffer(e, t, r, n) {
function downloadMatrixFromOutputTextureAsync (line 1766) | function downloadMatrixFromOutputTextureAsync(e, t, r, n) {
function downloadMatrixFromOutputTexture (line 1786) | function downloadMatrixFromOutputTexture(e, t, r) {
function downloadMatrixFromRGBAColorTexture (line 1796) | function downloadMatrixFromRGBAColorTexture(e, t, r, n) {
function downloadMatrixFromPackedOutputTexture (line 1807) | function downloadMatrixFromPackedOutputTexture(e, t, r) {
function binSearchLastTrue (line 1819) | function binSearchLastTrue(e) {
function shouldUploadNaNUniform (line 1827) | function shouldUploadNaNUniform() {
function compileProgram (line 1831) | function compileProgram(e, t, r, n) {
function validateBinaryAndProgram (line 1864) | function validateBinaryAndProgram(e, t) {
function runProgram (line 1876) | function runProgram(e, t, r, n) {
function makeShaderKey (line 1889) | function makeShaderKey(e, t, r) {
function getCoords$1 (line 1900) | function getCoords$1(e) {
function getKeyFromTextureShape (line 1908) | function getKeyFromTextureShape(e, t) {
function getSourceCoords$1 (line 1912) | function getSourceCoords$1(e) {
function getSwitchedCoords (line 1920) | function getSwitchedCoords(e) {
function STEP (line 1927) | function STEP(e) {
function float32ToTypedArray (line 1931) | function float32ToTypedArray(e, t) {
function typedArrayToFloat32 (line 1940) | function typedArrayToFloat32(e, t) {
function encodeWeights (line 1944) | function encodeWeights(e) {
function decodeWeights (line 1970) | function decodeWeights(e, t) {
function concatenateTypedArrays (line 1990) | function concatenateTypedArrays(e) {
function stringByteLength (line 2007) | function stringByteLength(e) {
function arrayBufferToBase64String (line 2011) | function arrayBufferToBase64String(e) {
function base64StringToArrayBuffer (line 2015) | function base64StringToArrayBuffer(e) {
function concatenateArrayBuffers (line 2020) | function concatenateArrayBuffers(e) {
function basename (line 2032) | function basename(e) {
function getModelArtifactsInfoForJSON (line 2038) | function getModelArtifactsInfoForJSON(e) {
function parseURL (line 2049) | function parseURL(e) {
function cloneModelInternal (line 2057) | function cloneModelInternal(e, t, r) {
function getIndexedDBFactory (line 2081) | function getIndexedDBFactory() {
function setUpDatabase (line 2089) | function setUpDatabase(e) {
function browserIndexedDB (line 2098) | function browserIndexedDB(e) {
function maybeStripScheme (line 2102) | function maybeStripScheme(e) {
function getModelKeys (line 2106) | function getModelKeys(e) {
function getModelPathFromKey (line 2115) | function getModelPathFromKey(e) {
function maybeStripScheme$1 (line 2121) | function maybeStripScheme$1(e) {
function browserLocalStorage (line 2125) | function browserLocalStorage(e) {
function browserDownloads (line 2129) | function browserDownloads(e) {
function browserFiles (line 2133) | function browserFiles(e) {
function loadWeightsAsArrayBuffer (line 2137) | function loadWeightsAsArrayBuffer(e, t) {
function loadWeights (line 2157) | function loadWeights(e, t, r, n) {
function browserHTTPRequest (line 2234) | function browserHTTPRequest(e, t) {
function expectArraysClose (line 2238) | function expectArraysClose(e, t, r) {
function expectPromiseToFail (line 2258) | function expectPromiseToFail(e, t) {
function expectArraysEqual (line 2266) | function expectArraysEqual(e, t) {
function expectNumbersClose (line 2270) | function expectNumbersClose(e, t, r) {
function areClose (line 2274) | function areClose(e, t, r) {
function expectValuesInRange (line 2278) | function expectValuesInRange(e, t, r) {
function pyListRepeat (line 2285) | function pyListRepeat(e, t) {
function assert$1 (line 2293) | function assert$1(e, t) {
function count (line 2297) | function count(e, t) {
function singletonOrArray (line 2302) | function singletonOrArray(e) {
function toList (line 2306) | function toList(e) {
function isArrayOfShapes (line 2310) | function isArrayOfShapes(e) {
function normalizeShapeList (line 2314) | function normalizeShapeList(e) {
function toSnakeCase (line 2318) | function toSnakeCase(e) {
function toCamelCase (line 2323) | function toCamelCase(e) {
function serializeKerasObject (line 2329) | function serializeKerasObject(e) {
function deserializeKerasObject (line 2336) | function deserializeKerasObject(e, t, r, n) {
function getExactlyOneTensor (line 2371) | function getExactlyOneTensor(e) {
function getExactlyOneShape (line 2380) | function getExactlyOneShape(e) {
function numberCompare (line 2388) | function numberCompare(e, t) {
function reverseNumberCompare (line 2392) | function reverseNumberCompare(e, t) {
function stringToDType (line 2396) | function stringToDType(e) {
function unique (line 2405) | function unique(e) {
function isObjectEmpty (line 2413) | function isObjectEmpty(e) {
function checkStringTypeUnionValue (line 2420) | function checkStringTypeUnionValue(e, t, r) {
function checkDataFormat (line 2424) | function checkDataFormat(e) {
function checkPaddingMode (line 2428) | function checkPaddingMode(e) {
function checkPoolMode (line 2432) | function checkPoolMode(e) {
function nameScope (line 2436) | function nameScope(e, t) {
function currentNameScopePrefix (line 2446) | function currentNameScopePrefix() {
function getScopedTensorName (line 2450) | function getScopedTensorName(e) {
function getUniqueTensorName (line 2455) | function getUniqueTensorName(e) {
function isValidTensorName (line 2466) | function isValidTensorName(e) {
function isInteger (line 2470) | function isInteger(e) {
function arrayProd (line 2474) | function arrayProd(e, t, r) {
function toArray1D (line 2480) | function toArray1D(e) {
function min$1 (line 2484) | function min$1(e) {
function max$1 (line 2488) | function max$1(e) {
function range$1 (line 2492) | function range$1(e, t) {
function getNextUniqueTensorId (line 2498) | function getNextUniqueTensorId() {
function checkShapesMatch (line 2502) | function checkShapesMatch(e, t) {
function batchGetValue (line 2506) | function batchGetValue(e) {
function batchSetValue (line 2512) | function batchSetValue(e) {
function epsilon (line 2518) | function epsilon() {
function imageDataFormat (line 2522) | function imageDataFormat() {
function getScalar (line 2526) | function getScalar(e, t) {
function shape (line 2530) | function shape(e) {
function intShape (line 2534) | function intShape(e) {
function dtype (line 2538) | function dtype(e) {
function cast$1 (line 2542) | function cast$1(e, t) {
function expandDims$1 (line 2546) | function expandDims$1(e, t) {
function repeat (line 2552) | function repeat(e, t) {
function flatten$1 (line 2559) | function flatten$1(e) {
function batchFlatten (line 2564) | function batchFlatten(e) {
function sliceAlongFirstAxis (line 2570) | function sliceAlongFirstAxis(e, t, r) {
function sliceAlongLastAxis (line 2587) | function sliceAlongLastAxis(e, t, r) {
function sliceAlongAxis (line 2604) | function sliceAlongAxis(e, t, r, n) {
function concatenate (line 2648) | function concatenate(e, t) {
function concatAlongFirstAxis (line 2654) | function concatAlongFirstAxis(e, t) {
function tile$1 (line 2669) | function tile$1(e, t) {
function identity (line 2674) | function identity(e) {
function scalarTimesArray (line 2678) | function scalarTimesArray(e, t) {
function scalarPlusArray (line 2682) | function scalarPlusArray(e, t) {
function randomNormal$1 (line 2686) | function randomNormal$1(e, t, r, n, a) {
function dot$1 (line 2690) | function dot$1(e, t) {
function gather$1 (line 2702) | function gather$1(e, t, r) {
function square$1 (line 2708) | function square$1(e) {
function biasAdd (line 2712) | function biasAdd(e, t, r) {
function elu$1 (line 2727) | function elu$1(e, t) {
function softsign (line 2732) | function softsign(e) {
function dropout (line 2738) | function dropout(e, t, r, n) {
function nameScope$1 (line 2747) | function nameScope$1(e, t) {
function floatx (line 2751) | function floatx() {
function getUid (line 2755) | function getUid(e) {
function hardSigmoid (line 2759) | function hardSigmoid(e) {
function inTrainPhase (line 2766) | function inTrainPhase(e, t, r) {
function calcL2Norms (line 2770) | function calcL2Norms(e, t) {
function serializeConstraint (line 2776) | function serializeConstraint(e) {
function deserializeConstraint (line 2780) | function deserializeConstraint(e, t) {
function getConstraint (line 2784) | function getConstraint(e) {
function deserialize (line 2791) | function deserialize(e, t) {
function isArrayItemInputOrOutputName (line 2795) | function isArrayItemInputOrOutputName(e, t, r) {
function convertPythonicToTs (line 2799) | function convertPythonicToTs(e, t) {
function convertTsToPythonic (line 2822) | function convertTsToPythonic(e, t) {
function collectInputShape (line 2842) | function collectInputShape(e) {
function guessOutputDType (line 2850) | function guessOutputDType(e) {
function Input (line 2854) | function Input(e) {
function getSourceInputs (line 2868) | function getSourceInputs(e, t, r) {
function loadTensor (line 2879) | function loadTensor(e, t, r) {
function preprocessWeightsForLoading (line 2886) | function preprocessWeightsForLoading(e, t, r, n) {
function loadWeightsFromNamedTensorMap (line 2891) | function loadWeightsFromNamedTensorMap(e, t) {
function loadWeightsFromJson (line 2906) | function loadWeightsFromJson(e, t, r) {
function resolveScalarsInLogs (line 2932) | function resolveScalarsInLogs(e) {
function disposeTensorsInLogs (line 2950) | function disposeTensorsInLogs(e) {
function standardizeCallbacks (line 2958) | function standardizeCallbacks(e) {
function l2Normalize (line 2964) | function l2Normalize(e, t) {
function meanSquaredError (line 2973) | function meanSquaredError(e, t) {
function meanAbsoluteError (line 2979) | function meanAbsoluteError(e, t) {
function meanAbsolutePercentageError (line 2985) | function meanAbsolutePercentageError(e, t) {
function meanSquaredLogarithmicError (line 2994) | function meanSquaredLogarithmicError(e, t) {
function squaredHinge (line 3005) | function squaredHinge(e, t) {
function hinge (line 3014) | function hinge(e, t) {
function categoricalHinge (line 3023) | function categoricalHinge(e, t) {
function logcosh (line 3033) | function logcosh(e, t) {
function categoricalCrossentropy (line 3042) | function categoricalCrossentropy(e, t, r) {
function sparseCategoricalCrossentropy (line 3053) | function sparseCategoricalCrossentropy(e, t, r) {
function sigmoidCrossEntropyWithLogits (line 3061) | function sigmoidCrossEntropyWithLogits(e, t) {
function binaryCrossentropy (line 3070) | function binaryCrossentropy(e, t) {
function kullbackLeiblerDivergence (line 3077) | function kullbackLeiblerDivergence(e, t) {
function poisson (line 3085) | function poisson(e, t) {
function cosineProximity (line 3092) | function cosineProximity(e, t) {
function get (line 3101) | function get(e) {
function binaryAccuracy (line 3125) | function binaryAccuracy(e, t) {
function categoricalAccuracy (line 3133) | function categoricalAccuracy(e, t) {
function binaryCrossentropy$1 (line 3139) | function binaryCrossentropy$1(e, t) {
function sparseCategoricalAccuracy (line 3143) | function sparseCategoricalAccuracy(e, t) {
function get$1 (line 3147) | function get$1(e) {
function getOptimizer (line 3166) | function getOptimizer(e) {
function assertFeedCompatibility (line 3185) | function assertFeedCompatibility(e, t) {
function execute (line 3194) | function execute(e, t, r) {
function executeInternal (line 3202) | function executeInternal(e, t, r) {
function getNodeOutputs (line 3215) | function getNodeOutputs(e) {
function isDataTensor (line 3230) | function isDataTensor(e) {
function isDataArray (line 3234) | function isDataArray(e) {
function isDataDict (line 3238) | function isDataDict(e) {
function standardizeInputData (line 3242) | function standardizeInputData(e, t, r, n, a) {
function checkArrayLengths (line 3292) | function checkArrayLengths(e, t, r) {
function checkLossAndTargetCompatibility (line 3309) | function checkLossAndTargetCompatibility(e, t, r) {
function makeBatches (line 3326) | function makeBatches(e, t) {
function sliceArrays (line 3331) | function sliceArrays(e, t, r) {
function sliceArraysByIndices (line 3337) | function sliceArraysByIndices(e, t) {
function checkInputData (line 3345) | function checkInputData(e, t, r, n, a) {
function collectMetrics (line 3369) | function collectMetrics(e, t) {
function checkFanMode (line 3387) | function checkFanMode(e) {
function checkDistribution (line 3391) | function checkDistribution(e) {
function computeFans (line 3395) | function computeFans(e, t) {
function deserializeInitializer (line 3414) | function deserializeInitializer(e, t) {
function serializeInitializer (line 3418) | function serializeInitializer(e) {
function getInitializer (line 3422) | function getInitializer(e) {
function serializeActivation (line 3433) | function serializeActivation(e) {
function deserializeActivation (line 3437) | function deserializeActivation(e, t) {
function getActivation (line 3441) | function getActivation(e) {
function l1 (line 3456) | function l1(e) {
function l2 (line 3463) | function l2(e) {
function serializeRegularizer (line 3470) | function serializeRegularizer(e) {
function deserializeRegularizer (line 3474) | function deserializeRegularizer(e, t) {
function getRegularizer (line 3478) | function getRegularizer(e) {
function normalizeArray (line 3485) | function normalizeArray(e, t, r) {
function convOutputLength (line 3495) | function convOutputLength(e, t, r, n, a) {
function deconvLength (line 3501) | function deconvLength(e, t, r, n) {
function preprocessConv2DInput (line 3511) | function preprocessConv2DInput(e, t) {
function conv1dWithBias (line 3517) | function conv1dWithBias(e, t, r, n, a, o, i) {
function conv2dWithBias (line 3528) | function conv2dWithBias(e, t, r, n, a, o, i) {
function depthwiseConv2d$1 (line 3538) | function depthwiseConv2d$1(e, t, r, n, a, o) {
function batchNormalization$1 (line 3548) | function batchNormalization$1(e, t, r, n, a, o) {
function regularNormalizeBatchInTraining (line 3560) | function regularNormalizeBatchInTraining(e, t, r, n, a) {
function broadcastNormalizeBatchInTraining (line 3569) | function broadcastNormalizeBatchInTraining(e, t, r, n, a) {
function normalizeBatchInTraining (line 3582) | function normalizeBatchInTraining(e, t, r, n, a) {
function spatial2dPadding (line 3586) | function spatial2dPadding(e, t, r) {
function pool2d (line 3605) | function pool2d(e, t, r, n, a, o) {
function rnn (line 3613) | function rnn(e, t, r, n, a, o, i, s) {
function checkBidirectionalMergeMode (line 3629) | function checkBidirectionalMergeMode(e) {
function loadModelInternal (line 3633) | function loadModelInternal(e) {
function loadModelFromIOHandler (line 3647) | function loadModelFromIOHandler(e, t) {
function hasOwnProperty (line 3666) | function hasOwnProperty(e, t) {
function Url (line 3670) | function Url() {
function urlParse (line 3674) | function urlParse(e, t, r) {
function urlFormat (line 3680) | function urlFormat(e) {
function asPromise (line 3684) | function asPromise(e, t) {
function EventEmitter (line 3703) | function EventEmitter() {
function factory (line 3707) | function factory(e) {
function writeUintLE (line 3797) | function writeUintLE(e, t, r) {
function writeUintBE (line 3801) | function writeUintBE(e, t, r) {
function readUintLE (line 3805) | function readUintLE(e, t) {
function readUintBE (line 3809) | function readUintBE(e, t) {
function inquire (line 3813) | function inquire(moduleName) {
function pool (line 3821) | function pool(e, t, r) {
function LongBits (line 3834) | function LongBits(e, t) {
function Op (line 3838) | function Op(e, t, r) {
function noop (line 3842) | function noop() {}
function State (line 3844) | function State(e) {
function Writer (line 3848) | function Writer() {
function writeByte (line 3852) | function writeByte(e, t, r) {
function writeVarint32 (line 3856) | function writeVarint32(e, t, r) {
function VarintOp (line 3861) | function VarintOp(e, t) {
function writeVarint64 (line 3865) | function writeVarint64(e, t, r) {
function writeFixed32 (line 3871) | function writeFixed32(e, t, r) {
function BufferWriter$1 (line 3875) | function BufferWriter$1() {
function writeStringBuffer (line 3879) | function writeStringBuffer(e, t, r) {
function indexOutOfRange (line 3883) | function indexOutOfRange(e, t) {
function Reader (line 3887) | function Reader(e) {
function readLongVarint (line 3891) | function readLongVarint() {
function readFixed32_end (line 3915) | function readFixed32_end(e, t) {
function readFixed64 (line 3919) | function readFixed64() {
function BufferReader$1 (line 3924) | function BufferReader$1(e) {
function Service (line 3928) | function Service(e, t, r) {
function getParamValue (line 3933) | function getParamValue(e, t, r, n) {
function getTensor (line 3946) | function getTensor(e, t, r) {
function getNodeNameAndIndex (line 3956) | function getNodeNameAndIndex(e, t) {
function getNodeNameWithContextId (line 3963) | function getNodeNameWithContextId(e, t) {
function parseNodeName (line 3967) | function parseNodeName(e) {
function split$1 (line 3972) | function split$1(e, t) {
function executeOp$2 (line 3977) | function executeOp$2(e, t, r) {
function executeOp$13 (line 4021) | function executeOp$13(e, t, r) {
function loadFrozenModel (line 4054) | function loadFrozenModel(e, t, r) {
function e (line 4114) | function e() {}
function n (line 4136) | function n(e) {
function a (line 4145) | function a(e, t) {
function o (line 4149) | function o(e, t) {
function i (line 4162) | function i() {
function n (line 4180) | function n(e) {
function a (line 4190) | function a(e, t) {
function o (line 4194) | function o(e, t) {
function n (line 4216) | function n(e) {
function a (line 4226) | function a(e, t) {
function o (line 4230) | function o(e, t) {
function n (line 4252) | function n(e) {
function a (line 4270) | function a(e, t) {
function o (line 4274) | function o(e, t) {
function n (line 4297) | function n(e) {
function a (line 4314) | function a(e, t) {
function o (line 4318) | function o(e, t) {
function n (line 4341) | function n(e) {
function a (line 4354) | function a(e, t) {
function o (line 4358) | function o(e, t) {
function n (line 4380) | function n(e, n, c) {
function a (line 4402) | function a(e) {
function o (line 4416) | function o(e, t) {
function i (line 4420) | function i(e, t) {
function s (line 4430) | function s(e, t) {
function u (line 4435) | function u() {
function l (line 4446) | function l(e) {
function e (line 4469) | function e(e, t, r, n, a) {
function e (line 4505) | function e() {}
function i (line 4659) | function i(e) {
function s (line 4667) | function s(e) {
function u (line 4675) | function u(e) {
function r (line 4684) | function r(e) {
function n (line 4690) | function n(r) {
function e (line 4760) | function e() {}
function e (line 5137) | function e() {}
function e (line 5234) | function e() {}
function e (line 5535) | function e() {}
function e (line 5619) | function e() {}
function e (line 5751) | function e() {}
function e (line 5801) | function e() {}
function e (line 5835) | function e() {}
function e (line 5868) | function e() {}
function e (line 5930) | function e() {}
function e (line 6020) | function e() {}
function e (line 6045) | function e() {}
function e (line 6088) | function e() {}
function e (line 6157) | function e() {}
function e (line 6179) | function e() {}
function e (line 6202) | function e() {}
function e (line 6285) | function e() {}
function e (line 6321) | function e() {}
function e (line 6364) | function e() {}
function e (line 6406) | function e() {}
function e (line 6426) | function e() {}
function e (line 6460) | function e() {}
function n (line 7200) | function n() {
function i (line 7216) | function i(e) {
function s (line 7224) | function s(e) {
function u (line 7232) | function u(e) {
function r (line 7241) | function r(e) {
function n (line 7247) | function n(r) {
function e (line 7317) | function e(e, t, r) {
function e (line 7358) | function e(e, r, n, a) {
function t (line 7646) | function t(t, n, a) {
function e (line 7670) | function e() {}
function e (line 7763) | function e(e, t) {
function e (line 7778) | function e() {}
function i (line 7790) | function i(e) {
function s (line 7798) | function s(e) {
function u (line 7806) | function u(e) {
function r (line 7815) | function r(e) {
function n (line 7821) | function n(r) {
function e (line 7891) | function e(e, t) {
function e (line 8089) | function e(e) {
method Type (line 8166) | get Type() {
function i (line 8412) | function i(e) {
function s (line 8420) | function s(e) {
function u (line 8428) | function u(e) {
function r (line 8437) | function r(e) {
function n (line 8443) | function n(r) {
function i (line 8534) | function i(e) {
function s (line 8542) | function s(e) {
function u (line 8550) | function u(e) {
function r (line 8559) | function r(e) {
function n (line 8565) | function n(r) {
function e (line 8635) | function e(e) {
function e (line 8925) | function e(e, t, r) {
function e (line 9066) | function e(e) {
function e (line 9098) | function e(e) {
function i (line 9210) | function i(e) {
function s (line 9218) | function s(e) {
function u (line 9226) | function u(e) {
function r (line 9235) | function r(e) {
function n (line 9241) | function n(r) {
function e (line 9312) | function e(e, t) {
function i (line 9892) | function i(e) {
function s (line 9900) | function s(e) {
function u (line 9908) | function u(e) {
function r (line 9917) | function r(e) {
function n (line 9923) | function n(r) {
function e (line 9993) | function e() {
function e (line 10803) | function e() {}
function i (line 10821) | function i(e) {
function s (line 10829) | function s(e) {
function u (line 10837) | function u(e) {
function r (line 10846) | function r(e) {
function n (line 10852) | function n(r) {
function e (line 10922) | function e() {
function i (line 10953) | function i(e) {
function s (line 10961) | function s(e) {
function u (line 10969) | function u(e) {
function r (line 10978) | function r(e) {
function n (line 10984) | function n(r) {
function e (line 11055) | function e() {
function e (line 11073) | function e() {}
function i (line 11134) | function i(e) {
function s (line 11142) | function s(e) {
function u (line 11150) | function u(e) {
function r (line 11159) | function r(e) {
function n (line 11165) | function n(r) {
function e (line 11239) | function e(e) {
function e (line 11320) | function e() {
function i (line 11399) | function i(e) {
function s (line 11407) | function s(e) {
function u (line 11415) | function u(e) {
function r (line 11424) | function r(e) {
function n (line 11430) | function n(r) {
function e (line 11506) | function e(e) {
function e (line 11547) | function e() {
function i (line 11573) | function i(e) {
function s (line 11581) | function s(e) {
function u (line 11589) | function u(e) {
function r (line 11598) | function r(e) {
function n (line 11604) | function n(r) {
function e (line 11677) | function e(t) {
function e (line 11704) | function e(e) {
function i (line 11779) | function i(e) {
function s (line 11787) | function s(e) {
function u (line 11795) | function u(e) {
function r (line 11804) | function r(e) {
function n (line 11810) | function n(r) {
function i (line 11881) | function i(e) {
function s (line 11889) | function s(e) {
function u (line 11897) | function u(e) {
function r (line 11906) | function r(e) {
function n (line 11912) | function n(r) {
function e (line 11982) | function e(e, t) {
function e (line 12083) | function e() {}
function e (line 12091) | function e() {
function n (line 12140) | function n() {
function t (line 12155) | function t() {
function n (line 12180) | function n() {
function t (line 12187) | function t(t, r, n) {
function n (line 12243) | function n() {
function t (line 12250) | function t(t, r) {
function n (line 12297) | function n() {
function t (line 12304) | function t(t, r, n, a) {
function n (line 12368) | function n() {
function t (line 12375) | function t(t, r, n, a, o) {
function n (line 12440) | function n() {
function t (line 12447) | function t(t) {
function n (line 12484) | function n() {
function t (line 12491) | function t(t, r, n) {
function n (line 12537) | function n() {
function t (line 12544) | function t(t, r, n, a, o) {
function e (line 12613) | function e() {}
function n (line 12654) | function n() {
function t (line 12661) | function t(r) {
function t (line 12668) | function t(r) {
function t (line 12675) | function t(r) {
function t (line 12682) | function t(r) {
function t (line 12689) | function t(r) {
function t (line 12696) | function t(r) {
function e (line 12727) | function e(e, t, r, n, a, o, i) {
function e (line 12734) | function e(e, t, r, n, a) {
function n (line 12761) | function n() {
function t (line 12776) | function t() {
function t (line 12784) | function t(t) {
function t (line 12804) | function t(t) {
function t (line 12821) | function t() {
function t (line 12830) | function t(t) {
function n (line 12868) | function n() {
function e (line 12889) | function e(e, t) {
function t (line 12912) | function t(t) {
function t (line 13172) | function t(t) {
function t (line 13214) | function t(r) {
function r (line 13584) | function r(e, t) {
function n (line 13666) | function n() {
function i (line 13674) | function i(e) {
function s (line 13682) | function s(e) {
function u (line 13690) | function u(e) {
function r (line 13699) | function r(e) {
function n (line 13705) | function n(r) {
function e (line 13775) | function e() {
function e (line 13821) | function e(e, t) {
function t (line 13941) | function t() {
function t (line 13985) | function t() {
function t (line 14022) | function t(t) {
function e (line 14128) | function e(t) {
function n (line 14161) | function n() {
function i (line 14177) | function i(e) {
function s (line 14185) | function s(e) {
function u (line 14193) | function u(e) {
function r (line 14202) | function r(e) {
function n (line 14208) | function n(r) {
function t (line 14282) | function t(t) {
function n (line 14641) | function n() {
function t (line 14658) | function t() {
function t (line 14668) | function t() {
function t (line 14677) | function t() {
function t (line 14686) | function t(t) {
function t (line 14703) | function t(t) {
function t (line 14719) | function t(t) {
function t (line 14736) | function t(t) {
function t (line 14753) | function t(t) {
function t (line 14771) | function t(t) {
function t (line 14799) | function t(t) {
function t (line 14812) | function t(t) {
function t (line 14825) | function t(t) {
function t (line 14838) | function t(t) {
function t (line 14851) | function t(t) {
function n (line 14898) | function n() {
function t (line 14905) | function t() {
function t (line 14913) | function t() {
function t (line 14922) | function t() {
function t (line 14931) | function t() {
function t (line 14940) | function t() {
function t (line 14951) | function t() {
function t (line 14960) | function t() {
function t (line 14969) | function t() {
function t (line 14978) | function t() {
function t (line 14987) | function t() {
function t (line 14996) | function t() {
function t (line 15005) | function t() {
function n (line 15023) | function n() {
function t (line 15030) | function t(t) {
function t (line 15049) | function t(t) {
function t (line 15069) | function t(t) {
function t (line 15088) | function t(t) {
function n (line 15116) | function n() {
function t (line 15131) | function t() {
function t (line 15137) | function t(t) {
function n (line 15175) | function n() {
function t (line 15182) | function t(t, r) {
function t (line 15244) | function t(t) {
function t (line 15254) | function t(t) {
function t (line 15306) | function t(t, r) {
function t (line 15338) | function t(t) {
function t (line 15345) | function t(t) {
function t (line 15358) | function t(t) {
function t (line 15390) | function t(t) {
function n (line 15441) | function n() {
function t (line 15448) | function t(t) {
function n (line 15486) | function n() {
function t (line 15493) | function t(t) {
function t (line 15531) | function t(t) {
function t (line 15577) | function t(t) {
function t (line 15596) | function t(t) {
function t (line 15617) | function t(t) {
function t (line 15640) | function t(t) {
function n (line 15697) | function n() {
function t (line 15704) | function t(t) {
function n (line 15760) | function n() {
function t (line 15767) | function t(t) {
function t (line 15855) | function t(t) {
function t (line 15870) | function t(t) {
function t (line 15885) | function t(t) {
function t (line 15900) | function t(t) {
function t (line 15912) | function t(t) {
function t (line 15924) | function t(t) {
function n (line 15985) | function n() {
function t (line 15992) | function t(t) {
function n (line 16080) | function n() {
function t (line 16087) | function t(t) {
function n (line 16142) | function n() {
function t (line 16149) | function t(t) {
function t (line 16187) | function t(t) {
function t (line 16196) | function t(t) {
function t (line 16205) | function t(t) {
function t (line 16233) | function t(t) {
function t (line 16242) | function t(t) {
function t (line 16251) | function t(t) {
function t (line 16264) | function t(t) {
function t (line 16276) | function t(t) {
function t (line 16288) | function t(t) {
function t (line 16307) | function t() {
function t (line 16320) | function t() {
function n (line 16342) | function n() {
function t (line 16357) | function t(t) {
function n (line 16433) | function n(e) {
function t (line 16543) | function t() {
function t (line 16549) | function t(t) {
function t (line 16590) | function t(t) {
function t (line 16713) | function t(t) {
function t (line 16791) | function t(t) {
function t (line 16923) | function t(t) {
function t (line 16936) | function t() {
function t (line 17026) | function t(t) {
function t (line 17165) | function t(t) {
function n (line 17278) | function n() {
function t (line 17285) | function t(t) {
function t (line 17348) | function t(t) {
function t (line 17376) | function t(t) {
function n (line 17468) | function n() {
function i (line 17484) | function i(e) {
function s (line 17492) | function s(e) {
function u (line 17500) | function u(e) {
function r (line 17509) | function r(e) {
function n (line 17515) | function n(r) {
function t (line 17585) | function t(t) {
function e (line 17714) | function e() {}
function e (line 17726) | function e() {}
function e (line 17828) | function e() {}
function e (line 17840) | function e() {}
function e (line 17870) | function e() {}
function e (line 17898) | function e() {}
function n (line 17918) | function n(e) {
function a (line 17922) | function a(e, t) {
function o (line 17927) | function o(e, t) {
function i (line 17933) | function i(e) {
function s (line 17938) | function s(e) {
function u (line 17945) | function u(e) {
function l (line 17949) | function l(e, t) {
function c (line 17953) | function c(e, t, r) {
function p (line 17959) | function p(e) {
function d (line 17973) | function d(e) {
function r (line 18413) | function r(e, t, r) {
function n (line 18418) | function n(e) {
function r (line 18725) | function r() {
function e (line 18741) | function e(e) {
function e (line 18767) | function e(e) {
function e (line 18788) | function e(e) {
function e (line 18811) | function e(e) {
function e (line 18882) | function e(e) {
function e (line 18932) | function e(e) {
function e (line 18981) | function e(e) {
function e (line 19003) | function e(e) {
function e (line 19034) | function e(e) {
function e (line 19061) | function e(e) {
function e (line 19086) | function e(e) {
function e (line 19121) | function e(e) {
function e (line 19140) | function e(e) {
function e (line 19159) | function e(e) {
function e (line 19180) | function e(e) {
function e (line 19201) | function e(e) {
function e (line 19221) | function e(e) {
function e (line 19262) | function e(e) {
function e (line 19294) | function e(e) {
function e (line 19320) | function e(e) {
function e (line 19345) | function e(e) {
function e (line 19367) | function e(e) {
function e (line 19415) | function e(e) {
function e (line 19452) | function e(e) {
function e (line 19489) | function e(e) {
function e (line 19512) | function e(e) {
function e (line 19531) | function e(e) {
function e (line 19564) | function e(e) {
function e (line 19599) | function e(e) {
function e (line 19621) | function e(e) {
function e (line 19643) | function e(e) {
function e (line 19671) | function e(e) {
function e (line 21830) | function e() {
function i (line 22064) | function i(e) {
function s (line 22072) | function s(e) {
function u (line 22080) | function u(e) {
function r (line 22089) | function r(e) {
function n (line 22095) | function n(r) {
function e (line 22435) | function e(e) {
function i (line 22502) | function i(e) {
function s (line 22510) | function s(e) {
function u (line 22518) | function u(e) {
function r (line 22527) | function r(e) {
function n (line 22533) | function n(r) {
function e (line 22603) | function e(e) {
function i (line 22746) | function i(e) {
function s (line 22754) | function s(e) {
function u (line 22762) | function u(e) {
function r (line 22771) | function r(e) {
function n (line 22777) | function n(r) {
function e (line 22847) | function e(e, t, r) {
FILE: stock-forecasting-js/js/tf.js
function isMobile (line 1) | function isMobile(){var e=navigator.userAgent||navigator.vendor||window....
function doc (line 1) | function doc(e){return function(){for(var e=[],t=0;t<arguments.length;t+...
function assertArgumentIsTensor (line 1) | function assertArgumentIsTensor(e,t,r){assert(e instanceof Tensor,"Argum...
function assertArgumentsAreTensors (line 1) | function assertArgumentsAreTensors(e,t){for(var r in e)!function(r){var ...
function shuffle (line 1) | function shuffle(e){for(var t=e.length,r=0,n=0;t>0;)n=Math.random()*t|0,...
function clamp (line 1) | function clamp(e,t,r){return Math.max(e,Math.min(t,r))}
function randUniform (line 1) | function randUniform(e,t){return Math.random()*(t-e)+e}
function distSquared (line 1) | function distSquared(e,t){for(var r=0,n=0;n<e.length;n++){var a=Number(e...
function assert (line 1) | function assert(e,t){if(!e)throw new Error(t)}
function assertShapesMatch (line 1) | function assertShapesMatch(e,t,r){void 0===r&&(r=""),assert(arraysEqual(...
function assertTypesMatch (line 1) | function assertTypesMatch(e,t){assert(e.dtype===t.dtype," The dtypes of ...
function flatten (line 1) | function flatten(e,t){if(void 0===t&&(t=[]),Array.isArray(e))for(var r=0...
function inferShape (line 1) | function inferShape(e){if(isTypedArray(e))return[e.length];if(!Array.isA...
function sizeFromShape (line 1) | function sizeFromShape(e){if(0===e.length)return 1;for(var t=e[0],r=1;r<...
function isScalarShape (line 1) | function isScalarShape(e){return 0===e.length}
function arraysEqual (line 1) | function arraysEqual(e,t){if(e.length!==t.length)return!1;for(var r=0;r<...
function isInt (line 1) | function isInt(e){return e%1==0}
function tanh (line 1) | function tanh(e){if(null!=Math.tanh)return Math.tanh(e);if(e===1/0)retur...
function sizeToSquarishShape (line 1) | function sizeToSquarishShape(e){for(var t=Math.floor(Math.sqrt(e));t>1;-...
function createShuffledIndices (line 1) | function createShuffledIndices(e){for(var t=new Uint32Array(e),r=0;r<e;+...
function rightPad (line 1) | function rightPad(e,t){return t<=e.length?e:e+" ".repeat(t-e.length)}
function repeatedTry (line 1) | function repeatedTry(e,t,r){return void 0===t&&(t=function(e){return 0})...
function getQueryParams (line 1) | function getQueryParams(e){var t={};return e.replace(/[?&]([^=?&]+)(?:=(...
function decodeParam (line 1) | function decodeParam(e,t,r){e[decodeURIComponent(t)]=decodeURIComponent(...
function inferFromImplicitShape (line 1) | function inferFromImplicitShape(e,t){for(var r=1,n=-1,a=0;a<e.length;++a...
function squeezeShape (line 1) | function squeezeShape(e,t){for(var r=[],n=[],a=0,o=0;o<e.length;++o){if(...
function getTypedArrayFromDType (line 1) | function getTypedArrayFromDType(e,t){var r=null;if(null==e||"float32"===...
function isTensorInList (line 1) | function isTensorInList(e,t){for(var r=0;r<t.length;r++)if(t[r].id===e.i...
function checkForNaN (line 1) | function checkForNaN(e,t,r){if("float32"===t)for(var n=0;n<e.length;n++)...
function flattenNameArrayMap (line 1) | function flattenNameArrayMap(e,t){var r=[];if(e instanceof Tensor)r.push...
function unflattenToNameArrayMap (line 1) | function unflattenToNameArrayMap(e,t){if(e.length!==t.length)throw new E...
function hasEncodingLoss (line 1) | function hasEncodingLoss(e,t){return"float32"!==t&&(("int32"!==t||"float...
function copyTypedArray (line 1) | function copyTypedArray(e,t){if(null==t||"float32"===t)return new Float3...
function isTypedArray (line 1) | function isTypedArray(e){return e instanceof Float32Array||e instanceof ...
function bytesPerElement (line 1) | function bytesPerElement(e){if("float32"===e||"int32"===e)return 4;if("b...
function isFunction (line 1) | function isFunction(e){return!!(e&&e.constructor&&e.call&&e.apply)}
function getTensorsInContainer (line 1) | function getTensorsInContainer(e){var t=[];return walkTensorContainer(e,...
function walkTensorContainer (line 1) | function walkTensorContainer(e,t,r){if(null!=e)if(e instanceof Tensor)t....
function isIterable (line 1) | function isIterable(e){return Array.isArray(e)||"object"==typeof e}
function tensorToString (line 1) | function tensorToString(e,t){var r=e.dataSync(),n=computeMaxSizePerColum...
function computeMaxSizePerColumn (line 1) | function computeMaxSizePerColumn(e){var t=e.dataSync(),r=e.size,n=e.stri...
function valToString (line 1) | function valToString(e,t){return rightPad(parseFloat(e.toFixed(FORMAT_NU...
function subTensorToString (line 1) | function subTensorToString(e,t,r,n,a){void 0===a&&(a=!0);var o=t[0],i=t....
function axesAreInnerMostDims (line 1) | function axesAreInnerMostDims(e,t){for(var r=0;r<e.length;++r)if(e[e.len...
function combineLocations (line 1) | function combineLocations(e,t,r){for(var n=e.length+t.length,a=[],o=0,i=...
function computeOutAndReduceShapes (line 1) | function computeOutAndReduceShapes(e,t){for(var r=[],n=e.length,a=0;a<n;...
function expandShapeToKeepDim (line 1) | function expandShapeToKeepDim(e,t){return combineLocations(e,t.map(funct...
function parseAxisParam (line 1) | function parseAxisParam(e,t){var r=t.length;return e=null==e?t.map(funct...
function assertAxesAreInnerMostDims (line 1) | function assertAxesAreInnerMostDims(e,t,r){assert(axesAreInnerMostDims(t...
function getAxesPermutation (line 1) | function getAxesPermutation(e,t){if(axesAreInnerMostDims(e,t))return nul...
function getUndoAxesPermutation (line 1) | function getUndoAxesPermutation(e){return e.map(function(e,t){return[t,e...
function getInnerMostAxes (line 1) | function getInnerMostAxes(e,t){for(var r=[],n=t-e;n<t;++n)r.push(n);retu...
function assertParams (line 1) | function assertParams(e,t,r){var n=e.length,a=t.length;assert(e.length==...
function computeOutShape (line 1) | function computeOutShape(e,t,r){assert(e.length===t.length,"x1 and x2 sh...
function computeGradientSliceShapes (line 1) | function computeGradientSliceShapes(e,t){return{aBegin:[0,0],aSize:e,bBe...
function operation (line 1) | function operation(e,t,r){var n=r.value;return r.value=function(){for(va...
function concat2Tensors (line 1) | function concat2Tensors(e,t,r){assertParams(e.shape,t.shape,r);var n=com...
function createCommonjsModule (line 1) | function createCommonjsModule(e,t){return t={exports:{}},e(t,t.exports),...
function makeZerosTypedArray (line 1) | function makeZerosTypedArray(e,t){if(null==t||"float32"===t)return new F...
function makeOnesTypedArray (line 1) | function makeOnesTypedArray(e,t){for(var r=makeZerosTypedArray(e,t),n=0;...
function toTypedArray (line 1) | function toTypedArray(e,t){return noConversionNeeded(e,t)?e:(Array.isArr...
function noConversionNeeded (line 1) | function noConversionNeeded(e,t){return e instanceof Float32Array&&"floa...
function getBroadcastDims (line 1) | function getBroadcastDims(e,t){for(var r=e.length,n=[],a=0;a<r;a++){var ...
function getReductionAxes (line 1) | function getReductionAxes(e,t){for(var r=[],n=0;n<t.length;n++){var a=e[...
function broadcastDimsAreOuter (line 1) | function broadcastDimsAreOuter(e){for(var t=0;t<e.length;t++)if(e[t]!==t...
function assertAndGetBroadcastShape (line 1) | function assertAndGetBroadcastShape(e,t){for(var r=[],n="Operands could ...
function batchnormReshape4D (line 1) | function batchnormReshape4D(e){return null==e?null:0===e.rank?e.as1D():1...
function upcastType (line 1) | function upcastType(e,t){return upcastTypeMap[e][t]}
function sumOutType (line 1) | function sumOutType(e){return upcastType(e,"int32")}
function computePool2DInfo (line 1) | function computePool2DInfo(e,t,r,n,a,o){void 0===o&&(o="channelsLast");v...
function computeConv2DInfo (line 1) | function computeConv2DInfo(e,t,r,n,a,o,i,s){void 0===i&&(i=!1),void 0===...
function computeOutputShape3D (line 1) | function computeOutputShape3D(e,t,r,n,a,o){null==a&&(a=computeDefaultPad...
function computeDefaultPad (line 1) | function computeDefaultPad(e,t,r,n){void 0===n&&(n=1);var a=getEffective...
function parseTupleParam (line 1) | function parseTupleParam(e){return"number"==typeof e?[e,e]:e}
function getEffectiveFilterSize (line 1) | function getEffectiveFilterSize(e,t){return t<=1?e:e+(e-1)*(t-1)}
function getPadAndOutInfo (line 1) | function getPadAndOutInfo(e,t,r,n,a,o,i,s){var u,l,c;if("number"==typeof...
function conditionalRound (line 1) | function conditionalRound(e,t){if(!t)return e;switch(t){case"round":retu...
function parseTupleParam$1 (line 1) | function parseTupleParam$1(e){return"number"==typeof e?[e,e]:e}
function tupleValuesAreOne (line 1) | function tupleValuesAreOne(e){var t=parseTupleParam$1(e),r=t[0],n=t[1];r...
function eitherStridesOrDilationsAreOne (line 1) | function eitherStridesOrDilationsAreOne(e,t){return tupleValuesAreOne(e)...
function depthwiseConv2dDerInput (line 1) | function depthwiseConv2dDerInput(e,t,r,n){var a=t,o=!1;3===t.rank&&(o=!0...
function depthwiseConv2dDerFilter (line 1) | function depthwiseConv2dDerFilter(e,t,r,n){var a=e;3===e.rank&&(a=e.as4D...
function normImpl (line 1) | function normImpl(e,t,r){if(void 0===r&&(r=null),0===e.rank)return e.abs...
function assertParamsValid (line 1) | function assertParamsValid(e,t,r){assert(e.rank===t.length,"Error in sli...
function getStridedSlicedInfo (line 1) | function getStridedSlicedInfo(e,t,r,n,a,o){void 0===a&&(a=0),void 0===o&...
function startForAxis (line 1) | function startForAxis(e,t,r,n,a){var o=t[a];e&1<<a&&(o=r[a]>0?Number.MIN...
function stopForAxis (line 1) | function stopForAxis(e,t,r,n,a){var o=t[a];e&1<<a&&(o=r[a]>0?Number.MAX_...
function computeStrides (line 1) | function computeStrides(e){var t=e.length;if(t<2)return[];var r=new Arra...
function checkGrads (line 1) | function checkGrads(e){if(e.filter(function(e){return null==e}).length>0...
function getFilteredNodesXToY (line 1) | function getFilteredNodesXToY(e,t,r){for(var n={},a={},o=0;o<t.length;o+...
function backpropagateGradients (line 1) | function backpropagateGradients(e,t){for(var r=t.length-1;r>=0;r--){var ...
function hasExtension (line 1) | function hasExtension(e,t){return null!=e.getExtension(t)}
function getWebGLRenderingContext (line 1) | function getWebGLRenderingContext(e){if(0===e||!ENV.get("IS_BROWSER"))th...
function loseContext (line 1) | function loseContext(e){if(null!=e){var t=e.getExtension("WEBGL_lose_con...
function isWebGLVersionEnabled (line 1) | function isWebGLVersionEnabled(e){var t=getWebGLRenderingContext(e);retu...
function getWebGLDisjointQueryTimerVersion (line 1) | function getWebGLDisjointQueryTimerVersion(e){if(0===e)return 0;var t,r=...
function isFloatTextureReadPixelsEnabled (line 1) | function isFloatTextureReadPixelsEnabled(e){if(0===e)return!1;var t=getW...
function isWebGLGetBufferSubDataAsyncExtensionEnabled (line 1) | function isWebGLGetBufferSubDataAsyncExtensionEnabled(e){if(e>0)return!1...
function getFeaturesFromURL (line 1) | function getFeaturesFromURL(){var e={};if("undefined"==typeof window||vo...
function getGlobalNamespace (line 1) | function getGlobalNamespace(){var e;if("undefined"!=typeof window)e=wind...
function getOrMakeEnvironment (line 1) | function getOrMakeEnvironment(){var e=getGlobalNamespace();return e.ENV=...
function computeOptimalWindowSize (line 1) | function computeOptimalWindowSize(e){return e<=PARALLELIZE_THRESHOLD?e:n...
function nearestDivisor (line 1) | function nearestDivisor(e,t){for(var r=t;r<e;++r)if(e%r==0)return r;retu...
function castTensor (line 1) | function castTensor(e,t,r){if(!hasEncodingLoss(e.dtype,t))return Tensor....
function reshapeTensor (line 1) | function reshapeTensor(e,t){return Tensor.make(t,{dataId:e.dataId},e.dty...
function getUnpackedMatrixTextureShapeWidthHeight (line 1) | function getUnpackedMatrixTextureShapeWidthHeight(e,t){return[t,e]}
function getUnpackedArraySizeFromMatrixSize (line 1) | function getUnpackedArraySizeFromMatrixSize(e,t){return e*t}
function getColorMatrixTextureShapeWidthHeight (line 1) | function getColorMatrixTextureShapeWidthHeight(e,t){return[4*t,e]}
function getMatrixSizeFromUnpackedArraySize (line 1) | function getMatrixSizeFromUnpackedArraySize(e,t){if(e%t!=0)throw new Err...
function encodeMatrixToUnpackedArray (line 1) | function encodeMatrixToUnpackedArray(e,t,r){var n=getUnpackedArraySizeFr...
function encodeFloatArray (line 1) | function encodeFloatArray(e){for(var t=new Uint8Array(4*e.length),r=0;r<...
function decodeToFloatArray (line 1) | function decodeToFloatArray(e){for(var t=new Float32Array(e.length/4),r=...
function decodeMatrixFromUnpackedArray (line 1) | function decodeMatrixFromUnpackedArray(e,t,r){var n=getMatrixSizeFromUnp...
function decodeMatrixFromUnpackedColorRGBAArray (line 1) | function decodeMatrixFromUnpackedColorRGBAArray(e,t,r){var n=e.length*r/...
function getPackedMatrixTextureShapeWidthHeight (line 1) | function getPackedMatrixTextureShapeWidthHeight(e,t){return[Math.ceil(t/...
function getPackedRGBAArraySizeFromMatrixShape (line 1) | function getPackedRGBAArraySizeFromMatrixShape(e,t){var r=getPackedMatri...
function encodeMatrixToPackedRGBA (line 1) | function encodeMatrixToPackedRGBA(e,t,r,n){var a=getPackedRGBAArraySizeF...
function decodeMatrixFromPackedRGBA (line 1) | function decodeMatrixFromPackedRGBA(e,t,r,n){var a=t*r;if(a<n.length)thr...
function makeShader (line 1) | function makeShader(e,t,r,n){var a=getSampleSnippet(),o=getSetOutputSnip...
function getSampleSnippet (line 1) | function getSampleSnippet(){return ENV.get("WEBGL_FLOAT_TEXTURE_ENABLED"...
function getSetOutputSnippet (line 1) | function getSetOutputSnippet(){return ENV.get("WEBGL_FLOAT_TEXTURE_ENABL...
function getSamplerFromInInfo (line 1) | function getSamplerFromInInfo(e){var t=e.shapeInfo.logicalShape;switch(t...
function getInputSamplingSnippet (line 1) | function getInputSamplingSnippet(e,t,r){var n=getSamplerFlat(e);return n...
function getOutputSamplingSnippet (line 1) | function getOutputSamplingSnippet(e,t){switch(e.length){case 0:return"\n...
function getOutputScalarCoords (line 1) | function getOutputScalarCoords(){return"\n int getOutputCoords() {\n ...
function getOutput1DCoords (line 1) | function getOutput1DCoords(e,t){return 1===t[0]?"\n int getOutputCo...
function getOutput3DCoords (line 1) | function getOutput3DCoords(e,t){var r=e[1]*e[2],n=e[2];return"\n ivec...
function getOutput4DCoords (line 1) | function getOutput4DCoords(e,t){var r=e[3],n=e[2]*r,a=e[1]*n;return"\n ...
function getOutput5DCoords (line 1) | function getOutput5DCoords(e,t){var r=e[4],n=e[3]*r,a=e[2]*n,o=e[1]*a;re...
function getOutput2DCoords (line 1) | function getOutput2DCoords(e,t){return arraysEqual(e,t)?"\n ivec2 g...
function getSamplerScalar (line 1) | function getSamplerScalar(e){var t=e.name;return"\n float "+("get"+t....
function getSampler1D (line 1) | function getSampler1D(e){var t=e.name,r="get"+t.charAt(0).toUpperCase()+...
function getSampler2D (line 1) | function getSampler2D(e){var t=e.shapeInfo.logicalShape,r=e.shapeInfo.te...
function getSampler3D (line 1) | function getSampler3D(e){var t=e.shapeInfo.texShape,r=e.shapeInfo.logica...
function getSampler4D (line 1) | function getSampler4D(e){var t=e.shapeInfo.logicalShape,r=e.shapeInfo.te...
function getSampler5D (line 1) | function getSampler5D(e){var t=e.shapeInfo.logicalShape,r=e.shapeInfo.te...
function getSamplerFlat (line 1) | function getSamplerFlat(e){var t=e.name,r=e.shapeInfo.texShape,n="get"+t...
function getBroadcastOutputCoordsSampler (line 1) | function getBroadcastOutputCoordsSampler(e,t,r,n){var a=e.shapeInfo.logi...
function getSamplerAtOutputCoords (line 1) | function getSamplerAtOutputCoords(e,t,r){var n=e.shapeInfo.texShape,a=e....
function getCoordsDataType (line 1) | function getCoordsDataType(e){if(e<=1)return"int";if(2===e)return"ivec2"...
function squeezeInputInfo (line 1) | function squeezeInputInfo(e,t){var r=JSON.parse(JSON.stringify(e));retur...
function getSqueezedParams (line 1) | function getSqueezedParams(e,t){return t.map(function(t){return e[t]}).j...
function getCoords (line 1) | function getCoords(e,t){if(1===e)return""+t;if(2===e)return t+".x, "+t+"...
function getFinalCoord (line 1) | function getFinalCoord(e,t){if(1===e)return""+t;if(2===e)return t+".y";i...
function getSourceCoords (line 1) | function getSourceCoords(e,t){var r=e.length;if(r>4)throw Error("Gather ...
function createWebGLRenderingContext (line 1) | function createWebGLRenderingContext(e){var t=document.createElement("ca...
function createWebGLRenderingContextFromCanvas (line 1) | function createWebGLRenderingContextFromCanvas(e,t){var r,n=ENV.get("WEB...
function callAndCheck (line 1) | function callAndCheck(e,t){var r=t();return checkWebGLError(e),r}
function enableDebugWebGLErrorChecking (line 1) | function enableDebugWebGLErrorChecking(e){webGLDebugErrorCheckingEnabled=e}
function checkWebGLError (line 1) | function checkWebGLError(e){if(webGLDebugErrorCheckingEnabled){var t=e.g...
function getWebGLErrorMessage (line 1) | function getWebGLErrorMessage(e,t){switch(t){case e.NO_ERROR:return"NO_E...
function getExtensionOrThrow (line 1) | function getExtensionOrThrow(e,t){return throwIfNull(e,function(){return...
function createVertexShader (line 1) | function createVertexShader(e,t){var r=throwIfNull(e,function(){return e...
function createFragmentShader (line 1) | function createFragmentShader(e,t){var r=throwIfNull(e,function(){return...
function logShaderSourceAndInfoLog (line 1) | function logShaderSourceAndInfoLog(e,t){var r=lineNumberRegex.exec(t);if...
function createProgram (line 1) | function createProgram(e){return throwIfNull(e,function(){return e.creat...
function linkProgram (line 1) | function linkProgram(e,t){if(callAndCheck(e,function(){return e.linkProg...
function validateProgram (line 1) | function validateProgram(e,t){if(callAndCheck(e,function(){return e.vali...
function createStaticVertexBuffer (line 1) | function createStaticVertexBuffer(e,t){var r=throwIfNull(e,function(){re...
function createStaticIndexBuffer (line 1) | function createStaticIndexBuffer(e,t){var r=throwIfNull(e,function(){ret...
function queryMaxTextureSize (line 1) | function queryMaxTextureSize(e){return null!=MAX_TEXTURE_SIZE?MAX_TEXTUR...
function getChannelsPerTexture (line 1) | function getChannelsPerTexture(){return ENV.get("WEBGL_FLOAT_TEXTURE_ENA...
function createTexture (line 1) | function createTexture(e){return throwIfNull(e,function(){return e.creat...
function validateTextureSize (line 1) | function validateTextureSize(e,t,r){var n=queryMaxTextureSize(e);if(t<=0...
function createFramebuffer (line 1) | function createFramebuffer(e){return throwIfNull(e,function(){return e.c...
function bindVertexBufferToProgramAttribute (line 1) | function bindVertexBufferToProgramAttribute(e,t,r,n,a,o,i){var s=e.getAt...
function bindTextureUnit (line 1) | function bindTextureUnit(e,t,r){validateTextureUnit(e,r),callAndCheck(e,...
function unbindTextureUnit (line 1) | function unbindTextureUnit(e,t){validateTextureUnit(e,t),callAndCheck(e,...
function getProgramUniformLocationOrThrow (line 1) | function getProgramUniformLocationOrThrow(e,t,r){return throwIfNull(e,fu...
function getProgramUniformLocation (line 1) | function getProgramUniformLocation(e,t,r){return e.getUniformLocation(t,r)}
function bindTextureToProgramUniformSampler (line 1) | function bindTextureToProgramUniformSampler(e,t,r,n,a){callAndCheck(e,fu...
function bindCanvasToFramebuffer (line 1) | function bindCanvasToFramebuffer(e){callAndCheck(e,function(){return e.b...
function bindColorTextureToFramebuffer (line 1) | function bindColorTextureToFramebuffer(e,t,r){callAndCheck(e,function(){...
function unbindColorTextureFromFramebuffer (line 1) | function unbindColorTextureFromFramebuffer(e,t){callAndCheck(e,function(...
function validateFramebuffer (line 1) | function validateFramebuffer(e){var t=e.checkFramebufferStatus(e.FRAMEBU...
function getFramebufferErrorMessage (line 1) | function getFramebufferErrorMessage(e,t){switch(t){case e.FRAMEBUFFER_IN...
function throwIfNull (line 1) | function throwIfNull(e,t,r){var n=callAndCheck(e,function(){return t()})...
function validateTextureUnit (line 1) | function validateTextureUnit(e,t){var r=e.MAX_COMBINED_TEXTURE_IMAGE_UNI...
function getTextureShapeFromLogicalShape (line 1) | function getTextureShapeFromLogicalShape(e,t){2!==t.length&&(t=squeezeSh...
function getWebGLContextAttributes (line 1) | function getWebGLContextAttributes(){return{alpha:!1,antialias:!1,premul...
function createWebGLContext (line 1) | function createWebGLContext(e){var t,r=getWebGLContextAttributes();retur...
function createVertexShader$1 (line 1) | function createVertexShader$1(e){return createVertexShader(e,"\n prec...
function createVertexBuffer (line 1) | function createVertexBuffer(e){return createStaticVertexBuffer(e,new Flo...
function createIndexBuffer (line 1) | function createIndexBuffer(e){return createStaticIndexBuffer(e,new Uint1...
function getTextureInternalFormat (line 1) | function getTextureInternalFormat(e,t){return ENV.get("WEBGL_FLOAT_TEXTU...
function getTextureFormat (line 1) | function getTextureFormat(e,t){return ENV.get("WEBGL_FLOAT_TEXTURE_ENABL...
function getTextureType (line 1) | function getTextureType(e){return ENV.get("WEBGL_FLOAT_TEXTURE_ENABLED")...
function createAndConfigureTexture (line 1) | function createAndConfigureTexture(e,t,r,n){validateTextureSize(e,t,r);v...
function createMatrixTexture (line 1) | function createMatrixTexture(e,t,r){var n=getUnpackedMatrixTextureShapeW...
function createColorMatrixTexture (line 1) | function createColorMatrixTexture(e,t,r){var n=getColorMatrixTextureShap...
function createPackedMatrixTexture (line 1) | function createPackedMatrixTexture(e,t,r){var n=getPackedMatrixTextureSh...
function bindVertexProgramAttributeStreams (line 1) | function bindVertexProgramAttributeStreams(e,t,r){return callAndCheck(e,...
function uploadPixelDataToTexture (line 1) | function uploadPixelDataToTexture(e,t,r){callAndCheck(e,function(){retur...
function uploadDataToTexture (line 1) | function uploadDataToTexture(e,t,r,n,a,o){var i=getTextureFormat(e,o);va...
function uploadMatrixToTexture (line 1) | function uploadMatrixToTexture(e,t,r,n,a,o){var i,s=getUnpackedMatrixTex...
function uploadMatrixToPackedTexture (line 1) | function uploadMatrixToPackedTexture(e,t,r,n,a){var o=getPackedMatrixTex...
function getDownloadTargetArrayBuffer (line 1) | function getDownloadTargetArrayBuffer(e,t,r){var n=ENV.get("WEBGL_FLOAT_...
function decodeDownloadTargetArrayBuffer (line 1) | function decodeDownloadTargetArrayBuffer(e,t,r,n){if(ENV.get("WEBGL_FLOA...
function downloadMatrixFromOutputTextureAsync (line 1) | function downloadMatrixFromOutputTextureAsync(e,t,r,n){return __awaiter$...
function downloadMatrixFromOutputTexture (line 1) | function downloadMatrixFromOutputTexture(e,t,r){var n=getUnpackedMatrixT...
function downloadMatrixFromRGBAColorTexture (line 1) | function downloadMatrixFromRGBAColorTexture(e,t,r,n){var a=t*r*4,o=new U...
function downloadMatrixFromPackedOutputTexture (line 1) | function downloadMatrixFromPackedOutputTexture(e,t,r){var n=getPackedMat...
function binSearchLastTrue (line 1) | function binSearchLastTrue(e){for(var t=0,r=e.length-1,n=-1;t<=r;){var a...
function shouldUploadNaNUniform (line 1) | function shouldUploadNaNUniform(){return!ENV.get("WEBGL_FLOAT_TEXTURE_EN...
function compileProgram (line 1) | function compileProgram(e,t,r,n){for(var a=t.userCode,o=r.map(function(e...
function validateBinaryAndProgram (line 1) | function validateBinaryAndProgram(e,t){if(e.length!==t.length)throw Erro...
function runProgram (line 1) | function runProgram(e,t,r,n){validateBinaryAndProgram(e.inShapeInfos,t),...
function makeShaderKey (line 1) | function makeShaderKey(e,t,r){var n="";t.concat(r).forEach(function(e){n...
function getCoords$1 (line 1) | function getCoords$1(e){if(1===e)return"sourceLoc";if(2===e)return"sourc...
function getKeyFromTextureShape (line 1) | function getKeyFromTextureShape(e,t){return e[0]+"_"+e[1]+"_"+t}
function getSourceCoords$1 (line 1) | function getSourceCoords$1(e){var t=e.length;if(t>5)throw Error("Tile fo...
function getSwitchedCoords (line 1) | function getSwitchedCoords(e){var t=e.length;if(t>5)throw Error("Transpo...
function STEP (line 1) | function STEP(e){return void 0===e&&(e=0),CHECK_NAN_SNIPPET$1+"\n ret...
function float32ToTypedArray (line 1) | function float32ToTypedArray(e,t){if("float32"===t)return e;if("int32"==...
function typedArrayToFloat32 (line 1) | function typedArrayToFloat32(e,t){return e instanceof Float32Array?e:new...
function encodeWeights (line 1) | function encodeWeights(e){return __awaiter$7(this,void 0,void 0,function...
function decodeWeights (line 1) | function decodeWeights(e,t){for(var r={},n=0,a=0,o=t;a<o.length;a++){var...
function concatenateTypedArrays (line 1) | function concatenateTypedArrays(e){if(null===e)throw new Error("Invalid ...
function stringByteLength (line 1) | function stringByteLength(e){return new Blob([e]).size}
function arrayBufferToBase64String (line 1) | function arrayBufferToBase64String(e){return btoa(String.fromCharCode.ap...
function base64StringToArrayBuffer (line 1) | function base64StringToArrayBuffer(e){for(var t=atob(e),r=new Uint8Array...
function concatenateArrayBuffers (line 1) | function concatenateArrayBuffers(e){var t=0;e.forEach(function(e){t+=e.b...
function basename (line 1) | function basename(e){for(e=e.trim();e.endsWith("/");)e=e.slice(0,e.lengt...
function getModelArtifactsInfoForJSON (line 1) | function getModelArtifactsInfoForJSON(e){if(e.modelTopology instanceof A...
function parseURL (line 1) | function parseURL(e){if(-1===e.indexOf(URL_SCHEME_SUFFIX))throw new Erro...
function cloneModelInternal (line 1) | function cloneModelInternal(e,t,r){return void 0===r&&(r=!1),__awaiter$8...
function getIndexedDBFactory (line 1) | function getIndexedDBFactory(){if(!ENV.get("IS_BROWSER"))throw new Error...
function setUpDatabase (line 1) | function setUpDatabase(e){var t=e.result;t.createObjectStore(MODEL_STORE...
function browserIndexedDB (line 1) | function browserIndexedDB(e){return new BrowserIndexedDB(e)}
function maybeStripScheme (line 1) | function maybeStripScheme(e){return e.startsWith(BrowserIndexedDB.URL_SC...
function getModelKeys (line 1) | function getModelKeys(e){return{info:[PATH_PREFIX,e,INFO_SUFFIX].join(PA...
function getModelPathFromKey (line 1) | function getModelPathFromKey(e){var t=e.split(PATH_SEPARATOR);if(t.lengt...
function maybeStripScheme$1 (line 1) | function maybeStripScheme$1(e){return e.startsWith(BrowserLocalStorage.U...
function browserLocalStorage (line 1) | function browserLocalStorage(e){return new BrowserLocalStorage(e)}
function browserDownloads (line 1) | function browserDownloads(e){return void 0===e&&(e="model"),new BrowserD...
function browserFiles (line 1) | function browserFiles(e){return new BrowserFiles(e)}
function loadWeightsAsArrayBuffer (line 1) | function loadWeightsAsArrayBuffer(e,t){return __awaiter$12(this,void 0,v...
function loadWeights (line 1) | function loadWeights(e,t,r,n){return void 0===t&&(t=""),__awaiter$12(thi...
function browserHTTPRequest (line 1) | function browserHTTPRequest(e,t){return new BrowserHTTPRequest(e,t)}
function expectArraysClose (line 1) | function expectArraysClose(e,t,r){if(void 0===r&&(r=TEST_EPSILON),e inst...
function expectPromiseToFail (line 1) | function expectPromiseToFail(e,t){e().then(function(){return t.fail()},f...
function expectArraysEqual (line 1) | function expectArraysEqual(e,t){return expectArraysClose(e,t,0)}
function expectNumbersClose (line 1) | function expectNumbersClose(e,t,r){if(void 0===r&&(r=TEST_EPSILON),!areC...
function areClose (line 1) | function areClose(e,t,r){return!(!isNaN(e)||!isNaN(t))||!(isNaN(e)||isNa...
function expectValuesInRange (line 1) | function expectValuesInRange(e,t,r){var n;n=e instanceof Tensor?e.dataSy...
function pyListRepeat (line 1) | function pyListRepeat(e,t){if(Array.isArray(e)){for(var r=[],n=0;n<t;n++...
function assert$1 (line 1) | function assert$1(e,t){if(!e)throw new AssertionError(t)}
function count (line 1) | function count(e,t){for(var r=0,n=0,a=e;n<a.length;n++)a[n]===t&&r++;ret...
function singletonOrArray (line 1) | function singletonOrArray(e){return 1===e.length?e[0]:e}
function toList (line 1) | function toList(e){return Array.isArray(e)?e:[e]}
function isArrayOfShapes (line 1) | function isArrayOfShapes(e){return Array.isArray(e)&&Array.isArray(e[0])}
function normalizeShapeList (line 1) | function normalizeShapeList(e){return 0===e.length?[]:Array.isArray(e[0]...
function toSnakeCase (line 1) | function toSnakeCase(e){var t=e.replace(/(.)([A-Z][a-z0-9]+)/g,"$1_$2")....
function toCamelCase (line 1) | function toCamelCase(e){return e.length<=1?e:-1===e.indexOf("_")?e:e.rep...
function serializeKerasObject (line 1) | function serializeKerasObject(e){return null===e||void 0===e?null:{class...
function deserializeKerasObject (line 1) | function deserializeKerasObject(e,t,r,n){if(void 0===t&&(t={}),void 0===...
function getExactlyOneTensor (line 1) | function getExactlyOneTensor(e){var t;if(Array.isArray(e)){if(1!==e.leng...
function getExactlyOneShape (line 1) | function getExactlyOneShape(e){if(Array.isArray(e)&&Array.isArray(e[0]))...
function numberCompare (line 1) | function numberCompare(e,t){return e<t?-1:e>t?1:0}
function reverseNumberCompare (line 1) | function reverseNumberCompare(e,t){return-1*numberCompare(e,t)}
function stringToDType (line 1) | function stringToDType(e){switch(e){case"float32":return"float32";defaul...
function unique (line 1) | function unique(e){if(null==e)return e;for(var t=[],r=0,n=e;r<n.length;r...
function isObjectEmpty (line 1) | function isObjectEmpty(e){if(null==e)throw new ValueError("Invalid value...
function checkStringTypeUnionValue (line 1) | function checkStringTypeUnionValue(e,t,r){if(null!=r&&e.indexOf(r)<0)thr...
function checkDataFormat (line 1) | function checkDataFormat(e){checkStringTypeUnionValue(VALID_DATA_FORMAT_...
function checkPaddingMode (line 1) | function checkPaddingMode(e){checkStringTypeUnionValue(VALID_PADDING_MOD...
function checkPoolMode (line 1) | function checkPoolMode(e){checkStringTypeUnionValue(VALID_POOL_MODE_VALU...
function nameScope (line 1) | function nameScope(e,t){_nameScopeStack.push(e);try{var r=t();return _na...
function currentNameScopePrefix (line 1) | function currentNameScopePrefix(){return 0===_nameScopeStack.length?"":_...
function getScopedTensorName (line 1) | function getScopedTensorName(e){if(!isValidTensorName(e))throw new Error...
function getUniqueTensorName (line 1) | function getUniqueTensorName(e){if(!isValidTensorName(e))throw new Error...
function isValidTensorName (line 1) | function isValidTensorName(e){return!!e.match(tensorNameRegex)}
function isInteger (line 1) | function isInteger(e){return e===parseInt(e.toString(),10)}
function arrayProd (line 1) | function arrayProd(e,t,r){null==t&&(t=0),null==r&&(r=e.length);for(var n...
function toArray1D (line 1) | function toArray1D(e){return e=Array.isArray(e)?new Float32Array(e):e,te...
function min$1 (line 1) | function min$1(e){return min(toArray1D(e)).dataSync()[0]}
function max$1 (line 1) | function max$1(e){return max(toArray1D(e)).dataSync()[0]}
function range$1 (line 1) | function range$1(e,t){if(t<e)throw new ValueError("end ("+t+") < begin (...
function getNextUniqueTensorId (line 1) | function getNextUniqueTensorId(){return _nextUniqueTensorId++}
function checkShapesMatch (line 1) | function checkShapesMatch(e,t){if(e.shape.toString()!==t.shape.toString(...
function batchGetValue (line 1) | function batchGetValue(e){return e.map(function(e){return e.read()})}
function batchSetValue (line 1) | function batchSetValue(e){e.map(function(e){e[0].write(e[1])})}
function epsilon (line 1) | function epsilon(){return _epsilon}
function imageDataFormat (line 1) | function imageDataFormat(){return"channelsLast"}
function getScalar (line 1) | function getScalar(e,t){return void 0===t&&(t=DEFAULT_DTYPE),null==scala...
function shape (line 1) | function shape(e){return e.shape}
function intShape (line 1) | function intShape(e){return e.shape}
function dtype (line 1) | function dtype(e){return e instanceof Tensor?DEFAULT_DTYPE:e.dtype}
function cast$1 (line 1) | function cast$1(e,t){return e.asType(t)}
function expandDims$1 (line 1) | function expandDims$1(e,t){void 0===t&&(t=-1);var r=shape(e).slice();ret...
function repeat (line 1) | function repeat(e,t){return tidy(function(){if(2!==e.shape.length)throw ...
function flatten$1 (line 1) | function flatten$1(e){var t=[arrayProd(e.shape)];return e.reshape(t)}
function batchFlatten (line 1) | function batchFlatten(e){if(e.rank<=1)throw new ValueError("batchFlatten...
function sliceAlongFirstAxis (line 1) | function sliceAlongFirstAxis(e,t,r){return tidy(function(){switch(e.rank...
function sliceAlongLastAxis (line 1) | function sliceAlongLastAxis(e,t,r){return tidy(function(){switch(e.rank)...
function sliceAlongAxis (line 1) | function sliceAlongAxis(e,t,r,n){return tidy(function(){switch(e.rank){c...
function concatenate (line 1) | function concatenate(e,t){void 0===t&&(t=-1);var r;return t<0&&(t=0!==(r...
function concatAlongFirstAxis (line 1) | function concatAlongFirstAxis(e,t){switch(e.rank){case 1:return concat1d...
function tile$1 (line 1) | function tile$1(e,t){if(Array.isArray(t)||(t=[t]),e.rank!==t.length)thro...
function identity (line 1) | function identity(e){return e.clone()}
function scalarTimesArray (line 1) | function scalarTimesArray(e,t){return mul(e,t)}
function scalarPlusArray (line 1) | function scalarPlusArray(e,t){return add(e,t)}
function randomNormal$1 (line 1) | function randomNormal$1(e,t,r,n,a){return void 0===t&&(t=0),void 0===r&&...
function dot$1 (line 1) | function dot$1(e,t){if(2!==t.rank)throw new NotImplementedError("dot sup...
function gather$1 (line 1) | function gather$1(e,t,r){return tidy(function(){return t=Array.isArray(t...
function square$1 (line 1) | function square$1(e){return mulStrict(e,e)}
function biasAdd (line 1) | function biasAdd(e,t,r){return tidy(function(){if(null==r&&(r=imageDataF...
function elu$1 (line 1) | function elu$1(e,t){if(void 0===t&&(t=1),1!==t)throw new NotImplementedE...
function softsign (line 1) | function softsign(e){return tidy(function(){return div(e,add(getScalar(1...
function dropout (line 1) | function dropout(e,t,r,n){return tidy(function(){if(null!=r&&!arraysEqua...
function nameScope$1 (line 1) | function nameScope$1(e,t){return nameScope(e,t)}
function floatx (line 1) | function floatx(){return"float32"}
function getUid (line 1) | function getUid(e){return void 0===e&&(e=""),e in _uidPrefixes||(_uidPre...
function hardSigmoid (line 1) | function hardSigmoid(e){return tidy(function(){var t=scalarPlusArray(get...
function inTrainPhase (line 1) | function inTrainPhase(e,t,r){return void 0===r&&(r=!1),r?e():t()}
function calcL2Norms (line 1) | function calcL2Norms(e,t){return tidy(function(){return sqrt(sum(square$...
function serializeConstraint (line 1) | function serializeConstraint(e){return serializeKerasObject(e)}
function deserializeConstraint (line 1) | function deserializeConstraint(e,t){return void 0===t&&(t={}),deserializ...
function getConstraint (line 1) | function getConstraint(e){return null==e?null:"string"==typeof e?deseria...
function deserialize (line 1) | function deserialize(e,t){return void 0===t&&(t={}),deserializeKerasObje...
function isArrayItemInputOrOutputName (line 1) | function isArrayItemInputOrOutputName(e,t,r){return("inboundNodes"===e||...
function convertPythonicToTs (line 1) | function convertPythonicToTs(e,t){if(null===e)return null;if("string"==t...
function convertTsToPythonic (line 1) | function convertTsToPythonic(e,t){if(null===e||void 0===e)return null;if...
function collectInputShape (line 1) | function collectInputShape(e){for(var t=[],r=0,n=e=toList(e);r<n.length;...
function guessOutputDType (line 1) | function guessOutputDType(e){return"float32"}
function Input (line 1) | function Input(e){if(null==e.batchShape&&null==e.shape)throw new Error("...
function getSourceInputs (line 1) | function getSourceInputs(e,t,r){if((null==t||null!=r&&r>0)&&(t=e.sourceL...
function loadTensor (line 1) | function loadTensor(e,t,r){var n=stringToDType(e);return Tensor.make(t,{...
function preprocessWeightsForLoading (line 1) | function preprocessWeightsForLoading(e,t,r,n){if(!r.startsWith("2."))thr...
function loadWeightsFromNamedTensorMap (line 1) | function loadWeightsFromNamedTensorMap(e,t){for(var r={},n=0,a=0,o=t;a<o...
function loadWeightsFromJson (line 1) | function loadWeightsFromJson(e,t,r){void 0===r&&(r=!1);for(var n=e.keras...
function resolveScalarsInLogs (line 1) | function resolveScalarsInLogs(e){return __awaiter$14(this,void 0,void 0,...
function disposeTensorsInLogs (line 1) | function disposeTensorsInLogs(e){if(null!=e)for(var t in e){var r=e[t];"...
function standardizeCallbacks (line 1) | function standardizeCallbacks(e){return null==e?null:e instanceof Callba...
function l2Normalize (line 1) | function l2Normalize(e,t){return tidy(function(){var r=sum(square$1(e),t...
function meanSquaredError (line 1) | function meanSquaredError(e,t){return tidy(function(){return mean(square...
function meanAbsoluteError (line 1) | function meanAbsoluteError(e,t){return tidy(function(){return mean(abs(s...
function meanAbsolutePercentageError (line 1) | function meanAbsolutePercentageError(e,t){return tidy(function(){var r=s...
function meanSquaredLogarithmicError (line 1) | function meanSquaredLogarithmicError(e,t){return tidy(function(){var r=g...
function squaredHinge (line 1) | function squaredHinge(e,t){return tidy(function(){var r=getScalar(0),n=g...
function hinge (line 1) | function hinge(e,t){return tidy(function(){var r=getScalar(0),n=getScala...
function categoricalHinge (line 1) | function categoricalHinge(e,t){return tidy(function(){var r=getScalar(0)...
function logcosh (line 1) | function logcosh(e,t){return tidy(function(){var r=getScalar(Math.log(2)...
function categoricalCrossentropy (line 1) | function categoricalCrossentropy(e,t,r){return void 0===r&&(r=!1),tidy(f...
function sparseCategoricalCrossentropy (line 1) | function sparseCategoricalCrossentropy(e,t,r){return void 0===r&&(r=!1),...
function sigmoidCrossEntropyWithLogits (line 1) | function sigmoidCrossEntropyWithLogits(e,t){return tidy(function(){var r...
function binaryCrossentropy (line 1) | function binaryCrossentropy(e,t){return tidy(function(){var r;return r=c...
function kullbackLeiblerDivergence (line 1) | function kullbackLeiblerDivergence(e,t){return tidy(function(){var r=cli...
function poisson (line 1) | function poisson(e,t){return tidy(function(){var r=log(scalarPlusArray(g...
function cosineProximity (line 1) | function cosineProximity(e,t){return tidy(function(){var r=l2Normalize(e...
function get (line 1) | function get(e){var t={meanSquaredError:meanSquaredError,meanAbsoluteErr...
function binaryAccuracy (line 1) | function binaryAccuracy(e,t){return tidy(function(){var r=scalarTimesArr...
function categoricalAccuracy (line 1) | function categoricalAccuracy(e,t){return tidy(function(){return cast$1(e...
function binaryCrossentropy$1 (line 1) | function binaryCrossentropy$1(e,t){return binaryCrossentropy(e,t)}
function sparseCategoricalAccuracy (line 1) | function sparseCategoricalAccuracy(e,t){throw new NotImplementedError}
function get$1 (line 1) | function get$1(e){var t={binaryAccuracy:binaryAccuracy,categoricalAccura...
function getOptimizer (line 1) | function getOptimizer(e){var t={Adagrad:function(){return train.adagrad(...
function assertFeedCompatibility (line 1) | function assertFeedCompatibility(e,t){if(null!=e.dtype&&e.dtype!==t.dtyp...
function execute (line 1) | function execute(e,t,r){for(var n=Array.isArray(e),a=n?e:[e],o=[],i=new ...
function executeInternal (line 1) | function executeInternal(e,t,r){if(t.hasKey(e))return t.getValue(e);if(e...
function getNodeOutputs (line 1) | function getNodeOutputs(e){var t;if(1===e.sourceLayer.inboundNodes.lengt...
function isDataTensor (line 1) | function isDataTensor(e){return e instanceof Tensor}
function isDataArray (line 1) | function isDataArray(e){return Array.isArray(e)}
function isDataDict (line 1) | function isDataDict(e){return!isDataTensor(e)&&!isDataArray(e)}
function standardizeInputData (line 1) | function standardizeInputData(e,t,r,n,a){if(void 0===n&&(n=!0),void 0===...
function checkArrayLengths (line 1) | function checkArrayLengths(e,t,r){var n=unique(e.map(function(e){return ...
function checkLossAndTargetCompatibility (line 1) | function checkLossAndTargetCompatibility(e,t,r){for(var n=[meanSquaredEr...
function makeBatches (line 1) | function makeBatches(e,t){for(var r=[],n=0,a=null;n<e;)(a=n+t)>=e&&(a=e)...
function sliceArrays (line 1) | function sliceArrays(e,t,r){return null==e?[null]:Array.isArray(e)?e.map...
function sliceArraysByIndices (line 1) | function sliceArraysByIndices(e,t){return tidy(function(){return null==e...
function checkInputData (line 1) | function checkInputData(e,t,r,n,a){void 0===n&&(n=!0),void 0===a&&(a="")...
function collectMetrics (line 1) | function collectMetrics(e,t){if(null==e||Array.isArray(e)&&0===e.length)...
function checkFanMode (line 1) | function checkFanMode(e){checkStringTypeUnionValue(VALID_FAN_MODE_VALUES...
function checkDistribution (line 1) | function checkDistribution(e){checkStringTypeUnionValue(VALID_DISTRIBUTI...
function computeFans (line 1) | function computeFans(e,t){void 0===t&&(t="channelsLast");var r,n;if(chec...
function deserializeInitializer (line 1) | function deserializeInitializer(e,t){return void 0===t&&(t={}),deseriali...
function serializeInitializer (line 1) | function serializeInitializer(e){return serializeKerasObject(e)}
function getInitializer (line 1) | function getInitializer(e){if("string"==typeof e){var t=e in INITIALIZER...
function serializeActivation (line 1) | function serializeActivation(e){return e.getClassName()}
function deserializeActivation (line 1) | function deserializeActivation(e,t){return void 0===t&&(t={}),deserializ...
function getActivation (line 1) | function getActivation(e){if(null==e)return deserializeActivation(t={cla...
function l1 (line 1) | function l1(e){return new L1L2({l1:null!=e?e.l1:null,l2:0})}
function l2 (line 1) | function l2(e){return new L1L2({l2:null!=e?e.l2:null,l1:0})}
function serializeRegularizer (line 1) | function serializeRegularizer(e){return serializeKerasObject(e)}
function deserializeRegularizer (line 1) | function deserializeRegularizer(e,t){return void 0===t&&(t={}),deseriali...
function getRegularizer (line 1) | function getRegularizer(e){return null==e?null:"string"==typeof e?deseri...
function normalizeArray (line 1) | function normalizeArray(e,t,r){if("number"==typeof e)return pyListRepeat...
function convOutputLength (line 1) | function convOutputLength(e,t,r,n,a){if(void 0===a&&(a=1),null==e)return...
function deconvLength (line 1) | function deconvLength(e,t,r,n){if(null==e)return null;if("valid"===n)e=e...
function preprocessConv2DInput (line 1) | function preprocessConv2DInput(e,t){return tidy(function(){return checkD...
function conv1dWithBias (line 1) | function conv1dWithBias(e,t,r,n,a,o,i){return void 0===n&&(n=1),void 0==...
function conv2dWithBias (line 1) | function conv2dWithBias(e,t,r,n,a,o,i){return void 0===n&&(n=[1,1]),void...
function depthwiseConv2d$1 (line 1) | function depthwiseConv2d$1(e,t,r,n,a,o){return void 0===r&&(r=[1,1]),voi...
function batchNormalization$1 (line 1) | function batchNormalization$1(e,t,r,n,a,o){void 0===o&&(o=.001);var i;if...
function regularNormalizeBatchInTraining (line 1) | function regularNormalizeBatchInTraining(e,t,r,n,a){return void 0===a&&(...
function broadcastNormalizeBatchInTraining (line 1) | function broadcastNormalizeBatchInTraining(e,t,r,n,a){return void 0===a&...
function normalizeBatchInTraining (line 1) | function normalizeBatchInTraining(e,t,r,n,a){return void 0===a&&(a=.001)...
function spatial2dPadding (line 1) | function spatial2dPadding(e,t,r){return tidy(function(){if(4!==e.rank)th...
function pool2d (line 1) | function pool2d(e,t,r,n,a,o){return tidy(function(){checkDataFormat(a),c...
function rnn (line 1) | function rnn(e,t,r,n,a,o,i,s){void 0===n&&(n=!1),void 0===i&&(i=!1);var ...
function checkBidirectionalMergeMode (line 1) | function checkBidirectionalMergeMode(e){checkStringTypeUnionValue(VALID_...
function loadModelInternal (line 1) | function loadModelInternal(e){return __awaiter$16(this,void 0,void 0,fun...
function loadModelFromIOHandler (line 1) | function loadModelFromIOHandler(e,t){return __awaiter$16(this,void 0,voi...
function hasOwnProperty (line 1) | function hasOwnProperty(e,t){return Object.prototype.hasOwnProperty.call...
function Url (line 1) | function Url(){this.protocol=null,this.slashes=null,this.auth=null,this....
function urlParse (line 1) | function urlParse(e,t,r){if(e&&util$1.isObject(e)&&e instanceof Url)retu...
function urlFormat (line 1) | function urlFormat(e){return util$1.isString(e)&&(e=urlParse(e)),e insta...
function asPromise (line 1) | function asPromise(e,t){for(var r=new Array(arguments.length-1),n=0,a=2,...
function EventEmitter (line 1) | function EventEmitter(){this._listeners={}}
function factory (line 1) | function factory(e){return"undefined"!=typeof Float32Array?function(){fu...
function writeUintLE (line 1) | function writeUintLE(e,t,r){t[r]=255&e,t[r+1]=e>>>8&255,t[r+2]=e>>>16&25...
function writeUintBE (line 1) | function writeUintBE(e,t,r){t[r]=e>>>24,t[r+1]=e>>>16&255,t[r+2]=e>>>8&2...
function readUintLE (line 1) | function readUintLE(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0}
function readUintBE (line 1) | function readUintBE(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}
function inquire (line 1) | function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))...
function pool (line 1) | function pool(e,t,r){var n=r||8192,a=n>>>1,o=null,i=n;return function(r)...
function LongBits (line 1) | function LongBits(e,t){this.lo=e>>>0,this.hi=t>>>0}
function Op (line 1) | function Op(e,t,r){this.fn=e,this.len=t,this.next=void 0,this.val=r}
function noop (line 1) | function noop(){}
function State (line 1) | function State(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this....
function Writer (line 1) | function Writer(){this.len=0,this.head=new Op(noop,0,0),this.tail=this.h...
function writeByte (line 1) | function writeByte(e,t,r){t[r]=255&e}
function writeVarint32 (line 1) | function writeVarint32(e,t,r){for(;e>127;)t[r++]=127&e|128,e>>>=7;t[r]=e}
function VarintOp (line 1) | function VarintOp(e,t){this.len=e,this.next=void 0,this.val=t}
function writeVarint64 (line 1) | function writeVarint64(e,t,r){for(;e.hi;)t[r++]=127&e.lo|128,e.lo=(e.lo>...
function writeFixed32 (line 1) | function writeFixed32(e,t,r){t[r]=255&e,t[r+1]=e>>>8&255,t[r+2]=e>>>16&2...
function BufferWriter$1 (line 1) | function BufferWriter$1(){writer.call(this)}
function writeStringBuffer (line 1) | function writeStringBuffer(e,t,r){e.length<40?minimal.utf8.write(e,t,r):...
function indexOutOfRange (line 1) | function indexOutOfRange(e,t){return RangeError("index out of range: "+e...
function Reader (line 1) | function Reader(e){this.buf=e,this.pos=0,this.len=e.length}
function readLongVarint (line 1) | function readLongVarint(){var e=new LongBits$2(0,0),t=0;if(!(this.len-th...
function readFixed32_end (line 1) | function readFixed32_end(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<...
function readFixed64 (line 1) | function readFixed64(){if(this.pos+8>this.len)throw indexOutOfRange(this...
function BufferReader$1 (line 1) | function BufferReader$1(e){reader.call(this,e)}
function Service (line 1) | function Service(e,t,r){if("function"!=typeof e)throw TypeError("rpcImpl...
function getParamValue (line 1) | function getParamValue(e,t,r,n){var a=t.params[e];if(a&&void 0!==a.input...
function getTensor (line 1) | function getTensor(e,t,r){var n=parseNodeName(e),a=n[0],o=n[1],i=r.curre...
function getNodeNameAndIndex (line 1) | function getNodeNameAndIndex(e,t){var r=parseNodeName(e),n=r[0],a=r[1];r...
function getNodeNameWithContextId (line 1) | function getNodeNameWithContextId(e,t){return t?e+"-"+t:e}
function parseNodeName (line 1) | function parseNodeName(e){var t=e.lastIndexOf(":");return-1===t?[e,0]:[e...
function split$1 (line 1) | function split$1(e,t){for(var r=[],n=0;n<e.length;n+=t)r.push(e.slice(n,...
function executeOp$2 (line 1) | function executeOp$2(e,t,r){return __awaiter$17(this,void 0,void 0,funct...
function executeOp$13 (line 1) | function executeOp$13(e,t,r){switch(e.category){case"arithmetic":return ...
function loadFrozenModel (line 1) | function loadFrozenModel(e,t,r){return __awaiter$19(this,void 0,void 0,f...
function e (line 1) | function e(){}
function n (line 1) | function n(e){var t=this,r=i();t.next=function(){var e=2091639*t.s0+2.32...
function a (line 1) | function a(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}
function o (line 1) | function o(e,t){var r=new n(e),o=t&&t.state,i=r.next;return i.int32=func...
function i (line 1) | function i(){var e=4022871197;return function(t){t=t.toString();for(var ...
function n (line 1) | function n(e){var t=this,r="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){...
function a (line 1) | function a(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t}
function o (line 1) | function o(e,t){var r=new n(e),o=t&&t.state,i=function(){return(r.next()...
function n (line 1) | function n(e){var t=this,r="";t.next=function(){var e=t.x^t.x>>>2;return...
function a (line 1) | function a(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}
function o (line 1) | function o(e,t){var r=new n(e),o=t&&t.state,i=function(){return(r.next()...
function n (line 1) | function n(e){var t=this;t.next=function(){var e,r,n=t.x,a=t.i;return e=...
function a (line 1) | function a(e,t){return t.x=e.x.slice(),t.i=e.i,t}
function o (line 1) | function o(e,t){null==e&&(e=+new Date);var r=new n(e),o=t&&t.state,i=fun...
function n (line 1) | function n(e){var t=this;t.next=function(){var e,r,n=t.w,a=t.X,o=t.i;ret...
function a (line 1) | function a(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}
function o (line 1) | function o(e,t){null==e&&(e=+new Date);var r=new n(e),o=t&&t.state,i=fun...
function n (line 1) | function n(e){var t=this,r="";t.next=function(){var e=t.b,r=t.c,n=t.d,a=...
function a (line 1) | function a(e,t){return t.a=e.a,t.b=e.b,t.c=e.c,t.d=e.d,t}
function o (line 1) | function o(e,t){var r=new n(e),o=t&&t.state,i=function(){return(r.next()...
function n (line 1) | function n(e,n,c){var p=[],v=s(i((n=1==n?{entropy:!0}:n||{}).entropy?[e,...
function a (line 1) | function a(e){var t,r=e.length,n=this,a=0,o=n.i=n.j=0,i=n.S=[];for(r||(e...
function o (line 1) | function o(e,t){return t.i=e.i,t.j=e.j,t.S=e.S.slice(),t}
function i (line 1) | function i(e,t){var r,n=[],a=typeof e;if(t&&"object"==a)for(r in e)try{n...
function s (line 1) | function s(e,t){for(var r,n=e+"",a=0;a<n.length;)t[v&a]=v&(r^=19*t[v&a])...
function u (line 1) | function u(){try{var e;return c&&(e=c.randomBytes)?e=e(d):(e=new Uint8Ar...
function l (line 1) | function l(e){return String.fromCharCode.apply(0,e)}
function e (line 1) | function e(e,t,r,n,a){this.mean=e,this.stdDev=t,this.dtype=r,this.nextVa...
function e (line 1) | function e(){}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function n (line 1) | function n(){this.constructor=t}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e,t,r){if(this.dtype=t,null!=r){var n=r.length,a=sizeFromShap...
function e (line 1) | function e(e,r,n,a){this.isDisposedInternal=!1,this.size=sizeFromShape(e...
function t (line 1) | function t(t,n,a){void 0===n&&(n=!0);var o=e.call(this,t.shape,t.dtype,n...
function e (line 1) | function e(){}
function e (line 1) | function e(e,t){this.backendTimer=e,this.logger=t,null==t&&(this.logger=...
function e (line 1) | function e(){}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e,t){this.backend=e,this.safeMode=t,this.registeredVariables=...
function e (line 1) | function e(e){this.features={},this.registry={},null!=e&&(this.features=...
method Type (line 1) | get Type(){return Type}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e){this.outputTexture=null,this.program=null,this.disposed=!1...
function e (line 1) | function e(e,t,r){this.variableNames=["probs"],this.outputShape=[e,r],th...
function e (line 1) | function e(e){this.variableNames=["source"],this.outputShape=e,this.rank...
function e (line 1) | function e(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e,t){if(void 0===t&&(t=!0),this.gpgpu=e,this.delayedStorage=t...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(){this.data=new WeakMap,this.firstUse=!0,ENV.get("IS_BROWSER"...
function e (line 1) | function e(){}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(){this.saveRouters=[],this.loadRouters=[]}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(){this.managers={}}
function e (line 1) | function e(){}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e){if(this.indexedDB=getIndexedDBFactory(),null==e||!e)throw ...
function e (line 1) | function e(){this.indexedDB=getIndexedDBFactory()}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e){if(!ENV.get("IS_BROWSER")||void 0===window.localStorage)th...
function e (line 1) | function e(){assert(ENV.get("IS_BROWSER"),"Current environment is not a ...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(t){if(!ENV.get("IS_BROWSER"))throw new Error("triggerDownload...
function e (line 1) | function e(e){if(null==e||e.length<1)throw new Error("When calling brows...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e,t){if(this.DEFAULT_METHOD="POST",!ENV.get("IS_BROWSER"))thr...
function e (line 1) | function e(){}
function e (line 1) | function e(){this.classNameMap={}}
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t,r,n){void 0===n&&(n=1e-8);var a=e.call(this)||this;return a...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t,r){void 0===r&&(r=.1);var n=e.call(this)||this;return n.lea...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t,r,n,a){void 0===a&&(a=1e-8);var o=e.call(this)||this;return...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t,r,n,a,o){void 0===a&&(a=1e-8),void 0===o&&(o=0);var i=e.cal...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this)||this;return r.learningRate=t,r.setLear...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t,r,n){void 0===n&&(n=!1);var a=e.call(this,t)||this;return a...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t,r,n,a,o){void 0===r&&(r=.9),void 0===n&&(n=0),void 0===a&&(...
function e (line 1) | function e(){}
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(r){var n=e.call(this,r)||this;return Object.setPrototypeOf(n,...
function t (line 1) | function t(r){var n=e.call(this,r)||this;return Object.setPrototypeOf(n,...
function t (line 1) | function t(r){var n=e.call(this,r)||this;return Object.setPrototypeOf(n,...
function t (line 1) | function t(r){var n=e.call(this,r)||this;return Object.setPrototypeOf(n,...
function t (line 1) | function t(r){var n=e.call(this,r)||this;return Object.setPrototypeOf(n,...
function t (line 1) | function t(r){var n=e.call(this,r)||this;return Object.setPrototypeOf(n,...
function e (line 1) | function e(e,t,r,n,a,o,i){this.dtype=e,this.shape=t,this.sourceLayer=r,t...
function e (line 1) | function e(e,t,r,n,a){void 0===t&&(t="float32"),void 0===r&&(r=DEFAULT_V...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(t){var r=e.call(this)||this;return r.defaultMaxValue=2,r.defa...
function t (line 1) | function t(t){var r=e.call(this)||this;return r.defaultAxis=0,r.axis=nul...
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(t){var r=e.call(this)||this;return r.defaultMinValue=0,r.defa...
function n (line 1) | function n(){this.constructor=t}
function e (line 1) | function e(e,t){this.callArgs=t,this.id=_nextNodeID++,this.outboundLayer...
function t (line 1) | function t(t){var r=e.call(this)||this;r._callHook=null,r._addedWeightNa...
function t (line 1) | function t(t){var r=e.call(this,{dtype:t.dtype,name:null!=t.name?t.name:...
function t (line 1) | function t(r){var n=e.call(this,{})||this;if(n.containerNodes=new Set,n....
function r (line 1) | function r(e,t){e.name in a?a[e.name].push(t):a[e.name]=[t]}
function n (line 1) | function n(){this.constructor=t}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(){this.validationData=null,this.model=null}
function e (line 1) | function e(e,t){void 0===t&&(t=10),null==e&&(e=[]),this.callbacks=e,this...
function t (line 1) | function t(){return e.call(this)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(t){var r=e.call(this)||this;return r.trainBegin=t.onTrainBegi...
function e (line 1) | function e(t){if(this.id2Value={},t instanceof e)for(var r in t.id2Value...
function n (line 1) | function n(){this.constructor=t}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function t (line 1) | function t(t){return e.call(this,t)||this}
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(t){var r=e.call(this)||this;return r.value=t.value,r}
function t (line 1) | function t(t){var r=e.call(this)||this;return r.DEFAULT_MINVAL=-.05,r.DE...
function t (line 1) | function t(t){var r=e.call(this)||this;return r.DEFAULT_MEAN=0,r.DEFAULT...
function t (line 1) | function t(t){var r=e.call(this)||this;return r.DEFAULT_MEAN=0,r.DEFAULT...
function t (line 1) | function t(t){var r=e.call(this)||this;return r.gain=null!=t.gain?scalar...
function t (line 1) | function t(t){var r=e.call(this)||this;if(t.scale<0)throw new ValueError...
function t (line 1) | function t(t){return e.call(this,{scale:1,mode:"fanAvg",distribution:"un...
function t (line 1) | function t(t){return e.call(this,{scale:1,mode:"fanAvg",distribution:"no...
function t (line 1) | function t(t){return e.call(this,{scale:2,mode:"fanIn",distribution:"nor...
function t (line 1) | function t(t){return e.call(this,{scale:1,mode:"fanIn",distribution:"nor...
function t (line 1) | function t(t){var r=e.call(this)||this;if(r.DEFAULT_GAIN=1,r.gain=null==...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this,null==t?{}:t)||this;return r.DEFAULT_ALP...
function t (line 1) | function t(t){var r=e.call(this,null==t?{}:t)||this;if(r.DEFAULT_ALPHA=1...
function t (line 1) | function t(t){var r=e.call(this,null==t?{}:t)||this;return r.DEFAULT_THE...
function t (line 1) | function t(t){var r=e.call(this,null==t?{}:t)||this;return r.DEFAULT_AXI...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(t){var r=e.call(this)||this,n=null==t||null==t.l1?.01:t.l1,a=...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t,r){var n=e.call(this,r)||this;if(n.kernel=null,n.bias=null,...
function t (line 1) | function t(t){return e.call(this,2,t)||this}
function t (line 1) | function t(t){var r=e.call(this,t)||this;if(r.inputSpec=[new InputSpec({...
function t (line 1) | function t(t,r){var n=e.call(this,t,r)||this;if(n.DEFAULT_DEPTHWISE_INIT...
function t (line 1) | function t(t){return e.call(this,2,t)||this}
function t (line 1) | function t(t){var r=e.call(this,1,t)||this;return r.inputSpec=[{ndim:3}],r}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return"number"==typeof t.croppi...
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.DEFAULT_SIZE=[2,2],r.i...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.depthwiseKernel=null,r...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this,t)||this;if(r.rate=Math.max(Math.min(t.r...
function t (line 1) | function t(t){var r=e.call(this,t)||this;if(r.activation=null,r.useBias=...
function t (line 1) | function t(t){var r=e.call(this,t||{})||this;return r.inputSpec=[{minNDi...
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.supportsMasking=!0,r.a...
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.n=t.n,r.inputSpec=[{nd...
function t (line 1) | function t(t){var r=e.call(this,t)||this;r.targetShape=t.targetShape;for...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this,t)||this;if(r.embeddings=null,r.DEFAULT_...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this,t||{})||this;return r.supportsMasking=!0,r}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.DEFAULT_AXIS=-1,null==...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.supportsMasking=!0,r.a...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=this;if(null==t&&(t={}),r=e.call(this,t)||this,r.dat...
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=this;if(null==t.poolSize&&(t.poolSize=2),r=e.call(th...
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){var r=this;return null==t.poolSize&&(t.poolSize=[2,2]),r=e...
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.inputSpec=[new InputSp...
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){return e.call(this,t)||this}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.dataFormat=null==t.dat...
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r,n=e.call(this,t)||this;if(null==t.cell)throw new Val...
function n (line 1) | function n(e){return null==e||Array.isArray(e)?e:[e]}
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.DEFAULT_ACTIVATION="ta...
function t (line 1) | function t(t){return t.cell=new SimpleRNNCell(t),e.call(this,t)||this}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.DEFAULT_ACTIVATION="ta...
function t (line 1) | function t(t){return 0===t.implementation&&console.warn("`implementation...
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.DEFAULT_ACTIVATION="ta...
function t (line 1) | function t(){return null!==e&&e.apply(this,arguments)||this}
function t (line 1) | function t(t){return 0===t.implementation&&console.warn("`implementation...
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.cells=t.cells,r}
function n (line 1) | function n(){this.constructor=t}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.layer=t.layer,r}
function t (line 1) | function t(t){var r=e.call(this,t)||this;return r.supportsMasking=!0,r}
function t (line 1) | function t(t){var r=e.call(this,t)||this,n=t.layer.getConfig();if(r.forw...
function n (line 1) | function n(){this.constructor=t}
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function t (line 1) | function t(t){var r=e.call(this,{inputs:[],outputs:[]})||this;if(t=t||{}...
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function e (line 1) | function e(){}
function n (line 1) | function n(e){throw RangeError(P[e])}
function a (line 1) | function a(e,t){for(var r=e.length,n=[];r--;)n[r]=t(e[r]);return n}
function o (line 1) | function o(e,t){var r=e.split("@"),n="";return r.length>1&&(n=r[0]+"@",e...
function i (line 1) | function i(e){for(var t,r,n=[],a=0,o=e.length;a<o;)(t=e.charCodeAt(a++))...
function s (line 1) | function s(e){return a(e,function(e){var t="";return e>65535&&(t+=k((e-=...
function u (line 1) | function u(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:b}
function l (line 1) | function l(e,t){return e+22+75*(e<26)-((0!=t)<<5)}
function c (line 1) | function c(e,t,r){var n=0;for(e=r?C(e/S):e>>1,e+=C(e/t);e>R*w>>1;n+=b)e=...
function p (line 1) | function p(e){var t,r,a,o,i,l,p,d,h,f,m=[],g=e.length,y=0,_=A,S=N;for((r...
function d (line 1) | function d(e){var t,r,a,o,s,u,p,d,h,f,m,g,y,_,S,T=[];for(g=(e=i(e)).leng...
function r (line 1) | function r(e,t,r){for(var n=Object.keys(t),a=0;a<n.length;++a)void 0!==e...
function n (line 1) | function n(e){function t(e,n){if(!(this instanceof t))return new t(e,n);...
function r (line 1) | function r(){n.Reader._configure(n.BufferReader),n.util._configure()}
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(this.dim=[],e)for(var t=Object.keys(e),r=0;r<t.length;+...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(this.floatVal=[],this.doubleVal=[],this.intVal=[],this....
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(this.s=[],this.i=[],this.f=[],this.b=[],this.type=[],th...
function e (line 1) | function e(e){if(this.attr={},e)for(var t=Object.keys(e),r=0;r<t.length;...
function e (line 1) | function e(e){if(this.input=[],this.attr={},e)for(var t=Object.keys(e),r...
function e (line 1) | function e(e){if(this.badConsumers=[],e)for(var t=Object.keys(e),r=0;r<t...
function e (line 1) | function e(e){if(this.node=[],e)for(var t=Object.keys(e),r=0;r<t.length;...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(this.value=[],e)for(var t=Object.keys(e),r=0;r<t.length...
function e (line 1) | function e(e){if(this.value=[],e)for(var t=Object.keys(e),r=0;r<t.length...
function e (line 1) | function e(e){if(this.value=[],e)for(var t=Object.keys(e),r=0;r<t.length...
function e (line 1) | function e(e){if(this.value=[],e)for(var t=Object.keys(e),r=0;r<t.length...
function e (line 1) | function e(e){if(this.value=[],e)for(var t=Object.keys(e),r=0;r<t.length...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(this.inputs={},this.outputs={},e)for(var t=Object.keys(...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(this.inputArg=[],this.outputArg=[],this.attr=[],e)for(v...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(e){if(this.op=[],e)for(var t=Object.keys(e),r=0;r<t.length;++...
function e (line 1) | function e(e){if(this.collectionDef={},this.signatureDef={},this.assetFi...
function e (line 1) | function e(e){if(this.tags=[],e)for(var t=Object.keys(e),r=0;r<t.length;...
function e (line 1) | function e(e){if(this.metaGraphs=[],e)for(var t=Object.keys(e),r=0;r<t.l...
function e (line 1) | function e(e){if(this.function=[],this.gradient=[],e)for(var t=Object.ke...
function e (line 1) | function e(e){if(this.attr={},this.nodeDef=[],this.ret={},e)for(var t=Ob...
function e (line 1) | function e(e){if(e)for(var t=Object.keys(e),r=0;r<t.length;++r)null!=e[t...
function e (line 1) | function e(){var e=[arithmetic$1,basicMath,control$1,convolution$1,creat...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e){this.weightMap=e,this.rootContext={id:0,frameName:"",itera...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e){this.graph=e,this.compiledOrder=[],this._weightMap={},this...
function i (line 1) | function i(e){try{u(n.next(e))}catch(e){o(e)}}
function s (line 1) | function s(e){try{u(n.throw(e))}catch(e){o(e)}}
function u (line 1) | function u(e){e.done?a(e.value):new r(function(t){t(e.value)}).then(i,s)}
function r (line 1) | function r(e){return function(t){return n([e,t])}}
function n (line 1) | function n(r){if(a)throw new TypeError("Generator is already executing."...
function e (line 1) | function e(e,t,r){this.modelUrl=e,this.weightManifestUrl=t,this.requestO...
FILE: stock-forecasting-js/js/utils.js
function dropout_nn (line 1) | function dropout_nn(x,keep_prob){
function dropout_lstm (line 8) | function dropout_lstm(cell,a,h,c,dropout_input=1.0,dropout_output=1.0){
function sleep (line 22) | function sleep(ms) {
function async_sleep (line 25) | async function async_sleep(ms) {
function wasting_time (line 28) | function wasting_time(count){
function arange (line 33) | function arange(start, end, skip){
function tf_tolist (line 38) | async function tf_tolist(a){
function tf_str_tolist (line 43) | function tf_str_tolist(a){
function tf_slice_tolist (line 46) | function tf_slice_tolist(a){
function tf_nj_list (line 54) | function tf_nj_list(a){
function tf_nj_list_flatten (line 61) | function tf_nj_list_flatten(a){
function label_encoder (line 66) | function label_encoder(arr){
function shuffle (line 72) | function shuffle(arr1, arr2) {
function get_index (line 86) | function get_index(arr, val){
function get_elements (line 91) | function get_elements(arr, indices){
function pca (line 98) | function pca(a, n_components){
function svd (line 107) | function svd(a, n_components){
function nnmf (line 113) | function nnmf(arr, n_components){
function metrics (line 128) | function metrics(a){
function standard_scaling (line 135) | function standard_scaling(a){
function minmax_scaling (line 141) | function minmax_scaling(a){
function minmax_1d (line 145) | function minmax_1d(a){
function reverse_minmax_1d (line 152) | function reverse_minmax_1d(a, a_min, a_max){
function one_hot (line 155) | function one_hot(label_encoder){
function plot_map (line 160) | function plot_map(data, X_mean, Y_mean, arr_X, arr_Y){
function plot_graph (line 221) | function plot_graph(data,with_acc=true){
function plot_joyplot (line 260) | function plot_joyplot(x_outside,div,title,btm_gap=0.1, top_gap=0.25, gap...
function kernelDensityEstimator (line 360) | function kernelDensityEstimator(kernel, x) {
function epanechnikovKernel (line 367) | function epanechnikovKernel(bandwith) {
function histogram (line 374) | function histogram(arr,bins=30,norm=true,density=false,jitter=0.001){
function plot_regression (line 403) | function plot_regression(data){
function plot_compare_distribution (line 438) | function plot_compare_distribution(data_arr, labels, colors, div){
function simple_investor (line 514) | function simple_investor(real_signal,predicted_signal,delay,initial_mone...
Copy disabled (too large)
Download .json
Condensed preview — 114 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (15,856K chars).
[
{
"path": ".gitignore",
"chars": 42,
"preview": "*DS_Store\n*ipynb_checkpoints\n*__pycache__\n"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 12667,
"preview": "<p align=\"center\">\n <a href=\"#readme\">\n <img alt=\"logo\" width=\"50%\" src=\"output/evolution-strategy.png\">\n <"
},
{
"path": "agent/1.turtle-agent.ipynb",
"chars": 77223,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/10.duel-q-learning-agent.ipynb",
"chars": 70877,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/11.double-duel-q-learning-agent.ipynb",
"chars": 68398,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/12.duel-recurrent-q-learning-agent.ipynb",
"chars": 65026,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/13.double-duel-recurrent-q-learning-agent.ipynb",
"chars": 77782,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/14.actor-critic-agent.ipynb",
"chars": 76222,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/15.actor-critic-duel-agent.ipynb",
"chars": 76712,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/16.actor-critic-recurrent-agent.ipynb",
"chars": 74725,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/17.actor-critic-duel-recurrent-agent.ipynb",
"chars": 75697,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/18.curiosity-q-learning-agent.ipynb",
"chars": 76242,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/19.recurrent-curiosity-q-learning-agent.ipynb",
"chars": 72522,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/2.moving-average-agent.ipynb",
"chars": 76152,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/20.duel-curiosity-q-learning-agent.ipynb",
"chars": 79207,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/21.neuro-evolution-agent.ipynb",
"chars": 78717,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/22.neuro-evolution-novelty-search-agent.ipynb",
"chars": 78477,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/23.abcd-strategy-agent.ipynb",
"chars": 81560,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/3.signal-rolling-agent.ipynb",
"chars": 58437,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/4.policy-gradient-agent.ipynb",
"chars": 73168,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/5.q-learning-agent.ipynb",
"chars": 69722,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/6.evolution-strategy-agent.ipynb",
"chars": 75968,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/7.double-q-learning-agent.ipynb",
"chars": 73854,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/8.recurrent-q-learning-agent.ipynb",
"chars": 66051,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/9.double-recurrent-q-learning-agent.ipynb",
"chars": 76966,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "agent/updated-NES-google.ipynb",
"chars": 147125,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 2,\n \"metadata\": {\n \"inputHidden\": false,\n \"outpu"
},
{
"path": "dataset/AMD.csv",
"chars": 17768,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,12.930000,13.180000,12.900000,13.100000,13.100000,44388300\n2018-05-"
},
{
"path": "dataset/BTC-sentiment.csv",
"chars": 26003,
"preview": "timestamp,close,positive,negative\n2019-08-09T23:00:00,11860.074544270834,0.672895649396392,0.32710435060360804\n2019-08-0"
},
{
"path": "dataset/FB.csv",
"chars": 18937,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,182.500000,186.910004,182.179993,186.899994,186.899994,16628100\n201"
},
{
"path": "dataset/FSV.csv",
"chars": 16928,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,71.050003,71.910004,71.050003,71.620003,71.106422,13000\n2018-05-24,"
},
{
"path": "dataset/GOOG-year.csv",
"chars": 18678,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2016-11-02,778.200012,781.650024,763.450012,768.700012,768.700012,1872400\n2016"
},
{
"path": "dataset/GOOG.csv",
"chars": 1759,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2017-10-02,959.979980,962.539978,947.840027,953.270020,953.270020,1283400\n2017"
},
{
"path": "dataset/INFY.csv",
"chars": 17057,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-07-13,9.560000,9.815000,9.550000,9.710000,9.423450,27224000\n2018-07-16,9."
},
{
"path": "dataset/KNX.csv",
"chars": 17352,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-07-13,37.910000,38.630001,37.910000,37.910000,37.629288,1768500\n2018-07-1"
},
{
"path": "dataset/MONDY.csv",
"chars": 16323,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-07-13,56.889999,56.889999,56.889999,56.889999,54.963757,0\n2018-07-16,56.6"
},
{
"path": "dataset/MTDR.csv",
"chars": 17406,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,31.610001,32.000000,30.870001,31.059999,31.059999,1499700\n2018-05-2"
},
{
"path": "dataset/SINA.csv",
"chars": 17233,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,89.540001,92.650002,89.339996,90.220001,90.220001,846200\n2018-05-24"
},
{
"path": "dataset/TMUS.csv",
"chars": 17366,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-07-13,61.240002,61.810001,60.970001,61.680000,61.680000,3079300\n2018-07-1"
},
{
"path": "dataset/TSLA.csv",
"chars": 18684,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-03-23,311.250000,311.250000,300.450012,301.540009,301.540009,6654900\n2018"
},
{
"path": "dataset/TWTR.csv",
"chars": 17676,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,32.700001,33.430000,32.599998,33.419998,33.419998,13407500\n2018-05-"
},
{
"path": "dataset/eur-myr.csv",
"chars": 524,
"preview": "Historical EUR to MYR Exchange Rates,Unnamed: 1\n02-11-17,4.926\n01-11-17,4.9232\n31-10-17,4.9255\n30-10-17,4.9239\n29-10-17,"
},
{
"path": "dataset/oil.csv",
"chars": 1690,
"preview": "\"Date\",\"Price\",\"Open\",\"High\",\"Low\",\"Vol.\",\"Change %\"\n\"Nov 02, 2017\",\"54.27\",\"54.26\",\"54.39\",\"54.22\",\"0\",\"0.06\"\n\"Nov 01,"
},
{
"path": "dataset/usd-myr.csv",
"chars": 503,
"preview": "Historical USD to MYR Exchange Rates,Unnamed: 1\n02-11-17,4.226\n01-11-17,4.232\n31-10-17,4.231\n30-10-17,4.238\n29-10-17,4.2"
},
{
"path": "deep-learning/1.lstm.ipynb",
"chars": 110668,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/10.lstm-seq2seq.ipynb",
"chars": 124790,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/11.bidirectional-lstm-seq2seq.ipynb",
"chars": 142862,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/12.lstm-seq2seq-vae.ipynb",
"chars": 153591,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/13.gru-seq2seq.ipynb",
"chars": 78348,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/14.bidirectional-gru-seq2seq.ipynb",
"chars": 66024,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/15.gru-seq2seq-vae.ipynb",
"chars": 160967,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/16.attention-is-all-you-need.ipynb",
"chars": 113168,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/17.cnn-seq2seq.ipynb",
"chars": 112525,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/18.dilated-cnn-seq2seq.ipynb",
"chars": 155720,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/2.bidirectional-lstm.ipynb",
"chars": 118989,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/3.lstm-2path.ipynb",
"chars": 127676,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/4.gru.ipynb",
"chars": 122085,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/5.bidirectional-gru.ipynb",
"chars": 112063,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/6.gru-2path.ipynb",
"chars": 103698,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/7.vanilla.ipynb",
"chars": 233224,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/8.bidirectional-vanilla.ipynb",
"chars": 232674,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/9.vanilla-2path.ipynb",
"chars": 239264,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/access.py",
"chars": 12970,
"preview": "# Copyright 2017 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this "
},
{
"path": "deep-learning/addressing.py",
"chars": 16944,
"preview": "# Copyright 2017 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this "
},
{
"path": "deep-learning/autoencoder.py",
"chars": 1937,
"preview": "import tensorflow as tf\nimport numpy as np\nimport time\n\ndef reducedimension(input_, dimension = 2, learning_rate = 0.01,"
},
{
"path": "deep-learning/dnc.py",
"chars": 4969,
"preview": "# Copyright 2017 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this "
},
{
"path": "deep-learning/how-to-forecast.ipynb",
"chars": 104405,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/sentiment-consensus.ipynb",
"chars": 275794,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "deep-learning/util.py",
"chars": 1688,
"preview": "# Copyright 2017 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this "
},
{
"path": "free-agent/evolution-strategy-agent.ipynb",
"chars": 140977,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "free-agent/evolution-strategy-bayesian-agent.ipynb",
"chars": 307411,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [\n {\n \"name\":"
},
{
"path": "misc/bitcoin-analysis-lstm.ipynb",
"chars": 1033040,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "misc/fashion-forecasting.ipynb",
"chars": 271209,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "misc/fashion.csv",
"chars": 29023,
"preview": "date,Cami Dresses,Shirts,Tote Bags,Sneakers,Crop Tops,Polos,Cross Body Bags,Casual Jackets,Swimwear,Scarves,Coats,Wedges"
},
{
"path": "misc/kijang-emas-bank-negara.ipynb",
"chars": 709412,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# Welcome to Kijang Emas analysis!\\"
},
{
"path": "misc/outliers.ipynb",
"chars": 832052,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "misc/overbought-oversold.ipynb",
"chars": 131522,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "misc/sentiment-bitcoin.csv",
"chars": 33951,
"preview": ",Polarity,Sensitivity,Tweet_vol,Open,High,Low,Volume_BTC,Volume_Dollar,Close_Price\n2018-07-11 20:00:00,0.102656707486145"
},
{
"path": "misc/tesla-study.ipynb",
"chars": 2037544,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 2,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "misc/which-stock.ipynb",
"chars": 49679,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "realtime-agent/AMD.csv",
"chars": 17768,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,12.930000,13.180000,12.900000,13.100000,13.100000,44388300\n2018-05-"
},
{
"path": "realtime-agent/CPRT.csv",
"chars": 17372,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,52.970001,53.200001,52.560001,52.959999,52.959999,2586900\n2018-05-2"
},
{
"path": "realtime-agent/FB.csv",
"chars": 18937,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,182.500000,186.910004,182.179993,186.899994,186.899994,16628100\n201"
},
{
"path": "realtime-agent/FSV.csv",
"chars": 16928,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,71.050003,71.910004,71.050003,71.620003,71.106422,13000\n2018-05-24,"
},
{
"path": "realtime-agent/GOOG.csv",
"chars": 19906,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,1065.130005,1080.780029,1061.709961,1079.689941,1079.689941,1030000"
},
{
"path": "realtime-agent/GWR.csv",
"chars": 17188,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,76.459999,76.970001,76.019997,76.860001,76.860001,498100\n2018-05-24"
},
{
"path": "realtime-agent/LB.csv",
"chars": 17440,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,33.910000,34.299999,33.669998,34.049999,31.822065,5031600\n2018-05-2"
},
{
"path": "realtime-agent/LYFT.csv",
"chars": 2748,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2019-03-29,87.330002,88.599998,78.019997,78.290001,78.290001,71485200\n2019-04-"
},
{
"path": "realtime-agent/MTDR.csv",
"chars": 17406,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,31.610001,32.000000,30.870001,31.059999,31.059999,1499700\n2018-05-2"
},
{
"path": "realtime-agent/README.md",
"chars": 2294,
"preview": "## How-to, this model based on [evolution-strategy](https://github.com/huseinzol05/Stock-Prediction-Models/tree/master/a"
},
{
"path": "realtime-agent/SINA.csv",
"chars": 17233,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,89.540001,92.650002,89.339996,90.220001,90.220001,846200\n2018-05-24"
},
{
"path": "realtime-agent/TSLA.csv",
"chars": 18769,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,277.760010,279.910004,274.000000,279.070007,279.070007,5953100\n2018"
},
{
"path": "realtime-agent/TWTR.csv",
"chars": 17676,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2018-05-23,32.700001,33.430000,32.599998,33.419998,33.419998,13407500\n2018-05-"
},
{
"path": "realtime-agent/app.py",
"chars": 13091,
"preview": "from flask import Flask, request, jsonify\nimport numpy as np\nimport pickle\nimport json\nfrom sklearn.preprocessing import"
},
{
"path": "realtime-agent/realtime-evolution-strategy.ipynb",
"chars": 186122,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "realtime-agent/request.ipynb",
"chars": 35654,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "simulation/monte-carlo-drift.ipynb",
"chars": 477105,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "simulation/monte-carlo-dynamic-volatility.ipynb",
"chars": 448995,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "simulation/monte-carlo-simple.ipynb",
"chars": 429771,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "simulation/multivariate-drift-monte-carlo.ipynb",
"chars": 756432,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "simulation/portfolio-optimization.ipynb",
"chars": 57653,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "stacking/autoencoder.py",
"chars": 1937,
"preview": "import tensorflow as tf\nimport numpy as np\nimport time\n\ndef reducedimension(input_, dimension = 2, learning_rate = 0.01,"
},
{
"path": "stacking/model.py",
"chars": 1190,
"preview": "import tensorflow as tf\nimport numpy as np\n\nclass Model:\n def __init__(self, learning_rate, num_layers, size, size_la"
},
{
"path": "stacking/stack-encoder-ensemble-xgb.ipynb",
"chars": 248678,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {\n \"collapsed\": true\n },\n \"outp"
},
{
"path": "stacking/stack-rnn-arima-xgb.ipynb",
"chars": 190816,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {\n \"collapsed\": true\n },\n \"outp"
},
{
"path": "stock-forecasting-js/README.md",
"chars": 1059,
"preview": "# Stock forecasting JS\n\nLSTM Model for stock forecasting and buying simulation inside Tensorflow JS, so everyone can try"
},
{
"path": "stock-forecasting-js/css/style.css",
"chars": 3312,
"preview": "\n.icon-block {\n padding: 0 15px;\n}\n\n.icon-block .material-icons {\n\tfont-size: inherit;\n}\n\n.toast{\n background-color: #"
},
{
"path": "stock-forecasting-js/data/google.js",
"chars": 19751,
"preview": "const GOOGLE = JSON.parse(JSON.stringify({\"date\": [\"2017-07-10\", \"2017-07-11\", \"2017-07-12\", \"2017-07-13\", \"2017-07-14\","
},
{
"path": "stock-forecasting-js/index.html",
"chars": 7515,
"preview": "<html>\n<head>\n <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n <link href=\"css"
},
{
"path": "stock-forecasting-js/init.js",
"chars": 38458,
"preview": "var color_list = ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83', '#ca8622', '#bda29a','#6e7074', '#546"
},
{
"path": "stock-forecasting-js/js/tf-expand.js",
"chars": 1170048,
"preview": "! function(e, t) {\n \"object\" == typeof exports && \"undefined\" != typeof module ? t(exports) : \"function\" == typeof de"
},
{
"path": "stock-forecasting-js/js/tf.js",
"chars": 700921,
"preview": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?def"
},
{
"path": "stock-forecasting-js/js/utils.js",
"chars": 17497,
"preview": "function dropout_nn(x,keep_prob){\n uniform = tf.randomUniform(x.shape)\n added = tf.add(tf.scalar(keep_prob),uniform)\n "
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the huseinzol05/Stock-Prediction-Models GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 114 files (14.9 MB), approximately 3.9M tokens, and a symbol index with 1768 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.