diff --git a/_toc.yml b/_toc.yml index b804206..b9c7281 100644 --- a/_toc.yml +++ b/_toc.yml @@ -19,7 +19,6 @@ - file: diffphys sections: - file: diffphys-code-gradient.ipynb - - file: diffphys-code-tf.ipynb - file: diffphys-discuss.md - file: diffphys-code-ns-v2a.ipynb - file: diffphys-code-sol.ipynb @@ -29,6 +28,8 @@ - file: overview-burgers-forw-v1.ipynb - file: overview-ns-forw-v1.ipynb - file: diffphys-code-ns.ipynb + - file: diffphys-code-gradient-v1.ipynb + - file: diffphys-code-tf.ipynb - file: jupyter-book-reference sections: - file: jupyter-book-reference-markdown diff --git a/diffphys-code-gradient-v1.ipynb b/diffphys-code-gradient-v1.ipynb new file mode 100644 index 0000000..fb556b2 --- /dev/null +++ b/diffphys-code-gradient-v1.ipynb @@ -0,0 +1,285 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Burgers Optimization with a (Manual) Differentiable Physics Gradient\n", + "\n", + "To illustrate the process of compute gradients in a differentiable physics setting, we first demonstrate a process that isn't recommended for more complex real-world cases, but more clearly shows the way we can get gradient information from a physical simulation in a DL framework. We'll target tensorflow in the following.\n", + "\n", + "We target the same reconstruction task like for the PINN example. This has some immediate implications: the evolution of the system is now fully determined by our PDE formulatio. Hence, the only real unknown is the initial state! We will still need to re-compute all the states betwwen the initial and target state many times, just now we won't need an NN for this step, we can rely on our discretized model. Also, as we choose an initial discretization for the DP approach, the unknown initial state consists of the sampling points of the involved physical fields, and we can simply represent these unknowns as floating point variables. Hence, even for the initial state we do not need to set up an NN. Thus, our Burgers reconstruction problem reduces to a gradient-based opitmization without any NN when solving it with DP. Nonetheless, it's a very good starting point to illustrate the process.\n", + "\n", + "First, we'll set up our discretized simulation. Here we can employ the phiflow solver, as shown in the overview section on _Burgers forward simulations_. phiflow directly gives us a computational graph in tensorflow. So, as a first step, let's set up our grid with 128 points, and construct a tensorflow graph for 32 steps of the simulation. (As usual, you can ignore the warnings when loading TF and phiflow.)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Each velocity is a phiflow grid like this one: Grid[128(1), size=[2.], ]\n" + ] + } + ], + "source": [ + "from phi.tf.flow import *\n", + "\n", + "# run with phiflow\n", + "n = 128\n", + "dt = 1./32.\n", + "initial = np.zeros([n,1]) # start from 0\n", + "\n", + "domain = Domain([n], boundaries=PERIODIC, box=box[-1:1])\n", + "state0 = BurgersVelocity(domain, velocity=initial, viscosity=0.01/np.pi)\n", + "\n", + "# start with a state0, to be modified\n", + "state_in = state0.copied_with(velocity=placeholder)\n", + "states = [state_in]\n", + "\n", + "for i in range(32):\n", + " states.append( Burgers().step(states[-1],dt=dt) )\n", + "\n", + "print(\"Note: each velocity is a phiflow grid like this one \" + format(states[-1].velocity) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**A lot** has happened in these first steps, but we didnt run a single calculation for our simulation. In contrast to the first example, which used numpy as phiflow backend, we now have used the tensorflow backend (the trick here was importing `phi.tf.flow` instad of `phi.flow`). This gave us a tensorflow graph, but didn't run any real simulation steps. That will only happen once we run a tensorflow session and pass some data through this graph. So, in a way _nothing_ has happened so far in terms of our simulation! \n", + "\n", + "Next, let's set up the loss, such that we can start the optimization. That's actually pretty simple, we want the solution at $t=0.5$, i.e. step number 16, to respect the data in terms of an L2 norm. Let's also directly initialize the TF variables, and see what loss we get from the initial zero'ed initialization:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:17: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n", + "\n", + "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:18: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n", + "\n", + "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:28: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.\n", + "\n", + "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:29: The name tf.train.Saver is deprecated. Please use tf.compat.v1.train.Saver instead.\n", + "\n", + "Initial loss 0.3829152584075928\n" + ] + } + ], + "source": [ + "sess = Session(None) \n", + "\n", + "# enforce constraints at time t=0.5 (step 16)\n", + "solution_t16 = np.asarray( [0.008612174447657694, 0.02584669669548606, 0.043136357266407785, 0.060491074685516746, 0.07793926183951633, 0.0954779141740818, 0.11311894389663882, 0.1308497114054023, 0.14867023658641343, 0.1665634396808965, 0.18452263429574314, 0.20253084411376132, 0.22057828799835133, 0.23865132431365316, 0.25673879161339097, 0.27483167307082423, 0.2929182325574904, 0.3109944766354339, 0.3290477753208284, 0.34707880794585116, 0.36507311960102307, 0.38303584302507954, 0.40094962955534186, 0.4188235294008765, 0.4366357052408043, 0.45439856841363885, 0.4720845505219581, 0.4897081943759776, 0.5072391070000235, 0.5247011051514834, 0.542067187709797, 0.5593576751669057, 0.5765465453632126, 0.5936507311857876, 0.6106452944663003, 0.6275435911624945, 0.6443221318186165, 0.6609900633731869, 0.67752574922899, 0.6939334022562877, 0.7101938106059631, 0.7263049537163667, 0.7422506131457406, 0.7580207366534812, 0.7736033721649875, 0.7889776974379873, 0.8041371279965555, 0.8190465276590387, 0.8337064887158392, 0.8480617965162781, 0.8621229412131242, 0.8758057344502199, 0.8891341984763013, 0.9019806505391214, 0.9143881632159129, 0.9261597966464793, 0.9373647624856912, 0.9476871303793314, 0.9572273019669029, 0.9654367940878237, 0.9724097482283165, 0.9767381835635638, 0.9669484658390122, 0.659083299684951, -0.659083180712816, -0.9669485121167052, -0.9767382069792288, -0.9724097635533602, -0.9654367970450167, -0.9572273263645859, -0.9476871280825523, -0.9373647681120841, -0.9261598056102645, -0.9143881718456056, -0.9019807055316369, -0.8891341634240081, -0.8758057205293912, -0.8621229450911845, -0.8480618138204272, -0.833706571569058, -0.8190466131476127, -0.8041372124868691, -0.7889777195422356, -0.7736033858767385, -0.758020740007683, -0.7422507481169578, -0.7263049162371344, -0.7101938950789042, -0.6939334061553678, -0.677525822052029, -0.6609901538934517, -0.6443222327338847, -0.6275436932970322, -0.6106454472814152, -0.5936507836778451, -0.5765466491708988, -0.5593578078967361, -0.5420672759411125, -0.5247011730988912, -0.5072391580614087, -0.4897082914472909, -0.47208460952428394, -0.4543985995006753, -0.4366355580500639, -0.41882350871539187, -0.40094955631843376, -0.38303594105786365, -0.36507302109186685, -0.3470786936847069, -0.3290476440540586, -0.31099441589505206, -0.2929180880304103, -0.27483158663081614, -0.2567388003912687, -0.2386513127155433, -0.22057831776499126, -0.20253089403524566, -0.18452269630486776, -0.1665634500729787, -0.14867027528284874, -0.13084990929476334, -0.1131191325854089, -0.09547794429803691, -0.07793928430794522, -0.06049114408297565, -0.0431364527809777, -0.025846763281087953, -0.00861212501518312] )\n", + "target = state0.copied_with(velocity=np.reshape(solution_t16,[n,1]))\n", + "\n", + "loss = math.sum( (states[16].velocity.data - target.velocity.data)**2 ) / n\n", + "sess.initialize_variables()\n", + "\n", + "# compute initial loss\n", + "s,l = sess.run([states[-1],loss], feed_dict={state_in: state0})\n", + "print(\"Initial loss \"+format(l))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not surprisingly, because we're starting from zero, there's a significant intial error of ca. 0.38 for the 16th simulation step.\n", + "\n", + "Note that because we're only constraining timestep 16, we could actually omit steps 17 to 31 in this setup. They don't have any degrees of freedom and are not constrained in any way. For fairness and for direct comparison with the previous PINN case, let's include them.\n", + "\n", + "Now we have our simulation graph in TF, we can use TF to give us a gradient for the initial state for the loss. All we need to do is run `tf.gradients(loss, [state_in.velocity.data]`, which will give us a direction for each velocity variable. Based on a linear approximation, this direction tells us how to change each of them to increase the loss function (gradients _always_ point \"upwards\"). In the following code snipped, we're additionally saving all these gradients in a list called `grads`, such that we can visualize them later on. (Normally, we could discard each gradient after performing an update step.)\n", + "\n", + "Based on the gradient, we can now take a step in the opposite direction to bring the loss down (instead of increasing it). Below we're using a learning rate `LR=5` for this step. Afterwards, we're re-evaluating the loss for the updated state to check how we did. As these updates aren't exactly fast, we're only computing five of them here:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /usr/local/lib/python3.7/site-packages/tensorflow_core/python/ops/math_grad.py:1375: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use tf.where in 2.0, which has the same broadcast rule as np.where\n", + "Step 0, loss = 0.3829152584075928\n", + "Step 1, loss = 0.3334265947341919\n", + "Step 2, loss = 0.2905231714248657\n", + "Step 3, loss = 0.25346457958221436\n", + "Step 4, loss = 0.2215319573879242\n" + ] + } + ], + "source": [ + "LR = 5.\n", + "stateN = state0\n", + "grads = []\n", + "for i in range(5):\n", + " grads.append( tf.gradients(loss, [state_in.velocity.data] ) ) # use TF\n", + " grads.append( gradients(loss, state_in.velocity) ) # phiflow wrapper also works\n", + "\n", + " state_updated = state_in.copied_with( velocity=(state_in.velocity - LR*grads[-1]) )\n", + " stateN,l = sess.run([state_updated,loss], feed_dict={state_in: stateN})\n", + "\n", + " #s,l = sess.run([states[-1],loss], feed_dict={state_in: stateN})\n", + " print( \"Step {}, loss = {}\".format(i,l) )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One of the reasons for the bad performance here is that we're querying states via `sess.run()` multiple times, instead of computing the update in one go. Nonetheless, this simple example already clearly shows that the loss is nicely going down: from above 0.38 to ca. 0.22. This is a good sign!\n", + "\n", + "Before improving on the performance, let's visualize the reconstruction.\n", + "\n", + "Starting from the zero state `state0` (shown in blue), the first gradient is shown as a red line here. If you compare it with the solution it points in the opposite direction, as expected. The solution is much larger in magnitude, so we omit it here (see the next graph).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "fig = plt.figure().gca()\n", + "pltx = np.linspace(-1,1,n)\n", + "\n", + "# first gradient\n", + "[grad0,s0] = sess.run([grads[0],state0], feed_dict={state_in: stateN}) #.velocity.data\n", + "fig.plot(pltx, grad0[0].flatten() , lw=2, color='red') \n", + "\n", + "fig.plot(pltx, state0.velocity.data.flatten(), lw=2, color='mediumblue')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So the gradient looks good (feel free to plot the others from the five iterations above).\n", + "\n", + "How well does the 16th state of the simulation actually match the target after the 5 update steps? This is what the loss measures, after all. The next graph shows the constraints (i.e. the solution we'd like to obtain) in green, and the reconstructed state after the initial state was updated 16 times by the solver:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure().gca()\n", + "\n", + "# target constraint at t=0.5\n", + "fig.plot(pltx, target.velocity.data.flatten(), lw=2, color='forestgreen') \n", + "\n", + "# constrained state of simulation\n", + "contrained_state = sess.run(states[16], feed_dict={state_in: stateN}).velocity.data\n", + "fig.plot(pltx, contrained_state.flatten(), lw=2, color='mediumblue')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This seems to be going in the right direction! It's not there yet, but we've also only computed 5 steps so far. The two peaks with a positive velocity on the left side of the shock and the negative peak on the right side are starting to show.\n", + "\n", + "This is a good indicator that the backpropagation of gradients through all of our 16 simulated steps is behaving correctly, and driving the solution in the right direction. This hints at how powerful this setup is: the gradient that we obtain from each of the simulation steps (and each operation within them) can easily be chained together into more complex sequences. Here, we're backpropagation through all 16 steps of the simulation, and we could easily enlarge this \"look-ahead\" of the optimization without any additional effort.\n", + "\n", + "A simple direct reconstruction problem like this one is always a good initial test for a DP solver, e.g., before moving to more complex setups like coupling it with an NN. If the direct optimization does not converge, there's probably still something fundamentally wrong, and there's no point involving an NN. \n", + "\n", + "Our Burgers example here looks good - before including an NN, let's address the performance issue so: here we've updated our solutoin via a gradient that is \"manually\" computed with multiple TF session run() calls. TF's own optimizers do this internally, more flexibly and more efficiently. Let's start over, and switch to a `tf.train.Optimizer()` instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/diffphys-code-gradient.ipynb b/diffphys-code-gradient.ipynb index a266de0..c925d22 100644 --- a/diffphys-code-gradient.ipynb +++ b/diffphys-code-gradient.ipynb @@ -4,13 +4,50 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Burgers Optimization with a (Manual) Differentiable Physics Gradient\n", + "# Burgers Optimization with a Differentiable Physics Gradient\n", "\n", - "To illustrate the process of compute gradients in a differentiable physics setting, we first demonstrate a process that isn't recommended for more complex real-world cases, but more clearly shows the way we can get gradient information from a physical simulation in a DL framework. We'll target tensorflow in the following.\n", + "To illustrate the process of computing gradients in a _differentiable physics_ setting, we target the same reconstruction task like for the PINN example. This has some immediate implications: the evolution of the system is now fully determined by our PDE formulation. Hence, the only real unknown is the initial state! We will still need to re-compute all the states betwwen the initial and target state many times, just now we won't need an NN for this step. Instead, we can rely on our discretized model. \n", "\n", - "We target the same reconstruction task like for the PINN example. This has some immediate implications: the evolution of the system is now fully determined by our PDE formulatio. Hence, the only real unknown is the initial state! We will still need to re-compute all the states betwwen the initial and target state many times, just now we won't need an NN for this step, we can rely on our discretized model. Also, as we choose an initial discretization for the DP approach, the unknown initial state consists of the sampling points of the involved physical fields, and we can simply represent these unknowns as floating point variables. Hence, even for the initial state we do not need to set up an NN. Thus, our Burgers reconstruction problem reduces to a gradient-based opitmization without any NN when solving it with DP. Nonetheless, it's a very good starting point to illustrate the process.\n", + "Also, as we choose an initial discretization for the DP approach, the unknown initial state consists of the sampling points of the involved physical fields, and we can simply represent these unknowns as floating point variables. Hence, even for the initial state we do not need to set up an NN. Thus, our Burgers reconstruction problem reduces to a gradient-based opitmization without any NN when solving it with DP. Nonetheless, it's a very good starting point to illustrate the process.\n", "\n", - "First, we'll set up our discretized simulation. Here we can employ the phiflow solver, as shown in the overview section on _Burgers forward simulations_. phiflow directly gives us a computational graph in tensorflow. So, as a first step, let's set up our grid with 128 points, and construct a tensorflow graph for 32 steps of the simulation. (As usual, you can ignore the warnings when loading TF and phiflow.)" + "First, we'll set up our discretized simulation. Here we can employ phiflow, as shown in the overview section on _Burgers forward simulations_. \n", + "\n", + "## Initialization\n", + "\n", + "phiflow directly gives us a sequence of differentiable operations, provided that we don't use the _numpy_ backend.\n", + "The important step here is to include `phi.tf.flow` instad of `phi.flow` (for _pytorch_ you could use `phi.torch.flow`).\n", + "\n", + "So, as a first step, let's set up some constants, and intialize our domain with 128 points. We'll directly allocate a `velocity` field, and our constraint at $t=0.5$ (step 16), now as a `scalar_grid` in phiflow.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "#!pip install --upgrade --quiet git+https://github.com/tum-pbs/PhiFlow@develop\n", + "#!pip install --upgrade --quiet phiflow\n", + "from phi.tf.flow import *\n", + "\n", + "N = 128\n", + "STEPS = 32\n", + "DT = 1./STEPS\n", + "NU = 0.01/np.pi\n", + "\n", + "DOMAIN = Domain(x=N, boundaries=PERIODIC, bounds=Box[-1:1])\n", + "\n", + "# initialization of velocities\n", + "velocity = DOMAIN.scalar_grid() # start from zero\n", + "\n", + "SOLUTION_T16 = DOMAIN.scalar_grid(np.asarray( [0.008612174447657694, 0.02584669669548606, 0.043136357266407785, 0.060491074685516746, 0.07793926183951633, 0.0954779141740818, 0.11311894389663882, 0.1308497114054023, 0.14867023658641343, 0.1665634396808965, 0.18452263429574314, 0.20253084411376132, 0.22057828799835133, 0.23865132431365316, 0.25673879161339097, 0.27483167307082423, 0.2929182325574904, 0.3109944766354339, 0.3290477753208284, 0.34707880794585116, 0.36507311960102307, 0.38303584302507954, 0.40094962955534186, 0.4188235294008765, 0.4366357052408043, 0.45439856841363885, 0.4720845505219581, 0.4897081943759776, 0.5072391070000235, 0.5247011051514834, 0.542067187709797, 0.5593576751669057, 0.5765465453632126, 0.5936507311857876, 0.6106452944663003, 0.6275435911624945, 0.6443221318186165, 0.6609900633731869, 0.67752574922899, 0.6939334022562877, 0.7101938106059631, 0.7263049537163667, 0.7422506131457406, 0.7580207366534812, 0.7736033721649875, 0.7889776974379873, 0.8041371279965555, 0.8190465276590387, 0.8337064887158392, 0.8480617965162781, 0.8621229412131242, 0.8758057344502199, 0.8891341984763013, 0.9019806505391214, 0.9143881632159129, 0.9261597966464793, 0.9373647624856912, 0.9476871303793314, 0.9572273019669029, 0.9654367940878237, 0.9724097482283165, 0.9767381835635638, 0.9669484658390122, 0.659083299684951, -0.659083180712816, -0.9669485121167052, -0.9767382069792288, -0.9724097635533602, -0.9654367970450167, -0.9572273263645859, -0.9476871280825523, -0.9373647681120841, -0.9261598056102645, -0.9143881718456056, -0.9019807055316369, -0.8891341634240081, -0.8758057205293912, -0.8621229450911845, -0.8480618138204272, -0.833706571569058, -0.8190466131476127, -0.8041372124868691, -0.7889777195422356, -0.7736033858767385, -0.758020740007683, -0.7422507481169578, -0.7263049162371344, -0.7101938950789042, -0.6939334061553678, -0.677525822052029, -0.6609901538934517, -0.6443222327338847, -0.6275436932970322, -0.6106454472814152, -0.5936507836778451, -0.5765466491708988, -0.5593578078967361, -0.5420672759411125, -0.5247011730988912, -0.5072391580614087, -0.4897082914472909, -0.47208460952428394, -0.4543985995006753, -0.4366355580500639, -0.41882350871539187, -0.40094955631843376, -0.38303594105786365, -0.36507302109186685, -0.3470786936847069, -0.3290476440540586, -0.31099441589505206, -0.2929180880304103, -0.27483158663081614, -0.2567388003912687, -0.2386513127155433, -0.22057831776499126, -0.20253089403524566, -0.18452269630486776, -0.1665634500729787, -0.14867027528284874, -0.13084990929476334, -0.1131191325854089, -0.09547794429803691, -0.07793928430794522, -0.06049114408297565, -0.0431364527809777, -0.025846763281087953, -0.00861212501518312] ))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can verify that the fields of our simulation are now backed by TensorFlow." ] }, { @@ -19,41 +56,29 @@ "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Each velocity is a phiflow grid like this one: Grid[128(1), size=[2.], ]\n" - ] + "data": { + "text/plain": [ + "tensorflow.python.framework.ops.EagerTensor" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "from phi.tf.flow import *\n", - "\n", - "# run with phiflow\n", - "n = 128\n", - "dt = 1./32.\n", - "initial = np.zeros([n,1]) # start from 0\n", - "\n", - "domain = Domain([n], boundaries=PERIODIC, box=box[-1:1])\n", - "state0 = BurgersVelocity(domain, velocity=initial, viscosity=0.01/np.pi)\n", - "\n", - "# start with a state0, to be modified\n", - "state_in = state0.copied_with(velocity=placeholder)\n", - "states = [state_in]\n", - "\n", - "for i in range(32):\n", - " states.append( Burgers().step(states[-1],dt=dt) )\n", - "\n", - "print(\"Note: each velocity is a phiflow grid like this one \" + format(states[-1].velocity) )" + "type(velocity.values.native())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**A lot** has happened in these first steps, but we didnt run a single calculation for our simulation. In contrast to the first example, which used numpy as phiflow backend, we now have used the tensorflow backend (the trick here was importing `phi.tf.flow` instad of `phi.flow`). This gave us a tensorflow graph, but didn't run any real simulation steps. That will only happen once we run a tensorflow session and pass some data through this graph. So, in a way _nothing_ has happened so far in terms of our simulation! \n", + "## Gradients\n", "\n", - "Next, let's set up the loss, such that we can start the optimization. That's actually pretty simple, we want the solution at $t=0.5$, i.e. step number 16, to respect the data in terms of an L2 norm. Let's also directly initialize the TF variables, and see what loss we get from the initial zero'ed initialization:" + "Now we can use the `record_gradients` function of phiflow to trigger the generation of a gradient tape to compute gradients of a simulation.\n", + "\n", + "For that we need a loss function: we want the solution at $t=0.5$ to respect the data in terms of an L2 norm. Thus we can simply compute an $L^2$ difference between step number 16 and our constraint array as `loss`. Afterwards, we evaluate the gradient of our initial velocity state `velocity` with respect to this loss." ] }, { @@ -65,110 +90,63 @@ "name": "stdout", "output_type": "stream", "text": [ - "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:17: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n", - "\n", - "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:18: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n", - "\n", - "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:28: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.\n", - "\n", - "WARNING:tensorflow:From /Users/thuerey/Dropbox/mbaDevelSelected/phiflow-v1.5/phi/tf/session.py:29: The name tf.train.Saver is deprecated. Please use tf.compat.v1.train.Saver instead.\n", - "\n", - "Initial loss 0.3829152584075928\n" + "WARNING:tensorflow:From /Users/thuerey/miniconda3/envs/tf/lib/python3.8/site-packages/tensorflow/python/ops/math_grad.py:297: setdiff1d (from tensorflow.python.ops.array_ops) is deprecated and will be removed after 2018-11-30.\n", + "Instructions for updating:\n", + "This op will be removed after the deprecation date. Please switch to tf.sets.difference().\n", + "Loss: 0.382915\n" ] } ], "source": [ - "sess = Session(None) \n", + "velocities = [velocity]\n", "\n", - "# enforce constraints at time t=0.5 (step 16)\n", - "solution_t16 = np.asarray( [0.008612174447657694, 0.02584669669548606, 0.043136357266407785, 0.060491074685516746, 0.07793926183951633, 0.0954779141740818, 0.11311894389663882, 0.1308497114054023, 0.14867023658641343, 0.1665634396808965, 0.18452263429574314, 0.20253084411376132, 0.22057828799835133, 0.23865132431365316, 0.25673879161339097, 0.27483167307082423, 0.2929182325574904, 0.3109944766354339, 0.3290477753208284, 0.34707880794585116, 0.36507311960102307, 0.38303584302507954, 0.40094962955534186, 0.4188235294008765, 0.4366357052408043, 0.45439856841363885, 0.4720845505219581, 0.4897081943759776, 0.5072391070000235, 0.5247011051514834, 0.542067187709797, 0.5593576751669057, 0.5765465453632126, 0.5936507311857876, 0.6106452944663003, 0.6275435911624945, 0.6443221318186165, 0.6609900633731869, 0.67752574922899, 0.6939334022562877, 0.7101938106059631, 0.7263049537163667, 0.7422506131457406, 0.7580207366534812, 0.7736033721649875, 0.7889776974379873, 0.8041371279965555, 0.8190465276590387, 0.8337064887158392, 0.8480617965162781, 0.8621229412131242, 0.8758057344502199, 0.8891341984763013, 0.9019806505391214, 0.9143881632159129, 0.9261597966464793, 0.9373647624856912, 0.9476871303793314, 0.9572273019669029, 0.9654367940878237, 0.9724097482283165, 0.9767381835635638, 0.9669484658390122, 0.659083299684951, -0.659083180712816, -0.9669485121167052, -0.9767382069792288, -0.9724097635533602, -0.9654367970450167, -0.9572273263645859, -0.9476871280825523, -0.9373647681120841, -0.9261598056102645, -0.9143881718456056, -0.9019807055316369, -0.8891341634240081, -0.8758057205293912, -0.8621229450911845, -0.8480618138204272, -0.833706571569058, -0.8190466131476127, -0.8041372124868691, -0.7889777195422356, -0.7736033858767385, -0.758020740007683, -0.7422507481169578, -0.7263049162371344, -0.7101938950789042, -0.6939334061553678, -0.677525822052029, -0.6609901538934517, -0.6443222327338847, -0.6275436932970322, -0.6106454472814152, -0.5936507836778451, -0.5765466491708988, -0.5593578078967361, -0.5420672759411125, -0.5247011730988912, -0.5072391580614087, -0.4897082914472909, -0.47208460952428394, -0.4543985995006753, -0.4366355580500639, -0.41882350871539187, -0.40094955631843376, -0.38303594105786365, -0.36507302109186685, -0.3470786936847069, -0.3290476440540586, -0.31099441589505206, -0.2929180880304103, -0.27483158663081614, -0.2567388003912687, -0.2386513127155433, -0.22057831776499126, -0.20253089403524566, -0.18452269630486776, -0.1665634500729787, -0.14867027528284874, -0.13084990929476334, -0.1131191325854089, -0.09547794429803691, -0.07793928430794522, -0.06049114408297565, -0.0431364527809777, -0.025846763281087953, -0.00861212501518312] )\n", - "target = state0.copied_with(velocity=np.reshape(solution_t16,[n,1]))\n", + "with math.record_gradients(velocity.values):\n", "\n", - "loss = math.sum( (states[16].velocity.data - target.velocity.data)**2 ) / n\n", - "sess.initialize_variables()\n", + " for time_step in range(STEPS):\n", + " v1 = diffuse.explicit(1.0*velocities[-1], NU, DT)\n", + " v2 = advect.semi_lagrangian(v1, v1, DT)\n", + " velocities.append(v2)\n", "\n", - "# compute initial loss\n", - "s,l = sess.run([states[-1],loss], feed_dict={state_in: state0})\n", - "print(\"Initial loss \"+format(l))\n" + " loss = field.l2_loss(velocities[16] - SOLUTION_T16)*2./N # MSE\n", + "\n", + " grad = math.gradients(loss, velocity.values)\n", + "\n", + "print('Loss: %f' % (loss))\n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Not surprisingly, because we're starting from zero, there's a significant intial error of ca. 0.38 for the 16th simulation step.\n", + "Because we're only constraining timestep 16, we could actually omit steps 17 to 31 in this setup. They don't have any degrees of freedom and are not constrained in any way. For fairness and for direct comparison with the previous PINN case, we include them.\n", "\n", - "Note that because we're only constraining timestep 16, we could actually omit steps 17 to 31 in this setup. They don't have any degrees of freedom and are not constrained in any way. For fairness and for direct comparison with the previous PINN case, let's include them.\n", + "Note that we've done a lot of calcuations here: first the 32 steps of our simulation, and then another 16 steps backwards from the loss. There were recorded by the gradient tape, and used to backpropagate the loss to the initial state of the simulation.\n", "\n", - "Now we have our simulation graph in TF, we can use TF to give us a gradient for the initial state for the loss. All we need to do is run `tf.gradients(loss, [state_in.velocity.data]`, which will give us a direction for each velocity variable. Based on a linear approximation, this direction tells us how to change each of them to increase the loss function (gradients _always_ point \"upwards\"). In the following code snipped, we're additionally saving all these gradients in a list called `grads`, such that we can visualize them later on. (Normally, we could discard each gradient after performing an update step.)\n", + "Not surprisingly, because we're starting from zero, there's also a significant intial error of ca. 0.38 for the 16th simulation step.\n", "\n", - "Based on the gradient, we can now take a step in the opposite direction to bring the loss down (instead of increasing it). Below we're using a learning rate `LR=5` for this step. Afterwards, we're re-evaluating the loss for the updated state to check how we did. As these updates aren't exactly fast, we're only computing five of them here:" + "So what do we get as a gradient here? It has the same dimensions as the velocity, and we can easily visualize it:\n", + "Starting from the zero state for `velocity` (shown in blue), the first gradient is shown as a green line below. If you compare it with the solution it points in the opposite direction, as expected. The solution is much larger in magnitude, so we omit it here (see the next graph).\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING:tensorflow:From /usr/local/lib/python3.7/site-packages/tensorflow_core/python/ops/math_grad.py:1375: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Use tf.where in 2.0, which has the same broadcast rule as np.where\n", - "Step 0, loss = 0.3829152584075928\n", - "Step 1, loss = 0.3334265947341919\n", - "Step 2, loss = 0.2905231714248657\n", - "Step 3, loss = 0.25346457958221436\n", - "Step 4, loss = 0.2215319573879242\n" - ] - } - ], - "source": [ - "LR = 5.\n", - "stateN = state0\n", - "grads = []\n", - "for i in range(5):\n", - " grads.append( tf.gradients(loss, [state_in.velocity.data] ) ) # use TF\n", - " grads.append( gradients(loss, state_in.velocity) ) # phiflow wrapper also works\n", - "\n", - " state_updated = state_in.copied_with( velocity=(state_in.velocity - LR*grads[-1]) )\n", - " stateN,l = sess.run([state_updated,loss], feed_dict={state_in: stateN})\n", - "\n", - " #s,l = sess.run([states[-1],loss], feed_dict={state_in: stateN})\n", - " print( \"Step {}, loss = {}\".format(i,l) )\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One of the reasons for the bad performance here is that we're querying states via `sess.run()` multiple times, instead of computing the update in one go. Nonetheless, this simple example already clearly shows that the loss is nicely going down: from above 0.38 to ca. 0.22. This is a good sign!\n", - "\n", - "Before improving on the performance, let's visualize the reconstruction.\n", - "\n", - "Starting from the zero state `state0` (shown in blue), the first gradient is shown as a red line here. If you compare it with the solution it points in the opposite direction, as expected. The solution is much larger in magnitude, so we omit it here (see the next graph).\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -183,42 +161,96 @@ "import matplotlib.pyplot as plt\n", "\n", "fig = plt.figure().gca()\n", - "pltx = np.linspace(-1,1,n)\n", + "pltx = np.linspace(-1,1,N)\n", "\n", "# first gradient\n", - "[grad0,s0] = sess.run([grads[0],state0], feed_dict={state_in: stateN}) #.velocity.data\n", - "fig.plot(pltx, grad0[0].flatten() , lw=2, color='red') \n", + "fig.plot(pltx, grad.numpy('x') , lw=2, color='green') \n", "\n", - "fig.plot(pltx, state0.velocity.data.flatten(), lw=2, color='mediumblue')" + "fig.plot(pltx, velocity.values.numpy('x'), lw=2, color='mediumblue')\n", + "\n", + "# some (optional) other fields to plot:\n", + "#fig.plot(pltx, (velocities[16]).values.numpy('x') , lw=2, color='cyan') \n", + "#fig.plot(pltx, (SOLUTION_T16).values.numpy('x') , lw=2, color='red') \n", + "#fig.plot(pltx, (velocities[16] - SOLUTION_T16).values.numpy('x') , lw=2, color='blue') \n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "So the gradient looks good (feel free to plot the others from the five iterations above).\n", + "Now we have our simulation graph in TF, we can use TF to give us a gradient for the initial state for the loss. All we need to do is run `tf.gradients(loss, [state_in.velocity.data]`, which will give us a \n", "\n", - "How well does the 16th state of the simulation actually match the target after the 5 update steps? This is what the loss measures, after all. The next graph shows the constraints (i.e. the solution we'd like to obtain) in green, and the reconstructed state after the initial state was updated 16 times by the solver:" + "Thus now we have \"search direction\" for each velocity variable. Based on a linear approximation, the gradient tells us how to change each of them to increase the loss function (gradients _always_ point \"upwards\"). In the following code block, we're additionally saving all these gradients in a list called `grads`, such that we can visualize them later on. (Normally, we could discard each gradient after performing an update step.)\n", + "\n", + "Based on the gradient, we can now take a step in the opposite direction to bring the loss down (instead of increasing it). Below we're using a learning rate `LR=5` for this step. Afterwards, we're re-evaluating the loss for the updated state to check how we did. " ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization step 0, loss: 0.382915\n", + "Optimization step 1, loss: 0.326966\n", + "Optimization step 2, loss: 0.281119\n", + "Optimization step 3, loss: 0.242881\n", + "Optimization step 4, loss: 0.210734\n" + ] + } + ], + "source": [ + "LR = 5.\n", + "\n", + "grads=[]\n", + "for optim_step in range(5):\n", + " velocities = [velocity]\n", + " with math.record_gradients(velocity.values):\n", + " for time_step in range(STEPS):\n", + " v1 = diffuse.explicit(1.0*velocities[-1], NU, DT)\n", + " v2 = advect.semi_lagrangian(v1, v1, DT)\n", + " velocities.append(v2)\n", + "\n", + " loss = field.l2_loss(velocities[16] - SOLUTION_T16)*2./N # MSE\n", + " print('Optimization step %d, loss: %f' % (optim_step,loss))\n", + "\n", + " grads.append( math.gradients(loss, velocity.values) )\n", + "\n", + " velocity = velocity - LR * grads[-1]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Now we can check well the 16th state of the simulation actually matches the target after the 5 update steps. This is what the loss measures, after all. The next graph shows the constraints (i.e. the solution we'd like to obtain) in green, and the reconstructed state after the initial state `velocity` (which we updated five times via the gradient by now) was updated 16 times by the solver. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4YklEQVR4nO3dd3xUVfr48c+THjqh996LoBEQBSyoCKj723WVXQu74lpWmiACsjZcWYrS1FXR1XXtbXURUEDBiij4pfeA9N4JmZSZeX5/zCQOIQHC3ORmkuf9euU1M7fMPNwZznPPufecI6qKMcaY0ivK7QCMMca4yxKBMcaUcpYIjDGmlLNEYIwxpZwlAmOMKeVi3A7gfFStWlUbNmzodhjGGBNRfv7554OqWi338ohMBA0bNmTp0qVuh2GMMRFFRLbltdyahowxppSzRGCMMaWcJQJjjCnlHEkEIvKqiOwXkdX5rBcRmS4iKSKyUkQuDFnXX0Q2Bf/6OxGPMcaYc+dUjeDfQK8zrL8OaBb8uxt4AUBEkoDHgM5AJ+AxEansUEzGGGPOgSOJQFW/AQ6fYZMbgf9owGKgkojUAq4F5qvqYVU9AsznzAnFGGOMw4rqGkEdYEfI653BZfktP42I3C0iS0Vk6YEDBwotUGOMKW0iph+Bqs4AZgAkJyfb2NmmSGX6Mvl518+s2ruK9QfWk+HN4IbWN3BVk6uIiYqY/0bG5KmofsG7gHohr+sGl+0CLs+1/KsiismYMzqZeZIvN3/J5xs/57ut33Ey6+Qp6z/f9Dk1y9VkUu9JdK3f1aUojQlfUSWCmcBAEXmXwIXhY6q6R0TmAuNCLhBfA4wuopiMOY2qsmTnEt5d+S7zNs3D4/XkrGtetTmd63amZfWWpGWm8daKt9h6ZCvvrXzPEoGJaI4kAhF5h8CZfVUR2UngTqBYAFV9EZgD9AZSgDTgz8F1h0XkSWBJ8K3GquqZLjobUygyvBl8vPZj/v3zv9l0aFPO8o61O9K3ZV+ubnI1dSqeevmqaZWm/PmjP3PEc6SowzXGUY4kAlX9w1nWK3B/PuteBV51Ig5jCupw2mHeWvEWbyx7g0NphwCoVrYav2/3e25uezP1KtXLd99KiZUALBGYiGdXuUyptPfEXl786UU+WPUB6d50ANrUaMNdyXdxXfPriI2OPet7JCUmAZYITOSzRGBKlQMnD/Dijy/y9oq3yfRlAtCjUQ/+cvFf6FKvCyJyzu9VOTFwacsSgYl0lghMqXAo7RAzfprBm8vfzKkB9G7em4GXDKRFtRbn9Z5lYssQFx1HujcdT5aHxNhEJ0M2pshYIjAlWoY3g9d+fo0XfnyB1MxUAHo27cnQrkNpVb1VWO8tIlROrMy+1H0c8RyxRGAiliUCUyKpKrM2zGLSN5PYdXwXAN0admPYZcNoX7O9Y58TmghqV6jt2PsaU5QsEZgS5+ddPzPuq3Es37McgBZVWzD68tF0a9jN8c+y6wSmJLBEYEqM7Ue3M+mbSczZOAeAqmWqMuyyYdzU9iaio6IL5TMrJwQSwWGPdX8xkcsSgYl46VnpvPjTi7z000tk+jKJj4nnruS7uLvT3ZSLK1eon51dIzjqOVqon2NMYbJEYCLawi0LGfvlWLYf2w7Aja1u5MFuDxZZe701DZmSwBKBiUi7ju3iyYVPMj9lPgDNqjRjbM+xdKrXqUjjsN7FpiSwRGAiSqYvk1eXvsqzPzxLujedsrFlGdx1MP0v7H9OvYGdltO7ON0SgYlclghMxPhpx0/8bf7f2Hx4MwC9W/RmzOVjqFm+pmsxWdOQKQksEZhi70TGCSZ8M4F3VrwDQMPKDXniqie4rOFlLkdmTUOmZLBEYIq1uZvm8vgXj7P/5H5io2K5t/O93Nf5PuJj4t0ODbCB50zJYInAFEv7UvfxxJdPMHfTXAA61urIuGvH0bxqc5cjO5U1DZmSwBKBKVb86uf9Ve8z/uvxnMg4QdnYsjzY7UFu7XBroXUKC4cNPGdKAqdmKOsFTAOigVdUdXyu9VOAK4IvywDVVbVScJ0PWBVct11Vb3AiJhN5dh7bycjPR7J4x2IArmx8JU/0fKJYj+FjA8+ZkiDsRCAi0cDzwNXATmCJiMxU1bXZ26jqAyHbDwI6hryFR1U7hBuHiVyqyjsr3mH81+M5mXWSpMQkHr3qUfq26Fug+QHcYgPPmUjnRI2gE5CiqlsAghPU3wiszWf7PxCY09gYdh3bxeh5o/l+2/dAYI6Ax3s+TpUyVVyO7NzZdQIT6ZxIBHWAHSGvdwKd89pQRBoAjYAFIYsTRGQp4AXGq+on+ex7N3A3QP369cOP2rhKVXl35buM/3o8qZmpVE6szBNXPUGfln3cDq3AbOA5E+mK+mJxP+BDVfWFLGugqrtEpDGwQERWqerm3Duq6gxgBkBycrIWTbimMOw+vpvRc0fz3bbvAOjVrBdP9HyCqmWruhzZ+bGB50ykcyIR7ALqhbyuG1yWl37A/aELVHVX8HGLiHxF4PrBaYnARD5V5YPVH/DUwqdIzUylUkIlHu/5eMRcC8iPNQ2ZSOdEIlgCNBORRgQSQD/gj7k3EpGWQGXgh5BllYE0Vc0QkarApcBEB2Iyxcy+1H2M+nwU32z9BoBrml3Dkz2fjNhaQCjrXWwiXdiJQFW9IjIQmEvg9tFXVXWNiIwFlqrqzOCm/YB3VTW0WacV8JKI+IEoAtcI8rvIbCLUnA1zeGT+IxxNP0rFhIo8ftXjXN/y+oiuBYSygedMpHPkGoGqzgHm5Fr2aK7Xj+ex3yKgnRMxmOLnePpxnljwBJ+s/QSA7g27M6HXBKqXq+5uYA6zpiET6axnsSkUP2z/gRGfjWDPiT0kxCTw8OUP88cL/lhiagGhLBGYSGeJwDgqw5vB098+zas/vwpA+5rtmdx7Mo2SGrkcWeGxRGAinSUC45i1+9cybPYwNh3aRLREM/CSgdzX+T5XJowpSpYITKSzRGDC5vP7eGXJK0z5fgpZ/iwaVW7E5N6TaV+rvduhFYkysWWIiYoh3ZtOhjej2AyRbcy5skRgwrL7+G6GzxnOTzt/AuD2DrczssfIUjX4mogQGxWL1+/F6/cSjyUCE1ksEZjzNmfDHMbMG8PxjONUK1uNCb0m0KNRD7fDckVMdAx4wev3uh2KMQVmicAU2MnMkzy54Ek+WP0BAFc1uYp/XPuPiBoozmkxUYH/SpYITCSyRGAKZOXelTww+wG2HtlKfEw8D/d4mFs73FoibwstCEsEJpJZIjDnxK9+Xl7yMpO/m4zX76VF1RZM7Tu12E0d6ZacROCzRGAijyUCc1Z7T+xlxGcjWLR9EQD9L+zPyO4j7e6YEDmJQC0RmMhjicCc0fyU+YyeO5ojniMkJSYx8bqJXNH4irPvWMpYjcBEMksEJk+eLA/jvhrH2yveBgLjBE28biLVylZzObLiya4RmEhmicCcZv2B9Qz5dAgph1OIi47joe4P0f/C/kRJlNuhFVuWCEwks0Rgcqgqb694m78v/DuZvkyaJjVlat+ptKreyu3Qir3sRODz+86ypTHFjyUCAwSGjB49dzSfb/ocgFva38IjVzxSqnoIhyM7EWT5s1yOxJiCs0RgWL5nOUM+HcLO4zspF1eOp655ir4t+7odVkSJibamIRO5HGn0FZFeIrJBRFJEZFQe6/8kIgdEZHnw766Qdf1FZFPwr78T8Zhz41c/M36awS3v3MLO4ztpV6Mdn97xqSWB8xAt0YAlAhOZwq4RiEg08DxwNbATWCIiM/OYcvI9VR2Ya98k4DEgGVDg5+C+Np5vITuUdogRn43g61++BuDOi+5kRPcRxEXHuRxZZMoeatsSgYlETjQNdQJSVHULgIi8C9wInMvcw9cC81X1cHDf+UAv4B0H4jL5WLx9McPmDGNf6j4qJVRi0nWTuLLJlW6HFdHsYrGJZE40DdUBdoS83hlcltvvRGSliHwoIvUKuC8icreILBWRpQcOHHAg7NLH5/cx7ftp3P7B7exL3cfFdS9mVv9ZlgQcEB0VaBqyi8UmEhXVjeGfAg1VtT0wH3i9oG+gqjNUNVlVk6tVs05NBbX3xF5uf/92pv8wHVVlYJeBvHnzm9QqX8vt0EqE2Khg05D1LDYRyImmoV1AvZDXdYPLcqjqoZCXrwATQ/a9PNe+XzkQkwmxcMtCHvrsIQ57DlOtbDUm95lM1/pd3Q6rRMmuEfjUmoZM5HGiRrAEaCYijUQkDugHzAzdQERCTztvANYFn88FrhGRyiJSGbgmuMw4INOXybivxnHXf+/isOcw3Rp2Y9YdsywJFIKcfgQ+axoykSfsGoGqekVkIIECPBp4VVXXiMhYYKmqzgQGi8gNgBc4DPwpuO9hEXmSQDIBGJt94diEZ9exXQz6dBAr9q4gWqIZ3m04f7n4LzZMRCHJbhqyGoGJRI50KFPVOcCcXMseDXk+Ghidz76vAq86EYcJWLB5AQ9+9iDH0o9Ru3xtpl0/jQtrX+h2WCVadtOQXSMwkch6FpcgXr+Xyd9N5qWfXgLgysZXMum6SVRKrORuYKVAdo3A7hoykcgSQQmx98Rehs4eypKdS4iWaB7s9iB3XXyXNQUVkZyLxdaPwEQgSwQlwPfbvmforKEc9hymRrkaTOs7jYvrXux2WKWKDTpnIpklggjm8/t4fvHzTF80HUW5tMGlTO49maplq7odWqmTPcSE1QhMJLJEEKEOnjzI8DnD+W7bdwjCkK5DuL/L/TlNFKZo2aBzJpJZIohAS3cuZfCswexL3UdSYhJT+kzhsoaXuR1WqZY9DLU1DZlIZIkggqgqLy95mae/fRqf+kiuk8y0vtOoWb6m26GVejbonIlklggixFHPUR76/CG+3PwlAPd0uodhlw3LKYCMu3LmLLZ+BCYCWSkSAVbuWcnATwey6/guKiZUZNJ1k7iqyVVuh2VC5CQCtURgIo8lgmJMVXlj2RuM+2ocWf4s2tdsz7PXP0vdinXdDs3kYjUCE8ksERRTJzJO8PC8h5mzITByxx0d72BUj1HEx8S7HJnJi/UjMJHMEkExtP7Aeu6feT9bj2ylXFw5xl0zjj4t+7gdljkDu1hsIpklgmLmg1Uf8NiXj5HhzaBltZY8d/1zNEpq5HZY5ixymoasH4GJQJYIiglPlofHvniMj9Z8BMDN7W7msSsfIyE2weXIzLnI7kdgicBEIksExcDmQ5sZ+OlANh7cSEJMAmN7juV3bX/ndlimAGLEEoGJXJYIXDZz3UzGzBtDWlYaTZKa8Oz1z9KiWgu3wzIFZDUCE8ksEbgkw5vBUwuf4q0VbwFwfcvreeqapygbV9blyMz5sBqBiWSOJAIR6QVMIzBV5SuqOj7X+mHAXQSmqjwA3Kmq24LrfMCq4KbbVfUGJ2IqzrYf3c7ATweyZt8a4qLjeOSKR/jDBX9ARNwOzZwnqxGYSBZ2IhCRaOB54GpgJ7BERGaq6tqQzZYByaqaJiL3AROBW4LrPKraIdw4IsW8TfN46POHOJFxgnoV6/HcDc/RtkZbt8MyIfx+Zf9+L3v2ZHHggJfDh71kZCiZmUqZMlFUqRJN/fpxtGqVkJO87a4hE8mcqBF0AlJUdQuAiLwL3AjkJAJVXRiy/WLgNgc+N6Jk+bKY9M0k/vXzvwC4uunVTOw1kQoJFVyOrHTyePykpGSwYUM6GzdmkJKSwfbtmWzblsmOHZlkZOhZ36NWrVh69arAyJE1iClricBELicSQR1gR8jrnUDnM2w/APgs5HWCiCwl0Gw0XlU/yWsnEbkbuBugfv364cRb5HYf383gWYNZtnsZMVExPNT9Ie686E5rCipkPp+yY0cmGzZksHFjes7jxo2BQl/PUNYnJUVTp04s1arFUqVKNImJUcTGCmlpfg4e9LJ6dTp79mTx2muH+OSTo0x53SavN5GrSC8Wi8htQDLQI2RxA1XdJSKNgQUiskpVN+feV1VnADMAkpOTz366Vkx8/cvXDJ8znCOeI9QsX5PpfadzUZ2L3A6rRMnKUjZtSmfNmnTWrPGwZk0669alk5KSke+ZfUwMNG4cT/Pm8bRokUDTpvE0aBBHgwZx1K8fR7lyZ57gR1VZtcrDmDG7mTXrOPf1g4q3tsdbwxKBiTxOJIJdQL2Q13WDy04hIj2BMUAPVc3IXq6qu4KPW0TkK6AjcFoiiDRev5dpi6bxwuIXUJTuDbvzTO9nSCqT5HZoESu0wF+79tdCf+PGdLz5lL+1a8fSvHk8zZsn0KJF4LF583gaNYonNvb8a2QiQvv2Zfj44yYMGLCN//znMBlvDSWz86Tzfk9j3OJEIlgCNBORRgQSQD/gj6EbiEhH4CWgl6ruD1leGUhT1QwRqQpcSuBCckTbn7qfobOH8uOOH4mSKIZ2Hcpfu/yVKIlyO7SIkJWlpKRkn+EHCvy1awNNOllZp5/hi0DjxnG0aZNImzYJtG6dQOvWiTRvHk/58oU7dWdMjPDaaw34+JPDnDhensyTdke2iTxh/2pV1SsiA4G5BG4ffVVV14jIWGCpqs4EJgHlgA+C7eLZt4m2Al4SET8QReAawdo8PyhCLNq+iAdmPcDBtINUK1uNKX2mcEn9S9wOq1hSVfbu9bJypeeUv3Xr0vMs8AEaNYqjTZuEkEI/kVatEihTxr0kGxUllK8QxYnjftI9Nme0iTyOnL6o6hxgTq5lj4Y875nPfouAdk7E4Daf38c/f/wn0xdNx69+utTrwtS+U6lWtprboRULHo+fNWt+LexXrUpn5UoPBw/m3abTsGHuAj+BVq0SKFu2eBa05csHmpky0qxGYCKP/WodcPDkQYbPGc53275DEAZ2GcjgroOJjiqehVZhUlW2bcs87Sx/06YM/P7Tt69UKZp27RJp3/7XvzZtEgq9Scdp5cpHAT4y02LdDsWYArNEEKYlO5cwZNYQ9qXuIykxicl9JtOtYTe3wyoSJ074WLXq1AJ/1SoPx4+fXuJHR0Pr1gmnFPjt2ydSt25sibiNtkKFaCCLTKsRmAhkv9rz5Fc/L//0Ms989ww+9ZFcJ5lpfadRs3xNt0NznKqyZ08Wy5Z5WL48jeXLPSxb5mHz5ow8t69RI+a0Ar9lywQSEkruxfJAIoAsj80gZyKPJYLzcMRzhBGfjWDhlkCH6Xs63cOwy4blDDMQyXw+ZePG9GBhHyj0ly/3cODA6W35cXFCmzannuW3a5dIjRqlr3mkQrApK9MT53IkxhRc5JdcRWzZ7mUM+nQQe07soWJCRZ657hmuaHKF22Gdl7Q0PytX/nqWv3x5GitXevB4Tr9jp3LlaDp0SKRDhzJ07Bh4bNkyIax78UuSihWDcxZ7Sl8SNJHPEsE5UlVe+/k1JnwzAa/fS8daHZl+/XRqV6jtdmjnZP/+rJzCPruJZ+PGvC/gNmgQR4cOiXTsWCZY+CdSv35ciWjLLywVg01DPo/NKGcijyWCc3A8/Tgj545k3qZ5ANx50Z2M6D6CuOji1wzg9ytbtmSc0p6/fLmH3buzTts2Jgbatk3MKew7dAgU/JUr28+ioCpVDNQEvOnxqKolTRNR7H/8WSzbvYwhs4aw6/guyseXZ0KvCVzb7Fq3wwIgI8PP6tXpIRdw01ixwkNq6umn+eXKRZ3WtNO6dcm+gFuUKlQI/FfypyfiU1/ORDXGRAL7tebDr35eXvIyk7+bjNfvpV2Ndky/fjr1K7kz8umxYz5WrAg06yxbFnhcu9aT5xg7tWvHnta007hxPFFRdpZaWCpUCCRUf0YiXp+3RNw4YEoP+7Xm4eDJgzz42YN8u/VbAAYkD+DBbg8WWVNQ4FbNtJwCf9myNLZsyTxtOxFo2TI+pMAPPFavbhcsi1r27aP+jES8aiOQmshiiSCX77d9z/A5wzlw8gBJiUlMvG4iVzQunLuCQtvzQwv9ffvyvlWzXbtEOnYMnOl37Bi4XbO4DrlQ2mT3hPanl7E5CUzEsUQQ5PV7mfr9VF788UUUpXO9zkzuPdmxDmKZmX7Wrk0PKfQD7fknTpzenl+xYnRO0052wW+3ahZv2U1DmpFgs5SZiGOJgMAMYkNmDeH/dv8fURLFkK5D+Gvnv573WEGpqT5WrDj1LH/NmnQyM0+/P79WrdhTzvI7dixDo0Z2q2akyWkaSi9jicBEnFKfCOZumsuoz0dxPOM4NcvVZEqfKXSq1+mc99+/PyunsM++c2fTpow8p0Fs1iw+546d7EK/NPbCLYlymoYyEi0RmIhTahNBhjeDcV+N483lbwJwVZOrmNBrApUTK+e5vaqydWvmKWf5y5blfX9+bGxg6IXQs/wLLkiMuBE1zbkrX/7Xu4ayfKf/JowpzkplIth8aDODZw1m/YH1xEbFMrLHSP504Z9ymmO8XmXduvScwj77Pv2jR32nvVf2/fnZd+507FiGNm0SiIuz+/NLk/j4KKJisvB7Y0nzWI3ARBZHEoGI9AKmEZih7BVVHZ9rfTzwH+Ai4BBwi6puDa4bDQwAfMBgVZ3rREx5UVU+WvMRj3/xOB6vhwaVGjD+yqn49zfhxRcP5hT8q1Z58pz0vHr1mFPO8jt2TKRJE7s/3wTEJGaQeSKWo8e8UMftaIw5d2EnAhGJBp4HrgZ2AktEZGauKScHAEdUtamI9AMmALeISGsCcxy3AWoDX4hIc1U9/dQ7TKmZqTz036f4eME6Mnf3pHpqN3bva8El92Ti9284bftGjeJOK/Rr1SoZY+ebwhGTkEnmCTh23GoEJrI4USPoBKSo6hYAEXkXuBEITQQ3Ao8Hn38IPCeBEvVG4F1VzQB+EZGU4Pv94EBcpzh0NI0X/vg70ECTzWEAMomOhnbtstvzAwX+BRckUqlSqWw1M2GILRPo9HfcEoFxiN+vbNqUkdNa8c3ifUx4shndu5d39HOcKO3qADtCXu8EOue3TXCy+2NAleDyxbn2zbNSLSJ3A3cD1K9f8GEeGlSvTvPWOyiTGM0lF1fOKfTbtk208XaMI2ITA4ng2HHHK7SmFMjI8LNmTfopN6SsWOHh5MlT+xr959NldO/e3dHPjpjTXlWdAcwASE5OzuPmzLNbv+pCa9oxhSYuMXC30HFLBOYsjh/35QwJf7axw2rUBl+1NXirraNcvZ107fs7x+NxIhHsAuqFvK4bXJbXNjtFJAaoSOCi8bns6xhLAqYwxZUJJILUPHqLm9Ire+yw7H5G+U3zKgItWsTntFZ06JDIuqj/8cLKcWT5s2hZrSXT+k6jaZWmjsfoRCJYAjQTkUYECvF+wB9zbTMT6E+g7f8mYIGqqojMBN4WkckELhY3A35yICZjilx2Ishr2BBT8oU7dli7domUKxfoa3Qo7RAPfTaMr375CoDbO9zO6MtHEx9TOHNih50Igm3+A4G5BG4ffVVV14jIWGCpqs4E/gW8EbwYfJhAsiC43fsELix7gfsL444hY4pCfGLgp3vi+Hm1XJoIEjp2WOisf3mdBFSoEHXKaAIdOybSqlVivmOHLdq+iOGzh7P/5H4qJlRk/LXjuabZNYX673HkGoGqzgHm5Fr2aMjzdOD3+ez7FPCUE3EY46aEsoEzv5OplghKknDGDuvQITB22Ln0NfL5fUxbNI1/Lv4ninJx3YuZ3HtykUyHGzEXi40p7hLKBmoEqZYIIlZBxg5r2jT+tAEjz3fssP2p+xk6eyg/7viRKIliUJdB3H/J/UU2wZElAmMcklAmkAhOnnA5EHNWxWnssEXbF/HArAc4mHaQamWrMaXPFC6pf4kj732uLBEY45CEcoH24ZMnXQ7EnKKgY4ddcMGpZ/mFNXaYX/08v/h5pi+ajl/9dKnXhal9p1KtbDXHP+tsLBEY45AyZQOJIO2E3absltRUHytXenKadZYvL55jhx1KO8TwOcP5duu3CMLALgMZ3HXwec+BEi5LBMY4JDFYI0g7aT3Vi0J2e35ox6z82vOL09hhS3YuYcisIexL3UdSYhKT+0ymW8NuRR5HKEsExjikTNlACeRJtRqBk7Lvzw89y1+2zMOePae358fEQJs2iadMAHXBBWWoWNH9uUD86uflJS/zzLfP4FMfyXWSmdZ3mmPT4YbDEoExDilTLvDosRrBecvMDIy382sv3Pzn9i5f/tf2/Oy5QFq3TiA+vvgd/yOeI4z4bAQLtywE4O6L72bYZcOIjS4eMxRaIjDGIeUsERTIsWM+VqxIO6V5Z+3adLKy8r8/P3QSqMaNI2MukOV7ljNo5iB2n9hNxYSKPH3d01zZ5Eq3wzqFJQJjHJIYbBrKSItGVW1sqyBVZdu2TFas8LBypSenc9aWLZmnbSsCzZvHn9Ihq0OHxIic21tV+ff//ZsJX08gy5/FBTUv4Nnrn6VOxeI3a5ElAmMcEh8bi8Slo5kJnDzpzxk3pjRJTfWxenU6K1ak5RT6q1Z5OH789Kad+PjAeDuhZ/nt2yeWiON2PP04I+eOZN6meQD8+aI/81D3h4iLjnM5srxZIjDGITHRMUQlpOHLTOD4cV+JKNDy4/cHOmStXPnrWf7KlYFRNfO6a6dGjRjatw9M+tS+faDgb9EiId/xdiLZ6n2rGTRzENuPbadcXDkm9prItc2vdTusM7JEYIxDYiSGqPh0fMDx435qF/4QMUXixAkfq1d7TmnaWbUq7wu4sbFCq1YJOQV+9mMkNu0UlKry9oq3+fvCv5Ppy6RN9TY8e8OzNKjUwO3QzsoSgTEOiYmOISo+DQgUnpEmK0vZuDGd1as9rFmTnlP459WWD4Gz/NwFfsuWhdMLt7hLzUxlzLwxzFo/C4BbL7iVMVeMKbRho51micAYh0RHRSMJHqB4z1Lm8ym//JLB6tWBwn716nTWrPGwYUNGnnfsxMYKrVsnnFLgl5az/HOx/sB6Bs4cyC9HfqFsbFmeuvYprm95vdthFYglAmMcEhsVS1R8YMS5vC6OFjVVZceOLNas8YQU+h7WrUvH48l7hNTGjeNo0yaRtm0TaNMmUOC3aBFfKs/yz0ZV+XD1hzz25WNkeDNoUbUFz93wHI2TGrsdWoFZIjDGITFRMUTFF32NwOsN9Lxdvz6d9evTWbcunfXrM1i7Nu+7dQDq1ImlbdtAgd+2bSJt2iTQqlVCib7A7aS0zDQe/eJRPl77MQA3t7uZR698lMTYRJcjOz9hJQIRSQLeAxoCW4GbVfVIrm06AC8AFQAf8JSqvhdc92+gB3AsuPmfVHV5ODEZ45boqGiiKwR+/k8/vY9rrqlArVrONZ+kpvrYsCGDdes8rF+fESzw09m0Ke8mHYCqVWNo1y4h5yw/u9CvVMnOAc9XyqEUBs4cyKZDm0iISWBsz7H8rq3zE8oXpXB/DaOAL1V1vIiMCr4emWubNOAOVd0kIrWBn0VkrqoeDa4foaofhhmHMa6LjYqlYrfZRKVcwerVcOmlG/j448a0b594zp3LjhzxsnlzBps3Z5CSksHmzZk5z/MaKz9b/fpxtGqVQMuW8bRsGTi7b9UqgerVrR3fSZ+s/YS/zfsbHq+HJklNePb6Z2lRrYXbYYUt3ERwI3B58PnrwFfkSgSqujHk+W4R2Q9UA46G+dnGFCvRUdHEVDjKb/8xmxXT7mLp0jQ6dFhPo0ZxdO9ejlq1YklKikFVychQjh71sWdPFnv3ZrFnTxZ79ng5diz/JqW4OKF58/hggZ+QU+A3bx5P2bLWpFOY0rPSGbtwLO+tfA+AG1vdyJNXP0nZuLIuR+aMcBNBDVXdE3y+F6hxpo1FpBMQB2wOWfyUiDwKfAmMUtWMfPa9G7gboH79+mGGbYzzYqMCZ9+x5U+yYEEzhg/fyX//e5Rffsnkl18On9N7lC0bRZMm8TRpEkfTpvHB5/E0bRpPvXpxREeXvA5Yxd0vR35h0MxBrDuwjrjoOB676jFuaXdLiRpC5KyJQES+APIaJ3VM6AtVVRHJd7JWEakFvAH0V9XsK1ijCSSQOGAGgdrE2Lz2V9UZwW1ITk62SWFNsRMTHfjv5PV5KV8+mhkzGvDCC/VZujSN5cvTOHTIx+HDXqKiIC4uigoVoqhVK5ZatWKpWTM2WGOILlEFTKSbvX42D897mNTMVBpUasBzNzxH6+qt3Q7LcWdNBKraM791IrJPRGqp6p5gQb8/n+0qALOBMaq6OOS9s2sTGSLyGvBggaI3phiJlkDzTJb/17b86Gihc+eydO5cMpoQSosMbwb/+PofvLHsDQB6N+/NuGvHUT6+vMuRFY5wm4ZmAv2B8cHH/+XeQETigI+B/+S+KBySRAT4DbA6zHiMcU322PI+f/HtTGbObsfRHQz6dBCr9q0iNiqWhy9/mNs73l6ia2rhJoLxwPsiMgDYBtwMICLJwL2qeldwWXegioj8Kbhf9m2ib4lINUCA5cC9YcZjjGuyawRev9flSMz5mp8yn4c+e4jjGcepW6Euz17/LO1rtXc7rEIXViJQ1UPAVXksXwrcFXz+JvBmPvsXr9kZjAlDzjUCSwQRJ8uXxaRvJvGvn/8FQM+mPZnYayIVEyq6HFnRsF4lxjgk+64hSwSRZffx3QyeNZhlu5cRExXDQ90f4s6L7izRTUG5WSIwxiHRUdY0FGkWblnIg3Me5Gj6UWqWr8n0vtO5qM5FbodV5CwRGOMQqxFEDq/fy9Tvp/LCjy8A0KNRD56+7mmSyiS5HJk7LBEY4xCrEUSGfan7GDprKD/t/IkoiWLYZcO4p9M9REnpHWHVEoExDomJsovFxd33275n6KyhHPYcpnrZ6kztO5XO9Tq7HZbrLBEY45CcpiGfJYLixuf38dwPz/HsD8+iKF3rd2VKnylULVvV7dCKBUsExjgku2nIp9ahrDg5cPIAD8x+gB+2/4AgDLpkEIMuGZTzfRlLBMY4JrtpKMuX/3DRpmgt2r6IB2Y9wMG0g1QpU4UpfaZwaYNL3Q6r2LFEYIxD7BpB8eHz+/jn4n8y/Yfp+NVP53qdmdpnKtXLVXc7tGLJEoExDsnuWWxjDbnr4MmDDJszjO+3fY8gDOwykMFdB1tT0BlYIjDGIdkXi0NHHzVFa/H2xQydPZQDJw+QlJjElD5TuKzhZW6HVexZIjDGITkXi61GUOT86uefi//JtEXT8KufTnU7MbXvVGqUO+NcWSbIEoExDskefdSnPlS1VI1V46aDJw8yfM5wvtv2HYLw1y5/ZUjXITnXbMzZ2ZEyxiEiQkxUDF6/lyx/FnHRcW6HVOL9tOMnhs4eyr7UfSQlJvFM72fo3qi722FFHEsExjgoOxH4/D6wa5OFxq9+XvzxRaZ8PwW/+rm47sVM7TOVmuXzmlXXnI0lAmMcZLeQFr5DaYcYPmc43279FoD7Ot/H0EuHWlNQGOzIGeMgSwSFa8nOJQyZNYR9qfuonFiZZ3o/Q49GPdwOK+KFNdyeiCSJyHwR2RR8rJzPdj4RWR78mxmyvJGI/CgiKSLyXnB+Y2MiliWCwpHdFHTre7eyL3UfF9W5iE/v+NSSgEPCHXd1FPClqjYDvgy+zotHVTsE/24IWT4BmKKqTYEjwIAw4zHGVTbMhPMOnjzInR/dyaRvJ+FTH/d2upe3bn6LWuVruR1aiRFuIrgReD34/HXgN+e6owTurbsS+PB89jemOMpOBNaXwBnfbv2W3q/35tut35KUmMQrv32FEd1HEBsd63ZoJUq41whqqOqe4PO9QH69NxJEZCngBcar6idAFeCoqmbXoXcCdfL7IBG5G7gboH79+mGGbUzhsAnsnZHpy2Tyd5N5ecnLAHSp14XJfSZbB7FCctZEICJfAHndkzUm9IWqqohoPm/TQFV3iUhjYIGIrAKOFSRQVZ0BzABITk7O73OMcVWMWCII1/aj2xk6aygr9q4gWqIZcukQ7u10r40VVIjOmghUtWd+60Rkn4jUUtU9IlIL2J/Pe+wKPm4Rka+AjsBHQCURiQnWCuoCu87j32BMsWE1gvB8uv5T/jbvb6RmplK7fG2m9J1Ccp1kt8Mq8cK9RjAT6B983h/4X+4NRKSyiMQHn1cFLgXWqqoCC4GbzrS/MZEk+6zVBp4rmLTMNEZ9Poqhs4aSmpnKtc2uZVb/WZYEiki41wjGA++LyABgG3AzgIgkA/eq6l1AK+AlEfETSDzjVXVtcP+RwLsi8ndgGfCvMOMxxlXZI5DaxeJzt/7AegZ/OpjNhzcTFx3HI1c8wh8u+ION1VSEwkoEqnoIuCqP5UuBu4LPFwHt8tl/C9ApnBiMKU6sH8G5U1XeXP4m474aR6Yvk6ZJTZl+/XRaVGvhdmiljvUsNsZB2U1DlgjO7KjnKKPmjmJ+ynwAbml/C49c8QiJsYkuR1Y6WSIwxkHZTUOWCPK3ZOcShs4eyt4TeykXV45x14yjT8s+bodVqlkiMMZBOU1DPksEuXn9Xp7/4XmeW/wcfvXToVYHpvaZSr1K9dwOrdSzRGCMg3ISgVoiCLXt6DaGzx7Osj3LALi3070MvXSo9RAuJiwRGOMgqxGcSlX5aM1HjP1yLCezTlKzXE0m9Z5E1/pd3Q7NhLBEYIyDci4WW42Ao56j/G3+3/hs42cAXNf8Ov5+9d+plFjJ3cDMaSwRGOOg7KaO0l4jWLR9ESPmjGBv6l7Kxpbl0ase5Xdtfmd9A4opSwTGOKi09yPI8GYw5fspvLLkFRSlY62OPNPnGRpUauB2aOYMLBEY46DS3I8g5VAKD8x+gLX71xIlUQzqMoj7L7nfppCMAPYNGeOg7H4EpWliGlXlreVvMe7rcWR4M6hXsR6T+0zmwtoXuh2aOUeWCIxxUPn48gCcyDzhciRF4+DJg4yaO4qFWxYC8Ns2v+XRKx/NOQ4mMlgiMMZBlRIqAXDEc8TdQIrA5xs/55H5j3DYc5gK8RX4+9V/tx7CEcoSgTEOqpxYGSjZieBY+jGe+PIJ/rcuMGr8JfUvYWKvidSuUNvlyMz5skRgjIOSEpOAkpsIvvnlG0bPHc3e1L0kxCQwsvtIbut4G1ES7tQmxk2WCIxxUHZnqZKWCE5mnmT81+N5e8XbAHSs1ZFJ102iUVIjlyMzTrBEYIyDspuGjnqOuhuIg5buXMqIz0aw/dh2YqNiGXLpEP5y8V/sttASJKxvUkSSgPeAhsBW4GZVPZJrmyuAKSGLWgL9VPUTEfk30INfJ7L/k6ouDycmY9yU3TR02HPY5UjCl7tzWMtqLXmm9zO0rNbS7dCMw8JN6aOAL1V1vIiMCr4eGbqBqi4EOkBO4kgB5oVsMkJVPwwzDmOKhfLx5YmWaFIzU8n0ZRIXHed2SOdl5Z6VPPT5Q2w6tIkoieLeTvcyuOvgiP33mDMLNxHcCFwefP468BW5EkEuNwGfqWpamJ9rTLEkIlRKrMShtEMcSz9GtbLV3A6pQNKz0pny/RRe/flV/OqnYeWGPH3d03Ss3dHt0EwhCvdSfw1V3RN8vheocZbt+wHv5Fr2lIisFJEpIhKf344icreILBWRpQcOHAgjZGMKV07zUFpkNQ/9tOMner/em1eWvgLAgOQBzLpjliWBUuCsNQIR+QKomceqMaEvVFVFRM/wPrUITGI/N2TxaAIJJA6YQaA2MTav/VV1RnAbkpOT8/0cY9wWaX0JUjNTmfTNJN5c/iYAzao0Y0KvCVxQ6wKXIzNF5ayJQFV75rdORPaJSC1V3RMs6Pef4a1uBj5W1ZxBWEJqExki8hrw4DnGbUyxFUm3kH7zyzeMmTeG3Sd2ExMVw32d7+O+zvcRH5Nv5dyUQOFeI5gJ9AfGBx//d4Zt/0CgBpAjJIkI8BtgdZjxGOO6nBpBevFNBMfSj/HUwqf4aM1HALSt0Zbx146nVfVWLkdm3BBuIhgPvC8iA4BtBM76EZFk4F5VvSv4uiFQD/g61/5viUg1QIDlwL1hxmOM64pz72JVZd6meTz25WMcOHmAuOg4hnYdyoCLB1i/gFIsrG9eVQ8BV+WxfClwV8jrrUCdPLa7MpzPN6Y4Kq4Dz+08tpMnvnyCBVsWAHBRnYsYf+14Gic1djky4zY7BTDGYcXtYnGWL4tXl77K9B+mk+5Np1xcOR7s9iC3drjVxggygCUCYxxXnJqGlu5ayt/m/Y1NhzYB0LdlX8ZcPobq5aq7HJkpTiwRGOOw4nDX0BHPESZ+M5H3V70PQP1K9Xniqifo3qi7azGZ4ssSgTEOc3PgOa/fy3sr32PK91M44jlCbFQs93S6h/s630dCbEKRx2MigyUCYxzm1sBzP2z/gScXPMmGgxsA6FKvC2N7jqVJlSZFGoeJPJYIjHFYUQ88t/3odsZ/PZ65mwKd9utWqMvDlz/MNc2uIdBFx5gzs0RgjMNCB5476jlaaBdmT2ae5IUfX+BfS/9Fpi+TxJhE7utyHwMuGmDNQKZALBEYUwiSEpM4lHaII54jjieCLF8WH67+kOmLprP/ZGBUl9+0/g0juo2gZvm8hgUz5swsERhTCAqjL4Ff/Xy24TMmfz+ZrUe2AnBBzQt45MpHbIRQExZLBMYUAidvIVVVvtv2HU9/+zSr9wWG42pYuSHDLh3GdS2us05hJmyWCIwpBE4MPKeqLNiygOd/eJ4Ve1cAUL1sdQZ1HcTv2/6e2OhYR2I1xhKBMYUgnN7FfvUzd+Ncnl/8POsOrMt5v7uS7+KOC+8gMTbR0ViNsURgTCE4n4HnjqUf48PVH/LW8rfYdnQbEKgB/OXiv9CvfT/KxJUpjFCNsURgTGEoyMXitfvX8sayN5i5bibp3nQA6lSowz2d7uGmtjfZJDGm0FkiMKYQnK1paOexnczeMJvZ62ezZv+anOWXNbiM2zrexpWNryQ6KrpIYjXGEoExhSD7rqFlu5fx0o8v0a1RN7Yc3sKqvav4+pevc0YDhUBP5N+2+S23dbjN5gYwrhDV858HXkR+DzwOtAI6BSekyWu7XsA0IBp4RVXHB5c3At4FqgA/A7eraubZPjc5OVmXLs3zo4wpFtIy0/jtW789pcAPVS6uHN0bdef6ltfTo1EPa/4xRUJEflbV5NzLw60RrAZ+C7x0hg+OBp4HrgZ2AktEZKaqrgUmAFNU9V0ReREYALwQZkzGuK5MXBlm95/NN1u/4e3lb5NyOIVmVZrRoloLLql/Ccl1kgt9DCJjzlW4U1WuA842sFUnIEVVtwS3fRe4UUTWAVcCfwxu9zqB2oUlAlMiREdFc0XjK7ii8RVuh2LMGRVFl8Q6wI6Q1zuDy6oAR1XVm2t5nkTkbhFZKiJLDxw4UGjBGmNMaXPWGoGIfAHkNZLVGFX9n/Mh5U1VZwAzIHCNoKg+1xhjSrqzJgJV7RnmZ+wC6oW8rhtcdgioJCIxwVpB9nJjjDFFqCiahpYAzUSkkYjEAf2AmRq4XWkhcFNwu/5AkdUwjDHGBISVCETk/4nITuASYLaIzA0ury0icwCCZ/sDgbnAOuB9Vc3uQTMSGCYiKQSuGfwrnHiMMcYUXFj9CNxi/QiMMabg8utHYAOZG2NMKWeJwBhjSrmIbBoSkQPAtvPcvSpw0MFwnGJxFYzFVTAWV8GU1LgaqGq13AsjMhGEQ0SW5tVG5jaLq2AsroKxuAqmtMVlTUPGGFPKWSIwxphSrjQmghluB5APi6tgLK6CsbgKplTFVequERhjjDlVaawRGGOMCWGJwBhjSrkSmQhE5PciskZE/CKS761WItJLRDaISIqIjApZ3khEfgwufy84WJ4TcSWJyHwR2RR8rJzHNleIyPKQv3QR+U1w3b9F5JeQdR2KKq7gdr6Qz54ZstzN49VBRH4Ift8rReSWkHWOHq/8fi8h6+OD//6U4PFoGLJudHD5BhG5Npw4ziOuYSKyNnh8vhSRBiHr8vxOiyiuP4nIgZDPvytkXf/g975JRPoXcVxTQmLaKCJHQ9YVyvESkVdFZL+IrM5nvYjI9GDMK0XkwpB14R8rVS1xfwTmUG4BfAUk57NNNLAZaAzEASuA1sF17wP9gs9fBO5zKK6JwKjg81HAhLNsnwQcBsoEX/8buKkQjtc5xQWk5rPcteMFNAeaBZ/XBvYAlZw+Xmf6vYRs81fgxeDzfsB7weetg9vHA42C7xNdhHFdEfIbui87rjN9p0UU15+A5/LYNwnYEnysHHxeuajiyrX9IODVIjhe3YELgdX5rO8NfAYI0AX40cljVSJrBKq6TlU3nGWznCk0VTUTyJ5CUwhMoflhcLvXgd84FNqNwfc71/e9CfhMVdMc+vz8FDSuHG4fL1XdqKqbgs93A/uB03pOOiDP38sZ4v0QuCp4fG4E3lXVDFX9BUgJvl+RxKWqC0N+Q4sJzP1R2M7leOXnWmC+qh5W1SPAfKCXS3H9AXjHoc/Ol6p+Q+CkLz83Av/RgMUE5nKphUPHqkQmgnPkyBSaBVRDVfcEn+8Fapxl+36c/iN8Klg1nCIi8UUcV4IEpgtdnN1cRTE6XiLSicBZ3uaQxU4dr/x+L3luEzwexwgcn3PZtzDjCjWAwJlltry+06KM63fB7+dDEcmewKpYHK9gE1ojYEHI4sI6XmeTX9yOHKuwJq93kxSTKTRzO1NcoS9UVUUk33t3g9m+HYF5HLKNJlAgxhG4n3gkMLYI42qgqrtEpDGwQERWESjszpvDx+sNoL+q+oOLz/t4lUQichuQDPQIWXzad6qqm/N+B8d9Cryjqhkicg+B2tSVRfTZ56If8KGq+kKWuXm8Ck3EJgItplNonikuEdknIrVUdU+w4Np/hre6GfhYVbNC3jv77DhDRF4DHizKuFR1V/Bxi4h8BXQEPsLl4yUiFYDZBE4CFoe893kfrzzk93vJa5udIhIDVCTwezqXfQszLkSkJ4Hk2kNVM7KX5/OdOlGwnTUuVT0U8vIVAteEsve9PNe+XzkQ0znFFaIfcH/ogkI8XmeTX9yOHKvS3DTkxhSaM4Pvdy7ve1rbZLAwzG6X/w2Q5x0GhRGXiFTObloRkarApcBat49X8Lv7mED76Ye51jl5vPL8vZwh3puABcHjMxPoJ4G7ihoBzYCfwoilQHGJSEfgJeAGVd0fsjzP77QI46oV8vIGAjMYQqAWfE0wvsrANZxaMy7UuIKxtSRw8fWHkGWFebzOZiZwR/DuoS7AseCJjjPHqjCugLv9B/w/Am1lGcA+YG5weW1gTsh2vYGNBDL6mJDljQn8R00BPgDiHYqrCvAlsAn4AkgKLk8GXgnZriGBTB+Va/8FwCoCBdqbQLmiigvoGvzsFcHHAcXheAG3AVnA8pC/DoVxvPL6vRBoaroh+Dwh+O9PCR6PxiH7jgnutwG4zuHf+9ni+iL4/yD7+Mw823daRHH9A1gT/PyFQMuQfe8MHscU4M9FGVfw9ePA+Fz7FdrxInDStyf4W95J4FrOvcC9wfUCPB+MeRUhd0M6caxsiAljjCnlSnPTkDHGGCwRGGNMqWeJwBhjSjlLBMYYU8pZIjDGmFLOEoExxpRylgiMMaaU+/8cZ7hwpbNLWQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -233,32 +265,340 @@ "fig = plt.figure().gca()\n", "\n", "# target constraint at t=0.5\n", - "fig.plot(pltx, target.velocity.data.flatten(), lw=2, color='forestgreen') \n", + "fig.plot(pltx, SOLUTION_T16.values.numpy('x'), lw=2, color='forestgreen') \n", "\n", - "# constrained state of simulation\n", - "contrained_state = sess.run(states[16], feed_dict={state_in: stateN}).velocity.data\n", - "fig.plot(pltx, contrained_state.flatten(), lw=2, color='mediumblue')" + "# optimized state of our simulation after 16 steps\n", + "fig.plot(pltx, velocities[16].values.numpy('x'), lw=2, color='mediumblue')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "This seems to be going in the right direction! It's not there yet, but we've also only computed 5 steps so far. The two peaks with a positive velocity on the left side of the shock and the negative peak on the right side are starting to show.\n", + "This seems to be going in the right direction! It's not there yet, but we've also only computed 5 GD update steps so far. The two peaks with a positive velocity on the left side of the shock and the negative peak on the right side are starting to show.\n", "\n", - "This is a good indicator that the backpropagation of gradients through all of our 16 simulated steps is behaving correctly, and driving the solution in the right direction. This hints at how powerful this setup is: the gradient that we obtain from each of the simulation steps (and each operation within them) can easily be chained together into more complex sequences. Here, we're backpropagation through all 16 steps of the simulation, and we could easily enlarge this \"look-ahead\" of the optimization without any additional effort.\n", + "This is a good indicator that the backpropagation of gradients through all of our 16 simulated steps is behaving correctly, and that it's driving the solution in the right direction. This hints at how powerful this setup is: the gradient that we obtain from each of the simulation steps (and each operation within them) can easily be chained together into more complex sequences. Here, we're backpropagation through all 16 steps of the simulation, and we could easily enlarge this \"look-ahead\" of the optimization with minor changes to the code.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More Optimization Steps\n", "\n", - "A simple direct reconstruction problem like this one is always a good initial test for a DP solver, e.g., before moving to more complex setups like coupling it with an NN. If the direct optimization does not converge, there's probably still something fundamentally wrong, and there's no point involving an NN. \n", - "\n", - "Our Burgers example here looks good - before including an NN, let's address the performance issue so: here we've updated our solutoin via a gradient that is \"manually\" computed with multiple TF session run() calls. TF's own optimizers do this internally, more flexibly and more efficiently. Let's start over, and switch to a `tf.train.Optimizer()` instead." + "Before moving on to more complex physics simulations, or involving NNs, let's finish the optimization task at hand, and run more steps to get a better solution.\n", + "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization step 0, loss: 0.183535\n", + "Optimization step 5, loss: 0.096258\n", + "Optimization step 10, loss: 0.054813\n", + "Optimization step 15, loss: 0.032847\n", + "Optimization step 20, loss: 0.020363\n", + "Optimization step 25, loss: 0.012899\n", + "Optimization step 30, loss: 0.008259\n", + "Optimization step 35, loss: 0.005283\n", + "Optimization step 40, loss: 0.003360\n", + "Runtime 20.50s\n" + ] + } + ], + "source": [ + "import time\n", + "start = time.time()\n", + "\n", + "for optim_step in range(45):\n", + " velocities = [velocity]\n", + " with math.record_gradients(velocity.values):\n", + " for time_step in range(STEPS):\n", + " v1 = diffuse.explicit(1.0*velocities[-1], NU, DT)\n", + " v2 = advect.semi_lagrangian(v1, v1, DT)\n", + " velocities.append(v2)\n", + "\n", + " loss = field.l2_loss(velocities[16] - SOLUTION_T16)*2./N # MSE\n", + " if optim_step%5==0: \n", + " print('Optimization step %d, loss: %f' % (optim_step,loss))\n", + "\n", + " grad = math.gradients(loss, velocity.values)\n", + "\n", + " velocity = velocity - LR * grad\n", + "\n", + "end = time.time()\n", + "print(\"Runtime {:.2f}s\".format(end-start))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Thinking back to the PINN version, we have a much lower error here after only 50 steps, and the oveall runtime is also much lower (ca. a factor of 4, depending on your hardware).\n", + "\n", + "Let's plot again how well our solution at $t=0.5$ (blue) matches the constraints (green) now:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure().gca()\n", + "fig.plot(pltx, SOLUTION_T16.values.numpy('x'), lw=2, color='forestgreen') \n", + "fig.plot(pltx, velocities[16].values.numpy('x'), lw=2, color='mediumblue')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not bad. But how well is the initial state recovered via backpropagation through the 16 simulation steps? This is what we're changing, and because it's only indirectly constrained via the observation later in time there is more room to deviate from a desired or expected solution.\n", + "\n", + "This is shown in the next plot: " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure().gca()\n", + "pltx = np.linspace(-1,1,N)\n", + "\n", + "# ground truth state at time=0 , move down\n", + "INITIAL_GT = np.asarray( [-np.sin(np.pi * x) * 1. for x in np.linspace(-1,1,N)] ) # 1D array\n", + "#t0gt = np.asarray( [ [-math.sin(np.pi * x) * 1.] for x in np.linspace(-1,1,n)] )\n", + "fig.plot(pltx, INITIAL_GT.flatten() , lw=2, color='forestgreen') # ground truth initial state of sim\n", + "\n", + "fig.plot(pltx, velocity.values.numpy('x'), lw=2, color='mediumblue') # manual\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Naturally, this is a tougher task: the optimization receives direct feedback what the state at $t=0.5$ should look like, but due to the non-linear model equation, we typically have a large number of solution that exactly or numerically very closely satisfy the constraints. Hence, our minimizer not necessarily finds the exact state we started from. However, it's still quite close in this Burgers scenario.\n", + "\n", + "Before measuring the overall error of the reconstruction, let's visualize the full evolution of our system over time as this also yields the solution in the form of a numpy array that we can compare to the other versions:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import pylab\n", + "\n", + "def show_state(a):\n", + " a=np.expand_dims(a, axis=2)\n", + " for i in range(4):\n", + " a = np.concatenate( [a,a] , axis=2)\n", + " a = np.reshape( a, [a.shape[0],a.shape[1]*a.shape[2]] )\n", + " fig, axes = pylab.subplots(1, 1, figsize=(16, 5))\n", + " im = axes.imshow(a, origin='upper', cmap='inferno')\n", + " pylab.colorbar(im) \n", + " \n", + "# get numpy versions of all states \n", + "vels = [ x.values.numpy('x,vector') for x in velocities] \n", + "# concatenate along vector/features dimension\n", + "vels = np.concatenate(vels, axis=-1) \n", + "\n", + "# save for comparison with other methods\n", + "np.savez_compressed(\"./temp/burgers-diffphys-solution.npz\", np.reshape(vels,[N,STEPS+1])) # remove batch & channel dimension\n", + "\n", + "show_state(vels)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Physics-Informed vs. Differentiable Physics Reconstruction\n", + "\n", + "Now we have both versions, the one with the PINN, and the DP version, so let's compare both reconstructions in more detail.\n", + "\n", + "Let's first look at the solutions side by side. The code below generates an image with 3 versions, from top to bottom: the \"ground truth\" (GT) solution as given by the regular forward simulation, in the middle the PINN reconstruction, and at the bottom the differentiable physics version.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Solutions Ground Truth (top), PINN (middle) , DiffPhys (bottom):\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# note, this requires running the forward sim & PINN notebooks beforehand\n", + "sol_gt=npfile=np.load(\"./temp/burgers-groundtruth-solution.npz\")[\"arr_0\"] ; #print(format(sol_gt.shape)) \n", + "sol_pi=npfile=np.load(\"./temp/burgers-pinn-solution.npz\")[\"arr_0\"] ; #print(format(sol_pi.shape)) \n", + "sol_dp=npfile=np.load(\"./temp/burgers-diffphys-solution.npz\")[\"arr_0\"] ; #print(format(sol_dp.shape)) \n", + "\n", + "divider = np.ones([10,33])*-1. # we'll sneak in a block of -1s to show a black divider in the image\n", + "sbs = np.concatenate( [sol_gt, divider, sol_pi, divider, sol_dp], axis=0)\n", + "\n", + "print(\"\\nSolutions Ground Truth (top), PINN (middle) , DiffPhys (bottom):\")\n", + "show_state(np.reshape(sbs,[N*3+20,33,1]))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's quite clearly visible here that the PINN solution (in the middle) recovers the overall shape of the solution, hence the temporal constraints are at least partially fulfilled. However, it doesn't manage to capture the amplitudes of the GT solution very well.\n", + "\n", + "The reconstruction from the optimization with a differentiable solver (at the bottom) is much closer to the ground truth thanks to an improved flow of gradients over the whole course of the sequence. In addition, it can leverage the grid-based discretization for both forwards as well as backwards passes, and in this way provide a more accurate signal to the unknown initial state. It is nonetheless visible, that the reconstruction lacks certain \"sharper\" features of the GT version, e.g., visible in the bottom left corner of the solution image.\n", + "\n", + "Let's quantify these errors over the whole sequence:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAE PINN: \t0.21460 \n", + "MAE DP: \t0.05909\n", + "\n", + "Error GT to PINN (top) , DiffPhys (bottom):\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "err_pi = np.sum( np.abs(sol_pi-sol_gt)) / (STEPS*N)\n", + "err_dp = np.sum( np.abs(sol_dp-sol_gt)) / (STEPS*N)\n", + "print(\"MAE PINN: \\t{:7.5f} \\nMAE DP: \\t{:7.5f}\".format(err_pi,err_dp))\n", + "\n", + "print(\"\\nError GT to PINN (top) , DiffPhys (bottom):\")\n", + "show_state(np.reshape( np.concatenate([sol_pi-sol_gt, divider, sol_dp-sol_gt],axis=0) ,[N*2+10,33,1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's a pretty clear result: the PINN error is ca. 5 times higher than the Differentiable Physics (DP) reconstruction.\n", + "\n", + "This difference also shows clearly in the jointly visualized image at the bottom: the magnitudes of the errors of the DP reconstruction are much closer to zero, as indicated by the purple color above.\n", + "\n", + "A simple direct reconstruction problem like this one is always a good initial test for a DP solver, e.g., before moving to more complex setups like coupling it with an NN. If the direct optimization does not converge, there's probably still something fundamentally wrong, and there's no point involving an NN. \n", + "\n", + "Now we have a first example to show similarities and differences of the two approaches. In the section, we'll present a more in depth discussion of these findings, before moving to more complex cases.\n", + "\n", + "\n", + "## Next Steps\n", + "\n", + "As with the PINN version, there's variety of things that can be improved and experimented with the code above:\n", + "\n", + "* You can try to adjust the training parameters to improve the reconstruction.\n", + "* As for the PINN case, you can activate a different optimizer, and observe the changing (not necessarily improved) behavior.\n", + "* Vary the number of steps, or the resolution of the simulation and reconstruction.\n" + ] } ], "metadata": { @@ -277,7 +617,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/diffphys-code-tf.ipynb b/diffphys-code-tf.ipynb index 7e2eadc..8d99fb1 100644 --- a/diffphys-code-tf.ipynb +++ b/diffphys-code-tf.ipynb @@ -336,7 +336,8 @@ "\n", "Now we have both versions, so let's compare both reconstructions in more detail.\n", "\n", - "Let's first look at the solutions side by side. The code below generates an image with 3 versions, from top to bottom: the \"ground truth\" (GT) solution as given by the regular forward simulation, in the middle the PINN reconstruction, and at the bottom the differentiable physics version." + "Let's first look at the solutions side by side. The code below generates an image with 3 versions, from top to bottom: the \"ground truth\" (GT) solution as given by the regular forward simulation, in the middle the PINN reconstruction, and at the bottom the differentiable physics version.\n", + "\n" ] }, { @@ -481,7 +482,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6" + "version": "3.8.5" } }, "nbformat": 4, diff --git a/diffphys.md b/diffphys.md index 26ff4a7..c0bff53 100644 --- a/diffphys.md +++ b/diffphys.md @@ -25,7 +25,7 @@ TODO, visual overview of DP training ## Differentiable Operators -With this direction we build on existing numerical solvers. I.e., +With the DP direction we build on existing numerical solvers. I.e., the approach is strongly relying on the algorithms developed in the larger field of computational methods for a vast range of physical effects in our world. To start with we need a continuous formulation as model for the physical effect that we'd like @@ -35,7 +35,7 @@ method for discretization of the equation. Let's assume we have a continuous formulation $\mathcal P^*(\mathbf{x}, \nu)$ of the physical quantity of interest $\mathbf{u}(\mathbf{x}, t): \mathbb R^d \times \mathbb R^+ \rightarrow \mathbb R^d$, -with a model parameter $\nu$ (e.g., a diffusion or viscosity constant). +with model parameters $\nu$ (e.g., diffusion, viscosity, or conductivity constants). The component of $\mathbf{u}$ will be denoted by a numbered subscript, i.e., $\mathbf{u} = (u_1,u_2,\dots,u_d)^T$. %and a corresponding discrete version that describes the evolution of this quantity over time: $\mathbf{u}_t = \mathcal P(\mathbf{x}, \mathbf{u}, t)$. @@ -54,9 +54,11 @@ $\partial \mathcal P_i / \partial \mathbf{u}$. Note that we typically don't need derivatives for all parameters of $\mathcal P$, e.g. we omit $\nu$ in the following, assuming that this is a -given model parameter, with which the NN should not interact. Naturally, it can vary, -by $\nu$ will not be the output of a NN representation. If this is the case, we can omit -providing $\partial \mathcal P_i / \partial \nu$ in our solver. +given model parameter, with which the NN should not interact. +Naturally, it can vary within the solution manifold that we're interested in, +but $\nu$ will not be the output of a NN representation. If this is the case, we can omit +providing $\partial \mathcal P_i / \partial \nu$ in our solver. However, the following learning process +natuarlly transfers to including $\nu$ as a degree of freedom. ## Jacobians @@ -93,7 +95,7 @@ this would cause huge memory overheads and unnecessarily slow down training. Instead, for backpropagation, we can provide faster operations that compute products with the Jacobian transpose because we always have a scalar loss function at the end of the chain. -[TODO check transpose of Jacobians in equations] +**[TODO check transpose of Jacobians in equations]** Given the formulation above, we need to resolve the derivatives of the chain of function compositions of the $\mathcal P_i$ at some current state $\mathbf{u}^n$ via the chain rule. @@ -121,7 +123,7 @@ as this [nice survey by Baydin et al.](https://arxiv.org/pdf/1502.05767.pdf). ## Learning via DP Operators -Thus, long story short, once the operators of our simulator support computations of the Jacobian-vector +Thus, once the operators of our simulator support computations of the Jacobian-vector products, we can integrate them into DL pipelines just like you would include a regular fully-connected layer or a ReLU activation. @@ -175,9 +177,6 @@ procedure for a _forward_ solve. Note that to simplify things, we assume that $\mathbf{u}$ is only a function in space, i.e. constant over time. We'll bring back the time evolution of $\mathbf{u}$ later on. % -[TODO, write out simple finite diff approx?] -[denote discrete d as $\mathbf{d}$ below?] -% Let's denote this re-formulation as $\mathcal P$. It maps a state of $d(t)$ into a new state at an evoled time, i.e.: @@ -186,7 +185,7 @@ $$ $$ As a simple example of an optimization and learning task, let's consider the problem of -finding an motion $\mathbf{u}$ such that starting with a given initial state $d^{~0}$ at $t^0$, +finding a motion $\mathbf{u}$ such that starting with a given initial state $d^{~0}$ at $t^0$, the time evolved scalar density at time $t^e$ has a certain shape or configuration $d^{\text{target}}$. Informally, we'd like to find a motion that deforms $d^{~0}$ into a target state. The simplest way to express this goal is via an $L^2$ loss between the two states. So we want @@ -273,8 +272,9 @@ be preferable to actually constructing $A$. ## A (slightly) more complex example -[TODO] -more complex, matrix inversion, eg Poisson solve +**[TODO]** + +a bit more complex, matrix inversion, eg Poisson solve dont backprop through all CG steps (available in phiflow though) rather, re-use linear solver to compute multiplication by inverse matrix diff --git a/intro.md b/intro.md index f64993f..eb2028f 100644 --- a/intro.md +++ b/intro.md @@ -82,6 +82,12 @@ See also... Test link: {doc}`supervised` --- +## TODOs , include + +- general motivation: repeated solves in classical solvers -> potential for ML +- PINNs: often need weighting of added loss terms for different parts + + ## TODOs , Planned content Loose collection of notes and TODOs: diff --git a/overview-burgers-forw.ipynb b/overview-burgers-forw.ipynb index b36d360..8787563 100644 --- a/overview-burgers-forw.ipynb +++ b/overview-burgers-forw.ipynb @@ -23,14 +23,14 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Using phiflow version: 2.0.0\n" + "Using phiflow version: 2.0.0rc0\n" ] } ], @@ -156,7 +156,7 @@ { "data": { "text/plain": [ - "[]" + "[]" ] }, "execution_count": 5, @@ -177,9 +177,8 @@ } ], "source": [ - "# we only need \"velocity.data\" from each phiflow state\n", - "#vels = [v.values.numpy('x') for v in velocities]\n", - "vels = [v.values.numpy('x,vector') for v in velocities] # vel vx\n", + "# get \"velocity.values\" from each phiflow state with a channel dimensions, i.e. \"vector\"\n", + "vels = [v.values.numpy('x,vector') for v in velocities] # gives a list of 2D arrays \n", "\n", "import pylab\n", "\n", @@ -203,14 +202,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Vels array shape: (128, 33, 1)\n" + "resulting image size(128, 528)\n" ] }, { @@ -230,18 +229,18 @@ "def show_state(a):\n", " # we only have 33 time steps, blow up by a factor of 2^4 to make it easier to see\n", " # (could also be done with more evaluations of network)\n", + " a=np.expand_dims(a, axis=2)\n", " for i in range(4):\n", " a = np.concatenate( [a,a] , axis=2)\n", "\n", " a = np.reshape( a, [a.shape[0],a.shape[1]*a.shape[2]] )\n", - " #print(\"resulting image size\" +format(a.shape))\n", + " print(\"resulting image size\" +format(a.shape))\n", + "\n", " fig, axes = pylab.subplots(1, 1, figsize=(16, 5))\n", " im = axes.imshow(a, origin='upper', cmap='inferno')\n", " pylab.colorbar(im) \n", " \n", - "#vels_img = np.asarray( np.stack(vels), dtype=np.float32 ).transpose() # no component channel\n", - "vels_img = np.asarray( np.concatenate(vels, axis=-1), dtype=np.float32 ) # vel vx\n", - "vels_img = np.reshape(vels_img, list(vels_img.shape)+[1] ) ; print(\"Vels array shape: \"+format(vels_img.shape))\n", + "vels_img = np.asarray( np.concatenate(vels, axis=-1), dtype=np.float32 ) \n", "\n", "# save for comparison with reconstructions later on\n", "np.savez_compressed(\"./temp/burgers-groundtruth-solution.npz\", np.reshape(vels_img,[N,STEPS+1])) # remove batch & channel dimension\n",