diff --git a/docs/source/_rst/tutorial1/output_13_0.png b/docs/source/_rst/tutorial1/output_13_0.png deleted file mode 100644 index b18c757..0000000 Binary files a/docs/source/_rst/tutorial1/output_13_0.png and /dev/null differ diff --git a/docs/source/_rst/tutorial1/output_20_0.png b/docs/source/_rst/tutorial1/output_20_0.png deleted file mode 100644 index 876e57d..0000000 Binary files a/docs/source/_rst/tutorial1/output_20_0.png and /dev/null differ diff --git a/docs/source/_rst/tutorial1/output_29_0.png b/docs/source/_rst/tutorial1/output_29_0.png deleted file mode 100644 index f82b416..0000000 Binary files a/docs/source/_rst/tutorial1/output_29_0.png and /dev/null differ diff --git a/docs/source/_rst/tutorial1/output_31_0.png b/docs/source/_rst/tutorial1/output_31_0.png deleted file mode 100644 index 9c4ce4e..0000000 Binary files a/docs/source/_rst/tutorial1/output_31_0.png and /dev/null differ diff --git a/docs/source/_rst/tutorial1/tutorial-1.rst b/docs/source/_rst/tutorial1/tutorial-1.rst deleted file mode 100644 index 9b9e085..0000000 --- a/docs/source/_rst/tutorial1/tutorial-1.rst +++ /dev/null @@ -1,302 +0,0 @@ -Tutorial 1: resolution of a Poisson problem -=========================================== - -The problem definition -~~~~~~~~~~~~~~~~~~~~~~ - -This tutorial presents how to solve with Physics-Informed Neural -Networks a 2-D Poisson problem with Dirichlet boundary conditions. - -The problem is written as: :raw-latex:`\begin{equation} -\begin{cases} -\Delta u = \sin{(\pi x)} \sin{(\pi y)} \text{ in } D, \\ -u = 0 \text{ on } \Gamma_1 \cup \Gamma_2 \cup \Gamma_3 \cup \Gamma_4, -\end{cases} -\end{equation}` -where :math:`D` is a square domain :math:`[0,1]^2`, and -:math:`\Gamma_i`, with :math:`i=1,...,4`, are the boundaries of the -square. - -First of all, some useful imports. - -.. code:: ipython3 - - import os - import numpy as np - import argparse - import sys - import torch - from torch.nn import ReLU, Tanh, Softplus - from pina.problem import SpatialProblem - from pina.operators import nabla - from pina.model import FeedForward - from pina.adaptive_functions import AdaptiveSin, AdaptiveCos, AdaptiveTanh - from pina import Condition, Span, PINN, LabelTensor, Plotter - -Now, the Poisson problem is written in PINA code as a class. The -equations are written as *conditions* that should be satisfied in the -corresponding domains. *truth_solution* is the exact solution which will -be compared with the predicted one. - -.. code:: ipython3 - - class Poisson(SpatialProblem): - spatial_variables = ['x', 'y'] - bounds_x = [0, 1] - bounds_y = [0, 1] - output_variables = ['u'] - domain = Span({'x': bounds_x, 'y': bounds_y}) - - def laplace_equation(input_, output_): - force_term = (torch.sin(input_['x']*torch.pi) * - torch.sin(input_['y']*torch.pi)) - return nabla(output_['u'], input_).flatten() - force_term - - def nil_dirichlet(input_, output_): - value = 0.0 - return output_['u'] - value - - conditions = { - 'gamma1': Condition( - Span({'x': bounds_x, 'y': bounds_y[-1]}), nil_dirichlet), - 'gamma2': Condition( - Span({'x': bounds_x, 'y': bounds_y[0]}), nil_dirichlet), - 'gamma3': Condition( - Span({'x': bounds_x[-1], 'y': bounds_y}), nil_dirichlet), - 'gamma4': Condition( - Span({'x': bounds_x[0], 'y': bounds_y}), nil_dirichlet), - 'D': Condition( - Span({'x': bounds_x, 'y': bounds_y}), laplace_equation), - } - def poisson_sol(self, x, y): - return -(np.sin(x*np.pi)*np.sin(y*np.pi))/(2*np.pi**2) - - truth_solution = poisson_sol - -The problem solution -~~~~~~~~~~~~~~~~~~~~ - -Then, a feed-forward neural network is defined, through the class -*FeedForward*. A 2-D grid is instantiated inside the square domain and -on the boundaries. This neural network takes as input the coordinates of -the points which compose the grid and gives as output the solution of -the Poisson problem. The residual of the equations are evaluated at each -point of the grid and the loss minimized by the neural network is the -sum of the residuals. In this tutorial, the neural network is composed -by two hidden layers of 10 neurons each, and it is trained for 5000 -epochs with a learning rate of 0.003. These parameters can be modified -as desired. The output of the cell below is the final loss of the -training phase of the PINN. - -.. code:: ipython3 - - poisson_problem = Poisson() - - model = FeedForward(layers=[10, 10], - output_variables=poisson_problem.output_variables, - input_variables=poisson_problem.input_variables) - - pinn = PINN(poisson_problem, model, lr=0.003, regularizer=1e-8) - pinn.span_pts(20, 'grid', locations=['gamma1', 'gamma2', 'gamma3', 'gamma4']) - pinn.span_pts(20, 'grid', locations=['D']) - pinn.train(5000, 100) - - - - -The loss trend is saved in a dedicated txt file located in -*tutorial1_files*. - -.. code:: ipython3 - - os.mkdir('tutorial1_files') - with open('tutorial1_files/poisson_history.txt', 'w') as file_: - for i, losses in enumerate(pinn.history): - file_.write('{} {}\n'.format(i, sum(losses))) - pinn.save_state('tutorial1_files/pina.poisson') - -Now the *Plotter* class is used to plot the results. The solution -predicted by the neural network is plotted on the left, the exact one is -represented at the center and on the right the error between the exact -and the predicted solutions is showed. - -.. code:: ipython3 - - plotter = Plotter() - plotter.plot(pinn) - - - -.. image:: output_13_0.png - - -The problem solution with extra-features -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Now, the same problem is solved in a different way. A new neural network -is now defined, with an additional input variable, named extra-feature, -which coincides with the forcing term in the Laplace equation. The set -of input variables to the neural network is: - -:raw-latex:`\begin{equation} -[\mathbf{x}, \mathbf{y}, \mathbf{k}(\mathbf{x}, \mathbf{y})], \text{ with } \mathbf{k}(\mathbf{x}, \mathbf{y})=\sin{(\pi \mathbf{x})}\sin{(\pi \mathbf{y})}, -\end{equation}` - -where :math:`\mathbf{x}` and :math:`\mathbf{y}` are the coordinates of -the points of the grid and :math:`\mathbf{k}(\mathbf{x}, \mathbf{y})` is -the forcing term evaluated at the grid points. - -This forcing term is initialized in the class *myFeature*, the output of -the cell below is also in this case the final loss of PINN. - -.. code:: ipython3 - - poisson_problem = Poisson() - - class myFeature(torch.nn.Module): - """ - """ - def __init__(self): - super(myFeature, self).__init__() - - def forward(self, x): - return LabelTensor(torch.sin(x.extract(['x'])*torch.pi) * - torch.sin(x.extract(['y'])*torch.pi), 'k') - - feat = [myFeature()] - model_feat = FeedForward(layers=[10, 10], - output_variables=poisson_problem.output_variables, - input_variables=poisson_problem.input_variables, - extra_features=feat) - - pinn_feat = PINN(poisson_problem, model_feat, lr=0.003, regularizer=1e-8) - pinn_feat.span_pts(20, 'grid', locations=['gamma1', 'gamma2', 'gamma3', 'gamma4']) - pinn.feat_span_pts(20, 'grid', locations=['D']) - pinn_feat.train(5000, 100) - - - - - -The losses are saved in a txt file as for the basic Poisson case. - -.. code:: ipython3 - - with open('tutorial1_files/poisson_history_feat.txt', 'w') as file_: - for i, losses in enumerate(pinn_feat.history): - file_.write('{} {}\n'.format(i, sum(losses))) - pinn_feat.save_state('tutorial1_files/pina.poisson_feat') - -The predicted and exact solutions and the error between them are -represented below. - -.. code:: ipython3 - - plotter_feat = Plotter() - plotter_feat.plot(pinn_feat) - - - -.. image:: output_20_0.png - - -The problem solution with learnable extra-features -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Another way to predict the solution is to add a parametric extra-feature. -The parameters added in the -expression of the extra-feature are learned during the training phase of -the neural network. For example, considering two parameters, the -parameteric extra-feature is written as: - -:raw-latex:`\begin{equation} -\mathbf{k}(\mathbf{x}, \mathbf{y}) = \beta \sin{(\alpha \mathbf{x})} \sin{(\alpha \mathbf{y})} -\end{equation}` - -Here, as done for the other cases, the new parametric feature is defined -and the neural network is re-initialized and trained. - -.. code:: ipython3 - - class LearnableFeature(torch.nn.Module): - """ - """ - def __init__(self): - super(myFeature, self).__init__() - self.beta = torch.nn.Parameter(torch.Tensor([1.0])) - self.alpha = torch.nn.Parameter(torch.Tensor([1.0])) - - def forward(self, x): - return LabelTensor( - self.beta*torch.sin(self.alpha*x.extract(['x'])*torch.pi)* - torch.sin(self.alpha*x.extract(['y'])*torch.pi), - 'k') - - feat = [LearnableFeature()] - model_learn = FeedForward(layers=[10, 10], - output_variables=param_poisson_problem.output_variables, - input_variables=param_poisson_problem.input_variables, - extra_features=feat) - - pinn_learn = PINN(poisson_problem, model_feat, lr=0.003, regularizer=1e-8) - pinn_learn.span_pts(20, 'grid', ['D']) - pinn_learn.span_pts(20, 'grid', ['gamma1', 'gamma2', 'gamma3', 'gamma4']) - pinn_learn.train(5000, 100) - - - - -The losses are saved as for the other two cases trained above. - -.. code:: ipython3 - - with open('tutorial1_files/poisson_history_learn_feat.txt', 'w') as file_: - for i, losses in enumerate(pinn_learn.history): - file_.write('{} {}\n'.format(i, sum(losses))) - pinn_learn.save_state('tutorial1_files/pina.poisson_learn_feat') - -Here the plots for the prediction error (below on the right) shows that -the prediction coming from the latter version is more accurate than -the one of the basic version of PINN. - -.. code:: ipython3 - - plotter_learn = Plotter() - plotter_learn.plot(pinn_learn) - - - -.. image:: output_29_0.png - - -Now the files containing the loss trends for the three cases are read. -The loss histories are compared; we can see that the loss decreases -faster in the cases of PINN with extra-feature. - -.. code:: ipython3 - - import pandas as pd - - df = pd.read_csv("tutorial1_files/poisson_history.txt", sep=" ", header=None) - epochs = df[0] - poisson_data = epochs.to_numpy()*100 - basic = df[1].to_numpy() - - df_feat = pd.read_csv("tutorial1_files/poisson_history_feat.txt", sep=" ", header=None) - feat = df_feat[1].to_numpy() - - df_learn = pd.read_csv("tutorial1_files/poisson_history_learn_feat.txt", sep=" ", header=None) - learn_feat = df_learn[1].to_numpy() - - import matplotlib.pyplot as plt - plt.semilogy(epochs, basic, label='Basic PINN') - plt.semilogy(epochs, feat, label='PINN with extra-feature') - plt.semilogy(epochs, learn_feat, label='PINN with learnable extra-feature') - plt.legend() - plt.grid() - plt.show() - - - -.. image:: output_31_0.png - diff --git a/docs/source/_rst/tutorial2/output_13_0.png b/docs/source/_rst/tutorial2/output_13_0.png new file mode 100644 index 0000000..ce2f287 Binary files /dev/null and b/docs/source/_rst/tutorial2/output_13_0.png differ diff --git a/docs/source/_rst/tutorial2/output_18_0.png b/docs/source/_rst/tutorial2/output_18_0.png new file mode 100644 index 0000000..417fe99 Binary files /dev/null and b/docs/source/_rst/tutorial2/output_18_0.png differ diff --git a/docs/source/_rst/tutorial2/output_25_0.png b/docs/source/_rst/tutorial2/output_25_0.png new file mode 100644 index 0000000..5ee8319 Binary files /dev/null and b/docs/source/_rst/tutorial2/output_25_0.png differ diff --git a/docs/source/_rst/tutorial2/output_26_0.png b/docs/source/_rst/tutorial2/output_26_0.png new file mode 100644 index 0000000..dfcd81a Binary files /dev/null and b/docs/source/_rst/tutorial2/output_26_0.png differ diff --git a/docs/source/_rst/tutorial2/tutorial.rst b/docs/source/_rst/tutorial2/tutorial.rst new file mode 100644 index 0000000..075cd23 --- /dev/null +++ b/docs/source/_rst/tutorial2/tutorial.rst @@ -0,0 +1,410 @@ +Tutorial 2: resolution of Poisson problem and usage of extra-features +===================================================================== + +The problem definition +~~~~~~~~~~~~~~~~~~~~~~ + +This tutorial presents how to solve with Physics-Informed Neural +Networks a 2D Poisson problem with Dirichlet boundary conditions. + +The problem is written as: :raw-latex:`\begin{equation} +\begin{cases} +\Delta u = \sin{(\pi x)} \sin{(\pi y)} \text{ in } D, \\ +u = 0 \text{ on } \Gamma_1 \cup \Gamma_2 \cup \Gamma_3 \cup \Gamma_4, +\end{cases} +\end{equation}` where :math:`D` is a square domain :math:`[0,1]^2`, and +:math:`\Gamma_i`, with :math:`i=1,...,4`, are the boundaries of the +square. + +First of all, some useful imports. + +.. code:: ipython3 + + import torch + from torch.nn import ReLU, Tanh, Softplus + + from pina.problem import SpatialProblem + from pina.operators import nabla + from pina.model import FeedForward + from pina import Condition, Span, PINN, LabelTensor, Plotter + +Now, the Poisson problem is written in PINA code as a class. The +equations are written as *conditions* that should be satisfied in the +corresponding domains. *truth_solution* is the exact solution which will +be compared with the predicted one. + +.. code:: ipython3 + + class Poisson(SpatialProblem): + output_variables = ['u'] + spatial_domain = Span({'x': [0, 1], 'y': [0, 1]}) + + def laplace_equation(input_, output_): + force_term = (torch.sin(input_.extract(['x'])*torch.pi) * + torch.sin(input_.extract(['y'])*torch.pi)) + nabla_u = nabla(output_, input_, components=['u'], d=['x', 'y']) + return nabla_u - force_term + + def nil_dirichlet(input_, output_): + value = 0.0 + return output_.extract(['u']) - value + + conditions = { + 'gamma1': Condition(Span({'x': [0, 1], 'y': 1}), nil_dirichlet), + 'gamma2': Condition(Span({'x': [0, 1], 'y': 0}), nil_dirichlet), + 'gamma3': Condition(Span({'x': 1, 'y': [0, 1]}), nil_dirichlet), + 'gamma4': Condition(Span({'x': 0, 'y': [0, 1]}), nil_dirichlet), + 'D': Condition(Span({'x': [0, 1], 'y': [0, 1]}), laplace_equation), + } + + def poisson_sol(self, pts): + return -( + torch.sin(pts.extract(['x'])*torch.pi)* + torch.sin(pts.extract(['y'])*torch.pi) + )/(2*torch.pi**2) + + truth_solution = poisson_sol + +The problem solution +~~~~~~~~~~~~~~~~~~~~ + +After the problem, the feed-forward neural network is defined, through +the class ``FeedForward``. This neural network takes as input the +coordinates (in this case :math:`x` and :math:`y`) and provides the +unkwown field of the Poisson problem. The residual of the equations are +evaluated at several sampling points (which the user can manipulate +using the method ``span_pts``) and the loss minimized by the neural +network is the sum of the residuals. + +In this tutorial, the neural network is composed by two hidden layers of +10 neurons each, and it is trained for 1000 epochs with a learning rate +of 0.006. These parameters can be modified as desired. The output of the +cell below is the final loss of the training phase of the PINN. We +highlight that the generation of the sampling points and the train is +here encapsulated within the function ``generate_samples_and_train``, +but only for saving some lines of code in the next cells; that function +is not mandatory in the **PINA** framework. + +.. code:: ipython3 + + def generate_samples_and_train(model, problem): + pinn = PINN(problem, model, lr=0.006, regularizer=1e-8) + pinn.span_pts(20, 'grid', locations=['D']) + pinn.span_pts(20, 'grid', locations=['gamma1', 'gamma2', 'gamma3', 'gamma4']) + pinn.train(1000, 100) + return pinn + + problem = Poisson() + model = FeedForward( + layers=[10, 10], + func=Softplus, + output_variables=problem.output_variables, + input_variables=problem.input_variables + ) + + pinn = generate_samples_and_train(model, problem) + + +.. parsed-literal:: + + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00000] 4.821361e-01 7.271265e-02 5.749976e-02 7.188050e-02 5.793815e-02 2.221050e-01 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00001] 3.231621e-01 2.852444e-02 1.981721e-02 2.768876e-02 2.037603e-02 2.267557e-01 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00100] 1.015092e-01 5.198789e-04 2.826267e-03 3.158009e-03 2.300746e-03 9.270430e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00200] 8.891604e-02 4.115215e-04 5.373723e-04 5.063288e-04 5.177262e-04 8.694309e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00300] 8.620024e-02 3.734426e-04 4.014817e-04 3.966301e-04 4.261272e-04 8.460256e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00400] 8.090379e-02 3.381128e-04 2.724089e-04 2.855197e-04 3.383889e-04 7.966936e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00500] 7.000037e-02 2.501736e-04 7.233566e-05 1.258494e-04 1.898462e-04 6.936217e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00600] 2.645028e-02 9.258305e-05 2.108825e-04 1.832870e-04 7.366277e-05 2.588986e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00700] 2.599242e-03 5.990163e-05 9.679930e-05 1.735135e-04 3.957247e-05 2.229455e-03 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00800] 1.343722e-03 6.899313e-05 4.569854e-05 1.231751e-04 1.892484e-05 1.086931e-03 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00900] 8.533830e-04 6.269138e-05 2.274475e-05 8.422977e-05 1.782445e-05 6.658927e-04 + [epoch 01000] 6.219158e-04 5.753698e-05 1.195975e-05 6.105051e-05 1.724382e-05 4.741247e-04 + + +The neural network of course can be saved in a file. In such a way, we +can store it after the train, and load it just to infer the field. Here +we don’t store the model, but for demonstrative purposes we put in the +next cell the commented line of code. + +.. code:: ipython3 + + # pinn.save_state('pina.poisson') + +Now the *Plotter* class is used to plot the results. The solution +predicted by the neural network is plotted on the left, the exact one is +represented at the center and on the right the error between the exact +and the predicted solutions is showed. + +.. code:: ipython3 + + plotter = Plotter() + plotter.plot(pinn) + + + +.. image:: output_13_0.png + + +The problem solution with extra-features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Now, the same problem is solved in a different way. A new neural network +is now defined, with an additional input variable, named extra-feature, +which coincides with the forcing term in the Laplace equation. The set +of input variables to the neural network is: + +:raw-latex:`\begin{equation} +[x, y, k(x, y)], \text{ with } k(x, y)=\sin{(\pi x)}\sin{(\pi y)}, +\end{equation}` + +where :math:`x` and :math:`y` are the spatial coordinates and +:math:`k(x, y)` is the added feature. + +This feature is initialized in the class ``SinSin``, which needs to be +inherited by the ``torch.nn.Module`` class and to have the ``forward`` +method. After declaring such feature, we can just incorporate in the +``FeedForward`` class thanks to the ``extra_features`` argument. **NB**: +``extra_features`` always needs a ``list`` as input, you you have one +feature just encapsulated it in a class, as in the next cell. + +Finally, we perform the same training as before: the problem is +``Poisson``, the network is composed by the same number of neurons and +optimizer parameters are equal to previous test, the only change is the +new extra feature. + +.. code:: ipython3 + + class SinSin(torch.nn.Module): + """Feature: sin(x)*sin(y)""" + def __init__(self): + super().__init__() + + def forward(self, x): + t = (torch.sin(x.extract(['x'])*torch.pi) * + torch.sin(x.extract(['y'])*torch.pi)) + return LabelTensor(t, ['sin(x)sin(y)']) + + model_feat = FeedForward( + layers=[10, 10], + output_variables=problem.output_variables, + input_variables=problem.input_variables, + func=Softplus, + extra_features=[SinSin()] + ) + + pinn_feat = generate_samples_and_train(model_feat, problem) + + +.. parsed-literal:: + + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00000] 8.334048e-02 1.480584e-02 1.326940e-02 1.505190e-02 1.282023e-02 2.739312e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00001] 2.369340e-02 1.785535e-03 1.441936e-03 1.978278e-03 1.193302e-03 1.729435e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00100] 4.190661e-05 5.259407e-06 2.207154e-06 1.740728e-06 1.258537e-06 3.144078e-05 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00200] 2.964181e-06 3.873027e-08 3.952280e-08 6.926503e-08 4.859637e-08 2.768067e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00300] 2.477657e-06 3.019578e-08 3.888974e-08 5.290904e-08 4.751930e-08 2.308143e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00400] 2.054579e-06 2.595518e-08 3.504910e-08 4.605295e-08 4.163064e-08 1.905891e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00500] 1.716277e-06 2.342572e-08 3.247192e-08 4.101565e-08 3.697489e-08 1.582388e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00600] 1.461072e-06 2.217194e-08 3.119703e-08 3.734558e-08 3.372288e-08 1.336635e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00700] 1.275204e-06 2.180191e-08 3.080508e-08 3.476259e-08 3.154803e-08 1.156287e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00800] 1.141423e-06 2.190318e-08 3.084367e-08 3.297679e-08 3.010750e-08 1.025592e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00900] 1.043816e-06 2.220373e-08 3.104670e-08 3.163695e-08 2.905372e-08 9.298745e-07 + [epoch 01000] 9.697858e-07 2.242846e-08 3.111799e-08 3.060282e-08 2.824710e-08 8.573894e-07 + + +The predicted and exact solutions and the error between them are +represented below. We can easily note that now our network, having +almost the same condition as before, is able to reach an additional +order of magnitude in accuracy. + +.. code:: ipython3 + + plotter.plot(pinn_feat) + + + +.. image:: output_18_0.png + + +The problem solution with learnable extra-features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We can still do better! + +Another way to exploit the extra features is the addition of learnable +parameter inside them. In this way, the added parameters are learned +during the training phase of the neural network. In this case, we use: + +:raw-latex:`\begin{equation} +k(x, \mathbf{y}) = \beta \sin{(\alpha x)} \sin{(\alpha y)}, +\end{equation}` + +where :math:`\alpha` and :math:`\beta` are the abovementioned +parameters. Their implementation is quite trivial: by using the class +``torch.nn.Parameter`` we cam define all the learnable parameters we +need, and they are managed by ``autograd`` module! + +.. code:: ipython3 + + class SinSinAB(torch.nn.Module): + """ """ + def __init__(self): + super().__init__() + self.alpha = torch.nn.Parameter(torch.tensor([1.0])) + self.beta = torch.nn.Parameter(torch.tensor([1.0])) + + + def forward(self, x): + t = ( + self.beta*torch.sin(self.alpha*x.extract(['x'])*torch.pi)* + torch.sin(self.alpha*x.extract(['y'])*torch.pi) + ) + return LabelTensor(t, ['b*sin(a*x)sin(a*y)']) + + + model_learn = FeedForward( + layers=[10, 10], + output_variables=problem.output_variables, + input_variables=problem.input_variables, + extra_features=[SinSinAB()] + ) + + pinn_learn = generate_samples_and_train(model_learn, problem) + + +.. parsed-literal:: + + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00000] 3.918677e-01 2.501913e-02 1.278682e-02 1.963722e-02 1.756839e-02 3.168561e-01 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00001] 1.345929e-01 1.696471e-02 9.475741e-03 1.432935e-02 1.169397e-02 8.212914e-02 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00100] 4.500092e-04 1.441140e-05 9.839978e-06 2.283052e-05 4.087769e-06 3.988396e-04 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00200] 2.102947e-04 1.462936e-05 2.168394e-06 4.655578e-06 4.340448e-07 1.884074e-04 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00300] 1.371512e-04 1.072066e-05 1.284032e-06 2.897264e-06 1.126986e-06 1.211222e-04 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00400] 9.371716e-05 7.952534e-06 1.115802e-06 2.099921e-06 1.375253e-06 8.117365e-05 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00500] 6.719316e-05 5.919826e-06 9.837649e-07 1.510521e-06 1.423588e-06 5.735546e-05 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00600] 5.042886e-05 4.428994e-06 8.414617e-07 1.083298e-06 1.338001e-06 4.273711e-05 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00700] 3.907475e-05 3.327482e-06 7.004838e-07 7.866622e-07 1.162936e-06 3.309719e-05 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00800] 3.086757e-05 2.501366e-06 5.700428e-07 5.815515e-07 9.500203e-07 2.626459e-05 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00900] 2.470110e-05 1.874311e-06 4.546698e-07 4.359081e-07 7.396913e-07 2.119652e-05 + [epoch 01000] 1.999130e-05 1.396229e-06 3.562134e-07 3.291411e-07 5.548665e-07 1.735485e-05 + + +Umh, the final loss is not appreciabily better than previous model (with +static extra features), despite the usage of learnable parameters. This +is mainly due to the over-parametrization of the network: there are many +parameter to optimize during the training, and the model in unable to +understand automatically that only the parameters of the extra feature +(and not the weights/bias of the FFN) should be tuned in order to fit +our problem. A longer training can be helpful, but in this case the +faster way to reach machine precision for solving the Poisson problem is +removing all the hidden layers in the ``FeedForward``, keeping only the +:math:`\alpha` and :math:`\beta` parameters of the extra feature. + +.. code:: ipython3 + + model_learn = FeedForward( + layers=[], + output_variables=problem.output_variables, + input_variables=problem.input_variables, + extra_features=[SinSinAB()] + ) + + pinn_learn = generate_samples_and_train(model_learn, problem) + + +.. parsed-literal:: + + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00000] 1.974945e+00 2.002993e-03 7.012323e-02 2.755559e-02 1.584911e-02 1.859414e+00 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00001] 1.761779e+00 3.188374e-03 6.539153e-02 2.452723e-02 1.474262e-02 1.653930e+00 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00100] 4.036187e-03 1.676370e-05 2.384196e-05 1.675912e-05 2.528631e-05 3.953536e-03 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00200] 3.638973e-06 9.148435e-09 5.011525e-09 8.995231e-09 5.055353e-09 3.610763e-06 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00300] 7.258809e-11 2.040413e-13 1.323202e-13 1.966580e-13 1.385408e-13 7.191653e-11 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00400] 1.095777e-13 2.320287e-16 3.792855e-17 2.308433e-16 3.710536e-17 1.090398e-13 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00500] 1.095686e-13 2.238822e-16 4.053546e-17 2.238880e-16 4.054121e-17 1.090398e-13 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00600] 1.095686e-13 2.238991e-16 4.052415e-17 2.238992e-16 4.052421e-17 1.090398e-13 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00700] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00800] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 + sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ + [epoch 00900] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 + [epoch 01000] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 + + +In such a way, the model is able to reach a very high accuracy! Of +course, this is a toy problem for understanding the usage of extra +features: similar precision could be obtained if the extra features are +very similar to the true solution. The analyzed Poisson problem shows a +forcing term very close to the solution, resulting in a perfect problem +to address with such an approach. + +We conclude here by showing the graphical comparison of the unknown +field and the loss trend for all the test cases presented here: the +standard PINN, PINN with extra features, and PINN with learnable extra +features. + +.. code:: ipython3 + + plotter.plot(pinn_learn) + + + +.. image:: output_25_0.png + + +.. code:: ipython3 + + import matplotlib.pyplot as plt + + plt.figure(figsize=(16, 6)) + plotter.plot_loss(pinn, label='Standard') + plotter.plot_loss(pinn_feat, label='Static Features') + plotter.plot_loss(pinn_learn, label='Learnable Features') + + plt.grid() + plt.legend() + plt.show() + + + +.. image:: output_26_0.png + diff --git a/docs/source/index.rst b/docs/source/index.rst index d2c7b6b..4975e64 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -35,7 +35,7 @@ solve problems in a continuous and nonlinear settings. :numbered: :caption: Tutorials: - Poisson problem <_rst/tutorial1/tutorial-1.rst> + Poisson problem <_rst/tutorial2/tutorial.rst> .. ........................................................................................ diff --git a/pina/span.py b/pina/span.py index 50083cc..cab9544 100644 --- a/pina/span.py +++ b/pina/span.py @@ -19,8 +19,6 @@ class Span(Location): else: raise TypeError - print(span_dict, self.fixed_, self.range_, 'YYYYYYYYYY') - @property def variables(self): return list(self.fixed_.keys()) + list(self.range_.keys()) diff --git a/tutorials/README.md b/tutorials/README.md index c699f78..3abeb6c 100644 --- a/tutorials/README.md +++ b/tutorials/README.md @@ -5,6 +5,7 @@ In this folder we collect useful tutorials in order to understand the principles | Name | Description | Type of Problem | |-------|---------------|-------------------| -| Tutorial1 [[.ipynb](tutorial1/tutorial-1.ipynb), [.py](tutorial1/tutorial-1.py), [.html](http://mathlab.github.io/PINA/_rst/tutorial1/tutorial-1.html)]| Poisson problem on regular domain using extra features | `SpatialProblem` | +| Tutorial1 [[.ipynb](), [.py](), [.html]()]| Coming soon | | +| Tutorial2 [[.ipynb](tutorial2/tutorial.ipynb), [.py](tutorial2/tutorial.py), [.html](http://mathlab.github.io/PINA/_rst/tutorial1/tutorial-1.html)]| Poisson problem on regular domain using extra features | `SpatialProblem` | diff --git a/tutorials/tutorial1/tutorial-1.ipynb b/tutorials/tutorial1/tutorial-1.ipynb deleted file mode 100644 index a018bb5..0000000 --- a/tutorials/tutorial1/tutorial-1.ipynb +++ /dev/null @@ -1,607 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "60c55e04", - "metadata": {}, - "source": [ - "# Tutorial 1: resolution of a Poisson problem" - ] - }, - { - "cell_type": "markdown", - "id": "11b1b539", - "metadata": {}, - "source": [ - "### The problem definition" - ] - }, - { - "cell_type": "markdown", - "id": "56edb356", - "metadata": {}, - "source": [ - "This tutorial presents how to solve with Physics-Informed Neural Networks a 2-D Poisson problem with Dirichlet boundary conditions.\n", - "\n", - "The problem is written as:\n", - "\\begin{equation}\n", - "\\begin{cases}\n", - "\\Delta u = \\sin{(\\pi x)} \\sin{(\\pi y)} \\text{ in } D, \\\\\n", - "u = 0 \\text{ on } \\Gamma_1 \\cup \\Gamma_2 \\cup \\Gamma_3 \\cup \\Gamma_4,\n", - "\\end{cases}\n", - "\\end{equation}\n", - "where $D$ is a square domain $[0,1]^2$, and $\\Gamma_i$, with $i=1,...,4$, are the boundaries of the square." - ] - }, - { - "cell_type": "markdown", - "id": "bd72a9f9", - "metadata": {}, - "source": [ - "First of all, some useful imports." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "0f54a8bc", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import numpy as np\n", - "import argparse\n", - "import sys\n", - "import torch\n", - "from torch.nn import ReLU, Tanh, Softplus\n", - "from pina.problem import SpatialProblem\n", - "from pina.operators import nabla\n", - "from pina.model import FeedForward\n", - "from pina.adaptive_functions import AdaptiveSin, AdaptiveCos, AdaptiveTanh\n", - "from pina import Condition, Span, PINN, LabelTensor, Plotter" - ] - }, - { - "cell_type": "markdown", - "id": "f661caca", - "metadata": {}, - "source": [ - "Now, the Poisson problem is written in PINA code as a class. The equations are written as *conditions* that should be satisfied in the corresponding domains. *truth_solution*\n", - "is the exact solution which will be compared with the predicted one." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "71fb35b3", - "metadata": {}, - "outputs": [], - "source": [ - "class Poisson(SpatialProblem):\n", - " output_variables = ['u']\n", - " spatial_domain = Span({'x': [0, 1], 'y': [0, 1]})\n", - "\n", - " def laplace_equation(input_, output_):\n", - " force_term = (torch.sin(input_.extract(['x'])*torch.pi) *\n", - " torch.sin(input_.extract(['y'])*torch.pi))\n", - " nabla_u = nabla(output_, input_, components=['u'], d=['x', 'y'])\n", - " return nabla_u - force_term\n", - "\n", - " def nil_dirichlet(input_, output_):\n", - " value = 0.0\n", - " return output_.extract(['u']) - value\n", - "\n", - " conditions = {\n", - " 'gamma1': Condition(Span({'x': [0, 1], 'y': 1}), nil_dirichlet),\n", - " 'gamma2': Condition(Span({'x': [0, 1], 'y': 0}), nil_dirichlet),\n", - " 'gamma3': Condition(Span({'x': 1, 'y': [0, 1]}), nil_dirichlet),\n", - " 'gamma4': Condition(Span({'x': 0, 'y': [0, 1]}), nil_dirichlet),\n", - " 'D': Condition(Span({'x': [0, 1], 'y': [0, 1]}), laplace_equation),\n", - " }\n", - "\n", - " def poisson_sol(self, pts):\n", - " return -(\n", - " torch.sin(pts.extract(['x'])*torch.pi)*\n", - " torch.sin(pts.extract(['y'])*torch.pi)\n", - " )/(2*torch.pi**2)\n", - " #return -(np.sin(x*np.pi)*np.sin(y*np.pi))/(2*np.pi**2)\n", - "\n", - " truth_solution = poisson_sol" - ] - }, - { - "cell_type": "markdown", - "id": "1a959d3e", - "metadata": {}, - "source": [ - "### The problem solution " - ] - }, - { - "cell_type": "markdown", - "id": "42de9096", - "metadata": {}, - "source": [ - "Then, a feed-forward neural network is defined, through the class *FeedForward*. A 2-D grid is instantiated inside the square domain and on the boundaries. This neural network takes as input the coordinates of the points which compose the grid and gives as output the solution of the Poisson problem. The residual of the equations are evaluated at each point of the grid and the loss minimized by the neural network is the sum of the residuals.\n", - "In this tutorial, the neural network is composed by two hidden layers of 10 neurons each, and it is trained for 5000 epochs with a learning rate of 0.003. These parameters can be modified as desired.\n", - "The output of the cell below is the final loss of the training phase of the PINN." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "11b3dd75", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2.384537034558816e-05" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "poisson_problem = Poisson()\n", - "\n", - "model = FeedForward(layers=[10, 10],\n", - " output_variables=poisson_problem.output_variables,\n", - " input_variables=poisson_problem.input_variables)\n", - "\n", - "pinn = PINN(poisson_problem, model, lr=0.003, regularizer=1e-8)\n", - "pinn.span_pts(20, 'grid', ['D'])\n", - "pinn.span_pts(20, 'grid', ['gamma1', 'gamma2', 'gamma3', 'gamma4'])\n", - "pinn.train(5000, 100)" - ] - }, - { - "cell_type": "markdown", - "id": "b320fbd5", - "metadata": {}, - "source": [ - "The loss trend is saved in a dedicated txt file located in *tutorial1_files*." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "c249817b", - "metadata": {}, - "outputs": [], - "source": [ - "os.mkdir('tutorial1_files')\n", - "with open('tutorial1_files/poisson_history.txt', 'w') as file_:\n", - " for i, losses in enumerate(pinn.history):\n", - " file_.write('{} {}\\n'.format(i, sum(losses)))\n", - "pinn.save_state('tutorial1_files/pina.poisson')" - ] - }, - { - "cell_type": "markdown", - "id": "7803e6ed", - "metadata": {}, - "source": [ - "Now the *Plotter* class is used to plot the results.\n", - "The solution predicted by the neural network is plotted on the left, the exact one is represented at the center and on the right the error between the exact and the predicted solutions is showed. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "0900748a", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plotter = Plotter()\n", - "plotter.plot(pinn)" - ] - }, - { - "cell_type": "markdown", - "id": "7e6fe021", - "metadata": {}, - "source": [ - "### The problem solution with extra-features" - ] - }, - { - "cell_type": "markdown", - "id": "f39c0033", - "metadata": {}, - "source": [ - "Now, the same problem is solved in a different way.\n", - "A new neural network is now defined, with an additional input variable, named extra-feature, which coincides with the forcing term in the Laplace equation. \n", - "The set of input variables to the neural network is:\n", - "\n", - "\\begin{equation}\n", - "[\\mathbf{x}, \\mathbf{y}, \\mathbf{k}(\\mathbf{x}, \\mathbf{y})], \\text{ with } \\mathbf{k}(\\mathbf{x}, \\mathbf{y})=\\sin{(\\pi \\mathbf{x})}\\sin{(\\pi \\mathbf{y})},\n", - "\\end{equation}\n", - "\n", - "where $\\mathbf{x}$ and $\\mathbf{y}$ are the coordinates of the points of the grid and $\\mathbf{k}(\\mathbf{x}, \\mathbf{y})$ is the forcing term evaluated at the grid points. \n", - "\n", - "This forcing term is initialized in the class *myFeature*, the output of the cell below is also in this case the final loss of PINN." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "80a4a3b8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7.93498870023341e-07" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class myFeature(torch.nn.Module):\n", - " \"\"\"\n", - " Feature: sin(x)\n", - " \"\"\"\n", - "\n", - " def __init__(self):\n", - " super(myFeature, self).__init__()\n", - "\n", - " def forward(self, x):\n", - " t = (torch.sin(x.extract(['x'])*torch.pi) *\n", - " torch.sin(x.extract(['y'])*torch.pi))\n", - " return LabelTensor(t, ['sin(x)sin(y)'])\n", - " \n", - "feat = [myFeature()]# if args.features else []\n", - "\n", - "poisson_problem = Poisson()\n", - "model_feat = FeedForward(\n", - " layers=[20, 20],\n", - " output_variables=poisson_problem.output_variables,\n", - " input_variables=poisson_problem.input_variables,\n", - " func=Softplus,\n", - " extra_features=feat\n", - " )\n", - "\n", - "pinn_feat = PINN(\n", - " poisson_problem,\n", - " model_feat,\n", - " lr=0.03,\n", - " error_norm='mse',\n", - " regularizer=1e-8)\n", - "\n", - "pinn_feat.span_pts(20, 'grid', locations=['gamma1', 'gamma2', 'gamma3', 'gamma4'])\n", - "pinn_feat.span_pts(20, 'grid', locations=['D'])\n", - "pinn_feat.train(5000, 100)\n", - "pinn_feat.save_state('pina.poisson')" - ] - }, - { - "cell_type": "markdown", - "id": "df8b409b", - "metadata": {}, - "source": [ - "The losses are saved in a txt file as for the basic Poisson case." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "18888f16", - "metadata": {}, - "outputs": [], - "source": [ - "with open('tutorial1_files/poisson_history_feat.txt', 'w') as file_:\n", - " for i, losses in enumerate(pinn_feat.history):\n", - " file_.write('{} {}\\n'.format(i, sum(losses)))\n", - "pinn_feat.save_state('tutorial1_files/pina.poisson_feat')" - ] - }, - { - "cell_type": "markdown", - "id": "568b88a1", - "metadata": {}, - "source": [ - "The predicted and exact solutions and the error between them are represented below." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "9826e8e1", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA74AAAD8CAYAAABQBnj7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABOMUlEQVR4nO3dffRkVX3n+/fHhm4eRGgEoWkgTaRFG0JYiuh4E8MAjcBNbJLoDOpSzJhLGGWSmxlXbC+ZjFmJMx2dGRNHkSEMCpqEcE0cOrEFob2GTJQRNMhz2y0yTUOnsZHhQQMtzff+UaeguqiH86s6D/uc83mtVev3q6pzTu1TP3pTn/rus7ciAjMzMzMzM7O2elHdDTAzMzMzMzMrk4OvmZmZmZmZtZqDr5mZmZmZmbWag6+ZmZmZmZm1moOvmZmZmZmZtZqDr5mZmZmZmbXa1OAr6QpJD0u6c8zzkvRxSVsk3S7p1cU308xSJeksSZuyPmDtiOfH9hHj9pV0kqSbJd0m6VZJp1RwHu7rzGyskvq6gyXdIGlz9nNpRefi/s7MRqqjr5N0tKQnJb1/4LGvZse6Lbu9bN5zy1Px/Qxw1oTnzwZWZrcLgE/N2ygzawZJi4BP0usHVgFvk7RqaLORfcSUfT8C/G5EnAT8Tna/bJ/BfZ2ZjVBiX7cW2BgRK4GN2f0qfAb3d2Y2pMa+7mPAl0Y06R0RcVJ2e3je85safCPiJuAHEzZZA1wVPTcDB0laNm/DzKwRTgG2RMR9EbELuJpenzBoXB8xad8AXpL9fiDwUNkn4r7OzCYoq69bA1yZ/X4lcG7J5wG4vzOzsSrv6ySdC9wH3FXOKT1vrwKOsRx4YOD+tuyx7cMbSrqA3jcD7LefXnPMy4t4eeu6R3fvV3cTavPQ3Y/tjIhDF7LPz566Tzz6g2dzbXvXHT++C3hq4KHLIuKygfuj/v2/bugw4/qISfv+38D1kv4jvS/o3pCrweWaqa/b132d2dzuvuPHC+7rAP6PU/eJ/52jv7u7vr7usIjYDhAR24sYyleQXP3dYF+3SHu/Zv+9Kxmp3Wq791tcdxNeYPe+1b7es/tEqcc/YMlT0zdaoEP3fqKQ49x7x66Z+rp/8nP7xv9+dHpfd+8du5Lq6yTtD3wAWA28nxf6tKTdwF8Avx8Rc/3HUcSnMY14bGSjsjf2MoATTlwcf/HFQwp4+fR9/nFfGmPl+O0Tvvi/FrrPoz94lrz/9l559PanIuLkCZvk+fc/bptJ+/5L4Dcj4i8k/TPgvwFnTGtvyWbq644/cXH86V8fVma7zFrvpJ/YtuC+DuB//+BZ8vz7O+knttXV16UqV5sH+7oDlxwWb1j29rLb1VpPvGZ53U0Y6ZFViyp/zadeWXwwHfTGlVsKP+Z7D/tKIcd5/Yr7Z+vrHn2Wz/zVEXmOn1pf97vAxyLiSekFu78jIh6UdAC94PtO4Kopx5uoiOC7DThq4P6RVDAscRqHTbNK5Pn3P26bxRP2PR/4jez3/xe4vKD2ziPJvs7MKlFWX7dD0rKsArIMmPsatoK4v6uQQ+/zyg69NlXVfd3rgLdI+ghwEPCspKci4hMR8SBARDwh6U/pDaWuPfiuBy6SdDW9xj/WL2WXxaHWLBm3ACslHQM8CJwHDH/lP7KPkPT9Cfs+BPwc8FXgNGBz2SeSQ+V9nZklo6y+bj29L/rWZT+vLf1M8nF/V4FUAy/UE3otCZX2dRHxs/2DSvoQ8GREfELSXsBBEbFT0t7AzwM3zntyU4OvpD8DTgUOkbQN+HfA3lljLwU2AOcAW4AfAb8yb6OGOeiapSkinpF0EXA9sAi4IiLuknRh9vzYPmLcvtmh/y/gj7KO7ymya8jKlEJfZ2ZpKrGvWwdcI+k9wFbgrVWcj/u7eqUceK3bEurrltCb62Xv7Fg3An887/lNDb4R8bYpzwfwvnkbMooDr1n6ImIDvU5w8LFLB34f20eM2jd7/H8Arym2pZPV2deZWfpK6useAU4vtqXTub+rTxNCb13V3iqGOZdxfW/b1NXXRcSHBn7/ISV8DkxyqlEHXjMzMzNriyYEXvAQZ2u35IKvQ6+ZmZmZtUFTAq9ZFyQVfB16zczMzKzpmhh466z2ejZnq0JSwdfMzMzMrImaGHb7PMTZuiCZ4Otqr5mZmZk1TZMDLzj0WnckE3zNzMzMzJqg6WG3L4XQ62HOVpUkgq+rveW44R9eWXcTXmD14ffW3QQza6jPPvqGupuwYO9c+rW6m2BmBWpL4IU0Qm9bXLLjNN572FfqboZNkUTwtclSDLCzmuVcHJbN2qmJQXahFnqODspmaWlT0E2Rq71WJQffmrUp1JYlz3vkcGyWni4E26JNes8cis3K15Wg28Vq7xtXbqm7CVYzB9+KOOCWa9z760BsVg2H3PKNe48diM1m15WgO6iLodcMEgi+bby+1yE3HcN/Cwdhs/k55KZl1N/DYdiqtnu/xS8IkQd888GaWvNCXQy4o6QUej3M2apWe/BtAwfd5nAQNls4B93mGf6bOQhbHYoIm4Ph2eF1PimFXrM6OPjOyGG3HRyEzUZz2G2Xwb+nQ7A1icNuMRx6zRx8F8Rht/36f2MHYOsih91ucAg265YUQ6+HOVsdHHyncNjtpsG/u0OwtZ0Db3f1//YOwGbtlGLoNauLg+8YDrzW5yqwtZUDr/U5AJu1j0Ov2Z4cfIc48No4DsDWFg68No4DsFk7pBx6PczZ6uLgm+li4L1/26GFHGfFkd8v5DhNccM/vNLh1xqpK4H3y1uPK/01zjx6U+mvUScHYLPmSjn0mtXJwZf2hN6igmzZr9uGoOzq7/MknQX8EbAIuDwi1g09r+z5c4AfAe+OiG9N2lfSwcCfAyuA+4F/FhGPVnE+bdWG0FtFoM0rb1uaHpA/++gbHH7NGsSh12y8TgffJgbeusJtkSadQ9NCcderv5IWAZ8EVgPbgFskrY+Iuwc2OxtYmd1eB3wKeN2UfdcCGyNinaS12f0PVHVebdK0wJtSuC3CuPNpUiB29desGZoQets8zPmSHafx3sO+UnczbIJag+/nH391ba/dhNDbhpC7UKPOOfUw3PHq7ynAloi4D0DS1cAaYDD4rgGuiogAbpZ0kKRl9Kq54/ZdA5ya7X8l8FUcfBesCaG3bUE3r1HnnXoYdvXXLE1NCLxmKehkxTfV0NvFoJvH8PuSahDuaPV3OfDAwP1t9Kq607ZZPmXfwyJiO0BEbJf0siIb3QUpht6uhty8ht+fFIOww69ZWhx6zfLrVPBNLfA66M4m5SDchPD76O79FjDa4ouHSLp14IHLIuKygfsasVMM3R+3TZ59bQYphV6H3dmlGoQdfveUd06Chc5pIGlv4HLg1fQ+r10VEf+h5NOxBmla6G3zMGdrhs4E31RCr8Nu8Qbf0xRCcBPC7wLsjIiTJzy/DThq4P6RwEM5t1k8Yd8dkpZl1d5lwMOzNL6LUgi9DrvlGHxf6w7BDr97mDonwYxzGrwVWBIRPyVpP+BuSX8WEfdXdmaWpKYFXrNUvKjuBlSh7tB7/7ZDn7tZuVJ5n+v+b65CtwArJR0jaTFwHrB+aJv1wLvU83rgsWwY86R91wPnZ7+fD1xb9om0QZ2h98tbj3vuZuVL4b1O4UuWRKyhNxcB2c9zR2zz3HwIEbEL6M9pMGn/APaXtBewL7ALeLzoxluzOPSaza4zFd86pBDAuiq1KnBbRcQzki4Crqc3fO+KiLhL0oXZ85cCG+gtZbSF3nJGvzJp3+zQ64BrJL0H2Eqv8mET1BVC6g5fXVd3FbhFld9pl3VMkmdOglnmNPg8vVC8HdgP+M2I+EHONlnLND3wepizpaD1wbeOypsDb1r6f4+qA3DLhjyPFREb6IXbwccuHfg9gPfl3Td7/BHg9GJb2l51hF4H3vT0/yZ1D4NOySO7X5zz38c1Ey/rkHQjcPiIpy7O2ZRZ5jQ4BdgNHAEsBf5W0o39mfCtO5oeelPwxpVbKnkdL2mUtlYPda469KYyzNZGq+Pv06Ehz1aTqkNvCkNsbbKq/0ZdGPIcEWdExAkjbteSzUkAMGFOgknzIYzb/+3AdRHx44h4GPg7YNKcC9Yyj6xa1IrQ62pvs0g6S9ImSVuyeQeGn5ekj2fP3y7p1dP2lXSwpBskbc5+Ls0eP0XSbdnt25J+cWCf10i6IzvWxyWN+gJxQVobfKsMHA68zVL138vh19rAgbd5HH4rk2dOglnmNNgKnJZ9yNwfeD2Q7DCi3fvW3YL2aEvgTclNm4+tuwmNMDAR39nAKuBtklYNbXY2sDK7XQB8Kse+/Un8VgIbs/sAdwInR8RJwFnAf83mNSA77gUDr3XWvOfX+qHOZWp62F2ydfHcx3j66F0FtKQe92871Nf/WqNVFTaaGnif/N6BhR/zxcc8Vvgxy1Tl8OcWXe+7UCPnJJB0BL1li86ZcU6DTwKfpvfBUMCnI+L2qk5qFsNh7aV3766pJc3ksGsJeG4iPgBJ/Yn47h7YZg295dUCuFnSQdlolRUT9l0DnJrtfyXwVeADEfGjgePuQ3YJSHa8l0TE17P7V9Gb+O9L85xcK4NvFRW21ENvEaG2qNdJORxXdf1vV673tXZJPfCWEWznfc1Ug/GXtx7na39LMm5Ogoh4iN7Efv37C5rTICKepOET+zkI59PmwOthzo0zaSK+Sdssn7Lv2EkAJb0OuAL4CeCd2ReFy7P9h19jLq0LvmWH3hQDb1Uhd1aj2pdaGHb115qm7GpvaqG3jpA7i1HtTCUMV1H97XDV13JwEH5em8OuVe/7Pz6AS3aclmPLK6bNYJ9nIr5x28wyiR8R8T+B4yW9CrhS0pdmPdY0rQu+ZUol9KYedPNIMQyXHX5d9bWidCH0NiXo5jF8LnUHYVd/LRWjwl/bw7ADb/slPrPzxBnsmTwR37RtFk/Yd4ekZVm1d+QkgBFxj6QfAidkr3HklHYsWKuCb5nV3jpDbxuCbh6D51lXCK5r6SOzFNQdeNsUdicZPM+6QnCZ4ddVX5tH28Jwl4Ouhzk30nMT8QEP0puI7+1D26wHLsqu4X0d8FgWaL8/Yd/+JH7rGJjEL9v2gWx4808AxwH3R8ROSU9Iej3wP4F3Af9l3pNrVfAtSx2htythd5y6Q3BZ1V9XfS1VdYXeroTdceoMwa78WlNMCo+pheIuB11rvnET8Um6MHv+UnpzFZwDbAF+BPzKpH2zQ4+bxO9ngLWSfgw8C7w3InZmz/1L4DPAvvQmtZprYivIGXwlnQX8UXYSl0fEuqHnDwQ+BxydHfM/RsSn523cQpRV7a069HY98I7Sf0+qDsC+7rd7mtDXlTHMuerQ2/WwO07/fakyAJcVfl31TVsT+rq8pgXNMoKxw6212aiJ+LLA2/89gPfl3Td7fNwkfp8FPjvmWLfSG/ZcmKnBd2BNptX0xlvfIml9RAxOa/0+4O6I+AVJhwKbJP1JRKQ1g9ECVRl6HXinq6MKXEb4ddU3TV3t66oMvQ68+VRdBXblt1u61tc5pNaj68OcE7/Ot7NelGOb59Zzyjq8/ppMgwI4QJKAFwM/AJ4ptKUTlFHtrSL0Ltm6+LmbLUyV71sqk5pZ6ZLv64qu9lYVep/83oEOvTOq6r2r+/puq1TyfZ2ZWRnyBN9xazUN+gTwKnqzbd0B/EZEPDt8IEkXSLpV0q2P/uAFTyejqtBr8/MXB1agzvV1ZXPgLU4V72XR4bfs2cdtZqX0dc/88IdltdfMrBB5gm+edZTeBNwGHAGcBHxC0ktesFPEZRFxckScvPTgPC9dvbJDr4NaOcp+T4v+76Ls9aZtJp3q68qs8Dnwlqdp4deSVEpft9f++xfdTmuorg9ztnTl+USWZz2nXwH+Mnq2AN8DKvlkX2SAKDP0OvCWr+z32EOeWy/pvq7I6lnZodfKVfYXCw6/rZd0X2fWFpfsOK3uJtiQPMH3ufWcJC2mtybT+qFttpLN1CXpMHprMN1XZEPLVnboteo4/NqMOtHXlRVqXOWtXhPebw93TlIn+jozs2FTZ3XOuZ7T7wGfkXQHvSE0HxhYg6mzmhR4D7h/eJTTeE+sGDVKKi11LYG0EJ7dOS3u62bXhAB2wHdnG3L+xMvTvka7rCWQPNNze7mvszJ5mLOlLNc6vjnWc3oIOLPYpk1X1DDnMqp4qYXehQTbeY+VUjBesnVx4eHX6/u2V6p9XVFVszKqvSmF3lnD7azHTCkUP/m9Ax1+LbdU+zqztvGyRmnJFXzbrK2ht8igW8Rr1xmGHX7N2hl6ywi6875+nWG4jPBbhM8++gbeufRrdTfDzDrups3H8saVW+puhtWo88G3aHWF3jqDbh6D7asjBJcRfs26qs7AW3fYnWawfXWE4KLDr6u+ZpaXhzlb6tL+BDFBEcOci672Vh16D7g/nrs1SV3tLvrvU8R/P21e1kjSwZJukLQ5+7l0zHZnSdokaYuktdP2l7S3pCsl3SHpHkkfrOqc6lDEMOciq711hN4Dvvui525NUle7i/4beZZnMzNrg2Z9ikhYlaG3iWF3nKrPJYVh6B2yFtgYESuBjdn9PUhaBHwSOBtYBbxN0qop+78VWBIRPwW8Bvg1SSvKPBHrqTL0NjXsjlP1+dQ9DN3MusXV3vG8rFE62vGJYgZFVnurCFNNre7mVeX5Ffn38vJGE60Brsx+vxI4d8Q2pwBbIuK+iNgFXJ3tN2n/APaXtBewL7ALeLzoxrdFUdW6qoJUm8LuOFWdY5F/s3n/O/KyRmZmVjdf4zunskNvW4PuJP1zLvNa4C5f8/v4M/ssYIj1Fw+RdOvAA5dFxGU5dz4sIrYDRMR2SS8bsc1y4IGB+9uA103Z//P0QvF2YD/gNyPiBznbZIlqe9gdpX/OZV4LnOqEV2ZmXeLZndNQ2yeNR3fvV9dLF1alKzP0trm6m1fZ51/U32/e/54Sv853Z0ScPHDbI/RKulHSnSNua8YdcMiobzem/eFPAXYDRwDHAP9G0k/mfL1OaUK1twsV3mnKPv+i/n6+1tcmeXaf4KlXPuUhrx3kv7k1RSM/baQQFMoOvdZT9hcAvuZ3PhFxRkScMOJ2LbBD0jKA7OfDIw6xDThq4P6RwEPZ7+P2fztwXUT8OCIeBv4OOLn4s6tfCsNDyw691lP2FwC+5teq5ABsqbpp87F1N8Fq1LlPHUVUe8sKS67yjlfme1PE39PX+o60Hjg/+/184NoR29wCrJR0jKTFwHnZfpP23wqcpp79gdcD95bQ/kYrojpXVlhylXe8Nr83KXyRY9VyADZ7nie5ql87/+/aQA68+fh9apR1wGpJm4HV2X0kHSFpA0BEPANcBFwP3ANcExF3Tdqf3izQLwbupBecPx0Rt1dzSt1RZui16cp4n4r4m3q48wsVsHTbWyXdJelZSScP7XOipK9nz98haZ+yz6cMDsDt5b+rNUmnJrdKtdrrMLcwB9wfhU981eXJrsoSEY8Ap494/CHgnIH7G4ANC9j/SXpLGtkYKYYTB96FO+C7Lyp84itPdlWK/tJr67JAuxb4wOAGA0u3raZ3icctktZHxN30vsT7JeC/Du2zF/A54J0R8W1JLwV+XPrZlGgwJO1zbyMzvNlcPMlVvfxJZAGKDr0e2jy7Mt63ef++Hu5sbVF0tdehd3YpVn5T/GKlZnMt3RYR90TEphH7nAncHhHfzrZ7JCJ2F934urgKbGZVa9ynkRQmtiqCA+/82vTFQVv+u7bitOV6SIfe+bX5ut+EHCLp1oHbBQvYd4+l14C8S7ctn3LcVwAh6XpJ35L0WwtoU2M4AFvV6p7gytf61qczQ53nrcYVWe1tS1hLRZFDn+cd8nz/tkNZceT3C2mL2SzmrcYVWe11WCtWkUOfuzLk+fFd++T9N7EzIsbODi/pRuDwEU9dnLMpsyzdthfwM8BrgR8BGyV9MyI25nzNRumHXw+Bbg5/YWFN05ngO482h94D73t65n0f+8klBbZkPmVc92vWNW0OvUs3zf6F1qPHpbPsWRnX/c7iy1uP48yjR43Oneyzj76Bdy79WgktKldEnDHuOUk7JC2LiO0zLt02zjbgbyJiZ/Y6G4BXA60Mvn0OwGZWFgffCtUdeucJuXmOV3cQLir8eqIrs/nUHXrnCbl5j1dnGC4q/Hal6luB/tJr68ixdBvwIL2l294+5bjXA78laT9gF/BzwMeKanTqPBGWlemmzcfyxpVbant9T3JVj04E33mGORdV7a0r9BYddhfyWnUHYbOumWeYc1HV3rpCb9FhdyGvl1JF2GqxDrhG0nvorTP+Vugt3QZcHhHnRMQzkvpLty0Crugv3SbpF4H/AhwKfFHSbRHxpoh4VNJ/pheaA9gQEV+s/OwS4CpwejzM2ZqoE8G3blWH3irD7iT9dlQZgFOo+vo6X+uqqkNv1WF3nH47qgzAKVR9Zx3u3DYFLN32BeALY479OXpLGhkOwNYurvpWL62LsKaoeubbMtbsLdOB9z2dTOgd1G9XVW2re0i5WdMUvXxR2ZZu2pVM6B3Ub1dVbat7SLlZXTwTtLWFZ3iulv+vWbIqQliqgXeUqtpaxPte9RcfXtLI+pq4lFEVISzVwDtKVW0t4n1v2hcfZn39AOwQXK22vN91L2tk1Wt98J31+t4iQk9VobeJmhJ+ZzXv8llmCzXvMkbzKDv0NinwDmtqu82axgHYmiq1qq+ksyRtkrRF0toRz0vSx7Pnb5f06mn7SjpY0g2SNmc/l2aPv1TS/yfpSUmfGHqdr2bHui27jVojfUFaH3zbqklV3nGacA5NG+5utlCpV/vaEBzLDu51Vn3r/MLFbBQHYLPZSVoEfBI4G1gFvE3SqqHNzgZWZrcLgE/l2HctsDEiVtJbkq0fip8C/i3w/jFNekdEnJTdRi0VtyAOviUps9qYelhcqDLPx9f7mpWrzGpvG0LvoNTDb1WaOJTfmscB2PJIZbhzQlXfU4AtEXFfROwCrgbWDG2zBrgqem4GDsrWMJ+07xrgyuz3K4FzASLihxHxP+gF4NJ5VucR5q3ylRW22hZ4Bx1439Ne/sisYvNWe8sKW20LvIOWbtrl5Y/MKuSZoIvlLxPK0wu/V8y07xNP75M3xB8i6daB+5dFxGUD95cDDwzc3wa8bugYo7ZZPmXfwyJiO0BEbF/AsOVPS9oN/AXw+xExV8hqzlfEM2jTdZZtDr19ZQ19nveLCA93ttS1abhpm0NvX1lDn+f9IiL1Ye9m83AF2MZJpepbkZ0RcfLA7bKh50etCTr8QXrcNnn2XYh3RMRPAT+b3d45x7GAlgffOpRR7e1C6B2UYvidRZu+eDEbVka1twuhd1DXztcsBQ7AZhNtA44auH8k8FDObSbtuyMbDk32c+r1uhHxYPbzCeBP6Q2lnouD75DUqntdC719XT1vs6qkVt3raggs+rzruNa3TSMOrDscgG1Qx6q+k9wCrJR0jKTFwHnA+qFt1gPvymZ3fj3wWDaMedK+64Hzs9/PB66d1AhJe0k6JPt9b+DngTvnPbnGBN8mrHFadFWx6+Gv6POf5++T2hciZnUqOlx1NfT2pRR+U/tCxKxsDsD5+X1qv4h4BrgIuB64B7gmIu6SdKGkC7PNNgD3AVuAPwbeO2nfbJ91wGpJm4HV2X0AJN0P/Gfg3ZK2ZTNBLwGul3Q7cBvwYPZac/HkVonqeujt86RXZu3W9dDb50mvzOrlSbDMeiJiA71wO/jYpQO/B/C+vPtmjz8CnD5mnxVjmvKafC3OrzEV34Wa5frKeap6RVZ7HXqtDcYtVj5iu3GLnb9V0l2SnpV08tA+J0r6evb8HZJa80kl9aVeiqz2OvSaWWr6FWBXN7vHw53br7XB19qjyC8CUh/u3IQh/QswbrHy50xZ7PxO4JeAm4b22Qv4HHBhRBwPnAr8uKRzSN4s11d6OGuaivwioEnr+pqlygHYrF38f8YCuNpbvqa+Lx2f2XnkYuVDxi52HhH3RMSmEfucCdweEd/OtnskInYX3Xh7IVd7y5fC++IvRsz25PDbHa76tpuv8U1IU8Nd0xxwf/DEilFLjXXDrl17LSSQT1vofJI8i5XnWSh92CuAkHQ9cChwdUR8JGebLAEphLsuOOC7L+KJlz9byWt9eetxnHn0qO+prCsOWPIUb1y5pbXBwdcAd8dNm4/ljSu31N0MK4GDb6buWXsdeqfzRFe12BkRJ497UtKNwOEjnro45/FnWex8L+BngNcCPwI2SvpmRGzM+ZpmSfNEV9ZkbQ6/0N0A7Kq3tUGucWvjJp8Z2uZUSbdlk838TbHNTFfRSxjZZP6CIC0RcUZEnDDidi35FivPs1D6qH3+JiJ2RsSP6M0e+Or5z6Ybfd2sw1iLGubsam8+bX+fUp/Ere3K7uu6UC3z9b/t1uYvb7ps6ieZKZPP9Lc5CLgEeHM22cxbi29qfk27rtJhrnqzfmFR98iAhsmzWHmehdKHXQ+cKGm/bKKrnwPunrexTezrmqbtYS5Fs35h4et826uqvu6NK7c4AJtZUvL8H3Hs5DMD3g78ZURsBYiIUZUds0L4i4LGGLlYuaQjJG2AyYudS/pFSduAfwJ8Mbuml4h4lN5C57fQW9T8WxHxxQLa677OkuIvCqwklfZ1XQi/4ADcRq76tk+ea3zzTD7zCmBvSV8FDgD+KCKuGj6QpAuACwAOXLbvLO0txaxVvCKGOacW4hbf88DY53a96qixz5kNG7dYeUQ8BJwzcH/cYudfAL4w5tifo7ekUZFK6euWLV9UcDOfN8tSRrMoYphzSiFu3zsfnPj8P56wvKKWmNWilL5u/8P3H/uCbb/ud1BXrwFuK0901S55gm+eyWf2Al5D70PuvsDXJd0cEd/ZY6febLCXASw//iBfHJuASUF32rZ1BuEiJrrq+uzO9gKl9HXHn7jYfV0CpoXdSdvWGYSLmOiqytmdrRFK6esOedUhE/u6LoVf6AVgh1+ztOT5Gj/P5DPbgOsi4ocRsRO4CfjpYprYXnVWexff88CCQm9Zx+iCpl1z3mGt7+u6eN3mvnc+uKDQW9YxzBJSW1/XtcqZhz+3Q5e+sGm7PME3z+Qz1wI/K2kvSfvRGzJzT7FNTUtTZ3MuI6zWFYDr+uLAE1y1lvu6ktQxzLmMsFpXAE5pmPgkVQ29T42kgyXdIGlz9nPpmO1GzqQs6aOS7pV0u6QvZBNLDe53tKQnJb2/oCbX2td1LfyCA3AbOPy2w9TgO27yGUkXSrow2+Ye4DrgduAbwOURcWdRjbzhH15Z1KE6rexw6uqvNVkKfV2KilrGqEplh9OuVH+7OEJgRmuBjRGxEtiY3d/DlJmUbwBOiIgTge8AHxza/WPAl4pqbAp9XVdmfB7m8GtWrzzX+I6cfCYiLh26/1Hgo8U1rd2qrFZWGUgX3/NAoybB8nW+Nsh9XfGqrFZWGUj3vfNBT4JlfWuAU7PfrwS+CnxgaJvnZlIGkNSfSfnuiPjywHY3A2/p35F0LnAf8MMiG5xKX9e1637Bk181mSe6ar7mfZVvC1JHFbbK10xtVmwzq0cdVdgqX3PeLxCaWLlvkMMiYjtA9vNlI7YZNZPyqG9O/gVZdVfS/vQC9O8W2trEdDVIuPrbTF37oqZtclV826zN12vWOfS4aZVfM2uuOoceu/Kbtt1PL8o7ZPsQSbcO3L8sm7EYAEk3AoeP2O/inE2ZOpOypIuBZ4A/yR76XeBjEfGk1O6RSV2s/IKrv03lym9ztS74VjGD7rwTW3WlSunwa9ZtTZmUaV4Ov62wMyJOHvdkRJwx7jlJOyQti4jtkpYBD4/YbOJMypLOB34eOD0i+h8yXge8RdJHgIOAZyU9FRGfyHtSTdLV8Ate+sisKh771FKpTDSVSjvMum6WiYqaMDw2lYmmUmmH1WI9cH72+/n0ZkQeNnYmZUln0RvS/OaI+FF/h4j42YhYERErgD8E/n1bQ29fl6toHvrcLF39kqbp0v9UYwvWtbDZlQq6me2pa2GzKxX0BloHrJa0GVid3UfSEZI2wPiZlLP9PwEcANwg6TZJlw6/QJc4/FpTOPw2T+uGOlt6Uh/y7JmdzawIHvLcTRHxCHD6iMcfAs4ZuP+CmZSzx6d+eo6ID83Xymbp+rBn8HW/TeHrfZvFFd+KlV2d7Fq1ty5tnhTNrAm6Vu0twixD172Wr9Wl62Eiteqvg/h4Xf2SpokcfK0SDuRm03320Tfk3vbLW48rsSXz6+qwXAdyMytKauHXxnP4bQYH3xZxuDSzLnC4NOuGrld9weG3SRx+0+fga63gCa7MLBVlBvOuVtKtuxx+HX6bxOE3bQ6+CzTvGr5d5oq0mZmZLZTDbxrh19f55uPwmy4H35ZwqDQzM7O2cvhNI/xaPg6/aXLwNTOzxvD1vWbd5fBbf/h11Tc/h9/0OPiaWSkkHSzpBkmbs59Lx2x3lqRNkrZIWjvw+Ecl3SvpdklfkHTQ0H5HS3pS0vtLPhUzMzOzBWti+B33uWzgeUn6ePb87ZJePW3fSZ8JJX0w236TpDcNPP4aSXdkz31ckuY9NwffCnkCJuuYtcDGiFgJbMzu70HSIuCTwNnAKuBtklZlT98AnBARJwLfAT44tPvHgC+V1HazubgybVYOV31d9W2aJoXfKZ/L+s4GVma3C4BP5dh35GfC7PnzgOOBs4BLsuOQHfeCgdc6a97zc/A1s7KsAa7Mfr8SOHfENqcAWyLivojYBVyd7UdEfDkinsm2uxk4sr+TpHOB+4C7Smm5mZkly+HX4bdpGhR+x34uG7AGuCp6bgYOkrRsyr7jPhOuAa6OiKcj4nvAFuCU7HgviYivR0QAVzH6c+SCOPia2SSHSLp14HbBAvY9LCK2A2Q/XzZim+XA4Mxs27LHhv0LsuqupP2BDwC/u4C2mJmZmdXmps3HphCAp32uy/O5bNw2k/Yd95lw0rG2TWnHgu017wHMrFm0SyzZujjv5jsj4uSxx5JuBA4f8dTFeZsz4rE91gyTdDHwDPAn2UO/C3wsIp4s4HIPMzNroDeu3JJCiKjVU698qtbK6z737lN75bmJbtp8bOGjFl70lPL+tzDxcx05PpdN2CbPvnlfb5ZjTeXga2Yzi4gzxj0naYekZRGxPRuy8vCIzbYBRw3cPxJ4aOAY5wM/D5yeDXUBeB3wFkkfAQ4CnpX0VER8Yr6zMSvOP54w9xfTZjaFw2/9HH5nU0b4LcjEz2VTtlk8Yd9xnwnHHWsbA5e4jWnHgnmoc4Ue+8kldTfBrErrgfOz388Hrh2xzS3ASknHSFpMb4KD9dCbGZDekOY3R8SP+jtExM9GxIqIWAH8IfDvHXrNzKyLUgidvt53Nol+aTP2c9mA9cC7stmdXw88lg1fnrTvuM+E64HzJC2RdAy9Say+kR3vCUmvz2ZzfhejP0cuiIOvmZVlHbBa0mZgdXYfSUdI2gCQTV51EXA9cA9wTUT0J6z6BHAAcIOk2yRdWvUJWHpcSTWzQYlWzTrH4Xc2iVz3+5xxn8skXSjpwmyzDfQmGN0C/DHw3kn7ZvuM/EyYPX8NcDdwHfC+iNid7fMvgcuz1/kuBazk4aHOLbHrVUex+J4Hpm9oVpGIeAQ4fcTjDwHnDNzfQK8THd5u6v8JIuJD87XSzMyazkOe09APvylUoZsmpaHPoz6XRcSlA78H8L68+2aPj/xMmD33YeDDIx6/FThhIW2fxhVfMzMzM7OGSi1ouvo7G395Uz4H3wV6YoVnkZ3VrlcdNX2jGfn6aTNLRZnDsR89LveM7Gadkkq1zHocfi1FDr4tUmawNDNLha/zNTNL3z737uMAbElx8LVKtC2UP330rrqbYC30zqVfy73tmUdvKrEl83Nl0syq5qpvmhx+LRUOvtZ5Hr5u1jypVn1TbdesXnzMY3U3wRri0L2fqLsJljBXfy0FDr4VK/ta1BQrqym2ycysaKmH3ide/mzdTbCWe+9hX6m7Ca76Js4B2Ork4NtCXQuantjKrJtSD5rWDZIOlnSDpM3Zz6VjtjtL0iZJWyStHXj89yTdnq1X/mVJR2SPr5b0TUl3ZD9Pq+qczMrmAGx1cPC1UnUthJulapYhq02oEKYSfqtoh6+bTtZaYGNErAQ2Zvf3IGkR8EngbGAV8DZJq7KnPxoRJ0bEScBfA7+TPb4T+IWI+CngfOCzpZ5FQVKo+lpzOABblRx8WyqFwJlCG8ysPl0JaqmEb6vNGuDK7PcrgXNHbHMKsCUi7ouIXcDV2X5ExOMD2+0PRPb430fEQ9njdwH7SPIQpxw83Ll5HICtCg6+M5h3MqSqhubWGTwdes2sKnUGT4deAw6LiO0A2c+XjdhmOfDAwP1t2WMASPqwpAeAd/B8xXfQLwN/HxFPF9bqErnqa7PqB2CHYCtD64LviiO/v6Dt274sTR0BtMrXnPdLBM/obNYOdQTQKl+zK9Xzoi16Gg747oum3oBDJN06cLtg8DiSbpR054jbmpxNGfU/m3jul4iLI+Io4E+Ai4Ze+3jgD4BfW8i5d52rvs3nAGxFa13wtReqMoi60mtmg6oMbFUG0aZVeptwvXbNdkbEyQO3ywafjIgzIuKEEbdrgR2SlgFkPx8ecfxtwOD/II8EHhqx3Z/Sq+6SHe9I4AvAuyLiu/OdYrVc9bWiOABbURx8a1L1TMS7XnVU6aG0K6G37aMEzAY1LTD94wnLSw+lTQu9Vrr19CafIvt57YhtbgFWSjpG0mLgvGw/JK0c2O7NwL3Z4wcBXwQ+GBF/V07TzZrDw6BtXrmC77gp+Eds91pJuyW9pbgmpqmpQ2TLCKdVhOpRmrKM0UKH31t93Ne1RxnhtIpQPUpdw5wXOhP4mUdvKqklyVsHrJa0GVid3UfSEZI2AETEM/SGMF8P3ANcExF39ffPhk3fDpwJ/Eb2+EXAscC/zZY6uk3SqOuHF6yqvq7uqq+HO7eXA7DNYq9pGwxMwb+a3lCdWyStj4i7R2z3B/Q6dcvhsZ9cwoH3VT9PRT+kLr7ngSlb5jtOUzX1ywsrh/u68jx63GKWbqp+pMRgSN33zgcLOY7ZsIh4BDh9xOMPAecM3N8AbBix3S8PP5Y9/vvA7xfX0h73de3T5QA4eO5PvfKpGltiTTA1+DIwBT+ApP4U/HcPbfevgL8AXltoC600w8E1TxBOJew2pdprjdL6vu7FxzzGk987sO5m1GKhITiVsFtEtbdpw9WtdJX2de897CtcsuO0eQ5hlotDsE2TJ/iOmoL/dYMbSFoO/CJwGhM6yGyWxAsADly2b+5Grj78Xm74h1fm3r5J6qr6jpJKqDWrSSl93bLliwpvaN+ZR2/iy1uPK+34fU+8/Nn+zLczq6vqO0oqodasJqX0dYeX2NeZLVQ/BDsA26A8n2QmTsGf+UPgAxGxe9KBIuKy/oyJ+y9NZ2mGWScr8lDZerjaayUppa9berDnELTZeAkjK0kpfd1BB6cZfH2db7d5QiwblOcTWZ4p+E8GrpZ0P/AW4BJJ5xbRwC5wkKverF9aeEbn/CQdLOkGSZuzn0vHbDdykhVJvyfp9mxCly9LOiJ7fLWkb0q6I/tZ1Bg693Ulc5Cr3qzDnBc6sZU1SuV9Xd2TXLWZA11+DsCWJ/iOnYK/LyKOiYgVEbEC+Dzw3oj470U31qztXxKsPvzeuptQpLXAxohYCWzM7u9hYJKVs4FVwNskrcqe/mhEnBgRJwF/DfxO9vhO4Bci4qfoLR3y2YLa675uAl8nWq22f0nwzqVfq7sJXea+zjrNVeDumhp8x03BL+lCSReW3cBZVLl8TFHDndse6Irg96hx1gBXZr9fCZw7YpvnJlmJiF1Af5IVIuLxge32JxuKFxF/n82WCnAXsI+kuf/jaGJfN4u6K3ltD3RmqetKX2eWhwNwt+SZ3GrkFPwRcemYbd89f7Oq9/TRu1iytd4PZClNdNVmVV6b3YI1fA+RdOvA/csi4rKc+x4WEdsBImL7mPUnJ06yIunDwLuAx4B/OmL/Xwb+PiIK+YfThb4uBSlNdJWior4cqLJK3+E1fBupjr6uztmd37hyCzdtPraW1y6TA1txPBlWN+QKvmZ1S6Ha25brexc9DQfcPzyPyVg7I+LkcU9KuhE4fMRTF+c8/sRJViLiYuBiSR+kV6H4dwOvfTy9NSbPzPlaNqciZne2yVKoiNc9KsDMrC5eEqnd/AmmAEVWEFMIeKkp8j3xTNzFiogzIuKEEbdrgR2SlgFkPx8ecYg8k6wA/Cm96i7Z8Y4EvgC8KyK+W9T5NFFTK20pBLzUFPme+Jpss3Zztbd8HgbdPg6+CXL4fZ7fi0ZbT2/yKbKf147YZuwkK5JWDmz3ZuDe7PGDgC8CH4yIvyun6fWpYtKfeSp6RQYqh1+zbvHsztZEngyrPRx8B8wzlLXoSqIDX/Fc7a3cOmC1pM3A6uw+ko6QtAHGT7LS31/SnZJupzec+Teyxy8CjgX+bbbU0W1jrh+2BnD47fH7YGaWPgfgZmvtNb4rjvw+9287tO5mzKXrk12lFP7bcn1vlSLiEeD0EY8/BJwzcP8Fk6xkj//y8GPZ478P/H5xLbWFKvpa365PdlV06J2nKu/re83S5+BVP0+G1Uyu+BaojIpiSuGvSkWfdx3V3hbM6GwtllrA6WrFsw3n3dTrzK0eHu5sbdK1YdCSDpZ0g6TN2c+lY7Y7S9ImSVskrc2zv6QPZttvkvSmgcc/LOkBSU8Ovca7JX1/YPTfr05rv4PvkBQre10Lv107X7MmKmPypDaEwIUo43w9qZXZaG9cuaXuJhSiKwGriToSgNcCGyNiJbAxu78HSYuATwJnA6uAt0laNWn/7PnzgOOBs4BLsuMA/BVwypj2/HlEnJTdLp/WeAffgpVVWexCGHzsJ5eUcp7z/k1S/DLEbFCbKm5dCb8pht7URgGYmTVRy6vAa4Ars9+vBM4dsc0pwJaIuC8idgFXZ/tN2n8NcHVEPB0R3wO2ZMchIm6OiO1FNL4xwXf14ffW3YTatTn8tvnc8vJ/41a1eYNOWdXFNoffR49b3OrzM7PytDRItVqCAfgQSbcO3C5Y4P6H9UNo9nPU5KLLgQcG7m/LHpu0/6R9JvllSbdL+ryko6Zt3NrJrWD2Ca6ePnoXS7bO/sHkiRXigPtj5v0naeOEV2WG3rqqvb6+12w+/XDYpkmvygy8TRriXMWSXZa29x72FS7ZcVrdzTCrzGD4LWNCrEX/CC+9e3eeTXdGxMmTNpB0I3D4iKcuztmcUR++pwWjWfb5K+DPIuJpSRfSqyBP7FhaHXzrVHb4BRofgMuu8nr5IrPyFT3D87C2zPicepV31up/m4bZm6UssaqhzaHsEDyviDhj3HOSdkhaFhHbJS0DHh6x2TZgsPp6JPBQ9vu4/SftM66djwzc/WPgDyZtDw0a6ly1JlzXWdY1sWVrarvNUjZrACnius6yq41NHh5cRdubVO01M7PnNfB64PXA+dnv5wPXjtjmFmClpGMkLaY3adX6KfuvB86TtETSMcBK4BuTGpIF5743A/dMa7yDb4mqqjg2KUhW1c4i3vsmfPlh7dTEoaBVhK8mBeCq2lrE++5JrczS1qBQZHNoyN95HbBa0mZgdXYfSUdI2gAQEc8AFwHX0wuj10TEXZP2z56/BrgbuA54X0Tszo79EUnbgP0kbZP0oexYvy7pLknfBn4dePe0xrd+qPOs1/kWpcwhz8NSHQJddSive4izr++1pnnxMY/x5PcOrLsZuaV8/W+VwdyVXrP2a0gYso7IhhefPuLxh4BzBu5vADbk3T977sPAh0c8/lvAb414/IPABxfQfFd8Jymq4ld1EEulAlxHO4p6r13tNVu4qoNYKhXgfjtSaMtCzVPt9fW9No/3HvaVuptgZh3T+opvKqqs/PYNhs6qqsB1Bu66K71mdTvz6E18eetxM+1bVNW37MmuRhkMnFVVgesOua72mrWfq71mxWpUxXfWdU7nGXpaZOWvzmDWr74O3lI85qyKfG/n+ZvP+t+a1/C1NqkzlA1WX4uswpZxzFkV9f762t5iSDpY0g2SNmc/l47Z7ixJmyRtkbR2xPPvlxSSDhl47IPZ9pskvanM8zAzaztXfCtWR+V3nBSGQxfBlV6zYhR5rW8dld9x6g6qRUql0jvrMOcmTtyWw1pgY0SsywLtWuADgxtIWgR8kt5kLtuAWyStj4i7s+ePyp7bOrDPKnqzoR4PHAHcKOkV/QlfrN1c7TUrXhqfShJX9PWeDmrFKfq99LW91nQpXXeZSkhriyLfT1d7C7UGuDL7/Urg3BHbnAJsiYj7ImIXcHW2X9/H6E3eMvjN+Brg6oh4OiK+B2zJjmMt59BrVo7OBN95Z9p1+E1PaqHXszlbkeqqjBUdiBx+i+H3cTaLngqWbto19QYcIunWgdsFC3iZwyJiO0D282UjtlkOPDBwf1v2GJLeDDwYEd/Ou4+ZmS2chzrXKKVhz03jLw7MylP08kYpDXtumjIC77xfbqQ0qqBAOyPi5HFPSroROHzEUxfnPP6o/2mFpP2yY5yZd5+cr9cI7z3sK1yy47S6m5EUV3vNyuPguwBPH72LJVuLvVbM4Xfhygi9HuJsbTLP7M5l6Qc4B+D8Ugy9XRURZ4x7TtIOScsiYrukZcDDIzbbBhw1cP9I4CHg5cAxwLcl9R//lqRTJuxjZmYz6NQnkCKGopYRkJ5YIVcwcyjrfSribzrPf1ue0dlSVFZA8pDdfPw+Ncp64Pzs9/OBa0dscwuwUtIxkhbTm7RqfUTcEREvi4gVEbGCXth9dUT8Q3bc8yQtkXQMsBL4RtknY/VxtdesXI0Lvm0OCQ6/45X13rjSWx4v8VGvIoajOvxW74mXP1va+1PE33Oe/65aOqMzwDpgtaTN9GZmXgcg6QhJGwAi4hngIuB64B7gmoi4a9JBs+evAe4GrgPe5xmd28uh16x8jQu+80q16tvn6u+emvB+eFKrsfpLfKwENmb39zCwxMfZwCrgbdkSHv3npy3xcRZwSXac1kkhKJQZfh2A91Tm++EhzuWJiEci4vSIWJn9/EH2+EMRcc7Adhsi4hUR8fKI+PCYY62IiJ0D9z+cbX9cRHyp/LMxM2uvzgXfopRdKWxC4CtTFefvam/pvMSHTeUAXP57UFTobemkVtYRN20+tu4mjOVqr1k1HHznUEVw6loArup8i/rbzVvtbcDQfS/x0WBFBZUqqoVdDMBVnLMrvWZmZj2NnNV59eH3csM/vHLm/Vcc+X3u33ZoIW0pY6bnUfphsK0zQFcZ7rte6V30dHDgfU/n3dxLfBhQ/BJH43Rh9ueqAn6RodfVXrNyuNprVp1GBt/UVBV+oX0BuOpqdpGh19f2eomPJihyaaOqwi+0LwBXXc1OrdKbwvXqZqlx6DWrVjs+Ucyg6NBSdRWxPyS4icOg62p71yu9NfASHwUoIjAUWa2rOlD1hwM3dRh0HW0v+m/kaq+ZmbVBpyu+RQ55hmorv4MGA2SKleAUwnnRobeIL04acH3vvNYB10h6D71Zmd8KvSU+gMsj4pyIeEZSf4mPRcAVeZb4kNRf4uMZvMRH5aqs/A4aDJCpVoLrDuipVXrNbDRXe82q19jgO+91vmWpK/z2jQqZVYfhFILuIFd66xERjwCnj3j8IWCPJT6ADVOOtWLo/oeBkcuB2GhFDnmG5wNWHQEYRgfMOsJw3UF3UBmht4hqr4c5m5lZChobfItSdNUX6g+/wyYF0VlDcWrhdpSyAq+v7bWqvXPp1/jso2+ouxkj1VX9HWVcCC0iEKcUcEdJNfSa2Qu52mtWj84HXygv/AJJBeBRmhBgZ5F66O3AMGdLUNFV376Uwu8oqYfWeXl4szXZew/7CpfsOK3uZphZB+T6GlzSWZI2Sdoiae2I598h6fbs9jVJP118U5vJw2yrl3rotXR1oa8rq4r34mMecwCrWJnvuau97daFvm7QTZuPrbsJz3G116w+U4OvpEXAJ4GzgVXA2yStGtrse8DPRcSJwO8BlxXd0FGKrJqVGWqePnqXA3AF/D7bPFLu64pWZqhx+K1Gme9zkf99+Pre9HSpr0uNQ69ZvfIMdT4F2BIR9wFIuhpYQ29GVQAiYvD/bDfTW1ezccoY8jyoKcOfm6aKsFvkFyMe5pyspPu6lK/zHVb3xFdtVvYXC670dkLSfZ1ZXi+9e/KCDo+sWlRRS6wp8gTf5cADA/e3Aa+bsP17gC+NekLSBcAFAAcu2zdnE6tVdviF9Ca/aqqqqrupDnF+y0u+xW/X3Yh2KaWvW7Y8zf/xlnW97yAH4OJUUUkvOvS62pusUvq6wxPt61Lham9+0wJtWcdxUG6/PMF31OxHI6cClvRP6XWQPzPq+Yi4jGy4zPLjDypkjZ0yljWqKvyCq7+zqHI4c6qh10pRSl93/ImLC1tPrOiqbxXhFxyA5+Gh41aCUvq6V524pNq1E63xigq4RZnUHofidsgTfLcBRw3cPxJ4aHgjSScClwNnZ+t3NloV4Rf2DHEOwZNVff1uGaHXw5yT1sm+rqrwCw7AC1F14PUQ507pZF9XJ1d7e1ILugsxru0OxM2SJ/jeAqyUdAzwIHAe8PbBDSQdDfwl8M6I+E7hrZyijKovVBd++1wFfqG6JqtypbeTku/rylJl+AUH4HHqqu6WEXo9zDlpne3rrFpNDrp5jTpHh+F0TQ2+EfGMpIuA64FFwBURcZekC7PnLwV+B3gpcIkkgGci4uTyml2dqsMvuApc98zMZYVeV3vT1pS+rqxJrqoOv7Bn0OtqCK5zKLOrvN3UlL6uLbpW7e1C2J2mzWFY0sHAnwMrgPuBfxYRj47Y7izgj+j1MZdHxLpp+0v6IL1LK3YDvx4R12ePXwcso5db/xZ4X0TslrQEuAp4DfAI8M8j4v5J7c9T8SUiNgAbhh67dOD3XwV+Nc+xylJW1RfqCb99wyGwrUG47rDb50pvtzWhrytTHeG3r0shOIXrdssMva72pq9LfV1Ka/i2mQPvZMPvT4OD8FpgY0Ssy9YAXwt8YHCDgSXTVtO7tOIWSesj4u5x+2dLqp0HHA8cAdwo6RURsZteOH5cvW/hPg+8FbiaXkh+NCKOlXQe8AfAP5/U+FzB1+oNv4PaEoRTCbp9ZQdeV3utSGUubdQPRHUFYHhhMGx6EE4h6A5ypdesGm2v9jrszq7BQXgNcGr2+5XAVxkKvkxeMm3c/muAqyPiaeB7krZkx/l6RDyebb8XsJjnJ+NbA3wo+/3zwCckKSLGTrTXquBbZtUXng9HKQTgvlEBMrUwnFrIHeYqr9kL1Vn9HTYqOKYahlMLucPKDr2u9pq1nwNv8Rr0nh4WEdsBImK7pJeN2GbSkmnj9l9Ob83wwX2W9+9Iup5eEP4SvZC7x+tkl3A8Ru8SjZ3jGt+q4FuVVKq/40wLmkUH49SD7ThVBV5Xe60MZVZ9+1IKv8MmBcyyQ3Hq4XYUV3nNqtXGam+DwlnnLPrRLg745oN5Nj1E0q0D9y/LliV7jqQbgcNH7HtxzubkXjIt7z4R8SZJ+wB/ApwG3DDL67Qu+JZd9e1LsfqbV1ODapEceq0Nqgq/UO/Q54VqYjAtU1Wh19Ves3Zy4G2VndMmqouIM8Y9J2mHpGVZtXYZ8PCIzSYtmTZu/6nLrEXEU5LW0xvifMPAPtsk7QUcCPxg0rm9aNKTTVVl2PAw2WZZceT3/Tczm8GZR29y1bBhqvybdTn0SjpY0g2SNmc/l47Z7ixJmyRtySZ1GX7+/ZJC0iHZ/b0lXSnpDkn3ZDOeWgO0pdr70rt3O/TasPXA+dnv5wPXjtjmuSXTJC2mN2nV+in7rwfOk7QkW2ptJfANSS/OAjJZuD0HuHfEsd4CfGXS9b3Q0uBbNYep9NXxN3K116pQdeBwAE6f/0aV689SuhLYmN3fw8Asp2cDq4C3ZbOY9p8/it4MqFsHdnsrsCQiforech2/JmlFWSdRl0t2nFbasT2j82wceG2CdcBqSZvp9Vn9ZYqOkLQBetfbAv0l0+4BromIuybtnz1/Db0JsK4jW7II2B9YL+l24Nv0KsT9Gej/G/DSbCKsf82IvndY64Y691U15HlQk4c/t1VdX0g49FqVqhjyPKyJQ6Dbrq6w2+Vqb2beWU4BPgb8FntWTwLYP6ty7AvsAh7Hktbkaq/Drk0TEY8Ap494/CF61dj+/RcsmTZp/+y5DwMfHnpsB/DaMds/Re8LwtxaG3yhnvALe4Yth+Dq1V19d+jtmXeR84Hn3w98FDg0InZK2hu4HHg1vT7sqoj4DyWeSiPUEX7BATgFdVZ3Uw+9L/rHH7PvncVM+DLBXLOcSnoz8GBEfLu3TOVzPk8vHG8H9gN+MyImXr9mNiuHXuuCVgdfqC/89rkKXJ26Ay849A6Zd5HzqcP/JO0H3C3pzyLi/tLPKHF1hV/YM3w5BJcvhaHMqYfeBZo44UtZs5xmfdjFwJkjnj8F2A0cASwF/lbSjf2qsaWnidVeB17rktYHX6g//IKrwGVJIez2OfS+gIf/1aDO8NvnEFyOFMJuX8tC71QlznL6cuAYoF/tPRL4lqRTgLcD10XEj4GHJf0dcDLg4GuFcOi1rulE8IU0wm/fcFhzEM4vpaA7yKF3JA//q0kK4bfPIXg+KYXdvq6F3hz6M4uuI8csp8CD9GY5fXs2octzfaOk+4GTs8s6tgKnSfocvb7u9cAflngeNocmVXsdeK2rOhN8Ia3wO8hBeLxUg+6gpoVePbWLxfc8MH3DnonXvXn4X7pSCr99wyHOQfiFUgy6gxx6R1oHXCPpPfQuy3gr9GY5pTdvwTkR8Yyk/iyni4ArBmY5HeeTwKeBO+n1lZ+OiNvLOom28YzOozn0Wpd1KvhCuuF30Kiw14Uw3ISQO6xpoXcGE6978/C/tKUYfgeNCnldCsOph9xhDr2jzTvL6dA+KwZ+f5IFzlhqNolDr3Vd54IvNCP8DpsUCpsUipsYbkfpQOAtgof/JSD18DtsXBhsciBuWsAd5sBrNlnqw5wdeM16Ohl84fng0rQAPEreMFlWQG5LmM3LoTc3D/9LRD+4NCkAD8sTHusIx00PtdM49Jo1m0Ov2fM6G3z72hSAp+laQC2aA+/CePhfeppW/V2otofQKjnwmuWTcrXXoddsT50Pvn1dCsC2MA681iZtqP5aeRx4rQ08sZVDr9koDr5DHICtz4HX2swB2AY58JotXKrVXodes9EcfMdwAO4mh13rmsHA4xDcPQ68Zu3i0Gs2noPvFINByCG4nRx2zXpcBe4Gh12zdnLoNZvMwXcBHILbo+lh9y0v+VbdTbAWGw5GDsLN57BrVqyUhjk78Jrl4+A7o+Hg5CCctqYHXbM6eTh08zjoWhNcsuO0wo/pia3MbBwH34KMClYOw/VwyDUrz6hA5TBcPwdds+q42mvWTA6+JXIYLpcDrlkaHIar44BrZn0OvWYL4+BbsWlhzcH4eQ62Zs01LaA5GI/ncGtm0zj0mi2cg29iZgl7TQjLDrFmNihvuGtLQHaYNWuHFIY5O/SazcbBtwUcKrvFMzpblzgwmlleXZjYyqF3ugO++eDcx3jiNcsLaImlxsHXzMzMzGyKuqu9Dr3FhNqiXsfhuHkcfM3MzMzMEtbF0FtVyJ3VqPY5DKfNwdesQTzM2czMrHp1Vnu7EHpTD7l5OQynzcHXzMzMzCxBbQ29bQm6eQyeq0NwvRx8zRrC1V4zM7PRujCxVdN1KeyOM/weOAhXy8HXrAEces3MrE0u2XFa3U3Ira5hzm2o9jrsTtZ/fxyAq+Hga5YwB14zM7PuaXLoddhdOL9n1XDwNUuMw66ZmVl3NTX0OrxZ6l6UZyNJZ0naJGmLpLUjnpekj2fP3y7p1cU31axd3vKSb428tYWkgyXdIGlz9nPpmO1G9i+SPiTpQUm3ZbdzBp47UdLXJd0l6Q5JhYxDc19nZgvlvq7dqh7m3MTQe8A3H3To7YgC+rux+0v6YLb9JklvGnHM9ZLuHLj/bknfH+g7f3Va+6dWfCUtAj4JrAa2AbdIWh8Rdw9sdjawMru9DvhU9tOsUdoUPBOwFtgYEeuyTm8t8IHBDXL0Lx+LiP84tM9ewOeAd0bEtyW9FPjxvI11X2dmM3JfVzNPbFU9B93Omre/G7m/pFXAecDxwBHAjZJeERG7s2P+EvDkiPb8eURclLfxeYY6nwJsiYj7she+GlgDDHaQa4CrIiKAmyUdJGlZRGzP25A2cGgy28Ma4NTs9yuBrzLUOZKvfxl2JnB7RHwbICIeKai97uvMbBbu61rK1d4XcuDtvHn7u3H7rwGujoinge9J2pId5+uSXgz8a+AC4Jp5Gp8n+C4HHhi4v40Xfus3apvlwB4dpKQL6DUa4OnfPuGLd5K+Q4CdeTb87ZIbMkXudtbM7SzWcQvd4fFnvn/9dTs+dUjOzfeRdOvA/csi4rKc+x7W/5AUEdslvWzENtP6l4skvQu4Ffg3EfEo8AogJF0PHEqvo/xIzjZNUlpfd9JPbGtVX1czt7NYTWnngvs6gMd//PD11z34X/L0d+7rpm8zta97/Yr7F9DXXZF/02I15b95t7NYTWnnbH3droevv+5//WHZfR3M39+N2385cPPQPv2prn8P+E/Aj0a81i9LeiPwHeA3I+KBEds8J0/w1YjHYoZtyN7YywAk3RoRJ+d4/Vq5ncVyO4s11HnlEhFnFfj6NwKHj3jq4ryHGPFYv+/4FL3OLni+0/sX9PqtnwFeS68T3CjpmxGxcQFNX2hbFrKN+7oSuZ3FalI7Z9mvqP7Ofd3IbdzXlcjtLFaT2jnLfg36bLegfSSdBBwbEb8pacXQ838F/FlEPC3pQnoV5InrpOUJvtuAowbuHwk8NMM2ZtYyEXHGuOck7egPjZO0DHh4xGZj+46I2DFwrD8G/npgn7+JiJ3ZcxuAVwPzfhh0X2dmI7mvc19n1hVl9nfAuP3H7fNPgNdIup9ebn2ZpK9GxKlDl3/8MfAH084tz6zOtwArJR0jaTG9C4/XD22zHniXel4PPNa160DM7AXWA+dnv58PXDtim7H9S9Yh9v0i0B9Cdz1woqT9sslffo7J18nl5b7OzGbhvs7MumKu/m7C/uuB8yQtkXQMvYn1vhERn4qIIyJiBb0RMN+JiFPhBX3nm4F7pjV+asU3Ip6RdBG9DngRcEVE3JWVlImIS4ENwDnAFnrDcX5l2nHJhsY0gNtZLLezWCm3cx1wjaT3AFuBtwJIOgK4PCLOGde/ZPt/JBviEsD9wK8BRMSjkv4zvY41gA0R8cV5G+u+zu0smNtZrJTb6b6uJ+W/0SC3s1huZ7FSb+e8/d3I/bM+6Bp6X+49A7yvP6PzBL8u6c3Z9j8A3j2t8epN2GdmZmZmZmbWTnmGOpuZmZmZmZk1loOvmZmZmZmZtVrpwVfSWZI2Sdoiae2I5yXp49nzt0t6ddltmrGd78jad7ukr0n66RTbObDdayXtlvSWKts38PpT2ynpVEm3SbpL0t9U3casDdP+7gdK+itJ387amec6p6LbeIWkhyWNXB8xlX9DXee+rtp2Dmznvi6HJvR1WTvc3yXOfV217RzYzn1dDu7rbKKIKO1G74Lm7wI/CSwGvg2sGtrmHOBL9NZvej3wP8ts0xztfAOwNPv97FTbObDdV+hNTvGWFNsJHETvAvajs/svS7Sd/w/wB9nvh9K7eH5xxe18I70lLO4c83zt/4a6fnNfV307B7ZzX1dMO2vv67LXdn+X8M19XfXtHNjOfV0x7XRf1+Fb2RXfU4AtEXFfROwCrgbWDG2zBrgqem4GDtKe01NXYWo7I+JrEfFodvdmeutLVS3P+wnwr4C/YPTaWlXI0863A38ZEVsBIqKOtuZpZwAHSBLwYnod5DNVNjIibsped5wU/g11nfu6YrmvK1Yj+jpwf9cA7uuK5b6uWO7rbKKyg+9y4IGB+9uyxxa6TdkW2ob30PsWpmpT2ylpOb11AC+tsF3D8ryfrwCWSvqqpG9KeldlrXtennZ+AngVvUW07wB+IyKeraZ5uaXwb6jr3NcVy31dsdrS10Ea/466zH1dsdzXFct9nU00dR3fOWnEY8PrJ+XZpmy52yDpn9LrIH+m1BaNlqedfwh8ICJ2977MqkWedu4FvAY4HdgX+LqkmyPiO2U3bkCedr4JuA04DXg5cIOkv42Ix0tu20Kk8G+o69zXFct9XbHa0tdBGv+Ousx9XbHc1xXLfZ1NVHbw3QYcNXD/SHrfsCx0m7LlaoOkE4HLgbMj4pGK2jYoTztPBq7OOsdDgHMkPRMR/72SFvbk/bvvjIgfAj+UdBPw00CVHWSedv4KsC4iAtgi6XvAK4FvVNPEXFL4N9R17uuK5b6uWG3p6yCNf0dd5r6uWO7riuW+ziYr8wJiesH6PuAYnr/I/Pihbf5P9rx4+xtltmmOdh4NbAHeUHX7FtLOoe0/Qz2TIOR5P18FbMy23Q+4EzghwXZ+CvhQ9vthwIPAITW8pysYPwFC7f+Gun5zX1d9O4e2d183fzuT6Ouy13d/l+jNfV317Rza3n3d/O10X9fhW6kV34h4RtJFwPX0Zlq7IiLuknRh9vyl9GaoO4de5/Mjet/EVCpnO38HeClwSfat2zMRcXKC7axdnnZGxD2SrgNuB54FLo+IkVO619lO4PeAz0i6g17n84GI2FllOyX9GXAqcIikbcC/A/YeaGPt/4a6zn1dLe2snfu64rm/S5v7ulraWTv3dcVzX1cPRXi4uJmZmZmZmbVX2bM6m5mZmZmZmdXKwdfMzMzMzMxazcHXzMzMzMzMWs3B18zMzMzMzFrNwdfMzMzMzMxazcHXzMzMzMzMWs3B18zMzMzMzFrt/we1weJY93GZHwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plotter_feat = Plotter()\n", - "plotter_feat.plot(pinn_feat)" - ] - }, - { - "cell_type": "markdown", - "id": "c5f03a63", - "metadata": {}, - "source": [ - "### The problem solution with learnable extra-features" - ] - }, - { - "cell_type": "markdown", - "id": "2d2f1bf1", - "metadata": {}, - "source": [ - "Another way to predict the solution is to add a parametric forcing term of the Laplace equation as an extra-feature. The parameters added in the expression of the extra-feature are learned during the training phase of the neural network. For example, considering two parameters, the parameteric extra-feature is written as:\n", - "\n", - "\\begin{equation}\n", - "\\mathbf{k}(\\mathbf{x}, \\mathbf{y}) = \\beta \\sin{(\\alpha \\mathbf{x})} \\sin{(\\alpha \\mathbf{y})}\n", - "\\end{equation}\n", - "\n", - "The new Poisson problem is defined in the dedicated class *ParametricPoisson*, where the domain is no more only spatial, but includes the parameters' space. In our case, the parameters' bounds are 0 and 30. " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "9ca67fc4", - "metadata": {}, - "outputs": [], - "source": [ - "from pina.problem import ParametricProblem\n", - "\n", - "class ParametricPoisson(SpatialProblem, ParametricProblem):\n", - " bounds_x = [0, 1]\n", - " bounds_y = [0, 1]\n", - " bounds_alpha = [0, 30]\n", - " bounds_beta = [0, 30]\n", - " spatial_variables = ['x', 'y']\n", - " parameters = ['alpha', 'beta']\n", - " output_variables = ['u']\n", - " spatial_domain = Span({'x': bounds_x, 'y': bounds_y})\n", - " parameter_domain = Span({'alpha': bounds_alpha, 'beta': bounds_beta})\n", - "\n", - " def laplace_equation(input_, output_):\n", - " force_term = (torch.sin(input_.extract(['x'])*torch.pi) *\n", - " torch.sin(input_.extract(['y'])*torch.pi))\n", - " nabla_u = nabla(output_, input_, components=['u'], d=['x', 'y'])\n", - " return nabla_u - force_term\n", - "\n", - " def nil_dirichlet(input_, output_):\n", - " value = 0.0\n", - " return output_.extract(['u']) - value\n", - "\n", - " conditions = {\n", - " 'gamma1': Condition(\n", - " Span({'x': bounds_x, 'y': bounds_y[1], 'alpha': bounds_alpha, 'beta': bounds_beta}),\n", - " nil_dirichlet),\n", - " 'gamma2': Condition(\n", - " Span({'x': bounds_x, 'y': bounds_y[0], 'alpha': bounds_alpha, 'beta': bounds_beta}),\n", - " nil_dirichlet),\n", - " 'gamma3': Condition(\n", - " Span({'x': bounds_x[1], 'y': bounds_y, 'alpha': bounds_alpha, 'beta': bounds_beta}),\n", - " nil_dirichlet),\n", - " 'gamma4': Condition(\n", - " Span({'x': bounds_x[0], 'y': bounds_y, 'alpha': bounds_alpha, 'beta': bounds_beta}),\n", - " nil_dirichlet),\n", - " 'D': Condition(\n", - " Span({'x': bounds_x, 'y': bounds_y, 'alpha': bounds_alpha, 'beta': bounds_beta}),\n", - " laplace_equation),\n", - " }\n", - "\n", - " def poisson_sol(self, pts):\n", - " return -(\n", - " torch.sin(pts.extract(['x'])*torch.pi)*\n", - " torch.sin(pts.extract(['y'])*torch.pi)\n", - " )/(2*torch.pi**2)\n" - ] - }, - { - "cell_type": "markdown", - "id": "63a847d5", - "metadata": {}, - "source": [ - "Here, as done for the other cases, the new parametric feature is defined and the neural network is re-initialized and trained, considering as two additional parameters $\\alpha$ and $\\beta$. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "afa18873", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.265163986679126e-06" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "param_poisson_problem = ParametricPoisson()\n", - "\n", - "\n", - "class myFeature(torch.nn.Module):\n", - " \"\"\"\n", - " \"\"\"\n", - " def __init__(self):\n", - " super(myFeature, self).__init__()\n", - "\n", - " def forward(self, x):\n", - " t = (x.extract(['beta'])*torch.sin(x.extract(['alpha'])*x.extract(['x'])*torch.pi)*\n", - " torch.sin(x.extract(['alpha'])*x.extract(['y'])*torch.pi))\n", - " return LabelTensor(t, ['b*sin(a*x)sin(a*y)'])\n", - "\n", - "feat = [myFeature()]\n", - "model_learn = FeedForward(layers=[10, 10],\n", - " output_variables=param_poisson_problem.output_variables,\n", - " input_variables=param_poisson_problem.input_variables,\n", - " extra_features=feat)\n", - "\n", - "pinn_learn = PINN(param_poisson_problem, model_learn, lr=0.003, regularizer=1e-8)\n", - "pinn_learn.span_pts(20, 'grid', ['D'])\n", - "pinn_learn.span_pts(20, 'grid', ['gamma1', 'gamma2', 'gamma3', 'gamma4'])\n", - "pinn_learn.train(5000, 100)" - ] - }, - { - "cell_type": "markdown", - "id": "e91e8be7", - "metadata": {}, - "source": [ - "The losses are saved as for the other two cases trained above." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "26581f50", - "metadata": {}, - "outputs": [], - "source": [ - "with open('tutorial1_files/poisson_history_learn_feat.txt', 'w') as file_:\n", - " for i, losses in enumerate(pinn_learn.history):\n", - " file_.write('{} {}\\n'.format(i, sum(losses)))\n", - "pinn_learn.save_state('tutorial1_files/pina.poisson_learn_feat')" - ] - }, - { - "cell_type": "markdown", - "id": "5e018d4d", - "metadata": {}, - "source": [ - "Here the plots for the prediction error (below on the right) shows that the prediction coming from the **parametric PINN** is more accurate than the one of the basic version of PINN." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "81c94c8f", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plotter_learn = Plotter()\n", - "plotter_learn.plot(pinn_learn)" - ] - }, - { - "cell_type": "markdown", - "id": "ed030a0f", - "metadata": {}, - "source": [ - "Now the files containing the loss trends for the three cases are read. The loss histories are compared; we can see that the loss decreases faster in the cases of PINN with extra-feature." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "55497e4e", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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zju1TqCRrkit0P2YlRlpuXa/NvmqN7DyATi1I+zHMT4v6Nv5U+43Gi55LKJdvV4vK1euZMGCBSE/f+CBB7jkkku45ZZbWnw2YMAAzj//fF5++WUWLlwY8vgLLriAv/zlL9x7771s2bIFt9uNx+Phk08+YebMmU32feyxx9i5cyfbtm3D4XCwdetWvvzyS3bt2kX//v2ZMWMGn376Keeff36T4+644w7+8Y9/MGTIED7//HPuvvtuPvroIxYtWsTVV1/NU089xapVq/j8888xmUw8/vjjrF27lpSUFEDJ9Z+fn89vfvMbAEaOHMnDDz8MwE033cTy5ctbtO8f//gHq1atCpTz4IMPMmfOHF566SWqqqqYMmUKF110USDFhMViYf/+/Vx//fVs2bKFxx57jD//+c8sX74cIOAqC0Vw/fbs2cMf/vAHPv30U4xGI3fffTevvPIK3/72t8Me31fopYIfB0C21adNvtLoMMG5dGbOnMmtt94acr+8vDymTJkS1v3w4IMPcvnll3PppZeG/HzixIls3boVh8OB2WxmwoQJbNmyhfXr1wcs/9aYMmUKWVlZAIwbN46ioqImgu90Ovnss8+45pprAtvUcYVRo0Zx0003sXDhQjZs2IDJZAp5Dr1e32TZxLVr1/LHP/6Ruro6KioqGDVqVNgOTWX16tW8++67gZW6XC4XR48epX///txzzz1s27YNvV7Pvn372mxza/Vbs2YNW7duZfLkyYDyPaalpbW7zN5IjxT8ziZPUy38LKuX9dWa4J/ztGGJ13dRfhXVhx8JDz74IFdffTUXXHBBi88GDx7MuHHjeP3110MeazQayc3N5V//+hfnnXceY8aMYe3atRw8eDCifEJmsznwv16vb+E+8vv9JCQkhG3Ljh07SEhI4PTp02HPYbFYAimoXS4Xd999N1u2bCE7O5tf/epXuFwujh07FhD9u+66i7vuuqtJGVJK3nzzTYYNG9Zk+69+9SvS09PZvn07fr8fiyX0okUGgwG//8yypS7XGXdtcP2klHznO9/R1gIIQe/04Tda+P0tHs2lo3FWGD58OCNHjgy4H5rz0EMPtboG7QUXXMCf//xnLrjgAmbOnMk//vEPxo0b12KWuN1ub3c++Li4OPLy8gI59qWUbN++HYC33nqL8vJy1q1bx7333ktVVVWb51GFNiUlBafTydKl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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import pandas as pd\n", - " \n", - "df = pd.read_csv(\"tutorial1_files/poisson_history.txt\", sep=\" \", header=None)\n", - "epochs = df[0]\n", - "poisson_data = epochs.to_numpy()*100\n", - "basic = df[1].to_numpy()\n", - "\n", - "df_feat = pd.read_csv(\"tutorial1_files/poisson_history_feat.txt\", sep=\" \", header=None)\n", - "feat = df_feat[1].to_numpy()\n", - "\n", - "df_learn = pd.read_csv(\"tutorial1_files/poisson_history_learn_feat.txt\", sep=\" \", header=None)\n", - "learn_feat = df_learn[1].to_numpy()\n", - "\n", - "import matplotlib.pyplot as plt\n", - "plt.semilogy(epochs, basic, label='Basic PINN')\n", - "plt.semilogy(epochs, feat, label='PINN with extra-feature')\n", - "plt.semilogy(epochs, learn_feat, label='PINN with learnable extra-feature')\n", - "plt.legend()\n", - "plt.grid()\n", - "plt.show()" - ] - } - ], - "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.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/tutorials/tutorial1/tutorial-1.py b/tutorials/tutorial1/tutorial-1.py deleted file mode 100644 index 089d095..0000000 --- a/tutorials/tutorial1/tutorial-1.py +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# This tutorial presents how to solve with Physics-Informed Neural Networks a 2-D Poisson problem with Dirichlet boundary conditions. -# We consider a Poisson problem with a sinusoidal forcing term, in the square domain D = [0, 1]*[0, 1], with boundaries gamma1, gamma2, gamma3, gamma4. -# First of all, some useful imports. - -import os -import numpy as np -import argparse -import sys -import torch -from torch.nn import ReLU, Tanh, Softplus -from pina.problem import SpatialProblem -from pina.operators import nabla -from pina.model import FeedForward -from pina.adaptive_functions import AdaptiveSin, AdaptiveCos, AdaptiveTanh -from pina import Condition, Span, PINN, LabelTensor, Plotter - -# Now, the Poisson problem is written in PINA code as a class. The equations are written as that should be satisfied in the corresponding domains. truth_solution is the exact solution which will be compared with the predicted one. - -class Poisson(SpatialProblem): - output_variables = ['u'] - spatial_domain = Span({'x': [0, 1], 'y': [0, 1]}) - - def laplace_equation(input_, output_): - force_term = (torch.sin(input_.extract(['x'])*torch.pi) * - torch.sin(input_.extract(['y'])*torch.pi)) - nabla_u = nabla(output_, input_, components=['u'], d=['x', 'y']) - return nabla_u - force_term - - def nil_dirichlet(input_, output_): - value = 0.0 - return output_.extract(['u']) - value - - conditions = { - 'gamma1': Condition(Span({'x': [0, 1], 'y': 1}), nil_dirichlet), - 'gamma2': Condition(Span({'x': [0, 1], 'y': 0}), nil_dirichlet), - 'gamma3': Condition(Span({'x': 1, 'y': [0, 1]}), nil_dirichlet), - 'gamma4': Condition(Span({'x': 0, 'y': [0, 1]}), nil_dirichlet), - 'D': Condition(Span({'x': [0, 1], 'y': [0, 1]}), laplace_equation), - } - - def poisson_sol(self, pts): - return -( - torch.sin(pts.extract(['x'])*torch.pi)* - torch.sin(pts.extract(['y'])*torch.pi) - )/(2*torch.pi**2) - #return -(np.sin(x*np.pi)*np.sin(y*np.pi))/(2*np.pi**2) - - truth_solution = poisson_sol - -# Then, a feed-forward neural network is defined, through the class FeedForward. A 2-D grid is instantiated inside the square domain and on the boundaries. This neural network takes as input the coordinates of the points which compose the grid and gives as output the solution of the Poisson problem. The residual of the equations are evaluated at each point of the grid and the loss minimized by the neural network is the sum of the residuals. -# In this tutorial, the neural network is composed by two hidden layers of 10 neurons each, and it is trained for 5000 epochs with a learning rate of 0.003. These parameters can be modified as desired. -# The output of the cell below is the final loss of the training phase of the PINN. - -poisson_problem = Poisson() - -model = FeedForward(layers=[10, 10], - output_variables=poisson_problem.output_variables, - input_variables=poisson_problem.input_variables) - -pinn = PINN(poisson_problem, model, lr=0.003, regularizer=1e-8) -pinn.span_pts(20, 'grid', ['D']) -pinn.span_pts(20, 'grid', ['gamma1', 'gamma2', 'gamma3', 'gamma4']) -pinn.train(5000, 100) - - -# The loss trend is saved in a dedicated txt file located in 'tutorial1_files'. - -os.mkdir('tutorial1_files') -with open('tutorial1_files/poisson_history.txt', 'w') as file_: - for i, losses in enumerate(pinn.history): - file_.write('{} {}\n'.format(i, sum(losses))) -pinn.save_state('tutorial1_files/pina.poisson') - - -# Now the Plotter class is used to plot the results. -# The solution predicted by the neural network is plotted on the left, the exact one is represented at the center and on the right the error between the exact and the predicted solutions is showed. - - -plotter = Plotter() -plotter.plot(pinn) - -# Now, the same problem is solved in a different way. -# A new neural network is now defined, with an additional input variable, named extra-feature, which coincides with the forcing term in the Laplace equation. -# The set of input variables to the neural network is: -# [x, y, k(x,y)], -# where x and y are the coordinates of the points of the grid and k(x, y) is the forcing term evaluated at the grid points. -# This forcing term is initialized in the class 'myFeature', the output of the cell below is also in this case the final loss of PINN. - - -class myFeature(torch.nn.Module): - """ - Feature: sin(x) - """ - - def __init__(self): - super(myFeature, self).__init__() - - def forward(self, x): - t = (torch.sin(x.extract(['x'])*torch.pi) * - torch.sin(x.extract(['y'])*torch.pi)) - return LabelTensor(t, ['sin(x)sin(y)']) - -feat = [myFeature()]# if args.features else [] - -poisson_problem = Poisson() -model_feat = FeedForward( - layers=[20, 20], - output_variables=poisson_problem.output_variables, - input_variables=poisson_problem.input_variables, - func=Softplus, - extra_features=feat - ) - -pinn_feat = PINN( - poisson_problem, - model_feat, - lr=0.03, - error_norm='mse', - regularizer=1e-8) - -pinn_feat.span_pts(20, 'grid', locations=['gamma1', 'gamma2', 'gamma3', 'gamma4']) -pinn_feat.span_pts(20, 'grid', locations=['D']) -pinn_feat.train(5000, 100) -pinn_feat.save_state('pina.poisson') - - -# The losses are saved in a txt file as for the basic Poisson case. - -with open('tutorial1_files/poisson_history_feat.txt', 'w') as file_: - for i, losses in enumerate(pinn_feat.history): - file_.write('{} {}\n'.format(i, sum(losses))) -pinn_feat.save_state('tutorial1_files/pina.poisson_feat') - - -# The predicted and exact solutions and the error between them are represented below. - - -plotter_feat = Plotter() -plotter_feat.plot(pinn_feat) - - -# Another way to predict the solution is to add a parametric forcing term of the Laplace equation as an extra-feature. The parameters added in the expression of the extra-feature are learned during the training phase of the neural network. -# The new Poisson problem is defined in the dedicated class 'ParametricPoisson', where the domain is no more only spatial, but includes the parameters' space. In our case, the parameters' bounds are 0 and 30. - - -from pina.problem import ParametricProblem - -class ParametricPoisson(SpatialProblem, ParametricProblem): - bounds_x = [0, 1] - bounds_y = [0, 1] - bounds_alpha = [0, 30] - bounds_beta = [0, 30] - spatial_variables = ['x', 'y'] - parameters = ['alpha', 'beta'] - output_variables = ['u'] - spatial_domain = Span({'x': bounds_x, 'y': bounds_y}) - parameter_domain = Span({'alpha': bounds_alpha, 'beta': bounds_beta}) - - def laplace_equation(input_, output_): - force_term = (torch.sin(input_.extract(['x'])*torch.pi) * - torch.sin(input_.extract(['y'])*torch.pi)) - nabla_u = nabla(output_, input_, components=['u'], d=['x', 'y']) - return nabla_u - force_term - - def nil_dirichlet(input_, output_): - value = 0.0 - return output_.extract(['u']) - value - - conditions = { - 'gamma1': Condition( - Span({'x': bounds_x, 'y': bounds_y[1], 'alpha': bounds_alpha, 'beta': bounds_beta}), - nil_dirichlet), - 'gamma2': Condition( - Span({'x': bounds_x, 'y': bounds_y[0], 'alpha': bounds_alpha, 'beta': bounds_beta}), - nil_dirichlet), - 'gamma3': Condition( - Span({'x': bounds_x[1], 'y': bounds_y, 'alpha': bounds_alpha, 'beta': bounds_beta}), - nil_dirichlet), - 'gamma4': Condition( - Span({'x': bounds_x[0], 'y': bounds_y, 'alpha': bounds_alpha, 'beta': bounds_beta}), - nil_dirichlet), - 'D': Condition( - Span({'x': bounds_x, 'y': bounds_y, 'alpha': bounds_alpha, 'beta': bounds_beta}), - laplace_equation), - } - - def poisson_sol(self, pts): - return -( - torch.sin(pts.extract(['x'])*torch.pi)* - torch.sin(pts.extract(['y'])*torch.pi) - )/(2*torch.pi**2) - - -# Here, as done for the other cases, the new parametric feature is defined and the neural network is re-initialized and trained, considering as two additional parameters alpha and beta. - - -param_poisson_problem = ParametricPoisson() - - -class myFeature(torch.nn.Module): - """ - """ - def __init__(self): - super(myFeature, self).__init__() - - def forward(self, x): - t = (x.extract(['beta'])*torch.sin(x.extract(['alpha'])*x.extract(['x'])*torch.pi)* - torch.sin(x.extract(['alpha'])*x.extract(['y'])*torch.pi)) - return LabelTensor(t, ['b*sin(a*x)sin(a*y)']) - -feat = [myFeature()] -model_learn = FeedForward(layers=[10, 10], - output_variables=param_poisson_problem.output_variables, - input_variables=param_poisson_problem.input_variables, - extra_features=feat) - -pinn_learn = PINN(param_poisson_problem, model_learn, lr=0.003, regularizer=1e-8) -pinn_learn.span_pts(20, 'grid', ['D']) -pinn_learn.span_pts(20, 'grid', ['gamma1', 'gamma2', 'gamma3', 'gamma4']) -pinn_learn.train(5000, 100) - - -# The losses are saved as for the other two cases trained above. - -with open('tutorial1_files/poisson_history_learn_feat.txt', 'w') as file_: - for i, losses in enumerate(pinn_learn.history): - file_.write('{} {}\n'.format(i, sum(losses))) -pinn_learn.save_state('tutorial1_files/pina.poisson_learn_feat') - - -# Here the plots for the prediction error (below on the right) shows that the prediction coming from the parametric PINN is more accurate than the one of the basic version of PINN. - -plotter_learn = Plotter() -plotter_learn.plot(pinn_learn) - - -# Now the files containing the loss trends for the three cases are read. The loss histories are compared; we can see that the loss decreases faster in the cases of PINN with extra-feature. - - -import pandas as pd - -df = pd.read_csv("tutorial1_files/poisson_history.txt", sep=" ", header=None) -epochs = df[0] -poisson_data = epochs.to_numpy()*100 -basic = df[1].to_numpy() - -df_feat = pd.read_csv("tutorial1_files/poisson_history_feat.txt", sep=" ", header=None) -feat = df_feat[1].to_numpy() - -df_learn = pd.read_csv("tutorial1_files/poisson_history_learn_feat.txt", sep=" ", header=None) -learn_feat = df_learn[1].to_numpy() - -import matplotlib.pyplot as plt -plt.semilogy(epochs, basic, label='Basic PINN') -plt.semilogy(epochs, feat, label='PINN with extra-feature') -plt.semilogy(epochs, learn_feat, label='PINN with learnable extra-feature') -plt.legend() -plt.grid() -plt.show() - diff --git a/tutorials/tutorial2/tutorial.ipynb b/tutorials/tutorial2/tutorial.ipynb new file mode 100644 index 0000000..e4c804a --- /dev/null +++ b/tutorials/tutorial2/tutorial.ipynb @@ -0,0 +1,578 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "60c55e04", + "metadata": {}, + "source": [ + "# Tutorial 2: resolution of Poisson problem and usage of extra-features" + ] + }, + { + "cell_type": "markdown", + "id": "11b1b539", + "metadata": {}, + "source": [ + "### The problem definition" + ] + }, + { + "cell_type": "markdown", + "id": "56edb356", + "metadata": {}, + "source": [ + "This tutorial presents how to solve with Physics-Informed Neural Networks a 2D Poisson problem with Dirichlet boundary conditions.\n", + "\n", + "The problem is written as:\n", + "\\begin{equation}\n", + "\\begin{cases}\n", + "\\Delta u = \\sin{(\\pi x)} \\sin{(\\pi y)} \\text{ in } D, \\\\\n", + "u = 0 \\text{ on } \\Gamma_1 \\cup \\Gamma_2 \\cup \\Gamma_3 \\cup \\Gamma_4,\n", + "\\end{cases}\n", + "\\end{equation}\n", + "where $D$ is a square domain $[0,1]^2$, and $\\Gamma_i$, with $i=1,...,4$, are the boundaries of the square." + ] + }, + { + "cell_type": "markdown", + "id": "bd72a9f9", + "metadata": {}, + "source": [ + "First of all, some useful imports." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0f54a8bc", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "from torch.nn import ReLU, Tanh, Softplus\n", + "\n", + "from pina.problem import SpatialProblem\n", + "from pina.operators import nabla\n", + "from pina.model import FeedForward\n", + "from pina import Condition, Span, PINN, LabelTensor, Plotter" + ] + }, + { + "cell_type": "markdown", + "id": "f661caca", + "metadata": {}, + "source": [ + "Now, the Poisson problem is written in PINA code as a class. The equations are written as *conditions* that should be satisfied in the corresponding domains. *truth_solution*\n", + "is the exact solution which will be compared with the predicted one." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "71fb35b3", + "metadata": {}, + "outputs": [], + "source": [ + "class Poisson(SpatialProblem):\n", + " output_variables = ['u']\n", + " spatial_domain = Span({'x': [0, 1], 'y': [0, 1]})\n", + "\n", + " def laplace_equation(input_, output_):\n", + " force_term = (torch.sin(input_.extract(['x'])*torch.pi) *\n", + " torch.sin(input_.extract(['y'])*torch.pi))\n", + " nabla_u = nabla(output_, input_, components=['u'], d=['x', 'y'])\n", + " return nabla_u - force_term\n", + "\n", + " def nil_dirichlet(input_, output_):\n", + " value = 0.0\n", + " return output_.extract(['u']) - value\n", + "\n", + " conditions = {\n", + " 'gamma1': Condition(Span({'x': [0, 1], 'y': 1}), nil_dirichlet),\n", + " 'gamma2': Condition(Span({'x': [0, 1], 'y': 0}), nil_dirichlet),\n", + " 'gamma3': Condition(Span({'x': 1, 'y': [0, 1]}), nil_dirichlet),\n", + " 'gamma4': Condition(Span({'x': 0, 'y': [0, 1]}), nil_dirichlet),\n", + " 'D': Condition(Span({'x': [0, 1], 'y': [0, 1]}), laplace_equation),\n", + " }\n", + "\n", + " def poisson_sol(self, pts):\n", + " return -(\n", + " torch.sin(pts.extract(['x'])*torch.pi)*\n", + " torch.sin(pts.extract(['y'])*torch.pi)\n", + " )/(2*torch.pi**2)\n", + " \n", + " truth_solution = poisson_sol" + ] + }, + { + "cell_type": "markdown", + "id": "1a959d3e", + "metadata": {}, + "source": [ + "### The problem solution " + ] + }, + { + "cell_type": "markdown", + "id": "42de9096", + "metadata": {}, + "source": [ + "After the problem, the feed-forward neural network is defined, through the class `FeedForward`. This neural network takes as input the coordinates (in this case $x$ and $y$) and provides the unkwown field of the Poisson problem. The residual of the equations are evaluated at several sampling points (which the user can manipulate using the method `span_pts`) and the loss minimized by the neural network is the sum of the residuals.\n", + "\n", + "In this tutorial, the neural network is composed by two hidden layers of 10 neurons each, and it is trained for 1000 epochs with a learning rate of 0.006. These parameters can be modified as desired.\n", + "The output of the cell below is the final loss of the training phase of the PINN.\n", + "We highlight that the generation of the sampling points and the train is here encapsulated within the function `generate_samples_and_train`, but only for saving some lines of code in the next cells; that function is not mandatory in the **PINA** framework. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "11b3dd75", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00000] 4.821361e-01 7.271265e-02 5.749976e-02 7.188050e-02 5.793815e-02 2.221050e-01 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00001] 3.231621e-01 2.852444e-02 1.981721e-02 2.768876e-02 2.037603e-02 2.267557e-01 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00100] 1.015092e-01 5.198789e-04 2.826267e-03 3.158009e-03 2.300746e-03 9.270430e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00200] 8.891604e-02 4.115215e-04 5.373723e-04 5.063288e-04 5.177262e-04 8.694309e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00300] 8.620024e-02 3.734426e-04 4.014817e-04 3.966301e-04 4.261272e-04 8.460256e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00400] 8.090379e-02 3.381128e-04 2.724089e-04 2.855197e-04 3.383889e-04 7.966936e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00500] 7.000037e-02 2.501736e-04 7.233566e-05 1.258494e-04 1.898462e-04 6.936217e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00600] 2.645028e-02 9.258305e-05 2.108825e-04 1.832870e-04 7.366277e-05 2.588986e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00700] 2.599242e-03 5.990163e-05 9.679930e-05 1.735135e-04 3.957247e-05 2.229455e-03 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00800] 1.343722e-03 6.899313e-05 4.569854e-05 1.231751e-04 1.892484e-05 1.086931e-03 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00900] 8.533830e-04 6.269138e-05 2.274475e-05 8.422977e-05 1.782445e-05 6.658927e-04 \n", + "[epoch 01000] 6.219158e-04 5.753698e-05 1.195975e-05 6.105051e-05 1.724382e-05 4.741247e-04 \n" + ] + } + ], + "source": [ + "def generate_samples_and_train(model, problem):\n", + " pinn = PINN(problem, model, lr=0.006, regularizer=1e-8)\n", + " pinn.span_pts(20, 'grid', locations=['D'])\n", + " pinn.span_pts(20, 'grid', locations=['gamma1', 'gamma2', 'gamma3', 'gamma4'])\n", + " pinn.train(1000, 100)\n", + " return pinn\n", + "\n", + "problem = Poisson()\n", + "model = FeedForward(\n", + " layers=[10, 10],\n", + " func=Softplus,\n", + " output_variables=problem.output_variables,\n", + " input_variables=problem.input_variables\n", + ")\n", + "\n", + "pinn = generate_samples_and_train(model, problem)" + ] + }, + { + "cell_type": "markdown", + "id": "b320fbd5", + "metadata": {}, + "source": [ + "The neural network of course can be saved in a file. In such a way, we can store it after the train, and load it just to infer the field. Here we don't store the model, but for demonstrative purposes we put in the next cell the commented line of code." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c249817b", + "metadata": {}, + "outputs": [], + "source": [ + "# pinn.save_state('pina.poisson')" + ] + }, + { + "cell_type": "markdown", + "id": "7803e6ed", + "metadata": {}, + "source": [ + "Now the *Plotter* class is used to plot the results.\n", + "The solution predicted by the neural network is plotted on the left, the exact one is represented at the center and on the right the error between the exact and the predicted solutions is showed. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0900748a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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EhIS1LdvX5166qkBoV5mZqZ8Pp++/PJLnXHGGW1v6AnYV4sOt3wuSO7ZVrbTeZxU10ysaSfq27ev4uLi/AGldKymSVJFRUVIIWVIz1x8fLyysrK0du1a/7TGxkatXbtWOTk5QZfJyckJmF+SSkpKWpwfABBdvXv3VkZGRqt/8fHxysnJUXV1tcrKyvzLrlu3To2NjcrOzg667qysLHXt2jWgDpSXl6uiosJfBy688EL/9CZVVVXat2+fTjvttEhssh91DQCcx+q6FsyWLVt08skn+8O9Cy+8ULt379aBAwf883zyySeKjY1V//79O7Td1DQAcB4Ta9qJLrzwQh05ckSfffaZf9onn3wiSaHvz/lCtHz5cl9CQoLvxRdf9H388ce+mTNn+lJSUnxer9fn8/l8V111lW/OnDn++d955x1fXFyc78EHH/Rt27bNV1RU5Ovatavvww8/bPd91tTU+CT5ampqQh2urbCdzuOWbWU73WPcuHG+8847z7dx40bfX//6V98ZZ5zhu/LKK/23f/nll76zzjrLt3HjRv+066+/3jdw4EDfunXrfO+//74vJyfHl5OTE7DeSy+91PfNb37T98477/g+/PBD38UXX+wbMmSIr76+PuLbFO265qbXkVu2le10Hrdsq1u2szWRqGuvv/6679lnn/V9+OGHvk8//dT31FNP+bp37+6bP3++f579+/f7+vfv77v88st9W7du9b311lu+M844w3fdddd1anvYV4sct2ynz+eebWU7ncdN2xpMpPbVPv30U98HH3zg+9GPfuQ788wzfR988IHvgw8+8NXV1fl8Pp/v6NGjvvPPP9/3ne98x7d582bf+++/78vOzvZddNFF/197dxtTZf3HcfyLwDlAYOAcCIU1aGQjy6WDoTlWY3OzWdkDXTaG3VmDnshWuaidlmXMudbGKJfd2AMXs6atBdGNyZqmazPYWJDNDuVqwqbrhoXE3ef/yLM/eiCvA+dc55zr/dp44MV19PsVPO/xEz2Od3B8SClJLS0tWrp0qXw+nyoqKnTy5MnQ+6qrq1VXVzft/oMHD6qsrEw+n0/l5eVqb2939OuNjo4qEAhodHQ0knETBnsmH6/syp7eceHCBT344IPKzs7WwoUL9fDDD2t4eDj0/oGBAZmZjh49Grp28eJF1dfXKy8vT1lZWdq4caPOnTs37ef9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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plotter = Plotter()\n", + "plotter.plot(pinn)" + ] + }, + { + "cell_type": "markdown", + "id": "7e6fe021", + "metadata": {}, + "source": [ + "### The problem solution with extra-features" + ] + }, + { + "cell_type": "markdown", + "id": "f39c0033", + "metadata": {}, + "source": [ + "Now, the same problem is solved in a different way.\n", + "A new neural network is now defined, with an additional input variable, named extra-feature, which coincides with the forcing term in the Laplace equation. \n", + "The set of input variables to the neural network is:\n", + "\n", + "\\begin{equation}\n", + "[x, y, k(x, y)], \\text{ with } k(x, y)=\\sin{(\\pi x)}\\sin{(\\pi y)},\n", + "\\end{equation}\n", + "\n", + "where $x$ and $y$ are the spatial coordinates and $k(x, y)$ is the added feature. \n", + "\n", + "This feature is initialized in the class `SinSin`, which needs to be inherited by the `torch.nn.Module` class and to have the `forward` method. After declaring such feature, we can just incorporate in the `FeedForward` class thanks to the `extra_features` argument.\n", + "**NB**: `extra_features` always needs a `list` as input, you you have one feature just encapsulated it in a class, as in the next cell.\n", + "\n", + "Finally, we perform the same training as before: the problem is `Poisson`, the network is composed by the same number of neurons and optimizer parameters are equal to previous test, the only change is the new extra feature." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "80a4a3b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00000] 8.334048e-02 1.480584e-02 1.326940e-02 1.505190e-02 1.282023e-02 2.739312e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00001] 2.369340e-02 1.785535e-03 1.441936e-03 1.978278e-03 1.193302e-03 1.729435e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00100] 4.190661e-05 5.259407e-06 2.207154e-06 1.740728e-06 1.258537e-06 3.144078e-05 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00200] 2.964181e-06 3.873027e-08 3.952280e-08 6.926503e-08 4.859637e-08 2.768067e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00300] 2.477657e-06 3.019578e-08 3.888974e-08 5.290904e-08 4.751930e-08 2.308143e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00400] 2.054579e-06 2.595518e-08 3.504910e-08 4.605295e-08 4.163064e-08 1.905891e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00500] 1.716277e-06 2.342572e-08 3.247192e-08 4.101565e-08 3.697489e-08 1.582388e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00600] 1.461072e-06 2.217194e-08 3.119703e-08 3.734558e-08 3.372288e-08 1.336635e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00700] 1.275204e-06 2.180191e-08 3.080508e-08 3.476259e-08 3.154803e-08 1.156287e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00800] 1.141423e-06 2.190318e-08 3.084367e-08 3.297679e-08 3.010750e-08 1.025592e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00900] 1.043816e-06 2.220373e-08 3.104670e-08 3.163695e-08 2.905372e-08 9.298745e-07 \n", + "[epoch 01000] 9.697858e-07 2.242846e-08 3.111799e-08 3.060282e-08 2.824710e-08 8.573894e-07 \n" + ] + } + ], + "source": [ + "class SinSin(torch.nn.Module):\n", + " \"\"\"Feature: sin(x)*sin(y)\"\"\"\n", + " def __init__(self):\n", + " super().__init__()\n", + "\n", + " def forward(self, x):\n", + " t = (torch.sin(x.extract(['x'])*torch.pi) *\n", + " torch.sin(x.extract(['y'])*torch.pi))\n", + " return LabelTensor(t, ['sin(x)sin(y)'])\n", + "\n", + "model_feat = FeedForward(\n", + " layers=[10, 10],\n", + " output_variables=problem.output_variables,\n", + " input_variables=problem.input_variables,\n", + " func=Softplus,\n", + " extra_features=[SinSin()]\n", + " )\n", + "\n", + "pinn_feat = generate_samples_and_train(model_feat, problem)" + ] + }, + { + "cell_type": "markdown", + "id": "568b88a1", + "metadata": {}, + "source": [ + "The predicted and exact solutions and the error between them are represented below.\n", + "We can easily note that now our network, having almost the same condition as before, is able to reach an additional order of magnitude in accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9826e8e1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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48aN6tevnz744AMNHjxYkpSfn69hw4bp66+/Vvfu3es8p6ysTF26dNGLL76oSy65RJK0adMm9e3bV4WFhTrjjDPqfa/HHntM999/v7Zv397g/Jx00kkaPXp0SJG1gRM1TfJmXYvVNTqpa+aJRV1zekSnE3XNiaDThLpmY02TqGtOcaquNcTUoJPgKDyxDCI5ANs4Ew6uRfvO6xfGfajBJ5X4sq5Fq6b99a9/1c9+9jPt2LEjeGO7efPm6dZbb9WuXbuUmJioW2+9VcuWLdOnn34afO3LLrtMpaWlys/PlyRlZWXpxz/+sR5//HFJUk1NjXr27KkbbrhB06ZNkyS1b99eTz75pK688srg6xx99NG69957de2114a9LhjRCaBenOJnv/Ly8pB/lZUtC3cKCwvVsWPHYOGUpJycHMXHx2vt2rX1PqeoqEjV1dXKyckJPpaZmalevXqpsLCw3ufs2LFDr776qn7yk580OC81NTXau3evOnXq1MylgYnY7wBoiNM1TaKuofkIOcMT69GWjPCETWzp1QoLC9W/f/9gyClJubm5Ki8v14YNG4LTHP4atdPUvkZVVZWKiopCpomPj1dOTk5I7TzzzDO1aNEi7dmzRzU1NXrppZdUUVGh//mf/4loXXAzIjSJmxIB0dNhW0AJic6OYjtYdej1evbsGfL4rFmzNHv27Ga/bnFxsbp27RryWKtWrdSpUycVFxc3+JzExER17Ngx5PG0tLQ6z7n88sv1l7/8Rd9//71GjBihp59+usF5eeCBB7Rv3z5deumlzVsYAMbw62nrXmRTTZOoa0A0uRk4Jm1LZHQnHNFhuz11LVo1rbi4OCTkrP177d8am6a8vFzff/+9/vvf/+rgwYP1TrNp0w+jfF9++WWNHj1aRx99tFq1aqW2bdvqtdde03HHHRfmWjiEEZ2AZWgIEa7t27errKws+G/69On1Tjdt2jTFxcU1+u/wAhQtDz/8sD766CP95S9/0Zdffqm8vLx6p3vxxRd155136uWXX65TzIFwsB/1HxNPW0dkwq1pEnUNcJMpoypNmAfTMBLZLLb1arFwxx13qLS0VH/729/04YcfKi8vT5deeqk++eSTiF6HEZ1hyuixy8gdw96MuJhc04xRnYB9UlJSwrruy80336yrr7660Wn69Omj9PT0kItFS9KBAwe0Z88epaen1/u8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1rpgRCckMULCC7z0GdIQmqmwsFAdO3YMFk5JysnJUXx8vNauXVvvc4qKilRdXa2cnJzgY5mZmerVq5cKCwuDj3322We666679MILLyg+vm5pys7O1vbt27V8+XIFAgGVlJTolVde0bBhwxxcQkje+P55aX/od3yWiCbqWvS5deCJkBM2M3H7YFSn+aJV0woLC9W/f3+lpaUFp8nNzVV5ebk2bNgQnObw16id5vC6eKSysjJJUqdOnYKPfffdd7riiis0d+5cpaenh7vodRB0OsALTWEtGgr7eO0z89L3yW3l5eUh/yorK1v0esXFxeratWvIY61atVKnTp1UXFzc4HMSExPVsWPHkMfT0tKCz6msrNTll1+u+++/X7169ar3dc466ywtXLhQo0ePVmJiotLT05Wamqq5c+e2aJlQP698D722f/QTL312Xvk+uc3pmiZR16KNkLN+JoZYMA/biffZ0qsVFxeHhJy1f6/9W2PTlJeX6/vvv6/zvjU1Nbrpppt01lln6eSTTw4+PmXKFJ155pm66KKLwljihnHqukNsP4X9SIc3FxxNMY9Xmr8j+bEZTNz8jVrFO/uDPL6mSpLUs2fPkMdnzZql2bNn15l+2rRpTZ4qt3HjRsfm70jTp09X37599ctf/rLBaT777DPdeOONmjlzpnJzc/Wf//xHU6dO1XXXXadnnnkmavMGb+CUdjt4sbb5ra6ZUNMk6hrMRXiFSJh2GnvStkRV9qqK2ftt/bqL678NEj/f4Xpdc7umRcOkSZP06aef6t133w0+9vrrr2vlypX6+OOPW/z6BJ0O8lrYWYsG0Rxu7+hhl+3btyslJSX430lJSfVOd/PNN+vqq69u9LX69Omj9PR07dy5M+TxAwcOaM+ePQ2eWpCenq6qqiqVlpaGHCksKSkJPmflypX65JNP9Morr0g6dJc9SercubNuv/123XnnnZozZ47OOussTZ06VZJ0yimnqF27djr77LN1zz33NPv6LWiYF2saB/HM5NXa5reQM9rCrWkSdc0EjOasi5ATXhDrsNPLbOnV0tPTtW7dupDn1d6V/fBpjrxTe0lJiVJSUtSmTZuQxydPnhy8UVKPHj2Cj69cuVJffvllndGlo0aN0tlnn61Vq1Y1ug4OR9CJsNEgusOrDeCRaAidl5KSElI8G9KlSxd16dL0dzo7O1ulpaUq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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plotter.plot(pinn_feat)" + ] + }, + { + "cell_type": "markdown", + "id": "c5f03a63", + "metadata": {}, + "source": [ + "### The problem solution with learnable extra-features" + ] + }, + { + "cell_type": "markdown", + "id": "2d2f1bf1", + "metadata": {}, + "source": [ + "We can still do better!\n", + "\n", + "Another way to exploit the extra features is the addition of learnable parameter inside them.\n", + "In this way, the added parameters are learned during the training phase of the neural network. In this case, we use:\n", + "\n", + "\\begin{equation}\n", + "k(x, \\mathbf{y}) = \\beta \\sin{(\\alpha x)} \\sin{(\\alpha y)},\n", + "\\end{equation}\n", + "\n", + "where $\\alpha$ and $\\beta$ are the abovementioned parameters.\n", + "Their implementation is quite trivial: by using the class `torch.nn.Parameter` we cam define all the learnable parameters we need, and they are managed by `autograd` module!" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "005c3958", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00000] 3.918677e-01 2.501913e-02 1.278682e-02 1.963722e-02 1.756839e-02 3.168561e-01 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00001] 1.345929e-01 1.696471e-02 9.475741e-03 1.432935e-02 1.169397e-02 8.212914e-02 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00100] 4.500092e-04 1.441140e-05 9.839978e-06 2.283052e-05 4.087769e-06 3.988396e-04 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00200] 2.102947e-04 1.462936e-05 2.168394e-06 4.655578e-06 4.340448e-07 1.884074e-04 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00300] 1.371512e-04 1.072066e-05 1.284032e-06 2.897264e-06 1.126986e-06 1.211222e-04 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00400] 9.371716e-05 7.952534e-06 1.115802e-06 2.099921e-06 1.375253e-06 8.117365e-05 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00500] 6.719316e-05 5.919826e-06 9.837649e-07 1.510521e-06 1.423588e-06 5.735546e-05 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00600] 5.042886e-05 4.428994e-06 8.414617e-07 1.083298e-06 1.338001e-06 4.273711e-05 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00700] 3.907475e-05 3.327482e-06 7.004838e-07 7.866622e-07 1.162936e-06 3.309719e-05 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00800] 3.086757e-05 2.501366e-06 5.700428e-07 5.815515e-07 9.500203e-07 2.626459e-05 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00900] 2.470110e-05 1.874311e-06 4.546698e-07 4.359081e-07 7.396913e-07 2.119652e-05 \n", + "[epoch 01000] 1.999130e-05 1.396229e-06 3.562134e-07 3.291411e-07 5.548665e-07 1.735485e-05 \n" + ] + } + ], + "source": [ + "class SinSinAB(torch.nn.Module):\n", + " \"\"\" \"\"\"\n", + " def __init__(self):\n", + " super().__init__()\n", + " self.alpha = torch.nn.Parameter(torch.tensor([1.0]))\n", + " self.beta = torch.nn.Parameter(torch.tensor([1.0]))\n", + "\n", + "\n", + " def forward(self, x):\n", + " t = (\n", + " self.beta*torch.sin(self.alpha*x.extract(['x'])*torch.pi)*\n", + " torch.sin(self.alpha*x.extract(['y'])*torch.pi)\n", + " )\n", + " return LabelTensor(t, ['b*sin(a*x)sin(a*y)'])\n", + "\n", + "\n", + "model_learn = FeedForward(\n", + " layers=[10, 10],\n", + " output_variables=problem.output_variables,\n", + " input_variables=problem.input_variables,\n", + " extra_features=[SinSinAB()]\n", + ")\n", + "\n", + "pinn_learn = generate_samples_and_train(model_learn, problem)" + ] + }, + { + "cell_type": "markdown", + "id": "8dae2a05", + "metadata": {}, + "source": [ + "Umh, the final loss is not appreciabily better than previous model (with static extra features), despite the usage of learnable parameters. This is mainly due to the over-parametrization of the network: there are many parameter to optimize during the training, and the model in unable to understand automatically that only the parameters of the extra feature (and not the weights/bias of the FFN) should be tuned in order to fit our problem. A longer training can be helpful, but in this case the faster way to reach machine precision for solving the Poisson problem is removing all the hidden layers in the `FeedForward`, keeping only the $\\alpha$ and $\\beta$ parameters of the extra feature." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "afa18873", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00000] 1.974945e+00 2.002993e-03 7.012323e-02 2.755559e-02 1.584911e-02 1.859414e+00 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00001] 1.761779e+00 3.188374e-03 6.539153e-02 2.452723e-02 1.474262e-02 1.653930e+00 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00100] 4.036187e-03 1.676370e-05 2.384196e-05 1.675912e-05 2.528631e-05 3.953536e-03 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00200] 3.638973e-06 9.148435e-09 5.011525e-09 8.995231e-09 5.055353e-09 3.610763e-06 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00300] 7.258809e-11 2.040413e-13 1.323202e-13 1.966580e-13 1.385408e-13 7.191653e-11 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00400] 1.095777e-13 2.320287e-16 3.792855e-17 2.308433e-16 3.710536e-17 1.090398e-13 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00500] 1.095686e-13 2.238822e-16 4.053546e-17 2.238880e-16 4.054121e-17 1.090398e-13 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00600] 1.095686e-13 2.238991e-16 4.052415e-17 2.238992e-16 4.052421e-17 1.090398e-13 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00700] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00800] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 \n", + " sum gamma1nil_di gamma2nil_di gamma3nil_di gamma4nil_di Dlaplace_equ \n", + "[epoch 00900] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 \n", + "[epoch 01000] 1.095686e-13 2.238992e-16 4.052411e-17 2.238992e-16 4.052410e-17 1.090398e-13 \n" + ] + } + ], + "source": [ + "model_learn = FeedForward(\n", + " layers=[],\n", + " output_variables=problem.output_variables,\n", + " input_variables=problem.input_variables,\n", + " extra_features=[SinSinAB()]\n", + ")\n", + "\n", + "pinn_learn = generate_samples_and_train(model_learn, problem)" + ] + }, + { + "cell_type": "markdown", + "id": "02801614", + "metadata": {}, + "source": [ + "In such a way, the model is able to reach a very high accuracy!\n", + "Of course, this is a toy problem for understanding the usage of extra features: similar precision could be obtained if the extra features are very similar to the true solution. The analyzed Poisson problem shows a forcing term very close to the solution, resulting in a perfect problem to address with such an approach.\n", + "\n", + "We conclude here by showing the graphical comparison of the unknown field and the loss trend for all the test cases presented here: the standard PINN, PINN with extra features, and PINN with learnable extra features." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "81c94c8f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABRcAAAIICAYAAAD0YtmFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAADUwElEQVR4nOz9e5xVVeE//r9mwJlBYQaRy4BcBikbLIWCxBEtL6OYRvqWCpV3KCKmQRmYBamgZZlFaibKN/P6eEuappaXN0Ugaoqio/Q2AkwQB7UZMH4MF2UGmPn9wWcf9tmzL2vtvfbea+39ej4e84A5Z1/WOXPOXme9zrqUdHR0dICIiIiIiIiIiIhIUmnaBSAiIiIiIiIiIiIzMVwkIiIiIiIiIiKiUBguEhERERERERERUSgMF4mIiIiIiIiIiCgUhotEREREREREREQUCsNFIiIiIiIiIiIiCoXhIhEREREREREREYXCcJGIiIiIiIiIiIhCYbhIREREREREREREoTBcJCIiIiIiIiIiolAYLhIRERERERERUSY9//zzGD9+PAYMGICSkhI88cQTsZ5v3759uPbaazF06FB069YNw4YNw49//GN0dHTEet40dU27AERERERERERERHHYtWsXRowYgYsvvhjnnntu7Oe76aabcOedd+L+++/Hpz/9abz22muYMmUKqqqq8J3vfCf286eB4SIREREREREREWXSl770JXzpS1/yvL+1tRVXX301fve732Hbtm34zGc+g5tuugknnXRSqPO99NJLOPvss3HWWWcBAGpqavC73/0OK1euDHU8E3BYNBERERERERER5dKMGTOwYsUKPPTQQ/i///s/fO1rX8MZZ5yBf/3rX6GOd/zxx2Pp0qV46623AAB///vf8be//c034DQdey4SEREREREREVHuNDY24t5770VjYyMGDBgAAPje976HxYsX495778VPf/pT6WPOnj0b27dvR21tLbp06YJ9+/bhJz/5CSZNmqS6+Npgz0UiIiIiIiIiIsqdN998E/v27cORRx6J7t27F36ee+45rF+/HgCwdu1alJSU+P7Mnj27cMzf//73ePDBB7Fo0SK8/vrruP/++zF//nzcf//9aT3M2LHnIhERERERERER5c7OnTvRpUsXNDQ0oEuXLkX3de/eHQBwxBFHYM2aNb7HOeywwwr/v+qqqzB79mycd955AICjjz4a7777Lm688UZceOGFih+BHhguEhERERERERFR7nz2s5/Fvn37sHnzZpx44omu25SVlaG2tlb4mB999BFKS4sHCnfp0gXt7e2RyqozhotERERERERERJRJO3fuxNtvv134/Z133sGqVavQq1cvHHnkkZg0aRImT56MX/7yl/jsZz+LLVu2YOnSpTjmmGMKKz7LGD9+PH7yk59g8ODB+PSnP4033ngDN998My6++GKVD0srJR0dHR1pF4KIiIiIiIiIiEi15cuX4+STT+50+4UXXoj77rsPe/bswQ033IAHHngA77//Pnr37o3jjjsO119/PY4++mjp8+3YsQPXXnstHn/8cWzevBkDBgzA+eefj7lz56KsrEzFQ9KO9IIuzz//PMaPH48BAwagpKQETzzxROA+y5cvx+c+9zmUl5fjE5/4BO67774QRSUiorgsWLAANTU1qKiowJgxY7By5Urf7R955BHU1taioqICRx99NJ555pmi+zs6OjB37lz0798f3bp1Q319Pf71r38VbfPWW2/h7LPPRu/evVFZWYkTTjgBzz77rPLH5od1GhFRNrFeY71GRGQ56aST0NHR0enHut4ddNBBuP766/HOO++gra0NH3zwAR577LFQwSIA9OjRA7feeiveffddfPzxx1i/fj1uuOGGUMHinXfeiWOOOQaVlZWorKxEXV0d/vd//9dz+7vuugsnnngiDj30UBx66KGor68PrANVkA4Xd+3ahREjRmDBggVC27/zzjs466yzcPLJJ2PVqlX47ne/i0suuQR//vOfpQtLRETqPfzww5g1axbmzZuH119/HSNGjMC4ceOwefNm1+1feuklnH/++Zg6dSreeOMNnHPOOTjnnHPwj3/8o7DNz3/+c9x2221YuHAhXnnlFRxyyCEYN24cdu/eXdjmy1/+Mvbu3Ytly5ahoaEBI0aMwJe//GU0NTXF/pgtrNOIiLKH9RrrNSKirBg4cCB+9rOfoaGhAa+99hpOOeUUnH322Vi9erXr9suXL8f555+PZ599FitWrMCgQYNw+umn4/3334+1nJGGRZeUlODxxx/HOeec47nND37wAzz99NNFlfN5552Hbdu2YfHixa77tLa2orW1tfB7e3s7tm7disMOOwwlJSVhi0tEFElHRwd27NiBAQMGdJqgN4zdu3ejra1NQck66+jo6HS9LC8vR3l5eadtx4wZg89//vO4/fbbAey/5g4aNAjf/va3MXv27E7bT5w4Ebt27cJTTz1VuO24447DyJEjsXDhQnR0dGDAgAG48sor8b3vfQ8A0NLSgn79+uG+++7Deeedhw8//BB9+vTB888/X5g4eceOHaisrMSSJUtQX1+v7LkQxTqNiPJGZb2mS50GsF6zsF4jorzJar3m1KtXL/ziF7/A1KlTA7fdt28fDj30UNx+++2YPHlyqPIK6YgAQMfjjz/uu82JJ57YccUVVxTdds8993RUVlZ67jNv3rwOAPzhD3/4o+XPpk2bolw6Ozo6Ojo+/vjjjj59SmMrY/fu3TvdNm/evE7laG1t7ejSpUuna/nkyZM7vvKVr7iWfdCgQR233HJL0W1z587tOOaYYzo6Ojo61q9f3wGg44033ija5gtf+ELHd77znY6Ojo6O9vb2jk996lMdl1xyScfOnTs79uzZ0/GLX/yio2/fvh1bt24N9ZxGBbBO4w9/+JPPn6j1mi51WkcH6zU7gPUaf/jDn3z+ZKles9u7d2/H7373u46ysrKO1atXCz2W7du3d1RUVHQ8+eSTkZ6TILGvFt3U1IR+/foV3davXz9s374dH3/8Mbp169Zpnzlz5mDWrFmF31taWjB48GBctfQUlB/CBa6JKB2tu/biF6cuQ48ePSIfq62tDVu2tGP5K33Rvbvab/l37uzASWM2Y9OmTaisrCzc7vZN2Icffoh9+/a5XqfXrl3renyv67o17Mv612+bkpIS/PWvf8U555yDHj16oLS0FH379sXixYtx6KGHSj7i5LBOI6IsUVWv6VKnAazXZKms18b87lJ0PVh8PrHGD3qHL7iEsk3pLJ7QY1NHKuelZO0YlGxv3bZB6nvSDR7wodLjndzvLSXHOafH36X32bmzHSeN2ZKpeg0A3nzzTdTV1WH37t3o3r07Hn/8cRx11FFC5/vBD36AAQMGxN6DXstWjVd30PJDuqKi+0EplIiI6ACVQ366dy9B9x7Rh1gXaweAwqS/Ouro6MD06dPRt29fvPDCC+jWrRt++9vfYvz48Xj11VfRv3//tIuoDOs0ItKdqnotr3UawHoNALoeXIauh4gN6QOA0m4VKovlqUtFOuFilzKGi3nQsxnYMSS5gLG0m+prLPDe/28gagZuUXa8F3YejdOq3b/MkbG4YzS+Wvl6qH2zVq996lOfwqpVq9DS0oJHH30UF154IZ577rnAgPFnP/sZHnroISxfvhwVFfFec9W/Mh2qq6vR3NxcdFtzczMqKytdvwkjIqLk9O7dG126dHG9TldXV7vu43Vdt7a3/vXbZtmyZXjqqafw0EMPYezYsfjc5z6HO+64A926dcP999+v5LHFgXUaEZHeWK/JYb1GZJbyxnTCckpXWVkZPvGJT2DUqFG48cYbMWLECPzqV7/y3Wf+/Pn42c9+hr/85S845phjYi9j7OFiXV0dli5dWnTbkiVLUFdXF/epiYgoQFlZGUaNGlV0nW5vb8fSpUs9r9NB1/WhQ4eiurq6aJvt27fjlVdeKWzz0UcfAUCniZZLS0vR3t4e/YHFhHUaEZHeWK/JYb1GFF2PdzvQ412ze6pufK+P0uMtaarFkqbayMd5dPvnFJQme9rb24sW1nL6+c9/jh//+MdYvHgxRo8enUiZpMPFnTt3YtWqVVi1ahUA4J133sGqVavQ2NgIYP8cHPYVaC677DJs2LAB3//+97F27Vrccccd+P3vf4+ZM2eqeQRERBTJrFmzcNddd+H+++/HmjVrcPnll2PXrl2YMmUKAGDy5MmYM2dOYfsrrrgCixcvxi9/+UusXbsW1113HV577TXMmDEDwP5hCN/97ndxww034E9/+hPefPNNTJ48GQMGDCisWFlXV4dDDz0UF154If7+97/jrbfewlVXXYV33nkHZ511VmKPnXUaEVH2sF5jvWZhL690Va33Dj+yKKmAsbyxLFev7bwHjHPmzMHzzz+PjRs34s0338ScOXOwfPlyTJo0CUDnOu2mm27Ctddei3vuuQc1NTVoampCU1MTdu7cGWs5pedcfO2113DyyScXfrcm873wwgtx33334d///neh8gL2f9P39NNPY+bMmfjVr36FgQMH4re//S3GjRunoPhERBTVxIkTsWXLFsydOxdNTU0YOXIkFi9eXJjgvbGxsagnxvHHH49FixbhmmuuwQ9/+EN88pOfxBNPPIHPfOYzhW2+//3vY9euXbj00kuxbds2nHDCCVi8eHFhro/evXtj8eLFuPrqq3HKKadgz549+PSnP40//vGPGDFiRGKPnXUaEVH2sF5jvZY203uxqVS1vhUtw8Tn4qT0WL0XVc6/uKSpVsn8i49u/1zo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F6KjowMDBgzAlVdeie9973sAgJaWFvTr1w/33XcfzjvvPKxZswZHHXUUXn31VYwePRoAsHjxYpx55pl47733MGDAABVPhZZMqdMA1muUHNZr6VBVr+lUpwGs15Jm/f3H/nEGuh7iHfbocu3VtRdW2LDICi2zGjbljfPvaQ+le7zboTSktnoqOodApz0kOspngr27WvHi2bdnrl6z27JlC/r27YvnnnsOX/jCFzy327dvH77whS/g4osvxgsvvIBt27bhiSeeiFByf5xzUZEsNsB0+QBAndn/NllqkHGuKrW2b99e9Ht5eTnKy4s/9Le1taGhoQFz5swp3FZaWor6+nqsWLHC9bgrVqzArFmzim4bN25cobJ655130NTUhPr6+sL9VVVVGDNmDFasWIHzzjsPK1asQM+ePQsNMACor69HaWkpXnnlFfzXf/1XqMdM6mStXmOdpjfr75OlOo3UEqnTANZrOrO/v9O8JsuEJl4hSxwBZdTQKOr+VnDlFWDZw0u/wMtru6BzeIVpdkH72I/vtr3Xeby4PRaZgC9KGOi2X5hjuQWIzte18zVuarBoGtF6zamlpQUA0KtXL9/tfvSjH6Fv376YOnUqXnjhhfAFFcRwkYqw8WWerDXI8hYwPrFjBCo61PZe271zD4C/YNCgQUW3z5s3D9ddd13RbR9++CH27duHfv36Fd3er18/rF3r/ndoampy3b6pqalwv3Wb3zZ9+/Ytur9r167o1atXYRtKT5aCRdZrZsnal2es06KTqdMA1mumqBm4xYjrs1fIklTgmCQruPIKsERv9wvA/M4RJkzzOrdIGUREDfjSGAovEgzquFCLrtcEHeo1u/b2dnz3u9/F2LFj8ZnPfMZzu7/97W+4++67sWrVqugFFsRwUYEsNMJ0fCOTnKyFjBTdpk2birrai3wTRpQVrNfMl5V6LW8BY1xYpxFRGlQPRSayhKnXpk+fjn/84x/429/+5rnNjh078I1vfAN33XUXevfuraSsIhguRmR6sMjGV/ZkoTHGhpgalZWVgfN49O7dG126dEFzc3PR7c3Nzaiurnbdp7q62nd769/m5mb079+/aJuRI0cWtnFOrL93715s3brV87yUDNZrpBvWawSI1WkA6zXSV+vgNuN7N2aBbFjoHMbNsDEeefz8JlqvWWbMmFFYLGzgwIGe261fvx4bN27E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90IU4eyx6NWTUobsvI8UD5l67eabb8a0adMwZcoUAMDChQvx9NNP45577sHs2bM7bf+rX/0KZ5xxBq666ioAwI9//GMsWbIEt99+OxYuXKj4kezHnotERCkq21RW+KZW1U/Zpv0feAYNGoSqqqrCz4033hiprCtWrEDPnj0LDTAAqK+vR2lpKV555RXXfRoaGrBnzx7U19cXbqutrcXgwYOxYsUKz3O1tLSgV69eRbfde++92LBhA+bNmxfpcRARUTxMqtMA1mukni7BYVaCxSjzKYbpCRmHPK8YLUL3Hpc61GttbW1oaGgoqndKS0tRX1/vWe+sWLGiaHsAGDdunG89FRV7LhIRZdSmTZtQWVlZ+D1qD4+mpib07du36LauXbuiV69eaGpq8tynrKwMPXv2LLq9X79+nvu89NJLePjhh/H0008XbvvXv/6F2bNn44UXXkDXrqy6iIjyRnWdBrBeywO/noJu9218r4+SuQrjDveCekBa94edU1IXzh6JMj0UrW3TDhh17CUo23uS4iFar3344YfYt28f+vXrV3R7v379sHbtWtd9mpqaXLf3qqdUYM9FIqKMqqysLPrxqrBmz56NkpIS3x+viku1f/zjHzj77LMxb948nH766QCAffv24YILLsD111+PI488MpFyEBGRXkTrNID1Wl75hYhenPfFvbKyipAvaMGWOBd0AeIL64LmQPS7L+xcjXH3bnQL8GRDPbcFXbIeDPrNq5ilxV1k6jUT8GsyIqKcu/LKK3HRRRf5bnPEEUegurq606TBe/fuxdatW1FdXe26X3V1Ndra2rBt27aiXh7Nzc2d9vnnP/+JU089FZdeeimuueaawu07duzAa6+9hjfeeKMwV1V7ezs6OjrQtWtX/OUvfynMe0VERMR6Lb+s8C7M3IYyYZzf8WVXrzatd2Hci6DIsM+XGGUxmLSpCAxFFjqJO5hsGVaeSPCX1Hl00bt3b3Tp0gXNzc1Ft7vVO5bq6mqp7VVguEhElHN9+vRBnz7BH2jr6uqwbds2NDQ0YNSoUQCAZcuWob29HWPGjHHdZ9SoUTjooIOwdOlSTJgwAQCwbt06NDY2oq6urrDd6tWrccopp+DCCy/ET37yk6JjVFZW4s033yy67Y477sCyZcvw6KOPYujQoVKPl4iIso31GgFioZ09jHS7L+6ejHGwyh1H+XUKFi1WwGgvm0hw6DZs2m1xlyhzJoqGeX6LtLgt6BKW6GIwQUGl2+NSuYpznoJDEWVlZRg1ahSWLl2Kc845B8D+L6SWLl3aaZEwS11dHZYuXYrvfve7hduWLFlSVE+pxnCRiIiEDB8+HGeccQamTZuGhQsXYs+ePZgxYwbOO++8woqa77//Pk499VQ88MADOPbYY1FVVYWpU6di1qxZ6NWrFyorK/Htb38bdXV1OO644wDsHzJ2yimnYNy4cZg1a1ZhLpAuXbqgT58+KC0txWc+85misvTt2xcVFRWdbiciIhLFei2b7IFaUG/AKKs3e4WXzmMmEVDayxJ0PpHQ1f4YVPSsdHueVfbYjBJ6OgNF5+/2EM0rnLP2cQZu1vbW7VGGSQcFkPb7nOeVEXU16jh6FVrBZZ5Dx1mzZuHCCy/E6NGjceyxx+LWW2/Frl27CqtHT548GYcffnhhUZgrrrgCX/ziF/HLX/4SZ511Fh566CG89tpr+M1vfhNbGTnnIhERCXvwwQdRW1uLU089FWeeeSZOOOGEokpqz549WLduHT766KPCbbfccgu+/OUvY8KECfjCF76A6upqPPbYY4X7H330UWzZsgX/8z//g/79+xd+Pv/5zyf62MhsLUeYPU8NEaWD9Vq2pNHTUNU5VRzHfoyox9Ppccmyh42iwWPYgNLaT5denX5BZlJkejEGbauyR6TJJk6ciPnz52Pu3LkYOXIkVq1ahcWLFxcWbWlsbMS///3vwvbHH388Fi1ahN/85jcYMWIEHn30UTzxxBOxfoHFnotERCSsV69eWLRokef9NTU16Ogo/razoqICCxYswIIFC1z3ue6663DddddJlSPMPkRERE6s10gXKnrwqRwKbcockM4h0W73qziOm/09/Mpch1OrEmWeRLd9o/ZMVC2oN2LV+tZOAWNeezDOmDHDcxj08uXLO932ta99DV/72tdiLtUB7LlIRERERERExtn4Xh/XeRPtt4vsa/3f/rvIud22DfpdpoxhiDwGkedGdFtZ9uHQqo7tDPasVaBFAj/7NmFWj+7xbkfRPn7BnbXys/M2QLynodvxw4SFXvtEDR5VrObsFibmNVA0CXsuEhERUaJ21JSgx0Z9vjUncW3DB6VdBCIiV86FTOy9+LxCLK9efiK9/6LM1+i2n6p5Ca19nEOkZYJTt+OFEdeQaPvz4tbbUHZxlyjcegZ6/R52DkS/32X2Fd0nKGD0O66KORfd9s/bCtEmYs9FSgUbJ0REREREpJI9UDRxpWcTyyxK5XyQMoLCxyhzJaqe1zDNeRLTwjkVs4M9F4lixBCViIiIiCgdosN/vcIulXMYiohr3sUox1W9r6rHKMqt56J9fsW4ezY6+c2hmMQKz3HNt2jNjSjbu1B0e/Za1B97LhIRERFFxC+TiIj0EhRAOedolD2eTMDlN4ehc75Ht/v8jhs0p6PKOROTDuJE5k70uj/M/IlB3OZLtN8WFNzJBHthQsCq9a2+5RE5ZpRtGADmG8NFIiIiIiIiyoSo8xN6HSdqD8Y4V1+2HzvOnpYyQ4hVhHutg9sKP37Hsu63tgl73qDHJ9KrMMp8haK8zqFqiDFDQgqD4SIRERERERFlhn24cxxhm19Q6Hc+Z7mils++v9ciMc7jhzln2DL6hXWyx/Q6lnW7FUK6betXDuc+snMwyiy4omoxlrjnZuQ8iBQGw0UiIiIiCpT20O+WI9jYISJvYUKzsCFh2POFPZfI/s6QUdUCKnEGi37Hjvr82ns9htlXRJoLsHidO2qZRPZ326ZlWHnhRwaDzOxguJhjaX9IT7uRQkRERKRClNVGiUg90VBKJECMcvwonL0bZc6peq5FlWoGbkmlbFm8TgcFgW69KoP2UbHgS9yBIQNJPTFcJIoJw1MionzhdZ+IKH32XnGiIVuYsEt1gCfb09BrGLTI8WXEEQT6DeW2n1f1uf2GPtvnaQw7Z2PQqs3OBWCiiHqcNHtdUjYxXCQiIiIiIqJMsAIp2WDKb0XnsMeR2Ub0/EErRIc5ZhAVIZ89sEuyZ6VMaCi7CI3faswqg8Q46Fy2IFxwRk8MF4kyKu1h70RElB1Z7ZW5o4Y9N4iyQkVg5RfOOalYPVo0KJRdudp+v9s50hwyHfdiO0DnENEZGnr9P46h084QL2yPQb/juAWFXreJhIoM7yiMrmkXIOtaB7eF7ladB23DB6Fszaa0i6FcVhthREQ6azmiHFUb+IGYzJPE/G1E5M7t/Re04EiYcM5rKLDIvI5u//crt/P/zkVe0pj3MMk5D+3ncmuPu5UlTPlUDC0WPYbfkOug4djOc/V4t0P5sOiq9a2cCzHn2HPREPxmnYiISH/8comISH8qVmdWvb2q1Z1lxdmDUBcywWHQtjJhYFRRjqEyPBQ5ll+wyNAxHxguEhEREREREUlQHcrJzLkYtI0bZ1mzHii6Ee2xqKqXZdDQZR2pCCWdw6q9hlkzdMwWhouUOvbyICIi0hfraSIylQm98uxzIrrNleg1jFrmcSXxHMieI8lFXQB1gaFsSGiFdaqHIYddMEankJNzO2YLw0UixbLcCFM1PD/JOVeIiJKW5XogLVykjIhEhQnfZIVdiVpkP79yR3lMXou6uJVJNpTVPcC1y3s7xD7vopse73Z06lEoE0gyMMwvhosBTLpQhsEP60RElAbOJWwGBqVEpDO3ECzOFZ7djuP8v1cwZy+XX3i38b0+RceJo8xBZfXax36b2/5x9xRNsm0edoGXOOdJdN4f9lyqe1HaxT3UuWVYOYdTa4rhImkhK40XXR4HQ2Miikvev/EnIiIzefVoTHrVZL+AzAoW06Cyp2LSjyFqECvz2SbOYE6GbDmSDCadAaBIGOjcngGieRguEhERUWbo8uWKLl82ERHlkciCKGkJOn9aZU/7eYki7CI3YYSds1CnuQ6B+B+HfXi031Bp6z4OpzYfw0XShukNMdPLT0REZMd6jYh057coiHNBFOf/VZzbYvWYkzl+3EGYaBnChJlBt8f12KIEr+WNZUX/ut0XdFsQZ/AWdtGVuOlYJlFV61sZRGqK4SIRERFRDBjOERHpT+UiKar2EwnRgo4hsvK01/lEtnU7Zs3ALVr3gPQKDFsHtxXdFyZYFOUX7MmGfjLbO7f1G96sW3jHYdJmYLhIWmFDjERkfaElIqK06VQfxzXUnYsKEWVXUp8VReYe1O1za1DQmGVBcytGDRV3DCkpCvGizouoenuT6BZwUjCGi6TN/FQm06kRRkRE+mD9QEREYXiFf14L05A/K1h09lIEkEivRZEgUIfhyjuGlETuJRg1GGSwaCaGiwbJyzfspjXEdCsvw2IiIopCt3qNiChOqudfdDteGkFgUDhp/11V+UzsDWmFifbwUWb16Kh0CBRlmVhmih/DRSISkpdwmyjr8tDTQbcvWUwK60wqqy6SbIQSkZikQy6RgC5M/Rtl+LLb+fx6PUYJGU0KFZ09E+1houz13G0BlzipOn7cw6ndej569YYU6SXJRVzMwHCRtGRK48aUchIR6ShPX1qwvqC4nFa9Nu0iEOWWzGrLUQK4JOZIdC7M4hU0et2eRMCospdlEsOf3cJAt2DP2k4m9MtC70Eu0pItDBcTwG+0w9G9IaZ7+YiIiGToWK/p1guViMiNPfxLaoRAmDDPbaXpMAFo2qMgVJzf3kYvbywLNe+iLmFgmFWmvfbp8W5HLL0E2fMw+xguEgB+eCciIoqbjuGdReeyERHpytmTzi30iqvXoaohzGGHa6vmDPiCqA447WGjys5BIgGktU3YADLMMGe/fXTsUWgvk47lI4aLpDldGzu6lsuEkJg9eYkoCbpeD3WtP4iISFxQQGef2zCtXn5eZfQqk/02kUBUl8clI66h0JYdQ0qKAkJ7gBc1QHQeL4q451ykfGK4SNrTrSGmW3mIiMgsutUjupUnCXma75OIvJm0EEkUbgu5OMNBtzDSqyem1zHiFvbv5ewV6ezsELbzQ5igMEqwl8Q8i6qCR5FFXWSGStu35RBrPTFcNExePwzr0vDRpRxERGliD+TodKlPdCkHEZEqooHXxvf6hO5ZGLSoiXVs+/ZuvRvjDOeiPK6gsqdNdqi5fUVomX3cuPVG9LpfhEyPxqBz68wKFkWGN7cMK+fQZwPlIlzkKnpidB1CZkm7AZT2+dOU11CbiChOadcraZ8/iO6fS4hIP27hWNznkrkvrvKdVr02cptXpmwy5feal9J5e5gAMOhcTjp/ORo1LAzaP2gVa5XnCuIWHrqFj37bk35yES5SdqTVENK9AQawEUZEZorzywsTrous14iISIRuvQdlBS18Q8lJo9dj2KHMIsOrSQ8MF8k4STeI2AAjIqI4sV7LNzayidSRHS4bZc5Fv3MF3S573qDrxJKmWixpqvXdJuicMmWzHnuYbeNaPdvv2LIrUfuJ2uvPub/1e9zzKao8fo93OwKP5xYmVq1vLfpx297rftJfqHBxwYIFqKmpQUVFBcaMGYOVK1cK7ffQQw+hpKQE55xzTpjTEhW0DR+USOOIDTCifGC9RmlLqk4zpV4zodcpka5Yp4lREez7HcMvQLP2Ew3Z4grjnOWIch7ZYeJRQkZr+LPM39AaEi06NNorjIyj159bUCd6m8h9gPpyO48XZcEVmZ6I7LWoL+lw8eGHH8asWbMwb948vP766xgxYgTGjRuHzZs3++63ceNGfO9738OJJ54YurBpydM3yqZ9mI+rkWRSA4yIosljvUZ6irPuYZ12gMqh+DrP30X5xDpNTs3ALZECLufvqucrVEm0bEHzRfrd57aN6nkmwxwnzLXabw7IKNd+Zyi3Y0hJ4Ud237S4lcNvoRbnnIl+cy4G3Ub6kg4Xb775ZkybNg1TpkzBUUcdhYULF+Lggw/GPffc47nPvn37MGnSJFx//fU44ogjAs/R2tqK7du3F/2YTuWHTy6uUUxlY8zUUNG0UJhIJ3HXa1ms00xi4vWR9RoRhcW22n4ygaHKsC/MUGkvzqDPub/q3oyiz0NQiBq0krbocbx4Pe4wvRmjiPvLJV2CxDgE9WzkAi5mkgoX29ra0NDQgPr6+gMHKC1FfX09VqxY4bnfj370I/Tt2xdTp04VOs+NN96Iqqqqws+gQfxQTMGiNKDY+PKWtTCbq8eTXRL1Gus0Cov1GhHJYFstGlVhndcQYOf/RYZNy55HR3EN6Y772BalnYQyEBiKPgav3okMDbOrq8zGH374Ifbt24d+/foV3d6vXz+sXeveYP/b3/6Gu+++G6tWrRI+z5w5czBr1qzC79u3b89MpWWCliPKUbXB3AlU3RpTZWs2BW5D8VNROZvyQYrMkES9xjot2I6aEvTYGO9E5iZz1llZr9NM7G1KpAO21cLZ+F4fZT3e/IYUuwWMUVjlVnEc2e389nG7T3UIGPUc5Y1lkedeDKPHux1SAaNze9n94+BXhqr1rYXw0GvBFsouqXBR1o4dO/CNb3wDd911F3r37i28X3l5OcrL+cGS1Mlaw8uOjTCi5ISp17Jap7UOblP6gTtOpn9p5pTlOo2IkpP3tlrUwMsv3HObyzHK/I6quJVZNqBUFR6K7mN91lDVg1BVsOh1n8oA0BksRmEvVxwhpT1YdLtPZnsyk1S42Lt3b3Tp0gXNzc1Ftzc3N6O6urrT9uvXr8fGjRsxfvz4wm3t7e37T9y1K9atW4dhw4aFKTcREVFkea3XdGjgEBGRWnmt01RQ0QtQ5BheoaO1v+yxZKleVMVeZq/5IWVXxnZSPbehiuP5hY6yoZ1o0LdjSEmkgNF+DtkyhgkiW4aVF4WK9iDRrxejfT+Gj2aRmnOxrKwMo0aNwtKlSwu3tbe3Y+nSpairq+u0fW1tLd58802sWrWq8POVr3wFJ598MlatWmV09/m0xT0PHnvDEVEemFqvce5Qyqq4P39kbR5hIjtT6zRdhFlwxb5vGlP3WAvIJPGFIacmil/aQ56jUBkEMlQ0k/Sw6FmzZuHCCy/E6NGjceyxx+LWW2/Frl27MGXKFADA5MmTcfjhh+PGG29ERUUFPvOZzxTt37NnTwDodDsRyWMjjCg61mv5kLWh0UREblinRRM2JBTdJ875CMOU3asXZdC2Mo8jreA1KtVTv4j0OvSbY1HlsOgk9hWZc9FvaLTVg5FBozmkw8WJEydiy5YtmDt3LpqamjBy5EgsXry4MHFwY2MjSkulOkQSERGlhvWaHrioC5lG9VA9IhVYp4kPw7Vv5zU02b5dVLIhon2hGZlFV6KU1+08MitXh90/aSLzLlr3qwoZwwxrdg5ljhowpsVtqLNz8ReGiOYLtaDLjBkzMGPGDNf7li9f7rvvfffdF+aUmWDS5PcAe3nojkPXidRhvUaUPtZrRGrkqU5zhlr2ICvM/MJRFzsJOrZbOdOeA1kmjHWGl349H3Vc0MYi8+VQ3G14lYu/xBU+hp1zEYDn/In2353zM7ptQ/rL9tdWRKQN9vDIhq1bt2LSpEmorKxEz549MXXqVOzcudN3n927d2P69Ok47LDD0L17d0yYMKFosvn//Oc/OOOMMzBgwACUl5dj0KBBmDFjBrZv317Y5rHHHsNpp52GPn36oLKyEnV1dfjzn/8c2+OkbGJ4lW+c6oPcsF4zm3O+waChu2nSuWwWZzjrFhaGLXuY/XTomKNDGdw4g0RTezWSWmHqtKamJnzjG99AdXU1DjnkEHzuc5/DH/7wB+lzM1w0GD8kE1HSJk2ahNWrV2PJkiV46qmn8Pzzz+PSSy/13WfmzJl48skn8cgjj+C5557DBx98gHPPPbdwf2lpKc4++2z86U9/wltvvYX77rsPf/3rX3HZZZcVtnn++edx2mmn4ZlnnkFDQwNOPvlkjB8/Hm+88UZsj5WC8UsDUiWvwa+OwwXzhvVa9ogucGLfzmthFJlATGZbqxeffehzUBmd5wnaN6h8Xr0OvUJFv3L5PY9RglSRzxki4V/YgNBrvzCff8KEf3EFhrLHVVWOqvWtRT/224O2ITFh6rTJkydj3bp1+NOf/oQ333wT5557Lr7+9a9L10ehhkVTfnBotJ6SaIQxvCanNWvWYPHixXj11VcxevRoAMCvf/1rnHnmmZg/fz4GDBjQaZ+WlhbcfffdWLRoEU455RQAwL333ovhw4fj5ZdfxnHHHYdDDz0Ul19+eWGfIUOG4Fvf+hZ+8YtfFG679dZbi47705/+FH/84x/x5JNP4rOf/WwMj5ayivUaEVlYr2WXyBBct+HAYYdVi8x16BxWLLK9s3xu94uKMuQ7aC7FoEDX+Rwn3XMzji9DZYdLew0tjrLQSlJUlc9v+DOHRUcXpk4DgJdeegl33nknjj32WADANddcg1tuuQUNDQ1S9RF7LgriN8tEZJrt27cX/bS2RgtUVqxYgZ49exYqKwCor69HaWkpXnnlFdd9GhoasGfPHtTX1xduq62txeDBg7FixQrXfT744AM89thj+OIXv+hZlvb2duzYsQO9evUK+WhIR/xSg4i8qK7TANZrWeQMB0W2E9le5rxhzyF6fq/jyvRilOF2XJnH5rW/qvKaPorCuWiLDFU9CpMMN1uGlRd+nLc7twk6jul0aKsBwPHHH4+HH34YW7duRXt7Ox566CHs3r0bJ510ktT52XORArGXh17yOnQsq3o0dqBLmdohD/va9h9v0KBBRbfPmzcP1113XejjNjU1oW/fvkW3de3aFb169UJTU5PnPmVlZejZs2fR7f369eu0z/nnn48//vGP+PjjjzF+/Hj89re/9SzL/PnzsXPnTnz9618P92CISBus17LDpDoNYL2WNc4egUE96USDSJX8VqBW3Zsv6srRTvYeh17Pn8wQ7Sx13lG9srQXZwiYldWk7XQLDXtsMqdeC1OnAcDvf/97TJw4EYcddhi6du2Kgw8+GI8//jg+8YlPSJ2fPRcTpvqbFfbyoDzJ0oeQJGzatAktLS2Fnzlz5rhuN3v2bJSUlPj+rF27Nvby3nLLLXj99dfxxz/+EevXr8esWbNct1u0aBGuv/56/P73v+9UgRKJYJiVP6o/L5neU8ZEonUawHqNDoj62THNz57OIDLqMGYV+8oMhfbaV9fFbJx0W8hFJDgU7YEYpaei7kO4TaJLW+3aa6/Ftm3b8Ne//hWvvfYaZs2aha9//et48803pY7DnoskhL0X84WhdTZUVlaisrIycLsrr7wSF110ke82RxxxBKqrq7F58+ai2/fu3YutW7eiurradb/q6mq0tbVh27ZtRb08mpubO+1TXV2N6upq1NbWolevXjjxxBNx7bXXon///oVtHnroIVxyySV45JFHioakkbw05jwicmLQS6JE6zSA9VpeefWGE6nv3PZV3bvOuciJ11BjkfkN/coVtW5PIlBl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u7tLTk6Oo1poEqV9rl+/XjQajfzwww9y584d0ygrK3NUC02itM+62srdx0SU93rr1i3p0KGDvPvuu5KXlycHDhyQrl27yscff+yoFppEaZ96vV46dOgge/bskfz8fDl06JD07t1bpk+f7qgWmqSsrEyysrIkKytLAMjGjRslKytLbt68KSIiCQkJEh0dbVqfn58vnp6esmzZMsnNzZXNmzeLq6urpKenO6oFagXUkmkizDVnyzW1ZJoIc425RkqoJdfUkmkizDVnyzVmGjOtNWgVm4siIklJSRIcHCwajUaGDx8uZ86cMT02ZswYmTt3rtn6vXv3Sp8+fUSj0Uj//v3l4MGDdq7YOkr67NGjhwCoN/R6vf0LV0jp1/Pf2kpYPaG011OnTklERIRotVrp1auXfPLJJ1JTU2PnqpVT0md1dbWsXr1aevfuLTqdToKCgiQ2Nlbu379v/8IVOHr0qMWfuSe9zZ07V8aMGVPvmMGDB4tGo5FevXrJzp077V43tT5qyTQR5pqIc+WaWjJNhLkmwlyjplNLrqkl00SYayLOlWvMNGaao7mIONF1r0RERERERERERGQ3Dn/PRSIiIiIiIiIiImqbuLlIREREREREREREVuHmIhEREREREREREVmFm4tERERERERERERkFW4uEhERERERERERkVW4uUhERERERERERERW4eYiERERERERERERWYWbi0RERERERERERGQVbi4SERERERERERGRVbi5SERERERERERERFbh5iIRERERERERERFZ5f8AwxtQjNlRnSEAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plotter.plot(pinn_learn)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "55497e4e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABR0AAAH5CAYAAAAMZpltAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAADGCklEQVR4nOzdd5hU1f3H8fedvr2zy8LSe+/YEEEQRbHHGmuCxm5QE00ithRjif6MRg0RsUaj2AtSLAgqCLoI0mHp25ftZWZn5vfH3ZmdrSywsLB8Xs+zz8zccu65k71EPnzPOYbf7/cjIiIiIiIiIiIi0kosbd0BERERERERERERaV8UOoqIiIiIiIiIiEirUugoIiIiIiIiIiIirUqho4iIiIiIiIiIiLQqhY4iIiIiIiIiIiLSqhQ6ioiIiIiIiIiISKtS6CgiIiIiIiIiIiKtytbWHThcfD4fe/bsISoqCsMw2ro7IiIiIiIiIiIiRxW/309JSQmpqalYLM3XMh4zoeOePXtIS0tr626IiIiIiIiIiIgc1Xbu3Ennzp2bPeaYCR2joqIA80uJjo5u494cGh6Ph/nz53Paaadht9vbujsixxw9gyJtT8+hSNvSMyjStvQMirS99v4cFhcXk5aWFszZmnPMhI6BIdXR0dHtOnQMDw8nOjq6Xf5iixzp9AyKtD09hyJtS8+gSNvSMyjS9o6V57AlUxdqIRkRERERERERERFpVQodRUREREREREREpFUpdBQREREREREREZFWdczM6SgiIiIiIiIicih4vV48Hk9bd0OOAB6PB5vNRmVlJV6vt627c0AcDgcWy8HXKSp0FBERERERERE5AH6/n6ysLAoLC9u6K3KE8Pv9pKSksHPnzhYttnIkslgsdO/eHYfDcVDtKHQUERERERERETkAgcCxQ4cOhIeHH7Uhk7Qen89HaWkpkZGRrVIteLj5fD727NlDZmYmXbp0OajfaYWOIiIiIiIiIiL7yev1BgPHhISEtu6OHCF8Ph9utxuXy3VUho4ASUlJ7Nmzh+rqaux2+wG3c3TevYiIiIiIiIhIGwrM4RgeHt7GPRFpXYFh1Qc7J6VCRxERERERERGRA6Qh1dLetNbv9FEVOp533nnExcVx4YUXtnVXREREREREREREpAlHVeh422238fLLL7d1N0RERERERERERKQZR1XoeMoppxAVFdXW3RARERERERERkVaybds2DMMgPT39qGpbmtdqoePixYuZNm0aqampGIbBe++91+CYZ555hm7duuFyuRg7dizLly9vrcuLiIiIiIiIiEgL5ebmcsMNN9ClSxecTicpKSlMmTKFpUuXAjSZ7Yi0lK21GiorK2Po0KFce+21nH/++Q32v/nmm8yYMYPnnnuOsWPH8uSTTzJlyhQ2bNhAhw4dABg2bBjV1dUNzp0/fz6pqan71Z+qqiqqqqqCn4uLiwFzdanAClPtTeC+2uv9iRzp9AyKtD09hyJtS8+gSNvSM3h4eTwe/H4/Pp8Pn8/X1t3ZbxdccAFut5sXX3yRHj16kJ2dzeeff05ubm7wfg7XvbXG9dxud3DV5dZue3/4/f7g69H4ewHmd+X3+/F4PFit1jr79ufPl1YLHc844wzOOOOMJvf/4x//YPr06VxzzTUAPPfcc3z88cfMnj2bu+++G6BVS13/9re/8cADDzTYPn/+/Ha/nP2CBQvaugsixzQ9gyJtT8+hSNvSMyjStvQMHh42m42UlBRKS0txu92AGTRVetomaHLZLS1edbioqIivv/6ajz76iJEjRwIQFxdHv379AOjWrRtgBpMAaWlp/PTTT2RkZPDHP/6RFStWUF5eTp8+fZg5cyannHJKsO0hQ4Zw1VVXkZGRwfvvv09MTAx33nknV199dfCYlStX8tvf/paNGzfSv39/7rjjDsAsaCsuLsbr9XL77bezePFicnJy6Ny5M7/61a/4zW9+E2zjxhtvpKioiOHDh/PCCy/gcDhYtWrVPts+XEpKSg7btVqb2+2moqKCxYsXNygOLC8vb3E7rRY6NsftdrNy5Uruueee4DaLxcKkSZP49ttvD8k177nnHmbMmBH8XFxcTFpaGqeddhrR0dGH5JptzePxsGDBAiZPnozdbm/r7ogcc/QMirQ9PYcibUvPoEjb0jN4eFVWVrJz504iIyNxuVwAlLurGf73tgl919w/mXBHy2Ke8PBwIiMjWbBgARMnTsTpdNbZ//3335OSksILL7zA6aefjtVqDWYp06ZN4+GHH8bpdPLKK69w6aWXsm7dOrp06QKYec+//vUvHnzwQWbOnMncuXO54447mDJlCn379qW0tJRLL72USZMm8dprr5GRkcFvf/tbACIiIoiOjsbj8dC9e3duueUWEhIS+Oabb/jNb35Dt27duOiiiwCw2+0sXryY+Ph45s+fH7z2vto+1Px+PyUlJURFRbU4BD7SVFZWEhYWxsknnxz83Q7Yn+D2sISOeXl5eL1ekpOT62xPTk5m/fr1LW5n0qRJrFq1irKyMjp37sxbb73F8ccf3+ixTqezwUMD5i9le//D91i4R5EjmZ5Bkban51CkbekZFGlbegYPD6/Xi2EYWCwWLBZzyYzAa1sI7ce+OBwO5syZw/Tp03n++ecZMWIE48eP55JLLmHIkCHB/CY+Pr7OdHfDhw9n+PDhwc9//vOfee+99/joo4+4+eabg9unTp3KTTfdBMDdd9/Nk08+yVdffUX//v1544038Pl8zJ49G5fLxeDBg9mzZw833HBD8B6cTicPPvhgsL2ePXuybNky3n77bS655BLAnHMyIiIiWOUI8O9//3ufbR9qgSHVgd+No5HFYlbNNvZnyf782XJYQsfWsnDhwrbuwhHro5/2MGdpBgleC1PbujMiIiIiIiIix6Awu5W1D05ps2vvjwsuuIAzzzyTr7/+mu+++45PP/2URx55hP/85z91hkKHKi0t5f777+fjjz8mMzOT6upqKioq2LFjR53jhgwZEnxvGAYpKSnk5OQAsG7dOoYMGVKngq6xgrJnnnmG2bNns2PHDioqKnC73QwbNqzOMYMHD64zj2NL25bD47CEjomJiVitVrKzs+tsz87OJiUl5XB0od0rLPewYnshg+PauiciIiIiIiIixybDMFo8xPlI4HK5mDx5MpMnT+bee+/l17/+Nffdd1+ToeOdd97JggULeOyxx+jVqxdhYWFceOGFwTktA+pXwxmGsV+LqrzxxhvceeedPP744xx//PFERUXx6KOPsmzZsjrHRUREtLhNOfwOS52nw+Fg5MiRLFq0KLjN5/OxaNEiJc6tJCnKHEpe7Dk65wsQERERERERkbY1YMAAysrKADM49Hq9dfYvXbqUq6++mvPOO4/BgweTkpLCtm3b9usa/fv356effqKysjK47bvvvmtwnRNOOIEbb7yR4cOH06tXL7Zs2dIqbcvh02qhY2lpKenp6cEVqDMyMkhPTw+W2M6YMYNZs2bx0ksvsW7dOm644QbKysqCq1nLwekQCB3d+zhQRERERERERI5p+fn5TJw4kVdffTW4KvVbb73FI488wjnnnAOYK1gvWrSIrKws9u7dC0Dv3r155513SE9PZ9WqVVx22WX7VcEIcNlll2EYBtOnT2ft2rV88sknPPbYY3WO6d27NytWrOCzzz5j48aN3HvvvXz//fet0rYcPq0WOq5YsaLOhKIzZsxg+PDhzJw5E4CLL76Yxx57jJkzZzJs2DDS09OZN29eg8Vl5MB0iDbnKyj2mCsliYiIiIiIiIg0JjIykrFjx/LEE09w8sknM2jQIO69916mT5/O008/DcDjjz/OggULSEtLC2Y9//jHP4iLi+OEE05g2rRpTJkyhREjRuz3tT/88ENWr17N8OHD+eMf/8jf//73Osdcf/31nH/++Vx88cWMHTuW/Px8brzxxlZpWw4fw3+MJFTFxcXExMRQVFR0WJZIP9yqqr30/dM8AJbfcwodYjSvgcjh5vF4+OSTT5g6dapWCxRpI3oORdqWnkGRtqVn8PCqrKwkIyOD7t2711m4RI5tPp+P4uJioqOjj9rVq5v73d6ffO3ovHtpwGmzEhtm/p9KXonGWIuIiIiIiIiISNtR6NiOJEaay8TnlFa1cU9ERERERERERORYptCxHQksJpNXotBRRERERERERETajkLHdiSpJnRUpaOIiIiIiIiIiLQlhY7tSGB4da7mdBQRERERERERkTak0LEdCQyvztXwahERERERERERaUMKHduRwPDqXA2vFhERERERERGRNqTQsR2JCzeHVxeVe9q4JyIiIiIiIiIicixT6NiORDitAJRWVbdxT0RERERERERETHPmzCE2NratuyGHmULHdiTSaQOgzO1t456IiIiIiIiIyJEqNzeXG264gS5duuB0OklJSWHKlCksXbo0eIxhGLz33nv73Xa3bt148skn62y7+OKL2bhx4wH3d86cORiG0eDnP//5zwG3GWrbtm0YhkF6enqrtCcmW1t3QFpPIHQsrarG7/djGEYb90hEREREREREjjQXXHABbrebl156iR49epCdnc2iRYvIz88/JNcLCwsjLCzsoNqIjo5mw4YNdbbFxMQcVJuHgtvtbusuHDFU6diOBEJHj9dPVbWvjXsjIiIiIiIiIkeawsJCvv76a/7+978zYcIEunbtypgxY7jnnns4++yzAbNaEeC8887DMIzg5y1btnDOOeeQnJxMZGQko0ePZuHChcG2TznlFLZv385vf/vbYDUiND68+sMPP2T06NG4XC4SExM577zzmu23YRikpKTU+QkEmWvWrOGMM84gMjKS5ORkrrjiCvLy8oLnzps3j5NOOonY2FgSEhI466yz2LJlS3B/9+7dARg+fDiGYXDKKacE7+f222+v049zzz2Xq6++Ovi5W7duPPTQQ1x55ZVER0dz/fXXA7BkyRLGjRtHWFgYaWlp3HrrrZSVlQXP+9e//kXv3r1xuVwkJydz4YUXNnv/RyOFju1IhMMafK95HUVEREREREQOM78f3GVt8+P3t6iLkZGRREZG8t5771FVVdXoMd9//z0AL774IpmZmcHPpaWlTJ06lUWLFvHjjz9y+umnM23aNHbs2AHAO++8Q+fOnXnwwQfJzMwkMzOz0fY//vhjzjvvPKZOncqPP/7IokWLGDNmzP5+24AZok6cOJHhw4ezYsUK5s2bR3Z2NhdddFHwmLKyMmbMmMGKFStYtGgRFouF8847D5/PLNhavnw5AAsXLiQzM5N33nlnv/rw2GOPMXToUH788Uf+9Kc/kZGRwdSpU7ngggv46aefePPNN1myZAk333wzACtWrODWW2/lwQcfZMOGDcybN4+TTz75gO7/SKbh1e2IxWLgtPip8hmUVVWTGOls6y6JiIiIiIiIHDs85fDX1La59h/2gCNin4fZbDbmzJnD9OnTee655xgxYgTjx4/nkksuYciQIQAkJSUBEBsbS0pKSvDcoUOHMnTo0ODnhx56iHfffZcPPviAm2++mfj4eKxWK1FRUXXOq+8vf/kLl1xyCQ888ECdtptTVFREZGRk8HNkZCRZWVk8/fTTDB8+nL/+9a/BfbNnzyYtLY2NGzfSp08fLrjggjptzZ49m6SkJNauXcugQYOC95uQkNBsv5syceJE7rjjDgB8Ph9XX301l112WbBKsnfv3jz11FOMHz+eZ599lh07dhAREcFZZ51FVFQUXbt2Zfjw4ft93SOdKh3bix9fw/bMKO6zvQRASaUqHUVERERERESkoQsuuIA9e/bwwQcfcPrpp/Pll18yYsQI5syZ0+x5paWl3HnnnfTv35/Y2FgiIyNZt25dsNKxpdLT0zn11FP365yoqCjS09ODP9988w0Aq1at4osvvghWcEZGRtKvXz+A4BDqTZs2cemll9KjRw+io6ODw8X3t99NGTVqVJ3Pa9as4aWXXqrTpylTpuDz+cjIyGDy5Ml07dqV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8JfFJcHtRs5a8HkBSAiEjqU1lY4FzVc6bmlBpSOYv/B/Ou5PjOgwghJPCb9f/Hs83iMzaRcRERERERE5FPx+P+We8jb5aa01FgoLC5k4cSLDhw9nxYoVzJs3j+zsbC666KLgMWVlZcyYMYMVK1awaNEiLBYL5513Hj5f3cVo7777bm677TbWrVvHlClTAPjiiy/YsmULX3zxBS+99BJz5sxhzpw5wXM8Hg8PPfQQq1at4r333mPbtm3BQC7UXXfdxeOPP873339PUlIS06ZNa7Li7+uvv+bKK6/ktttuY+3atTz//PPMmTMnGNbtry1btnD66adzwQUX8NNPP/Hmm2+yZMkSbr755hbdR1paGnPnzgVgw4YNZGZm8n//93/71Yf777+f8847j9WrV3Pttdfu8x7nzp3LE088wfPPP8+mTZt47733GDx48AHdf0vZDmnrclh9SyUVFgtJbhujKqso9buw4CfcUw75myGpLwmRTuxU02/xTbC9J5kFpwKQFle/0tEMHbfmljW4TlMcVgePjn+U8z84n3UF63gm/RluH3l7q92fiIiIiIiIyJGsorqCsa+PbZNrL7tsGeH28H0fuA9PP/00w4cP569//Wtw2+zZs0lLS2Pjxo306dOHCy64oM45s2fPJikpibVr1zJo0KDg9ttvv53zzz+/zrFxcXE8/fTTWK1W+vXrx5lnnsmiRYuYPn06ANdee23w2B49evDUU08xevRoSktLiYyMDO677777mDx5MgAvvfQSnTt35t13360TjgY88MAD3H333Vx11VXBdh966CF+97vfcd999zX5XaxevbrONQcMGMDy5cv529/+xuWXX87tt98OQO/evXnqqacYP348zzzzTPA+LBZLk/cRHx8PQIcOHQ5o0ZvLLruMa665Jvj52muvbfYed+zYQUpKCpMmTcJut9OlSxfGjBmz39fdH6p0bEfWUQVAvwoLBlBCOJvpbO7M2wSYw6vHWX4iLWsBLHuO31TNDm4P1TE2DICSqmrK3c2XG4fqEN6B+4+/HzAXlvk+6/uDuCMREREREREROZxWrVrFF198QWRkZPCnX79+AMEh1Js2beLSSy+lR48eREdH061bNwB27NhRp61Ro0Y1aH/gwIFYrdbg544dO9YZPr1y5UqmTZtGly5diIqKYvz48Y22ffzxxwffx8fH07dvX9at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YMGCCtt9teY2btyoSy+9VCEhIerYsaOeeuqpxj60JkXp6Afmz5+vtLQ0TZs2TevWrVNSUpJGjRqlI0eOmB0NaPG++uor3Xvvvfr222+Vnp4up9OpkSNHqqCgwDvn97//vT766CO98847+uqrr3To0CGNGzfOu93tduvaa69VSUmJvvnmG7322muaN2+epk6dasYhAS3Wd999p3/+85/q169fhXHWINC4Tp48qWHDhslut+uzzz7T1q1b9be//U2tW7f2znnqqaf097//XXPmzNGqVasUHh6uUaNG6fTp0945t9xyi7Zs2aL09HR9/PHHWrZsme6++24zDgloUf7617/qxRdf1KxZs7Rt2zb99a9/1VNPPaV//OMf3jmsQcC3CgoKlJSUpNmzZ1e53RdrLi8vTyNHjlTnzp21du1azZw5U48++qheeumlRj++JmOgxRs6dKhx7733el+73W4jISHBmDFjhompAP905MgRQ5Lx1VdfGYZhGDk5OYbdbjfeeecd75xt27YZkoyVK1cahmEYn376qWG1Wo2srCzvnBdffNGIiooyiouLm/YAgBbq1KlTRo8ePYz09HTj8ssvNyZNmmQYBmsQaAoPPfSQcckll1S73ePxGPHx8cbMmTO9Yzk5OYbD4TDeeustwzAMY+vWrYYk47vvvvPO+eyzzwyLxWJkZmY2XnjAD1x77bXGb37zmwpj48aNM2655RbDMFiDQGOTZLz//vve175acy+88ILRunXrCv8efeihh4wLLrigkY+o6XCmYwtXUlKitWvXKjU11TtmtVqVmpqqlStXmpgM8E+5ubmSpDZt2kiS1q5dK6fTWWEN9uzZU506dfKuwZUrV6pv376Ki4vzzhk1apTy8vK0ZcuWJkwPtFz33nuvrr322gprTWINAk3hww8/1ODBg3XjjTcqNjZWAwYM0Ny5c73b9+7dq6ysrArrMDo6WsnJyRXWYatWrTR48GDvnNTUVFmtVq1atarpDgZogS6++GItXrxYO3fulCRt2LBBK1as0OjRoyWxBoGm5qs1t3LlSl122WUKDg72zhk1apR27NihkydPNtHRNK4gswOgYY4dOya3213hBylJiouL0/bt201KBfgnj8ejBx54QMOGDVOfPn0kSVlZWQoODlarVq0qzI2Li1NWVpZ3TlVrtGwbgJq9/fbbWrdunb777rtK21iDQOP7/vvv9eKLLyotLU1/+tOf9N133+n+++9XcHCwxo8f711HVa2z8uswNja2wvagoCC1adOGdQicw+TJk5WXl6eePXvKZrPJ7XbriSee0C233CJJrEGgiflqzWVlZalr166V9lG2rfxtTFoqSkcAqKV7771Xmzdv1ooVK8yOAgSMAwcOaNKkSUpPT1dISIjZcYCA5PF4NHjwYE2fPl2SNGDAAG3evFlz5szR+PHjTU4H+L///ve/+s9//qM333xTvXv3VkZGhh544AElJCSwBgE0a1xe3cLFxMTIZrNVekpndna24uPjTUoF+J+JEyfq448/1pdffqkOHTp4x+Pj41VSUqKcnJwK88uvwfj4+CrXaNk2ANVbu3atjhw5ooEDByooKEhBQUH66quv9Pe//11BQUGKi4tjDQKNrH379urVq1eFsQsvvFD79++X9OM6qunfo/Hx8ZUecuhyuXTixAnWIXAODz74oCZPnqxf/OIX6tu3r2699Vb9/ve/14wZMySxBoGm5qs1Fwj/RqV0bOGCg4M1aNAgLV682Dvm8Xi0ePFipaSkmJgM8A+GYWjixIl6//33tWTJkkqnvw8aNEh2u73CGtyxY4f279/vXYMpKSnatGlThb900tPTFRUVVemHOAAVXXnlldq0aZMyMjK8X4MHD9Ytt9zi/T1rEGhcw4YN044dOyqM7dy5U507d5Ykde3aVfHx8RXWYV5enlatWlVhHebk5Gjt2rXeOUuWLJHH41FycnITHAXQchUWFspqrfiju81mk8fjkcQaBJqar9ZcSkqKli1bJqfT6Z2Tnp6uCy64wC8urZbE06v9wdtvv204HA5j3rx5xtatW427777baNWqVYWndAKonwkTJhjR0dHG0qVLjcOHD3u/CgsLvXN+97vfGZ06dTKWLFlirFmzxkhJSTFSUlK8210ul9GnTx9j5MiRRkZGhrFw4UKjXbt2xpQpU8w4JKDFK//0asNgDQKNbfXq1UZQUJDxxBNPGLt27TL+85//GGFhYcYbb7zhnfPkk08arVq1Mj744ANj48aNxnXXXWd07drVKCoq8s65+uqrjQEDBhirVq0yVqxYYfTo0cO4+eabzTgkoEUZP368kZiYaHz88cfG3r17jffee8+IiYkx/vjHP3rnsAYB3zp16pSxfv16Y/369YYk45lnnjHWr19v7Nu3zzAM36y5nJwcIy4uzrj11luNzZs3G2+//bYRFhZm/POf/2zy420slI5+4h//+IfRqVMnIzg42Bg6dKjx7bffmh0J8AuSqvx69dVXvXOKioqMe+65x2jdurURFhZmjB071jh8+HCF/fzwww/G6NGjjdDQUCMmJsb4wx/+YDidziY+GsA/nF06sgaBxvfRRx8Zffr0MRwOh9GzZ0/jpZdeqrDd4/EYjzzyiBEXF2c4HA7jyiuvNHbs2FFhzvHjx42bb77ZiIiIMKKioozbb7/dOHXqVFMeBtAi5eXlGZMmTTI6depkhISEGN26dTMefvhho7i42DuHNQj41pdfflnlz4Hjx483DMN3a27Dhg3GJZdcYjgcDiMxMdF48sknm+oQm4TFMAzDnHMsAQAAAAAAAPgj7ukIAAAAAAAAwKcoHQEAAAAAAAD4FKUjAAAAAAAAAJ+idAQAAAAAAADgU5SOAAAAAAAAAHyK0hEAAAAAAACAT1E6AgAAAAAAAPApSkcAAAAAAAAAPkXpCAAAAAAAAMCnKB0BAAAAAAAA+BSlIwAAAAAAAACf+v8S4De+3tR7mgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure(figsize=(16, 6))\n", + "plotter.plot_loss(pinn, label='Standard')\n", + "plotter.plot_loss(pinn_feat, label='Static Features')\n", + "plotter.plot_loss(pinn_learn, label='Learnable Features')\n", + "\n", + "plt.grid()\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tutorials/tutorial2/tutorial.py b/tutorials/tutorial2/tutorial.py new file mode 100644 index 0000000..ecf5942 --- /dev/null +++ b/tutorials/tutorial2/tutorial.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python +# coding: utf-8 + +# # Tutorial 2: resolution of Poisson problem and usage of extra-features + +# ### The problem definition + +# This tutorial presents how to solve with Physics-Informed Neural Networks a 2D Poisson problem with Dirichlet boundary conditions. +# +# The problem is written as: +# \begin{equation} +# \begin{cases} +# \Delta u = \sin{(\pi x)} \sin{(\pi y)} \text{ in } D, \\ +# u = 0 \text{ on } \Gamma_1 \cup \Gamma_2 \cup \Gamma_3 \cup \Gamma_4, +# \end{cases} +# \end{equation} +# where $D$ is a square domain $[0,1]^2$, and $\Gamma_i$, with $i=1,...,4$, are the boundaries of the square. + +# First of all, some useful imports. + +# In[1]: + + +import torch +from torch.nn import ReLU, Tanh, Softplus + +from pina.problem import SpatialProblem +from pina.operators import nabla +from pina.model import FeedForward +from pina import Condition, Span, PINN, LabelTensor, Plotter + + +# Now, the Poisson problem is written in PINA code as a class. The equations are written as *conditions* that should be satisfied in the corresponding domains. *truth_solution* +# is the exact solution which will be compared with the predicted one. + +# In[2]: + + +class Poisson(SpatialProblem): + output_variables = ['u'] + spatial_domain = Span({'x': [0, 1], 'y': [0, 1]}) + + def laplace_equation(input_, output_): + force_term = (torch.sin(input_.extract(['x'])*torch.pi) * + torch.sin(input_.extract(['y'])*torch.pi)) + nabla_u = nabla(output_, input_, components=['u'], d=['x', 'y']) + return nabla_u - force_term + + def nil_dirichlet(input_, output_): + value = 0.0 + return output_.extract(['u']) - value + + conditions = { + 'gamma1': Condition(Span({'x': [0, 1], 'y': 1}), nil_dirichlet), + 'gamma2': Condition(Span({'x': [0, 1], 'y': 0}), nil_dirichlet), + 'gamma3': Condition(Span({'x': 1, 'y': [0, 1]}), nil_dirichlet), + 'gamma4': Condition(Span({'x': 0, 'y': [0, 1]}), nil_dirichlet), + 'D': Condition(Span({'x': [0, 1], 'y': [0, 1]}), laplace_equation), + } + + def poisson_sol(self, pts): + return -( + torch.sin(pts.extract(['x'])*torch.pi)* + torch.sin(pts.extract(['y'])*torch.pi) + )/(2*torch.pi**2) + + truth_solution = poisson_sol + + +# ### The problem solution + +# After the problem, the feed-forward neural network is defined, through the class `FeedForward`. This neural network takes as input the coordinates (in this case $x$ and $y$) and provides the unkwown field of the Poisson problem. The residual of the equations are evaluated at several sampling points (which the user can manipulate using the method `span_pts`) and the loss minimized by the neural network is the sum of the residuals. +# +# In this tutorial, the neural network is composed by two hidden layers of 10 neurons each, and it is trained for 1000 epochs with a learning rate of 0.006. These parameters can be modified as desired. +# The output of the cell below is the final loss of the training phase of the PINN. +# We highlight that the generation of the sampling points and the train is here encapsulated within the function `generate_samples_and_train`, but only for saving some lines of code in the next cells; that function is not mandatory in the **PINA** framework. + +# In[3]: + + +def generate_samples_and_train(model, problem): + pinn = PINN(problem, model, lr=0.006, regularizer=1e-8) + pinn.span_pts(20, 'grid', locations=['D']) + pinn.span_pts(20, 'grid', locations=['gamma1', 'gamma2', 'gamma3', 'gamma4']) + pinn.train(1000, 100) + return pinn + +problem = Poisson() +model = FeedForward( + layers=[10, 10], + func=Softplus, + output_variables=problem.output_variables, + input_variables=problem.input_variables +) + +pinn = generate_samples_and_train(model, problem) + + +# The neural network of course can be saved in a file. In such a way, we can store it after the train, and load it just to infer the field. Here we don't store the model, but for demonstrative purposes we put in the next cell the commented line of code. + +# In[4]: + + +# pinn.save_state('pina.poisson') + + +# Now the *Plotter* class is used to plot the results. +# The solution predicted by the neural network is plotted on the left, the exact one is represented at the center and on the right the error between the exact and the predicted solutions is showed. + +# In[5]: + + +plotter = Plotter() +plotter.plot(pinn) + + +# ### The problem solution with extra-features + +# Now, the same problem is solved in a different way. +# A new neural network is now defined, with an additional input variable, named extra-feature, which coincides with the forcing term in the Laplace equation. +# The set of input variables to the neural network is: +# +# \begin{equation} +# [x, y, k(x, y)], \text{ with } k(x, y)=\sin{(\pi x)}\sin{(\pi y)}, +# \end{equation} +# +# where $x$ and $y$ are the spatial coordinates and $k(x, y)$ is the added feature. +# +# This feature is initialized in the class `SinSin`, which needs to be inherited by the `torch.nn.Module` class and to have the `forward` method. After declaring such feature, we can just incorporate in the `FeedForward` class thanks to the `extra_features` argument. +# **NB**: `extra_features` always needs a `list` as input, you you have one feature just encapsulated it in a class, as in the next cell. +# +# Finally, we perform the same training as before: the problem is `Poisson`, the network is composed by the same number of neurons and optimizer parameters are equal to previous test, the only change is the new extra feature. + +# In[6]: + + +class SinSin(torch.nn.Module): + """Feature: sin(x)*sin(y)""" + def __init__(self): + super().__init__() + + def forward(self, x): + t = (torch.sin(x.extract(['x'])*torch.pi) * + torch.sin(x.extract(['y'])*torch.pi)) + return LabelTensor(t, ['sin(x)sin(y)']) + +model_feat = FeedForward( + layers=[10, 10], + output_variables=problem.output_variables, + input_variables=problem.input_variables, + func=Softplus, + extra_features=[SinSin()] + ) + +pinn_feat = generate_samples_and_train(model_feat, problem) + + +# The predicted and exact solutions and the error between them are represented below. +# We can easily note that now our network, having almost the same condition as before, is able to reach an additional order of magnitude in accuracy. + +# In[7]: + + +plotter.plot(pinn_feat) + + +# ### The problem solution with learnable extra-features + +# We can still do better! +# +# Another way to exploit the extra features is the addition of learnable parameter inside them. +# In this way, the added parameters are learned during the training phase of the neural network. In this case, we use: +# +# \begin{equation} +# k(x, \mathbf{y}) = \beta \sin{(\alpha x)} \sin{(\alpha y)}, +# \end{equation} +# +# where $\alpha$ and $\beta$ are the abovementioned parameters. +# Their implementation is quite trivial: by using the class `torch.nn.Parameter` we cam define all the learnable parameters we need, and they are managed by `autograd` module! + +# In[8]: + + +class SinSinAB(torch.nn.Module): + """ """ + def __init__(self): + super().__init__() + self.alpha = torch.nn.Parameter(torch.tensor([1.0])) + self.beta = torch.nn.Parameter(torch.tensor([1.0])) + + + def forward(self, x): + t = ( + self.beta*torch.sin(self.alpha*x.extract(['x'])*torch.pi)* + torch.sin(self.alpha*x.extract(['y'])*torch.pi) + ) + return LabelTensor(t, ['b*sin(a*x)sin(a*y)']) + + +model_learn = FeedForward( + layers=[10, 10], + output_variables=problem.output_variables, + input_variables=problem.input_variables, + extra_features=[SinSinAB()] +) + +pinn_learn = generate_samples_and_train(model_learn, problem) + + +# Umh, the final loss is not appreciabily better than previous model (with static extra features), despite the usage of learnable parameters. This is mainly due to the over-parametrization of the network: there are many parameter to optimize during the training, and the model in unable to understand automatically that only the parameters of the extra feature (and not the weights/bias of the FFN) should be tuned in order to fit our problem. A longer training can be helpful, but in this case the faster way to reach machine precision for solving the Poisson problem is removing all the hidden layers in the `FeedForward`, keeping only the $\alpha$ and $\beta$ parameters of the extra feature. + +# In[9]: + + +model_learn = FeedForward( + layers=[], + output_variables=problem.output_variables, + input_variables=problem.input_variables, + extra_features=[SinSinAB()] +) + +pinn_learn = generate_samples_and_train(model_learn, problem) + + +# In such a way, the model is able to reach a very high accuracy! +# Of course, this is a toy problem for understanding the usage of extra features: similar precision could be obtained if the extra features are very similar to the true solution. The analyzed Poisson problem shows a forcing term very close to the solution, resulting in a perfect problem to address with such an approach. +# +# We conclude here by showing the graphical comparison of the unknown field and the loss trend for all the test cases presented here: the standard PINN, PINN with extra features, and PINN with learnable extra features. + +# In[10]: + + +plotter.plot(pinn_learn) + + +# In[11]: + + +import matplotlib.pyplot as plt + +plt.figure(figsize=(16, 6)) +plotter.plot_loss(pinn, label='Standard') +plotter.plot_loss(pinn_feat, label='Static Features') +plotter.plot_loss(pinn_learn, label='Learnable Features') + +plt.grid() +plt.legend() +plt.show() +