Created
September 23, 2019 10:30
-
-
Save prl900/355149bf585404eea36d415e131c1169 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Completion enabled!\n" | |
] | |
} | |
], | |
"source": [ | |
"import Foundation\n", | |
"import TensorFlow\n", | |
"import Python\n", | |
"%include \"EnableIPythonDisplay.swift\"\n", | |
"%enableCompletion\n", | |
"//%include \"EnableJupyterDisplay.swift\"" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"//print(Python.version)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"let np = Python.import(\"numpy\")\n", | |
"let pilImage = Python.import(\"PIL.Image\")\n", | |
"let ip = Python.import(\"IPython.display\")\n", | |
"let clear_output = ip.clear_output\n", | |
"let bytesio = Python.import(\"io\").BytesIO()\n", | |
"//let builtins = Python.builtins" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"func DisplayArray(_ a: Tensor<Float>, fileName: String? = nil, fmt: String=\"jpeg\", rng: (Float, Float)=(0.0, 1.0)){\n", | |
" let a = (a-rng.0)/(rng.1-rng.0)*255\n", | |
" let b = a.clipped(min: 0, max: 255).makeNumpyArray()\n", | |
" let c = np.uint8(b)\n", | |
" let f = bytesio\n", | |
" let image = pilImage.fromarray(c)\n", | |
" if let fileName = fileName { // output to filesystem\n", | |
" image.save(fileName, \"JPEG\")\n", | |
" } else { //output inline in jupyter\n", | |
" clear_output(wait: true)\n", | |
" image.save(f, fmt)\n", | |
" ip.Image(data:f.getvalue()).display()\n", | |
" }\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"func make_kernel(_ a: Tensor<Float>) -> Tensor<Float>{\n", | |
" return a.reshaped(to: TensorShape(a.shape.dimensions + [1,1]))\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"func simple_conv(_ x: Tensor<Float>, _ k: Tensor<Float>) -> Tensor<Float>{\n", | |
" let x = x.expandingShape(at: 0).expandingShape(at: -1)\n", | |
" let y = Raw.depthwiseConv2dNative(x, filter: k, strides: [1,1,1,1], padding: .same)\n", | |
" return y[0,TensorRange.ellipsis,0...,0]\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"func laplace(_ x: Tensor<Float>) -> Tensor<Float>{\n", | |
" let laplace_k = make_kernel([[0.5, 1.0, 0.5],\n", | |
" [1.0, -6.0, 1.0],\n", | |
" [0.5, 1.0, 0.5]])\n", | |
" return simple_conv(x, laplace_k)\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"let N = 500" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"var u_init = Tensor<Float>(repeating: 0.0, shape: [N,N])\n", | |
"var ut_init = Tensor<Float>(repeating: 0.0, shape: [N,N])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"for n in 0..<40 {\n", | |
" let a = Int.random(in: 0..<N)\n", | |
" let b = Int.random(in: 0..<N)\n", | |
" let c = Float.random(in: 0.0..<1.0)\n", | |
" u_init[a,b] = Tensor<Float>(c)\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"//DisplayArray(u_init, rng: (-0.1, 0.1))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now let's specify the details of the differential equation." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"// Parameters:\n", | |
"// eps -- time resolution\n", | |
"// damping -- wave damping\n", | |
"\n", | |
"// Discretized PDE update rules\n", | |
"\n", | |
"var eps = Tensor<Float>(0.03)\n", | |
"var damping = Tensor<Float>(0.04)\n", | |
"\n", | |
"// Create variables for simulation state\n", | |
"var U = Tensor<Float>(u_init)\n", | |
"var Ut = Tensor<Float>(ut_init)\n", | |
"\n", | |
"// Create variables for simulation state\n", | |
"\n", | |
"for _ in 1...1000 {\n", | |
" U = U + eps * Ut\n", | |
" Ut = Ut + eps * (laplace(U) - damping * Ut)\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\nHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAH0AfQBAREA/8QAHwAAAQUBAQEB\nAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh\nByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ\nWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG\nx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AEoooooooooooooooPAp\nBxzS49OtH6f1ox7A0Y9QB9aPrz7UYz1/Cg8/UUDkUUUN0pRjG00hPbGV7UhXuWz7ikwpP3gT7jJp\nduOhX8sfrS5IPOR/tHqKX12/jScKNvr0NIvoaWiiiiiiiiiil4A5pmC3PQU5WI+6OPU0blbqGb6U\nYT/nk350Bz0U/gaaRvPPDUqnBwacRSUUUUUUUUUUUUUUUUUUUUUHk4o96MYoz60YBowBRn0o69fx\no6c+lHRqKUUn8X0pMbuT3NOB454X+lGFHI+X60buPvKR9OKByMjbj1XH9OtGPU5FITt+707f4UYy\nDj6ig/eB9aU0lFFFFFFFFKKb94+wpevJ6dh60dTzyfTsKT68j3OBRhf9n9RS47Hn2NHbnkevcUYz\n8p69jQp7Gg0UUUUUUUUUUUUUUUUUUUClA5NGQMfnSb/QUb/9mjcppdtJRR/UUHoKU0LSDlmPpRnA\nB/2eBRgk+g4GaaFXjgkn8+c04ZyOD/319P8AE/gD3pOGIJyCcc557e59T3PQ8kYNAB4IIOfTvn/9\nVKpBwfUjI+ooHykDtg0H7q0ppKKKKKKKKKGOFoxwF/E0dTkd+ntR/L3/AJmjvnv69/8A61GT6nn3\nPP5jmj2/Sj368fmKMcYHbkGkPZh3px9aSiiiiiiiiiiiiiiiiiilHFNyWJA6UADjA3HFLkjuo70A\nn++p+tHpkfiP8+w/KkA2gbcYHbpjp/gPypwOR70dKQdvpSHoKcaOgpOh2+tIOgZvp+FL6Z69APSj\nrxz/ALo/z1o4PHB9tw/l/wDXoJOeSc/7XP68/rRj8D3/AMaOpzjB7j37UA/KQeqjFB6KKU0lFFFF\nFFFAobllFB/iP4UdyO2cfgKOv1P+f5Uf/r/z/nij15+v/wBfk/rg0fX8aOR9Rz+I60dPwP6Ggj5W\nHoaUcqKSiiiiiiiiiiiiiiiiilFJ95sdqD19Fo9unoB1NA68YH0GTQc45zj/AGlo/TP4g0dDwMH0\n9aQ8/MOPWnD5hSf1o6tRSntSN94t2Ao7/wC9gD2o6/U9ff0oyNvONuO54/Gg8ZBz7gge/Yn2PYdD\nycGjoccDnp79Ogo9scenpmjnGe+Mj3oP3sjpjJpV+bmg0lFFFFFFFA60H/WLQeN3s2aMc49yPzo6\njnoRz+WDS5O7PfOemecg/wAwPqKRTjGDnbjGWzjGD6nuB6d+MsxKYwNo9MDP0x/9elJ6ke5/oKCO\no+goP8ZoH3BRRRRRRRRRRRRRRRRRRQxwKMYwv50dRx+AoHP1/nR29vTt/wDXoxjtj8CP50fT/wCs\nfwoxxjkDt2xRn+L8DR91valPHPekHFFD8Lmlxkbf7wpM8n0PT8KOnfGOh9B2o6e3b2o44X17cNn8\nCc/yo57Z/l/kUDjAA6dB/Sk6ZxyQOKU9WUelLHxHikoooooooooofoDR39mFH1+h/wAaPr+Pt70e\n2Pw6/wD6xS5J7k4+px+fSk/zx3+n+NH6/wBTR0/4Dz+NIRhAO55p3QUlFFFFFFFFFFFFFFFFA60H\nlwKOufc4o/l/QUEfn6f0o6/X+f8An0pBjHGB9MY/Qkf1pfwB/GjH09M/yNA5I754P1pD90E9RTuv\nJpKKH5SjPIPoKCMrj/Z4pCdufTnFOA5wDxnGDzjnH/16QHPByueo3fTOR3xnnr0PI+UMnbOxs4zh\nj7Dr+eKU8Z5wB0x3waO+B0BIzQowF9SKVe9GKMUmKKKKKKKKXqMU0d1P4UvJP+0Oo9aO2R09e4o7\ne30yP/rUcH0P5mjvznJ/M0d/f+VAwf8AdH60D5mzSmkoooooooooooooooopRSD/AFn4UL/D9TSf\nw/8AAf6049T9T/Mf0pCM56Z57Z9f/sfqARQSWyVOewO7PrjnJ6fL+R4XIUGRngd+Pz4/TNJxjgdv\n68UvJb/gVJj5D9ad/CKSilP3aToynseKOgwenT6Uueeep/I0hUf/AK6X5gOGOP8Ae4/n/MZpMN6/\n4UBR6/U0vQew/maB97J7ChSSDgUmD3Iox/tCjkdaXINJRRRRRQKGGeR1ozu4PDDvR0PPB9RRg9cZ\n91NHJ7SH8aOnovsOtGOP7q/zpPvcDgU7oMUlFFFFFFFFFFFFFFFFFAoPDg0dMjuDkUfT6j+tFHtS\nkn+LP/As/wBefwoz6/5/+vRnH4fz7CjOPwH600/dUevNOPSkopR0pByCp/CkzjqOOhpcenPt60Z9\n8fUUZ75X68fzoznvn+X/ANel+v4Ckzn6D9TQflXnljS845OPYUmB6fmaMA9h+BoH+yfwNHX2NAPY\n0UUUUUUoNBAak+ZfcUmV7gj6UZT1ajI/hX86XaW5Y0vTpSUUUUUUUUUUUUUUUUUUUUMMijOQCOoo\n4/DsfSj+fp/hR19/oP6UYx0GPw20e/b1/wAKPTjnsKMduw6mgfM2aU0lFAoI7ilznkfiKTb/AHen\np6UZb6/zoyf7pz/u0fN9Pc0uABk9P50e5H0FCqc57+vpS/L60AA9D+QzQV9f1GKaR6ijrjP4Gj69\nRSjkUlFFFFFFLmjI9KOPSjNGaSiiiiiiiiiiiiiiiiiiiilFIRtORR7jkdxR1HHI9O4o4PUj/gQp\nOP8AY/nS9ef1NHXp+JpDz8q9Kd0FJRRRSg0hGORRkH2NLz3ANJn2b86UZ7Lj3NBxnk5NIWJPAyeg\noKnHzNgfzNNwn+01BEZ4+YfUf0pQrL9w5+n+HelDg8HilI6+nek+vUUDhqU0lFFFFFFFFFFFFFFF\nFFFFFFFFFFFFFFFFFKDSFSDlaTIPUYPrS89mB+tLz6qKaSvcljRy3sKdwBSUUUUUUZpcA0m30NGG\n9acqE8k0370hA6DvQDwAn1LUADquPTc1AJboXI/2RxQSR1Zh/vigrg4I2H9KD8xw33ux9aFODtP0\n/ClI/lTT/CacaSiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiilzRwaTaKNgpcAUZpKKKKKKKKKKUUM\ncYA6mkAwWQdccmgchePlwQB60Z5ycHGOew9hR3APJ/2iSe/Ye1C8H5Tgj+6T7dj+H5ZoUbcBVC+i\n4wD07YGOg7DpjAxQMYA529s9Qe1GNwwfvKR+VKh3KM9QDTT91acaSiiiiiiiiiiiiiiiiiiiiiii\niiiiiiiiiiiiiiiiiiiiiiiiiilWkXmQk9BSD7wz/HyfpS/pxn6CjnIxwe2Ox9KB6Acegz/Idfqa\nD1wc5HY9vz5FHA7cdcAYz+HqKPXJ46MR/OjOME9VOG+nagfLIR60MPmA9KU0lFFFFFFFFFFFGKKK\nKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKctMH+rc0rj73soFBPJ9iT+QoPAbIzjIYfTH8yaCpJ\nIwWOey5JPzDphsn5TxtJ6AAlgKMYBAAIGeFwR/F6dvlPTjoRwaD8oJ54yeRjOMH+RoI5I/3l/qKQ\n8qxPQqD9TQ3DIT1Ip+Oc000UUUUUUUUUZo5o49aPxo5FGc0UUUUUUUUUUUUUUUUUUUUUUUUUUUUU\nUUUUUU5aYo+V1p33v+BL+opDyc/8C/oaOvUjcO56Ht+RFBAIIYexyMj8eCPzBBoIz1AOfXjP+fX8\nBRx1OPc98f8A16Dnnu3P5mhuNx6nhQKQj94oPYU9qbRRRRRRRRRRR+tH5UflR+lHX60A0UUUUUUU\nUUUUUUUUUUUUUUUUUUUUUUUUUUUopp+WQHsaXGCV7jlaXOeegz+RpMZ4xgj07f4igBsDA3AdMAnH\n5cikOB1Ur9Rj9Op/GjIzwDnrz29zSjdgYGP7vv70AAEAcheSfehOWLUp60lFFFFFFFBoooo/z6UU\nUUUdRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSkblpo+YbTww6Gl5J/wBruD3oHPA5x2PBH0oO\nM8kZ/wBoEH9KAf7uP+AD+ppcnpgf7o/rRznGcse/pSH+4v4mndBim0UUUUUUUUd6P60UUUUUUUdD\nRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSg4oZd3I603cDw/B9aUg45Aceo60bsfxuPYjNG4H+J\n29ulLg47ItN3fwoPxpyqFHvSE0UUUUUUUUCjsaP8KKKOnJ4x/n+h/Kj/AD/n8jRRR6/SjuKDRRRR\nRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSg4oOG60mwj7pxRmQeho/eHvijZ3Y5p3A6U3NFFFFFFFFF\nAo7Gj/Ciiiiiij1/KjuKDRRRRRRRRiiiilxRgDrRuX1oyp70Yz0oxSUUUUUUUUUUUUUUUUUUUZpc\n0ZpM0YpcUYpKKKKKKKKKOhoooooooooHWiiiiiil6Um4dqMt6UZb0pQQadt4zTCSThRSFQPvHJ9B\nSgDtGfxoIHeMj6UgUH7rfhShscMKUikooooooooooooooooooooxSkgUm4noKMP7UfOO2aN3qMUu\nM0lFFFFFFHWj+dFFH+eDRRRR7UdBRRRRRSk4puM8saXnsAB6ml6/xMfoKQuB0Y59xS5YjJXj1puJ\nCcgjbTtzEdML60Bh2+X69TQV7kH/AIE2KTGOQGHuDmg88nkf3hR7NyOxoBKnB6UpFJRRRRRRRRRR\nRRRRRRRSgUhPYdaTAHXk+lKSe5x7Cjb/ALLH6mjGP7y0ZOOcEeopMY5HIpwIYUlFFFFFFBFFH1o/\nEfjR+P5UUfSgCiiiiil6Cmj+8aXvzyfT0pfc8+56UmS3c49c4pR/s5+p5FI3JCgkk+nQ0bccBGAH\n3hmk6EMpIz0Vu1OOG5OQT37n6Ugypxj8QM/qaUjkcc/TB/wpO+c8+v8AjRwO3HcelGMgqeo6GhTk\nYoooooooooooooooooooY4FA+X/eNHTOD9TR06cfzNJx/s/iSaUe3/jpz+lHfPAPqOho6cgfUUh4\nOR0NOPIpKKKKKKKOtHNH4Uc+lGDR0ooooooFB5bFGec+nApQP/r+9IfmbHp/nijjB7KOp4/maUDJ\nHH0A4poOWY9QOw4FAxgfd5+bPPIpfr0bnB/QA0LxlTyO4/z2oOOjYx2Jxx+fApF4yvGP0/Tj8RTj\n/kevtSe/X+ooPA91P6UdJPrSnrSUUUUUUUUUUUUUUUUopByxJ6Cgfq38qPTH4f40f5//AF0c9Mn6\ncj9BR19/Tn+tH6/1o+nJHT3FAxnHY9KF7iiiiiiiiiijNGaKKKKKKKUU0fxGl6fgM0p+Ufp/jTR9\n0AdWpRyRtGccKAOp/I/pSjv3z196aOUY5/HFKxOGOT0H8R/HtihuN+OxJA+gob5WyOw4z7AcH88/\nhSt8ucEgDJBzjGM98jHQdx94ZIGSGt03Z5BPP588/QfgwzzTjwpI7A/pgj+eKQjkjt8wo7H3UUjd\nU+lOakooooooooooooooope1NH3D7mlPU/gtHv2/pR/n/P8AKg4A5Ix9f/rj/PSjr70de/Xv/I0Z\n7/j/AI0HgfQ0dJDSnrSUUUUUUUUUUUUUUUUUopo+61Ke/wBBRJzx6kj8xQx5YjsvH4gf4YoI3ZUD\nqMDjPXPbB9R2P3RwRkUvXOB1yMfmMfqPwUZ5poG4SL1z+ucAfypchjkHO4Hv+Xf+gB7UZzyBn5Rx\n6n0/GjuoBzwMH+R/oaUk9VyDgMME5H0wQfxBzSd2Htn6f59KF+79P84oPf16fietB6Njv8ooP+sA\n9BSnrSUUUUUUUUUUUUUUUUvamj7g9jS9CfZs0dB79PyOaAcHI7HI/PI/nQDsxzjHHPHoO5HoMj6j\nBBIJjAxzj/8AV/8AEj9TR359efzyaT+H8MfmaVv4vc0H/WUp60lFFFFFFFFFFFFFFFFKKQfeI9aB\n2z24ND9s9uv+NDdX+mf8+1BxnnGMg84/rwaVeMYwccfkc/5FNYbT14xgn2wRn8j+dK3zFoyeGycA\n9M5zxnjr6Dtydq4C24lj1ZtzAduc5/Ogf6wD0x0747ig9COPu8jjv7GlH3iO4Xtgn9OBSJ930x39\nP/r0fTg9h6UDGf8AZWhOSWNBoooooxS4oxSYoooooooopRTQPvLS9Rk9+DR9fx/xo/z/AJ9qASOQ\nSPcE/wAxR+f+f89aP8//AFqOnPXH6mgDkD05NC8sTQaKKKKKKKKKKKKKKKKKKG9RR79j1oYfL1+h\noz90/gR3FA449OuDjI+ho79cn65P4UpG4Y79h/n+VIOR5bE4H1/lRkg7icN2P+e9AAAIIA9QelKQ\nTwQ3qeNwpDnYTg8+vyilHQY5I/IUnXIB+ppDz8o6U7oMUlFFFGcUcn2pMDu1HH96l5HvRmiiiiii\nigUNwQwo9+x60fj9DR7fp/hR0PYH3yP5UduOn5Cj3z+P+FHTBx9BSHgY7nrTgMCkoooooooooooo\noooooopRSfdPtSjpxyvpSAYyp5B/MUbgDgk5HTIzRvyOAxHoBjFG8Acjj0UZz9RSkI45K+w5/lTe\nc/vAcdj3/AU7ngLhvRTSY7bWHqQaTG5uEJA9TTm/2iAPQU3JbgDApwAUUlFFFBPYUdPc0fXk+lHT\n0FGfcfiKP0NHXrwaAcHBooooooopRTeVPtS9uOR6UdeBg+xo5HZx9DRg+h+rGjPP94/pRnb7tQB3\nPWg0UUUUUUUUUUUUUUUUUUUUo5oPycimkBxlxj6UAjGN2Pc0pbH35fxFAJP3Qr+4ODRtJPzeYD9a\ndnbwcAevU0mwMPl4HrTcN91W4p21gMbqTYB15pc+lJRRRQeBR0HuaP8AJNH+cUdvb24o7df1zR/n\nFHb2/lR1470DpRRRRRRRS5pNuOVNIT/eWjK+rCjK+hNLljwBgUBQKUmkoooooooooooooooooooo\npc4FIOOTS555GT6UFVbqM/yoAK/d5HstIWXuvP0waTK9MsR6GgFR0XI9TRhs8nin9BxSZpKKKKKK\nDy2KPf8AAUf5FFHvR1ooo/pR0b60GiiiiiiijNLmjijijNJRRRRRRRRRRRRRRRRRRRRRSik6t7UZ\n7/lR/k+9FL17Z/M0ZH+elHHp/wDWozjt9aOuV/KkU5FFFFFFFKKQdSaB2+maPb6CjrQO2M57fp/i\nPzoB3AEEEHoc5z09zxyO56g0daP8/nQO30pOwpxpMUYoxRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\nSjpTR90n1pen4cCj/wDVRSHGOcY98f1pf8/5/wAKP8//AFqP8/hR0x7HFA4cig0UUcmj8aPxpRSD\n7xFA7fTFHv8A54oo7f40Z5znn16/1P8AOj6Ufy60Dj8BRjgUpIFJlj0FGGoyw6igMDS4pKKKKKKK\nKKKKKKKKKKKKKKKKKKKKKKXtTR9wfWl7/wDAqO34f1o78+vP58/0oB24JOPU5x6Z5yPf8xwcYIO3\nr+Xp/wDX/A0DqPw/n/hSfw/h/WlP8X1oP36U9aSiiiiig8EGjocfiKP8/Q0UUdf/ANdFH+TS4/Wk\nyWbA6CjgHgZNH1JPsKMf7J/Ojp3I+tB/2h+NHK/Sl60lFFFFFFFFFFFFFFGKXAHWjcopN60u5TRj\n0pKKKKKKKUU0dCKXr+P86KKBntn8M/0ooo+v1NHoPXk0DliaU0nvRRRRRR1FA5GD17UD9fSj/PuK\nPp/PFH1/U5o/zmj/ACBQxPQdTQBgYH4mj+Xp60e36Ck4/wBn9aX+X5ij8Pwo6f7poHynFKaSiiii\niiiiiiiilApC2OB1pNvdz+FKP9lPxNL83on50hx/EmPcUmCOVORTgwb60EUlFFFFAoPDZo9ux6Uf\n5Io/zmjGe2fwzR09v8+lH8/T/Gj+Xf3ozgZ7mgDAoNFFFFFFFBGelGc4z1oPuM+4oz7j8RRn3A+g\no+g/E0ucDPU01RgFj1NKfTsOtH+T/hRRn3P5n/8AVRR/n6Uf14NB5XHcUo5FJRRRRmjJ9KMn0oyK\nKKKKBQxxwOtAG3gcsaB145PcnoKOvJ592OBSfL/0z/I0vT/Z/HIo7/3W/Q0EbuRwwpVO4e9JRRRR\nRS9RTRxwaXp1/A0e/wCoo4/2f5UcdiP+AijoOeB6Ue56dhQOTk0uaTvRRRRRRRRQcEUYI6GjJ9KM\nn0owT1NKcBaO6j0GaTsD7Zo6fh/k0UZ568/X/wCv/TFFFHt68UDkj3FC9DRRQTijHrR+lH4mj8fz\noPuKOR9KOtFFL0GaavALn8KXGOM89WNH4fQenuaO/v645/8ArUbucbuf98UdM9vXj+Yo7YI47j0o\nOf8AgQ/UUh4IYdDTj60lFFFFFL1pOV9xQMdjil59VNGD/eA+lGAOgyaNhPJoNJR3ooooooooo7Ut\nGaM0Ujfdpf4h7ik7f8BoPOffP60Z5z75/XP86AduAD0xgE+mMcZ56eh78jLZTHGO2MfoB/IUp5z7\n/wBTRnnPuTQOq/She9FB4FHT60fzo/zmj8/zxR/nmj/OKP5UdD7UUUP93FHRgOyjNHbn/eP9KPbv\n/X/61HX8f1/z6UvzED72DwOpB/TB/Ck/z/n2o6dunb+Yo6fh/I0Y4ZfTkUq8pSUUUUUUUuaXaD1p\np2jpRtY+1GMfxijD9iDRvI4YUvB6Uho/rRRRRRRRR3ozRRxRxQRlaAflB9KPp9RR/kf4UUc9Ofpz\n/Kiijr+P8qM9T+AoXhaKOpo9/Wiiiiiij2oHSih/4aG6yfSl/i/4EtIOcZ6cZ/765pOdvQbsdD64\nP9cD6UrL1ZVznIBK43dcAnH+7kZOMnhdoLrwW65Gep7jJ/8AZeaRf4c9fl/z+VJ/D/wD+tO/iP8A\nu0ifcooooooopQKQkscDpQOOFGT60dT3Y+3SjgdkH1NGB12491NGTj+8tJjHK8inAhhSe1FFFH+e\ntFFFFFFFFKKTo3PQ0dOD+Bo/D6iijj2/X+VH+ef8KP8AOPWj27nrSHk4HQU40lJ2pf8A9VFFHfvR\nRRR0/A0fxUd6H+6DSnlvZhik6j6jH4ijr269v5ij9c/r/n0pONx6buh6E/yz+ZxS9ff+tHP49vrR\n1GB34H0oz99vwFKvCUlFFFFFKKRjk7RR/sjoOpo6gccdh60devb8AKADjgHHslHf39uD+VHfOeex\nHejpyB9RSH5SCOhpxGRmk+tFFFFFFFFFFFFKeRTf9lqXtzyPWjr6H+dHP+3R09vc0D2/M0mew/On\nAYFJR2o/h/Gjv+NHajvQB04z/n/P5npwQfj+P5f5/Gijt+FB7/Wj+Kil6rimjldvcdKXIIz2PX2o\n74PJP60dc9/Xj+Yo3ZGN2R6bmP6UfXOfTv8A/Wo9efqfT2oz37ngD0pG7IPxpx4GKSiiiiilHSmg\n8FvypcYGD0HJo+vXv/hR/njt9KMZ5xn3xn9Sf5Uf5H/1vSj9c/r/APXo6c9SP1FGOq9jyKEOVxRR\nijmj8KOaAKO9FFFFFFFL1pMEHigkdxSfL6mjI7DNLyfYUvApKKKB3FHX8aKKD7/riiiij0H40Dkk\n0UoNIw53Cjr8y9e4oHI45H930o4PcH68Gl+b/a/77pOOnH0X/Gg8Yz17KKCdvJ5Y0KMcnrQaKKKK\nKKU/cNIBwg9TQOeT3JJ/CgZ49f6n/wCtRxj2x39Ov8uaMZzxn1yPw54PqB2HOM5o/X/P/wBY/lR9\nDk9c++M/qKOMj0z+hoHG32OKF4dhQetFFFFFHrRRRRRRRRRngUuaOPSjNGaSiiig8HNH8jR/P+dF\nH+etFH+fpR/KjoPc0DgUUUoNIV5ytJkH7wwfWnYJ7qw96Taf+eY/OjkDkhR7Um4DhB+NKFxyetKT\nSUUUUUUUp+4aQHhD70DsPcj86Aeh+h/Lg0Y4weeMfXjH6igjfnI3Zzn5c9c57H+83cfeYZwSCZJO\nc8k5yT35OfzJP1o6Dj8PywKO4+o/Sgc7fck0Ly7Gg9aKKKKKO9FFFFFFFFHpRRRRRRRRRR0+lH6i\nj9aPx/MUfmaP84o6cmgDuaKKKKUGjg9aTYOxo2f7Ro2DvS8DpSZoooooooopRyMU1eVK9xyKXrz2\nb9DR7nj19j60fh+H+eooxntn8Af6/wA6Pf8AX/P8qP5+/b3o+nfgfSjPJPYDAoToT60UUUUUUUUU\nUUUUUUd6KKKKKKKKKOtHI6UZH0o/4FRx60Z9BRj1oooooooooooooooooooopQRSMcNuFHHX+E9a\nOmOfoaPbp7H+hoIJ6gn6qD+tB468fXr+Ao+o/DufrRznH8R6+1IecKOgpx4GKSiiiiiij2oooooo\nooooooooooooooowKOKKKKKKKKKKKKKKKKKKKKKM+lFH4UvXjim/cPTilGQPl5HpQCOgOPZqNv8A\nsr+DUdO6r9OTQM/wjA9TSZxwv504DaPekooooooooo+tFFFFH0oxRRRRRRRRRRRRRRRRRRRRRRRR\nRRRRRRRRRRR1ooo/zzR+VLntSbe6n8KQlh1XNGVP8FGf7qUuGbqaUAL0pM0UUUUUUUUUUYo5o5pc\nUcUZX1pflPejbSYpKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKO1FFFFH+fWijNLuozzS5pM0lFFFFFF\nFFFFFFLRyelISq8dTRhiMnCj3pML/vfSkxH6MtKAR91s0obsRS49KSiiiiiiiiiiiiiiiiiiiiii\niiiiiijvRRRRR/nmiiijtRRRRRRRRRRRRRRRSgbj7UjHsKANvA+8aMDPIDH37UZzwCD7IKXkd3/4\nEKTjGcAj1HajoOeVPej7p9qU880lFFFFFGKXFGVHejenrRkHpQQfSkzRRRRRRRRRRRRRRRQOtA7U\ndvwoo/z/AJ/SjAHb9P8APt/9frR9KKO/40dqO1FFFFFFFFFFFFKBQcDiguFXApobAzt5PQUu4DI5\n9zS8EccD0zgfiaQ9OTke54/xo4HbB9iQfwzR3znn1/xoHB6cHqKFwPlP3T0oU4JU0pIpMiiiilAp\nCwHA60YOMs2BSAKeik0uP+mVJhT3KmjLJ1yRTgQw45pMelHWiiiiiiiiiiiiijvRRRRRRRR0o7UU\nUUUUUUUUUUUoFGecCkAG7LH8KGySAAACe9BbktvHHA4o56YVscfU0mAfunB9+/vShiDhsg9Oc5/x\n/ClII45H4H+RpP09Pb/61Gey/Ue3tSEA/iMilb+FgKcc+1N47jFHI6c0daUCkZscDrQBt4HLUAZP\n94jqT0FH3u7MPbgUYHZfwD0ZJ45PseKASPu5I7ik6fMvSn/eGe9No60UUUUUUUUUUUUHpR70Uf5+\nlFFFFHtQOTRRRRRRRRRRRQKGOOB1oAxwPvGhepx17k0D/W5/2eppVydn3sFv7tNHKg8E7c8cHk0v\nX6ZwD+IA/Un8hR2wwxgenbk+g/ut2GeOBnFAGzKsMY5IAA7MewHZcg/QgsGBKnhsH15/PB/mKQcA\neoGc/Q4o6bcdnIzSN/qz7HvTuNo6Un6Ufz9KPcU7OFzTF4G7uelKRgYz/vGg9hjjrj0+tHXBPOem\nRn8hRjjlePdB/SjrxyfQdfyNHXB3c9if5GjOPmxx0PtSAbHx2NOPrSdDRRRRRRRRRRRRR3o6Ufyo\noo+v6mj9aKPajpRRRRRRRRRRRSj1po7saUenc8k+lKv3v5CkHEgPP9f/AK1IBgZx91uTgn9aXHY+\n46+voaOuT1Jzn39R9aBggAcg9CP/AK38h3pD9zdjGDzx/wDWHOfb604E4z1bP6/55NJgAYzwOM+v\nrR3XPux9qQ/6sepOadngDP60lFHfP50ScED1pTwxPZRSdDjrjk+5o+vOT37+9H9f88/4Ug25ONuR\n1I28fl0pfrn+X+TR9Sfc/wAjQOoz3+U/WkP+rz3U4p3UA0naiiiiiiiiiiiigd6KOlH6UflRj2o+\npo69KBxR2FFFGaOaOaM0UUUUUNwtGPuj8aOvXvyfpQc5z3/rQ/ZhzQcbgTg7h+J/XP5Ufqeh9x/n\nvR1xz16H19OaMFs9STz6nP8An0pSPm74I64I/U0i9PpwB/hRjnHYdf8ACjkn3b9BQeXA7Clb8f1p\nKKUdf0pG++vtR1B92FH8f4sfyFHQDjOO3rhc/wA6MdiRjoSfqMn9ST7ClBLEAkgggYJztzjjqccE\n8YH3W4xtZm5+TPTjP0+XP6GlYckYx94fpn+v6d+tBOdx/wB00H/lpSr90e5pOxo7UUUUUUUUUUUU\nDrRRRRijFGKKKPSgmj60fpRR+dH60fSiiiih/u0v8Q/3aT+H/gNKf4h/vUvy7iDypPQemf8ACmr8\nuEc5U4PB69ORz9eccZHIwQwcqAGPzY4YevH9cmgtnO1eueOx54pSW3DcvGT9/kU1W+ePhc46gE0q\nEHdyRk8k9TQ3GBjucCg/IP8AaP8AhSqMD/P+fWk+vGf8/wCP6euAdqD/AI0f/Wofhs0uPvj8RSZ+\nYsP94f1o6dD0GQf5Gjp7Y/T/AD2NHOADnGMAH09ByfyGBR+vb6+3+NGM8A9eP8TR94j/AGjn8BSE\n/Izeppw4T6Uh6ilNJRRRRRRRRRRRRRRRRRRRRRRRRR/niiij3ooopSMrSZwFPpxRz36D+VJwO547\n/wAjTgF7gj/P8qDuYEISQfrj/CmAheGyc0/DY4KkenvTfu9PMXsOM0pf5s+azADGMYpFUkHC7Ce5\npd2w46k96UL/ABGgmk+lFFH/AOuhhlDSg5UMOo60mOMA+6mj36Y/T/61HT2Hbn+Ro4Gegz7qM/lz\nQfx549Cfp/ntSE5z+vt7UEt6HLcD6UMcsFA6U4kfgBSd6DRRRRRRRRRRRRRRRRRRRRR3oooooooo\noHWiilz2po4JXrmlAJPqwpQB/e49h0pG4wASPr/Q0uzHAGT3bbSEjGD0PfuabswflOPp1p2JRzk+\nwLUjb8BOp9xzS4JXkkgdu4pQFAx2PQ0gJBwaU0nX/OaKKP5mlB5xSH5Gz2o4Ge6H9KDxg56fxCgZ\n6j8Sv+FHOeA2fZAKCAv3jjPbqTRkgDgAdloLFckyDcaVAQM5BzSEhjjGDR0NFFFFFFFFFFFFFFH1\nooooo+lAo9aKKKKKKKKO9FB4FIP1NOIGOOvc0n3uGOD2FL05wAffoaaPlBbABPQCkwOnyjuTzT+F\n+9yfRRwKMkcBRjsOw+tAd1OCV3enH8qUFh1AP8v/AK1IcMcg4Pv/ACpuMf7p7eho6r7inA5GaT8/\nzo/zxR/Ojp9aBxTuvBphBQ5HIpQQeVOD3FBU/wBzn1U0dONjk/WgAj7uF9TSblH3TuP95qVRjnJJ\n9lpT83XB/Q0mePUfqKBwPUGjoaKKKKKKKKKKKKKKKOaOaKKKOxooxRxRk+lH4f5/yaOtFFHpR3pG\n5IFL06degpRwcDrSEA8j8/WkY7Vww/PrQByqg474IIp2SMAbc/eOaTpxuyR+h70gPZQSDyDnGKNo\nXnC47+n8sfmc04+o49wcik4P3uh/io56HuP1FJ/F6bhSpkg9DRj2FH1NGfSgDFFFKDQVBpAhHIbi\njD9N3J/SjywepJHYHvThgdOffH8qQnP/AOsn+VJ168jsM/1o6nOfx/xo/l3HpR7UUUUUUUUUUUUU\nUUUUUUUUd6PrRRR+dH50Ufyoo6mjvQvL5oHY+po7fh+tL3/z9KRz8nt/+v8AwpSoTjGCV6Dj19h6\nfy6gg0mxQNv+zz+fNBUc4GTzgev1p2RuHAK7uM9Oucf0pvPl5IJ2nBJA9s9uM4OeR1PB+UqAfLjJ\nzjBOMHoOo/DNB5zgde3rk0oIyP7pJI9qF52qeoFNQcmlx70YFFFFFFFHpRnPXvRnPf8Az6UH3P8A\nn/Cj8KPrRR35+ho9KO9FFFFFFFFFFFFFFFFFFFFHej19qPT3pCcHGKVeT6fSjtn0o7igd6BRQKB/\nD7Udh9DR1OPcD8xSE5XP+zn9acflcYA4GenrQByB/tkfXHNIOQuf4utAOSD6gt/9b6U5Iw0W/gEj\nONo/njNNXlU91J+mKM/Lnvt3fjQejD/ZFL/GD7Ug4zRRRRRRRRRR2opDwDjsP5Af40r/ACq5A+6G\nI/DzP/iB+ZpWGHK9QGI/8eI/lSDt+FFFFFFFFFFFFFFf/9k=\n", | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"DisplayArray(U, rng: (-0.1, 0.1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Swift", | |
"language": "swift", | |
"name": "swift" | |
}, | |
"language_info": { | |
"file_extension": ".swift", | |
"mimetype": "text/x-swift", | |
"name": "swift", | |
"version": "" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment