Upload 16 files
Browse files- .gitattributes +2 -0
- .gitignore +104 -0
- 3d/env/environment.dds +3 -0
- 3d/env/skybox_nx.jpg +0 -0
- 3d/env/skybox_ny.jpg +0 -0
- 3d/env/skybox_nz.jpg +0 -0
- 3d/env/skybox_px.jpg +0 -0
- 3d/env/skybox_py.jpg +0 -0
- 3d/env/skybox_pz.jpg +0 -0
- 3d/marbleTower.glb +3 -0
- 3d/snippet/EXUQ7M-5.json +1 -0
- 3d/snippet/UY098C-3.json +1 -0
- README.md +1 -3
- agent_sac.js +897 -0
- index.html +823 -0
- reply_buffer.js +147 -0
- worker.js +151 -0
.gitattributes
CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
3d/env/environment.dds filter=lfs diff=lfs merge=lfs -text
|
37 |
+
3d/marbleTower.glb filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Logs
|
2 |
+
logs
|
3 |
+
*.log
|
4 |
+
npm-debug.log*
|
5 |
+
yarn-debug.log*
|
6 |
+
yarn-error.log*
|
7 |
+
lerna-debug.log*
|
8 |
+
|
9 |
+
# Diagnostic reports (https://nodejs.org/api/report.html)
|
10 |
+
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
11 |
+
|
12 |
+
# Runtime data
|
13 |
+
pids
|
14 |
+
*.pid
|
15 |
+
*.seed
|
16 |
+
*.pid.lock
|
17 |
+
|
18 |
+
# Directory for instrumented libs generated by jscoverage/JSCover
|
19 |
+
lib-cov
|
20 |
+
|
21 |
+
# Coverage directory used by tools like istanbul
|
22 |
+
coverage
|
23 |
+
*.lcov
|
24 |
+
|
25 |
+
# nyc test coverage
|
26 |
+
.nyc_output
|
27 |
+
|
28 |
+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
29 |
+
.grunt
|
30 |
+
|
31 |
+
# Bower dependency directory (https://bower.io/)
|
32 |
+
bower_components
|
33 |
+
|
34 |
+
# node-waf configuration
|
35 |
+
.lock-wscript
|
36 |
+
|
37 |
+
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
38 |
+
build/Release
|
39 |
+
|
40 |
+
# Dependency directories
|
41 |
+
node_modules/
|
42 |
+
jspm_packages/
|
43 |
+
|
44 |
+
# TypeScript v1 declaration files
|
45 |
+
typings/
|
46 |
+
|
47 |
+
# TypeScript cache
|
48 |
+
*.tsbuildinfo
|
49 |
+
|
50 |
+
# Optional npm cache directory
|
51 |
+
.npm
|
52 |
+
|
53 |
+
# Optional eslint cache
|
54 |
+
.eslintcache
|
55 |
+
|
56 |
+
# Microbundle cache
|
57 |
+
.rpt2_cache/
|
58 |
+
.rts2_cache_cjs/
|
59 |
+
.rts2_cache_es/
|
60 |
+
.rts2_cache_umd/
|
61 |
+
|
62 |
+
# Optional REPL history
|
63 |
+
.node_repl_history
|
64 |
+
|
65 |
+
# Output of 'npm pack'
|
66 |
+
*.tgz
|
67 |
+
|
68 |
+
# Yarn Integrity file
|
69 |
+
.yarn-integrity
|
70 |
+
|
71 |
+
# dotenv environment variables file
|
72 |
+
.env
|
73 |
+
.env.test
|
74 |
+
|
75 |
+
# parcel-bundler cache (https://parceljs.org/)
|
76 |
+
.cache
|
77 |
+
|
78 |
+
# Next.js build output
|
79 |
+
.next
|
80 |
+
|
81 |
+
# Nuxt.js build / generate output
|
82 |
+
.nuxt
|
83 |
+
dist
|
84 |
+
|
85 |
+
# Gatsby files
|
86 |
+
.cache/
|
87 |
+
# Comment in the public line in if your project uses Gatsby and *not* Next.js
|
88 |
+
# https://nextjs.org/blog/next-9-1#public-directory-support
|
89 |
+
# public
|
90 |
+
|
91 |
+
# vuepress build output
|
92 |
+
.vuepress/dist
|
93 |
+
|
94 |
+
# Serverless directories
|
95 |
+
.serverless/
|
96 |
+
|
97 |
+
# FuseBox cache
|
98 |
+
.fusebox/
|
99 |
+
|
100 |
+
# DynamoDB Local files
|
101 |
+
.dynamodb/
|
102 |
+
|
103 |
+
# TernJS port file
|
104 |
+
.tern-port
|
3d/env/environment.dds
ADDED
Git LFS Details
|
3d/env/skybox_nx.jpg
ADDED
3d/env/skybox_ny.jpg
ADDED
3d/env/skybox_nz.jpg
ADDED
3d/env/skybox_px.jpg
ADDED
3d/env/skybox_py.jpg
ADDED
3d/env/skybox_pz.jpg
ADDED
3d/marbleTower.glb
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:5017a2c3cc0cd3a1cf57c10209ceecb49a14297e522dd567e3c60bc5ab086718
|
3 |
+
size 6422372
|
3d/snippet/EXUQ7M-5.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"id":"EXUQ7M","version":5,"snippetIdentifier":"EXUQ7M-5","jsonPayload":"{\"particleSystem\":\"{\\\"name\\\":\\\"Core Particle system\\\",\\\"id\\\":\\\"default system\\\",\\\"capacity\\\":10000,\\\"emitter\\\":[0,0,0],\\\"particleEmitterType\\\":{\\\"type\\\":\\\"PointParticleEmitter\\\",\\\"direction1\\\":[0,0,0],\\\"direction2\\\":[0,0,0]},\\\"texture\\\":{\\\"tags\\\":null,\\\"url\\\":\\\"data:octet/stream;base64,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\\\",\\\"uOffset\\\":0,\\\"vOffset\\\":0,\\\"uScale\\\":1,\\\"vScale\\\":1,\\\"uAng\\\":0,\\\"vAng\\\":0,\\\"wAng\\\":0,\\\"uRotationCenter\\\":0.5,\\\"vRotationCenter\\\":0.5,\\\"wRotationCenter\\\":0.5,\\\"isBlocking\\\":true,\\\"uniqueId\\\":51,\\\"name\\\":\\\"https://www.babylonjs.com/assets/Flare.png\\\",\\\"hasAlpha\\\":false,\\\"getAlphaFromRGB\\\":false,\\\"level\\\":2,\\\"coordinatesIndex\\\":0,\\\"coordinatesMode\\\":0,\\\"wrapU\\\":1,\\\"wrapV\\\":1,\\\"wrapR\\\":1,\\\"anisotropicFilteringLevel\\\":4,\\\"isCube\\\":false,\\\"is3D\\\":false,\\\"is2DArray\\\":false,\\\"gammaSpace\\\":true,\\\"invertZ\\\":false,\\\"lodLevelInAlpha\\\":false,\\\"lodGenerationOffset\\\":0,\\\"lodGenerationScale\\\":0,\\\"linearSpecularLOD\\\":false,\\\"isRenderTarget\\\":false,\\\"animations\\\":[],\\\"invertY\\\":true,\\\"samplingMode\\\":3},\\\"isLocal\\\":false,\\\"animations\\\":[],\\\"beginAnimationOnStart\\\":false,\\\"beginAnimationFrom\\\":0,\\\"beginAnimationTo\\\":60,\\\"beginAnimationLoop\\\":false,\\\"startDelay\\\":0,\\\"renderingGroupId\\\":0,\\\"isBillboardBased\\\":true,\\\"billboardMode\\\":7,\\\"minAngularSpeed\\\":0.1,\\\"maxAngularSpeed\\\":0.2,\\\"minSize\\\":1.2,\\\"maxSize\\\":1.4,\\\"minScaleX\\\":1,\\\"maxScaleX\\\":1,\\\"minScaleY\\\":1,\\\"maxScaleY\\\":1,\\\"minEmitPower\\\":2,\\\"maxEmitPower\\\":2,\\\"minLifeTime\\\":1,\\\"maxLifeTime\\\":1,\\\"emitRate\\\":20,\\\"gravity\\\":[0,0,0],\\\"noiseStrength\\\":[10,10,10],\\\"color1\\\":[0.07058823529411765,0.8941176470588236,0.9450980392156862,1],\\\"color2\\\":[0.07058823529411765,0.9647058823529412,0.8901960784313725,1],\\\"colorDead\\\":[0,0,0,1],\\\"updateSpeed\\\":0.05,\\\"targetStopDuration\\\":0,\\\"blendMode\\\":2,\\\"preWarmCycles\\\":0,\\\"preWarmStepOffset\\\":1,\\\"minInitialRotation\\\":0,\\\"maxInitialRotation\\\":360,\\\"startSpriteCellID\\\":0,\\\"endSpriteCellID\\\":0,\\\"spriteCellChangeSpeed\\\":1,\\\"spriteCellWidth\\\":0,\\\"spriteCellHeight\\\":0,\\\"spriteRandomStartCell\\\":false,\\\"isAnimationSheetEnabled\\\":false,\\\"sizeGradients\\\":[{\\\"gradient\\\":0,\\\"factor1\\\":0.1,\\\"factor2\\\":0.1},{\\\"gradient\\\":1,\\\"factor1\\\":5,\\\"factor2\\\":5}],\\\"textureMask\\\":[1,1,1,1],\\\"customShader\\\":null,\\\"preventAutoStart\\\":false}\"}","name":"","description":"","tags":"","isWorking":true,"fromDoc":false,"date":"2020-06-08T22:25:28.973"}
|
3d/snippet/UY098C-3.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"id":"UY098C","version":3,"snippetIdentifier":"UY098C-3","jsonPayload":"{\"particleSystem\":\"{\\\"name\\\":\\\"Spark particle system\\\",\\\"id\\\":\\\"default system\\\",\\\"capacity\\\":10000,\\\"emitterId\\\":\\\"sphere2\\\",\\\"particleEmitterType\\\":{\\\"type\\\":\\\"SphereParticleEmitter\\\",\\\"radius\\\":1,\\\"radiusRange\\\":1,\\\"directionRandomizer\\\":1},\\\"texture\\\":{\\\"tags\\\":null,\\\"url\\\":\\\"data:octet/stream;base64,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\\\",\\\"uOffset\\\":0,\\\"vOffset\\\":0,\\\"uScale\\\":1,\\\"vScale\\\":1,\\\"uAng\\\":0,\\\"vAng\\\":0,\\\"wAng\\\":0,\\\"uRotationCenter\\\":0.5,\\\"vRotationCenter\\\":0.5,\\\"wRotationCenter\\\":0.5,\\\"isBlocking\\\":true,\\\"uniqueId\\\":170,\\\"name\\\":\\\"https://www.babylonjs.com/assets/Flare.png\\\",\\\"hasAlpha\\\":false,\\\"getAlphaFromRGB\\\":false,\\\"level\\\":1,\\\"coordinatesIndex\\\":0,\\\"coordinatesMode\\\":0,\\\"wrapU\\\":1,\\\"wrapV\\\":1,\\\"wrapR\\\":1,\\\"anisotropicFilteringLevel\\\":4,\\\"isCube\\\":false,\\\"is3D\\\":false,\\\"is2DArray\\\":false,\\\"gammaSpace\\\":true,\\\"invertZ\\\":false,\\\"lodLevelInAlpha\\\":false,\\\"lodGenerationOffset\\\":0,\\\"lodGenerationScale\\\":0,\\\"linearSpecularLOD\\\":false,\\\"isRenderTarget\\\":false,\\\"animations\\\":[],\\\"invertY\\\":true,\\\"samplingMode\\\":3},\\\"isLocal\\\":false,\\\"animations\\\":[],\\\"beginAnimationOnStart\\\":false,\\\"beginAnimationFrom\\\":0,\\\"beginAnimationTo\\\":60,\\\"beginAnimationLoop\\\":false,\\\"startDelay\\\":0,\\\"renderingGroupId\\\":0,\\\"isBillboardBased\\\":true,\\\"billboardMode\\\":7,\\\"minAngularSpeed\\\":0,\\\"maxAngularSpeed\\\":0,\\\"minSize\\\":0.1,\\\"maxSize\\\":0.1,\\\"minScaleX\\\":1,\\\"maxScaleX\\\":1,\\\"minScaleY\\\":1,\\\"maxScaleY\\\":1,\\\"minEmitPower\\\":2,\\\"maxEmitPower\\\":2,\\\"minLifeTime\\\":0.05,\\\"maxLifeTime\\\":1.5,\\\"emitRate\\\":60,\\\"gravity\\\":[0,0,0],\\\"noiseStrength\\\":[10,10,10],\\\"color1\\\":[1,1,1,1],\\\"color2\\\":[1,1,1,1],\\\"colorDead\\\":[1,1,1,0],\\\"updateSpeed\\\":0.01,\\\"targetStopDuration\\\":0,\\\"blendMode\\\":2,\\\"preWarmCycles\\\":0,\\\"preWarmStepOffset\\\":1,\\\"minInitialRotation\\\":0,\\\"maxInitialRotation\\\":360,\\\"startSpriteCellID\\\":0,\\\"endSpriteCellID\\\":0,\\\"spriteCellChangeSpeed\\\":1,\\\"spriteCellWidth\\\":0,\\\"spriteCellHeight\\\":0,\\\"spriteRandomStartCell\\\":false,\\\"isAnimationSheetEnabled\\\":false,\\\"colorGradients\\\":[{\\\"gradient\\\":0,\\\"color1\\\":[0,0,0,1],\\\"color2\\\":[0,0,0,1]},{\\\"gradient\\\":0.19,\\\"color1\\\":[0.16470588235294117,0.8901960784313725,0.9725490196078431,1],\\\"color2\\\":[0.12549019607843137,0.5607843137254902,0.9803921568627451,1]},{\\\"gradient\\\":1,\\\"color1\\\":[0,0,0,1],\\\"color2\\\":[0,0,0,1]}],\\\"sizeGradients\\\":[{\\\"gradient\\\":0,\\\"factor1\\\":0,\\\"factor2\\\":0},{\\\"gradient\\\":0.07,\\\"factor1\\\":0.03,\\\"factor2\\\":0.05},{\\\"gradient\\\":0.73,\\\"factor1\\\":0.35,\\\"factor2\\\":0.06},{\\\"gradient\\\":0.93,\\\"factor1\\\":0,\\\"factor2\\\":0}],\\\"textureMask\\\":[1,1,1,1],\\\"customShader\\\":null,\\\"preventAutoStart\\\":false}\"}","name":"","description":"","tags":"","isWorking":true,"fromDoc":false,"date":"2020-06-08T22:25:28.973"}
|
README.md
CHANGED
@@ -1,3 +1 @@
|
|
1 |
-
|
2 |
-
license: mit
|
3 |
-
---
|
|
|
1 |
+
# ai-creature.github.io
|
|
|
|
agent_sac.js
ADDED
@@ -0,0 +1,897 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Soft Actor Critic Agent https://arxiv.org/abs/1812.05905
|
3 |
+
* without value network.
|
4 |
+
*/
|
5 |
+
const AgentSac = (() => {
|
6 |
+
/**
|
7 |
+
* Validates the shape of a given tensor.
|
8 |
+
*
|
9 |
+
* @param {Tensor} tensor - tensor whose shape must be validated
|
10 |
+
* @param {array} shape - shape to compare with
|
11 |
+
* @param {string} [msg = ''] - message for the error
|
12 |
+
*/
|
13 |
+
const assertShape = (tensor, shape, msg = '') => {
|
14 |
+
console.assert(
|
15 |
+
JSON.stringify(tensor.shape) === JSON.stringify(shape),
|
16 |
+
msg + ' shape ' + tensor.shape + ' is not ' + shape)
|
17 |
+
}
|
18 |
+
|
19 |
+
// const VERSION = 1 // +100 for bump tower
|
20 |
+
// const VERSION = 2 // balls
|
21 |
+
// const VERSION = 3 // tests
|
22 |
+
// const VERSION = 4 // tests
|
23 |
+
// const VERSION = 5 // exp #1
|
24 |
+
// const VERSION = 6 // exp #2
|
25 |
+
// const VERSION = 7 // exp #3
|
26 |
+
// const VERSION = 8 // exp #4
|
27 |
+
// const VERSION = 9 // exp #
|
28 |
+
// const VERSION = 10 // exp # good, doesn't touch
|
29 |
+
// const VERSION = 11 // exp #
|
30 |
+
// const VERSION = 12 // exp # 25x25
|
31 |
+
// const VERSION = 13 // exp # 25x25 single CNN
|
32 |
+
// const VERSION = 15 // 15.1 stable RB 10^5
|
33 |
+
// const VERSION = 16 // reward from RL2, rb 10^6, gr/red balls, bad
|
34 |
+
// const VERSION = 18 // reward from RL2, CNN from SAC paper, works!
|
35 |
+
// const VERSION = 19 // moving balls, super!
|
36 |
+
// const VERSION = 20 // moving balls, discret impulse, bad
|
37 |
+
// const VERSION = 21 // independant look
|
38 |
+
// const VERSION = 22 // dqn arch, bad
|
39 |
+
// const VERSION = 23 // dqn trunc, works! fast learn
|
40 |
+
// const VERSION = 24 // dqn trunc 3 layers, super and fast
|
41 |
+
// const VERSION = 25 // dqn trunc 3 layers 2x512, poor
|
42 |
+
// const VERSION = 26 // rl2 cnn arc, bad too many weights
|
43 |
+
// const VERSION = 27 // sac cnn 16x6x3->16x4x2->8x3x1->2x256 and 2 clr frames, 2h, kiss, Excellent!
|
44 |
+
// const VERSION = 28 // same but 1 frame, works
|
45 |
+
// const VERSION = 29 // 1fr w/o accel, poor
|
46 |
+
// const VERSION = 30 // 2fr wide img, poor
|
47 |
+
// const VERSION = 31 // 2 small imgs, small cnn out, poor
|
48 |
+
// const VERSION = 32 // 2fr binacular
|
49 |
+
// const VERSION = 33 // 4fr binacular, Good, but poor after reload on wider cage
|
50 |
+
// const VERSION = 34 // 4fr binacular, smaller fov=2, angle 0.7, poor
|
51 |
+
// const VERSION = 35 // 4fr binacular with dist, poor
|
52 |
+
// const VERSION = 36 // 4fr binacular with dist, works but reload not
|
53 |
+
// const VERSION = 37 // BCNN achiasma, good -> reload poor
|
54 |
+
// const VERSION = 38 // BCNN achiasma, smaller cnn
|
55 |
+
// const VERSION = 39 // 1fr BCNN achiasma, smaller cnn, works super fast, 30min
|
56 |
+
// const VERSION = 40 // 2fr BCNN achiasma, 2l smaller cnn, poor
|
57 |
+
// const VERSION = 41 // 2fr BCNN achiasma, 2l smaller cnn, some perfm after 30min
|
58 |
+
// const VERSION = 41 // 1fr BCNN achiasma, 2l smaller cnn, super kiss, reload poor
|
59 |
+
// const VERSION = 42 // 2fr BCNN achiasma, 2l smaller cnn, reload poor
|
60 |
+
// const VERSION = 43 // 1fr BCNN achiasma, 3l, fov 0.8, 1h good, reload not bad
|
61 |
+
// const VERSION = 44 // 2fr BCNN achiasma, 3l, fov 0.8, slow 1h, reload not bad, a bit better than 1fr, degrade
|
62 |
+
// const VERSION = 45 // 1fr BCNN achiasma, 2l, fov 0.8, poor
|
63 |
+
// const VERSION = 46 // 2fr BCNN achiasma, 2l, fov 0.8, fast 30 min but poor on reload
|
64 |
+
// const VERSION = 47 // 1fr BCNN chiasma, 2l, fov 0.7, poor
|
65 |
+
// const VERSION = 48 // 2fr BCNN chiasma, 2l, fov 0.7 poor
|
66 |
+
// const VERSION = 49 // 1fr BCNN chiasma stacked, 3l, poor
|
67 |
+
// const VERSION = 50 // 2fr 2nets monocular, 1h good, reload poor
|
68 |
+
// const VERSION = 51 // 1fr 1nets monocular, stuck
|
69 |
+
// const VERSION = 52 // 2fr 2nets monocular, poor
|
70 |
+
// const VERSION = 53 // 2fr 2nets monocular,
|
71 |
+
// const VERSION = 54 // 2fr binocular
|
72 |
+
// const VERSION = 55 // 2fr binocular
|
73 |
+
// const VERSION = 56 // 2fr binocular
|
74 |
+
// const VERSION = 57 // 1fr binocular, sphere vimeo super
|
75 |
+
// const VERSION = 58 // 2fr binocular, sphere
|
76 |
+
// const VERSION = 59 // 1fr binocular, sphere
|
77 |
+
// const VERSION = 61 // 2fr binocular, sphere, 2lay BASELINE!!! cage 55, mass 2, ball mass 1
|
78 |
+
// const VERSION = 62
|
79 |
+
//const VERSION = 63 // 1fr 30min! cage 60
|
80 |
+
// const VERSION = 64 // 2fr nores
|
81 |
+
// const VERSION = 66 // 1fr 30min slightly slower
|
82 |
+
// const VERSION = 67 // 2fr 30min as prev
|
83 |
+
// const VERSION = 65 // 1fr l/r diff, 30min +400
|
84 |
+
// const VERSION = 68 // 1fr l/r diff, 30min -100 good
|
85 |
+
// const VERSION = 69 // 1fr l/r diff, 30min -190 good
|
86 |
+
// const VERSION = 70 // 1fr l/r diff, 30min -420
|
87 |
+
// const VERSION = 71 // 1fr l/r diff, 30min -480
|
88 |
+
// const VERSION = 72 // 1fr no diff, 30min
|
89 |
+
// const VERSION = 73 // 1fr no diff, 30min -400 cage 50
|
90 |
+
// const VERSION = 74 // 1fr diff, 30min 2.6k!
|
91 |
+
// const VERSION = 75 // 1fr diff, 30min -300
|
92 |
+
// const VERSION = 76 // 1fr diff, 20min +300!
|
93 |
+
// const VERSION = 77 // 1fr diff, 20min +3.5k!
|
94 |
+
// const VERSION = 78 // 1fr diff, 30min -90
|
95 |
+
// const VERSION = 79 // 1fr NO diff, 25min +158
|
96 |
+
// const VERSION = 80 // 1fr NO diff, 30min -200
|
97 |
+
// const VERSION = 81 // 1fr NO diff, 20min +1200
|
98 |
+
// const VERSION = 82 // 1fr NO diff, 30min
|
99 |
+
// const VERSION = 83 // 1fr NO diff, priority 30min -400
|
100 |
+
const VERSION = 84 // 1fr diff, 30min
|
101 |
+
|
102 |
+
const LOG_STD_MIN = -20
|
103 |
+
const LOG_STD_MAX = 2
|
104 |
+
const EPSILON = 1e-8
|
105 |
+
const NAME = {
|
106 |
+
ACTOR: 'actor',
|
107 |
+
Q1: 'q1',
|
108 |
+
Q2: 'q2',
|
109 |
+
Q1_TARGET: 'q1-target',
|
110 |
+
Q2_TARGET: 'q2-target',
|
111 |
+
ALPHA: 'alpha'
|
112 |
+
}
|
113 |
+
|
114 |
+
return class AgentSac {
|
115 |
+
constructor({
|
116 |
+
batchSize = 1,
|
117 |
+
frameShape = [25, 25, 3],
|
118 |
+
nFrames = 1, // Number of stacked frames per state
|
119 |
+
nActions = 3, // 3 - impuls, 3 - RGB color
|
120 |
+
nTelemetry = 10, // 3 - linear valocity, 3 - acceleration, 3 - collision point, 1 - lidar (tanh of distance)
|
121 |
+
gamma = 0.99, // Discount factor (γ)
|
122 |
+
tau = 5e-3, // Target smoothing coefficient (τ)
|
123 |
+
trainable = true, // Whether the actor is trainable
|
124 |
+
verbose = false,
|
125 |
+
forced = false, // force to create fresh models (not from checkpoint)
|
126 |
+
prefix = '', // for tests,
|
127 |
+
sighted = true,
|
128 |
+
rewardScale = 10
|
129 |
+
} = {}) {
|
130 |
+
this._batchSize = batchSize
|
131 |
+
this._frameShape = frameShape
|
132 |
+
this._nFrames = nFrames
|
133 |
+
this._nActions = nActions
|
134 |
+
this._nTelemetry = nTelemetry
|
135 |
+
this._gamma = gamma
|
136 |
+
this._tau = tau
|
137 |
+
this._trainable = trainable
|
138 |
+
this._verbose = verbose
|
139 |
+
this._inited = false
|
140 |
+
this._prefix = (prefix === '' ? '' : prefix + '-')
|
141 |
+
this._forced = forced
|
142 |
+
this._sighted = sighted
|
143 |
+
this._rewardScale = rewardScale
|
144 |
+
|
145 |
+
this._frameStackShape = [...this._frameShape.slice(0, 2), this._frameShape[2] * this._nFrames]
|
146 |
+
|
147 |
+
// https://github.com/rail-berkeley/softlearning/blob/13cf187cc93d90f7c217ea2845067491c3c65464/softlearning/algorithms/sac.py#L37
|
148 |
+
this._targetEntropy = -nActions
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Initialization.
|
153 |
+
*/
|
154 |
+
async init() {
|
155 |
+
if (this._inited) throw Error('щ(゚Д゚щ)')
|
156 |
+
|
157 |
+
this._frameInputL = tf.input({batchShape : [null, ...this._frameStackShape]})
|
158 |
+
this._frameInputR = tf.input({batchShape : [null, ...this._frameStackShape]})
|
159 |
+
|
160 |
+
this._telemetryInput = tf.input({batchShape : [null, this._nTelemetry]})
|
161 |
+
|
162 |
+
this.actor = await this._getActor(this._prefix + NAME.ACTOR, this.trainable)
|
163 |
+
|
164 |
+
if (!this._trainable)
|
165 |
+
return
|
166 |
+
|
167 |
+
this.actorOptimizer = tf.train.adam()
|
168 |
+
|
169 |
+
this._actionInput = tf.input({batchShape : [null, this._nActions]})
|
170 |
+
|
171 |
+
this.q1 = await this._getCritic(this._prefix + NAME.Q1)
|
172 |
+
this.q1Optimizer = tf.train.adam()
|
173 |
+
|
174 |
+
this.q2 = await this._getCritic(this._prefix + NAME.Q2)
|
175 |
+
this.q2Optimizer = tf.train.adam()
|
176 |
+
|
177 |
+
this.q1Targ = await this._getCritic(this._prefix + NAME.Q1_TARGET, true) // true for batch norm
|
178 |
+
this.q2Targ = await this._getCritic(this._prefix + NAME.Q2_TARGET, true)
|
179 |
+
|
180 |
+
this._logAlpha = await this._getLogAlpha(this._prefix + NAME.ALPHA)
|
181 |
+
this.alphaOptimizer = tf.train.adam()
|
182 |
+
|
183 |
+
this.updateTargets(1)
|
184 |
+
|
185 |
+
// console.log('weights actorr', this.actor.getWeights().map(w => w.arraySync()))
|
186 |
+
// console.log('weights q1q1q1', this.q1.getWeights().map(w => w.arraySync()))
|
187 |
+
// console.log('weights q2Targ', this.q2Targ.getWeights().map(w => w.arraySync()))
|
188 |
+
|
189 |
+
this._inited = true
|
190 |
+
}
|
191 |
+
|
192 |
+
/**
|
193 |
+
* Trains networks on a batch from the replay buffer.
|
194 |
+
*
|
195 |
+
* @param {{ state, action, reward, nextState }} - trnsitions in batch
|
196 |
+
* @returns {void} nothing
|
197 |
+
*/
|
198 |
+
train({ state, action, reward, nextState }) {
|
199 |
+
if (!this._trainable)
|
200 |
+
throw new Error('Actor is not trainable')
|
201 |
+
|
202 |
+
return tf.tidy(() => {
|
203 |
+
assertShape(state[0], [this._batchSize, this._nTelemetry], 'telemetry')
|
204 |
+
assertShape(state[1], [this._batchSize, ...this._frameStackShape], 'frames')
|
205 |
+
assertShape(action, [this._batchSize, this._nActions], 'action')
|
206 |
+
assertShape(reward, [this._batchSize, 1], 'reward')
|
207 |
+
assertShape(nextState[0], [this._batchSize, this._nTelemetry], 'nextState telemetry')
|
208 |
+
assertShape(nextState[1], [this._batchSize, ...this._frameStackShape], 'nextState frames')
|
209 |
+
|
210 |
+
this._trainCritics({ state, action, reward, nextState })
|
211 |
+
this._trainActor(state)
|
212 |
+
this._trainAlpha(state)
|
213 |
+
|
214 |
+
this.updateTargets()
|
215 |
+
})
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Train Q-networks.
|
220 |
+
*
|
221 |
+
* @param {{ state, action, reward, nextState }} transition - transition
|
222 |
+
*/
|
223 |
+
_trainCritics({ state, action, reward, nextState }) {
|
224 |
+
const getQLossFunction = (() => {
|
225 |
+
const [nextFreshAction, logPi] = this.sampleAction(nextState, true)
|
226 |
+
|
227 |
+
const q1TargValue = this.q1Targ.predict(
|
228 |
+
this._sighted ? [...nextState, nextFreshAction] : [nextState[0], nextFreshAction],
|
229 |
+
{batchSize: this._batchSize})
|
230 |
+
const q2TargValue = this.q2Targ.predict(
|
231 |
+
this._sighted ? [...nextState, nextFreshAction] : [nextState[0], nextFreshAction],
|
232 |
+
{batchSize: this._batchSize})
|
233 |
+
|
234 |
+
const qTargValue = tf.minimum(q1TargValue, q2TargValue)
|
235 |
+
|
236 |
+
// y = r + γ*(1 - d)*(min(Q1Targ(s', a'), Q2Targ(s', a')) - α*log(π(s'))
|
237 |
+
const alpha = this._getAlpha()
|
238 |
+
const target = reward.mul(tf.scalar(this._rewardScale)).add(
|
239 |
+
tf.scalar(this._gamma).mul(
|
240 |
+
qTargValue.sub(alpha.mul(logPi))
|
241 |
+
)
|
242 |
+
)
|
243 |
+
|
244 |
+
assertShape(nextFreshAction, [this._batchSize, this._nActions], 'nextFreshAction')
|
245 |
+
assertShape(logPi, [this._batchSize, 1], 'logPi')
|
246 |
+
assertShape(qTargValue, [this._batchSize, 1], 'qTargValue')
|
247 |
+
assertShape(target, [this._batchSize, 1], 'target')
|
248 |
+
|
249 |
+
return (q) => () => {
|
250 |
+
const qValue = q.predict(
|
251 |
+
this._sighted ? [...state, action] : [state[0], action],
|
252 |
+
{batchSize: this._batchSize})
|
253 |
+
|
254 |
+
// const loss = tf.scalar(0.5).mul(tf.losses.meanSquaredError(qValue, target))
|
255 |
+
const loss = tf.scalar(0.5).mul(tf.mean(qValue.sub(target).square()))
|
256 |
+
|
257 |
+
assertShape(qValue, [this._batchSize, 1], 'qValue')
|
258 |
+
|
259 |
+
return loss
|
260 |
+
}
|
261 |
+
})()
|
262 |
+
|
263 |
+
for (const [q, optimizer] of [
|
264 |
+
[this.q1, this.q1Optimizer],
|
265 |
+
[this.q2, this.q2Optimizer]
|
266 |
+
]) {
|
267 |
+
const qLossFunction = getQLossFunction(q)
|
268 |
+
|
269 |
+
const { value, grads } = tf.variableGrads(qLossFunction, q.getWeights(true)) // true means trainableOnly
|
270 |
+
|
271 |
+
optimizer.applyGradients(grads)
|
272 |
+
|
273 |
+
if (this._verbose) console.log(q.name + ' Loss: ' + value.arraySync())
|
274 |
+
}
|
275 |
+
}
|
276 |
+
|
277 |
+
/**
|
278 |
+
* Train actor networks.
|
279 |
+
*
|
280 |
+
* @param {state} state
|
281 |
+
*/
|
282 |
+
_trainActor(state) {
|
283 |
+
// TODO: consider delayed update of policy and targets (if possible)
|
284 |
+
const actorLossFunction = () => {
|
285 |
+
const [freshAction, logPi] = this.sampleAction(state, true)
|
286 |
+
|
287 |
+
const q1Value = this.q1.predict(
|
288 |
+
this._sighted ? [...state, freshAction] : [state[0], freshAction],
|
289 |
+
{batchSize: this._batchSize})
|
290 |
+
const q2Value = this.q2.predict(
|
291 |
+
this._sighted ? [...state, freshAction] : [state[0], freshAction],
|
292 |
+
{batchSize: this._batchSize})
|
293 |
+
|
294 |
+
const criticValue = tf.minimum(q1Value, q2Value)
|
295 |
+
|
296 |
+
const alpha = this._getAlpha()
|
297 |
+
const loss = alpha.mul(logPi).sub(criticValue)
|
298 |
+
|
299 |
+
assertShape(freshAction, [this._batchSize, this._nActions], 'freshAction')
|
300 |
+
assertShape(logPi, [this._batchSize, 1], 'logPi')
|
301 |
+
assertShape(q1Value, [this._batchSize, 1], 'q1Value')
|
302 |
+
assertShape(criticValue, [this._batchSize, 1], 'criticValue')
|
303 |
+
assertShape(loss, [this._batchSize, 1], 'alpha loss')
|
304 |
+
|
305 |
+
return tf.mean(loss)
|
306 |
+
}
|
307 |
+
|
308 |
+
const { value, grads } = tf.variableGrads(actorLossFunction, this.actor.getWeights(true)) // true means trainableOnly
|
309 |
+
|
310 |
+
this.actorOptimizer.applyGradients(grads)
|
311 |
+
|
312 |
+
if (this._verbose) console.log('Actor Loss: ' + value.arraySync())
|
313 |
+
}
|
314 |
+
|
315 |
+
_trainAlpha(state) {
|
316 |
+
const alphaLossFunction = () => {
|
317 |
+
const [, logPi] = this.sampleAction(state, true)
|
318 |
+
|
319 |
+
const alpha = this._getAlpha()
|
320 |
+
const loss = tf.scalar(-1).mul(
|
321 |
+
alpha.mul( // TODO: not sure whether this should be alpha or logAlpha
|
322 |
+
logPi.add(tf.scalar(this._targetEntropy))
|
323 |
+
)
|
324 |
+
)
|
325 |
+
|
326 |
+
assertShape(loss, [this._batchSize, 1], 'alpha loss')
|
327 |
+
|
328 |
+
return tf.mean(loss)
|
329 |
+
}
|
330 |
+
|
331 |
+
const { value, grads } = tf.variableGrads(alphaLossFunction, [this._logAlpha]) // true means trainableOnly
|
332 |
+
|
333 |
+
this.alphaOptimizer.applyGradients(grads)
|
334 |
+
|
335 |
+
if (this._verbose) console.log('Alpha Loss: ' + value.arraySync(), tf.exp(this._logAlpha).arraySync())
|
336 |
+
}
|
337 |
+
|
338 |
+
/**
|
339 |
+
* Soft update target Q-networks.
|
340 |
+
*
|
341 |
+
* @param {number} [tau = this._tau] - smoothing constant τ for exponentially moving average: `wTarg <- wTarg*(1-tau) + w*tau`
|
342 |
+
*/
|
343 |
+
updateTargets(tau = this._tau) {
|
344 |
+
tau = tf.scalar(tau)
|
345 |
+
|
346 |
+
const
|
347 |
+
q1W = this.q1.getWeights(),
|
348 |
+
q2W = this.q2.getWeights(),
|
349 |
+
q1WTarg = this.q1Targ.getWeights(),
|
350 |
+
q2WTarg = this.q2Targ.getWeights(),
|
351 |
+
len = q1W.length
|
352 |
+
|
353 |
+
// console.log('updateTargets q1W', q1W.map(w=>w.arraySync()))
|
354 |
+
// console.log('updateTargets q1WTarg', q1WTarg.map(w=>w.arraySync()))
|
355 |
+
|
356 |
+
const calc = (w, wTarg) => wTarg.mul(tf.scalar(1).sub(tau)).add(w.mul(tau))
|
357 |
+
|
358 |
+
const w1 = [], w2 = []
|
359 |
+
for (let i = 0; i < len; i++) {
|
360 |
+
w1.push(calc(q1W[i], q1WTarg[i]))
|
361 |
+
w2.push(calc(q2W[i], q2WTarg[i]))
|
362 |
+
}
|
363 |
+
|
364 |
+
this.q1Targ.setWeights(w1)
|
365 |
+
this.q2Targ.setWeights(w2)
|
366 |
+
|
367 |
+
|
368 |
+
}
|
369 |
+
|
370 |
+
/**
|
371 |
+
* Returns actions sampled from normal distribution using means and stds predicted by the actor.
|
372 |
+
*
|
373 |
+
* @param {Tensor[]} state - state
|
374 |
+
* @param {Tensor} [withLogProbs = false] - whether return log probabilities
|
375 |
+
* @returns {Tensor || Tensor[]} action and log policy
|
376 |
+
*/
|
377 |
+
sampleAction(state, withLogProbs = false) { // timer ~3ms
|
378 |
+
return tf.tidy(() => {
|
379 |
+
let [ mu, logStd ] = this.actor.predict(this._sighted ? state : state[0], {batchSize: this._batchSize})
|
380 |
+
|
381 |
+
// https://github.com/rail-berkeley/rlkit/blob/c81509d982b4d52a6239e7bfe7d2540e3d3cd986/rlkit/torch/sac/policies/gaussian_policy.py#L106
|
382 |
+
logStd = tf.clipByValue(logStd, LOG_STD_MIN, LOG_STD_MAX)
|
383 |
+
|
384 |
+
const std = tf.exp(logStd)
|
385 |
+
|
386 |
+
// sample normal N(mu = 0, std = 1)
|
387 |
+
const normal = tf.randomNormal(mu.shape, 0, 1.0)
|
388 |
+
|
389 |
+
// reparameterization trick: z = mu + std * epsilon
|
390 |
+
let pi = mu.add(std.mul(normal))
|
391 |
+
|
392 |
+
let logPi = this._gaussianLikelihood(pi, mu, logStd)
|
393 |
+
|
394 |
+
;({ pi, logPi } = this._applySquashing(pi, mu, logPi))
|
395 |
+
|
396 |
+
if (!withLogProbs)
|
397 |
+
return pi
|
398 |
+
|
399 |
+
return [pi, logPi]
|
400 |
+
})
|
401 |
+
}
|
402 |
+
|
403 |
+
/**
|
404 |
+
* Calculates log probability of normal distribution https://en.wikipedia.org/wiki/Log_probability.
|
405 |
+
* Converted to js from https://github.com/tensorflow/probability/blob/f3777158691787d3658b5e80883fe1a933d48989/tensorflow_probability/python/distributions/normal.py#L183
|
406 |
+
*
|
407 |
+
* @param {Tensor} x - sample from normal distribution with mean `mu` and std `std`
|
408 |
+
* @param {Tensor} mu - mean
|
409 |
+
* @param {Tensor} std - standart deviation
|
410 |
+
* @returns {Tensor} log probability
|
411 |
+
*/
|
412 |
+
_logProb(x, mu, std) {
|
413 |
+
const logUnnormalized = tf.scalar(-0.5).mul(
|
414 |
+
tf.squaredDifference(x.div(std), mu.div(std))
|
415 |
+
)
|
416 |
+
const logNormalization = tf.scalar(0.5 * Math.log(2 * Math.PI)).add(tf.log(std))
|
417 |
+
|
418 |
+
return logUnnormalized.sub(logNormalization)
|
419 |
+
}
|
420 |
+
|
421 |
+
/**
|
422 |
+
* Gaussian likelihood.
|
423 |
+
* Translated from https://github.com/openai/spinningup/blob/038665d62d569055401d91856abb287263096178/spinup/algos/tf1/sac/core.py#L24
|
424 |
+
*
|
425 |
+
* @param {Tensor} x - sample from normal distribution with mean `mu` and std `exp(logStd)`
|
426 |
+
* @param {Tensor} mu - mean
|
427 |
+
* @param {Tensor} logStd - log of standart deviation
|
428 |
+
* @returns {Tensor} log probability
|
429 |
+
*/
|
430 |
+
_gaussianLikelihood(x, mu, logStd) {
|
431 |
+
// pre_sum = -0.5 * (
|
432 |
+
// ((x-mu)/(tf.exp(log_std)+EPS))**2
|
433 |
+
// + 2*log_std
|
434 |
+
// + np.log(2*np.pi)
|
435 |
+
// )
|
436 |
+
|
437 |
+
const preSum = tf.scalar(-0.5).mul(
|
438 |
+
x.sub(mu).div(
|
439 |
+
tf.exp(logStd).add(tf.scalar(EPSILON))
|
440 |
+
).square()
|
441 |
+
.add(tf.scalar(2).mul(logStd))
|
442 |
+
.add(tf.scalar(Math.log(2 * Math.PI)))
|
443 |
+
)
|
444 |
+
|
445 |
+
return tf.sum(preSum, 1, true)
|
446 |
+
}
|
447 |
+
|
448 |
+
/**
|
449 |
+
* Adjustment to log probability when squashing action with tanh
|
450 |
+
* Enforcing Action Bounds formula derivation https://stats.stackexchange.com/questions/239588/derivation-of-change-of-variables-of-a-probability-density-function
|
451 |
+
* Translated from https://github.com/openai/spinningup/blob/038665d62d569055401d91856abb287263096178/spinup/algos/tf1/sac/core.py#L48
|
452 |
+
*
|
453 |
+
* @param {*} pi - policy sample
|
454 |
+
* @param {*} mu - mean
|
455 |
+
* @param {*} logPi - log probability
|
456 |
+
* @returns {{ pi, mu, logPi }} squashed and adjasted input
|
457 |
+
*/
|
458 |
+
_applySquashing(pi, mu, logPi) {
|
459 |
+
// logp_pi -= tf.reduce_sum(2*(np.log(2) - pi - tf.nn.softplus(-2*pi)), axis=1)
|
460 |
+
|
461 |
+
const adj = tf.scalar(2).mul(
|
462 |
+
tf.scalar(Math.log(2))
|
463 |
+
.sub(pi)
|
464 |
+
.sub(tf.softplus(
|
465 |
+
tf.scalar(-2).mul(pi)
|
466 |
+
))
|
467 |
+
)
|
468 |
+
|
469 |
+
logPi = logPi.sub(tf.sum(adj, 1, true))
|
470 |
+
mu = tf.tanh(mu)
|
471 |
+
pi = tf.tanh(pi)
|
472 |
+
|
473 |
+
return { pi, mu, logPi }
|
474 |
+
}
|
475 |
+
|
476 |
+
/**
|
477 |
+
* Builds actor network model.
|
478 |
+
*
|
479 |
+
* @param {string} [name = 'actor'] - name of the model
|
480 |
+
* @param {string} trainable - whether a critic is trainable
|
481 |
+
* @returns {tf.LayersModel} model
|
482 |
+
*/
|
483 |
+
async _getActor(name = 'actor', trainable = true) {
|
484 |
+
const checkpoint = await this._loadCheckpoint(name)
|
485 |
+
if (checkpoint) return checkpoint
|
486 |
+
|
487 |
+
let outputs = this._telemetryInput
|
488 |
+
// outputs = tf.layers.dense({units: 128, activation: 'relu'}).apply(outputs)
|
489 |
+
|
490 |
+
if (this._sighted) {
|
491 |
+
let convOutputL = this._getConvEncoder(this._frameInputL)
|
492 |
+
let convOutputR = this._getConvEncoder(this._frameInputR)
|
493 |
+
// let convOutput = tf.layers.concatenate().apply([convOutputL, convOutputR])
|
494 |
+
// convOutput = tf.layers.dense({units: 10, activation: 'relu'}).apply(convOutput)
|
495 |
+
|
496 |
+
outputs = tf.layers.concatenate().apply([convOutputL, convOutputR, outputs])
|
497 |
+
}
|
498 |
+
|
499 |
+
outputs = tf.layers.dense({units: 256, activation: 'relu'}).apply(outputs)
|
500 |
+
outputs = tf.layers.dense({units: 256, activation: 'relu'}).apply(outputs)
|
501 |
+
|
502 |
+
const mu = tf.layers.dense({units: this._nActions}).apply(outputs)
|
503 |
+
const logStd = tf.layers.dense({units: this._nActions}).apply(outputs)
|
504 |
+
|
505 |
+
const model = tf.model({inputs: this._sighted ? [this._telemetryInput, this._frameInputL, this._frameInputR] : [this._telemetryInput], outputs: [mu, logStd], name})
|
506 |
+
model.trainable = trainable
|
507 |
+
|
508 |
+
if (this._verbose) {
|
509 |
+
console.log('==========================')
|
510 |
+
console.log('==========================')
|
511 |
+
console.log('Actor ' + name + ': ')
|
512 |
+
|
513 |
+
model.summary()
|
514 |
+
}
|
515 |
+
|
516 |
+
return model
|
517 |
+
}
|
518 |
+
|
519 |
+
/**
|
520 |
+
* Builds a critic network model.
|
521 |
+
*
|
522 |
+
* @param {string} [name = 'critic'] - name of the model
|
523 |
+
* @param {string} trainable - whether a critic is trainable
|
524 |
+
* @returns {tf.LayersModel} model
|
525 |
+
*/
|
526 |
+
async _getCritic(name = 'critic', trainable = true) {
|
527 |
+
const checkpoint = await this._loadCheckpoint(name)
|
528 |
+
if (checkpoint) return checkpoint
|
529 |
+
|
530 |
+
let outputs = tf.layers.concatenate().apply([this._telemetryInput, this._actionInput])
|
531 |
+
// outputs = tf.layers.dense({units: 128, activation: 'relu'}).apply(outputs)
|
532 |
+
|
533 |
+
if (this._sighted) {
|
534 |
+
let convOutputL = this._getConvEncoder(this._frameInputL)
|
535 |
+
let convOutputR = this._getConvEncoder(this._frameInputR)
|
536 |
+
// let convOutput = tf.layers.concatenate().apply([convOutputL, convOutputR])
|
537 |
+
// convOutput = tf.layers.dense({units: 10, activation: 'relu'}).apply(convOutput)
|
538 |
+
|
539 |
+
outputs = tf.layers.concatenate().apply([convOutputL, convOutputR, outputs])
|
540 |
+
}
|
541 |
+
|
542 |
+
outputs = tf.layers.dense({units: 256, activation: 'relu'}).apply(outputs)
|
543 |
+
outputs = tf.layers.dense({units: 256, activation: 'relu'}).apply(outputs)
|
544 |
+
|
545 |
+
outputs = tf.layers.dense({units: 1}).apply(outputs)
|
546 |
+
|
547 |
+
const model = tf.model({
|
548 |
+
inputs: this._sighted
|
549 |
+
? [this._telemetryInput, this._frameInputL, this._frameInputR, this._actionInput]
|
550 |
+
: [this._telemetryInput, this._actionInput],
|
551 |
+
outputs, name
|
552 |
+
})
|
553 |
+
|
554 |
+
model.trainable = trainable
|
555 |
+
|
556 |
+
if (this._verbose) {
|
557 |
+
console.log('==========================')
|
558 |
+
console.log('==========================')
|
559 |
+
console.log('CRITIC ' + name + ': ')
|
560 |
+
|
561 |
+
model.summary()
|
562 |
+
}
|
563 |
+
|
564 |
+
return model
|
565 |
+
}
|
566 |
+
|
567 |
+
// _encoder = null
|
568 |
+
// _getConvEncoder(inputs) {
|
569 |
+
// if (!this._encoder)
|
570 |
+
// this._encoder = this.__getConvEncoder(inputs)
|
571 |
+
|
572 |
+
// return this._encoder
|
573 |
+
// }
|
574 |
+
|
575 |
+
/**
|
576 |
+
* Builds convolutional part of a network.
|
577 |
+
*
|
578 |
+
* @param {Tensor} inputs - input for the conv layers
|
579 |
+
* @returns outputs
|
580 |
+
*/
|
581 |
+
_getConvEncoder(inputs) {
|
582 |
+
const kernelSize = 3
|
583 |
+
const padding = 'valid'
|
584 |
+
const poolSize = 3
|
585 |
+
const strides = 1
|
586 |
+
// const depthwiseInitializer = 'heNormal'
|
587 |
+
// const pointwiseInitializer = 'heNormal'
|
588 |
+
const kernelInitializer = 'glorotNormal'
|
589 |
+
const biasInitializer = 'glorotNormal'
|
590 |
+
|
591 |
+
let outputs = inputs
|
592 |
+
|
593 |
+
// 32x8x4 -> 64x4x2 -> 64x3x1 -> 64x4x1
|
594 |
+
outputs = tf.layers.conv2d({
|
595 |
+
filters: 16,
|
596 |
+
kernelSize: 5,
|
597 |
+
strides: 2,
|
598 |
+
padding,
|
599 |
+
kernelInitializer,
|
600 |
+
biasInitializer,
|
601 |
+
activation: 'relu',
|
602 |
+
trainable: true
|
603 |
+
}).apply(outputs)
|
604 |
+
outputs = tf.layers.maxPooling2d({poolSize:2}).apply(outputs)
|
605 |
+
//
|
606 |
+
// outputs = tf.layers.layerNormalization().apply(outputs)
|
607 |
+
|
608 |
+
outputs = tf.layers.conv2d({
|
609 |
+
filters: 16,
|
610 |
+
kernelSize: 3,
|
611 |
+
strides: 1,
|
612 |
+
padding,
|
613 |
+
kernelInitializer,
|
614 |
+
biasInitializer,
|
615 |
+
activation: 'relu',
|
616 |
+
trainable: true
|
617 |
+
}).apply(outputs)
|
618 |
+
outputs = tf.layers.maxPooling2d({poolSize:2}).apply(outputs)
|
619 |
+
|
620 |
+
// outputs = tf.layers.layerNormalization().apply(outputs)
|
621 |
+
|
622 |
+
// outputs = tf.layers.conv2d({
|
623 |
+
// filters: 12,
|
624 |
+
// kernelSize: 3,
|
625 |
+
// strides: 1,
|
626 |
+
// padding,
|
627 |
+
// kernelInitializer,
|
628 |
+
// biasInitializer,
|
629 |
+
// activation: 'relu',
|
630 |
+
// trainable: true
|
631 |
+
// }).apply(outputs)
|
632 |
+
|
633 |
+
// outputs = tf.layers.conv2d({
|
634 |
+
// filters: 10,
|
635 |
+
// kernelSize: 2,
|
636 |
+
// strides: 1,
|
637 |
+
// padding,
|
638 |
+
// kernelInitializer,
|
639 |
+
// biasInitializer,
|
640 |
+
// activation: 'relu',
|
641 |
+
// trainable: true
|
642 |
+
// }).apply(outputs)
|
643 |
+
|
644 |
+
// outputs = tf.layers.conv2d({
|
645 |
+
// filters: 64,
|
646 |
+
// kernelSize: 4,
|
647 |
+
// strides: 1,
|
648 |
+
// padding,
|
649 |
+
// kernelInitializer,
|
650 |
+
// biasInitializer,
|
651 |
+
// activation: 'relu'
|
652 |
+
// }).apply(outputs)
|
653 |
+
|
654 |
+
// outputs = tf.layers.batchNormalization().apply(outputs)
|
655 |
+
|
656 |
+
// outputs = tf.layers.layerNormalization().apply(outputs)
|
657 |
+
|
658 |
+
outputs = tf.layers.flatten().apply(outputs)
|
659 |
+
|
660 |
+
// convOutputs = tf.layers.dense({units: 96, activation: 'relu'}).apply(convOutputs)
|
661 |
+
|
662 |
+
return outputs
|
663 |
+
}
|
664 |
+
|
665 |
+
/**
|
666 |
+
* Returns clipped alpha.
|
667 |
+
*
|
668 |
+
* @returns {Tensor} entropy
|
669 |
+
*/
|
670 |
+
_getAlpha() {
|
671 |
+
// return tf.maximum(tf.exp(this._logAlpha), tf.scalar(this._minAlpha))
|
672 |
+
return tf.exp(this._logAlpha)
|
673 |
+
}
|
674 |
+
|
675 |
+
/**
|
676 |
+
* Builds a log of entropy scale (α) for training.
|
677 |
+
*
|
678 |
+
* @param {string} name
|
679 |
+
* @returns {tf.Variable} trainable variable for log entropy
|
680 |
+
*/
|
681 |
+
async _getLogAlpha(name = 'alpha') {
|
682 |
+
let logAlpha = 0.0
|
683 |
+
|
684 |
+
const checkpoint = await this._loadCheckpoint(name)
|
685 |
+
if (checkpoint) {
|
686 |
+
logAlpha = checkpoint.getWeights()[0].arraySync()[0][0]
|
687 |
+
|
688 |
+
if (this._verbose)
|
689 |
+
console.log('Checkpoint alpha: ', logAlpha)
|
690 |
+
|
691 |
+
this._logAlphaPlaceholder = checkpoint
|
692 |
+
} else {
|
693 |
+
const model = tf.sequential({ name });
|
694 |
+
model.add(tf.layers.dense({ units: 1, inputShape: [1], useBias: false }))
|
695 |
+
model.setWeights([tf.tensor([logAlpha], [1, 1])])
|
696 |
+
|
697 |
+
this._logAlphaPlaceholder = model
|
698 |
+
}
|
699 |
+
|
700 |
+
return tf.variable(tf.scalar(logAlpha), true) // true -> trainable
|
701 |
+
}
|
702 |
+
|
703 |
+
/**
|
704 |
+
* Saves all agent's models to the storage.
|
705 |
+
*/
|
706 |
+
async checkpoint() {
|
707 |
+
if (!this._trainable) throw new Error('(╭ರ_ ⊙ )')
|
708 |
+
|
709 |
+
this._logAlphaPlaceholder.setWeights([tf.tensor([this._logAlpha.arraySync()], [1, 1])])
|
710 |
+
|
711 |
+
await Promise.all([
|
712 |
+
this._saveCheckpoint(this.actor),
|
713 |
+
this._saveCheckpoint(this.q1),
|
714 |
+
this._saveCheckpoint(this.q2),
|
715 |
+
this._saveCheckpoint(this.q1Targ),
|
716 |
+
this._saveCheckpoint(this.q2Targ),
|
717 |
+
this._saveCheckpoint(this._logAlphaPlaceholder)
|
718 |
+
])
|
719 |
+
|
720 |
+
if (this._verbose)
|
721 |
+
console.log('Checkpoint succesfully saved')
|
722 |
+
}
|
723 |
+
|
724 |
+
/**
|
725 |
+
* Saves a model to the storage.
|
726 |
+
*
|
727 |
+
* @param {tf.LayersModel} model
|
728 |
+
*/
|
729 |
+
async _saveCheckpoint(model) {
|
730 |
+
const key = this._getChKey(model.name)
|
731 |
+
const saveResults = await model.save(key)
|
732 |
+
|
733 |
+
if (this._verbose)
|
734 |
+
console.log('Checkpoint saveResults', model.name, saveResults)
|
735 |
+
}
|
736 |
+
|
737 |
+
/**
|
738 |
+
* Loads saved checkpoint from the storage.
|
739 |
+
*
|
740 |
+
* @param {string} name model name
|
741 |
+
* @returns {tf.LayersModel} model
|
742 |
+
*/
|
743 |
+
async _loadCheckpoint(name) {
|
744 |
+
// return
|
745 |
+
if (this._forced) {
|
746 |
+
console.log('Forced to not load from the checkpoint ' + name)
|
747 |
+
return
|
748 |
+
}
|
749 |
+
|
750 |
+
const key = this._getChKey(name)
|
751 |
+
const modelsInfo = await tf.io.listModels()
|
752 |
+
|
753 |
+
if (key in modelsInfo) {
|
754 |
+
const model = await tf.loadLayersModel(key)
|
755 |
+
|
756 |
+
if (this._verbose)
|
757 |
+
console.log('Loaded checkpoint for ' + name)
|
758 |
+
|
759 |
+
return model
|
760 |
+
}
|
761 |
+
|
762 |
+
if (this._verbose)
|
763 |
+
console.log('Checkpoint not found for ' + name)
|
764 |
+
}
|
765 |
+
|
766 |
+
/**
|
767 |
+
* Builds the key for the model weights in LocalStorage.
|
768 |
+
*
|
769 |
+
* @param {tf.LayersModel} name model name
|
770 |
+
* @returns {string} key
|
771 |
+
*/
|
772 |
+
_getChKey(name) {
|
773 |
+
return 'indexeddb://' + name + '-' + VERSION
|
774 |
+
}
|
775 |
+
}
|
776 |
+
})()
|
777 |
+
|
778 |
+
/* TESTS */
|
779 |
+
;(async () => {
|
780 |
+
return
|
781 |
+
|
782 |
+
// https://www.wolframalpha.com/input/?i2d=true&i=y%5C%2840%29x%5C%2844%29+%CE%BC%5C%2844%29+%CF%83%5C%2841%29+%3D+ln%5C%2840%29Divide%5B1%2CSqrt%5B2*%CF%80*Power%5B%CF%83%2C2%5D%5D%5D*Exp%5B-Divide%5B1%2C2%5D*%5C%2840%29Divide%5BPower%5B%5C%2840%29x-%CE%BC%5C%2841%29%2C2%5D%2CPower%5B%CF%83%2C2%5D%5D%5C%2841%29%5D%5C%2841%29
|
783 |
+
;(() => {
|
784 |
+
const agent = new AgentSac()
|
785 |
+
|
786 |
+
const
|
787 |
+
mu = tf.tensor([0], [1, 1]), // mu = 0
|
788 |
+
logStd = tf.tensor([0], [1, 1]), // logStd = 0
|
789 |
+
std = tf.exp(logStd), // std = 1
|
790 |
+
normal = tf.tensor([0], [1, 1]), // N = 0
|
791 |
+
pi = mu.add(std.mul(normal)) // x = 0
|
792 |
+
|
793 |
+
const log = agent._gaussianLikelihood(pi, mu, logStd)
|
794 |
+
|
795 |
+
console.assert(log.arraySync()[0][0].toFixed(5) === '-0.91894',
|
796 |
+
'test Gaussian Likelihood for μ=0, σ=1, x=0')
|
797 |
+
})()
|
798 |
+
|
799 |
+
;(() => {
|
800 |
+
const agent = new AgentSac()
|
801 |
+
|
802 |
+
const
|
803 |
+
mu = tf.tensor([1], [1, 1]), // mu = 1
|
804 |
+
logStd = tf.tensor([1], [1, 1]), // logStd = 1
|
805 |
+
std = tf.exp(logStd), // std = e
|
806 |
+
normal = tf.tensor([0], [1, 1]), // N = 0
|
807 |
+
pi = mu.add(std.mul(normal)) // x = 1
|
808 |
+
|
809 |
+
const log = agent._gaussianLikelihood(pi, mu, logStd)
|
810 |
+
|
811 |
+
console.assert(log.arraySync()[0][0].toFixed(5) === '-1.91894',
|
812 |
+
'test Gaussian Likelihood for μ=1, σ=e, x=0')
|
813 |
+
})()
|
814 |
+
|
815 |
+
;(() => {
|
816 |
+
const agent = new AgentSac()
|
817 |
+
|
818 |
+
const
|
819 |
+
mu = tf.tensor([1], [1, 1]), // mu = -1
|
820 |
+
logStd = tf.tensor([1], [1, 1]), // logStd = 1
|
821 |
+
std = tf.exp(logStd), // std = e
|
822 |
+
normal = tf.tensor([0.1], [1, 1]), // N = 0
|
823 |
+
pi = mu.add(std.mul(normal)) // x = -1.27182818
|
824 |
+
|
825 |
+
const logPi = agent._gaussianLikelihood(pi, mu, logStd)
|
826 |
+
const { pi: piSquashed, logPi: logPiSquashed } = agent._applySquashing(pi, mu, logPi)
|
827 |
+
|
828 |
+
const logProbBounded = logPi.sub(
|
829 |
+
tf.log(
|
830 |
+
tf.scalar(1)
|
831 |
+
.sub(tf.tanh(pi).pow(tf.scalar(2)))
|
832 |
+
// .add(EPSILON)
|
833 |
+
)
|
834 |
+
).sum(1, true)
|
835 |
+
|
836 |
+
console.assert(logPi.arraySync()[0][0].toFixed(5) === '-1.92394',
|
837 |
+
'test Gaussian Likelihood for μ=-1, σ=e, x=-1.27182818')
|
838 |
+
|
839 |
+
console.assert(logPiSquashed.arraySync()[0][0].toFixed(5) === logProbBounded.arraySync()[0][0].toFixed(5),
|
840 |
+
'test logPiSquashed for μ=-1, σ=e, x=-1.27182818')
|
841 |
+
|
842 |
+
console.assert(piSquashed.arraySync()[0][0].toFixed(5) === tf.tanh(pi).arraySync()[0][0].toFixed(5),
|
843 |
+
'test piSquashed for μ=-1, σ=e, x=-1.27182818')
|
844 |
+
})()
|
845 |
+
|
846 |
+
await (async () => {
|
847 |
+
const state = tf.tensor([
|
848 |
+
0.5, 0.3, -0.9,
|
849 |
+
0, -0.8, 1,
|
850 |
+
-0.3, 0.04, 0.02,
|
851 |
+
0.9
|
852 |
+
], [1, 10])
|
853 |
+
|
854 |
+
const action = tf.tensor([
|
855 |
+
0.1, -1, -0.4,
|
856 |
+
1, -0.8, -0.8, -0.2,
|
857 |
+
0.04, 0.02, 0.001
|
858 |
+
], [1, 10])
|
859 |
+
|
860 |
+
const fresh = new AgentSac({ prefix: 'test', forced: true })
|
861 |
+
await fresh.init()
|
862 |
+
await fresh.checkpoint()
|
863 |
+
|
864 |
+
const saved = new AgentSac({ prefix: 'test' })
|
865 |
+
await saved.init()
|
866 |
+
|
867 |
+
let frPred, saPred
|
868 |
+
|
869 |
+
frPred = fresh.actor.predict(state, {batchSize: 1})
|
870 |
+
saPred = saved.actor.predict(state, {batchSize: 1})
|
871 |
+
console.assert(
|
872 |
+
frPred[0].arraySync().length > 0 &&
|
873 |
+
frPred[1].arraySync().length > 0 &&
|
874 |
+
frPred[0].arraySync().join(';') === saPred[0].arraySync().join(';') &&
|
875 |
+
frPred[1].arraySync().join(';') === saPred[1].arraySync().join(';'),
|
876 |
+
'Models loaded from the checkpoint should be the same')
|
877 |
+
|
878 |
+
frPred = fresh.q1.predict([state, action], {batchSize: 1})
|
879 |
+
saPred = fresh.q1Targ.predict([state, action], {batchSize: 1})
|
880 |
+
console.assert(
|
881 |
+
frPred.arraySync()[0][0] !== undefined &&
|
882 |
+
frPred.arraySync()[0][0] === saPred.arraySync()[0][0],
|
883 |
+
'Q1 and Q1-target should be the same')
|
884 |
+
|
885 |
+
frPred = fresh.q2.predict([state, action], {batchSize: 1})
|
886 |
+
saPred = saved.q2.predict([state, action], {batchSize: 1})
|
887 |
+
console.assert(
|
888 |
+
frPred.arraySync()[0][0] !== undefined &&
|
889 |
+
frPred.arraySync()[0][0] === saPred.arraySync()[0][0],
|
890 |
+
'Q and Q restored should be the same')
|
891 |
+
|
892 |
+
console.assert(
|
893 |
+
fresh._logAlpha.arraySync() !== undefined &&
|
894 |
+
fresh._logAlpha.arraySync() === fresh._logAlpha.arraySync(),
|
895 |
+
'Q and Q restored should be the same')
|
896 |
+
})()
|
897 |
+
})()
|
index.html
ADDED
@@ -0,0 +1,823 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
5 |
+
|
6 |
+
<title>The AI Creature</title>
|
7 |
+
|
8 |
+
<!-- Babylon.js -->
|
9 |
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.6.2/dat.gui.min.js"></script>
|
10 |
+
<script src="https://preview.babylonjs.com/ammo.js"></script>
|
11 |
+
<script src="https://preview.babylonjs.com/cannon.js"></script>
|
12 |
+
<script src="https://preview.babylonjs.com/Oimo.js"></script>
|
13 |
+
<script src="https://preview.babylonjs.com/earcut.min.js"></script>
|
14 |
+
<script src="https://preview.babylonjs.com/babylon.js"></script>
|
15 |
+
<script src="https://preview.babylonjs.com/materialsLibrary/babylonjs.materials.min.js"></script>
|
16 |
+
<script src="https://preview.babylonjs.com/proceduralTexturesLibrary/babylonjs.proceduralTextures.min.js"></script>
|
17 |
+
<script src="https://preview.babylonjs.com/postProcessesLibrary/babylonjs.postProcess.min.js"></script>
|
18 |
+
<script src="https://preview.babylonjs.com/loaders/babylonjs.loaders.js"></script>
|
19 |
+
<script src="https://preview.babylonjs.com/serializers/babylonjs.serializers.min.js"></script>
|
20 |
+
<script src="https://preview.babylonjs.com/gui/babylon.gui.min.js"></script>
|
21 |
+
<script src="https://preview.babylonjs.com/inspector/babylon.inspector.bundle.js"></script>
|
22 |
+
|
23 |
+
<!-- tf.js -->
|
24 |
+
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.12.0/dist/tf.min.js"></script>
|
25 |
+
|
26 |
+
<script src="agent_sac.js"></script>
|
27 |
+
|
28 |
+
<style>
|
29 |
+
html, body {
|
30 |
+
overflow: hidden;
|
31 |
+
width: 100%;
|
32 |
+
height: 100%;
|
33 |
+
margin: 0;
|
34 |
+
padding: 0;
|
35 |
+
}
|
36 |
+
|
37 |
+
#renderCanvas {
|
38 |
+
width: 100%;
|
39 |
+
height: 100%;
|
40 |
+
touch-action: none;
|
41 |
+
}
|
42 |
+
|
43 |
+
#testCanvas0 {
|
44 |
+
position:absolute;
|
45 |
+
width: 128px;
|
46 |
+
height: 128px;
|
47 |
+
right:600px;
|
48 |
+
bottom: 0;
|
49 |
+
}
|
50 |
+
|
51 |
+
#testCanvas1 {
|
52 |
+
position:absolute;
|
53 |
+
width: 128px;
|
54 |
+
height: 128px;
|
55 |
+
right:450px;
|
56 |
+
bottom: 0;
|
57 |
+
}
|
58 |
+
|
59 |
+
#testCanvas2 {
|
60 |
+
position:absolute;
|
61 |
+
width: 128px;
|
62 |
+
height: 128px;
|
63 |
+
right: 300px;
|
64 |
+
bottom: 0;
|
65 |
+
}
|
66 |
+
|
67 |
+
#testCanvas3 {
|
68 |
+
position: absolute;
|
69 |
+
width: 128px;
|
70 |
+
height: 128px;
|
71 |
+
right: 150px;
|
72 |
+
bottom: 0;
|
73 |
+
}
|
74 |
+
|
75 |
+
#testCanvas4 {
|
76 |
+
position: absolute;
|
77 |
+
width: 128px;
|
78 |
+
height: 128px;
|
79 |
+
right: 0px;
|
80 |
+
bottom: 0;
|
81 |
+
}
|
82 |
+
|
83 |
+
|
84 |
+
/* #votes {
|
85 |
+
position: absolute;
|
86 |
+
border: 1px solid black;
|
87 |
+
bottom: 200px;
|
88 |
+
right: 0px;
|
89 |
+
|
90 |
+
width: 100px;
|
91 |
+
height: 150px;
|
92 |
+
} */
|
93 |
+
|
94 |
+
.vote {
|
95 |
+
position: absolute;
|
96 |
+
width: 60px;
|
97 |
+
height: 60px;
|
98 |
+
right: 10px;
|
99 |
+
}
|
100 |
+
|
101 |
+
.vote:hover {
|
102 |
+
cursor: pointer;
|
103 |
+
}
|
104 |
+
|
105 |
+
#like {
|
106 |
+
bottom: 200px;
|
107 |
+
}
|
108 |
+
|
109 |
+
#dislike {
|
110 |
+
bottom: 120px;
|
111 |
+
-webkit-transform: scaleX(-1);
|
112 |
+
transform: scaleX(-1);
|
113 |
+
}
|
114 |
+
</style>
|
115 |
+
</head>
|
116 |
+
<body>
|
117 |
+
<canvas id="renderCanvas"></canvas>
|
118 |
+
<canvas id="testCanvas0"></canvas>
|
119 |
+
<canvas id="testCanvas1"></canvas>
|
120 |
+
<canvas id="testCanvas2"></canvas>
|
121 |
+
<canvas id="testCanvas3"></canvas>
|
122 |
+
<canvas id="testCanvas4"></canvas>
|
123 |
+
|
124 |
+
<!-- <div id="votes"> -->
|
125 |
+
<div class="vote" id="like">
|
126 |
+
<img src="data:image/png;base64,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" alt="like">
|
127 |
+
</div>
|
128 |
+
<div class="vote" id="dislike">
|
129 |
+
<img src="data:image/png;base64,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" alt="">
|
130 |
+
</div>
|
131 |
+
<!-- </div> -->
|
132 |
+
|
133 |
+
<script>
|
134 |
+
|
135 |
+
window.engine = null;
|
136 |
+
window.scene = null;
|
137 |
+
window.sceneToRender = null;
|
138 |
+
|
139 |
+
const agent = new AgentSac({trainable: false, verbose: false})
|
140 |
+
|
141 |
+
const canvas = document.getElementById("renderCanvas");
|
142 |
+
const createDefaultEngine = () => new BABYLON.Engine(canvas, true, {
|
143 |
+
preserveDrawingBuffer: true,
|
144 |
+
stencil: true,
|
145 |
+
disableWebGL2Support: false
|
146 |
+
})
|
147 |
+
|
148 |
+
window.vote = 0
|
149 |
+
document.getElementById("like").addEventListener("click", () => {
|
150 |
+
// if (!transitions.length) return
|
151 |
+
|
152 |
+
window.reward = 1
|
153 |
+
// transitions[transitions.length - 1].reward += reward
|
154 |
+
// globalReward += reward
|
155 |
+
// console.log('reward like: ', transitions[transitions.length - 1].reward, globalReward)
|
156 |
+
})
|
157 |
+
|
158 |
+
document.getElementById("dislike").addEventListener("click", () => {
|
159 |
+
// if (!transitions.length) return
|
160 |
+
|
161 |
+
window.reward = -1
|
162 |
+
// transitions[transitions.length - 1].reward += reward
|
163 |
+
// globalReward += reward
|
164 |
+
// console.log('reward dislike: ', transitions[transitions.length - 1].reward, globalReward)
|
165 |
+
})
|
166 |
+
|
167 |
+
window.transitions = []
|
168 |
+
window.globalReward = 0
|
169 |
+
const BINOCULAR = true
|
170 |
+
|
171 |
+
const createScene = async () => {
|
172 |
+
await agent.init()
|
173 |
+
|
174 |
+
|
175 |
+
|
176 |
+
// This creates a basic Babylon Scene object (non-mesh)
|
177 |
+
const scene = new BABYLON.Scene(engine);
|
178 |
+
scene.collisionsEnabled = true
|
179 |
+
|
180 |
+
// Environment
|
181 |
+
const hdrTexture = BABYLON.CubeTexture.CreateFromPrefilteredData("3d/env/environment.dds", scene);
|
182 |
+
hdrTexture.name = "envTex";
|
183 |
+
hdrTexture.gammaSpace = false;
|
184 |
+
scene.environmentTexture = hdrTexture;
|
185 |
+
|
186 |
+
const skybox = BABYLON.MeshBuilder.CreateBox("skyBox", {size:1000.0}, scene);
|
187 |
+
const skyboxMaterial = new BABYLON.StandardMaterial("skyBox", scene);
|
188 |
+
skyboxMaterial.backFaceCulling = false;
|
189 |
+
skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("3d/env/skybox", scene);
|
190 |
+
skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
|
191 |
+
skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
|
192 |
+
skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
|
193 |
+
skybox.material = skyboxMaterial;
|
194 |
+
|
195 |
+
//CAMERA
|
196 |
+
const camera = new BABYLON.ArcRotateCamera("Camera", BABYLON.Tools.ToRadians(-120), BABYLON.Tools.ToRadians(80), 65, new BABYLON.Vector3(0, -15, 0), scene);
|
197 |
+
camera.attachControl(canvas, true);
|
198 |
+
camera.lowerRadiusLimit = 10;
|
199 |
+
camera.upperRadiusLimit = 120;
|
200 |
+
camera.collisionRadius = new BABYLON.Vector3(2, 2, 2);
|
201 |
+
camera.checkCollisions = true;
|
202 |
+
|
203 |
+
//enable Physics in the scene vector = gravity
|
204 |
+
scene.enablePhysics(new BABYLON.Vector3(0, 0, 0), new BABYLON.AmmoJSPlugin(false));
|
205 |
+
|
206 |
+
const physicsEngine = scene.getPhysicsEngine()
|
207 |
+
// physicsEngine.setSubTimeStep(physicsEngine.getTimeStep()/3 * 1000)
|
208 |
+
physicsEngine.setTimeStep(1 / 60)
|
209 |
+
physicsEngine.setSubTimeStep(1)
|
210 |
+
|
211 |
+
//LIGHTS
|
212 |
+
const light1 = new BABYLON.PointLight("light1", new BABYLON.Vector3(0, 5,-6), scene);
|
213 |
+
const light2 = new BABYLON.PointLight("light2", new BABYLON.Vector3(6, 5, 3.5), scene);
|
214 |
+
const light3 = new BABYLON.DirectionalLight("light3", new BABYLON.Vector3(20, -5, 20), scene);
|
215 |
+
light1.intensity = 15;
|
216 |
+
light2.intensity = 5;
|
217 |
+
|
218 |
+
engine.displayLoadingUI();
|
219 |
+
|
220 |
+
await Promise.all([
|
221 |
+
BABYLON.SceneLoader.AppendAsync("3d/marbleTower.glb"),
|
222 |
+
BABYLON.SceneLoader.AppendAsync("https://models.babylonjs.com/Marble/marble/marble.gltf")
|
223 |
+
])
|
224 |
+
scene.getMeshByName("marble").isVisible = false
|
225 |
+
|
226 |
+
const tower = scene.getMeshByName("tower");
|
227 |
+
tower.setParent(null)
|
228 |
+
tower.checkCollisions = true;
|
229 |
+
tower.impostor = new BABYLON.PhysicsImpostor(tower, BABYLON.PhysicsImpostor.MeshImpostor, {
|
230 |
+
mass: 0,
|
231 |
+
friction: 1
|
232 |
+
}, scene);
|
233 |
+
tower.material = scene.getMaterialByName("stone")
|
234 |
+
tower.material.backFaceCulling = false
|
235 |
+
|
236 |
+
|
237 |
+
/* CREATURE */
|
238 |
+
const creature = BABYLON.MeshBuilder.CreateSphere("creature", {diameter: 1, segments:32}, scene)
|
239 |
+
creature.parent = null
|
240 |
+
creature.setParent(null)
|
241 |
+
creature.position = new BABYLON.Vector3(0,-5,0)
|
242 |
+
|
243 |
+
creature.isPickable = false
|
244 |
+
|
245 |
+
const crMat = new BABYLON.StandardMaterial("cr_mat", scene);
|
246 |
+
crMat.alpha = 0 // for screenshots
|
247 |
+
creature.material = crMat
|
248 |
+
|
249 |
+
creature.impostor = new BABYLON.PhysicsImpostor(creature, BABYLON.PhysicsImpostor.SphereImpostor, {
|
250 |
+
mass: 1,
|
251 |
+
friction: 0,
|
252 |
+
stiffness: 0,
|
253 |
+
restitution: 0
|
254 |
+
}, scene)
|
255 |
+
|
256 |
+
BABYLON.ParticleHelper.SnippetUrl = "3d/snippet";
|
257 |
+
// Sparks
|
258 |
+
creature.sparks = await BABYLON.ParticleHelper.CreateFromSnippetAsync("UY098C-3.json", scene, false);
|
259 |
+
creature.sparks.emitter = creature;
|
260 |
+
// Core
|
261 |
+
creature.glow = await BABYLON.ParticleHelper.CreateFromSnippetAsync("EXUQ7M-5.json", scene, false);
|
262 |
+
creature.glow.emitter = creature;
|
263 |
+
|
264 |
+
/* CREATURE's CAMERA */
|
265 |
+
const crCameraLeft = new BABYLON.UniversalCamera("cr_camera_l", new BABYLON.Vector3(0, 0, 0), scene)
|
266 |
+
crCameraLeft.parent = creature
|
267 |
+
crCameraLeft.position = new BABYLON.Vector3(-0.5, 0, 0)//new BABYLON.Vector3(0, 5, -10)
|
268 |
+
crCameraLeft.fov = 2
|
269 |
+
crCameraLeft.setTarget(new BABYLON.Vector3(-1, 0, 0.6))
|
270 |
+
|
271 |
+
const crCameraRight = new BABYLON.UniversalCamera("cr_camera_r", new BABYLON.Vector3(0, 0, 0), scene)
|
272 |
+
crCameraRight.parent = creature
|
273 |
+
crCameraRight.position = new BABYLON.Vector3(0.5, 0, 0)//new BABYLON.Vector3(0, 5, -10)
|
274 |
+
crCameraRight.fov = 2
|
275 |
+
crCameraRight.setTarget(new BABYLON.Vector3(1, 0, 0.6))
|
276 |
+
|
277 |
+
|
278 |
+
|
279 |
+
const crCameraLeftPl = BABYLON.MeshBuilder.CreateSphere("crCameraLeftPl", {diameter: 0.1, segments: 32}, scene);
|
280 |
+
crCameraLeftPl.parent = creature
|
281 |
+
crCameraLeftPl.position = new BABYLON.Vector3(-0.5, 0, 0)
|
282 |
+
const crCameraLeftPlclMat = new BABYLON.StandardMaterial("crCameraLeftPlclMat", scene)
|
283 |
+
crCameraLeftPlclMat.alpha = 0.3 // for screenshots
|
284 |
+
crCameraLeftPlclMat.diffuseColor = new BABYLON.Color3(0, 0, 0)
|
285 |
+
crCameraLeftPl.material = crCameraLeftPlclMat
|
286 |
+
|
287 |
+
const crCameraRightPl = BABYLON.MeshBuilder.CreateSphere("crCameraRightPl", {diameter: 0.1, segments: 32}, scene);
|
288 |
+
crCameraRightPl.parent = creature
|
289 |
+
crCameraRightPl.position = new BABYLON.Vector3(0.5, 0, 0)
|
290 |
+
const crCameraRightPlclMat = new BABYLON.StandardMaterial("crCameraRightPlclMat", scene)
|
291 |
+
crCameraRightPlclMat.alpha = 0.3 // for screenshots
|
292 |
+
crCameraRightPlclMat.diffuseColor = new BABYLON.Color3(0, 0, 0)
|
293 |
+
crCameraRightPl.material = crCameraRightPlclMat
|
294 |
+
|
295 |
+
|
296 |
+
// crCameraLeft.rotation = new BABYLON.Vector3(0, -(Math.PI - 0.3), 0)
|
297 |
+
// crCameraLeft.fovMode = BABYLON.Camera.PERSPECTIVE_CAMERA;
|
298 |
+
// crCameraRight.rotation = new BABYLON.Vector3(0, +(Math.PI - 0.3), 0)
|
299 |
+
// crCameraRight.fovMode = BABYLON.Camera.FOVMODE_HORIZONTAL_FIXED;
|
300 |
+
|
301 |
+
// crCameraRight.checkCollisions = true;
|
302 |
+
// crCamera.rotation = (new BABYLON.Vector3(0.5, 0, 0))
|
303 |
+
// crCamera.ellipsoid = new BABYLON.Vector3(1, 1, 1);
|
304 |
+
// crCamera.ellipsoidOffset = new BABYLON.Vector3(3, 3, 3);
|
305 |
+
// creature.checkCollisions = true;
|
306 |
+
// scene.collisionsEnabled = true;
|
307 |
+
// crCamera.applyGravity = true;
|
308 |
+
|
309 |
+
// crCamera.fovMode = BABYLON.Camera.PERSPECTIVE_CAMERA;
|
310 |
+
// crCamera.fovMode = BABYLON.Camera.FOVMODE_HORIZONTAL_FIXED;
|
311 |
+
// crCamera.inertia = 2
|
312 |
+
// crCamera.setTarget(new BABYLON.Vector3(2, 0, 0))
|
313 |
+
// const crCameraMesh = BABYLON.MeshBuilder.CreateSphere("cr_camera_mesh", {diameter: 1, segments: 32}, scene);
|
314 |
+
// crCameraMesh.parent = crCamera
|
315 |
+
// crCameraMesh.isVisible = 1
|
316 |
+
|
317 |
+
|
318 |
+
/* CLIENT */
|
319 |
+
const client = BABYLON.MeshBuilder.CreateSphere("client", {diameter: 3, segments: 32}, scene);
|
320 |
+
client.parent = camera
|
321 |
+
client.setParent(camera)
|
322 |
+
// client.position = new BABYLON.Vector3(0, -12,0)
|
323 |
+
|
324 |
+
const clMat = new BABYLON.StandardMaterial("cl_mat", scene)
|
325 |
+
clMat.diffuseColor = new BABYLON.Color3(0, 0, 0)
|
326 |
+
client.material = clMat
|
327 |
+
|
328 |
+
engine.hideLoadingUI();
|
329 |
+
|
330 |
+
/* CAGE */
|
331 |
+
const cage = BABYLON.MeshBuilder.CreateSphere("cage", {
|
332 |
+
segements: 64,
|
333 |
+
diameter: 50
|
334 |
+
}, scene)
|
335 |
+
|
336 |
+
// const cage = BABYLON.MeshBuilder.CreateBox("cage", {
|
337 |
+
// width: 100,
|
338 |
+
// depth: 100,
|
339 |
+
// height: 40
|
340 |
+
// }, scene)
|
341 |
+
cage.parent = null
|
342 |
+
cage.setParent(null)
|
343 |
+
cage.position = new BABYLON.Vector3(0, -12,0)
|
344 |
+
cage.isPickable = true
|
345 |
+
|
346 |
+
const cageMat = new BABYLON.StandardMaterial("cage_mat", scene);
|
347 |
+
cageMat.alpha = 0.1 // for ray hit
|
348 |
+
cage.material = cageMat
|
349 |
+
cage.material.backFaceCulling = false
|
350 |
+
|
351 |
+
cage.impostor = new BABYLON.PhysicsImpostor(cage, BABYLON.PhysicsImpostor.MeshImpostor, {
|
352 |
+
mass: 0,
|
353 |
+
friction: 1
|
354 |
+
}, scene);
|
355 |
+
|
356 |
+
|
357 |
+
|
358 |
+
/* MIRROR */
|
359 |
+
/* const mirror = BABYLON.MeshBuilder.CreateBox("mirror", {
|
360 |
+
width: 10,
|
361 |
+
depth: 0.1,
|
362 |
+
height: 5
|
363 |
+
}, scene)
|
364 |
+
mirror.material = new BABYLON.StandardMaterial("mirror_mat", scene)
|
365 |
+
mirror.position = new BABYLON.Vector3(20, 0, 0)
|
366 |
+
// mirror.addRotation(0, Math.PI/2, 0)
|
367 |
+
mirror.isVisible = true
|
368 |
+
// How to use: mirror.material.diffuseTexture = new BABYLON.Texture(base64Data, scene) // timer ~1ms
|
369 |
+
*/
|
370 |
+
|
371 |
+
// const [ballRed, ballGreen, ballBlue, ballPurple, ballYellow] = ['red', 'green', 'blue', 'purple', 'yellow'].map(color => {
|
372 |
+
|
373 |
+
const ballPos = [[-10,-10,10], [10,-10,-10], [-10,-10,-10], [10,-10,10]]
|
374 |
+
// const balls = ['red', 'green', 'blue', 'purple'].map((color, i) => {
|
375 |
+
const balls = ['green', 'green', 'red', 'red'].map((color, i) => {
|
376 |
+
const ball = BABYLON.MeshBuilder.CreateSphere("ball_"+ color + i, {diameter: 7, segments: 64}, scene)
|
377 |
+
ball.position = new BABYLON.Vector3(...ballPos[i])
|
378 |
+
ball.parent = null
|
379 |
+
ball.setParent(null)
|
380 |
+
ball.isPickable = true
|
381 |
+
ball.impostor = new BABYLON.PhysicsImpostor(ball, BABYLON.PhysicsImpostor.SphereImpostor, {
|
382 |
+
mass: 7,
|
383 |
+
friction: 1,
|
384 |
+
stiffness: 1,
|
385 |
+
restitution: 1
|
386 |
+
}, scene);
|
387 |
+
ball.material = scene.getMaterialByName(color + "Mat")
|
388 |
+
ball.checkCollisions = true
|
389 |
+
ball.material.backFaceCulling = false
|
390 |
+
|
391 |
+
return ball
|
392 |
+
})
|
393 |
+
|
394 |
+
// balls[0].position = new BABYLON.Vector3(10, 0, 0)
|
395 |
+
|
396 |
+
/* SHuffle */
|
397 |
+
// scene.onPointerDown = function(evt, pickInfo) {
|
398 |
+
// if(pickInfo.hit && pickInfo.pickedMesh.id.startsWith('cage')) {
|
399 |
+
// const getRand = () => new BABYLON.Vector3(Math.random()/10 - 0.1, Math.random()/10 - 0.1, Math.random()/10 - 0.1)
|
400 |
+
|
401 |
+
// balls.forEach(ball => ball.impostor.applyImpulse(getRand(), BABYLON.Vector3.Zero()))
|
402 |
+
// }
|
403 |
+
// }
|
404 |
+
|
405 |
+
// setInterval(()=>{
|
406 |
+
// const getRand = () => new BABYLON.Vector3(Math.random()/10 - 0.1, Math.random()/10 - 0.1, Math.random()/10 - 0.1)
|
407 |
+
|
408 |
+
// balls.forEach(ball => ball.impostor.applyImpulse(getRand(), BABYLON.Vector3.Zero()))
|
409 |
+
// }, 1000)
|
410 |
+
|
411 |
+
|
412 |
+
// ballRed.impostor.applyImpulse(new BABYLON.Vector3(0, -20, 0), BABYLON.Vector3.Zero())
|
413 |
+
// ballGr.impostor.applyImpulse(new BABYLON.Vector3(0, -20, 0), BABYLON.Vector3.Zero())
|
414 |
+
|
415 |
+
|
416 |
+
/* WORKER */
|
417 |
+
const worker = new Worker('worker.js')
|
418 |
+
let inited = false
|
419 |
+
worker.addEventListener('message', e => {
|
420 |
+
const { weights, frame } = e.data
|
421 |
+
|
422 |
+
tf.tidy(() => {
|
423 |
+
if (weights) {
|
424 |
+
inited = true
|
425 |
+
agent.actor.setWeights(weights.map(w => tf.tensor(w))) // timer ~30ms
|
426 |
+
if (Math.random() > 0.99) console.log('weights:', weights)
|
427 |
+
}
|
428 |
+
|
429 |
+
})
|
430 |
+
})
|
431 |
+
|
432 |
+
/* COLLISIONS DETECTION */
|
433 |
+
const impostors = scene.getPhysicsEngine()._impostors.filter(im => im.object.id !== creature.id)
|
434 |
+
creature.impostor.registerOnPhysicsCollide(impostors, (body1, body2) => {})
|
435 |
+
impostors.forEach(impostor => {
|
436 |
+
impostor.onCollide = e => {
|
437 |
+
if (window.onCollide) {
|
438 |
+
const collision = e.point.subtract(creature.position).normalize()
|
439 |
+
window.onCollide(collision, impostor.object.id)
|
440 |
+
}
|
441 |
+
}
|
442 |
+
})
|
443 |
+
|
444 |
+
// ;(() => {
|
445 |
+
// let coll
|
446 |
+
// creature.impostor.onCollide = e => {
|
447 |
+
// coll = e.point.subtract(creature.position).normalize()
|
448 |
+
// console.log('crea', coll)
|
449 |
+
// if (window.onCollide)
|
450 |
+
// window.onCollide(coll)
|
451 |
+
// }
|
452 |
+
|
453 |
+
// balls.forEach(ball => {
|
454 |
+
// ball.impostor.onCollide = e => {
|
455 |
+
// const collision = e.point.subtract(creature.position).normalize()
|
456 |
+
// console.log('crea ball', coll, collision)
|
457 |
+
|
458 |
+
// if (window.onCollide)
|
459 |
+
// window.onCollide(collision, ball.id)
|
460 |
+
|
461 |
+
// // if (ball.id.endsWith('_red'))
|
462 |
+
// console.log('onCollide mesh:', ball.id)
|
463 |
+
// }
|
464 |
+
// })
|
465 |
+
// })()
|
466 |
+
|
467 |
+
|
468 |
+
|
469 |
+
const base64ToImg = (base64) => new Promise((res, _) => {
|
470 |
+
const img = new Image()
|
471 |
+
img.src = base64
|
472 |
+
img.onload = () => res(img)
|
473 |
+
})
|
474 |
+
const TRANSITIONS_BUFFER_SIZE = 2
|
475 |
+
const frameEvery = 1000/30 // ~33ms ~24frames/sec
|
476 |
+
const frameStack = []
|
477 |
+
// const transitions = []
|
478 |
+
|
479 |
+
// let start = Date.now() + frameEvery
|
480 |
+
let timer = Date.now()
|
481 |
+
let busy = false
|
482 |
+
let stateId = 0
|
483 |
+
|
484 |
+
let prevLinearVelocity = BABYLON.Vector3.Zero()
|
485 |
+
window.collision = BABYLON.Vector3.Zero()
|
486 |
+
window.reward = 0
|
487 |
+
window.globalReward = 0
|
488 |
+
// let collisionMesh = null
|
489 |
+
|
490 |
+
const testLayer = agent.actor.layers[4]
|
491 |
+
const spy = tf.model({inputs: agent.actor.inputs, outputs: testLayer.output})
|
492 |
+
|
493 |
+
scene.registerAfterRender(async () => { // timer ~ 20-90ms
|
494 |
+
if (/*Date.now() < start || */busy || !inited) return
|
495 |
+
|
496 |
+
// const delta = (Date.now() - timestamp) / 1000 // sec
|
497 |
+
// timestamp = Date.now()
|
498 |
+
// start = Date.now() + frameEvery
|
499 |
+
busy = true
|
500 |
+
|
501 |
+
// const timerLbl = 'TimerLabel-' + start
|
502 |
+
|
503 |
+
/*
|
504 |
+
console.time(timerLbl)
|
505 |
+
console.timeEnd(timerLbl)
|
506 |
+
console.log('numTensors BEFORE: ' + tf.memory().numTensors)
|
507 |
+
console.log('numTensors AFTER: ' + tf.memory().numTensors)
|
508 |
+
*/
|
509 |
+
|
510 |
+
|
511 |
+
|
512 |
+
|
513 |
+
|
514 |
+
|
515 |
+
|
516 |
+
// const screenShots = []
|
517 |
+
// screenShots.push(
|
518 |
+
// BABYLON.Tools.CreateScreenshotUsingRenderTargetAsync(engine, crCameraLeft, { // ~ 7-60ms
|
519 |
+
// height: agent._frameShape[0],
|
520 |
+
// width: agent._frameShape[1]
|
521 |
+
// })
|
522 |
+
// )
|
523 |
+
// screenShots.push(
|
524 |
+
// BABYLON.Tools.CreateScreenshotUsingRenderTargetAsync(engine, crCameraRight, { // ~ 7-60ms
|
525 |
+
// height: agent._frameShape[0],
|
526 |
+
// width: agent._frameShape[1]
|
527 |
+
// })
|
528 |
+
// )
|
529 |
+
// const base64Data = await Promise.all(screenShots)
|
530 |
+
// frameStack.push(base64Data)
|
531 |
+
|
532 |
+
|
533 |
+
|
534 |
+
|
535 |
+
//delay
|
536 |
+
if (!frameStack.length) {
|
537 |
+
frameStack.push([
|
538 |
+
await BABYLON.Tools.CreateScreenshotUsingRenderTargetAsync(engine, crCameraLeft, { // ~ 7-60ms
|
539 |
+
height: agent._frameShape[0],
|
540 |
+
width: agent._frameShape[1]
|
541 |
+
})
|
542 |
+
])
|
543 |
+
} else {
|
544 |
+
frameStack[0].push(
|
545 |
+
await BABYLON.Tools.CreateScreenshotUsingRenderTargetAsync(engine, crCameraRight, { // ~ 7-60ms
|
546 |
+
height: agent._frameShape[0],
|
547 |
+
width: agent._frameShape[1]
|
548 |
+
})
|
549 |
+
)
|
550 |
+
}
|
551 |
+
|
552 |
+
|
553 |
+
|
554 |
+
|
555 |
+
if (frameStack.length >= agent._nFrames && frameStack[0].length == 2) { // ~20ms
|
556 |
+
if (frameStack.length > agent._nFrames)
|
557 |
+
throw new Error("(⊙_⊙')")
|
558 |
+
|
559 |
+
const imgs = await Promise.all(frameStack.flat().map(fr => base64ToImg(fr)))
|
560 |
+
|
561 |
+
const framesNorm = tf.tidy(() => {
|
562 |
+
const greyScaler = tf.tensor([0.299, 0.587, 0.114], [1, 1, 3])
|
563 |
+
let imgTensors = imgs.map(img => tf.browser.fromPixels(img)
|
564 |
+
//.mul(greyScaler).sum(-1, true)
|
565 |
+
)
|
566 |
+
|
567 |
+
// optic chiasma
|
568 |
+
// imgTensors = imgTensors.map(img => tf.split(img, 2, 1))
|
569 |
+
// for (let i = 0; i < imgTensors.length; i = i + 2) {
|
570 |
+
// const first = tf.concat([imgTensors[i][0], imgTensors[i+1][0]], -1)
|
571 |
+
// const second = tf.concat([imgTensors[i][1], imgTensors[i+1][1]], -1)
|
572 |
+
// imgTensors[i] = first
|
573 |
+
// imgTensors[i+1] = second
|
574 |
+
// }
|
575 |
+
|
576 |
+
// imgTensors = [
|
577 |
+
// imgTensors[0].concat(imgTensors[1], 1),
|
578 |
+
// //imgTensors[2].concat(imgTensors[3], 1)
|
579 |
+
// ]
|
580 |
+
|
581 |
+
|
582 |
+
// if (collisionMesh) {
|
583 |
+
imgTensors = imgTensors.map((t, i) => {
|
584 |
+
const canv = document.getElementById('testCanvas' + (i+3))
|
585 |
+
if (canv) {
|
586 |
+
tf.browser.toPixels(t, canv) // timer ~1ms
|
587 |
+
}
|
588 |
+
return t
|
589 |
+
.sub(255/2)
|
590 |
+
.div(255/2)
|
591 |
+
})
|
592 |
+
// }
|
593 |
+
|
594 |
+
const resL = tf.concat(imgTensors.filter((el, i) => i%2==0), -1)
|
595 |
+
const resR = tf.concat(imgTensors.filter((el, i) => i%2==1), -1)
|
596 |
+
return [resL, resR]
|
597 |
+
|
598 |
+
// return [tf.concat(imgTensors, -1)]
|
599 |
+
|
600 |
+
// let frTest = tf.unstack(res, -1)
|
601 |
+
// // frTest = [tf.concat(frTest.slice(0,3), -1), tf.concat(frTest.slice(3), -1)]
|
602 |
+
// console.log(frTest[0].arraySync()[30][0][0], frTest[3].arraySync()[30][0][0])
|
603 |
+
|
604 |
+
// console.log(tf.concat(tf.unstack(tf.concat(imgTensors, 2), -1), -1).arraySync()[30][0][0])
|
605 |
+
|
606 |
+
})
|
607 |
+
const framesBatch = framesNorm.map(fr => tf.stack([fr]))
|
608 |
+
|
609 |
+
const delta = (Date.now() - timer) / 1000 // sec
|
610 |
+
console.log('delta (s)', delta)
|
611 |
+
const linearVelocity = creature.impostor.getLinearVelocity()
|
612 |
+
const linearVelocityNorm = linearVelocity.normalize()
|
613 |
+
const acceleration = linearVelocity.subtract(prevLinearVelocity).scale(1/delta).normalize()
|
614 |
+
|
615 |
+
timer = Date.now()
|
616 |
+
prevLinearVelocity = linearVelocity
|
617 |
+
|
618 |
+
const ray = new BABYLON.Ray(creature.position, linearVelocityNorm)
|
619 |
+
const hit = scene.pickWithRay(ray)
|
620 |
+
let lidar = 0
|
621 |
+
if (hit.pickedMesh) {
|
622 |
+
lidar = Math.tanh((hit.distance - creature.impostor.getRadius())/10) // stretch tanh by 10 for precision
|
623 |
+
// console.log('Hit: ', hit.pickedMesh.name, hit.distance, lidar, linearVelocity, collision)
|
624 |
+
}
|
625 |
+
|
626 |
+
const telemetry = [
|
627 |
+
linearVelocityNorm.x,
|
628 |
+
linearVelocityNorm.y,
|
629 |
+
linearVelocityNorm.z,
|
630 |
+
acceleration.x,
|
631 |
+
acceleration.y,
|
632 |
+
acceleration.z,
|
633 |
+
window.collision.x,
|
634 |
+
window.collision.y,
|
635 |
+
window.collision.z,
|
636 |
+
lidar
|
637 |
+
]
|
638 |
+
const reward = window.reward
|
639 |
+
|
640 |
+
//collisionMesh &&
|
641 |
+
// if (collisionMesh && transitions.length) {
|
642 |
+
// tf.tidy(() => {
|
643 |
+
// let frTest = tf.unstack(tf.tensor(transitions[transitions.length - 1].state[1], [64,128, agent._nFrames]), -1)
|
644 |
+
// // frTest = [tf.stack(frTest.slice(0,3), -1), tf.stack(frTest.slice(3), -1)]
|
645 |
+
// let i = 0
|
646 |
+
// for (const fr of frTest) {
|
647 |
+
// i++
|
648 |
+
// tf.browser.toPixels(fr, document.getElementById('testCanvas' + i)) // timer ~1ms
|
649 |
+
// }
|
650 |
+
// })
|
651 |
+
// }
|
652 |
+
|
653 |
+
window.collision = BABYLON.Vector3.Zero() // reset collision point
|
654 |
+
window.reward = -0.01
|
655 |
+
window.onCollide = undefined
|
656 |
+
const telemetryBatch = tf.tensor(telemetry, [1, agent._nTelemetry])
|
657 |
+
const action = agent.sampleAction([telemetryBatch, ...framesBatch]) // timer ~5ms
|
658 |
+
|
659 |
+
|
660 |
+
// TODO: !!!!!await find the way to avoid framesNorm.array()
|
661 |
+
console.time('await')
|
662 |
+
const [framesArrL, framesArrR,[actionArr]] = await Promise.all([...(framesNorm.map(fr => fr.array())), action.array()]) // action come as a batch of size 1
|
663 |
+
console.timeEnd('await')
|
664 |
+
// DEBUG Conv encoder
|
665 |
+
tf.tidy(() => { // timer ~2.5ms
|
666 |
+
const testOutput = spy.predict([telemetryBatch, ...framesBatch], {batchSize: 1})
|
667 |
+
console.log('spy', testLayer.name, testOutput.arraySync())
|
668 |
+
|
669 |
+
return
|
670 |
+
|
671 |
+
let tiles = tf.clipByValue(tf.squeeze(testOutput), 0, 1)
|
672 |
+
tiles = tf.transpose(tiles, [2,0,1])
|
673 |
+
tiles = tf.unstack(tiles)
|
674 |
+
|
675 |
+
let res = [], line = []
|
676 |
+
for (const [i, tile] of tiles.entries()) {
|
677 |
+
line.push(tile)
|
678 |
+
if ((i+1) % 8 == 0 && i) {
|
679 |
+
res.push(tf.concat(line, 1))
|
680 |
+
line = []
|
681 |
+
}
|
682 |
+
}
|
683 |
+
const testFr = tf.concat(res)
|
684 |
+
tf.browser.toPixels(testFr, document.getElementById('testCanvas2')) // timer ~1ms
|
685 |
+
})
|
686 |
+
|
687 |
+
const
|
688 |
+
impulse = actionArr.slice(0, 3)//.map(el => el/10)//, // [0,-1, 0], //
|
689 |
+
// rotation = actionArr.slice(3, 7).map(el => el),
|
690 |
+
// color = actionArr.slice(3, 6).map(el => el)/.map(el => el) // [-1,1] => [0,2] => [0, 255]
|
691 |
+
// look = actionArr.slice(3, 6)
|
692 |
+
|
693 |
+
// console.log('tel tel: ', telemetry.map(t=> t.toFixed(3)))
|
694 |
+
// console.log('tel imp:', impulse.map(t=> t.toFixed(3)))
|
695 |
+
|
696 |
+
console.assert(actionArr.length === 3, actionArr.length)
|
697 |
+
console.assert(impulse.length === 3)
|
698 |
+
// console.assert(look.length === 3)
|
699 |
+
// console.assert(rotation.length === 4)
|
700 |
+
// console.assert(color.length === 3)
|
701 |
+
|
702 |
+
// [0,-1,0]
|
703 |
+
creature.impostor.setAngularVelocity(BABYLON.Quaternion.Zero()) // just in case, probably redundant
|
704 |
+
// creature.impostor.setLinearVelocity(BABYLON.Vector3.Zero()) // contact point zero
|
705 |
+
creature.impostor.applyImpulse(new BABYLON.Vector3(...impulse), creature.getAbsolutePosition()) // contact point zero
|
706 |
+
creature.impostor.setAngularVelocity(BABYLON.Quaternion.Zero())
|
707 |
+
// creature.glow.color2 = new BABYLON.Color4(...color)
|
708 |
+
|
709 |
+
// after applyImpulse the linear velocity is recalculated right away
|
710 |
+
const newLinearVelocity = creature.impostor.getLinearVelocity().normalize()
|
711 |
+
// creature.lookAt(new BABYLON.Vector3(0, -1, 0), 0, 0, 0, BABYLON.Space.LOCAL)
|
712 |
+
creature.lookAt(creature.position.add(newLinearVelocity))
|
713 |
+
//if (!window.rr) window.rr =
|
714 |
+
// creature.lookAt(creature.position.add(new BABYLON.Vector3(0,1,0)))
|
715 |
+
|
716 |
+
const transtion = {
|
717 |
+
id: stateId++,
|
718 |
+
state: [telemetry, framesArrL, framesArrR], // 20ms vs 50ms || size 200kb vs 1.5mb
|
719 |
+
action: actionArr,
|
720 |
+
reward
|
721 |
+
}
|
722 |
+
transitions.push(transtion)
|
723 |
+
|
724 |
+
window.onCollide = (collision, mesh) => {
|
725 |
+
window.collision = collision
|
726 |
+
window.reward += -0.05
|
727 |
+
|
728 |
+
if (mesh.startsWith('ball_')) {
|
729 |
+
console.log('reward', mesh)
|
730 |
+
window.reward = 1
|
731 |
+
|
732 |
+
if (mesh.includes('red'))
|
733 |
+
window.reward = -1
|
734 |
+
}
|
735 |
+
|
736 |
+
window.onCollide = undefined
|
737 |
+
}
|
738 |
+
|
739 |
+
if (transitions.length >= TRANSITIONS_BUFFER_SIZE) {
|
740 |
+
if (transitions.length > TRANSITIONS_BUFFER_SIZE || TRANSITIONS_BUFFER_SIZE < 2)
|
741 |
+
throw new Error("(⊙_⊙')")
|
742 |
+
|
743 |
+
const transition = transitions.shift()
|
744 |
+
|
745 |
+
// if (transition.reward > 0) {
|
746 |
+
// transition.priority = 7
|
747 |
+
// console.log('reward prio:', transition, transition.state[0])
|
748 |
+
// }
|
749 |
+
window.globalReward += transition.reward
|
750 |
+
console.log('reward', transition.reward, window.globalReward)
|
751 |
+
|
752 |
+
|
753 |
+
worker.postMessage({action: 'newTransition', transition}) // timer ~ 6ms
|
754 |
+
|
755 |
+
}
|
756 |
+
|
757 |
+
// imgTensors.forEach(t => t.dispose())
|
758 |
+
// frames.dispose()
|
759 |
+
framesNorm.map(fr => fr.dispose())
|
760 |
+
framesBatch.map(fr => fr.dispose())
|
761 |
+
telemetryBatch.dispose()
|
762 |
+
action.dispose()
|
763 |
+
|
764 |
+
// if (stateId%1 == 0)
|
765 |
+
// frameStack.forEach((base64Data, i) => {
|
766 |
+
// const img = new Image()
|
767 |
+
// img.onload = () => document.getElementById('testCanvas' + (i+2))
|
768 |
+
// .getContext('2d')
|
769 |
+
// .drawImage(img, 0, 0, 256, 128)
|
770 |
+
// img.src = base64Data
|
771 |
+
// })
|
772 |
+
|
773 |
+
frameStack.length = 0 // I will regret about this :D
|
774 |
+
}
|
775 |
+
|
776 |
+
//mirror.material.diffuseTexture = new BABYLON.Texture(base64Data, scene) // timer ~1ms
|
777 |
+
|
778 |
+
// const img = await base64ToImg(base64Data) // timer ~2-12ms
|
779 |
+
// const tensor = tf.browser.fromPixels(img) // timer ~ 1ms
|
780 |
+
// const arr = await tensor.array() // timer ~ 6-15ms
|
781 |
+
// worker.postMessage(arr) // timer ~ 6ms
|
782 |
+
// tensor.dispose()
|
783 |
+
|
784 |
+
busy = false
|
785 |
+
})
|
786 |
+
|
787 |
+
return scene
|
788 |
+
};
|
789 |
+
|
790 |
+
window.initFunction = async function() {
|
791 |
+
await Ammo();
|
792 |
+
|
793 |
+
const asyncEngineCreation = async function() {
|
794 |
+
try {
|
795 |
+
return createDefaultEngine();
|
796 |
+
} catch(e) {
|
797 |
+
console.log("the available createEngine function failed. Creating the default engine instead");
|
798 |
+
return createDefaultEngine();
|
799 |
+
}
|
800 |
+
}
|
801 |
+
|
802 |
+
window.engine = await asyncEngineCreation();
|
803 |
+
|
804 |
+
if (!engine) throw 'engine should not be null.';
|
805 |
+
|
806 |
+
window.scene = await createScene();
|
807 |
+
};
|
808 |
+
|
809 |
+
initFunction().then(() => {
|
810 |
+
sceneToRender = scene;
|
811 |
+
engine.runRenderLoop(function () {
|
812 |
+
if (sceneToRender && sceneToRender.activeCamera) {
|
813 |
+
sceneToRender.render();
|
814 |
+
}
|
815 |
+
});
|
816 |
+
});
|
817 |
+
|
818 |
+
window.addEventListener("resize", function () {
|
819 |
+
engine.resize();
|
820 |
+
});
|
821 |
+
</script>
|
822 |
+
</body>
|
823 |
+
</html>
|
reply_buffer.js
ADDED
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* Returns a random integer between min (inclusive) and max (inclusive).
|
3 |
+
* The value is no lower than min (or the next integer greater than min
|
4 |
+
* if min isn't an integer) and no greater than max (or the next integer
|
5 |
+
* lower than max if max isn't an integer).
|
6 |
+
* Using Math.round() will give you a non-uniform distribution!
|
7 |
+
* https://stackoverflow.com/questions/1527803/generating-random-whole-numbers-in-javascript-in-a-specific-range
|
8 |
+
*/
|
9 |
+
const getRandomInt = (min, max) => {
|
10 |
+
min = Math.ceil(min)
|
11 |
+
max = Math.floor(max)
|
12 |
+
return Math.floor(Math.random() * (max - min + 1)) + min
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Reply Buffer.
|
17 |
+
*/
|
18 |
+
class ReplyBuffer {
|
19 |
+
/**
|
20 |
+
* Constructor.
|
21 |
+
*
|
22 |
+
* @param {*} limit maximum number of transitions
|
23 |
+
* @param {*} onDiscard callback triggered on discard a transition
|
24 |
+
*/
|
25 |
+
constructor(limit = 500, onDiscard = () => {}) {
|
26 |
+
this._limit = limit
|
27 |
+
this._onDiscard = onDiscard
|
28 |
+
|
29 |
+
this._buffer = new Array(limit).fill()
|
30 |
+
this._pool = []
|
31 |
+
|
32 |
+
this.size = 0
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Add a new transition to the reply buffer.
|
37 |
+
* Transition doesn't contain the next state. The next state is derived when sampling.
|
38 |
+
*
|
39 |
+
* @param {{id: number, priority: number, state: array, action, reward: number}} transition transition
|
40 |
+
*/
|
41 |
+
add(transition) {
|
42 |
+
let { id, priority = 1 } = transition
|
43 |
+
if (id === undefined || id < 0 || priority < 1)
|
44 |
+
throw new Error('Invalid arguments')
|
45 |
+
|
46 |
+
id = id % this._limit
|
47 |
+
|
48 |
+
if (this._buffer[id]) {
|
49 |
+
const start = this._pool.indexOf(id)
|
50 |
+
let deleteCount = 0
|
51 |
+
while (this._pool[start + deleteCount] == id)
|
52 |
+
deleteCount++
|
53 |
+
|
54 |
+
this._pool.splice(start, deleteCount)
|
55 |
+
|
56 |
+
this._onDiscard(this._buffer[id])
|
57 |
+
} else
|
58 |
+
this.size++
|
59 |
+
|
60 |
+
while (priority--)
|
61 |
+
this._pool.push(id)
|
62 |
+
|
63 |
+
this._buffer[id] = transition
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Return `n` random samples from the buffer.
|
68 |
+
* Returns an empty array if impossible provide required number of samples.
|
69 |
+
*
|
70 |
+
* @param {number} [n = 1] - number of samples
|
71 |
+
* @returns array of exactly `n` samples
|
72 |
+
*/
|
73 |
+
sample(n = 1) {
|
74 |
+
if (this.size < n)
|
75 |
+
return []
|
76 |
+
|
77 |
+
const
|
78 |
+
sampleIndices = new Set(),
|
79 |
+
samples = []
|
80 |
+
|
81 |
+
let counter = n
|
82 |
+
while (counter--)
|
83 |
+
while (sampleIndices.size < this.size) {
|
84 |
+
const randomIndex = this._pool[getRandomInt(0, this._pool.length - 1)]
|
85 |
+
if (sampleIndices.has(randomIndex))
|
86 |
+
continue
|
87 |
+
|
88 |
+
sampleIndices.add(randomIndex)
|
89 |
+
|
90 |
+
const { id, state, action, reward } = this._buffer[randomIndex]
|
91 |
+
const nextId = id + 1
|
92 |
+
const next = this._buffer[nextId % this._limit]
|
93 |
+
|
94 |
+
if (next && next.id === nextId) { // the case when sampled the last element that still waiting for next state
|
95 |
+
samples.push({ state, action, reward, nextState: next.state})
|
96 |
+
break
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
+
return samples.length == n ? samples : []
|
101 |
+
}
|
102 |
+
}
|
103 |
+
|
104 |
+
/** TESTS */
|
105 |
+
(() => {
|
106 |
+
return
|
107 |
+
|
108 |
+
const rb = new ReplyBuffer(5)
|
109 |
+
rb.add({id: 0, state: 0})
|
110 |
+
rb.add({id: 1, state: 1})
|
111 |
+
rb.add({id: 2, state: 2, priority: 3})
|
112 |
+
|
113 |
+
console.assert(rb.size === 3)
|
114 |
+
console.assert(rb._pool.length === 5)
|
115 |
+
console.assert(rb._buffer[0].id === 0)
|
116 |
+
|
117 |
+
rb.add({id: 2, state: 2})
|
118 |
+
rb.add({id: 4, state: 4, priority: 2})
|
119 |
+
|
120 |
+
console.assert(rb.size === 4)
|
121 |
+
console.assert(rb._pool.length === 5)
|
122 |
+
console.assert(JSON.stringify(rb._pool) === '[0,1,2,4,4]')
|
123 |
+
|
124 |
+
rb.add({id: 5, state: 0, priority: 2}) // 5%5 = 0 => state = 0
|
125 |
+
|
126 |
+
console.assert(rb.size === 4)
|
127 |
+
console.assert(rb._pool.length === 6)
|
128 |
+
console.assert(rb._buffer.length === 5)
|
129 |
+
console.assert(rb._buffer[0].id === 5)
|
130 |
+
console.assert(JSON.stringify(rb._pool) === '[1,2,4,4,0,0]')
|
131 |
+
|
132 |
+
console.assert(rb.sample(999).length === 0, 'Too many samples')
|
133 |
+
|
134 |
+
let samples1 = rb.sample(2)
|
135 |
+
console.assert(samples1.length === 2, 'Only two samples possible')
|
136 |
+
console.assert(samples1[0].nextState === (samples1[0].state + 1) % 5, 'Next state should be valid', samples1)
|
137 |
+
|
138 |
+
rb.add({id: 506, state: 506, priority: 3})
|
139 |
+
|
140 |
+
let samples2 = rb.sample(1)
|
141 |
+
console.assert(samples2.length === 1, 'Only one suitable sample with valid next state')
|
142 |
+
console.assert(samples2[0].state === 4, 'Sample with id:4')
|
143 |
+
console.assert(rb._buffer[1].id === 506, '506 % 5 = 1')
|
144 |
+
|
145 |
+
console.assert(rb.sample(2).length === 0,
|
146 |
+
'Can not sample 2 transitions since next state is available only for one state')
|
147 |
+
})()
|
worker.js
ADDED
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.12.0/dist/tf.min.js')
|
2 |
+
importScripts('agent_sac.js')
|
3 |
+
importScripts('reply_buffer.js')
|
4 |
+
|
5 |
+
;(async () => {
|
6 |
+
const DISABLED = false
|
7 |
+
|
8 |
+
const agent = new AgentSac({batchSize: 100, verbose: true})
|
9 |
+
await agent.init()
|
10 |
+
await agent.checkpoint() // overwrite
|
11 |
+
agent.actor.summary()
|
12 |
+
self.postMessage({weights: await Promise.all(agent.actor.getWeights().map(w => w.array()))}) // syncronize
|
13 |
+
|
14 |
+
const rb = new ReplyBuffer(50000, ({ state: [telemetry, frameL, frameR], action, reward }) => {
|
15 |
+
frameL.dispose()
|
16 |
+
frameR.dispose()
|
17 |
+
telemetry.dispose()
|
18 |
+
action.dispose()
|
19 |
+
reward.dispose()
|
20 |
+
})
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Worker.
|
24 |
+
*
|
25 |
+
* @returns delay in ms to get ready for the next job
|
26 |
+
*/
|
27 |
+
const job = async () => {
|
28 |
+
// throw 'disabled'
|
29 |
+
if (DISABLED) return 99999
|
30 |
+
if (rb.size < agent._batchSize*10) return 1000
|
31 |
+
|
32 |
+
const samples = rb.sample(agent._batchSize) // time fast
|
33 |
+
if (!samples.length) return 1000
|
34 |
+
|
35 |
+
const
|
36 |
+
framesL = [],
|
37 |
+
framesR = [],
|
38 |
+
telemetries = [],
|
39 |
+
actions = [],
|
40 |
+
rewards = [],
|
41 |
+
nextFramesL = [],
|
42 |
+
nextFramesR = [],
|
43 |
+
nextTelemetries = []
|
44 |
+
|
45 |
+
for (const {
|
46 |
+
state: [telemetry, frameL, frameR],
|
47 |
+
action,
|
48 |
+
reward,
|
49 |
+
nextState: [nextTelemetry, nextFrameL, nextFrameR]
|
50 |
+
} of samples) {
|
51 |
+
framesL.push(frameL)
|
52 |
+
framesR.push(frameR)
|
53 |
+
telemetries.push(telemetry)
|
54 |
+
actions.push(action)
|
55 |
+
rewards.push(reward)
|
56 |
+
nextFramesL.push(nextFrameL)
|
57 |
+
nextFramesR.push(nextFrameR)
|
58 |
+
nextTelemetries.push(nextTelemetry)
|
59 |
+
}
|
60 |
+
|
61 |
+
tf.tidy(() => {
|
62 |
+
console.time('train')
|
63 |
+
agent.train({
|
64 |
+
state: [tf.stack(telemetries), tf.stack(framesL), tf.stack(framesR)],
|
65 |
+
action: tf.stack(actions),
|
66 |
+
reward: tf.stack(rewards),
|
67 |
+
nextState: [tf.stack(nextTelemetries), tf.stack(nextFramesL), tf.stack(nextFramesR)]
|
68 |
+
})
|
69 |
+
console.timeEnd('train')
|
70 |
+
})
|
71 |
+
|
72 |
+
console.time('train postMessage')
|
73 |
+
self.postMessage({
|
74 |
+
weights: await Promise.all(agent.actor.getWeights().map(w => w.array()))
|
75 |
+
})
|
76 |
+
console.timeEnd('train postMessage')
|
77 |
+
|
78 |
+
return 1
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Executes job.
|
83 |
+
*/
|
84 |
+
const tick = async () => {
|
85 |
+
try {
|
86 |
+
setTimeout(tick, await job())
|
87 |
+
} catch (e) {
|
88 |
+
console.error(e)
|
89 |
+
setTimeout(tick, 5000) // show must go on (҂◡_◡) ᕤ
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
setTimeout(tick, 1000)
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Decode transition from the main thread.
|
97 |
+
*
|
98 |
+
* @param {{ id, state, action, reward }} transition
|
99 |
+
* @returns
|
100 |
+
*/
|
101 |
+
const decodeTransition = transition => {
|
102 |
+
let { id, state: [telemetry, frameL, frameR], action, reward, priority } = transition
|
103 |
+
|
104 |
+
return tf.tidy(() => {
|
105 |
+
state = [
|
106 |
+
tf.tensor1d(telemetry),
|
107 |
+
tf.tensor3d(frameL, agent._frameStackShape),
|
108 |
+
tf.tensor3d(frameR, agent._frameStackShape)
|
109 |
+
]
|
110 |
+
action = tf.tensor1d(action)
|
111 |
+
reward = tf.tensor1d([reward])
|
112 |
+
|
113 |
+
return { id, state, action, reward, priority }
|
114 |
+
})
|
115 |
+
}
|
116 |
+
|
117 |
+
let i = 0
|
118 |
+
self.addEventListener('message', async e => {
|
119 |
+
i++
|
120 |
+
|
121 |
+
if (DISABLED) return
|
122 |
+
if (i%50 === 0) console.log('RBSIZE: ', rb.size)
|
123 |
+
|
124 |
+
switch (e.data.action) {
|
125 |
+
case 'newTransition':
|
126 |
+
const transition = decodeTransition(e.data.transition)
|
127 |
+
rb.add(transition)
|
128 |
+
|
129 |
+
tf.tidy(()=> {
|
130 |
+
return
|
131 |
+
const {
|
132 |
+
state: [telemetry, frameL, frameR],
|
133 |
+
action,
|
134 |
+
} = transition;
|
135 |
+
const state = [tf.stack([telemetry]), tf.stack([frameL]), tf.stack([frameR])]
|
136 |
+
const q1TargValue = agent.q1Targ.predict([...state, tf.stack([action])], {batchSize: 1})
|
137 |
+
const q2TargValue = agent.q2Targ.predict([...state, tf.stack([action])], {batchSize: 1})
|
138 |
+
console.log('value', Math.min(q1TargValue.arraySync()[0][0], q2TargValue.arraySync()[0][0]).toFixed(5))
|
139 |
+
})
|
140 |
+
|
141 |
+
|
142 |
+
break
|
143 |
+
default:
|
144 |
+
console.warn('Unknown action')
|
145 |
+
break
|
146 |
+
}
|
147 |
+
|
148 |
+
if (i % rb._limit === 0)
|
149 |
+
agent.checkpoint() // timer ~ 500ms, don't await intentionally
|
150 |
+
})
|
151 |
+
})()
|