Artod commited on
Commit
b396e7b
1 Parent(s): 79585e0

Upload 16 files

Browse files
.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

  • SHA256: 59aae00d8c83220daa06bede39c22ee66bfc8c5f01296942ce4ea4c62a11822e
  • Pointer size: 132 Bytes
  • Size of remote file: 1.05 MB
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,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAwQSURBVGhD7VpbiCVHGa4+p/tc5syZnd2d3Z2Q4AUvyUPAEIwY1uTB+CA+CAoSULyAshqMgnhBEREkD4qCD4q6PnjBEFBBFkREfDL4kCho8MUbG93LZCdz2Zk5Z861z+n2+/6q6tPdp89lMqeHiH7MP1Vd3VX1f/VX1f9X91H/a3BM+rLH7lOiqxeTgpE2pHP2vSpEOhMLJwzFqETRCBWrQlYgpyCnIWdieZbXITUIn6tASkZcCNsYGFmDsB6f433eY18tyO8gT4D0X5FOxbEJg2AZyZ2Qe4zcDXmVKaOCJEQlPXTmsEfp1KYGw8BkDHjPwb9CsaCcoqsKrqccr6ycAq4htoHA95XfOlRDv/8iCj8G0ldYfxLifc4NkOToPwB5N+RNkNdBVqFgpQBK1EeEClMvK3jIprbnwVCpbl+nrOPBbi4EPHENcuWqckqYAGWIy7EdRzgcquYLN9Sg172KywdAek/fGYfpdjbMGqLF3gZ5DPIw9HFdKEYFXdeBkmAbtYiMzcvqii8x5PHX80PV7oIc6pcx+UsYxlF9oIAblmxpWV9PwKDbUY2N62g3/AAI/8QUjyHe/BhAkgTfCHkNhFZ8EPJmWKFYgoIeSBZowoicaS6eT0AT5b8gCFWzFYhVazAc0zEUMAIkWwZZEneyHtIIg0A1bl5Tw37vOyD8cVM8hswWQHQF8n5k/wK1fwX5LvKfgVz0XFVcXiqocqkg60uUoLZMozwsYa8TgnJzPwgLsm4rGLhMshGyBi4LGEn96NTWxm6CKMs+D/kBptgrlpdUeaWGpWj69TCH9SIlKRIw5Jjasvh1XGKkHcxjB4363H8ngtOBs0KmxVQMsXlxAwOelYIJGBs+EH4XkierJbVUweaviTpqv8VpCD9Sd/XCZVW5aVPCpNF1GlTeZJHptH3V6fiydsvoi3uBrcm+AlwFhTKkpEJM75B3QT6EcLDYD1MawG+3KDdR9SKmNBZzNhKagSx33yfR8aN1OBLRW6ziqAbWG5U4tVJCEW+wnLV0x6PUgtcmSwhRy9YSD1Wvq0kHmN+yq6NZLG+sSXlw1IwhRn2YaqNr8jIIUA5Cn/wVyNdBWp5II64SCZ9H8jQse/cSPYCQ1YQP2/AbeHx5mWbXZbwepUhscwniKYimVFIuQHSo2q2e6vcGUo3bwsgtQWzTLga6YjYvj27dQpOma+ru76leY5+KfgJyGaTtsEVAkwkwgqmxI725jIQ+0aWTjNYixD4jqSmP358obAebFlRr7HfUoD9QWELq1BKiFHDhYNNNsbuIONc82naKCEBQMJIi7mEnLZVV7fy6Kp9aRS31VcjrIWNAU2PAgBqlqBx7Q1rEsLvYouNliTxTS5ZplghRCqYkumk1GQYHqg6iVeOasicHzUy1dN1pqJ5ZQzdFhqzv0yVJZNdm49IBNdAESLYgu8qoTA+KFVMeE9lkJG/u2/ZwTesOEV6RKK04FWjG/Iul2aC13TLXo3qLFKSQ3ZUQtsppKZIwGtNKpwjYMrEA7xVVH/FiY/u2OtjaVYd7+6rbwtT1wdI+j8XJZYzcEZG5FyXAaQ7w4DKGCf2NE45IUiJLxfKpstJSTa1cuKBqZ3g4clTnoKGa2zuqsbOreu2OHAaKrqs6iKO5K0+F2eBkw5NNbzLCYIhoC40q9XcpSAHaZSDDwqMyQ1wIamsmB2N0n6cct1JVy+fOqfr6OjaWEgL8vmrd3leNrR1MvRJWcBEuDwda6MjIK5sPCukT6asifxWH3qmDga9aW5sML2+j8Cl9L4nEgoBbugvJM0u18p0VbpWWhCEgj8t1LJWyeEowb7IxBFiz7d0d1UeQIMDzHnZXB4vY73bFl7KbIuoyFZdkROJqnJZCnpgYhNDvYiMIhgNxbZJHpBXqAfkh5HG4Je6KCZDFOKQXEppDxNKxlNaO8kkpeB5cxwXozXM+AKv4PRBFKhETiiSmgfC42EOkSMu3cKJqtQeqhanQ2dtTnds7qnewL9FVMBhgUmFTrVZxoKqLewJ4DrjETBpsPkJk4XoVFmaoBUUTyscGQqxoJXYtMKm9JKKpyqk3kJMNLUPwMYyF+OL4ji1VTD1JYF1HTk91VKjIIKXBwevsbKnuwR6j9Edg5af1HY1Y83GgoTi5LJE5l1q/kZj6QsWILcN9Wrq8ssqOBIzZeURMuyepaarpsFMHGvbgkQWWV9fOw6swQleXYMREq6kupA/Ti1Wewut0WVqyFciGg4joNMbLlWo8OMyuntJhCkjaw/QGLkJGIwuka8Jc2DPiJKJ8liUpMzXNhF13rD1XC0fspgCXB3BBC3MLaJwBS1TWr8knyBs5DtAeNxi6oZl+mIieQWaO5wNffDHfbR0yYzFB6wxylGgDO+JwTwCDD+re7OhdeTpI1Mj4ISgBvt/qHwpPblj0yRGgfQbEmiSVIs7HF0SWsBsPYwqeI+h++AZkosVt4MEKcWAQ6IeHsGq/1YSv32IQ8i/c+Wb6XJzQHjvaK5E8Uzt9er1cx9SPrGrX7+LIEr3GASKjW+ZqBHajd2Wd8lp6pg44F4cFzgzE4iAeBR10cWE4hFvCkIV8IX8JZP/IanGghQQYArWksvRCMUQpCwb9sQX2MDk58TxMf8yDGcFw0x8WVD/AgYTSDxCs9CVeJmH9FoRcEXmFwQFyj6LaQ1lkiQQLWJjXV4qe986V9TuUgzUWrdvko8cHpuHhi7ew1hqqhsCLR22JslII2beHAzPfdJSQMsS0g4+UOQYb/daham9vchB+gaL3gHBq3muQSQQz3z839P295vaWGnAUQza5YLIAZ9EAYSWDDr7dyCJL6EAD/hpuhgaQoANGEDEzj/lyfUUtrV1glbdD3sBMFhKECZDmseqDg273RvPWhmpuXEf8uiOvQRcJbjA83dipOxkkxVnGB6cPvFerkTymgQQcmRgjTID0L5Hch+nxGKxwpbO7s39w/XnVvHVTPlwtAtxoOK3TH9HGEN87pvPFo9rywDkpyEAmYQKkb0O+hyw/mN0L5T4Fsn9obm4MGzf/LWuPm8ZLhVupqGK5rLD/zPDBk3zUOHj4Nzpdk4IMzBizJLCpYedQ74Dwy8R9XnWpUDl9FnsKi48O7rSHmxuIinryyYUx9dhaLvIGX89SMFvjFk8glLN2d2+XU5C79HO6PIkjEbYAcS4oEv8ymrgfG4ZTPXvOxq9HAjcvzhgc3n0o43JPktezEPHFzICoHAu5U3OXjqxu3knDqj4iK5yTA7imr+HGF0E4c2q8JMIWxuIfhXwJZFdr5+84urWh8AG/+vW6P8PVnyH8HHsvZA3KgT6UlB3ZrE+9RlkN/+h7kUFoFgwH8MHqp5BPg+zEjeZYhC1AnApehjy4tHbeqazyxd28AOEbQvjHUPRDJhbge2W+jHi1SflFhD+R4A7MExDpIhCVQIkHBArj5qtoA5H5ZCyEMGGs/QRM8Xh19YzLKT4fEIDA/SFw+D2UfcgU5oaFEbYA8e8j+Qimt1Ne4ff02eA7Ksg+sneBtHnDlw8muqVj4JOQH/HEMuz3dMkM8FUuZgbfTEyMkBaFhROGhbi2voDA4vn2ztZcvpr+WHZjpR6WghyRh4VJmj8h+qzfboWDztir4THI1z9PXq8+giVxdN92BORC2OC3kGc7e7vGh0yHt8QNWHZ7nslzQ26EYeUmksuDbifgQWEWvBoiKe1+7mcmL+RpYYJW3uRZdRaKXonvuKjPW40vzgV5E96EXEVQoa+mATEyDxQAfxeW2zrOlTCmNc9Bf+OUlhBwBsw3J/5Os85MHsjbwsS1EIfeedxTQX8IY7SyzkweOAnC2wzyRWZAfLHj4DwoPzHOBSdB+JCzOZzr80KE/841bDD1fUYc/LiNxU4ftq1LFo+TIDwfMA16jQZz/4Dwd8+54GVDmJ9I/FaT1v22icdzwUkQxoGci3jyGu41G/I+CvgN5OfM5IWTIPwCfTBfuieAMv4IhWfh9vZmEPj9X6P0w7Bu4mvfopFbCGeBMJG/BP2TUyjc41Vrqohoil8MeFb2cZICab6S4UuDb4Asf/6bK3InTIA0D/f8VQ1/i/1aCPvlTsz3UN+C/BNk53tbcEycCGELc9bluy8upUOQXOz3m/8jDaX+Aw4H+bd097oGAAAAAElFTkSuQmCC" 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
+ })()